From e53e113dcde3e3686095c3661307efccc5c7e64e Mon Sep 17 00:00:00 2001 From: elijah Date: Wed, 18 Feb 2015 23:44:14 -0800 Subject: initial conversation from leap_doc and leap_website --- .gitignore | 4 + README.md | 13 + amber/config.rb | 4 + amber/layouts/_blog_summary.html.haml | 16 + amber/layouts/_footer.html.haml | 7 + amber/layouts/_masthead.html.haml | 17 + amber/layouts/_sidebar.html.haml | 13 + amber/layouts/_titlebox.html.haml | 16 + amber/layouts/default.html.haml | 38 + amber/locales/en.yml | 39 + amber/menu.txt | 61 + pages/about-us/contact/en.haml | 34 + pages/about-us/donate/en.haml | 61 + pages/about-us/en.md | 20 + pages/about-us/grantwriter.md | 65 + pages/about-us/jobs/en.haml | 63 + pages/about-us/news/2012/access-prize/en.haml | 14 + pages/about-us/news/2012/en.haml | 2 + .../news/2012/security-bingo/_table.html.haml | 163 ++ pages/about-us/news/2012/security-bingo/en.text | 30 + pages/about-us/news/2013/en.haml | 2 + .../support-encryption-tools-for-journalists.haml | 6 + pages/about-us/news/2013/the-big-seven/en.haml | 8 + pages/about-us/news/2014/android-oh-seven.md | 19 + pages/about-us/news/2014/bitmask-oh-seven-rc.md | 21 + pages/about-us/news/2014/bitmask-public-beta.md | 35 + pages/about-us/news/2014/bitmask-release.haml | 43 + .../news/2014/columbia-journalism-review.haml | 6 + pages/about-us/news/2014/darkest-night.md | 45 + pages/about-us/news/2014/en.haml | 2 + pages/about-us/news/2014/gsoc.html.haml | 9 + .../about-us/news/2014/platform-hotfix-release.md | 13 + .../about-us/news/2014/platform-release.html.haml | 54 + pages/about-us/news/2014/poodle-hot-fix.html.haml | 18 + pages/about-us/news/2014/release-oh-five-one.md | 81 + pages/about-us/news/2014/release-oh-five-two.md | 64 + pages/about-us/news/2014/release-oh-six.md | 58 + .../news/2014/repository-key-refresh.html.haml | 59 + pages/about-us/news/2015/bitmask-oh-eight.md | 31 + pages/about-us/news/2015/en.haml | 3 + pages/about-us/news/en.haml | 4 + pages/about-us/partners/en.md | 27 + pages/about-us/vision/en.haml | 27 + pages/assets/_bootstrap-3.3.2.scss | 50 + pages/assets/_leap.scss | 240 +++ pages/assets/_mixins.scss | 113 ++ pages/assets/bootstrap/_alerts.scss | 73 + pages/assets/bootstrap/_badges.scss | 67 + pages/assets/bootstrap/_breadcrumbs.scss | 26 + pages/assets/bootstrap/_button-groups.scss | 243 +++ pages/assets/bootstrap/_buttons.scss | 160 ++ pages/assets/bootstrap/_carousel.scss | 269 +++ pages/assets/bootstrap/_close.scss | 36 + pages/assets/bootstrap/_code.scss | 69 + pages/assets/bootstrap/_component-animations.scss | 38 + pages/assets/bootstrap/_dropdowns.scss | 214 +++ pages/assets/bootstrap/_forms.scss | 570 +++++++ pages/assets/bootstrap/_glyphicons.scss | 301 ++++ pages/assets/bootstrap/_grid.scss | 84 + pages/assets/bootstrap/_input-groups.scss | 166 ++ pages/assets/bootstrap/_jumbotron.scss | 50 + pages/assets/bootstrap/_labels.scss | 66 + pages/assets/bootstrap/_list-group.scss | 124 ++ pages/assets/bootstrap/_media.scss | 61 + pages/assets/bootstrap/_mixins.scss | 39 + pages/assets/bootstrap/_modals.scss | 148 ++ pages/assets/bootstrap/_navbar.scss | 663 +++++++ pages/assets/bootstrap/_navs.scss | 244 +++ pages/assets/bootstrap/_normalize.scss | 427 +++++ pages/assets/bootstrap/_pager.scss | 54 + pages/assets/bootstrap/_pagination.scss | 88 + pages/assets/bootstrap/_panels.scss | 265 +++ pages/assets/bootstrap/_popovers.scss | 135 ++ pages/assets/bootstrap/_print.scss | 107 ++ pages/assets/bootstrap/_progress-bars.scss | 87 + pages/assets/bootstrap/_responsive-embed.scss | 35 + pages/assets/bootstrap/_responsive-utilities.scss | 177 ++ pages/assets/bootstrap/_scaffolding.scss | 150 ++ pages/assets/bootstrap/_tables.scss | 234 +++ pages/assets/bootstrap/_theme.scss | 273 +++ pages/assets/bootstrap/_thumbnails.scss | 38 + pages/assets/bootstrap/_tooltip.scss | 103 ++ pages/assets/bootstrap/_type.scss | 298 ++++ pages/assets/bootstrap/_utilities.scss | 56 + pages/assets/bootstrap/_variables.scss | 862 ++++++++++ pages/assets/bootstrap/_wells.scss | 29 + pages/assets/bootstrap/mixins/_alerts.scss | 14 + .../bootstrap/mixins/_background-variant.scss | 11 + pages/assets/bootstrap/mixins/_border-radius.scss | 18 + pages/assets/bootstrap/mixins/_buttons.scss | 52 + pages/assets/bootstrap/mixins/_center-block.scss | 7 + pages/assets/bootstrap/mixins/_clearfix.scss | 22 + pages/assets/bootstrap/mixins/_forms.scss | 88 + pages/assets/bootstrap/mixins/_gradients.scss | 58 + pages/assets/bootstrap/mixins/_grid-framework.scss | 81 + pages/assets/bootstrap/mixins/_grid.scss | 122 ++ pages/assets/bootstrap/mixins/_hide-text.scss | 21 + pages/assets/bootstrap/mixins/_image.scss | 33 + pages/assets/bootstrap/mixins/_labels.scss | 12 + pages/assets/bootstrap/mixins/_list-group.scss | 31 + pages/assets/bootstrap/mixins/_nav-divider.scss | 10 + .../bootstrap/mixins/_nav-vertical-align.scss | 9 + pages/assets/bootstrap/mixins/_opacity.scss | 8 + pages/assets/bootstrap/mixins/_pagination.scss | 23 + pages/assets/bootstrap/mixins/_panels.scss | 24 + pages/assets/bootstrap/mixins/_progress-bar.scss | 10 + pages/assets/bootstrap/mixins/_reset-filter.scss | 8 + pages/assets/bootstrap/mixins/_resize.scss | 6 + .../bootstrap/mixins/_responsive-visibility.scss | 21 + pages/assets/bootstrap/mixins/_size.scss | 10 + pages/assets/bootstrap/mixins/_tab-focus.scss | 9 + pages/assets/bootstrap/mixins/_table-row.scss | 28 + pages/assets/bootstrap/mixins/_text-emphasis.scss | 11 + pages/assets/bootstrap/mixins/_text-overflow.scss | 8 + .../assets/bootstrap/mixins/_vendor-prefixes.scss | 222 +++ pages/assets/font-awesome/css/font-awesome.css | 1801 ++++++++++++++++++++ pages/assets/font-awesome/css/font-awesome.min.css | 4 + pages/assets/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes .../font-awesome/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes .../font-awesome/fonts/fontawesome-webfont.svg | 565 ++++++ .../font-awesome/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes .../font-awesome/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes .../font-awesome/fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes pages/assets/style.scss | 58 + pages/docs/client/bundle-testing.md | 101 ++ pages/docs/client/dev-environment.md | 200 +++ pages/docs/client/en.md | 57 + pages/docs/client/known-issues.md | 64 + pages/docs/client/testers-howto.md | 131 ++ pages/docs/client/user-install.md | 30 + pages/docs/client/user-running.md | 42 + pages/docs/design/bonafide.text | 290 ++++ pages/docs/design/cuttlefish.md | 7 + pages/docs/design/en.haml | 5 + pages/docs/design/nicknym-draft.md | 578 +++++++ pages/docs/design/nicknym.md | 498 ++++++ pages/docs/design/overview.md | 403 +++++ pages/docs/design/soledad.md | 423 +++++ pages/docs/en.haml | 4 + pages/docs/get-involved/bad-project-ideas.md | 69 + pages/docs/get-involved/coding.haml | 73 + pages/docs/get-involved/communication.md | 25 + pages/docs/get-involved/en.haml | 4 + pages/docs/get-involved/project-ideas.md | 412 +++++ pages/docs/get-involved/source.haml | 85 + pages/docs/platform/details/couchdb.md | 74 + pages/docs/platform/details/development.md | 355 ++++ pages/docs/platform/details/en.haml | 4 + pages/docs/platform/details/faq.md | 65 + pages/docs/platform/details/under-the-hood.md | 26 + pages/docs/platform/details/webapp.md | 282 +++ pages/docs/platform/en.md | 77 + pages/docs/platform/guide/commands.md | 419 +++++ pages/docs/platform/guide/config.md | 263 +++ pages/docs/platform/guide/en.haml | 4 + pages/docs/platform/guide/environments.md | 69 + pages/docs/platform/guide/keys-and-certificates.md | 194 +++ pages/docs/platform/guide/miscellaneous.md | 14 + pages/docs/platform/guide/nodes.md | 187 ++ pages/docs/platform/service-diagram.odg | Bin 0 -> 12131 bytes pages/docs/platform/service-diagram.png | Bin 0 -> 25988 bytes pages/docs/platform/troubleshooting/en.haml | 3 + .../docs/platform/troubleshooting/known-issues.md | 115 ++ pages/docs/platform/troubleshooting/tests.md | 33 + .../docs/platform/troubleshooting/where-to-look.md | 249 +++ pages/docs/platform/tutorials/en.haml | 4 + pages/docs/platform/tutorials/quick-start.md | 82 + pages/docs/platform/tutorials/single-node-email.md | 338 ++++ pages/docs/platform/tutorials/single-node-vpn.md | 389 +++++ pages/docs/tech/en.haml | 5 + pages/docs/tech/hard-problems/en.md | 169 ++ pages/docs/tech/hard-problems/pt.md | 133 ++ pages/docs/tech/infosec/_table-style.haml | 59 + pages/docs/tech/infosec/_table.haml | 233 +++ pages/docs/tech/infosec/en.haml | 105 ++ pages/docs/tech/limitations.md | 123 ++ pages/docs/tech/routing.md | 65 + pages/docs/tech/secure-email/en.md | 578 +++++++ pages/docs/test/release_tests | 15 + pages/en.html.haml | 51 + pages/favicon.ico | Bin 0 -> 318 bytes pages/img/animated-gifs-email-007.gif | Bin 0 -> 10169 bytes pages/img/by-sa-3.0-80x15.png | Bin 0 -> 672 bytes pages/img/leap128.png | Bin 0 -> 10100 bytes pages/img/leap180.png | Bin 0 -> 14913 bytes pages/img/leap200.png | Bin 0 -> 16839 bytes pages/img/leap256.png | Bin 0 -> 22297 bytes pages/img/pages/access-prize-small.jpg | Bin 0 -> 15766 bytes pages/img/pages/access-prize.jpg | Bin 0 -> 290829 bytes pages/img/pages/android-logo.jpg | Bin 0 -> 4482 bytes pages/img/pages/android-mask.png | Bin 0 -> 9530 bytes pages/img/pages/bitmask-icon.png | Bin 0 -> 21755 bytes pages/img/pages/bitmask.png | Bin 0 -> 13671 bytes pages/img/pages/chillies.jpg | Bin 0 -> 15592 bytes pages/img/pages/clocks.jpg | Bin 0 -> 20273 bytes pages/img/pages/gsoc.png | Bin 0 -> 7370 bytes pages/img/pages/mostimproved.jpg | Bin 0 -> 25750 bytes pages/img/pages/python-logo.png | Bin 0 -> 4139 bytes pages/img/pages/road.jpg | Bin 0 -> 31218 bytes pages/img/pages/sand-bucket.jpg | Bin 0 -> 8659 bytes pages/img/pages/sources/android.svg | 357 ++++ pages/img/pages/sources/road.jpg | Bin 0 -> 169925 bytes pages/img/pages/sources/toolbox.jpg | Bin 0 -> 227520 bytes pages/img/pages/toolbox.jpg | Bin 0 -> 14840 bytes pages/img/pages/winter-solstice-at-stonehenge.jpg | Bin 0 -> 7650 bytes pages/inc/en.haml | 44 + pages/services/chat/en.text | 27 + pages/services/eip/en.text | 60 + pages/services/email/en.md | 99 ++ pages/services/en.text | 22 + pages/services/technology/client-app/en.haml | 109 ++ pages/services/technology/critiques/en.haml | 57 + pages/services/technology/en.haml | 30 + pages/services/technology/platform/en.haml | 16 + public/.gitkeep | 0 215 files changed, 21356 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 amber/config.rb create mode 100644 amber/layouts/_blog_summary.html.haml create mode 100644 amber/layouts/_footer.html.haml create mode 100644 amber/layouts/_masthead.html.haml create mode 100644 amber/layouts/_sidebar.html.haml create mode 100644 amber/layouts/_titlebox.html.haml create mode 100644 amber/layouts/default.html.haml create mode 100644 amber/locales/en.yml create mode 100644 amber/menu.txt create mode 100644 pages/about-us/contact/en.haml create mode 100644 pages/about-us/donate/en.haml create mode 100644 pages/about-us/en.md create mode 100644 pages/about-us/grantwriter.md create mode 100644 pages/about-us/jobs/en.haml create mode 100644 pages/about-us/news/2012/access-prize/en.haml create mode 100644 pages/about-us/news/2012/en.haml create mode 100644 pages/about-us/news/2012/security-bingo/_table.html.haml create mode 100644 pages/about-us/news/2012/security-bingo/en.text create mode 100644 pages/about-us/news/2013/en.haml create mode 100644 pages/about-us/news/2013/support-encryption-tools-for-journalists.haml create mode 100644 pages/about-us/news/2013/the-big-seven/en.haml create mode 100644 pages/about-us/news/2014/android-oh-seven.md create mode 100644 pages/about-us/news/2014/bitmask-oh-seven-rc.md create mode 100644 pages/about-us/news/2014/bitmask-public-beta.md create mode 100644 pages/about-us/news/2014/bitmask-release.haml create mode 100644 pages/about-us/news/2014/columbia-journalism-review.haml create mode 100644 pages/about-us/news/2014/darkest-night.md create mode 100644 pages/about-us/news/2014/en.haml create mode 100644 pages/about-us/news/2014/gsoc.html.haml create mode 100644 pages/about-us/news/2014/platform-hotfix-release.md create mode 100644 pages/about-us/news/2014/platform-release.html.haml create mode 100644 pages/about-us/news/2014/poodle-hot-fix.html.haml create mode 100644 pages/about-us/news/2014/release-oh-five-one.md create mode 100644 pages/about-us/news/2014/release-oh-five-two.md create mode 100644 pages/about-us/news/2014/release-oh-six.md create mode 100644 pages/about-us/news/2014/repository-key-refresh.html.haml create mode 100644 pages/about-us/news/2015/bitmask-oh-eight.md create mode 100644 pages/about-us/news/2015/en.haml create mode 100644 pages/about-us/news/en.haml create mode 100644 pages/about-us/partners/en.md create mode 100644 pages/about-us/vision/en.haml create mode 100644 pages/assets/_bootstrap-3.3.2.scss create mode 100644 pages/assets/_leap.scss create mode 100644 pages/assets/_mixins.scss create mode 100644 pages/assets/bootstrap/_alerts.scss create mode 100644 pages/assets/bootstrap/_badges.scss create mode 100644 pages/assets/bootstrap/_breadcrumbs.scss create mode 100644 pages/assets/bootstrap/_button-groups.scss create mode 100644 pages/assets/bootstrap/_buttons.scss create mode 100644 pages/assets/bootstrap/_carousel.scss create mode 100644 pages/assets/bootstrap/_close.scss create mode 100644 pages/assets/bootstrap/_code.scss create mode 100644 pages/assets/bootstrap/_component-animations.scss create mode 100644 pages/assets/bootstrap/_dropdowns.scss create mode 100644 pages/assets/bootstrap/_forms.scss create mode 100644 pages/assets/bootstrap/_glyphicons.scss create mode 100644 pages/assets/bootstrap/_grid.scss create mode 100644 pages/assets/bootstrap/_input-groups.scss create mode 100644 pages/assets/bootstrap/_jumbotron.scss create mode 100644 pages/assets/bootstrap/_labels.scss create mode 100644 pages/assets/bootstrap/_list-group.scss create mode 100644 pages/assets/bootstrap/_media.scss create mode 100644 pages/assets/bootstrap/_mixins.scss create mode 100644 pages/assets/bootstrap/_modals.scss create mode 100644 pages/assets/bootstrap/_navbar.scss create mode 100644 pages/assets/bootstrap/_navs.scss create mode 100644 pages/assets/bootstrap/_normalize.scss create mode 100644 pages/assets/bootstrap/_pager.scss create mode 100644 pages/assets/bootstrap/_pagination.scss create mode 100644 pages/assets/bootstrap/_panels.scss create mode 100644 pages/assets/bootstrap/_popovers.scss create mode 100644 pages/assets/bootstrap/_print.scss create mode 100644 pages/assets/bootstrap/_progress-bars.scss create mode 100644 pages/assets/bootstrap/_responsive-embed.scss create mode 100644 pages/assets/bootstrap/_responsive-utilities.scss create mode 100644 pages/assets/bootstrap/_scaffolding.scss create mode 100644 pages/assets/bootstrap/_tables.scss create mode 100644 pages/assets/bootstrap/_theme.scss create mode 100644 pages/assets/bootstrap/_thumbnails.scss create mode 100644 pages/assets/bootstrap/_tooltip.scss create mode 100644 pages/assets/bootstrap/_type.scss create mode 100644 pages/assets/bootstrap/_utilities.scss create mode 100644 pages/assets/bootstrap/_variables.scss create mode 100644 pages/assets/bootstrap/_wells.scss create mode 100644 pages/assets/bootstrap/mixins/_alerts.scss create mode 100644 pages/assets/bootstrap/mixins/_background-variant.scss create mode 100644 pages/assets/bootstrap/mixins/_border-radius.scss create mode 100644 pages/assets/bootstrap/mixins/_buttons.scss create mode 100644 pages/assets/bootstrap/mixins/_center-block.scss create mode 100644 pages/assets/bootstrap/mixins/_clearfix.scss create mode 100644 pages/assets/bootstrap/mixins/_forms.scss create mode 100644 pages/assets/bootstrap/mixins/_gradients.scss create mode 100644 pages/assets/bootstrap/mixins/_grid-framework.scss create mode 100644 pages/assets/bootstrap/mixins/_grid.scss create mode 100644 pages/assets/bootstrap/mixins/_hide-text.scss create mode 100644 pages/assets/bootstrap/mixins/_image.scss create mode 100644 pages/assets/bootstrap/mixins/_labels.scss create mode 100644 pages/assets/bootstrap/mixins/_list-group.scss create mode 100644 pages/assets/bootstrap/mixins/_nav-divider.scss create mode 100644 pages/assets/bootstrap/mixins/_nav-vertical-align.scss create mode 100644 pages/assets/bootstrap/mixins/_opacity.scss create mode 100644 pages/assets/bootstrap/mixins/_pagination.scss create mode 100644 pages/assets/bootstrap/mixins/_panels.scss create mode 100644 pages/assets/bootstrap/mixins/_progress-bar.scss create mode 100644 pages/assets/bootstrap/mixins/_reset-filter.scss create mode 100644 pages/assets/bootstrap/mixins/_resize.scss create mode 100644 pages/assets/bootstrap/mixins/_responsive-visibility.scss create mode 100644 pages/assets/bootstrap/mixins/_size.scss create mode 100644 pages/assets/bootstrap/mixins/_tab-focus.scss create mode 100644 pages/assets/bootstrap/mixins/_table-row.scss create mode 100644 pages/assets/bootstrap/mixins/_text-emphasis.scss create mode 100644 pages/assets/bootstrap/mixins/_text-overflow.scss create mode 100644 pages/assets/bootstrap/mixins/_vendor-prefixes.scss create mode 100644 pages/assets/font-awesome/css/font-awesome.css create mode 100644 pages/assets/font-awesome/css/font-awesome.min.css create mode 100644 pages/assets/font-awesome/fonts/FontAwesome.otf create mode 100644 pages/assets/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 pages/assets/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 pages/assets/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 pages/assets/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 pages/assets/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 pages/assets/style.scss create mode 100644 pages/docs/client/bundle-testing.md create mode 100644 pages/docs/client/dev-environment.md create mode 100644 pages/docs/client/en.md create mode 100644 pages/docs/client/known-issues.md create mode 100644 pages/docs/client/testers-howto.md create mode 100644 pages/docs/client/user-install.md create mode 100644 pages/docs/client/user-running.md create mode 100644 pages/docs/design/bonafide.text create mode 100644 pages/docs/design/cuttlefish.md create mode 100644 pages/docs/design/en.haml create mode 100644 pages/docs/design/nicknym-draft.md create mode 100644 pages/docs/design/nicknym.md create mode 100644 pages/docs/design/overview.md create mode 100644 pages/docs/design/soledad.md create mode 100644 pages/docs/en.haml create mode 100644 pages/docs/get-involved/bad-project-ideas.md create mode 100644 pages/docs/get-involved/coding.haml create mode 100644 pages/docs/get-involved/communication.md create mode 100644 pages/docs/get-involved/en.haml create mode 100644 pages/docs/get-involved/project-ideas.md create mode 100644 pages/docs/get-involved/source.haml create mode 100644 pages/docs/platform/details/couchdb.md create mode 100644 pages/docs/platform/details/development.md create mode 100644 pages/docs/platform/details/en.haml create mode 100644 pages/docs/platform/details/faq.md create mode 100644 pages/docs/platform/details/under-the-hood.md create mode 100644 pages/docs/platform/details/webapp.md create mode 100644 pages/docs/platform/en.md create mode 100644 pages/docs/platform/guide/commands.md create mode 100644 pages/docs/platform/guide/config.md create mode 100644 pages/docs/platform/guide/en.haml create mode 100644 pages/docs/platform/guide/environments.md create mode 100644 pages/docs/platform/guide/keys-and-certificates.md create mode 100644 pages/docs/platform/guide/miscellaneous.md create mode 100644 pages/docs/platform/guide/nodes.md create mode 100644 pages/docs/platform/service-diagram.odg create mode 100644 pages/docs/platform/service-diagram.png create mode 100644 pages/docs/platform/troubleshooting/en.haml create mode 100644 pages/docs/platform/troubleshooting/known-issues.md create mode 100644 pages/docs/platform/troubleshooting/tests.md create mode 100644 pages/docs/platform/troubleshooting/where-to-look.md create mode 100644 pages/docs/platform/tutorials/en.haml create mode 100644 pages/docs/platform/tutorials/quick-start.md create mode 100644 pages/docs/platform/tutorials/single-node-email.md create mode 100644 pages/docs/platform/tutorials/single-node-vpn.md create mode 100644 pages/docs/tech/en.haml create mode 100644 pages/docs/tech/hard-problems/en.md create mode 100644 pages/docs/tech/hard-problems/pt.md create mode 100644 pages/docs/tech/infosec/_table-style.haml create mode 100644 pages/docs/tech/infosec/_table.haml create mode 100644 pages/docs/tech/infosec/en.haml create mode 100644 pages/docs/tech/limitations.md create mode 100644 pages/docs/tech/routing.md create mode 100644 pages/docs/tech/secure-email/en.md create mode 100644 pages/docs/test/release_tests create mode 100644 pages/en.html.haml create mode 100644 pages/favicon.ico create mode 100644 pages/img/animated-gifs-email-007.gif create mode 100644 pages/img/by-sa-3.0-80x15.png create mode 100644 pages/img/leap128.png create mode 100644 pages/img/leap180.png create mode 100644 pages/img/leap200.png create mode 100644 pages/img/leap256.png create mode 100644 pages/img/pages/access-prize-small.jpg create mode 100644 pages/img/pages/access-prize.jpg create mode 100644 pages/img/pages/android-logo.jpg create mode 100644 pages/img/pages/android-mask.png create mode 100644 pages/img/pages/bitmask-icon.png create mode 100644 pages/img/pages/bitmask.png create mode 100644 pages/img/pages/chillies.jpg create mode 100644 pages/img/pages/clocks.jpg create mode 100644 pages/img/pages/gsoc.png create mode 100644 pages/img/pages/mostimproved.jpg create mode 100644 pages/img/pages/python-logo.png create mode 100644 pages/img/pages/road.jpg create mode 100644 pages/img/pages/sand-bucket.jpg create mode 100644 pages/img/pages/sources/android.svg create mode 100644 pages/img/pages/sources/road.jpg create mode 100644 pages/img/pages/sources/toolbox.jpg create mode 100644 pages/img/pages/toolbox.jpg create mode 100644 pages/img/pages/winter-solstice-at-stonehenge.jpg create mode 100644 pages/inc/en.haml create mode 100644 pages/services/chat/en.text create mode 100644 pages/services/eip/en.text create mode 100644 pages/services/email/en.md create mode 100644 pages/services/en.text create mode 100644 pages/services/technology/client-app/en.haml create mode 100644 pages/services/technology/critiques/en.haml create mode 100644 pages/services/technology/en.haml create mode 100644 pages/services/technology/platform/en.haml create mode 100644 public/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5015fdb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.sass-cache/ +public/* +!public/.gitkeep +*~ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..dddb932 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +LEAP Web Pages +================================== + +This is the repository for the LEAP website at https://leap.se. + +It is entirely static, but relies on a bunch of apache tricks for things like +language negotiation. A static website generator called `amber` is used to +render the source files into html files. + +To submit changes, please fork this repo and issue pull requests on github. + +For more information how to use `amber`, see: https://github.com/leapcode/amber. + diff --git a/amber/config.rb b/amber/config.rb new file mode 100644 index 0000000..840ad6d --- /dev/null +++ b/amber/config.rb @@ -0,0 +1,4 @@ +@title = "LEAP" +@default_locale = :en +@locales = [:en] +@short_paths = true diff --git a/amber/layouts/_blog_summary.html.haml b/amber/layouts/_blog_summary.html.haml new file mode 100644 index 0000000..b14f6d0 --- /dev/null +++ b/amber/layouts/_blog_summary.html.haml @@ -0,0 +1,16 @@ +- page = locals[:page] +%article.page-summary + %h2= link(page.title => amber_path(page)) + .byline + - if page.props.author + %span.author>= page.props.author + - if page.props.author && page.props.posted_at + \. + - if page.props.posted_at + %i + = time_tag(page.props.posted_at.to_date, :format => :long, :pubdate => true) + %div.content + - if page.props.preview + = page.props.preview + - if page.props.more + = link(I18n.t(:read_more) => amber_path(page)) \ No newline at end of file diff --git a/amber/layouts/_footer.html.haml b/amber/layouts/_footer.html.haml new file mode 100644 index 0000000..94ea6dc --- /dev/null +++ b/amber/layouts/_footer.html.haml @@ -0,0 +1,7 @@ +%div{:style => 'max-width:500px; margin: 3em auto 0 auto; text-align: center; font-size: 0.85em'} + (cc) Attribution, Share-Alike +   + %a{:rel => "license", :href => "https://creativecommons.org/licenses/by-sa/3.0/"}< + %img{:alt => "Creative Commons License", :style => "border-width:0; vertical-align: middle", :src => "/img/by-sa-3.0-80x15.png"} +   + (c) 2012 LEAP Encryption Access Project \ No newline at end of file diff --git a/amber/layouts/_masthead.html.haml b/amber/layouts/_masthead.html.haml new file mode 100644 index 0000000..f37d6e9 --- /dev/null +++ b/amber/layouts/_masthead.html.haml @@ -0,0 +1,17 @@ +.masthead-inner + .container + .row + -# if has_navigation? + .col-sm-3.col-md-2 + .col-sm-9.col-md-10 + %h1 LEAP Encryption Access Project + %ul.list-unstyled#top-menu + - top_navigation_items(include_home:true) do |item| + %li{:class => [item[:class], 'tab'].join(' ')} + %a{:href => item[:href], :class => [item[:class], 'tab'].join(' ')}= item[:label] + .col-sm-12.logo + %h1 LEAP Encryption Access Project + %ul.list-unstyled#top-menu + - top_navigation_items(include_home:true) do |item| + %li{:class => [item[:class], 'tab'].join(' ')} + %a{:href => item[:href], :class => [item[:class], 'tab'].join(' ')}= item[:label] diff --git a/amber/layouts/_sidebar.html.haml b/amber/layouts/_sidebar.html.haml new file mode 100644 index 0000000..87a00f9 --- /dev/null +++ b/amber/layouts/_sidebar.html.haml @@ -0,0 +1,13 @@ +#navigation + %ul.nav.nav-pills.nav-stacked + - navigation_items do |item| + %li{:class => "#{item[:active]} level#{item[:level]}"} + %a{:href => item[:href], :class => ''}= item[:label] + +-# .sidebar-addendum +-# .locale-links +-# - available_languages.each do |name, code, url| +-# %a.label{:href => url, :class => (I18n.locale == code ? 'label-primary' : '')}= name +-# +-# .sidebar-addendum +-# = link(t(:support_riseup) => 'donate', :class => 'btn btn-block btn-default') diff --git a/amber/layouts/_titlebox.html.haml b/amber/layouts/_titlebox.html.haml new file mode 100644 index 0000000..beef995 --- /dev/null +++ b/amber/layouts/_titlebox.html.haml @@ -0,0 +1,16 @@ +- if @page.props.author || @page.props.posted_at + .byline + - if @page.props.author + %span.author>= I18n.t('posted_by') + ' ' + @page.props.author + - if @page.props.author && @page.props.posted_at + \. + - if @page.props.posted_at + %i + = time_tag(@page.props.posted_at.to_date, :format => :long, :pubdatwe => true) + +- if @page.props.summary + .summary + = @page.props.summary +-# elsif page.props.preview + .summary + = @page.props.preview \ No newline at end of file diff --git a/amber/layouts/default.html.haml b/amber/layouts/default.html.haml new file mode 100644 index 0000000..d252806 --- /dev/null +++ b/amber/layouts/default.html.haml @@ -0,0 +1,38 @@ +!!! +%html{:lang => @locals[:locale].to_s} + %head + %title + = @page.nav_title + ' - ' + @site.title + %meta(name="viewport" content="width=device-width, initial-scale=1.0") + %meta(charset="UTF-8") + %link(rel="stylesheet" href="/assets/style.css") + %link(rel="stylesheet" href="/assets/font-awesome/css/font-awesome.min.css") + = html_head_base + %body + #wrap + #masthead + = render 'layouts/masthead' + #main.container + .row + - if has_navigation? + #sidebar.col-sm-4.col-md-3 + = render 'layouts/sidebar' + .col-sm-8.col-md-9 + .title-box + = yield :title + = render 'layouts/titlebox' + .content-box + - if translation_missing? + .alert.alert-info= t(:missing_translation) + = yield :content + - else + .col-sm-12 + - unless @page.props.show_title === false + .title-box + = yield :title + .content-box + = yield :content + + #footer + = render 'layouts/footer' + #background diff --git a/amber/locales/en.yml b/amber/locales/en.yml new file mode 100644 index 0000000..58fa166 --- /dev/null +++ b/amber/locales/en.yml @@ -0,0 +1,39 @@ + +en: + read_more: "Read more »" + posted_by: "Posted by" + + infosec: + leap: LEAP + silo: Silo + federation: Federated + peer_to_peer: Peer to Peer + cleartext: Cleartext + encrypted: Encrypted + silo_example: Facebook, Twitter + fed_example: Email, Jabber + ssilo_example: Skype, Cryptocat-1 + sfed_example: OpenPGP, OTR + p2p_example: GNUNet, Freenet + control: Control + compatibility: Compatibility + usability: Usability + anonymity: Anonymity + unmappability: Unmappability + authenticity: Authenticity + availability: Availability + confidentiality: Confidentiality + integrity: Integrity + message_security: Message Security + identity_security: Identity Security + user_freedom: User Freedom + none: None + high: High + low: Low + medium: Medium + higher: Higher + better: High + worse: Low + lower: Lower + for_example: For Example + spacer: "" \ No newline at end of file diff --git a/amber/menu.txt b/amber/menu.txt new file mode 100644 index 0000000..7967cf2 --- /dev/null +++ b/amber/menu.txt @@ -0,0 +1,61 @@ +services + eip + email + chat +about-us + donate + vision +# jobs +# people + contact + news + 2015 + 2014 + 2013 + 2012 + partners +docs + get-involved + communication + coding + source + project-ideas + tech + infosec + hard-problems + limitations + routing + secure-email + design + overview + bonafide + nicknym + soledad + platform + guide + nodes + keys-and-certificates + environments + miscellaneous + config + commands + tutorials + quick-start + single-node-vpn + single-node-email + troubleshooting + tests + where-to-look + known-issues + details + couchdb + faq + development + under-the-hood + client + user-install + user-running + testers-howto + bundle-testing + dev-environment + known-issues diff --git a/pages/about-us/contact/en.haml b/pages/about-us/contact/en.haml new file mode 100644 index 0000000..fdf9a9b --- /dev/null +++ b/pages/about-us/contact/en.haml @@ -0,0 +1,34 @@ +- @title = 'Contact Us' + +%h3 IRC + +Probably the fastest and most reliable way to contact anyone involved with LEAP. Don't despair if you don't get a reply right away, we are all in different time zones and we all are able to read the scrollback history, so someone will reply eventually. + +.well + \#leap on freenode.net + +%h3 Email + +Email is pretty good too. + +.well + info@leap.se + +%h3 Postal Address + +It may take us a very long time to respond to postal mail. + +.well + PO Box 4422 + %br + Seattle, WA 98194 USA + +%h3 Phone (Voice Mail) + +Leave us a message, bonus points if you sing your message. + +.well + +1 (206) 420-6613 + + + diff --git a/pages/about-us/donate/en.haml b/pages/about-us/donate/en.haml new file mode 100644 index 0000000..e1e5976 --- /dev/null +++ b/pages/about-us/donate/en.haml @@ -0,0 +1,61 @@ +- @title = 'Donate' + +%p LEAP depends on donations and grants to keep doing the work we do. Please donate today if you value secure communication that is easy for both the end-user and the service provider. + +%p LEAP is a non-profit incorporated in Washington State, USA. However, you contributions are not tax deductable. + +%h3 By Mail + +%pre + LEAP Encryption Access Project + PO Box 4422 + Seattle, WA 98194-0422 USA + +%h3 Bitcoin + +%p Send bitcoins to this address: 127hMYMQj2Rc6zcDjnA1yerUNts3iM2sC8. + +%h3 Paypal + +:plain + Recurring Donation
+
+ + + + + + + + +
+ + + + +
+
+ One Time Donation
+
+ + + +
+ + + +
+
diff --git a/pages/about-us/en.md b/pages/about-us/en.md new file mode 100644 index 0000000..df74258 --- /dev/null +++ b/pages/about-us/en.md @@ -0,0 +1,20 @@ +@title = 'About Us' +@toc = false + +LEAP is a dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. Like free speech, the right to whisper is an necessary precondition for a free society. Without it, civil society and political freedom become impossible. As the importance of digital communication for civic participation increases, so does the importance of the ability to digitally whisper. LEAP is devoted to making the ability to whisper available to all internet users. + +LEAP is a non-profit organization registered in the state of Washington, USA. THe people who create LEAP live around the world, including: Bahía Blanca (Argentina), Berlin (Germany), Hamburg (Germany), La Paz (Bolivia), London (UK), Madrid (Spain), Montreal (Quebec, Canada), New York City (NY, USA), Paris (France), Seattle (WA, USA), São Paulo (Brazil), Santiago (Chile). + +# About LEAP technology + +LEAP's approach is unique: we are making it possible for any service provider to easily deploy secure services and for people to use these services without needing to learn new software or change their behavior. These services are based on open, federated standards, but done right: the provider does not have access to the user's data, and we use open protocols in the most secure way possible. + +On the server side we have created the LEAP Platform, a "provider in a box" set of complementary packages and server recipes automated to lower the barriers of entry for aspiring secure service providers. On the client side, we have created a cross-platform application called Bitmask that automatically configures itself once a user has selected a provider and which services to enable. Bitmask provides a local proxy that a standard email client can connect to, and allows for easy one-click Virtual Private Network (VPN) service. + +Email continues to be a vital communication tool, but is difficult to use securely. Unfortunately, when people to use secure email they often use it in ways that compromise their confidentiality and the confidentiality of the people they communicate with. Even worse, current technology for secure email is vulnerable to numerous methods of association-mapping--information that can be highly sensitive in its own right. + +The LEAP email system has several security advantages over typical encryption applications: if not already encrypted, incoming email is encrypted so that only the recipient can read it; email is always stored client-encrypted, both locally and when synchronized with the server; all message relay among service providers is required to be encrypted when possible; and public keys are automatically discovered and validated. In short, the Bitmask app offers full end-to-end encryption, quietly handling the complexities of public key encryption and allowing for backward compatibility with legacy email when necessary. Because the LEAP system is based on open, federated protocols, the user is able to change providers at will, preventing provider dependency and lock-in. + +In addition to encrypted email, Bitmask offers automatically self-configuring encrypted internet proxy (aka VPN). Most VPN technology can be a pain to configure correctly without introducing vulnerabilities of DNS leakage, IPv6 leakage, and failing into an open, unencrypted state. The goals for LEAP’s VPN service are to make it so easy to use that people will want to keep it on all the time, and to make it more secure than most other VPN services. + +For more information, see our [[documentation => docs]], [[talk slides => https://leap.se/slides/]], or [[email overview => email]]. diff --git a/pages/about-us/grantwriter.md b/pages/about-us/grantwriter.md new file mode 100644 index 0000000..394a1b4 --- /dev/null +++ b/pages/about-us/grantwriter.md @@ -0,0 +1,65 @@ +@title = "Job posting for grant writer" + +Overview +======================== + +LEAP Encryption Access Project (https://leap.se) is looking for a grant writer with a high-level understanding of the grant writing process, extensive experience writing successful proposals for highly competitive grants, excellent time management, and project management skills along with excellent communication skills. The Grant Writer will be expected to build and maintain relationships with foundations and other organizations offering grant opportunities, and must be highly self motivated. Experience and interest in online communication and internet freedom a big plus. + +* Start Date: ASAP +* Rate: Competitive non-profit +* Time: Min 4 months, 50% time preferred. +* Please contact mcnair@leap.se + +Responsibilities +====================== + +* Researching, developing and writing inquiries, letters an proposals requesting state and federal funds. + +* Tracking and monitoring assigned proposals, including their deadlines, requirements and written reports. + +* Identify potential funding sources including, but not limited to governmental programs, private foundations, corporation. + +* Contact potential funding sources to discuss eligibility requirements, criteria, interest, and potential programs, and maintain ongoing relationships with funding contacts. + +* Write grants and thoroughly compile required attachments for submission. + +* Help develop grant calendar for each year based on research and past funding history. + +* Create compelling, persuasive, well-structured grant narratives through the use of effective storytelling and superior prose--tying LEAP's needs to funder priorities. + +* Research, develop, write, package and submit grant proposals. + +* Effectively perform all aspects of grant development and submission, including tracking of information, soliciting and collecting support letters and memoranda of understanding, board resolutions, developing funder-compliant budgets, and coordinating with internal sources to elicit necessary data. + +* Undertake research for the purposes of gathering statistical, analytical and anecdotal data, analyzing those data, and using such data strategically to create compelling grant proposal narratives--which use current, evidence-based, peer-reviewed models, when appropriate. + +* Undertake research related to identification of funding sources to meet specific programmatic needs through use of internal resources (e.g., newsletters, grant indexes, Internet resources) and external resources (e.g., training opportunities, bidders' conferences). Determine "goodness of fit" based on funder & internal priorities. + +* Collaborate with finance, programs and compliance to ensure grant reporting and tracking grant compliance. + +Qualifications +====================== + +The ideal candidate will: + +* Ability to interface with personnel in a professional manner. +* 3+ years of successful grant writing experience with federal and government grants, as well as private foundation experience. +* Ability to demonstrate accomplishments and success in grants being awarded. +* Reporting experience with OMB Circular A-133 preferred. +* Strong organizational and interpersonal skills. +* Ability to write accurate, compelling narrative that uses grammar and spelling correctly. +* Ability to perform under deadlines and tight schedules. +* Ability to digest and comply with detailed instructions a must as is the ability to prioritize in the context of multiple projects. +* Experience developing program budgets for grant submissions. +* Experience with free and open source software a big plus. + +About LEAP +====================== + +LEAP Encryption Access Project is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. + +* We are a team of 10 dedicated and experienced anti-surveillance hackers. +* We started development in earnest on June 1 2011. +* We are globally distributed in Europe, South America, North America, and South Korea (Yep, it is hard to schedule meetings). +* Everything we do is licensed as free and open source software (GPL whenever possible). +* People of color, women, and queer people are strongly encouraged to apply. diff --git a/pages/about-us/jobs/en.haml b/pages/about-us/jobs/en.haml new file mode 100644 index 0000000..1b61102 --- /dev/null +++ b/pages/about-us/jobs/en.haml @@ -0,0 +1,63 @@ +- @title = 'Jobs' + +:textile + + h1(first). About LEAP + + "LEAP Encryption Access Project":https://leap.se/en is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. + + * We are a team of 10 dedicated and experienced anti-surveillance hackers. + * We started development in earnest on June 1 2011. + * We are globally distributed in Europe, South America, North America, and South Korea (Yep, it is hard to schedule meetings). + * We have an established agile development process that works. + * Everything we do is licensed as free software (GPL whenever possible). + * People of color, women, and queer people are strongly encouraged to apply. + + h1. Open Positions + + Currently, we have no open positions, but we would love to hear from you anyway. Please contact mcnair@leap.se + +-# + h1. Open Positions + + h2. Lead Python Developer + + !>/img/pages/python-logo.png! + + We are hiring a lead Python programmer to shepherd the development of the LEAP Client. The LEAP Client is a desktop application that connects to a larger cloud-based system to provide end-to-end client-side encryption over many different protocols (like email and chat). The app is mostly headless, speaking to the servers via a client-encrypted sync to distributed databases and to local clients via traditional protocols like IMAP, SMTP, and XMPP. We are looking for someone who can take a leading role in overall design of the client (and related protocols), provide direction for development, work collaboratively with a small team of hackers, and assure clean code. + + + + What we are looking for, via a list of many bullets: + + * Many years of experience with Python + * Clear understanding of public key cryptography and experience using cryptographic libraries + * Burning desire to secure communications from prying eyes and snooping algorithms + * Uncontrolled obsession with free and open source software + * Experience with architecture of large applications + * Love of clean code + * Ability to take on a leadership role + * Enthusiasm for working collaboratively + * Good testing practices + * Experience with cross-platform development + * Ability to understand and work with complex distributed systems + * Self-motivated and able to effectively work remotely + + Compensation rates are high for US non-profits and low for the US tech industry. This could be a full-time or part-time position, as desired. + + h2. Android Developer + + !>/img/pages/android-logo.jpg! + + We are hiring a programmer for ongoing Android development, including porting the LEAP Client to Android and writing a client-encrypted sync provider that integrates with the LEAP data storage. Many of the key components on which the client will depend have already been ported to Android, such as openvpn, sqlcipher, and u1db. Like its desktop counterpart, the goal with the Android client is to have a minimal UI that auto-configures itself with the service provider. We will only support Android 4.0 and above (earlier releases don't have "VpnService":http://developer.android.com/reference/android/net/VpnService.html API). + + What we are looking for, via a list of many bullets: + + * Experience with Android application development + * Familiarity with public key cryptography and (ideally) experience with BouncyCastle + * Enthusiasm for working collaboratively + * Good testing practices + * Burning desire to secure communications from prying eyes and snooping algorithms + * Uncontrolled obsession with free and open source software + + Compensation rates are high for US non-profits and low for the US tech industry. This could be a full-time or part-time position, as desired. \ No newline at end of file diff --git a/pages/about-us/news/2012/access-prize/en.haml b/pages/about-us/news/2012/access-prize/en.haml new file mode 100644 index 0000000..35c61f6 --- /dev/null +++ b/pages/about-us/news/2012/access-prize/en.haml @@ -0,0 +1,14 @@ +- @title = "Big thanks to Access for supporting LEAP" +- @author = "Mcnair" +- @posted_at = "2012-12-11" +- @preview = capture_haml do + Last night I attended the awards party for Access Innovation Prize, not knowing what to expect. The prize is for people and organizations using "information technology to promote and enable human rights and deliver social good". It turns out, geeks on a mission know how to do good and have a good time! + + %div{:style => 'float:left; margin: 8px; margin-left: 0;'} + %img{:src => "/img/pages/access-prize-small.jpg"} + %span{:style => "font-size: 80%; line-height: 0.8em; display: block; margin-top: 4px;"} + My, that disc is shiny. + + %br + + LEAP was a finalist in the "Making Crypto Easy" category, but the competition was impressive and deserving. I nearly popped a blood vessel when I heard LEAP called as the winner! Big thanks to Access and all the techies and innovators they assembled. It was an excellent party, and a stellar collection of dedicated technologists. On behalf of LEAP, I am humbled and extremely thankful for this prize. Now we get down to putting the prize money to work... diff --git a/pages/about-us/news/2012/en.haml b/pages/about-us/news/2012/en.haml new file mode 100644 index 0000000..2a1d44a --- /dev/null +++ b/pages/about-us/news/2012/en.haml @@ -0,0 +1,2 @@ +- @path_prefix = '2012' += child_summaries \ No newline at end of file diff --git a/pages/about-us/news/2012/security-bingo/_table.html.haml b/pages/about-us/news/2012/security-bingo/_table.html.haml new file mode 100644 index 0000000..9091b7b --- /dev/null +++ b/pages/about-us/news/2012/security-bingo/_table.html.haml @@ -0,0 +1,163 @@ +%style + :sass + table.table + border: 1px solid #ccc + td + background: white + width: 12.5% + font-size: 0.9em + border-right: 1px solid #ccc + td.section + border-right: 0 + +%table.table + %tr + %th + %th + %th Windows + %th Mac + %th Linux + %th iOS + %th Android + %th Web + %tbody + %tr + %td.section{:rowspan => 3} Messages + %td Short Message + %td{:colspan => 3} #{link 'Pidgin' => 'http://pidgin.im'}, #{link 'Gajim' => 'http://gajim.org'}, #{link 'OTR' => 'http://www.cypherpunks.ca/otr/'} + %td #{link 'ChatSecure' => 'https://chatsecure.org/'} + %td #{link 'Gibberbot' => 'https://guardianproject.info/apps/gibber/'}, #{link 'Beem' => 'http://beem-project.com'}, #{link 'TextSecure' => 'https://github.com/WhisperSystems/TextSecure'} + %td #{link 'Cryptocat' => 'https://crypto.cat'} + %tr + %td Long Message + %td #{link 'Enigmail' => 'http://enigmail.mozdev.org/'}, #{link 'Gpg4win' => 'http://www.gpg4win.org/about.html'} + %td #{link 'Enigmail' => 'http://enigmail.mozdev.org/'}, #{link 'GPGMail' => 'https://www.gpgtools.org/gpgmail/index.html'} + %td #{link 'Enigmail' => 'http://enigmail.mozdev.org/'} + %td + %td #{link 'AGP' => 'http://www.thialfihar.org/projects/apg/'} + %td + %tbody + %tr + %td.section{:rowspan => 5} Files + %td Storage + %td #{link 'DiskCryptor' => 'http://diskcryptor.net'} + %td + %td #{link 'EncFS' => 'http://www.arg0.net/encfs'}, #{link 'eCryptfs' => 'http://ecryptfs.org/'}, #{link 'DMCrypt' => 'http://en.wikipedia.org/wiki/Dm-crypt'} + %td + %td #{link 'AOSP' => 'http://source.android.com/'}, #{link 'Cryptonite' => 'https://code.google.com/p/cryptonite/'} + %td #{link 'SafeWith.me' => 'https://SafeWith.me'} + %tr + %td Backup + %td #{link 'Duplicati' => 'http://duplicati.com/'} + %td + %td #{link 'Déjà Dup' => 'https://launchpad.net/deja-dup'} + %td + %td #{link 'FlashBack' => 'http://www.whispersys.com/flashback.html'} + %td + %tr + %td Synchronization + %td{:colspan => 3} + #{link 'seafile' => 'http://seafile.com'}, #{link 'git-annex' => 'http://git-annex.branchable.com/assistant/'}, #{link 'SparkleShare' => 'http://sparkleshare.org/'}, + #{link 'Syncany' => 'http://www.syncany.org/'} + %td + %td + %td + %tr + %td Data Wipe + %td #{link 'Eraser' => 'http://eraser.heidi.ie/'}, #{link 'BleachBit' => 'http://bleachbit.sourceforge.net/'}, #{link 'DBAN' => 'http://www.dban.org/'} + %td #{link 'DBAN' => 'http://www.dban.org/'} + %td #{link 'BleachBit' => 'http://bleachbit.sourceforge.net/'}, #{link 'DBAN' => 'http://www.dban.org/'}, wipe + %td + %td #{link 'InTheClear' => 'https://github.com/SaferMobile/InTheClear'} + %td N/A + -# %tr + %td Collaboration + %td + %td + %td + %td + %td + %td + %tbody + %tr + %td.section{:rowspan => 3} Audio/Video + %td Direct Calling + %td{:colspan => 2} #{link 'Jitsi' => 'https://jitsi.org/'} + %td #{link 'Jitsi' => 'https://jitsi.org/'}, #{link 'linphone' => 'http://www.linphone.org/'}, #{link 'sflphone' => 'http://sflphone.org/'} + %td + %td #{link 'RedPhone' => 'https://github.com/WhisperSystems/RedPhone'}, #{link 'CSimpleSip' => 'https://code.google.com/p/csipsimple/'} + %td + %tr + %td Conference + %td{:colspan => 3} #{link 'Mumble' => 'http://mumble.sourceforge.net/'} + %td + %td #{link 'Mumble' => 'http://mumble.sourceforge.net/'} + %td + %tr + %td Capture & Reporting + %td + %td + %td + %td + %td #{link 'ObscuraCam' => 'https://guardianproject.info/apps/obscuracam/'} + %td + %tbody + %tr + %td.section{:rowspan => 2} Network + %td Availability + %td{:colspan => 5} #{link 'Commotion' => 'http://commotionwireless.net/'} + %td N/A + %tr + %td Confidentiality & Anonymity + %td{:colspan => 5} #{link 'Tor' => 'https://torproject.org'}, #{link 'OpenVPN' => 'http://openvpn.net'} + %td N/A + %tbody + %tr + %td.section{:rowspan => 3} Identity + %td Passwords + %td{:colspan => 3} #{link 'KeePassX' => 'http://www.keepassx.org/'} + %td + %td #{link 'KeePassDroid' => 'http://www.keepassdroid.com/'} + %td + %tr + %td Validation + %td{:colspan => 6} OpenPGP, #{link 'OTR' => 'http://www.cypherpunks.ca/otr/'} + %tr + %td Authentication + %td{:colspan => 6} #{link 'Mozilla Persona' => 'https://login.persona.org/'}, #{link 'WebID' => 'http://www.w3.org/2005/Incubator/webid/spec/'} + -# %tbody + %tr + %td.section{:rowspan => 2} Anti-intrusion + %td Firewall + %td + %td + %td Many + %td + %td DroidWall + %td N/A + %tr + %td Anti-virus + %td + %td ClamXav + %td ClamAV + %td + %td + %td N/A + -# %tbody + %tr + %td.section{:rowspan => 3} Productivity + %td Events & Scheduling + %td + %td + %td + %td + %td + %td + %tr + %td Tasks & Planning + %td + %td + %td + %td + %td + %td diff --git a/pages/about-us/news/2012/security-bingo/en.text b/pages/about-us/news/2012/security-bingo/en.text new file mode 100644 index 0000000..159945f --- /dev/null +++ b/pages/about-us/news/2012/security-bingo/en.text @@ -0,0 +1,30 @@ +@title = "Let's play security bingo! (Updated)" +@author = "Elijah" +@posted_at = "2012-08-28" +@more = true +@preview = "To be honest, this is might be the least satisfying game of bingo ever—but let's play anyway. The rules are simple: make a grid cross referencing OS platform and communication toolset. In each cell, put the name of an open source software package with reasonable security properties. If this exercise doesn't make you break down in tears, then you have won." + +To be honest, this is might be the least satisfying game of bingo ever--but let's play anyway. The rules are simple: make a grid cross referencing OS platform and communication toolset. In each cell, put the name of an open source software package with reasonable security properties. If this exercise doesn't make you break down in tears, then you have won. + +The rules probably need some adjustment if this game is to catch on. + +Here is my attempt at playing: + +<%= render :partial => 'table' %> + +Looking at this table, it is immediately obvious that there are a lot of empty cells. Unfortunately, most of the cells that are filled in contain software that is unfriendly or even sadistic toward the user. Trying to use many of these tools can feel like developing a BDSM relationship with your computer, and you are not the top. + +What is missing might be more revealing than what is listed. These toolsets are entirely absent from my 'security bingo' game card: + +* *Social Networking:* When I excluded software that I think is unfeasible (SecureShare) or has no security (Diaspora, etc), then you end up with zero projects. +* *Document Collaboration:* I have high hopes for an encrypted etherpad, but so far no one has started work on it. +* *Photos/Vidoes & Galleries:* Nothing I have heard of. +* *Events & Scheduling:* Nothing I have heard of. +* *Tasks & Planning:* Nothing I have heard of. + +I also excluded a few obvious categories: + +* *Firewall:* Reasonable firewall support is now built into most operating systems. +* *Anti-virus:* Viruses are still mostly a problem on Windows. Other platforms have just gotten lucky so far. + +If you have suggestions for how I can fill in my game card, please write elijah@leap.se. \ No newline at end of file diff --git a/pages/about-us/news/2013/en.haml b/pages/about-us/news/2013/en.haml new file mode 100644 index 0000000..30cd596 --- /dev/null +++ b/pages/about-us/news/2013/en.haml @@ -0,0 +1,2 @@ +- @path_prefix = '2013' += child_summaries \ No newline at end of file diff --git a/pages/about-us/news/2013/support-encryption-tools-for-journalists.haml b/pages/about-us/news/2013/support-encryption-tools-for-journalists.haml new file mode 100644 index 0000000..03a1f9c --- /dev/null +++ b/pages/about-us/news/2013/support-encryption-tools-for-journalists.haml @@ -0,0 +1,6 @@ +- @title = "Support encryption tools for journalists" +- @author = "Elijah" +- @posted_at = "2013-12-08" +- @more = false +- @preview = capture_haml do + Freedom of the Press Foundation has launched a crowd fundraising campaign to support encryption tools for journalists, and LEAP is one of the receiving projects. It is an honor to be amoung Tor, Tails, and WhisperSystems. diff --git a/pages/about-us/news/2013/the-big-seven/en.haml b/pages/about-us/news/2013/the-big-seven/en.haml new file mode 100644 index 0000000..4b66a62 --- /dev/null +++ b/pages/about-us/news/2013/the-big-seven/en.haml @@ -0,0 +1,8 @@ +- @title = "The big seven hard problems in secure communication" +- @author = "Elijah" +- @posted_at = "2013-08-22" +- @more = true +- @preview = capture_haml do + If you take a survey of interesting initiatives to create more secure communication, a pattern starts to emerge: it seems that any serious attempt to build a system for secure message communication eventually comes up against the following list of seven hard problems. These problems appear to be present regardless of which architectural approach you take (centralized authority, distributed peer-to-peer, or federated servers). + += render :page => 'hard-problems' \ No newline at end of file diff --git a/pages/about-us/news/2014/android-oh-seven.md b/pages/about-us/news/2014/android-oh-seven.md new file mode 100644 index 0000000..0da7d51 --- /dev/null +++ b/pages/about-us/news/2014/android-oh-seven.md @@ -0,0 +1,19 @@ +@title = 'Bitmask Android 0.7.0' +@author = 'Parménides GV' +@posted_at = '2014-10-06' +@more = true +@preview = '

We\'ve released a new version of our Android client, which improves the stability of our VPN tunnel and fixes a bunch of bugs.

' + +We've released a new version of our Android client, which improves the stability of our VPN tunnel and fixes a bunch of bugs. + +We solved a pesky problem related to memory usage. When total available memory gets very low, Bitmask would stop. To solve this problem Bitmask will now restart when neccessary. + +Deep research on how AOSP (Android Open Source Project) works when an app is killed informed this solution, and the restart should happen as quick as possible: we've measured 45 seconds in a real environment. Once implemented, this feature was suggested to the upstream project for the VPN, [ics-openvpn](https://code.google.com/ics-openvpn), and was accepted and incorporated right away (thanks Arne). + +We also started to do the work needed for Bitmask to be added to F-Droid, but we're going to use a much awaited feature from F-Droid which is [almost complete](https://f-droid.org/wiki/page/Verification_Server) so stay tuned, because you'll see both F-Droid improvements from their side and Bitmask Android on an F-Droid repository really soon! + +Finally, a couple of annoying bugs have been fixed: first of all, you can turn off VPN from our dashboard switch, and if that happens (or more generally, if you switch off VPN by any means), you won't see the "Blocked traffic" notification which appeared on 0.6.0. + +We're beginning to collaborate with third parties, and getting more [users and feedback on the Play Store](https://play.google.com/store/apps/details?id=se.leap.bitmaskclient). As with any Libre Software project, you're more than welcomed to tell us your suggestions (use [Twitter](https://twitter.com/leapcode), [GitHub](https://github.com/leapcode/bitmask_android), [file bugs](https://leap.se/code/), or even [collaborate with us in the development itself](https://github.com/leapcode/bitmask_android#contributing). + +Thanks for your attention, and if you're a user, thanks for your feedback and support! diff --git a/pages/about-us/news/2014/bitmask-oh-seven-rc.md b/pages/about-us/news/2014/bitmask-oh-seven-rc.md new file mode 100644 index 0000000..c8ba357 --- /dev/null +++ b/pages/about-us/news/2014/bitmask-oh-seven-rc.md @@ -0,0 +1,21 @@ +@title = 'Bitmask Desktop v0.7.0-rc1 is ready for testing' +@author = 'Ivan' +@posted_at = '2014-10-06' +@more = true +@preview = '

Starting today users can run a "stable" or "unstable" version of Bitmask. For each new version, we will first issue an "unstable" public release candidate. People who are in position to run bleeding edge code can run the "unstable" version and help us find any problems that we might have missed.

' + +Code name: "One time download, all time update" + +Starting today users can run a "stable" or "unstable" version of Bitmask. For each new version, we will first issue an "unstable" public release candidate. People who are in position to run bleeding edge code can run the "unstable" version and help us find any problems that we might have missed. We will fix these problems and then release a rock solid "stable" version of Bitmask. Download the release candiate, and report issues you find on our tracker https://leap.se/code or alert us on irc (freenode.net #leap). + +## Changes + +For the users of the Linux Bundles, this is the first Bitmask Desktop client release that brings the ability to self-update. This means that you will be able to easily up to date to the latest version. On startup, the app will look for updates, and let you known when a new release is ready and give you a one-click access to the update. If you are using your package manager, you will still have to use the traditional methods to get updates (in ubuntu/Debian, that's `apt-get update && apt-get upgrade`). + +Based on your feedback we have merged all preferences into one elegant and simplified window, and as usual have fixed a hand full of smaller bugs. + +Behind the scenes were are quietly readying Bitmask for dead simple encrypted email. Its getting dangerously close to a public release candidate. + +* [Download Release Candidate](https://dl.bitmask.net/client/linux/release-candidate/) v0.7.0-rc1 and help us test the code +* [Download the Stable version](https://dl.bitmask.net/) +* [Changelog](https://raw.githubusercontent.com/leapcode/bitmask_client/master/CHANGELOG.rst) diff --git a/pages/about-us/news/2014/bitmask-public-beta.md b/pages/about-us/news/2014/bitmask-public-beta.md new file mode 100644 index 0000000..5ad97a4 --- /dev/null +++ b/pages/about-us/news/2014/bitmask-public-beta.md @@ -0,0 +1,35 @@ +@title = 'Bitmask Public Beta' +@author = 'Elijah' +@more = true +@posted_at = '2014-08-22' +@preview = '

The LEAP Encryption Access Project (LEAP) is launching the first public beta of the Bitmask application for Linux and Android. Bitmask is an open source application to provide easy and secure encrypted communication. You can choose among several different service providers or start your own. Bitmask supports VPN with Encrypted Email coming soon.

' + + +Bitmask Public Beta +------------------------------------------- + +The LEAP Encryption Access Project (LEAP) is launching the first public beta of the Bitmask application for Linux and Android. + +*Bitmask* is an open source application to provide easy and secure encrypted communication. You can choose among several different service providers or start your own. Bitmask supports VPN with Encrypted Email coming soon. + +The *Bitmask* application is designed to have a *friendly* interface with *automatic* configuration. You simply start the application, register with the compatible service provider of your choice, and away you go. + +With Bitmask VPN, all your traffic is securely routed through your provider before it is decrypted and sent on to the open internet. + +* *Thwart Network Surveillance*: Bitmask VPN is very effective at bypassing most censorship and network surveillance by your ISP or country. + +* *Anonymize your address*: Your IP address will also be hidden, keeping your physical location safe from nefarious websites or network eavesdroppers. + +* *Extra Security*: We take extra security measures to prevent problems common to other personal VPNs, such as DNS leakage and IPv6 leakage (not all enhancements available on Android). + +To install Bitmask, visit https://bitmask.net + +Currently, the only language that is supported in the application and help documentation is English. We are adding more languages soon. + +Users: Let us know what you think by sending a message to discuss@leap.se or on irc.freenode.net #leap. If you have any problems, bug reports can be filed here and are super appreciated! https://leap.se/code + +Providers: If you are interested in providing Bitmask-compatible services, we are always available to help with your setup and launch. https://leap.se/en/docs/platform + +In the coming weeks we will be fixing all the bugs you report. We are actively working on Mac (soon) and Windows (later) support, and adding auto-failover to next available gateway, autostart, and obfsproxy technology. The rest of our attention is focused on secure end to end client encrypted email. We are tantalizingly close to having a public Beta of our email service. + +Stay tuned. Sign up to our mailing list (discuss-subscribe@leap.se), or follow us on twitter (@leapcode). diff --git a/pages/about-us/news/2014/bitmask-release.haml b/pages/about-us/news/2014/bitmask-release.haml new file mode 100644 index 0000000..b889c0e --- /dev/null +++ b/pages/about-us/news/2014/bitmask-release.haml @@ -0,0 +1,43 @@ +- @title = 'Bitmask "long time no see" release' +- @author = 'Kali' +- @posted_at = '2014-04-25' +- @more = true +- @preview = capture_haml do + %div{:style => 'float:left; margin: 8px 8px 8px 0'} + %img{:src => "/img/pages/bitmask-icon.png"} + It's is with pleasure that we announce the arrival of the 0.5.0 version of Bitmask, code named "long time no see"! With over 187 files changed, 19627 insertions(+) and 5005 deletions(-), this release of the bitmask client is one of the largest to date! To get the latest version, you can visit the Bitmask downloads page. + +%p It's is with pleasure that we announce the arrival of the 0.5.0 version of Bitmask, code named "long time no see"! + +%p With over 187 files changed, 19627 insertions(+) and 5005 deletions(-), this release of the bitmask client is one of the largest to date! To get the latest version, you can visit the Bitmask downloads page. + +%p Here is a summary of the main changes, with links to the complete changelogs for those who want the details: + +%h3 Bitmask + +%p changelog + +%p On this release we are fixing a ton and a half of bugs in the user interface on different desktops, hopefully getting closer and closer to a really smooth experience. There is also a shiny new button for easy log pasting. A couple of bugs that were also interfering with the correct functioning of Encrypted Internet Proxy have also been smashed for your benefit. And the first steps have been integrated for paving the way to the big client code refactor coming in the next few releases. + +%h3 Soledad + +%p changelog + +%p Improvements to soledad in this iteration include several optimizations to make data synchronization faster and more efficient, and fixing a couple of bugs that were making concurrent syncs fail. We also got rid of a bug that was making the server consume way too much memory. + +%h3 leap.mail + +%p changelog + +%p Although mail is not ready for prime time yet, this release addresses several fixes to make the service correctly parse different types of mails, including all of your unicodes. Mail code went through a extensive refactor to allow for smaller syncs. We also added partial support for SEARCH commands to allow thunderbird to save your drafts. + +%h3 leap.mx + +%p changelog +This version brings in some fixes for dealing with multipart documents. + +%h3 leap.keymanager + +%p changelog + +%p Keymanager was updated to work with the latest webapp release, and now is able to memoize calls. diff --git a/pages/about-us/news/2014/columbia-journalism-review.haml b/pages/about-us/news/2014/columbia-journalism-review.haml new file mode 100644 index 0000000..9923ef7 --- /dev/null +++ b/pages/about-us/news/2014/columbia-journalism-review.haml @@ -0,0 +1,6 @@ +- @title = "LEAP article in Columbia Journalism Review" +- @author = "Elijah" +- @posted_at = "2014-01-10" +- @more = false +- @preview = capture_haml do + The Columbia Journalism review has a nice introduction to LEAP encrypted email and the importance of secure communication for journalists. diff --git a/pages/about-us/news/2014/darkest-night.md b/pages/about-us/news/2014/darkest-night.md new file mode 100644 index 0000000..71a81cc --- /dev/null +++ b/pages/about-us/news/2014/darkest-night.md @@ -0,0 +1,45 @@ +@title = 'New releases for a new year' +@author = 'Staff' +@posted_at = '2014-12-23' +@more = true +@preview = '

LEAP is happy to celebrate the days getting longer with shiny new releases of the LEAP platform and Bitmask client for Linux and Android. We resolved over 160 issues for the platform release alone!

' + +LEAP is happy to celebrate the days getting longer with shiny new releases of the LEAP platform and Bitmask client for Linux and Android. + +Platform 0.6.0 +-------------- + +With over 160 issues resolved, the latest platform is a fine tuned, easy to deploy, self monitoring machine. We are real happy with its current state and are looking forward to pushing more frequent releases in the coming months. + +Whats New: single node deployment; platform customization; couch flexibility; stunnel rework; new debian repository structure; dependency pinning; leap_cli modularization; improved cert generation; monitoring improvements such as per-environment tooling and notifications; tor hidden service support; switch away from NIST curve and ensure TLSv1 is used; tests made significantly more robust; add support for webapp deployment to a subdomain; many, many bugfixes and stability improvements + +* Download 0.6.0 signed tag: https://leap.se/git/leap_platform.git +* Changelog: https://leap.se/git/leap_platform.git/shortlog/refs/tags/0.6.0 +* Known issues: https://leap.se/en/docs/platform/troubleshooting/known-issues + + +Bitmask 0.7.0 +------------- + +The LEAP team is pleased to announce the immediate availability of Bitmask 0.7.0 codename "One window to rule them all". We are introducing automatic secure updates for the Bitmask application, making use of a spell called [The Update Framework](http://theupdateframework.com/), aka TUF if you're on friendly terms. Based on your feedback, we are also introducing a sleek new settings panel. As usual, we have also crushed a few bugs along the way. + +For the users of the Linux Bundles, this is the first Bitmask Desktop client release that brings the ability to self-update. This means that you will be able to easily up to date to the latest version. On startup, the app will look for updates, and let you known when a new release is ready and give you a one-click access to the update. If you are using your package manager, you will still have to use the traditional methods to get updates (in ubuntu/Debian, that’s apt-get update && apt-get upgrade). + +Enjoy it while it is hot! + +* Download: https://dl.bitmask.net/linux +* Download 0.7.0 signed tag: https://leap.se/git/bitmask_client.git +* Changelog: https://raw.githubusercontent.com/leapcode/bitmask_client/master/CHANGELOG.rst +* Known issues: https://leap.se/en/docs/client/known-issues +* Compatibility notes: Bitmask 0.7.0 is not compatible with platform versions older than 0.6.0 + +Bitmask Android 0.8.2 +----------------------------- + +Lollipop is here, and Bitmask Android has been visually and internally updated to give the best experience to date for both early Android 5.0 adopters and usual Android 4 users. + +Two new providers have been added to our preseeded list, and a lot of bugs have been fixed. This release will hopefully be the best one yet, both in terms of usability and stability. + +Stay tuned, because 0.9.0 will arrive soon with interesting new VPN features! + +Changelog: https://github.com/leapcode/bitmask_android/blob/master/CHANGELOG diff --git a/pages/about-us/news/2014/en.haml b/pages/about-us/news/2014/en.haml new file mode 100644 index 0000000..472f438 --- /dev/null +++ b/pages/about-us/news/2014/en.haml @@ -0,0 +1,2 @@ +- @path_prefix = '2014' += child_summaries :order_by => :posted_at \ No newline at end of file diff --git a/pages/about-us/news/2014/gsoc.html.haml b/pages/about-us/news/2014/gsoc.html.haml new file mode 100644 index 0000000..351cbf9 --- /dev/null +++ b/pages/about-us/news/2014/gsoc.html.haml @@ -0,0 +1,9 @@ +- @title = 'Google Summer of Code 2014' +- @author = 'Mcnair' +- @posted_at = '2014-04-24' +- @more = false +- @preview = capture_haml do + %div{:style => 'float:right; margin: 8px; margin-right: 0;'} + %img{:src => "/img/pages/gsoc.png"} + %p LEAP has selected three Google Summer of Code projects that we are really excited about. One focuses on improving Soledad transport, another on better Windows integration, and a third on adding obfsproxy to the encrypted internet proxy. Congratulations to the students who submitted these projects, they stood out above the rest of the proposals. + %p In the coming months, stay tuned for updates on the progress made to these Google Summer of Code projects. diff --git a/pages/about-us/news/2014/platform-hotfix-release.md b/pages/about-us/news/2014/platform-hotfix-release.md new file mode 100644 index 0000000..70ac4fd --- /dev/null +++ b/pages/about-us/news/2014/platform-hotfix-release.md @@ -0,0 +1,13 @@ +@title = 'Platform HotFix Release 0.5.4.1' +@author = 'Micah' +@posted_at = '2014-08-28' +@more = true +@preview = '

This Platform release is a hotfix release, resolving a couple issues that came up in the previous release. It fixes tapicero dependency ordering so it will start more reliably (#6004); resolves the /etc/hosts ordering to properly construct the FQDN (#5835); and finally a fix for the logging problem (#6020)

' + +This Platform release is a hotfix release, resolving a couple issues that came up in the previous release. It fixes tapicero dependency ordering so it will start more reliably (#6004); resolves the /etc/hosts ordering to properly construct the FQDN (#5835); and finally a fix for the logging problem (#6020) + +There's ongoing work to make leap_platform run all services on one single node. However, this is not possible in this release. + +* Download: signed 0.5.4.1 tag: https://leap.se/git/leap_platform.git +* Changelog: https://leap.se/git/leap_platform.git/shortlog/refs/tags/0.5.4.1 +* Known issues: https://leap.se/git/leap_platform.git/blob/HEAD:/README.md diff --git a/pages/about-us/news/2014/platform-release.html.haml b/pages/about-us/news/2014/platform-release.html.haml new file mode 100644 index 0000000..83b6e9e --- /dev/null +++ b/pages/about-us/news/2014/platform-release.html.haml @@ -0,0 +1,54 @@ +- @title = 'LEAP Platform release 0.5.0' +- @author = 'Micah' +- @posted_at = '2014-04-21' +- @more = true +- @preview = capture_haml do + We are happy to announce that the 0.5.0 version of the Leap Platform has been released! There have been a staggering number of improvements since the last release that touch a lot of areas. I'll give you a higher level summary of the changes here. + +%p We are happy to announce that the 0.5.0 version of the Leap Platform has been released! There have been a staggering number of improvements since the last release that touch a lot of areas. I'll give you a higher level summary of the changes here. + +%p There is a signed 0.5.0 tag in the platform git repository, which you can find here: https://leap.se/git/leap_platform + +%p Without further ado, here is what is included: + +%h2 Monitoring + +%p With this release a new monitoring service was added, including the ability to monitor multiple environments with one monitor node. Many logging improvements go along with this feature, like improvements in rotation, making more daemons write to standardized syslog locations. + +%h2 TLS fun + +%p Many improvements related to TLS were rolled out. For mail we now require TLS between satellite servers and the relayhost, and leap mx, we've also improved overall opportunistic TLS configurations. + +%p For the web configurations, the https TLS configurations were modified to take advantage of TLS1.2 features, enhancements to help protect against BREACH and CRIME attacks, and cipher preferences adjusted to prefer PFS, and best-practices strongest cipher selections. + +%p Thanks to heartbleed, we got to test rolling certs and keys in the platform. We are pleased that it went so easily. We simply had to remove the existing ones, ask leap cli to generate new ones, plop in the commercial cert/keys and deploy. Everything was then put where it should be and restarted. With the exception of soledad-server, which was fixed. + +%h2 Whitebox tests + +%p Whitebox tests were added, now you can run 'leap test' in your provider and various critical tests will be run to determine the overall health of your provider. In particular these tests are performed right now: connectivity, checking that correct daemons are running, checking cluster health, and membership, checking for required ACL users and required databases. + +%h2 Bigcouch + +%p There were many Bigcouch scaling improvements dealing with exhausting inodes and body to large issues, and cluster settling before deployment of design documents, databases and users, as well as automatic shard compaction. We also ship some couch scripts that help us with debugging and backups. + +%p We added deployment of new design documents for soledad, and for the new shared database and more robust handling of design document deployment We also migrated u2db metadata to a better structure that allowed for atomic operations and elimination of potential cases of inconsistency + +%h2 Webapp + +%p Functionality was added to allow for a customized webapp git repository, and we now anonymize webapp ips (ipv4 only) by default (in addition to ips in system logs, which cover most cases) + +%h2 Leap CLI + +%p The leap CLI was also improved to fix various corner case bugs, some notable improvements: invalid hostname detection; making sure the ssh key is available in the agent; adding a --no-color flag so log files are not colorized; add a --no-deploy feature; added a 'plain' node, which has no services deployed to it. + +%h2 Tapicero + +%p New tapicero was also deployed with enhancements and fixes to deal better when failing to create databases, and avoiding bigcouch conflicts, adding a flag to re-run for all known users, and a flag to overwrite the _security document. + +%h2 Miscellaneous + +%p Mail for admins is now properly routed to the address configured in provider.json. We also updated the default nameservers to account for changes in upstream availability. Make sure nodes have proper time synchronization setup and configured, even when nodes are snapshot nodes that have been off for a long time. Improvements in code restructuring to help eliminate some redundancy in setting things up, tearing them down and then setting them up again in between initial run stages + +%p We make sure that sensitive components are downloaded over encrypted protocols, such as ruby gems and vagrant baseboxes, we also made sure that bigcouch admin processes were only listening on localhost. + +%p Finally, the latest versions of leap-mx, soledad, keymanager, the webapp and the associated libraries will also be updated when deploying this release. \ No newline at end of file diff --git a/pages/about-us/news/2014/poodle-hot-fix.html.haml b/pages/about-us/news/2014/poodle-hot-fix.html.haml new file mode 100644 index 0000000..66d9bb4 --- /dev/null +++ b/pages/about-us/news/2014/poodle-hot-fix.html.haml @@ -0,0 +1,18 @@ +- @title = "Poodle hot-fix" +- @author = "Micah" +- @posted_at = "2014-10-15" +- @more = true +- @preview = capture_haml do + As you may have heard, there is a new dog in town, and it is a Poodle. Poodle (Padding Oracle On Downgraded Legacy Encryption) is the name for a severe flaw in the SSLv3 protocol, which can be exploited to force connections to reveal plain-text. The Poodle announcement brought with it the death of the SSLv3 protocol, and none too soon. + +%p As you may have heard, there is a new dog in town, and it is a Poodle. Poodle (Padding Oracle On Downgraded Legacy Encryption) is the name for a severe flaw in the SSLv3 protocol, which can be exploited to force connections to reveal plain-text. The Poodle announcement brought with it the death of the SSLv3 protocol, and none too soon. + +%p In order to respond to this issue, we've made an important security fix release for the Platform. This release simply disables the SSLv3 protocol (as well as deactivates the weak RC4 cipher). + +%p To apply this update, simply update the Leap Platform master branch (or checkout the signed 0.5.5 tag), and deploy to the webapp node. + +%ul + %li + %a(href="https://leap.se/git/leap_platform.git") Leap Platform git repository + %li + %a(href="https://leap.se/git/leap_platform.git/tag/3c7f2f98cdaabb00e13325476197fbbc74dff597") The signed 0.5.5 tag diff --git a/pages/about-us/news/2014/release-oh-five-one.md b/pages/about-us/news/2014/release-oh-five-one.md new file mode 100644 index 0000000..645518a --- /dev/null +++ b/pages/about-us/news/2014/release-oh-five-one.md @@ -0,0 +1,81 @@ +@title = 'Release 0.5.1' +@author = 'Micah' +@posted_at = '2014-05-22' +@more = true +@preview = '

We are happy to announce the 0.5.1 LEAP release, code named "los trecesemanas" or "lil less leaky". This rapid round of development focused primarily on getting our Encrypted Internet Proxy (VPN) system secured against data leakage, as well as the continued refactor of the soon to be released encrypted email service.

' + +We are happy to announce the 0.5.1 LEAP release, code named "los trecesemanas" or "lil less leaky". This rapid round of development focused primarily on getting our Encrypted Internet Proxy (VPN) system secured against data leakage, as well as the continued refactor of the soon to be released encrypted email service. + +Various development details for the client, platform and the webapp are below. + +Platform +======== + +The platform had a number of minor improvements, mostly the work is EIP related: deployment improvements make openvpn service fragments be fully created before the service is deployed. We now block EIP originated DNS traffic at the OpenVPN gateway. We now install openvpn 2.3 from wheezy backports, and set the ipv6 configuration options to force client ipv6 traffic through the gateway, and then reject any outgoing ipv6 packets. Additionally, script-security is set to '1' and tcp-nodelay is configured. + +There were also few other minor improvements in other areas: the initial firewall will allow port 22 by default, and it triggers better. There were nagios check improvements to eliminate duplicates. Service levels were added to the webapp config; known issues are now documented in the git repository; a simple shorewall whitebox test was added; rsyslog and unbound are now pulled from wheezy-backports. Stunnel refreshing will happen more reliably. Tor nicknames will get set automatically, with a default, and the tor family variable will be filled out correctly. The resolv.conf is fixed on virtualbox. Now we can put the webapp on a subdomain and we have support for environmentally scoped services and tags, when using latest leap_cli. + +Download: + +* There is a signed 0.5.1 tag: https://leap.se/git/leap_platform + +Changelog: + +* https://leap.se/git/leap_platform.git/shortlog/refs/tags/0.5.1 + +Known issues: + +* https://leap.se/git/leap_platform.git/blob/071547967cc00acf18bf68b78e350131017852b9:/README.md + +Webapp +================== + +Webapp development was focused on getting it ready for the beta launch. We enhanced the API with an endpoint to query for the services available when logged in and to notify users via the client. The directory and engine structure has been cleaned up. Documentation now lives on leap.se/docs. Lot's of bugs have been found and fixed during QA and we ensure the availability with nagios tests. + +Changelog: + +* https://github.com/leapcode/leap_web/releases/tag/0.5.1 + +Android +================== + +Android version is running slighly ahead fo the rest! We released 0.5.1 three weeks ago and have made public our 0.5.2 release candidate. 0.5.1 and 0.5.2rc improvements include: + +1. Autostart - If you have EIP on and shutdown your phone, Bitmask will autostart EIP once the phone is running again. +2. Gradle support - This only matters to developers, and they'll know what this means, so no more words +3. Signup support - You can register a new account with a LEAP provider from the android client. + +Autostart still has some glitches due to some problems with ics-openvpn. Next weeks we'll address these issues by cleaning and updating our ics-openvpn codebase. So hold your breath for the next 3 weeks, you'll hopefully see a very good 0.5.2 (or even 0.6!) release. + +Download: + +* https://play.google.com/store/apps/details?id=se.leap.bitmaskclient +* https://downloads.leap.se/client/android/Bitmask-Android-0.5.2-RC1.apk + +Changelog: + +* https://raw.githubusercontent.com/leapcode/bitmask_android/master/CHANGELOG + +Client +================== + +The client focus was towards fixing a security problem that exists in every VPN client to this date, which is: if VPN fails in any way, your traffic gets leaked out of the secure network. + +We leverage the Linux firewall to block all traffic outside of the computer except for the VPN gateways. So even if OpenVPN crashes or the client wrongly says you're going through EIP, you won't be leaking traffic when you are not expecting it. + +The same approach will be expanded to other platforms in the near future. + +Known Issues: Firewall is torn down during restarts #5687. This should be fixed in the early 0.5.2 rc. + +Download: + +* https://dl.bitmask.net + +Changelog: leap.bitmask + +* https://raw.githubusercontent.com/leapcode/bitmask_client/develop/CHANGELOG.rst + +Changelog: leap.soledad + +* https://raw.githubusercontent.com/leapcode/soledad/develop/CHANGELOG + diff --git a/pages/about-us/news/2014/release-oh-five-two.md b/pages/about-us/news/2014/release-oh-five-two.md new file mode 100644 index 0000000..3a12926 --- /dev/null +++ b/pages/about-us/news/2014/release-oh-five-two.md @@ -0,0 +1,64 @@ +@title = 'Release 0.5.2' +@author = 'Micah' +@posted_at = '2014-06-22' +@more = true +@preview = '

Along with ongoing bug fixes and stability enhancements, the 0.5.2 release of the bitmask client focused on improving VPN security features added in the prior release. In Android development, we are laying the groundwork for better coordination with ics-openvpn which will improve stability and user experience. We plan to launch our beta VPN service in the coming weeks. All of our code that is released is now signed by the LEAP code signing key (key ID 0x1E34A1828E207901, Fingerprint 1E45 3B2C E87B EE2F 7DFE 9966 1E34 A182 8E20 7901).

' + +Overview +--------------- + +Along with ongoing bug fixes and stability enhancements, the 0.5.2 release of the bitmask client focused on improving VPN security features added in the prior release. In Android development, we are laying the groundwork for better coordination with ics-openvpn which will improve stability and user experience. We plan to launch our beta VPN service in the coming weeks. Stay tuned! + +In addition to the 0.5.2 releases detailed below, we have now all of our code that is released is signed by the LEAP code signing key (key ID 0x1E34A1828E207901, Fingerprint 1E45 3B2C E87B EE2F 7DFE 9966 1E34 A182 8E20 7901). + +Client +--------------- + +An overall improvement in user experience for the fail close security feature was the main focus. We improved the firewall handling on Linux for failing close when the VPN doesn't work as expected. + +Changelogs: + +* leap.bitmask 0.5.2 - https://github.com/leapcode/bitmask_client/blob/develop/CHANGELOG.rst +* leap.common 0.3.8 - https://github.com/leapcode/leap_pycommon/blob/develop/CHANGELOG + +Platform +--------------- + +This release of the platform has a few minor bug fixes, and a few new features. + +It is now possible to run the webapp and mx on the same host; it is now possible to change the sshd port for nodes; static sites now support rack applications and custom apache configurations and /provider.json can now be served from the static site; the templatewlv function was added enabling passing local variables to templates. + +Various minor code cleanups happened, removing redundant or unused classes and variables, consolidating duplicated pieces and fixing the non-functioning inclusion of the sshd class. Some improved documentation and a fix for unbound configs in the unbound.conf.d directory. + +* Download: +There is a signed 0.5.2 tag: https://leap.se/git/leap_platform.git +* Changelog: +https://leap.se/git/leap_platform.git/shortlog/refs/tags/0.5.2 +* Known issues: +https://leap.se/git/leap_platform.git/blob/071547967cc00acf18bf68b78e350131017852b9:/README.md + +Webapp +--------------- + +We continue polishing the webapp for beta launch and integration with existing services. We prevent users from seeing the tickets of other users and hash our tokens to prevent timing attacks. We ease the integration for providers with existing user bases and use smtp certs to be able to kick out spammers. The UI has been polished with customized error pages and improved i18n. + +0.5.2 is tagged for the webapp with a commit message detailing the changes: https://github.com/leapcode/leap_web/releases/tag/0.5.2 + + +Android +--------------- + +With this version we begin a strong effort to maintain a sane upstream relationship with our base project, ics-openvpn. This is an important step for the stablility and and ease of use for our EIP client, and we're excited about what it means for our development process. We are polishing our patches and will be proposing these to ics-openvpn after our next releaes. + +Also, we have added signup support, enabling you to do so from the login button and from a menu button. + +Changelog: https://github.com/leapcode/bitmask_android/blob/0.5.2/CHANGELOG + + + +Soledad +-------------- + +Focus for this release was on soledad sync stability and speed. This version of Soledad features a sync process which performs one HTTP request for each document sent to or received by the server. The sync process can be interrupted and also reports its status. Two minor bugs have been squashed: avoiding a bigcouch multipart-put bug and authenticating in constant-time to avoid time attacks against the auth scheme. + +leap.soledad 0.5.2 - https://github.com/leapcode/soledad/blob/develop/CHANGELOG diff --git a/pages/about-us/news/2014/release-oh-six.md b/pages/about-us/news/2014/release-oh-six.md new file mode 100644 index 0000000..2df1624 --- /dev/null +++ b/pages/about-us/news/2014/release-oh-six.md @@ -0,0 +1,58 @@ +@title = 'Release 0.6' +@author = 'Micah' +@posted_at = '2014-08-21' +@more = true +@preview = '

This release gets the award for most improved, with a focused on major overhauls of the Android and Linux Bitmask clients. These apps now have better security, usability, and stability. We have temporarily broken our practice of releasing all projects with the same version at the same time.

' + +Overview +------------------------------------- + +This release gets the award for most improved, with a focused on major overhauls of the Android and Linux Bitmask clients. These apps now have better security, usability, and stability. We have temporarily broken our practice of releasing all projects with the same version at the same time. + +* Bitmask - Android 0.6.0 +* Bitmask - Desktop 0.6.1 +* LEAP Platform 0.5.3 +* Webapp 0.5.3 + +Bitmask Android 0.6.0 +----------------------------------- + +This is a major release for our Android client. It contains a couple of security improvements that inaugurate a series of small but important features that will try to satisfy security minded people. + +The most important security feature added in this release is the openvpn persistent tun integration with our client. Once your device establishes a vpn tunnel, and as long as you keep EIP switch ON, you'll not route any traffic outside the vpn tunnel while the vpn is being established. Other features include earlier autostart launch, prompt to log in if necessary, and man in the middle prevention. + +Regarding bug fixes, we've finally removed the second notification that was annoying some users. The reason of its removal will be soon documented. Apart from that, we've also addressed the Play Store crashes, and some small UI improvements. + +* Download: https://dl.bitmask.net/android +* Changelog: https://github.com/leapcode/bitmask_android/blob/develop/CHANGELOG + + +Bitmask Linux 0.6.1 +----------------------------------- + +This is the new stable version of the Desktop Client after the refactor in which we have separated frontend from backend. This separation paves the way for starting Bitmask during the boot process, and attach the current graphical client afterwards. And maybe even having cli or html5 clients in the near future, the possibilities that it opens are many! + +It also allows us to finally close an annoying bug that was causing high CPU usage when using the client. + +While we were at it, we gave a little face lift to the UI: the provider selection is in a more prominent place now, and some other little interface tweaks made their way into this last release. We hope you enjoy it as much as we do! + +* Download: https://dl.bitmask.net/linux +* Changelog: https://raw.githubusercontent.com/leapcode/bitmask_client/master/CHANGELOG.rst + +LEAP Platform 0.5.3 +----------------------------------- + +This release of the Platform is a minor release, stabilizing further the previous version by only fixing minor, non-disruptive issues. + +* Download: signed 0.5.3 tag: https://leap.se/git/leap_platform.git +* Changelog: https://leap.se/git/leap_platform.git/shortlog/refs/tags/0.5.3 +* Known issues: https://leap.se/git/leap_platform.git/blob/HEAD:/README.md + + +LEAP Webapp 0.5.3 +----------------------------------- + +This release of the webapp is also a minor bug fix release, with few changes designed to further stabilize this version. We now enable including custom gems to make customization even more powerful. We also fix corner cases during the account creation and document debugging in production. + +* Download: 0.5.3 tag: https://github.com/leapcode/leap_web/archive/0.5.3.tar.gz +* Changelog: 0.5.3 is tagged for the webapp with a commit message detailing the changes: https://github.com/leapcode/leap_web/releases/tag/0.5.3 diff --git a/pages/about-us/news/2014/repository-key-refresh.html.haml b/pages/about-us/news/2014/repository-key-refresh.html.haml new file mode 100644 index 0000000..14f0ec4 --- /dev/null +++ b/pages/about-us/news/2014/repository-key-refresh.html.haml @@ -0,0 +1,59 @@ +- @title = "Repository Key Refresh" +- @author = 'Elijah' +- @posted_at = "2014-01-14" +- @more = true +- @preview = "We screwed up and let our debian repository key expire. The responsible parties have been punished (no more free back rubs). You have three options to fix it..." + +%p We screwed up and let our debian repository key expire. The responsible parties have been punished (no more free back rubs). You have three options to fix: + +%h3 option 1 - blindly upgrade + +%p You can just ignore the warnings about the packages being unauthenticated. This will upgrade your leap-keyring package, which includes the updated key. This is potentially dangerious and should be avoided. + +%pre + apt-get update --allow-unauthenticated + apt-get upgrade --allow-unauthenticated + +%h3 option 2 - re-add key without checking fingerprint + +%p You can simply re-import the key to your apt keyring. This method is less dangerious, but requires you to trust the certificate authority system (which never a good idea). + +%pre + curl https://dl.bitmask.net/apt.key | apt-key add - + +%h3 option 3 - update the key from keyserver + +%p With this method, we update the key by pulling it from a keyserver and then importing to apt-key. This method is the most secure (so long as you follow all the steps and actually verify the fingerprint). + +%p Find the long key-id of the current LEAP archive signing key: + +%pre + apt-key adv --list-keys --keyid-format 0xLONG + +%p You should see this among the output: + +%pre + pub 4096R/0x1E34A1828E207901 2013-02-06 [expired: 2014-02-06] + uid LEAP archive signing key + +%p Now, grab that specific key-id from a keyserver, and verify the fingerprint: + +%pre + gpg --recv-key 0x1E34A1828E207901 + gpg --fingerprint 0x1E34A1828E207901 + +%p You should see this as output: + +:plain +
+  pub   4096R/8E207901 2013-02-06 [expires: 2015-02-07]
+        Key fingerprint = 1E45 3B2C E87B EE2F 7DFE  9966 1E34 A182 8E20 7901
+  uid                  LEAP archive signing key 
+  
+ +%p Make sure that the fingerprint in this output matches the long key-id you listed with apt-key. Without this step, it would be very easy for an attacker to feed you a bogus key. + +%p Finally, import the key into apt-key: + +%pre + gpg --armor --export 0x1E34A1828E207901 | sudo apt-key add - diff --git a/pages/about-us/news/2015/bitmask-oh-eight.md b/pages/about-us/news/2015/bitmask-oh-eight.md new file mode 100644 index 0000000..20d5405 --- /dev/null +++ b/pages/about-us/news/2015/bitmask-oh-eight.md @@ -0,0 +1,31 @@ +@title = 'Bitmask Desktop v0.8' +@author = 'Ivan' +@posted_at = '2015-02-09' +@more = true +@preview = '

Good news everyone! Bitmask for Linux 0.8 has been released. For version 0.8, we focused on fixing bugs and rewriting much of the backend code. There are no new features to try out but if you had some issue bothering you then give this new version a try and tell us how it goes.

' + +Good news everyone! Bitmask for Linux 0.8 has been released. + +For version 0.8, we focused on fixing bugs and rewriting much of the backend code. There are no new features to try out but if you had some issue bothering you then give this new version a try and tell us how it goes. + +Upgrading: + +* From bundle: if you are running bundle version 0.7 or new then Bitmask +should update automatically. +* From package: if you have added deb.bitmask.net to your sources.list, +then Bitmask should update automatically (make sure it is not commented +out). + +If you have a bundle version older than 0.7, please download the latest Bitmask bundle. + +This versions includes all the goods that we shipped on previous ones like the Encrypted Internet service (with leak blocker) and Secure Updates. + +Useful links: + +* Install: https://bitmask.net/en/install +* Source: https://leap.se/git/bitmask_client.git +* Changelog: https://github.com/leapcode/bitmask_client/blob/0.8.0/CHANGELOG.rst +* Known issues: https://leap.se/en/docs/client/known-issues +* Compatibility notes: Bitmask 0.8.0 is not compatible with platform versions older than 0.6.0 + + diff --git a/pages/about-us/news/2015/en.haml b/pages/about-us/news/2015/en.haml new file mode 100644 index 0000000..dd6f43e --- /dev/null +++ b/pages/about-us/news/2015/en.haml @@ -0,0 +1,3 @@ +- @path_prefix = '2015' + += child_summaries \ No newline at end of file diff --git a/pages/about-us/news/en.haml b/pages/about-us/news/en.haml new file mode 100644 index 0000000..480fb17 --- /dev/null +++ b/pages/about-us/news/en.haml @@ -0,0 +1,4 @@ +- @title = 'News' +- @path_prefix = 'news' + += child_summaries levels:2, summary:false, heading:3, order_by: :posted_at \ No newline at end of file diff --git a/pages/about-us/partners/en.md b/pages/about-us/partners/en.md new file mode 100644 index 0000000..8ff8795 --- /dev/null +++ b/pages/about-us/partners/en.md @@ -0,0 +1,27 @@ +@title = 'Partners' + +## Development partners + +ThoughtWorks is a privately owned global software delivery and products company with 2500 employees. ThoughtWorks has hired a team to work on various free software projects related to email security as part of their [[Pixelated Project => https://pixelated-project.org/]]. + +## Financial sponsors + +Open Technology Fund is designed to ensure secure communication tools exist for millions of individuals whose online interactions are being monitored or obstructed by repressive governments. Through support of research, development, and implementation of globally-accessible secure communications, Open Technology Fund champions the goals of Article 19 of the Universal Declaration of Human Rights. + +Hivos International international development organisation guided by humanist values. Together with local civil society organisations in developing countries, Hivos wants to contribute to a free, fair and sustainable world. A world in which all citizens – both women and men – have equal access to opportunities and resources for development and can participate actively and equally in decision-making processes that determine their lives, their society and their future. + +Wallace Global Fund is guided by the vision of the late Henry A. Wallace, former Secretary of Agriculture and Vice-President under Franklin D. Roosevelt. Committed to serving the general welfare, his life exemplified farsightedness, global vision, and receptivity to new ideas. He was keenly interested in scientific innovation as a force to enhance human well-being and had an abiding faith in the individual's spirit and capacity to bring about sound and just social change + +Press Freedom Foundation is a 501(c)3 non-profit organization dedicated to helping support and defend public-interest journalism focused on exposing mismanagement, corruption, and law-breaking in government. We accept tax-deductible donations to a variety of journalism organizations that push for transparency and accountability, and we work to preserve and strengthen the rights guaranteed to the press under the First Amendment. + +Google Summer of Code is a global program that offers post-secondary student developers ages 18 and older stipends to write code for various open source software projects. We have worked with open source, free software, and technology-related groups to identify and fund projects over a three month period. Since its inception in 2005, the program has brought together over 7,500 successful student participants and over 7,000 mentors from over 100 countries worldwide to produce over 50 million lines of code. + +Access defends and extends the digital rights of users at risk around the world. By combining innovative policy, user engagement, and direct technical support, we fight for open and secure communications for all. + +## Early adopters of the LEAP Platform + +Calyx Institute is a research, education and legal support group devoted to researching and implementing privacy technology and tools to promote free speech, free expression, civic engagement and privacy rights on the Internet. Calyx plans to be an early adopter of the [[LEAP platform => platform]]. + +Riseup Networks is major provider of email, chat, and lists for thousands of activist organizations around the world. Riseup plans to be an early adopter of the [[LEAP platform => platform]]. + +Oblivia is a new service provider starting up in Brazil. diff --git a/pages/about-us/vision/en.haml b/pages/about-us/vision/en.haml new file mode 100644 index 0000000..bbabc19 --- /dev/null +++ b/pages/about-us/vision/en.haml @@ -0,0 +1,27 @@ +- @nav_title = 'Why we do the things we do' +- @title = 'The Right to Whisper' + +%p LEAP fights for the right to whisper. + +%p Like free speech, the right to whisper is an necessary precondition for a free society. Without it, civil society and political freedom become impossible. As the importance of digital communication for civic participation increases, so does the importance of the ability to digitally whisper. + +%p Unfortunately, advances in surveillance technology are rapidly eroding the ability to whisper. This is a worldwide problem, not simply an issue for people in repressive contexts. Acceptance of poor security in the West creates a global standard of insecure practice, even among civil society actors who urgently need the ability to communicate safely. + +%p The stakes could not be higher. Activists are dying because their communication technologies betray their identity, location, and conversations. When activists attempt to secure their communications, they face confusing software, a dearth of secure providers, and a greater risk of being flagged as potential troublemakers. In other words, problems of usability, availability, and adoption. + +%h1 Our vision + +%p The LEAP vision is to attack these problems of usability, availability, and adoption head on. + +%p + %b To address usability, + we are creating a complete system where the user-facing client software is tightly coupled with the cloud-base components of the system. All our software will be auto-configuring, prevent users from practicing insecure behavior, and primarily limit the configuration options to those moments when the user is placing their trust in another entity. + +%p + %b To address availability, + LEAP will work closely with service providers to adopt our open source, [[automated platform => platform]] for running high-availability [[communication services => services]]. By lowering the barriers of entry to become a reliable provider, we can increase the supply and decrease the cost of secure communications. + +%p + %b To address adoption, + the LEAP platform [[layers higher security => infosec]] on top of existing protocols to allow users a gradual transition path and backward compatibility. Our goal is to create services that are attractive in terms of features, usability, and price for users in both democratic and repressive contexts. + diff --git a/pages/assets/_bootstrap-3.3.2.scss b/pages/assets/_bootstrap-3.3.2.scss new file mode 100644 index 0000000..a89db63 --- /dev/null +++ b/pages/assets/_bootstrap-3.3.2.scss @@ -0,0 +1,50 @@ +// Core variables and mixins +@import "bootstrap/variables"; +@import "bootstrap/mixins"; + +// Reset and dependencies +@import "bootstrap/normalize"; +@import "bootstrap/print"; +//@import "bootstrap/glyphicons"; + +// Core CSS +@import "bootstrap/scaffolding"; +@import "bootstrap/type"; +@import "bootstrap/code"; +@import "bootstrap/grid"; +@import "bootstrap/tables"; +@import "bootstrap/forms"; +@import "bootstrap/buttons"; + +// Components +//@import "bootstrap/component-animations"; +//@import "bootstrap/dropdowns"; +//@import "bootstrap/button-groups"; +//@import "bootstrap/input-groups"; +@import "bootstrap/navs"; +@import "bootstrap/navbar"; +@import "bootstrap/breadcrumbs"; +//@import "bootstrap/pagination"; +//@import "bootstrap/pager"; +@import "bootstrap/labels"; +@import "bootstrap/badges"; +//@import "bootstrap/jumbotron"; +//@import "bootstrap/thumbnails"; +@import "bootstrap/alerts"; +//@import "bootstrap/progress-bars"; +//@import "bootstrap/media"; +@import "bootstrap/list-group"; +@import "bootstrap/panels"; +//@import "bootstrap/responsive-embed"; +@import "bootstrap/wells"; +//@import "bootstrap/close"; + +// Components w/ JavaScript +//@import "bootstrap/modals"; +//@import "bootstrap/tooltip"; +//@import "bootstrap/popovers"; +//@import "bootstrap/carousel"; + +// Utility classes +@import "bootstrap/utilities"; +@import "bootstrap/responsive-utilities"; diff --git a/pages/assets/_leap.scss b/pages/assets/_leap.scss new file mode 100644 index 0000000..e6a14f1 --- /dev/null +++ b/pages/assets/_leap.scss @@ -0,0 +1,240 @@ +a:visited { + color: $link-visited-color; +} + +// +// MASTHEAD +// + +#masthead { + width: 100%; + margin: 0; + background-color: $masthead-bg-color; + border-bottom: $masthead-border; + + @include gradient-vertical(lighten($masthead-bg-color,8%),$masthead-bg-color); + box-shadow: inset 0 0 8px 1px darken($masthead-bg-color, 8%); + box-shadow-top: 0; + + .masthead-inner { + height: $masthead-height; + @include cutout-menu( + $ul-id: top-menu, + $active-bg: $cutout-color, + $left-indent: $masthead-text-left-margin, + $small-left-indent: $masthead-small-text-left-margin, + $small-screen: $small-screen); + @media (max-width: $small-screen) { + height: $masthead-small-height; + } + } + + .logo { + background: $masthead-bg; + @media (max-width: $small-screen) { + background: $masthead-small-bg; + } + } + + h1 { + font-weight: bold; + white-space: nowrap; + margin: 0; + color: $masthead-color; + + line-height: $masthead-height; + font-size: $masthead-text-size; + padding-left: $masthead-text-left-margin - 2px; + @media (max-width: $small-screen) { + line-height: $masthead-small-height; + font-size: $masthead-small-text-size; + padding-left: $masthead-small-text-left-margin - 2px; + } + } + + #top-menu a.tab { + font-weight: bold; + color: white; + background: rgba(0,0,0,0.5); + &.active { + color: black; + } + } + +} + +// +// SIDEBAR +// + +#sidebar { + #navigation { + margin-top: 20px; + } +} + +#sidebar .nav.nav-stacked { + li { + background: $side-column-bg-color; + margin: 0px; + &.active { + a { + border: 0; + border-right: 4px solid $side-column-active-bg-color; + background: $side-column-active-bg-color; + color: $side-column-active-color; + &:hover { + //color: $side_column_text_color; + background: lighten($side-column-active-bg-color, 40%); + border-color: lighten($side-column-active-bg-color, 20%); + } + } + } + } + li { + &.level1 a { + padding-left: 1*$side-column-indent; + } + &.level2 a { + padding-left: 2*$side-column-indent; + } + &.level3 a { + padding-left: 3*$side-column-indent; + } + &.level4 a { + padding-left: 4*$side-column-indent; + } + } + a { + cursor: pointer; + border-radius: 0 !important; + border: 0; + border-right: 4px solid $side-column-active-bg-color; + color: $side-column-text-color; + line-height: 1.2em; + &:hover { + background: lighten($side-column-bg-color, 10%); + border-color: lighten($side-column-active-bg-color, 50%); + text-decoration: underline; + } + } +} + +#sidebar ul { + box-shadow: 2px 4px 4px 0px darken($background-color,40%); +} + +// +// BACKGROUND +// + +#background { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 400px; + z-index: -1; + @include gradient-vertical($background-color-start, $background-color); +} + +// +// TYPOGRAPHY +// + +#TOC { + margin-top: 1em; + margin-bottom: 1em; + ol { + list-style-type: none; + margin: 0px; + padding-left: 20px; + } + li ol { + margin-left: 0px; + //padding-left: 20px; + } +} + +.p { + margin-top: 1em; + margin-bottom: 1em; + &:first-child { + margin-top: 0; + } +} + +.ol {@extend ol} +.li {@extend li} + +.h1 {@extend h1} +.h2 {@extend h2} +.h3 {@extend h3} + +.bigger { + font-size: 140%; + line-height: 140%; + margin: 20px 0; +} + +// +// HOME PAGE +// + +.standout { + a {color: black;} + span { + white-space: nowrap; + margin: 0 15px; + font-size: 18px; + @media (max-width: $small-screen) { + font-size: 13px; + } + } + .fa { + vertical-align: middle; + } + line-height: 48px; + margin-bottom: 20px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 11px; // same as 'p', not sure what variable this is. + background-color: $well-bg-color; + box-shadow: inset 0px 0px 5px 1px darken($well-bg-color,10%); + border: 1px solid lighten($well-border-color,50%); + border-radius: 0px; + .heading { + margin-top: -6px; + margin-bottom: 6px; + font-weight: bold; + font-size: 1.1em; + } +} + +// +// BLOGGY STUFF +// + +.byline { + margin-bottom: 1em; +} + +.page-summary { + @include clearfix(); +} + +article.page-summary { + h2 { + margin-bottom: 0px; + } + p { + margin: 0; + } + .byline { + font-weight: bold; + margin: 0px; + } +} diff --git a/pages/assets/_mixins.scss b/pages/assets/_mixins.scss new file mode 100644 index 0000000..62c10e3 --- /dev/null +++ b/pages/assets/_mixins.scss @@ -0,0 +1,113 @@ +// +// An UL,LI menu that looks like a cutout and is positioned at the bottom +// of the enclosing block. +// +// This mixin is applied to the enclosing block. +// +// the markup should look like this: +// +// enclosing-block +// ul#id +// li.tab +// a.tab +// li.tab +// a.tab +// +// the id for the ul is passed in as the first argument. +// +// it is difficult to create cutout tabs with a border that look good +// in all browsers and at different client font-sizes. +// +// the problem is that the tab element needs to line up exactly with the +// bottom of the enclosing block in order to make the cutout illusion work. +// most methods of doing this create weird jitters in webkit +// and gecko when resizing the screen or changing the font size. it does not +// look so good to have a dark line under your tab, breaking the illusion of +// a cutout. +// +// the method which makes this jitter-free is to use a height and a line-height +// for the tag instead of vertical padding. This requires that is a block +// which requires that the
  • is block & floated, instead of inline. +// +// This method seems to produce by far the most consistant results of letting +// the active tab sit snugly on the bottom of the enclosing div. +// +// Change with caution: I spent way too much time getting this to work. +// + +@mixin cutout-menu( + $ul-id, + $active-bg: white, + $left-indent: 10px, + $padding: 7px 14px, + $text-size: 14px, + $small-left-indent: 10px, + $small-padding: 5px 10px, + $small-text-size: 12px, + $small-screen: $small-sm-max) { + + $border: false; + + // allows us to put the menu at the bottom + position: relative; + + ul##{$ul-id} { + margin: 0; + padding: 0; + + // allows us to put the menu at the bottom + position: absolute; + + // puts the menu at the bottom of the enclosing block, + // minus the overhand needed to cover the border: + // bottom: -(border_width($border)); + bottom: -1px; + + // padding-left: don't do it. + // ^^ In some cases, we need width of 100% to actually be the screen width, + // but adding padding makes 100% width be wider than the screen. + // So, instead, we add margin to the first and last li. + + white-space: nowrap; + + li.tab { + display: block; + float: left; + &.first { + margin-left: $left-indent; + @media (max-width: $small-screen) { + margin-left: $small-left-indent; + } + } + a.tab { + display: block; + padding: $padding; + @media (max-width: $small-screen) { + padding: $small-padding; + } + + // line-height makes for much more consistant rendering than using vertical + // padding. essential to prevent tabs from looking horrible at different fonts sizes. + font-size: $text-size; + line-height: $text-size; + @media (max-width: $small-screen) { + font-size: $small-text-size; + line-height: $small-text-size; + } + + // the transparent border is needed to prevent the menu from jittering + // when the active border is applied. + border: 1px solid transparent; + border-bottom: 0; + + &.active { + background-color: $active-bg; + @if $border { + border: $border; + border-bottom: 0; + } + } + } + } + } +} diff --git a/pages/assets/bootstrap/_alerts.scss b/pages/assets/bootstrap/_alerts.scss new file mode 100644 index 0000000..372eec9 --- /dev/null +++ b/pages/assets/bootstrap/_alerts.scss @@ -0,0 +1,73 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: $alert-padding; + margin-bottom: $line-height-computed; + border: 1px solid transparent; + border-radius: $alert-border-radius; + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing $headings-color + color: inherit; + } + + // Provide class for links that match alerts + .alert-link { + font-weight: $alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. +.alert-dismissible { + padding-right: ($alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); +} + +.alert-info { + @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); +} + +.alert-warning { + @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); +} + +.alert-danger { + @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text); +} diff --git a/pages/assets/bootstrap/_badges.scss b/pages/assets/bootstrap/_badges.scss new file mode 100644 index 0000000..a647592 --- /dev/null +++ b/pages/assets/bootstrap/_badges.scss @@ -0,0 +1,67 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: $font-size-small; + font-weight: $badge-font-weight; + color: $badge-color; + line-height: $badge-line-height; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: $badge-bg; + border-radius: $badge-border-radius; + + // Empty badges collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for badges in buttons + .btn & { + position: relative; + top: -1px; + } + + .btn-xs & { + top: 0; + padding: 1px 5px; + } + + // [converter] extracted a& to a.badge + + // Account for badges in navs + .list-group-item.active > &, + .nav-pills > .active > a > & { + color: $badge-active-color; + background-color: $badge-active-bg; + } + + .list-group-item > & { + float: right; + } + + .list-group-item > & + & { + margin-right: 5px; + } + + .nav-pills > li > a > & { + margin-left: 3px; + } +} + +// Hover state, but only for links +a.badge { + &:hover, + &:focus { + color: $badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } +} diff --git a/pages/assets/bootstrap/_breadcrumbs.scss b/pages/assets/bootstrap/_breadcrumbs.scss new file mode 100644 index 0000000..51b676c --- /dev/null +++ b/pages/assets/bootstrap/_breadcrumbs.scss @@ -0,0 +1,26 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; + margin-bottom: $line-height-computed; + list-style: none; + background-color: $breadcrumb-bg; + border-radius: $border-radius-base; + + > li { + display: inline-block; + + + li:before { + content: #{$breadcrumb-separator}\00a0; // Unicode space added since inline-block means non-collapsing white-space + padding: 0 5px; + color: $breadcrumb-color; + } + } + + > .active { + color: $breadcrumb-active-color; + } +} diff --git a/pages/assets/bootstrap/_button-groups.scss b/pages/assets/bootstrap/_button-groups.scss new file mode 100644 index 0000000..a73bc54 --- /dev/null +++ b/pages/assets/bootstrap/_button-groups.scss @@ -0,0 +1,243 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + > .btn { + position: relative; + float: left; + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + @include clearfix; + + .btn-group, + .input-group { + float: left; + } + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + &:not(:last-child):not(.dropdown-toggle) { + @include border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + @include border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + @include border-right-radius(0); + } +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + @include border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { @extend .btn-xs; } +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: $caret-width-large $caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 $caret-width-large $caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + @include clearfix; + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + border-top-right-radius: $border-radius-base; + @include border-bottom-radius(0); + } + &:last-child:not(:first-child) { + border-bottom-left-radius: $border-radius-base; + @include border-top-radius(0); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + @include border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + @include border-top-radius(0); +} + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } +} diff --git a/pages/assets/bootstrap/_buttons.scss b/pages/assets/bootstrap/_buttons.scss new file mode 100644 index 0000000..7f0db45 --- /dev/null +++ b/pages/assets/bootstrap/_buttons.scss @@ -0,0 +1,160 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: $btn-font-weight; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + white-space: nowrap; + @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base); + @include user-select(none); + + &, + &:active, + &.active { + &:focus, + &.focus { + @include tab-focus; + } + } + + &:hover, + &:focus, + &.focus { + color: $btn-default-color; + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: $cursor-disabled; + pointer-events: none; // Future-proof disabling of clicks + @include opacity(.65); + @include box-shadow(none); + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-default { + @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border); +} +.btn-primary { + @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border); +} +// Success appears as green +.btn-success { + @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border); +} +// Info appears as blue-green +.btn-info { + @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border); +} +// Warning appears as orange +.btn-warning { + @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border); +} +// Danger and error appear as red +.btn-danger { + @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: $link-color; + font-weight: normal; + border-radius: 0; + + &, + &:active, + &.active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + @include box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: $link-hover-color; + text-decoration: $link-hover-decoration; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small); +} +.btn-xs { + @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $border-radius-small); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/pages/assets/bootstrap/_carousel.scss b/pages/assets/bootstrap/_carousel.scss new file mode 100644 index 0000000..f91d7ee --- /dev/null +++ b/pages/assets/bootstrap/_carousel.scss @@ -0,0 +1,269 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + @include transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + @include img-responsive; + line-height: 1; + } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + @include transition-transform(0.6s ease-in-out); + @include backface-visibility(hidden); + @include perspective(1000); + + &.next, + &.active.right { + @include translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + @include translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + @include translate3d(0, 0, 0); + left: 0; + } + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: $carousel-control-width; + @include opacity($carousel-control-opacity); + font-size: $carousel-control-font-size; + color: $carousel-control-color; + text-align: center; + text-shadow: $carousel-text-shadow; + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: $carousel-control-color; + text-decoration: none; + @include opacity(.9); + } + + // Toggles + .icon-prev, + .icon-next, + .glyphicon-chevron-left, + .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + } + .icon-prev, + .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .icon-next, + .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .icon-prev, + .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; + } + + + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid $carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE8-9 hack for event handling + // + // Internet Explorer 8-9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer + // + // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we + // set alpha transparency for the best results possible. + background-color: #000 \9; // IE8 + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: $carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: $carousel-caption-color; + text-align: center; + text-shadow: $carousel-text-shadow; + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@media screen and (min-width: $screen-sm-min) { + + // Scale up the controls a smidge + .carousel-control { + .glyphicon-chevron-left, + .glyphicon-chevron-right, + .icon-prev, + .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .glyphicon-chevron-left, + .icon-prev { + margin-left: -15px; + } + .glyphicon-chevron-right, + .icon-next { + margin-right: -15px; + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/pages/assets/bootstrap/_close.scss b/pages/assets/bootstrap/_close.scss new file mode 100644 index 0000000..3b74d8a --- /dev/null +++ b/pages/assets/bootstrap/_close.scss @@ -0,0 +1,36 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: ($font-size-base * 1.5); + font-weight: $close-font-weight; + line-height: 1; + color: $close-color; + text-shadow: $close-text-shadow; + @include opacity(.2); + + &:hover, + &:focus { + color: $close-color; + text-decoration: none; + cursor: pointer; + @include opacity(.5); + } + + // [converter] extracted button& to button.close +} + +// Additional properties for button version +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} diff --git a/pages/assets/bootstrap/_code.scss b/pages/assets/bootstrap/_code.scss new file mode 100644 index 0000000..caa5f06 --- /dev/null +++ b/pages/assets/bootstrap/_code.scss @@ -0,0 +1,69 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: $font-family-monospace; +} + +// Inline code +code { + padding: 2px 4px; + font-size: 90%; + color: $code-color; + background-color: $code-bg; + border-radius: $border-radius-base; +} + +// User input typically entered via keyboard +kbd { + padding: 2px 4px; + font-size: 90%; + color: $kbd-color; + background-color: $kbd-bg; + border-radius: $border-radius-small; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + + kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; + } +} + +// Blocks of code +pre { + display: block; + padding: (($line-height-computed - 1) / 2); + margin: 0 0 ($line-height-computed / 2); + font-size: ($font-size-base - 1); // 14px to 13px + line-height: $line-height-base; + word-break: break-all; + word-wrap: break-word; + color: $pre-color; + background-color: $pre-bg; + border: 1px solid $pre-border-color; + border-radius: $border-radius-base; + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: $pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/pages/assets/bootstrap/_component-animations.scss b/pages/assets/bootstrap/_component-animations.scss new file mode 100644 index 0000000..1f76b8c --- /dev/null +++ b/pages/assets/bootstrap/_component-animations.scss @@ -0,0 +1,38 @@ +// +// Component animations +// -------------------------------------------------- + +// Heads up! +// +// We don't use the `.opacity()` mixin here since it causes a bug with text +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. + +.fade { + opacity: 0; + @include transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + visibility: hidden; + + &.in { display: block; visibility: visible; } + // [converter] extracted tr&.in to tr.collapse.in + // [converter] extracted tbody&.in to tbody.collapse.in +} + +tr.collapse.in { display: table-row; } + +tbody.collapse.in { display: table-row-group; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + @include transition-property(height, visibility); + @include transition-duration(.35s); + @include transition-timing-function(ease); +} diff --git a/pages/assets/bootstrap/_dropdowns.scss b/pages/assets/bootstrap/_dropdowns.scss new file mode 100644 index 0000000..b8120b8 --- /dev/null +++ b/pages/assets/bootstrap/_dropdowns.scss @@ -0,0 +1,214 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Dropdown arrow/caret +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: $caret-width-base solid; + border-right: $caret-width-base solid transparent; + border-left: $caret-width-base solid transparent; +} + +// The dropdown wrapper (div) +.dropup, +.dropdown { + position: relative; +} + +// Prevent the focus on the dropdown toggle when closing dropdowns +.dropdown-toggle:focus { + outline: 0; +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: $zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: $font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: $dropdown-bg; + border: 1px solid $dropdown-fallback-border; // IE8 fallback + border: 1px solid $dropdown-border; + border-radius: $border-radius-base; + @include box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Aligns the dropdown menu to right + // + // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + @include nav-divider($dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: $line-height-base; + color: $dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: $dropdown-link-hover-color; + background-color: $dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: $dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: $dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: $dropdown-link-disabled-color; + } + + // Nuke hover/focus effects + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + @include reset-filter; + cursor: $cursor-disabled; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: $font-size-small; + line-height: $line-height-base; + color: $dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: ($zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: $caret-width-base solid; + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. + +@media (min-width: $grid-float-breakpoint) { + .navbar-right { + .dropdown-menu { + right: 0; left: auto; + } + // Necessary for overrides of the default right aligned menu. + // Will remove come v4 in all likelihood. + .dropdown-menu-left { + left: 0; right: auto; + } + } +} diff --git a/pages/assets/bootstrap/_forms.scss b/pages/assets/bootstrap/_forms.scss new file mode 100644 index 0000000..72d130b --- /dev/null +++ b/pages/assets/bootstrap/_forms.scss @@ -0,0 +1,570 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: $line-height-computed; + font-size: ($font-size-base * 1.5); + line-height: inherit; + color: $legend-color; + border: 0; + border-bottom: 1px solid $legend-border-color; +} + +label { + display: inline-block; + max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) + margin-bottom: 5px; + font-weight: bold; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (* isn't specific enough) +input[type="search"] { + @include box-sizing(border-box); +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE8-9 + line-height: normal; +} + +// Set the height of file controls to match text inputs +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + @include tab-focus; +} + +// Adjust output element +output { + display: block; + padding-top: ($padding-base-vertical + 1); + font-size: $font-size-base; + line-height: $line-height-base; + color: $input-color; +} + + +// Common form controls +// +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +// select +// textarea +// input[type="text"] +// input[type="password"] +// input[type="datetime"] +// input[type="datetime-local"] +// input[type="date"] +// input[type="month"] +// input[type="time"] +// input[type="week"] +// input[type="number"] +// input[type="email"] +// input[type="url"] +// input[type="search"] +// input[type="tel"] +// input[type="color"] + +.form-control { + display: block; + width: 100%; + height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: $padding-base-vertical $padding-base-horizontal; + font-size: $font-size-base; + line-height: $line-height-base; + color: $input-color; + background-color: $input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid $input-border; + border-radius: $input-border-radius; // Note: This has no effect on s in CSS. + @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s); + + // Customize the `:focus` state to imitate native WebKit styles. + @include form-control-focus; + + // Placeholder + @include placeholder; + + // Disabled and read-only inputs + // + // HTML5 says that controls under a fieldset > legend:first-child won't be + // disabled if the fieldset is disabled. Due to implementation difficulty, we + // don't honor that edge case; we style them as disabled anyway. + &[disabled], + &[readonly], + fieldset[disabled] & { + cursor: $cursor-disabled; + background-color: $input-bg-disabled; + opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655 + } + + // [converter] extracted textarea& to textarea.form-control +} + +// Reset height for `textarea`s +textarea.form-control { + height: auto; +} + + +// Search inputs in iOS +// +// This overrides the extra rounded corners on search inputs in iOS so that our +// `.form-control` class can properly style them. Note that this cannot simply +// be added to `.form-control` as it's not specific enough. For details, see +// https://github.com/twbs/bootstrap/issues/11586. + +input[type="search"] { + -webkit-appearance: none; +} + + +// Special styles for iOS temporal inputs +// +// In Mobile Safari, setting `display: block` on temporal inputs causes the +// text within the input to become vertically misaligned. As a workaround, we +// set a pixel line-height that matches the given height of the input, but only +// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848 + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: $input-height-base; + + &.input-sm, + .input-group-sm & { + line-height: $input-height-small; + } + + &.input-lg, + .input-group-lg & { + line-height: $input-height-large; + } + } +} + + +// Form groups +// +// Designed to help with the organization and spacing of vertical forms. For +// horizontal forms, use the predefined grid classes. + +.form-group { + margin-bottom: 15px; +} + + +// Checkboxes and radios +// +// Indent the labels to position radios/checkboxes as hanging controls. + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + + label { + min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; + } +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing +} + +// Radios and checkboxes on same line +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; // space out consecutive inline controls +} + +// Apply same disabled cursor tweak as for inputs +// Some special care is needed because Star + +// Import the fonts +@font-face { + font-family: 'Glyphicons Halflings'; + src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot')); + src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg'); +} + +// Catchall baseclass +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Individual icons +.glyphicon-asterisk { &:before { content: "\2a"; } } +.glyphicon-plus { &:before { content: "\2b"; } } +.glyphicon-euro, +.glyphicon-eur { &:before { content: \20ac; } } +.glyphicon-minus { &:before { content: \2212; } } +.glyphicon-cloud { &:before { content: \2601; } } +.glyphicon-envelope { &:before { content: \2709; } } +.glyphicon-pencil { &:before { content: \270f; } } +.glyphicon-glass { &:before { content: \e001; } } +.glyphicon-music { &:before { content: \e002; } } +.glyphicon-search { &:before { content: \e003; } } +.glyphicon-heart { &:before { content: \e005; } } +.glyphicon-star { &:before { content: \e006; } } +.glyphicon-star-empty { &:before { content: \e007; } } +.glyphicon-user { &:before { content: \e008; } } +.glyphicon-film { &:before { content: \e009; } } +.glyphicon-th-large { &:before { content: \e010; } } +.glyphicon-th { &:before { content: \e011; } } +.glyphicon-th-list { &:before { content: \e012; } } +.glyphicon-ok { &:before { content: \e013; } } +.glyphicon-remove { &:before { content: \e014; } } +.glyphicon-zoom-in { &:before { content: \e015; } } +.glyphicon-zoom-out { &:before { content: \e016; } } +.glyphicon-off { &:before { content: \e017; } } +.glyphicon-signal { &:before { content: \e018; } } +.glyphicon-cog { &:before { content: \e019; } } +.glyphicon-trash { &:before { content: \e020; } } +.glyphicon-home { &:before { content: \e021; } } +.glyphicon-file { &:before { content: \e022; } } +.glyphicon-time { &:before { content: \e023; } } +.glyphicon-road { &:before { content: \e024; } } +.glyphicon-download-alt { &:before { content: \e025; } } +.glyphicon-download { &:before { content: \e026; } } +.glyphicon-upload { &:before { content: \e027; } } +.glyphicon-inbox { &:before { content: \e028; } } +.glyphicon-play-circle { &:before { content: \e029; } } +.glyphicon-repeat { &:before { content: \e030; } } +.glyphicon-refresh { &:before { content: \e031; } } +.glyphicon-list-alt { &:before { content: \e032; } } +.glyphicon-lock { &:before { content: \e033; } } +.glyphicon-flag { &:before { content: \e034; } } +.glyphicon-headphones { &:before { content: \e035; } } +.glyphicon-volume-off { &:before { content: \e036; } } +.glyphicon-volume-down { &:before { content: \e037; } } +.glyphicon-volume-up { &:before { content: \e038; } } +.glyphicon-qrcode { &:before { content: \e039; } } +.glyphicon-barcode { &:before { content: \e040; } } +.glyphicon-tag { &:before { content: \e041; } } +.glyphicon-tags { &:before { content: \e042; } } +.glyphicon-book { &:before { content: \e043; } } +.glyphicon-bookmark { &:before { content: \e044; } } +.glyphicon-print { &:before { content: \e045; } } +.glyphicon-camera { &:before { content: \e046; } } +.glyphicon-font { &:before { content: \e047; } } +.glyphicon-bold { &:before { content: \e048; } } +.glyphicon-italic { &:before { content: \e049; } } +.glyphicon-text-height { &:before { content: \e050; } } +.glyphicon-text-width { &:before { content: \e051; } } +.glyphicon-align-left { &:before { content: \e052; } } +.glyphicon-align-center { &:before { content: \e053; } } +.glyphicon-align-right { &:before { content: \e054; } } +.glyphicon-align-justify { &:before { content: \e055; } } +.glyphicon-list { &:before { content: \e056; } } +.glyphicon-indent-left { &:before { content: \e057; } } +.glyphicon-indent-right { &:before { content: \e058; } } +.glyphicon-facetime-video { &:before { content: \e059; } } +.glyphicon-picture { &:before { content: \e060; } } +.glyphicon-map-marker { &:before { content: \e062; } } +.glyphicon-adjust { &:before { content: \e063; } } +.glyphicon-tint { &:before { content: \e064; } } +.glyphicon-edit { &:before { content: \e065; } } +.glyphicon-share { &:before { content: \e066; } } +.glyphicon-check { &:before { content: \e067; } } +.glyphicon-move { &:before { content: \e068; } } +.glyphicon-step-backward { &:before { content: \e069; } } +.glyphicon-fast-backward { &:before { content: \e070; } } +.glyphicon-backward { &:before { content: \e071; } } +.glyphicon-play { &:before { content: \e072; } } +.glyphicon-pause { &:before { content: \e073; } } +.glyphicon-stop { &:before { content: \e074; } } +.glyphicon-forward { &:before { content: \e075; } } +.glyphicon-fast-forward { &:before { content: \e076; } } +.glyphicon-step-forward { &:before { content: \e077; } } +.glyphicon-eject { &:before { content: \e078; } } +.glyphicon-chevron-left { &:before { content: \e079; } } +.glyphicon-chevron-right { &:before { content: \e080; } } +.glyphicon-plus-sign { &:before { content: \e081; } } +.glyphicon-minus-sign { &:before { content: \e082; } } +.glyphicon-remove-sign { &:before { content: \e083; } } +.glyphicon-ok-sign { &:before { content: \e084; } } +.glyphicon-question-sign { &:before { content: \e085; } } +.glyphicon-info-sign { &:before { content: \e086; } } +.glyphicon-screenshot { &:before { content: \e087; } } +.glyphicon-remove-circle { &:before { content: \e088; } } +.glyphicon-ok-circle { &:before { content: \e089; } } +.glyphicon-ban-circle { &:before { content: \e090; } } +.glyphicon-arrow-left { &:before { content: \e091; } } +.glyphicon-arrow-right { &:before { content: \e092; } } +.glyphicon-arrow-up { &:before { content: \e093; } } +.glyphicon-arrow-down { &:before { content: \e094; } } +.glyphicon-share-alt { &:before { content: \e095; } } +.glyphicon-resize-full { &:before { content: \e096; } } +.glyphicon-resize-small { &:before { content: \e097; } } +.glyphicon-exclamation-sign { &:before { content: \e101; } } +.glyphicon-gift { &:before { content: \e102; } } +.glyphicon-leaf { &:before { content: \e103; } } +.glyphicon-fire { &:before { content: \e104; } } +.glyphicon-eye-open { &:before { content: \e105; } } +.glyphicon-eye-close { &:before { content: \e106; } } +.glyphicon-warning-sign { &:before { content: \e107; } } +.glyphicon-plane { &:before { content: \e108; } } +.glyphicon-calendar { &:before { content: \e109; } } +.glyphicon-random { &:before { content: \e110; } } +.glyphicon-comment { &:before { content: \e111; } } +.glyphicon-magnet { &:before { content: \e112; } } +.glyphicon-chevron-up { &:before { content: \e113; } } +.glyphicon-chevron-down { &:before { content: \e114; } } +.glyphicon-retweet { &:before { content: \e115; } } +.glyphicon-shopping-cart { &:before { content: \e116; } } +.glyphicon-folder-close { &:before { content: \e117; } } +.glyphicon-folder-open { &:before { content: \e118; } } +.glyphicon-resize-vertical { &:before { content: \e119; } } +.glyphicon-resize-horizontal { &:before { content: \e120; } } +.glyphicon-hdd { &:before { content: \e121; } } +.glyphicon-bullhorn { &:before { content: \e122; } } +.glyphicon-bell { &:before { content: \e123; } } +.glyphicon-certificate { &:before { content: \e124; } } +.glyphicon-thumbs-up { &:before { content: \e125; } } +.glyphicon-thumbs-down { &:before { content: \e126; } } +.glyphicon-hand-right { &:before { content: \e127; } } +.glyphicon-hand-left { &:before { content: \e128; } } +.glyphicon-hand-up { &:before { content: \e129; } } +.glyphicon-hand-down { &:before { content: \e130; } } +.glyphicon-circle-arrow-right { &:before { content: \e131; } } +.glyphicon-circle-arrow-left { &:before { content: \e132; } } +.glyphicon-circle-arrow-up { &:before { content: \e133; } } +.glyphicon-circle-arrow-down { &:before { content: \e134; } } +.glyphicon-globe { &:before { content: \e135; } } +.glyphicon-wrench { &:before { content: \e136; } } +.glyphicon-tasks { &:before { content: \e137; } } +.glyphicon-filter { &:before { content: \e138; } } +.glyphicon-briefcase { &:before { content: \e139; } } +.glyphicon-fullscreen { &:before { content: \e140; } } +.glyphicon-dashboard { &:before { content: \e141; } } +.glyphicon-paperclip { &:before { content: \e142; } } +.glyphicon-heart-empty { &:before { content: \e143; } } +.glyphicon-link { &:before { content: \e144; } } +.glyphicon-phone { &:before { content: \e145; } } +.glyphicon-pushpin { &:before { content: \e146; } } +.glyphicon-usd { &:before { content: \e148; } } +.glyphicon-gbp { &:before { content: \e149; } } +.glyphicon-sort { &:before { content: \e150; } } +.glyphicon-sort-by-alphabet { &:before { content: \e151; } } +.glyphicon-sort-by-alphabet-alt { &:before { content: \e152; } } +.glyphicon-sort-by-order { &:before { content: \e153; } } +.glyphicon-sort-by-order-alt { &:before { content: \e154; } } +.glyphicon-sort-by-attributes { &:before { content: \e155; } } +.glyphicon-sort-by-attributes-alt { &:before { content: \e156; } } +.glyphicon-unchecked { &:before { content: \e157; } } +.glyphicon-expand { &:before { content: \e158; } } +.glyphicon-collapse-down { &:before { content: \e159; } } +.glyphicon-collapse-up { &:before { content: \e160; } } +.glyphicon-log-in { &:before { content: \e161; } } +.glyphicon-flash { &:before { content: \e162; } } +.glyphicon-log-out { &:before { content: \e163; } } +.glyphicon-new-window { &:before { content: \e164; } } +.glyphicon-record { &:before { content: \e165; } } +.glyphicon-save { &:before { content: \e166; } } +.glyphicon-open { &:before { content: \e167; } } +.glyphicon-saved { &:before { content: \e168; } } +.glyphicon-import { &:before { content: \e169; } } +.glyphicon-export { &:before { content: \e170; } } +.glyphicon-send { &:before { content: \e171; } } +.glyphicon-floppy-disk { &:before { content: \e172; } } +.glyphicon-floppy-saved { &:before { content: \e173; } } +.glyphicon-floppy-remove { &:before { content: \e174; } } +.glyphicon-floppy-save { &:before { content: \e175; } } +.glyphicon-floppy-open { &:before { content: \e176; } } +.glyphicon-credit-card { &:before { content: \e177; } } +.glyphicon-transfer { &:before { content: \e178; } } +.glyphicon-cutlery { &:before { content: \e179; } } +.glyphicon-header { &:before { content: \e180; } } +.glyphicon-compressed { &:before { content: \e181; } } +.glyphicon-earphone { &:before { content: \e182; } } +.glyphicon-phone-alt { &:before { content: \e183; } } +.glyphicon-tower { &:before { content: \e184; } } +.glyphicon-stats { &:before { content: \e185; } } +.glyphicon-sd-video { &:before { content: \e186; } } +.glyphicon-hd-video { &:before { content: \e187; } } +.glyphicon-subtitles { &:before { content: \e188; } } +.glyphicon-sound-stereo { &:before { content: \e189; } } +.glyphicon-sound-dolby { &:before { content: \e190; } } +.glyphicon-sound-5-1 { &:before { content: \e191; } } +.glyphicon-sound-6-1 { &:before { content: \e192; } } +.glyphicon-sound-7-1 { &:before { content: \e193; } } +.glyphicon-copyright-mark { &:before { content: \e194; } } +.glyphicon-registration-mark { &:before { content: \e195; } } +.glyphicon-cloud-download { &:before { content: \e197; } } +.glyphicon-cloud-upload { &:before { content: \e198; } } +.glyphicon-tree-conifer { &:before { content: \e199; } } +.glyphicon-tree-deciduous { &:before { content: \e200; } } +.glyphicon-cd { &:before { content: \e201; } } +.glyphicon-save-file { &:before { content: \e202; } } +.glyphicon-open-file { &:before { content: \e203; } } +.glyphicon-level-up { &:before { content: \e204; } } +.glyphicon-copy { &:before { content: \e205; } } +.glyphicon-paste { &:before { content: \e206; } } +// The following 2 Glyphicons are omitted for the time being because +// they currently use Unicode codepoints that are outside the +// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle +// non-BMP codepoints in CSS string escapes, and thus can't display these two icons. +// Notably, the bug affects some older versions of the Android Browser. +// More info: https://github.com/twbs/bootstrap/issues/10106 +// .glyphicon-door { &:before { content: \1f6aa; } } +// .glyphicon-key { &:before { content: \1f511; } } +.glyphicon-alert { &:before { content: \e209; } } +.glyphicon-equalizer { &:before { content: \e210; } } +.glyphicon-king { &:before { content: \e211; } } +.glyphicon-queen { &:before { content: \e212; } } +.glyphicon-pawn { &:before { content: \e213; } } +.glyphicon-bishop { &:before { content: \e214; } } +.glyphicon-knight { &:before { content: \e215; } } +.glyphicon-baby-formula { &:before { content: \e216; } } +.glyphicon-tent { &:before { content: \26fa; } } +.glyphicon-blackboard { &:before { content: \e218; } } +.glyphicon-bed { &:before { content: \e219; } } +.glyphicon-apple { &:before { content: \f8ff; } } +.glyphicon-erase { &:before { content: \e221; } } +.glyphicon-hourglass { &:before { content: \231b; } } +.glyphicon-lamp { &:before { content: \e223; } } +.glyphicon-duplicate { &:before { content: \e224; } } +.glyphicon-piggy-bank { &:before { content: \e225; } } +.glyphicon-scissors { &:before { content: \e226; } } +.glyphicon-bitcoin { &:before { content: \e227; } } +.glyphicon-yen { &:before { content: \00a5; } } +.glyphicon-ruble { &:before { content: \20bd; } } +.glyphicon-scale { &:before { content: \e230; } } +.glyphicon-ice-lolly { &:before { content: \e231; } } +.glyphicon-ice-lolly-tasted { &:before { content: \e232; } } +.glyphicon-education { &:before { content: \e233; } } +.glyphicon-option-horizontal { &:before { content: \e234; } } +.glyphicon-option-vertical { &:before { content: \e235; } } +.glyphicon-menu-hamburger { &:before { content: \e236; } } +.glyphicon-modal-window { &:before { content: \e237; } } +.glyphicon-oil { &:before { content: \e238; } } +.glyphicon-grain { &:before { content: \e239; } } +.glyphicon-sunglasses { &:before { content: \e240; } } +.glyphicon-text-size { &:before { content: \e241; } } +.glyphicon-text-color { &:before { content: \e242; } } +.glyphicon-text-background { &:before { content: \e243; } } +.glyphicon-object-align-top { &:before { content: \e244; } } +.glyphicon-object-align-bottom { &:before { content: \e245; } } +.glyphicon-object-align-horizontal{ &:before { content: \e246; } } +.glyphicon-object-align-left { &:before { content: \e247; } } +.glyphicon-object-align-vertical { &:before { content: \e248; } } +.glyphicon-object-align-right { &:before { content: \e249; } } +.glyphicon-triangle-right { &:before { content: \e250; } } +.glyphicon-triangle-left { &:before { content: \e251; } } +.glyphicon-triangle-bottom { &:before { content: \e252; } } +.glyphicon-triangle-top { &:before { content: \e253; } } +.glyphicon-console { &:before { content: \e254; } } +.glyphicon-superscript { &:before { content: \e255; } } +.glyphicon-subscript { &:before { content: \e256; } } +.glyphicon-menu-left { &:before { content: \e257; } } +.glyphicon-menu-right { &:before { content: \e258; } } +.glyphicon-menu-down { &:before { content: \e259; } } +.glyphicon-menu-up { &:before { content: \e260; } } diff --git a/pages/assets/bootstrap/_grid.scss b/pages/assets/bootstrap/_grid.scss new file mode 100644 index 0000000..b15ca27 --- /dev/null +++ b/pages/assets/bootstrap/_grid.scss @@ -0,0 +1,84 @@ +// +// Grid system +// -------------------------------------------------- + + +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +.container { + @include container-fixed; + + @media (min-width: $screen-sm-min) { + width: $container-sm; + } + @media (min-width: $screen-md-min) { + width: $container-md; + } + @media (min-width: $screen-lg-min) { + width: $container-lg; + } +} + + +// Fluid container +// +// Utilizes the mixin meant for fixed width containers, but without any defined +// width for fluid, full width layouts. + +.container-fluid { + @include container-fixed; +} + + +// Row +// +// Rows contain and clear the floats of your columns. + +.row { + @include make-row; +} + + +// Columns +// +// Common styles for small and large grid columns + +@include make-grid-columns; + + +// Extra small grid +// +// Columns, offsets, pushes, and pulls for extra small devices like +// smartphones. + +@include make-grid(xs); + + +// Small grid +// +// Columns, offsets, pushes, and pulls for the small device range, from phones +// to tablets. + +@media (min-width: $screen-sm-min) { + @include make-grid(sm); +} + + +// Medium grid +// +// Columns, offsets, pushes, and pulls for the desktop device range. + +@media (min-width: $screen-md-min) { + @include make-grid(md); +} + + +// Large grid +// +// Columns, offsets, pushes, and pulls for the large desktop device range. + +@media (min-width: $screen-lg-min) { + @include make-grid(lg); +} diff --git a/pages/assets/bootstrap/_input-groups.scss b/pages/assets/bootstrap/_input-groups.scss new file mode 100644 index 0000000..ae0e921 --- /dev/null +++ b/pages/assets/bootstrap/_input-groups.scss @@ -0,0 +1,166 @@ +// +// Input groups +// -------------------------------------------------- + +// Base styles +// ------------------------- +.input-group { + position: relative; // For dropdowns + display: table; + border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table + + // Undo padding and float of grid classes + &[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; + } + + .form-control { + // Ensure that the input is always above the *appended* addon button for + // proper border colors. + position: relative; + z-index: 2; + + // IE9 fubars the placeholder attribute in text inputs and the arrows on + // select elements in input groups. To fix it, we float the input. Details: + // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 + float: left; + + width: 100%; + margin-bottom: 0; + } +} + +// Sizing options +// +// Remix the default form control sizing classes into new ones for easier +// manipulation. + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + @extend .input-lg; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + @extend .input-sm; +} + + +// Display as table-cell +// ------------------------- +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; + + &:not(:first-child):not(:last-child) { + border-radius: 0; + } +} +// Addon and addon wrapper for buttons +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; // Match the inputs +} + +// Text input groups +// ------------------------- +.input-group-addon { + padding: $padding-base-vertical $padding-base-horizontal; + font-size: $font-size-base; + font-weight: normal; + line-height: 1; + color: $input-color; + text-align: center; + background-color: $input-group-addon-bg; + border: 1px solid $input-group-addon-border-color; + border-radius: $border-radius-base; + + // Sizing + &.input-sm { + padding: $padding-small-vertical $padding-small-horizontal; + font-size: $font-size-small; + border-radius: $border-radius-small; + } + &.input-lg { + padding: $padding-large-vertical $padding-large-horizontal; + font-size: $font-size-large; + border-radius: $border-radius-large; + } + + // Nuke default margins from checkboxes and radios to vertically center within. + input[type="radio"], + input[type="checkbox"] { + margin-top: 0; + } +} + +// Reset rounded corners +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + @include border-right-radius(0); +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + @include border-left-radius(0); +} +.input-group-addon:last-child { + border-left: 0; +} + +// Button input groups +// ------------------------- +.input-group-btn { + position: relative; + // Jankily prevent input button groups from wrapping with `white-space` and + // `font-size` in combination with `inline-block` on buttons. + font-size: 0; + white-space: nowrap; + + // Negative margin for spacing, position for bringing hovered/focused/actived + // element above the siblings. + > .btn { + position: relative; + + .btn { + margin-left: -1px; + } + // Bring the "active" button to the front + &:hover, + &:focus, + &:active { + z-index: 2; + } + } + + // Negative margin to only have a 1px border between the two + &:first-child { + > .btn, + > .btn-group { + margin-right: -1px; + } + } + &:last-child { + > .btn, + > .btn-group { + margin-left: -1px; + } + } +} diff --git a/pages/assets/bootstrap/_jumbotron.scss b/pages/assets/bootstrap/_jumbotron.scss new file mode 100644 index 0000000..e326b32 --- /dev/null +++ b/pages/assets/bootstrap/_jumbotron.scss @@ -0,0 +1,50 @@ +// +// Jumbotron +// -------------------------------------------------- + + +.jumbotron { + padding: $jumbotron-padding ($jumbotron-padding / 2); + margin-bottom: $jumbotron-padding; + color: $jumbotron-color; + background-color: $jumbotron-bg; + + h1, + .h1 { + color: $jumbotron-heading-color; + } + + p { + margin-bottom: ($jumbotron-padding / 2); + font-size: $jumbotron-font-size; + font-weight: 200; + } + + > hr { + border-top-color: darken($jumbotron-bg, 10%); + } + + .container &, + .container-fluid & { + border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container + } + + .container { + max-width: 100%; + } + + @media screen and (min-width: $screen-sm-min) { + padding: ($jumbotron-padding * 1.6) 0; + + .container &, + .container-fluid & { + padding-left: ($jumbotron-padding * 2); + padding-right: ($jumbotron-padding * 2); + } + + h1, + .h1 { + font-size: ($font-size-base * 4.5); + } + } +} diff --git a/pages/assets/bootstrap/_labels.scss b/pages/assets/bootstrap/_labels.scss new file mode 100644 index 0000000..42ed6ea --- /dev/null +++ b/pages/assets/bootstrap/_labels.scss @@ -0,0 +1,66 @@ +// +// Labels +// -------------------------------------------------- + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: $label-color; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; + + // [converter] extracted a& to a.label + + // Empty labels collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for labels in buttons + .btn & { + position: relative; + top: -1px; + } +} + +// Add hover effects, but only for links +a.label { + &:hover, + &:focus { + color: $label-link-hover-color; + text-decoration: none; + cursor: pointer; + } +} + +// Colors +// Contextual variations (linked labels get darker on :hover) + +.label-default { + @include label-variant($label-default-bg); +} + +.label-primary { + @include label-variant($label-primary-bg); +} + +.label-success { + @include label-variant($label-success-bg); +} + +.label-info { + @include label-variant($label-info-bg); +} + +.label-warning { + @include label-variant($label-warning-bg); +} + +.label-danger { + @include label-variant($label-danger-bg); +} diff --git a/pages/assets/bootstrap/_list-group.scss b/pages/assets/bootstrap/_list-group.scss new file mode 100644 index 0000000..26b23ff --- /dev/null +++ b/pages/assets/bootstrap/_list-group.scss @@ -0,0 +1,124 @@ +// +// List groups +// -------------------------------------------------- + + +// Base class +// +// Easily usable on
      ,
        , or
        . + +.list-group { + // No need to set list-style: none; since .list-group-item is block level + margin-bottom: 20px; + padding-left: 0; // reset padding because ul and ol +} + + +// Individual list items +// +// Use on `li`s or `div`s within the `.list-group` parent. + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + // Place the border on the list items and negative margin up for better styling + margin-bottom: -1px; + background-color: $list-group-bg; + border: 1px solid $list-group-border; + + // Round the first and last items + &:first-child { + @include border-top-radius($list-group-border-radius); + } + &:last-child { + margin-bottom: 0; + @include border-bottom-radius($list-group-border-radius); + } +} + + +// Linked list items +// +// Use anchor elements instead of `li`s or `div`s to create linked list items. +// Includes an extra `.active` modifier class for showing selected items. + +a.list-group-item { + color: $list-group-link-color; + + .list-group-item-heading { + color: $list-group-link-heading-color; + } + + // Hover state + &:hover, + &:focus { + text-decoration: none; + color: $list-group-link-hover-color; + background-color: $list-group-hover-bg; + } +} + +.list-group-item { + // Disabled state + &.disabled, + &.disabled:hover, + &.disabled:focus { + background-color: $list-group-disabled-bg; + color: $list-group-disabled-color; + cursor: $cursor-disabled; + + // Force color to inherit for custom content + .list-group-item-heading { + color: inherit; + } + .list-group-item-text { + color: $list-group-disabled-text-color; + } + } + + // Active class on item itself, not parent + &.active, + &.active:hover, + &.active:focus { + z-index: 2; // Place active items above their siblings for proper border styling + color: $list-group-active-color; + background-color: $list-group-active-bg; + border-color: $list-group-active-border; + + // Force color to inherit for custom content + .list-group-item-heading, + .list-group-item-heading > small, + .list-group-item-heading > .small { + color: inherit; + } + .list-group-item-text { + color: $list-group-active-text-color; + } + } +} + + +// Contextual variants +// +// Add modifier classes to change text and background color on individual items. +// Organizationally, this must come after the `:hover` states. + +@include list-group-item-variant(success, $state-success-bg, $state-success-text); +@include list-group-item-variant(info, $state-info-bg, $state-info-text); +@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text); +@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text); + + +// Custom content options +// +// Extra classes for creating well-formatted content within `.list-group-item`s. + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} diff --git a/pages/assets/bootstrap/_media.scss b/pages/assets/bootstrap/_media.scss new file mode 100644 index 0000000..a6bf781 --- /dev/null +++ b/pages/assets/bootstrap/_media.scss @@ -0,0 +1,61 @@ +.media { + // Proper spacing between instances of .media + margin-top: 15px; + + &:first-child { + margin-top: 0; + } +} + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.media-body { + width: 10000px; +} + +.media-object { + display: block; +} + +.media-right, +.media > .pull-right { + padding-left: 10px; +} + +.media-left, +.media > .pull-left { + padding-right: 10px; +} + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} + +.media-middle { + vertical-align: middle; +} + +.media-bottom { + vertical-align: bottom; +} + +// Reset margins on headings for tighter default spacing +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} + +// Media list variation +// +// Undo default ul/ol styles +.media-list { + padding-left: 0; + list-style: none; +} diff --git a/pages/assets/bootstrap/_mixins.scss b/pages/assets/bootstrap/_mixins.scss new file mode 100644 index 0000000..b565f01 --- /dev/null +++ b/pages/assets/bootstrap/_mixins.scss @@ -0,0 +1,39 @@ +// Mixins +// -------------------------------------------------- + +// Utilities +@import "mixins/hide-text"; +@import "mixins/opacity"; +@import "mixins/image"; +@import "mixins/labels"; +@import "mixins/reset-filter"; +@import "mixins/resize"; +@import "mixins/responsive-visibility"; +@import "mixins/size"; +@import "mixins/tab-focus"; +@import "mixins/text-emphasis"; +@import "mixins/text-overflow"; +@import "mixins/vendor-prefixes"; + +// Components +@import "mixins/alerts"; +@import "mixins/buttons"; +@import "mixins/panels"; +@import "mixins/pagination"; +@import "mixins/list-group"; +@import "mixins/nav-divider"; +@import "mixins/forms"; +@import "mixins/progress-bar"; +@import "mixins/table-row"; + +// Skins +@import "mixins/background-variant"; +@import "mixins/border-radius"; +@import "mixins/gradients"; + +// Layout +@import "mixins/clearfix"; +@import "mixins/center-block"; +@import "mixins/nav-vertical-align"; +@import "mixins/grid-framework"; +@import "mixins/grid"; diff --git a/pages/assets/bootstrap/_modals.scss b/pages/assets/bootstrap/_modals.scss new file mode 100644 index 0000000..2fd097c --- /dev/null +++ b/pages/assets/bootstrap/_modals.scss @@ -0,0 +1,148 @@ +// +// Modals +// -------------------------------------------------- + +// .modal-open - body class for killing the scroll +// .modal - container to scroll within +// .modal-dialog - positioning shell for the actual modal +// .modal-content - actual modal w/ bg and corners and shit + +// Kill the scroll on the body +.modal-open { + overflow: hidden; +} + +// Container that the modal scrolls within +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: $zindex-modal; + -webkit-overflow-scrolling: touch; + + // Prevent Chrome on Windows from adding a focus outline. For details, see + // https://github.com/twbs/bootstrap/pull/10951. + outline: 0; + + // When fading in the modal, animate it to slide down + &.fade .modal-dialog { + @include translate(0, -25%); + @include transition-transform(0.3s ease-out); + } + &.in .modal-dialog { @include translate(0, 0) } +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +// Shell div to position the modal with bottom padding +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +// Actual modal +.modal-content { + position: relative; + background-color: $modal-content-bg; + border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc) + border: 1px solid $modal-content-border-color; + border-radius: $border-radius-large; + @include box-shadow(0 3px 9px rgba(0,0,0,.5)); + background-clip: padding-box; + // Remove focus outline from opened modal + outline: 0; +} + +// Modal background +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: $modal-backdrop-bg; + // Fade for backdrop + &.fade { @include opacity(0); } + &.in { @include opacity($modal-backdrop-opacity); } +} + +// Modal header +// Top section of the modal w/ title and dismiss +.modal-header { + padding: $modal-title-padding; + border-bottom: 1px solid $modal-header-border-color; + min-height: ($modal-title-padding + $modal-title-line-height); +} +// Close icon +.modal-header .close { + margin-top: -2px; +} + +// Title text within header +.modal-title { + margin: 0; + line-height: $modal-title-line-height; +} + +// Modal body +// Where all modal content resides (sibling of .modal-header and .modal-footer) +.modal-body { + position: relative; + padding: $modal-inner-padding; +} + +// Footer (for actions) +.modal-footer { + padding: $modal-inner-padding; + text-align: right; // right align buttons + border-top: 1px solid $modal-footer-border-color; + @include clearfix; // clear it in case folks use .pull-* classes on buttons + + // Properly space out buttons + .btn + .btn { + margin-left: 5px; + margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs + } + // but override that for button groups + .btn-group .btn + .btn { + margin-left: -1px; + } + // and override it for block buttons as well + .btn-block + .btn-block { + margin-left: 0; + } +} + +// Measure scrollbar width for padding body during modal show/hide +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +// Scale up the modal +@media (min-width: $screen-sm-min) { + // Automatically set modal's width for larger viewports + .modal-dialog { + width: $modal-md; + margin: 30px auto; + } + .modal-content { + @include box-shadow(0 5px 15px rgba(0,0,0,.5)); + } + + // Modal sizes + .modal-sm { width: $modal-sm; } +} + +@media (min-width: $screen-md-min) { + .modal-lg { width: $modal-lg; } +} diff --git a/pages/assets/bootstrap/_navbar.scss b/pages/assets/bootstrap/_navbar.scss new file mode 100644 index 0000000..ed36a99 --- /dev/null +++ b/pages/assets/bootstrap/_navbar.scss @@ -0,0 +1,663 @@ +// +// Navbars +// -------------------------------------------------- + + +// Wrapper and base class +// +// Provide a static navbar from which we expand to create full-width, fixed, and +// other navbar variations. + +.navbar { + position: relative; + min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode) + margin-bottom: $navbar-margin-bottom; + border: 1px solid transparent; + + // Prevent floats from breaking the navbar + @include clearfix; + + @media (min-width: $grid-float-breakpoint) { + border-radius: $navbar-border-radius; + } +} + + +// Navbar heading +// +// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy +// styling of responsive aspects. + +.navbar-header { + @include clearfix; + + @media (min-width: $grid-float-breakpoint) { + float: left; + } +} + + +// Navbar collapse (body) +// +// Group your navbar content into this for easy collapsing and expanding across +// various device sizes. By default, this content is collapsed when <768px, but +// will expand past that for a horizontal display. +// +// To start (on mobile devices) the navbar links, forms, and buttons are stacked +// vertically and include a `max-height` to overflow in case you have too much +// content for the user's viewport. + +.navbar-collapse { + overflow-x: visible; + padding-right: $navbar-padding-horizontal; + padding-left: $navbar-padding-horizontal; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255,255,255,.1); + @include clearfix; + -webkit-overflow-scrolling: touch; + + &.in { + overflow-y: auto; + } + + @media (min-width: $grid-float-breakpoint) { + width: auto; + border-top: 0; + box-shadow: none; + + &.collapse { + display: block !important; + visibility: visible !important; + height: auto !important; + padding-bottom: 0; // Override default setting + overflow: visible !important; + } + + &.in { + overflow-y: visible; + } + + // Undo the collapse side padding for navbars with containers to ensure + // alignment of right-aligned contents. + .navbar-fixed-top &, + .navbar-static-top &, + .navbar-fixed-bottom & { + padding-left: 0; + padding-right: 0; + } + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + .navbar-collapse { + max-height: $navbar-collapse-max-height; + + @media (max-device-width: $screen-xs-min) and (orientation: landscape) { + max-height: 200px; + } + } +} + + +// Both navbar header and collapse +// +// When a container is present, change the behavior of the header and collapse. + +.container, +.container-fluid { + > .navbar-header, + > .navbar-collapse { + margin-right: -$navbar-padding-horizontal; + margin-left: -$navbar-padding-horizontal; + + @media (min-width: $grid-float-breakpoint) { + margin-right: 0; + margin-left: 0; + } + } +} + + +// +// Navbar alignment options +// +// Display the navbar across the entirety of the page or fixed it to the top or +// bottom of the page. + +// Static top (unfixed, but 100% wide) navbar +.navbar-static-top { + z-index: $zindex-navbar; + border-width: 0 0 1px; + + @media (min-width: $grid-float-breakpoint) { + border-radius: 0; + } +} + +// Fix the top/bottom navbars when screen real estate supports it +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: $zindex-navbar-fixed; + + // Undo the rounded corners + @media (min-width: $grid-float-breakpoint) { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; // override .navbar defaults + border-width: 1px 0 0; +} + + +// Brand/project name + +.navbar-brand { + float: left; + padding: $navbar-padding-vertical $navbar-padding-horizontal; + font-size: $font-size-large; + line-height: $line-height-computed; + height: $navbar-height; + + &:hover, + &:focus { + text-decoration: none; + } + + > img { + display: block; + } + + @media (min-width: $grid-float-breakpoint) { + .navbar > .container &, + .navbar > .container-fluid & { + margin-left: -$navbar-padding-horizontal; + } + } +} + + +// Navbar toggle +// +// Custom button for toggling the `.navbar-collapse`, powered by the collapse +// JavaScript plugin. + +.navbar-toggle { + position: relative; + float: right; + margin-right: $navbar-padding-horizontal; + padding: 9px 10px; + @include navbar-vertical-align(34px); + background-color: transparent; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + border-radius: $border-radius-base; + + // We remove the `outline` here, but later compensate by attaching `:hover` + // styles to `:focus`. + &:focus { + outline: 0; + } + + // Bars + .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; + } + .icon-bar + .icon-bar { + margin-top: 4px; + } + + @media (min-width: $grid-float-breakpoint) { + display: none; + } +} + + +// Navbar nav links +// +// Builds on top of the `.nav` components with its own modifier class to make +// the nav the full height of the horizontal nav (above 768px). + +.navbar-nav { + margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal); + + > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: $line-height-computed; + } + + @media (max-width: $grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + > li > a, + .dropdown-header { + padding: 5px 15px 5px 25px; + } + > li > a { + line-height: $line-height-computed; + &:hover, + &:focus { + background-image: none; + } + } + } + } + + // Uncollapse the nav + @media (min-width: $grid-float-breakpoint) { + float: left; + margin: 0; + + > li { + float: left; + > a { + padding-top: $navbar-padding-vertical; + padding-bottom: $navbar-padding-vertical; + } + } + } +} + + +// Navbar form +// +// Extension of the `.form-inline` with some extra flavor for optimum display in +// our navbars. + +.navbar-form { + margin-left: -$navbar-padding-horizontal; + margin-right: -$navbar-padding-horizontal; + padding: 10px $navbar-padding-horizontal; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + @include box-shadow($shadow); + + // Mixin behavior for optimum display + @include form-inline; + + .form-group { + @media (max-width: $grid-float-breakpoint-max) { + margin-bottom: 5px; + + &:last-child { + margin-bottom: 0; + } + } + } + + // Vertically center in expanded, horizontal navbar + @include navbar-vertical-align($input-height-base); + + // Undo 100% width for pull classes + @media (min-width: $grid-float-breakpoint) { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + @include box-shadow(none); + } +} + + +// Dropdown menus + +// Menu position and menu carets +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + @include border-top-radius(0); +} +// Menu position and menu caret support for dropups via extra dropup class +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + @include border-top-radius($navbar-border-radius); + @include border-bottom-radius(0); +} + + +// Buttons in navbars +// +// Vertically center a button within a navbar (when *not* in a form). + +.navbar-btn { + @include navbar-vertical-align($input-height-base); + + &.btn-sm { + @include navbar-vertical-align($input-height-small); + } + &.btn-xs { + @include navbar-vertical-align(22); + } +} + + +// Text in navbars +// +// Add a class to make any element properly align itself vertically within the navbars. + +.navbar-text { + @include navbar-vertical-align($line-height-computed); + + @media (min-width: $grid-float-breakpoint) { + float: left; + margin-left: $navbar-padding-horizontal; + margin-right: $navbar-padding-horizontal; + } +} + + +// Component alignment +// +// Repurpose the pull utilities as their own navbar utilities to avoid specificity +// issues with parents and chaining. Only do this when the navbar is uncollapsed +// though so that navbar contents properly stack and align in mobile. +// +// Declared after the navbar components to ensure more specificity on the margins. + +@media (min-width: $grid-float-breakpoint) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -$navbar-padding-horizontal; + + ~ .navbar-right { + margin-right: 0; + } + } +} + + +// Alternate navbars +// -------------------------------------------------- + +// Default navbar +.navbar-default { + background-color: $navbar-default-bg; + border-color: $navbar-default-border; + + .navbar-brand { + color: $navbar-default-brand-color; + &:hover, + &:focus { + color: $navbar-default-brand-hover-color; + background-color: $navbar-default-brand-hover-bg; + } + } + + .navbar-text { + color: $navbar-default-color; + } + + .navbar-nav { + > li > a { + color: $navbar-default-link-color; + + &:hover, + &:focus { + color: $navbar-default-link-hover-color; + background-color: $navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-active-color; + background-color: $navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-disabled-color; + background-color: $navbar-default-link-disabled-bg; + } + } + } + + .navbar-toggle { + border-color: $navbar-default-toggle-border-color; + &:hover, + &:focus { + background-color: $navbar-default-toggle-hover-bg; + } + .icon-bar { + background-color: $navbar-default-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: $navbar-default-border; + } + + // Dropdown menu items + .navbar-nav { + // Remove background color from open dropdown + > .open > a { + &, + &:hover, + &:focus { + background-color: $navbar-default-link-active-bg; + color: $navbar-default-link-active-color; + } + } + + @media (max-width: $grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + > li > a { + color: $navbar-default-link-color; + &:hover, + &:focus { + color: $navbar-default-link-hover-color; + background-color: $navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-active-color; + background-color: $navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-disabled-color; + background-color: $navbar-default-link-disabled-bg; + } + } + } + } + } + + + // Links in navbars + // + // Add a class to ensure links outside the navbar nav are colored correctly. + + .navbar-link { + color: $navbar-default-link-color; + &:hover { + color: $navbar-default-link-hover-color; + } + } + + .btn-link { + color: $navbar-default-link-color; + &:hover, + &:focus { + color: $navbar-default-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $navbar-default-link-disabled-color; + } + } + } +} + +// Inverse navbar + +.navbar-inverse { + background-color: $navbar-inverse-bg; + border-color: $navbar-inverse-border; + + .navbar-brand { + color: $navbar-inverse-brand-color; + &:hover, + &:focus { + color: $navbar-inverse-brand-hover-color; + background-color: $navbar-inverse-brand-hover-bg; + } + } + + .navbar-text { + color: $navbar-inverse-color; + } + + .navbar-nav { + > li > a { + color: $navbar-inverse-link-color; + + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + background-color: $navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-active-color; + background-color: $navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-disabled-color; + background-color: $navbar-inverse-link-disabled-bg; + } + } + } + + // Darken the responsive nav toggle + .navbar-toggle { + border-color: $navbar-inverse-toggle-border-color; + &:hover, + &:focus { + background-color: $navbar-inverse-toggle-hover-bg; + } + .icon-bar { + background-color: $navbar-inverse-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: darken($navbar-inverse-bg, 7%); + } + + // Dropdowns + .navbar-nav { + > .open > a { + &, + &:hover, + &:focus { + background-color: $navbar-inverse-link-active-bg; + color: $navbar-inverse-link-active-color; + } + } + + @media (max-width: $grid-float-breakpoint-max) { + // Dropdowns get custom display + .open .dropdown-menu { + > .dropdown-header { + border-color: $navbar-inverse-border; + } + .divider { + background-color: $navbar-inverse-border; + } + > li > a { + color: $navbar-inverse-link-color; + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + background-color: $navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-active-color; + background-color: $navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-disabled-color; + background-color: $navbar-inverse-link-disabled-bg; + } + } + } + } + } + + .navbar-link { + color: $navbar-inverse-link-color; + &:hover { + color: $navbar-inverse-link-hover-color; + } + } + + .btn-link { + color: $navbar-inverse-link-color; + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $navbar-inverse-link-disabled-color; + } + } + } +} diff --git a/pages/assets/bootstrap/_navs.scss b/pages/assets/bootstrap/_navs.scss new file mode 100644 index 0000000..ce0b917 --- /dev/null +++ b/pages/assets/bootstrap/_navs.scss @@ -0,0 +1,244 @@ +// +// Navs +// -------------------------------------------------- + + +// Base class +// -------------------------------------------------- + +.nav { + margin-bottom: 0; + padding-left: 0; // Override default ul/ol + list-style: none; + @include clearfix; + + > li { + position: relative; + display: block; + + > a { + position: relative; + display: block; + padding: $nav-link-padding; + &:hover, + &:focus { + text-decoration: none; + background-color: $nav-link-hover-bg; + } + } + + // Disabled state sets text to gray and nukes hover/tab effects + &.disabled > a { + color: $nav-disabled-link-color; + + &:hover, + &:focus { + color: $nav-disabled-link-hover-color; + text-decoration: none; + background-color: transparent; + cursor: $cursor-disabled; + } + } + } + + // Open dropdowns + .open > a { + &, + &:hover, + &:focus { + background-color: $nav-link-hover-bg; + border-color: $link-color; + } + } + + // Nav dividers (deprecated with v3.0.1) + // + // This should have been removed in v3 with the dropping of `.nav-list`, but + // we missed it. We don't currently support this anywhere, but in the interest + // of maintaining backward compatibility in case you use it, it's deprecated. + .nav-divider { + @include nav-divider; + } + + // Prevent IE8 from misplacing imgs + // + // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 + > li > a > img { + max-width: none; + } +} + + +// Tabs +// ------------------------- + +// Give the tabs something to sit on +.nav-tabs { + border-bottom: 1px solid $nav-tabs-border-color; + > li { + float: left; + // Make the list-items overlay the bottom border + margin-bottom: -1px; + + // Actual tabs (as links) + > a { + margin-right: 2px; + line-height: $line-height-base; + border: 1px solid transparent; + border-radius: $border-radius-base $border-radius-base 0 0; + &:hover { + border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color; + } + } + + // Active state, and its :hover to override normal :hover + &.active > a { + &, + &:hover, + &:focus { + color: $nav-tabs-active-link-hover-color; + background-color: $nav-tabs-active-link-hover-bg; + border: 1px solid $nav-tabs-active-link-hover-border-color; + border-bottom-color: transparent; + cursor: default; + } + } + } + // pulling this in mainly for less shorthand + &.nav-justified { + @extend .nav-justified; + @extend .nav-tabs-justified; + } +} + + +// Pills +// ------------------------- +.nav-pills { + > li { + float: left; + + // Links rendered as pills + > a { + border-radius: $nav-pills-border-radius; + } + + li { + margin-left: 2px; + } + + // Active state + &.active > a { + &, + &:hover, + &:focus { + color: $nav-pills-active-link-hover-color; + background-color: $nav-pills-active-link-hover-bg; + } + } + } +} + + +// Stacked pills +.nav-stacked { + > li { + float: none; + + li { + margin-top: 2px; + margin-left: 0; // no need for this gap between nav items + } + } +} + + +// Nav variations +// -------------------------------------------------- + +// Justified nav links +// ------------------------- + +.nav-justified { + width: 100%; + + > li { + float: none; + > a { + text-align: center; + margin-bottom: 5px; + } + } + + > .dropdown .dropdown-menu { + top: auto; + left: auto; + } + + @media (min-width: $screen-sm-min) { + > li { + display: table-cell; + width: 1%; + > a { + margin-bottom: 0; + } + } + } +} + +// Move borders to anchors instead of bottom of list +// +// Mixin for adding on top the shared `.nav-justified` styles for our tabs +.nav-tabs-justified { + border-bottom: 0; + + > li > a { + // Override margin from .nav-tabs + margin-right: 0; + border-radius: $border-radius-base; + } + + > .active > a, + > .active > a:hover, + > .active > a:focus { + border: 1px solid $nav-tabs-justified-link-border-color; + } + + @media (min-width: $screen-sm-min) { + > li > a { + border-bottom: 1px solid $nav-tabs-justified-link-border-color; + border-radius: $border-radius-base $border-radius-base 0 0; + } + > .active > a, + > .active > a:hover, + > .active > a:focus { + border-bottom-color: $nav-tabs-justified-active-link-border-color; + } + } +} + + +// Tabbable tabs +// ------------------------- + +// Hide tabbable panes to start, show them when `.active` +.tab-content { + > .tab-pane { + display: none; + visibility: hidden; + } + > .active { + display: block; + visibility: visible; + } +} + + +// Dropdowns +// ------------------------- + +// Specific dropdowns +.nav-tabs .dropdown-menu { + // make dropdown border overlap tab border + margin-top: -1px; + // Remove the top rounded corners here since there is a hard edge above the menu + @include border-top-radius(0); +} diff --git a/pages/assets/bootstrap/_normalize.scss b/pages/assets/bootstrap/_normalize.scss new file mode 100644 index 0000000..62a085a --- /dev/null +++ b/pages/assets/bootstrap/_normalize.scss @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +// +// 1. Set default font family to sans-serif. +// 2. Prevent iOS text size adjust after orientation change, without disabling +// user zoom. +// + +html { + font-family: sans-serif; // 1 + -ms-text-size-adjust: 100%; // 2 + -webkit-text-size-adjust: 100%; // 2 +} + +// +// Remove default margin. +// + +body { + margin: 0; +} + +// HTML5 display definitions +// ========================================================================== + +// +// Correct `block` display not defined for any HTML5 element in IE 8/9. +// Correct `block` display not defined for `details` or `summary` in IE 10/11 +// and Firefox. +// Correct `block` display not defined for `main` in IE 11. +// + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +// +// 1. Correct `inline-block` display not defined in IE 8/9. +// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. +// + +audio, +canvas, +progress, +video { + display: inline-block; // 1 + vertical-align: baseline; // 2 +} + +// +// Prevent modern browsers from displaying `audio` without controls. +// Remove excess height in iOS 5 devices. +// + +audio:not([controls]) { + display: none; + height: 0; +} + +// +// Address `[hidden]` styling not present in IE 8/9/10. +// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. +// + +[hidden], +template { + display: none; +} + +// Links +// ========================================================================== + +// +// Remove the gray background color from active links in IE 10. +// + +a { + background-color: transparent; +} + +// +// Improve readability when focused and also mouse hovered in all browsers. +// + +a:active, +a:hover { + outline: 0; +} + +// Text-level semantics +// ========================================================================== + +// +// Address styling not present in IE 8/9/10/11, Safari, and Chrome. +// + +abbr[title] { + border-bottom: 1px dotted; +} + +// +// Address style set to `bolder` in Firefox 4+, Safari, and Chrome. +// + +b, +strong { + font-weight: bold; +} + +// +// Address styling not present in Safari and Chrome. +// + +dfn { + font-style: italic; +} + +// +// Address variable `h1` font-size and margin within `section` and `article` +// contexts in Firefox 4+, Safari, and Chrome. +// + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +// +// Address styling not present in IE 8/9. +// + +mark { + background: #ff0; + color: #000; +} + +// +// Address inconsistent and variable font size in all browsers. +// + +small { + font-size: 80%; +} + +// +// Prevent `sub` and `sup` affecting `line-height` in all browsers. +// + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +// Embedded content +// ========================================================================== + +// +// Remove border when inside `a` element in IE 8/9/10. +// + +img { + border: 0; +} + +// +// Correct overflow not hidden in IE 9/10/11. +// + +svg:not(:root) { + overflow: hidden; +} + +// Grouping content +// ========================================================================== + +// +// Address margin not present in IE 8/9 and Safari. +// + +figure { + margin: 1em 40px; +} + +// +// Address differences between Firefox and other browsers. +// + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +// +// Contain overflow in all browsers. +// + +pre { + overflow: auto; +} + +// +// Address odd `em`-unit font size rendering in all browsers. +// + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +// Forms +// ========================================================================== + +// +// Known limitation: by default, Chrome and Safari on OS X allow very limited +// styling of `select`, unless a `border` property is set. +// + +// +// 1. Correct color not being inherited. +// Known issue: affects color of disabled elements. +// 2. Correct font properties not being inherited. +// 3. Address margins set differently in Firefox 4+, Safari, and Chrome. +// + +button, +input, +optgroup, +select, +textarea { + color: inherit; // 1 + font: inherit; // 2 + margin: 0; // 3 +} + +// +// Address `overflow` set to `hidden` in IE 8/9/10/11. +// + +button { + overflow: visible; +} + +// +// Address inconsistent `text-transform` inheritance for `button` and `select`. +// All other form control elements do not inherit `text-transform` values. +// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. +// Correct `select` style inheritance in Firefox. +// + +button, +select { + text-transform: none; +} + +// +// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` +// and `video` controls. +// 2. Correct inability to style clickable `input` types in iOS. +// 3. Improve usability and consistency of cursor style between image-type +// `input` and others. +// + +button, +html input[type="button"], // 1 +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; // 2 + cursor: pointer; // 3 +} + +// +// Re-set default cursor for disabled elements. +// + +button[disabled], +html input[disabled] { + cursor: default; +} + +// +// Remove inner padding and border in Firefox 4+. +// + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +// +// Address Firefox 4+ setting `line-height` on `input` using `!important` in +// the UA stylesheet. +// + +input { + line-height: normal; +} + +// +// It's recommended that you don't attempt to style these elements. +// Firefox's implementation doesn't respect box-sizing, padding, or width. +// +// 1. Address box sizing set to `content-box` in IE 8/9/10. +// 2. Remove excess padding in IE 8/9/10. +// + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; // 1 + padding: 0; // 2 +} + +// +// Fix the cursor style for Chrome's increment/decrement buttons. For certain +// `font-size` values of the `input`, it causes the cursor style of the +// decrement button to change from `default` to `text`. +// + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +// +// 1. Address `appearance` set to `searchfield` in Safari and Chrome. +// 2. Address `box-sizing` set to `border-box` in Safari and Chrome +// (include `-moz` to future-proof). +// + +input[type="search"] { + -webkit-appearance: textfield; // 1 + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; // 2 + box-sizing: content-box; +} + +// +// Remove inner padding and search cancel button in Safari and Chrome on OS X. +// Safari (but not Chrome) clips the cancel button when the search input has +// padding (and `textfield` appearance). +// + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +// +// Define consistent border, margin, and padding. +// + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +// +// 1. Correct `color` not being inherited in IE 8/9/10/11. +// 2. Remove padding so people aren't caught out if they zero out fieldsets. +// + +legend { + border: 0; // 1 + padding: 0; // 2 +} + +// +// Remove default vertical scrollbar in IE 8/9/10/11. +// + +textarea { + overflow: auto; +} + +// +// Don't inherit the `font-weight` (applied by a rule above). +// NOTE: the default cannot safely be changed in Chrome and Safari on OS X. +// + +optgroup { + font-weight: bold; +} + +// Tables +// ========================================================================== + +// +// Remove most spacing between table cells. +// + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/pages/assets/bootstrap/_pager.scss b/pages/assets/bootstrap/_pager.scss new file mode 100644 index 0000000..c234217 --- /dev/null +++ b/pages/assets/bootstrap/_pager.scss @@ -0,0 +1,54 @@ +// +// Pager pagination +// -------------------------------------------------- + + +.pager { + padding-left: 0; + margin: $line-height-computed 0; + list-style: none; + text-align: center; + @include clearfix; + li { + display: inline; + > a, + > span { + display: inline-block; + padding: 5px 14px; + background-color: $pager-bg; + border: 1px solid $pager-border; + border-radius: $pager-border-radius; + } + + > a:hover, + > a:focus { + text-decoration: none; + background-color: $pager-hover-bg; + } + } + + .next { + > a, + > span { + float: right; + } + } + + .previous { + > a, + > span { + float: left; + } + } + + .disabled { + > a, + > a:hover, + > a:focus, + > span { + color: $pager-disabled-color; + background-color: $pager-bg; + cursor: $cursor-disabled; + } + } +} diff --git a/pages/assets/bootstrap/_pagination.scss b/pages/assets/bootstrap/_pagination.scss new file mode 100644 index 0000000..323ec72 --- /dev/null +++ b/pages/assets/bootstrap/_pagination.scss @@ -0,0 +1,88 @@ +// +// Pagination (multiple pages) +// -------------------------------------------------- +.pagination { + display: inline-block; + padding-left: 0; + margin: $line-height-computed 0; + border-radius: $border-radius-base; + + > li { + display: inline; // Remove list-style and block-level defaults + > a, + > span { + position: relative; + float: left; // Collapse white-space + padding: $padding-base-vertical $padding-base-horizontal; + line-height: $line-height-base; + text-decoration: none; + color: $pagination-color; + background-color: $pagination-bg; + border: 1px solid $pagination-border; + margin-left: -1px; + } + &:first-child { + > a, + > span { + margin-left: 0; + @include border-left-radius($border-radius-base); + } + } + &:last-child { + > a, + > span { + @include border-right-radius($border-radius-base); + } + } + } + + > li > a, + > li > span { + &:hover, + &:focus { + color: $pagination-hover-color; + background-color: $pagination-hover-bg; + border-color: $pagination-hover-border; + } + } + + > .active > a, + > .active > span { + &, + &:hover, + &:focus { + z-index: 2; + color: $pagination-active-color; + background-color: $pagination-active-bg; + border-color: $pagination-active-border; + cursor: default; + } + } + + > .disabled { + > span, + > span:hover, + > span:focus, + > a, + > a:hover, + > a:focus { + color: $pagination-disabled-color; + background-color: $pagination-disabled-bg; + border-color: $pagination-disabled-border; + cursor: $cursor-disabled; + } + } +} + +// Sizing +// -------------------------------------------------- + +// Large +.pagination-lg { + @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large); +} + +// Small +.pagination-sm { + @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small); +} diff --git a/pages/assets/bootstrap/_panels.scss b/pages/assets/bootstrap/_panels.scss new file mode 100644 index 0000000..84847b4 --- /dev/null +++ b/pages/assets/bootstrap/_panels.scss @@ -0,0 +1,265 @@ +// +// Panels +// -------------------------------------------------- + + +// Base class +.panel { + margin-bottom: $line-height-computed; + background-color: $panel-bg; + border: 1px solid transparent; + border-radius: $panel-border-radius; + @include box-shadow(0 1px 1px rgba(0,0,0,.05)); +} + +// Panel contents +.panel-body { + padding: $panel-body-padding; + @include clearfix; +} + +// Optional heading +.panel-heading { + padding: $panel-heading-padding; + border-bottom: 1px solid transparent; + @include border-top-radius(($panel-border-radius - 1)); + + > .dropdown .dropdown-toggle { + color: inherit; + } +} + +// Within heading, strip any `h*` tag of its default margins for spacing. +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: ceil(($font-size-base * 1.125)); + color: inherit; + + > a, + > small, + > .small, + > small > a, + > .small > a { + color: inherit; + } +} + +// Optional footer (stays gray in every modifier class) +.panel-footer { + padding: $panel-footer-padding; + background-color: $panel-footer-bg; + border-top: 1px solid $panel-inner-border; + @include border-bottom-radius(($panel-border-radius - 1)); +} + + +// List groups in panels +// +// By default, space out list group content from panel headings to account for +// any kind of custom content between the two. + +.panel { + > .list-group, + > .panel-collapse > .list-group { + margin-bottom: 0; + + .list-group-item { + border-width: 1px 0; + border-radius: 0; + } + + // Add border top radius for first one + &:first-child { + .list-group-item:first-child { + border-top: 0; + @include border-top-radius(($panel-border-radius - 1)); + } + } + // Add border bottom radius for last one + &:last-child { + .list-group-item:last-child { + border-bottom: 0; + @include border-bottom-radius(($panel-border-radius - 1)); + } + } + } +} +// Collapse space between when there's no additional content. +.panel-heading + .list-group { + .list-group-item:first-child { + border-top-width: 0; + } +} +.list-group + .panel-footer { + border-top-width: 0; +} + +// Tables in panels +// +// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and +// watch it go full width. + +.panel { + > .table, + > .table-responsive > .table, + > .panel-collapse > .table { + margin-bottom: 0; + + caption { + padding-left: $panel-body-padding; + padding-right: $panel-body-padding; + } + } + // Add border top radius for first one + > .table:first-child, + > .table-responsive:first-child > .table:first-child { + @include border-top-radius(($panel-border-radius - 1)); + + > thead:first-child, + > tbody:first-child { + > tr:first-child { + border-top-left-radius: ($panel-border-radius - 1); + border-top-right-radius: ($panel-border-radius - 1); + + td:first-child, + th:first-child { + border-top-left-radius: ($panel-border-radius - 1); + } + td:last-child, + th:last-child { + border-top-right-radius: ($panel-border-radius - 1); + } + } + } + } + // Add border bottom radius for last one + > .table:last-child, + > .table-responsive:last-child > .table:last-child { + @include border-bottom-radius(($panel-border-radius - 1)); + + > tbody:last-child, + > tfoot:last-child { + > tr:last-child { + border-bottom-left-radius: ($panel-border-radius - 1); + border-bottom-right-radius: ($panel-border-radius - 1); + + td:first-child, + th:first-child { + border-bottom-left-radius: ($panel-border-radius - 1); + } + td:last-child, + th:last-child { + border-bottom-right-radius: ($panel-border-radius - 1); + } + } + } + } + > .panel-body + .table, + > .panel-body + .table-responsive, + > .table + .panel-body, + > .table-responsive + .panel-body { + border-top: 1px solid $table-border-color; + } + > .table > tbody:first-child > tr:first-child th, + > .table > tbody:first-child > tr:first-child td { + border-top: 0; + } + > .table-bordered, + > .table-responsive > .table-bordered { + border: 0; + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + > thead, + > tbody { + > tr:first-child { + > td, + > th { + border-bottom: 0; + } + } + } + > tbody, + > tfoot { + > tr:last-child { + > td, + > th { + border-bottom: 0; + } + } + } + } + > .table-responsive { + border: 0; + margin-bottom: 0; + } +} + + +// Collapsable panels (aka, accordion) +// +// Wrap a series of panels in `.panel-group` to turn them into an accordion with +// the help of our collapse JavaScript plugin. + +.panel-group { + margin-bottom: $line-height-computed; + + // Tighten up margin so it's only between panels + .panel { + margin-bottom: 0; + border-radius: $panel-border-radius; + + + .panel { + margin-top: 5px; + } + } + + .panel-heading { + border-bottom: 0; + + + .panel-collapse > .panel-body, + + .panel-collapse > .list-group { + border-top: 1px solid $panel-inner-border; + } + } + + .panel-footer { + border-top: 0; + + .panel-collapse .panel-body { + border-bottom: 1px solid $panel-inner-border; + } + } +} + + +// Contextual variations +.panel-default { + @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border); +} +.panel-primary { + @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border); +} +.panel-success { + @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border); +} +.panel-info { + @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border); +} +.panel-warning { + @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border); +} +.panel-danger { + @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border); +} diff --git a/pages/assets/bootstrap/_popovers.scss b/pages/assets/bootstrap/_popovers.scss new file mode 100644 index 0000000..699c7b8 --- /dev/null +++ b/pages/assets/bootstrap/_popovers.scss @@ -0,0 +1,135 @@ +// +// Popovers +// -------------------------------------------------- + + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: $zindex-popover; + display: none; + max-width: $popover-max-width; + padding: 1px; + // Reset font and text properties given new insertion method + font-family: $font-family-base; + font-size: $font-size-base; + font-weight: normal; + line-height: $line-height-base; + text-align: left; + background-color: $popover-bg; + background-clip: padding-box; + border: 1px solid $popover-fallback-border-color; + border: 1px solid $popover-border-color; + border-radius: $border-radius-large; + @include box-shadow(0 5px 10px rgba(0,0,0,.2)); + + // Overrides for proper insertion + white-space: normal; + + // Offset the popover to account for the popover arrow + &.top { margin-top: -$popover-arrow-width; } + &.right { margin-left: $popover-arrow-width; } + &.bottom { margin-top: $popover-arrow-width; } + &.left { margin-left: -$popover-arrow-width; } +} + +.popover-title { + margin: 0; // reset heading margin + padding: 8px 14px; + font-size: $font-size-base; + background-color: $popover-title-bg; + border-bottom: 1px solid darken($popover-title-bg, 5%); + border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +// Arrows +// +// .arrow is outer, .arrow:after is inner + +.popover > .arrow { + &, + &:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } +} +.popover > .arrow { + border-width: $popover-arrow-outer-width; +} +.popover > .arrow:after { + border-width: $popover-arrow-width; + content: ""; +} + +.popover { + &.top > .arrow { + left: 50%; + margin-left: -$popover-arrow-outer-width; + border-bottom-width: 0; + border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback + border-top-color: $popover-arrow-outer-color; + bottom: -$popover-arrow-outer-width; + &:after { + content: " "; + bottom: 1px; + margin-left: -$popover-arrow-width; + border-bottom-width: 0; + border-top-color: $popover-arrow-color; + } + } + &.right > .arrow { + top: 50%; + left: -$popover-arrow-outer-width; + margin-top: -$popover-arrow-outer-width; + border-left-width: 0; + border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback + border-right-color: $popover-arrow-outer-color; + &:after { + content: " "; + left: 1px; + bottom: -$popover-arrow-width; + border-left-width: 0; + border-right-color: $popover-arrow-color; + } + } + &.bottom > .arrow { + left: 50%; + margin-left: -$popover-arrow-outer-width; + border-top-width: 0; + border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback + border-bottom-color: $popover-arrow-outer-color; + top: -$popover-arrow-outer-width; + &:after { + content: " "; + top: 1px; + margin-left: -$popover-arrow-width; + border-top-width: 0; + border-bottom-color: $popover-arrow-color; + } + } + + &.left > .arrow { + top: 50%; + right: -$popover-arrow-outer-width; + margin-top: -$popover-arrow-outer-width; + border-right-width: 0; + border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback + border-left-color: $popover-arrow-outer-color; + &:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: $popover-arrow-color; + bottom: -$popover-arrow-width; + } + } +} diff --git a/pages/assets/bootstrap/_print.scss b/pages/assets/bootstrap/_print.scss new file mode 100644 index 0000000..94ca58f --- /dev/null +++ b/pages/assets/bootstrap/_print.scss @@ -0,0 +1,107 @@ +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +// ========================================================================== +// Print styles. +// Inlined to avoid the additional HTTP request: h5bp.com/r +// ========================================================================== + +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; // Black prints faster: h5bp.com/s + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + // Don't show links that are fragment identifiers, + // or use the `javascript:` pseudo protocol + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; // h5bp.com/t + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + // Bootstrap specific changes start + // + // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 + // Once fixed, we can just straight up remove this. + select { + background: #fff !important; + } + + // Bootstrap components + .navbar { + display: none; + } + .btn, + .dropup > .btn { + > .caret { + border-top-color: #000 !important; + } + } + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + + td, + th { + background-color: #fff !important; + } + } + .table-bordered { + th, + td { + border: 1px solid #ddd !important; + } + } + + // Bootstrap specific changes end +} diff --git a/pages/assets/bootstrap/_progress-bars.scss b/pages/assets/bootstrap/_progress-bars.scss new file mode 100644 index 0000000..343df63 --- /dev/null +++ b/pages/assets/bootstrap/_progress-bars.scss @@ -0,0 +1,87 @@ +// +// Progress bars +// -------------------------------------------------- + + +// Bar animations +// ------------------------- + +// WebKit +@-webkit-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Spec and IE10+ +@keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + + +// Bar itself +// ------------------------- + +// Outer container +.progress { + overflow: hidden; + height: $line-height-computed; + margin-bottom: $line-height-computed; + background-color: $progress-bg; + border-radius: $progress-border-radius; + @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); +} + +// Bar of progress +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: $font-size-small; + line-height: $line-height-computed; + color: $progress-bar-color; + text-align: center; + background-color: $progress-bar-bg; + @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); + @include transition(width .6s ease); +} + +// Striped bars +// +// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the +// `.progress-bar-striped` class, which you just add to an existing +// `.progress-bar`. +.progress-striped .progress-bar, +.progress-bar-striped { + @include gradient-striped; + background-size: 40px 40px; +} + +// Call animation for the active one +// +// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the +// `.progress-bar.active` approach. +.progress.active .progress-bar, +.progress-bar.active { + @include animation(progress-bar-stripes 2s linear infinite); +} + + +// Variations +// ------------------------- + +.progress-bar-success { + @include progress-bar-variant($progress-bar-success-bg); +} + +.progress-bar-info { + @include progress-bar-variant($progress-bar-info-bg); +} + +.progress-bar-warning { + @include progress-bar-variant($progress-bar-warning-bg); +} + +.progress-bar-danger { + @include progress-bar-variant($progress-bar-danger-bg); +} diff --git a/pages/assets/bootstrap/_responsive-embed.scss b/pages/assets/bootstrap/_responsive-embed.scss new file mode 100644 index 0000000..c1fa8f8 --- /dev/null +++ b/pages/assets/bootstrap/_responsive-embed.scss @@ -0,0 +1,35 @@ +// Embeds responsive +// +// Credit: Nicolas Gallagher and SUIT CSS. + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; + + .embed-responsive-item, + iframe, + embed, + object, + video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; + } + + // Modifier class for 16:9 aspect ratio + &.embed-responsive-16by9 { + padding-bottom: 56.25%; + } + + // Modifier class for 4:3 aspect ratio + &.embed-responsive-4by3 { + padding-bottom: 75%; + } +} diff --git a/pages/assets/bootstrap/_responsive-utilities.scss b/pages/assets/bootstrap/_responsive-utilities.scss new file mode 100644 index 0000000..8d02aaa --- /dev/null +++ b/pages/assets/bootstrap/_responsive-utilities.scss @@ -0,0 +1,177 @@ +// +// Responsive: Utility classes +// -------------------------------------------------- + + +// IE10 in Windows (Phone) 8 +// +// Support for responsive views via media queries is kind of borked in IE10, for +// Surface/desktop in split view and for Windows Phone 8. This particular fix +// must be accompanied by a snippet of JavaScript to sniff the user agent and +// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at +// our Getting Started page for more information on this bug. +// +// For more information, see the following: +// +// Issue: https://github.com/twbs/bootstrap/issues/10497 +// Docs: http://getbootstrap.com/getting-started/#support-ie10-width +// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/ +// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ + +@-ms-viewport { + width: device-width; +} + + +// Visibility utilities +// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 + +@include responsive-invisibility('.visible-xs'); +@include responsive-invisibility('.visible-sm'); +@include responsive-invisibility('.visible-md'); +@include responsive-invisibility('.visible-lg'); + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +@media (max-width: $screen-xs-max) { + @include responsive-visibility('.visible-xs'); +} +.visible-xs-block { + @media (max-width: $screen-xs-max) { + display: block !important; + } +} +.visible-xs-inline { + @media (max-width: $screen-xs-max) { + display: inline !important; + } +} +.visible-xs-inline-block { + @media (max-width: $screen-xs-max) { + display: inline-block !important; + } +} + +@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { + @include responsive-visibility('.visible-sm'); +} +.visible-sm-block { + @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { + display: block !important; + } +} +.visible-sm-inline { + @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { + display: inline !important; + } +} +.visible-sm-inline-block { + @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { + display: inline-block !important; + } +} + +@media (min-width: $screen-md-min) and (max-width: $screen-md-max) { + @include responsive-visibility('.visible-md'); +} +.visible-md-block { + @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { + display: block !important; + } +} +.visible-md-inline { + @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { + display: inline !important; + } +} +.visible-md-inline-block { + @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { + display: inline-block !important; + } +} + +@media (min-width: $screen-lg-min) { + @include responsive-visibility('.visible-lg'); +} +.visible-lg-block { + @media (min-width: $screen-lg-min) { + display: block !important; + } +} +.visible-lg-inline { + @media (min-width: $screen-lg-min) { + display: inline !important; + } +} +.visible-lg-inline-block { + @media (min-width: $screen-lg-min) { + display: inline-block !important; + } +} + +@media (max-width: $screen-xs-max) { + @include responsive-invisibility('.hidden-xs'); +} + +@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { + @include responsive-invisibility('.hidden-sm'); +} + +@media (min-width: $screen-md-min) and (max-width: $screen-md-max) { + @include responsive-invisibility('.hidden-md'); +} + +@media (min-width: $screen-lg-min) { + @include responsive-invisibility('.hidden-lg'); +} + + +// Print utilities +// +// Media queries are placed on the inside to be mixin-friendly. + +// Note: Deprecated .visible-print as of v3.2.0 + +@include responsive-invisibility('.visible-print'); + +@media print { + @include responsive-visibility('.visible-print'); +} +.visible-print-block { + display: none !important; + + @media print { + display: block !important; + } +} +.visible-print-inline { + display: none !important; + + @media print { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; + + @media print { + display: inline-block !important; + } +} + +@media print { + @include responsive-invisibility('.hidden-print'); +} diff --git a/pages/assets/bootstrap/_scaffolding.scss b/pages/assets/bootstrap/_scaffolding.scss new file mode 100644 index 0000000..626e5eb --- /dev/null +++ b/pages/assets/bootstrap/_scaffolding.scss @@ -0,0 +1,150 @@ +// +// Scaffolding +// -------------------------------------------------- + + +// Reset the box-sizing +// +// Heads up! This reset may cause conflicts with some third-party widgets. +// For recommendations on resolving such conflicts, see +// http://getbootstrap.com/getting-started/#third-box-sizing +* { + @include box-sizing(border-box); +} +*:before, +*:after { + @include box-sizing(border-box); +} + + +// Body reset + +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +body { + font-family: $font-family-base; + font-size: $font-size-base; + line-height: $line-height-base; + color: $text-color; + background-color: $body-bg; +} + +// Reset fonts for relevant elements +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + + +// Links + +a { + color: $link-color; + text-decoration: none; + + &:hover, + &:focus { + color: $link-hover-color; + text-decoration: $link-hover-decoration; + } + + &:focus { + @include tab-focus; + } +} + + +// Figures +// +// We reset this here because previously Normalize had no `figure` margins. This +// ensures we don't break anyone's use of the element. + +figure { + margin: 0; +} + + +// Images + +img { + vertical-align: middle; +} + +// Responsive images (ensure images don't scale beyond their parents) +.img-responsive { + @include img-responsive; +} + +// Rounded corners +.img-rounded { + border-radius: $border-radius-large; +} + +// Image thumbnails +// +// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. +.img-thumbnail { + padding: $thumbnail-padding; + line-height: $line-height-base; + background-color: $thumbnail-bg; + border: 1px solid $thumbnail-border; + border-radius: $thumbnail-border-radius; + @include transition(all .2s ease-in-out); + + // Keep them at most 100% wide + @include img-responsive(inline-block); +} + +// Perfect circle +.img-circle { + border-radius: 50%; // set radius in percents +} + + +// Horizontal rules + +hr { + margin-top: $line-height-computed; + margin-bottom: $line-height-computed; + border: 0; + border-top: 1px solid $hr-border; +} + + +// Only display content to screen readers +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// Credit: HTML5 Boilerplate + +.sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/pages/assets/bootstrap/_tables.scss b/pages/assets/bootstrap/_tables.scss new file mode 100644 index 0000000..affcc58 --- /dev/null +++ b/pages/assets/bootstrap/_tables.scss @@ -0,0 +1,234 @@ +// +// Tables +// -------------------------------------------------- + + +table { + background-color: $table-bg; +} +caption { + padding-top: $table-cell-padding; + padding-bottom: $table-cell-padding; + color: $text-muted; + text-align: left; +} +th { + text-align: left; +} + + +// Baseline styles + +.table { + width: 100%; + max-width: 100%; + margin-bottom: $line-height-computed; + // Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: $table-cell-padding; + line-height: $line-height-base; + vertical-align: top; + border-top: 1px solid $table-border-color; + } + } + } + // Bottom align for column headings + > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid $table-border-color; + } + // Remove top border from thead by default + > caption + thead, + > colgroup + thead, + > thead:first-child { + > tr:first-child { + > th, + > td { + border-top: 0; + } + } + } + // Account for multiple tbody instances + > tbody + tbody { + border-top: 2px solid $table-border-color; + } + + // Nesting + .table { + background-color: $body-bg; + } +} + + +// Condensed table w/ half padding + +.table-condensed { + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: $table-condensed-cell-padding; + } + } + } +} + + +// Bordered version +// +// Add borders all around the table and between all the columns. + +.table-bordered { + border: 1px solid $table-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid $table-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + + +// Zebra-striping +// +// Default zebra-stripe styles (alternating gray and transparent backgrounds) + +.table-striped { + > tbody > tr:nth-of-type(odd) { + background-color: $table-bg-accent; + } +} + + +// Hover effect +// +// Placed here since it has to come after the potential zebra striping + +.table-hover { + > tbody > tr:hover { + background-color: $table-bg-hover; + } +} + + +// Table cell sizing +// +// Reset default table behavior + +table col[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-column; +} +table { + td, + th { + &[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-cell; + } + } +} + + +// Table backgrounds +// +// Exact selectors below required to override `.table-striped` and prevent +// inheritance to nested tables. + +// Generate the contextual variants +@include table-row-variant('active', $table-bg-active); +@include table-row-variant('success', $state-success-bg); +@include table-row-variant('info', $state-info-bg); +@include table-row-variant('warning', $state-warning-bg); +@include table-row-variant('danger', $state-danger-bg); + + +// Responsive tables +// +// Wrap your tables in `.table-responsive` and we'll make them mobile friendly +// by enabling horizontal scrolling. Only applies <768px. Everything above that +// will display normally. + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837) + + @media screen and (max-width: $screen-xs-max) { + width: 100%; + margin-bottom: ($line-height-computed * 0.75); + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid $table-border-color; + + // Tighten up spacing + > .table { + margin-bottom: 0; + + // Ensure the content doesn't wrap + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + white-space: nowrap; + } + } + } + } + + // Special overrides for the bordered tables + > .table-bordered { + border: 0; + + // Nuke the appropriate borders so that the parent can handle them + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + + // Only nuke the last row's bottom-border in `tbody` and `tfoot` since + // chances are there will be only one `tr` in a `thead` and that would + // remove the border altogether. + > tbody, + > tfoot { + > tr:last-child { + > th, + > td { + border-bottom: 0; + } + } + } + + } + } +} diff --git a/pages/assets/bootstrap/_theme.scss b/pages/assets/bootstrap/_theme.scss new file mode 100644 index 0000000..ed106a4 --- /dev/null +++ b/pages/assets/bootstrap/_theme.scss @@ -0,0 +1,273 @@ + +// +// Load core variables and mixins +// -------------------------------------------------- + +@import "variables"; +@import "mixins"; + + +// +// Buttons +// -------------------------------------------------- + +// Common styles +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0,0,0,.2); + $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); + @include box-shadow($shadow); + + // Reset the shadow + &:active, + &.active { + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + .badge { + text-shadow: none; + } +} + +// Mixin for generating new styles +@mixin btn-styles($btn-color: #555) { + @include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%)); + @include reset-filter; // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620 + background-repeat: repeat-x; + border-color: darken($btn-color, 14%); + + &:hover, + &:focus { + background-color: darken($btn-color, 12%); + background-position: 0 -15px; + } + + &:active, + &.active { + background-color: darken($btn-color, 12%); + border-color: darken($btn-color, 14%); + } + + &.disabled, + &:disabled, + &[disabled] { + background-color: darken($btn-color, 12%); + background-image: none; + } +} + +// Common styles +.btn { + // Remove the gradient for the pressed/active state + &:active, + &.active { + background-image: none; + } +} + +// Apply the mixin to the buttons +.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; } +.btn-primary { @include btn-styles($btn-primary-bg); } +.btn-success { @include btn-styles($btn-success-bg); } +.btn-info { @include btn-styles($btn-info-bg); } +.btn-warning { @include btn-styles($btn-warning-bg); } +.btn-danger { @include btn-styles($btn-danger-bg); } + + +// +// Images +// -------------------------------------------------- + +.thumbnail, +.img-thumbnail { + @include box-shadow(0 1px 2px rgba(0,0,0,.075)); +} + + +// +// Dropdowns +// -------------------------------------------------- + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + @include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%)); + background-color: darken($dropdown-link-hover-bg, 5%); +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%)); + background-color: darken($dropdown-link-active-bg, 5%); +} + + +// +// Navbar +// -------------------------------------------------- + +// Default navbar +.navbar-default { + @include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg); + @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered + border-radius: $navbar-border-radius; + $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075); + @include box-shadow($shadow); + + .navbar-nav > .open > a, + .navbar-nav > .active > a { + @include gradient-vertical($start-color: darken($navbar-default-link-active-bg, 5%), $end-color: darken($navbar-default-link-active-bg, 2%)); + @include box-shadow(inset 0 3px 9px rgba(0,0,0,.075)); + } +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255,255,255,.25); +} + +// Inverted navbar +.navbar-inverse { + @include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg); + @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257 + + .navbar-nav > .open > a, + .navbar-nav > .active > a { + @include gradient-vertical($start-color: $navbar-inverse-link-active-bg, $end-color: lighten($navbar-inverse-link-active-bg, 2.5%)); + @include box-shadow(inset 0 3px 9px rgba(0,0,0,.25)); + } + + .navbar-brand, + .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + } +} + +// Undo rounded corners in static and fixed navbars +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} + +// Fix active state of dropdown items in collapsed mode +@media (max-width: $grid-float-breakpoint-max) { + .navbar .navbar-nav .open .dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: #fff; + @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%)); + } + } +} + + +// +// Alerts +// -------------------------------------------------- + +// Common styles +.alert { + text-shadow: 0 1px 0 rgba(255,255,255,.2); + $shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05); + @include box-shadow($shadow); +} + +// Mixin for generating new styles +@mixin alert-styles($color) { + @include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%)); + border-color: darken($color, 15%); +} + +// Apply the mixin to the alerts +.alert-success { @include alert-styles($alert-success-bg); } +.alert-info { @include alert-styles($alert-info-bg); } +.alert-warning { @include alert-styles($alert-warning-bg); } +.alert-danger { @include alert-styles($alert-danger-bg); } + + +// +// Progress bars +// -------------------------------------------------- + +// Give the progress background some depth +.progress { + @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg) +} + +// Mixin for generating new styles +@mixin progress-bar-styles($color) { + @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%)); +} + +// Apply the mixin to the progress bars +.progress-bar { @include progress-bar-styles($progress-bar-bg); } +.progress-bar-success { @include progress-bar-styles($progress-bar-success-bg); } +.progress-bar-info { @include progress-bar-styles($progress-bar-info-bg); } +.progress-bar-warning { @include progress-bar-styles($progress-bar-warning-bg); } +.progress-bar-danger { @include progress-bar-styles($progress-bar-danger-bg); } + +// Reset the striped class because our mixins don't do multiple gradients and +// the above custom styles override the new `.progress-bar-striped` in v3.2.0. +.progress-bar-striped { + @include gradient-striped; +} + + +// +// List groups +// -------------------------------------------------- + +.list-group { + border-radius: $border-radius-base; + @include box-shadow(0 1px 2px rgba(0,0,0,.075)); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%); + @include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%)); + border-color: darken($list-group-active-border, 7.5%); + + .badge { + text-shadow: none; + } +} + + +// +// Panels +// -------------------------------------------------- + +// Common styles +.panel { + @include box-shadow(0 1px 2px rgba(0,0,0,.05)); +} + +// Mixin for generating new styles +@mixin panel-heading-styles($color) { + @include gradient-vertical($start-color: $color, $end-color: darken($color, 5%)); +} + +// Apply the mixin to the panel headings only +.panel-default > .panel-heading { @include panel-heading-styles($panel-default-heading-bg); } +.panel-primary > .panel-heading { @include panel-heading-styles($panel-primary-heading-bg); } +.panel-success > .panel-heading { @include panel-heading-styles($panel-success-heading-bg); } +.panel-info > .panel-heading { @include panel-heading-styles($panel-info-heading-bg); } +.panel-warning > .panel-heading { @include panel-heading-styles($panel-warning-heading-bg); } +.panel-danger > .panel-heading { @include panel-heading-styles($panel-danger-heading-bg); } + + +// +// Wells +// -------------------------------------------------- + +.well { + @include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg); + border-color: darken($well-bg, 10%); + $shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); + @include box-shadow($shadow); +} diff --git a/pages/assets/bootstrap/_thumbnails.scss b/pages/assets/bootstrap/_thumbnails.scss new file mode 100644 index 0000000..da0e1e7 --- /dev/null +++ b/pages/assets/bootstrap/_thumbnails.scss @@ -0,0 +1,38 @@ +// +// Thumbnails +// -------------------------------------------------- + + +// Mixin and adjust the regular image class +.thumbnail { + display: block; + padding: $thumbnail-padding; + margin-bottom: $line-height-computed; + line-height: $line-height-base; + background-color: $thumbnail-bg; + border: 1px solid $thumbnail-border; + border-radius: $thumbnail-border-radius; + @include transition(border .2s ease-in-out); + + > img, + a > img { + @include img-responsive; + margin-left: auto; + margin-right: auto; + } + + // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active + + // Image captions + .caption { + padding: $thumbnail-caption-padding; + color: $thumbnail-caption-color; + } +} + +// Add a hover state for linked versions only +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: $link-color; +} diff --git a/pages/assets/bootstrap/_tooltip.scss b/pages/assets/bootstrap/_tooltip.scss new file mode 100644 index 0000000..6004f59 --- /dev/null +++ b/pages/assets/bootstrap/_tooltip.scss @@ -0,0 +1,103 @@ +// +// Tooltips +// -------------------------------------------------- + + +// Base class +.tooltip { + position: absolute; + z-index: $zindex-tooltip; + display: block; + visibility: visible; + // Reset font and text properties given new insertion method + font-family: $font-family-base; + font-size: $font-size-small; + font-weight: normal; + line-height: 1.4; + @include opacity(0); + + &.in { @include opacity($tooltip-opacity); } + &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; } + &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; } + &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; } + &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: $tooltip-max-width; + padding: 3px 8px; + color: $tooltip-color; + text-align: center; + text-decoration: none; + background-color: $tooltip-bg; + border-radius: $border-radius-base; +} + +// Arrows +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1 +.tooltip { + &.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width 0; + border-top-color: $tooltip-arrow-color; + } + &.top-left .tooltip-arrow { + bottom: 0; + right: $tooltip-arrow-width; + margin-bottom: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width 0; + border-top-color: $tooltip-arrow-color; + } + &.top-right .tooltip-arrow { + bottom: 0; + left: $tooltip-arrow-width; + margin-bottom: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width 0; + border-top-color: $tooltip-arrow-color; + } + &.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0; + border-right-color: $tooltip-arrow-color; + } + &.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width; + border-left-color: $tooltip-arrow-color; + } + &.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -$tooltip-arrow-width; + border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; + border-bottom-color: $tooltip-arrow-color; + } + &.bottom-left .tooltip-arrow { + top: 0; + right: $tooltip-arrow-width; + margin-top: -$tooltip-arrow-width; + border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; + border-bottom-color: $tooltip-arrow-color; + } + &.bottom-right .tooltip-arrow { + top: 0; + left: $tooltip-arrow-width; + margin-top: -$tooltip-arrow-width; + border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; + border-bottom-color: $tooltip-arrow-color; + } +} diff --git a/pages/assets/bootstrap/_type.scss b/pages/assets/bootstrap/_type.scss new file mode 100644 index 0000000..62d685c --- /dev/null +++ b/pages/assets/bootstrap/_type.scss @@ -0,0 +1,298 @@ +// +// Typography +// -------------------------------------------------- + + +// Headings +// ------------------------- + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: $headings-font-family; + font-weight: $headings-font-weight; + line-height: $headings-line-height; + color: $headings-color; + + small, + .small { + font-weight: normal; + line-height: 1; + color: $headings-small-color; + } +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: $line-height-computed; + margin-bottom: ($line-height-computed / 2); + + small, + .small { + font-size: 65%; + } +} +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: ($line-height-computed / 2); + margin-bottom: ($line-height-computed / 2); + + small, + .small { + font-size: 75%; + } +} + +h1, .h1 { font-size: $font-size-h1; } +h2, .h2 { font-size: $font-size-h2; } +h3, .h3 { font-size: $font-size-h3; } +h4, .h4 { font-size: $font-size-h4; } +h5, .h5 { font-size: $font-size-h5; } +h6, .h6 { font-size: $font-size-h6; } + + +// Body text +// ------------------------- + +p { + margin: 0 0 ($line-height-computed / 2); +} + +.lead { + margin-bottom: $line-height-computed; + font-size: floor(($font-size-base * 1.15)); + font-weight: 300; + line-height: 1.4; + + @media (min-width: $screen-sm-min) { + font-size: ($font-size-base * 1.5); + } +} + + +// Emphasis & misc +// ------------------------- + +// Ex: (12px small font / 14px base font) * 100% = about 85% +small, +.small { + font-size: floor((100% * $font-size-small / $font-size-base)); +} + +mark, +.mark { + background-color: $state-warning-bg; + padding: .2em; +} + +// Alignment +.text-left { text-align: left; } +.text-right { text-align: right; } +.text-center { text-align: center; } +.text-justify { text-align: justify; } +.text-nowrap { white-space: nowrap; } + +// Transformation +.text-lowercase { text-transform: lowercase; } +.text-uppercase { text-transform: uppercase; } +.text-capitalize { text-transform: capitalize; } + +// Contextual colors +.text-muted { + color: $text-muted; +} + +@include text-emphasis-variant('.text-primary', $brand-primary); + +@include text-emphasis-variant('.text-success', $state-success-text); + +@include text-emphasis-variant('.text-info', $state-info-text); + +@include text-emphasis-variant('.text-warning', $state-warning-text); + +@include text-emphasis-variant('.text-danger', $state-danger-text); + +// Contextual backgrounds +// For now we'll leave these alongside the text classes until v4 when we can +// safely shift things around (per SemVer rules). +.bg-primary { + // Given the contrast here, this is the only class to have its color inverted + // automatically. + color: #fff; +} +@include bg-variant('.bg-primary', $brand-primary); + +@include bg-variant('.bg-success', $state-success-bg); + +@include bg-variant('.bg-info', $state-info-bg); + +@include bg-variant('.bg-warning', $state-warning-bg); + +@include bg-variant('.bg-danger', $state-danger-bg); + + +// Page header +// ------------------------- + +.page-header { + padding-bottom: (($line-height-computed / 2) - 1); + margin: ($line-height-computed * 2) 0 $line-height-computed; + border-bottom: 1px solid $page-header-border-color; +} + + +// Lists +// ------------------------- + +// Unordered and Ordered lists +ul, +ol { + margin-top: 0; + margin-bottom: ($line-height-computed / 2); + ul, + ol { + margin-bottom: 0; + } +} + +// List options + +// [converter] extracted from `.list-unstyled` for libsass compatibility +@mixin list-unstyled { + padding-left: 0; + list-style: none; +} +// [converter] extracted as `@mixin list-unstyled` for libsass compatibility +.list-unstyled { + @include list-unstyled; +} + + +// Inline turns list items into inline-block +.list-inline { + @include list-unstyled; + margin-left: -5px; + + > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } +} + +// Description Lists +dl { + margin-top: 0; // Remove browser default + margin-bottom: $line-height-computed; +} +dt, +dd { + line-height: $line-height-base; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; // Undo browser default +} + +// Horizontal description lists +// +// Defaults to being stacked without any of the below styles applied, until the +// grid breakpoint is reached (default of ~768px). + +.dl-horizontal { + dd { + @include clearfix; // Clear the floated `dt` if an empty `dd` is present + } + + @media (min-width: $grid-float-breakpoint) { + dt { + float: left; + width: ($dl-horizontal-offset - 20); + clear: left; + text-align: right; + @include text-overflow; + } + dd { + margin-left: $dl-horizontal-offset; + } + } +} + + +// Misc +// ------------------------- + +// Abbreviations and acronyms +abbr[title], +// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257 +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted $abbr-border-color; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +// Blockquotes +blockquote { + padding: ($line-height-computed / 2) $line-height-computed; + margin: 0 0 $line-height-computed; + font-size: $blockquote-font-size; + border-left: 5px solid $blockquote-border-color; + + p, + ul, + ol { + &:last-child { + margin-bottom: 0; + } + } + + // Note: Deprecated small and .small as of v3.1.0 + // Context: https://github.com/twbs/bootstrap/issues/11660 + footer, + small, + .small { + display: block; + font-size: 80%; // back to default font-size + line-height: $line-height-base; + color: $blockquote-small-color; + + &:before { + content: '\2014 \00A0'; // em dash, nbsp + } + } +} + +// Opposite alignment of blockquote +// +// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0. +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid $blockquote-border-color; + border-left: 0; + text-align: right; + + // Account for citation + footer, + small, + .small { + &:before { content: ''; } + &:after { + content: '\00A0 \2014'; // nbsp, em dash + } + } +} + +// Addresses +address { + margin-bottom: $line-height-computed; + font-style: normal; + line-height: $line-height-base; +} diff --git a/pages/assets/bootstrap/_utilities.scss b/pages/assets/bootstrap/_utilities.scss new file mode 100644 index 0000000..386c524 --- /dev/null +++ b/pages/assets/bootstrap/_utilities.scss @@ -0,0 +1,56 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Floats +// ------------------------- + +.clearfix { + @include clearfix; +} +.center-block { + @include center-block; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} + + +// Toggling content +// ------------------------- + +// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + @include text-hide; +} + + +// Hide from screenreaders and browsers +// +// Credit: HTML5 Boilerplate + +.hidden { + display: none !important; + visibility: hidden !important; +} + + +// For Affix plugin +// ------------------------- + +.affix { + position: fixed; +} diff --git a/pages/assets/bootstrap/_variables.scss b/pages/assets/bootstrap/_variables.scss new file mode 100644 index 0000000..578b7b6 --- /dev/null +++ b/pages/assets/bootstrap/_variables.scss @@ -0,0 +1,862 @@ +$bootstrap-sass-asset-helper: false !default; +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base: #000 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #222 +$gray-dark: lighten($gray-base, 20%) !default; // #333 +$gray: lighten($gray-base, 33.5%) !default; // #555 +$gray-light: lighten($gray-base, 46.7%) !default; // #777 +$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee + +$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7 +$brand-success: #5cb85c !default; +$brand-info: #5bc0de !default; +$brand-warning: #f0ad4e !default; +$brand-danger: #d9534f !default; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: #fff !default; +//** Global text color on ``. +$text-color: $gray-dark !default; + +//** Global textual link color. +$link-color: $brand-primary !default; +//** Link hover color set via `darken()` function. +$link-hover-color: darken($link-color, 15%) !default; +//** Link hover decoration. +$link-hover-decoration: underline !default; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
        `.
        +$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
        +$font-family-base:        $font-family-sans-serif !default;
        +
        +$font-size-base:          14px !default;
        +$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
        +$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
        +
        +$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
        +$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
        +$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
        +$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
        +$font-size-h5:            $font-size-base !default;
        +$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
        +
        +//** Unit-less `line-height` for use in components like buttons.
        +$line-height-base:        1.428571429 !default; // 20/14
        +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
        +$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
        +
        +//** By default, this inherits from the ``.
        +$headings-font-family:    inherit !default;
        +$headings-font-weight:    500 !default;
        +$headings-line-height:    1.1 !default;
        +$headings-color:          inherit !default;
        +
        +
        +//== Iconography
        +//
        +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
        +
        +//** Load fonts from this directory.
        +
        +// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
        +// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
        +$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
        +
        +//** File name for all font files.
        +$icon-font-name:          "glyphicons-halflings-regular" !default;
        +//** Element ID within SVG icon file.
        +$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
        +
        +
        +//== Components
        +//
        +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
        +
        +$padding-base-vertical:     6px !default;
        +$padding-base-horizontal:   12px !default;
        +
        +$padding-large-vertical:    10px !default;
        +$padding-large-horizontal:  16px !default;
        +
        +$padding-small-vertical:    5px !default;
        +$padding-small-horizontal:  10px !default;
        +
        +$padding-xs-vertical:       1px !default;
        +$padding-xs-horizontal:     5px !default;
        +
        +$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
        +$line-height-small:         1.5 !default;
        +
        +$border-radius-base:        4px !default;
        +$border-radius-large:       6px !default;
        +$border-radius-small:       3px !default;
        +
        +//** Global color for active items (e.g., navs or dropdowns).
        +$component-active-color:    #fff !default;
        +//** Global background color for active items (e.g., navs or dropdowns).
        +$component-active-bg:       $brand-primary !default;
        +
        +//** Width of the `border` for generating carets that indicator dropdowns.
        +$caret-width-base:          4px !default;
        +//** Carets increase slightly in size for larger components.
        +$caret-width-large:         5px !default;
        +
        +
        +//== Tables
        +//
        +//## Customizes the `.table` component with basic values, each used across all table variations.
        +
        +//** Padding for ``s and ``s.
        +$table-cell-padding:            8px !default;
        +//** Padding for cells in `.table-condensed`.
        +$table-condensed-cell-padding:  5px !default;
        +
        +//** Default background color used for all tables.
        +$table-bg:                      transparent !default;
        +//** Background color used for `.table-striped`.
        +$table-bg-accent:               #f9f9f9 !default;
        +//** Background color used for `.table-hover`.
        +$table-bg-hover:                #f5f5f5 !default;
        +$table-bg-active:               $table-bg-hover !default;
        +
        +//** Border color for table and cell borders.
        +$table-border-color:            #ddd !default;
        +
        +
        +//== Buttons
        +//
        +//## For each of Bootstrap's buttons, define text, background and border color.
        +
        +$btn-font-weight:                normal !default;
        +
        +$btn-default-color:              #333 !default;
        +$btn-default-bg:                 #fff !default;
        +$btn-default-border:             #ccc !default;
        +
        +$btn-primary-color:              #fff !default;
        +$btn-primary-bg:                 $brand-primary !default;
        +$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
        +
        +$btn-success-color:              #fff !default;
        +$btn-success-bg:                 $brand-success !default;
        +$btn-success-border:             darken($btn-success-bg, 5%) !default;
        +
        +$btn-info-color:                 #fff !default;
        +$btn-info-bg:                    $brand-info !default;
        +$btn-info-border:                darken($btn-info-bg, 5%) !default;
        +
        +$btn-warning-color:              #fff !default;
        +$btn-warning-bg:                 $brand-warning !default;
        +$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
        +
        +$btn-danger-color:               #fff !default;
        +$btn-danger-bg:                  $brand-danger !default;
        +$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
        +
        +$btn-link-disabled-color:        $gray-light !default;
        +
        +
        +//== Forms
        +//
        +//##
        +
        +//** `` background color
        +$input-bg:                       #fff !default;
        +//** `` background color
        +$input-bg-disabled:              $gray-lighter !default;
        +
        +//** Text color for ``s
        +$input-color:                    $gray !default;
        +//** `` border color
        +$input-border:                   #ccc !default;
        +
        +// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
        +//** Default `.form-control` border radius
        +// This has no effect on ``s in CSS.
        +$input-border-radius:            $border-radius-base !default;
        +//** Large `.form-control` border radius
        +$input-border-radius-large:      $border-radius-large !default;
        +//** Small `.form-control` border radius
        +$input-border-radius-small:      $border-radius-small !default;
        +
        +//** Border color for inputs on focus
        +$input-border-focus:             #66afe9 !default;
        +
        +//** Placeholder text color
        +$input-color-placeholder:        #999 !default;
        +
        +//** Default `.form-control` height
        +$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
        +//** Large `.form-control` height
        +$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
        +//** Small `.form-control` height
        +$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
        +
        +$legend-color:                   $gray-dark !default;
        +$legend-border-color:            #e5e5e5 !default;
        +
        +//** Background color for textual input addons
        +$input-group-addon-bg:           $gray-lighter !default;
        +//** Border color for textual input addons
        +$input-group-addon-border-color: $input-border !default;
        +
        +//** Disabled cursor for form controls and buttons.
        +$cursor-disabled:                not-allowed !default;
        +
        +
        +//== Dropdowns
        +//
        +//## Dropdown menu container and contents.
        +
        +//** Background for the dropdown menu.
        +$dropdown-bg:                    #fff !default;
        +//** Dropdown menu `border-color`.
        +$dropdown-border:                rgba(0,0,0,.15) !default;
        +//** Dropdown menu `border-color` **for IE8**.
        +$dropdown-fallback-border:       #ccc !default;
        +//** Divider color for between dropdown items.
        +$dropdown-divider-bg:            #e5e5e5 !default;
        +
        +//** Dropdown link text color.
        +$dropdown-link-color:            $gray-dark !default;
        +//** Hover color for dropdown links.
        +$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
        +//** Hover background for dropdown links.
        +$dropdown-link-hover-bg:         #f5f5f5 !default;
        +
        +//** Active dropdown menu item text color.
        +$dropdown-link-active-color:     $component-active-color !default;
        +//** Active dropdown menu item background color.
        +$dropdown-link-active-bg:        $component-active-bg !default;
        +
        +//** Disabled dropdown menu item background color.
        +$dropdown-link-disabled-color:   $gray-light !default;
        +
        +//** Text color for headers within dropdown menus.
        +$dropdown-header-color:          $gray-light !default;
        +
        +//** Deprecated `$dropdown-caret-color` as of v3.1.0
        +$dropdown-caret-color:           #000 !default;
        +
        +
        +//-- Z-index master list
        +//
        +// Warning: Avoid customizing these values. They're used for a bird's eye view
        +// of components dependent on the z-axis and are designed to all work together.
        +//
        +// Note: These variables are not generated into the Customizer.
        +
        +$zindex-navbar:            1000 !default;
        +$zindex-dropdown:          1000 !default;
        +$zindex-popover:           1060 !default;
        +$zindex-tooltip:           1070 !default;
        +$zindex-navbar-fixed:      1030 !default;
        +$zindex-modal:             1040 !default;
        +
        +
        +//== Media queries breakpoints
        +//
        +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
        +
        +// Extra small screen / phone
        +//** Deprecated `$screen-xs` as of v3.0.1
        +$screen-xs:                  480px !default;
        +//** Deprecated `$screen-xs-min` as of v3.2.0
        +$screen-xs-min:              $screen-xs !default;
        +//** Deprecated `$screen-phone` as of v3.0.1
        +$screen-phone:               $screen-xs-min !default;
        +
        +// Small screen / tablet
        +//** Deprecated `$screen-sm` as of v3.0.1
        +$screen-sm:                  768px !default;
        +$screen-sm-min:              $screen-sm !default;
        +//** Deprecated `$screen-tablet` as of v3.0.1
        +$screen-tablet:              $screen-sm-min !default;
        +
        +// Medium screen / desktop
        +//** Deprecated `$screen-md` as of v3.0.1
        +$screen-md:                  992px !default;
        +$screen-md-min:              $screen-md !default;
        +//** Deprecated `$screen-desktop` as of v3.0.1
        +$screen-desktop:             $screen-md-min !default;
        +
        +// Large screen / wide desktop
        +//** Deprecated `$screen-lg` as of v3.0.1
        +$screen-lg:                  1200px !default;
        +$screen-lg-min:              $screen-lg !default;
        +//** Deprecated `$screen-lg-desktop` as of v3.0.1
        +$screen-lg-desktop:          $screen-lg-min !default;
        +
        +// So media queries don't overlap when required, provide a maximum
        +$screen-xs-max:              ($screen-sm-min - 1) !default;
        +$screen-sm-max:              ($screen-md-min - 1) !default;
        +$screen-md-max:              ($screen-lg-min - 1) !default;
        +
        +
        +//== Grid system
        +//
        +//## Define your custom responsive grid.
        +
        +//** Number of columns in the grid.
        +$grid-columns:              12 !default;
        +//** Padding between columns. Gets divided in half for the left and right.
        +$grid-gutter-width:         30px !default;
        +// Navbar collapse
        +//** Point at which the navbar becomes uncollapsed.
        +$grid-float-breakpoint:     $screen-sm-min !default;
        +//** Point at which the navbar begins collapsing.
        +$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
        +
        +
        +//== Container sizes
        +//
        +//## Define the maximum width of `.container` for different screen sizes.
        +
        +// Small screen / tablet
        +$container-tablet:             (720px + $grid-gutter-width) !default;
        +//** For `$screen-sm-min` and up.
        +$container-sm:                 $container-tablet !default;
        +
        +// Medium screen / desktop
        +$container-desktop:            (940px + $grid-gutter-width) !default;
        +//** For `$screen-md-min` and up.
        +$container-md:                 $container-desktop !default;
        +
        +// Large screen / wide desktop
        +$container-large-desktop:      (1140px + $grid-gutter-width) !default;
        +//** For `$screen-lg-min` and up.
        +$container-lg:                 $container-large-desktop !default;
        +
        +
        +//== Navbar
        +//
        +//##
        +
        +// Basics of a navbar
        +$navbar-height:                    50px !default;
        +$navbar-margin-bottom:             $line-height-computed !default;
        +$navbar-border-radius:             $border-radius-base !default;
        +$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
        +$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
        +$navbar-collapse-max-height:       340px !default;
        +
        +$navbar-default-color:             #777 !default;
        +$navbar-default-bg:                #f8f8f8 !default;
        +$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
        +
        +// Navbar links
        +$navbar-default-link-color:                #777 !default;
        +$navbar-default-link-hover-color:          #333 !default;
        +$navbar-default-link-hover-bg:             transparent !default;
        +$navbar-default-link-active-color:         #555 !default;
        +$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
        +$navbar-default-link-disabled-color:       #ccc !default;
        +$navbar-default-link-disabled-bg:          transparent !default;
        +
        +// Navbar brand label
        +$navbar-default-brand-color:               $navbar-default-link-color !default;
        +$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
        +$navbar-default-brand-hover-bg:            transparent !default;
        +
        +// Navbar toggle
        +$navbar-default-toggle-hover-bg:           #ddd !default;
        +$navbar-default-toggle-icon-bar-bg:        #888 !default;
        +$navbar-default-toggle-border-color:       #ddd !default;
        +
        +
        +// Inverted navbar
        +// Reset inverted navbar basics
        +$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
        +$navbar-inverse-bg:                         #222 !default;
        +$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
        +
        +// Inverted navbar links
        +$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
        +$navbar-inverse-link-hover-color:           #fff !default;
        +$navbar-inverse-link-hover-bg:              transparent !default;
        +$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
        +$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
        +$navbar-inverse-link-disabled-color:        #444 !default;
        +$navbar-inverse-link-disabled-bg:           transparent !default;
        +
        +// Inverted navbar brand label
        +$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
        +$navbar-inverse-brand-hover-color:          #fff !default;
        +$navbar-inverse-brand-hover-bg:             transparent !default;
        +
        +// Inverted navbar toggle
        +$navbar-inverse-toggle-hover-bg:            #333 !default;
        +$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
        +$navbar-inverse-toggle-border-color:        #333 !default;
        +
        +
        +//== Navs
        +//
        +//##
        +
        +//=== Shared nav styles
        +$nav-link-padding:                          10px 15px !default;
        +$nav-link-hover-bg:                         $gray-lighter !default;
        +
        +$nav-disabled-link-color:                   $gray-light !default;
        +$nav-disabled-link-hover-color:             $gray-light !default;
        +
        +//== Tabs
        +$nav-tabs-border-color:                     #ddd !default;
        +
        +$nav-tabs-link-hover-border-color:          $gray-lighter !default;
        +
        +$nav-tabs-active-link-hover-bg:             $body-bg !default;
        +$nav-tabs-active-link-hover-color:          $gray !default;
        +$nav-tabs-active-link-hover-border-color:   #ddd !default;
        +
        +$nav-tabs-justified-link-border-color:            #ddd !default;
        +$nav-tabs-justified-active-link-border-color:     $body-bg !default;
        +
        +//== Pills
        +$nav-pills-border-radius:                   $border-radius-base !default;
        +$nav-pills-active-link-hover-bg:            $component-active-bg !default;
        +$nav-pills-active-link-hover-color:         $component-active-color !default;
        +
        +
        +//== Pagination
        +//
        +//##
        +
        +$pagination-color:                     $link-color !default;
        +$pagination-bg:                        #fff !default;
        +$pagination-border:                    #ddd !default;
        +
        +$pagination-hover-color:               $link-hover-color !default;
        +$pagination-hover-bg:                  $gray-lighter !default;
        +$pagination-hover-border:              #ddd !default;
        +
        +$pagination-active-color:              #fff !default;
        +$pagination-active-bg:                 $brand-primary !default;
        +$pagination-active-border:             $brand-primary !default;
        +
        +$pagination-disabled-color:            $gray-light !default;
        +$pagination-disabled-bg:               #fff !default;
        +$pagination-disabled-border:           #ddd !default;
        +
        +
        +//== Pager
        +//
        +//##
        +
        +$pager-bg:                             $pagination-bg !default;
        +$pager-border:                         $pagination-border !default;
        +$pager-border-radius:                  15px !default;
        +
        +$pager-hover-bg:                       $pagination-hover-bg !default;
        +
        +$pager-active-bg:                      $pagination-active-bg !default;
        +$pager-active-color:                   $pagination-active-color !default;
        +
        +$pager-disabled-color:                 $pagination-disabled-color !default;
        +
        +
        +//== Jumbotron
        +//
        +//##
        +
        +$jumbotron-padding:              30px !default;
        +$jumbotron-color:                inherit !default;
        +$jumbotron-bg:                   $gray-lighter !default;
        +$jumbotron-heading-color:        inherit !default;
        +$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
        +
        +
        +//== Form states and alerts
        +//
        +//## Define colors for form feedback states and, by default, alerts.
        +
        +$state-success-text:             #3c763d !default;
        +$state-success-bg:               #dff0d8 !default;
        +$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
        +
        +$state-info-text:                #31708f !default;
        +$state-info-bg:                  #d9edf7 !default;
        +$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
        +
        +$state-warning-text:             #8a6d3b !default;
        +$state-warning-bg:               #fcf8e3 !default;
        +$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
        +
        +$state-danger-text:              #a94442 !default;
        +$state-danger-bg:                #f2dede !default;
        +$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
        +
        +
        +//== Tooltips
        +//
        +//##
        +
        +//** Tooltip max width
        +$tooltip-max-width:           200px !default;
        +//** Tooltip text color
        +$tooltip-color:               #fff !default;
        +//** Tooltip background color
        +$tooltip-bg:                  #000 !default;
        +$tooltip-opacity:             .9 !default;
        +
        +//** Tooltip arrow width
        +$tooltip-arrow-width:         5px !default;
        +//** Tooltip arrow color
        +$tooltip-arrow-color:         $tooltip-bg !default;
        +
        +
        +//== Popovers
        +//
        +//##
        +
        +//** Popover body background color
        +$popover-bg:                          #fff !default;
        +//** Popover maximum width
        +$popover-max-width:                   276px !default;
        +//** Popover border color
        +$popover-border-color:                rgba(0,0,0,.2) !default;
        +//** Popover fallback border color
        +$popover-fallback-border-color:       #ccc !default;
        +
        +//** Popover title background color
        +$popover-title-bg:                    darken($popover-bg, 3%) !default;
        +
        +//** Popover arrow width
        +$popover-arrow-width:                 10px !default;
        +//** Popover arrow color
        +$popover-arrow-color:                 $popover-bg !default;
        +
        +//** Popover outer arrow width
        +$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
        +//** Popover outer arrow color
        +$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
        +//** Popover outer arrow fallback color
        +$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
        +
        +
        +//== Labels
        +//
        +//##
        +
        +//** Default label background color
        +$label-default-bg:            $gray-light !default;
        +//** Primary label background color
        +$label-primary-bg:            $brand-primary !default;
        +//** Success label background color
        +$label-success-bg:            $brand-success !default;
        +//** Info label background color
        +$label-info-bg:               $brand-info !default;
        +//** Warning label background color
        +$label-warning-bg:            $brand-warning !default;
        +//** Danger label background color
        +$label-danger-bg:             $brand-danger !default;
        +
        +//** Default label text color
        +$label-color:                 #fff !default;
        +//** Default text color of a linked label
        +$label-link-hover-color:      #fff !default;
        +
        +
        +//== Modals
        +//
        +//##
        +
        +//** Padding applied to the modal body
        +$modal-inner-padding:         15px !default;
        +
        +//** Padding applied to the modal title
        +$modal-title-padding:         15px !default;
        +//** Modal title line-height
        +$modal-title-line-height:     $line-height-base !default;
        +
        +//** Background color of modal content area
        +$modal-content-bg:                             #fff !default;
        +//** Modal content border color
        +$modal-content-border-color:                   rgba(0,0,0,.2) !default;
        +//** Modal content border color **for IE8**
        +$modal-content-fallback-border-color:          #999 !default;
        +
        +//** Modal backdrop background color
        +$modal-backdrop-bg:           #000 !default;
        +//** Modal backdrop opacity
        +$modal-backdrop-opacity:      .5 !default;
        +//** Modal header border color
        +$modal-header-border-color:   #e5e5e5 !default;
        +//** Modal footer border color
        +$modal-footer-border-color:   $modal-header-border-color !default;
        +
        +$modal-lg:                    900px !default;
        +$modal-md:                    600px !default;
        +$modal-sm:                    300px !default;
        +
        +
        +//== Alerts
        +//
        +//## Define alert colors, border radius, and padding.
        +
        +$alert-padding:               15px !default;
        +$alert-border-radius:         $border-radius-base !default;
        +$alert-link-font-weight:      bold !default;
        +
        +$alert-success-bg:            $state-success-bg !default;
        +$alert-success-text:          $state-success-text !default;
        +$alert-success-border:        $state-success-border !default;
        +
        +$alert-info-bg:               $state-info-bg !default;
        +$alert-info-text:             $state-info-text !default;
        +$alert-info-border:           $state-info-border !default;
        +
        +$alert-warning-bg:            $state-warning-bg !default;
        +$alert-warning-text:          $state-warning-text !default;
        +$alert-warning-border:        $state-warning-border !default;
        +
        +$alert-danger-bg:             $state-danger-bg !default;
        +$alert-danger-text:           $state-danger-text !default;
        +$alert-danger-border:         $state-danger-border !default;
        +
        +
        +//== Progress bars
        +//
        +//##
        +
        +//** Background color of the whole progress component
        +$progress-bg:                 #f5f5f5 !default;
        +//** Progress bar text color
        +$progress-bar-color:          #fff !default;
        +//** Variable for setting rounded corners on progress bar.
        +$progress-border-radius:      $border-radius-base !default;
        +
        +//** Default progress bar color
        +$progress-bar-bg:             $brand-primary !default;
        +//** Success progress bar color
        +$progress-bar-success-bg:     $brand-success !default;
        +//** Warning progress bar color
        +$progress-bar-warning-bg:     $brand-warning !default;
        +//** Danger progress bar color
        +$progress-bar-danger-bg:      $brand-danger !default;
        +//** Info progress bar color
        +$progress-bar-info-bg:        $brand-info !default;
        +
        +
        +//== List group
        +//
        +//##
        +
        +//** Background color on `.list-group-item`
        +$list-group-bg:                 #fff !default;
        +//** `.list-group-item` border color
        +$list-group-border:             #ddd !default;
        +//** List group border radius
        +$list-group-border-radius:      $border-radius-base !default;
        +
        +//** Background color of single list items on hover
        +$list-group-hover-bg:           #f5f5f5 !default;
        +//** Text color of active list items
        +$list-group-active-color:       $component-active-color !default;
        +//** Background color of active list items
        +$list-group-active-bg:          $component-active-bg !default;
        +//** Border color of active list elements
        +$list-group-active-border:      $list-group-active-bg !default;
        +//** Text color for content within active list items
        +$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
        +
        +//** Text color of disabled list items
        +$list-group-disabled-color:      $gray-light !default;
        +//** Background color of disabled list items
        +$list-group-disabled-bg:         $gray-lighter !default;
        +//** Text color for content within disabled list items
        +$list-group-disabled-text-color: $list-group-disabled-color !default;
        +
        +$list-group-link-color:         #555 !default;
        +$list-group-link-hover-color:   $list-group-link-color !default;
        +$list-group-link-heading-color: #333 !default;
        +
        +
        +//== Panels
        +//
        +//##
        +
        +$panel-bg:                    #fff !default;
        +$panel-body-padding:          15px !default;
        +$panel-heading-padding:       10px 15px !default;
        +$panel-footer-padding:        $panel-heading-padding !default;
        +$panel-border-radius:         $border-radius-base !default;
        +
        +//** Border color for elements within panels
        +$panel-inner-border:          #ddd !default;
        +$panel-footer-bg:             #f5f5f5 !default;
        +
        +$panel-default-text:          $gray-dark !default;
        +$panel-default-border:        #ddd !default;
        +$panel-default-heading-bg:    #f5f5f5 !default;
        +
        +$panel-primary-text:          #fff !default;
        +$panel-primary-border:        $brand-primary !default;
        +$panel-primary-heading-bg:    $brand-primary !default;
        +
        +$panel-success-text:          $state-success-text !default;
        +$panel-success-border:        $state-success-border !default;
        +$panel-success-heading-bg:    $state-success-bg !default;
        +
        +$panel-info-text:             $state-info-text !default;
        +$panel-info-border:           $state-info-border !default;
        +$panel-info-heading-bg:       $state-info-bg !default;
        +
        +$panel-warning-text:          $state-warning-text !default;
        +$panel-warning-border:        $state-warning-border !default;
        +$panel-warning-heading-bg:    $state-warning-bg !default;
        +
        +$panel-danger-text:           $state-danger-text !default;
        +$panel-danger-border:         $state-danger-border !default;
        +$panel-danger-heading-bg:     $state-danger-bg !default;
        +
        +
        +//== Thumbnails
        +//
        +//##
        +
        +//** Padding around the thumbnail image
        +$thumbnail-padding:           4px !default;
        +//** Thumbnail background color
        +$thumbnail-bg:                $body-bg !default;
        +//** Thumbnail border color
        +$thumbnail-border:            #ddd !default;
        +//** Thumbnail border radius
        +$thumbnail-border-radius:     $border-radius-base !default;
        +
        +//** Custom text color for thumbnail captions
        +$thumbnail-caption-color:     $text-color !default;
        +//** Padding around the thumbnail caption
        +$thumbnail-caption-padding:   9px !default;
        +
        +
        +//== Wells
        +//
        +//##
        +
        +$well-bg:                     #f5f5f5 !default;
        +$well-border:                 darken($well-bg, 7%) !default;
        +
        +
        +//== Badges
        +//
        +//##
        +
        +$badge-color:                 #fff !default;
        +//** Linked badge text color on hover
        +$badge-link-hover-color:      #fff !default;
        +$badge-bg:                    $gray-light !default;
        +
        +//** Badge text color in active nav link
        +$badge-active-color:          $link-color !default;
        +//** Badge background color in active nav link
        +$badge-active-bg:             #fff !default;
        +
        +$badge-font-weight:           bold !default;
        +$badge-line-height:           1 !default;
        +$badge-border-radius:         10px !default;
        +
        +
        +//== Breadcrumbs
        +//
        +//##
        +
        +$breadcrumb-padding-vertical:   8px !default;
        +$breadcrumb-padding-horizontal: 15px !default;
        +//** Breadcrumb background color
        +$breadcrumb-bg:                 #f5f5f5 !default;
        +//** Breadcrumb text color
        +$breadcrumb-color:              #ccc !default;
        +//** Text color of current page in the breadcrumb
        +$breadcrumb-active-color:       $gray-light !default;
        +//** Textual separator for between breadcrumb elements
        +$breadcrumb-separator:          "/" !default;
        +
        +
        +//== Carousel
        +//
        +//##
        +
        +$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
        +
        +$carousel-control-color:                      #fff !default;
        +$carousel-control-width:                      15% !default;
        +$carousel-control-opacity:                    .5 !default;
        +$carousel-control-font-size:                  20px !default;
        +
        +$carousel-indicator-active-bg:                #fff !default;
        +$carousel-indicator-border-color:             #fff !default;
        +
        +$carousel-caption-color:                      #fff !default;
        +
        +
        +//== Close
        +//
        +//##
        +
        +$close-font-weight:           bold !default;
        +$close-color:                 #000 !default;
        +$close-text-shadow:           0 1px 0 #fff !default;
        +
        +
        +//== Code
        +//
        +//##
        +
        +$code-color:                  #c7254e !default;
        +$code-bg:                     #f9f2f4 !default;
        +
        +$kbd-color:                   #fff !default;
        +$kbd-bg:                      #333 !default;
        +
        +$pre-bg:                      #f5f5f5 !default;
        +$pre-color:                   $gray-dark !default;
        +$pre-border-color:            #ccc !default;
        +$pre-scrollable-max-height:   340px !default;
        +
        +
        +//== Type
        +//
        +//##
        +
        +//** Horizontal offset for forms and lists.
        +$component-offset-horizontal: 180px !default;
        +//** Text muted color
        +$text-muted:                  $gray-light !default;
        +//** Abbreviations and acronyms border color
        +$abbr-border-color:           $gray-light !default;
        +//** Headings small color
        +$headings-small-color:        $gray-light !default;
        +//** Blockquote small color
        +$blockquote-small-color:      $gray-light !default;
        +//** Blockquote font size
        +$blockquote-font-size:        ($font-size-base * 1.25) !default;
        +//** Blockquote border color
        +$blockquote-border-color:     $gray-lighter !default;
        +//** Page header border color
        +$page-header-border-color:    $gray-lighter !default;
        +//** Width of horizontal description list titles
        +$dl-horizontal-offset:        $component-offset-horizontal !default;
        +//** Horizontal line color.
        +$hr-border:                   $gray-lighter !default;
        diff --git a/pages/assets/bootstrap/_wells.scss b/pages/assets/bootstrap/_wells.scss
        new file mode 100644
        index 0000000..b865711
        --- /dev/null
        +++ b/pages/assets/bootstrap/_wells.scss
        @@ -0,0 +1,29 @@
        +//
        +// Wells
        +// --------------------------------------------------
        +
        +
        +// Base class
        +.well {
        +  min-height: 20px;
        +  padding: 19px;
        +  margin-bottom: 20px;
        +  background-color: $well-bg;
        +  border: 1px solid $well-border;
        +  border-radius: $border-radius-base;
        +  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
        +  blockquote {
        +    border-color: #ddd;
        +    border-color: rgba(0,0,0,.15);
        +  }
        +}
        +
        +// Sizes
        +.well-lg {
        +  padding: 24px;
        +  border-radius: $border-radius-large;
        +}
        +.well-sm {
        +  padding: 9px;
        +  border-radius: $border-radius-small;
        +}
        diff --git a/pages/assets/bootstrap/mixins/_alerts.scss b/pages/assets/bootstrap/mixins/_alerts.scss
        new file mode 100644
        index 0000000..3faf0b5
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_alerts.scss
        @@ -0,0 +1,14 @@
        +// Alerts
        +
        +@mixin alert-variant($background, $border, $text-color) {
        +  background-color: $background;
        +  border-color: $border;
        +  color: $text-color;
        +
        +  hr {
        +    border-top-color: darken($border, 5%);
        +  }
        +  .alert-link {
        +    color: darken($text-color, 10%);
        +  }
        +}
        diff --git a/pages/assets/bootstrap/mixins/_background-variant.scss b/pages/assets/bootstrap/mixins/_background-variant.scss
        new file mode 100644
        index 0000000..4993bd2
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_background-variant.scss
        @@ -0,0 +1,11 @@
        +// Contextual backgrounds
        +
        +// [converter] $parent hack
        +@mixin bg-variant($parent, $color) {
        +  #{$parent} {
        +    background-color: $color;
        +  }
        +  a#{$parent}:hover {
        +    background-color: darken($color, 10%);
        +  }
        +}
        diff --git a/pages/assets/bootstrap/mixins/_border-radius.scss b/pages/assets/bootstrap/mixins/_border-radius.scss
        new file mode 100644
        index 0000000..ce19499
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_border-radius.scss
        @@ -0,0 +1,18 @@
        +// Single side border-radius
        +
        +@mixin border-top-radius($radius) {
        +  border-top-right-radius: $radius;
        +   border-top-left-radius: $radius;
        +}
        +@mixin border-right-radius($radius) {
        +  border-bottom-right-radius: $radius;
        +     border-top-right-radius: $radius;
        +}
        +@mixin border-bottom-radius($radius) {
        +  border-bottom-right-radius: $radius;
        +   border-bottom-left-radius: $radius;
        +}
        +@mixin border-left-radius($radius) {
        +  border-bottom-left-radius: $radius;
        +     border-top-left-radius: $radius;
        +}
        diff --git a/pages/assets/bootstrap/mixins/_buttons.scss b/pages/assets/bootstrap/mixins/_buttons.scss
        new file mode 100644
        index 0000000..74a4ffc
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_buttons.scss
        @@ -0,0 +1,52 @@
        +// Button variants
        +//
        +// Easily pump out default styles, as well as :hover, :focus, :active,
        +// and disabled options for all buttons
        +
        +@mixin button-variant($color, $background, $border) {
        +  color: $color;
        +  background-color: $background;
        +  border-color: $border;
        +
        +  &:hover,
        +  &:focus,
        +  &.focus,
        +  &:active,
        +  &.active,
        +  .open > &.dropdown-toggle {
        +    color: $color;
        +    background-color: darken($background, 10%);
        +        border-color: darken($border, 12%);
        +  }
        +  &:active,
        +  &.active,
        +  .open > &.dropdown-toggle {
        +    background-image: none;
        +  }
        +  &.disabled,
        +  &[disabled],
        +  fieldset[disabled] & {
        +    &,
        +    &:hover,
        +    &:focus,
        +    &.focus,
        +    &:active,
        +    &.active {
        +      background-color: $background;
        +          border-color: $border;
        +    }
        +  }
        +
        +  .badge {
        +    color: $background;
        +    background-color: $color;
        +  }
        +}
        +
        +// Button sizes
        +@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
        +  padding: $padding-vertical $padding-horizontal;
        +  font-size: $font-size;
        +  line-height: $line-height;
        +  border-radius: $border-radius;
        +}
        diff --git a/pages/assets/bootstrap/mixins/_center-block.scss b/pages/assets/bootstrap/mixins/_center-block.scss
        new file mode 100644
        index 0000000..e06fb5e
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_center-block.scss
        @@ -0,0 +1,7 @@
        +// Center-align a block level element
        +
        +@mixin center-block() {
        +  display: block;
        +  margin-left: auto;
        +  margin-right: auto;
        +}
        diff --git a/pages/assets/bootstrap/mixins/_clearfix.scss b/pages/assets/bootstrap/mixins/_clearfix.scss
        new file mode 100644
        index 0000000..dc3e2ab
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_clearfix.scss
        @@ -0,0 +1,22 @@
        +// Clearfix
        +//
        +// For modern browsers
        +// 1. The space content is one way to avoid an Opera bug when the
        +//    contenteditable attribute is included anywhere else in the document.
        +//    Otherwise it causes space to appear at the top and bottom of elements
        +//    that are clearfixed.
        +// 2. The use of `table` rather than `block` is only necessary if using
        +//    `:before` to contain the top-margins of child elements.
        +//
        +// Source: http://nicolasgallagher.com/micro-clearfix-hack/
        +
        +@mixin clearfix() {
        +  &:before,
        +  &:after {
        +    content: " "; // 1
        +    display: table; // 2
        +  }
        +  &:after {
        +    clear: both;
        +  }
        +}
        diff --git a/pages/assets/bootstrap/mixins/_forms.scss b/pages/assets/bootstrap/mixins/_forms.scss
        new file mode 100644
        index 0000000..277aa5f
        --- /dev/null
        +++ b/pages/assets/bootstrap/mixins/_forms.scss
        @@ -0,0 +1,88 @@
        +// Form validation states
        +//
        +// Used in forms.less to generate the form validation CSS for warnings, errors,
        +// and successes.
        +
        +@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
        +  // Color the label and help text
        +  .help-block,
        +  .control-label,
        +  .radio,
        +  .checkbox,
        +  .radio-inline,
        +  .checkbox-inline,
        +  &.radio label,
        +  &.checkbox label,
        +  &.radio-inline label,
        +  &.checkbox-inline label  {
        +    color: $text-color;
        +  }
        +  // Set the border and box shadow on specific inputs to match
        +  .form-control {
        +    border-color: $border-color;
        +    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
        +    &:focus {
        +      border-color: darken($border-color, 10%);
        +      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
        +      @include box-shadow($shadow);
        +    }
        +  }
        +  // Set validation states also for addons
        +  .input-group-addon {
        +    color: $text-color;
        +    border-color: $border-color;
        +    background-color: $background-color;
        +  }
        +  // Optional feedback icon
        +  .form-control-feedback {
        +    color: $text-color;
        +  }
        +}
        +
        +
        +// Form control focus state
        +//
        +// Generate a customized focus state and for any input with the specified color,
        +// which defaults to the `$input-border-focus` variable.
        +//
        +// We highly encourage you to not customize the default value, but instead use
        +// this to tweak colors on an as-needed basis. This aesthetic change is based on
        +// WebKit's default styles, but applicable to a wider range of browsers. Its
        +// usability and accessibility should be taken into account with any change.
        +//
        +// Example usage: change the default blue border and shadow to white for better
        +// contrast against a dark gray background.
        +@mixin form-control-focus($color: $input-border-focus) {
        +  $color-rgba: rgba(red($color), green($color), blue($color), .6);
        +  &:focus {
        +    border-color: $color;
        +    outline: 0;
        +    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
        +  }
        +}
        +
        +// Form control sizing
        +//
        +// Relative text size, padding, and border-radii changes for form controls. For
        +// horizontal sizing, wrap controls in the predefined grid classes. `