diff --git a/Gruntfile.js b/Gruntfile.js index 749eddc80..eb7fd563a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,64 +1,26 @@ -/** - * @file - */ module.exports = function(grunt) { - - // This is where we configure each task that we'd like to run. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), - availabletasks: { - tasks: {} - }, - sasslint: { - options: { - configFile: '.sass-lint.yml' - }, - target: ['core/\*\*/\*.scss'] - }, sass: { - // This will compile all of our sass files - // Additional configuration options can be found at https://github.com/sindresorhus/grunt-sass options: { - includePaths: [ - "node_modules/bourbon/core", - "node_modules/bourbon-neat/core", - "node_modules/font-awesome/scss", - "node_modules/normalize.css", - "node_modules/neat-omega/core", - "node_modules", - "core" - ], - sourceMap: true, - // This controls the compiled css and can be changed to nested, compact or compressed. - outputStyle: 'expanded', - precision: 10, + lineNumbers: true, + sourcemap: 'none' }, dist: { files: { - // 'examples/mixins/color-system/css/style.css': 'examples/mixins/color-system/scss/style.scss' + 'css/decanter.css': 'scss/decanter.scss', } } }, watch: { css: { - files: [ - 'core/**/*.scss' - ], - tasks: ['sass', 'sassdoc'], - options: { - interrupt: true - } + files: '**/*.scss', + tasks: ['sass'] } } }); - - // This is where we tell Grunt we plan to use this plug-in. - grunt.loadNpmTasks('grunt-available-tasks'); - grunt.loadNpmTasks('grunt-sassdoc'); - grunt.loadNpmTasks('grunt-sass-lint'); grunt.loadNpmTasks('grunt-sass'); + grunt.loadNpmTasks('grunt-contrib-sass'); grunt.loadNpmTasks('grunt-contrib-watch'); - - // This is where we tell Grunt what to do when we type "grunt" into the terminal. - grunt.registerTask('default', ['availabletasks']); -}; + grunt.registerTask('default', ['watch']); +} diff --git a/README.md b/README.md index 6bbf1546f..932fd4ce8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # [Decanter](https://github.com/SU-SWS/decanter) -##### Version: 0.0.0 - -Maintainers: [kgcreative](https://github.com/kgcreative), [sherakama](https://github.com/sherakama) +##### Version: 2.0.0 Changelog: [CHANGELOG.md](CHANGELOG.md) @@ -16,75 +14,3 @@ Accessibility [![WCAG Conformance 2.0 AA Badge](https://www.w3.org/WAI/wcag2AA-blue.png)](https://www.w3.org/TR/WCAG20/) Evaluation Date: 201X-XX-XX This project conforms to level AA WCAG 2.0 standards as required by the university's accessibility policy. For more information on the policy please visit: [https://ucomm.stanford.edu/policies/accessibility-policy.html](https://ucomm.stanford.edu/policies/accessibility-policy.html). - -Installation ---- - -You can require this project as part of your project through NPM. - -``` -npm install su-sws/decanter --save-dev -``` - -If you are using a node based compiler you can tell the sass compiler to look -in to node_modules when using @import statements. Please see: -[https://github.com/sass/node-sass#includepaths](https://github.com/sass/node-sass#includepaths) - -Grunt Example: -```javascript -module.exports = function(grunt) { - grunt.initConfig({ - sass: { - // This will compile all of our sass files - // Additional configuration options can be found at https://github.com/sindresorhus/grunt-sass - options: { - includePaths: [ - "node_modules/bourbon/core", - "node_modules/bourbon-neat/core", - "node_modules/decanter/core", // <-- this one will allow you to import decanter. - "node_modules" - ], - sourceMap: true, - // This controls the compiled css and can be changed to nested, compact or compressed. - outputStyle: 'expanded', - precision: 10 - }, - dist: { - files: { - 'css/my-stylesheet.css': 'scss/my-sass-sheet.scss' - } - } - } - }) -}; -``` - -Then in your sass files you can import any part of the project. - -Example: - -```sass - // Everything. - @import "decanter/main"; - - // Just a component. - @import "decanter/components/my-component"; -``` - -Configuration ---- - -Please see [docs/CONFIGURATION.md](docs/CONFIGURATION.md) document. - - -Troubleshooting ---- - -If you are experiencing issues with this please have a look at the examples section first. If the examples fail to provide you the answer you are looking for please have a visit to the Github issue tracker. The issue tracker is not a personal support queue but rather, a place to post reproducible bugs. - -Developer ---- - -If you wish to contribute to this project please see the [CONTRIBUTING.md](CONTRIBUTING.md) document for more information. - -The development standards and best practices can be found in the (docs)[docs] section. diff --git a/core/decanter.scss b/core/decanter.scss deleted file mode 100644 index 72af3c93e..000000000 --- a/core/decanter.scss +++ /dev/null @@ -1,3 +0,0 @@ -@charset "UTF-8"; - -// Welcome to the start of version 2.0 diff --git a/css/decanter.css b/css/decanter.css new file mode 100644 index 000000000..47a47770c --- /dev/null +++ b/css/decanter.css @@ -0,0 +1,4467 @@ +/*! uswds v1.3.1 */ +html { + box-sizing: border-box; +} + +*, *::after, *::before { + box-sizing: inherit; +} + +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device 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/10/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 of focused elements when they are also in an + * active/hover state. + */ +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 { + 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"], +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. + */ +input[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + box-sizing: content-box; + /* 2 */ +} + +/** + * 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; +} + +/* stylelint-disable at-rule-empty-line-before */ +@font-face { + font-family: "Source Sans Pro"; + font-style: normal; + font-weight: 300; + src: url("../fonts/sourcesanspro-light-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-light-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-light-webfont.woff") format("woff"), url("../fonts/sourcesanspro-light-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Source Sans Pro"; + font-style: normal; + font-weight: 400; + src: url("../fonts/sourcesanspro-regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-regular-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-regular-webfont.woff") format("woff"), url("../fonts/sourcesanspro-regular-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Source Sans Pro"; + font-style: italic; + font-weight: 400; + src: url("../fonts/sourcesanspro-italic-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-italic-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-italic-webfont.woff") format("woff"), url("../fonts/sourcesanspro-italic-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Source Sans Pro"; + font-style: normal; + font-weight: 700; + src: url("../fonts/sourcesanspro-bold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-bold-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-bold-webfont.woff") format("woff"), url("../fonts/sourcesanspro-bold-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Merriweather"; + font-style: normal; + font-weight: 300; + src: url("../fonts/merriweather-light-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-light-webfont.woff2") format("woff2"), url("../fonts/merriweather-light-webfont.woff") format("woff"), url("../fonts/merriweather-light-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Merriweather"; + font-style: normal; + font-weight: 400; + src: url("../fonts/merriweather-regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-regular-webfont.woff2") format("woff2"), url("../fonts/merriweather-regular-webfont.woff") format("woff"), url("../fonts/merriweather-regular-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Merriweather"; + font-style: italic; + font-weight: 400; + src: url("../fonts/merriweather-italic-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-italic-webfont.woff2") format("woff2"), url("../fonts/merriweather-italic-webfont.woff") format("woff"), url("../fonts/merriweather-italic-webfont.ttf") format("truetype"); +} + +@font-face { + font-family: "Merriweather"; + font-style: normal; + font-weight: 700; + src: url("../fonts/merriweather-bold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-bold-webfont.woff2") format("woff2"), url("../fonts/merriweather-bold-webfont.woff") format("woff"), url("../fonts/merriweather-bold-webfont.ttf") format("truetype"); +} + +/* stylelint-enable */ +html { + box-sizing: border-box; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +body { + background-color: #ffffff; + overflow-x: hidden; +} + +.lt-ie9 * { + -webkit-filter: none !important; + filter: none !important; + /* stylelint-disable-line declaration-no-important */ +} + +[hidden] { + display: none !important; + /* stylelint-disable-line declaration-no-important */ +} + +.usa-grid, +.usa-grid-full { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + max-width: 1040px; +} + +.usa-grid::after, +.usa-grid-full::after { + clear: both; + content: ""; + display: block; +} + +.usa-grid { + padding-right: 1.5rem; + padding-left: 1.5rem; +} + +@media screen and (min-width: 600px) { + .usa-grid { + padding-right: 3rem; + padding-left: 3rem; + } +} + +.usa-grid-full { + padding: 0; +} + +@media screen and (min-width: 600px) { + .usa-width-one-whole { + float: left; + display: block; + margin-right: 4.82916%; + width: 100%; + } + .usa-width-one-whole:last-child { + margin-right: 0; + } + .usa-width-one-half { + float: left; + display: block; + margin-right: 4.82916%; + width: 47.58542%; + } + .usa-width-one-half:last-child { + margin-right: 0; + } + .usa-width-one-third { + float: left; + display: block; + margin-right: 4.82916%; + width: 30.11389%; + } + .usa-width-one-third:last-child { + margin-right: 0; + } + .usa-width-two-thirds { + float: left; + display: block; + margin-right: 4.82916%; + width: 65.05695%; + } + .usa-width-two-thirds:last-child { + margin-right: 0; + } + .usa-width-one-fourth { + float: left; + display: block; + margin-right: 4.82916%; + width: 47.58542%; + } + .usa-width-one-fourth:last-child { + margin-right: 0; + } + .usa-width-one-fourth:nth-child(2n) { + margin-right: 0; + } + .usa-width-three-fourths { + float: left; + display: block; + margin-right: 4.82916%; + width: 100%; + } + .usa-width-three-fourths:last-child { + margin-right: 0; + } + .usa-width-one-sixth { + float: left; + display: block; + margin-right: 4.82916%; + width: 30.11389%; + } + .usa-width-one-sixth:last-child { + margin-right: 0; + } + .usa-width-one-sixth:nth-child(3n) { + margin-right: 0; + } + .usa-width-five-sixths { + float: left; + display: block; + margin-right: 4.82916%; + width: 65.05695%; + } + .usa-width-five-sixths:last-child { + margin-right: 0; + } + .usa-width-one-twelfth { + float: left; + display: block; + margin-right: 4.82916%; + width: 30.11389%; + } + .usa-width-one-twelfth:last-child { + margin-right: 0; + } + .usa-width-one-twelfth:nth-child(3n) { + margin-right: 0; + } + .usa-width-five-twelfths { + float: left; + display: block; + margin-right: 4.82916%; + width: 30.11389%; + } + .usa-width-five-twelfths:last-child { + margin-right: 0; + } + .usa-width-seven-twelfths { + float: left; + display: block; + margin-right: 4.82916%; + width: 65.05695%; + } + .usa-width-seven-twelfths:last-child { + margin-right: 0; + } +} + +@media screen and (min-width: 1201px) { + .usa-width-one-whole { + float: left; + display: block; + margin-right: 2.35765%; + width: 100%; + } + .usa-width-one-whole:last-child { + margin-right: 0; + } + .usa-width-one-half { + float: left; + display: block; + margin-right: 2.35765%; + width: 48.82117%; + } + .usa-width-one-half:last-child { + margin-right: 0; + } + .usa-width-one-third { + float: left; + display: block; + margin-right: 2.35765%; + width: 31.76157%; + } + .usa-width-one-third:last-child { + margin-right: 0; + } + .usa-width-two-thirds { + float: left; + display: block; + margin-right: 2.35765%; + width: 65.88078%; + } + .usa-width-two-thirds:last-child { + margin-right: 0; + } + .usa-width-one-fourth { + float: left; + display: block; + margin-right: 2.35765%; + width: 23.23176%; + } + .usa-width-one-fourth:last-child { + margin-right: 0; + } + .usa-width-one-fourth:nth-child(2n) { + float: left; + display: block; + margin-right: 2.35765%; + width: 23.23176%; + } + .usa-width-one-fourth:nth-child(2n):last-child { + margin-right: 0; + } + .usa-width-one-fourth:nth-child(4n) { + margin-right: 0; + } + .usa-width-three-fourths { + float: left; + display: block; + margin-right: 2.35765%; + width: 74.41059%; + } + .usa-width-three-fourths:last-child { + margin-right: 0; + } + .usa-width-one-sixth { + float: left; + display: block; + margin-right: 2.35765%; + width: 14.70196%; + } + .usa-width-one-sixth:last-child { + margin-right: 0; + } + .usa-width-one-sixth:nth-child(3n) { + float: left; + display: block; + margin-right: 2.35765%; + width: 14.70196%; + } + .usa-width-one-sixth:nth-child(3n):last-child { + margin-right: 0; + } + .usa-width-one-sixth:nth-child(6n) { + margin-right: 0; + } + .usa-width-five-sixths { + float: left; + display: block; + margin-right: 2.35765%; + width: 82.94039%; + } + .usa-width-five-sixths:last-child { + margin-right: 0; + } + .usa-width-one-twelfth { + float: left; + display: block; + margin-right: 2.35765%; + width: 6.17215%; + } + .usa-width-one-twelfth:last-child { + margin-right: 0; + } + .usa-width-one-twelfth:nth-child(3n) { + float: left; + display: block; + margin-right: 2.35765%; + width: 6.17215%; + } + .usa-width-one-twelfth:nth-child(3n):last-child { + margin-right: 0; + } + .usa-width-one-twelfth:nth-child(12n) { + margin-right: 0; + } + .usa-width-five-twelfths { + float: left; + display: block; + margin-right: 2.35765%; + width: 40.29137%; + } + .usa-width-five-twelfths:last-child { + margin-right: 0; + } + .usa-width-seven-twelfths { + float: left; + display: block; + margin-right: 2.35765%; + width: 57.35098%; + } + .usa-width-seven-twelfths:last-child { + margin-right: 0; + } +} + +.usa-end-row { + margin-right: 0; +} + +.usa-offset-one-twelfth { + margin-left: 8.5298%; +} + +.usa-offset-one-sixth { + margin-left: 17.05961%; +} + +.usa-offset-one-fourth { + margin-left: 25.58941%; +} + +.usa-offset-one-third { + margin-left: 34.11922%; +} + +.usa-offset-five-twelfths { + margin-left: 42.64902%; +} + +.usa-offset-one-half { + margin-left: 51.17883%; +} + +.usa-offset-seven-twelfths { + margin-left: 59.70863%; +} + +.usa-offset-two-thirds { + margin-left: 68.23843%; +} + +.usa-offset-three-fourths { + margin-left: 76.76824%; +} + +.usa-offset-five-sixths { + margin-left: 85.29804%; +} + +.usa-offset-eleven-twelfths { + margin-left: 93.82785%; +} + +.usa-sr-only { + position: absolute; + left: -999em; +} + +/* stylelint-disable selector-no-qualifying-type */ +.usa-button, +.usa-button-primary, +.usa-button:visited, +.usa-button-primary:visited, +button, +[type=button], +[type=submit], +[type=reset], +[type=image] { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + margin-top: 0.5em; + margin-right: 0.5em; + margin-bottom: 0.5em; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #0071bc; + border: 0; + border-radius: 3px; + color: #ffffff; + cursor: pointer; + display: inline-block; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + font-size: 1.7rem; + font-weight: 700; + line-height: 1; + outline: none; + padding: 1rem 2rem; + text-align: center; + text-decoration: none; + width: 100%; +} + +@media screen and (min-width: 481px) { + .usa-button, + .usa-button-primary, + .usa-button:visited, + .usa-button-primary:visited, + button, + [type=button], + [type=submit], + [type=reset], + [type=image] { + width: auto; + } +} + +.usa-button:hover, .usa-button.usa-button-hover, +.usa-button-primary:hover, +.usa-button-primary.usa-button-hover, +.usa-button:visited:hover, +.usa-button:visited.usa-button-hover, +.usa-button-primary:visited:hover, +.usa-button-primary:visited.usa-button-hover, +button:hover, +button.usa-button-hover, +[type=button]:hover, +[type=button].usa-button-hover, +[type=submit]:hover, +[type=submit].usa-button-hover, +[type=reset]:hover, +[type=reset].usa-button-hover, +[type=image]:hover, +[type=image].usa-button-hover { + background-color: #205493; + border-bottom: 0; + color: #ffffff; + text-decoration: none; +} + +.usa-button:focus, .usa-button.usa-button-focus, +.usa-button-primary:focus, +.usa-button-primary.usa-button-focus, +.usa-button:visited:focus, +.usa-button:visited.usa-button-focus, +.usa-button-primary:visited:focus, +.usa-button-primary:visited.usa-button-focus, +button:focus, +button.usa-button-focus, +[type=button]:focus, +[type=button].usa-button-focus, +[type=submit]:focus, +[type=submit].usa-button-focus, +[type=reset]:focus, +[type=reset].usa-button-focus, +[type=image]:focus, +[type=image].usa-button-focus { + box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +.usa-button:active, .usa-button.usa-button-active, +.usa-button-primary:active, +.usa-button-primary.usa-button-active, +.usa-button:visited:active, +.usa-button:visited.usa-button-active, +.usa-button-primary:visited:active, +.usa-button-primary:visited.usa-button-active, +button:active, +button.usa-button-active, +[type=button]:active, +[type=button].usa-button-active, +[type=submit]:active, +[type=submit].usa-button-active, +[type=reset]:active, +[type=reset].usa-button-active, +[type=image]:active, +[type=image].usa-button-active { + background-color: #112e51; +} + +.usa-button.usa-button-primary-alt, +.usa-button-primary.usa-button-primary-alt, +.usa-button:visited.usa-button-primary-alt, +.usa-button-primary:visited.usa-button-primary-alt, +button.usa-button-primary-alt, +[type=button].usa-button-primary-alt, +[type=submit].usa-button-primary-alt, +[type=reset].usa-button-primary-alt, +[type=image].usa-button-primary-alt { + background-color: #02bfe7; + color: #212121; +} + +.usa-button.usa-button-primary-alt:hover, .usa-button.usa-button-primary-alt.usa-button-hover, +.usa-button-primary.usa-button-primary-alt:hover, +.usa-button-primary.usa-button-primary-alt.usa-button-hover, +.usa-button:visited.usa-button-primary-alt:hover, +.usa-button:visited.usa-button-primary-alt.usa-button-hover, +.usa-button-primary:visited.usa-button-primary-alt:hover, +.usa-button-primary:visited.usa-button-primary-alt.usa-button-hover, +button.usa-button-primary-alt:hover, +button.usa-button-primary-alt.usa-button-hover, +[type=button].usa-button-primary-alt:hover, +[type=button].usa-button-primary-alt.usa-button-hover, +[type=submit].usa-button-primary-alt:hover, +[type=submit].usa-button-primary-alt.usa-button-hover, +[type=reset].usa-button-primary-alt:hover, +[type=reset].usa-button-primary-alt.usa-button-hover, +[type=image].usa-button-primary-alt:hover, +[type=image].usa-button-primary-alt.usa-button-hover { + background-color: #00a6d2; +} + +.usa-button.usa-button-primary-alt:active, .usa-button.usa-button-primary-alt.usa-button-active, +.usa-button-primary.usa-button-primary-alt:active, +.usa-button-primary.usa-button-primary-alt.usa-button-active, +.usa-button:visited.usa-button-primary-alt:active, +.usa-button:visited.usa-button-primary-alt.usa-button-active, +.usa-button-primary:visited.usa-button-primary-alt:active, +.usa-button-primary:visited.usa-button-primary-alt.usa-button-active, +button.usa-button-primary-alt:active, +button.usa-button-primary-alt.usa-button-active, +[type=button].usa-button-primary-alt:active, +[type=button].usa-button-primary-alt.usa-button-active, +[type=submit].usa-button-primary-alt:active, +[type=submit].usa-button-primary-alt.usa-button-active, +[type=reset].usa-button-primary-alt:active, +[type=reset].usa-button-primary-alt.usa-button-active, +[type=image].usa-button-primary-alt:active, +[type=image].usa-button-primary-alt.usa-button-active { + background-color: #046b99; + color: #ffffff; +} + +.usa-button.usa-button-secondary, +.usa-button-primary.usa-button-secondary, +.usa-button:visited.usa-button-secondary, +.usa-button-primary:visited.usa-button-secondary, +button.usa-button-secondary, +[type=button].usa-button-secondary, +[type=submit].usa-button-secondary, +[type=reset].usa-button-secondary, +[type=image].usa-button-secondary { + background-color: #e31c3d; +} + +.usa-button.usa-button-secondary:hover, .usa-button.usa-button-secondary.usa-button-hover, +.usa-button-primary.usa-button-secondary:hover, +.usa-button-primary.usa-button-secondary.usa-button-hover, +.usa-button:visited.usa-button-secondary:hover, +.usa-button:visited.usa-button-secondary.usa-button-hover, +.usa-button-primary:visited.usa-button-secondary:hover, +.usa-button-primary:visited.usa-button-secondary.usa-button-hover, +button.usa-button-secondary:hover, +button.usa-button-secondary.usa-button-hover, +[type=button].usa-button-secondary:hover, +[type=button].usa-button-secondary.usa-button-hover, +[type=submit].usa-button-secondary:hover, +[type=submit].usa-button-secondary.usa-button-hover, +[type=reset].usa-button-secondary:hover, +[type=reset].usa-button-secondary.usa-button-hover, +[type=image].usa-button-secondary:hover, +[type=image].usa-button-secondary.usa-button-hover { + background-color: #cd2026; +} + +.usa-button.usa-button-secondary:active, .usa-button.usa-button-secondary.usa-button-active, +.usa-button-primary.usa-button-secondary:active, +.usa-button-primary.usa-button-secondary.usa-button-active, +.usa-button:visited.usa-button-secondary:active, +.usa-button:visited.usa-button-secondary.usa-button-active, +.usa-button-primary:visited.usa-button-secondary:active, +.usa-button-primary:visited.usa-button-secondary.usa-button-active, +button.usa-button-secondary:active, +button.usa-button-secondary.usa-button-active, +[type=button].usa-button-secondary:active, +[type=button].usa-button-secondary.usa-button-active, +[type=submit].usa-button-secondary:active, +[type=submit].usa-button-secondary.usa-button-active, +[type=reset].usa-button-secondary:active, +[type=reset].usa-button-secondary.usa-button-active, +[type=image].usa-button-secondary:active, +[type=image].usa-button-secondary.usa-button-active { + background-color: #981b1e; +} + +.usa-button.usa-button-gray, +.usa-button-primary.usa-button-gray, +.usa-button:visited.usa-button-gray, +.usa-button-primary:visited.usa-button-gray, +button.usa-button-gray, +[type=button].usa-button-gray, +[type=submit].usa-button-gray, +[type=reset].usa-button-gray, +[type=image].usa-button-gray { + background-color: #5b616b; +} + +.usa-button.usa-button-gray:hover, .usa-button.usa-button-gray.usa-button-hover, +.usa-button-primary.usa-button-gray:hover, +.usa-button-primary.usa-button-gray.usa-button-hover, +.usa-button:visited.usa-button-gray:hover, +.usa-button:visited.usa-button-gray.usa-button-hover, +.usa-button-primary:visited.usa-button-gray:hover, +.usa-button-primary:visited.usa-button-gray.usa-button-hover, +button.usa-button-gray:hover, +button.usa-button-gray.usa-button-hover, +[type=button].usa-button-gray:hover, +[type=button].usa-button-gray.usa-button-hover, +[type=submit].usa-button-gray:hover, +[type=submit].usa-button-gray.usa-button-hover, +[type=reset].usa-button-gray:hover, +[type=reset].usa-button-gray.usa-button-hover, +[type=image].usa-button-gray:hover, +[type=image].usa-button-gray.usa-button-hover { + background-color: #323a45; +} + +.usa-button.usa-button-gray:active, .usa-button.usa-button-gray.usa-button-active, +.usa-button-primary.usa-button-gray:active, +.usa-button-primary.usa-button-gray.usa-button-active, +.usa-button:visited.usa-button-gray:active, +.usa-button:visited.usa-button-gray.usa-button-active, +.usa-button-primary:visited.usa-button-gray:active, +.usa-button-primary:visited.usa-button-gray.usa-button-active, +button.usa-button-gray:active, +button.usa-button-gray.usa-button-active, +[type=button].usa-button-gray:active, +[type=button].usa-button-gray.usa-button-active, +[type=submit].usa-button-gray:active, +[type=submit].usa-button-gray.usa-button-active, +[type=reset].usa-button-gray:active, +[type=reset].usa-button-gray.usa-button-active, +[type=image].usa-button-gray:active, +[type=image].usa-button-gray.usa-button-active { + background-color: #212121; +} + +.usa-button.usa-button-outline, +.usa-button-primary.usa-button-outline, +.usa-button:visited.usa-button-outline, +.usa-button-primary:visited.usa-button-outline, +button.usa-button-outline, +[type=button].usa-button-outline, +[type=submit].usa-button-outline, +[type=reset].usa-button-outline, +[type=image].usa-button-outline { + background-color: #ffffff; + box-shadow: inset 0 0 0 2px #0071bc; + color: #0071bc; +} + +.usa-button.usa-button-outline:hover, .usa-button.usa-button-outline.usa-button-hover, +.usa-button-primary.usa-button-outline:hover, +.usa-button-primary.usa-button-outline.usa-button-hover, +.usa-button:visited.usa-button-outline:hover, +.usa-button:visited.usa-button-outline.usa-button-hover, +.usa-button-primary:visited.usa-button-outline:hover, +.usa-button-primary:visited.usa-button-outline.usa-button-hover, +button.usa-button-outline:hover, +button.usa-button-outline.usa-button-hover, +[type=button].usa-button-outline:hover, +[type=button].usa-button-outline.usa-button-hover, +[type=submit].usa-button-outline:hover, +[type=submit].usa-button-outline.usa-button-hover, +[type=reset].usa-button-outline:hover, +[type=reset].usa-button-outline.usa-button-hover, +[type=image].usa-button-outline:hover, +[type=image].usa-button-outline.usa-button-hover { + box-shadow: inset 0 0 0 2px #205493; + color: #205493; +} + +.usa-button.usa-button-outline:active, .usa-button.usa-button-outline.usa-button-active, +.usa-button-primary.usa-button-outline:active, +.usa-button-primary.usa-button-outline.usa-button-active, +.usa-button:visited.usa-button-outline:active, +.usa-button:visited.usa-button-outline.usa-button-active, +.usa-button-primary:visited.usa-button-outline:active, +.usa-button-primary:visited.usa-button-outline.usa-button-active, +button.usa-button-outline:active, +button.usa-button-outline.usa-button-active, +[type=button].usa-button-outline:active, +[type=button].usa-button-outline.usa-button-active, +[type=submit].usa-button-outline:active, +[type=submit].usa-button-outline.usa-button-active, +[type=reset].usa-button-outline:active, +[type=reset].usa-button-outline.usa-button-active, +[type=image].usa-button-outline:active, +[type=image].usa-button-outline.usa-button-active { + box-shadow: inset 0 0 0 2px #112e51; + color: #112e51; +} + +.usa-button.usa-button-outline:focus, .usa-button.usa-button-outline.usa-button-focus, +.usa-button-primary.usa-button-outline:focus, +.usa-button-primary.usa-button-outline.usa-button-focus, +.usa-button:visited.usa-button-outline:focus, +.usa-button:visited.usa-button-outline.usa-button-focus, +.usa-button-primary:visited.usa-button-outline:focus, +.usa-button-primary:visited.usa-button-outline.usa-button-focus, +button.usa-button-outline:focus, +button.usa-button-outline.usa-button-focus, +[type=button].usa-button-outline:focus, +[type=button].usa-button-outline.usa-button-focus, +[type=submit].usa-button-outline:focus, +[type=submit].usa-button-outline.usa-button-focus, +[type=reset].usa-button-outline:focus, +[type=reset].usa-button-outline.usa-button-focus, +[type=image].usa-button-outline:focus, +[type=image].usa-button-outline.usa-button-focus { + box-shadow: inset 0 0 0 2px #112e51, 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +.usa-button.usa-button-outline-inverse, +.usa-button-primary.usa-button-outline-inverse, +.usa-button:visited.usa-button-outline-inverse, +.usa-button-primary:visited.usa-button-outline-inverse, +button.usa-button-outline-inverse, +[type=button].usa-button-outline-inverse, +[type=submit].usa-button-outline-inverse, +[type=reset].usa-button-outline-inverse, +[type=image].usa-button-outline-inverse { + background: transparent; + box-shadow: inset 0 0 0 2px #ffffff; + color: #ffffff; +} + +.usa-button.usa-button-outline-inverse:hover, .usa-button.usa-button-outline-inverse.usa-button-hover, +.usa-button-primary.usa-button-outline-inverse:hover, +.usa-button-primary.usa-button-outline-inverse.usa-button-hover, +.usa-button:visited.usa-button-outline-inverse:hover, +.usa-button:visited.usa-button-outline-inverse.usa-button-hover, +.usa-button-primary:visited.usa-button-outline-inverse:hover, +.usa-button-primary:visited.usa-button-outline-inverse.usa-button-hover, +button.usa-button-outline-inverse:hover, +button.usa-button-outline-inverse.usa-button-hover, +[type=button].usa-button-outline-inverse:hover, +[type=button].usa-button-outline-inverse.usa-button-hover, +[type=submit].usa-button-outline-inverse:hover, +[type=submit].usa-button-outline-inverse.usa-button-hover, +[type=reset].usa-button-outline-inverse:hover, +[type=reset].usa-button-outline-inverse.usa-button-hover, +[type=image].usa-button-outline-inverse:hover, +[type=image].usa-button-outline-inverse.usa-button-hover { + box-shadow: inset 0 0 0 2px #d6d7d9; + color: #d6d7d9; +} + +.usa-button.usa-button-outline-inverse:active, .usa-button.usa-button-outline-inverse.usa-button-active, +.usa-button-primary.usa-button-outline-inverse:active, +.usa-button-primary.usa-button-outline-inverse.usa-button-active, +.usa-button:visited.usa-button-outline-inverse:active, +.usa-button:visited.usa-button-outline-inverse.usa-button-active, +.usa-button-primary:visited.usa-button-outline-inverse:active, +.usa-button-primary:visited.usa-button-outline-inverse.usa-button-active, +button.usa-button-outline-inverse:active, +button.usa-button-outline-inverse.usa-button-active, +[type=button].usa-button-outline-inverse:active, +[type=button].usa-button-outline-inverse.usa-button-active, +[type=submit].usa-button-outline-inverse:active, +[type=submit].usa-button-outline-inverse.usa-button-active, +[type=reset].usa-button-outline-inverse:active, +[type=reset].usa-button-outline-inverse.usa-button-active, +[type=image].usa-button-outline-inverse:active, +[type=image].usa-button-outline-inverse.usa-button-active { + box-shadow: inset 0 0 0 2px #aeb0b5; + color: #d6d7d9; +} + +.usa-button.usa-button-outline-inverse:focus, .usa-button.usa-button-outline-inverse.usa-button-focus, +.usa-button-primary.usa-button-outline-inverse:focus, +.usa-button-primary.usa-button-outline-inverse.usa-button-focus, +.usa-button:visited.usa-button-outline-inverse:focus, +.usa-button:visited.usa-button-outline-inverse.usa-button-focus, +.usa-button-primary:visited.usa-button-outline-inverse:focus, +.usa-button-primary:visited.usa-button-outline-inverse.usa-button-focus, +button.usa-button-outline-inverse:focus, +button.usa-button-outline-inverse.usa-button-focus, +[type=button].usa-button-outline-inverse:focus, +[type=button].usa-button-outline-inverse.usa-button-focus, +[type=submit].usa-button-outline-inverse:focus, +[type=submit].usa-button-outline-inverse.usa-button-focus, +[type=reset].usa-button-outline-inverse:focus, +[type=reset].usa-button-outline-inverse.usa-button-focus, +[type=image].usa-button-outline-inverse:focus, +[type=image].usa-button-outline-inverse.usa-button-focus { + box-shadow: inset 0 0 0 2px #aeb0b5, 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +.usa-button.usa-button-big, +.usa-button-primary.usa-button-big, +.usa-button:visited.usa-button-big, +.usa-button-primary:visited.usa-button-big, +button.usa-button-big, +[type=button].usa-button-big, +[type=submit].usa-button-big, +[type=reset].usa-button-big, +[type=image].usa-button-big { + font-size: 1.9rem; + padding: 1.5rem 3rem; +} + +/* stylelint-disable */ +.usa-button:disabled, +.usa-button-disabled { + background-color: #d6d7d9; + color: #323a45; + pointer-events: none; +} + +.usa-button:disabled:hover, .usa-button:disabled.usa-button-hover, .usa-button:disabled:active, .usa-button:disabled.usa-button-active, .usa-button:disabled:focus, +.usa-button-disabled:hover, +.usa-button-disabled.usa-button-hover, +.usa-button-disabled:active, +.usa-button-disabled.usa-button-active, +.usa-button-disabled:focus { + background-color: #d6d7d9; + border: 0; + box-shadow: none; + color: #323a45; +} + +.usa-button-unstyled { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; +} + +.usa-button-unstyled:hover { + background-color: transparent; +} + +.usa-embed-container iframe, +.usa-embed-container object, +.usa-embed-container embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.usa-embed-container { + padding-bottom: 56.25%; + position: relative; + height: 0; + overflow: hidden; + max-width: 100%; +} + +img { + max-width: 100%; +} + +.media_link { + display: inline-block; + line-height: 0; +} + +/* stylelint-disable selector-no-qualifying-type */ +input, +textarea, +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 0.1rem solid #5b616b; + border-radius: 0; + box-sizing: border-box; + color: #212121; + display: block; + font-size: 1.7rem; + height: 4.4rem; + line-height: 1.3; + margin: 0.2em 0; + max-width: 46rem; + outline: none; + padding: 1rem 0.7em; + width: 100%; +} + +input:focus, input.usa-input-focus, +textarea:focus, +textarea.usa-input-focus, +select:focus, +select.usa-input-focus { + box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +input.usa-input-success, +textarea.usa-input-success, +select.usa-input-success { + border: 3px solid #4aa564; +} + +/* stylelint-enable */ +.usa-input-error { + border-left: 4px solid #cd2026; + margin-top: 3rem; + padding-bottom: 0.8rem; + padding-left: 1.5rem; + padding-top: 0.8rem; + position: relative; + right: 1.9rem; +} + +.usa-input-error input, +.usa-input-error textarea, +.usa-input-error select { + border: 3px solid #cd2026; + width: calc(100% + 1.9rem); +} + +.usa-input-error label { + margin-top: 0; +} + +.usa-input-error .usa-input-inline { + border: 0.1rem solid #5b616b; + width: inherit; +} + +.usa-input-error .usa-input-inline-error { + border: 3px solid #cd2026; +} + +.usa-input-error-label { + display: block; + font-size: 1.7rem; + font-weight: 700; +} + +.usa-input-error-message { + color: #cd2026; + display: block; + font-size: 1.7rem; + font-weight: 700; + padding-bottom: 3px; + padding-top: 3px; +} + +.usa-input-required:after { + color: #981b1e; + content: ' (*Required)'; +} + +label { + display: block; + margin-top: 3rem; + max-width: 46rem; +} + +textarea { + height: 16rem; +} + +select { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-color: #ffffff; + background-image: url("../img/arrow-down.png"); + background-image: url("../img/arrow-down.svg"); + background-position: right 1.3rem center; + background-repeat: no-repeat; + background-size: 1.3rem; +} + +legend { + font-size: 3rem; + font-weight: 700; +} + +.usa-fieldset-inputs label { + margin-top: 0; +} + +.usa-form-hint { + color: #757575; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + margin-bottom: 0; +} + +[type=checkbox], +[type=radio] { + position: absolute; + left: -999em; +} + +.lt-ie9 [type=checkbox], .lt-ie9 +[type=radio] { + border: 0; + float: left; + margin: 0.4em 0.4em 0 0; + position: static; + width: auto; +} + +[type=checkbox] + label, +[type=radio] + label { + cursor: pointer; + font-weight: 400; + margin-bottom: 0.5em; +} + +[type=checkbox] + label::before, +[type=radio] + label::before { + background: #ffffff; + border-radius: 3px; + box-shadow: 0 0 0 1px #757575; + content: '\a0'; + display: inline-block; + height: 1.8rem; + line-height: 1.8rem; + margin-right: 0.6em; + text-indent: 0.15em; + vertical-align: middle\0; + width: 1.8rem; +} + +[type=radio] + label::before { + box-shadow: 0 0 0 2px #ffffff, 0 0 0 3px #757575; + height: 1.6rem; + line-height: 1.6rem; + width: 1.6rem; + border-radius: 100%; +} + +[type=checkbox]:checked + label::before, +[type=radio]:checked + label::before { + background-color: #0071bc; + box-shadow: 0 0 0 1px #0071bc; +} + +[type=radio]:checked + label::before { + box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0071bc; +} + +[type=radio]:focus + label::before { + box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0071bc, 0 0 3px 4px #3e94cf, 0 0 7px 4px #3e94cf; +} + +[type=checkbox]:checked + label::before, +[type=checkbox]:checked:disabled + label::before { + background-image: url("../img/correct8.png"); + background-image: url("../img/correct8.svg"); + background-position: 50%; + background-repeat: no-repeat; +} + +[type=checkbox]:focus + label::before { + box-shadow: 0 0 0 1px #ffffff, 0 0 0 3px #0071bc; +} + +[type=checkbox]:disabled + label { + color: #5b616b; +} + +[type=checkbox]:disabled + label::before, +[type=radio]:disabled + label::before { + background: #d6d7d9; + box-shadow: 0 0 0 1px #aeb0b5; + cursor: not-allowed; +} + +[type=range] { + -webkit-appearance: none; + border: none; + padding-left: 0; + width: 100%; +} + +[type=range]:focus { + box-shadow: none; + outline: none; +} + +[type=range]::-webkit-slider-runnable-track { + background: #aeb0b5; + border: 1px solid #757575; + cursor: pointer; + height: 1.2rem; + width: 100%; +} + +[type=range]::-moz-range-track { + background: #0071bc; + border: 1px solid #757575; + cursor: pointer; + height: 1.2rem; + width: 100%; +} + +[type=range]::-ms-track { + background: transparent; + color: transparent; + cursor: pointer; + height: 1.2rem; + width: 100%; +} + +[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + border: 1px solid #757575; + height: 2.2rem; + border-radius: 1.5rem; + background: #f1f1f1; + cursor: pointer; + margin-top: -.65rem; + width: 2.2rem; +} + +[type=range]::-moz-range-thumb { + background: #f1f1f1; + border: 1px solid #757575; + border-radius: 1.5rem; + cursor: pointer; + height: 2.2rem; + width: 2.2rem; +} + +[type=range]::-ms-thumb { + background: #f1f1f1; + border: 1px solid #757575; + border-radius: 1.5rem; + cursor: pointer; + height: 2.2rem; + width: 2.2rem; +} + +[type=range]::-ms-fill-lower { + background: #aeb0b5; + border: 1px solid #757575; + border-radius: 2rem; +} + +[type=range]::-ms-fill-upper { + background: #aeb0b5; + border: 1px solid #757575; + border-radius: 2rem; +} + +[type=range]:focus::-webkit-slider-thumb { + border: 2px solid #3e94cf; +} + +[type=range]:focus::-moz-range-thumb { + border: 2px solid #3e94cf; +} + +[type=range]:focus::-ms-thumb { + border: 2px solid #3e94cf; +} + +.usa-date-of-birth label { + margin-top: 0; +} + +.usa-date-of-birth [type=number]::-webkit-inner-spin-button, +.usa-date-of-birth [type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + appearance: none; + margin: 0; +} + +.usa-date-of-birth [type=number] { + -moz-appearance: textfield; +} + +.usa-form-group-day, +.usa-form-group-month, +.usa-form-group-year { + clear: none; + float: left; + margin-right: 1.5rem; + width: 5rem; +} + +.usa-form-group-year { + width: 7rem; +} + +.usa-label, .usa-label-big { + background-color: #0071bc; + border-radius: 3px; + color: #ffffff; + font-size: 1.5rem; + margin-right: 0.5rem; + padding: 0.1rem 0.7rem; + text-transform: uppercase; +} + +.usa-label:only-of-type, .usa-label-big:only-of-type { + margin-right: 0; +} + +.usa-label-big { + font-size: 1.7rem; + padding-left: 0.9rem; + padding-right: 0.9rem; +} + +ul, +ol { + margin-top: 1em; + margin-bottom: 1em; + padding-left: 1.94em; +} + +li { + line-height: 1.5; + margin-bottom: 0.5em; +} + +li:last-child { + margin-bottom: 0; +} + +h1 + ul, +h1 + ol, +h2 + ul, +h2 + ol, +h3 + ul, +h3 + ol, +h4 + ul, +h4 + ol, +h5 + ul, +h5 + ol, +h6 + ul, +h6 + ol, +p + ul, +p + ol { + margin-top: 0; +} + +.usa-unstyled-list { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; +} + +.usa-unstyled-list > li { + margin-bottom: 0; +} + +table { + border-spacing: 0; + margin: 2em 0; + min-width: 100%; +} + +table thead th, +table thead td { + background-color: #f1f1f1; +} + +table th { + text-align: left; +} + +table tbody th { + font-weight: 400; +} + +table th, +table td { + background-color: #ffffff; + border: 1px solid #5b616b; + padding: 1.5rem; +} + +.usa-table-borderless thead tr { + background-color: transparent; +} + +.usa-table-borderless thead th { + border-top: 0; +} + +.usa-table-borderless th, +.usa-table-borderless td { + border-left: 0; + border-right: 0; +} + +html { + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + font-size: 10px; +} + +body { + font-size: 1.7rem; +} + +p { + line-height: 1.5; + margin-bottom: 1em; + margin-top: 1em; +} + +a { + color: #0071bc; + text-decoration: underline; +} + +a:hover, a:active { + color: #205493; +} + +a:visited { + color: #4c2c92; +} + +a:focus { + box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf; + outline: 0; +} + +.usa-external_link::after { + background: url("../img/external-link.png") no-repeat 0 0; + background: url("../img/external-link.svg") no-repeat 0 0; + background-size: 100%; + content: ''; + display: inline-block; + height: 0.65em; + margin-bottom: -1px; + margin-left: 4px; + width: 0.65em; +} + +.usa-external_link:hover::after { + background-image: url("../img/external-link-hover.png"); + background-image: url("../img/external-link-hover.svg"); +} + +.usa-external_link-alt::after { + background: url("../img/external-link-alt.png") no-repeat 0 0; + background: url("../img/external-link-alt.svg") no-repeat 0 0; + background-size: 100%; + content: ''; + display: inline-block; + height: 0.65em; + margin-bottom: -1px; + margin-left: 4px; + width: 0.65em; +} + +.usa-external_link-alt:hover::after { + background-image: url("../img/external-link-alt-hover.png"); + background-image: url("../img/external-link-alt-hover.svg"); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + font-family: "Merriweather", "Georgia", "Cambria", "Times New Roman", "Times", serif; + line-height: 1.3; + margin-bottom: .5em; + margin-top: 1.5em; +} + +h1 { + font-size: 4rem; + font-weight: 700; +} + +h2 { + font-size: 3rem; + font-weight: 700; +} + +h3 { + font-size: 2rem; + font-weight: 700; +} + +h4 { + font-size: 1.7rem; + font-weight: 700; +} + +h5 { + font-size: 1.5rem; + font-weight: 700; +} + +h6 { + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + font-size: 1.3rem; + font-weight: 400; + text-transform: uppercase; +} + +cite, +var, +address, +dfn { + font-style: normal; +} + +.usa-content p:not(.usa-font-lead), +.usa-content ul:not(.usa-accordion):not(.usa-accordion-bordered), +.usa-content ol:not(.usa-accordion):not(.usa-accordion-bordered) { + max-width: 53rem; +} + +.usa-content-list { + max-width: 53rem; +} + +.usa-sans p, +.usa-sans a, +.usa-sans li, +.usa-sans span { + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; +} + +.usa-sans a { + border-bottom: none; + font-weight: 700; +} + +.usa-serif p, +.usa-serif a, +.usa-serif li, +.usa-serif span { + font-family: "Merriweather", "Georgia", "Cambria", "Times New Roman", "Times", serif; +} + +.usa-display { + font-size: 2rem; + font-weight: 700; + margin-bottom: 0; +} + +@media screen and (min-width: 481px) { + .usa-display { + font-size: 4rem; + font-weight: 700; + } +} + +@media screen and (min-width: 600px) { + .usa-display { + font-size: 5.2rem; + font-weight: 700; + } +} + +.usa-font-lead { + font-family: "Merriweather", "Georgia", "Cambria", "Times New Roman", "Times", serif; + font-size: 2rem; + line-height: 1.7; + max-width: 77rem; +} + +.usa-image-block { + position: relative; +} + +.usa-image-text-block { + color: #ffffff; + left: 0; + margin-left: 8%; + position: absolute; + top: 0; +} + +.usa-image-text { + margin-top: 0; +} + +.usa-drop_text { + margin-bottom: 0; +} + +.usa-background-dark { + background-color: #323a45; +} + +.usa-background-dark p, +.usa-background-dark span { + color: #ffffff; +} + +.usa-background-dark a { + color: #d6d7d9; +} + +.usa-background-dark a:hover { + color: #ffffff; +} + +.usa-text-small { + font-size: 1.3rem; + margin-top: 0; +} + +.usa-section > :first-child, +.usa-grid > :first-child, +.usa-grid-full > :first-child { + margin-top: 0; +} + +.usa-section > :last-child, +.usa-grid > :last-child, +.usa-grid-full > :last-child { + margin-bottom: 0; +} + +.usa-width-one-whole:first-child > :first-child, +.usa-width-one-half:first-child > :first-child, +.usa-width-one-third:first-child > :first-child, +.usa-width-two-thirds:first-child > :first-child, +.usa-width-one-fourth:first-child > :first-child, +.usa-width-three-fourths:first-child > :first-child, +.usa-width-one-sixth:first-child > :first-child, +.usa-width-five-sixths:first-child > :first-child, +.usa-width-one-twelfth:first-child > :first-child { + margin-top: 0; +} + +@media screen and (min-width: 600px) { + .usa-width-one-whole > :first-child, + .usa-width-one-half > :first-child, + .usa-width-one-third > :first-child, + .usa-width-two-thirds > :first-child, + .usa-width-one-fourth > :first-child, + .usa-width-three-fourths > :first-child, + .usa-width-one-sixth > :first-child, + .usa-width-five-sixths > :first-child, + .usa-width-one-twelfth > :first-child { + margin-top: 0; + } +} + +.usa-width-one-whole:last-child > :last-child, +.usa-width-one-half:last-child > :last-child, +.usa-width-one-third:last-child > :last-child, +.usa-width-two-thirds:last-child > :last-child, +.usa-width-one-fourth:last-child > :last-child, +.usa-width-three-fourths:last-child > :last-child, +.usa-width-one-sixth:last-child > :last-child, +.usa-width-five-sixths:last-child > :last-child, +.usa-width-one-twelfth:last-child > :last-child { + margin-bottom: 0; +} + +@media screen and (min-width: 600px) { + .usa-width-one-whole > :last-child, + .usa-width-one-half > :last-child, + .usa-width-one-third > :last-child, + .usa-width-two-thirds > :last-child, + .usa-width-one-fourth > :last-child, + .usa-width-three-fourths > :last-child, + .usa-width-one-sixth > :last-child, + .usa-width-five-sixths > :last-child, + .usa-width-one-twelfth > :last-child { + margin-bottom: 0; + } +} + +.usa-accordion, +.usa-accordion-bordered { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; + color: #212121; + margin: 0; + padding: 0; + width: 100%; +} + +.usa-accordion > li, +.usa-accordion-bordered > li { + margin-bottom: 0; +} + +.usa-accordion > ul li ul, +.usa-accordion-bordered > ul li ul { + list-style: disc; +} + +.usa-accordion > ul li ul > li > ul, +.usa-accordion-bordered > ul li ul > li > ul { + list-style: circle; +} + +.usa-accordion > ul li ul > li > ul > li > ul, +.usa-accordion-bordered > ul li ul > li > ul > li > ul { + list-style: square; +} + +.usa-accordion + .usa-accordion, +.usa-accordion + .usa-accordion-bordered, +.usa-accordion-bordered + .usa-accordion, +.usa-accordion-bordered + .usa-accordion-bordered { + margin-top: 1rem; +} + +.usa-accordion > ul, +.usa-accordion-bordered > ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; + color: #212121; + margin: 0; + padding: 0; + width: 100%; +} + +.usa-accordion > ul > li, +.usa-accordion-bordered > ul > li { + margin-bottom: 0; +} + +.usa-accordion > ul > li, +.usa-accordion-bordered > ul > li { + background-color: #f1f1f1; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + list-style: none; + margin-bottom: 6px; + width: 100%; +} + +.usa-accordion > ul button, +.usa-accordion-bordered > ul button { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + background-color: #f1f1f1; + background-image: url("../img/minus.png"); + background-image: url("../img/minus.svg"); + background-position: right 3rem center; + background-repeat: no-repeat; + background-size: 13px; + color: #212121; + cursor: pointer; + display: inline-block; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + font-weight: 700; + margin: 0; + padding: 1.5rem 5.5rem 1.5rem 3rem; + width: 100%; +} + +.usa-accordion > ul button:hover, +.usa-accordion-bordered > ul button:hover { + background-color: transparent; +} + +.usa-accordion > ul button:focus, +.usa-accordion-bordered > ul button:focus { + box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +.usa-accordion > ul button:hover, +.usa-accordion-bordered > ul button:hover { + background-color: #d6d7d9; + color: #212121; +} + +.usa-accordion > ul button h1, +.usa-accordion > ul button h2, +.usa-accordion > ul button h3, +.usa-accordion > ul button h4, +.usa-accordion > ul button h5, +.usa-accordion > ul button h6, +.usa-accordion-bordered > ul button h1, +.usa-accordion-bordered > ul button h2, +.usa-accordion-bordered > ul button h3, +.usa-accordion-bordered > ul button h4, +.usa-accordion-bordered > ul button h5, +.usa-accordion-bordered > ul button h6 { + margin: 0; +} + +.usa-accordion > ul [aria-expanded=false], +.usa-accordion-bordered > ul [aria-expanded=false] { + background-image: url("../img/plus.png"); + background-image: url("../img/plus.svg"); + background-repeat: no-repeat; + background-size: 1.3rem; +} + +.usa-accordion > li, +.usa-accordion-bordered > li { + background-color: #f1f1f1; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + list-style: none; + margin-bottom: 6px; + width: 100%; +} + +.usa-accordion-bordered .usa-accordion-content { + border-bottom: 3px solid #f1f1f1; + border-left: 3px solid #f1f1f1; + border-right: 3px solid #f1f1f1; +} + +.usa-accordion-content { + background-color: #ffffff; + overflow: auto; + padding: 3rem; +} + +.usa-accordion-content > *:first-child { + margin-top: 0; +} + +.usa-accordion-content > *:last-child { + margin-bottom: 0; +} + +.usa-accordion-content:not([aria-hidden]) { + position: absolute; + left: -999em; +} + +.usa-accordion-content[aria-hidden=true] { + display: none; +} + +.usa-accordion-button { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + background-color: #f1f1f1; + background-image: url("../img/minus.png"); + background-image: url("../img/minus.svg"); + background-position: right 3rem center; + background-repeat: no-repeat; + background-size: 13px; + color: #212121; + cursor: pointer; + display: inline-block; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + font-weight: 700; + margin: 0; + padding: 1.5rem 5.5rem 1.5rem 3rem; + width: 100%; +} + +.usa-accordion-button:hover { + background-color: transparent; +} + +.usa-accordion-button:focus { + box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +.usa-accordion-button:hover { + background-color: #d6d7d9; + color: #212121; +} + +.usa-accordion-button h1, +.usa-accordion-button h2, +.usa-accordion-button h3, +.usa-accordion-button h4, +.usa-accordion-button h5, +.usa-accordion-button h6 { + margin: 0; +} + +.usa-accordion-button[aria-expanded=false] { + background-image: url("../img/plus.png"); + background-image: url("../img/plus.svg"); + background-repeat: no-repeat; + background-size: 1.3rem; +} + +.usa-alert { + background-color: #f1f1f1; + background-position: 1rem 2rem; + background-repeat: no-repeat; + background-size: 4rem; + margin-top: 1.5em; + padding: 1em; +} + +@media screen and (min-width: 600px) { + .usa-alert { + background-size: 5.2rem; + } +} + +.usa-alert a { + color: #205493; +} + +.usa-alert a:focus, .usa-alert a:hover { + color: #112e51; +} + +.usa-alert ul { + margin-bottom: 0; + margin-top: 1em; + padding-left: 1em; +} + +.usa-alert-icon { + display: table-cell; + padding-right: 1rem; +} + +.usa-alert-body { + display: table-cell; + padding-left: 3.5rem; + vertical-align: top; +} + +@media screen and (min-width: 600px) { + .usa-alert-body { + padding-left: 5rem; + } +} + +.usa-alert-body p:first-child { + margin-top: 0.8rem; +} + +.usa-alert-body p:last-child { + margin-bottom: 0.8rem; +} + +.usa-alert-heading { + margin-bottom: .3rem; + margin-top: 0; +} + +@media screen and (min-width: 600px) { + .usa-alert-heading { + margin-top: .3rem; + } +} + +.usa-alert-text { + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + margin-bottom: 0; + margin-top: 0; +} + +.usa-alert-success { + background-color: #e7f4e4; + background-image: url("../img/alerts/success.png"); + background-image: url("../img/alerts/success.svg"); +} + +.usa-alert-warning { + background-color: #fff1d2; + background-image: url("../img/alerts/warning.png"); + background-image: url("../img/alerts/warning.svg"); +} + +.usa-alert-error { + background-color: #f9dede; + background-image: url("../img/alerts/error.png"); + background-image: url("../img/alerts/error.svg"); +} + +.usa-alert-info { + background-color: #e1f3f8; + background-image: url("../img/alerts/info.png"); + background-image: url("../img/alerts/info.svg"); +} + +.usa-alert-no_icon { + background-image: none; +} + +.usa-alert-paragraph { + width: 53rem; + padding: 1em 3em 1em 1em; +} + +.usa-banner { + background-color: #f1f1f1; + padding-bottom: 0.7rem; +} + +@media screen and (min-width: 481px) { + .usa-banner { + font-size: 1.3rem; + padding-bottom: 0; + } +} + +.usa-banner-content { + padding-right: 1.5rem; + padding-bottom: 3px; + padding-left: 1.5rem; + background-color: transparent; + font-size: 1.5rem; + padding-top: 2rem; + width: 100%; +} + +@media screen and (min-width: 600px) { + .usa-banner-content { + padding-bottom: 2.3rem; + padding-top: 4rem; + } +} + +@media screen and (min-width: 951px) { + .usa-banner-content { + padding-right: 3rem; + padding-left: 3rem; + } +} + +.usa-banner-content p:first-child { + margin-top: 1rem; +} + +@media screen and (min-width: 600px) { + .usa-banner-content p:first-child { + margin-top: 0; + } +} + +.usa-banner-inner { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + padding-right: 1.5rem; + padding-left: 1.5rem; + max-width: 1040px; +} + +.usa-banner-inner::after { + clear: both; + content: ""; + display: block; +} + +@media screen and (min-width: 951px) { + .usa-banner-inner { + padding-right: 3rem; + padding-left: 3rem; + } +} + +.usa-banner-header { + padding-top: 0.55rem; + padding-bottom: 0.55rem; + font-size: 1.2rem; + font-weight: 400; +} + +@media screen and (min-width: 481px) { + .usa-banner-header { + padding-top: 0; + padding-bottom: 0; + } +} + +.usa-banner-header p { + margin-top: 0; + margin-bottom: 0; + display: inline; + overflow: hidden; + vertical-align: middle; +} + +@media screen and (min-width: 481px) { + .usa-banner-header p { + margin-top: 2px; + margin-bottom: 2px; + display: inline-block; + } +} + +.usa-banner-header img { + float: left; + margin-right: 1rem; + margin-top: 1px; + width: 2.4rem; +} + +@media screen and (min-width: 481px) { + .usa-banner-header img { + margin-right: 0.7rem; + width: 2rem; + } +} + +.usa-banner-header-expanded { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-bottom: 1px solid #aeb0b5; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 1.5rem; + min-height: 5.6rem; + padding-right: 3rem; +} + +@media screen and (min-width: 481px) { + .usa-banner-header-expanded { + border-bottom: none; + display: block; + font-size: 1.2rem; + font-weight: 400; + min-height: 0; + padding-right: 0; + } +} + +.usa-banner-header-expanded > .usa-banner-inner { + margin-left: 0; +} + +@media screen and (min-width: 481px) { + .usa-banner-header-expanded > .usa-banner-inner { + margin-left: auto; + } +} + +.usa-banner-header-expanded img { + margin-right: 2.4rem; +} + +@media screen and (min-width: 481px) { + .usa-banner-header-expanded img { + margin-right: 0.7rem; + } +} + +.usa-banner-header-expanded p { + line-height: 1.3; + vertical-align: top; +} + +@media screen and (min-width: 481px) { + .usa-banner-header-expanded p { + line-height: 1.5; + vertical-align: middle; + } +} + +.usa-banner-button { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + padding-top: 1.3rem; + padding-left: 4.8rem; + background-position-x: right; + color: #0071bc; + display: block; + font-size: 1.2rem; + height: 4.3rem; + left: 0; + position: absolute; + text-decoration: underline; + top: 0; + width: 100%; +} + +.usa-banner-button:hover { + background-color: transparent; +} + +@media screen and (min-width: 481px) { + .usa-banner-button { + padding-top: 0; + padding-left: 0; + /* stylelint-disable declaration-block-no-ignored-properties */ + display: inline; + height: initial; + margin-left: 3px; + position: relative; + vertical-align: middle; + width: initial; + /* stylelint-enable */ + } +} + +.usa-banner-button:hover { + color: #205493; + text-decoration: underline; +} + +.usa-banner-button[aria-expanded=false] { + background-image: none; +} + +.usa-banner-button[aria-expanded=false]::after { + background-image: url(../img/angle-arrow-down-primary.png); + background-image: url(../img/angle-arrow-down-primary.svg); + background-size: 100%; + content: ''; + display: inline-block; + height: 1rem; + width: 1rem; + /* stylelint-disable block-closing-brace-newline-after, at-rule-empty-line-before */ + margin-left: 0; + /* stylelint-enable */ +} + +.usa-banner-button[aria-expanded=false]:hover::after { + background-image: url(../img/angle-arrow-down-primary-hover.png); + background-image: url(../img/angle-arrow-down-primary-hover.svg); +} + +.usa-banner-button[aria-expanded=false]::after { + background-position-y: 1px; +} + +.usa-banner-button[aria-expanded=true] { + background-image: none; + height: 5.6rem; +} + +.usa-banner-button[aria-expanded=true]::after { + background-image: url(../img/close.png); + background-image: url(../img/close.svg); + background-size: 100%; + content: ''; + display: inline-block; + height: 1.3rem; + width: 1.3rem; + /* stylelint-disable block-closing-brace-newline-after, at-rule-empty-line-before */ + margin-left: 0; + /* stylelint-enable */ +} + +@media screen and (min-width: 481px) { + .usa-banner-button[aria-expanded=true] { + height: initial; + padding: 0; + position: relative; + } + .usa-banner-button[aria-expanded=true]::after { + background-image: url(../img/angle-arrow-up-primary.png); + background-image: url(../img/angle-arrow-up-primary.svg); + background-size: 100%; + content: ''; + display: inline-block; + height: 1rem; + width: 1rem; + /* stylelint-disable block-closing-brace-newline-after, at-rule-empty-line-before */ + margin-left: 0; + /* stylelint-enable */ + } + .usa-banner-button[aria-expanded=true]:hover::after { + background-image: url(../img/angle-arrow-up-primary-hover.png); + background-image: url(../img/angle-arrow-up-primary-hover.svg); + } + .usa-banner-button[aria-expanded=true]::after { + background-position-y: 1px; + } +} + +.usa-banner-button[aria-expanded=true]::after { + position: absolute; + right: 1.5rem; + top: 2.15rem; +} + +@media screen and (min-width: 481px) { + .usa-banner-button[aria-expanded=true]::after { + position: static; + } +} + +.usa-banner-button[aria-expanded=true] .usa-banner-button-text { + display: none; +} + +@media screen and (min-width: 481px) { + .usa-banner-button[aria-expanded=true] .usa-banner-button-text { + display: inline; + } +} + +.usa-banner-icon { + width: 3.8rem; +} + +.usa-footer .usa-unstyled-list { + display: block; +} + +.usa-footer .usa-footer-primary-link { + color: #212121; + display: block; + font-weight: 700; + margin-top: 0; + padding-bottom: 2rem; + padding-top: 2rem; + text-decoration: none; +} + +@media screen and (min-width: 600px) { + .usa-footer .usa-footer-primary-link { + border-top: none; + } +} + +.usa-footer .usa-footer-primary-link:hover { + text-decoration: underline; +} + +.usa-footer a { + font-weight: normal; +} + +.usa-footer-return-to-top { + padding-bottom: 2rem; + padding-top: 2rem; +} + +.usa-footer-primary-section { + background-color: #f1f1f1; +} + +.usa-footer-primary-section .usa-footer-primary-content { + padding-left: 2.5rem; + padding-right: 2.5rem; +} + +@media screen and (min-width: 600px) { + .usa-footer-primary-section .usa-footer-primary-content { + padding-left: 0; + padding-right: 0; + } +} + +.usa-footer-primary-section .usa-footer-primary-content li { + margin-left: 1rem; +} + +@media screen and (min-width: 600px) { + .usa-footer-primary-section .usa-footer-primary-content li { + margin-left: 0; + } +} + +@media screen and (min-width: 600px) { + .usa-footer-primary-section .usa-grid-full { + padding-left: 2.5rem; + padding-right: 2.5rem; + } +} + +.usa-footer-medium .usa-footer-primary-section { + padding: 0; +} + +@media screen and (min-width: 600px) { + .usa-footer-medium .usa-footer-primary-section { + padding-bottom: 1rem; + padding-top: 1rem; + } +} + +@media screen and (min-width: 1201px) { + .usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content { + margin-right: 6%; + width: inherit; + } +} + +@media screen and (min-width: 1201px) { + .usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content:last-child { + margin-right: 0; + } +} + +@media screen and (min-width: 600px) { + .usa-footer-medium .usa-footer-nav ul { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + } +} + +.usa-footer-slim .usa-footer-nav a { + display: block; +} + +@media screen and (min-width: 1201px) { + .usa-footer-slim .usa-footer-nav .usa-footer-primary-content { + margin-right: 9%; + width: inherit; + } +} + +@media screen and (min-width: 1201px) { + .usa-footer-slim .usa-footer-nav .usa-footer-primary-content:last-child { + margin-right: 0; + } +} + +.usa-footer-slim .usa-footer-primary-section { + padding-bottom: 2rem; +} + +@media screen and (min-width: 600px) { + .usa-footer-slim .usa-footer-primary-section { + padding-bottom: 1rem; + padding-top: 1rem; + } + .usa-footer-slim .usa-footer-primary-section .usa-grid-full { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + } +} + +@media screen and (min-width: 600px) { + .usa-footer-slim .usa-footer-contact_info > * { + margin: 0; + } +} + +@media screen and (min-width: 600px) { + .usa-footer-slim .usa-footer-contact_info { + padding-top: 2rem; + padding-bottom: 2rem; + } +} + +@media screen and (min-width: 600px) { + .usa-footer-slim .usa-footer-contact_info { + width: 100%; + } +} + +@media screen and (min-width: 1201px) { + .usa-footer-slim .usa-footer-contact_info { + float: left; + display: block; + margin-right: 2.35765%; + width: 48.82117%; + } + .usa-footer-slim .usa-footer-contact_info:last-child { + margin-right: 0; + } +} + +/* stylelint-disable selector-no-qualifying-type */ +ul.usa-footer-primary-content, +li.usa-footer-primary-content, +li.usa-footer-primary-content { + border-top: 1px solid #212121; +} + +@media screen and (min-width: 600px) { + ul.usa-footer-primary-content, + li.usa-footer-primary-content, + li.usa-footer-primary-content { + border: none; + } +} + +ul.usa-footer-primary-content:last-child, +li.usa-footer-primary-content:last-child, +li.usa-footer-primary-content:last-child { + border-bottom: 1px solid #212121; +} + +@media screen and (min-width: 600px) { + ul.usa-footer-primary-content:last-child, + li.usa-footer-primary-content:last-child, + li.usa-footer-primary-content:last-child { + border-bottom: none; + } +} + +/* stylelint-enable */ +.usa-sign_up-block { + padding-bottom: 2rem; + padding-left: 2.5rem; + padding-right: 2.5rem; +} + +@media screen and (min-width: 600px) { + .usa-sign_up-block { + float: right; + padding: 0; + } +} + +.usa-sign_up-block label:first-of-type { + margin-top: 0; +} + +.usa-sign_up-block button { + float: none; + margin-right: 0; + margin-top: 1.5rem; +} + +.usa-sign_up-block input { + width: 100%; +} + +.usa-footer-secondary_section { + background-color: #d6d7d9; + padding-bottom: 3rem; + padding-top: 3rem; +} + +.usa-footer-secondary_section a { + color: #212121; +} + +@media screen and (min-width: 600px) { + .usa-footer-big-secondary-section { + padding-top: 5rem; + } +} + +@media screen and (min-width: 600px) { + .usa-footer-contact-links { + text-align: right; + } +} + +.usa-social-links a { + text-decoration: none; +} + +@media screen and (min-width: 600px) { + .usa-footer-big .usa-footer-primary-section { + padding-bottom: 4rem; + padding-top: 3rem; + } +} + +.usa-footer-big ul { + padding-bottom: 2.5rem; +} + +@media screen and (min-width: 600px) { + .usa-footer-big ul { + padding-bottom: 0; + } +} + +.usa-footer-big ul:last-child { + border-bottom: 1px solid #212121; +} + +@media screen and (min-width: 600px) { + .usa-footer-big ul:last-child { + border-bottom: none; + } +} + +.usa-footer-big ul li { + line-height: 2em; +} + +.usa-footer-big ul .usa-footer-primary-link { + background-image: url("../img/arrow-down.png"); + background-image: url("../img/arrow-down.svg"); + background-position: 1.5rem center; + background-repeat: no-repeat; + background-size: 1.3rem; + margin-left: 0; + padding-left: 3.5rem; +} + +@media screen and (min-width: 600px) { + .usa-footer-big ul .usa-footer-primary-link { + background: none; + margin-bottom: .8rem; + padding-bottom: 0; + padding-left: 0; + } +} + +.usa-footer-big ul .usa-footer-primary-link > * { + margin-top: 0; + margin-bottom: 0; +} + +.usa-footer-big ul.hidden { + /* stylelint-disable-line selector-no-qualifying-type */ + padding-bottom: 0; +} + +.usa-footer-big ul.hidden li { + display: none; +} + +.usa-footer-big ul.hidden .usa-footer-primary-link { + /* stylelint-disable-line selector-no-qualifying-type */ + background-image: url("../img/arrow-right.png"); + background-image: url("../img/arrow-right.svg"); + cursor: pointer; + display: block; +} + +@media screen and (min-width: 600px) { + .usa-footer-big ul.hidden .usa-footer-primary-link { + background: none; + padding-left: 0; + } +} + +.usa-footer-topic { + margin: 0; + padding: 2rem 0; +} + +@media screen and (min-width: 600px) { + .usa-sign_up-header { + margin: 0; + padding: 2rem 0; + } +} + +.usa-footer-logo-img { + max-width: 14rem; +} + +.usa-footer-slim-logo-img { + float: left; + max-width: 10rem; +} + +.usa-footer-logo-heading { + margin-top: 2rem; +} + +.usa-footer-contact-heading { + margin-top: 0; +} + +@media screen and (min-width: 600px) { + .usa-footer-contact-heading { + margin-top: 1rem; + } +} + +.usa-footer-slim-logo-heading { + display: block; + padding-top: 1rem; +} + +@media screen and (min-width: 600px) { + .usa-footer-slim-logo-heading { + display: inline-block; + padding-left: 1em; + } +} + +.usa-social_link, .usa-link-facebook, .usa-link-twitter, .usa-link-youtube, .usa-link-rss { + margin: 2.5rem 1rem 1.5rem 0; + background-position: center center; + background-repeat: no-repeat; + background-size: auto 3rem; + display: inline-block; + height: 4.4rem; + left: -1.6rem; + position: relative; + text-align: center; + width: 4.4rem; +} + +@media screen and (min-width: 600px) { + .usa-social_link, .usa-link-facebook, .usa-link-twitter, .usa-link-youtube, .usa-link-rss { + margin: 0 0 0 1rem; + left: 1.2rem; + } +} + +.usa-social_link span, .usa-link-facebook span, .usa-link-twitter span, .usa-link-youtube span, .usa-link-rss span { + position: absolute; + left: -999em; +} + +.usa-link-facebook { + background-image: url("../img/social-icons/png/facebook25.png"); + background-image: url("../img/social-icons/svg/facebook25.svg"); +} + +.usa-link-twitter { + background-image: url("../img/social-icons/png/twitter16.png"); + background-image: url("../img/social-icons/svg/twitter16.svg"); +} + +.usa-link-youtube { + background-image: url("../img/social-icons/png/youtube15.png"); + background-image: url("../img/social-icons/svg/youtube15.svg"); +} + +.usa-link-rss { + background-image: url("../img/social-icons/png/rss25.png"); + background-image: url("../img/social-icons/svg/rss25.svg"); +} + +form a { + border-bottom: 0; +} + +form [type=submit], +form [type=submit] { + display: block; + margin-bottom: 1.5em; + margin-top: 2.5rem; +} + +@media screen and (min-width: 600px) { + form [type=submit], + form [type=submit] { + padding-left: 2.7em; + padding-right: 2.7em; + width: auto; + } +} + +form [name=password], +form [name=confirmPassword] { + margin-bottom: 1.1rem; +} + +@media screen and (min-width: 600px) { + .usa-form { + max-width: 32rem; + } +} + +.usa-form-note { + float: right; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + font-size: 1.5rem; + margin: 0 0 1.5rem; +} + +.usa-form-note + * { + clear: both; +} + +fieldset { + border: none; + margin: 0; + padding: 0; +} + +@media screen and (min-width: 600px) { + .usa-form-large { + max-width: 46rem; + } +} + +input.usa-input-tiny { + /* stylelint-disable-line selector-no-qualifying-type */ +} + +@media screen and (min-width: 600px) { + input.usa-input-tiny { + max-width: 6rem; + } +} + +input.usa-input-medium { + /* stylelint-disable-line selector-no-qualifying-type */ +} + +@media screen and (min-width: 600px) { + input.usa-input-medium { + max-width: 12rem; + } +} + +@media screen and (min-width: 600px) { + .usa-input-grid { + padding-right: 5%; + } +} + +@media screen and (min-width: 600px) { + .usa-input-grid:last-of-type { + padding-right: 0; + } +} + +@media screen and (min-width: 600px) { + .usa-input-grid-small { + float: left; + width: 35%; + } +} + +.usa-input-grid-small input { + margin-bottom: 3rem; +} + +.usa-input-grid-small select { + margin-bottom: 3rem; +} + +@media screen and (min-width: 600px) { + .usa-input-grid-medium { + float: left; + width: 65%; + } +} + +.usa-input-grid-medium input { + margin-bottom: 3rem; +} + +.usa-input-grid-medium select { + margin-bottom: 3rem; +} + +@media screen and (min-width: 600px) { + .usa-input-grid-large { + float: left; + width: 100%; + } +} + +.usa-input-grid-large input { + margin-bottom: 3rem; +} + +.usa-input-grid-large select { + margin-bottom: 3rem; +} + +.usa-additional_text { + font-weight: normal; +} + +.usa-checklist { + list-style: none; + margin-left: 0; + padding-left: 0; +} + +.usa-checklist li { + display: inline-block; + list-style: none; + margin-bottom: 0; + margin-top: 0; + padding-left: 3em; + text-indent: -2em; +} + +.usa-checklist li::before { + content: ' '; + display: inline-block; + height: .8em; + margin-right: .2em; + width: 1.8em; +} + +.usa-checklist-checked::before { + background-image: url("../img/correct9.png"); + background-image: url("../img/correct9.svg"); + background-position: 100%; + background-repeat: no-repeat; + background-size: 100%; +} + +.usa-graphic_list .usa-graphic_list-row .usa-media_block { + margin-bottom: 3rem; +} + +@media screen and (min-width: 600px) { + .usa-graphic_list .usa-graphic_list-row .usa-media_block { + margin-bottom: 6rem; + } +} + +@media screen and (min-width: 600px) { + .usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block { + margin-bottom: 0; + } +} + +.usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block:last-child { + margin-bottom: 0; +} + +.usa-graphic_list .usa-media_block-img { + margin-right: 3rem; +} + +.usa-graphic_list .usa-media_block-body > :first-child { + margin-top: 0; +} + +.usa-header { + width: 100%; + z-index: 7000; +} + +@media screen and (min-width: 951px) { + .usa-header { + border-bottom: 1px solid #aeb0b5; + } +} + +.usa-header a { + border-bottom: none; +} + +.usa-header .usa-search { + margin-bottom: 1.5rem; +} + +@media screen and (min-width: 951px) { + .usa-header .usa-search { + float: right; + margin-bottom: 0; + max-width: 21.5rem; + } +} + +.usa-logo { + float: left; + line-height: 4rem; + margin-left: 1.5rem; +} + +@media screen and (min-width: 951px) { + .usa-logo { + line-height: 7.5rem; + margin-left: 0; + } +} + +.usa-logo a { + color: #212121; + text-decoration: none; +} + +.usa-logo br { + display: none; +} + +@media screen and (min-width: 951px) { + .usa-logo br { + display: block; + } +} + +.usa-logo-text { + display: block; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + margin: 0; +} + +@media screen and (min-width: 951px) { + .usa-logo-text { + display: block; + font-size: 2.4rem; + line-height: 1.3; + } +} + +.usa-menu-btn { + /* stylelint-disable declaration-block-no-ignored-properties */ + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + background-color: #0071bc; + color: #ffffff; + display: inline; + float: right; + font-size: 1.3rem; + height: 4rem; + line-height: 4rem; + text-align: center; + text-decoration: none; + text-transform: uppercase; + width: 5.8rem; + /* stylelint-enable */ +} + +.usa-menu-btn:hover { + background-color: transparent; +} + +@media screen and (min-width: 951px) { + .usa-menu-btn { + display: none; + } +} + +.usa-menu-btn:hover { + color: #ffffff; + background-color: #205493; +} + +.usa-menu-btn:visited { + color: #ffffff; +} + +.usa-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: #000000; + opacity: 0; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + visibility: hidden; + z-index: 8000; +} + +.usa-overlay.is-visible { + opacity: 0.1; + visibility: visible; +} + +@media screen and (min-width: 951px) { + .usa-header-basic .usa-logo { + bottom: 1.9rem; + position: absolute; + } +} + +@media screen and (min-width: 951px) { + .usa-header-basic .usa-navbar { + position: relative; + width: 18%; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-header { + border-bottom: none; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-logo { + margin-top: 3rem; + margin-bottom: 3rem; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended em { + font-size: 3.2rem; + line-height: 1; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-navbar { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + padding-right: 3rem; + padding-left: 3rem; + display: block; + height: auto; + max-width: 1040px; + } + .usa-header-extended .usa-navbar::after { + clear: both; + content: ""; + display: block; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-nav { + border-top: 1px solid #aeb0b5; + float: none; + padding: 0; + width: 100%; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-nav-inner { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + padding-right: 3rem; + padding-left: 2rem; + margin-top: -1px; + max-width: 1040px; + position: relative; + } + .usa-header-extended .usa-nav-inner::after { + clear: both; + content: ""; + display: block; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-nav-primary::after { + clear: both; + content: ""; + display: block; + } +} + +.usa-header-extended .usa-nav-primary button[aria-expanded=false], .usa-header-extended .usa-nav-primary button[aria-expanded=true] { + /* stylelint-disable-line selector-no-qualifying-type */ +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-nav-primary button[aria-expanded=false], .usa-header-extended .usa-nav-primary button[aria-expanded=true] { + /* stylelint-disable-line selector-no-qualifying-type */ + background-position: right 1.5rem top 50%; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-nav-link { + padding-top: 1.9rem; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-nav-submenu .usa-grid-full { + padding-left: 1.2rem; + } +} + +@media screen and (min-width: 951px) { + .usa-header-extended .usa-megamenu { + padding-left: 3rem; + } +} + +.usa-hero { + padding-top: 3rem; + padding-bottom: 3rem; + background-image: url("../img/hero.png"); + background-position: center; + background-size: cover; +} + +.usa-hero .usa-button { + color: #ffffff; +} + +.usa-section-dark .usa-hero-link { + color: #02bfe7; +} + +.usa-hero-callout { + background-color: #112e51; + padding: 3rem; +} + +@media screen and (min-width: 481px) { + .usa-hero-callout { + max-width: 30rem; + } +} + +.usa-hero-callout > *:first-child { + margin-top: 0; + margin-bottom: 3rem; +} + +.usa-hero-callout .usa-button { + font-size: 1.4rem; + margin-top: 7rem; + width: 100%; +} + +.usa-hero-callout-alt { + color: #ffffff; + display: block; +} + +.usa-layout-docs { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +@media screen and (min-width: 1201px) { + .usa-layout-docs { + display: inherit; + } +} + +.usa-layout-docs .usa-grid > :first-child:not(.usa-width-*) { + margin-top: 0; +} + +.usa-layout-docs .usa-grid > :last-child:not(.usa-width-*) { + margin-bottom: 0; +} + +.usa-layout-docs-sidenav { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; +} + +.usa-layout-docs-main_content { + margin-bottom: 3rem; + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; +} + +@media screen and (min-width: 1201px) { + .usa-layout-docs-main_content { + margin-bottom: 0; + } +} + +.usa-layout-docs-main_content > :first-child { + margin-top: 0; +} + +.usa-media_block-img { + float: left; + margin-right: 1rem; +} + +.usa-media_block-body { + overflow: hidden; +} + +.usa-navbar { + border-bottom: 1px solid #aeb0b5; + height: 4rem; +} + +@media screen and (min-width: 951px) { + .usa-navbar { + border-bottom: none; + display: inline-block; + height: 10.3rem; + } +} + +.usa-nav-link { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +@media screen and (min-width: 951px) { + .usa-nav-link:hover span { + border-bottom: 0.7rem solid #0071bc; + padding-bottom: 1rem; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-container { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + padding-right: 3rem; + padding-left: 3rem; + max-width: 1040px; + } + .usa-nav-container::after { + clear: both; + content: ""; + display: block; + } +} + +.usa-nav { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: auto; + background: #ffffff; + border-left: 1px solid #aeb0b5; + border-right: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + overflow-y: auto; + padding: 2rem; + -webkit-transform: translateX(26rem); + -ms-transform: translateX(26rem); + transform: translateX(26rem); + width: 26rem; + z-index: 9000; +} + +@media screen and (min-width: 951px) { + .usa-nav { + padding-top: 5rem; + padding-right: 0; + padding-bottom: 0; + border-left: none; + display: block; + float: right; + overflow-y: visible; + position: relative; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + width: auto; + } +} + +.usa-nav.is-visible { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} + +.usa-nav nav { + margin-top: 6rem; + min-height: 100%; +} + +@media screen and (min-width: 951px) { + .usa-nav nav { + margin-top: 0; + } +} + +.usa-nav .usa-current { + border-left: 4px solid #0071bc; + color: #0071bc; + font-weight: 700; + padding-left: 1.4rem; +} + +.usa-nav .usa-button { + width: 100%; +} + +@media screen and (min-width: 951px) { + .usa-nav .usa-search { + margin-left: 1.5rem; + } +} + +.usa-nav-primary { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; +} + +.usa-nav-primary > li { + margin-bottom: 0; +} + +.usa-nav-primary > li { + background-color: transparent; + border-top: 1px solid #5b616b; + font-size: 1.7rem; +} + +.usa-nav-primary > li:first-child { + border-top: none; +} + +.usa-nav-primary a { + border: none; + color: #212121; + display: block; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + line-height: 1.3; + padding: 0.85rem 1rem 0.85rem 1.8rem; + text-decoration: none; +} + +.usa-nav-primary a:hover { + background-color: #f1f1f1; + color: #0071bc; + text-decoration: none; +} + +.usa-nav-primary a:focus { + position: relative; + z-index: 1; +} + +.usa-nav-primary a.usa-current { + /* stylelint-disable-line selector-no-qualifying-type */ + border-left: 0.4rem solid #0071bc; + color: #0071bc; + font-weight: 700; + padding-left: 1.4rem; +} + +@media screen and (min-width: 951px) { + .usa-nav-primary { + display: inline; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-primary li { + border-top: none; + } +} + +.usa-nav-primary > li { + width: auto; +} + +@media screen and (min-width: 951px) { + .usa-nav-primary > li { + display: inline-block; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-primary > li > a { + padding: 1.3rem 1.5rem 1.7rem; + color: #5b616b; + font-size: 1.5rem; + font-weight: 700; + line-height: 1.2; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-primary > li > a:hover { + background-color: transparent; + } +} + +.usa-nav-primary button { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-weight: 400; + padding: 1.4rem 1.5rem 1rem 1.8rem; +} + +.usa-nav-primary button:hover { + background-color: transparent; +} + +@media screen and (min-width: 951px) { + .usa-nav-primary button { + padding-right: 3rem; + padding-bottom: 1.9rem; + padding-left: 1.5rem; + color: #5b616b; + font-size: 1.5rem; + font-weight: 700; + width: initial; + } +} + +.usa-nav-primary button:focus, .usa-nav-primary button:active { + box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf; +} + +.usa-nav-primary button:hover { + background-color: #f1f1f1; + color: #0071bc; +} + +@media screen and (min-width: 951px) { + .usa-nav-primary button:hover { + background-color: transparent; + } +} + +.usa-nav-primary button[aria-expanded=false] { + /* stylelint-disable-line selector-no-qualifying-type */ + background-image: url("../img/plus-alt.png"); + background-image: url("../img/plus-alt.svg"); + background-repeat: no-repeat; + background-position: right 0 center; + background-size: 1rem; +} + +@media screen and (min-width: 951px) { + .usa-nav-primary button[aria-expanded=false] { + background-image: url("../img/angle-arrow-down.png"); + background-image: url("../img/angle-arrow-down.svg"); + background-position: right 1.5rem top 44%; + } +} + +.usa-nav-primary button[aria-expanded=true] { + /* stylelint-disable-line selector-no-qualifying-type */ + background-image: url("../img/minus-alt.png"); + background-image: url("../img/minus-alt.svg"); + background-repeat: no-repeat; + background-position: right 0 center; + background-size: 1rem; +} + +@media screen and (min-width: 951px) { + .usa-nav-primary button[aria-expanded=true] { + background-color: #112e51; + color: #ffffff; + background-image: url("../img/angle-arrow-down-hover.png"); + background-image: url("../img/angle-arrow-down-hover.svg"); + background-position: right 1.5rem top 44%; + } + .usa-nav-primary button[aria-expanded=true]:hover { + background-color: #112e51; + } + .usa-nav-primary button[aria-expanded=true] span { + border-bottom: 0.7rem solid #0071bc; + padding-bottom: 1rem; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-primary a.usa-current { + border-left: 0; + padding-left: 1.5rem; + } + .usa-nav-primary a.usa-current span { + border-bottom: 0.7rem solid #0071bc; + padding-bottom: 1rem; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary { + position: absolute; + right: 3rem; + top: -5.7rem; + } +} + +.usa-nav-secondary .usa-search { + margin-top: 3rem; + margin-bottom: 3rem; +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary .usa-search { + margin-top: -0.2rem; + margin-bottom: 0; + margin-left: 0; + float: left; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary-links { + float: left; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary-links li { + display: inline; + padding-left: 1rem; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary-links li:not(:last-child)::after { + content: '|'; + padding-left: 1rem; + } +} + +.usa-nav-secondary-links a, +.usa-nav-secondary-links .usa-header-search-button { + color: #5b616b; + display: inline-block; + font-size: 1.5rem; + text-decoration: none; +} + +.usa-nav-secondary-links a:hover, +.usa-nav-secondary-links .usa-header-search-button:hover { + color: #0071bc; +} + +.usa-nav-secondary-links .usa-header-search-button { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + display: none; +} + +.usa-nav-secondary-links .usa-header-search-button:hover { + background-color: transparent; +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary-links .usa-header-search-button { + background-image: url("../img/search-alt.png"); + background-image: url("../img/search-alt.svg"); + background-repeat: no-repeat; + background-position: left center; + background-size: 2.2rem; + display: inline-block; + padding-left: 2.3rem; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary-links .usa-header-search-button.is-hidden { + display: none; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-secondary-links a.usa-current { + border-left: 0; + padding-left: 0; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-submenu { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; + padding-top: 1.15rem; + padding-bottom: 1.15rem; + background-color: #112e51; + min-width: 21.5rem; + width: auto; + position: absolute; + } + .usa-nav-submenu > li { + margin-bottom: 0; + } +} + +.usa-nav-submenu[aria-hidden=true] { + display: none; +} + +@media screen and (min-width: 951px) { + .usa-nav-submenu a { + color: #ffffff; + padding-left: 1.5rem; + } +} + +@media screen and (min-width: 951px) { + .usa-nav-submenu a:hover { + background-color: #112e51; + color: #ffffff; + text-decoration: underline; + } +} + +.usa-nav-submenu li { + font-size: 1.5rem; + margin-bottom: 0; +} + +.usa-nav-close { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: 400; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + margin: -1.2rem -1.5rem 2.4rem auto; + float: right; + height: 4.4rem; + text-align: center; + width: 4.4rem; +} + +.usa-nav-close:hover { + background-color: transparent; +} + +@media screen and (min-width: 951px) { + .usa-nav-close { + display: none; + } +} + +.usa-nav-close img { + width: 1.3rem; +} + +.usa-mobile_nav-active { + overflow: hidden; +} + +@media screen and (min-width: 951px) { + .usa-megamenu { + padding-top: 3.15rem; + padding-bottom: 3.15rem; + left: -1rem; + width: 100%; + } +} + +@media screen and (min-width: 951px) { + .usa-megamenu::before { + background-color: #112e51; + content: ''; + display: block; + height: 100%; + position: absolute; + top: 0; + width: 1000%; + right: 100%; + } +} + +@media screen and (min-width: 951px) { + .usa-megamenu::after { + background-color: #112e51; + content: ''; + display: block; + height: 100%; + position: absolute; + top: 0; + width: 1000%; + left: 100%; + } +} + +@media screen and (min-width: 951px) { + .usa-header-basic-megamenu .usa-nav { + padding-left: 0; + padding-top: 0; + width: 100%; + } +} + +.usa-header-basic-megamenu .usa-nav-inner { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +@media screen and (min-width: 951px) { + .usa-header-basic-megamenu .usa-nav-inner { + display: block; + float: right; + margin-top: -4.8rem; + } +} + +@media screen and (min-width: 951px) { + .usa-header-basic-megamenu .usa-nav-submenu .usa-grid-full { + margin-left: -1.8rem; + } +} + +@media screen and (min-width: 951px) { + .usa-megamenu-col { + float: left; + display: block; + margin-right: 2.35765%; + width: 23.23176%; + } + .usa-megamenu-col:last-child { + margin-right: 0; + } + .usa-megamenu-col:nth-child(2n) { + float: left; + display: block; + margin-right: 2.35765%; + width: 23.23176%; + } + .usa-megamenu-col:nth-child(2n):last-child { + margin-right: 0; + } + .usa-megamenu-col:nth-child(4n) { + margin-right: 0; + } +} + +.usa-megamenu-col > ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; +} + +.usa-megamenu-col > ul > li { + margin-bottom: 0; +} + +.usa-search { + max-width: none; + position: relative; +} + +.usa-search::after { + clear: both; + content: ""; + display: block; +} + +.usa-search [type=search], +.usa-search .usa-search-input { + padding-top: 0; + padding-bottom: 0; + -webkit-appearance: none; + border-bottom-right-radius: 0; + border-right: none; + border-top-right-radius: 0; + box-sizing: border-box; + float: left; + font-size: 1.4rem; + height: 3.3rem; + margin: 0; + width: calc(100% - 4.5rem); +} + +@media screen and (min-width: 481px) { + .usa-search [type=search], + .usa-search .usa-search-input { + width: calc(100% - 8.5rem); + } +} + +.usa-search [type=submit], +.usa-search .usa-search-submit { + background-image: url("../img/search.png"); + background-image: url("../img/search.svg"); + background-position: 50%; + background-repeat: no-repeat; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + height: 3.3rem; + margin: 0; + padding: 0; + width: 4.5rem; +} + +@media screen and (min-width: 481px) { + .usa-search [type=submit], + .usa-search .usa-search-submit { + background-image: none; + width: 8.5rem; + } +} + +.usa-search .usa-search-submit-text { + display: none; +} + +@media screen and (min-width: 481px) { + .usa-search .usa-search-submit-text { + display: block; + } +} + +@media screen and (min-width: 481px) { + .usa-search.usa-search-big [type=search], + .usa-search.usa-search-big .usa-search-input { + font-size: 1.7rem; + height: 4.4rem; + width: calc(100% - 11.6rem); + } + .usa-search.usa-search-big [type=submit], + .usa-search.usa-search-big .usa-search-submit { + font-size: 2rem; + height: 4.4rem; + width: 11.6rem; + } +} + +@media screen and (min-width: 481px) { + .usa-search.usa-search-small [type=search], + .usa-search.usa-search-small .usa-search-input { + width: calc(100% - 4.5rem); + } + .usa-search.usa-search-small [type=submit], + .usa-search.usa-search-small .usa-search-submit { + background-image: url("../img/search.png"); + background-image: url("../img/search.svg"); + background-position: 50%; + background-repeat: no-repeat; + width: 4.5rem; + } +} + +@media screen and (max-width: 950px) { + .usa-search.usa-search-small.usa-sr-only { + left: auto; + position: relative; + } +} + +.usa-section { + padding-top: 3rem; + padding-bottom: 3rem; +} + +@media screen and (min-width: 600px) { + .usa-section { + padding-top: 6rem; + padding-bottom: 6rem; + } +} + +.usa-section-light { + background-color: #f1f1f1; +} + +.usa-section-dark { + background-color: #112e51; + color: #ffffff; +} + +.usa-section-dark h1, +.usa-section-dark h2, +.usa-section-dark h3, +.usa-section-dark h4, +.usa-section-dark h5, +.usa-section-dark h6 { + color: #02bfe7; +} + +.usa-section-dark p { + color: #ffffff; +} + +.usa-section-dark a { + color: #d6d7d9; +} + +.usa-section-dark a:hover { + color: #ffffff; +} + +.usa-sidenav-list { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; +} + +.usa-sidenav-list > li { + margin-bottom: 0; +} + +.usa-sidenav-list > li { + background-color: transparent; + border-top: 1px solid #5b616b; + font-size: 1.7rem; +} + +.usa-sidenav-list > li:first-child { + border-top: none; +} + +.usa-sidenav-list a { + border: none; + color: #212121; + display: block; + font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + line-height: 1.3; + padding: 0.85rem 1rem 0.85rem 1.8rem; + text-decoration: none; +} + +.usa-sidenav-list a:hover { + background-color: #f1f1f1; + color: #0071bc; + text-decoration: none; +} + +.usa-sidenav-list a:focus { + position: relative; + z-index: 1; +} + +.usa-sidenav-list a.usa-current { + /* stylelint-disable-line selector-no-qualifying-type */ + border-left: 0.4rem solid #0071bc; + color: #0071bc; + font-weight: 700; + padding-left: 1.4rem; +} + +.usa-sidenav-sub_list { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + padding-left: 0; + margin: 0; + width: 100%; +} + +.usa-sidenav-sub_list > li { + margin-bottom: 0; +} + +.usa-sidenav-sub_list li { + border: none; + font-size: 1.5rem; +} + +.usa-sidenav-sub_list a { + padding-left: 2.8rem; + line-height: 1.3; +} + +.usa-sidenav-sub_list a:hover, .usa-sidenav-sub_list a.usa-current { + /* stylelint-disable-line selector-no-qualifying-type */ + border: none; + padding-left: 2.8rem; +} + +.usa-sidenav-sub_list .usa-sidenav-sub_list a { + padding-left: 3.8rem; +} + +.usa-sidenav-sub_list .usa-sidenav-sub_list a:hover { + padding-left: 3.8rem; +} + +.usa-skipnav { + background: transparent; + color: #212121; + left: 0; + padding: 1rem 1.5rem; + position: absolute; + top: -4.2rem; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + z-index: 100; +} + +.usa-skipnav:focus { + background: #ffffff; + left: 0; + outline: 0; + position: absolute; + top: 0; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} diff --git a/css/decanter.min.css b/css/decanter.min.css new file mode 100644 index 000000000..786a5b7bc --- /dev/null +++ b/css/decanter.min.css @@ -0,0 +1,4 @@ +/*! uswds v1.3.1 */ + +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse}td,th{padding:0}@font-face{font-family:Source Sans Pro;font-style:normal;font-weight:300;src:url(../fonts/sourcesanspro-light-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/sourcesanspro-light-webfont.woff2) format("woff2"),url(../fonts/sourcesanspro-light-webfont.woff) format("woff"),url(../fonts/sourcesanspro-light-webfont.ttf) format("truetype")}@font-face{font-family:Source Sans Pro;font-style:normal;font-weight:400;src:url(../fonts/sourcesanspro-regular-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/sourcesanspro-regular-webfont.woff2) format("woff2"),url(../fonts/sourcesanspro-regular-webfont.woff) format("woff"),url(../fonts/sourcesanspro-regular-webfont.ttf) format("truetype")}@font-face{font-family:Source Sans Pro;font-style:italic;font-weight:400;src:url(../fonts/sourcesanspro-italic-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/sourcesanspro-italic-webfont.woff2) format("woff2"),url(../fonts/sourcesanspro-italic-webfont.woff) format("woff"),url(../fonts/sourcesanspro-italic-webfont.ttf) format("truetype")}@font-face{font-family:Source Sans Pro;font-style:normal;font-weight:700;src:url(../fonts/sourcesanspro-bold-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/sourcesanspro-bold-webfont.woff2) format("woff2"),url(../fonts/sourcesanspro-bold-webfont.woff) format("woff"),url(../fonts/sourcesanspro-bold-webfont.ttf) format("truetype")}@font-face{font-family:Merriweather;font-style:normal;font-weight:300;src:url(../fonts/merriweather-light-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/merriweather-light-webfont.woff2) format("woff2"),url(../fonts/merriweather-light-webfont.woff) format("woff"),url(../fonts/merriweather-light-webfont.ttf) format("truetype")}@font-face{font-family:Merriweather;font-style:normal;font-weight:400;src:url(../fonts/merriweather-regular-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/merriweather-regular-webfont.woff2) format("woff2"),url(../fonts/merriweather-regular-webfont.woff) format("woff"),url(../fonts/merriweather-regular-webfont.ttf) format("truetype")}@font-face{font-family:Merriweather;font-style:italic;font-weight:400;src:url(../fonts/merriweather-italic-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/merriweather-italic-webfont.woff2) format("woff2"),url(../fonts/merriweather-italic-webfont.woff) format("woff"),url(../fonts/merriweather-italic-webfont.ttf) format("truetype")}@font-face{font-family:Merriweather;font-style:normal;font-weight:700;src:url(../fonts/merriweather-bold-webfont.eot?#iefix) format("embedded-opentype"),url(../fonts/merriweather-bold-webfont.woff2) format("woff2"),url(../fonts/merriweather-bold-webfont.woff) format("woff"),url(../fonts/merriweather-bold-webfont.ttf) format("truetype")}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body{background-color:#fff;overflow-x:hidden}.lt-ie9 *{-webkit-filter:none!important;filter:none!important}[hidden]{display:none!important}.usa-grid,.usa-grid-full{max-width:1200px;margin-left:auto;margin-right:auto;max-width:1040px}.usa-grid-full:after,.usa-grid:after{clear:both;content:"";display:block}.usa-grid{padding-right:1.5rem;padding-left:1.5rem}@media screen and (min-width:600px){.usa-grid{padding-right:3rem;padding-left:3rem}}.usa-grid-full{padding:0}@media screen and (min-width:600px){.usa-width-one-whole{float:left;display:block;margin-right:4.82916%;width:100%}.usa-width-one-whole:last-child{margin-right:0}.usa-width-one-half{float:left;display:block;margin-right:4.82916%;width:47.58542%}.usa-width-one-half:last-child{margin-right:0}.usa-width-one-third{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-one-third:last-child{margin-right:0}.usa-width-two-thirds{float:left;display:block;margin-right:4.82916%;width:65.05695%}.usa-width-two-thirds:last-child{margin-right:0}.usa-width-one-fourth{float:left;display:block;margin-right:4.82916%;width:47.58542%}.usa-width-one-fourth:last-child{margin-right:0}.usa-width-one-fourth:nth-child(2n){margin-right:0}.usa-width-three-fourths{float:left;display:block;margin-right:4.82916%;width:100%}.usa-width-three-fourths:last-child{margin-right:0}.usa-width-one-sixth{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-one-sixth:last-child{margin-right:0}.usa-width-one-sixth:nth-child(3n){margin-right:0}.usa-width-five-sixths{float:left;display:block;margin-right:4.82916%;width:65.05695%}.usa-width-five-sixths:last-child{margin-right:0}.usa-width-one-twelfth{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-one-twelfth:last-child{margin-right:0}.usa-width-one-twelfth:nth-child(3n){margin-right:0}.usa-width-five-twelfths{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-five-twelfths:last-child{margin-right:0}.usa-width-seven-twelfths{float:left;display:block;margin-right:4.82916%;width:65.05695%}.usa-width-seven-twelfths:last-child{margin-right:0}}@media screen and (min-width:1201px){.usa-width-one-whole{float:left;display:block;margin-right:2.35765%;width:100%}.usa-width-one-whole:last-child{margin-right:0}.usa-width-one-half{float:left;display:block;margin-right:2.35765%;width:48.82117%}.usa-width-one-half:last-child{margin-right:0}.usa-width-one-third{float:left;display:block;margin-right:2.35765%;width:31.76157%}.usa-width-one-third:last-child{margin-right:0}.usa-width-two-thirds{float:left;display:block;margin-right:2.35765%;width:65.88078%}.usa-width-two-thirds:last-child{margin-right:0}.usa-width-one-fourth{float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-width-one-fourth:last-child{margin-right:0}.usa-width-one-fourth:nth-child(2n){float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-width-one-fourth:nth-child(2n):last-child{margin-right:0}.usa-width-one-fourth:nth-child(4n){margin-right:0}.usa-width-three-fourths{float:left;display:block;margin-right:2.35765%;width:74.41059%}.usa-width-three-fourths:last-child{margin-right:0}.usa-width-one-sixth{float:left;display:block;margin-right:2.35765%;width:14.70196%}.usa-width-one-sixth:last-child{margin-right:0}.usa-width-one-sixth:nth-child(3n){float:left;display:block;margin-right:2.35765%;width:14.70196%}.usa-width-one-sixth:nth-child(3n):last-child{margin-right:0}.usa-width-one-sixth:nth-child(6n){margin-right:0}.usa-width-five-sixths{float:left;display:block;margin-right:2.35765%;width:82.94039%}.usa-width-five-sixths:last-child{margin-right:0}.usa-width-one-twelfth{float:left;display:block;margin-right:2.35765%;width:6.17215%}.usa-width-one-twelfth:last-child{margin-right:0}.usa-width-one-twelfth:nth-child(3n){float:left;display:block;margin-right:2.35765%;width:6.17215%}.usa-width-one-twelfth:nth-child(3n):last-child{margin-right:0}.usa-width-one-twelfth:nth-child(12n){margin-right:0}.usa-width-five-twelfths{float:left;display:block;margin-right:2.35765%;width:40.29137%}.usa-width-five-twelfths:last-child{margin-right:0}.usa-width-seven-twelfths{float:left;display:block;margin-right:2.35765%;width:57.35098%}.usa-width-seven-twelfths:last-child{margin-right:0}}.usa-end-row{margin-right:0}.usa-offset-one-twelfth{margin-left:8.5298%}.usa-offset-one-sixth{margin-left:17.05961%}.usa-offset-one-fourth{margin-left:25.58941%}.usa-offset-one-third{margin-left:34.11922%}.usa-offset-five-twelfths{margin-left:42.64902%}.usa-offset-one-half{margin-left:51.17883%}.usa-offset-seven-twelfths{margin-left:59.70863%}.usa-offset-two-thirds{margin-left:68.23843%}.usa-offset-three-fourths{margin-left:76.76824%}.usa-offset-five-sixths{margin-left:85.29804%}.usa-offset-eleven-twelfths{margin-left:93.82785%}.usa-sr-only{position:absolute;left:-999em}.usa-button,.usa-button-primary,.usa-button-primary:visited,.usa-button:visited,[type=button],[type=image],[type=reset],[type=submit],button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-top:.5em;margin-right:.5em;margin-bottom:.5em;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#0071bc;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.7rem;font-weight:700;line-height:1;outline:none;padding:1rem 2rem;text-align:center;text-decoration:none;width:100%}@media screen and (min-width:481px){.usa-button,.usa-button-primary,.usa-button-primary:visited,.usa-button:visited,[type=button],[type=image],[type=reset],[type=submit],button{width:auto}}.usa-button-primary.usa-button-hover,.usa-button-primary:hover,.usa-button-primary:visited.usa-button-hover,.usa-button-primary:visited:hover,.usa-button.usa-button-hover,.usa-button:hover,.usa-button:visited.usa-button-hover,.usa-button:visited:hover,[type=button].usa-button-hover,[type=button]:hover,[type=image].usa-button-hover,[type=image]:hover,[type=reset].usa-button-hover,[type=reset]:hover,[type=submit].usa-button-hover,[type=submit]:hover,button.usa-button-hover,button:hover{background-color:#205493;border-bottom:0;color:#fff;text-decoration:none}.usa-button-primary.usa-button-focus,.usa-button-primary:focus,.usa-button-primary:visited.usa-button-focus,.usa-button-primary:visited:focus,.usa-button.usa-button-focus,.usa-button:focus,.usa-button:visited.usa-button-focus,.usa-button:visited:focus,[type=button].usa-button-focus,[type=button]:focus,[type=image].usa-button-focus,[type=image]:focus,[type=reset].usa-button-focus,[type=reset]:focus,[type=submit].usa-button-focus,[type=submit]:focus,button.usa-button-focus,button:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-button-primary.usa-button-active,.usa-button-primary:active,.usa-button-primary:visited.usa-button-active,.usa-button-primary:visited:active,.usa-button.usa-button-active,.usa-button:active,.usa-button:visited.usa-button-active,.usa-button:visited:active,[type=button].usa-button-active,[type=button]:active,[type=image].usa-button-active,[type=image]:active,[type=reset].usa-button-active,[type=reset]:active,[type=submit].usa-button-active,[type=submit]:active,button.usa-button-active,button:active{background-color:#112e51}.usa-button-primary.usa-button-primary-alt,.usa-button-primary:visited.usa-button-primary-alt,.usa-button.usa-button-primary-alt,.usa-button:visited.usa-button-primary-alt,[type=button].usa-button-primary-alt,[type=image].usa-button-primary-alt,[type=reset].usa-button-primary-alt,[type=submit].usa-button-primary-alt,button.usa-button-primary-alt{background-color:#02bfe7;color:#212121}.usa-button-primary.usa-button-primary-alt.usa-button-hover,.usa-button-primary.usa-button-primary-alt:hover,.usa-button-primary:visited.usa-button-primary-alt.usa-button-hover,.usa-button-primary:visited.usa-button-primary-alt:hover,.usa-button.usa-button-primary-alt.usa-button-hover,.usa-button.usa-button-primary-alt:hover,.usa-button:visited.usa-button-primary-alt.usa-button-hover,.usa-button:visited.usa-button-primary-alt:hover,[type=button].usa-button-primary-alt.usa-button-hover,[type=button].usa-button-primary-alt:hover,[type=image].usa-button-primary-alt.usa-button-hover,[type=image].usa-button-primary-alt:hover,[type=reset].usa-button-primary-alt.usa-button-hover,[type=reset].usa-button-primary-alt:hover,[type=submit].usa-button-primary-alt.usa-button-hover,[type=submit].usa-button-primary-alt:hover,button.usa-button-primary-alt.usa-button-hover,button.usa-button-primary-alt:hover{background-color:#00a6d2}.usa-button-primary.usa-button-primary-alt.usa-button-active,.usa-button-primary.usa-button-primary-alt:active,.usa-button-primary:visited.usa-button-primary-alt.usa-button-active,.usa-button-primary:visited.usa-button-primary-alt:active,.usa-button.usa-button-primary-alt.usa-button-active,.usa-button.usa-button-primary-alt:active,.usa-button:visited.usa-button-primary-alt.usa-button-active,.usa-button:visited.usa-button-primary-alt:active,[type=button].usa-button-primary-alt.usa-button-active,[type=button].usa-button-primary-alt:active,[type=image].usa-button-primary-alt.usa-button-active,[type=image].usa-button-primary-alt:active,[type=reset].usa-button-primary-alt.usa-button-active,[type=reset].usa-button-primary-alt:active,[type=submit].usa-button-primary-alt.usa-button-active,[type=submit].usa-button-primary-alt:active,button.usa-button-primary-alt.usa-button-active,button.usa-button-primary-alt:active{background-color:#046b99;color:#fff}.usa-button-primary.usa-button-secondary,.usa-button-primary:visited.usa-button-secondary,.usa-button.usa-button-secondary,.usa-button:visited.usa-button-secondary,[type=button].usa-button-secondary,[type=image].usa-button-secondary,[type=reset].usa-button-secondary,[type=submit].usa-button-secondary,button.usa-button-secondary{background-color:#e31c3d}.usa-button-primary.usa-button-secondary.usa-button-hover,.usa-button-primary.usa-button-secondary:hover,.usa-button-primary:visited.usa-button-secondary.usa-button-hover,.usa-button-primary:visited.usa-button-secondary:hover,.usa-button.usa-button-secondary.usa-button-hover,.usa-button.usa-button-secondary:hover,.usa-button:visited.usa-button-secondary.usa-button-hover,.usa-button:visited.usa-button-secondary:hover,[type=button].usa-button-secondary.usa-button-hover,[type=button].usa-button-secondary:hover,[type=image].usa-button-secondary.usa-button-hover,[type=image].usa-button-secondary:hover,[type=reset].usa-button-secondary.usa-button-hover,[type=reset].usa-button-secondary:hover,[type=submit].usa-button-secondary.usa-button-hover,[type=submit].usa-button-secondary:hover,button.usa-button-secondary.usa-button-hover,button.usa-button-secondary:hover{background-color:#cd2026}.usa-button-primary.usa-button-secondary.usa-button-active,.usa-button-primary.usa-button-secondary:active,.usa-button-primary:visited.usa-button-secondary.usa-button-active,.usa-button-primary:visited.usa-button-secondary:active,.usa-button.usa-button-secondary.usa-button-active,.usa-button.usa-button-secondary:active,.usa-button:visited.usa-button-secondary.usa-button-active,.usa-button:visited.usa-button-secondary:active,[type=button].usa-button-secondary.usa-button-active,[type=button].usa-button-secondary:active,[type=image].usa-button-secondary.usa-button-active,[type=image].usa-button-secondary:active,[type=reset].usa-button-secondary.usa-button-active,[type=reset].usa-button-secondary:active,[type=submit].usa-button-secondary.usa-button-active,[type=submit].usa-button-secondary:active,button.usa-button-secondary.usa-button-active,button.usa-button-secondary:active{background-color:#981b1e}.usa-button-primary.usa-button-gray,.usa-button-primary:visited.usa-button-gray,.usa-button.usa-button-gray,.usa-button:visited.usa-button-gray,[type=button].usa-button-gray,[type=image].usa-button-gray,[type=reset].usa-button-gray,[type=submit].usa-button-gray,button.usa-button-gray{background-color:#5b616b}.usa-button-primary.usa-button-gray.usa-button-hover,.usa-button-primary.usa-button-gray:hover,.usa-button-primary:visited.usa-button-gray.usa-button-hover,.usa-button-primary:visited.usa-button-gray:hover,.usa-button.usa-button-gray.usa-button-hover,.usa-button.usa-button-gray:hover,.usa-button:visited.usa-button-gray.usa-button-hover,.usa-button:visited.usa-button-gray:hover,[type=button].usa-button-gray.usa-button-hover,[type=button].usa-button-gray:hover,[type=image].usa-button-gray.usa-button-hover,[type=image].usa-button-gray:hover,[type=reset].usa-button-gray.usa-button-hover,[type=reset].usa-button-gray:hover,[type=submit].usa-button-gray.usa-button-hover,[type=submit].usa-button-gray:hover,button.usa-button-gray.usa-button-hover,button.usa-button-gray:hover{background-color:#323a45}.usa-button-primary.usa-button-gray.usa-button-active,.usa-button-primary.usa-button-gray:active,.usa-button-primary:visited.usa-button-gray.usa-button-active,.usa-button-primary:visited.usa-button-gray:active,.usa-button.usa-button-gray.usa-button-active,.usa-button.usa-button-gray:active,.usa-button:visited.usa-button-gray.usa-button-active,.usa-button:visited.usa-button-gray:active,[type=button].usa-button-gray.usa-button-active,[type=button].usa-button-gray:active,[type=image].usa-button-gray.usa-button-active,[type=image].usa-button-gray:active,[type=reset].usa-button-gray.usa-button-active,[type=reset].usa-button-gray:active,[type=submit].usa-button-gray.usa-button-active,[type=submit].usa-button-gray:active,button.usa-button-gray.usa-button-active,button.usa-button-gray:active{background-color:#212121}.usa-button-primary.usa-button-outline,.usa-button-primary:visited.usa-button-outline,.usa-button.usa-button-outline,.usa-button:visited.usa-button-outline,[type=button].usa-button-outline,[type=image].usa-button-outline,[type=reset].usa-button-outline,[type=submit].usa-button-outline,button.usa-button-outline{background-color:#fff;box-shadow:inset 0 0 0 2px #0071bc;color:#0071bc}.usa-button-primary.usa-button-outline.usa-button-hover,.usa-button-primary.usa-button-outline:hover,.usa-button-primary:visited.usa-button-outline.usa-button-hover,.usa-button-primary:visited.usa-button-outline:hover,.usa-button.usa-button-outline.usa-button-hover,.usa-button.usa-button-outline:hover,.usa-button:visited.usa-button-outline.usa-button-hover,.usa-button:visited.usa-button-outline:hover,[type=button].usa-button-outline.usa-button-hover,[type=button].usa-button-outline:hover,[type=image].usa-button-outline.usa-button-hover,[type=image].usa-button-outline:hover,[type=reset].usa-button-outline.usa-button-hover,[type=reset].usa-button-outline:hover,[type=submit].usa-button-outline.usa-button-hover,[type=submit].usa-button-outline:hover,button.usa-button-outline.usa-button-hover,button.usa-button-outline:hover{box-shadow:inset 0 0 0 2px #205493;color:#205493}.usa-button-primary.usa-button-outline.usa-button-active,.usa-button-primary.usa-button-outline:active,.usa-button-primary:visited.usa-button-outline.usa-button-active,.usa-button-primary:visited.usa-button-outline:active,.usa-button.usa-button-outline.usa-button-active,.usa-button.usa-button-outline:active,.usa-button:visited.usa-button-outline.usa-button-active,.usa-button:visited.usa-button-outline:active,[type=button].usa-button-outline.usa-button-active,[type=button].usa-button-outline:active,[type=image].usa-button-outline.usa-button-active,[type=image].usa-button-outline:active,[type=reset].usa-button-outline.usa-button-active,[type=reset].usa-button-outline:active,[type=submit].usa-button-outline.usa-button-active,[type=submit].usa-button-outline:active,button.usa-button-outline.usa-button-active,button.usa-button-outline:active{box-shadow:inset 0 0 0 2px #112e51;color:#112e51}.usa-button-primary.usa-button-outline.usa-button-focus,.usa-button-primary.usa-button-outline:focus,.usa-button-primary:visited.usa-button-outline.usa-button-focus,.usa-button-primary:visited.usa-button-outline:focus,.usa-button.usa-button-outline.usa-button-focus,.usa-button.usa-button-outline:focus,.usa-button:visited.usa-button-outline.usa-button-focus,.usa-button:visited.usa-button-outline:focus,[type=button].usa-button-outline.usa-button-focus,[type=button].usa-button-outline:focus,[type=image].usa-button-outline.usa-button-focus,[type=image].usa-button-outline:focus,[type=reset].usa-button-outline.usa-button-focus,[type=reset].usa-button-outline:focus,[type=submit].usa-button-outline.usa-button-focus,[type=submit].usa-button-outline:focus,button.usa-button-outline.usa-button-focus,button.usa-button-outline:focus{box-shadow:inset 0 0 0 2px #112e51,0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-button-primary.usa-button-outline-inverse,.usa-button-primary:visited.usa-button-outline-inverse,.usa-button.usa-button-outline-inverse,.usa-button:visited.usa-button-outline-inverse,[type=button].usa-button-outline-inverse,[type=image].usa-button-outline-inverse,[type=reset].usa-button-outline-inverse,[type=submit].usa-button-outline-inverse,button.usa-button-outline-inverse{background:transparent;box-shadow:inset 0 0 0 2px #fff;color:#fff}.usa-button-primary.usa-button-outline-inverse.usa-button-hover,.usa-button-primary.usa-button-outline-inverse:hover,.usa-button-primary:visited.usa-button-outline-inverse.usa-button-hover,.usa-button-primary:visited.usa-button-outline-inverse:hover,.usa-button.usa-button-outline-inverse.usa-button-hover,.usa-button.usa-button-outline-inverse:hover,.usa-button:visited.usa-button-outline-inverse.usa-button-hover,.usa-button:visited.usa-button-outline-inverse:hover,[type=button].usa-button-outline-inverse.usa-button-hover,[type=button].usa-button-outline-inverse:hover,[type=image].usa-button-outline-inverse.usa-button-hover,[type=image].usa-button-outline-inverse:hover,[type=reset].usa-button-outline-inverse.usa-button-hover,[type=reset].usa-button-outline-inverse:hover,[type=submit].usa-button-outline-inverse.usa-button-hover,[type=submit].usa-button-outline-inverse:hover,button.usa-button-outline-inverse.usa-button-hover,button.usa-button-outline-inverse:hover{box-shadow:inset 0 0 0 2px #d6d7d9;color:#d6d7d9}.usa-button-primary.usa-button-outline-inverse.usa-button-active,.usa-button-primary.usa-button-outline-inverse:active,.usa-button-primary:visited.usa-button-outline-inverse.usa-button-active,.usa-button-primary:visited.usa-button-outline-inverse:active,.usa-button.usa-button-outline-inverse.usa-button-active,.usa-button.usa-button-outline-inverse:active,.usa-button:visited.usa-button-outline-inverse.usa-button-active,.usa-button:visited.usa-button-outline-inverse:active,[type=button].usa-button-outline-inverse.usa-button-active,[type=button].usa-button-outline-inverse:active,[type=image].usa-button-outline-inverse.usa-button-active,[type=image].usa-button-outline-inverse:active,[type=reset].usa-button-outline-inverse.usa-button-active,[type=reset].usa-button-outline-inverse:active,[type=submit].usa-button-outline-inverse.usa-button-active,[type=submit].usa-button-outline-inverse:active,button.usa-button-outline-inverse.usa-button-active,button.usa-button-outline-inverse:active{box-shadow:inset 0 0 0 2px #aeb0b5;color:#d6d7d9}.usa-button-primary.usa-button-outline-inverse.usa-button-focus,.usa-button-primary.usa-button-outline-inverse:focus,.usa-button-primary:visited.usa-button-outline-inverse.usa-button-focus,.usa-button-primary:visited.usa-button-outline-inverse:focus,.usa-button.usa-button-outline-inverse.usa-button-focus,.usa-button.usa-button-outline-inverse:focus,.usa-button:visited.usa-button-outline-inverse.usa-button-focus,.usa-button:visited.usa-button-outline-inverse:focus,[type=button].usa-button-outline-inverse.usa-button-focus,[type=button].usa-button-outline-inverse:focus,[type=image].usa-button-outline-inverse.usa-button-focus,[type=image].usa-button-outline-inverse:focus,[type=reset].usa-button-outline-inverse.usa-button-focus,[type=reset].usa-button-outline-inverse:focus,[type=submit].usa-button-outline-inverse.usa-button-focus,[type=submit].usa-button-outline-inverse:focus,button.usa-button-outline-inverse.usa-button-focus,button.usa-button-outline-inverse:focus{box-shadow:inset 0 0 0 2px #aeb0b5,0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-button-primary.usa-button-big,.usa-button-primary:visited.usa-button-big,.usa-button.usa-button-big,.usa-button:visited.usa-button-big,[type=button].usa-button-big,[type=image].usa-button-big,[type=reset].usa-button-big,[type=submit].usa-button-big,button.usa-button-big{font-size:1.9rem;padding:1.5rem 3rem}.usa-button-disabled,.usa-button:disabled{background-color:#d6d7d9;color:#323a45;pointer-events:none}.usa-button-disabled.usa-button-active,.usa-button-disabled.usa-button-hover,.usa-button-disabled:active,.usa-button-disabled:focus,.usa-button-disabled:hover,.usa-button:disabled.usa-button-active,.usa-button:disabled.usa-button-hover,.usa-button:disabled:active,.usa-button:disabled:focus,.usa-button:disabled:hover{background-color:#d6d7d9;border:0;box-shadow:none;color:#323a45}.usa-button-unstyled{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto}.usa-button-unstyled:hover{background-color:transparent}.usa-embed-container embed,.usa-embed-container iframe,.usa-embed-container object{position:absolute;top:0;left:0;width:100%;height:100%}.usa-embed-container{padding-bottom:56.25%;position:relative;height:0;overflow:hidden;max-width:100%}img{max-width:100%}.media_link{display:inline-block;line-height:0}input,select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:.1rem solid #5b616b;border-radius:0;box-sizing:border-box;color:#212121;display:block;font-size:1.7rem;height:4.4rem;line-height:1.3;margin:.2em 0;max-width:46rem;outline:none;padding:1rem .7em;width:100%}input.usa-input-focus,input:focus,select.usa-input-focus,select:focus,textarea.usa-input-focus,textarea:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}input.usa-input-success,select.usa-input-success,textarea.usa-input-success{border:3px solid #4aa564}.usa-input-error{border-left:4px solid #cd2026;margin-top:3rem;padding-bottom:.8rem;padding-left:1.5rem;padding-top:.8rem;position:relative;right:1.9rem}.usa-input-error input,.usa-input-error select,.usa-input-error textarea{border:3px solid #cd2026;width:calc(100% + 1.9rem)}.usa-input-error label{margin-top:0}.usa-input-error .usa-input-inline{border:.1rem solid #5b616b;width:inherit}.usa-input-error .usa-input-inline-error{border:3px solid #cd2026}.usa-input-error-label{display:block;font-size:1.7rem;font-weight:700}.usa-input-error-message{color:#cd2026;display:block;font-size:1.7rem;font-weight:700;padding-bottom:3px;padding-top:3px}.usa-input-required:after{color:#981b1e;content:" (*Required)"}label{display:block;margin-top:3rem;max-width:46rem}textarea{height:16rem}select{-moz-appearance:none;-webkit-appearance:none;appearance:none;background-color:#fff;background-image:url(../img/arrow-down.png);background-image:url(../img/arrow-down.svg);background-position:right 1.3rem center;background-repeat:no-repeat;background-size:1.3rem}legend{font-size:3rem;font-weight:700}.usa-fieldset-inputs label{margin-top:0}.usa-form-hint{color:#757575;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;margin-bottom:0}[type=checkbox],[type=radio]{position:absolute;left:-999em}.lt-ie9 [type=checkbox],.lt-ie9 [type=radio]{border:0;float:left;margin:.4em .4em 0 0;position:static;width:auto}[type=checkbox]+label,[type=radio]+label{cursor:pointer;font-weight:400;margin-bottom:.5em}[type=checkbox]+label:before,[type=radio]+label:before{background:#fff;border-radius:3px;box-shadow:0 0 0 1px #757575;content:"\a0";display:inline-block;height:1.8rem;line-height:1.8rem;margin-right:.6em;text-indent:.15em;vertical-align:middle\0;width:1.8rem}[type=radio]+label:before{box-shadow:0 0 0 2px #fff,0 0 0 3px #757575;height:1.6rem;line-height:1.6rem;width:1.6rem;border-radius:100%}[type=checkbox]:checked+label:before,[type=radio]:checked+label:before{background-color:#0071bc;box-shadow:0 0 0 1px #0071bc}[type=radio]:checked+label:before{box-shadow:0 0 0 2px #fff,0 0 0 4px #0071bc}[type=radio]:focus+label:before{box-shadow:0 0 0 2px #fff,0 0 0 4px #0071bc,0 0 3px 4px #3e94cf,0 0 7px 4px #3e94cf}[type=checkbox]:checked+label:before,[type=checkbox]:checked:disabled+label:before{background-image:url(../img/correct8.png);background-image:url(../img/correct8.svg);background-position:50%;background-repeat:no-repeat}[type=checkbox]:focus+label:before{box-shadow:0 0 0 1px #fff,0 0 0 3px #0071bc}[type=checkbox]:disabled+label{color:#5b616b}[type=checkbox]:disabled+label:before,[type=radio]:disabled+label:before{background:#d6d7d9;box-shadow:0 0 0 1px #aeb0b5;cursor:not-allowed}[type=range]{-webkit-appearance:none;border:none;padding-left:0;width:100%}[type=range]:focus{box-shadow:none;outline:none}[type=range]::-webkit-slider-runnable-track{background:#aeb0b5;border:1px solid #757575;cursor:pointer;height:1.2rem;width:100%}[type=range]::-moz-range-track{background:#0071bc;border:1px solid #757575;cursor:pointer;height:1.2rem;width:100%}[type=range]::-ms-track{background:transparent;color:transparent;cursor:pointer;height:1.2rem;width:100%}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #757575;height:2.2rem;border-radius:1.5rem;background:#f1f1f1;cursor:pointer;margin-top:-.65rem;width:2.2rem}[type=range]::-moz-range-thumb{background:#f1f1f1;border:1px solid #757575;border-radius:1.5rem;cursor:pointer;height:2.2rem;width:2.2rem}[type=range]::-ms-thumb{background:#f1f1f1;border:1px solid #757575;border-radius:1.5rem;cursor:pointer;height:2.2rem;width:2.2rem}[type=range]::-ms-fill-lower{background:#aeb0b5;border:1px solid #757575;border-radius:2rem}[type=range]::-ms-fill-upper{background:#aeb0b5;border:1px solid #757575;border-radius:2rem}[type=range]:focus::-webkit-slider-thumb{border:2px solid #3e94cf}[type=range]:focus::-moz-range-thumb{border:2px solid #3e94cf}[type=range]:focus::-ms-thumb{border:2px solid #3e94cf}.usa-date-of-birth label{margin-top:0}.usa-date-of-birth [type=number]::-webkit-inner-spin-button,.usa-date-of-birth [type=number]::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.usa-date-of-birth [type=number]{-moz-appearance:textfield}.usa-form-group-day,.usa-form-group-month,.usa-form-group-year{clear:none;float:left;margin-right:1.5rem;width:5rem}.usa-form-group-year{width:7rem}.usa-label,.usa-label-big{background-color:#0071bc;border-radius:3px;color:#fff;font-size:1.5rem;margin-right:.5rem;padding:.1rem .7rem;text-transform:uppercase}.usa-label-big:only-of-type,.usa-label:only-of-type{margin-right:0}.usa-label-big{font-size:1.7rem;padding-left:.9rem;padding-right:.9rem}ol,ul{margin-top:1em;margin-bottom:1em;padding-left:1.94em}li{line-height:1.5;margin-bottom:.5em}li:last-child{margin-bottom:0}h1+ol,h1+ul,h2+ol,h2+ul,h3+ol,h3+ul,h4+ol,h4+ul,h5+ol,h5+ul,h6+ol,h6+ul,p+ol,p+ul{margin-top:0}.usa-unstyled-list{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0}.usa-unstyled-list>li{margin-bottom:0}table{border-spacing:0;margin:2em 0;min-width:100%}table thead td,table thead th{background-color:#f1f1f1}table th{text-align:left}table tbody th{font-weight:400}table td,table th{background-color:#fff;border:1px solid #5b616b;padding:1.5rem}.usa-table-borderless thead tr{background-color:transparent}.usa-table-borderless thead th{border-top:0}.usa-table-borderless td,.usa-table-borderless th{border-left:0;border-right:0}html{font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:10px}body{font-size:1.7rem}p{line-height:1.5;margin-bottom:1em;margin-top:1em}a{color:#0071bc;text-decoration:underline}a:active,a:hover{color:#205493}a:visited{color:#4c2c92}a:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf;outline:0}.usa-external_link:after{background:url(../img/external-link.png) no-repeat 0 0;background:url(../img/external-link.svg) no-repeat 0 0;background-size:100%;content:"";display:inline-block;height:.65em;margin-bottom:-1px;margin-left:4px;width:.65em}.usa-external_link:hover:after{background-image:url(../img/external-link-hover.png);background-image:url(../img/external-link-hover.svg)}.usa-external_link-alt:after{background:url(../img/external-link-alt.png) no-repeat 0 0;background:url(../img/external-link-alt.svg) no-repeat 0 0;background-size:100%;content:"";display:inline-block;height:.65em;margin-bottom:-1px;margin-left:4px;width:.65em}.usa-external_link-alt:hover:after{background-image:url(../img/external-link-alt-hover.png);background-image:url(../img/external-link-alt-hover.svg)}h1,h2,h3,h4,h5,h6{clear:both;font-family:Merriweather,Georgia,Cambria,Times New Roman,Times,serif;line-height:1.3;margin-bottom:.5em;margin-top:1.5em}h1{font-size:4rem;font-weight:700}h2{font-size:3rem;font-weight:700}h3{font-size:2rem;font-weight:700}h4{font-size:1.7rem;font-weight:700}h5{font-size:1.5rem;font-weight:700}h6{font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.3rem;font-weight:400;text-transform:uppercase}address,cite,dfn,var{font-style:normal}.usa-content ol:not(.usa-accordion):not(.usa-accordion-bordered),.usa-content p:not(.usa-font-lead),.usa-content ul:not(.usa-accordion):not(.usa-accordion-bordered){max-width:53rem}.usa-content-list{max-width:53rem}.usa-sans a,.usa-sans li,.usa-sans p,.usa-sans span{font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}.usa-sans a{border-bottom:none;font-weight:700}.usa-serif a,.usa-serif li,.usa-serif p,.usa-serif span{font-family:Merriweather,Georgia,Cambria,Times New Roman,Times,serif}.usa-display{font-size:2rem;font-weight:700;margin-bottom:0}@media screen and (min-width:481px){.usa-display{font-size:4rem;font-weight:700}}@media screen and (min-width:600px){.usa-display{font-size:5.2rem;font-weight:700}}.usa-font-lead{font-family:Merriweather,Georgia,Cambria,Times New Roman,Times,serif;font-size:2rem;line-height:1.7;max-width:77rem}.usa-image-block{position:relative}.usa-image-text-block{color:#fff;left:0;margin-left:8%;position:absolute;top:0}.usa-image-text{margin-top:0}.usa-drop_text{margin-bottom:0}.usa-background-dark{background-color:#323a45}.usa-background-dark p,.usa-background-dark span{color:#fff}.usa-background-dark a{color:#d6d7d9}.usa-background-dark a:hover{color:#fff}.usa-text-small{font-size:1.3rem;margin-top:0}.usa-grid-full>:first-child,.usa-grid>:first-child,.usa-section>:first-child{margin-top:0}.usa-grid-full>:last-child,.usa-grid>:last-child,.usa-section>:last-child{margin-bottom:0}.usa-width-five-sixths:first-child>:first-child,.usa-width-one-fourth:first-child>:first-child,.usa-width-one-half:first-child>:first-child,.usa-width-one-sixth:first-child>:first-child,.usa-width-one-third:first-child>:first-child,.usa-width-one-twelfth:first-child>:first-child,.usa-width-one-whole:first-child>:first-child,.usa-width-three-fourths:first-child>:first-child,.usa-width-two-thirds:first-child>:first-child{margin-top:0}@media screen and (min-width:600px){.usa-width-five-sixths>:first-child,.usa-width-one-fourth>:first-child,.usa-width-one-half>:first-child,.usa-width-one-sixth>:first-child,.usa-width-one-third>:first-child,.usa-width-one-twelfth>:first-child,.usa-width-one-whole>:first-child,.usa-width-three-fourths>:first-child,.usa-width-two-thirds>:first-child{margin-top:0}}.usa-width-five-sixths:last-child>:last-child,.usa-width-one-fourth:last-child>:last-child,.usa-width-one-half:last-child>:last-child,.usa-width-one-sixth:last-child>:last-child,.usa-width-one-third:last-child>:last-child,.usa-width-one-twelfth:last-child>:last-child,.usa-width-one-whole:last-child>:last-child,.usa-width-three-fourths:last-child>:last-child,.usa-width-two-thirds:last-child>:last-child{margin-bottom:0}@media screen and (min-width:600px){.usa-width-five-sixths>:last-child,.usa-width-one-fourth>:last-child,.usa-width-one-half>:last-child,.usa-width-one-sixth>:last-child,.usa-width-one-third>:last-child,.usa-width-one-twelfth>:last-child,.usa-width-one-whole>:last-child,.usa-width-three-fourths>:last-child,.usa-width-two-thirds>:last-child{margin-bottom:0}}.usa-accordion,.usa-accordion-bordered{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;color:#212121;margin:0;padding:0;width:100%}.usa-accordion-bordered>li,.usa-accordion>li{margin-bottom:0}.usa-accordion-bordered>ul li ul,.usa-accordion>ul li ul{list-style:disc}.usa-accordion-bordered>ul li ul>li>ul,.usa-accordion>ul li ul>li>ul{list-style:circle}.usa-accordion-bordered>ul li ul>li>ul>li>ul,.usa-accordion>ul li ul>li>ul>li>ul{list-style:square}.usa-accordion+.usa-accordion,.usa-accordion+.usa-accordion-bordered,.usa-accordion-bordered+.usa-accordion,.usa-accordion-bordered+.usa-accordion-bordered{margin-top:1rem}.usa-accordion-bordered>ul,.usa-accordion>ul{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;color:#212121;margin:0;padding:0;width:100%}.usa-accordion-bordered>ul>li,.usa-accordion>ul>li{margin-bottom:0}.usa-accordion-bordered>ul>li,.usa-accordion>ul>li{background-color:#f1f1f1;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;list-style:none;margin-bottom:6px;width:100%}.usa-accordion-bordered>ul button,.usa-accordion>ul button{background-color:transparent;border:0;border-radius:0;font-weight:400;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;background-color:#f1f1f1;background-image:url(../img/minus.png);background-image:url(../img/minus.svg);background-position:right 3rem center;background-repeat:no-repeat;background-size:13px;color:#212121;cursor:pointer;display:inline-block;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:700;margin:0;padding:1.5rem 5.5rem 1.5rem 3rem;width:100%}.usa-accordion-bordered>ul button:hover,.usa-accordion>ul button:hover{background-color:transparent}.usa-accordion-bordered>ul button:focus,.usa-accordion>ul button:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-accordion-bordered>ul button:hover,.usa-accordion>ul button:hover{background-color:#d6d7d9;color:#212121}.usa-accordion-bordered>ul button h1,.usa-accordion-bordered>ul button h2,.usa-accordion-bordered>ul button h3,.usa-accordion-bordered>ul button h4,.usa-accordion-bordered>ul button h5,.usa-accordion-bordered>ul button h6,.usa-accordion>ul button h1,.usa-accordion>ul button h2,.usa-accordion>ul button h3,.usa-accordion>ul button h4,.usa-accordion>ul button h5,.usa-accordion>ul button h6{margin:0}.usa-accordion-bordered>ul [aria-expanded=false],.usa-accordion>ul [aria-expanded=false]{background-image:url(../img/plus.png);background-image:url(../img/plus.svg);background-repeat:no-repeat;background-size:1.3rem}.usa-accordion-bordered>li,.usa-accordion>li{background-color:#f1f1f1;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;list-style:none;margin-bottom:6px;width:100%}.usa-accordion-bordered .usa-accordion-content{border-bottom:3px solid #f1f1f1;border-left:3px solid #f1f1f1;border-right:3px solid #f1f1f1}.usa-accordion-content{background-color:#fff;overflow:auto;padding:3rem}.usa-accordion-content>:first-child{margin-top:0}.usa-accordion-content>:last-child{margin-bottom:0}.usa-accordion-content:not([aria-hidden]){position:absolute;left:-999em}.usa-accordion-content[aria-hidden=true]{display:none}.usa-accordion-button{background-color:transparent;border:0;border-radius:0;font-weight:400;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;background-color:#f1f1f1;background-image:url(../img/minus.png);background-image:url(../img/minus.svg);background-position:right 3rem center;background-repeat:no-repeat;background-size:13px;color:#212121;cursor:pointer;display:inline-block;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:700;margin:0;padding:1.5rem 5.5rem 1.5rem 3rem;width:100%}.usa-accordion-button:hover{background-color:transparent}.usa-accordion-button:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-accordion-button:hover{background-color:#d6d7d9;color:#212121}.usa-accordion-button h1,.usa-accordion-button h2,.usa-accordion-button h3,.usa-accordion-button h4,.usa-accordion-button h5,.usa-accordion-button h6{margin:0}.usa-accordion-button[aria-expanded=false]{background-image:url(../img/plus.png);background-image:url(../img/plus.svg);background-repeat:no-repeat;background-size:1.3rem}.usa-alert{background-color:#f1f1f1;background-position:1rem 2rem;background-repeat:no-repeat;background-size:4rem;margin-top:1.5em;padding:1em}@media screen and (min-width:600px){.usa-alert{background-size:5.2rem}}.usa-alert a{color:#205493}.usa-alert a:focus,.usa-alert a:hover{color:#112e51}.usa-alert ul{margin-bottom:0;margin-top:1em;padding-left:1em}.usa-alert-icon{display:table-cell;padding-right:1rem}.usa-alert-body{display:table-cell;padding-left:3.5rem;vertical-align:top}@media screen and (min-width:600px){.usa-alert-body{padding-left:5rem}}.usa-alert-body p:first-child{margin-top:.8rem}.usa-alert-body p:last-child{margin-bottom:.8rem}.usa-alert-heading{margin-bottom:.3rem;margin-top:0}@media screen and (min-width:600px){.usa-alert-heading{margin-top:.3rem}}.usa-alert-text{font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;margin-bottom:0;margin-top:0}.usa-alert-success{background-color:#e7f4e4;background-image:url(../img/alerts/success.png);background-image:url(../img/alerts/success.svg)}.usa-alert-warning{background-color:#fff1d2;background-image:url(../img/alerts/warning.png);background-image:url(../img/alerts/warning.svg)}.usa-alert-error{background-color:#f9dede;background-image:url(../img/alerts/error.png);background-image:url(../img/alerts/error.svg)}.usa-alert-info{background-color:#e1f3f8;background-image:url(../img/alerts/info.png);background-image:url(../img/alerts/info.svg)}.usa-alert-no_icon{background-image:none}.usa-alert-paragraph{width:53rem;padding:1em 3em 1em 1em}.usa-banner{background-color:#f1f1f1;padding-bottom:.7rem}@media screen and (min-width:481px){.usa-banner{font-size:1.3rem;padding-bottom:0}}.usa-banner-content{padding:2rem 1.5rem 3px;background-color:transparent;font-size:1.5rem;width:100%}@media screen and (min-width:600px){.usa-banner-content{padding-bottom:2.3rem;padding-top:4rem}}@media screen and (min-width:951px){.usa-banner-content{padding-right:3rem;padding-left:3rem}}.usa-banner-content p:first-child{margin-top:1rem}@media screen and (min-width:600px){.usa-banner-content p:first-child{margin-top:0}}.usa-banner-inner{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:1.5rem;padding-left:1.5rem;max-width:1040px}.usa-banner-inner:after{clear:both;content:"";display:block}@media screen and (min-width:951px){.usa-banner-inner{padding-right:3rem;padding-left:3rem}}.usa-banner-header{padding-top:.55rem;padding-bottom:.55rem;font-size:1.2rem;font-weight:400}@media screen and (min-width:481px){.usa-banner-header{padding-top:0;padding-bottom:0}}.usa-banner-header p{margin-top:0;margin-bottom:0;display:inline;overflow:hidden;vertical-align:middle}@media screen and (min-width:481px){.usa-banner-header p{margin-top:2px;margin-bottom:2px;display:inline-block}}.usa-banner-header img{float:left;margin-right:1rem;margin-top:1px;width:2.4rem}@media screen and (min-width:481px){.usa-banner-header img{margin-right:.7rem;width:2rem}}.usa-banner-header-expanded{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #aeb0b5;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:1.5rem;min-height:5.6rem;padding-right:3rem}@media screen and (min-width:481px){.usa-banner-header-expanded{border-bottom:none;display:block;font-size:1.2rem;font-weight:400;min-height:0;padding-right:0}}.usa-banner-header-expanded>.usa-banner-inner{margin-left:0}@media screen and (min-width:481px){.usa-banner-header-expanded>.usa-banner-inner{margin-left:auto}}.usa-banner-header-expanded img{margin-right:2.4rem}@media screen and (min-width:481px){.usa-banner-header-expanded img{margin-right:.7rem}}.usa-banner-header-expanded p{line-height:1.3;vertical-align:top}@media screen and (min-width:481px){.usa-banner-header-expanded p{line-height:1.5;vertical-align:middle}}.usa-banner-button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;padding-top:1.3rem;padding-left:4.8rem;background-position-x:right;color:#0071bc;display:block;font-size:1.2rem;height:4.3rem;left:0;position:absolute;text-decoration:underline;top:0;width:100%}.usa-banner-button:hover{background-color:transparent}@media screen and (min-width:481px){.usa-banner-button{padding-top:0;padding-left:0;display:inline;height:auto;margin-left:3px;position:relative;vertical-align:middle;width:auto}}.usa-banner-button:hover{color:#205493;text-decoration:underline}.usa-banner-button[aria-expanded=false]{background-image:none}.usa-banner-button[aria-expanded=false]:after{background-image:url(../img/angle-arrow-down-primary.png);background-image:url(../img/angle-arrow-down-primary.svg);background-size:100%;content:"";display:inline-block;height:1rem;width:1rem;margin-left:0}.usa-banner-button[aria-expanded=false]:hover:after{background-image:url(../img/angle-arrow-down-primary-hover.png);background-image:url(../img/angle-arrow-down-primary-hover.svg)}.usa-banner-button[aria-expanded=false]:after{background-position-y:1px}.usa-banner-button[aria-expanded=true]{background-image:none;height:5.6rem}.usa-banner-button[aria-expanded=true]:after{background-image:url(../img/close.png);background-image:url(../img/close.svg);background-size:100%;content:"";display:inline-block;height:1.3rem;width:1.3rem;margin-left:0}@media screen and (min-width:481px){.usa-banner-button[aria-expanded=true]{height:auto;padding:0;position:relative}.usa-banner-button[aria-expanded=true]:after{background-image:url(../img/angle-arrow-up-primary.png);background-image:url(../img/angle-arrow-up-primary.svg);background-size:100%;content:"";display:inline-block;height:1rem;width:1rem;margin-left:0}.usa-banner-button[aria-expanded=true]:hover:after{background-image:url(../img/angle-arrow-up-primary-hover.png);background-image:url(../img/angle-arrow-up-primary-hover.svg)}.usa-banner-button[aria-expanded=true]:after{background-position-y:1px}}.usa-banner-button[aria-expanded=true]:after{position:absolute;right:1.5rem;top:2.15rem}@media screen and (min-width:481px){.usa-banner-button[aria-expanded=true]:after{position:static}}.usa-banner-button[aria-expanded=true] .usa-banner-button-text{display:none}@media screen and (min-width:481px){.usa-banner-button[aria-expanded=true] .usa-banner-button-text{display:inline}}.usa-banner-icon{width:3.8rem}.usa-footer .usa-unstyled-list{display:block}.usa-footer .usa-footer-primary-link{color:#212121;display:block;font-weight:700;margin-top:0;padding-bottom:2rem;padding-top:2rem;text-decoration:none}@media screen and (min-width:600px){.usa-footer .usa-footer-primary-link{border-top:none}}.usa-footer .usa-footer-primary-link:hover{text-decoration:underline}.usa-footer a{font-weight:400}.usa-footer-return-to-top{padding-bottom:2rem;padding-top:2rem}.usa-footer-primary-section{background-color:#f1f1f1}.usa-footer-primary-section .usa-footer-primary-content{padding-left:2.5rem;padding-right:2.5rem}@media screen and (min-width:600px){.usa-footer-primary-section .usa-footer-primary-content{padding-left:0;padding-right:0}}.usa-footer-primary-section .usa-footer-primary-content li{margin-left:1rem}@media screen and (min-width:600px){.usa-footer-primary-section .usa-footer-primary-content li{margin-left:0}}@media screen and (min-width:600px){.usa-footer-primary-section .usa-grid-full{padding-left:2.5rem;padding-right:2.5rem}}.usa-footer-medium .usa-footer-primary-section{padding:0}@media screen and (min-width:600px){.usa-footer-medium .usa-footer-primary-section{padding-bottom:1rem;padding-top:1rem}}@media screen and (min-width:1201px){.usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content{margin-right:6%;width:inherit}}@media screen and (min-width:1201px){.usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content:last-child{margin-right:0}}@media screen and (min-width:600px){.usa-footer-medium .usa-footer-nav ul{-webkit-box-align:center;-ms-flex-align:center;align-items:center}}.usa-footer-slim .usa-footer-nav a{display:block}@media screen and (min-width:1201px){.usa-footer-slim .usa-footer-nav .usa-footer-primary-content{margin-right:9%;width:inherit}}@media screen and (min-width:1201px){.usa-footer-slim .usa-footer-nav .usa-footer-primary-content:last-child{margin-right:0}}.usa-footer-slim .usa-footer-primary-section{padding-bottom:2rem}@media screen and (min-width:600px){.usa-footer-slim .usa-footer-primary-section{padding-bottom:1rem;padding-top:1rem}.usa-footer-slim .usa-footer-primary-section .usa-grid-full{-webkit-box-align:center;-ms-flex-align:center;align-items:center}}@media screen and (min-width:600px){.usa-footer-slim .usa-footer-contact_info>*{margin:0}}@media screen and (min-width:600px){.usa-footer-slim .usa-footer-contact_info{padding-top:2rem;padding-bottom:2rem}}@media screen and (min-width:600px){.usa-footer-slim .usa-footer-contact_info{width:100%}}@media screen and (min-width:1201px){.usa-footer-slim .usa-footer-contact_info{float:left;display:block;margin-right:2.35765%;width:48.82117%}.usa-footer-slim .usa-footer-contact_info:last-child{margin-right:0}}li.usa-footer-primary-content,ul.usa-footer-primary-content{border-top:1px solid #212121}@media screen and (min-width:600px){li.usa-footer-primary-content,ul.usa-footer-primary-content{border:none}}li.usa-footer-primary-content:last-child,ul.usa-footer-primary-content:last-child{border-bottom:1px solid #212121}@media screen and (min-width:600px){li.usa-footer-primary-content:last-child,ul.usa-footer-primary-content:last-child{border-bottom:none}}.usa-sign_up-block{padding-bottom:2rem;padding-left:2.5rem;padding-right:2.5rem}@media screen and (min-width:600px){.usa-sign_up-block{float:right;padding:0}}.usa-sign_up-block label:first-of-type{margin-top:0}.usa-sign_up-block button{float:none;margin-right:0;margin-top:1.5rem}.usa-sign_up-block input{width:100%}.usa-footer-secondary_section{background-color:#d6d7d9;padding-bottom:3rem;padding-top:3rem}.usa-footer-secondary_section a{color:#212121}@media screen and (min-width:600px){.usa-footer-big-secondary-section{padding-top:5rem}}@media screen and (min-width:600px){.usa-footer-contact-links{text-align:right}}.usa-social-links a{text-decoration:none}@media screen and (min-width:600px){.usa-footer-big .usa-footer-primary-section{padding-bottom:4rem;padding-top:3rem}}.usa-footer-big ul{padding-bottom:2.5rem}@media screen and (min-width:600px){.usa-footer-big ul{padding-bottom:0}}.usa-footer-big ul:last-child{border-bottom:1px solid #212121}@media screen and (min-width:600px){.usa-footer-big ul:last-child{border-bottom:none}}.usa-footer-big ul li{line-height:2em}.usa-footer-big ul .usa-footer-primary-link{background-image:url(../img/arrow-down.png);background-image:url(../img/arrow-down.svg);background-position:1.5rem;background-repeat:no-repeat;background-size:1.3rem;margin-left:0;padding-left:3.5rem}@media screen and (min-width:600px){.usa-footer-big ul .usa-footer-primary-link{background:none;margin-bottom:.8rem;padding-bottom:0;padding-left:0}}.usa-footer-big ul .usa-footer-primary-link>*{margin-top:0;margin-bottom:0}.usa-footer-big ul.hidden{padding-bottom:0}.usa-footer-big ul.hidden li{display:none}.usa-footer-big ul.hidden .usa-footer-primary-link{background-image:url(../img/arrow-right.png);background-image:url(../img/arrow-right.svg);cursor:pointer;display:block}@media screen and (min-width:600px){.usa-footer-big ul.hidden .usa-footer-primary-link{background:none;padding-left:0}}.usa-footer-topic{margin:0;padding:2rem 0}@media screen and (min-width:600px){.usa-sign_up-header{margin:0;padding:2rem 0}}.usa-footer-logo-img{max-width:14rem}.usa-footer-slim-logo-img{float:left;max-width:10rem}.usa-footer-logo-heading{margin-top:2rem}.usa-footer-contact-heading{margin-top:0}@media screen and (min-width:600px){.usa-footer-contact-heading{margin-top:1rem}}.usa-footer-slim-logo-heading{display:block;padding-top:1rem}@media screen and (min-width:600px){.usa-footer-slim-logo-heading{display:inline-block;padding-left:1em}}.usa-link-facebook,.usa-link-rss,.usa-link-twitter,.usa-link-youtube,.usa-social_link{margin:2.5rem 1rem 1.5rem 0;background-position:50%;background-repeat:no-repeat;background-size:auto 3rem;display:inline-block;height:4.4rem;left:-1.6rem;position:relative;text-align:center;width:4.4rem}@media screen and (min-width:600px){.usa-link-facebook,.usa-link-rss,.usa-link-twitter,.usa-link-youtube,.usa-social_link{margin:0 0 0 1rem;left:1.2rem}}.usa-link-facebook span,.usa-link-rss span,.usa-link-twitter span,.usa-link-youtube span,.usa-social_link span{position:absolute;left:-999em}.usa-link-facebook{background-image:url(../img/social-icons/png/facebook25.png);background-image:url(../img/social-icons/svg/facebook25.svg)}.usa-link-twitter{background-image:url(../img/social-icons/png/twitter16.png);background-image:url(../img/social-icons/svg/twitter16.svg)}.usa-link-youtube{background-image:url(../img/social-icons/png/youtube15.png);background-image:url(../img/social-icons/svg/youtube15.svg)}.usa-link-rss{background-image:url(../img/social-icons/png/rss25.png);background-image:url(../img/social-icons/svg/rss25.svg)}form a{border-bottom:0}form [type=submit]{display:block;margin-bottom:1.5em;margin-top:2.5rem}@media screen and (min-width:600px){form [type=submit]{padding-left:2.7em;padding-right:2.7em;width:auto}}form [name=confirmPassword],form [name=password]{margin-bottom:1.1rem}@media screen and (min-width:600px){.usa-form{max-width:32rem}}.usa-form-note{float:right;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.5rem;margin:0 0 1.5rem}.usa-form-note+*{clear:both}fieldset{border:none;margin:0;padding:0}@media screen and (min-width:600px){.usa-form-large{max-width:46rem}}@media screen and (min-width:600px){input.usa-input-tiny{max-width:6rem}}@media screen and (min-width:600px){input.usa-input-medium{max-width:12rem}}@media screen and (min-width:600px){.usa-input-grid{padding-right:5%}}@media screen and (min-width:600px){.usa-input-grid:last-of-type{padding-right:0}}@media screen and (min-width:600px){.usa-input-grid-small{float:left;width:35%}}.usa-input-grid-small input{margin-bottom:3rem}.usa-input-grid-small select{margin-bottom:3rem}@media screen and (min-width:600px){.usa-input-grid-medium{float:left;width:65%}}.usa-input-grid-medium input{margin-bottom:3rem}.usa-input-grid-medium select{margin-bottom:3rem}@media screen and (min-width:600px){.usa-input-grid-large{float:left;width:100%}}.usa-input-grid-large input{margin-bottom:3rem}.usa-input-grid-large select{margin-bottom:3rem}.usa-additional_text{font-weight:400}.usa-checklist{list-style:none;margin-left:0;padding-left:0}.usa-checklist li{display:inline-block;list-style:none;margin-bottom:0;margin-top:0;padding-left:3em;text-indent:-2em}.usa-checklist li:before{content:" ";display:inline-block;height:.8em;margin-right:.2em;width:1.8em}.usa-checklist-checked:before{background-image:url(../img/correct9.png);background-image:url(../img/correct9.svg);background-position:100%;background-repeat:no-repeat;background-size:100%}.usa-graphic_list .usa-graphic_list-row .usa-media_block{margin-bottom:3rem}@media screen and (min-width:600px){.usa-graphic_list .usa-graphic_list-row .usa-media_block{margin-bottom:6rem}}@media screen and (min-width:600px){.usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block{margin-bottom:0}}.usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block:last-child{margin-bottom:0}.usa-graphic_list .usa-media_block-img{margin-right:3rem}.usa-graphic_list .usa-media_block-body>:first-child{margin-top:0}.usa-header{width:100%;z-index:7000}@media screen and (min-width:951px){.usa-header{border-bottom:1px solid #aeb0b5}}.usa-header a{border-bottom:none}.usa-header .usa-search{margin-bottom:1.5rem}@media screen and (min-width:951px){.usa-header .usa-search{float:right;margin-bottom:0;max-width:21.5rem}}.usa-logo{float:left;line-height:4rem;margin-left:1.5rem}@media screen and (min-width:951px){.usa-logo{line-height:7.5rem;margin-left:0}}.usa-logo a{color:#212121;text-decoration:none}.usa-logo br{display:none}@media screen and (min-width:951px){.usa-logo br{display:block}}.usa-logo-text{display:block;font-size:1.5rem;font-style:normal;font-weight:700;margin:0}@media screen and (min-width:951px){.usa-logo-text{display:block;font-size:2.4rem;line-height:1.3}}.usa-menu-btn{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;background-color:#0071bc;color:#fff;display:inline;float:right;font-size:1.3rem;height:4rem;line-height:4rem;text-align:center;text-decoration:none;text-transform:uppercase;width:5.8rem}.usa-menu-btn:hover{background-color:transparent}@media screen and (min-width:951px){.usa-menu-btn{display:none}}.usa-menu-btn:hover{color:#fff;background-color:#205493}.usa-menu-btn:visited{color:#fff}.usa-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000;opacity:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;visibility:hidden;z-index:8000}.usa-overlay.is-visible{opacity:.1;visibility:visible}@media screen and (min-width:951px){.usa-header-basic .usa-logo{bottom:1.9rem;position:absolute}}@media screen and (min-width:951px){.usa-header-basic .usa-navbar{position:relative;width:18%}}@media screen and (min-width:951px){.usa-header-extended .usa-header{border-bottom:none}}@media screen and (min-width:951px){.usa-header-extended .usa-logo{margin-top:3rem;margin-bottom:3rem}}@media screen and (min-width:951px){.usa-header-extended em{font-size:3.2rem;line-height:1}}@media screen and (min-width:951px){.usa-header-extended .usa-navbar{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:3rem;padding-left:3rem;display:block;height:auto;max-width:1040px}.usa-header-extended .usa-navbar:after{clear:both;content:"";display:block}}@media screen and (min-width:951px){.usa-header-extended .usa-nav{border-top:1px solid #aeb0b5;float:none;padding:0;width:100%}}@media screen and (min-width:951px){.usa-header-extended .usa-nav-inner{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:3rem;padding-left:2rem;margin-top:-1px;max-width:1040px;position:relative}.usa-header-extended .usa-nav-inner:after{clear:both;content:"";display:block}}@media screen and (min-width:951px){.usa-header-extended .usa-nav-primary:after{clear:both;content:"";display:block}}@media screen and (min-width:951px){.usa-header-extended .usa-nav-primary button[aria-expanded=false],.usa-header-extended .usa-nav-primary button[aria-expanded=true]{background-position:right 1.5rem top 50%}}@media screen and (min-width:951px){.usa-header-extended .usa-nav-link{padding-top:1.9rem}}@media screen and (min-width:951px){.usa-header-extended .usa-nav-submenu .usa-grid-full{padding-left:1.2rem}}@media screen and (min-width:951px){.usa-header-extended .usa-megamenu{padding-left:3rem}}.usa-hero{padding-top:3rem;padding-bottom:3rem;background-image:url(../img/hero.png);background-position:50%;background-size:cover}.usa-hero .usa-button{color:#fff}.usa-section-dark .usa-hero-link{color:#02bfe7}.usa-hero-callout{background-color:#112e51;padding:3rem}@media screen and (min-width:481px){.usa-hero-callout{max-width:30rem}}.usa-hero-callout>:first-child{margin-top:0;margin-bottom:3rem}.usa-hero-callout .usa-button{font-size:1.4rem;margin-top:7rem;width:100%}.usa-hero-callout-alt{color:#fff;display:block}.usa-layout-docs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}@media screen and (min-width:1201px){.usa-layout-docs{display:inherit}}.usa-layout-docs .usa-grid>:first-child:not(.usa-width-*){margin-top:0}.usa-layout-docs .usa-grid>:last-child:not(.usa-width-*){margin-bottom:0}.usa-layout-docs-sidenav{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.usa-layout-docs-main_content{margin-bottom:3rem;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}@media screen and (min-width:1201px){.usa-layout-docs-main_content{margin-bottom:0}}.usa-layout-docs-main_content>:first-child{margin-top:0}.usa-media_block-img{float:left;margin-right:1rem}.usa-media_block-body{overflow:hidden}.usa-navbar{border-bottom:1px solid #aeb0b5;height:4rem}@media screen and (min-width:951px){.usa-navbar{border-bottom:none;display:inline-block;height:10.3rem}}.usa-nav-link{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}@media screen and (min-width:951px){.usa-nav-link:hover span{border-bottom:.7rem solid #0071bc;padding-bottom:1rem}}@media screen and (min-width:951px){.usa-nav-container{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:3rem;padding-left:3rem;max-width:1040px}.usa-nav-container:after{clear:both;content:"";display:block}}.usa-nav{position:fixed;top:0;right:0;bottom:0;left:auto;background:#fff;border-left:1px solid #aeb0b5;border-right:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;padding:2rem;-webkit-transform:translateX(26rem);transform:translateX(26rem);width:26rem;z-index:9000}@media screen and (min-width:951px){.usa-nav{padding-top:5rem;padding-right:0;padding-bottom:0;border-left:none;display:block;float:right;overflow-y:visible;position:relative;-webkit-transform:translateX(0);transform:translateX(0);width:auto}}.usa-nav.is-visible{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.usa-nav nav{margin-top:6rem;min-height:100%}@media screen and (min-width:951px){.usa-nav nav{margin-top:0}}.usa-nav .usa-current{border-left:4px solid #0071bc;color:#0071bc;font-weight:700;padding-left:1.4rem}.usa-nav .usa-button{width:100%}@media screen and (min-width:951px){.usa-nav .usa-search{margin-left:1.5rem}}.usa-nav-primary{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.usa-nav-primary>li{margin-bottom:0}.usa-nav-primary>li{background-color:transparent;border-top:1px solid #5b616b;font-size:1.7rem}.usa-nav-primary>li:first-child{border-top:none}.usa-nav-primary a{border:none;color:#212121;display:block;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;line-height:1.3;padding:.85rem 1rem .85rem 1.8rem;text-decoration:none}.usa-nav-primary a:hover{background-color:#f1f1f1;color:#0071bc;text-decoration:none}.usa-nav-primary a:focus{position:relative;z-index:1}.usa-nav-primary a.usa-current{border-left:.4rem solid #0071bc;color:#0071bc;font-weight:700;padding-left:1.4rem}@media screen and (min-width:951px){.usa-nav-primary{display:inline}}@media screen and (min-width:951px){.usa-nav-primary li{border-top:none}}.usa-nav-primary>li{width:auto}@media screen and (min-width:951px){.usa-nav-primary>li{display:inline-block}}@media screen and (min-width:951px){.usa-nav-primary>li>a{padding:1.3rem 1.5rem 1.7rem;color:#5b616b;font-size:1.5rem;font-weight:700;line-height:1.2}}@media screen and (min-width:951px){.usa-nav-primary>li>a:hover{background-color:transparent}}.usa-nav-primary button{background-color:transparent;border:0;border-radius:0;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-weight:400;padding:1.4rem 1.5rem 1rem 1.8rem}.usa-nav-primary button:hover{background-color:transparent}@media screen and (min-width:951px){.usa-nav-primary button{padding-right:3rem;padding-bottom:1.9rem;padding-left:1.5rem;color:#5b616b;font-size:1.5rem;font-weight:700;width:auto}}.usa-nav-primary button:active,.usa-nav-primary button:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-nav-primary button:hover{background-color:#f1f1f1;color:#0071bc}@media screen and (min-width:951px){.usa-nav-primary button:hover{background-color:transparent}}.usa-nav-primary button[aria-expanded=false]{background-image:url(../img/plus-alt.png);background-image:url(../img/plus-alt.svg);background-repeat:no-repeat;background-position:right 0 center;background-size:1rem}@media screen and (min-width:951px){.usa-nav-primary button[aria-expanded=false]{background-image:url(../img/angle-arrow-down.png);background-image:url(../img/angle-arrow-down.svg);background-position:right 1.5rem top 44%}}.usa-nav-primary button[aria-expanded=true]{background-image:url(../img/minus-alt.png);background-image:url(../img/minus-alt.svg);background-repeat:no-repeat;background-position:right 0 center;background-size:1rem}@media screen and (min-width:951px){.usa-nav-primary button[aria-expanded=true]{background-color:#112e51;color:#fff;background-image:url(../img/angle-arrow-down-hover.png);background-image:url(../img/angle-arrow-down-hover.svg);background-position:right 1.5rem top 44%}.usa-nav-primary button[aria-expanded=true]:hover{background-color:#112e51}.usa-nav-primary button[aria-expanded=true] span{border-bottom:.7rem solid #0071bc;padding-bottom:1rem}}@media screen and (min-width:951px){.usa-nav-primary a.usa-current{border-left:0;padding-left:1.5rem}.usa-nav-primary a.usa-current span{border-bottom:.7rem solid #0071bc;padding-bottom:1rem}}@media screen and (min-width:951px){.usa-nav-secondary{position:absolute;right:3rem;top:-5.7rem}}.usa-nav-secondary .usa-search{margin-top:3rem;margin-bottom:3rem}@media screen and (min-width:951px){.usa-nav-secondary .usa-search{margin-top:-.2rem;margin-bottom:0;margin-left:0;float:left}}@media screen and (min-width:951px){.usa-nav-secondary-links{float:left}}@media screen and (min-width:951px){.usa-nav-secondary-links li{display:inline;padding-left:1rem}}@media screen and (min-width:951px){.usa-nav-secondary-links li:not(:last-child):after{content:"|";padding-left:1rem}}.usa-nav-secondary-links .usa-header-search-button,.usa-nav-secondary-links a{color:#5b616b;display:inline-block;font-size:1.5rem;text-decoration:none}.usa-nav-secondary-links .usa-header-search-button:hover,.usa-nav-secondary-links a:hover{color:#0071bc}.usa-nav-secondary-links .usa-header-search-button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;display:none}.usa-nav-secondary-links .usa-header-search-button:hover{background-color:transparent}@media screen and (min-width:951px){.usa-nav-secondary-links .usa-header-search-button{background-image:url(../img/search-alt.png);background-image:url(../img/search-alt.svg);background-repeat:no-repeat;background-position:0;background-size:2.2rem;display:inline-block;padding-left:2.3rem}}@media screen and (min-width:951px){.usa-nav-secondary-links .usa-header-search-button.is-hidden{display:none}}@media screen and (min-width:951px){.usa-nav-secondary-links a.usa-current{border-left:0;padding-left:0}}@media screen and (min-width:951px){.usa-nav-submenu{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;padding-top:1.15rem;padding-bottom:1.15rem;background-color:#112e51;min-width:21.5rem;width:auto;position:absolute}.usa-nav-submenu>li{margin-bottom:0}}.usa-nav-submenu[aria-hidden=true]{display:none}@media screen and (min-width:951px){.usa-nav-submenu a{color:#fff;padding-left:1.5rem}}@media screen and (min-width:951px){.usa-nav-submenu a:hover{background-color:#112e51;color:#fff;text-decoration:underline}}.usa-nav-submenu li{font-size:1.5rem;margin-bottom:0}.usa-nav-close{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;margin:-1.2rem -1.5rem 2.4rem auto;float:right;height:4.4rem;text-align:center;width:4.4rem}.usa-nav-close:hover{background-color:transparent}@media screen and (min-width:951px){.usa-nav-close{display:none}}.usa-nav-close img{width:1.3rem}.usa-mobile_nav-active{overflow:hidden}@media screen and (min-width:951px){.usa-megamenu{padding-top:3.15rem;padding-bottom:3.15rem;left:-1rem;width:100%}}@media screen and (min-width:951px){.usa-megamenu:before{background-color:#112e51;content:"";display:block;height:100%;position:absolute;top:0;width:1000%;right:100%}}@media screen and (min-width:951px){.usa-megamenu:after{background-color:#112e51;content:"";display:block;height:100%;position:absolute;top:0;width:1000%;left:100%}}@media screen and (min-width:951px){.usa-header-basic-megamenu .usa-nav{padding-left:0;padding-top:0;width:100%}}.usa-header-basic-megamenu .usa-nav-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}@media screen and (min-width:951px){.usa-header-basic-megamenu .usa-nav-inner{display:block;float:right;margin-top:-4.8rem}}@media screen and (min-width:951px){.usa-header-basic-megamenu .usa-nav-submenu .usa-grid-full{margin-left:-1.8rem}}@media screen and (min-width:951px){.usa-megamenu-col{float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-megamenu-col:last-child{margin-right:0}.usa-megamenu-col:nth-child(2n){float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-megamenu-col:nth-child(2n):last-child{margin-right:0}.usa-megamenu-col:nth-child(4n){margin-right:0}}.usa-megamenu-col>ul{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0}.usa-megamenu-col>ul>li{margin-bottom:0}.usa-search{max-width:none;position:relative}.usa-search:after{clear:both;content:"";display:block}.usa-search .usa-search-input,.usa-search [type=search]{padding-top:0;padding-bottom:0;-webkit-appearance:none;border-bottom-right-radius:0;border-right:none;border-top-right-radius:0;box-sizing:border-box;float:left;font-size:1.4rem;height:3.3rem;margin:0;width:calc(100% - 4.5rem)}@media screen and (min-width:481px){.usa-search .usa-search-input,.usa-search [type=search]{width:calc(100% - 8.5rem)}}.usa-search .usa-search-submit,.usa-search [type=submit]{background-image:url(../img/search.png);background-image:url(../img/search.svg);background-position:50%;background-repeat:no-repeat;border-bottom-left-radius:0;border-top-left-radius:0;height:3.3rem;margin:0;padding:0;width:4.5rem}@media screen and (min-width:481px){.usa-search .usa-search-submit,.usa-search [type=submit]{background-image:none;width:8.5rem}}.usa-search .usa-search-submit-text{display:none}@media screen and (min-width:481px){.usa-search .usa-search-submit-text{display:block}}@media screen and (min-width:481px){.usa-search.usa-search-big .usa-search-input,.usa-search.usa-search-big [type=search]{font-size:1.7rem;height:4.4rem;width:calc(100% - 11.6rem)}.usa-search.usa-search-big .usa-search-submit,.usa-search.usa-search-big [type=submit]{font-size:2rem;height:4.4rem;width:11.6rem}}@media screen and (min-width:481px){.usa-search.usa-search-small .usa-search-input,.usa-search.usa-search-small [type=search]{width:calc(100% - 4.5rem)}.usa-search.usa-search-small .usa-search-submit,.usa-search.usa-search-small [type=submit]{background-image:url(../img/search.png);background-image:url(../img/search.svg);background-position:50%;background-repeat:no-repeat;width:4.5rem}}@media screen and (max-width:950px){.usa-search.usa-search-small.usa-sr-only{left:auto;position:relative}}.usa-section{padding-top:3rem;padding-bottom:3rem}@media screen and (min-width:600px){.usa-section{padding-top:6rem;padding-bottom:6rem}}.usa-section-light{background-color:#f1f1f1}.usa-section-dark{background-color:#112e51;color:#fff}.usa-section-dark h1,.usa-section-dark h2,.usa-section-dark h3,.usa-section-dark h4,.usa-section-dark h5,.usa-section-dark h6{color:#02bfe7}.usa-section-dark p{color:#fff}.usa-section-dark a{color:#d6d7d9}.usa-section-dark a:hover{color:#fff}.usa-sidenav-list{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0}.usa-sidenav-list>li{margin-bottom:0}.usa-sidenav-list>li{background-color:transparent;border-top:1px solid #5b616b;font-size:1.7rem}.usa-sidenav-list>li:first-child{border-top:none}.usa-sidenav-list a{border:none;color:#212121;display:block;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;line-height:1.3;padding:.85rem 1rem .85rem 1.8rem;text-decoration:none}.usa-sidenav-list a:hover{background-color:#f1f1f1;color:#0071bc;text-decoration:none}.usa-sidenav-list a:focus{position:relative;z-index:1}.usa-sidenav-list a.usa-current{border-left:.4rem solid #0071bc;color:#0071bc;font-weight:700;padding-left:1.4rem}.usa-sidenav-sub_list{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;margin:0;width:100%}.usa-sidenav-sub_list>li{margin-bottom:0}.usa-sidenav-sub_list li{border:none;font-size:1.5rem}.usa-sidenav-sub_list a{padding-left:2.8rem;line-height:1.3}.usa-sidenav-sub_list a.usa-current,.usa-sidenav-sub_list a:hover{border:none;padding-left:2.8rem}.usa-sidenav-sub_list .usa-sidenav-sub_list a{padding-left:3.8rem}.usa-sidenav-sub_list .usa-sidenav-sub_list a:hover{padding-left:3.8rem}.usa-skipnav{background:transparent;color:#212121;left:0;padding:1rem 1.5rem;position:absolute;top:-4.2rem;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;z-index:100}.usa-skipnav:focus{background:#fff;left:0;outline:0;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out} +/*# sourceMappingURL=uswds.min.css.map */ diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md deleted file mode 100644 index 0304380f8..000000000 --- a/docs/CONFIGURATION.md +++ /dev/null @@ -1,4 +0,0 @@ -# Configuration - -TODO: This. - diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md deleted file mode 100644 index e959b1ffb..000000000 --- a/docs/CONTRIBUTING.md +++ /dev/null @@ -1,175 +0,0 @@ -# Contributing to Decanter - -This project is meant to be open source and freely shared. If you find something -broken, confusing, or wrong please first check the issue queue. For new issues -or feature requests, those that post with patches or pull requests and are -respectful will be handled first. - -## Using the issue tracker - -The issue tracker is the preferred channel for [bug reports](#bugs), -[features requests](#features) and [submitting pull -requests](#pull-requests), but please respect the following restrictions: - -* Please **do not** use the issue tracker for personal support requests. - -* Please **do** assign a maintainer for review - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the GitHub issue search** – check if the issue has already been - reported. -2. **Check if the issue has been fixed** – try to reproduce it using the - latest `master` branch in the repository. -3. **Isolate the problem** – create a live example (e.g., on - [Codepen](http://codepen.io)) of a [reduced test - case](http://css-tricks.com/6263-reduced-test-cases/). - -A good bug report shouldn't leave others needing to chase you for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -Example: - -> Short and descriptive example bug report title -> -> A summary of the issue and the browser/OS environment in which it occurs. If -> suitable, include the steps required to reproduce the bug. -> -> 1. This is the first step -> 2. This is the second step -> 3. Further steps, etc. -> -> `` - a link to the reduced test case -> -> Any other information you want to share that is relevant to the issue being -> reported. This might include the lines of code that you have identified as -> causing the bug, and potential solutions (and your opinions on their -> merits). - - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to *you* to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic -help. They should remain focused in scope and avoid containing unrelated -commits. - -Please adhere to the coding conventions used throughout a project (whitespace, -accurate comments, etc.) and any other requirements (such as test coverage). -Linting is preformed on every pull request. Please see STANDARDS.md for more -information on standards, conventions, and best practices. - -Follow this process if you'd like your work considered for inclusion in the -project: - -## Pull request workflow - -1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your - fork, and configure the remotes: - - ```bash - # Clone your fork of the repo into the current directory - git clone https://github.com//decanter - # Navigate to the newly cloned directory - cd decanter - # Assign the original repo to a remote called "upstream" - git remote add upstream https://github.com/SU-SWS/decanter - ``` -2. If you cloned a while ago, get the latest changes from upstream: - - ```bash - git checkout master - git pull upstream master - ``` -3. Never work directly on `master`. Create a new topic branch (off the latest - version of `master`) to contain your feature, change, or fix: - - ```bash - git checkout -b - ``` -4. Commit your changes in logical chunks. Use Git's - [interactive rebase](https://help.github.com/articles/interactive-rebase) - feature to tidy up your commits before making them public. - - Be sure to compile the css before submitting. - Be sure to lint the scss before submitting. -5. Locally rebase the upstream development branch into your topic branch: - - ```bash - git pull --rebase upstream master - ``` -6. Push your topic branch up to your fork: - - ```bash - git push origin - ``` -7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owner to -license your work under the same license as that used by the project. - -### CSS Conventions - -CSS conventions are maintained through sass and scss linting. Please run your -work against the linter configuration files in this directory. For your -convenience an NPM/Grunt based sass linter has been packaged in this repository. - -To install you must have NPM installed. - -Then run: - - ```bash - npm install - grunt sasslint - ``` - -This should output any errors the linter can find. Please fix those before -submitting a pull request. - -## Maintainers - -If you have commit access, please follow this process for merging patches and -cutting new releases. - -### Accepting PRs - -1. Check that a PR is within the scope and philosophy of the project. -2. Test the patch locally. -3. Run PR against linter through either Grunt or Code Climate. -4. Ensure all documentation and commenting is in place. -5. Squash and merge using command line or Github's merge button. - -### Releasing a new version - -1. Include all new functional changes in the CHANGELOG. -2. Use a dedicated commit to increment the version. The version needs to be - added to the CHANGELOG (inc. date), and `package.json` -3. The commit message must be of `v0.0.0` format. -4. Create an annotated tag for the version: `git tag -m "v0.0.0" 0.0.0`. -5. Push the changes and tags to GitHub: `git push --tags origin master` - -### Semver strategy - -[Semver](http://semver.org/) is a widely accepted method for deciding how -version numbers are incremented in a project. Versions are written as -MAJOR.MINOR.PATCH. - -Any change that is backwards-breaking will result in a new **major** release. -Others changes with no impact on rendering are considered backwards-compatible -and will result in a new **patch** release. diff --git a/docs/STANDARDS.md b/docs/STANDARDS.md deleted file mode 100644 index 14374f385..000000000 --- a/docs/STANDARDS.md +++ /dev/null @@ -1,55 +0,0 @@ -# Development Standards - -### TODO - - - - - -Developer Conventions - -- Releases will be using semantic versioning -- Will be using npm -- Use css linting TBD on tests -- 7-1 SASS architecture organization -- Bourbon & Neat ~2.0 -- No compilers in this repo -- SASS doc style documentation -- No global variables in function calls -- No globally overridden variables in partials -- Formatting conventions - - https://sass-guidelin.es/#syntax--formatting - - https://github.com/brigade/scss-lint -- Workflow - - Master branch is master NO COMMITTING DIRECTLY - - Releases go off master branch or a release branch - - Following NPM semantic versioning - - Everything is a pull request - - Master should always be stable - - Github issue queue to track issues and work -- .scss files not .sass - - ------ - -- Remove sass-once -- All items outside of the theme and base will be either a function, mixin, or variable -- Normalize will be bundled at the vendor level and included in master.scss -- Fontawesome will be bundled at the vendor level and included in master.scss -- All modules/files will declare their dependencies at @imports at the top of each file -- All variables will be set to !default -- Sensible defaults at the module level, Stanford branding declared at variables.scss -- The examples will be generic colors without the Stanford branding. -- We need an examples folder. (html and css) - - Build a compiler in to Grunt. - - - - -# Main file (master.scss) - -This project uses the [7-1 architecture pattern](http://sass-guidelin.es/#architecture), sticking to [Sass Guidelines](http://sass-guidelin.es) writing conventions. - -The main file (usually labelled `main.scss`) should be the only Sass file from the whole code base not to begin with an underscore. This file should not contain anything but `@import` and comments. - -Reference: [Sass Guidelines](http://sass-guidelin.es/) > [Architecture](http://sass-guidelin.es/#architecture) > [Main file](http://sass-guidelin.es/#main-file) diff --git a/fonts/merriweather-bold-webfont.eot b/fonts/merriweather-bold-webfont.eot new file mode 100755 index 000000000..c77b53bdd Binary files /dev/null and b/fonts/merriweather-bold-webfont.eot differ diff --git a/fonts/merriweather-bold-webfont.ttf b/fonts/merriweather-bold-webfont.ttf new file mode 100755 index 000000000..44f33c239 Binary files /dev/null and b/fonts/merriweather-bold-webfont.ttf differ diff --git a/fonts/merriweather-bold-webfont.woff b/fonts/merriweather-bold-webfont.woff new file mode 100755 index 000000000..a728400d5 Binary files /dev/null and b/fonts/merriweather-bold-webfont.woff differ diff --git a/fonts/merriweather-bold-webfont.woff2 b/fonts/merriweather-bold-webfont.woff2 new file mode 100755 index 000000000..ff3bddfbd Binary files /dev/null and b/fonts/merriweather-bold-webfont.woff2 differ diff --git a/fonts/merriweather-italic-webfont.eot b/fonts/merriweather-italic-webfont.eot new file mode 100755 index 000000000..884185441 Binary files /dev/null and b/fonts/merriweather-italic-webfont.eot differ diff --git a/fonts/merriweather-italic-webfont.ttf b/fonts/merriweather-italic-webfont.ttf new file mode 100755 index 000000000..3180e526d Binary files /dev/null and b/fonts/merriweather-italic-webfont.ttf differ diff --git a/fonts/merriweather-italic-webfont.woff b/fonts/merriweather-italic-webfont.woff new file mode 100755 index 000000000..d7071e3c2 Binary files /dev/null and b/fonts/merriweather-italic-webfont.woff differ diff --git a/fonts/merriweather-italic-webfont.woff2 b/fonts/merriweather-italic-webfont.woff2 new file mode 100755 index 000000000..f8660d06f Binary files /dev/null and b/fonts/merriweather-italic-webfont.woff2 differ diff --git a/fonts/merriweather-light-webfont.eot b/fonts/merriweather-light-webfont.eot new file mode 100755 index 000000000..4115d282b Binary files /dev/null and b/fonts/merriweather-light-webfont.eot differ diff --git a/fonts/merriweather-light-webfont.ttf b/fonts/merriweather-light-webfont.ttf new file mode 100755 index 000000000..03cfa4253 Binary files /dev/null and b/fonts/merriweather-light-webfont.ttf differ diff --git a/fonts/merriweather-light-webfont.woff b/fonts/merriweather-light-webfont.woff new file mode 100755 index 000000000..9b3427536 Binary files /dev/null and b/fonts/merriweather-light-webfont.woff differ diff --git a/fonts/merriweather-light-webfont.woff2 b/fonts/merriweather-light-webfont.woff2 new file mode 100755 index 000000000..e53e4b531 Binary files /dev/null and b/fonts/merriweather-light-webfont.woff2 differ diff --git a/fonts/merriweather-regular-webfont.eot b/fonts/merriweather-regular-webfont.eot new file mode 100755 index 000000000..c4cde6d01 Binary files /dev/null and b/fonts/merriweather-regular-webfont.eot differ diff --git a/fonts/merriweather-regular-webfont.ttf b/fonts/merriweather-regular-webfont.ttf new file mode 100755 index 000000000..3889a6065 Binary files /dev/null and b/fonts/merriweather-regular-webfont.ttf differ diff --git a/fonts/merriweather-regular-webfont.woff b/fonts/merriweather-regular-webfont.woff new file mode 100755 index 000000000..1969d2ed0 Binary files /dev/null and b/fonts/merriweather-regular-webfont.woff differ diff --git a/fonts/merriweather-regular-webfont.woff2 b/fonts/merriweather-regular-webfont.woff2 new file mode 100755 index 000000000..3023ce73c Binary files /dev/null and b/fonts/merriweather-regular-webfont.woff2 differ diff --git a/fonts/sourcesanspro-bold-webfont.eot b/fonts/sourcesanspro-bold-webfont.eot new file mode 100644 index 000000000..f031b206e Binary files /dev/null and b/fonts/sourcesanspro-bold-webfont.eot differ diff --git a/fonts/sourcesanspro-bold-webfont.ttf b/fonts/sourcesanspro-bold-webfont.ttf new file mode 100644 index 000000000..02ae55e6e Binary files /dev/null and b/fonts/sourcesanspro-bold-webfont.ttf differ diff --git a/fonts/sourcesanspro-bold-webfont.woff b/fonts/sourcesanspro-bold-webfont.woff new file mode 100644 index 000000000..1985bc0f1 Binary files /dev/null and b/fonts/sourcesanspro-bold-webfont.woff differ diff --git a/fonts/sourcesanspro-bold-webfont.woff2 b/fonts/sourcesanspro-bold-webfont.woff2 new file mode 100644 index 000000000..59cbda519 Binary files /dev/null and b/fonts/sourcesanspro-bold-webfont.woff2 differ diff --git a/fonts/sourcesanspro-italic-webfont.eot b/fonts/sourcesanspro-italic-webfont.eot new file mode 100644 index 000000000..e01ae4de0 Binary files /dev/null and b/fonts/sourcesanspro-italic-webfont.eot differ diff --git a/fonts/sourcesanspro-italic-webfont.ttf b/fonts/sourcesanspro-italic-webfont.ttf new file mode 100644 index 000000000..b513caef9 Binary files /dev/null and b/fonts/sourcesanspro-italic-webfont.ttf differ diff --git a/fonts/sourcesanspro-italic-webfont.woff b/fonts/sourcesanspro-italic-webfont.woff new file mode 100644 index 000000000..a512221dd Binary files /dev/null and b/fonts/sourcesanspro-italic-webfont.woff differ diff --git a/fonts/sourcesanspro-italic-webfont.woff2 b/fonts/sourcesanspro-italic-webfont.woff2 new file mode 100644 index 000000000..c1a6d9f1e Binary files /dev/null and b/fonts/sourcesanspro-italic-webfont.woff2 differ diff --git a/fonts/sourcesanspro-light-webfont.eot b/fonts/sourcesanspro-light-webfont.eot new file mode 100644 index 000000000..55d1c876c Binary files /dev/null and b/fonts/sourcesanspro-light-webfont.eot differ diff --git a/fonts/sourcesanspro-light-webfont.ttf b/fonts/sourcesanspro-light-webfont.ttf new file mode 100644 index 000000000..a4c674a00 Binary files /dev/null and b/fonts/sourcesanspro-light-webfont.ttf differ diff --git a/fonts/sourcesanspro-light-webfont.woff b/fonts/sourcesanspro-light-webfont.woff new file mode 100644 index 000000000..eb2fd5ae6 Binary files /dev/null and b/fonts/sourcesanspro-light-webfont.woff differ diff --git a/fonts/sourcesanspro-light-webfont.woff2 b/fonts/sourcesanspro-light-webfont.woff2 new file mode 100644 index 000000000..091b8079a Binary files /dev/null and b/fonts/sourcesanspro-light-webfont.woff2 differ diff --git a/fonts/sourcesanspro-regular-webfont.eot b/fonts/sourcesanspro-regular-webfont.eot new file mode 100644 index 000000000..cddebbca5 Binary files /dev/null and b/fonts/sourcesanspro-regular-webfont.eot differ diff --git a/fonts/sourcesanspro-regular-webfont.ttf b/fonts/sourcesanspro-regular-webfont.ttf new file mode 100644 index 000000000..ac42fa1c2 Binary files /dev/null and b/fonts/sourcesanspro-regular-webfont.ttf differ diff --git a/fonts/sourcesanspro-regular-webfont.woff b/fonts/sourcesanspro-regular-webfont.woff new file mode 100644 index 000000000..e057c48e8 Binary files /dev/null and b/fonts/sourcesanspro-regular-webfont.woff differ diff --git a/fonts/sourcesanspro-regular-webfont.woff2 b/fonts/sourcesanspro-regular-webfont.woff2 new file mode 100644 index 000000000..43ec601dc Binary files /dev/null and b/fonts/sourcesanspro-regular-webfont.woff2 differ diff --git a/img/alerts/error.png b/img/alerts/error.png new file mode 100755 index 000000000..0d4349757 Binary files /dev/null and b/img/alerts/error.png differ diff --git a/img/alerts/error.svg b/img/alerts/error.svg new file mode 100755 index 000000000..20b8057af --- /dev/null +++ b/img/alerts/error.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/img/alerts/info.png b/img/alerts/info.png new file mode 100755 index 000000000..e666e97ba Binary files /dev/null and b/img/alerts/info.png differ diff --git a/img/alerts/info.svg b/img/alerts/info.svg new file mode 100755 index 000000000..89bf03a78 --- /dev/null +++ b/img/alerts/info.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/img/alerts/success.png b/img/alerts/success.png new file mode 100755 index 000000000..66abc096c Binary files /dev/null and b/img/alerts/success.png differ diff --git a/img/alerts/success.svg b/img/alerts/success.svg new file mode 100755 index 000000000..29c7eb619 --- /dev/null +++ b/img/alerts/success.svg @@ -0,0 +1,12 @@ + + + diff --git a/img/alerts/warning.png b/img/alerts/warning.png new file mode 100755 index 000000000..909518d8b Binary files /dev/null and b/img/alerts/warning.png differ diff --git a/img/alerts/warning.svg b/img/alerts/warning.svg new file mode 100755 index 000000000..ad4533a2b --- /dev/null +++ b/img/alerts/warning.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/img/angle-arrow-down-hover.png b/img/angle-arrow-down-hover.png new file mode 100644 index 000000000..2814eba30 Binary files /dev/null and b/img/angle-arrow-down-hover.png differ diff --git a/img/angle-arrow-down-hover.svg b/img/angle-arrow-down-hover.svg new file mode 100644 index 000000000..63b09db89 --- /dev/null +++ b/img/angle-arrow-down-hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/angle-arrow-down-primary-hover.png b/img/angle-arrow-down-primary-hover.png new file mode 100644 index 000000000..03503962b Binary files /dev/null and b/img/angle-arrow-down-primary-hover.png differ diff --git a/img/angle-arrow-down-primary-hover.svg b/img/angle-arrow-down-primary-hover.svg new file mode 100644 index 000000000..0777e09ff --- /dev/null +++ b/img/angle-arrow-down-primary-hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/angle-arrow-down-primary.png b/img/angle-arrow-down-primary.png new file mode 100644 index 000000000..e01573f83 Binary files /dev/null and b/img/angle-arrow-down-primary.png differ diff --git a/img/angle-arrow-down-primary.svg b/img/angle-arrow-down-primary.svg new file mode 100644 index 000000000..f522e715c --- /dev/null +++ b/img/angle-arrow-down-primary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/angle-arrow-down.png b/img/angle-arrow-down.png new file mode 100644 index 000000000..a3d395ee5 Binary files /dev/null and b/img/angle-arrow-down.png differ diff --git a/img/angle-arrow-down.svg b/img/angle-arrow-down.svg new file mode 100644 index 000000000..87cfc3a0f --- /dev/null +++ b/img/angle-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/angle-arrow-up-primary-hover.png b/img/angle-arrow-up-primary-hover.png new file mode 100644 index 000000000..172b4c025 Binary files /dev/null and b/img/angle-arrow-up-primary-hover.png differ diff --git a/img/angle-arrow-up-primary-hover.svg b/img/angle-arrow-up-primary-hover.svg new file mode 100644 index 000000000..05a4c041a --- /dev/null +++ b/img/angle-arrow-up-primary-hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/angle-arrow-up-primary.png b/img/angle-arrow-up-primary.png new file mode 100644 index 000000000..16638a3c8 Binary files /dev/null and b/img/angle-arrow-up-primary.png differ diff --git a/img/angle-arrow-up-primary.svg b/img/angle-arrow-up-primary.svg new file mode 100644 index 000000000..7b3ec3916 --- /dev/null +++ b/img/angle-arrow-up-primary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/arrow-down.png b/img/arrow-down.png new file mode 100644 index 000000000..d6fc7100e Binary files /dev/null and b/img/arrow-down.png differ diff --git a/img/arrow-down.svg b/img/arrow-down.svg new file mode 100644 index 000000000..79e1c6ae3 --- /dev/null +++ b/img/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/arrow-right.png b/img/arrow-right.png new file mode 100644 index 000000000..5765f1b6d Binary files /dev/null and b/img/arrow-right.png differ diff --git a/img/arrow-right.svg b/img/arrow-right.svg new file mode 100644 index 000000000..5d29cdde1 --- /dev/null +++ b/img/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/circle-124.png b/img/circle-124.png new file mode 100644 index 000000000..f135de4c7 Binary files /dev/null and b/img/circle-124.png differ diff --git a/img/close.png b/img/close.png new file mode 100644 index 000000000..8388fd5f9 Binary files /dev/null and b/img/close.png differ diff --git a/img/close.svg b/img/close.svg new file mode 100644 index 000000000..d9f59132f --- /dev/null +++ b/img/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/correct8.png b/img/correct8.png new file mode 100755 index 000000000..4b76107e6 Binary files /dev/null and b/img/correct8.png differ diff --git a/img/correct8.svg b/img/correct8.svg new file mode 100755 index 000000000..bd7b38b23 --- /dev/null +++ b/img/correct8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/correct9.png b/img/correct9.png new file mode 100644 index 000000000..a83160a09 Binary files /dev/null and b/img/correct9.png differ diff --git a/img/correct9.svg b/img/correct9.svg new file mode 100755 index 000000000..485f42e5c --- /dev/null +++ b/img/correct9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/external-link-alt-hover.png b/img/external-link-alt-hover.png new file mode 100644 index 000000000..23ab6efac Binary files /dev/null and b/img/external-link-alt-hover.png differ diff --git a/img/external-link-alt-hover.svg b/img/external-link-alt-hover.svg new file mode 100644 index 000000000..2958691bf --- /dev/null +++ b/img/external-link-alt-hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/external-link-alt.png b/img/external-link-alt.png new file mode 100644 index 000000000..084cbc11f Binary files /dev/null and b/img/external-link-alt.png differ diff --git a/img/external-link-alt.svg b/img/external-link-alt.svg new file mode 100644 index 000000000..2c4edd7ee --- /dev/null +++ b/img/external-link-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/external-link-hover.png b/img/external-link-hover.png new file mode 100644 index 000000000..0b6bf982d Binary files /dev/null and b/img/external-link-hover.png differ diff --git a/img/external-link-hover.svg b/img/external-link-hover.svg new file mode 100644 index 000000000..98942ea93 --- /dev/null +++ b/img/external-link-hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/external-link.png b/img/external-link.png new file mode 100644 index 000000000..39bba235e Binary files /dev/null and b/img/external-link.png differ diff --git a/img/external-link.svg b/img/external-link.svg new file mode 100644 index 000000000..51b6cf209 --- /dev/null +++ b/img/external-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/favicons/favicon-114.png b/img/favicons/favicon-114.png new file mode 100755 index 000000000..dd24afc68 Binary files /dev/null and b/img/favicons/favicon-114.png differ diff --git a/img/favicons/favicon-144.png b/img/favicons/favicon-144.png new file mode 100755 index 000000000..fe9df4a51 Binary files /dev/null and b/img/favicons/favicon-144.png differ diff --git a/img/favicons/favicon-16.png b/img/favicons/favicon-16.png new file mode 100755 index 000000000..ca6c38f55 Binary files /dev/null and b/img/favicons/favicon-16.png differ diff --git a/img/favicons/favicon-192.png b/img/favicons/favicon-192.png new file mode 100755 index 000000000..51f99f2f7 Binary files /dev/null and b/img/favicons/favicon-192.png differ diff --git a/img/favicons/favicon-40.png b/img/favicons/favicon-40.png new file mode 100755 index 000000000..ae16c78c3 Binary files /dev/null and b/img/favicons/favicon-40.png differ diff --git a/img/favicons/favicon-57.png b/img/favicons/favicon-57.png new file mode 100755 index 000000000..ad5eceed3 Binary files /dev/null and b/img/favicons/favicon-57.png differ diff --git a/img/favicons/favicon-72.png b/img/favicons/favicon-72.png new file mode 100755 index 000000000..5a644d02f Binary files /dev/null and b/img/favicons/favicon-72.png differ diff --git a/img/favicons/favicon.ico b/img/favicons/favicon.ico new file mode 100755 index 000000000..c8c9f1c09 Binary files /dev/null and b/img/favicons/favicon.ico differ diff --git a/img/favicons/favicon.png b/img/favicons/favicon.png new file mode 100755 index 000000000..0d0077a7d Binary files /dev/null and b/img/favicons/favicon.png differ diff --git a/img/hero.png b/img/hero.png new file mode 100644 index 000000000..e56fef657 Binary files /dev/null and b/img/hero.png differ diff --git a/img/icon-dot-gov.svg b/img/icon-dot-gov.svg new file mode 100644 index 000000000..641cbb8e2 --- /dev/null +++ b/img/icon-dot-gov.svg @@ -0,0 +1 @@ +dot gov icon \ No newline at end of file diff --git a/img/icon-https.svg b/img/icon-https.svg new file mode 100644 index 000000000..451632366 --- /dev/null +++ b/img/icon-https.svg @@ -0,0 +1 @@ +https icon \ No newline at end of file diff --git a/img/logo-img.png b/img/logo-img.png new file mode 100644 index 000000000..82ab23ec7 Binary files /dev/null and b/img/logo-img.png differ diff --git a/img/minus-alt.png b/img/minus-alt.png new file mode 100644 index 000000000..9cff2e6c4 Binary files /dev/null and b/img/minus-alt.png differ diff --git a/img/minus-alt.svg b/img/minus-alt.svg new file mode 100644 index 000000000..177eedd20 --- /dev/null +++ b/img/minus-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/minus.png b/img/minus.png new file mode 100644 index 000000000..70a2ea682 Binary files /dev/null and b/img/minus.png differ diff --git a/img/minus.svg b/img/minus.svg new file mode 100644 index 000000000..73faba570 --- /dev/null +++ b/img/minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/plus-alt.png b/img/plus-alt.png new file mode 100644 index 000000000..cca318eee Binary files /dev/null and b/img/plus-alt.png differ diff --git a/img/plus-alt.svg b/img/plus-alt.svg new file mode 100644 index 000000000..b97d4bfdc --- /dev/null +++ b/img/plus-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/plus.png b/img/plus.png new file mode 100644 index 000000000..d91997076 Binary files /dev/null and b/img/plus.png differ diff --git a/img/plus.svg b/img/plus.svg new file mode 100644 index 000000000..55bdf51f3 --- /dev/null +++ b/img/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/search-alt.png b/img/search-alt.png new file mode 100755 index 000000000..89cef6ac6 Binary files /dev/null and b/img/search-alt.png differ diff --git a/img/search-alt.svg b/img/search-alt.svg new file mode 100755 index 000000000..98170b998 --- /dev/null +++ b/img/search-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/search.png b/img/search.png new file mode 100755 index 000000000..781d5b580 Binary files /dev/null and b/img/search.png differ diff --git a/img/search.svg b/img/search.svg new file mode 100755 index 000000000..a50fa62fd --- /dev/null +++ b/img/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/social-icons/png/facebook25.png b/img/social-icons/png/facebook25.png new file mode 100644 index 000000000..65df5b940 Binary files /dev/null and b/img/social-icons/png/facebook25.png differ diff --git a/img/social-icons/png/rss25.png b/img/social-icons/png/rss25.png new file mode 100644 index 000000000..1ef7dcfbe Binary files /dev/null and b/img/social-icons/png/rss25.png differ diff --git a/img/social-icons/png/twitter16.png b/img/social-icons/png/twitter16.png new file mode 100644 index 000000000..8668da4dc Binary files /dev/null and b/img/social-icons/png/twitter16.png differ diff --git a/img/social-icons/png/youtube15.png b/img/social-icons/png/youtube15.png new file mode 100644 index 000000000..b0568137d Binary files /dev/null and b/img/social-icons/png/youtube15.png differ diff --git a/img/social-icons/svg/facebook25.svg b/img/social-icons/svg/facebook25.svg new file mode 100755 index 000000000..2a136e150 --- /dev/null +++ b/img/social-icons/svg/facebook25.svg @@ -0,0 +1 @@ + diff --git a/img/social-icons/svg/rss25.svg b/img/social-icons/svg/rss25.svg new file mode 100755 index 000000000..b95e0b22f --- /dev/null +++ b/img/social-icons/svg/rss25.svg @@ -0,0 +1 @@ + diff --git a/img/social-icons/svg/twitter16.svg b/img/social-icons/svg/twitter16.svg new file mode 100755 index 000000000..de129d6f5 --- /dev/null +++ b/img/social-icons/svg/twitter16.svg @@ -0,0 +1 @@ + diff --git a/img/social-icons/svg/youtube15.svg b/img/social-icons/svg/youtube15.svg new file mode 100755 index 000000000..921752952 --- /dev/null +++ b/img/social-icons/svg/youtube15.svg @@ -0,0 +1 @@ + diff --git a/img/us_flag_small.png b/img/us_flag_small.png new file mode 100644 index 000000000..34b927b42 Binary files /dev/null and b/img/us_flag_small.png differ diff --git a/js/decanter.js b/js/decanter.js new file mode 100644 index 000000000..088681f07 --- /dev/null +++ b/js/decanter.js @@ -0,0 +1,1833 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; + +/** `Object#toString` result references. */ +var symbolTag = '[object Symbol]'; + +/** Used to match leading and trailing whitespace. */ +var reTrim = /^\s+|\s+$/g; + +/** Used to detect bad signed hexadecimal string values. */ +var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + +/** Used to detect binary string values. */ +var reIsBinary = /^0b[01]+$/i; + +/** Used to detect octal string values. */ +var reIsOctal = /^0o[0-7]+$/i; + +/** Built-in method references without a dependency on `root`. */ +var freeParseInt = parseInt; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = (typeof global === 'undefined' ? 'undefined' : _typeof(global)) == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = (typeof self === 'undefined' ? 'undefined' : _typeof(self)) == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ +var now = function now() { + return root.Date.now(); +}; + +/** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ +function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + result = wait - timeSinceLastCall; + + return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value === 'undefined' ? 'undefined' : _typeof(value); + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object'; +} + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'symbol' || isObjectLike(value) && objectToString.call(value) == symbolTag; +} + +/** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ +function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? other + '' : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; +} + +module.exports = debounce; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],8:[function(require,module,exports){ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +'use strict'; +/* eslint-disable no-unused-vars */ + +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; + +},{}],9:[function(require,module,exports){ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var assign = require('object-assign'); +var delegate = require('../delegate'); +var delegateAll = require('../delegateAll'); + +var DELEGATE_PATTERN = /^(.+):delegate\((.+)\)$/; +var SPACE = ' '; + +var getListeners = function getListeners(type, handler) { + var match = type.match(DELEGATE_PATTERN); + var selector; + if (match) { + type = match[1]; + selector = match[2]; + } + + var options; + if ((typeof handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object') { + options = { + capture: popKey(handler, 'capture'), + passive: popKey(handler, 'passive') + }; + } + + var listener = { + selector: selector, + delegate: (typeof handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object' ? delegateAll(handler) : selector ? delegate(selector, handler) : handler, + options: options + }; + + if (type.indexOf(SPACE) > -1) { + return type.split(SPACE).map(function (_type) { + return assign({ type: _type }, listener); + }); + } else { + listener.type = type; + return [listener]; + } +}; + +var popKey = function popKey(obj, key) { + var value = obj[key]; + delete obj[key]; + return value; +}; + +module.exports = function behavior(events, props) { + var listeners = Object.keys(events).reduce(function (memo, type) { + var listeners = getListeners(type, events[type]); + return memo.concat(listeners); + }, []); + + return assign({ + add: function addBehavior(element) { + listeners.forEach(function (listener) { + element.addEventListener(listener.type, listener.delegate, listener.options); + }); + }, + remove: function removeBehavior(element) { + listeners.forEach(function (listener) { + element.removeEventListener(listener.type, listener.delegate, listener.options); + }); + } + }, props); +}; + +},{"../delegate":11,"../delegateAll":12,"object-assign":8}],10:[function(require,module,exports){ +"use strict"; + +module.exports = function compose(functions) { + return function (e) { + return functions.some(function (fn) { + return fn.call(this, e) === false; + }, this); + }; +}; + +},{}],11:[function(require,module,exports){ +'use strict'; + +// polyfill Element.prototype.closest +require('element-closest'); + +module.exports = function delegate(selector, fn) { + return function delegation(event) { + var target = event.target.closest(selector); + if (target) { + return fn.call(target, event); + } + }; +}; + +},{"element-closest":6}],12:[function(require,module,exports){ +'use strict'; + +var delegate = require('../delegate'); +var compose = require('../compose'); + +var SPLAT = '*'; + +module.exports = function delegateAll(selectors) { + var keys = Object.keys(selectors); + + // XXX optimization: if there is only one handler and it applies to + // all elements (the "*" CSS selector), then just return that + // handler + if (keys.length === 1 && keys[0] === SPLAT) { + return selectors[SPLAT]; + } + + var delegates = keys.reduce(function (memo, selector) { + memo.push(delegate(selector, selectors[selector])); + return memo; + }, []); + return compose(delegates); +}; + +},{"../compose":10,"../delegate":11}],13:[function(require,module,exports){ +"use strict"; + +module.exports = function ignore(element, fn) { + return function ignorance(e) { + if (element !== e.target && !element.contains(e.target)) { + return fn.call(this, e); + } + }; +}; + +},{}],14:[function(require,module,exports){ +"use strict"; + +module.exports = function once(listener, options) { + var wrapped = function wrappedOnce(e) { + e.currentTarget.removeEventListener(e.type, wrapped, options); + return listener.call(this, e); + }; + return wrapped; +}; + +},{}],15:[function(require,module,exports){ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var RE_TRIM = /(^\s+)|(\s+$)/g; +var RE_SPLIT = /\s+/; + +var trim = String.prototype.trim ? function (str) { + return str.trim(); +} : function (str) { + return str.replace(RE_TRIM, ''); +}; + +var queryById = function queryById(id) { + return this.querySelector('[id="' + id.replace(/"/g, '\\"') + '"]'); +}; + +module.exports = function resolveIds(ids, doc) { + if (typeof ids !== 'string') { + throw new Error('Expected a string but got ' + (typeof ids === 'undefined' ? 'undefined' : _typeof(ids))); + } + + if (!doc) { + doc = window.document; + } + + var getElementById = doc.getElementById ? doc.getElementById.bind(doc) : queryById.bind(doc); + + ids = trim(ids).split(RE_SPLIT); + + // XXX we can short-circuit here because trimming and splitting a + // string of just whitespace produces an array containing a single, + // empty string + if (ids.length === 1 && ids[0] === '') { + return []; + } + + return ids.map(function (id) { + var el = getElementById(id); + if (!el) { + throw new Error('no element with id: "' + id + '"'); + } + return el; + }); +}; + +},{}],16:[function(require,module,exports){ +'use strict'; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require('../utils/behavior'); +var filter = require('array-filter'); +var forEach = require('array-foreach'); +var toggle = require('../utils/toggle'); +var isElementInViewport = require('../utils/is-in-viewport'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; + +// XXX match .usa-accordion and .usa-accordion-bordered +var ACCORDION = '.' + PREFIX + '-accordion, .' + PREFIX + '-accordion-bordered'; +var BUTTON = '.' + PREFIX + '-accordion-button[aria-controls]'; +var EXPANDED = 'aria-expanded'; +var MULTISELECTABLE = 'aria-multiselectable'; + +/** + * Toggle a button's "pressed" state, optionally providing a target + * state. + * + * @param {HTMLButtonElement} button + * @param {boolean?} expanded If no state is provided, the current + * state will be toggled (from false to true, and vice-versa). + * @return {boolean} the resulting state + */ +var toggleButton = function toggleButton(button, expanded) { + var accordion = button.closest(ACCORDION); + if (!accordion) { + throw new Error(BUTTON + ' is missing outer ' + ACCORDION); + } + + expanded = toggle(button, expanded); + // XXX multiselectable is opt-in, to preserve legacy behavior + var multiselectable = accordion.getAttribute(MULTISELECTABLE) === 'true'; + + if (expanded && !multiselectable) { + forEach(getAccordionButtons(accordion), function (other) { + if (other !== button) { + toggle(other, false); + } + }); + } +}; + +/** + * @param {HTMLButtonElement} button + * @return {boolean} true + */ +var showButton = function showButton(button) { + return toggleButton(button, true); +}; + +/** + * @param {HTMLButtonElement} button + * @return {boolean} false + */ +var hideButton = function hideButton(button) { + return toggleButton(button, false); +}; + +/** + * Get an Array of button elements belonging directly to the given + * accordion element. + * @param {HTMLElement} accordion + * @return {array} + */ +var getAccordionButtons = function getAccordionButtons(accordion) { + return filter(accordion.querySelectorAll(BUTTON), function (button) { + return button.closest(ACCORDION) === accordion; + }); +}; + +var accordion = behavior(_defineProperty({}, CLICK, _defineProperty({}, BUTTON, function (event) { + event.preventDefault(); + toggleButton(this); + + if (this.getAttribute(EXPANDED) === 'true') { + // We were just expanded, but if another accordion was also just + // collapsed, we may no longer be in the viewport. This ensures + // that we are still visible, so the user isn't confused. + if (!isElementInViewport(this)) this.scrollIntoView(); + } +})), { + init: function init(root) { + forEach(root.querySelectorAll(BUTTON), function (button) { + var expanded = button.getAttribute(EXPANDED) === 'true'; + toggleButton(button, expanded); + }); + }, + ACCORDION: ACCORDION, + BUTTON: BUTTON, + show: showButton, + hide: hideButton, + toggle: toggleButton, + getButtons: getAccordionButtons +}); + +/** + * TODO: for 2.0, remove everything below this comment and export the + * behavior directly: + * + * module.exports = behavior({...}); + */ +var Accordion = function Accordion(root) { + this.root = root; + accordion.on(this.root); +}; + +// copy all of the behavior methods and props to Accordion +var assign = require('object-assign'); +assign(Accordion, accordion); + +Accordion.prototype.show = showButton; +Accordion.prototype.hide = hideButton; + +Accordion.prototype.remove = function () { + accordion.off(this.root); +}; + +module.exports = Accordion; + +},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/is-in-viewport":31,"../utils/toggle":35,"array-filter":1,"array-foreach":2,"object-assign":8}],17:[function(require,module,exports){ +'use strict'; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require('../utils/behavior'); +var toggle = require('../utils/toggle'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; + +var HEADER = '.' + PREFIX + '-banner-header'; +var EXPANDED_CLASS = PREFIX + '-banner-header-expanded'; + +var toggleBanner = function toggleBanner(event) { + event.preventDefault(); + this.closest(HEADER).classList.toggle(EXPANDED_CLASS); + return false; +}; + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, HEADER + ' [aria-controls]', toggleBanner))); + +},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/toggle":35}],18:[function(require,module,exports){ +'use strict'; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var accordion = require('./accordion'); +var behavior = require('../utils/behavior'); +var debounce = require('lodash.debounce'); +var forEach = require('array-foreach'); +var select = require('../utils/select'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; + +var HIDDEN = 'hidden'; +var SCOPE = '.' + PREFIX + '-footer-big'; +var NAV = SCOPE + ' nav'; +var BUTTON = NAV + ' .' + PREFIX + '-footer-primary-link'; +var LIST = NAV + ' ul'; + +var HIDE_MAX_WIDTH = 600; +var DEBOUNCE_RATE = 180; + +var showPanel = function showPanel() { + var list = this.closest(LIST); + list.classList.remove(HIDDEN); + + // NB: this *should* always succeed because the button + // selector is scoped to ".{prefix}-footer-big nav" + var lists = list.closest(NAV).querySelectorAll('ul'); + + forEach(lists, function (el) { + if (el !== list) { + el.classList.add(HIDDEN); + } + }); +}; + +var resize = debounce(function () { + var hidden = window.innerWidth < HIDE_MAX_WIDTH; + forEach(select(LIST), function (list) { + list.classList.toggle(HIDDEN, hidden); + }); +}, DEBOUNCE_RATE); + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, BUTTON, showPanel)), { + // export for use elsewhere + HIDE_MAX_WIDTH: HIDE_MAX_WIDTH, + DEBOUNCE_RATE: DEBOUNCE_RATE, + + init: function init(target) { + resize(); + window.addEventListener('resize', resize); + }, + + teardown: function teardown(target) { + window.removeEventListener('resize', resize); + } +}); + +},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/select":32,"./accordion":16,"array-foreach":2,"lodash.debounce":7}],19:[function(require,module,exports){ +'use strict'; + +module.exports = { + accordion: require('./accordion'), + banner: require('./banner'), + footer: require('./footer'), + navigation: require('./navigation'), + password: require('./password'), + search: require('./search'), + skipnav: require('./skipnav'), + validator: require('./validator') +}; + +},{"./accordion":16,"./banner":17,"./footer":18,"./navigation":20,"./password":21,"./search":22,"./skipnav":23,"./validator":24}],20:[function(require,module,exports){ +'use strict'; + +var _CLICK; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require('../utils/behavior'); +var forEach = require('array-foreach'); +var select = require('../utils/select'); +var accordion = require('./accordion'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; + +var CONTEXT = 'header'; +var NAV = '.' + PREFIX + '-nav'; +var NAV_LINKS = NAV + ' a'; +var OPENERS = '.' + PREFIX + '-menu-btn'; +var CLOSE_BUTTON = '.' + PREFIX + '-nav-close'; +var OVERLAY = '.' + PREFIX + '-overlay'; +var CLOSERS = CLOSE_BUTTON + ', .' + PREFIX + '-overlay'; +var TOGGLES = [NAV, OVERLAY].join(', '); + +var ACTIVE_CLASS = 'usa-mobile_nav-active'; +var VISIBLE_CLASS = 'is-visible'; + +var toggleNav = function toggleNav(active) { + var body = document.body; + if (typeof active !== 'boolean') { + active = !body.classList.contains(ACTIVE_CLASS); + } + body.classList.toggle(ACTIVE_CLASS, active); + + var context = this.closest(CONTEXT); + forEach(select(TOGGLES), function (el) { + el.classList.toggle(VISIBLE_CLASS); + }); + + if (active && context) { + var closeButton = context.querySelector(CLOSE_BUTTON); + if (closeButton) { + closeButton.focus(); + } + } + return active; +}; + +var navigation = behavior(_defineProperty({}, CLICK, (_CLICK = {}, _defineProperty(_CLICK, OPENERS, toggleNav), _defineProperty(_CLICK, CLOSERS, toggleNav), _defineProperty(_CLICK, NAV_LINKS, function () { + // A navigation link has been clicked! We want to collapse any + // hierarchical navigation UI it's a part of, so that the user + // can focus on whatever they've just selected. + + // Some navigation links are inside accordions; when they're + // clicked, we want to collapse those accordions. + var acc = this.closest(accordion.ACCORDION); + if (acc) { + accordion.getButtons(acc).forEach(function (btn) { + return accordion.hide(btn); + }); + } + + // If the mobile navigation menu is active, we want to hide it. + if (document.body.classList.contains(ACTIVE_CLASS)) { + toggleNav.call(this); + } +}), _CLICK))); + +/** + * TODO for 2.0, remove this statement and export `navigation` directly: + * + * module.exports = behavior({...}); + */ +var assign = require('object-assign'); +module.exports = assign(function (el) { + return navigation.on(el); +}, navigation); + +},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/select":32,"./accordion":16,"array-foreach":2,"object-assign":8}],21:[function(require,module,exports){ +'use strict'; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require('../utils/behavior'); +var toggleFormInput = require('../utils/toggle-form-input'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; + +var LINK = '.' + PREFIX + '-show_password, .' + PREFIX + '-show_multipassword'; + +var toggle = function toggle(event) { + event.preventDefault(); + toggleFormInput(this); +}; + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, LINK, toggle))); + +},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/toggle-form-input":34}],22:[function(require,module,exports){ +'use strict'; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require('../utils/behavior'); +var forEach = require('array-foreach'); +var ignore = require('receptor/ignore'); +var select = require('../utils/select'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; + +var BUTTON = '.js-search-button'; +var FORM = '.js-search-form'; +var INPUT = '[type=search]'; +var CONTEXT = 'header'; // XXX +var VISUALLY_HIDDEN = PREFIX + '-sr-only'; + +var lastButton = void 0; + +var showSearch = function showSearch(event) { + toggleSearch(this, true); + lastButton = this; +}; + +var hideSearch = function hideSearch(event) { + toggleSearch(this, false); + lastButton = undefined; +}; + +var getForm = function getForm(button) { + var context = button.closest(CONTEXT); + return context ? context.querySelector(FORM) : document.querySelector(FORM); +}; + +var toggleSearch = function toggleSearch(button, active) { + var form = getForm(button); + if (!form) { + throw new Error('No ' + FORM + ' found for search toggle in ' + CONTEXT + '!'); + } + + button.hidden = active; + form.classList.toggle(VISUALLY_HIDDEN, !active); + + if (active) { + var input = form.querySelector(INPUT); + if (input) { + input.focus(); + } + // when the user clicks _outside_ of the form w/ignore(): hide the + // search, then remove the listener + var listener = ignore(form, function (e) { + if (lastButton) { + hideSearch.call(lastButton); + } + document.body.removeEventListener(CLICK, listener); + }); + + // Normally we would just run this code without a timeout, but + // IE11 and Edge will actually call the listener *immediately* because + // they are currently handling this exact type of event, so we'll + // make sure the browser is done handling the current click event, + // if any, before we attach the listener. + setTimeout(function () { + document.body.addEventListener(CLICK, listener); + }, 0); + } +}; + +var search = behavior(_defineProperty({}, CLICK, _defineProperty({}, BUTTON, showSearch)), { + init: function init(target) { + forEach(select(BUTTON, target), function (button) { + toggleSearch(button, false); + }); + }, + teardown: function teardown(target) { + // forget the last button clicked + lastButton = undefined; + } +}); + +/** + * TODO for 2.0, remove this statement and export `navigation` directly: + * + * module.exports = behavior({...}); + */ +var assign = require('object-assign'); +module.exports = assign(function (el) { + return search.on(el); +}, search); + +},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/select":32,"array-foreach":2,"object-assign":8,"receptor/ignore":13}],23:[function(require,module,exports){ +'use strict'; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require('../utils/behavior'); +var once = require('receptor/once'); + +var CLICK = require('../events').CLICK; +var PREFIX = require('../config').prefix; +var LINK = '.' + PREFIX + '-skipnav[href^="#"]'; + +var setTabindex = function setTabindex(event) { + // NB: we know because of the selector we're delegating to below that the + // href already begins with '#' + var id = this.getAttribute('href').slice(1); + var target = document.getElementById(id); + if (target) { + target.setAttribute('tabindex', 0); + target.addEventListener('blur', once(function (event) { + target.setAttribute('tabindex', -1); + })); + } else { + // throw an error? + } +}; + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, LINK, setTabindex))); + +},{"../config":25,"../events":26,"../utils/behavior":30,"receptor/once":14}],24:[function(require,module,exports){ +'use strict'; + +var behavior = require('../utils/behavior'); +var validate = require('../utils/validate-input'); +var debounce = require('lodash.debounce'); + +var change = function change(event) { + return validate(this); +}; + +var validator = behavior({ + 'keyup change': { + 'input[data-validation-element]': change + } +}); + +/** + * TODO for 2.0, remove this statement and export `navigation` directly: + * + * module.exports = behavior({...}); + */ +var assign = require('object-assign'); +module.exports = assign(function (el) { + return validator.on(el); +}, validator); + +},{"../utils/behavior":30,"../utils/validate-input":36,"lodash.debounce":7,"object-assign":8}],25:[function(require,module,exports){ +'use strict'; + +module.exports = { + prefix: 'usa' +}; + +},{}],26:[function(require,module,exports){ +'use strict'; + +module.exports = { + // This used to be conditionally dependent on whether the + // browser supported touch events; if it did, `CLICK` was set to + // `touchstart`. However, this had downsides: + // + // * It pre-empted mobile browsers' default behavior of detecting + // whether a touch turned into a scroll, thereby preventing + // users from using some of our components as scroll surfaces. + // + // * Some devices, such as the Microsoft Surface Pro, support *both* + // touch and clicks. This meant the conditional effectively dropped + // support for the user's mouse, frustrating users who preferred + // it on those systems. + CLICK: 'click' +}; + +},{}],27:[function(require,module,exports){ +'use strict'; + +var elproto = window.HTMLElement.prototype; +var HIDDEN = 'hidden'; + +if (!(HIDDEN in elproto)) { + Object.defineProperty(elproto, HIDDEN, { + get: function get() { + return this.hasAttribute(HIDDEN); + }, + set: function set(value) { + if (value) { + this.setAttribute(HIDDEN, ''); + } else { + this.removeAttribute(HIDDEN); + } + } + }); +} + +},{}],28:[function(require,module,exports){ +'use strict'; +// polyfills HTMLElement.prototype.classList and DOMTokenList + +require('classlist-polyfill'); +// polyfills HTMLElement.prototype.hidden +require('./element-hidden'); + +},{"./element-hidden":27,"classlist-polyfill":3}],29:[function(require,module,exports){ +'use strict'; + +var domready = require('domready'); + +/** + * The 'polyfills' define key ECMAScript 5 methods that may be missing from + * older browsers, so must be loaded first. + */ +require('./polyfills'); + +var uswds = require('./config'); + +var components = require('./components'); +uswds.components = components; + +domready(function () { + var target = document.body; + for (var name in components) { + var behavior = components[name]; + behavior.on(target); + } +}); + +module.exports = uswds; + +},{"./components":19,"./config":25,"./polyfills":28,"domready":4}],30:[function(require,module,exports){ +'use strict'; + +var assign = require('object-assign'); +var forEach = require('array-foreach'); +var Behavior = require('receptor/behavior'); + +var sequence = function sequence() { + var seq = [].slice.call(arguments); + return function (target) { + var _this = this; + + if (!target) { + target = document.body; + } + forEach(seq, function (method) { + if (typeof _this[method] === 'function') { + _this[method].call(_this, target); + } + }); + }; +}; + +/** + * @name behavior + * @param {object} events + * @param {object?} props + * @return {receptor.behavior} + */ +module.exports = function (events, props) { + return Behavior(events, assign({ + on: sequence('init', 'add'), + off: sequence('teardown', 'remove') + }, props)); +}; + +},{"array-foreach":2,"object-assign":8,"receptor/behavior":9}],31:[function(require,module,exports){ +"use strict"; + +// https://stackoverflow.com/a/7557433 +function isElementInViewport(el) { + var win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window; + var docEl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document.documentElement; + + var rect = el.getBoundingClientRect(); + + return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (win.innerHeight || docEl.clientHeight) && rect.right <= (win.innerWidth || docEl.clientWidth); +} + +module.exports = isElementInViewport; + +},{}],32:[function(require,module,exports){ +'use strict'; + +/** + * @name isElement + * @desc returns whether or not the given argument is a DOM element. + * @param {any} value + * @return {boolean} + */ + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var isElement = function isElement(value) { + return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.nodeType === 1; +}; + +/** + * @name select + * @desc selects elements from the DOM by class selector or ID selector. + * @param {string} selector - The selector to traverse the DOM with. + * @param {Document|HTMLElement?} context - The context to traverse the DOM + * in. If not provided, it defaults to the document. + * @return {HTMLElement[]} - An array of DOM nodes or an empty array. + */ +module.exports = function select(selector, context) { + + if (typeof selector !== 'string') { + return []; + } + + if (!context || !isElement(context)) { + context = window.document; + } + + var selection = context.querySelectorAll(selector); + return Array.prototype.slice.call(selection); +}; + +},{}],33:[function(require,module,exports){ +'use strict'; + +/** + * Flips given INPUT elements between masked (hiding the field value) and unmasked + * @param {Array.HTMLElement} fields - An array of INPUT elements + * @param {Boolean} mask - Whether the mask should be applied, hiding the field value + */ +module.exports = function (field, mask) { + field.setAttribute('autocapitalize', 'off'); + field.setAttribute('autocorrect', 'off'); + field.setAttribute('type', mask ? 'password' : 'text'); +}; + +},{}],34:[function(require,module,exports){ +'use strict'; + +var forEach = require('array-foreach'); +var resolveIdRefs = require('resolve-id-refs'); +var select = require('./select'); +var toggleFieldMask = require('./toggle-field-mask'); + +var CONTROLS = 'aria-controls'; +var PRESSED = 'aria-pressed'; +var SHOW_ATTR = 'data-show-text'; +var HIDE_ATTR = 'data-hide-text'; + +/** + * Replace the word "Show" (or "show") with "Hide" (or "hide") in a string. + * @param {string} showText + * @return {strong} hideText + */ +var getHideText = function getHideText(showText) { + return showText.replace(/\bShow\b/i, function (show) { + return ('S' === show[0] ? 'H' : 'h') + 'ide'; + }); +}; + +/** + * Component that decorates an HTML element with the ability to toggle the + * masked state of an input field (like a password) when clicked. + * The ids of the fields to be masked will be pulled directly from the button's + * `aria-controls` attribute. + * + * @param {HTMLElement} el Parent element containing the fields to be masked + * @return {boolean} + */ +module.exports = function (el) { + // this is the *target* state: + // * if the element has the attr and it's !== "true", pressed is true + // * otherwise, pressed is false + var pressed = el.hasAttribute(PRESSED) && el.getAttribute(PRESSED) !== 'true'; + + var fields = resolveIdRefs(el.getAttribute(CONTROLS)); + forEach(fields, function (field) { + return toggleFieldMask(field, pressed); + }); + + if (!el.hasAttribute(SHOW_ATTR)) { + el.setAttribute(SHOW_ATTR, el.textContent); + } + + var showText = el.getAttribute(SHOW_ATTR); + var hideText = el.getAttribute(HIDE_ATTR) || getHideText(showText); + + el.textContent = pressed ? showText : hideText; + el.setAttribute(PRESSED, pressed); + return pressed; +}; + +},{"./select":32,"./toggle-field-mask":33,"array-foreach":2,"resolve-id-refs":15}],35:[function(require,module,exports){ +'use strict'; + +var EXPANDED = 'aria-expanded'; +var CONTROLS = 'aria-controls'; +var HIDDEN = 'aria-hidden'; + +module.exports = function (button, expanded) { + + if (typeof expanded !== 'boolean') { + expanded = button.getAttribute(EXPANDED) === 'false'; + } + button.setAttribute(EXPANDED, expanded); + + var id = button.getAttribute(CONTROLS); + var controls = document.getElementById(id); + if (!controls) { + throw new Error('No toggle target found with id: "' + id + '"'); + } + + controls.setAttribute(HIDDEN, !expanded); + return expanded; +}; + +},{}],36:[function(require,module,exports){ +'use strict'; + +var dataset = require('elem-dataset'); + +var PREFIX = require('../config').prefix; +var CHECKED = 'aria-checked'; +var CHECKED_CLASS = PREFIX + '-checklist-checked'; + +module.exports = function validate(el) { + var data = dataset(el); + var id = data.validationElement; + var checkList = id.charAt(0) === '#' ? document.querySelector(id) : document.getElementById(id); + + if (!checkList) { + throw new Error('No validation element found with id: "' + id + '"'); + } + + for (var key in data) { + if (key.startsWith('validate')) { + var validatorName = key.substr('validate'.length).toLowerCase(); + var validatorPattern = new RegExp(data[key]); + var validatorSelector = '[data-validator="' + validatorName + '"]'; + var validatorCheckbox = checkList.querySelector(validatorSelector); + if (!validatorCheckbox) { + throw new Error('No validator checkbox found for: "' + validatorName + '"'); + } + + var checked = validatorPattern.test(el.value); + validatorCheckbox.classList.toggle(CHECKED_CLASS, checked); + validatorCheckbox.setAttribute(CHECKED, checked); + } + } +}; + +},{"../config":25,"elem-dataset":5}]},{},[29]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXJyYXktZmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FycmF5LWZvcmVhY2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2xhc3NsaXN0LXBvbHlmaWxsL3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kb21yZWFkeS9yZWFkeS5qcyIsIm5vZGVfbW9kdWxlcy9lbGVtLWRhdGFzZXQvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lbGVtZW50LWNsb3Nlc3QvZWxlbWVudC1jbG9zZXN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC5kZWJvdW5jZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlY2VwdG9yL2JlaGF2aW9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlY2VwdG9yL2NvbXBvc2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3IvZGVsZWdhdGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3IvZGVsZWdhdGVBbGwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3IvaWdub3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlY2VwdG9yL29uY2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVzb2x2ZS1pZC1yZWZzL2luZGV4LmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYmFubmVyLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvZm9vdGVyLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvaW5kZXguanMiLCJzcmMvanMvY29tcG9uZW50cy9uYXZpZ2F0aW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvcGFzc3dvcmQuanMiLCJzcmMvanMvY29tcG9uZW50cy9zZWFyY2guanMiLCJzcmMvanMvY29tcG9uZW50cy9za2lwbmF2LmpzIiwic3JjL2pzL2NvbXBvbmVudHMvdmFsaWRhdG9yLmpzIiwic3JjL2pzL2NvbmZpZy5qcyIsInNyYy9qcy9ldmVudHMuanMiLCJzcmMvanMvcG9seWZpbGxzL2VsZW1lbnQtaGlkZGVuLmpzIiwic3JjL2pzL3BvbHlmaWxscy9pbmRleC5qcyIsInNyYy9qcy9zdGFydC5qcyIsInNyYy9qcy91dGlscy9iZWhhdmlvci5qcyIsInNyYy9qcy91dGlscy9pcy1pbi12aWV3cG9ydC5qcyIsInNyYy9qcy91dGlscy9zZWxlY3QuanMiLCJzcmMvanMvdXRpbHMvdG9nZ2xlLWZpZWxkLW1hc2suanMiLCJzcmMvanMvdXRpbHMvdG9nZ2xlLWZvcm0taW5wdXQuanMiLCJzcmMvanMvdXRpbHMvdG9nZ2xlLmpzIiwic3JjL2pzL3V0aWxzL3ZhbGlkYXRlLWlucHV0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7QUNDQTs7Ozs7Ozs7OztBQVVBLE9BQU8sT0FBUCxHQUFpQixVQUFVLEdBQVYsRUFBZSxFQUFmLEVBQW1CLElBQW5CLEVBQXlCO0FBQ3hDLE1BQUksSUFBSSxNQUFSLEVBQWdCLE9BQU8sSUFBSSxNQUFKLENBQVcsRUFBWCxFQUFlLElBQWYsQ0FBUDtBQUNoQixNQUFJLEtBQUssQ0FBTCxLQUFXLEdBQVgsSUFBa0IsU0FBUyxHQUEvQixFQUFvQyxNQUFNLElBQUksU0FBSixFQUFOO0FBQ3BDLE1BQUksY0FBYyxPQUFPLEVBQXpCLEVBQTZCLE1BQU0sSUFBSSxTQUFKLEVBQU47QUFDN0IsTUFBSSxNQUFNLEVBQVY7QUFDQSxPQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksSUFBSSxNQUF4QixFQUFnQyxHQUFoQyxFQUFxQztBQUNuQyxRQUFJLENBQUMsT0FBTyxJQUFQLENBQVksR0FBWixFQUFpQixDQUFqQixDQUFMLEVBQTBCO0FBQzFCLFFBQUksTUFBTSxJQUFJLENBQUosQ0FBVjtBQUNBLFFBQUksR0FBRyxJQUFILENBQVEsSUFBUixF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LENBQW1CLEVBQW5CLEVBQXVCO0FBQ3RDLE1BQU0sT0FBTyxRQUFRLEVBQVIsQ0FBYjtBQUNBLE1BQU0sS0FBSyxLQUFLLGlCQUFoQjtBQUNBLE1BQU0sWUFBWSxHQUFHLE1BQUgsQ0FBVSxDQUFWLE1BQWlCLEdBQWpCLEdBQ2QsU0FBUyxhQUFULENBQXVCLEVBQXZCLENBRGMsR0FFZCxTQUFTLGNBQVQsQ0FBd0IsRUFBeEIsQ0FGSjs7QUFJQSxNQUFJLENBQUMsU0FBTCxFQUFnQjtBQUNkLFVBQU0sSUFBSSxLQUFKLDRDQUNxQyxFQURyQyxPQUFOO0FBR0Q7O0FBRUQsT0FBSyxJQUFNLEdBQVgsSUFBa0IsSUFBbEIsRUFBd0I7QUFDdEIsUUFBSSxJQUFJLFVBQUosQ0FBZSxVQUFmLENBQUosRUFBZ0M7QUFDOUIsVUFBTSxnQkFBZ0IsSUFBSSxNQUFKLENBQVcsV0FBVyxNQUF0QixFQUE4QixXQUE5QixFQUF0QjtBQUNBLFVBQU0sbUJBQW1CLElBQUksTUFBSixDQUFXLEtBQU0sR0FBTixDQUFYLENBQXpCO0FBQ0EsVUFBTSwwQ0FBd0MsYUFBeEMsT0FBTjtBQUNBLFVBQU0sb0JBQW9CLFVBQVUsYUFBVixDQUF3QixpQkFBeEIsQ0FBMUI7QUFDQSxVQUFJLENBQUMsaUJBQUwsRUFBd0I7QUFDdEIsY0FBTSxJQUFJLEtBQUosd0NBQ2lDLGFBRGpDLE9BQU47QUFHRDs7QUFFRCxVQUFNLFVBQVUsaUJBQWlCLElBQWpCLENBQXNCLEdBQUcsS0FBekIsQ0FBaEI7QUFDQSx3QkFBa0IsU0FBbEIsQ0FBNEIsTUFBNUIsQ0FBbUMsYUFBbkMsRUFBa0QsT0FBbEQ7QUFDQSx3QkFBa0IsWUFBbEIsQ0FBK0IsT0FBL0IsRUFBd0MsT0FBeEM7QUFDRDtBQUNGO0FBQ0YsQ0E5QkQiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXG4vKipcbiAqIEFycmF5I2ZpbHRlci5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdD19IHNlbGZcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHRocm93IFR5cGVFcnJvclxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyciwgZm4sIHNlbGYpIHtcbiAgaWYgKGFyci5maWx0ZXIpIHJldHVybiBhcnIuZmlsdGVyKGZuLCBzZWxmKTtcbiAgaWYgKHZvaWQgMCA9PT0gYXJyIHx8IG51bGwgPT09IGFycikgdGhyb3cgbmV3IFR5cGVFcnJvcjtcbiAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGZuKSB0aHJvdyBuZXcgVHlwZUVycm9yO1xuICB2YXIgcmV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFoYXNPd24uY2FsbChhcnIsIGkpKSBjb250aW51ZTtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgIGlmIChmbi5jYWxsKHNlbGYsIHZhbCwgaSwgYXJyKSkgcmV0LnB1c2godmFsKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4iLCIvKipcbiAqIGFycmF5LWZvcmVhY2hcbiAqICAgQXJyYXkjZm9yRWFjaCBwb255ZmlsbCBmb3Igb2xkZXIgYnJvd3NlcnNcbiAqICAgKFBvbnlmaWxsOiBBIHBvbHlmaWxsIHRoYXQgZG9lc24ndCBvdmVyd3JpdGUgdGhlIG5hdGl2ZSBtZXRob2QpXG4gKiBcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2FkYS9hcnJheS1mb3JlYWNoXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGFrdXRvIFdhZGFcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL3R3YWRhL2FycmF5LWZvcmVhY2gvYmxvYi9tYXN0ZXIvTUlULUxJQ0VOU0VcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvckVhY2ggKGFyeSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBpZiAoYXJ5LmZvckVhY2gpIHtcbiAgICAgICAgYXJ5LmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSs9MSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGFyeVtpXSwgaSwgYXJ5KTtcbiAgICB9XG59O1xuIiwiLypcbiAqIGNsYXNzTGlzdC5qczogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uLlxuICogMjAxNC0wNy0yM1xuICpcbiAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqIFB1YmxpYyBEb21haW4uXG4gKiBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suXG4gKi9cblxuLypnbG9iYWwgc2VsZiwgZG9jdW1lbnQsIERPTUV4Y2VwdGlvbiAqL1xuXG4vKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qcyovXG5cbi8qIENvcGllZCBmcm9tIE1ETjpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2NsYXNzTGlzdFxuICovXG5cbmlmIChcImRvY3VtZW50XCIgaW4gd2luZG93LnNlbGYpIHtcblxuICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG4gIC8vIEluY2x1ZGluZyBJRSA8IEVkZ2UgbWlzc2luZyBTVkdFbGVtZW50LmNsYXNzTGlzdFxuICBpZiAoIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpKVxuICAgIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyAmJiAhKFwiY2xhc3NMaXN0XCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIikpKSB7XG5cbiAgKGZ1bmN0aW9uICh2aWV3KSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmICghKCdFbGVtZW50JyBpbiB2aWV3KSkgcmV0dXJuO1xuXG4gICAgdmFyXG4gICAgICAgIGNsYXNzTGlzdFByb3AgPSBcImNsYXNzTGlzdFwiXG4gICAgICAsIHByb3RvUHJvcCA9IFwicHJvdG90eXBlXCJcbiAgICAgICwgZWxlbUN0clByb3RvID0gdmlldy5FbGVtZW50W3Byb3RvUHJvcF1cbiAgICAgICwgb2JqQ3RyID0gT2JqZWN0XG4gICAgICAsIHN0clRyaW0gPSBTdHJpbmdbcHJvdG9Qcm9wXS50cmltIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIik7XG4gICAgICB9XG4gICAgICAsIGFyckluZGV4T2YgPSBBcnJheVtwcm90b1Byb3BdLmluZGV4T2YgfHwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyXG4gICAgICAgICAgICBpID0gMFxuICAgICAgICAgICwgbGVuID0gdGhpcy5sZW5ndGhcbiAgICAgICAgO1xuICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgLy8gVmVuZG9yczogcGxlYXNlIGFsbG93IGNvbnRlbnQgY29kZSB0byBpbnN0YW50aWF0ZSBET01FeGNlcHRpb25zXG4gICAgICAsIERPTUV4ID0gZnVuY3Rpb24gKHR5cGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gdHlwZTtcbiAgICAgICAgdGhpcy5jb2RlID0gRE9NRXhjZXB0aW9uW3R5cGVdO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfVxuICAgICAgLCBjaGVja1Rva2VuQW5kR2V0SW5kZXggPSBmdW5jdGlvbiAoY2xhc3NMaXN0LCB0b2tlbikge1xuICAgICAgICBpZiAodG9rZW4gPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXG4gICAgICAgICAgICAgIFwiU1lOVEFYX0VSUlwiXG4gICAgICAgICAgICAsIFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvXFxzLy50ZXN0KHRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICAgXCJJTlZBTElEX0NIQVJBQ1RFUl9FUlJcIlxuICAgICAgICAgICAgLCBcIlN0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlclwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJySW5kZXhPZi5jYWxsKGNsYXNzTGlzdCwgdG9rZW4pO1xuICAgICAgfVxuICAgICAgLCBDbGFzc0xpc3QgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICB2YXJcbiAgICAgICAgICAgIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIilcbiAgICAgICAgICAsIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KC9cXHMrLykgOiBbXVxuICAgICAgICAgICwgaSA9IDBcbiAgICAgICAgICAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoXG4gICAgICAgIDtcbiAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHRoaXMucHVzaChjbGFzc2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLnRvU3RyaW5nKCkpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLCBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFtwcm90b1Byb3BdID0gW11cbiAgICAgICwgY2xhc3NMaXN0R2V0dGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdCh0aGlzKTtcbiAgICAgIH1cbiAgICA7XG4gICAgLy8gTW9zdCBET01FeGNlcHRpb24gaW1wbGVtZW50YXRpb25zIGRvbid0IGFsbG93IGNhbGxpbmcgRE9NRXhjZXB0aW9uJ3MgdG9TdHJpbmcoKVxuICAgIC8vIG9uIG5vbi1ET01FeGNlcHRpb25zLiBFcnJvcidzIHRvU3RyaW5nKCkgaXMgc3VmZmljaWVudCBoZXJlLlxuICAgIERPTUV4W3Byb3RvUHJvcF0gPSBFcnJvcltwcm90b1Byb3BdO1xuICAgIGNsYXNzTGlzdFByb3RvLml0ZW0gPSBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIHRoaXNbaV0gfHwgbnVsbDtcbiAgICB9O1xuICAgIGNsYXNzTGlzdFByb3RvLmNvbnRhaW5zID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICB0b2tlbiArPSBcIlwiO1xuICAgICAgcmV0dXJuIGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbikgIT09IC0xO1xuICAgIH07XG4gICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyXG4gICAgICAgICAgdG9rZW5zID0gYXJndW1lbnRzXG4gICAgICAgICwgaSA9IDBcbiAgICAgICAgLCBsID0gdG9rZW5zLmxlbmd0aFxuICAgICAgICAsIHRva2VuXG4gICAgICAgICwgdXBkYXRlZCA9IGZhbHNlXG4gICAgICA7XG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcbiAgICAgICAgaWYgKGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbikgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKHRva2VuKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IGwpO1xuXG4gICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhclxuICAgICAgICAgIHRva2VucyA9IGFyZ3VtZW50c1xuICAgICAgICAsIGkgPSAwXG4gICAgICAgICwgbCA9IHRva2Vucy5sZW5ndGhcbiAgICAgICAgLCB0b2tlblxuICAgICAgICAsIHVwZGF0ZWQgPSBmYWxzZVxuICAgICAgICAsIGluZGV4XG4gICAgICA7XG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcbiAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuICAgICAgICB3aGlsZSAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IGwpO1xuXG4gICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNsYXNzTGlzdFByb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbiwgZm9yY2UpIHtcbiAgICAgIHRva2VuICs9IFwiXCI7XG5cbiAgICAgIHZhclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY29udGFpbnModG9rZW4pXG4gICAgICAgICwgbWV0aG9kID0gcmVzdWx0ID9cbiAgICAgICAgICBmb3JjZSAhPT0gdHJ1ZSAmJiBcInJlbW92ZVwiXG4gICAgICAgIDpcbiAgICAgICAgICBmb3JjZSAhPT0gZmFsc2UgJiYgXCJhZGRcIlxuICAgICAgO1xuXG4gICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgIHRoaXNbbWV0aG9kXSh0b2tlbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9XG4gICAgfTtcbiAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmpvaW4oXCIgXCIpO1xuICAgIH07XG5cbiAgICBpZiAob2JqQ3RyLmRlZmluZVByb3BlcnR5KSB7XG4gICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG4gICAgICAgICAgZ2V0OiBjbGFzc0xpc3RHZXR0ZXJcbiAgICAgICAgLCBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuICAgICAgfSBjYXRjaCAoZXgpIHsgLy8gSUUgOCBkb2Vzbid0IHN1cHBvcnQgZW51bWVyYWJsZTp0cnVlXG4gICAgICAgIGlmIChleC5udW1iZXIgPT09IC0weDdGRjVFQzU0KSB7XG4gICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eShlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2JqQ3RyW3Byb3RvUHJvcF0uX19kZWZpbmVHZXR0ZXJfXykge1xuICAgICAgZWxlbUN0clByb3RvLl9fZGVmaW5lR2V0dGVyX18oY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyKTtcbiAgICB9XG5cbiAgICB9KHdpbmRvdy5zZWxmKSk7XG5cbiAgICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIGZ1bGwgb3IgcGFydGlhbCBuYXRpdmUgY2xhc3NMaXN0IHN1cHBvcnQsIHNvIGp1c3QgY2hlY2sgaWYgd2UgbmVlZFxuICAgIC8vIHRvIG5vcm1hbGl6ZSB0aGUgYWRkL3JlbW92ZSBhbmQgdG9nZ2xlIEFQSXMuXG5cbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpO1xuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYzFcIiwgXCJjMlwiKTtcblxuICAgICAgLy8gUG9seWZpbGwgZm9yIElFIDEwLzExIGFuZCBGaXJlZm94IDwyNiwgd2hlcmUgY2xhc3NMaXN0LmFkZCBhbmRcbiAgICAgIC8vIGNsYXNzTGlzdC5yZW1vdmUgZXhpc3QgYnV0IHN1cHBvcnQgb25seSBvbmUgYXJndW1lbnQgYXQgYSB0aW1lLlxuICAgICAgaWYgKCF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjMlwiKSkge1xuICAgICAgICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdO1xuXG4gICAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICAgIHZhciBpLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGNyZWF0ZU1ldGhvZCgnYWRkJyk7XG4gICAgICAgIGNyZWF0ZU1ldGhvZCgncmVtb3ZlJyk7XG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJjM1wiLCBmYWxzZSk7XG5cbiAgICAgIC8vIFBvbHlmaWxsIGZvciBJRSAxMCBhbmQgRmlyZWZveCA8MjQsIHdoZXJlIGNsYXNzTGlzdC50b2dnbGUgZG9lcyBub3RcbiAgICAgIC8vIHN1cHBvcnQgdGhlIHNlY29uZCBhcmd1bWVudC5cbiAgICAgIGlmICh0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjM1wiKSkge1xuICAgICAgICB2YXIgX3RvZ2dsZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlO1xuXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24odG9rZW4sIGZvcmNlKSB7XG4gICAgICAgICAgaWYgKDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKHRva2VuKSA9PT0gIWZvcmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgfVxuXG4gICAgICB0ZXN0RWxlbWVudCA9IG51bGw7XG4gICAgfSgpKTtcbiAgfVxufVxuIiwiLyohXG4gICogZG9tcmVhZHkgKGMpIER1c3RpbiBEaWF6IDIwMTQgLSBMaWNlbnNlIE1JVFxuICAqL1xuIWZ1bmN0aW9uIChuYW1lLCBkZWZpbml0aW9uKSB7XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcpIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpXG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JykgZGVmaW5lKGRlZmluaXRpb24pXG4gIGVsc2UgdGhpc1tuYW1lXSA9IGRlZmluaXRpb24oKVxuXG59KCdkb21yZWFkeScsIGZ1bmN0aW9uICgpIHtcblxuICB2YXIgZm5zID0gW10sIGxpc3RlbmVyXG4gICAgLCBkb2MgPSBkb2N1bWVudFxuICAgICwgaGFjayA9IGRvYy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGxcbiAgICAsIGRvbUNvbnRlbnRMb2FkZWQgPSAnRE9NQ29udGVudExvYWRlZCdcbiAgICAsIGxvYWRlZCA9IChoYWNrID8gL15sb2FkZWR8XmMvIDogL15sb2FkZWR8Xml8XmMvKS50ZXN0KGRvYy5yZWFkeVN0YXRlKVxuXG5cbiAgaWYgKCFsb2FkZWQpXG4gIGRvYy5hZGRFdmVudExpc3RlbmVyKGRvbUNvbnRlbnRMb2FkZWQsIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKGRvbUNvbnRlbnRMb2FkZWQsIGxpc3RlbmVyKVxuICAgIGxvYWRlZCA9IDFcbiAgICB3aGlsZSAobGlzdGVuZXIgPSBmbnMuc2hpZnQoKSkgbGlzdGVuZXIoKVxuICB9KVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBsb2FkZWQgPyBzZXRUaW1lb3V0KGZuLCAwKSA6IGZucy5wdXNoKGZuKVxuICB9XG5cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8MyBNb2Rlcm5penJcbi8vIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZG9tL2RhdGFzZXQuanNcblxuZnVuY3Rpb24gdXNlTmF0aXZlKCkge1xuXHR2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRlbGVtLnNldEF0dHJpYnV0ZSgnZGF0YS1hLWInLCAnYycpO1xuXG5cdHJldHVybiBCb29sZWFuKGVsZW0uZGF0YXNldCAmJiBlbGVtLmRhdGFzZXQuYUIgPT09ICdjJyk7XG59XG5cbmZ1bmN0aW9uIG5hdGl2ZURhdGFzZXQoZWxlbWVudCkge1xuXHRyZXR1cm4gZWxlbWVudC5kYXRhc2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVzZU5hdGl2ZSgpID8gbmF0aXZlRGF0YXNldCA6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdHZhciBtYXAgPSB7fTtcblx0dmFyIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG5cblx0ZnVuY3Rpb24gZ2V0dGVyKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2V0dGVyKG5hbWUsIHZhbHVlKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDAsIGogPSBhdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuXG5cdFx0aWYgKGF0dHJpYnV0ZSkge1xuXHRcdFx0dmFyIG5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcblxuXHRcdFx0aWYgKG5hbWUuaW5kZXhPZignZGF0YS0nKSA9PT0gMCkge1xuXHRcdFx0XHR2YXIgcHJvcCA9IG5hbWUuc2xpY2UoNSkucmVwbGFjZSgvLS4vZywgZnVuY3Rpb24gKHUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIHZhbHVlID0gYXR0cmlidXRlLnZhbHVlO1xuXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIHByb3AsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGdldDogZ2V0dGVyLmJpbmQoeyB2YWx1ZTogdmFsdWUgfHwgJycgfSksXG5cdFx0XHRcdFx0c2V0OiBzZXR0ZXIuYmluZChlbGVtZW50LCBuYW1lKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWFwO1xufTtcblxuIiwiLy8gZWxlbWVudC1jbG9zZXN0IHwgQ0MwLTEuMCB8IGdpdGh1Yi5jb20vam9uYXRoYW50bmVhbC9jbG9zZXN0XG5cbihmdW5jdGlvbiAoRWxlbWVudFByb3RvKSB7XG5cdGlmICh0eXBlb2YgRWxlbWVudFByb3RvLm1hdGNoZXMgIT09ICdmdW5jdGlvbicpIHtcblx0XHRFbGVtZW50UHJvdG8ubWF0Y2hlcyA9IEVsZW1lbnRQcm90by5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50UHJvdG8ubW96TWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnRQcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZnVuY3Rpb24gbWF0Y2hlcyhzZWxlY3Rvcikge1xuXHRcdFx0dmFyIGVsZW1lbnQgPSB0aGlzO1xuXHRcdFx0dmFyIGVsZW1lbnRzID0gKGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudC5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblx0XHRcdHZhciBpbmRleCA9IDA7XG5cblx0XHRcdHdoaWxlIChlbGVtZW50c1tpbmRleF0gJiYgZWxlbWVudHNbaW5kZXhdICE9PSBlbGVtZW50KSB7XG5cdFx0XHRcdCsraW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBCb29sZWFuKGVsZW1lbnRzW2luZGV4XSk7XG5cdFx0fTtcblx0fVxuXG5cdGlmICh0eXBlb2YgRWxlbWVudFByb3RvLmNsb3Nlc3QgIT09ICdmdW5jdGlvbicpIHtcblx0XHRFbGVtZW50UHJvdG8uY2xvc2VzdCA9IGZ1bmN0aW9uIGNsb3Nlc3Qoc2VsZWN0b3IpIHtcblx0XHRcdHZhciBlbGVtZW50ID0gdGhpcztcblxuXHRcdFx0d2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuXHRcdFx0XHRpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblx0fVxufSkod2luZG93LkVsZW1lbnQucHJvdG90eXBlKTtcbiIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJjb25zdCBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5jb25zdCBkZWxlZ2F0ZSA9IHJlcXVpcmUoJy4uL2RlbGVnYXRlJyk7XG5jb25zdCBkZWxlZ2F0ZUFsbCA9IHJlcXVpcmUoJy4uL2RlbGVnYXRlQWxsJyk7XG5cbmNvbnN0IERFTEVHQVRFX1BBVFRFUk4gPSAvXiguKyk6ZGVsZWdhdGVcXCgoLispXFwpJC87XG5jb25zdCBTUEFDRSA9ICcgJztcblxuY29uc3QgZ2V0TGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSwgaGFuZGxlcikge1xuICB2YXIgbWF0Y2ggPSB0eXBlLm1hdGNoKERFTEVHQVRFX1BBVFRFUk4pO1xuICB2YXIgc2VsZWN0b3I7XG4gIGlmIChtYXRjaCkge1xuICAgIHR5cGUgPSBtYXRjaFsxXTtcbiAgICBzZWxlY3RvciA9IG1hdGNoWzJdO1xuICB9XG5cbiAgdmFyIG9wdGlvbnM7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgY2FwdHVyZTogcG9wS2V5KGhhbmRsZXIsICdjYXB0dXJlJyksXG4gICAgICBwYXNzaXZlOiBwb3BLZXkoaGFuZGxlciwgJ3Bhc3NpdmUnKVxuICAgIH07XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIGRlbGVnYXRlOiAodHlwZW9mIGhhbmRsZXIgPT09ICdvYmplY3QnKVxuICAgICAgPyBkZWxlZ2F0ZUFsbChoYW5kbGVyKVxuICAgICAgOiBzZWxlY3RvclxuICAgICAgICA/IGRlbGVnYXRlKHNlbGVjdG9yLCBoYW5kbGVyKVxuICAgICAgICA6IGhhbmRsZXIsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9O1xuXG4gIGlmICh0eXBlLmluZGV4T2YoU1BBQ0UpID4gLTEpIHtcbiAgICByZXR1cm4gdHlwZS5zcGxpdChTUEFDRSkubWFwKGZ1bmN0aW9uKF90eXBlKSB7XG4gICAgICByZXR1cm4gYXNzaWduKHt0eXBlOiBfdHlwZX0sIGxpc3RlbmVyKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsaXN0ZW5lci50eXBlID0gdHlwZTtcbiAgICByZXR1cm4gW2xpc3RlbmVyXTtcbiAgfVxufTtcblxudmFyIHBvcEtleSA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IG9ialtrZXldO1xuICBkZWxldGUgb2JqW2tleV07XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmVoYXZpb3IoZXZlbnRzLCBwcm9wcykge1xuICBjb25zdCBsaXN0ZW5lcnMgPSBPYmplY3Qua2V5cyhldmVudHMpXG4gICAgLnJlZHVjZShmdW5jdGlvbihtZW1vLCB0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHR5cGUsIGV2ZW50c1t0eXBlXSk7XG4gICAgICByZXR1cm4gbWVtby5jb25jYXQobGlzdGVuZXJzKTtcbiAgICB9LCBbXSk7XG5cbiAgcmV0dXJuIGFzc2lnbih7XG4gICAgYWRkOiBmdW5jdGlvbiBhZGRCZWhhdmlvcihlbGVtZW50KSB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbihsaXN0ZW5lcikge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgbGlzdGVuZXIudHlwZSxcbiAgICAgICAgICBsaXN0ZW5lci5kZWxlZ2F0ZSxcbiAgICAgICAgICBsaXN0ZW5lci5vcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlQmVoYXZpb3IoZWxlbWVudCkge1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgIGxpc3RlbmVyLnR5cGUsXG4gICAgICAgICAgbGlzdGVuZXIuZGVsZWdhdGUsXG4gICAgICAgICAgbGlzdGVuZXIub3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBwcm9wcyk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlKGZ1bmN0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBmdW5jdGlvbnMuc29tZShmdW5jdGlvbihmbikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZSkgPT09IGZhbHNlO1xuICAgIH0sIHRoaXMpO1xuICB9O1xufTtcbiIsIi8vIHBvbHlmaWxsIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3RcbnJlcXVpcmUoJ2VsZW1lbnQtY2xvc2VzdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlbGVnYXRlKHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZGVsZWdhdGlvbihldmVudCkge1xuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGFyZ2V0LCBldmVudCk7XG4gICAgfVxuICB9XG59O1xuIiwiY29uc3QgZGVsZWdhdGUgPSByZXF1aXJlKCcuLi9kZWxlZ2F0ZScpO1xuY29uc3QgY29tcG9zZSA9IHJlcXVpcmUoJy4uL2NvbXBvc2UnKTtcblxuY29uc3QgU1BMQVQgPSAnKic7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVsZWdhdGVBbGwoc2VsZWN0b3JzKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RvcnMpXG5cbiAgLy8gWFhYIG9wdGltaXphdGlvbjogaWYgdGhlcmUgaXMgb25seSBvbmUgaGFuZGxlciBhbmQgaXQgYXBwbGllcyB0b1xuICAvLyBhbGwgZWxlbWVudHMgKHRoZSBcIipcIiBDU1Mgc2VsZWN0b3IpLCB0aGVuIGp1c3QgcmV0dXJuIHRoYXRcbiAgLy8gaGFuZGxlclxuICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0gU1BMQVQpIHtcbiAgICByZXR1cm4gc2VsZWN0b3JzW1NQTEFUXTtcbiAgfVxuXG4gIGNvbnN0IGRlbGVnYXRlcyA9IGtleXMucmVkdWNlKGZ1bmN0aW9uKG1lbW8sIHNlbGVjdG9yKSB7XG4gICAgbWVtby5wdXNoKGRlbGVnYXRlKHNlbGVjdG9yLCBzZWxlY3RvcnNbc2VsZWN0b3JdKSk7XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNvbXBvc2UoZGVsZWdhdGVzKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlnbm9yZShlbGVtZW50LCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaWdub3JhbmNlKGUpIHtcbiAgICBpZiAoZWxlbWVudCAhPT0gZS50YXJnZXQgJiYgIWVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBlKTtcbiAgICB9XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvbmNlKGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gIHZhciB3cmFwcGVkID0gZnVuY3Rpb24gd3JhcHBlZE9uY2UoZSkge1xuICAgIGUuY3VycmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGUudHlwZSwgd3JhcHBlZCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGxpc3RlbmVyLmNhbGwodGhpcywgZSk7XG4gIH07XG4gIHJldHVybiB3cmFwcGVkO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUkVfVFJJTSA9IC8oXlxccyspfChcXHMrJCkvZztcbnZhciBSRV9TUExJVCA9IC9cXHMrLztcblxudmFyIHRyaW0gPSBTdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgPyBmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci50cmltKCk7IH1cbiAgOiBmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci5yZXBsYWNlKFJFX1RSSU0sICcnKTsgfTtcblxudmFyIHF1ZXJ5QnlJZCA9IGZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ1tpZD1cIicgKyBpZC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgKyAnXCJdJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc29sdmVJZHMoaWRzLCBkb2MpIHtcbiAgaWYgKHR5cGVvZiBpZHMgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHN0cmluZyBidXQgZ290ICcgKyAodHlwZW9mIGlkcykpO1xuICB9XG5cbiAgaWYgKCFkb2MpIHtcbiAgICBkb2MgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gIH1cblxuICB2YXIgZ2V0RWxlbWVudEJ5SWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWRcbiAgICA/IGRvYy5nZXRFbGVtZW50QnlJZC5iaW5kKGRvYylcbiAgICA6IHF1ZXJ5QnlJZC5iaW5kKGRvYyk7XG5cbiAgaWRzID0gdHJpbShpZHMpLnNwbGl0KFJFX1NQTElUKTtcblxuICAvLyBYWFggd2UgY2FuIHNob3J0LWNpcmN1aXQgaGVyZSBiZWNhdXNlIHRyaW1taW5nIGFuZCBzcGxpdHRpbmcgYVxuICAvLyBzdHJpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHByb2R1Y2VzIGFuIGFycmF5IGNvbnRhaW5pbmcgYSBzaW5nbGUsXG4gIC8vIGVtcHR5IHN0cmluZ1xuICBpZiAoaWRzLmxlbmd0aCA9PT0gMSAmJiBpZHNbMF0gPT09ICcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGlkc1xuICAgIC5tYXAoZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBlbCA9IGdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBlbGVtZW50IHdpdGggaWQ6IFwiJyArIGlkICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWw7XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYmVoYXZpb3IgPSByZXF1aXJlKCcuLi91dGlscy9iZWhhdmlvcicpO1xuY29uc3QgZmlsdGVyID0gcmVxdWlyZSgnYXJyYXktZmlsdGVyJyk7XG5jb25zdCBmb3JFYWNoID0gcmVxdWlyZSgnYXJyYXktZm9yZWFjaCcpO1xuY29uc3QgdG9nZ2xlID0gcmVxdWlyZSgnLi4vdXRpbHMvdG9nZ2xlJyk7XG5jb25zdCBpc0VsZW1lbnRJblZpZXdwb3J0ID0gcmVxdWlyZSgnLi4vdXRpbHMvaXMtaW4tdmlld3BvcnQnKTtcblxuY29uc3QgQ0xJQ0sgPSByZXF1aXJlKCcuLi9ldmVudHMnKS5DTElDSztcbmNvbnN0IFBSRUZJWCA9IHJlcXVpcmUoJy4uL2NvbmZpZycpLnByZWZpeDtcblxuLy8gWFhYIG1hdGNoIC51c2EtYWNjb3JkaW9uIGFuZCAudXNhLWFjY29yZGlvbi1ib3JkZXJlZFxuY29uc3QgQUNDT1JESU9OID0gYC4ke1BSRUZJWH0tYWNjb3JkaW9uLCAuJHtQUkVGSVh9LWFjY29yZGlvbi1ib3JkZXJlZGA7XG5jb25zdCBCVVRUT04gPSBgLiR7UFJFRklYfS1hY2NvcmRpb24tYnV0dG9uW2FyaWEtY29udHJvbHNdYDtcbmNvbnN0IEVYUEFOREVEID0gJ2FyaWEtZXhwYW5kZWQnO1xuY29uc3QgTVVMVElTRUxFQ1RBQkxFID0gJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJztcblxuLyoqXG4gKiBUb2dnbGUgYSBidXR0b24ncyBcInByZXNzZWRcIiBzdGF0ZSwgb3B0aW9uYWxseSBwcm92aWRpbmcgYSB0YXJnZXRcbiAqIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IGJ1dHRvblxuICogQHBhcmFtIHtib29sZWFuP30gZXhwYW5kZWQgSWYgbm8gc3RhdGUgaXMgcHJvdmlkZWQsIHRoZSBjdXJyZW50XG4gKiBzdGF0ZSB3aWxsIGJlIHRvZ2dsZWQgKGZyb20gZmFsc2UgdG8gdHJ1ZSwgYW5kIHZpY2UtdmVyc2EpLlxuICogQHJldHVybiB7Ym9vbGVhbn0gdGhlIHJlc3VsdGluZyBzdGF0ZVxuICovXG5jb25zdCB0b2dnbGVCdXR0b24gPSAoYnV0dG9uLCBleHBhbmRlZCkgPT4ge1xuICB2YXIgYWNjb3JkaW9uID0gYnV0dG9uLmNsb3Nlc3QoQUNDT1JESU9OKTtcbiAgaWYgKCFhY2NvcmRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7QlVUVE9OfSBpcyBtaXNzaW5nIG91dGVyICR7QUNDT1JESU9OfWApO1xuICB9XG5cbiAgZXhwYW5kZWQgPSB0b2dnbGUoYnV0dG9uLCBleHBhbmRlZCk7XG4gIC8vIFhYWCBtdWx0aXNlbGVjdGFibGUgaXMgb3B0LWluLCB0byBwcmVzZXJ2ZSBsZWdhY3kgYmVoYXZpb3JcbiAgY29uc3QgbXVsdGlzZWxlY3RhYmxlID0gYWNjb3JkaW9uLmdldEF0dHJpYnV0ZShNVUxUSVNFTEVDVEFCTEUpID09PSAndHJ1ZSc7XG5cbiAgaWYgKGV4cGFuZGVkICYmICFtdWx0aXNlbGVjdGFibGUpIHtcbiAgICBmb3JFYWNoKGdldEFjY29yZGlvbkJ1dHRvbnMoYWNjb3JkaW9uKSwgb3RoZXIgPT4ge1xuICAgICAgaWYgKG90aGVyICE9PSBidXR0b24pIHtcbiAgICAgICAgdG9nZ2xlKG90aGVyLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gYnV0dG9uXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlXG4gKi9cbmNvbnN0IHNob3dCdXR0b24gPSBidXR0b24gPT4gdG9nZ2xlQnV0dG9uKGJ1dHRvbiwgdHJ1ZSk7XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gYnV0dG9uXG4gKiBAcmV0dXJuIHtib29sZWFufSBmYWxzZVxuICovXG5jb25zdCBoaWRlQnV0dG9uID0gYnV0dG9uID0+IHRvZ2dsZUJ1dHRvbihidXR0b24sIGZhbHNlKTtcblxuLyoqXG4gKiBHZXQgYW4gQXJyYXkgb2YgYnV0dG9uIGVsZW1lbnRzIGJlbG9uZ2luZyBkaXJlY3RseSB0byB0aGUgZ2l2ZW5cbiAqIGFjY29yZGlvbiBlbGVtZW50LlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYWNjb3JkaW9uXG4gKiBAcmV0dXJuIHthcnJheTxIVE1MQnV0dG9uRWxlbWVudD59XG4gKi9cbmNvbnN0IGdldEFjY29yZGlvbkJ1dHRvbnMgPSBhY2NvcmRpb24gPT4ge1xuICByZXR1cm4gZmlsdGVyKGFjY29yZGlvbi5xdWVyeVNlbGVjdG9yQWxsKEJVVFRPTiksIGJ1dHRvbiA9PiB7XG4gICAgcmV0dXJuIGJ1dHRvbi5jbG9zZXN0KEFDQ09SRElPTikgPT09IGFjY29yZGlvbjtcbiAgfSk7XG59O1xuXG5jb25zdCBhY2NvcmRpb24gPSBiZWhhdmlvcih7XG4gIFsgQ0xJQ0sgXToge1xuICAgIFsgQlVUVE9OIF06IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRvZ2dsZUJ1dHRvbih0aGlzKTtcblxuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKEVYUEFOREVEKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIC8vIFdlIHdlcmUganVzdCBleHBhbmRlZCwgYnV0IGlmIGFub3RoZXIgYWNjb3JkaW9uIHdhcyBhbHNvIGp1c3RcbiAgICAgICAgLy8gY29sbGFwc2VkLCB3ZSBtYXkgbm8gbG9uZ2VyIGJlIGluIHRoZSB2aWV3cG9ydC4gVGhpcyBlbnN1cmVzXG4gICAgICAgIC8vIHRoYXQgd2UgYXJlIHN0aWxsIHZpc2libGUsIHNvIHRoZSB1c2VyIGlzbid0IGNvbmZ1c2VkLlxuICAgICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodGhpcykpIHRoaXMuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufSwge1xuICBpbml0OiByb290ID0+IHtcbiAgICBmb3JFYWNoKHJvb3QucXVlcnlTZWxlY3RvckFsbChCVVRUT04pLCBidXR0b24gPT4ge1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBidXR0b24uZ2V0QXR0cmlidXRlKEVYUEFOREVEKSA9PT0gJ3RydWUnO1xuICAgICAgdG9nZ2xlQnV0dG9uKGJ1dHRvbiwgZXhwYW5kZWQpO1xuICAgIH0pO1xuICB9LFxuICBBQ0NPUkRJT04sXG4gIEJVVFRPTixcbiAgc2hvdzogc2hvd0J1dHRvbixcbiAgaGlkZTogaGlkZUJ1dHRvbixcbiAgdG9nZ2xlOiB0b2dnbGVCdXR0b24sXG4gIGdldEJ1dHRvbnM6IGdldEFjY29yZGlvbkJ1dHRvbnMsXG59KTtcblxuLyoqXG4gKiBUT0RPOiBmb3IgMi4wLCByZW1vdmUgZXZlcnl0aGluZyBiZWxvdyB0aGlzIGNvbW1lbnQgYW5kIGV4cG9ydCB0aGVcbiAqIGJlaGF2aW9yIGRpcmVjdGx5OlxuICpcbiAqIG1vZHVsZS5leHBvcnRzID0gYmVoYXZpb3Ioey4uLn0pO1xuICovXG5jb25zdCBBY2NvcmRpb24gPSBmdW5jdGlvbiAocm9vdCkge1xuICB0aGlzLnJvb3QgPSByb290O1xuICBhY2NvcmRpb24ub24odGhpcy5yb290KTtcbn07XG5cbi8vIGNvcHkgYWxsIG9mIHRoZSBiZWhhdmlvciBtZXRob2RzIGFuZCBwcm9wcyB0byBBY2NvcmRpb25cbmNvbnN0IGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbmFzc2lnbihBY2NvcmRpb24sIGFjY29yZGlvbik7XG5cbkFjY29yZGlvbi5wcm90b3R5cGUuc2hvdyA9IHNob3dCdXR0b247XG5BY2NvcmRpb24ucHJvdG90eXBlLmhpZGUgPSBoaWRlQnV0dG9uO1xuXG5BY2NvcmRpb24ucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgYWNjb3JkaW9uLm9mZih0aGlzLnJvb3QpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBY2NvcmRpb247XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoJy4uL3V0aWxzL2JlaGF2aW9yJyk7XG5jb25zdCB0b2dnbGUgPSByZXF1aXJlKCcuLi91dGlscy90b2dnbGUnKTtcblxuY29uc3QgQ0xJQ0sgPSByZXF1aXJlKCcuLi9ldmVudHMnKS5DTElDSztcbmNvbnN0IFBSRUZJWCA9IHJlcXVpcmUoJy4uL2NvbmZpZycpLnByZWZpeDtcblxuY29uc3QgSEVBREVSID0gYC4ke1BSRUZJWH0tYmFubmVyLWhlYWRlcmA7XG5jb25zdCBFWFBBTkRFRF9DTEFTUyA9IGAke1BSRUZJWH0tYmFubmVyLWhlYWRlci1leHBhbmRlZGA7XG5cbmNvbnN0IHRvZ2dsZUJhbm5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB0aGlzLmNsb3Nlc3QoSEVBREVSKS5jbGFzc0xpc3QudG9nZ2xlKEVYUEFOREVEX0NMQVNTKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBiZWhhdmlvcih7XG4gIFsgQ0xJQ0sgXToge1xuICAgIFsgYCR7SEVBREVSfSBbYXJpYS1jb250cm9sc11gIF06IHRvZ2dsZUJhbm5lcixcbiAgfSxcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWNjb3JkaW9uID0gcmVxdWlyZSgnLi9hY2NvcmRpb24nKTtcbmNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZSgnLi4vdXRpbHMvYmVoYXZpb3InKTtcbmNvbnN0IGRlYm91bmNlID0gcmVxdWlyZSgnbG9kYXNoLmRlYm91bmNlJyk7XG5jb25zdCBmb3JFYWNoID0gcmVxdWlyZSgnYXJyYXktZm9yZWFjaCcpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvc2VsZWN0Jyk7XG5cbmNvbnN0IENMSUNLID0gcmVxdWlyZSgnLi4vZXZlbnRzJykuQ0xJQ0s7XG5jb25zdCBQUkVGSVggPSByZXF1aXJlKCcuLi9jb25maWcnKS5wcmVmaXg7XG5cbmNvbnN0IEhJRERFTiA9ICdoaWRkZW4nO1xuY29uc3QgU0NPUEUgPSBgLiR7UFJFRklYfS1mb290ZXItYmlnYDtcbmNvbnN0IE5BViA9IGAke1NDT1BFfSBuYXZgO1xuY29uc3QgQlVUVE9OID0gYCR7TkFWfSAuJHtQUkVGSVh9LWZvb3Rlci1wcmltYXJ5LWxpbmtgO1xuY29uc3QgTElTVCA9IGAke05BVn0gdWxgO1xuXG5jb25zdCBISURFX01BWF9XSURUSCA9IDYwMDtcbmNvbnN0IERFQk9VTkNFX1JBVEUgPSAxODA7XG5cbmNvbnN0IHNob3dQYW5lbCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbGlzdCA9IHRoaXMuY2xvc2VzdChMSVNUKTtcbiAgbGlzdC5jbGFzc0xpc3QucmVtb3ZlKEhJRERFTik7XG5cbiAgLy8gTkI6IHRoaXMgKnNob3VsZCogYWx3YXlzIHN1Y2NlZWQgYmVjYXVzZSB0aGUgYnV0dG9uXG4gIC8vIHNlbGVjdG9yIGlzIHNjb3BlZCB0byBcIi57cHJlZml4fS1mb290ZXItYmlnIG5hdlwiXG4gIGNvbnN0IGxpc3RzID0gbGlzdC5jbG9zZXN0KE5BVilcbiAgICAucXVlcnlTZWxlY3RvckFsbCgndWwnKTtcblxuICBmb3JFYWNoKGxpc3RzLCBlbCA9PiB7XG4gICAgaWYgKGVsICE9PSBsaXN0KSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKEhJRERFTik7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHJlc2l6ZSA9IGRlYm91bmNlKCgpID0+IHtcbiAgY29uc3QgaGlkZGVuID0gd2luZG93LmlubmVyV2lkdGggPCBISURFX01BWF9XSURUSDtcbiAgZm9yRWFjaChzZWxlY3QoTElTVCksIGxpc3QgPT4ge1xuICAgIGxpc3QuY2xhc3NMaXN0LnRvZ2dsZShISURERU4sIGhpZGRlbik7XG4gIH0pO1xufSwgREVCT1VOQ0VfUkFURSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmVoYXZpb3Ioe1xuICBbIENMSUNLIF06IHtcbiAgICBbIEJVVFRPTiBdOiBzaG93UGFuZWwsXG4gIH0sXG59LCB7XG4gIC8vIGV4cG9ydCBmb3IgdXNlIGVsc2V3aGVyZVxuICBISURFX01BWF9XSURUSCxcbiAgREVCT1VOQ0VfUkFURSxcblxuICBpbml0OiB0YXJnZXQgPT4ge1xuICAgIHJlc2l6ZSgpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemUpO1xuICB9LFxuXG4gIHRlYXJkb3duOiB0YXJnZXQgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemUpO1xuICB9LFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWNjb3JkaW9uOiAgcmVxdWlyZSgnLi9hY2NvcmRpb24nKSxcbiAgYmFubmVyOiAgICAgcmVxdWlyZSgnLi9iYW5uZXInKSxcbiAgZm9vdGVyOiAgICAgcmVxdWlyZSgnLi9mb290ZXInKSxcbiAgbmF2aWdhdGlvbjogcmVxdWlyZSgnLi9uYXZpZ2F0aW9uJyksXG4gIHBhc3N3b3JkOiAgIHJlcXVpcmUoJy4vcGFzc3dvcmQnKSxcbiAgc2VhcmNoOiAgICAgcmVxdWlyZSgnLi9zZWFyY2gnKSxcbiAgc2tpcG5hdjogICAgcmVxdWlyZSgnLi9za2lwbmF2JyksXG4gIHZhbGlkYXRvcjogIHJlcXVpcmUoJy4vdmFsaWRhdG9yJyksXG59O1xuXG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoJy4uL3V0aWxzL2JlaGF2aW9yJyk7XG5jb25zdCBmb3JFYWNoID0gcmVxdWlyZSgnYXJyYXktZm9yZWFjaCcpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvc2VsZWN0Jyk7XG5jb25zdCBhY2NvcmRpb24gPSByZXF1aXJlKCcuL2FjY29yZGlvbicpO1xuXG5jb25zdCBDTElDSyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpLkNMSUNLO1xuY29uc3QgUFJFRklYID0gcmVxdWlyZSgnLi4vY29uZmlnJykucHJlZml4O1xuXG5jb25zdCBDT05URVhUID0gJ2hlYWRlcic7XG5jb25zdCBOQVYgPSBgLiR7UFJFRklYfS1uYXZgO1xuY29uc3QgTkFWX0xJTktTID0gYCR7TkFWfSBhYDtcbmNvbnN0IE9QRU5FUlMgPSBgLiR7UFJFRklYfS1tZW51LWJ0bmA7XG5jb25zdCBDTE9TRV9CVVRUT04gPSBgLiR7UFJFRklYfS1uYXYtY2xvc2VgO1xuY29uc3QgT1ZFUkxBWSA9IGAuJHtQUkVGSVh9LW92ZXJsYXlgO1xuY29uc3QgQ0xPU0VSUyA9IGAke0NMT1NFX0JVVFRPTn0sIC4ke1BSRUZJWH0tb3ZlcmxheWA7XG5jb25zdCBUT0dHTEVTID0gWyBOQVYsIE9WRVJMQVkgXS5qb2luKCcsICcpO1xuXG5jb25zdCBBQ1RJVkVfQ0xBU1MgPSAndXNhLW1vYmlsZV9uYXYtYWN0aXZlJztcbmNvbnN0IFZJU0lCTEVfQ0xBU1MgPSAnaXMtdmlzaWJsZSc7XG5cbmNvbnN0IHRvZ2dsZU5hdiA9IGZ1bmN0aW9uIChhY3RpdmUpIHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gIGlmICh0eXBlb2YgYWN0aXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICBhY3RpdmUgPSAhYm9keS5jbGFzc0xpc3QuY29udGFpbnMoQUNUSVZFX0NMQVNTKTtcbiAgfVxuICBib2R5LmNsYXNzTGlzdC50b2dnbGUoQUNUSVZFX0NMQVNTLCBhY3RpdmUpO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNsb3Nlc3QoQ09OVEVYVCk7XG4gIGZvckVhY2goc2VsZWN0KFRPR0dMRVMpLCBlbCA9PiB7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZShWSVNJQkxFX0NMQVNTKTtcbiAgfSk7XG5cbiAgaWYgKGFjdGl2ZSAmJiBjb250ZXh0KSB7XG4gICAgY29uc3QgY2xvc2VCdXR0b24gPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3IoQ0xPU0VfQlVUVE9OKTtcbiAgICBpZiAoY2xvc2VCdXR0b24pIHtcbiAgICAgIGNsb3NlQnV0dG9uLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhY3RpdmU7XG59O1xuXG5jb25zdCBuYXZpZ2F0aW9uID0gYmVoYXZpb3Ioe1xuICBbIENMSUNLIF06IHtcbiAgICBbIE9QRU5FUlMgXTogdG9nZ2xlTmF2LFxuICAgIFsgQ0xPU0VSUyBdOiB0b2dnbGVOYXYsXG4gICAgWyBOQVZfTElOS1MgXTogZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQSBuYXZpZ2F0aW9uIGxpbmsgaGFzIGJlZW4gY2xpY2tlZCEgV2Ugd2FudCB0byBjb2xsYXBzZSBhbnlcbiAgICAgIC8vIGhpZXJhcmNoaWNhbCBuYXZpZ2F0aW9uIFVJIGl0J3MgYSBwYXJ0IG9mLCBzbyB0aGF0IHRoZSB1c2VyXG4gICAgICAvLyBjYW4gZm9jdXMgb24gd2hhdGV2ZXIgdGhleSd2ZSBqdXN0IHNlbGVjdGVkLlxuXG4gICAgICAvLyBTb21lIG5hdmlnYXRpb24gbGlua3MgYXJlIGluc2lkZSBhY2NvcmRpb25zOyB3aGVuIHRoZXkncmVcbiAgICAgIC8vIGNsaWNrZWQsIHdlIHdhbnQgdG8gY29sbGFwc2UgdGhvc2UgYWNjb3JkaW9ucy5cbiAgICAgIGNvbnN0IGFjYyA9IHRoaXMuY2xvc2VzdChhY2NvcmRpb24uQUNDT1JESU9OKTtcbiAgICAgIGlmIChhY2MpIHtcbiAgICAgICAgYWNjb3JkaW9uLmdldEJ1dHRvbnMoYWNjKS5mb3JFYWNoKGJ0biA9PiBhY2NvcmRpb24uaGlkZShidG4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG1vYmlsZSBuYXZpZ2F0aW9uIG1lbnUgaXMgYWN0aXZlLCB3ZSB3YW50IHRvIGhpZGUgaXQuXG4gICAgICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoQUNUSVZFX0NMQVNTKSkge1xuICAgICAgICB0b2dnbGVOYXYuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufSk7XG5cbi8qKlxuICogVE9ETyBmb3IgMi4wLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgYW5kIGV4cG9ydCBgbmF2aWdhdGlvbmAgZGlyZWN0bHk6XG4gKlxuICogbW9kdWxlLmV4cG9ydHMgPSBiZWhhdmlvcih7Li4ufSk7XG4gKi9cbmNvbnN0IGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbm1vZHVsZS5leHBvcnRzID0gYXNzaWduKFxuICBlbCA9PiBuYXZpZ2F0aW9uLm9uKGVsKSxcbiAgbmF2aWdhdGlvblxuKTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZSgnLi4vdXRpbHMvYmVoYXZpb3InKTtcbmNvbnN0IHRvZ2dsZUZvcm1JbnB1dCA9IHJlcXVpcmUoJy4uL3V0aWxzL3RvZ2dsZS1mb3JtLWlucHV0Jyk7XG5cbmNvbnN0IENMSUNLID0gcmVxdWlyZSgnLi4vZXZlbnRzJykuQ0xJQ0s7XG5jb25zdCBQUkVGSVggPSByZXF1aXJlKCcuLi9jb25maWcnKS5wcmVmaXg7XG5cbmNvbnN0IExJTksgPSBgLiR7UFJFRklYfS1zaG93X3Bhc3N3b3JkLCAuJHtQUkVGSVh9LXNob3dfbXVsdGlwYXNzd29yZGA7XG5cbmNvbnN0IHRvZ2dsZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB0b2dnbGVGb3JtSW5wdXQodGhpcyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJlaGF2aW9yKHtcbiAgWyBDTElDSyBdOiB7XG4gICAgWyBMSU5LIF06IHRvZ2dsZSxcbiAgfSxcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYmVoYXZpb3IgPSByZXF1aXJlKCcuLi91dGlscy9iZWhhdmlvcicpO1xuY29uc3QgZm9yRWFjaCA9IHJlcXVpcmUoJ2FycmF5LWZvcmVhY2gnKTtcbmNvbnN0IGlnbm9yZSA9IHJlcXVpcmUoJ3JlY2VwdG9yL2lnbm9yZScpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvc2VsZWN0Jyk7XG5cbmNvbnN0IENMSUNLID0gcmVxdWlyZSgnLi4vZXZlbnRzJykuQ0xJQ0s7XG5jb25zdCBQUkVGSVggPSByZXF1aXJlKCcuLi9jb25maWcnKS5wcmVmaXg7XG5cbmNvbnN0IEJVVFRPTiA9ICcuanMtc2VhcmNoLWJ1dHRvbic7XG5jb25zdCBGT1JNID0gJy5qcy1zZWFyY2gtZm9ybSc7XG5jb25zdCBJTlBVVCA9ICdbdHlwZT1zZWFyY2hdJztcbmNvbnN0IENPTlRFWFQgPSAnaGVhZGVyJzsgLy8gWFhYXG5jb25zdCBWSVNVQUxMWV9ISURERU4gPSBgJHtQUkVGSVh9LXNyLW9ubHlgO1xuXG5sZXQgbGFzdEJ1dHRvbjtcblxuY29uc3Qgc2hvd1NlYXJjaCA9IGZ1bmN0aW9uIChldmVudCkge1xuICB0b2dnbGVTZWFyY2godGhpcywgdHJ1ZSk7XG4gIGxhc3RCdXR0b24gPSB0aGlzO1xufTtcblxuY29uc3QgaGlkZVNlYXJjaCA9IGZ1bmN0aW9uIChldmVudCkge1xuICB0b2dnbGVTZWFyY2godGhpcywgZmFsc2UpO1xuICBsYXN0QnV0dG9uID0gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0Rm9ybSA9IGJ1dHRvbiA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSBidXR0b24uY2xvc2VzdChDT05URVhUKTtcbiAgcmV0dXJuIGNvbnRleHRcbiAgICA/IGNvbnRleHQucXVlcnlTZWxlY3RvcihGT1JNKVxuICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihGT1JNKTtcbn07XG5cbmNvbnN0IHRvZ2dsZVNlYXJjaCA9IChidXR0b24sIGFjdGl2ZSkgPT4ge1xuICBjb25zdCBmb3JtID0gZ2V0Rm9ybShidXR0b24pO1xuICBpZiAoIWZvcm0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vICR7Rk9STX0gZm91bmQgZm9yIHNlYXJjaCB0b2dnbGUgaW4gJHtDT05URVhUfSFgKTtcbiAgfVxuXG4gIGJ1dHRvbi5oaWRkZW4gPSBhY3RpdmU7XG4gIGZvcm0uY2xhc3NMaXN0LnRvZ2dsZShWSVNVQUxMWV9ISURERU4sICFhY3RpdmUpO1xuXG4gIGlmIChhY3RpdmUpIHtcbiAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihJTlBVVCk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBpbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgICAvLyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBfb3V0c2lkZV8gb2YgdGhlIGZvcm0gdy9pZ25vcmUoKTogaGlkZSB0aGVcbiAgICAvLyBzZWFyY2gsIHRoZW4gcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgIGNvbnN0IGxpc3RlbmVyID0gaWdub3JlKGZvcm0sIGUgPT4ge1xuICAgICAgaWYgKGxhc3RCdXR0b24pIHtcbiAgICAgICAgaGlkZVNlYXJjaC5jYWxsKGxhc3RCdXR0b24pO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKENMSUNLLCBsaXN0ZW5lcik7XG4gICAgfSk7XG5cbiAgICAvLyBOb3JtYWxseSB3ZSB3b3VsZCBqdXN0IHJ1biB0aGlzIGNvZGUgd2l0aG91dCBhIHRpbWVvdXQsIGJ1dFxuICAgIC8vIElFMTEgYW5kIEVkZ2Ugd2lsbCBhY3R1YWxseSBjYWxsIHRoZSBsaXN0ZW5lciAqaW1tZWRpYXRlbHkqIGJlY2F1c2VcbiAgICAvLyB0aGV5IGFyZSBjdXJyZW50bHkgaGFuZGxpbmcgdGhpcyBleGFjdCB0eXBlIG9mIGV2ZW50LCBzbyB3ZSdsbFxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgYnJvd3NlciBpcyBkb25lIGhhbmRsaW5nIHRoZSBjdXJyZW50IGNsaWNrIGV2ZW50LFxuICAgIC8vIGlmIGFueSwgYmVmb3JlIHdlIGF0dGFjaCB0aGUgbGlzdGVuZXIuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoQ0xJQ0ssIGxpc3RlbmVyKTtcbiAgICB9LCAwKTtcbiAgfVxufTtcblxuY29uc3Qgc2VhcmNoID0gYmVoYXZpb3Ioe1xuICBbIENMSUNLIF06IHtcbiAgICBbIEJVVFRPTiBdOiBzaG93U2VhcmNoLFxuICB9LFxufSwge1xuICBpbml0OiAodGFyZ2V0KSA9PiB7XG4gICAgZm9yRWFjaChzZWxlY3QoQlVUVE9OLCB0YXJnZXQpLCBidXR0b24gPT4ge1xuICAgICAgdG9nZ2xlU2VhcmNoKGJ1dHRvbiwgZmFsc2UpO1xuICAgIH0pO1xuICB9LFxuICB0ZWFyZG93bjogKHRhcmdldCkgPT4ge1xuICAgIC8vIGZvcmdldCB0aGUgbGFzdCBidXR0b24gY2xpY2tlZFxuICAgIGxhc3RCdXR0b24gPSB1bmRlZmluZWQ7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBUT0RPIGZvciAyLjAsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBhbmQgZXhwb3J0IGBuYXZpZ2F0aW9uYCBkaXJlY3RseTpcbiAqXG4gKiBtb2R1bGUuZXhwb3J0cyA9IGJlaGF2aW9yKHsuLi59KTtcbiAqL1xuY29uc3QgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ24oXG4gIGVsID0+IHNlYXJjaC5vbihlbCksXG4gIHNlYXJjaFxuKTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZSgnLi4vdXRpbHMvYmVoYXZpb3InKTtcbmNvbnN0IG9uY2UgPSByZXF1aXJlKCdyZWNlcHRvci9vbmNlJyk7XG5cbmNvbnN0IENMSUNLID0gcmVxdWlyZSgnLi4vZXZlbnRzJykuQ0xJQ0s7XG5jb25zdCBQUkVGSVggPSByZXF1aXJlKCcuLi9jb25maWcnKS5wcmVmaXg7XG5jb25zdCBMSU5LID0gYC4ke1BSRUZJWH0tc2tpcG5hdltocmVmXj1cIiNcIl1gO1xuXG5jb25zdCBzZXRUYWJpbmRleCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBOQjogd2Uga25vdyBiZWNhdXNlIG9mIHRoZSBzZWxlY3RvciB3ZSdyZSBkZWxlZ2F0aW5nIHRvIGJlbG93IHRoYXQgdGhlXG4gIC8vIGhyZWYgYWxyZWFkeSBiZWdpbnMgd2l0aCAnIydcbiAgY29uc3QgaWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpLnNsaWNlKDEpO1xuICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIDApO1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgb25jZShldmVudCA9PiB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIC0xKTtcbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdGhyb3cgYW4gZXJyb3I/XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmVoYXZpb3Ioe1xuICBbIENMSUNLIF06IHtcbiAgICBbIExJTksgXTogc2V0VGFiaW5kZXgsXG4gIH0sXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZSgnLi4vdXRpbHMvYmVoYXZpb3InKTtcbmNvbnN0IHZhbGlkYXRlID0gcmVxdWlyZSgnLi4vdXRpbHMvdmFsaWRhdGUtaW5wdXQnKTtcbmNvbnN0IGRlYm91bmNlID0gcmVxdWlyZSgnbG9kYXNoLmRlYm91bmNlJyk7XG5cbmNvbnN0IGNoYW5nZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICByZXR1cm4gdmFsaWRhdGUodGhpcyk7XG59O1xuXG5jb25zdCB2YWxpZGF0b3IgPSBiZWhhdmlvcih7XG4gICdrZXl1cCBjaGFuZ2UnOiB7XG4gICAgJ2lucHV0W2RhdGEtdmFsaWRhdGlvbi1lbGVtZW50XSc6IGNoYW5nZSxcbiAgfSxcbn0pO1xuXG4vKipcbiAqIFRPRE8gZm9yIDIuMCwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGFuZCBleHBvcnQgYG5hdmlnYXRpb25gIGRpcmVjdGx5OlxuICpcbiAqIG1vZHVsZS5leHBvcnRzID0gYmVoYXZpb3Ioey4uLn0pO1xuICovXG5jb25zdCBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbihcbiAgZWwgPT4gdmFsaWRhdG9yLm9uKGVsKSxcbiAgdmFsaWRhdG9yXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHByZWZpeDogJ3VzYScsXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIFRoaXMgdXNlZCB0byBiZSBjb25kaXRpb25hbGx5IGRlcGVuZGVudCBvbiB3aGV0aGVyIHRoZVxuICAvLyBicm93c2VyIHN1cHBvcnRlZCB0b3VjaCBldmVudHM7IGlmIGl0IGRpZCwgYENMSUNLYCB3YXMgc2V0IHRvXG4gIC8vIGB0b3VjaHN0YXJ0YC4gIEhvd2V2ZXIsIHRoaXMgaGFkIGRvd25zaWRlczpcbiAgLy9cbiAgLy8gKiBJdCBwcmUtZW1wdGVkIG1vYmlsZSBicm93c2VycycgZGVmYXVsdCBiZWhhdmlvciBvZiBkZXRlY3RpbmdcbiAgLy8gICB3aGV0aGVyIGEgdG91Y2ggdHVybmVkIGludG8gYSBzY3JvbGwsIHRoZXJlYnkgcHJldmVudGluZ1xuICAvLyAgIHVzZXJzIGZyb20gdXNpbmcgc29tZSBvZiBvdXIgY29tcG9uZW50cyBhcyBzY3JvbGwgc3VyZmFjZXMuXG4gIC8vXG4gIC8vICogU29tZSBkZXZpY2VzLCBzdWNoIGFzIHRoZSBNaWNyb3NvZnQgU3VyZmFjZSBQcm8sIHN1cHBvcnQgKmJvdGgqXG4gIC8vICAgdG91Y2ggYW5kIGNsaWNrcy4gVGhpcyBtZWFudCB0aGUgY29uZGl0aW9uYWwgZWZmZWN0aXZlbHkgZHJvcHBlZFxuICAvLyAgIHN1cHBvcnQgZm9yIHRoZSB1c2VyJ3MgbW91c2UsIGZydXN0cmF0aW5nIHVzZXJzIHdobyBwcmVmZXJyZWRcbiAgLy8gICBpdCBvbiB0aG9zZSBzeXN0ZW1zLlxuICBDTElDSzogJ2NsaWNrJyxcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBlbHByb3RvID0gd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZTtcbmNvbnN0IEhJRERFTiA9ICdoaWRkZW4nO1xuXG5pZiAoIShISURERU4gaW4gZWxwcm90bykpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVscHJvdG8sIEhJRERFTiwge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKEhJRERFTik7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKEhJRERFTiwgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoSElEREVOKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vIHBvbHlmaWxscyBIVE1MRWxlbWVudC5wcm90b3R5cGUuY2xhc3NMaXN0IGFuZCBET01Ub2tlbkxpc3RcbnJlcXVpcmUoJ2NsYXNzbGlzdC1wb2x5ZmlsbCcpO1xuLy8gcG9seWZpbGxzIEhUTUxFbGVtZW50LnByb3RvdHlwZS5oaWRkZW5cbnJlcXVpcmUoJy4vZWxlbWVudC1oaWRkZW4nKTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGRvbXJlYWR5ID0gcmVxdWlyZSgnZG9tcmVhZHknKTtcblxuLyoqXG4gKiBUaGUgJ3BvbHlmaWxscycgZGVmaW5lIGtleSBFQ01BU2NyaXB0IDUgbWV0aG9kcyB0aGF0IG1heSBiZSBtaXNzaW5nIGZyb21cbiAqIG9sZGVyIGJyb3dzZXJzLCBzbyBtdXN0IGJlIGxvYWRlZCBmaXJzdC5cbiAqL1xucmVxdWlyZSgnLi9wb2x5ZmlsbHMnKTtcblxuY29uc3QgdXN3ZHMgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xuXG5jb25zdCBjb21wb25lbnRzID0gcmVxdWlyZSgnLi9jb21wb25lbnRzJyk7XG51c3dkcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcblxuZG9tcmVhZHkoKCkgPT4ge1xuICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5ib2R5O1xuICBmb3IgKGxldCBuYW1lIGluIGNvbXBvbmVudHMpIHtcbiAgICBjb25zdCBiZWhhdmlvciA9IGNvbXBvbmVudHNbIG5hbWUgXTtcbiAgICBiZWhhdmlvci5vbih0YXJnZXQpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB1c3dkcztcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbmNvbnN0IGZvckVhY2ggPSByZXF1aXJlKCdhcnJheS1mb3JlYWNoJyk7XG5jb25zdCBCZWhhdmlvciA9IHJlcXVpcmUoJ3JlY2VwdG9yL2JlaGF2aW9yJyk7XG5cbmNvbnN0IHNlcXVlbmNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZXEgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuICAgIGZvckVhY2goc2VxLCBtZXRob2QgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzWyBtZXRob2QgXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzWyBtZXRob2QgXS5jYWxsKHRoaXMsIHRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuXG4vKipcbiAqIEBuYW1lIGJlaGF2aW9yXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnRzXG4gKiBAcGFyYW0ge29iamVjdD99IHByb3BzXG4gKiBAcmV0dXJuIHtyZWNlcHRvci5iZWhhdmlvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSAoZXZlbnRzLCBwcm9wcykgPT4ge1xuICByZXR1cm4gQmVoYXZpb3IoZXZlbnRzLCBhc3NpZ24oe1xuICAgIG9uOiAgIHNlcXVlbmNlKCdpbml0JywgJ2FkZCcpLFxuICAgIG9mZjogIHNlcXVlbmNlKCd0ZWFyZG93bicsICdyZW1vdmUnKSxcbiAgfSwgcHJvcHMpKTtcbn07XG4iLCIvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzU1NzQzM1xuZnVuY3Rpb24gaXNFbGVtZW50SW5WaWV3cG9ydCAoZWwsIHdpbj13aW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NFbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gKFxuICAgIHJlY3QudG9wID49IDAgJiZcbiAgICByZWN0LmxlZnQgPj0gMCAmJlxuICAgIHJlY3QuYm90dG9tIDw9ICh3aW4uaW5uZXJIZWlnaHQgfHwgZG9jRWwuY2xpZW50SGVpZ2h0KSAmJlxuICAgIHJlY3QucmlnaHQgPD0gKHdpbi5pbm5lcldpZHRoIHx8IGRvY0VsLmNsaWVudFdpZHRoKVxuICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRWxlbWVudEluVmlld3BvcnQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQG5hbWUgaXNFbGVtZW50XG4gKiBAZGVzYyByZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhIERPTSBlbGVtZW50LlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBpc0VsZW1lbnQgPSB2YWx1ZSA9PiB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLm5vZGVUeXBlID09PSAxO1xufTtcblxuLyoqXG4gKiBAbmFtZSBzZWxlY3RcbiAqIEBkZXNjIHNlbGVjdHMgZWxlbWVudHMgZnJvbSB0aGUgRE9NIGJ5IGNsYXNzIHNlbGVjdG9yIG9yIElEIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHRyYXZlcnNlIHRoZSBET00gd2l0aC5cbiAqIEBwYXJhbSB7RG9jdW1lbnR8SFRNTEVsZW1lbnQ/fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgdG8gdHJhdmVyc2UgdGhlIERPTVxuICogICBpbi4gSWYgbm90IHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudFtdfSAtIEFuIGFycmF5IG9mIERPTSBub2RlcyBvciBhbiBlbXB0eSBhcnJheS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZWxlY3QgKHNlbGVjdG9yLCBjb250ZXh0KSB7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoIWNvbnRleHQgfHwgIWlzRWxlbWVudChjb250ZXh0KSkge1xuICAgIGNvbnRleHQgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gIH1cblxuICBjb25zdCBzZWxlY3Rpb24gPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc2VsZWN0aW9uKTtcbn07XG4iLCIvKipcbiAqIEZsaXBzIGdpdmVuIElOUFVUIGVsZW1lbnRzIGJldHdlZW4gbWFza2VkIChoaWRpbmcgdGhlIGZpZWxkIHZhbHVlKSBhbmQgdW5tYXNrZWRcbiAqIEBwYXJhbSB7QXJyYXkuSFRNTEVsZW1lbnR9IGZpZWxkcyAtIEFuIGFycmF5IG9mIElOUFVUIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG1hc2sgLSBXaGV0aGVyIHRoZSBtYXNrIHNob3VsZCBiZSBhcHBsaWVkLCBoaWRpbmcgdGhlIGZpZWxkIHZhbHVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZpZWxkLCBtYXNrKSA9PiB7XG4gIGZpZWxkLnNldEF0dHJpYnV0ZSgnYXV0b2NhcGl0YWxpemUnLCAnb2ZmJyk7XG4gIGZpZWxkLnNldEF0dHJpYnV0ZSgnYXV0b2NvcnJlY3QnLCAnb2ZmJyk7XG4gIGZpZWxkLnNldEF0dHJpYnV0ZSgndHlwZScsIG1hc2sgPyAncGFzc3dvcmQnIDogJ3RleHQnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBmb3JFYWNoID0gcmVxdWlyZSgnYXJyYXktZm9yZWFjaCcpO1xuY29uc3QgcmVzb2x2ZUlkUmVmcyA9IHJlcXVpcmUoJ3Jlc29sdmUtaWQtcmVmcycpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZSgnLi9zZWxlY3QnKTtcbmNvbnN0IHRvZ2dsZUZpZWxkTWFzayA9IHJlcXVpcmUoJy4vdG9nZ2xlLWZpZWxkLW1hc2snKTtcblxuY29uc3QgQ09OVFJPTFMgPSAnYXJpYS1jb250cm9scyc7XG5jb25zdCBQUkVTU0VEID0gJ2FyaWEtcHJlc3NlZCc7XG5jb25zdCBTSE9XX0FUVFIgPSAnZGF0YS1zaG93LXRleHQnO1xuY29uc3QgSElERV9BVFRSID0gJ2RhdGEtaGlkZS10ZXh0JztcblxuLyoqXG4gKiBSZXBsYWNlIHRoZSB3b3JkIFwiU2hvd1wiIChvciBcInNob3dcIikgd2l0aCBcIkhpZGVcIiAob3IgXCJoaWRlXCIpIGluIGEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHNob3dUZXh0XG4gKiBAcmV0dXJuIHtzdHJvbmd9IGhpZGVUZXh0XG4gKi9cbmNvbnN0IGdldEhpZGVUZXh0ID0gc2hvd1RleHQgPT4ge1xuICByZXR1cm4gc2hvd1RleHQucmVwbGFjZSgvXFxiU2hvd1xcYi9pLCBzaG93ID0+IHtcbiAgICByZXR1cm4gKCdTJyA9PT0gc2hvd1sgMCBdID8gJ0gnIDogJ2gnKSArICdpZGUnO1xuICB9KTtcbn07XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgZGVjb3JhdGVzIGFuIEhUTUwgZWxlbWVudCB3aXRoIHRoZSBhYmlsaXR5IHRvIHRvZ2dsZSB0aGVcbiAqIG1hc2tlZCBzdGF0ZSBvZiBhbiBpbnB1dCBmaWVsZCAobGlrZSBhIHBhc3N3b3JkKSB3aGVuIGNsaWNrZWQuXG4gKiBUaGUgaWRzIG9mIHRoZSBmaWVsZHMgdG8gYmUgbWFza2VkIHdpbGwgYmUgcHVsbGVkIGRpcmVjdGx5IGZyb20gdGhlIGJ1dHRvbidzXG4gKiBgYXJpYS1jb250cm9sc2AgYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBQYXJlbnQgZWxlbWVudCBjb250YWluaW5nIHRoZSBmaWVsZHMgdG8gYmUgbWFza2VkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGVsID0+IHtcbiAgLy8gdGhpcyBpcyB0aGUgKnRhcmdldCogc3RhdGU6XG4gIC8vICogaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBhdHRyIGFuZCBpdCdzICE9PSBcInRydWVcIiwgcHJlc3NlZCBpcyB0cnVlXG4gIC8vICogb3RoZXJ3aXNlLCBwcmVzc2VkIGlzIGZhbHNlXG4gIGNvbnN0IHByZXNzZWQgPSBlbC5oYXNBdHRyaWJ1dGUoUFJFU1NFRClcbiAgICAmJiBlbC5nZXRBdHRyaWJ1dGUoUFJFU1NFRCkgIT09ICd0cnVlJztcblxuICBjb25zdCBmaWVsZHMgPSByZXNvbHZlSWRSZWZzKGVsLmdldEF0dHJpYnV0ZShDT05UUk9MUykpO1xuICBmb3JFYWNoKGZpZWxkcywgZmllbGQgPT4gdG9nZ2xlRmllbGRNYXNrKGZpZWxkLCBwcmVzc2VkKSk7XG5cbiAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUoU0hPV19BVFRSKSkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShTSE9XX0FUVFIsIGVsLnRleHRDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IHNob3dUZXh0ID0gZWwuZ2V0QXR0cmlidXRlKFNIT1dfQVRUUik7XG4gIGNvbnN0IGhpZGVUZXh0ID0gZWwuZ2V0QXR0cmlidXRlKEhJREVfQVRUUikgfHwgZ2V0SGlkZVRleHQoc2hvd1RleHQpO1xuXG4gIGVsLnRleHRDb250ZW50ID0gcHJlc3NlZCA/IHNob3dUZXh0IDogaGlkZVRleHQ7XG4gIGVsLnNldEF0dHJpYnV0ZShQUkVTU0VELCBwcmVzc2VkKTtcbiAgcmV0dXJuIHByZXNzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgRVhQQU5ERUQgPSAnYXJpYS1leHBhbmRlZCc7XG5jb25zdCBDT05UUk9MUyA9ICdhcmlhLWNvbnRyb2xzJztcbmNvbnN0IEhJRERFTiA9ICdhcmlhLWhpZGRlbic7XG5cbm1vZHVsZS5leHBvcnRzID0gKGJ1dHRvbiwgZXhwYW5kZWQpID0+IHtcblxuICBpZiAodHlwZW9mIGV4cGFuZGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICBleHBhbmRlZCA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoRVhQQU5ERUQpID09PSAnZmFsc2UnO1xuICB9XG4gIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoRVhQQU5ERUQsIGV4cGFuZGVkKTtcblxuICBjb25zdCBpZCA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoQ09OVFJPTFMpO1xuICBjb25zdCBjb250cm9scyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgaWYgKCFjb250cm9scykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdObyB0b2dnbGUgdGFyZ2V0IGZvdW5kIHdpdGggaWQ6IFwiJyArIGlkICsgJ1wiJ1xuICAgICk7XG4gIH1cblxuICBjb250cm9scy5zZXRBdHRyaWJ1dGUoSElEREVOLCAhZXhwYW5kZWQpO1xuICByZXR1cm4gZXhwYW5kZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgZGF0YXNldCA9IHJlcXVpcmUoJ2VsZW0tZGF0YXNldCcpO1xuXG5jb25zdCBQUkVGSVggPSByZXF1aXJlKCcuLi9jb25maWcnKS5wcmVmaXg7XG5jb25zdCBDSEVDS0VEID0gJ2FyaWEtY2hlY2tlZCc7XG5jb25zdCBDSEVDS0VEX0NMQVNTID0gYCR7UFJFRklYfS1jaGVja2xpc3QtY2hlY2tlZGA7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGUgKGVsKSB7XG4gIGNvbnN0IGRhdGEgPSBkYXRhc2V0KGVsKTtcbiAgY29uc3QgaWQgPSBkYXRhLnZhbGlkYXRpb25FbGVtZW50O1xuICBjb25zdCBjaGVja0xpc3QgPSBpZC5jaGFyQXQoMCkgPT09ICcjJ1xuICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZClcbiAgICA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcblxuICBpZiAoIWNoZWNrTGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyB2YWxpZGF0aW9uIGVsZW1lbnQgZm91bmQgd2l0aCBpZDogXCIke2lkfVwiYFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKCd2YWxpZGF0ZScpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JOYW1lID0ga2V5LnN1YnN0cigndmFsaWRhdGUnLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRvclBhdHRlcm4gPSBuZXcgUmVnRXhwKGRhdGFbIGtleSBdKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRvclNlbGVjdG9yID0gYFtkYXRhLXZhbGlkYXRvcj1cIiR7dmFsaWRhdG9yTmFtZX1cIl1gO1xuICAgICAgY29uc3QgdmFsaWRhdG9yQ2hlY2tib3ggPSBjaGVja0xpc3QucXVlcnlTZWxlY3Rvcih2YWxpZGF0b3JTZWxlY3Rvcik7XG4gICAgICBpZiAoIXZhbGlkYXRvckNoZWNrYm94KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gdmFsaWRhdG9yIGNoZWNrYm94IGZvdW5kIGZvcjogXCIke3ZhbGlkYXRvck5hbWV9XCJgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB2YWxpZGF0b3JQYXR0ZXJuLnRlc3QoZWwudmFsdWUpO1xuICAgICAgdmFsaWRhdG9yQ2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZShDSEVDS0VEX0NMQVNTLCBjaGVja2VkKTtcbiAgICAgIHZhbGlkYXRvckNoZWNrYm94LnNldEF0dHJpYnV0ZShDSEVDS0VELCBjaGVja2VkKTtcbiAgICB9XG4gIH1cbn07XG4iXX0= diff --git a/js/decanter.min.js b/js/decanter.min.js new file mode 100644 index 000000000..04578c307 --- /dev/null +++ b/js/decanter.min.js @@ -0,0 +1,2 @@ +!function t(e,n,r){function o(u,c){if(!n[u]){if(!e[u]){var s="function"==typeof require&&require;if(!c&&s)return s(u,!0);if(i)return i(u,!0);var a=new Error("Cannot find module '"+u+"'");throw a.code="MODULE_NOT_FOUND",a}var f=n[u]={exports:{}};e[u][0].call(f.exports,function(t){var n=e[u][1][t];return o(n?n:t)},f,f.exports,t,e,n,r)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u=e||n<0||A&&r>=y}function f(){var t=E();return a(t)?l(t):void(m=setTimeout(f,c(t)))}function l(t){return m=void 0,L&&b?o(t):(b=h=void 0,g)}function d(){void 0!==m&&clearTimeout(m),S=0,b=w=h=m=void 0}function p(){return void 0===m?g:l(E())}function v(){var t=E(),n=a(t);if(b=arguments,h=this,w=t,n){if(void 0===m)return i(w);if(A)return m=setTimeout(f,e),o(w)}return void 0===m&&(m=setTimeout(f,e)),g}var b,h,y,g,m,w,S=0,O=!1,A=!1,L=!0;if("function"!=typeof t)throw new TypeError(s);return e=u(e)||0,r(n)&&(O=!!n.leading,A="maxWait"in n,y=A?x(u(n.maxWait)||0,e):y,L="trailing"in n?!!n.trailing:L),v.cancel=d,v.flush=p,v}function r(t){var e="undefined"==typeof t?"undefined":c(t);return!!t&&("object"==e||"function"==e)}function o(t){return!!t&&"object"==("undefined"==typeof t?"undefined":c(t))}function i(t){return"symbol"==("undefined"==typeof t?"undefined":c(t))||o(t)&&w.call(t)==f}function u(t){if("number"==typeof t)return t;if(i(t))return a;if(r(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=r(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(l,"");var n=p.test(t);return n||v.test(t)?b(t.slice(2),n?2:8):d.test(t)?a:+t}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s="Expected a function",a=NaN,f="[object Symbol]",l=/^\s+|\s+$/g,d=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,v=/^0o[0-7]+$/i,b=parseInt,h="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,g=h||y||Function("return this")(),m=Object.prototype,w=m.toString,x=Math.max,j=Math.min,E=function(){return g.Date.now()};e.exports=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],8:[function(t,e,n){"use strict";function r(t){if(null===t||void 0===t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function o(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;var r=Object.getOwnPropertyNames(e).map(function(t){return e[t]});if("0123456789"!==r.join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(t){o[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(i){return!1}}var i=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable;e.exports=o()?Object.assign:function(t,e){for(var n,o,s=r(t),a=1;a-1?t.split(s).map(function(t){return o({type:t},d)}):(d.type=t,[d])},f=function(t,e){var n=t[e];return delete t[e],n};e.exports=function(t,e){var n=Object.keys(t).reduce(function(e,n){var r=a(n,t[n]);return e.concat(r)},[]);return o({add:function(t){n.forEach(function(e){t.addEventListener(e.type,e.delegate,e.options)})},remove:function(t){n.forEach(function(e){t.removeEventListener(e.type,e.delegate,e.options)})}},e)}},{"../delegate":11,"../delegateAll":12,"object-assign":8}],10:[function(t,e,n){"use strict";e.exports=function(t){return function(e){return t.some(function(t){return t.call(this,e)===!1},this)}}},{}],11:[function(t,e,n){"use strict";t("element-closest"),e.exports=function(t,e){return function(n){var r=n.target.closest(t);if(r)return e.call(r,n)}}},{"element-closest":6}],12:[function(t,e,n){"use strict";var r=t("../delegate"),o=t("../compose"),i="*";e.exports=function(t){var e=Object.keys(t);if(1===e.length&&e[0]===i)return t[i];var n=e.reduce(function(e,n){return e.push(r(n,t[n])),e},[]);return o(n)}},{"../compose":10,"../delegate":11}],13:[function(t,e,n){"use strict";e.exports=function(t,e){return function(n){if(t!==n.target&&!t.contains(n.target))return e.call(this,n)}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t,e){var n=function(r){return r.currentTarget.removeEventListener(r.type,n,e),t.call(this,r)};return n}},{}],15:[function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=/(^\s+)|(\s+$)/g,i=/\s+/,u=String.prototype.trim?function(t){return t.trim()}:function(t){return t.replace(o,"")},c=function(t){return this.querySelector('[id="'+t.replace(/"/g,'\\"')+'"]')};e.exports=function(t,e){if("string"!=typeof t)throw new Error("Expected a string but got "+("undefined"==typeof t?"undefined":r(t)));e||(e=window.document);var n=e.getElementById?e.getElementById.bind(e):c.bind(e);return t=u(t).split(i),1===t.length&&""===t[0]?[]:t.map(function(t){var e=n(t);if(!e)throw new Error('no element with id: "'+t+'"');return e})}},{}],16:[function(t,e,n){"use strict";function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var o=t("../utils/behavior"),i=t("array-filter"),u=t("array-foreach"),c=t("../utils/toggle"),s=t("../utils/is-in-viewport"),a=t("../events").CLICK,f=t("../config").prefix,l="."+f+"-accordion, ."+f+"-accordion-bordered",d="."+f+"-accordion-button[aria-controls]",p="aria-expanded",v="aria-multiselectable",b=function(t,e){var n=t.closest(l);if(!n)throw new Error(d+" is missing outer "+l);e=c(t,e);var r="true"===n.getAttribute(v);e&&!r&&u(g(n),function(e){e!==t&&c(e,!1)})},h=function(t){return b(t,!0)},y=function(t){return b(t,!1)},g=function(t){return i(t.querySelectorAll(d),function(e){return e.closest(l)===t})},m=o(r({},a,r({},d,function(t){t.preventDefault(),b(this),"true"===this.getAttribute(p)&&(s(this)||this.scrollIntoView())})),{init:function(t){u(t.querySelectorAll(d),function(t){var e="true"===t.getAttribute(p);b(t,e)})},ACCORDION:l,BUTTON:d,show:h,hide:y,toggle:b,getButtons:g}),w=function(t){this.root=t,m.on(this.root)},x=t("object-assign");x(w,m),w.prototype.show=h,w.prototype.hide=y,w.prototype.remove=function(){m.off(this.root)},e.exports=w},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/is-in-viewport":31,"../utils/toggle":35,"array-filter":1,"array-foreach":2,"object-assign":8}],17:[function(t,e,n){"use strict";function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var o=t("../utils/behavior"),i=(t("../utils/toggle"),t("../events").CLICK),u=t("../config").prefix,c="."+u+"-banner-header",s=u+"-banner-header-expanded",a=function(t){return t.preventDefault(),this.closest(c).classList.toggle(s),!1};e.exports=o(r({},i,r({},c+" [aria-controls]",a)))},{"../config":25,"../events":26,"../utils/behavior":30,"../utils/toggle":35}],18:[function(t,e,n){"use strict";function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var o=(t("./accordion"),t("../utils/behavior")),i=t("lodash.debounce"),u=t("array-foreach"),c=t("../utils/select"),s=t("../events").CLICK,a=t("../config").prefix,f="hidden",l="."+a+"-footer-big",d=l+" nav",p=d+" ."+a+"-footer-primary-link",v=d+" ul",b=600,h=180,y=function(){var t=this.closest(v);t.classList.remove(f);var e=t.closest(d).querySelectorAll("ul");u(e,function(e){e!==t&&e.classList.add(f)})},g=i(function(){var t=window.innerWidth1&&void 0!==arguments[1]?arguments[1]:window,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:document.documentElement,r=t.getBoundingClientRect();return r.top>=0&&r.left>=0&&r.bottom<=(e.innerHeight||n.clientHeight)&&r.right<=(e.innerWidth||n.clientWidth)}e.exports=r},{}],32:[function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(t){return t&&"object"===("undefined"==typeof t?"undefined":r(t))&&1===t.nodeType};e.exports=function(t,e){if("string"!=typeof t)return[];e&&o(e)||(e=window.document);var n=e.querySelectorAll(t);return Array.prototype.slice.call(n)}},{}],33:[function(t,e,n){"use strict";e.exports=function(t,e){t.setAttribute("autocapitalize","off"),t.setAttribute("autocorrect","off"),t.setAttribute("type",e?"password":"text")}},{}],34:[function(t,e,n){"use strict";var r=t("array-foreach"),o=t("resolve-id-refs"),i=(t("./select"),t("./toggle-field-mask")),u="aria-controls",c="aria-pressed",s="data-show-text",a="data-hide-text",f=function(t){return t.replace(/\bShow\b/i,function(t){return("S"===t[0]?"H":"h")+"ide"})};e.exports=function(t){var e=t.hasAttribute(c)&&"true"!==t.getAttribute(c),n=o(t.getAttribute(u));r(n,function(t){return i(t,e)}),t.hasAttribute(s)||t.setAttribute(s,t.textContent);var l=t.getAttribute(s),d=t.getAttribute(a)||f(l);return t.textContent=e?l:d,t.setAttribute(c,e),e}},{"./select":32,"./toggle-field-mask":33,"array-foreach":2,"resolve-id-refs":15}],35:[function(t,e,n){"use strict";var r="aria-expanded",o="aria-controls",i="aria-hidden";e.exports=function(t,e){"boolean"!=typeof e&&(e="false"===t.getAttribute(r)),t.setAttribute(r,e);var n=t.getAttribute(o),u=document.getElementById(n);if(!u)throw new Error('No toggle target found with id: "'+n+'"');return u.setAttribute(i,!e),e}},{}],36:[function(t,e,n){"use strict";var r=t("elem-dataset"),o=t("../config").prefix,i="aria-checked",u=o+"-checklist-checked";e.exports=function(t){var e=r(t),n=e.validationElement,o="#"===n.charAt(0)?document.querySelector(n):document.getElementById(n);if(!o)throw new Error('No validation element found with id: "'+n+'"');for(var c in e)if(c.startsWith("validate")){var s=c.substr("validate".length).toLowerCase(),a=new RegExp(e[c]),f='[data-validator="'+s+'"]',l=o.querySelector(f);if(!l)throw new Error('No validator checkbox found for: "'+s+'"');var d=a.test(t.value);l.classList.toggle(u,d),l.setAttribute(i,d)}}},{"../config":25,"elem-dataset":5}]},{},[29]); +//# sourceMappingURL=uswds.min.js.map diff --git a/package.json b/package.json index 2ef428b8d..209e640fc 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,25 @@ { "name": "decanter", - "description": "A collection of SCSS patterns for theme development.", - "version": "0.2.0-dev", - "homepage": "https://github.com/su-sws/decanter", + "description": "Collection of SASS and CSS patterns to include in any project.", + "author": "", + "version": "1.0.0", + "homepage": "https://github.com/SU-SWS/decanter/blob/v2.0/README.md", "license": "MIT", "keywords": [ "css", - "mixins", - "sass", "scss" ], "repository": { "type": "git", - "url": "git+https://github.com/su-sws/decanter.git" + "url": "git+https://github.com/SU-SWS/decanter.git" }, "bugs": { - "url": "https://github.com/su-sws/decanter/issues" - }, - "dependencies": { - "bourbon": "^5.0.0-beta.7", - "bourbon-neat": "^2.0.0", - "neat-omega": "^3.0.0", - "font-awesome": "~4.7.0", - "normalize.css": "^6.0.0" + "url": "https://github.com/SU-SWS/decanter.git/issues" }, "devDependencies": { "grunt": "^1.0.1", - "grunt-available-tasks": "^0.6.3", + "grunt-contrib-sass": "^1.0.0", "grunt-contrib-watch": "^1.0.0", - "grunt-sass": "^2.0.0", - "grunt-sass-lint": "^0.2.2" - }, - "optionalDependencies": {} + "grunt-sass": "^2.0.0" + } } diff --git a/scss/_all.scss b/scss/_all.scss new file mode 100644 index 000000000..1cdec6900 --- /dev/null +++ b/scss/_all.scss @@ -0,0 +1 @@ +@import 'decanter'; diff --git a/scss/components/_accordions.scss b/scss/components/_accordions.scss new file mode 100644 index 000000000..0e3bd6351 --- /dev/null +++ b/scss/components/_accordions.scss @@ -0,0 +1,150 @@ +// Variables + +$accordion-border: 3px solid $color-gray-lightest; + +// Accordion Styles + +@mixin accordion-list-styles { + @include unstyled-list; + color: $color-base; + margin: 0; + padding: 0; + width: 100%; +} + +@mixin accordion-list-item-styles { + background-color: $color-gray-lightest; + font-family: $font-sans; + list-style: none; + margin-bottom: 6px; + width: 100%; +} + +// scss-lint:disable PropertyCount +@mixin accordion-button-styles { + @include button-unstyled; + background-color: $color-gray-lightest; + background-image: url('#{$image-path}/minus.png'); + background-image: url('#{$image-path}/minus.svg'); + background-position: right 3rem center; + background-repeat: no-repeat; + background-size: 13px; + color: $color-base; + cursor: pointer; + display: inline-block; + font-family: $font-sans; + font-weight: $font-bold; + margin: 0; + padding: 1.5rem 5.5rem 1.5rem 3rem; + width: 100%; + + &:focus { + box-shadow: $focus-shadow; + } + + &:hover { + background-color: $color-gray-lighter; + color: $color-base; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 0; + } +} +// scss-lint:enable PropertyCount + +@mixin accordion-button-unopened-styles { + background-image: url('#{$image-path}/plus.png'); + background-image: url('#{$image-path}/plus.svg'); + background-repeat: no-repeat; + background-size: 1.3rem; +} + +@mixin accordion-nested-list { + > ul li ul { + list-style: disc; + > li > ul { + list-style: circle; + > li > ul { + list-style: square; + } + } + } +} + +.usa-accordion, +.usa-accordion-bordered { + @include accordion-list-styles; + @include accordion-nested-list; + + + .usa-accordion, + + .usa-accordion-bordered { + margin-top: 1rem; + } + + // TODO deprecated ruleset based on old accordion. + > ul { + @include accordion-list-styles; + + // TODO deprecated ruleset based on old accordion. + > li { + @include accordion-list-item-styles; + } + + // TODO deprecated ruleset based on old accordion. + button { + @include accordion-button-styles; + } + + // TODO deprecated ruleset based on old accordion. + [aria-expanded=false] { + @include accordion-button-unopened-styles; + } + } + + > li { + @include accordion-list-item-styles; + } + +} + +.usa-accordion-bordered { + .usa-accordion-content { + border-bottom: $accordion-border; + border-left: $accordion-border; + border-right: $accordion-border; + } +} + +.usa-accordion-content { + background-color: $color-white; + overflow: auto; + padding: 3rem; + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } + + &:not([aria-hidden]) { + @include sr-only(); + } + + @include accessibly-hidden(); +} + +.usa-accordion-button { + @include accordion-button-styles; +} + +.usa-accordion-button[aria-expanded=false] { + @include accordion-button-unopened-styles; +} diff --git a/scss/components/_alerts.scss b/scss/components/_alerts.scss new file mode 100644 index 000000000..60ed70749 --- /dev/null +++ b/scss/components/_alerts.scss @@ -0,0 +1,94 @@ +// Alert variables ---------- // +$usa-custom-alerts: () !default; + +$usa-alerts: ( + success: $color-green-lightest, + warning: $color-gold-lightest, + error: $color-secondary-lightest, + info: $color-primary-alt-lightest +); + +$alerts: map-merge($usa-alerts, $usa-custom-alerts); + +.usa-alert { + background-color: $color-gray-lightest; + background-position: 1rem 2rem; + background-repeat: no-repeat; + background-size: 4rem; + margin-top: 1.5em; + padding: 1em; + + @include media($medium-screen) { + background-size: 5.2rem; + } + + a { + color: $color-primary-darker; + + &:focus, + &:hover { + color: $color-primary-darkest; + } + } + + ul { + margin-bottom: 0; + margin-top: 1em; + padding-left: 1em; + } +} + +.usa-alert-icon { + display: table-cell; + padding-right: 1rem; +} + +.usa-alert-body { + display: table-cell; + padding-left: 3.5rem; + vertical-align: top; + + @include media($medium-screen) { + padding-left: 5rem; + } + + p:first-child { + margin-top: 0.8rem; + } + + p:last-child { + margin-bottom: 0.8rem; + } +} + +.usa-alert-heading { + margin-bottom: .3rem; + margin-top: 0; + + @include media($medium-screen) { + margin-top: .3rem; + } +} + +.usa-alert-text { + font-family: $font-sans; + margin-bottom: 0; + margin-top: 0; +} + +@each $name, $bgcolor in $alerts { + .usa-alert-#{$name} { + background-color: $bgcolor; + background-image: url('#{$image-path}/alerts/#{$name}.png'); + background-image: url('#{$image-path}/alerts/#{$name}.svg'); + } +} + +.usa-alert-no_icon { + background-image: none; +} + +.usa-alert-paragraph { + width: $text-max-width; + padding: 1em 3em 1em 1em; +} diff --git a/scss/components/_banner.scss b/scss/components/_banner.scss new file mode 100644 index 000000000..1b45ce34f --- /dev/null +++ b/scss/components/_banner.scss @@ -0,0 +1,204 @@ +.usa-banner { + background-color: $color-gray-lightest; + padding-bottom: 0.7rem; + + @include media($small-screen) { + font-size: $h6-font-size; + padding-bottom: 0; + } +} + +.usa-banner-content { + @include padding(null $site-margins-mobile 3px $site-margins-mobile); + background-color: transparent; + font-size: $h5-font-size; + padding-top: 2rem; + width: 100%; + + @include media($medium-screen) { + padding-bottom: 2.3rem; + padding-top: 4rem; + } + + @include media($nav-width) { + @include padding(null $site-margins); + } + + p { + &:first-child { + margin-top: 1rem; + + @include media($medium-screen) { + margin-top: 0; + } + } + } +} + +.usa-banner-inner { + @include outer-container(); + @include padding(null $site-margins-mobile); + max-width: $site-max-width; + + @include media($nav-width) { + @include padding(null $site-margins); + } +} + +.usa-banner-header { + @include padding(0.55rem null); + font-size: 1.2rem; + font-weight: $font-normal; + + @include media($small-screen) { + @include padding(0 null); + } + + p { + @include margin(0 null); + display: inline; + overflow: hidden; + vertical-align: middle; + + @include media($small-screen) { + @include margin(2px null); + display: inline-block; + } + } + + img { + float: left; + margin-right: 1rem; + margin-top: 1px; + width: 2.4rem; + + @include media($small-screen) { + margin-right: 0.7rem; + width: 2rem; + } + } +} + +.usa-banner-header-expanded { + align-items: center; + border-bottom: 1px solid $color-gray-light; + display: flex; + font-size: $h5-font-size; + min-height: 5.6rem; + padding-right: 3rem; + + @include media($small-screen) { + border-bottom: none; + display: block; + font-size: 1.2rem; + font-weight: $font-normal; + min-height: 0; + padding-right: 0; + } + + > .usa-banner-inner { + margin-left: 0; + + @include media($small-screen) { + margin-left: auto; + } + } + + img { + margin-right: 2.4rem; + + @include media($small-screen) { + margin-right: 0.7rem; + } + } + + p { + line-height: $heading-line-height; + vertical-align: top; + + @include media($small-screen) { + line-height: $base-line-height; + vertical-align: middle; + } + } +} + +.usa-banner-button { + @include button-unstyled; + @include padding(1.3rem null null 4.8rem); + background-position-x: right; + color: $color-primary; + display: block; + font-size: 1.2rem; + height: 4.3rem; + left: 0; + position: absolute; + text-decoration: underline; + top: 0; + width: 100%; + + @include media($small-screen) { + @include padding(0 null null 0); + /* stylelint-disable declaration-block-no-ignored-properties */ + display: inline; + height: initial; + margin-left: 3px; + position: relative; + vertical-align: middle; + width: initial; + /* stylelint-enable */ + } + + &:hover { + color: $color-primary-darker; + text-decoration: underline; + } + + &[aria-expanded=false] { + @include display-icon(angle-arrow-down-primary, after, 1rem, 0, hover); + background-image: none; + + &::after { + background-position-y: 1px; + } + } + + &[aria-expanded=true] { + @include display-icon(close, after, 1.3rem, 0, no-hover); + background-image: none; + height: 5.6rem; + + @include media($small-screen) { + @include display-icon(angle-arrow-up-primary, after, 1rem, 0, hover); + height: initial; + padding: 0; + position: relative; + + &::after { + background-position-y: 1px; + } + } + + &::after { + position: absolute; + right: 1.5rem; + top: 2.15rem; + + @include media($small-screen) { + position: static; + } + } + + .usa-banner-button-text { + display: none; + + @include media($small-screen) { + display: inline; + } + } + } +} + +.usa-banner-icon { + width: 3.8rem; +} diff --git a/scss/components/_footer.scss b/scss/components/_footer.scss new file mode 100644 index 000000000..441bd0b12 --- /dev/null +++ b/scss/components/_footer.scss @@ -0,0 +1,382 @@ +.usa-footer { + .usa-unstyled-list { + display: block; + } + + .usa-footer-primary-link { + color: $color-base; + display: block; + font-weight: $font-bold; + margin-top: 0; + padding-bottom: 2rem; + padding-top: 2rem; + text-decoration: none; + + @include media($medium-screen) { + border-top: none; + } + + &:hover { + text-decoration: underline; + } + } + + a { + font-weight: normal; + } +} + +.usa-footer-return-to-top { + padding-bottom: 2rem; + padding-top: 2rem; +} + +.usa-footer-primary-section { + background-color: $color-gray-lightest; + + .usa-footer-primary-content { + padding-left: 2.5rem; + padding-right: 2.5rem; + + @include media($medium-screen) { + padding-left: 0; + padding-right: 0; + } + + li { + margin-left: 1rem; + + @include media($medium-screen) { + margin-left: 0; + } + } + } + + .usa-grid-full { + @include media($medium-screen) { + padding-left: 2.5rem; + padding-right: 2.5rem; + } + } +} + +.usa-footer-medium { + .usa-footer-primary-section { + padding: 0; + + @include media($medium-screen) { + padding-bottom: 1rem; + padding-top: 1rem; + } + + .usa-footer-primary-content { + @include media($large-screen) { + margin-right: 6%; + width: inherit; + } + + &:last-child { + @include media($large-screen) { + margin-right: 0; + } + } + } + } + + .usa-footer-nav ul { + @include media($medium-screen) { + align-items: center; + } + } +} + +.usa-footer-slim { + .usa-footer-nav { + a { + display: block; + } + + .usa-footer-primary-content { + @include media($large-screen) { + margin-right: 9%; + width: inherit; + } + + &:last-child { + @include media($large-screen) { + margin-right: 0; + } + } + } + } + + .usa-footer-primary-section { + padding-bottom: 2rem; + + @include media($medium-screen) { + padding-bottom: 1rem; + padding-top: 1rem; + + .usa-grid-full { + align-items: center; + } + } + } + + .usa-footer-contact_info { + > * { + @include media($medium-screen) { + margin: 0; + } + } + + @include media($medium-screen) { + @include padding (2rem null); + } + + @include media($medium-screen) { + width: 100%; + } + + @include media($large-screen) { + @include span-columns(6); + } + } +} + +/* stylelint-disable selector-no-qualifying-type */ +ul.usa-footer-primary-content, +li.usa-footer-primary-content, +li.usa-footer-primary-content { + border-top: 1px solid $color-base; + + @include media($medium-screen) { + border: none; + } + + &:last-child { + border-bottom: 1px solid $color-base; + + @include media($medium-screen) { + border-bottom: none; + } + } +} +/* stylelint-enable */ + +.usa-sign_up-block { + padding-bottom: 2rem; + padding-left: 2.5rem; + padding-right: 2.5rem; + + @include media($medium-screen) { + float: right; + padding: 0; + } + + label:first-of-type { + margin-top: 0; + } + + button { + float: none; + margin-right: 0; + margin-top: 1.5rem; + } + + input { + width: 100%; + } +} + +.usa-footer-secondary_section { + background-color: $color-gray-lighter; + padding-bottom: 3rem; + padding-top: 3rem; + + a { + color: $color-base; + } +} + +.usa-footer-big-secondary-section { + @include media($medium-screen) { + padding-top: 5rem; + } +} + +.usa-footer-contact-links { + @include media($medium-screen) { + text-align: right; + } +} + +.usa-social-links { + a { + text-decoration: none; + } +} + +.usa-footer-big { + .usa-footer-primary-section { + @include media($medium-screen) { + padding-bottom: 4rem; + padding-top: 3rem; + } + } + + ul { + padding-bottom: 2.5rem; + + @include media($medium-screen) { + padding-bottom: 0; + } + + &:last-child { + border-bottom: 1px solid $color-base; + + @include media($medium-screen) { + border-bottom: none; + } + } + + li { + line-height: 2em; + } + + .usa-footer-primary-link { + background-image: url('#{$image-path}/arrow-down.png'); + background-image: url('#{$image-path}/arrow-down.svg'); + background-position: 1.5rem center; + background-repeat: no-repeat; + background-size: 1.3rem; + margin-left: 0; + padding-left: 3.5rem; + + @include media($medium-screen) { + background: none; + margin-bottom: .8rem; + padding-bottom: 0; + padding-left: 0; + } + + > * { + @include margin(0 null); + } + } + + &.hidden { /* stylelint-disable-line selector-no-qualifying-type */ + padding-bottom: 0; + + li { + display: none; + } + + .usa-footer-primary-link { /* stylelint-disable-line selector-no-qualifying-type */ + background-image: url('#{$image-path}/arrow-right.png'); + background-image: url('#{$image-path}/arrow-right.svg'); + cursor: pointer; + display: block; + + @include media($medium-screen) { + background: none; + padding-left: 0; + } + } + } + } +} + +.usa-footer-topic { + margin: 0; + padding: 2rem 0; +} + +.usa-sign_up-header { + @include media($medium-screen) { + margin: 0; + padding: 2rem 0; + } +} + +.usa-footer-logo-img { + max-width: 14rem; +} + +.usa-footer-slim-logo-img { + float: left; + max-width: 10rem; +} + +.usa-footer-logo-heading { + margin-top: 2rem; +} + +.usa-footer-contact-heading { + margin-top: 0; + + @include media($medium-screen) { + margin-top: 1rem; + } +} + +.usa-footer-slim-logo-heading { + display: block; + padding-top: 1rem; + + @include media($medium-screen) { + display: inline-block; + padding-left: 1em; + } +} + +.usa-social_link { + $background-height: 3rem; // Height of icon within hit area. + // Link hit target is 44 x 44 pixels following + // Apple iOS Human Interface Guidelines. + $hit-area: 4.4rem; + + @include margin(2.5rem 1rem 1.5rem 0); + background-position: center center; + background-repeat: no-repeat; + background-size: auto $background-height; + display: inline-block; + height: $hit-area; + left: -1.6rem; // relative left positioning + position: relative; + text-align: center; + width: $hit-area; + + @include media($medium-screen) { + @include margin(0 0 0 1rem); + left: 1.2rem; + } + + span { + @include sr-only(); + } +} + +.usa-link-facebook { + @extend .usa-social_link; + background-image: url('#{$image-path}/social-icons/png/facebook25.png'); + background-image: url('#{$image-path}/social-icons/svg/facebook25.svg'); +} + +.usa-link-twitter { + @extend .usa-social_link; + background-image: url('#{$image-path}/social-icons/png/twitter16.png'); + background-image: url('#{$image-path}/social-icons/svg/twitter16.svg'); +} + +.usa-link-youtube { + @extend .usa-social_link; + background-image: url('#{$image-path}/social-icons/png/youtube15.png'); + background-image: url('#{$image-path}/social-icons/svg/youtube15.svg'); +} + +.usa-link-rss { + @extend .usa-social_link; + background-image: url('#{$image-path}/social-icons/png/rss25.png'); + background-image: url('#{$image-path}/social-icons/svg/rss25.svg'); +} diff --git a/scss/components/_forms.scss b/scss/components/_forms.scss new file mode 100644 index 000000000..db2a55158 --- /dev/null +++ b/scss/components/_forms.scss @@ -0,0 +1,164 @@ +$usa-form-width: 32rem; + +form { + a { + border-bottom: 0; + } + + [type=submit], + [type=submit] { + display: block; + margin-bottom: 1.5em; + margin-top: 2.5rem; + + @include media($medium-screen) { + padding-left: 2.7em; + padding-right: 2.7em; + width: auto; + } + } + + [name=password], + [name=confirmPassword] { + margin-bottom: 1.1rem; + } +} + +.usa-form { + @include media($medium-screen) { + max-width: $usa-form-width; + } +} + +.usa-form-note { + float: right; + font-family: $font-sans; + font-size: $h5-font-size; + margin: 0 0 1.5rem; + + + * { + clear: both; + } +} + +fieldset { + border: none; + margin: 0; + padding: 0; +} + +.usa-form-large { + @include media($medium-screen) { + max-width: 46rem; + } +} + +input { + &.usa-input-tiny { /* stylelint-disable-line selector-no-qualifying-type */ + @include media($medium-screen) { + max-width: 6rem; + } + } + + &.usa-input-medium { /* stylelint-disable-line selector-no-qualifying-type */ + @include media($medium-screen) { + max-width: 12rem; + } + } +} + +.usa-input-grid { + @include media($medium-screen) { + padding-right: 5%; + } +} + +.usa-input-grid:last-of-type { + @include media($medium-screen) { + padding-right: 0; + } +} + +.usa-input-grid-small { + @include media($medium-screen) { + float: left; + width: 35%; + } + + input { + margin-bottom: 3rem; + } + + select { + margin-bottom: 3rem; + } +} + +.usa-input-grid-medium { + @include media($medium-screen) { + float: left; + width: 65%; + } + + input { + margin-bottom: 3rem; + } + + select { + margin-bottom: 3rem; + } +} + +.usa-input-grid-large { + @include media($medium-screen) { + float: left; + width: 100%; + } + + input { + margin-bottom: 3rem; + } + + select { + margin-bottom: 3rem; + } +} + +.usa-additional_text { + font-weight: normal; +} + +// Reset password checklist + +.usa-checklist { + list-style: none; + margin-left: 0; + padding-left: 0; + + li { + display: inline-block; + list-style: none; + margin-bottom: 0; + margin-top: 0; + padding-left: 3em; + text-indent: -2em; + + &::before { + content: ' '; + display: inline-block; + height: .8em; + margin-right: .2em; + width: 1.8em; + } + } +} + +.usa-checklist-checked { + &::before { + background-image: url('#{$image-path}/correct9.png'); + background-image: url('#{$image-path}/correct9.svg'); + background-position: 100%; + background-repeat: no-repeat; + background-size: 100%; + } +} diff --git a/scss/components/_graphic-list.scss b/scss/components/_graphic-list.scss new file mode 100644 index 000000000..2bc03ab9c --- /dev/null +++ b/scss/components/_graphic-list.scss @@ -0,0 +1,35 @@ +// A collection of media block objects + +.usa-graphic_list { + .usa-graphic_list-row { + .usa-media_block { + margin-bottom: $site-margins; + + @include media($medium-screen) { + margin-bottom: $site-margins * 2; + } + } + + &:last-child { + .usa-media_block { + @include media($medium-screen) { + margin-bottom: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + } + } + + .usa-media_block-img { + margin-right: $site-margins; + } + + .usa-media_block-body { + > :first-child { + margin-top: 0; + } + } +} diff --git a/scss/components/_header.scss b/scss/components/_header.scss new file mode 100644 index 000000000..cdc6a827a --- /dev/null +++ b/scss/components/_header.scss @@ -0,0 +1,221 @@ +// Header variables ---------- // + +$height-nav-secondary: 5rem; +$width-nav-sidebar: 250px; + +// z-indexes - TODO refactor to a site-wide z-index management approach +$z-index-header: 7000; +$z-index-overlay: 8000; +$z-index-nav: 9000; + +// Header ------------- // + +.usa-header { + width: 100%; + z-index: $z-index-header; + + @include media($nav-width) { + border-bottom: 1px solid $color-gray-light; + } + + a { + border-bottom: none; + } + + .usa-search { + margin-bottom: 1.5rem; + + @include media($nav-width) { + float: right; + margin-bottom: 0; + max-width: 21.5rem; + } + } +} + +.usa-logo { + float: left; + line-height: 4rem; + margin-left: 1.5rem; + + @include media($nav-width) { + line-height: 7.5rem; + margin-left: 0; + } + + a { + color: $color-base; + text-decoration: none; + } + + br { + display: none; + + @include media($nav-width) { + display: block; + } + } +} + +.usa-logo-text { + display: block; + font-size: $h5-font-size; + font-style: normal; + font-weight: $font-bold; + margin: 0; + + @include media($nav-width) { + display: block; + font-size: 2.4rem; + line-height: $heading-line-height; + } +} + +.usa-menu-btn { + /* stylelint-disable declaration-block-no-ignored-properties */ + @include button-unstyled; + background-color: $color-primary; + color: $color-white; + display: inline; + float: right; + font-size: $h6-font-size; + height: 4rem; + line-height: 4rem; + text-align: center; + text-decoration: none; + text-transform: uppercase; + width: 5.8rem; + /* stylelint-enable */ + + @include media($nav-width) { + display: none; + } + + &:hover { + color: $color-white; + background-color: $color-primary-darker; + } + + &:visited { + color: $color-white; + } +} + +.usa-overlay { + @include position(fixed, 0); + background: $color-black; + opacity: 0; + transition: all 0.2s ease-in-out; + visibility: hidden; + z-index: $z-index-overlay; + + &.is-visible { + opacity: 0.1; + visibility: visible; + } +} + +// Basic header ----------- // + +.usa-header-basic { + .usa-logo { + @include media($nav-width) { + bottom: 1.9rem; + position: absolute; + } + } + + .usa-navbar { + @include media($nav-width) { + position: relative; + width: 18%; // TODO: review this more + } + } +} + +// Extended header ----------- // + +.usa-header-extended { + .usa-header { + @include media($nav-width) { + border-bottom: none; + } + } + + .usa-logo { + @include media($nav-width) { + @include margin(3rem null); + } + } + + em { + @include media($nav-width) { + font-size: 3.2rem; + line-height: 1; + } + } + + .usa-navbar { + @include media($nav-width) { + @include outer-container(); + @include padding(null $site-margins); + display: block; + height: auto; + max-width: $site-max-width; + } + } + + .usa-nav { + @include media($nav-width) { + border-top: 1px solid $color-gray-light; + float: none; + padding: 0; + width: 100%; + } + } + + .usa-nav-inner { + @include media($nav-width) { + @include outer-container(); + @include padding(null $site-margins null 2rem); + margin-top: -1px; + max-width: $site-max-width; + position: relative; + } + } + + .usa-nav-primary { + @include media($nav-width) { + @include clearfix; + } + + button { + &[aria-expanded=false], + &[aria-expanded=true] { /* stylelint-disable-line selector-no-qualifying-type */ + @include media($nav-width) { /* stylelint-disable-line selector-no-qualifying-type */ + background-position: right 1.5rem top 50%; + } + } + } + } + + .usa-nav-link { + @include media($nav-width) { + padding-top: 1.9rem; + } + } + + .usa-nav-submenu { + .usa-grid-full { + @include media($nav-width) { + padding-left: 1.2rem; + } + } + } + + .usa-megamenu { + @include media($nav-width) { + padding-left: $site-margins; + } + } +} diff --git a/scss/components/_hero.scss b/scss/components/_hero.scss new file mode 100644 index 000000000..72c077d67 --- /dev/null +++ b/scss/components/_hero.scss @@ -0,0 +1,43 @@ +// Hero feature +// ========================== + +.usa-hero { + @include padding($site-margins null); + background-image: url('#{$image-path}/hero.png'); + background-position: center; + background-size: cover; + + .usa-button { + color: $color-white; + } +} + +.usa-section-dark { + .usa-hero-link { + color: $color-primary-alt; + } +} + +.usa-hero-callout { + background-color: $color-primary-darkest; + padding: 3rem; + + @include media($small-screen) { + max-width: 30rem; + } + + > *:first-child { + @include margin(0 null $site-margins null); + } + + .usa-button { + font-size: $small-font-size; + margin-top: 7rem; + width: 100%; + } +} + +.usa-hero-callout-alt { + color: $color-white; + display: block; +} diff --git a/scss/components/_layout.scss b/scss/components/_layout.scss new file mode 100644 index 000000000..817827df7 --- /dev/null +++ b/scss/components/_layout.scss @@ -0,0 +1,36 @@ +// Flexbox positioning to move sidenav below main content on small screens +.usa-layout-docs { + display: flex; + flex-direction: column; + + @include media($large-screen) { + display: inherit; + } + + .usa-grid { + > :first-child:not(.usa-width-*) { + margin-top: 0; + } + + > :last-child:not(.usa-width-*) { + margin-bottom: 0; + } + } +} + +.usa-layout-docs-sidenav { + order: 2; +} + +.usa-layout-docs-main_content { + margin-bottom: $site-margins; + order: 1; + + @include media($large-screen) { + margin-bottom: 0; + } + + > :first-child { + margin-top: 0; + } +} diff --git a/scss/components/_media-block.scss b/scss/components/_media-block.scss new file mode 100644 index 000000000..8e4c821c4 --- /dev/null +++ b/scss/components/_media-block.scss @@ -0,0 +1,12 @@ +@mixin media-block-img($margin-right: 1rem) { + float: left; + margin-right: $margin-right; +} + +.usa-media_block-img { + @include media-block-img; +} + +.usa-media_block-body { + overflow: hidden; +} diff --git a/scss/components/_navigation.scss b/scss/components/_navigation.scss new file mode 100644 index 000000000..e485ced25 --- /dev/null +++ b/scss/components/_navigation.scss @@ -0,0 +1,454 @@ +// Header navigation ------------- // + +@mixin nav-border { + border-bottom: 0.7rem solid $color-primary; + padding-bottom: 1rem; +} + +.usa-navbar { + border-bottom: 1px solid $color-gray-light; + height: 4rem; + + @include media($nav-width) { + border-bottom: none; + display: inline-block; + height: 10.3rem; // XXX magic number + } +} + +.usa-nav-link { + @include font-smoothing; + + &:hover { + span { + @include media($nav-width) { + @include nav-border; + } + } + } +} + +.usa-nav-container { + @include media($nav-width) { + @include outer-container(); + @include padding(null $site-margins); + max-width: $site-max-width; + } +} + +.usa-nav { + $sliding-panel-width: 26rem; + + @include position(fixed, 0 0 0 auto); + + background: $color-white; + border-left: 1px solid $color-gray-light; + border-right: 0; + display: flex; + flex-direction: column; + overflow-y: auto; + padding: 2rem; + transform: translateX($sliding-panel-width); + width: $sliding-panel-width; + z-index: $z-index-nav; + + @include media($nav-width) { + @include padding(5rem 0 0 null); + border-left: none; + display: block; + float: right; + overflow-y: visible; + position: relative; + transform: translateX(0); + width: auto; + } + + &.is-visible { + transform: translateX(0); + transition: all 0.3s ease-in-out; + } + + nav { + margin-top: 6rem; // XXX magic number + min-height: 100%; + + @include media($nav-width) { + margin-top: 0; + } + } + + .usa-current { + border-left: 4px solid $color-primary; + color: $color-primary; + font-weight: $font-bold; + padding-left: 1.4rem; + } + + .usa-button { + width: 100%; + } + + .usa-search { + @include media($nav-width) { + margin-left: 1.5rem; // XXX magic number + } + } +} + +// Primary navigation ------------- // + +.usa-nav-primary { + @include usa-sidenav-list; + order: 2; + + @include media($nav-width) { + display: inline; + } + + li { + @include media($nav-width) { + border-top: none; + } + } + + > li { + width: auto; + + @include media($nav-width) { + display: inline-block; + // margin-left: -4px; + } + + > a { + @include media($nav-width) { + @include padding(1.3rem 1.5rem 1.7rem 1.5rem); + color: $color-gray; + font-size: $h5-font-size; + font-weight: $font-bold; + line-height: 1.2; + } + + &:hover { + @include media($nav-width) { + background-color: transparent; + } + } + } + } + + button { + $button-vertical-offset: 44%; + + @include button-unstyled; + @include font-smoothing; + font-weight: $font-normal; + padding: 1.4rem 1.5rem 1rem 1.8rem; + + @include media($nav-width) { + @include padding(null 3rem 1.9rem 1.5rem); + color: $color-gray; + font-size: $h5-font-size; + font-weight: $font-bold; + width: initial; + } + + &:focus, + &:active { + box-shadow: $focus-shadow; + } + + &:hover { + background-color: $color-gray-lightest; + color: $color-primary; + + @include media($nav-width) { + background-color: transparent; + } + } + + &[aria-expanded=false] { /* stylelint-disable-line selector-no-qualifying-type */ + background-image: url('#{$image-path}/plus-alt.png'); + background-image: url('#{$image-path}/plus-alt.svg'); + background-repeat: no-repeat; + background-position: right 0 center; + background-size: 1rem; + + @include media($nav-width) { + background-image: url('#{$image-path}/angle-arrow-down.png'); + background-image: url('#{$image-path}/angle-arrow-down.svg'); + background-position: right 1.5rem top $button-vertical-offset; + } + } + + &[aria-expanded=true] { /* stylelint-disable-line selector-no-qualifying-type */ + background-image: url('#{$image-path}/minus-alt.png'); + background-image: url('#{$image-path}/minus-alt.svg'); + background-repeat: no-repeat; + background-position: right 0 center; + background-size: 1rem; + + @include media($nav-width) { + background-color: $color-primary-darkest; + color: $color-white; + background-image: url('#{$image-path}/angle-arrow-down-hover.png'); + background-image: url('#{$image-path}/angle-arrow-down-hover.svg'); + background-position: right 1.5rem top $button-vertical-offset; + + &:hover { + background-color: $color-primary-darkest; + } + + span { + @include nav-border; + } + } + } + } + + @include media($nav-width) { + a.usa-current { // stylelint-disable-line selector-no-qualifying-type + // undo the sidenav style + border-left: 0; + padding-left: 1.5rem; + + span { + @include nav-border; + } + } + } +} + +// Secondary navigation ----------- // + +.usa-nav-secondary { + @include media($nav-width) { + position: absolute; + right: $site-margins; + top: -5.7rem; // XXX magic number + } + + .usa-search { + @include margin(3rem null); + + @include media($nav-width) { + @include margin(-0.2rem null 0 0); + float: left; + } + } +} + +.usa-nav-secondary-links { + @include media($nav-width) { + float: left; + } + + li { + @include media($nav-width) { + display: inline; + padding-left: 1rem; + } + + &:not(:last-child)::after { + @include media($nav-width) { + content: '|'; + padding-left: 1rem; + } + } + } + + a, + .usa-header-search-button { + color: $color-gray; + display: inline-block; + font-size: $h5-font-size; + text-decoration: none; + + &:hover { + color: $color-primary; + } + } + + .usa-header-search-button { + @include button-unstyled; + display: none; + + @include media($nav-width) { + background-image: url('#{$image-path}/search-alt.png'); + background-image: url('#{$image-path}/search-alt.svg'); + background-repeat: no-repeat; + background-position: left center; + background-size: 2.2rem; + display: inline-block; + padding-left: 2.3rem; + } + + &.is-hidden { + @include media($nav-width) { + display: none; + } + } + } + + @include media($nav-width) { + a.usa-current { // stylelint-disable-line selector-no-qualifying-type + // undo the sidenav style + border-left: 0; + padding-left: 0; + } + } +} + +// Navigation submenu (dropdown and mega menu) ----- // + +.usa-nav-submenu { + // @include usa-sidenav-sublist; + + @include media($nav-width) { + @include unstyled-list; + @include padding(1.15rem null); + background-color: $color-primary-darkest; + min-width: 21.5rem; + width: auto; + position: absolute; + } + + &[aria-hidden=true] { + display: none; + } + + a { + @include media($nav-width) { + color: $color-white; + padding-left: 1.5rem; // XXX magic number + } + + &:hover { + @include media($nav-width) { + background-color: $color-primary-darkest; + color: $color-white; + text-decoration: underline; + } + } + + // this used to be necessary to undo the `usa-sidenav-sublist` + // include, above + // &:hover, + // &.usa-current { /* stylelint-disable-line selector-no-qualifying-type */ + // @include media($nav-width) { + // padding-left: 1.8rem; + // } + // } + } + + li { + font-size: $h5-font-size; + margin-bottom: 0; + } +} + +// Navigation close button -------- // + +.usa-nav-close { + @include button-unstyled; + @include margin(-1.2rem -1.5rem 2.4rem auto); + float: right; + height: $hit-area; + text-align: center; + width: $hit-area; + + @include media($nav-width) { + display: none; + } + + img { + width: 1.3rem; + } +} + +.usa-mobile_nav-active { + overflow: hidden; +} + +// Navigation mega menu -------- // + +@mixin outer-megamenu { + background-color: $color-primary-darkest; + content: ''; + display: block; + height: 100%; + position: absolute; + top: 0; + width: 1000%; +} + +.usa-megamenu { + @include media($nav-width) { + @include padding(3.15rem null); // XXX magic number + // XXX this is the difference between the 2rem padding-left + // of .usa-nav-inner and the $site-margins (3rem) padding-left + // of .usa-megamenu + left: -1rem; + width: 100%; + } + + &::before { + @include media($nav-width) { + @include outer-megamenu; + right: 100%; + } + } + + &::after { + @include media($nav-width) { + @include outer-megamenu; + left: 100%; + } + } +} + +.usa-header-basic-megamenu { + .usa-nav { + @include media($nav-width) { + padding-left: 0; + padding-top: 0; + width: 100%; + } + } + + .usa-nav-inner { + display: flex; + flex-direction: column; + + @include media($nav-width) { + display: block; + float: right; + margin-top: -4.8rem; + } + } + + .usa-nav-submenu { + .usa-grid-full { + @include media($nav-width) { + margin-left: -1.8rem; // XXX magic number + } + } + } +} + +.usa-megamenu-col { + @include media($nav-width) { + @include span-columns(3); + + &:nth-child(2n) { + @include span-columns(3); + } + + &:nth-child(4n) { + margin-right: 0; + } + } + + > ul { + @include unstyled-list; + } +} diff --git a/scss/components/_search.scss b/scss/components/_search.scss new file mode 100644 index 000000000..e258434af --- /dev/null +++ b/scss/components/_search.scss @@ -0,0 +1,106 @@ +$usa-btn-small-width: 4.5rem; +$usa-btn-medium-width: 8.5rem; +$usa-btn-big-width: 11.6rem; + +@mixin search-icon { + background-image: url('#{$image-path}/search.png'); + background-image: url('#{$image-path}/search.svg'); + background-position: 50%; + background-repeat: no-repeat; +} + +.usa-search { + @include clearfix; + max-width: none; + position: relative; + + [type=search], + .usa-search-input { + @include padding(0 null); + -webkit-appearance: none; + border-bottom-right-radius: 0; + border-right: none; + border-top-right-radius: 0; + box-sizing: border-box; + float: left; + font-size: $small-font-size; + height: 3.3rem; + margin: 0; + width: calc(100% - #{$usa-btn-small-width}); + + @include media($small-screen) { + width: calc(100% - #{$usa-btn-medium-width}); + } + } + + [type=submit], + .usa-search-submit { + @include search-icon; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + height: 3.3rem; + margin: 0; + padding: 0; + width: $usa-btn-small-width; + + @include media($small-screen) { + background-image: none; + width: $usa-btn-medium-width; + } + } + + .usa-search-submit-text { + display: none; + + @include media($small-screen) { + display: block; + } + } + + &.usa-search-big { + @include media($small-screen) { + $height: 4.4rem; + $width: $usa-btn-big-width; + + [type=search], + .usa-search-input { + font-size: $base-font-size; + height: $height; + width: calc(100% - #{$width}); + } + + [type=submit], + .usa-search-submit { + font-size: $h3-font-size; + height: $height; + width: $width; + } + } + } + + &.usa-search-small { + @include media($small-screen) { + $width: $usa-btn-small-width; + + [type=search], + .usa-search-input { + width: calc(100% - #{$width}); + } + + [type=submit], + .usa-search-submit { + @include search-icon; + width: $width; + } + } + + $lt-nav-width: $nav-width - 1px; + + @media screen and (max-width: $lt-nav-width) { + &.usa-sr-only { + left: auto; + position: relative; + } + } + } +} diff --git a/scss/components/_section.scss b/scss/components/_section.scss new file mode 100644 index 000000000..35659eaef --- /dev/null +++ b/scss/components/_section.scss @@ -0,0 +1,37 @@ +.usa-section { + @include padding($site-margins null); + + @include media($medium-screen) { + @include padding(6rem null); + } +} + +.usa-section-light { + background-color: $color-gray-lightest; +} + +.usa-section-dark { + background-color: $color-primary-darkest; + color: $color-white; + + h1, + h2, + h3, + h4, + h5, + h6 { + color: $color-primary-alt; + } + + p { + color: $color-white; + } + + a { + color: $color-gray-lighter; + + &:hover { + color: $color-white; + } + } +} diff --git a/scss/components/_sidenav.scss b/scss/components/_sidenav.scss new file mode 100644 index 000000000..387ff376d --- /dev/null +++ b/scss/components/_sidenav.scss @@ -0,0 +1,8 @@ + +.usa-sidenav-list { + @include usa-sidenav-list; +} + +.usa-sidenav-sub_list { + @include usa-sidenav-sublist; +} diff --git a/scss/components/_skipnav.scss b/scss/components/_skipnav.scss new file mode 100644 index 000000000..e38fb77d2 --- /dev/null +++ b/scss/components/_skipnav.scss @@ -0,0 +1,19 @@ +.usa-skipnav { + background: transparent; + color: $color-base; + left: 0; + padding: 1rem 1.5rem; + position: absolute; + top: -4.2rem; + transition: all 0.2s ease-in-out; + z-index: 100; + + &:focus { + background: $color-white; + left: 0; + outline: 0; + position: absolute; + top: 0; + transition: all 0.2s ease-in-out; + } +} diff --git a/scss/core/_base.scss b/scss/core/_base.scss new file mode 100644 index 000000000..f89c6881a --- /dev/null +++ b/scss/core/_base.scss @@ -0,0 +1,30 @@ +// Apply a natural box layout model to all elements, but allowing components to +// change + +html { + box-sizing: border-box; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +body { + background-color: $color-white; + overflow-x: hidden; +} + +// Hack for clearfixes +.lt-ie9 { + * { + filter: none !important; /* stylelint-disable-line declaration-no-important */ + } +} + +// for IE < 11, see: +// +[hidden] { + display: none !important; /* stylelint-disable-line declaration-no-important */ +} diff --git a/scss/core/_fonts.scss b/scss/core/_fonts.scss new file mode 100644 index 000000000..be48fcfa1 --- /dev/null +++ b/scss/core/_fonts.scss @@ -0,0 +1,65 @@ +/* stylelint-disable at-rule-empty-line-before */ +@include font-face( + 'Source Sans Pro', + '#{$font-path}/sourcesanspro-light-webfont', + 300, + normal, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Source Sans Pro', + '#{$font-path}/sourcesanspro-regular-webfont', + 400, + normal, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Source Sans Pro', + '#{$font-path}/sourcesanspro-italic-webfont', + 400, + italic, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Source Sans Pro', + '#{$font-path}/sourcesanspro-bold-webfont', + 700, + normal, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Merriweather', + '#{$font-path}/merriweather-light-webfont', + 300, + normal, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Merriweather', + '#{$font-path}/merriweather-regular-webfont', + 400, + normal, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Merriweather', + '#{$font-path}/merriweather-italic-webfont', + 400, + italic, + $file-formats: eot woff2 woff ttf +); + +@include font-face( + 'Merriweather', + '#{$font-path}/merriweather-bold-webfont', + 700, + normal, + $file-formats: eot woff2 woff ttf +); +/* stylelint-enable */ diff --git a/scss/core/_grid.scss b/scss/core/_grid.scss new file mode 100644 index 000000000..62a219cf1 --- /dev/null +++ b/scss/core/_grid.scss @@ -0,0 +1,199 @@ +// Grid container +.usa-grid, +.usa-grid-full { + @include outer-container(); + max-width: $site-max-width; +} + +.usa-grid { + @include padding(null $site-margins-mobile); + + @include media($medium-screen) { + @include padding(null $site-margins); + } +} + +.usa-grid-full { + padding: 0; +} + +// Grid items +@include media($medium) { + .usa-width-one-whole { + @include span-columns(6); + } + + .usa-width-one-half { + @include span-columns(3); + } + + .usa-width-one-third { + @include span-columns(2); + } + + .usa-width-two-thirds { + @include span-columns(4); + } + + .usa-width-one-fourth { + @include span-columns(3); + + &:nth-child(2n) { + margin-right: 0; + } + } + + .usa-width-three-fourths { + @include span-columns(6); + } + + .usa-width-one-sixth { + @include span-columns(2); + + &:nth-child(3n) { + margin-right: 0; + } + } + + .usa-width-five-sixths { + @include span-columns(4); + } + + .usa-width-one-twelfth { + @include span-columns(2); + + &:nth-child(3n) { + margin-right: 0; + } + } + + .usa-width-five-twelfths { + @include span-columns(2); + } + + .usa-width-seven-twelfths { + @include span-columns(4); + } +} + +@include media($large) { + .usa-width-one-whole { + @include span-columns(12); + } + + .usa-width-one-half { + @include span-columns(6); + } + + .usa-width-one-third { + @include span-columns(4); + } + + .usa-width-two-thirds { + @include span-columns(8); + } + + .usa-width-one-fourth { + @include span-columns(3); + + &:nth-child(2n) { + @include span-columns(3); + } + + &:nth-child(4n) { + margin-right: 0; + } + } + + .usa-width-three-fourths { + @include span-columns(9); + } + + .usa-width-one-sixth { + @include span-columns(2); + + &:nth-child(3n) { + @include span-columns(2); + } + + &:nth-child(6n) { + margin-right: 0; + } + } + + .usa-width-five-sixths { + @include span-columns(10); + } + + .usa-width-one-twelfth { + @include span-columns(1); + + &:nth-child(3n) { + @include span-columns(1); + } + + &:nth-child(12n) { + margin-right: 0; + } + } + + .usa-width-five-twelfths { + @include span-columns(5); + } + + .usa-width-seven-twelfths { + @include span-columns(7); + } +} + +// Specifies end of a row. +// Required if grid-box contains multiple rows. +// Required if browser does not support :last-child +.usa-end-row { + @include omega(); +} + +// Grid Offsets +.usa-offset-one-twelfth { + @include shift(1 of 12); +} + +.usa-offset-one-sixth { + @include shift(2 of 12); +} + +.usa-offset-one-fourth { + @include shift(3 of 12); +} + +.usa-offset-one-third { + @include shift(4 of 12); +} + +.usa-offset-five-twelfths { + @include shift(5 of 12); +} + +.usa-offset-one-half { + @include shift(6 of 12); +} + +.usa-offset-seven-twelfths { + @include shift(7 of 12); +} + +.usa-offset-two-thirds { + @include shift(8 of 12); +} + +.usa-offset-three-fourths { + @include shift(9 of 12); +} + +.usa-offset-five-sixths { + @include shift(10 of 12); +} + +.usa-offset-eleven-twelfths { + @include shift(11 of 12); +} diff --git a/scss/core/_utilities.scss b/scss/core/_utilities.scss new file mode 100644 index 000000000..fd84320d2 --- /dev/null +++ b/scss/core/_utilities.scss @@ -0,0 +1,232 @@ +// Heading mixins +@mixin title { + font-size: $title-font-size; + font-weight: $font-bold; +} + +@mixin h1 { + font-size: $h1-font-size; + font-weight: $font-bold; +} + +@mixin h2 { + font-size: $h2-font-size; + font-weight: $font-bold; +} + +@mixin h3 { + font-size: $h3-font-size; + font-weight: $font-bold; +} + +@mixin h4 { + font-size: $h4-font-size; + font-weight: $font-bold; +} + +@mixin h5 { + font-size: $h5-font-size; + font-weight: $font-bold; +} + +@mixin h6 { + font-family: $font-sans; + font-size: $h6-font-size; + font-weight: $font-normal; + text-transform: uppercase; +} + +// Mobile-first media query helper +@mixin media($bp) { + @media screen and (min-width: #{$bp}) { + @content; + } +} + +// Screen reader only helper +@mixin sr-only() { + position: absolute; + left: -999em; +} + +.usa-sr-only { + @include sr-only(); +} + +// Aria hidden helper +@mixin accessibly-hidden() { + &[aria-hidden=true] { + display: none; + } +} + +// Unstyled list helper +@mixin unstyled-list() { + @include margin(0 null); + list-style-type: none; + padding-left: 0; + + > li { + margin-bottom: 0; + } +} + +// Font smoothing mixin +// Only use for light text on dark background +// TODO: Remove after adding PostCSS +@mixin font-smoothing { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +// Content size helpers +@mixin allow-layout-classes { + @include margin(null auto); + + &.width-one-half { + @include media($medium-screen) { + width: 50%; + } + } + + &.width-one-third { + @include media($medium-screen) { + width: 33%; + } + } + + &.width-two-thirds { + @include media($medium-screen) { + width: 67%; + } + } + + &.width-one-fourth { + @include media($medium-screen) { + width: 25%; + } + } + + &.width-three-fourths { + @include media($medium-screen) { + width: 75%; + } + } + + &.align-left { + @include media($medium-screen) { + float: left; + margin-right: 2em; + margin-top: 0.5em; + } + } + + &.align-right { + @include media($medium-screen) { + float: right; + margin-left: 2em; + margin-top: 0.5em; + } + } +} + +@mixin display-icon($icon, $direction, $size, $margin, $hover) { + &::#{$direction} { + background-image: url(#{$image-path}/#{$icon}.png); + background-image: url(#{$image-path}/#{$icon}.svg); + background-size: 100%; + content: ''; + display: inline-block; + height: $size; + width: $size; + + /* stylelint-disable block-closing-brace-newline-after, at-rule-empty-line-before */ + @if $direction == 'after' { + margin-left: $margin; + } @else { + margin-right: $margin; + } + /* stylelint-enable */ + } + + @if $hover == 'hover' { + &:hover::#{$direction} { + background-image: url(#{$image-path}/#{$icon}-hover.png); + background-image: url(#{$image-path}/#{$icon}-hover.svg); + } + } +} + +@mixin usa-sidenav-list { + @include unstyled-list(); + + > li { + background-color: transparent; + border-top: 1px solid $color-gray; + font-size: $h4-font-size; + + &:first-child { + border-top: none; + } + } + + a { + border: none; + color: $color-base; + display: block; + font-family: $font-sans; + line-height: 1.3; + padding: 0.85rem 1rem 0.85rem 1.8rem; + text-decoration: none; + + &:hover { + background-color: $color-gray-lightest; + color: $color-primary; + text-decoration: none; + } + + &:focus { + position: relative; + z-index: 1; + } + + &.usa-current { /* stylelint-disable-line selector-no-qualifying-type */ + border-left: 0.4rem solid $color-primary; + color: $color-primary; + font-weight: $font-bold; + padding-left: 1.4rem; + } + } +} + +@mixin usa-sidenav-sublist { + @include unstyled-list(); + margin: 0; + width: 100%; + + li { + border: none; + font-size: $h5-font-size; + } + + a { + padding-left: 2.8rem; + line-height: $heading-line-height; + + &:hover, + &.usa-current { /* stylelint-disable-line selector-no-qualifying-type */ + border: none; + padding-left: 2.8rem; + } + } + + .usa-sidenav-sub_list { + a { + padding-left: 3.8rem; + + &:hover { + padding-left: 3.8rem; + } + } + } +} diff --git a/scss/core/_variables.scss b/scss/core/_variables.scss new file mode 100644 index 000000000..eab906c3a --- /dev/null +++ b/scss/core/_variables.scss @@ -0,0 +1,121 @@ +// These variables drive almost every aspect of the design system +// Every variable is declared as !default so that it can be +// overridden by a previous import. +// +// If you want to override a variable, set that variable in one of your +// own partials, then @import '{path/to/}core/variables'. + +// Typography +// Removing the !default from $em-base so we are not inheriting that +// value from Bourbon. +$em-base: 10px; +$base-font-size: 1.7rem !default; +$small-font-size: 1.4rem !default; +$lead-font-size: 2rem !default; +$title-font-size: 5.2rem !default; +$h1-font-size: 4rem !default; +$h2-font-size: 3rem !default; +$h3-font-size: 2rem !default; +$h4-font-size: 1.7rem !default; +$h5-font-size: 1.5rem !default; +$h6-font-size: 1.3rem !default; +$base-line-height: 1.5 !default; +$heading-line-height: 1.3 !default; +$lead-line-height: 1.7 !default; + +$font-sans: 'Source Sans Pro', $helvetica !default; +$font-serif: 'Merriweather', $georgia !default; + +$font-normal: 400 !default; +$font-bold: 700 !default; + +// Color +$color-primary: #0071bc !default; +$color-primary-darker: #205493 !default; +$color-primary-darkest: #112e51 !default; + +$color-primary-alt: #02bfe7 !default; +$color-primary-alt-dark: #00a6d2 !default; +$color-primary-alt-darkest: #046b99 !default; +$color-primary-alt-light: #9bdaf1 !default; // lighten($color-primary-alt, 60%) +$color-primary-alt-lightest: #e1f3f8 !default; // lighten($color-primary-alt, 90%) + +$color-secondary: #e31c3d !default; +$color-secondary-dark: #cd2026 !default; +$color-secondary-darkest: #981b1e !default; +$color-secondary-light: #e59393 !default; // lighten($color-secondary, 60%) +$color-secondary-lightest: #f9dede !default; // lighten($color-secondary, 90%) + +$color-white: #ffffff !default; +$color-base: #212121 !default; +$color-black: #000000 !default; + +$color-gray-dark: #323a45 !default; +$color-gray: #5b616b !default; // lighten($color-gray-dark, 20%) +$color-gray-medium: #757575 !default; // lightest gray that passes color contrast +$color-gray-light: #aeb0b5 !default; // lighten($color-gray-dark, 60%) +$color-gray-lighter: #d6d7d9 !default; // lighten($color-gray-dark, 80%) +$color-gray-lightest: #f1f1f1 !default; // lighten($color-gray-dark, 91%) + +$color-gray-warm-dark: #494440 !default; +$color-gray-warm-light: #e4e2e0 !default; // lighten($color-gray-warm-dark, 90%) +$color-gray-cool-light: #dce4ef !default; // lighten($color-primary, 90%) + +$color-gold: #fdb81e !default; +$color-gold-light: #f9c642 !default; // lighten($color-gold, 20%) +$color-gold-lighter: #fad980 !default; // lighten($color-gold, 60%) +$color-gold-lightest: #fff1d2 !default; // lighten($color-gold, 83%) + +$color-green: #2e8540 !default; +$color-green-light: #4aa564 !default; // lighten($color-green, 20%) +$color-green-lighter: #94bfa2 !default; // lighten($color-green, 60%) +$color-green-lightest: #e7f4e4 !default; // lighten($color-green, 60%) + +$color-cool-blue: #205493 !default; +$color-cool-blue-light: #4773aa !default; // lighten($color-cool-blue, 20%) +$color-cool-blue-lighter: #8ba6ca !default; // lighten($color-cool-blue, 60%) +$color-cool-blue-lightest: #dce4ef !default; // lighten($color-cool-blue, 90%) + +$color-focus: #3e94cf !default; +$color-visited: #4c2c92 !default; + +$color-shadow: rgba(#000, 0.3) !default; + +// Mobile First Breakpoints +$small-screen: 481px !default; +$medium-screen: 600px !default; +$large-screen: 1201px !default; + +// Grid column counts by screen size +$grid-columns-small: 1 !default; +$grid-columns-medium: 6 !default; +$grid-columns-large: 12 !default; + +// @media single-keyword helpers +$small: new-breakpoint(min-width $small-screen $grid-columns-small) !default; +$medium: new-breakpoint(min-width $medium-screen $grid-columns-medium) !default; +$large: new-breakpoint(min-width $large-screen $grid-columns-large) !default; + +// Relative font and image file paths +$font-path: '../fonts' !default; +$image-path: '../img' !default; + +// Set $asset-pipeline to true if you're using the Rails Asset Pipeline +$asset-pipeline: false !default; + +// Magic Numbers +$text-max-width: 53rem !default; +$lead-max-width: 77rem !default; +$site-max-width: 1040px !default; +$site-margins: 3rem !default; +$site-margins-mobile: 1.5rem !default; +$article-max-width: 600px !default; +$input-max-width: 46rem !default; +$border-radius: 3px !default; +$box-shadow: 0 0 2px $color-shadow !default; +$focus-shadow: 0 0 3px $color-focus, 0 0 7px $color-focus !default; +$nav-width: 951px !default; + +// 44 x 44 pixels hit target following Apple iOS Human Interface +// Guidelines +$hit-area: 4.4rem !default; diff --git a/scss/decanter.scss b/scss/decanter.scss new file mode 100644 index 000000000..bcb041572 --- /dev/null +++ b/scss/decanter.scss @@ -0,0 +1,41 @@ +/*! uswds @version */ + +// Vendor -------------- // +@import 'lib/bourbon'; +@import 'lib/neat'; +@import 'lib/normalize'; + +// Core -------------- // +@import 'core/variables'; +@import 'core/fonts'; +@import 'core/base'; +@import 'core/grid'; +@import 'core/utilities'; + +// Elements -------------- // +// Styles basic HTML elements +@import 'elements/buttons'; +@import 'elements/embed'; +@import 'elements/figure'; +@import 'elements/inputs'; +@import 'elements/labels'; +@import 'elements/list'; +@import 'elements/table'; +@import 'elements/typography'; + +// Components -------------- // +@import 'components/accordions'; +@import 'components/alerts'; +@import 'components/banner'; +@import 'components/footer'; +@import 'components/forms'; +@import 'components/graphic-list'; +@import 'components/header'; +@import 'components/hero'; +@import 'components/layout'; +@import 'components/media-block'; +@import 'components/navigation'; +@import 'components/search'; +@import 'components/section'; +@import 'components/sidenav'; +@import 'components/skipnav'; diff --git a/scss/elements/_buttons.scss b/scss/elements/_buttons.scss new file mode 100644 index 000000000..362ea3c85 --- /dev/null +++ b/scss/elements/_buttons.scss @@ -0,0 +1,191 @@ +// Buttons variables + +$button-stroke: inset 0 0 0 2px; + +// Buttons + +/* stylelint-disable selector-no-qualifying-type */ +.usa-button, +.usa-button-primary, +.usa-button:visited, +.usa-button-primary:visited, +button, +[type=button], +[type=submit], +[type=reset], +[type=image] { + @include font-smoothing; + @include margin(0.5em 0.5em 0.5em null); + appearance: none; + background-color: $color-primary; + border: 0; + border-radius: $border-radius; + color: $color-white; + cursor: pointer; + display: inline-block; + font-family: $font-sans; + font-size: $base-font-size; + font-weight: $font-bold; + line-height: 1; + outline: none; + padding: 1rem 2rem; + text-align: center; + text-decoration: none; + width: 100%; + + @include media($small-screen) { + width: auto; + } + + &:hover, + &.usa-button-hover { + background-color: $color-primary-darker; + border-bottom: 0; + color: $color-white; + text-decoration: none; + } + + &:focus, + &.usa-button-focus { + box-shadow: $focus-shadow; + } + + &:active, + &.usa-button-active { + background-color: $color-primary-darkest; + } + + &.usa-button-primary-alt { + background-color: $color-primary-alt; + color: $color-base; + + &:hover, + &.usa-button-hover { + background-color: $color-primary-alt-dark; + } + + &:active, + &.usa-button-active { + background-color: $color-primary-alt-darkest; + color: $color-white; + } + } + + &.usa-button-secondary { + background-color: $color-secondary; + + &:hover, + &.usa-button-hover { + background-color: $color-secondary-dark; + } + + &:active, + &.usa-button-active { + background-color: $color-secondary-darkest; + } + } + + &.usa-button-gray { + background-color: $color-gray; + + &:hover, + &.usa-button-hover { + background-color: $color-gray-dark; + } + + &:active, + &.usa-button-active { + background-color: $color-base; + } + } + + &.usa-button-outline { + background-color: $color-white; + box-shadow: $button-stroke $color-primary; + color: $color-primary; + + &:hover, + &.usa-button-hover { + box-shadow: $button-stroke $color-primary-darker; + color: $color-primary-darker; + } + + &:active, + &.usa-button-active { + box-shadow: $button-stroke $color-primary-darkest; + color: $color-primary-darkest; + } + + &:focus, + &.usa-button-focus { + box-shadow: $button-stroke $color-primary-darkest, $focus-shadow; + } + } + + &.usa-button-outline-inverse { + background: transparent; + box-shadow: $button-stroke $color-white; + color: $color-white; + + &:hover, + &.usa-button-hover { + box-shadow: $button-stroke $color-gray-lighter; + color: $color-gray-lighter; + } + + &:active, + &.usa-button-active { + box-shadow: $button-stroke $color-gray-light; + color: $color-gray-lighter; + } + + &:focus, + &.usa-button-focus { + box-shadow: $button-stroke $color-gray-light, $focus-shadow; + } + } + + &.usa-button-big { + font-size: 1.9rem; + padding: 1.5rem 3rem; + } +} +/* stylelint-disable */ + +.usa-button:disabled, +.usa-button-disabled { + background-color: $color-gray-lighter; + color: $color-gray-dark; + pointer-events: none; + + &:hover, + &.usa-button-hover, + &:active, + &.usa-button-active, + &:focus { + background-color: $color-gray-lighter; + border: 0; + box-shadow: none; + color: $color-gray-dark; + } +} + +@mixin button-unstyled { + background-color: transparent; + border: 0; + border-radius: 0; + font-weight: $font-normal; + margin: 0; + outline: 0; + padding: 0; + text-align: left; + -webkit-font-smoothing: auto; + + &:hover { + background-color: transparent; + } +} + +.usa-button-unstyled { + @include button-unstyled; +} diff --git a/scss/elements/_embed.scss b/scss/elements/_embed.scss new file mode 100644 index 000000000..284678e3d --- /dev/null +++ b/scss/elements/_embed.scss @@ -0,0 +1,26 @@ +$aspect-height: 9; +$aspect-width: 16; + +@mixin embed-container ($height, $width) { + padding-bottom: percentage($height/$width); +} + +.usa-embed-container { + iframe, + object, + embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } +} + +.usa-embed-container { + @include embed-container($aspect-height, $aspect-width); + position: relative; + height: 0; + overflow: hidden; + max-width: 100%; +} diff --git a/scss/elements/_figure.scss b/scss/elements/_figure.scss new file mode 100644 index 000000000..7af125912 --- /dev/null +++ b/scss/elements/_figure.scss @@ -0,0 +1,13 @@ +img { + max-width: 100%; +} + +// TODO: Add documentation instructions for using this class on image links +@mixin media-link { + display: inline-block; + line-height: 0; +} + +.media_link { + @include media-link(); +} diff --git a/scss/elements/_inputs.scss b/scss/elements/_inputs.scss new file mode 100644 index 000000000..9f5b756c9 --- /dev/null +++ b/scss/elements/_inputs.scss @@ -0,0 +1,346 @@ +// scss-lint:disable QualifyingElement, PropertyCount + +$input-line-height: 1.3; +$input-border-width: 0.1rem; // Using rem instead of px so function uses same units +$input-padding-vertical: 1rem; + +// input heights will vary by browser and type +// if height not explicitly set +$input-height-exact: ( + ($base-font-size * $input-line-height) + + ($input-padding-vertical * 2) + + ($input-border-width * 2) +); + +// truncated to 1 decimal place +// (i.e., 1.21rem -> 1.2rem) +$input-height: floor($input-height-exact * 10) / 10; + +// Block form elements +/* stylelint-disable selector-no-qualifying-type */ +input, +textarea, +select { + appearance: none; + border: $input-border-width solid $color-gray; + border-radius: 0; + box-sizing: border-box; + color: $color-base; // standardize on firefox + display: block; + font-size: $base-font-size; + height: $input-height; + line-height: $input-line-height; + margin: 0.2em 0; + max-width: $input-max-width; + outline: none; + padding: $input-padding-vertical 0.7em; + width: 100%; + + &:focus, + &.usa-input-focus { + box-shadow: $focus-shadow; + } + + &.usa-input-success { + border: 3px solid $color-green-light; + } +} +/* stylelint-enable */ + +.usa-input-error { + border-left: 4px solid $color-secondary-dark; + margin-top: 3rem; + padding-bottom: 0.8rem; + padding-left: 1.5rem; + padding-top: 0.8rem; + position: relative; + right: 1.9rem; + + input, + textarea, + select { + border: 3px solid $color-secondary-dark; + width: calc(100% + 1.9rem); // 1.5rem left padding + 4px border from input error spacing + } + + label { + margin-top: 0; + } + + .usa-input-inline { + border: $input-border-width solid $color-gray; + width: inherit; + } + + .usa-input-inline-error { + border: 3px solid $color-secondary-dark; + } +} + +.usa-input-error-label { + display: block; + font-size: $base-font-size; + font-weight: $font-bold; +} + +.usa-input-error-message { + color: $color-secondary-dark; + display: block; + font-size: $base-font-size; + font-weight: $font-bold; + padding-bottom: 3px; + padding-top: 3px; +} + +.usa-input-required:after { + color: $color-secondary-darkest; + content: ' (*Required)'; +} + +label { + display: block; + margin-top: 3rem; + max-width: $input-max-width; +} + +textarea { + height: 16rem; +} + +select { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-color: $color-white; + background-image: url('#{$image-path}/arrow-down.png'); + background-image: url('#{$image-path}/arrow-down.svg'); + background-position: right 1.3rem center; + background-repeat: no-repeat; + background-size: 1.3rem; +} + +legend { + font-size: $h2-font-size; + font-weight: $font-bold; +} + +.usa-fieldset-inputs { + label { + margin-top: 0; + } +} + +// Hint text + +.usa-form-hint { + color: $color-gray-medium; + font-family: $font-sans; + margin-bottom: 0; +} + +// Custom checkboxes + +[type=checkbox], +[type=radio] { + // The actual input element is only visible to screen readers, because + // all visual styling is done via the label. + @include sr-only(); + + .lt-ie9 & { + border: 0; + float: left; + margin: 0.4em 0.4em 0 0; + position: static; + width: auto; + } +} + +[type=checkbox] + label, +[type=radio] + label { + cursor: pointer; + font-weight: 400; + margin-bottom: 0.5em; +} + +[type=checkbox] + label::before, +[type=radio] + label::before { + background: $color-white; + border-radius: $border-radius; + box-shadow: 0 0 0 1px $color-gray-medium; + content: '\a0'; + display: inline-block; + height: 1.8rem; + line-height: 1.8rem; + margin-right: 0.6em; + text-indent: 0.15em; + vertical-align: middle\0; // Target IE 11 and below to vertically center inputs + width: 1.8rem; +} + +[type=radio] + label::before { + box-shadow: 0 0 0 2px $color-white, 0 0 0 3px $color-gray-medium; + height: 1.6rem; + line-height: 1.6rem; + width: 1.6rem; + border-radius: 100%; +} + +[type=checkbox]:checked + label::before, +[type=radio]:checked + label::before { + background-color: $color-primary; + box-shadow: 0 0 0 1px $color-primary; +} + +[type=radio]:checked + label::before { + box-shadow: 0 0 0 2px $color-white, 0 0 0 4px $color-primary; +} + +[type=radio]:focus + label::before { + box-shadow: 0 0 0 2px $color-white, 0 0 0 4px $color-primary, 0 0 3px 4px $color-focus, 0 0 7px 4px $color-focus; +} + +[type=checkbox]:checked + label::before, +[type=checkbox]:checked:disabled + label::before { + background-image: url('#{$image-path}/correct8.png'); + background-image: url('#{$image-path}/correct8.svg'); + background-position: 50%; + background-repeat: no-repeat; +} + +[type=checkbox]:focus + label::before { + box-shadow: 0 0 0 1px $color-white, 0 0 0 3px $color-primary; +} + +[type=checkbox]:disabled + label { + color: $color-gray; +} + +[type=checkbox]:disabled + label::before, +[type=radio]:disabled + label::before { + background: $color-gray-lighter; + box-shadow: 0 0 0 1px $color-gray-light; + cursor: not-allowed; +} + +// Range inputs + +[type=range] { + -webkit-appearance: none; + border: none; + padding-left: 0; + width: 100%; +} + +[type=range]:focus { + box-shadow: none; + outline: none; +} + +[type=range]::-webkit-slider-runnable-track { + background: $color-gray-light; + border: 1px solid $color-gray-medium; + cursor: pointer; + height: 1.2rem; + width: 100%; +} + +[type=range]::-moz-range-track { + background: $color-primary; + border: 1px solid $color-gray-medium; + cursor: pointer; + height: 1.2rem; + width: 100%; +} + +[type=range]::-ms-track { + background: transparent; + color: transparent; + cursor: pointer; + height: 1.2rem; + width: 100%; +} + +[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + border: 1px solid $color-gray-medium; + height: 2.2rem; + border-radius: 1.5rem; + background: $color-gray-lightest; + cursor: pointer; + margin-top: -.65rem; + width: 2.2rem; +} + +[type=range]::-moz-range-thumb { + background: $color-gray-lightest; + border: 1px solid $color-gray-medium; + border-radius: 1.5rem; + cursor: pointer; + height: 2.2rem; + width: 2.2rem; +} + +[type=range]::-ms-thumb { + background: $color-gray-lightest; + border: 1px solid $color-gray-medium; + border-radius: 1.5rem; + cursor: pointer; + height: 2.2rem; + width: 2.2rem; +} + +[type=range]::-ms-fill-lower { + background: $color-gray-light; + border: 1px solid $color-gray-medium; + border-radius: 2rem; +} + +[type=range]::-ms-fill-upper { + background: $color-gray-light; + border: 1px solid $color-gray-medium; + border-radius: 2rem; +} + +[type=range]:focus::-webkit-slider-thumb { + border: 2px solid $color-focus; +} + +[type=range]:focus::-moz-range-thumb { + border: 2px solid $color-focus; +} + +[type=range]:focus::-ms-thumb { + border: 2px solid $color-focus; +} + +// Memorable dates + +.usa-date-of-birth { + label { + margin-top: 0; + } + + [type=number]::-webkit-inner-spin-button, + [type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + appearance: none; + margin: 0; + } + + [type=number] { + -moz-appearance: textfield; + } +} + +.usa-form-group-day, +.usa-form-group-month, +.usa-form-group-year { + clear: none; + float: left; + margin-right: 1.5rem; + width: 5rem; +} + +.usa-form-group-year { + width: 7rem; +} diff --git a/scss/elements/_labels.scss b/scss/elements/_labels.scss new file mode 100644 index 000000000..f439b1313 --- /dev/null +++ b/scss/elements/_labels.scss @@ -0,0 +1,20 @@ +.usa-label { + background-color: $color-primary; + border-radius: $border-radius; + color: $color-white; + font-size: $h5-font-size; + margin-right: 0.5rem; + padding: 0.1rem 0.7rem; + text-transform: uppercase; + + &:only-of-type { + margin-right: 0; + } +} + +.usa-label-big { + @extend .usa-label; + font-size: $base-font-size; + padding-left: 0.9rem; + padding-right: 0.9rem; +} diff --git a/scss/elements/_list.scss b/scss/elements/_list.scss new file mode 100644 index 000000000..bec84face --- /dev/null +++ b/scss/elements/_list.scss @@ -0,0 +1,32 @@ +ul, +ol { + @include margin(1em null); + padding-left: 1.94em; // Approximately 15px left padding at default font size +} + +li { + line-height: $base-line-height; + margin-bottom: 0.5em; + + &:last-child { + margin-bottom: 0; + } +} + +h1, +h2, +h3, +h4, +h5, +h6, +p { + + ul, + + ol { + margin-top: 0; + } +} + +// Unstyled lists +.usa-unstyled-list { + @include unstyled-list; +} diff --git a/scss/elements/_table.scss b/scss/elements/_table.scss new file mode 100644 index 000000000..262eada56 --- /dev/null +++ b/scss/elements/_table.scss @@ -0,0 +1,47 @@ +table { + border-spacing: 0; + margin: 2em 0; + min-width: 100%; + + thead { + th, + td { + background-color: $color-gray-lightest; + } + } + + th { + text-align: left; + } + + tbody { + th { + font-weight: $font-normal; + } + } + + th, + td { + background-color: $color-white; + border: 1px solid $color-gray; + padding: 1.5rem; + } +} + +.usa-table-borderless { + thead { + tr { + background-color: transparent; + } + + th { + border-top: 0; + } + } + + th, + td { + border-left: 0; + border-right: 0; + } +} diff --git a/scss/elements/_typography.scss b/scss/elements/_typography.scss new file mode 100644 index 000000000..74851f6ff --- /dev/null +++ b/scss/elements/_typography.scss @@ -0,0 +1,257 @@ +html { + font-family: $font-sans; + font-size: $em-base; +} + +body { + font-size: $base-font-size; +} + +p { + line-height: $base-line-height; + margin-bottom: 1em; + margin-top: 1em; +} + +a { + color: $color-primary; + text-decoration: underline; + + &:hover, + &:active { + color: $color-primary-darker; + } + + &:visited { + color: $color-visited; + } + + &:focus { + box-shadow: $focus-shadow; + outline: 0; + } +} + +@mixin external-link($external-link, $external-link-hover) { + &::after { + background: url('#{$image-path}/#{$external-link}.png') no-repeat 0 0; + background: url('#{$image-path}/#{$external-link}.svg') no-repeat 0 0; + background-size: 100%; + content: ''; + display: inline-block; + height: 0.65em; + margin-bottom: -1px; + margin-left: 4px; + width: 0.65em; + } + + &:hover::after { + background-image: url('#{$image-path}/#{$external-link-hover}.png'); + background-image: url('#{$image-path}/#{$external-link-hover}.svg'); + } +} + +// External link consider "effortless style approach": +// [href^="http:"]:not([href*="my-domain.com"]) +// [href^="https:"]:not([href*="my-domain.com"]) + +.usa-external_link { + @include external-link(external-link, external-link-hover); +} + +.usa-external_link-alt { + @include external-link(external-link-alt, external-link-alt-hover); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + font-family: $font-serif; + line-height: $heading-line-height; + margin-bottom: .5em; + margin-top: 1.5em; +} + +h1 { + @include h1(); +} + +h2 { + @include h2(); +} + +h3 { + @include h3(); +} + +h4 { + @include h4(); +} + +h5 { + @include h5(); +} + +h6 { + @include h6(); +} + +// Remove user agent styles + +cite, +var, +address, +dfn { + font-style: normal; +} + +// Custom typography + +.usa-content { + p:not(.usa-font-lead), + ul:not(.usa-accordion):not(.usa-accordion-bordered), + ol:not(.usa-accordion):not(.usa-accordion-bordered) { + max-width: $text-max-width; + } +} + +.usa-content-list { + max-width: $text-max-width; +} + +.usa-sans { + p, + a, + li, + span { + font-family: $font-sans; + } + + a { + border-bottom: none; + font-weight: $font-bold; + } +} + +.usa-serif { + p, + a, + li, + span { + font-family: $font-serif; + } +} + +.usa-display { + @include h3(); + margin-bottom: 0; + + @include media($small-screen) { + @include h1(); + } + + @include media($medium-screen) { + @include title(); + } +} + +.usa-font-lead { + font-family: $font-serif; + font-size: $lead-font-size; + line-height: $lead-line-height; + max-width: $lead-max-width; +} + +.usa-image-block { + position: relative; +} + +.usa-image-text-block { + color: $color-white; + left: 0; + margin-left: 8%; + position: absolute; + top: 0; +} + +.usa-image-text { + margin-top: 0; +} + +.usa-drop_text { + margin-bottom: 0; +} + +.usa-background-dark { + background-color: $color-gray-dark; + + p, + span { + color: $color-white; + } + + a { + color: $color-gray-lighter; + + &:hover { + color: $color-white; + } + } +} + +.usa-text-small { + font-size: $h6-font-size; + margin-top: 0; +} + +// Removes top margin from first child and bottom margin from last child on +// elements when they are within those layout elements. +.usa-section, +.usa-grid, +.usa-grid-full { + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } +} + +.usa-width-one-whole, +.usa-width-one-half, +.usa-width-one-third, +.usa-width-two-thirds, +.usa-width-one-fourth, +.usa-width-three-fourths, +.usa-width-one-sixth, +.usa-width-five-sixths, +.usa-width-one-twelfth { + &:first-child { + > :first-child { + margin-top: 0; + } + } + + > :first-child { + @include media($medium-screen) { + margin-top: 0; + } + } + + &:last-child { + > :last-child { + margin-bottom: 0; + } + } + + > :last-child { + @include media($medium-screen) { + margin-bottom: 0; + } + } +} diff --git a/scss/lib/_bourbon.scss b/scss/lib/_bourbon.scss new file mode 100644 index 000000000..4a5d889c0 --- /dev/null +++ b/scss/lib/_bourbon.scss @@ -0,0 +1,85 @@ +// Bourbon 4.2.7 +// http://bourbon.io +// Copyright 2011-2015 thoughtbot, inc. +// MIT License + +@import "settings/prefixer"; +@import "settings/px-to-em"; +@import "settings/asset-pipeline"; + +@import "functions/assign-inputs"; +@import "functions/contains"; +@import "functions/contains-falsy"; +@import "functions/is-length"; +@import "functions/is-light"; +@import "functions/is-number"; +@import "functions/is-size"; +@import "functions/px-to-em"; +@import "functions/px-to-rem"; +@import "functions/shade"; +@import "functions/strip-units"; +@import "functions/tint"; +@import "functions/transition-property-name"; +@import "functions/unpack"; +@import "functions/modular-scale"; + +@import "helpers/convert-units"; +@import "helpers/directional-values"; +@import "helpers/font-source-declaration"; +@import "helpers/gradient-positions-parser"; +@import "helpers/linear-angle-parser"; +@import "helpers/linear-gradient-parser"; +@import "helpers/linear-positions-parser"; +@import "helpers/linear-side-corner-parser"; +@import "helpers/radial-arg-parser"; +@import "helpers/radial-positions-parser"; +@import "helpers/radial-gradient-parser"; +@import "helpers/render-gradients"; +@import "helpers/shape-size-stripper"; +@import "helpers/str-to-num"; + +@import "css3/animation"; +@import "css3/appearance"; +@import "css3/backface-visibility"; +@import "css3/background"; +@import "css3/background-image"; +@import "css3/border-image"; +@import "css3/calc"; +@import "css3/columns"; +@import "css3/filter"; +@import "css3/flex-box"; +@import "css3/font-face"; +@import "css3/font-feature-settings"; +@import "css3/hidpi-media-query"; +@import "css3/hyphens"; +@import "css3/image-rendering"; +@import "css3/keyframes"; +@import "css3/linear-gradient"; +@import "css3/perspective"; +@import "css3/placeholder"; +@import "css3/radial-gradient"; +@import "css3/selection"; +@import "css3/text-decoration"; +@import "css3/transform"; +@import "css3/transition"; +@import "css3/user-select"; + +@import "addons/border-color"; +@import "addons/border-radius"; +@import "addons/border-style"; +@import "addons/border-width"; +@import "addons/buttons"; +@import "addons/clearfix"; +@import "addons/ellipsis"; +@import "addons/font-stacks"; +@import "addons/hide-text"; +@import "addons/margin"; +@import "addons/padding"; +@import "addons/position"; +@import "addons/prefixer"; +@import "addons/retina-image"; +@import "addons/size"; +@import "addons/text-inputs"; +@import "addons/timing-functions"; +@import "addons/triangle"; +@import "addons/word-wrap"; diff --git a/scss/lib/_neat-helpers.scss b/scss/lib/_neat-helpers.scss new file mode 100644 index 000000000..2d6d808ae --- /dev/null +++ b/scss/lib/_neat-helpers.scss @@ -0,0 +1,11 @@ +// Mixins +@import "mixins/clearfix"; + +// Functions +@import "functions/private"; +@import "functions/new-breakpoint"; + +// Settings +@import "settings/grid"; +@import "settings/visual-grid"; +@import "settings/disable-warnings"; diff --git a/scss/lib/_neat.scss b/scss/lib/_neat.scss new file mode 100644 index 000000000..e17217122 --- /dev/null +++ b/scss/lib/_neat.scss @@ -0,0 +1,23 @@ +// Neat 1.8.0 +// http://neat.bourbon.io +// Copyright 2012-2015 thoughtbot, inc. +// MIT License + +// Helpers +@import "neat-helpers"; + +// Grid +@import "grid/private"; +@import "grid/box-sizing"; +@import "grid/omega"; +@import "grid/outer-container"; +@import "grid/span-columns"; +@import "grid/row"; +@import "grid/shift"; +@import "grid/pad"; +@import "grid/fill-parent"; +@import "grid/media"; +@import "grid/to-deprecate"; +@import "grid/visual-grid"; +@import "grid/display-context"; +@import "grid/direction-context"; diff --git a/scss/lib/_normalize.scss b/scss/lib/_normalize.scss new file mode 100644 index 000000000..5e5e3c898 --- /dev/null +++ b/scss/lib/_normalize.scss @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device 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/10/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 of focused elements when they are also in an + * active/hover state. + */ + +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 { + 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. + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + box-sizing: content-box; /* 2 */ +} + +/** + * 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/scss/lib/addons/_border-color.scss b/scss/lib/addons/_border-color.scss new file mode 100644 index 000000000..6f6ab36c4 --- /dev/null +++ b/scss/lib/addons/_border-color.scss @@ -0,0 +1,26 @@ +@charset "UTF-8"; + +/// Provides a quick method for targeting `border-color` on specific sides of a box. Use a `null` value to “skip” a side. +/// +/// @param {Arglist} $vals +/// List of arguments +/// +/// @example scss - Usage +/// .element { +/// @include border-color(#a60b55 #76cd9c null #e8ae1a); +/// } +/// +/// @example css - CSS Output +/// .element { +/// border-left-color: #e8ae1a; +/// border-right-color: #76cd9c; +/// border-top-color: #a60b55; +/// } +/// +/// @require {mixin} directional-property +/// +/// @output `border-color` + +@mixin border-color($vals...) { + @include directional-property(border, color, $vals...); +} diff --git a/scss/lib/addons/_border-radius.scss b/scss/lib/addons/_border-radius.scss new file mode 100644 index 000000000..1f6586335 --- /dev/null +++ b/scss/lib/addons/_border-radius.scss @@ -0,0 +1,48 @@ +@charset "UTF-8"; + +/// Provides a quick method for targeting `border-radius` on both corners on the side of a box. +/// +/// @param {Number} $radii +/// List of arguments +/// +/// @example scss - Usage +/// .element-one { +/// @include border-top-radius(5px); +/// } +/// +/// .element-two { +/// @include border-left-radius(3px); +/// } +/// +/// @example css - CSS Output +/// .element-one { +/// border-top-left-radius: 5px; +/// border-top-right-radius: 5px; +/// } +/// +/// .element-two { +/// border-bottom-left-radius: 3px; +/// border-top-left-radius: 3px; +/// } +/// +/// @output `border-radius` + +@mixin border-top-radius($radii) { + border-top-left-radius: $radii; + border-top-right-radius: $radii; +} + +@mixin border-right-radius($radii) { + border-bottom-right-radius: $radii; + border-top-right-radius: $radii; +} + +@mixin border-bottom-radius($radii) { + border-bottom-left-radius: $radii; + border-bottom-right-radius: $radii; +} + +@mixin border-left-radius($radii) { + border-bottom-left-radius: $radii; + border-top-left-radius: $radii; +} diff --git a/scss/lib/addons/_border-style.scss b/scss/lib/addons/_border-style.scss new file mode 100644 index 000000000..d86ee79d9 --- /dev/null +++ b/scss/lib/addons/_border-style.scss @@ -0,0 +1,25 @@ +@charset "UTF-8"; + +/// Provides a quick method for targeting `border-style` on specific sides of a box. Use a `null` value to “skip” a side. +/// +/// @param {Arglist} $vals +/// List of arguments +/// +/// @example scss - Usage +/// .element { +/// @include border-style(dashed null solid); +/// } +/// +/// @example css - CSS Output +/// .element { +/// border-bottom-style: solid; +/// border-top-style: dashed; +/// } +/// +/// @require {mixin} directional-property +/// +/// @output `border-style` + +@mixin border-style($vals...) { + @include directional-property(border, style, $vals...); +} diff --git a/scss/lib/addons/_border-width.scss b/scss/lib/addons/_border-width.scss new file mode 100644 index 000000000..0ea2d4b71 --- /dev/null +++ b/scss/lib/addons/_border-width.scss @@ -0,0 +1,25 @@ +@charset "UTF-8"; + +/// Provides a quick method for targeting `border-width` on specific sides of a box. Use a `null` value to “skip” a side. +/// +/// @param {Arglist} $vals +/// List of arguments +/// +/// @example scss - Usage +/// .element { +/// @include border-width(1em null 20px); +/// } +/// +/// @example css - CSS Output +/// .element { +/// border-bottom-width: 20px; +/// border-top-width: 1em; +/// } +/// +/// @require {mixin} directional-property +/// +/// @output `border-width` + +@mixin border-width($vals...) { + @include directional-property(border, width, $vals...); +} diff --git a/scss/lib/addons/_buttons.scss b/scss/lib/addons/_buttons.scss new file mode 100644 index 000000000..debeabc53 --- /dev/null +++ b/scss/lib/addons/_buttons.scss @@ -0,0 +1,64 @@ +@charset "UTF-8"; + +/// Generates variables for all buttons. Please note that you must use interpolation on the variable: `#{$all-buttons}`. +/// +/// @example scss - Usage +/// #{$all-buttons} { +/// background-color: #f00; +/// } +/// +/// #{$all-buttons-focus}, +/// #{$all-buttons-hover} { +/// background-color: #0f0; +/// } +/// +/// #{$all-buttons-active} { +/// background-color: #00f; +/// } +/// +/// @example css - CSS Output +/// button, +/// input[type="button"], +/// input[type="reset"], +/// input[type="submit"] { +/// background-color: #f00; +/// } +/// +/// button:focus, +/// input[type="button"]:focus, +/// input[type="reset"]:focus, +/// input[type="submit"]:focus, +/// button:hover, +/// input[type="button"]:hover, +/// input[type="reset"]:hover, +/// input[type="submit"]:hover { +/// background-color: #0f0; +/// } +/// +/// button:active, +/// input[type="button"]:active, +/// input[type="reset"]:active, +/// input[type="submit"]:active { +/// background-color: #00f; +/// } +/// +/// @require assign-inputs +/// +/// @type List +/// +/// @todo Remove double assigned variables (Lines 59–62) in v5.0.0 + +$buttons-list: 'button', + 'input[type="button"]', + 'input[type="reset"]', + 'input[type="submit"]'; + +$all-buttons: assign-inputs($buttons-list); +$all-buttons-active: assign-inputs($buttons-list, active); +$all-buttons-focus: assign-inputs($buttons-list, focus); +$all-buttons-hover: assign-inputs($buttons-list, hover); + +$all-button-inputs: $all-buttons; +$all-button-inputs-active: $all-buttons-active; +$all-button-inputs-focus: $all-buttons-focus; +$all-button-inputs-hover: $all-buttons-hover; diff --git a/scss/lib/addons/_clearfix.scss b/scss/lib/addons/_clearfix.scss new file mode 100644 index 000000000..11313d66f --- /dev/null +++ b/scss/lib/addons/_clearfix.scss @@ -0,0 +1,25 @@ +@charset "UTF-8"; + +/// Provides an easy way to include a clearfix for containing floats. +/// +/// @link http://cssmojo.com/latest_new_clearfix_so_far/ +/// +/// @example scss - Usage +/// .element { +/// @include clearfix; +/// } +/// +/// @example css - CSS Output +/// .element::after { +/// clear: both; +/// content: ""; +/// display: table; +/// } + +@mixin clearfix { + &::after { + clear: both; + content: ""; + display: table; + } +} diff --git a/scss/lib/addons/_ellipsis.scss b/scss/lib/addons/_ellipsis.scss new file mode 100644 index 000000000..a367f651c --- /dev/null +++ b/scss/lib/addons/_ellipsis.scss @@ -0,0 +1,30 @@ +@charset "UTF-8"; + +/// Truncates text and adds an ellipsis to represent overflow. +/// +/// @param {Number} $width [100%] +/// Max-width for the string to respect before being truncated +/// +/// @example scss - Usage +/// .element { +/// @include ellipsis; +/// } +/// +/// @example css - CSS Output +/// .element { +/// display: inline-block; +/// max-width: 100%; +/// overflow: hidden; +/// text-overflow: ellipsis; +/// white-space: nowrap; +/// word-wrap: normal; +/// } + +@mixin ellipsis($width: 100%) { + display: inline-block; + max-width: $width; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: normal; +} diff --git a/scss/lib/addons/_font-stacks.scss b/scss/lib/addons/_font-stacks.scss new file mode 100644 index 000000000..57128f422 --- /dev/null +++ b/scss/lib/addons/_font-stacks.scss @@ -0,0 +1,31 @@ +@charset "UTF-8"; + +/// Georgia font stack. +/// +/// @type List + +$georgia: "Georgia", "Cambria", "Times New Roman", "Times", serif; + +/// Helvetica font stack. +/// +/// @type List + +$helvetica: "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + +/// Lucida Grande font stack. +/// +/// @type List + +$lucida-grande: "Lucida Grande", "Tahoma", "Verdana", "Arial", sans-serif; + +/// Monospace font stack. +/// +/// @type List + +$monospace: "Bitstream Vera Sans Mono", "Consolas", "Courier", monospace; + +/// Verdana font stack. +/// +/// @type List + +$verdana: "Verdana", "Geneva", sans-serif; diff --git a/scss/lib/addons/_hide-text.scss b/scss/lib/addons/_hide-text.scss new file mode 100644 index 000000000..4caf20ed5 --- /dev/null +++ b/scss/lib/addons/_hide-text.scss @@ -0,0 +1,27 @@ +/// Hides the text in an element, commonly used to show an image. Some elements will need block-level styles applied. +/// +/// @link http://zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement +/// +/// @example scss - Usage +/// .element { +/// @include hide-text; +/// } +/// +/// @example css - CSS Output +/// .element { +/// overflow: hidden; +/// text-indent: 101%; +/// white-space: nowrap; +/// } +/// +/// @todo Remove height argument in v5.0.0 + +@mixin hide-text($height: null) { + overflow: hidden; + text-indent: 101%; + white-space: nowrap; + + @if $height { + @warn "The `hide-text` mixin has changed and no longer requires a height. The height argument will no longer be accepted in v5.0.0"; + } +} diff --git a/scss/lib/addons/_margin.scss b/scss/lib/addons/_margin.scss new file mode 100644 index 000000000..674f4e5f6 --- /dev/null +++ b/scss/lib/addons/_margin.scss @@ -0,0 +1,26 @@ +@charset "UTF-8"; + +/// Provides a quick method for targeting `margin` on specific sides of a box. Use a `null` value to “skip” a side. +/// +/// @param {Arglist} $vals +/// List of arguments +/// +/// @example scss - Usage +/// .element { +/// @include margin(null 10px 3em 20vh); +/// } +/// +/// @example css - CSS Output +/// .element { +/// margin-bottom: 3em; +/// margin-left: 20vh; +/// margin-right: 10px; +/// } +/// +/// @require {mixin} directional-property +/// +/// @output `margin` + +@mixin margin($vals...) { + @include directional-property(margin, false, $vals...); +} diff --git a/scss/lib/addons/_padding.scss b/scss/lib/addons/_padding.scss new file mode 100644 index 000000000..40a5f006b --- /dev/null +++ b/scss/lib/addons/_padding.scss @@ -0,0 +1,26 @@ +@charset "UTF-8"; + +/// Provides a quick method for targeting `padding` on specific sides of a box. Use a `null` value to “skip” a side. +/// +/// @param {Arglist} $vals +/// List of arguments +/// +/// @example scss - Usage +/// .element { +/// @include padding(12vh null 10px 5%); +/// } +/// +/// @example css - CSS Output +/// .element { +/// padding-bottom: 10px; +/// padding-left: 5%; +/// padding-top: 12vh; +/// } +/// +/// @require {mixin} directional-property +/// +/// @output `padding` + +@mixin padding($vals...) { + @include directional-property(padding, false, $vals...); +} diff --git a/scss/lib/addons/_position.scss b/scss/lib/addons/_position.scss new file mode 100644 index 000000000..e460f3ffd --- /dev/null +++ b/scss/lib/addons/_position.scss @@ -0,0 +1,48 @@ +@charset "UTF-8"; + +/// Provides a quick method for setting an element’s position. Use a `null` value to “skip” a side. +/// +/// @param {Position} $position [relative] +/// A CSS position value +/// +/// @param {Arglist} $coordinates [null null null null] +/// List of values that correspond to the 4-value syntax for the edges of a box +/// +/// @example scss - Usage +/// .element { +/// @include position(absolute, 0 null null 10em); +/// } +/// +/// @example css - CSS Output +/// .element { +/// left: 10em; +/// position: absolute; +/// top: 0; +/// } +/// +/// @require {function} is-length +/// @require {function} unpack + +@mixin position($position: relative, $coordinates: null null null null) { + @if type-of($position) == list { + $coordinates: $position; + $position: relative; + } + + $coordinates: unpack($coordinates); + + $offsets: ( + top: nth($coordinates, 1), + right: nth($coordinates, 2), + bottom: nth($coordinates, 3), + left: nth($coordinates, 4) + ); + + position: $position; + + @each $offset, $value in $offsets { + @if is-length($value) { + #{$offset}: $value; + } + } +} diff --git a/scss/lib/addons/_prefixer.scss b/scss/lib/addons/_prefixer.scss new file mode 100644 index 000000000..2b6f73138 --- /dev/null +++ b/scss/lib/addons/_prefixer.scss @@ -0,0 +1,66 @@ +@charset "UTF-8"; + +/// A mixin for generating vendor prefixes on non-standardized properties. +/// +/// @param {String} $property +/// Property to prefix +/// +/// @param {*} $value +/// Value to use +/// +/// @param {List} $prefixes +/// Prefixes to define +/// +/// @example scss - Usage +/// .element { +/// @include prefixer(border-radius, 10px, webkit ms spec); +/// } +/// +/// @example css - CSS Output +/// .element { +/// -webkit-border-radius: 10px; +/// -moz-border-radius: 10px; +/// border-radius: 10px; +/// } +/// +/// @require {variable} $prefix-for-webkit +/// @require {variable} $prefix-for-mozilla +/// @require {variable} $prefix-for-microsoft +/// @require {variable} $prefix-for-opera +/// @require {variable} $prefix-for-spec + +@mixin prefixer($property, $value, $prefixes) { + @each $prefix in $prefixes { + @if $prefix == webkit { + @if $prefix-for-webkit { + -webkit-#{$property}: $value; + } + } @else if $prefix == moz { + @if $prefix-for-mozilla { + -moz-#{$property}: $value; + } + } @else if $prefix == ms { + @if $prefix-for-microsoft { + -ms-#{$property}: $value; + } + } @else if $prefix == o { + @if $prefix-for-opera { + -o-#{$property}: $value; + } + } @else if $prefix == spec { + @if $prefix-for-spec { + #{$property}: $value; + } + } @else { + @warn "Unrecognized prefix: #{$prefix}"; + } + } +} + +@mixin disable-prefix-for-all() { + $prefix-for-webkit: false !global; + $prefix-for-mozilla: false !global; + $prefix-for-microsoft: false !global; + $prefix-for-opera: false !global; + $prefix-for-spec: false !global; +} diff --git a/scss/lib/addons/_retina-image.scss b/scss/lib/addons/_retina-image.scss new file mode 100644 index 000000000..7febbd751 --- /dev/null +++ b/scss/lib/addons/_retina-image.scss @@ -0,0 +1,25 @@ +@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x, $asset-pipeline: $asset-pipeline) { + @if $asset-pipeline { + background-image: image-url("#{$filename}.#{$extension}"); + } @else { + background-image: url("#{$filename}.#{$extension}"); + } + + @include hidpi { + @if $asset-pipeline { + @if $retina-filename { + background-image: image-url("#{$retina-filename}.#{$extension}"); + } @else { + background-image: image-url("#{$filename}#{$retina-suffix}.#{$extension}"); + } + } @else { + @if $retina-filename { + background-image: url("#{$retina-filename}.#{$extension}"); + } @else { + background-image: url("#{$filename}#{$retina-suffix}.#{$extension}"); + } + } + + background-size: $background-size; + } +} diff --git a/scss/lib/addons/_size.scss b/scss/lib/addons/_size.scss new file mode 100644 index 000000000..a2992a34c --- /dev/null +++ b/scss/lib/addons/_size.scss @@ -0,0 +1,51 @@ +@charset "UTF-8"; + +/// Sets the `width` and `height` of the element. +/// +/// @param {List} $size +/// A list of at most 2 size values. +/// +/// If there is only a single value in `$size` it is used for both width and height. All units are supported. +/// +/// @example scss - Usage +/// .first-element { +/// @include size(2em); +/// } +/// +/// .second-element { +/// @include size(auto 10em); +/// } +/// +/// @example css - CSS Output +/// .first-element { +/// width: 2em; +/// height: 2em; +/// } +/// +/// .second-element { +/// width: auto; +/// height: 10em; +/// } +/// +/// @todo Refactor in 5.0.0 to use a comma-separated argument + +@mixin size($value) { + $width: nth($value, 1); + $height: $width; + + @if length($value) > 1 { + $height: nth($value, 2); + } + + @if is-size($height) { + height: $height; + } @else { + @warn "`#{$height}` is not a valid length for the `$height` parameter in the `size` mixin."; + } + + @if is-size($width) { + width: $width; + } @else { + @warn "`#{$width}` is not a valid length for the `$width` parameter in the `size` mixin."; + } +} diff --git a/scss/lib/addons/_text-inputs.scss b/scss/lib/addons/_text-inputs.scss new file mode 100644 index 000000000..1eb7a5451 --- /dev/null +++ b/scss/lib/addons/_text-inputs.scss @@ -0,0 +1,113 @@ +@charset "UTF-8"; + +/// Generates variables for all text-based inputs. Please note that you must use interpolation on the variable: `#{$all-text-inputs}`. +/// +/// @example scss - Usage +/// #{$all-text-inputs} { +/// border: 1px solid #f00; +/// } +/// +/// #{$all-text-inputs-focus}, +/// #{$all-text-inputs-hover} { +/// border: 1px solid #0f0; +/// } +/// +/// #{$all-text-inputs-active} { +/// border: 1px solid #00f; +/// } +/// +/// @example css - CSS Output +/// input[type="color"], +/// input[type="date"], +/// input[type="datetime"], +/// input[type="datetime-local"], +/// input[type="email"], +/// input[type="month"], +/// input[type="number"], +/// input[type="password"], +/// input[type="search"], +/// input[type="tel"], +/// input[type="text"], +/// input[type="time"], +/// input[type="url"], +/// input[type="week"], +/// textarea { +/// border: 1px solid #f00; +/// } +/// +/// input[type="color"]:focus, +/// input[type="date"]:focus, +/// input[type="datetime"]:focus, +/// input[type="datetime-local"]:focus, +/// input[type="email"]:focus, +/// input[type="month"]:focus, +/// input[type="number"]:focus, +/// input[type="password"]:focus, +/// input[type="search"]:focus, +/// input[type="tel"]:focus, +/// input[type="text"]:focus, +/// input[type="time"]:focus, +/// input[type="url"]:focus, +/// input[type="week"]:focus, +/// textarea:focus, +/// input[type="color"]:hover, +/// input[type="date"]:hover, +/// input[type="datetime"]:hover, +/// input[type="datetime-local"]:hover, +/// input[type="email"]:hover, +/// input[type="month"]:hover, +/// input[type="number"]:hover, +/// input[type="password"]:hover, +/// input[type="search"]:hover, +/// input[type="tel"]:hover, +/// input[type="text"]:hover, +/// input[type="time"]:hover, +/// input[type="url"]:hover, +/// input[type="week"]:hover, +/// textarea:hover { +/// border: 1px solid #0f0; +/// } +/// +/// input[type="color"]:active, +/// input[type="date"]:active, +/// input[type="datetime"]:active, +/// input[type="datetime-local"]:active, +/// input[type="email"]:active, +/// input[type="month"]:active, +/// input[type="number"]:active, +/// input[type="password"]:active, +/// input[type="search"]:active, +/// input[type="tel"]:active, +/// input[type="text"]:active, +/// input[type="time"]:active, +/// input[type="url"]:active, +/// input[type="week"]:active, +/// textarea:active { +/// border: 1px solid #00f; +/// } +/// +/// @require assign-inputs +/// +/// @type List + +$text-inputs-list: 'input[type="color"]', + 'input[type="date"]', + 'input[type="datetime"]', + 'input[type="datetime-local"]', + 'input[type="email"]', + 'input[type="month"]', + 'input[type="number"]', + 'input[type="password"]', + 'input[type="search"]', + 'input[type="tel"]', + 'input[type="text"]', + 'input[type="time"]', + 'input[type="url"]', + 'input[type="week"]', + 'input:not([type])', + 'textarea'; + +$all-text-inputs: assign-inputs($text-inputs-list); +$all-text-inputs-active: assign-inputs($text-inputs-list, active); +$all-text-inputs-focus: assign-inputs($text-inputs-list, focus); +$all-text-inputs-hover: assign-inputs($text-inputs-list, hover); diff --git a/scss/lib/addons/_timing-functions.scss b/scss/lib/addons/_timing-functions.scss new file mode 100644 index 000000000..20e5f1d40 --- /dev/null +++ b/scss/lib/addons/_timing-functions.scss @@ -0,0 +1,34 @@ +@charset "UTF-8"; + +/// CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie) +/// +/// Timing functions are the same as demoed here: http://jqueryui.com/resources/demos/effect/easing.html +/// +/// @type cubic-bezier + +$ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530); +$ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190); +$ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220); +$ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060); +$ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715); +$ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035); +$ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335); +$ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045); + +$ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940); +$ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000); +$ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000); +$ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000); +$ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000); +$ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000); +$ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000); +$ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275); + +$ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955); +$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000); +$ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000); +$ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000); +$ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950); +$ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000); +$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860); +$ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550); diff --git a/scss/lib/addons/_triangle.scss b/scss/lib/addons/_triangle.scss new file mode 100644 index 000000000..8a1ed9cd0 --- /dev/null +++ b/scss/lib/addons/_triangle.scss @@ -0,0 +1,63 @@ +@mixin triangle($size, $color, $direction) { + $width: nth($size, 1); + $height: nth($size, length($size)); + $foreground-color: nth($color, 1); + $background-color: if(length($color) == 2, nth($color, 2), transparent); + height: 0; + width: 0; + + @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) { + $width: $width / 2; + $height: if(length($size) > 1, $height, $height/2); + + @if $direction == up { + border-bottom: $height solid $foreground-color; + border-left: $width solid $background-color; + border-right: $width solid $background-color; + } @else if $direction == right { + border-bottom: $width solid $background-color; + border-left: $height solid $foreground-color; + border-top: $width solid $background-color; + } @else if $direction == down { + border-left: $width solid $background-color; + border-right: $width solid $background-color; + border-top: $height solid $foreground-color; + } @else if $direction == left { + border-bottom: $width solid $background-color; + border-right: $height solid $foreground-color; + border-top: $width solid $background-color; + } + } @else if ($direction == up-right) or ($direction == up-left) { + border-top: $height solid $foreground-color; + + @if $direction == up-right { + border-left: $width solid $background-color; + } @else if $direction == up-left { + border-right: $width solid $background-color; + } + } @else if ($direction == down-right) or ($direction == down-left) { + border-bottom: $height solid $foreground-color; + + @if $direction == down-right { + border-left: $width solid $background-color; + } @else if $direction == down-left { + border-right: $width solid $background-color; + } + } @else if ($direction == inset-up) { + border-color: $background-color $background-color $foreground-color; + border-style: solid; + border-width: $height $width; + } @else if ($direction == inset-down) { + border-color: $foreground-color $background-color $background-color; + border-style: solid; + border-width: $height $width; + } @else if ($direction == inset-right) { + border-color: $background-color $background-color $background-color $foreground-color; + border-style: solid; + border-width: $width $height; + } @else if ($direction == inset-left) { + border-color: $background-color $foreground-color $background-color $background-color; + border-style: solid; + border-width: $width $height; + } +} diff --git a/scss/lib/addons/_word-wrap.scss b/scss/lib/addons/_word-wrap.scss new file mode 100644 index 000000000..64856a925 --- /dev/null +++ b/scss/lib/addons/_word-wrap.scss @@ -0,0 +1,29 @@ +@charset "UTF-8"; + +/// Provides an easy way to change the `word-wrap` property. +/// +/// @param {String} $wrap [break-word] +/// Value for the `word-break` property. +/// +/// @example scss - Usage +/// .wrapper { +/// @include word-wrap(break-word); +/// } +/// +/// @example css - CSS Output +/// .wrapper { +/// overflow-wrap: break-word; +/// word-break: break-all; +/// word-wrap: break-word; +/// } + +@mixin word-wrap($wrap: break-word) { + overflow-wrap: $wrap; + word-wrap: $wrap; + + @if $wrap == break-word { + word-break: break-all; + } @else { + word-break: $wrap; + } +} diff --git a/scss/lib/css3/_animation.scss b/scss/lib/css3/_animation.scss new file mode 100644 index 000000000..aac675f5a --- /dev/null +++ b/scss/lib/css3/_animation.scss @@ -0,0 +1,43 @@ +// http://www.w3.org/TR/css3-animations/#the-animation-name-property- +// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties. + +@mixin animation($animations...) { + @include prefixer(animation, $animations, webkit moz spec); +} + +@mixin animation-name($names...) { + @include prefixer(animation-name, $names, webkit moz spec); +} + +@mixin animation-duration($times...) { + @include prefixer(animation-duration, $times, webkit moz spec); +} + +@mixin animation-timing-function($motions...) { + // ease | linear | ease-in | ease-out | ease-in-out + @include prefixer(animation-timing-function, $motions, webkit moz spec); +} + +@mixin animation-iteration-count($values...) { + // infinite | + @include prefixer(animation-iteration-count, $values, webkit moz spec); +} + +@mixin animation-direction($directions...) { + // normal | alternate + @include prefixer(animation-direction, $directions, webkit moz spec); +} + +@mixin animation-play-state($states...) { + // running | paused + @include prefixer(animation-play-state, $states, webkit moz spec); +} + +@mixin animation-delay($times...) { + @include prefixer(animation-delay, $times, webkit moz spec); +} + +@mixin animation-fill-mode($modes...) { + // none | forwards | backwards | both + @include prefixer(animation-fill-mode, $modes, webkit moz spec); +} diff --git a/scss/lib/css3/_appearance.scss b/scss/lib/css3/_appearance.scss new file mode 100644 index 000000000..abddc0204 --- /dev/null +++ b/scss/lib/css3/_appearance.scss @@ -0,0 +1,3 @@ +@mixin appearance($value) { + @include prefixer(appearance, $value, webkit moz ms o spec); +} diff --git a/scss/lib/css3/_backface-visibility.scss b/scss/lib/css3/_backface-visibility.scss new file mode 100644 index 000000000..fc68e2dd0 --- /dev/null +++ b/scss/lib/css3/_backface-visibility.scss @@ -0,0 +1,3 @@ +@mixin backface-visibility($visibility) { + @include prefixer(backface-visibility, $visibility, webkit spec); +} diff --git a/scss/lib/css3/_background-image.scss b/scss/lib/css3/_background-image.scss new file mode 100644 index 000000000..6ed19ab58 --- /dev/null +++ b/scss/lib/css3/_background-image.scss @@ -0,0 +1,42 @@ +//************************************************************************// +// Background-image property for adding multiple background images with +// gradients, or for stringing multiple gradients together. +//************************************************************************// + +@mixin background-image($images...) { + $webkit-images: (); + $spec-images: (); + + @each $image in $images { + $webkit-image: (); + $spec-image: (); + + @if (type-of($image) == string) { + $url-str: str-slice($image, 1, 3); + $gradient-type: str-slice($image, 1, 6); + + @if $url-str == "url" { + $webkit-image: $image; + $spec-image: $image; + } + + @else if $gradient-type == "linear" { + $gradients: _linear-gradient-parser($image); + $webkit-image: map-get($gradients, webkit-image); + $spec-image: map-get($gradients, spec-image); + } + + @else if $gradient-type == "radial" { + $gradients: _radial-gradient-parser($image); + $webkit-image: map-get($gradients, webkit-image); + $spec-image: map-get($gradients, spec-image); + } + } + + $webkit-images: append($webkit-images, $webkit-image, comma); + $spec-images: append($spec-images, $spec-image, comma); + } + + background-image: $webkit-images; + background-image: $spec-images; +} diff --git a/scss/lib/css3/_background.scss b/scss/lib/css3/_background.scss new file mode 100644 index 000000000..019db0ed3 --- /dev/null +++ b/scss/lib/css3/_background.scss @@ -0,0 +1,55 @@ +//************************************************************************// +// Background property for adding multiple backgrounds using shorthand +// notation. +//************************************************************************// + +@mixin background($backgrounds...) { + $webkit-backgrounds: (); + $spec-backgrounds: (); + + @each $background in $backgrounds { + $webkit-background: (); + $spec-background: (); + $background-type: type-of($background); + + @if $background-type == string or $background-type == list { + $background-str: if($background-type == list, nth($background, 1), $background); + + $url-str: str-slice($background-str, 1, 3); + $gradient-type: str-slice($background-str, 1, 6); + + @if $url-str == "url" { + $webkit-background: $background; + $spec-background: $background; + } + + @else if $gradient-type == "linear" { + $gradients: _linear-gradient-parser("#{$background}"); + $webkit-background: map-get($gradients, webkit-image); + $spec-background: map-get($gradients, spec-image); + } + + @else if $gradient-type == "radial" { + $gradients: _radial-gradient-parser("#{$background}"); + $webkit-background: map-get($gradients, webkit-image); + $spec-background: map-get($gradients, spec-image); + } + + @else { + $webkit-background: $background; + $spec-background: $background; + } + } + + @else { + $webkit-background: $background; + $spec-background: $background; + } + + $webkit-backgrounds: append($webkit-backgrounds, $webkit-background, comma); + $spec-backgrounds: append($spec-backgrounds, $spec-background, comma); + } + + background: $webkit-backgrounds; + background: $spec-backgrounds; +} diff --git a/scss/lib/css3/_border-image.scss b/scss/lib/css3/_border-image.scss new file mode 100644 index 000000000..cf568ce6d --- /dev/null +++ b/scss/lib/css3/_border-image.scss @@ -0,0 +1,59 @@ +@mixin border-image($borders...) { + $webkit-borders: (); + $spec-borders: (); + + @each $border in $borders { + $webkit-border: (); + $spec-border: (); + $border-type: type-of($border); + + @if $border-type == string or list { + $border-str: if($border-type == list, nth($border, 1), $border); + + $url-str: str-slice($border-str, 1, 3); + $gradient-type: str-slice($border-str, 1, 6); + + @if $url-str == "url" { + $webkit-border: $border; + $spec-border: $border; + } + + @else if $gradient-type == "linear" { + $gradients: _linear-gradient-parser("#{$border}"); + $webkit-border: map-get($gradients, webkit-image); + $spec-border: map-get($gradients, spec-image); + } + + @else if $gradient-type == "radial" { + $gradients: _radial-gradient-parser("#{$border}"); + $webkit-border: map-get($gradients, webkit-image); + $spec-border: map-get($gradients, spec-image); + } + + @else { + $webkit-border: $border; + $spec-border: $border; + } + } + + @else { + $webkit-border: $border; + $spec-border: $border; + } + + $webkit-borders: append($webkit-borders, $webkit-border, comma); + $spec-borders: append($spec-borders, $spec-border, comma); + } + + -webkit-border-image: $webkit-borders; + border-image: $spec-borders; + border-style: solid; +} + +//Examples: +// @include border-image(url("image.png")); +// @include border-image(url("image.png") 20 stretch); +// @include border-image(linear-gradient(45deg, orange, yellow)); +// @include border-image(linear-gradient(45deg, orange, yellow) stretch); +// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round); +// @include border-image(radial-gradient(top, cover, orange, yellow, orange)); diff --git a/scss/lib/css3/_calc.scss b/scss/lib/css3/_calc.scss new file mode 100644 index 000000000..0bfc738dd --- /dev/null +++ b/scss/lib/css3/_calc.scss @@ -0,0 +1,4 @@ +@mixin calc($property, $value) { + #{$property}: -webkit-calc(#{$value}); + #{$property}: calc(#{$value}); +} diff --git a/scss/lib/css3/_columns.scss b/scss/lib/css3/_columns.scss new file mode 100644 index 000000000..96117670c --- /dev/null +++ b/scss/lib/css3/_columns.scss @@ -0,0 +1,47 @@ +@mixin columns($arg: auto) { + // || + @include prefixer(columns, $arg, webkit moz spec); +} + +@mixin column-count($int: auto) { + // auto || integer + @include prefixer(column-count, $int, webkit moz spec); +} + +@mixin column-gap($length: normal) { + // normal || length + @include prefixer(column-gap, $length, webkit moz spec); +} + +@mixin column-fill($arg: auto) { + // auto || length + @include prefixer(column-fill, $arg, webkit moz spec); +} + +@mixin column-rule($arg) { + // || || + @include prefixer(column-rule, $arg, webkit moz spec); +} + +@mixin column-rule-color($color) { + @include prefixer(column-rule-color, $color, webkit moz spec); +} + +@mixin column-rule-style($style: none) { + // none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid + @include prefixer(column-rule-style, $style, webkit moz spec); +} + +@mixin column-rule-width ($width: none) { + @include prefixer(column-rule-width, $width, webkit moz spec); +} + +@mixin column-span($arg: none) { + // none || all + @include prefixer(column-span, $arg, webkit moz spec); +} + +@mixin column-width($length: auto) { + // auto || length + @include prefixer(column-width, $length, webkit moz spec); +} diff --git a/scss/lib/css3/_filter.scss b/scss/lib/css3/_filter.scss new file mode 100644 index 000000000..b8f8ffb0e --- /dev/null +++ b/scss/lib/css3/_filter.scss @@ -0,0 +1,4 @@ +@mixin filter($function: none) { + // [ + @include prefixer(perspective, $depth, webkit moz spec); +} + +@mixin perspective-origin($value: 50% 50%) { + @include prefixer(perspective-origin, $value, webkit moz spec); +} diff --git a/scss/lib/css3/_placeholder.scss b/scss/lib/css3/_placeholder.scss new file mode 100644 index 000000000..5682fd097 --- /dev/null +++ b/scss/lib/css3/_placeholder.scss @@ -0,0 +1,8 @@ +@mixin placeholder { + $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input"; + @each $placeholder in $placeholders { + &:#{$placeholder}-placeholder { + @content; + } + } +} diff --git a/scss/lib/css3/_radial-gradient.scss b/scss/lib/css3/_radial-gradient.scss new file mode 100644 index 000000000..18f7b5b58 --- /dev/null +++ b/scss/lib/css3/_radial-gradient.scss @@ -0,0 +1,39 @@ +// Requires Sass 3.1+ +@mixin radial-gradient($g1, $g2, + $g3: null, $g4: null, + $g5: null, $g6: null, + $g7: null, $g8: null, + $g9: null, $g10: null, + $pos: null, + $shape-size: null, + $fallback: null) { + + $data: _radial-arg-parser($g1, $g2, $pos, $shape-size); + $g1: nth($data, 1); + $g2: nth($data, 2); + $pos: nth($data, 3); + $shape-size: nth($data, 4); + + $full: $g1, $g2, $g3, $g4, $g5, $g6, $g7, $g8, $g9, $g10; + + // Strip deprecated cover/contain for spec + $shape-size-spec: _shape-size-stripper($shape-size); + + // Set $g1 as the default fallback color + $first-color: nth($full, 1); + $fallback-color: nth($first-color, 1); + + @if (type-of($fallback) == color) or ($fallback == "transparent") { + $fallback-color: $fallback; + } + + // Add Commas and spaces + $shape-size: if($shape-size, "#{$shape-size}, ", null); + $pos: if($pos, "#{$pos}, ", null); + $pos-spec: if($pos, "at #{$pos}", null); + $shape-size-spec: if(($shape-size-spec != " ") and ($pos == null), "#{$shape-size-spec}, ", "#{$shape-size-spec} "); + + background-color: $fallback-color; + background-image: -webkit-radial-gradient(#{$pos}#{$shape-size}#{$full}); + background-image: radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full}); +} diff --git a/scss/lib/css3/_selection.scss b/scss/lib/css3/_selection.scss new file mode 100644 index 000000000..23303ab55 --- /dev/null +++ b/scss/lib/css3/_selection.scss @@ -0,0 +1,42 @@ +@charset "UTF-8"; + +/// Outputs the spec and prefixed versions of the `::selection` pseudo-element. +/// +/// @param {Bool} $current-selector [false] +/// If set to `true`, it takes the current element into consideration. +/// +/// @example scss - Usage +/// .element { +/// @include selection(true) { +/// background-color: #ffbb52; +/// } +/// } +/// +/// @example css - CSS Output +/// .element::-moz-selection { +/// background-color: #ffbb52; +/// } +/// +/// .element::selection { +/// background-color: #ffbb52; +/// } + +@mixin selection($current-selector: false) { + @if $current-selector { + &::-moz-selection { + @content; + } + + &::selection { + @content; + } + } @else { + ::-moz-selection { + @content; + } + + ::selection { + @content; + } + } +} diff --git a/scss/lib/css3/_text-decoration.scss b/scss/lib/css3/_text-decoration.scss new file mode 100644 index 000000000..9222746ce --- /dev/null +++ b/scss/lib/css3/_text-decoration.scss @@ -0,0 +1,19 @@ +@mixin text-decoration($value) { +// || || + @include prefixer(text-decoration, $value, moz); +} + +@mixin text-decoration-line($line: none) { +// none || underline || overline || line-through + @include prefixer(text-decoration-line, $line, moz); +} + +@mixin text-decoration-style($style: solid) { +// solid || double || dotted || dashed || wavy + @include prefixer(text-decoration-style, $style, moz webkit); +} + +@mixin text-decoration-color($color: currentColor) { +// currentColor || + @include prefixer(text-decoration-color, $color, moz); +} diff --git a/scss/lib/css3/_transform.scss b/scss/lib/css3/_transform.scss new file mode 100644 index 000000000..8ee6509ff --- /dev/null +++ b/scss/lib/css3/_transform.scss @@ -0,0 +1,15 @@ +@mixin transform($property: none) { + // none | + @include prefixer(transform, $property, webkit moz ms o spec); +} + +@mixin transform-origin($axes: 50%) { + // x-axis - left | center | right | length | % + // y-axis - top | center | bottom | length | % + // z-axis - length + @include prefixer(transform-origin, $axes, webkit moz ms o spec); +} + +@mixin transform-style($style: flat) { + @include prefixer(transform-style, $style, webkit moz ms o spec); +} diff --git a/scss/lib/css3/_transition.scss b/scss/lib/css3/_transition.scss new file mode 100644 index 000000000..3c785ed52 --- /dev/null +++ b/scss/lib/css3/_transition.scss @@ -0,0 +1,71 @@ +// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable. +// Example: @include transition (all 2s ease-in-out); +// @include transition (opacity 1s ease-in 2s, width 2s ease-out); +// @include transition-property (transform, opacity); + +@mixin transition($properties...) { + // Fix for vendor-prefix transform property + $needs-prefixes: false; + $webkit: (); + $moz: (); + $spec: (); + + // Create lists for vendor-prefixed transform + @each $list in $properties { + @if nth($list, 1) == "transform" { + $needs-prefixes: true; + $list1: -webkit-transform; + $list2: -moz-transform; + $list3: (); + + @each $var in $list { + $list3: join($list3, $var); + + @if $var != "transform" { + $list1: join($list1, $var); + $list2: join($list2, $var); + } + } + + $webkit: append($webkit, $list1); + $moz: append($moz, $list2); + $spec: append($spec, $list3); + } @else { + $webkit: append($webkit, $list, comma); + $moz: append($moz, $list, comma); + $spec: append($spec, $list, comma); + } + } + + @if $needs-prefixes { + -webkit-transition: $webkit; + -moz-transition: $moz; + transition: $spec; + } @else { + @if length($properties) >= 1 { + @include prefixer(transition, $properties, webkit moz spec); + } @else { + $properties: all 0.15s ease-out 0s; + @include prefixer(transition, $properties, webkit moz spec); + } + } +} + +@mixin transition-property($properties...) { + -webkit-transition-property: transition-property-names($properties, "webkit"); + -moz-transition-property: transition-property-names($properties, "moz"); + transition-property: transition-property-names($properties, false); +} + +@mixin transition-duration($times...) { + @include prefixer(transition-duration, $times, webkit moz spec); +} + +@mixin transition-timing-function($motions...) { + // ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier() + @include prefixer(transition-timing-function, $motions, webkit moz spec); +} + +@mixin transition-delay($times...) { + @include prefixer(transition-delay, $times, webkit moz spec); +} diff --git a/scss/lib/css3/_user-select.scss b/scss/lib/css3/_user-select.scss new file mode 100644 index 000000000..d4e555100 --- /dev/null +++ b/scss/lib/css3/_user-select.scss @@ -0,0 +1,3 @@ +@mixin user-select($value: none) { + @include prefixer(user-select, $value, webkit moz ms spec); +} diff --git a/scss/lib/functions/_assign-inputs.scss b/scss/lib/functions/_assign-inputs.scss new file mode 100644 index 000000000..f8aba9678 --- /dev/null +++ b/scss/lib/functions/_assign-inputs.scss @@ -0,0 +1,11 @@ +@function assign-inputs($inputs, $pseudo: null) { + $list: (); + + @each $input in $inputs { + $input: unquote($input); + $input: if($pseudo, $input + ":" + $pseudo, $input); + $list: append($list, $input, comma); + } + + @return $list; +} diff --git a/scss/lib/functions/_contains-falsy.scss b/scss/lib/functions/_contains-falsy.scss new file mode 100644 index 000000000..c096fdb92 --- /dev/null +++ b/scss/lib/functions/_contains-falsy.scss @@ -0,0 +1,20 @@ +@charset "UTF-8"; + +/// Checks if a list does not contains a value. +/// +/// @access private +/// +/// @param {List} $list +/// The list to check against. +/// +/// @return {Bool} + +@function contains-falsy($list) { + @each $item in $list { + @if not $item { + @return true; + } + } + + @return false; +} diff --git a/scss/lib/functions/_contains.scss b/scss/lib/functions/_contains.scss new file mode 100644 index 000000000..3dec27db8 --- /dev/null +++ b/scss/lib/functions/_contains.scss @@ -0,0 +1,26 @@ +@charset "UTF-8"; + +/// Checks if a list contains a value(s). +/// +/// @access private +/// +/// @param {List} $list +/// The list to check against. +/// +/// @param {List} $values +/// A single value or list of values to check for. +/// +/// @example scss - Usage +/// contains($list, $value) +/// +/// @return {Bool} + +@function contains($list, $values...) { + @each $value in $values { + @if type-of(index($list, $value)) != "number" { + @return false; + } + } + + @return true; +} diff --git a/scss/lib/functions/_is-length.scss b/scss/lib/functions/_is-length.scss new file mode 100644 index 000000000..5826e789b --- /dev/null +++ b/scss/lib/functions/_is-length.scss @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +/// Checks for a valid CSS length. +/// +/// @param {String} $value + +@function is-length($value) { + @return type-of($value) != "null" and (str-slice($value + "", 1, 4) == "calc" + or index(auto inherit initial 0, $value) + or (type-of($value) == "number" and not(unitless($value)))); +} diff --git a/scss/lib/functions/_is-light.scss b/scss/lib/functions/_is-light.scss new file mode 100644 index 000000000..92d90ac3c --- /dev/null +++ b/scss/lib/functions/_is-light.scss @@ -0,0 +1,21 @@ +@charset "UTF-8"; + +/// Programatically determines whether a color is light or dark. +/// +/// @link http://robots.thoughtbot.com/closer-look-color-lightness +/// +/// @param {Color (Hex)} $color +/// +/// @example scss - Usage +/// is-light($color) +/// +/// @return {Bool} + +@function is-light($hex-color) { + $-local-red: red(rgba($hex-color, 1)); + $-local-green: green(rgba($hex-color, 1)); + $-local-blue: blue(rgba($hex-color, 1)); + $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255; + + @return $-local-lightness > 0.6; +} diff --git a/scss/lib/functions/_is-number.scss b/scss/lib/functions/_is-number.scss new file mode 100644 index 000000000..a64e0bf21 --- /dev/null +++ b/scss/lib/functions/_is-number.scss @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +/// Checks for a valid number. +/// +/// @param {Number} $value +/// +/// @require {function} contains + +@function is-number($value) { + @return contains("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" 0 1 2 3 4 5 6 7 8 9, $value); +} diff --git a/scss/lib/functions/_is-size.scss b/scss/lib/functions/_is-size.scss new file mode 100644 index 000000000..661789ab4 --- /dev/null +++ b/scss/lib/functions/_is-size.scss @@ -0,0 +1,13 @@ +@charset "UTF-8"; + +/// Checks for a valid CSS size. +/// +/// @param {String} $value +/// +/// @require {function} contains +/// @require {function} is-length + +@function is-size($value) { + @return is-length($value) + or contains("fill" "fit-content" "min-content" "max-content", $value); +} diff --git a/scss/lib/functions/_modular-scale.scss b/scss/lib/functions/_modular-scale.scss new file mode 100644 index 000000000..20fa38812 --- /dev/null +++ b/scss/lib/functions/_modular-scale.scss @@ -0,0 +1,69 @@ +// Scaling Variables +$golden: 1.618; +$minor-second: 1.067; +$major-second: 1.125; +$minor-third: 1.2; +$major-third: 1.25; +$perfect-fourth: 1.333; +$augmented-fourth: 1.414; +$perfect-fifth: 1.5; +$minor-sixth: 1.6; +$major-sixth: 1.667; +$minor-seventh: 1.778; +$major-seventh: 1.875; +$octave: 2; +$major-tenth: 2.5; +$major-eleventh: 2.667; +$major-twelfth: 3; +$double-octave: 4; + +$modular-scale-ratio: $perfect-fourth !default; +$modular-scale-base: em($em-base) !default; + +@function modular-scale($increment, $value: $modular-scale-base, $ratio: $modular-scale-ratio) { + $v1: nth($value, 1); + $v2: nth($value, length($value)); + $value: $v1; + + // scale $v2 to just above $v1 + @while $v2 > $v1 { + $v2: ($v2 / $ratio); // will be off-by-1 + } + @while $v2 < $v1 { + $v2: ($v2 * $ratio); // will fix off-by-1 + } + + // check AFTER scaling $v2 to prevent double-counting corner-case + $double-stranded: $v2 > $v1; + + @if $increment > 0 { + @for $i from 1 through $increment { + @if $double-stranded and ($v1 * $ratio) > $v2 { + $value: $v2; + $v2: ($v2 * $ratio); + } @else { + $v1: ($v1 * $ratio); + $value: $v1; + } + } + } + + @if $increment < 0 { + // adjust $v2 to just below $v1 + @if $double-stranded { + $v2: ($v2 / $ratio); + } + + @for $i from $increment through -1 { + @if $double-stranded and ($v1 / $ratio) < $v2 { + $value: $v2; + $v2: ($v2 / $ratio); + } @else { + $v1: ($v1 / $ratio); + $value: $v1; + } + } + } + + @return $value; +} diff --git a/scss/lib/functions/_new-breakpoint.scss b/scss/lib/functions/_new-breakpoint.scss new file mode 100644 index 000000000..41ab95564 --- /dev/null +++ b/scss/lib/functions/_new-breakpoint.scss @@ -0,0 +1,49 @@ +@charset "UTF-8"; + +/// Returns a media context (media query / grid context) that can be stored in a variable and passed to `media()` as a single-keyword argument. Media contexts defined using `new-breakpoint` are used by the visual grid, as long as they are defined before importing Neat. +/// +/// @param {List} $query +/// A list of media query features and values. Each `$feature` should have a corresponding `$value`. +/// +/// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. +/// +/// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). +/// +/// @param {Number (unitless)} $total-columns [$grid-columns] +/// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. +/// +/// @example scss - Usage +/// $mobile: new-breakpoint(max-width 480px 4); +/// +/// .element { +/// @include media($mobile) { +/// @include span-columns(4); +/// } +/// } +/// +/// @example css - CSS Output +/// @media screen and (max-width: 480px) { +/// .element { +/// display: block; +/// float: left; +/// margin-right: 7.42297%; +/// width: 100%; +/// } +/// .element:last-child { +/// margin-right: 0; +/// } +/// } + +@function new-breakpoint($query: $feature $value $columns, $total-columns: $grid-columns) { + @if length($query) == 1 { + $query: $default-feature nth($query, 1) $total-columns; + } @else if is-even(length($query)) { + $query: append($query, $total-columns); + } + + @if is-not(belongs-to($query, $visual-grid-breakpoints)) { + $visual-grid-breakpoints: append($visual-grid-breakpoints, $query, comma) !global; + } + + @return $query; +} diff --git a/scss/lib/functions/_private.scss b/scss/lib/functions/_private.scss new file mode 100644 index 000000000..872d4dc58 --- /dev/null +++ b/scss/lib/functions/_private.scss @@ -0,0 +1,114 @@ +// Not function for Libsass compatibility +// https://github.com/sass/libsass/issues/368 +@function is-not($value) { + @return if($value, false, true); +} + +// Checks if a number is even +@function is-even($int) { + @return $int % 2 == 0; +} + +// Checks if an element belongs to a list or not +@function belongs-to($tested-item, $list) { + @return is-not(not-belongs-to($tested-item, $list)); +} + +@function not-belongs-to($tested-item, $list) { + @return is-not(index($list, $tested-item)); +} + +// Contains display value +@function contains-display-value($query) { + @return belongs-to(table, $query) + or belongs-to(block, $query) + or belongs-to(inline-block, $query) + or belongs-to(inline, $query); +} + +// Parses the first argument of span-columns() +@function container-span($span: $span) { + @if length($span) == 3 { + $container-columns: nth($span, 3); + @return $container-columns; + } @else if length($span) == 2 { + $container-columns: nth($span, 2); + @return $container-columns; + } + + @return $grid-columns; +} + +@function container-shift($shift: $shift) { + $parent-columns: $grid-columns !default !global; + + @if length($shift) == 3 { + $container-columns: nth($shift, 3); + @return $container-columns; + } @else if length($shift) == 2 { + $container-columns: nth($shift, 2); + @return $container-columns; + } + + @return $parent-columns; +} + +// Generates a striped background +@function gradient-stops($grid-columns, $color: $visual-grid-color) { + $transparent: transparent; + + $column-width: flex-grid(1, $grid-columns); + $gutter-width: flex-gutter($grid-columns); + $column-offset: $column-width; + + $values: ($transparent 0, $color 0); + + @for $i from 1 to $grid-columns*2 { + @if is-even($i) { + $values: append($values, $transparent $column-offset, comma); + $values: append($values, $color $column-offset, comma); + $column-offset: $column-offset + $column-width; + } @else { + $values: append($values, $color $column-offset, comma); + $values: append($values, $transparent $column-offset, comma); + $column-offset: $column-offset + $gutter-width; + } + } + + @return $values; +} + +// Layout direction +@function get-direction($layout, $default) { + $direction: null; + + @if to-upper-case($layout) == "LTR" or to-upper-case($layout) == "RTL" { + $direction: direction-from-layout($layout); + } @else { + $direction: direction-from-layout($default); + } + + @return $direction; +} + +@function direction-from-layout($layout) { + $direction: null; + + @if to-upper-case($layout) == "LTR" { + $direction: right; + } @else { + $direction: left; + } + + @return $direction; +} + +@function get-opposite-direction($direction) { + $opposite-direction: left; + + @if $direction == "left" { + $opposite-direction: right; + } + + @return $opposite-direction; +} diff --git a/scss/lib/functions/_px-to-em.scss b/scss/lib/functions/_px-to-em.scss new file mode 100644 index 000000000..ae81a44ad --- /dev/null +++ b/scss/lib/functions/_px-to-em.scss @@ -0,0 +1,13 @@ +// Convert pixels to ems +// eg. for a relational value of 12px write em(12) when the parent is 16px +// if the parent is another value say 24px write em(12, 24) + +@function em($pxval, $base: $em-base) { + @if not unitless($pxval) { + $pxval: strip-units($pxval); + } + @if not unitless($base) { + $base: strip-units($base); + } + @return ($pxval / $base) * 1em; +} diff --git a/scss/lib/functions/_px-to-rem.scss b/scss/lib/functions/_px-to-rem.scss new file mode 100644 index 000000000..0ac941e76 --- /dev/null +++ b/scss/lib/functions/_px-to-rem.scss @@ -0,0 +1,15 @@ +// Convert pixels to rems +// eg. for a relational value of 12px write rem(12) +// Assumes $em-base is the font-size of + +@function rem($pxval) { + @if not unitless($pxval) { + $pxval: strip-units($pxval); + } + + $base: $em-base; + @if not unitless($base) { + $base: strip-units($base); + } + @return ($pxval / $base) * 1rem; +} diff --git a/scss/lib/functions/_shade.scss b/scss/lib/functions/_shade.scss new file mode 100644 index 000000000..8aaf2c6d2 --- /dev/null +++ b/scss/lib/functions/_shade.scss @@ -0,0 +1,24 @@ +@charset "UTF-8"; + +/// Mixes a color with black. +/// +/// @param {Color} $color +/// +/// @param {Number (Percentage)} $percent +/// The amount of black to be mixed in. +/// +/// @example scss - Usage +/// .element { +/// background-color: shade(#ffbb52, 60%); +/// } +/// +/// @example css - CSS Output +/// .element { +/// background-color: #664a20; +/// } +/// +/// @return {Color} + +@function shade($color, $percent) { + @return mix(#000, $color, $percent); +} diff --git a/scss/lib/functions/_strip-units.scss b/scss/lib/functions/_strip-units.scss new file mode 100644 index 000000000..6c5f3e810 --- /dev/null +++ b/scss/lib/functions/_strip-units.scss @@ -0,0 +1,17 @@ +@charset "UTF-8"; + +/// Strips the unit from a number. +/// +/// @param {Number (With Unit)} $value +/// +/// @example scss - Usage +/// $dimension: strip-units(10em); +/// +/// @example css - CSS Output +/// $dimension: 10; +/// +/// @return {Number (Unitless)} + +@function strip-units($value) { + @return ($value / ($value * 0 + 1)); +} diff --git a/scss/lib/functions/_tint.scss b/scss/lib/functions/_tint.scss new file mode 100644 index 000000000..2e3381488 --- /dev/null +++ b/scss/lib/functions/_tint.scss @@ -0,0 +1,24 @@ +@charset "UTF-8"; + +/// Mixes a color with white. +/// +/// @param {Color} $color +/// +/// @param {Number (Percentage)} $percent +/// The amount of white to be mixed in. +/// +/// @example scss - Usage +/// .element { +/// background-color: tint(#6ecaa6, 40%); +/// } +/// +/// @example css - CSS Output +/// .element { +/// background-color: #a8dfc9; +/// } +/// +/// @return {Color} + +@function tint($color, $percent) { + @return mix(#fff, $color, $percent); +} diff --git a/scss/lib/functions/_transition-property-name.scss b/scss/lib/functions/_transition-property-name.scss new file mode 100644 index 000000000..18348b93a --- /dev/null +++ b/scss/lib/functions/_transition-property-name.scss @@ -0,0 +1,22 @@ +// Return vendor-prefixed property names if appropriate +// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background +//************************************************************************// +@function transition-property-names($props, $vendor: false) { + $new-props: (); + + @each $prop in $props { + $new-props: append($new-props, transition-property-name($prop, $vendor), comma); + } + + @return $new-props; +} + +@function transition-property-name($prop, $vendor: false) { + // put other properties that need to be prefixed here aswell + @if $vendor and $prop == transform { + @return unquote('-'+$vendor+'-'+$prop); + } + @else { + @return $prop; + } +} diff --git a/scss/lib/functions/_unpack.scss b/scss/lib/functions/_unpack.scss new file mode 100644 index 000000000..4367935d5 --- /dev/null +++ b/scss/lib/functions/_unpack.scss @@ -0,0 +1,27 @@ +@charset "UTF-8"; + +/// Converts shorthand to the 4-value syntax. +/// +/// @param {List} $shorthand +/// +/// @example scss - Usage +/// .element { +/// margin: unpack(1em 2em); +/// } +/// +/// @example css - CSS Output +/// .element { +/// margin: 1em 2em 1em 2em; +/// } + +@function unpack($shorthand) { + @if length($shorthand) == 1 { + @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1); + } @else if length($shorthand) == 2 { + @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2); + } @else if length($shorthand) == 3 { + @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2); + } @else { + @return $shorthand; + } +} diff --git a/scss/lib/grid/_box-sizing.scss b/scss/lib/grid/_box-sizing.scss new file mode 100644 index 000000000..b6d3fec33 --- /dev/null +++ b/scss/lib/grid/_box-sizing.scss @@ -0,0 +1,15 @@ +@charset "UTF-8"; + +@if $border-box-sizing == true { + html { // http://bit.ly/1qk2tVR + box-sizing: border-box; + } + + * { + &, + &::after, + &::before { + box-sizing: inherit; + } + } +} diff --git a/scss/lib/grid/_direction-context.scss b/scss/lib/grid/_direction-context.scss new file mode 100644 index 000000000..7b0d46e8b --- /dev/null +++ b/scss/lib/grid/_direction-context.scss @@ -0,0 +1,33 @@ +@charset "UTF-8"; + +/// Changes the direction property used by other mixins called in the code block argument. +/// +/// @param {String} $direction [left-to-right] +/// Layout direction to be used within the block. Can be `left-to-right` or `right-to-left`. +/// +/// @example scss - Usage +/// @include direction-context(right-to-left) { +/// .right-to-left-block { +/// @include span-columns(6); +/// } +/// } +/// +/// @example css - CSS Output +/// .right-to-left-block { +/// float: right; +/// ... +/// } + +@mixin direction-context($direction: left-to-right) { + $scope-direction: $layout-direction; + + @if to-lower-case($direction) == "left-to-right" { + $layout-direction: LTR !global; + } @else if to-lower-case($direction) == "right-to-left" { + $layout-direction: RTL !global; + } + + @content; + + $layout-direction: $scope-direction !global; +} diff --git a/scss/lib/grid/_display-context.scss b/scss/lib/grid/_display-context.scss new file mode 100644 index 000000000..ed9b0637d --- /dev/null +++ b/scss/lib/grid/_display-context.scss @@ -0,0 +1,28 @@ +@charset "UTF-8"; + +/// Changes the display property used by other mixins called in the code block argument. +/// +/// @param {String} $display [block] +/// Display value to be used within the block. Can be `table` or `block`. +/// +/// @example scss +/// @include display-context(table) { +/// .display-table { +/// @include span-columns(6); +/// } +/// } +/// +/// @example css +/// .display-table { +/// display: table-cell; +/// ... +/// } + +@mixin display-context($display: block) { + $scope-display: $container-display-table; + $container-display-table: $display == table !global; + + @content; + + $container-display-table: $scope-display !global; +} diff --git a/scss/lib/grid/_fill-parent.scss b/scss/lib/grid/_fill-parent.scss new file mode 100644 index 000000000..415f0b1e5 --- /dev/null +++ b/scss/lib/grid/_fill-parent.scss @@ -0,0 +1,22 @@ +@charset "UTF-8"; + +/// Forces the element to fill its parent container. +/// +/// @example scss - Usage +/// .element { +/// @include fill-parent; +/// } +/// +/// @example css - CSS Output +/// .element { +/// width: 100%; +/// box-sizing: border-box; +/// } + +@mixin fill-parent() { + width: 100%; + + @if $border-box-sizing == false { + box-sizing: border-box; + } +} diff --git a/scss/lib/grid/_media.scss b/scss/lib/grid/_media.scss new file mode 100644 index 000000000..bd516e99a --- /dev/null +++ b/scss/lib/grid/_media.scss @@ -0,0 +1,92 @@ +@charset "UTF-8"; + +/// Outputs a media-query block with an optional grid context (the total number of columns used in the grid). +/// +/// @param {List} $query +/// A list of media query features and values, where each `$feature` should have a corresponding `$value`. +/// For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). +/// +/// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. +/// +/// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). +/// +/// +/// @param {Number (unitless)} $total-columns [$grid-columns] +/// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. +/// +/// @example scss - Usage +/// .responsive-element { +/// @include media(769px) { +/// @include span-columns(6); +/// } +/// } +/// +/// .new-context-element { +/// @include media(min-width 320px max-width 480px, 6) { +/// @include span-columns(6); +/// } +/// } +/// +/// @example css - CSS Output +/// @media screen and (min-width: 769px) { +/// .responsive-element { +/// display: block; +/// float: left; +/// margin-right: 2.35765%; +/// width: 48.82117%; +/// } +/// +/// .responsive-element:last-child { +/// margin-right: 0; +/// } +/// } +/// +/// @media screen and (min-width: 320px) and (max-width: 480px) { +/// .new-context-element { +/// display: block; +/// float: left; +/// margin-right: 4.82916%; +/// width: 100%; +/// } +/// +/// .new-context-element:last-child { +/// margin-right: 0; +/// } +/// } + +@mixin media($query: $feature $value $columns, $total-columns: $grid-columns) { + @if length($query) == 1 { + @media screen and ($default-feature: nth($query, 1)) { + $default-grid-columns: $grid-columns; + $grid-columns: $total-columns !global; + @content; + $grid-columns: $default-grid-columns !global; + } + } @else { + $loop-to: length($query); + $media-query: "screen and "; + $default-grid-columns: $grid-columns; + $grid-columns: $total-columns !global; + + @if is-not(is-even(length($query))) { + $grid-columns: nth($query, $loop-to) !global; + $loop-to: $loop-to - 1; + } + + $i: 1; + @while $i <= $loop-to { + $media-query: $media-query + "(" + nth($query, $i) + ": " + nth($query, $i + 1) + ") "; + + @if ($i + 1) != $loop-to { + $media-query: $media-query + "and "; + } + + $i: $i + 2; + } + + @media #{$media-query} { + @content; + $grid-columns: $default-grid-columns !global; + } + } +} diff --git a/scss/lib/grid/_omega.scss b/scss/lib/grid/_omega.scss new file mode 100644 index 000000000..80f918ab7 --- /dev/null +++ b/scss/lib/grid/_omega.scss @@ -0,0 +1,87 @@ +@charset "UTF-8"; + +/// Removes the element's gutter margin, regardless of its position in the grid hierarchy or display property. It can target a specific element, or every `nth-child` occurrence. Works only with `block` layouts. +/// +/// @param {List} $query [block] +/// List of arguments. Supported arguments are `nth-child` selectors (targets a specific pseudo element) and `auto` (targets `last-child`). +/// +/// When passed an `nth-child` argument of type `*n` with `block` display, the omega mixin automatically adds a clear to the `*n+1` th element. Note that composite arguments such as `2n+1` do not support this feature. +/// +/// **Deprecation warning**: The omega mixin will no longer take a `$direction` argument. To change the layout direction, use `row($direction)` or set `$default-layout-direction` instead. +/// +/// @example scss - Usage +/// .element { +/// @include omega; +/// } +/// +/// .nth-element { +/// @include omega(4n); +/// } +/// +/// @example css - CSS Output +/// .element { +/// margin-right: 0; +/// } +/// +/// .nth-element:nth-child(4n) { +/// margin-right: 0; +/// } +/// +/// .nth-element:nth-child(4n+1) { +/// clear: left; +/// } + +@mixin omega($query: block, $direction: default) { + $table: belongs-to(table, $query); + $auto: belongs-to(auto, $query); + + @if $direction != default { + @include -neat-warn("The omega mixin will no longer take a $direction argument. To change the layout direction, use the direction(){...} mixin."); + } @else { + $direction: get-direction($layout-direction, $default-layout-direction); + } + + @if $table { + @include -neat-warn("The omega mixin no longer removes padding in table layouts."); + } + + @if length($query) == 1 { + @if $auto { + &:last-child { + margin-#{$direction}: 0; + } + } + + @else if contains-display-value($query) and $table == false { + margin-#{$direction}: 0; + } + + @else { + @include nth-child($query, $direction); + } + } @else if length($query) == 2 { + @if $auto { + &:last-child { + margin-#{$direction}: 0; + } + } @else { + @include nth-child(nth($query, 1), $direction); + } + } @else { + @include -neat-warn("Too many arguments passed to the omega() mixin."); + } +} + +@mixin nth-child($query, $direction) { + $opposite-direction: get-opposite-direction($direction); + + &:nth-child(#{$query}) { + margin-#{$direction}: 0; + } + + @if type-of($query) == number and unit($query) == "n" { + &:nth-child(#{$query}+1) { + clear: $opposite-direction; + } + } +} diff --git a/scss/lib/grid/_outer-container.scss b/scss/lib/grid/_outer-container.scss new file mode 100644 index 000000000..d3f626743 --- /dev/null +++ b/scss/lib/grid/_outer-container.scss @@ -0,0 +1,34 @@ +@charset "UTF-8"; + +/// Makes an element a outer container by centering it in the viewport, clearing its floats, and setting its `max-width`. +/// Although optional, using `outer-container` is recommended. The mixin can be called on more than one element per page, as long as they are not nested. +/// +/// @param {Number [unit]} $local-max-width [$max-width] +/// Max width to be applied to the element. Can be a percentage or a measure. +/// +/// @example scss - Usage +/// .element { +/// @include outer-container(100%); +/// } +/// +/// @example css - CSS Output +/// .element { +/// max-width: 100%; +/// margin-left: auto; +/// margin-right: auto; +/// } +/// +/// .element::after { +/// clear: both; +/// content: ""; +/// display: table; +/// } + +@mixin outer-container($local-max-width: $max-width) { + @include clearfix; + max-width: $local-max-width; + margin: { + left: auto; + right: auto; + } +} diff --git a/scss/lib/grid/_pad.scss b/scss/lib/grid/_pad.scss new file mode 100644 index 000000000..d697e1b99 --- /dev/null +++ b/scss/lib/grid/_pad.scss @@ -0,0 +1,25 @@ +@charset "UTF-8"; + +/// Adds padding to the element. +/// +/// @param {List} $padding [flex-gutter()] +/// A list of padding value(s) to use. Passing `default` in the list will result in using the gutter width as a padding value. +/// +/// @example scss - Usage +/// .element { +/// @include pad(30px -20px 10px default); +/// } +/// +/// @example css - CSS Output +/// .element { +/// padding: 30px -20px 10px 2.35765%; +/// } + +@mixin pad($padding: flex-gutter()) { + $padding-list: null; + @each $value in $padding { + $value: if($value == 'default', flex-gutter(), $value); + $padding-list: join($padding-list, $value); + } + padding: $padding-list; +} diff --git a/scss/lib/grid/_private.scss b/scss/lib/grid/_private.scss new file mode 100644 index 000000000..4c4e18c17 --- /dev/null +++ b/scss/lib/grid/_private.scss @@ -0,0 +1,35 @@ +$parent-columns: $grid-columns !default; +$fg-column: $column; +$fg-gutter: $gutter; +$fg-max-columns: $grid-columns; +$container-display-table: false !default; +$layout-direction: LTR !default; + +@function flex-grid($columns, $container-columns: $fg-max-columns) { + $width: $columns * $fg-column + ($columns - 1) * $fg-gutter; + $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; + @return percentage($width / $container-width); +} + +@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) { + $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; + @return percentage($gutter / $container-width); +} + +@function grid-width($n) { + @return $n * $gw-column + ($n - 1) * $gw-gutter; +} + +@function get-parent-columns($columns) { + @if $columns != $grid-columns { + $parent-columns: $columns !global; + } @else { + $parent-columns: $grid-columns !global; + } + + @return $parent-columns; +} + +@function is-display-table($container-is-display-table, $display) { + @return $container-is-display-table == true or $display == table; +} diff --git a/scss/lib/grid/_row.scss b/scss/lib/grid/_row.scss new file mode 100644 index 000000000..4d913a925 --- /dev/null +++ b/scss/lib/grid/_row.scss @@ -0,0 +1,52 @@ +@charset "UTF-8"; + +/// Designates the element as a row of columns in the grid layout. It clears the floats on the element and sets its display property. Rows can't be nested, but there can be more than one row element—with different display properties—per layout. +/// +/// @param {String} $display [default] +/// Sets the display property of the element and the display context that will be used by its children. Can be `block` or `table`. +/// +/// @param {String} $direction [$default-layout-direction] +/// Sets the layout direction. Can be `LTR` (left-to-right) or `RTL` (right-to-left). +/// +/// @example scss - Usage +/// .element { +/// @include row(); +/// } +/// +/// @example css - CSS Output +/// .element { +/// *zoom: 1; +/// display: block; +/// } +/// +/// .element:before, .element:after { +/// content: " "; +/// display: table; +/// } +/// +/// .element:after { +/// clear: both; +/// } + +@mixin row($display: default, $direction: $default-layout-direction) { + @if $direction != $default-layout-direction { + @include -neat-warn("The $direction argument will be deprecated in future versions in favor of the direction(){...} mixin."); + } + + $layout-direction: $direction !global; + + @if $display != default { + @include -neat-warn("The $display argument will be deprecated in future versions in favor of the display(){...} mixin."); + } + + @if $display == table { + display: table; + @include fill-parent; + table-layout: fixed; + $container-display-table: true !global; + } @else { + @include clearfix; + display: block; + $container-display-table: false !global; + } +} diff --git a/scss/lib/grid/_shift.scss b/scss/lib/grid/_shift.scss new file mode 100644 index 000000000..c0f24cd8e --- /dev/null +++ b/scss/lib/grid/_shift.scss @@ -0,0 +1,50 @@ +@charset "UTF-8"; + +/// Translates an element horizontally by a number of columns. Positive arguments shift the element to the active layout direction, while negative ones shift it to the opposite direction. +/// +/// @param {Number (unitless)} $n-columns [1] +/// Number of columns by which the element shifts. +/// +/// @example scss - Usage +/// .element { +/// @include shift(-3); +/// } +/// +/// @example css - CSS output +/// .element { +/// margin-left: -25.58941%; +/// } + +@mixin shift($n-columns: 1) { + @include shift-in-context($n-columns); +} + +/// Translates an element horizontally by a number of columns, in a specific nesting context. +/// +/// @param {List} $shift +/// A list containing the number of columns to shift (`$columns`) and the number of columns of the parent element (`$container-columns`). +/// +/// The two values can be separated with any string such as `of`, `/`, etc. +/// +/// @example scss - Usage +/// .element { +/// @include shift(-3 of 6); +/// } +/// +/// @example css - CSS output +/// .element { +/// margin-left: -52.41458%; +/// } + +@mixin shift-in-context($shift: $columns of $container-columns) { + $n-columns: nth($shift, 1); + $parent-columns: container-shift($shift) !global; + + $direction: get-direction($layout-direction, $default-layout-direction); + $opposite-direction: get-opposite-direction($direction); + + margin-#{$opposite-direction}: $n-columns * flex-grid(1, $parent-columns) + $n-columns * flex-gutter($parent-columns); + + // Reset nesting context + $parent-columns: $grid-columns !global; +} diff --git a/scss/lib/grid/_span-columns.scss b/scss/lib/grid/_span-columns.scss new file mode 100644 index 000000000..a7f9b0031 --- /dev/null +++ b/scss/lib/grid/_span-columns.scss @@ -0,0 +1,94 @@ +@charset "UTF-8"; + +/// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well. +/// +/// @param {List} $span +/// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional). +/// +/// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid. +/// +/// The values can be separated with any string such as `of`, `/`, etc. +/// +/// `$columns` also accepts decimals for when it's necessary to break out of the standard grid. E.g. Passing `2.4` in a standard 12 column grid will divide the row into 5 columns. +/// +/// @param {String} $display [block] +/// Sets the display property of the element. By default it sets the display property of the element to `block`. +/// +/// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width. +/// +/// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid. +/// +/// @example scss - Usage +/// .element { +/// @include span-columns(6); +/// +/// .nested-element { +/// @include span-columns(2 of 6); +/// } +/// } +/// +/// @example css - CSS Output +/// .element { +/// display: block; +/// float: left; +/// margin-right: 2.35765%; +/// width: 48.82117%; +/// } +/// +/// .element:last-child { +/// margin-right: 0; +/// } +/// +/// .element .nested-element { +/// display: block; +/// float: left; +/// margin-right: 4.82916%; +/// width: 30.11389%; +/// } +/// +/// .element .nested-element:last-child { +/// margin-right: 0; +/// } + +@mixin span-columns($span: $columns of $container-columns, $display: block) { + $columns: nth($span, 1); + $container-columns: container-span($span); + + $parent-columns: get-parent-columns($container-columns) !global; + + $direction: get-direction($layout-direction, $default-layout-direction); + $opposite-direction: get-opposite-direction($direction); + + $display-table: is-display-table($container-display-table, $display); + + @if $display-table { + display: table-cell; + width: percentage($columns / $container-columns); + } @else { + float: #{$opposite-direction}; + + @if $display != no-display { + display: block; + } + + @if $display == collapse { + @include -neat-warn("The 'collapse' argument will be deprecated. Use 'block-collapse' instead."); + } + + @if $display == collapse or $display == block-collapse { + width: flex-grid($columns, $container-columns) + flex-gutter($container-columns); + + &:last-child { + width: flex-grid($columns, $container-columns); + } + + } @else { + margin-#{$direction}: flex-gutter($container-columns); + width: flex-grid($columns, $container-columns); + + &:last-child { + margin-#{$direction}: 0; + } + } + } +} diff --git a/scss/lib/grid/_to-deprecate.scss b/scss/lib/grid/_to-deprecate.scss new file mode 100644 index 000000000..aeea0795b --- /dev/null +++ b/scss/lib/grid/_to-deprecate.scss @@ -0,0 +1,97 @@ +@charset "UTF-8"; + +@mixin breakpoint($query:$feature $value $columns, $total-columns: $grid-columns) { + @include -neat-warn("The breakpoint() mixin was renamed to media() in Neat 1.0. Please update your project with the new syntax before the next version bump."); + + @if length($query) == 1 { + @media screen and ($default-feature: nth($query, 1)) { + $default-grid-columns: $grid-columns; + $grid-columns: $total-columns; + @content; + $grid-columns: $default-grid-columns; + } + } @else if length($query) == 2 { + @media screen and (nth($query, 1): nth($query, 2)) { + $default-grid-columns: $grid-columns; + $grid-columns: $total-columns; + @content; + $grid-columns: $default-grid-columns; + } + } @else if length($query) == 3 { + @media screen and (nth($query, 1): nth($query, 2)) { + $default-grid-columns: $grid-columns; + $grid-columns: nth($query, 3); + @content; + $grid-columns: $default-grid-columns; + } + } @else if length($query) == 4 { + @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { + $default-grid-columns: $grid-columns; + $grid-columns: $total-columns; + @content; + $grid-columns: $default-grid-columns; + } + } @else if length($query) == 5 { + @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { + $default-grid-columns: $grid-columns; + $grid-columns: nth($query, 5); + @content; + $grid-columns: $default-grid-columns; + } + } @else { + @include -neat-warn("Wrong number of arguments for breakpoint(). Read the documentation for more details."); + } +} + +@mixin nth-omega($nth, $display: block, $direction: default) { + @include -neat-warn("The nth-omega() mixin is deprecated. Please use omega() instead."); + @include omega($nth $display, $direction); +} + +/// Resets the active display property to `block`. Particularly useful when changing the display property in a single row. +/// +/// @example scss - Usage +/// .element { +/// @include row(table); +/// // Context changed to table display +/// } +/// +/// @include reset-display; +/// // Context is reset to block display + +@mixin reset-display { + $container-display-table: false !global; + @include -neat-warn("Resetting $display will be deprecated in future versions in favor of the display(){...} mixin."); +} + +/// Resets the active layout direction to the default value set in `$default-layout-direction`. Particularly useful when changing the layout direction in a single row. +/// +/// @example scss - Usage +/// .element { +/// @include row($direction: RTL); +/// // Context changed to right-to-left +/// } +/// +/// @include reset-layout-direction; +/// // Context is reset to left-to-right + +@mixin reset-layout-direction { + $layout-direction: $default-layout-direction !global; + @include -neat-warn("Resetting $direction will be deprecated in future versions in favor of the direction(){...} mixin."); +} + +/// Resets both the active layout direction and the active display property. +/// +/// @example scss - Usage +/// .element { +/// @include row(table, RTL); +/// // Context changed to table table and right-to-left +/// } +/// +/// @include reset-all; +/// // Context is reset to block display and left-to-right + +@mixin reset-all { + @include reset-display; + @include reset-layout-direction; +} diff --git a/scss/lib/grid/_visual-grid.scss b/scss/lib/grid/_visual-grid.scss new file mode 100644 index 000000000..1192d8288 --- /dev/null +++ b/scss/lib/grid/_visual-grid.scss @@ -0,0 +1,42 @@ +@charset "UTF-8"; + +@mixin grid-column-gradient($values...) { + background-image: -webkit-linear-gradient(left, $values); + background-image: -moz-linear-gradient(left, $values); + background-image: -ms-linear-gradient(left, $values); + background-image: -o-linear-gradient(left, $values); + background-image: unquote("linear-gradient(to left, #{$values})"); +} + +@if $visual-grid == true or $visual-grid == yes { + body:before { + @include grid-column-gradient(gradient-stops($grid-columns)); + content: ""; + display: inline-block; + height: 100%; + left: 0; + margin: 0 auto; + max-width: $max-width; + opacity: $visual-grid-opacity; + pointer-events: none; + position: fixed; + right: 0; + width: 100%; + + @if $visual-grid-index == back { + z-index: -1; + } + + @else if $visual-grid-index == front { + z-index: 9999; + } + + @each $breakpoint in $visual-grid-breakpoints { + @if $breakpoint { + @include media($breakpoint) { + @include grid-column-gradient(gradient-stops($grid-columns)); + } + } + } + } +} diff --git a/scss/lib/helpers/_convert-units.scss b/scss/lib/helpers/_convert-units.scss new file mode 100644 index 000000000..e0a65a05c --- /dev/null +++ b/scss/lib/helpers/_convert-units.scss @@ -0,0 +1,21 @@ +//************************************************************************// +// Helper function for str-to-num fn. +// Source: http://sassmeister.com/gist/9647408 +//************************************************************************// +@function _convert-units($number, $unit) { + $strings: "px", "cm", "mm", "%", "ch", "pica", "in", "em", "rem", "pt", "pc", "ex", "vw", "vh", "vmin", "vmax", "deg", "rad", "grad", "turn"; + $units: 1px, 1cm, 1mm, 1%, 1ch, 1pica, 1in, 1em, 1rem, 1pt, 1pc, 1ex, 1vw, 1vh, 1vmin, 1vmax, 1deg, 1rad, 1grad, 1turn; + $index: index($strings, $unit); + + @if not $index { + @warn "Unknown unit `#{$unit}`."; + @return false; + } + + @if type-of($number) != "number" { + @warn "`#{$number} is not a number`"; + @return false; + } + + @return $number * nth($units, $index); +} diff --git a/scss/lib/helpers/_directional-values.scss b/scss/lib/helpers/_directional-values.scss new file mode 100644 index 000000000..6ee538db4 --- /dev/null +++ b/scss/lib/helpers/_directional-values.scss @@ -0,0 +1,96 @@ +@charset "UTF-8"; + +/// Directional-property mixins are shorthands for writing properties like the following +/// +/// @ignore You can also use `false` instead of `null`. +/// +/// @param {List} $vals +/// List of directional values +/// +/// @example scss - Usage +/// .element { +/// @include border-style(dotted null); +/// @include margin(null 0 10px); +/// } +/// +/// @example css - CSS Output +/// .element { +/// border-bottom-style: dotted; +/// border-top-style: dotted; +/// margin-bottom: 10px; +/// margin-left: 0; +/// margin-right: 0; +/// } +/// +/// @require {function} contains-falsy +/// +/// @return {List} + +@function collapse-directionals($vals) { + $output: null; + + $a: nth($vals, 1); + $b: if(length($vals) < 2, $a, nth($vals, 2)); + $c: if(length($vals) < 3, $a, nth($vals, 3)); + $d: if(length($vals) < 2, $a, nth($vals, if(length($vals) < 4, 2, 4))); + + @if $a == 0 { $a: 0; } + @if $b == 0 { $b: 0; } + @if $c == 0 { $c: 0; } + @if $d == 0 { $d: 0; } + + @if $a == $b and $a == $c and $a == $d { $output: $a; } + @else if $a == $c and $b == $d { $output: $a $b; } + @else if $b == $d { $output: $a $b $c; } + @else { $output: $a $b $c $d; } + + @return $output; +} + +/// Output directional properties, for instance `margin`. +/// +/// @access private +/// +/// @param {String} $pre +/// Prefix to use +/// @param {String} $suf +/// Suffix to use +/// @param {List} $vals +/// List of values +/// +/// @require {function} collapse-directionals +/// @require {function} contains-falsy + +@mixin directional-property($pre, $suf, $vals) { + // Property Names + $top: $pre + "-top" + if($suf, "-#{$suf}", ""); + $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", ""); + $left: $pre + "-left" + if($suf, "-#{$suf}", ""); + $right: $pre + "-right" + if($suf, "-#{$suf}", ""); + $all: $pre + if($suf, "-#{$suf}", ""); + + $vals: collapse-directionals($vals); + + @if contains-falsy($vals) { + @if nth($vals, 1) { #{$top}: nth($vals, 1); } + + @if length($vals) == 1 { + @if nth($vals, 1) { #{$right}: nth($vals, 1); } + } @else { + @if nth($vals, 2) { #{$right}: nth($vals, 2); } + } + + @if length($vals) == 2 { + @if nth($vals, 1) { #{$bottom}: nth($vals, 1); } + @if nth($vals, 2) { #{$left}: nth($vals, 2); } + } @else if length($vals) == 3 { + @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } + @if nth($vals, 2) { #{$left}: nth($vals, 2); } + } @else if length($vals) == 4 { + @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } + @if nth($vals, 4) { #{$left}: nth($vals, 4); } + } + } @else { + #{$all}: $vals; + } +} diff --git a/scss/lib/helpers/_font-source-declaration.scss b/scss/lib/helpers/_font-source-declaration.scss new file mode 100644 index 000000000..7f17586c9 --- /dev/null +++ b/scss/lib/helpers/_font-source-declaration.scss @@ -0,0 +1,43 @@ +// Used for creating the source string for fonts using @font-face +// Reference: http://goo.gl/Ru1bKP + +@function font-url-prefixer($asset-pipeline) { + @if $asset-pipeline == true { + @return font-url; + } @else { + @return url; + } +} + +@function font-source-declaration( + $font-family, + $file-path, + $asset-pipeline, + $file-formats, + $font-url) { + + $src: (); + + $formats-map: ( + eot: "#{$file-path}.eot?#iefix" format("embedded-opentype"), + woff2: "#{$file-path}.woff2" format("woff2"), + woff: "#{$file-path}.woff" format("woff"), + ttf: "#{$file-path}.ttf" format("truetype"), + svg: "#{$file-path}.svg##{$font-family}" format("svg") + ); + + @each $key, $values in $formats-map { + @if contains($file-formats, $key) { + $file-path: nth($values, 1); + $font-format: nth($values, 2); + + @if $asset-pipeline == true { + $src: append($src, font-url($file-path) $font-format, comma); + } @else { + $src: append($src, url($file-path) $font-format, comma); + } + } + } + + @return $src; +} diff --git a/scss/lib/helpers/_gradient-positions-parser.scss b/scss/lib/helpers/_gradient-positions-parser.scss new file mode 100644 index 000000000..07d30b6cf --- /dev/null +++ b/scss/lib/helpers/_gradient-positions-parser.scss @@ -0,0 +1,13 @@ +@function _gradient-positions-parser($gradient-type, $gradient-positions) { + @if $gradient-positions + and ($gradient-type == linear) + and (type-of($gradient-positions) != color) { + $gradient-positions: _linear-positions-parser($gradient-positions); + } + @else if $gradient-positions + and ($gradient-type == radial) + and (type-of($gradient-positions) != color) { + $gradient-positions: _radial-positions-parser($gradient-positions); + } + @return $gradient-positions; +} diff --git a/scss/lib/helpers/_linear-angle-parser.scss b/scss/lib/helpers/_linear-angle-parser.scss new file mode 100644 index 000000000..e0401ed8d --- /dev/null +++ b/scss/lib/helpers/_linear-angle-parser.scss @@ -0,0 +1,25 @@ +// Private function for linear-gradient-parser +@function _linear-angle-parser($image, $first-val, $prefix, $suffix) { + $offset: null; + $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val)); + $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val)); + + @if ($unit-long == "grad") or + ($unit-long == "turn") { + $offset: if($unit-long == "grad", -100grad * 3, -0.75turn); + } + + @else if ($unit-short == "deg") or + ($unit-short == "rad") { + $offset: if($unit-short == "deg", -90 * 3, 1.6rad); + } + + @if $offset { + $num: _str-to-num($first-val); + + @return ( + webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix, + spec-image: $image + ); + } +} diff --git a/scss/lib/helpers/_linear-gradient-parser.scss b/scss/lib/helpers/_linear-gradient-parser.scss new file mode 100644 index 000000000..48a8f77f9 --- /dev/null +++ b/scss/lib/helpers/_linear-gradient-parser.scss @@ -0,0 +1,41 @@ +@function _linear-gradient-parser($image) { + $image: unquote($image); + $gradients: (); + $start: str-index($image, "("); + $end: str-index($image, ","); + $first-val: str-slice($image, $start + 1, $end - 1); + + $prefix: str-slice($image, 1, $start); + $suffix: str-slice($image, $end, str-length($image)); + + $has-multiple-vals: str-index($first-val, " "); + $has-single-position: unquote(_position-flipper($first-val) + ""); + $has-angle: is-number(str-slice($first-val, 1, 1)); + + @if $has-multiple-vals { + $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals); + } + + @else if $has-single-position != "" { + $pos: unquote($has-single-position + ""); + + $gradients: ( + webkit-image: -webkit- + $image, + spec-image: $prefix + "to " + $pos + $suffix + ); + } + + @else if $has-angle { + // Rotate degree for webkit + $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix); + } + + @else { + $gradients: ( + webkit-image: -webkit- + $image, + spec-image: $image + ); + } + + @return $gradients; +} diff --git a/scss/lib/helpers/_linear-positions-parser.scss b/scss/lib/helpers/_linear-positions-parser.scss new file mode 100644 index 000000000..96d6a6d45 --- /dev/null +++ b/scss/lib/helpers/_linear-positions-parser.scss @@ -0,0 +1,61 @@ +@function _linear-positions-parser($pos) { + $type: type-of(nth($pos, 1)); + $spec: null; + $degree: null; + $side: null; + $corner: null; + $length: length($pos); + // Parse Side and corner positions + @if ($length > 1) { + @if nth($pos, 1) == "to" { // Newer syntax + $side: nth($pos, 2); + + @if $length == 2 { // eg. to top + // Swap for backwards compatibility + $degree: _position-flipper(nth($pos, 2)); + } + @else if $length == 3 { // eg. to top left + $corner: nth($pos, 3); + } + } + @else if $length == 2 { // Older syntax ("top left") + $side: _position-flipper(nth($pos, 1)); + $corner: _position-flipper(nth($pos, 2)); + } + + @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") { + $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); + } + @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") { + $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); + } + @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") { + $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); + } + @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") { + $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); + } + $spec: to $side $corner; + } + @else if $length == 1 { + // Swap for backwards compatibility + @if $type == string { + $degree: $pos; + $spec: to _position-flipper($pos); + } + @else { + $degree: -270 - $pos; //rotate the gradient opposite from spec + $spec: $pos; + } + } + $degree: unquote($degree + ","); + $spec: unquote($spec + ","); + @return $degree $spec; +} + +@function _position-flipper($pos) { + @return if($pos == left, right, null) + if($pos == right, left, null) + if($pos == top, bottom, null) + if($pos == bottom, top, null); +} diff --git a/scss/lib/helpers/_linear-side-corner-parser.scss b/scss/lib/helpers/_linear-side-corner-parser.scss new file mode 100644 index 000000000..7a691253d --- /dev/null +++ b/scss/lib/helpers/_linear-side-corner-parser.scss @@ -0,0 +1,31 @@ +// Private function for linear-gradient-parser +@function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) { + $val-1: str-slice($first-val, 1, $has-multiple-vals - 1); + $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val)); + $val-3: null; + $has-val-3: str-index($val-2, " "); + + @if $has-val-3 { + $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2)); + $val-2: str-slice($val-2, 1, $has-val-3 - 1); + } + + $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3); + $pos: unquote($pos + ""); + + // Use old spec for webkit + @if $val-1 == "to" { + @return ( + webkit-image: -webkit- + $prefix + $pos + $suffix, + spec-image: $image + ); + } + + // Bring the code up to spec + @else { + @return ( + webkit-image: -webkit- + $image, + spec-image: $prefix + "to " + $pos + $suffix + ); + } +} diff --git a/scss/lib/helpers/_radial-arg-parser.scss b/scss/lib/helpers/_radial-arg-parser.scss new file mode 100644 index 000000000..56c6030b7 --- /dev/null +++ b/scss/lib/helpers/_radial-arg-parser.scss @@ -0,0 +1,69 @@ +@function _radial-arg-parser($g1, $g2, $pos, $shape-size) { + @each $value in $g1, $g2 { + $first-val: nth($value, 1); + $pos-type: type-of($first-val); + $spec-at-index: null; + + // Determine if spec was passed to mixin + @if type-of($value) == list { + $spec-at-index: if(index($value, at), index($value, at), false); + } + @if $spec-at-index { + @if $spec-at-index > 1 { + @for $i from 1 through ($spec-at-index - 1) { + $shape-size: $shape-size nth($value, $i); + } + @for $i from ($spec-at-index + 1) through length($value) { + $pos: $pos nth($value, $i); + } + } + @else if $spec-at-index == 1 { + @for $i from ($spec-at-index + 1) through length($value) { + $pos: $pos nth($value, $i); + } + } + $g1: null; + } + + // If not spec calculate correct values + @else { + @if ($pos-type != color) or ($first-val != "transparent") { + @if ($pos-type == number) + or ($first-val == "center") + or ($first-val == "top") + or ($first-val == "right") + or ($first-val == "bottom") + or ($first-val == "left") { + + $pos: $value; + + @if $pos == $g1 { + $g1: null; + } + } + + @else if + ($first-val == "ellipse") + or ($first-val == "circle") + or ($first-val == "closest-side") + or ($first-val == "closest-corner") + or ($first-val == "farthest-side") + or ($first-val == "farthest-corner") + or ($first-val == "contain") + or ($first-val == "cover") { + + $shape-size: $value; + + @if $value == $g1 { + $g1: null; + } + + @else if $value == $g2 { + $g2: null; + } + } + } + } + } + @return $g1, $g2, $pos, $shape-size; +} diff --git a/scss/lib/helpers/_radial-gradient-parser.scss b/scss/lib/helpers/_radial-gradient-parser.scss new file mode 100644 index 000000000..5444d8085 --- /dev/null +++ b/scss/lib/helpers/_radial-gradient-parser.scss @@ -0,0 +1,50 @@ +@function _radial-gradient-parser($image) { + $image: unquote($image); + $gradients: (); + $start: str-index($image, "("); + $end: str-index($image, ","); + $first-val: str-slice($image, $start + 1, $end - 1); + + $prefix: str-slice($image, 1, $start); + $suffix: str-slice($image, $end, str-length($image)); + + $is-spec-syntax: str-index($first-val, "at"); + + @if $is-spec-syntax and $is-spec-syntax > 1 { + $keyword: str-slice($first-val, 1, $is-spec-syntax - 2); + $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); + $pos: append($pos, $keyword, comma); + + $gradients: ( + webkit-image: -webkit- + $prefix + $pos + $suffix, + spec-image: $image + ); + } + + @else if $is-spec-syntax == 1 { + $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); + + $gradients: ( + webkit-image: -webkit- + $prefix + $pos + $suffix, + spec-image: $image + ); + } + + @else if str-index($image, "cover") or str-index($image, "contain") { + @warn "Radial-gradient needs to be updated to conform to latest spec."; + + $gradients: ( + webkit-image: null, + spec-image: $image + ); + } + + @else { + $gradients: ( + webkit-image: -webkit- + $image, + spec-image: $image + ); + } + + @return $gradients; +} diff --git a/scss/lib/helpers/_radial-positions-parser.scss b/scss/lib/helpers/_radial-positions-parser.scss new file mode 100644 index 000000000..3c552ad79 --- /dev/null +++ b/scss/lib/helpers/_radial-positions-parser.scss @@ -0,0 +1,18 @@ +@function _radial-positions-parser($gradient-pos) { + $shape-size: nth($gradient-pos, 1); + $pos: nth($gradient-pos, 2); + $shape-size-spec: _shape-size-stripper($shape-size); + + $pre-spec: unquote(if($pos, "#{$pos}, ", null)) + unquote(if($shape-size, "#{$shape-size},", null)); + $pos-spec: if($pos, "at #{$pos}", null); + + $spec: "#{$shape-size-spec} #{$pos-spec}"; + + // Add comma + @if ($spec != " ") { + $spec: "#{$spec},"; + } + + @return $pre-spec $spec; +} diff --git a/scss/lib/helpers/_render-gradients.scss b/scss/lib/helpers/_render-gradients.scss new file mode 100644 index 000000000..576567683 --- /dev/null +++ b/scss/lib/helpers/_render-gradients.scss @@ -0,0 +1,26 @@ +// User for linear and radial gradients within background-image or border-image properties + +@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) { + $pre-spec: null; + $spec: null; + $vendor-gradients: null; + @if $gradient-type == linear { + @if $gradient-positions { + $pre-spec: nth($gradient-positions, 1); + $spec: nth($gradient-positions, 2); + } + } + @else if $gradient-type == radial { + $pre-spec: nth($gradient-positions, 1); + $spec: nth($gradient-positions, 2); + } + + @if $vendor { + $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients); + } + @else if $vendor == false { + $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})"; + $vendor-gradients: unquote($vendor-gradients); + } + @return $vendor-gradients; +} diff --git a/scss/lib/helpers/_shape-size-stripper.scss b/scss/lib/helpers/_shape-size-stripper.scss new file mode 100644 index 000000000..ee5eda422 --- /dev/null +++ b/scss/lib/helpers/_shape-size-stripper.scss @@ -0,0 +1,10 @@ +@function _shape-size-stripper($shape-size) { + $shape-size-spec: null; + @each $value in $shape-size { + @if ($value == "cover") or ($value == "contain") { + $value: null; + } + $shape-size-spec: "#{$shape-size-spec} #{$value}"; + } + @return $shape-size-spec; +} diff --git a/scss/lib/helpers/_str-to-num.scss b/scss/lib/helpers/_str-to-num.scss new file mode 100644 index 000000000..3ef1d873b --- /dev/null +++ b/scss/lib/helpers/_str-to-num.scss @@ -0,0 +1,50 @@ +//************************************************************************// +// Helper function for linear/radial-gradient-parsers. +// Source: http://sassmeister.com/gist/9647408 +//************************************************************************// +@function _str-to-num($string) { + // Matrices + $strings: "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"; + $numbers: 0 1 2 3 4 5 6 7 8 9; + + // Result + $result: 0; + $divider: 0; + $minus: false; + + // Looping through all characters + @for $i from 1 through str-length($string) { + $character: str-slice($string, $i, $i); + $index: index($strings, $character); + + @if $character == "-" { + $minus: true; + } + + @else if $character == "." { + $divider: 1; + } + + @else { + @if not $index { + $result: if($minus, $result * -1, $result); + @return _convert-units($result, str-slice($string, $i)); + } + + $number: nth($numbers, $index); + + @if $divider == 0 { + $result: $result * 10; + } + + @else { + // Move the decimal dot to the left + $divider: $divider * 10; + $number: $number / $divider; + } + + $result: $result + $number; + } + } + @return if($minus, $result * -1, $result); +} diff --git a/scss/lib/mixins/_clearfix.scss b/scss/lib/mixins/_clearfix.scss new file mode 100644 index 000000000..e68efc440 --- /dev/null +++ b/scss/lib/mixins/_clearfix.scss @@ -0,0 +1,25 @@ +@charset "UTF-8"; + +/// Provides an easy way to include a clearfix for containing floats. +/// +/// @link http://goo.gl/yP5hiZ +/// +/// @example scss +/// .element { +/// @include clearfix; +/// } +/// +/// @example css +/// .element::after { +/// clear: both; +/// content: ""; +/// display: block; +/// } + +@mixin clearfix { + &::after { + clear: both; + content: ""; + display: block; + } +} diff --git a/scss/lib/settings/_asset-pipeline.scss b/scss/lib/settings/_asset-pipeline.scss new file mode 100644 index 000000000..4c6afc5bb --- /dev/null +++ b/scss/lib/settings/_asset-pipeline.scss @@ -0,0 +1,7 @@ +@charset "UTF-8"; + +/// A global setting to enable or disable the `$asset-pipeline` variable for all functions that accept it. +/// +/// @type Bool + +$asset-pipeline: false !default; diff --git a/scss/lib/settings/_disable-warnings.scss b/scss/lib/settings/_disable-warnings.scss new file mode 100644 index 000000000..3f9b92a6a --- /dev/null +++ b/scss/lib/settings/_disable-warnings.scss @@ -0,0 +1,13 @@ +@charset "UTF-8"; + +/// Disable all deprecation warnings. Defaults to `false`. Set with a `!global` flag. +/// +/// @type Bool + +$disable-warnings: false !default; + +@mixin -neat-warn($message) { + @if $disable-warnings == false { + @warn "#{$message}"; + } +} diff --git a/scss/lib/settings/_grid.scss b/scss/lib/settings/_grid.scss new file mode 100644 index 000000000..c1ab7fdcb --- /dev/null +++ b/scss/lib/settings/_grid.scss @@ -0,0 +1,51 @@ +@charset "UTF-8"; + +/// Sets the relative width of a single grid column. The unit used should be the same one used to define `$gutter`. Set with a `!global` flag. +/// +/// @type Number (Unit) + +$column: 4.2358em !default; + +/// Sets the relative width of a single grid gutter. The unit used should be the same one used to define `$column`. Set with the `!global` flag. +/// +/// @type Number (Unit) + +$gutter: 1.618em !default; + +/// Sets the total number of columns in the grid. Its value can be overridden inside a media query using the `media()` mixin. Set with the `!global` flag. +/// +/// @type Number (Unitless) + +$grid-columns: 12 !default; + +/// Sets the max-width property of the element that includes `outer-container()`. Set with the `!global` flag. +/// +/// @type Number (Unit) +/// +$max-width: 1200px !default; + +/// When set to true, it sets the box-sizing property of all elements to `border-box`. Set with a `!global` flag. +/// +/// @type Bool +/// +/// @example css - CSS Output +/// html { +/// box-sizing: border-box; } +/// +/// *, *::after, *::before { +/// box-sizing: inherit; +/// } + +$border-box-sizing: true !default; + +/// Sets the default [media feature](http://www.w3.org/TR/css3-mediaqueries/#media) that `media()` and `new-breakpoint()` revert to when only a breakpoint value is passed. Set with a `!global` flag. +/// +/// @type String + +$default-feature: min-width; // Default @media feature for the breakpoint() mixin + +///Sets the default layout direction of the grid. Can be `LTR` or `RTL`. Set with a `!global` flag. +/// +///@type String + +$default-layout-direction: LTR !default; diff --git a/scss/lib/settings/_prefixer.scss b/scss/lib/settings/_prefixer.scss new file mode 100644 index 000000000..8c390514d --- /dev/null +++ b/scss/lib/settings/_prefixer.scss @@ -0,0 +1,9 @@ +@charset "UTF-8"; + +/// Global variables to enable or disable vendor prefixes + +$prefix-for-webkit: true !default; +$prefix-for-mozilla: true !default; +$prefix-for-microsoft: true !default; +$prefix-for-opera: true !default; +$prefix-for-spec: true !default; diff --git a/scss/lib/settings/_px-to-em.scss b/scss/lib/settings/_px-to-em.scss new file mode 100644 index 000000000..f2f9a3e8d --- /dev/null +++ b/scss/lib/settings/_px-to-em.scss @@ -0,0 +1 @@ +$em-base: 16px !default; diff --git a/scss/lib/settings/_visual-grid.scss b/scss/lib/settings/_visual-grid.scss new file mode 100644 index 000000000..9cd1815a2 --- /dev/null +++ b/scss/lib/settings/_visual-grid.scss @@ -0,0 +1,27 @@ +@charset "UTF-8"; + +/// Displays the visual grid when set to true. The overlaid grid may be few pixels off depending on the browser's rendering engine and pixel rounding algorithm. Set with the `!global` flag. +/// +/// @type Bool + +$visual-grid: false !default; + +/// Sets the visual grid color. Set with `!global` flag. +/// +/// @type Color + +$visual-grid-color: #eee !default; + +/// Sets the `z-index` property of the visual grid. Can be `back` (behind content) or `front` (in front of content). Set with `!global` flag. +/// +/// @type String + +$visual-grid-index: back !default; + +/// Sets the opacity property of the visual grid. Set with `!global` flag. +/// +/// @type Number (unitless) + +$visual-grid-opacity: 0.4 !default; + +$visual-grid-breakpoints: () !default;