diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..71f6b47d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +developer.tripgo.com diff --git a/bower_components/normalize-scss/bin/is-modern-node b/bower_components/normalize-scss/bin/is-modern-node new file mode 100644 index 00000000..83ff398f --- /dev/null +++ b/bower_components/normalize-scss/bin/is-modern-node @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +/* eslint-disable no-process-exit */ + +'use strict'; + +// Checks for "v4." or greater. +function isModernNode() { + return /^v([4-9]|\d{2,})\.\S+$/.test(process.version); +} + +if (!isModernNode()) { + console.error('Node.js ' + process.version + 'detected; alternate script will be run.'); + // Return a non-zero (false) value to the shell. + process.exit(1); +} diff --git a/bower_components/normalize-scss/bower.json b/bower_components/normalize-scss/bower.json new file mode 100644 index 00000000..1cef998b --- /dev/null +++ b/bower_components/normalize-scss/bower.json @@ -0,0 +1,31 @@ +{ + "name": "normalize-scss", + "description": "This is the Sass version of Normalize.css, a collection of HTML element and attribute rulesets to normalize styles across all browsers. This port aims to use a light dusting of Sass to make Normalize even easier to integrate with your website.", + "main": [ + "sass/_normalize.scss" + ], + "authors": [ + "John Albin Wilkins (http://john.albin.net/)" + ], + "license": "(MIT OR GPL-2.0)", + "keywords": [ + "sass", + "normalize", + "reset", + "typography", + "design", + "ui" + ], + "homepage": "https://github.com/JohnAlbin/normalize-scss", + "ignore": [ + "**/.*", + "CHANGELOG.md", + "CONTRIBUTING.md", + "lib", + "node_modules", + "normalize-scss.gemspec", + "sache.json", + "test.html", + "test" + ] +} diff --git a/bower_components/normalize-scss/fork-versions/default/_normalize.scss b/bower_components/normalize-scss/fork-versions/default/_normalize.scss new file mode 100644 index 00000000..30c59696 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/default/_normalize.scss @@ -0,0 +1,647 @@ +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ + +@import 'variables'; +@import 'vertical-rhythm'; + +// If we've customized any font variables, we'll need extra properties. +@if $base-line-height != 24px + or $base-unit != 'em' + or $h2-font-size != 1.5 * $base-font-size + or $h3-font-size != 1.17 * $base-font-size + or $h4-font-size != 1 * $base-font-size + or $h5-font-size != 0.83 * $base-font-size + or $h6-font-size != 0.67 * $base-font-size + or $indent-amount != 40px { + $normalize-vertical-rhythm: true !global; +} + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + @if $base-font-family { + /* Change the default font family in all browsers (opinionated). */ + font-family: $base-font-family; + } + @if $base-font-size != 16px or $normalize-vertical-rhythm { + // Correct old browser bug that prevented accessible resizing of text + // when root font-size is set with px or em. + font-size: ($base-font-size / 16px) * 100%; + } + @if $normalize-vertical-rhythm { + // Establish a vertical rhythm unit using $base-font-size and + // $base-line-height variables. + line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + @include normalize-font-size($h1-font-size); + @if $normalize-vertical-rhythm { + @include normalize-line-height($h1-font-size); + } + + @if $normalize-vertical-rhythm { + /* Set 1 unit of vertical rhythm on the top and bottom margins. */ + @include normalize-margin(1 0, $h1-font-size); + } + @else { + margin: 0.67em 0; + } +} + +@if $normalize-vertical-rhythm { + h2 { + @include normalize-font-size($h2-font-size); + @include normalize-line-height($h2-font-size); + @include normalize-margin(1 0, $h2-font-size); + } + + h3 { + @include normalize-font-size($h3-font-size); + @include normalize-line-height($h3-font-size); + @include normalize-margin(1 0, $h3-font-size); + } + + h4 { + @include normalize-font-size($h4-font-size); + @include normalize-line-height($h4-font-size); + @include normalize-margin(1 0, $h4-font-size); + } + + h5 { + @include normalize-font-size($h5-font-size); + @include normalize-line-height($h5-font-size); + @include normalize-margin(1 0, $h5-font-size); + } + + h6 { + @include normalize-font-size($h6-font-size); + @include normalize-line-height($h6-font-size); + @include normalize-margin(1 0, $h6-font-size); + } +} + +/* Grouping content + ========================================================================== */ + +@if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + blockquote { + @include normalize-margin(1 $indent-amount); + } + + dl, + ol, + ul { + @include normalize-margin(1 0); + } + + /** + * Turn off margins on nested lists. + */ + + ol, + ul { + ol, + ul { + margin: 0; + } + } + + dd { + margin: 0 0 0 $indent-amount; + } + + ol, + ul { + padding: 0 0 0 $indent-amount; + } +} + +/** + * Add the correct display in IE 9-. + */ + +figcaption, +figure { + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + @if $normalize-vertical-rhythm { + @include normalize-margin(1 $indent-amount); + } + @else { + margin: 1em $indent-amount; + } +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * Add the correct display in IE. + */ + +main { + display: block; +} + +@if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + p, + pre { + @include normalize-margin(1 0); + } +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +%monospace { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +pre { + @extend %monospace; +} + +/* Links + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + @extend %monospace; +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * Known issues: + * - `select`: + * By default, Chrome on OS X and Safari on OS X allow very limited styling of + * select, unless a border property is set. The default font weight on + * optgroup elements cannot safely be changed in Chrome on OSX and Safari on + * OS X. + * - `[type="checkbox"]`: + * It is recommended that you do not style checkbox and radio inputs as + * Firefox's implementation does not respect box-sizing, padding, or width. + * - `[type="number"]`: + * Certain font size values applied to number inputs cause the cursor style of + * the decrement button to change from `default` to `text`. + * - `[type="search"]`: + * The search input is not fully stylable by default. In Chrome and Safari on + * OSX/iOS you can't control `font`, `padding`, `border`, or `background`. In + * Chrome and Safari on Windows you can't control `border` properly. It will + * apply `border-width` but will only show a border color (which cannot be + * controlled) for the outer 1px of that border. Applying + * `-webkit-appearance: textfield` addresses these issues without removing the + * benefits of search inputs (e.g. showing past searches). Safari (but not + * Chrome) will clip the cancel button on when it has padding (and `textfield` + * appearance). + * - `::placeholder`: + * In Edge, placeholders will disappear on `relative` or `absolute` positioned + * `` elements if you use `opacity` less than `1` due to a + * [bug](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3901363/). + */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + @if $normalize-vertical-rhythm { + @include normalize-line-height($base-font-size); /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + font-family: if($base-font-family, $base-font-family, sans-serif); /* 1 */ + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + */ + +button { + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + + /** + * Remove the inner border and padding in Firefox. + */ + + &::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + &:-moz-focusring { + outline: 1px dotted ButtonText; + } +} + +/** + * Show the overflow in Edge. + */ + +input { + overflow: visible; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + } +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + color: inherit; /* 2 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + + +/* + * Add the correct display in IE 9-. + */ + +menu { + display: block; + + @if $normalize-vertical-rhythm { + /* + * 1. Set 1 unit of vertical rhythm on the top and bottom margin. + * 2. Set consistent space for the list style image. + */ + + @include normalize-margin(1 0); /* 1 */ + padding: 0 0 0 $indent-amount; /* 2 */ + + /** + * Turn off margins on nested lists. + */ + + menu &, + ol &, + ul & { + margin: 0; + } + } +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/bower_components/normalize-scss/fork-versions/default/_variables.scss b/bower_components/normalize-scss/fork-versions/default/_variables.scss new file mode 100644 index 00000000..f5bd845e --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/default/_variables.scss @@ -0,0 +1,36 @@ +// +// Variables +// +// If you have an initialization partial (or equivalent), you should move these +// lines to that file. NOTE: Edit the lines to remove "!default". + +// The font size set on the root html element. +$base-font-size: 16px !default; + +// The base line height determines the basic unit of vertical rhythm. +$base-line-height: 24px !default; + +// The length unit in which to output vertical rhythm values. +// Supported values: px, em, rem. +$base-unit: 'em' !default; + +// The default font family. +$base-font-family: null !default; + +// The font sizes for h1-h6. +$h1-font-size: 2 * $base-font-size !default; +$h2-font-size: 1.5 * $base-font-size !default; +$h3-font-size: 1.17 * $base-font-size !default; +$h4-font-size: 1 * $base-font-size !default; +$h5-font-size: 0.83 * $base-font-size !default; +$h6-font-size: 0.67 * $base-font-size !default; + +// The amount lists and blockquotes are indented. +$indent-amount: 40px !default; + +// The following variable controls whether normalize-scss will output +// font-sizes, line-heights and block-level top/bottom margins that form a basic +// vertical rhythm on the page, which differs from the original Normalize.css. +// However, changing any of the variables above will cause +// $normalize-vertical-rhythm to be automatically set to true. +$normalize-vertical-rhythm: false !default; diff --git a/bower_components/normalize-scss/fork-versions/default/_vertical-rhythm.scss b/bower_components/normalize-scss/fork-versions/default/_vertical-rhythm.scss new file mode 100644 index 00000000..4f53647c --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/default/_vertical-rhythm.scss @@ -0,0 +1,61 @@ +// +// Vertical Rhythm +// +// This is the minimal amount of code needed to create vertical rhythm in our +// CSS. If you are looking for a robust solution, look at the excellent Typey +// library. @see https://github.com/jptaranto/typey + +@function normalize-rhythm($value, $relative-to: $base-font-size, $unit: $base-unit) { + @if unit($value) != px { + @error "The normalize vertical-rhythm module only supports px inputs. The typey library is better."; + } + @if $unit == rem { + @return ($value / $base-font-size) * 1rem; + } + @else if $unit == em { + @return ($value / $relative-to) * 1em; + } + @else { // $unit == px + @return $value; + } +} + +@mixin normalize-font-size($value, $relative-to: $base-font-size) { + @if unit($value) != 'px' { + @error "normalize-font-size() only supports px inputs. The typey library is better."; + } + font-size: normalize-rhythm($value, $relative-to); +} + +@mixin normalize-rhythm($property, $values, $relative-to: $base-font-size) { + $value-list: $values; + $sep: space; + @if type-of($values) == 'list' { + $sep: list-separator($values); + } + @else { + $value-list: append((), $values); + } + + $normalized-values: (); + @each $value in $value-list { + @if unitless($value) and $value != 0 { + $value: $value * normalize-rhythm($base-line-height, $relative-to); + } + $normalized-values: append($normalized-values, $value, $sep); + } + #{$property}: $normalized-values; +} + +@mixin normalize-margin($values, $relative-to: $base-font-size) { + @include normalize-rhythm(margin, $values, $relative-to); +} + +@mixin normalize-line-height($font-size, $min-line-padding: 2px) { + $lines: ceil($font-size / $base-line-height); + // If lines are cramped include some extra leading. + @if ($lines * $base-line-height - $font-size) < ($min-line-padding * 2) { + $lines: $lines + 1; + } + @include normalize-rhythm(line-height, $lines, $font-size); +} diff --git a/bower_components/normalize-scss/fork-versions/deprecated-compass/_normalize.scss b/bower_components/normalize-scss/fork-versions/deprecated-compass/_normalize.scss new file mode 100644 index 00000000..0ab446cc --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/deprecated-compass/_normalize.scss @@ -0,0 +1,657 @@ +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ + +@import "variables"; +// After the default variables are set, import the required Compass partials. +// Feel free to move these lines to your own initialization partial. +@import "compass/css3/box-sizing"; +@import "compass/typography/vertical_rhythm"; + +// If we've customized any font variables, we'll need extra properties. +@if $base-font-size != 16px + or $base-line-height != 24px + or $rhythm-unit != 'em' + or $h1-font-size != 2 * $base-font-size + or $h2-font-size != 1.5 * $base-font-size + or $h3-font-size != 1.17 * $base-font-size + or $h4-font-size != 1 * $base-font-size + or $h5-font-size != 0.83 * $base-font-size + or $h6-font-size != 0.67 * $base-font-size + or $indent-amount != 40px { + $normalize-vertical-rhythm: true !global; +} + +/* Document + ========================================================================== */ + +/** + * 1. Establish a vertical rhythm unit using $base-font-size, $base-line-height, + * and $rhythm-unit variables. + * 2. Correct old browser bug that prevented accessible resizing of text when + * root font-size is set with px or em. + * 3. Correct the line height in all browsers. + */ + +@include establish-baseline(); + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + // Show a background image that can be used to debug your alignments. + // @include debug-vertical-alignment(); + font-family: $base-font-family; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + /* Set the font-size and line-height while keeping a proper vertical rhythm. */ + @if $normalize-vertical-rhythm { + @include adjust-font-size-to( $h1-font-size ); + } + @else { + font-size: if($rhythm-unit == "px", $h1-font-size, unquote("#{$h1-font-size / $base-font-size}#{$rhythm-unit}")); + } + + /* Set 1 unit of vertical rhythm on the top and bottom margins. */ + @include leader(1, $h1-font-size); + @include trailer(1, $h1-font-size); +} + +@if $normalize-vertical-rhythm { + h2 { + @include adjust-font-size-to( $h2-font-size ); + @include leader(1, $h2-font-size); + @include trailer(1, $h2-font-size); + } + + h3 { + @include adjust-font-size-to( $h3-font-size ); + @include leader(1, $h3-font-size); + @include trailer(1, $h3-font-size); + } + + h4 { + @include adjust-font-size-to( $h4-font-size ); + @include leader(1, $h4-font-size); + @include trailer(1, $h4-font-size); + } + + h5 { + @include adjust-font-size-to( $h5-font-size ); + @include leader(1, $h5-font-size); + @include trailer(1, $h5-font-size); + } + + h6 { + @include adjust-font-size-to( $h6-font-size ); + @include leader(1, $h6-font-size); + @include trailer(1, $h6-font-size); + } +} + +/* Grouping content + ========================================================================== */ + +@if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + blockquote { + @include output-rhythm(margin, rhythm(1) $indent-amount); + } + + dl, + ol, + ul { + @include output-rhythm(margin, rhythm(1) 0); + } + + /** + * Turn off margins on nested lists. + */ + + ol, + ul { + ol, + ul { + margin: 0; + } + } + + dd { + margin: 0 0 0 $indent-amount; + } + + ol, + ul { + padding: 0 0 0 $indent-amount; + } +} + +/** + * Add the correct display in IE 9-. + */ + +figcaption, +figure { + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + @include output-rhythm(margin, rhythm(1) $indent-amount); +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + @include box-sizing(content-box); /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * Add the correct display in IE. + */ + +main { + display: block; +} + +@if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + p, + pre { + @include output-rhythm(margin, rhythm(1) 0); + } +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +%monospace { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +pre { + @extend %monospace; +} + +/* Links + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ + +a:active, +a:hover { + outline-width: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + @extend %monospace; +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * Known issues: + * - `select`: + * By default, Chrome on OS X and Safari on OS X allow very limited styling of + * select, unless a border property is set. The default font weight on + * optgroup elements cannot safely be changed in Chrome on OSX and Safari on + * OS X. + * - `[type="checkbox"]`: + * It is recommended that you do not style checkbox and radio inputs as + * Firefox's implementation does not respect box-sizing, padding, or width. + * - `[type="number"]`: + * Certain font size values applied to number inputs cause the cursor style of + * the decrement button to change from `default` to `text`. + * - `[type="search"]`: + * The search input is not fully stylable by default. In Chrome and Safari on + * OSX/iOS you can't control `font`, `padding`, `border`, or `background`. In + * Chrome and Safari on Windows you can't control `border` properly. It will + * apply `border-width` but will only show a border color (which cannot be + * controlled) for the outer 1px of that border. Applying + * `-webkit-appearance: textfield` addresses these issues without removing the + * benefits of search inputs (e.g. showing past searches). Safari (but not + * Chrome) will clip the cancel button on when it has padding (and `textfield` + * appearance). + * - `::placeholder`: + * In Edge, placeholders will disappear on `relative` or `absolute` positioned + * `` elements if you use `opacity` less than `1` due to a + * [bug](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3901363/). + */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + @if $normalize-vertical-rhythm { + @include adjust-leading-to(1); /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + font-family: $base-font-family; /* 1 */ + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + */ + +button { + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + + /** + * Remove the inner border and padding in Firefox. + */ + + &::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + &:-moz-focusring { + outline: 1px dotted ButtonText; + } +} + +/** + * Show the overflow in Edge. + */ + +input { + overflow: visible; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + @include box-sizing(border-box); /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + } +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ + +fieldset { + margin: 0 2px; + /* Apply borders and padding that keep the vertical rhythm. */ + border-color: #c0c0c0; + @include apply-side-rhythm-border(top, $width: 1px, $lines: 0.35 ); + @include apply-side-rhythm-border(bottom, $width: 1px, $lines: 0.65 ); + @include apply-side-rhythm-border(left, $width: 1px, $lines: 0.625); + @include apply-side-rhythm-border(right, $width: 1px, $lines: 0.625); +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + color: inherit; /* 2 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* + * Add the correct display in IE 9-. + */ + +menu { + display: block; + + @if $normalize-vertical-rhythm { + /* + * 1. Set 1 unit of vertical rhythm on the top and bottom margin. + * 2. Set consistent space for the list style image. + */ + + @include output-rhythm(margin, rhythm(1) 0); /* 1 */ + padding: 0 0 0 $indent-amount; /* 2 */ + + /** + * Turn off margins on nested lists. + */ + + menu &, + ol &, + ul & { + margin: 0; + } + } +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/bower_components/normalize-scss/fork-versions/deprecated-compass/_variables.scss b/bower_components/normalize-scss/fork-versions/deprecated-compass/_variables.scss new file mode 100644 index 00000000..cebd9e0d --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/deprecated-compass/_variables.scss @@ -0,0 +1,40 @@ +// Variables +// +// If you have a base partial (or equivalent), you should move these lines to +// that file. NOTE: Edit the lines to remove "!default". +// @see http://compass-style.org/help/tutorials/best_practices/ +// ============================================================================= + +// These 3 variables are copies of ones used in Compass' Vertical Rhythm module. + + // The font size set on the root html element. + $base-font-size: 16px !default; + + // The base line height determines the basic unit of vertical rhythm. + $base-line-height: 24px !default; + + // The length unit in which to output vertical rhythm values. + // Supported values: px, em, rem. + $rhythm-unit: 'em' !default; + + +// The default font family. +$base-font-family: sans-serif !default; + +// The font sizes for h1-h6. +$h1-font-size: 2 * $base-font-size !default; +$h2-font-size: 1.5 * $base-font-size !default; +$h3-font-size: 1.17 * $base-font-size !default; +$h4-font-size: 1 * $base-font-size !default; +$h5-font-size: 0.83 * $base-font-size !default; +$h6-font-size: 0.67 * $base-font-size !default; + +// The amount lists and blockquotes are indented. +$indent-amount: 40px !default; + +// The following variable controls whether normalize-scss will output +// font-sizes, line-heights and block-level top/bottom margins that form a basic +// vertical rhythm on the page, which differs from the original Normalize.css. +// However, changing any of the variables above will cause +// $normalize-vertical-rhythm to be automatically set to true. +$normalize-vertical-rhythm: false !default; diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/_init.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/_init.scss new file mode 100644 index 00000000..5030323d --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/_init.scss @@ -0,0 +1,58 @@ +// Initialization partial +// +// To make it easier to use all variables and mixins in any Sass file in this +// project, each .scss file has a `@import 'init';` declaration. The _init.scss +// file is in charge of importing all the other partials needed for the +// project. +// +// The initialization partial is organized in this way: +// - First we set any shared Sass variables. +// - Next we import Sass modules. +// - Last we define our custom mixins for this project. +// +// Weight: -1 +// +// Style guide: sass.init + + +// The following Sass functions/mixins are required to generate some variables' +// values, so we load them first. +@import 'chroma/functions'; + +@import 'init/colors'; +@import 'init/variables'; + + +// 3rd party libraries +// +// The following sass modules are shared with all .scss files: +// - [Chroma](https://github.com/JohnAlbin/chroma) +// - [Typey](https://github.com/jptaranto/typey) +// +// Additional pre-built libraries can be found on the [Sache website](http://www.sache.in/). +// +// Style guide: sass.modules + +// Add Chroma to manage colors. +@import 'chroma'; +@import 'chroma/kss'; +// Add typey to manage font sizes and margins. +@import 'typey'; + + +// Mixins +// +// Custom mixins used on this site. +// +// Weight: 1 +// +// Style guide: sass.mixins +@import 'init/rtl/rtl'; + +// Functions +// +// Custom functions used on this site. +// +// Weight: 1 +// +// Style guide: sass.functions diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/_fonts.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/_fonts.scss new file mode 100644 index 00000000..c3e38589 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/_fonts.scss @@ -0,0 +1,34 @@ +// Font faces +// +// Instead of relying on the fonts that are available on a user's computer, you +// can use web fonts which, like images, are resources downloaded to the user's +// browser. Because of the bandwidth and rendering resources required, web fonts +// should be used with care. +// +// Numerous resources for web fonts can be found on Google. Here are a few +// websites where you can find Open Source fonts to download: +// - http://www.fontsquirrel.com/fontface +// - http://www.theleagueofmoveabletype.com +// - https://fonts.google.com +// +// In order to use these fonts, you will need to convert them into formats +// suitable for web fonts. We recommend the free-to-use Font Squirrel's +// Font-Face Generator: +// http://www.fontsquirrel.com/fontface/generator +// +// The following is an example @font-face declaration. This font can then be +// used in any ruleset using a property like this: font-family: Example, serif; +// +// Since we're using Sass, you'll need to declare your font faces here, then you +// can add them to the font variables in the _init.scss partial. + +// @font-face { +// font-family: 'Example'; +// src: url('../fonts/example.eot'); +// src: url('../fonts/example.eot?iefix') format('eot'), +// url('../fonts/example.woff') format('woff'), +// url('../fonts/example.ttf') format('truetype'), +// url('../fonts/example.svg#webfontOkOndcij') format('svg'); +// font-weight: normal; +// font-style: normal; +// } diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/_normalize.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/_normalize.scss new file mode 100644 index 00000000..40f1662d --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/_normalize.scss @@ -0,0 +1,25 @@ +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ + +// Universal +// ========================================================================== + +// Use the saner border-box model for all elements. +* { + box-sizing: border-box; +} + +// Normalize-scss is broken into modular pieces to make it easier to edit. +@import 'document/document'; +@import 'sections/sections'; +@import 'grouping/grouping'; +@import 'links/links'; +@import 'text/text'; +@import 'embedded/embedded'; +@import 'forms/forms'; +@import 'tables/tables'; +@import 'interactive/interactive'; +@import 'scripting/scripting'; +@import 'hidden/hidden'; + +// Note: we allow the .button component (loaded by forms) to override :link, by +// loading links first. diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/document/_document.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/document/_document.scss new file mode 100644 index 00000000..7c740811 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/document/_document.scss @@ -0,0 +1,21 @@ +// sass-lint:disable no-vendor-prefixes + +// Document +// +// The default font styles are inherited from the `` element. +// +// Style guide: base.document + +html { + // Change the default font family in all browsers (opinionated). + @include typeface(body); + // Correct the line height in all browsers. + @include define-type-sizing(); + // Prevent adjustments of font size after orientation changes in IE on Windows + // Phone and in iOS. + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + // On short pages, we want any background gradients to fill the entire height + // of the browser. + min-height: 100%; +} diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/_embedded.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/_embedded.scss new file mode 100644 index 00000000..f1580cbe --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/_embedded.scss @@ -0,0 +1,65 @@ +// Embedded content +// +// Weight: 2 +// +// Style guide: base.embedded + +// Audio +// +// Style guide: base.embedded.audio + +audio { + // Add the correct display in IE 9-. + display: inline-block; +} + +// Add the correct display in iOS 4-7. +audio:not([controls]) { + display: none; + height: 0; +} + +// Image +// +// An `` element represents an image. +// +// Markup: embedded-img.twig +// +// Style guide: base.embedded.img + +img { + // Remove the border on images inside links in IE 10-. + border-style: none; +} + +img, +svg { + // Suppress the space beneath the baseline + // vertical-align: bottom; + + // Responsive images + max-width: 100%; + height: auto; +} + +// Scalable vector +// +// A `` element represents an image encoded as a Scalable Vector Graphic. +// +// Markup: embedded-svg.twig +// +// Style guide: base.embedded.svg + +svg:not(:root) { + // Hide the overflow in IE. + overflow: hidden; +} + +// Video +// +// Style guide: base.embedded.video + +video { + // Add the correct display in IE 9-. + display: inline-block; +} diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/embedded-img.twig b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/embedded-img.twig new file mode 100644 index 00000000..061b49ac --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/embedded-img.twig @@ -0,0 +1,6 @@ +

An image that is inline with other text.

+ +
+
An image inside a figure.
+ +
diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/embedded-svg.twig b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/embedded-svg.twig new file mode 100644 index 00000000..44b5862e --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/embedded/embedded-svg.twig @@ -0,0 +1,8 @@ +

A svg image that is inline with other text.

+ +
+
A svg inside a figure.
+ + + +
diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/forms/_forms.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/forms/_forms.scss new file mode 100644 index 00000000..8a6fa294 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/base/forms/_forms.scss @@ -0,0 +1,267 @@ +// sass-lint:disable no-vendor-prefixes, no-css-comments + +// Form defaults +// +// These are the default base styles applied to HTML form elements. +// +// Component classes can override these styles, but if no class applies a style +// to an HTML form element, these styles will be the ones displayed. +// +// Weight: -1 +// +// Style guide: forms.base + +// +// The following rules are from normalize.css and help to fix inconsistencies +// across various browsers. You should probably leave these rules as is and jump +// to the "Buttons" rule on line 92 before you start editing this file. +// + +button, +input, +optgroup, +select, +textarea { + // Change the font styles in all browsers (opinionated). + @include typeface(body); + @include line-height(1); + font-size: 100%; + // Keep form elements constrained in their containers. + box-sizing: border-box; + max-width: 100%; + // Remove the margin in Firefox and Safari. + margin: 0; +} + +// Show the overflow in IE. +button { + overflow: visible; +} + +// Remove the inheritance of text transform in Edge, Firefox, and IE. +button, +select { + text-transform: none; +} + +// Show the overflow in Edge. +input { + overflow: visible; +} + +// Correct the cursor style of increment and decrement buttons in Chrome. +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} + +[type='search'] { + // Correct the odd appearance in Chrome and Safari. + -webkit-appearance: textfield; + // Correct the outline style in Safari. + outline-offset: -2px; + + // Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + } +} + +::-webkit-file-upload-button { + // Correct the inability to style clickable types in iOS and Safari. + -webkit-appearance: button; + // Change font properties to `inherit` in Safari. + font: inherit; +} + +// Buttons +// +// Buttons built with the ` + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ Link button + Disabled link button +

diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/_colors.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/_colors.scss new file mode 100644 index 00000000..4cce4ce2 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/_colors.scss @@ -0,0 +1,48 @@ +// sass-lint:disable indentation, no-color-keywords, no-color-hex + +// Colors +// +// Use the `color()` function to add colors to CSS properties. To learn more, +// [read the Chroma documentation](http://johnalbin.github.io/chroma/). +// +// Markup: chroma.twig +// +// Weight: -1 +// +// Style guide: sass.colors + +// Define the default color scheme's color names. +$chroma: define-default-color-scheme('branding', 'The site\'s main colors. Can be used to define colors in other color schemes.'); + +$chroma: add-colors(( + black: #000, + grey-dark: ('black' lighten 40%), // #666 + 'grey': ('black' lighten 60%), // #999 + grey-light: ('black' lighten 80%), // #ccc + grey-extra-light: ('black' lighten 93.33%), // #eee + white: #fff, + + blue: #0072b9, + red: #c00, + yellow: #fd0, +)); + +// Define color names for functional uses. +$chroma: define-color-scheme('functional', 'Colors used by functional parts of the design.'); +$chroma: add-colors('functional', ( + // Colors used in the main content area. + text: 'black', + + link: 'blue', + link-visited: ('blue' darken 20%), + link-active: 'red', + + border: 'grey-light', + + button: 'text', + button-disabled: 'grey', + + mark-bg: 'yellow', +)); + +$chroma-active-scheme: 'functional'; diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/_variables.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/_variables.scss new file mode 100644 index 00000000..da536400 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/_variables.scss @@ -0,0 +1,91 @@ +// Variables +// +// Set variables for this site before a library sets its !default value. +// +// Style guide: sass.variables + + +// Font faces, stacks and sizes. +// +// Font styling and line heights are controlled by the several variables that +// used by mixins like `type-layout()`, `margin-top()`, and `margin-bottom()`. +// These variable and mixins are documented on the [Typey +// homepage](https://github.com/jptaranto/typey). +// +// Style guide: sass.variables.typey + +// The font size set on the root html element. +$base-font-size: 16px; + +// The base line height determines the basic unit of vertical rhythm. +$base-line-height: 24px; + +// The font sizes in our type hierarchy as tee shirt sizes. +$font-size: ( + xxl: 32px, + xl: 24px, + l: 20px, + m: $base-font-size, + s: 14px, + xs: 10px +); + +// Typey allows you to alter font weights site-wide with this map. +$font-weight: ( + bold: bold, + medium: 500, + normal: normal, + light: 300, + lighter: lighter, +); + +// The following font family declarations use widely available fonts. +// A user's web browser will look at the comma-separated list and will +// attempt to use each font in turn until it finds one that is available +// on the user's computer. The final "generic" font (sans-serif, serif or +// monospace) hints at what type of font to use if the web browser doesn't +// find any of the fonts in the list. + +// Sans-serif font stacks. +$verdana: Verdana, Tahoma, 'DejaVu Sans', sans-serif; + +// Monospace font stacks. +// For an explanation of why "sans-serif" is at the end of this list, see +// http://meyerweb.com/eric/thoughts/2010/02/12/fixed-monospace-sizing/ +$menlo: Menlo, 'DejaVu Sans Mono', 'Ubuntu Mono', Courier, 'Courier New', monospace, sans-serif; + +// The font faces you specify in the $typefaces map can be used in the +// typeface() mixin. +$typefaces: ( + body: ( + font-family: $verdana, + ), + monospace: ( + font-family: $menlo, + ), +); + +// Output a horizontal grid to help with debugging typography. +$typey-debug: false; + +// The length unit in which to output font size and margin values. +// Supported values: px, em, rem. +$base-unit: 'rem'; + +// px fallbacks for rem units are needed for IE 8 and earlier. +$rem-fallback: false; + + +// Miscellaneous variables +// +// `$indent-amount` controls the amount lists, blockquotes and comments are indented. +// +// `$include-rtl` controls whether RTL styles are output. If set to `true, a `[dir="rtl"]` ruleset adds RTL language support. +// +// weight: 10 +// +// Style guide: sass.variables.misc + +$indent-amount: 2 * $base-font-size; + +$include-rtl: false; diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/rtl/_rtl.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/rtl/_rtl.scss new file mode 100644 index 00000000..aa4b91d5 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/init/rtl/_rtl.scss @@ -0,0 +1,28 @@ +$include-rtl: true !default; + +// rtl() +// +// Includes Right-To-Left language support by adding a parent selector of +// `[dir="rtl"]`. Since the dir attribute is usually defined on the html element +// of a page, using this mixin on a ruleset that matches the html element won't +// work. +// +// Can be turned off globally by setting `$include-rtl: false;`. +// +// $selector = '[dir="rtl"]' - The RTL parent selector. +// +// Style guide: sass.mixins.rtl +@mixin rtl($selector: '[dir="rtl"]') { + @if $include-rtl { + @if & { + #{$selector} & { + @content; + } + } + @else { + #{$selector} { + @content; + } + } + } +} diff --git a/bower_components/normalize-scss/fork-versions/typey-chroma-kss/styles.scss b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/styles.scss new file mode 100644 index 00000000..36cb1a05 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey-chroma-kss/styles.scss @@ -0,0 +1,69 @@ +// +// The major stylesheet for this project. +// +// We categorize our components by creating headings in this file. See the +// description on the style guide home page for more information. + + +// Colors and Sass +// +// Documentation for colors and Sass mixins and variables. +// +// Weight: -1 +// +// Style guide: sass +@import 'init'; + +// Defaults +// +// These are the default base styles applied to HTML elements. +// +// Component classes can override these styles, but if no class applies a style +// to an HTML element, these styles will be the ones displayed. +// +// Style guide: base + +// Ensure fonts get loaded first to minimize front-end performance impact. +@import 'base/fonts'; +@import 'base/normalize'; + +// Layouts +// +// The layout styling for major parts of the page that are included with the +// theme. Note: some Panels layouts are included in other parts of the system +// and are not documented. +// +// Style guide: layouts + +// Components +// +// Design components are reusable designs that can be applied using just the CSS +// class names specified in the component. +// +// Weight: 1 +// +// Style guide: components + +// This file is @import'ed by base/grouping, so we don't import it again. +// @import 'components/divider/divider'; + +// Navigation +// +// Navigation components are specialized design components that are used for +// page navigation. +// +// Weight: 2 +// +// Style guide: navigation + +// Forms +// +// Form components are specialized design components that are applied to forms +// or form elements. +// +// Weight: 3 +// +// Style guide: forms + +// This file is @import'ed by base/forms, so we don't import it again. +// @import 'forms/button/button'; diff --git a/bower_components/normalize-scss/fork-versions/typey/_normalize.scss b/bower_components/normalize-scss/fork-versions/typey/_normalize.scss new file mode 100644 index 00000000..ede3847b --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey/_normalize.scss @@ -0,0 +1,590 @@ +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ + +@import 'variables'; +@import 'typey'; + +/* Document + ========================================================================== */ + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + @include typeface(body); /* 1 */ + @include define-type-sizing(); /* 2 */ + // Output a horizontal grid to help with debugging typography. The + // $typey-debug variable will toggle its output. + @include typey-debug-grid(); + -ms-text-size-adjust: 100%; /* 3 */ + -webkit-text-size-adjust: 100%; /* 3 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + @include type-layout(xxl, 2); + + /* Set 1 unit of vertical rhythm on the top and bottom margins. */ + @include margin(1 0, xxl); +} + +h2 { + @include type-layout(xl, 1.5); + @include margin(1 0, xl); +} + +h3 { + @include type-layout(l, 1); + @include margin(1 0, l); +} + +h4 { + @include type-layout(m, 1); + @include margin(1 0, m); +} + +h5 { + @include type-layout(s, 1); + @include margin(1 0, s); +} + +h6 { + @include type-layout(xs, 1); + @include margin(1 0, xs); +} + +/* Grouping content + ========================================================================== */ + +/** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + +blockquote { + @include margin(1 $indent-amount); +} + +dl, +ol, +ul { + @include margin(1 0); +} + +/** + * Turn off margins on nested lists. + */ + +ol, +ul { + ol, + ul { + margin: 0; + } +} + +dd { + margin: 0 0 0 $indent-amount; +} + +ol, +ul { + padding: 0 0 0 $indent-amount; +} + +/** + * Add the correct display in IE 9-. + */ + +figcaption, +figure { + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + @include margin(1 $indent-amount); +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * Add the correct display in IE. + */ + +main { + display: block; +} + +/** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + +p, +pre { + @include margin(1 0); +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +%monospace { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +pre { + @extend %monospace; +} + +/* Links + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + @extend %monospace; +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * Known issues: + * - `select`: + * By default, Chrome on OS X and Safari on OS X allow very limited styling of + * select, unless a border property is set. The default font weight on + * optgroup elements cannot safely be changed in Chrome on OSX and Safari on + * OS X. + * - `[type="checkbox"]`: + * It is recommended that you do not style checkbox and radio inputs as + * Firefox's implementation does not respect box-sizing, padding, or width. + * - `[type="number"]`: + * Certain font size values applied to number inputs cause the cursor style of + * the decrement button to change from `default` to `text`. + * - `[type="search"]`: + * The search input is not fully stylable by default. In Chrome and Safari on + * OSX/iOS you can't control `font`, `padding`, `border`, or `background`. In + * Chrome and Safari on Windows you can't control `border` properly. It will + * apply `border-width` but will only show a border color (which cannot be + * controlled) for the outer 1px of that border. Applying + * `-webkit-appearance: textfield` addresses these issues without removing the + * benefits of search inputs (e.g. showing past searches). Safari (but not + * Chrome) will clip the cancel button on when it has padding (and `textfield` + * appearance). + * - `::placeholder`: + * In Edge, placeholders will disappear on `relative` or `absolute` positioned + * `` elements if you use `opacity` less than `1` due to a + * [bug](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3901363/). + */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + @include typeface(body); /* 1 */ + @include line-height(1); /* 1 */ + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + */ + +button { + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + + /** + * Remove the inner border and padding in Firefox. + */ + + &::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + &:-moz-focusring { + outline: 1px dotted ButtonText; + } +} + +/** + * Show the overflow in Edge. + */ + +input { + overflow: visible; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + } +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + // Apply borders and padding that keep the vertical rhythm. + @include padding(.35 .5 .65); + border: 1px solid #c0c0c0; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + color: inherit; /* 2 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* + * 1. Set 1 unit of vertical rhythm on the top and bottom margin. + * 2. Add the correct display in IE 9-. + * 3. Set consistent space for the list style image. + */ + +menu { + @include margin(1 0); /* 1 */ + display: block; /* 2 */ + padding: 0 0 0 $indent-amount; /* 3 */ + + /** + * Turn off margins on nested lists. + */ + + menu &, + ol &, + ul & { + margin: 0; + } +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/bower_components/normalize-scss/fork-versions/typey/_variables.scss b/bower_components/normalize-scss/fork-versions/typey/_variables.scss new file mode 100644 index 00000000..0dbab325 --- /dev/null +++ b/bower_components/normalize-scss/fork-versions/typey/_variables.scss @@ -0,0 +1,47 @@ +// +// Variables +// +// If you have an initialization partial (or equivalent), you should move these +// lines to that file. + +// The font size set on the root html element. +$base-font-size: 16px !default; + +// The base line height determines the basic unit of vertical rhythm. +$base-line-height: 24px !default; + +// The length unit in which to output font size and margin values. +// Supported values: px, em, rem. +$base-unit: 'rem' !default; + +// px fallbacks for rem units are needed for IE 8 and earlier. +$rem-fallback: false !default; + +// The font faces you specify in the $typefaces map can be used in the +// typeface() mixin. +$typefaces: ( + body: ( + font-family: (sans-serif), + ), + monospace: ( + font-family: (monospace, monospace), + ), +) !default; + +// The font sizes for h1-h6 expressed as tee shirt sizes. +$font-size: ( + xxl: 32px, + xl: 24px, + l: 20px, + m: $base-font-size, + s: 14px, + xs: 10px, +) !default; + +// The amount lists and blockquotes are indented. +$indent-amount: 40px !default; + +// The following variable controls whether normalize-scss will output +// font-sizes, line-heights and block-level top/bottom margins that form a basic +// vertical rhythm on the page, which differs from the original Normalize.css. +$normalize-vertical-rhythm: false !default; diff --git a/bower_components/normalize-scss/package.json b/bower_components/normalize-scss/package.json new file mode 100644 index 00000000..8885f5e2 --- /dev/null +++ b/bower_components/normalize-scss/package.json @@ -0,0 +1,46 @@ +{ + "name": "normalize-scss", + "version": "7.0.0", + "description": "This is the Sass version of Normalize.css, a collection of HTML element and attribute rulesets to normalize styles across all browsers. This port aims to use a light dusting of Sass to make Normalize even easier to integrate with your website.", + "homepage": "https://github.com/JohnAlbin/normalize-scss", + "bugs": { + "url": "https://github.com/JohnAlbin/normalize-scss/issues" + }, + "repository": { + "type": "git", + "url": "git://github.com/JohnAlbin/normalize-scss.git" + }, + "author": "John Albin Wilkins (http://john.albin.net/)", + "keywords": [ + "eyeglass-module", + "sass", + "normalize" + ], + "main": "sass/_normalize.scss", + "style": "sass/_normalize.scss", + "eyeglass": { + "sassDir": "sass", + "exports": false, + "name": "normalize", + "needs": "*" + }, + "directories": { + "lib": "sass", + "test": "test" + }, + "scripts": { + "test": "mocha", + "posttest": "eslint test", + "test-only": "mocha" + }, + "license": "(MIT OR GPL-2.0)", + "devDependencies": { + "chai": "^3.5.0", + "chroma-sass": "^1.2.3", + "eslint": "^3.8.0", + "eyeglass": "^1.1.2", + "mocha": "^3.1.2", + "sassy-test": "^3.0.0", + "typey": "^1.0.0" + } +} diff --git a/bower_components/normalize-scss/sass/_normalize.scss b/bower_components/normalize-scss/sass/_normalize.scss new file mode 100644 index 00000000..fd669eb9 --- /dev/null +++ b/bower_components/normalize-scss/sass/_normalize.scss @@ -0,0 +1,3 @@ +@import 'normalize/variables'; +@import 'normalize/vertical-rhythm'; +@import 'normalize/normalize-mixin'; diff --git a/bower_components/normalize-scss/sass/normalize/_import-now.scss b/bower_components/normalize-scss/sass/normalize/_import-now.scss new file mode 100644 index 00000000..aac5d2b6 --- /dev/null +++ b/bower_components/normalize-scss/sass/normalize/_import-now.scss @@ -0,0 +1,11 @@ +// Import Now +// +// If you import this module directly, it will immediately output all the CSS +// needed to normalize default HTML elements across all browsers. +// +// ``` +// @import "normalize/import-now"; +// ``` + +@import '../normalize'; +@include normalize(); diff --git a/bower_components/normalize-scss/sass/normalize/_normalize-mixin.scss b/bower_components/normalize-scss/sass/normalize/_normalize-mixin.scss new file mode 100644 index 00000000..a366f7b9 --- /dev/null +++ b/bower_components/normalize-scss/sass/normalize/_normalize-mixin.scss @@ -0,0 +1,666 @@ +// Helper function for the normalize() mixin. +@function _normalize-include($section, $exclude: null) { + // Initialize the global variables needed by this function. + @if not global_variable_exists(_normalize-include) { + $_normalize-include: () !global; + $_normalize-exclude: () !global; + } + // Since we are given 2 parameters, set the global variables. + @if $exclude != null { + $include: $section; + // Sass doesn't have static variables, so the work-around is to stuff these + // values into global variables so we can access them in future calls. + $_normalize-include: if(type-of($include) == 'list', $include, ($include)) !global; + $_normalize-exclude: if(type-of($exclude) == 'list', $exclude, ($exclude)) !global; + @return true; + } + + // Check if $section is in the $include list. + @if index($_normalize-include, $section) { + @return true; + } + // If $include is set to (all), make sure $section is not in $exclude. + @else if not index($_normalize-exclude, $section) and index($_normalize-include, all) { + @return true; + } + @return false; +} + +@mixin normalize($include: (all), $exclude: ()) { + // Initialize the helper function by passing it this mixin's parameters. + $init: _normalize-include($include, $exclude); + + // If we've customized any font variables, we'll need extra properties. + @if $base-line-height != 24px + or $base-unit != 'em' + or $h2-font-size != 1.5 * $base-font-size + or $h3-font-size != 1.17 * $base-font-size + or $h4-font-size != 1 * $base-font-size + or $h5-font-size != 0.83 * $base-font-size + or $h6-font-size != 0.67 * $base-font-size { + $normalize-vertical-rhythm: true !global; + } + + /*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ + + @if _normalize-include(document) { + /* Document + ========================================================================== */ + + /** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + + html { + @if $base-font-family { + /* Change the default font family in all browsers (opinionated). */ + font-family: $base-font-family; + } + @if $base-font-size != 16px or $normalize-vertical-rhythm { + // Correct old browser bug that prevented accessible resizing of text + // when root font-size is set with px or em. + font-size: ($base-font-size / 16px) * 100%; + } + @if $normalize-vertical-rhythm { + line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + } + + @if _normalize-include(sections) { + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers (opinionated). + */ + + body { + margin: 0; + } + + /** + * Add the correct display in IE 9-. + */ + + article, + aside, + footer, + header, + nav, + section { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + @include normalize-font-size($h1-font-size); + @if $normalize-vertical-rhythm { + @include normalize-line-height($h1-font-size); + } + + @if $normalize-vertical-rhythm { + /* Set 1 unit of vertical rhythm on the top and bottom margins. */ + @include normalize-margin(1 0, $h1-font-size); + } + @else { + margin: 0.67em 0; + } + } + + @if $normalize-vertical-rhythm { + h2 { + @include normalize-font-size($h2-font-size); + @include normalize-line-height($h2-font-size); + @include normalize-margin(1 0, $h2-font-size); + } + + h3 { + @include normalize-font-size($h3-font-size); + @include normalize-line-height($h3-font-size); + @include normalize-margin(1 0, $h3-font-size); + } + + h4 { + @include normalize-font-size($h4-font-size); + @include normalize-line-height($h4-font-size); + @include normalize-margin(1 0, $h4-font-size); + } + + h5 { + @include normalize-font-size($h5-font-size); + @include normalize-line-height($h5-font-size); + @include normalize-margin(1 0, $h5-font-size); + } + + h6 { + @include normalize-font-size($h6-font-size); + @include normalize-line-height($h6-font-size); + @include normalize-margin(1 0, $h6-font-size); + } + } + } + + @if _normalize-include(grouping) { + /* Grouping content + ========================================================================== */ + + @if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + blockquote { + @include normalize-margin(1 $indent-amount); + } + + dl, + ol, + ul { + @include normalize-margin(1 0); + } + + /** + * Turn off margins on nested lists. + */ + + ol, + ul { + ol, + ul { + margin: 0; + } + } + + dd { + margin: 0 0 0 $indent-amount; + } + + ol, + ul { + padding: 0 0 0 $indent-amount; + } + } + + /** + * Add the correct display in IE 9-. + */ + + figcaption, + figure { + display: block; + } + + /** + * Add the correct margin in IE 8. + */ + + figure { + @if $normalize-vertical-rhythm { + @include normalize-margin(1 $indent-amount); + } + @else { + margin: 1em $indent-amount; + } + } + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * Add the correct display in IE. + */ + + main { + display: block; + } + + @if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + p, + pre { + @include normalize-margin(1 0); + } + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + } + + @if _normalize-include(links) { + /* Links + ========================================================================== */ + + /** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + + a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ + } + } + + @if _normalize-include(text) { + /* Text-level semantics + ========================================================================== */ + + /** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + + b, + strong { + font-weight: inherit; + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font style in Android 4.3-. + */ + + dfn { + font-style: italic; + } + + /** + * Add the correct background and color in IE 9-. + */ + + mark { + background-color: #ff0; + color: #000; + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + } + + @if _normalize-include(embedded) { + /* Embedded content + ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + audio, + video { + display: inline-block; + } + + /** + * Add the correct display in iOS 4-7. + */ + + audio:not([controls]) { + display: none; + height: 0; + } + + /** + * Remove the border on images inside links in IE 10-. + */ + + img { + border-style: none; + } + + /** + * Hide the overflow in IE. + */ + + svg:not(:root) { + overflow: hidden; + } + } + + @if _normalize-include(forms) { + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: if($base-font-family, $base-font-family, sans-serif); /* 1 */ + font-size: 100%; /* 1 */ + @if $normalize-vertical-rhythm { + line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + */ + + button { + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + + button, + html [type="button"], /* 1 */ + [type="reset"], + [type="submit"] { + -webkit-appearance: button; /* 2 */ + } + + button, + [type="button"], + [type="reset"], + [type="submit"] { + + /** + * Remove the inner border and padding in Firefox. + */ + + &::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + &:-moz-focusring { + outline: 1px dotted ButtonText; + } + } + + /** + * Show the overflow in Edge. + */ + + input { + overflow: visible; + } + + /** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + } + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + color: inherit; /* 2 */ + white-space: normal; /* 1 */ + } + + /** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ + } + + /** + * Remove the default vertical scrollbar in IE. + */ + + textarea { + overflow: auto; + } + } + + @if _normalize-include(interactive) { + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* + * Add the correct display in IE 9-. + */ + + menu { + display: block; + + @if $normalize-vertical-rhythm { + /* + * 1. Set 1 unit of vertical rhythm on the top and bottom margin. + * 2. Set consistent space for the list style image. + */ + + @include normalize-margin(1 0); /* 1 */ + padding: 0 0 0 $indent-amount; /* 2 */ + + /** + * Turn off margins on nested lists. + */ + + menu &, + ol &, + ul & { + margin: 0; + } + } + } + } + + @if _normalize-include(scripting) { + /* Scripting + ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + canvas { + display: inline-block; + } + + /** + * Add the correct display in IE. + */ + + template { + display: none; + } + } + + @if _normalize-include(hidden) { + /* Hidden + ========================================================================== */ + + /** + * Add the correct display in IE 10-. + */ + + [hidden] { + display: none; + } + } +} diff --git a/bower_components/normalize-scss/sass/normalize/_variables.scss b/bower_components/normalize-scss/sass/normalize/_variables.scss new file mode 100644 index 00000000..10d05ed7 --- /dev/null +++ b/bower_components/normalize-scss/sass/normalize/_variables.scss @@ -0,0 +1,36 @@ +// +// Variables +// +// You can override the default values by setting the variables in your Sass +// before importing the normalize-scss library. + +// The font size set on the root html element. +$base-font-size: 16px !default; + +// The base line height determines the basic unit of vertical rhythm. +$base-line-height: 24px !default; + +// The length unit in which to output vertical rhythm values. +// Supported values: px, em, rem. +$base-unit: 'em' !default; + +// The default font family. +$base-font-family: null !default; + +// The font sizes for h1-h6. +$h1-font-size: 2 * $base-font-size !default; +$h2-font-size: 1.5 * $base-font-size !default; +$h3-font-size: 1.17 * $base-font-size !default; +$h4-font-size: 1 * $base-font-size !default; +$h5-font-size: 0.83 * $base-font-size !default; +$h6-font-size: 0.67 * $base-font-size !default; + +// The amount lists and blockquotes are indented. +$indent-amount: 40px !default; + +// The following variable controls whether normalize-scss will output +// font-sizes, line-heights and block-level top/bottom margins that form a basic +// vertical rhythm on the page, which differs from the original Normalize.css. +// However, changing any of the variables above will cause +// $normalize-vertical-rhythm to be automatically set to true. +$normalize-vertical-rhythm: false !default; diff --git a/bower_components/normalize-scss/sass/normalize/_vertical-rhythm.scss b/bower_components/normalize-scss/sass/normalize/_vertical-rhythm.scss new file mode 100644 index 00000000..4f53647c --- /dev/null +++ b/bower_components/normalize-scss/sass/normalize/_vertical-rhythm.scss @@ -0,0 +1,61 @@ +// +// Vertical Rhythm +// +// This is the minimal amount of code needed to create vertical rhythm in our +// CSS. If you are looking for a robust solution, look at the excellent Typey +// library. @see https://github.com/jptaranto/typey + +@function normalize-rhythm($value, $relative-to: $base-font-size, $unit: $base-unit) { + @if unit($value) != px { + @error "The normalize vertical-rhythm module only supports px inputs. The typey library is better."; + } + @if $unit == rem { + @return ($value / $base-font-size) * 1rem; + } + @else if $unit == em { + @return ($value / $relative-to) * 1em; + } + @else { // $unit == px + @return $value; + } +} + +@mixin normalize-font-size($value, $relative-to: $base-font-size) { + @if unit($value) != 'px' { + @error "normalize-font-size() only supports px inputs. The typey library is better."; + } + font-size: normalize-rhythm($value, $relative-to); +} + +@mixin normalize-rhythm($property, $values, $relative-to: $base-font-size) { + $value-list: $values; + $sep: space; + @if type-of($values) == 'list' { + $sep: list-separator($values); + } + @else { + $value-list: append((), $values); + } + + $normalized-values: (); + @each $value in $value-list { + @if unitless($value) and $value != 0 { + $value: $value * normalize-rhythm($base-line-height, $relative-to); + } + $normalized-values: append($normalized-values, $value, $sep); + } + #{$property}: $normalized-values; +} + +@mixin normalize-margin($values, $relative-to: $base-font-size) { + @include normalize-rhythm(margin, $values, $relative-to); +} + +@mixin normalize-line-height($font-size, $min-line-padding: 2px) { + $lines: ceil($font-size / $base-line-height); + // If lines are cramped include some extra leading. + @if ($lines * $base-line-height - $font-size) < ($min-line-padding * 2) { + $lines: $lines + 1; + } + @include normalize-rhythm(line-height, $lines, $font-size); +} diff --git a/css/_base.sass b/css/_base.sass new file mode 100644 index 00000000..eb2214ba --- /dev/null +++ b/css/_base.sass @@ -0,0 +1,71 @@ +a + color: #23B15E + text-decoration: none + font-family: $font-medium + &:hover + text-decoration: underline + &:focus + outline: 3px solid #c1e0fe + outline: 3px solid rgba(131, 192, 253, 0.5) + outline-offset: 1px + +input[type='text'], +input[type='textarea'], +input[type='email'], +input[type='password'], +input[type='tel'] + padding: 0 1rem + font-family: $font-regular + font-size: 1rem + line-height: 2.5 + border-style: solid + border-width: 1px + border-color: #EDEEF2 + border-radius: 4px + +li + > p + margin-bottom: 0.875em + +pre, .rst-content tt + max-width: 100% + overflow-x: auto + +hr + margin-top: 24px + margin-bottom: 24px + border: 0 + border-top: 1px solid #eee + +pre + display: block + margin-bottom: 1rem + padding: 8px 12px + +code + font-size: 0.875rem + padding: 4px 6px + white-space: pre-wrap + word-wrap: break-word + color: #25323E + +pre, code + word-wrap: normal + border-radius: 4px + background-color: #F2F3F4 + >.hljs + background-color: #F2F3F4 + +img + width: 100% + height: auto + display: block + +blockquote + margin: 0 0 1.5rem 0rem + padding: 0.875rem 1.5rem + border-left: 4px solid #eee + p + margin-bottom: 0 + font-size: 1.25rem + font-family: $font-medium \ No newline at end of file diff --git a/css/_font.sass b/css/_font.sass new file mode 100644 index 00000000..906a75ce --- /dev/null +++ b/css/_font.sass @@ -0,0 +1,14 @@ +@font-face + font-family: 'ProximaNovaSoft-Medium' + src: url('font/webfonts/234DF5_0_0.eot') + src: url('font/webfonts/234DF5_0_0.eot?#iefix') format('embedded-opentype'), url('font/webfonts/234DF5_0_0.woff') format('woff'), url('font/webfonts/234DF5_0_0.ttf') format('truetype') + +@font-face + font-family: 'ProximaNovaSoft-Semibold' + src: url('font/webfonts/234DF5_1_0.eot') + src: url('font/webfonts/234DF5_1_0.eot?#iefix') format('embedded-opentype'), url('font/webfonts/234DF5_1_0.woff') format('woff'), url('font/webfonts/234DF5_1_0.ttf') format('truetype') + +@font-face + font-family: 'ProximaNovaSoft-Regular' + src: url('font/webfonts/234DF5_3_0.eot') + src: url('font/webfonts/234DF5_3_0.eot?#iefix') format('embedded-opentype'), url('font/webfonts/234DF5_3_0.woff') format('woff'), url('font/webfonts/234DF5_3_0.ttf') format('truetype') \ No newline at end of file diff --git a/css/_footer.sass b/css/_footer.sass new file mode 100644 index 00000000..b193b21e --- /dev/null +++ b/css/_footer.sass @@ -0,0 +1,43 @@ +.footer + display: -webkit-flex + display: flex + -webkit-flex-direction: row + flex-direction: column + padding: 3rem 0 + background-color: #23b15e + border-top: 2px solid rgba(255,255,255,.1) + border-bottom: 2px solid transparent + box-sizing: border-box + @media screen and (min-width: 768px) + -webkit-flex-direction: row + flex-direction: row + padding: 0 + >.logo + padding: 1rem + line-height: 0 + >img + height: 34px + width: 134px + >.menu + margin: 0 + padding: 0 + list-style-type: none + display: -webkit-flex + display: flex + -webkit-flex-direction: column + flex-direction: column + @media screen and (min-width: 768px) + -webkit-flex-direction: row + flex-direction: row + align-items: center + >li + display: block + @media screen and (min-width: 768px) + display: inline-block + >a + display: block + padding: 1rem + font-size: .875rem + line-height: 1 + font-family: $font-semibold + color: rgba(255,255,255,.8) \ No newline at end of file diff --git a/css/_grids.sass b/css/_grids.sass new file mode 100644 index 00000000..2de62f72 --- /dev/null +++ b/css/_grids.sass @@ -0,0 +1,33 @@ +@media screen and (min-width: 576px) + .container + width: 540px + +@media screen and (min-width: 768px) + .container + width: 720px + +@media screen and (min-width: 992px) + .container + width: 960px + display: grid + &.-layout-3-9 + grid-template-columns: 1fr 3fr + &.-layout-6-6 + display: grid + grid-template-columns: 1fr 1fr + &.fluid + width: 100% + +@media screen and (min-width: 1200px) + .container + width: 1140px + +.container + position: relative + margin: 0 auto + grid-gap: 2rem + max-width: 100% + padding-right: 1rem + padding-left: 1rem + box-sizing: border-box + diff --git a/css/_layout.sass b/css/_layout.sass new file mode 100644 index 00000000..c5795e39 --- /dev/null +++ b/css/_layout.sass @@ -0,0 +1,25 @@ +html + height: 100% +body + min-height: 100% + padding-top: 5rem + +.container + display: block + +.content + padding-top: 1rem + margin-top: -2rem + >h1[id] + margin-top: 3rem + >h1[id]::before, >h2[id]::before, >h3[id]::before, >h4[id]::before + display: block + height: 4.5rem + margin-top: -4.5rem + visibility: hidden + content: "" + >h1[id]:focus, + >h2[id]:focus, + >h3[id]:focus, + >h4[id]:focus + outline: none \ No newline at end of file diff --git a/css/_menu-toggle.sass b/css/_menu-toggle.sass new file mode 100644 index 00000000..94c97f9c --- /dev/null +++ b/css/_menu-toggle.sass @@ -0,0 +1,39 @@ +.menu-toggle + display: block + position: relative + z-index: 2000 + float: left + padding: 19px 18px + background-color: none + -webkit-appearance: none!important + .bar-container + +transition(all) + span[class^='bar'] + display: block + width: 16px + height: 2px + margin-bottom: 4px + background-color: white + border-radius: 2px + +transition(all) + &.-toggle + .bar-container + -webkit-transform: rotate(45deg) + -moz-transform: rotate(45deg) + -ms-transform: rotate(45deg) + -o-transform: rotate(45deg) + transform: rotate(45deg) + .bar-1 + -webkit-transform: translateY(6px) rotate(90deg) + -moz-transform: translateY(6px) rotate(90deg) + -ms-transform: translateY(6px) rotate(90deg) + -o-transform: translateY(6px) rotate(90deg) + transform: translateY(6px) rotate(90deg) + .bar-3 + -webkit-transform: translateY(-6px) + -moz-transform: translateY(-6px) + -ms-transform: translateY(-6px) + -o-transform: translateY-(6px) + transform: translateY(-6px) + @media screen and (min-width: 768px) + display: none \ No newline at end of file diff --git a/css/_navbar-bottom.sass b/css/_navbar-bottom.sass new file mode 100644 index 00000000..2a0eada1 --- /dev/null +++ b/css/_navbar-bottom.sass @@ -0,0 +1,87 @@ +.navbar-bottom + width: 100% + margin-top: 5rem + background-color: #25b15e + &:before, &:after + +clearfix + >.container + display: block + width: 100% + padding-left: 0 + padding-right: 0 + @media screen and (min-width: 768px) + width: 720px + display: grid + grid-template-columns: 1fr 1fr + padding-left: 1rem + padding-right: 1rem + @media screen and (min-width: 992px) + width: 960px + @media screen and (min-width: 1200px) + width: 1140px + + .prev, + .next + display: block + position: relative + padding: 2rem + color: #ffffff + text-decoration: none + > .label + font-family: $font-semibold + font-size: 1.125rem + color: rgba(255, 255, 255, 0.6) + line-height: 1.2 + > .title + font-family: $font-medium + font-size: 2rem + color: white + line-height: 1.1 + +transition(color) + &:after + content: " " + position: absolute + display: block + top: 50% + transform: translateY(-50%) + height: 33px + width: 19px + background-repat: no-repeat + background-position: center + +transition(all) + &:hover + > .title + color: rgba(255, 255, 255, 0.6) + &:after + opacity: .6 + .prev + @media screen and (min-width: 768px) + margin-left: -2rem + border-bottom: none + text-align: left + border-bottom: 4px solid white + &:after + left: .25rem + @media screen and (min-width: 768px) + left: 0rem + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIzMyIgdmlld0JveD0iMCAwIDE5IDMzIj4gIDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI0IiBwb2ludHM9IjE2LjQ1NiAzMC45MTIgMiAxNi40NTYgMTYuNDU2IDIgMTYuNDU2IDIiLz48L3N2Zz4=) + &:hover + &:after + transform: translate(-4px, -50%) + .next + @media screen and (min-width: 768px) + margin-right: -2rem + text-align: right + &:after + right: .25rem + @media screen and (min-width: 768px) + right: 0 + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIzMyIgdmlld0JveD0iMCAwIDE5IDMzIj4gIDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI0IiBwb2ludHM9IjE2LjQ1NiAzMC45MTIgMiAxNi40NTYgMTYuNDU2IDIgMTYuNDU2IDIiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDE4LjQ1NiAwKSIvPjwvc3ZnPg==) + &:hover + &:after + transform: translate(4px, -50%) + .disabled + display: none + @media screen and (min-width: 768px) + visibility: hidden + display: block diff --git a/css/_navbar.sass b/css/_navbar.sass new file mode 100644 index 00000000..9db4bdfb --- /dev/null +++ b/css/_navbar.sass @@ -0,0 +1,59 @@ +.navbar + height: 56px + position: fixed + width: 100% + z-index: 4000 + top: 0 + left: 0 + right: 0 + +transition(all) + @media screen and (min-width: 768px) + overflow: initial + background-color: $nav-color + +transition(height) + &.-expanded + height: 100% + + @import "navbar/logo" + @import "navbar/divider" + @import "navbar/menu" + @import "navbar/search" + .search + position: fixed + top: 0 + right: 0 + float: right + display: block + height: 56px + padding: 0 8px + width: 56px + z-index: 3001 + + &:hover + opacity: .4 + +transition(opacity) + &.-expanded + .menu, .search + display: block + .menu + ul + >li + display: block + .submenu + position: relative + display: block + z-index: initial + box-shadow: none + border-radius: 0 + >li + >a + padding-left: 2rem + &:hover + color: #7293AF + &:hover + >a + background-color: transparent + &:after + content: '' + display: table + clear: both \ No newline at end of file diff --git a/css/_normalize.scss b/css/_normalize.scss new file mode 100644 index 00000000..fd669eb9 --- /dev/null +++ b/css/_normalize.scss @@ -0,0 +1,3 @@ +@import 'normalize/variables'; +@import 'normalize/vertical-rhythm'; +@import 'normalize/normalize-mixin'; diff --git a/css/_reset.sass b/css/_reset.sass new file mode 100644 index 00000000..b49096d4 --- /dev/null +++ b/css/_reset.sass @@ -0,0 +1,13 @@ +html + -webkit-box-sizing: border-box + -moz-box-sizing: border-box + box-sizing: border-box + +body + margin: 0 + padding: 0 + +*, *:before, *:after + -webkit-box-sizing: inherit + -moz-box-sizing: inherit + box-sizing: inherit \ No newline at end of file diff --git a/css/_search-form.sass b/css/_search-form.sass new file mode 100644 index 00000000..b2a3f56e --- /dev/null +++ b/css/_search-form.sass @@ -0,0 +1,111 @@ +body + position: relative + &.lock + height: 100% + overflow: hidden + .navbar + overflow: auto + height: 100% +.search-container + .search + z-index: 40001 +.search-form + position: absolute + top: 0 + left: 0 + right: 0 + width: 100% + height: 100% + overflow: auto + z-index: 4000 + background-color: white + pointer-events: none + opacity: 0 + overflow: auto + background-color: $primary-color + +transition(all) + >form + position: relative + &.show + opacity: 1 + pointer-events: auto + .search-field + -webkit-transform: scale(1) + -moz-transform: scale(1) + -ms-transform: scale(1) + -o-transform: scale(1) + transform: scale(1) + z-index: 1 + .search-field + position: relative + padding-left: 3rem + padding-top: 7px + padding-bottom: 7px + background-color: transparent + border-color: transparent + width: 100% + color: white + font-family: $font-semibold + border-radius: 0 + -webkit-transform: scale(1.1) + -moz-transform: scale(1.1) + -ms-transform: scale(1.1) + -o-transform: scale(1.1) + transform: scale(1.1) + +transition(all) + &::placeholder + color: rgba(255,255,255,.4) + .search-icon + position: absolute + top: 1rem + z-index: 1 + left: .875rem + height: 24px + width: 24px + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4gIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIgLTIpIj4gICAgPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+ICAgIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xMCwxNiBDNi42ODY2MTUzOCwxNiA0LDEzLjMxNTIzMDggNCwxMCBDNCw2LjY4NTY5MjMxIDYuNjg2NjE1MzgsNCAxMCw0IEMxMy4zMTMzODQ2LDQgMTYsNi42ODU2OTIzMSAxNiwxMCBDMTYsMTMuMzE1MjMwOCAxMy4zMTMzODQ2LDE2IDEwLDE2IE0xNi42MTc2MjY2LDE0LjQ5NjMwNjMgQzE3LjQ5MDAyNzEsMTMuMjE0ODk3NCAxOCwxMS42NjY5Njk1IDE4LDEwIEMxOCw1LjU4MjMxNTc5IDE0LjQxNzY4NDIsMiAxMCwyIEM1LjU4MjMxNTc5LDIgMiw1LjU4MjMxNTc5IDIsMTAgQzIsMTQuNDE4MTA1MyA1LjU4MjMxNTc5LDE4IDEwLDE4IEMxMS42NjY4ODcyLDE4IDEzLjIxNDg0MTcsMTcuNDkwMDQwMiAxNC40OTYyOTgxLDE2LjYxNzYxODQgTDE5LjMwNTM1MDcsMjEuNDI2NjcxMSBDMTkuODg5MDI4NSwyMi4wMTAzNDg5IDIwLjgzODgzNDgsMjIuMDEwNDA3NiAyMS40MjQ2MjEyLDIxLjQyNDYyMTIgQzIyLjAxNDQ5MTYsMjAuODM0NzUwOCAyMi4wMTEzMjU0LDE5Ljg5MDAwNTEgMjEuNDI2NjcxMSwxOS4zMDUzNTA3IEwxNi42MTc2MjY2LDE0LjQ5NjMwNjMgWiIvPiAgPC9nPjwvc3ZnPg==) + background-position: center + background-repeat: no-repeat + @media screen and (min-width: 768px) + left: 2rem + +.results-list + background-color: white + position: relative + height: 100% + margin-top: -56px + padding-top: 56px + overflow-y: scroll + &:before + content: "" + display: block + position: fixed + top: 0 + left: 0 + z-index: 0 + height: 56px + width: 100% + background-color: $primary-color + +#mkdocs-search-results + padding-left: 2rem + padding-right: 2rem + height: 100% + overflow-y: scroll + padding-top: 1rem + >p + font-size: 1.125rem + font-family: $font-semibold + >article + padding: 1.5rem 0rem + >h3 + margin-top: 0 + margin-bottom: 0 + >a + font-family: $font-medium + font-size: 1.375rem + color: #25323E + &:hover + color: #23b15e + >p + margin-bottom: 0 + color: #6D7881 \ No newline at end of file diff --git a/css/_sidebar.sass b/css/_sidebar.sass new file mode 100644 index 00000000..0a7f87fb --- /dev/null +++ b/css/_sidebar.sass @@ -0,0 +1,46 @@ +.sidebar + position: relative + background: #FAFBFC + +border-radius(4px) + padding-top: 1rem + padding-bottom: 1rem + @media screen and (min-width: 768px) + margin-top: 1rem + .sidenav + list-style-type: none + margin: 0 + padding: 0 + li + display: block + +transition(background-color) + a + text-decoration: none + display: block + font-size: 0.875rem + padding: 1rem 1rem 1rem 2rem + color: #6D7881 + font-family: $font-medium + line-height: 1 + +transition(box-shadow) + &.active + color: #25323E + font-family: $font-semibold + &.main + a + color: #3E4B56 + font-family: $font-semibold + padding-left: 1rem + &:hover + background-color: #EDEEF2 + &.affix + position: -webkit-sticky + position: sticky + top: 4.5rem + .indicator + position: absolute + width: 4px + left: 0 + top: 8px + height: 0 + background-color: $primary-green + +transition(all) diff --git a/css/_typography.sass b/css/_typography.sass new file mode 100644 index 00000000..ce9a6bd8 --- /dev/null +++ b/css/_typography.sass @@ -0,0 +1,63 @@ +html + -webkit-font-smoothing: antialiased + -moz-osx-font-smoothing: grayscale + + +body + font-family: $font-regular + font-size: 16px + font-weight: 400 + line-height: 1.60 + +h1 + font-family: $font-semibold + font-size: 2.25rem + line-height: 1.20 + margin-top: 0px + margin-bottom: 8px + word-spacing: 0.00px + text-transform: none + font-weight: normal + + +h2 + font-family: $font-semibold + font-size: 1.375rem + line-height: 1.20 + margin-top: 2rem + margin-bottom: 0.5rem + word-spacing: 0.00px + text-transform: none + font-weight: normal + +h3 + font-family: $font-semibold + font-size: 1.125rem + line-height: 1.20 + opacity: 1.00 + margin-top: 2rem + margin-bottom: 1rem + letter-spacing: 0.00px + word-spacing: 0.00px + text-transform: none + font-weight: normal + + +p + font-family: $font-regular + margin-top: 0px + margin-bottom: 1.5rem + font-size: 1rem + font-weight: normal + line-height: 1.60 + text-transform: none + color: #6D7881 + +ol,ul + color: #6D7881 + +b, strong + font-family: $font-semibold + font-weight: normal + + diff --git a/css/_variables.sass b/css/_variables.sass new file mode 100644 index 00000000..5ded517d --- /dev/null +++ b/css/_variables.sass @@ -0,0 +1,9 @@ +$primary-color: #154c7b +$primary-green: #23b15e + +$nav-color: $primary-color + +$font-bold: "ProximaNovaSoft-SemiBold", -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol" +$font-semibold: "ProximaNovaSoft-Semibold", -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol" +$font-medium: "ProximaNovaSoft-Semibold", -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol" +$font-regular: "ProximaNovaSoft-Regular", -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol" \ No newline at end of file diff --git a/css/font/ProximaNovaSoftWebfont.css b/css/font/ProximaNovaSoftWebfont.css new file mode 100644 index 00000000..6e3c6df5 --- /dev/null +++ b/css/font/ProximaNovaSoftWebfont.css @@ -0,0 +1,39 @@ +/* @license +* MyFonts Webfont Build ID 2313717, 2012-06-22T04:59:15-0400 +* +* The fonts listed in this notice are subject to the End User License +* Agreement(s) entered into by the website owner. All other parties are +* explicitly restricted from using the Licensed Webfonts(s). +* +* You may obtain a valid license at the URLs below. +* +* Webfont: Proxima Nova Soft Medium by Mark Simonson +* URL: http://www.myfonts.com/fonts/marksimonson/proxima-nova-soft/medium/ +* +* Webfont: Proxima Nova Soft Semibold by Mark Simonson +* URL: http://www.myfonts.com/fonts/marksimonson/proxima-nova-soft/semibold/ +* +* Webfont: Proxima Nova Soft Bold by Mark Simonson +* URL: http://www.myfonts.com/fonts/marksimonson/proxima-nova-soft/bold/ +* +* Webfont: Proxima Nova Soft Regular by Mark Simonson +* URL: http://www.myfonts.com/fonts/marksimonson/proxima-nova-soft/regular/ +* +* +* License: http://www.myfonts.com/viewlicense?type=web&buildid=2313717 +* Licensed pageviews: 200,000 +* Webfonts copyright: Copyright (c) Mark Simonson, 2010. All rights reserved. +* +* © 2012 Bitstream Inc +*/ + +@font-face {font-family: 'ProximaNovaSoft-Medium';src: url('webfonts/234DF5_0_0.eot');src: url('webfonts/234DF5_0_0.eot?#iefix') format('embedded-opentype'),url('webfonts/234DF5_0_0.woff') format('woff'),url('webfonts/234DF5_0_0.ttf') format('truetype');} + + +@font-face {font-family: 'ProximaNovaSoft-Semibold';src: url('webfonts/234DF5_1_0.eot');src: url('webfonts/234DF5_1_0.eot?#iefix') format('embedded-opentype'),url('webfonts/234DF5_1_0.woff') format('woff'),url('webfonts/234DF5_1_0.ttf') format('truetype');} + + +@font-face {font-family: 'ProximaNovaSoft-Bold';src: url('webfonts/234DF5_2_0.eot');src: url('webfonts/234DF5_2_0.eot?#iefix') format('embedded-opentype'),url('webfonts/234DF5_2_0.woff') format('woff'),url('webfonts/234DF5_2_0.ttf') format('truetype');} + + +@font-face {font-family: 'ProximaNovaSoft-Regular';src: url('webfonts/234DF5_3_0.eot');src: url('webfonts/234DF5_3_0.eot?#iefix') format('embedded-opentype'),url('webfonts/234DF5_3_0.woff') format('woff'),url('webfonts/234DF5_3_0.ttf') format('truetype');} \ No newline at end of file diff --git a/css/font/webfonts/234DF5_0_0.eot b/css/font/webfonts/234DF5_0_0.eot new file mode 100644 index 00000000..4d0f806c Binary files /dev/null and b/css/font/webfonts/234DF5_0_0.eot differ diff --git a/css/font/webfonts/234DF5_0_0.ttf b/css/font/webfonts/234DF5_0_0.ttf new file mode 100644 index 00000000..fd730afc Binary files /dev/null and b/css/font/webfonts/234DF5_0_0.ttf differ diff --git a/css/font/webfonts/234DF5_0_0.woff b/css/font/webfonts/234DF5_0_0.woff new file mode 100644 index 00000000..79edf4f6 Binary files /dev/null and b/css/font/webfonts/234DF5_0_0.woff differ diff --git a/css/font/webfonts/234DF5_1_0.eot b/css/font/webfonts/234DF5_1_0.eot new file mode 100644 index 00000000..400bdfe4 Binary files /dev/null and b/css/font/webfonts/234DF5_1_0.eot differ diff --git a/css/font/webfonts/234DF5_1_0.ttf b/css/font/webfonts/234DF5_1_0.ttf new file mode 100644 index 00000000..2dc1eff4 Binary files /dev/null and b/css/font/webfonts/234DF5_1_0.ttf differ diff --git a/css/font/webfonts/234DF5_1_0.woff b/css/font/webfonts/234DF5_1_0.woff new file mode 100644 index 00000000..e93d83fd Binary files /dev/null and b/css/font/webfonts/234DF5_1_0.woff differ diff --git a/css/font/webfonts/234DF5_2_0.eot b/css/font/webfonts/234DF5_2_0.eot new file mode 100644 index 00000000..1dbaf152 Binary files /dev/null and b/css/font/webfonts/234DF5_2_0.eot differ diff --git a/css/font/webfonts/234DF5_2_0.ttf b/css/font/webfonts/234DF5_2_0.ttf new file mode 100644 index 00000000..aea2612b Binary files /dev/null and b/css/font/webfonts/234DF5_2_0.ttf differ diff --git a/css/font/webfonts/234DF5_2_0.woff b/css/font/webfonts/234DF5_2_0.woff new file mode 100644 index 00000000..b63e2fdf Binary files /dev/null and b/css/font/webfonts/234DF5_2_0.woff differ diff --git a/css/font/webfonts/234DF5_3_0.eot b/css/font/webfonts/234DF5_3_0.eot new file mode 100644 index 00000000..3b9ff26a Binary files /dev/null and b/css/font/webfonts/234DF5_3_0.eot differ diff --git a/css/font/webfonts/234DF5_3_0.ttf b/css/font/webfonts/234DF5_3_0.ttf new file mode 100644 index 00000000..72c93bde Binary files /dev/null and b/css/font/webfonts/234DF5_3_0.ttf differ diff --git a/css/font/webfonts/234DF5_3_0.woff b/css/font/webfonts/234DF5_3_0.woff new file mode 100644 index 00000000..6a4ad54f Binary files /dev/null and b/css/font/webfonts/234DF5_3_0.woff differ diff --git a/css/main-above.css b/css/main-above.css new file mode 100644 index 00000000..b757a634 --- /dev/null +++ b/css/main-above.css @@ -0,0 +1,2 @@ +html{-webkit-box-sizing:border-box;box-sizing:border-box}body{margin:0;padding:0}*,*:before,*:after{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:"ProximaNovaSoft-Regular",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;font-weight:400;line-height:1.6}h1{font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:2.25rem;line-height:1.2;margin-top:0px;margin-bottom:8px;word-spacing:0px;text-transform:none;font-weight:normal}h2{font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1.375rem;line-height:1.2;margin-top:2rem;margin-bottom:.5rem;word-spacing:0px;text-transform:none;font-weight:normal}h3{font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1.125rem;line-height:1.2;opacity:1;margin-top:2rem;margin-bottom:1rem;letter-spacing:0px;word-spacing:0px;text-transform:none;font-weight:normal}p{font-family:"ProximaNovaSoft-Regular",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";margin-top:0px;margin-bottom:1.5rem;font-size:1rem;font-weight:normal;line-height:1.6;text-transform:none;color:#6D7881}ol,ul{color:#6D7881}b,strong{font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:normal}html{height:100%}body{min-height:100%;padding-top:5rem}.container{display:block}.content{padding-top:1rem;margin-top:-2rem}.content>h1[id]{margin-top:3rem}.content>h1[id]::before,.content>h2[id]::before,.content>h3[id]::before,.content>h4[id]::before{display:block;height:4.5rem;margin-top:-4.5rem;visibility:hidden;content:""}.content>h1[id]:focus,.content>h2[id]:focus,.content>h3[id]:focus,.content>h4[id]:focus{outline:none}@media screen and (min-width: 576px){.container{width:540px}}@media screen and (min-width: 768px){.container{width:720px}}@media screen and (min-width: 992px){.container{width:960px;display:-ms-grid;display:grid}.container.-layout-3-9{-ms-grid-columns:1fr 3fr;grid-template-columns:1fr 3fr}.container.-layout-6-6{display:-ms-grid;display:grid;-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.container.fluid{width:100%}}@media screen and (min-width: 1200px){.container{width:1140px}}.container{position:relative;margin:0 auto;grid-gap:2rem;max-width:100%;padding-right:1rem;padding-left:1rem;-webkit-box-sizing:border-box;box-sizing:border-box}a{color:#23B15E;text-decoration:none;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}a:hover{text-decoration:underline}a:focus{outline:3px solid #c1e0fe;outline:3px solid rgba(131,192,253,0.5);outline-offset:1px}input[type='text'],input[type='textarea'],input[type='email'],input[type='password'],input[type='tel']{padding:0 1rem;font-family:"ProximaNovaSoft-Regular",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;line-height:2.5;border-style:solid;border-width:1px;border-color:#EDEEF2;border-radius:4px}li>p{margin-bottom:.875em}pre,.rst-content tt{max-width:100%;overflow-x:auto}hr{margin-top:24px;margin-bottom:24px;border:0;border-top:1px solid #eee}pre{display:block;margin-bottom:1rem;padding:8px 12px}code{font-size:.875rem;padding:4px 6px;white-space:pre-wrap;word-wrap:break-word;color:#25323E}pre,code{word-wrap:normal;border-radius:4px;background-color:#F2F3F4}pre>.hljs,code>.hljs{background-color:#F2F3F4}img{width:100%;height:auto;display:block}blockquote{margin:0 0 1.5rem 0rem;padding:.875rem 1.5rem;border-left:4px solid #eee}blockquote p{margin-bottom:0;font-size:1.25rem;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}.navbar{height:56px;position:fixed;width:100%;z-index:4000;top:0;left:0;right:0;-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all;background-color:#154c7b;-webkit-border-transition:.25s ease-out height;-moz-border-transition:.25s ease-out height;-ms-border-transition:.25s ease-out height;-webkit-transition:.25s ease-out height;transition:.25s ease-out height}@media screen and (min-width: 768px){.navbar{overflow:initial}}.navbar.-expanded{height:100%}.navbar .logo{padding:12px 12px;display:block;position:absolute;width:100%;top:0;left:0;right:0;z-index:1098;line-height:0;cursor:pointer;text-align:center}.navbar .logo>img{height:32px;width:140px;margin-left:auto;margin-right:auto}@media screen and (min-width: 768px){.navbar .logo{position:relative;display:inline-block;float:left;width:auto;text-align:left}}.navbar .divider{display:none;float:left;margin-top:16px;height:24px;width:2px;border-radius:100px;background-color:rgba(37,50,62,0.2)}@media screen and (min-width: 768px){.navbar .divider{display:block}}.navbar .menu{position:relative;pointer-events:none;display:block;-webkit-border-transition:.25s ease-out opacity;-moz-border-transition:.25s ease-out opacity;-ms-border-transition:.25s ease-out opacity;-webkit-transition:.25s ease-out opacity;transition:.25s ease-out opacity;-webkit-transition-delay:300ms,300ms;transition-delay:300ms,300ms;position:absolute;pointer-events:none;top:64px;left:0;width:100%;opacity:0;-webkit-transform:scale(1.1);transform:scale(1.1);-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.navbar .menu.-show{opacity:1;-webkit-transform:scale(1);transform:scale(1);pointer-events:auto}@media screen and (min-width: 768px){.navbar .menu{display:inline-block;float:left;pointer-events:auto;display:inline-block;float:left;position:relative;pointer-events:auto;width:auto;top:0;opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.navbar .menu>ul{position:relative;padding:0;margin:0;list-style-type:none}.navbar .menu>ul>li{position:relative;display:block}@media screen and (min-width: 768px){.navbar .menu>ul>li{display:inline-block}}.navbar .menu>ul>li>a{display:block;position:relative;padding:20px 16px;text-decoration:none;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1.125rem;color:#A2B8CA;line-height:1;-webkit-border-transition:.25s ease-out color;-moz-border-transition:.25s ease-out color;-ms-border-transition:.25s ease-out color;-webkit-transition:.25s ease-out color;transition:.25s ease-out color}.navbar .menu>ul>li>a:hover{color:#7293AF}.navbar .menu>ul>li>a.dropdown{padding-right:1.875rem}.navbar .menu>ul>li>a.dropdown:after{content:"";display:block;position:absolute;top:50%;right:1rem;height:6px;width:10px;opacity:.6;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgMTAgNiI+ICA8cG9seWxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgcG9pbnRzPSI5OCAyNiAxMDIgMzAgMTA2IDI2IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTcgLTI1KSIvPjwvc3ZnPg==);background-repeat:no-repeat;background-size:cover;-webkit-border-transition:.25s ease-out opacity;-moz-border-transition:.25s ease-out opacity;-ms-border-transition:.25s ease-out opacity;-webkit-transition:.25s ease-out opacity;transition:.25s ease-out opacity}.navbar .menu>ul>li>a.dropdown:hover:after{opacity:.4}@media screen and (min-width: 768px){.navbar .menu>ul>li>a{font-size:1rem}}.navbar .menu>ul>li.current>a{color:#fff}.navbar .menu>ul>li.current>a:hover{color:#7293AF}.navbar .menu>ul>li:hover>.submenu{display:block}.navbar .menu>ul>li:focus>a{border:3px solid blue}.navbar .menu>ul>li .submenu{display:none;position:absolute;padding:0 0 8px 0;top:100%;left:0;z-index:-1;min-width:190px;border-bottom-left-radius:8px;border-bottom-right-radius:8px;-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);box-shadow:0 3px 8px 0 rgba(0,0,0,0.2)}@media screen and (min-width: 768px){.navbar .menu>ul>li .submenu{background-color:#154c7b}}.navbar .menu>ul>li .submenu>li{display:block}.navbar .menu>ul>li .submenu>li>a{display:block;padding:16px;padding:20px 16px;text-decoration:none;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";color:#A2B8CA;line-height:1;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}.navbar .menu>ul>li .submenu>li:hover>a{color:#fff;background-color:#113f65}.navbar .search{height:24px;width:24px;position:relative;-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.navbar .search.cross:before{-webkit-transform:translate(-50%, -50%) scale(1);transform:translate(-50%, -50%) scale(1)}.navbar .search.cross:after{-webkit-transform:translate(-50%, -50%) scale(0);transform:translate(-50%, -50%) scale(0)}.navbar .search.hide{-webkit-transform:scale(0);transform:scale(0);opacity:0}.navbar .search:before{content:"";display:block;position:absolute;height:16px;width:16px;top:50%;left:50%;-webkit-transform:translate(-50%, -50%) scale(0);transform:translate(-50%, -50%) scale(0);background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOSIgdmlld0JveD0iMCAwIDE5IDE5Ij4gIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS13aWR0aD0iMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSI+ICAgIDxwYXRoIGQ9Ik0wLjA4MzYyOTc0OTgsMC4wNDQ5MjEyMzA4IEwxNS4zMTQzMTQ1LDE1LjI3NTYwNiIvPiAgICA8cGF0aCBkPSJNMC4wODM2Mjk3NDk4LDAuMDQ0OTIxMjMwOCBMMTUuMzE0MzE0NSwxNS4yNzU2MDYiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDE1LjM5OCAwKSIvPiAgPC9nPjwvc3ZnPg==);background-size:cover;background-position:center;background-repeat:no-repeat;-webkit-transform:scale(0);transform:scale(0);-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.navbar .search:after{content:"";display:block;position:absolute;height:24px;width:24px;top:50%;left:50%;-webkit-transform:translate(-50%, -50%) scale(1);transform:translate(-50%, -50%) scale(1);background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4gIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIgLTIpIj4gICAgPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+ICAgIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xMCwxNiBDNi42ODY2MTUzOCwxNiA0LDEzLjMxNTIzMDggNCwxMCBDNCw2LjY4NTY5MjMxIDYuNjg2NjE1MzgsNCAxMCw0IEMxMy4zMTMzODQ2LDQgMTYsNi42ODU2OTIzMSAxNiwxMCBDMTYsMTMuMzE1MjMwOCAxMy4zMTMzODQ2LDE2IDEwLDE2IE0xNi42MTc2MjY2LDE0LjQ5NjMwNjMgQzE3LjQ5MDAyNzEsMTMuMjE0ODk3NCAxOCwxMS42NjY5Njk1IDE4LDEwIEMxOCw1LjU4MjMxNTc5IDE0LjQxNzY4NDIsMiAxMCwyIEM1LjU4MjMxNTc5LDIgMiw1LjU4MjMxNTc5IDIsMTAgQzIsMTQuNDE4MTA1MyA1LjU4MjMxNTc5LDE4IDEwLDE4IEMxMS42NjY4ODcyLDE4IDEzLjIxNDg0MTcsMTcuNDkwMDQwMiAxNC40OTYyOTgxLDE2LjYxNzYxODQgTDE5LjMwNTM1MDcsMjEuNDI2NjcxMSBDMTkuODg5MDI4NSwyMi4wMTAzNDg5IDIwLjgzODgzNDgsMjIuMDEwNDA3NiAyMS40MjQ2MjEyLDIxLjQyNDYyMTIgQzIyLjAxNDQ5MTYsMjAuODM0NzUwOCAyMi4wMTEzMjU0LDE5Ljg5MDAwNTEgMjEuNDI2NjcxMSwxOS4zMDUzNTA3IEwxNi42MTc2MjY2LDE0LjQ5NjMwNjMgWiIvPiAgPC9nPjwvc3ZnPg==);background-position:center;background-repeat:no-repeat;-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.navbar .search{position:fixed;top:0;right:0;float:right;display:block;height:56px;padding:0 8px;width:56px;z-index:3001}.navbar .search:hover{opacity:.4;-webkit-border-transition:.25s ease-out opacity;-moz-border-transition:.25s ease-out opacity;-ms-border-transition:.25s ease-out opacity;-webkit-transition:.25s ease-out opacity;transition:.25s ease-out opacity}.navbar.-expanded .menu,.navbar.-expanded .search{display:block}.navbar.-expanded .menu ul>li{display:block}.navbar.-expanded .menu ul>li .submenu{position:relative;display:block;z-index:initial;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.navbar.-expanded .menu ul>li .submenu>li>a{padding-left:2rem}.navbar.-expanded .menu ul>li .submenu>li>a:hover{color:#7293AF}.navbar.-expanded .menu ul>li .submenu>li:hover>a{background-color:transparent}.navbar:after{content:"";display:table;clear:both}.sidebar{position:relative;background:#FAFBFC;border-radius:4px;padding-top:1rem;padding-bottom:1rem}@media screen and (min-width: 768px){.sidebar{margin-top:1rem}}.sidebar .sidenav{list-style-type:none;margin:0;padding:0}.sidebar .sidenav li{display:block;-webkit-border-transition:.25s ease-out background-color;-moz-border-transition:.25s ease-out background-color;-ms-border-transition:.25s ease-out background-color;-webkit-transition:.25s ease-out background-color;transition:.25s ease-out background-color}.sidebar .sidenav li a{text-decoration:none;display:block;font-size:.875rem;padding:1rem 1rem 1rem 2rem;color:#6D7881;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";line-height:1;-webkit-border-transition:.25s ease-out box-shadow;-moz-border-transition:.25s ease-out box-shadow;-ms-border-transition:.25s ease-out box-shadow;-webkit-transition:.25s ease-out box-shadow;transition:.25s ease-out box-shadow}.sidebar .sidenav li a.active{color:#25323E;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}.sidebar .sidenav li.main a{color:#3E4B56;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";padding-left:1rem}.sidebar .sidenav li:hover{background-color:#EDEEF2}.sidebar.affix{position:-webkit-sticky;position:sticky;top:4.5rem}.sidebar .indicator{position:absolute;width:4px;left:0;top:8px;height:0;background-color:#23b15e;-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.menu-toggle{display:block;position:relative;z-index:2000;float:left;padding:19px 18px;background-color:none;-webkit-appearance:none !important}.menu-toggle .bar-container{-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.menu-toggle span[class^='bar']{display:block;width:16px;height:2px;margin-bottom:4px;background-color:#fff;border-radius:2px;-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.menu-toggle.-toggle .bar-container{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.menu-toggle.-toggle .bar-1{-webkit-transform:translateY(6px) rotate(90deg);transform:translateY(6px) rotate(90deg)}.menu-toggle.-toggle .bar-3{-webkit-transform:translateY(-6px);transform:translateY(-6px)}@media screen and (min-width: 768px){.menu-toggle{display:none}}body{position:relative}body.lock{height:100%;overflow:hidden}body.lock .navbar{overflow:auto;height:100%}.search-container .search{z-index:40001}.search-form{position:absolute;top:0;left:0;right:0;width:100%;height:100%;overflow:auto;z-index:4000;background-color:#fff;pointer-events:none;opacity:0;overflow:auto;background-color:#154c7b;-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.search-form>form{position:relative}.search-form.show{opacity:1;pointer-events:auto}.search-form.show .search-field{-webkit-transform:scale(1);transform:scale(1);z-index:1}.search-form .search-field{position:relative;padding-left:3rem;padding-top:7px;padding-bottom:7px;background-color:transparent;border-color:transparent;width:100%;color:#fff;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";border-radius:0;-webkit-transform:scale(1.1);transform:scale(1.1);-webkit-border-transition:.25s ease-out all;-moz-border-transition:.25s ease-out all;-ms-border-transition:.25s ease-out all;-webkit-transition:.25s ease-out all;transition:.25s ease-out all}.search-form .search-field::-webkit-input-placeholder{color:rgba(255,255,255,0.4)}.search-form .search-field:-ms-input-placeholder{color:rgba(255,255,255,0.4)}.search-form .search-field::placeholder{color:rgba(255,255,255,0.4)}.search-form .search-icon{position:absolute;top:1rem;z-index:1;left:.875rem;height:24px;width:24px;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4gIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIgLTIpIj4gICAgPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+ICAgIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xMCwxNiBDNi42ODY2MTUzOCwxNiA0LDEzLjMxNTIzMDggNCwxMCBDNCw2LjY4NTY5MjMxIDYuNjg2NjE1MzgsNCAxMCw0IEMxMy4zMTMzODQ2LDQgMTYsNi42ODU2OTIzMSAxNiwxMCBDMTYsMTMuMzE1MjMwOCAxMy4zMTMzODQ2LDE2IDEwLDE2IE0xNi42MTc2MjY2LDE0LjQ5NjMwNjMgQzE3LjQ5MDAyNzEsMTMuMjE0ODk3NCAxOCwxMS42NjY5Njk1IDE4LDEwIEMxOCw1LjU4MjMxNTc5IDE0LjQxNzY4NDIsMiAxMCwyIEM1LjU4MjMxNTc5LDIgMiw1LjU4MjMxNTc5IDIsMTAgQzIsMTQuNDE4MTA1MyA1LjU4MjMxNTc5LDE4IDEwLDE4IEMxMS42NjY4ODcyLDE4IDEzLjIxNDg0MTcsMTcuNDkwMDQwMiAxNC40OTYyOTgxLDE2LjYxNzYxODQgTDE5LjMwNTM1MDcsMjEuNDI2NjcxMSBDMTkuODg5MDI4NSwyMi4wMTAzNDg5IDIwLjgzODgzNDgsMjIuMDEwNDA3NiAyMS40MjQ2MjEyLDIxLjQyNDYyMTIgQzIyLjAxNDQ5MTYsMjAuODM0NzUwOCAyMi4wMTEzMjU0LDE5Ljg5MDAwNTEgMjEuNDI2NjcxMSwxOS4zMDUzNTA3IEwxNi42MTc2MjY2LDE0LjQ5NjMwNjMgWiIvPiAgPC9nPjwvc3ZnPg==);background-position:center;background-repeat:no-repeat}@media screen and (min-width: 768px){.search-form .search-icon{left:2rem}}.results-list{background-color:#fff;position:relative;height:100%;margin-top:-56px;padding-top:56px;overflow-y:scroll}.results-list:before{content:"";display:block;position:fixed;top:0;left:0;z-index:0;height:56px;width:100%;background-color:#154c7b}#mkdocs-search-results{padding-left:2rem;padding-right:2rem;height:100%;overflow-y:scroll;padding-top:1rem}#mkdocs-search-results>p{font-size:1.125rem;font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}#mkdocs-search-results>article{padding:1.5rem 0rem}#mkdocs-search-results>article>h3{margin-top:0;margin-bottom:0}#mkdocs-search-results>article>h3>a{font-family:"ProximaNovaSoft-Semibold",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1.375rem;color:#25323E}#mkdocs-search-results>article>h3>a:hover{color:#23b15e}#mkdocs-search-results>article>p{margin-bottom:0;color:#6D7881} +/*# sourceMappingURL=main-above.css.map */ \ No newline at end of file diff --git a/css/main-above.css.map b/css/main-above.css.map new file mode 100644 index 00000000..8bc2c7e5 --- /dev/null +++ b/css/main-above.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAAA,IAAI,CACH,kBAAkB,CAAE,UAAU,CAC9B,eAAe,CAAE,UAAU,CAC3B,UAAU,CAAE,UAAU,CAEvB,IAAI,CACH,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAEX,kBAAoB,CACnB,kBAAkB,CAAE,OAAO,CAC3B,eAAe,CAAE,OAAO,CACxB,UAAU,CAAE,OAAO,CCZpB,IAAI,CACA,sBAAsB,CAAE,WAAW,CACnC,uBAAuB,CAAE,SAAS,CAGtC,IAAI,CACA,WAAW,CCEA,qKAAsK,CDDjL,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,GAAG,CAChB,WAAW,CAAE,GAAI,CAErB,EAAE,CACE,WAAW,CCNC,sKAAuK,CDOnL,SAAS,CAAE,OAAO,CAClB,WAAW,CAAE,GAAI,CACjB,UAAU,CAAE,GAAG,CACf,aAAa,CAAE,GAAG,CAClB,YAAY,CAAE,GAAM,CACpB,cAAc,CAAE,IAAI,CACpB,WAAW,CAAE,MAAM,CAGvB,EAAE,CACE,WAAW,CCjBC,sKAAuK,CDkBnL,SAAS,CAAE,QAAQ,CACnB,WAAW,CAAE,GAAI,CACjB,UAAU,CAAE,IAAI,CAChB,aAAa,CAAE,KAAM,CACrB,YAAY,CAAE,GAAM,CACpB,cAAc,CAAE,IAAI,CACpB,WAAW,CAAE,MAAM,CAEvB,EAAE,CACE,WAAW,CC3BC,sKAAuK,CD4BnL,SAAS,CAAE,QAAQ,CACnB,WAAW,CAAE,GAAI,CACjB,OAAO,CAAE,CAAI,CACb,UAAU,CAAE,IAAI,CAChB,aAAa,CAAE,IAAI,CACnB,cAAc,CAAE,GAAM,CACtB,YAAY,CAAE,GAAM,CACpB,cAAc,CAAE,IAAI,CACpB,WAAW,CAAE,MAAM,CAGvB,CAAC,CACG,WAAW,CCtCA,qKAAsK,CDuCjL,UAAU,CAAE,GAAG,CACf,aAAa,CAAE,MAAM,CACrB,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,MAAM,CACnB,WAAW,CAAE,GAAI,CACjB,cAAc,CAAE,IAAI,CACpB,KAAK,CAAE,OAAO,CAElB,KAAK,CACD,KAAK,CAAE,OAAO,CAElB,QAAS,CACL,WAAW,CCrDC,sKAAuK,CDsDnL,WAAW,CAAE,MAAM,CE5DvB,IAAI,CACH,MAAM,CAAE,IAAI,CACb,IAAI,CACH,UAAU,CAAE,IAAI,CAChB,WAAW,CAAE,IAAI,CAElB,UAAU,CACT,OAAO,CAAE,KAAK,CAEf,QAAQ,CACP,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,KAAK,CACjB,eAAO,CACN,UAAU,CAAE,IAAI,CACjB,+FAAkE,CACjE,OAAO,CAAE,KAAK,CACd,MAAM,CAAE,MAAM,CACd,UAAU,CAAE,OAAO,CACnB,UAAU,CAAE,MAAM,CAClB,OAAO,CAAE,EAAE,CACZ,uFAAc,CAIb,OAAO,CAAE,IAAI,CCxBf,oCAAoC,CACnC,UAAU,CACT,KAAK,CAAE,KAAK,EAEd,oCAAoC,CACnC,UAAU,CACT,KAAK,CAAE,KAAK,EAEd,oCAAoC,CACnC,UAAU,CACT,KAAK,CAAE,KAAK,CACZ,OAAO,CAAE,IAAI,CACb,sBAAa,CACZ,qBAAqB,CAAE,OAAO,CAC/B,sBAAa,CACZ,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,OAAO,CAC/B,gBAAO,CACN,KAAK,CAAE,IAAI,EAEd,qCAAqC,CACpC,UAAU,CACT,KAAK,CAAE,MAAM,EAEf,UAAU,CACT,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,MAAM,CACd,QAAQ,CAAE,IAAI,CACd,SAAS,CAAE,IAAI,CACf,aAAa,CAAE,IAAI,CACnB,YAAY,CAAE,IAAI,CAClB,UAAU,CAAE,UAAU,CC/BvB,CAAC,CACA,KAAK,CAAE,OAAO,CACd,eAAe,CAAE,IAAI,CACrB,WAAW,CHIE,sKAAuK,CGHpL,OAAO,CACN,eAAe,CAAE,SAAS,CAC3B,OAAO,CACN,OAAO,CAAE,iBAAiB,CAC1B,OAAO,CAAE,+BAAkC,CAC3C,cAAc,CAAE,GAAG,CAErB,sGAAmB,CAKlB,OAAO,CAAE,MAAM,CACf,WAAW,CHTG,qKAAsK,CGUpL,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,GAAG,CAChB,YAAY,CAAE,KAAK,CACnB,YAAY,CAAE,GAAG,CACjB,YAAY,CAAE,OAAO,CACrB,aAAa,CAAE,GAAG,CAGlB,IAAG,CACF,aAAa,CAAE,MAAO,CAExB,mBAAoB,CACnB,SAAS,CAAE,IAAI,CACf,UAAU,CAAE,IAAI,CAEjB,EAAE,CACD,UAAU,CAAE,IAAI,CAChB,aAAa,CAAE,IAAI,CACnB,MAAM,CAAE,CAAC,CACT,UAAU,CAAE,cAAc,CAE3B,GAAG,CACF,OAAO,CAAE,KAAK,CACd,aAAa,CAAE,IAAI,CACnB,OAAO,CAAE,QAAQ,CAElB,IAAI,CACH,SAAS,CAAE,OAAQ,CACnB,OAAO,CAAE,OAAO,CAChB,WAAW,CAAE,QAAQ,CACrB,SAAS,CAAE,UAAU,CACrB,KAAK,CAAE,OAAO,CAEf,QAAS,CACR,SAAS,CAAE,MAAM,CACjB,aAAa,CAAE,GAAG,CAClB,gBAAgB,CAAE,OAAO,CACzB,oBAAM,CACL,gBAAgB,CAAE,OAAO,CAE3B,GAAG,CACF,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,KAAK,CAEf,UAAU,CACT,MAAM,CAAE,eAAe,CACvB,OAAO,CAAE,cAAe,CACxB,WAAW,CAAE,cAAc,CAC3B,YAAC,CACA,aAAa,CAAE,CAAC,CAChB,SAAS,CAAE,OAAO,CAClB,WAAW,CH/DC,sKAAuK,CIPrL,OAAO,CACN,MAAM,CAAE,IAAI,CACZ,QAAQ,CAAE,KAAK,CACf,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CCAR,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CDCnC,gBAAgB,CJRL,OAAc,CKIzB,yBAAyB,CAAE,oBAAuB,CAClD,sBAAsB,CAAE,oBAAuB,CAC/C,qBAAqB,CAAE,oBAAuB,CAC9C,UAAU,CAAE,oBAAuB,CDDnC,oCAAoC,CATrC,OAAO,CAUL,QAAQ,CAAE,OAAO,EAGlB,iBAAW,CACV,MAAM,CAAE,IAAI,CEdd,aAAK,CACJ,OAAO,CAAE,SAAS,CAClB,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CACR,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,CAAC,CACd,MAAM,CAAE,OAAO,CACf,UAAU,CAAE,MAAM,CAClB,iBAAI,CACH,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,KAAK,CACZ,WAAW,CAAE,IAAI,CACjB,YAAY,CAAE,IAAI,CAEnB,oCAAoC,CAlBrC,aAAK,CAmBH,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,IAAI,CACX,KAAK,CAAE,IAAI,CACX,UAAU,CAAE,IAAI,ECvBlB,gBAAQ,CACP,OAAO,CAAE,IAAI,CACb,KAAK,CAAE,IAAI,CACX,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,GAAG,CACV,aAAa,CAAE,KAAK,CACpB,gBAAgB,CAAE,kBAAmB,CACrC,oCAAoC,CARrC,gBAAQ,CASN,OAAO,CAAE,KAAK,ECThB,aAAK,CACJ,QAAQ,CAAE,QAAQ,CAClB,cAAc,CAAE,IAAI,CACpB,OAAO,CAAE,KAAK,CHId,yBAAyB,CAAE,qBAAuB,CAClD,sBAAsB,CAAE,qBAAuB,CAC/C,qBAAqB,CAAE,qBAAuB,CAC9C,UAAU,CAAE,qBAAuB,CGLnC,wBAAwB,CAAE,WAAY,CACtC,gBAAgB,CAAE,WAAY,CAC9B,QAAQ,CAAE,QAAQ,CAClB,cAAc,CAAE,IAAI,CACpB,GAAG,CAAE,IAAI,CACT,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,CAAC,CACV,iBAAiB,CAAE,UAAU,CAC7B,cAAc,CAAE,UAAU,CAC1B,aAAa,CAAE,UAAU,CACzB,YAAY,CAAE,UAAU,CACxB,SAAS,CAAE,UAAU,CHVrB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CGSnC,mBAAO,CACN,OAAO,CAAE,CAAC,CACV,iBAAiB,CAAE,QAAQ,CAC3B,cAAc,CAAE,QAAQ,CACxB,aAAa,CAAE,QAAQ,CACvB,YAAY,CAAE,QAAQ,CACtB,SAAS,CAAE,QAAQ,CACnB,cAAc,CAAE,IAAI,CACrB,oCAAoC,CA3BrC,aAAK,CA4BH,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,IAAI,CACX,cAAc,CAAE,IAAI,CACpB,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,QAAQ,CAClB,cAAc,CAAE,IAAI,CACpB,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,CAAC,CACN,OAAO,CAAE,CAAC,CACV,SAAS,CAAE,QAAQ,EACpB,gBAAI,CACH,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,CAAC,CACV,MAAM,CAAE,CAAC,CACT,eAAe,CAAE,IAAI,CACrB,mBAAI,CACH,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,KAAK,CACd,oCAAoC,CAHrC,mBAAI,CAIF,OAAO,CAAE,YAAY,EACtB,qBAAG,CACF,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,SAAS,CAClB,eAAe,CAAE,IAAI,CACrB,WAAW,CRhDC,sKAAuK,CQiDnL,SAAS,CAAE,QAAQ,CACnB,KAAK,CAAE,OAAO,CACd,WAAW,CAAE,CAAC,CHlDjB,yBAAyB,CAAE,mBAAuB,CAClD,sBAAsB,CAAE,mBAAuB,CAC/C,qBAAqB,CAAE,mBAAuB,CAC9C,UAAU,CAAE,mBAAuB,CGiDhC,2BAAO,CACN,KAAK,CAAE,OAAO,CACf,8BAAU,CACT,aAAa,CAAE,QAAQ,CACvB,oCAAO,CACN,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,GAAG,CACR,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,GAAG,CACX,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,EAAE,CACX,iBAAiB,CAAE,gBAAgB,CACnC,cAAc,CAAE,gBAAgB,CAChC,aAAa,CAAE,gBAAgB,CAC/B,YAAY,CAAE,gBAAgB,CAC9B,SAAS,CAAE,gBAAgB,CAC3B,gBAAgB,CAAE,+WAA+W,CACjY,iBAAiB,CAAE,SAAS,CAC5B,eAAe,CAAE,KAAK,CHxE3B,yBAAyB,CAAE,qBAAuB,CAClD,sBAAsB,CAAE,qBAAuB,CAC/C,qBAAqB,CAAE,qBAAuB,CAC9C,UAAU,CAAE,qBAAuB,CGwE9B,0CAAO,CACN,OAAO,CAAE,EAAE,CACd,oCAAoC,CAnCrC,qBAAG,CAoCD,SAAS,CAAE,IAAI,EAEhB,6BAAG,CACF,KAAK,CAAE,IAAK,CACZ,mCAAO,CACN,KAAK,CAAE,OAAO,CAEhB,kCAAU,CACT,OAAO,CAAE,KAAK,CAEf,2BAAG,CACF,MAAM,CAAE,cAAc,CACxB,4BAAQ,CACP,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,SAAS,CAClB,GAAG,CAAE,IAAI,CACT,IAAI,CAAE,CAAC,CACP,OAAO,CAAE,EAAE,CACX,SAAS,CAAE,KAAK,CAGhB,yBAAyB,CAAE,GAAG,CAC9B,0BAA0B,CAAE,GAAG,CAC/B,UAAU,CAAE,2BAA4B,CAJxC,oCAAoC,CARrC,4BAAQ,CASN,gBAAgB,CRvGT,OAAc,EQ2GtB,+BAAI,CACH,OAAO,CAAE,KAAK,CACd,iCAAG,CACF,OAAO,CAAE,KAAK,CACd,OAAO,CAAE,IAAI,CACb,OAAO,CAAE,SAAS,CAClB,eAAe,CAAE,IAAI,CACrB,WAAW,CR/GD,sKAAuK,CQgHjL,KAAK,CAAE,OAAO,CACd,WAAW,CAAE,CAAC,CACd,WAAW,CRjHH,sKAAuK,CQmH/K,uCAAG,CACF,KAAK,CAAE,IAAK,CACZ,gBAAgB,CAAE,OAA0B,CC5HnD,eAAO,CACN,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,QAAQ,CJIlB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CIJlC,4BAAQ,CACP,SAAS,CAAE,8BAA6B,CACzC,2BAAO,CACN,SAAS,CAAE,8BAA6B,CAC1C,oBAAM,CACL,SAAS,CAAE,QAAQ,CACnB,OAAO,CAAE,CAAC,CACX,sBAAQ,CACP,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,GAAG,CACR,IAAI,CAAE,GAAG,CACT,SAAS,CAAE,8BAA6B,CACxC,gBAAgB,CAAE,2hBAA2hB,CAC7iB,eAAe,CAAE,KAAK,CACtB,mBAAmB,CAAE,MAAM,CAC3B,iBAAiB,CAAE,SAAS,CAC5B,SAAS,CAAE,QAAQ,CJnBpB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CIkBnC,qBAAO,CACN,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,GAAG,CACR,IAAI,CAAE,GAAG,CACT,SAAS,CAAE,8BAA6B,CACxC,gBAAgB,CAAE,miCAAmiC,CACrjC,mBAAmB,CAAE,MAAM,CAC3B,iBAAiB,CAAE,SAAS,CJhC7B,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CDUnC,eAAO,CACN,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,KAAK,CAAE,CAAC,CACR,KAAK,CAAE,KAAK,CACZ,OAAO,CAAE,KAAK,CACd,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,IAAI,CAEb,qBAAO,CACN,OAAO,CAAE,EAAE,CCzBb,yBAAyB,CAAE,qBAAuB,CAClD,sBAAsB,CAAE,qBAAuB,CAC/C,qBAAqB,CAAE,qBAAuB,CAC9C,UAAU,CAAE,qBAAuB,CDyBlC,iDAAc,CACb,OAAO,CAAE,KAAK,CAGb,6BAAG,CACF,OAAO,CAAE,KAAK,CACd,sCAAQ,CACP,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,KAAK,CACd,OAAO,CAAE,OAAO,CAChB,UAAU,CAAE,IAAI,CAChB,aAAa,CAAE,CAAC,CAEf,2CAAE,CACD,YAAY,CAAE,IAAI,CAClB,iDAAO,CACN,KAAK,CAAE,OAAO,CAEf,iDAAE,CACD,gBAAgB,CAAE,WAAW,CACrC,aAAO,CACN,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CM1Db,QAAQ,CACP,QAAQ,CAAE,QAAQ,CAClB,UAAU,CAAE,OAAO,CLDnB,qBAAqB,CKEN,GAAG,CLDlB,kBAAkB,CKCH,GAAG,CLAlB,iBAAiB,CKAF,GAAG,CLClB,aAAa,CKDE,GAAG,CAClB,WAAW,CAAE,IAAI,CACjB,cAAc,CAAE,IAAI,CACpB,oCAAoC,CANrC,QAAQ,CAON,UAAU,CAAE,IAAI,EACjB,iBAAQ,CACP,eAAe,CAAE,IAAI,CACrB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CACV,oBAAE,CACD,OAAO,CAAE,KAAK,CLNhB,yBAAyB,CAAE,8BAAuB,CAClD,sBAAsB,CAAE,8BAAuB,CAC/C,qBAAqB,CAAE,8BAAuB,CAC9C,UAAU,CAAE,8BAAuB,CKKjC,sBAAC,CACA,eAAe,CAAE,IAAI,CACrB,OAAO,CAAE,KAAK,CACd,SAAS,CAAE,OAAQ,CACnB,OAAO,CAAE,mBAAmB,CAC5B,KAAK,CAAE,OAAO,CACd,WAAW,CVdD,sKAAuK,CUejL,WAAW,CAAE,CAAC,CLfjB,yBAAyB,CAAE,wBAAuB,CAClD,sBAAsB,CAAE,wBAAuB,CAC/C,qBAAqB,CAAE,wBAAuB,CAC9C,UAAU,CAAE,wBAAuB,CKchC,6BAAQ,CACP,KAAK,CAAE,OAAO,CACd,WAAW,CVpBA,sKAAuK,CUsBnL,2BAAC,CACA,KAAK,CAAE,OAAO,CACd,WAAW,CVxBA,sKAAuK,CUyBlL,YAAY,CAAE,IAAI,CACpB,0BAAO,CACN,gBAAgB,CAAE,OAAO,CAC5B,cAAO,CACN,QAAQ,CAAE,cAAc,CACxB,QAAQ,CAAE,MAAM,CAChB,GAAG,CAAE,MAAM,CACZ,mBAAU,CACT,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,CAAC,CACP,GAAG,CAAE,GAAG,CACR,MAAM,CAAE,CAAC,CACT,gBAAgB,CV3CF,OAAO,CKMtB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CMVpC,YAAY,CACX,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,IAAI,CACb,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,SAAS,CAClB,gBAAgB,CAAE,IAAI,CACtB,kBAAkB,CAAE,eAAc,CAClC,2BAAc,CNDd,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CMAnC,+BAAkB,CACjB,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,GAAG,CACX,aAAa,CAAE,GAAG,CAClB,gBAAgB,CAAE,IAAK,CACvB,aAAa,CAAE,GAAG,CNTnB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CMSlC,mCAAc,CACb,iBAAiB,CAAE,aAAa,CAChC,cAAc,CAAE,aAAa,CAC7B,aAAa,CAAE,aAAa,CAC5B,YAAY,CAAE,aAAa,CAC3B,SAAS,CAAE,aAAa,CACzB,2BAAM,CACL,iBAAiB,CAAE,6BAA6B,CAChD,cAAc,CAAE,6BAA6B,CAC7C,aAAa,CAAE,6BAA6B,CAC5C,YAAY,CAAE,6BAA6B,CAC3C,SAAS,CAAE,6BAA6B,CACzC,2BAAM,CACL,iBAAiB,CAAE,gBAAgB,CACnC,cAAc,CAAE,gBAAgB,CAChC,aAAa,CAAE,gBAAgB,CAC/B,YAAY,CAAE,gBAAgB,CAC9B,SAAS,CAAE,gBAAgB,CAC7B,oCAAoC,CArCrC,YAAY,CAsCV,OAAO,CAAE,IAAI,ECtCf,IAAI,CACH,QAAQ,CAAE,QAAQ,CAClB,SAAM,CACL,MAAM,CAAE,IAAI,CACZ,QAAQ,CAAE,MAAM,CAChB,iBAAO,CACN,QAAQ,CAAE,IAAI,CACd,MAAM,CAAE,IAAI,CAEd,yBAAO,CACN,OAAO,CAAE,KAAK,CAChB,YAAY,CACX,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CACR,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,QAAQ,CAAE,IAAI,CACd,OAAO,CAAE,IAAI,CACb,gBAAgB,CAAE,IAAK,CACvB,cAAc,CAAE,IAAI,CACpB,OAAO,CAAE,CAAC,CACV,QAAQ,CAAE,IAAI,CACd,gBAAgB,CZrBL,OAAc,CKIzB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,COgBnC,iBAAK,CACJ,QAAQ,CAAE,QAAQ,CACnB,iBAAM,CACL,OAAO,CAAE,CAAC,CACV,cAAc,CAAE,IAAI,CACpB,+BAAa,CACZ,iBAAiB,CAAE,QAAQ,CAC3B,cAAc,CAAE,QAAQ,CACxB,aAAa,CAAE,QAAQ,CACvB,YAAY,CAAE,QAAQ,CACtB,SAAS,CAAE,QAAQ,CACnB,OAAO,CAAE,CAAC,CACZ,0BAAa,CACZ,QAAQ,CAAE,QAAQ,CAClB,YAAY,CAAE,IAAI,CAClB,WAAW,CAAE,GAAG,CAChB,cAAc,CAAE,GAAG,CACnB,gBAAgB,CAAE,WAAW,CAC7B,YAAY,CAAE,WAAW,CACzB,KAAK,CAAE,IAAI,CACX,KAAK,CAAE,IAAK,CACZ,WAAW,CZzCG,sKAAuK,CY0CrL,aAAa,CAAE,CAAC,CAChB,iBAAiB,CAAE,UAAU,CAC7B,cAAc,CAAE,UAAU,CAC1B,aAAa,CAAE,UAAU,CACzB,YAAY,CAAE,UAAU,CACxB,SAAS,CAAE,UAAU,CP9CtB,yBAAyB,CAAE,iBAAuB,CAClD,sBAAsB,CAAE,iBAAuB,CAC/C,qBAAqB,CAAE,iBAAuB,CAC9C,UAAU,CAAE,iBAAuB,CO6ClC,uCAAc,CACb,KAAK,CAAE,qBAAoB,CAC7B,yBAAY,CACX,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,OAAO,CAAE,CAAC,CACV,IAAI,CAAE,OAAO,CACb,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,gBAAgB,CAAE,miCAAmiC,CACrjC,mBAAmB,CAAE,MAAM,CAC3B,iBAAiB,CAAE,SAAS,CAC5B,oCAAoC,CAVrC,yBAAY,CAWV,IAAI,CAAE,IAAI,EAEb,aAAa,CACZ,gBAAgB,CAAE,IAAK,CACvB,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,KAAK,CACjB,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,MAAM,CAClB,oBAAQ,CACP,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,OAAO,CAAE,CAAC,CACV,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,gBAAgB,CZnFN,OAAc,CYqF1B,sBAAsB,CACrB,YAAY,CAAE,IAAI,CAClB,aAAa,CAAE,IAAI,CACnB,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,MAAM,CAClB,WAAW,CAAE,IAAI,CACjB,wBAAE,CACD,SAAS,CAAE,QAAQ,CACnB,WAAW,CZ1FG,sKAAuK,CY2FtL,8BAAQ,CACP,OAAO,CAAE,WAAW,CACpB,iCAAG,CACF,UAAU,CAAE,CAAC,CACb,aAAa,CAAE,CAAC,CAChB,mCAAE,CACD,WAAW,CZhGD,sKAAuK,CYiGjL,SAAS,CAAE,QAAQ,CACnB,KAAK,CAAE,OAAO,CACd,yCAAO,CACN,KAAK,CAAE,OAAO,CACjB,gCAAE,CACD,aAAa,CAAE,CAAC,CAChB,KAAK,CAAE,OAAO", +"sources": ["_reset.sass","_typography.sass","_variables.sass","_layout.sass","_grids.sass","_base.sass","_navbar.sass","mixins/_mixins.sass","navbar/_logo.sass","navbar/_divider.sass","navbar/_menu.sass","navbar/_search.sass","_sidebar.sass","_menu-toggle.sass","_search-form.sass"], +"names": [], +"file": "main-above.css" +} \ No newline at end of file diff --git a/css/main-above.sass b/css/main-above.sass new file mode 100644 index 00000000..3af6b7b6 --- /dev/null +++ b/css/main-above.sass @@ -0,0 +1,15 @@ +// Use this to build css load above the fold content + +@import "normalize" +@import "reset" +@import "mixins/mixins" +@import "variables" +@import "typography" +@import "layout" +@import "grids" +@import "base" + +@import "navbar" +@import "sidebar" +@import "menu-toggle" +@import "search-form" \ No newline at end of file diff --git a/css/main.css b/css/main.css new file mode 100644 index 00000000..cc275f8b --- /dev/null +++ b/css/main.css @@ -0,0 +1,255 @@ +@font-face { + font-family: "ProximaNovaSoft-Medium"; + src: url("font/webfonts/234DF5_0_0.eot"); + src: url("font/webfonts/234DF5_0_0.eot?#iefix") format("embedded-opentype"), url("font/webfonts/234DF5_0_0.woff") format("woff"), url("font/webfonts/234DF5_0_0.ttf") format("truetype"); +} +@font-face { + font-family: "ProximaNovaSoft-Semibold"; + src: url("font/webfonts/234DF5_1_0.eot"); + src: url("font/webfonts/234DF5_1_0.eot?#iefix") format("embedded-opentype"), url("font/webfonts/234DF5_1_0.woff") format("woff"), url("font/webfonts/234DF5_1_0.ttf") format("truetype"); +} +@font-face { + font-family: "ProximaNovaSoft-Regular"; + src: url("font/webfonts/234DF5_3_0.eot"); + src: url("font/webfonts/234DF5_3_0.eot?#iefix") format("embedded-opentype"), url("font/webfonts/234DF5_3_0.woff") format("woff"), url("font/webfonts/234DF5_3_0.ttf") format("truetype"); +} +@media screen and (min-width: 576px) { + .container { + width: 540px; + } +} +@media screen and (min-width: 768px) { + .container { + width: 720px; + } +} +@media screen and (min-width: 992px) { + .container { + width: 960px; + display: grid; + } + .container.-layout-3-9 { + grid-template-columns: 1fr 3fr; + } + .container.-layout-6-6 { + display: grid; + grid-template-columns: 1fr 1fr; + } + .container.fluid { + width: 100%; + } +} +@media screen and (min-width: 1200px) { + .container { + width: 1140px; + } +} +.container { + position: relative; + margin: 0 auto; + grid-gap: 2rem; + max-width: 100%; + padding-right: 1rem; + padding-left: 1rem; + box-sizing: border-box; +} + +.navbar-bottom { + width: 100%; + margin-top: 5rem; + background-color: #25b15e; +} +.navbar-bottom:before, .navbar-bottom:after { + content: " "; + display: table; + clear: both; + height: 0; + visibility: hidden; +} +.navbar-bottom > .container { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; +} +@media screen and (min-width: 768px) { + .navbar-bottom > .container { + width: 720px; + display: grid; + grid-template-columns: 1fr 1fr; + padding-left: 1rem; + padding-right: 1rem; + } +} +@media screen and (min-width: 992px) { + .navbar-bottom > .container { + width: 960px; + } +} +@media screen and (min-width: 1200px) { + .navbar-bottom > .container { + width: 1140px; + } +} +.navbar-bottom .prev, +.navbar-bottom .next { + display: block; + position: relative; + padding: 2rem; + color: #ffffff; + text-decoration: none; +} +.navbar-bottom .prev > .label, +.navbar-bottom .next > .label { + font-family: "ProximaNovaSoft-Semibold", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 1.125rem; + color: rgba(255, 255, 255, 0.6); + line-height: 1.2; +} +.navbar-bottom .prev > .title, +.navbar-bottom .next > .title { + font-family: "ProximaNovaSoft-Semibold", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 2rem; + color: white; + line-height: 1.1; + -webkit-border-transition: 0.25s ease-out color; + -moz-border-transition: 0.25s ease-out color; + -ms-border-transition: 0.25s ease-out color; + transition: 0.25s ease-out color; +} +.navbar-bottom .prev:after, +.navbar-bottom .next:after { + content: " "; + position: absolute; + display: block; + top: 50%; + transform: translateY(-50%); + height: 33px; + width: 19px; + background-repat: no-repeat; + background-position: center; + -webkit-border-transition: 0.25s ease-out all; + -moz-border-transition: 0.25s ease-out all; + -ms-border-transition: 0.25s ease-out all; + transition: 0.25s ease-out all; +} +.navbar-bottom .prev:hover > .title, +.navbar-bottom .next:hover > .title { + color: rgba(255, 255, 255, 0.6); +} +.navbar-bottom .prev:hover:after, +.navbar-bottom .next:hover:after { + opacity: 0.6; +} +.navbar-bottom .prev { + text-align: left; + border-bottom: 4px solid white; +} +@media screen and (min-width: 768px) { + .navbar-bottom .prev { + margin-left: -2rem; + border-bottom: none; + } +} +.navbar-bottom .prev:after { + left: 0.25rem; + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIzMyIgdmlld0JveD0iMCAwIDE5IDMzIj4gIDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI0IiBwb2ludHM9IjE2LjQ1NiAzMC45MTIgMiAxNi40NTYgMTYuNDU2IDIgMTYuNDU2IDIiLz48L3N2Zz4=); +} +@media screen and (min-width: 768px) { + .navbar-bottom .prev:after { + left: 0rem; + } +} +.navbar-bottom .prev:hover:after { + transform: translate(-4px, -50%); +} +.navbar-bottom .next { + text-align: right; +} +@media screen and (min-width: 768px) { + .navbar-bottom .next { + margin-right: -2rem; + } +} +.navbar-bottom .next:after { + right: 0.25rem; + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIzMyIgdmlld0JveD0iMCAwIDE5IDMzIj4gIDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI0IiBwb2ludHM9IjE2LjQ1NiAzMC45MTIgMiAxNi40NTYgMTYuNDU2IDIgMTYuNDU2IDIiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDE4LjQ1NiAwKSIvPjwvc3ZnPg==); +} +@media screen and (min-width: 768px) { + .navbar-bottom .next:after { + right: 0; + } +} +.navbar-bottom .next:hover:after { + transform: translate(4px, -50%); +} +.navbar-bottom .disabled { + display: none; +} +@media screen and (min-width: 768px) { + .navbar-bottom .disabled { + visibility: hidden; + display: block; + } +} + +.footer { + display: -webkit-flex; + display: flex; + -webkit-flex-direction: row; + flex-direction: column; + padding: 3rem 0; + background-color: #23b15e; + border-top: 2px solid rgba(255, 255, 255, 0.1); + border-bottom: 2px solid transparent; + box-sizing: border-box; +} +@media screen and (min-width: 768px) { + .footer { + -webkit-flex-direction: row; + flex-direction: row; + padding: 0; + } +} +.footer > .logo { + padding: 1rem; + line-height: 0; +} +.footer > .logo > img { + height: 34px; + width: 134px; +} +.footer > .menu { + margin: 0; + padding: 0; + list-style-type: none; + display: -webkit-flex; + display: flex; + -webkit-flex-direction: column; + flex-direction: column; +} +@media screen and (min-width: 768px) { + .footer > .menu { + -webkit-flex-direction: row; + flex-direction: row; + align-items: center; + } +} +.footer > .menu > li { + display: block; +} +@media screen and (min-width: 768px) { + .footer > .menu > li { + display: inline-block; + } +} +.footer > .menu > li > a { + display: block; + padding: 1rem; + font-size: 0.875rem; + line-height: 1; + font-family: "ProximaNovaSoft-Semibold", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + color: rgba(255, 255, 255, 0.8); +} + +/*# sourceMappingURL=main.css.map */ diff --git a/css/main.css.map b/css/main.css.map new file mode 100644 index 00000000..ae9c24e2 --- /dev/null +++ b/css/main.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["_font.sass","_grids.sass","_navbar-bottom.sass","mixins/_mixins.sass","_variables.sass","_footer.sass"],"names":[],"mappings":"AAAA;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;ACbD;EACC;IACC;;;AAEF;EACC;IACC;;;AAEF;EACC;IACC;IACA;;EACA;IACC;;EACD;IACC;IACA;;EACD;IACC;;;AAEH;EACC;IACC;;;AAEF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AC/BD;EACC;EACA;EACA;;AACA;ECSA;EACA;EACA;EACA;EACA;;ADXA;EACC;EACA;EACA;EACA;;AACA;EALD;IAME;IACA;IACA;IACA;IACA;;;AACD;EAXD;IAYE;;;AACD;EAbD;IAcE;;;AAEF;AAAA;EAEC;EACA;EACA;EACA;EACA;;AACA;AAAA;EACC,aExBa;EFyBb;EACA;EACA;;AACD;AAAA;EACC,aE5BW;EF6BX;EACA;EACA;EC/BF;EACA;EACA;EACA;;AD8BC;AAAA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EC1CF;EACA;EACA;EACA;;AD0CE;AAAA;EACC;;AACD;AAAA;EACC;;AACH;EAIC;EACA;;AAJA;EADD;IAEE;IACA;;;AAGD;EACC;EAGA;;AAFA;EAFD;IAGE;;;AAGD;EACC;;AACH;EAGC;;AAFA;EADD;IAEE;;;AAED;EACC;EAGA;;AAFA;EAFD;IAGE;;;AAGD;EACC;;AACH;EACC;;AACA;EAFD;IAGE;IACA;;;;AGtFH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAVD;IAWE;IACA;IACA;;;AACD;EACC;EACA;;AACA;EACC;EACA;;AACF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EARD;IASE;IACA;IACA;;;AACD;EACC;;AACA;EAFD;IAGE;;;AACD;EACC;EACA;EACA;EACA;EACA,aDnCY;ECoCZ","file":"main.css"} \ No newline at end of file diff --git a/css/main.sass b/css/main.sass new file mode 100644 index 00000000..116a5f35 --- /dev/null +++ b/css/main.sass @@ -0,0 +1,7 @@ +@import "mixins/mixins" +@import "variables" +@import "font" +@import "grids" + +@import "navbar-bottom" +@import "footer" \ No newline at end of file diff --git a/css/mixins/_mixins.sass b/css/mixins/_mixins.sass new file mode 100644 index 00000000..bc317362 --- /dev/null +++ b/css/mixins/_mixins.sass @@ -0,0 +1,18 @@ +=border-radius($radius) + -webkit-border-radius: $radius + -moz-border-radius: $radius + -ms-border-radius: $radius + border-radius: $radius + +=transition($property) + -webkit-border-transition: .25s ease-out $property + -moz-border-transition: .25s ease-out $property + -ms-border-transition: .25s ease-out $property + transition: .25s ease-out $property + +=clearfix + content: " " + display: table + clear: both + height: 0 + visibility: hidden \ No newline at end of file diff --git a/css/navbar/_divider.sass b/css/navbar/_divider.sass new file mode 100644 index 00000000..92b7178c --- /dev/null +++ b/css/navbar/_divider.sass @@ -0,0 +1,10 @@ +.divider + display: none + float: left + margin-top: 16px + height: 24px + width: 2px + border-radius: 100px + background-color: rgba(37,50,62,0.20) + @media screen and (min-width: 768px) + display: block \ No newline at end of file diff --git a/css/navbar/_logo.sass b/css/navbar/_logo.sass new file mode 100644 index 00000000..2b20e262 --- /dev/null +++ b/css/navbar/_logo.sass @@ -0,0 +1,24 @@ +.logo + padding: 12px 12px + display: block + position: absolute + width: 100% + top: 0 + left: 0 + right: 0 + z-index: 1098 + line-height: 0 + cursor: pointer + text-align: center + >img + height: 32px + width: 140px + margin-left: auto + margin-right: auto + + @media screen and (min-width: 768px) + position: relative + display: inline-block + float: left + width: auto + text-align: left \ No newline at end of file diff --git a/css/navbar/_menu.sass b/css/navbar/_menu.sass new file mode 100644 index 00000000..91c0c533 --- /dev/null +++ b/css/navbar/_menu.sass @@ -0,0 +1,125 @@ +.menu + position: relative + pointer-events: none + display: block + +transition(opacity) + -webkit-transition-delay: 300ms, 300ms + transition-delay: 300ms, 300ms + position: absolute + pointer-events: none + top: 64px + left: 0 + width: 100% + opacity: 0 + -webkit-transform: scale(1.1) + -moz-transform: scale(1.1) + -ms-transform: scale(1.1) + -o-transform: scale(1.1) + transform: scale(1.1) + +transition(all) + &.-show + opacity: 1 + -webkit-transform: scale(1) + -moz-transform: scale(1) + -ms-transform: scale(1) + -o-transform: scale(1) + transform: scale(1) + pointer-events: auto + @media screen and (min-width: 768px) + display: inline-block + float: left + pointer-events: auto + display: inline-block + float: left + position: relative + pointer-events: auto + width: auto + top: 0 + opacity: 1 + transform: scale(1) + > ul + position: relative + padding: 0 + margin: 0 + list-style-type: none + > li + position: relative + display: block + @media screen and (min-width: 768px) + display: inline-block + > a + display: block + position: relative + padding: 20px 16px + text-decoration: none + font-family: $font-semibold + font-size: 1.125rem + color: #A2B8CA + line-height: 1 + +transition(color) + &:hover + color: #7293AF + &.dropdown + padding-right: 1.875rem + &:after + content: "" + display: block + position: absolute + top: 50% + right: 1rem + height: 6px + width: 10px + opacity: .6 + -webkit-transform: translateY(-50%) + -moz-transform: translateY(-50%) + -ms-transform: translateY(-50%) + -o-transform: translateY(-50%) + transform: translateY(-50%) + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgMTAgNiI+ICA8cG9seWxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgcG9pbnRzPSI5OCAyNiAxMDIgMzAgMTA2IDI2IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTcgLTI1KSIvPjwvc3ZnPg==) + background-repeat: no-repeat + background-size: cover + +transition(opacity) + &:hover + &:after + opacity: .4 + @media screen and (min-width: 768px) + font-size: 1rem + &.current + > a + color: white + &:hover + color: #7293AF + &:hover + > .submenu + display: block + &:focus + > a + border: 3px solid blue + .submenu + display: none + position: absolute + padding: 0 0 8px 0 + top: 100% + left: 0 + z-index: -1 + min-width: 190px + @media screen and (min-width: 768px) + background-color: $primary-color + border-bottom-left-radius: 8px + border-bottom-right-radius: 8px + box-shadow: 0 3px 8px 0 rgba(0,0,0,0.20) + > li + display: block + > a + display: block + padding: 16px + padding: 20px 16px + text-decoration: none + font-family: $font-semibold + color: #A2B8CA + line-height: 1 + font-family: $font-medium + &:hover + > a + color: white + background-color: darken($primary-color, 5%) diff --git a/css/navbar/_search.sass b/css/navbar/_search.sass new file mode 100644 index 00000000..77a63ef6 --- /dev/null +++ b/css/navbar/_search.sass @@ -0,0 +1,41 @@ +.search + height: 24px + width: 24px + position: relative + +transition(all) + &.cross + &:before + transform: translate(-50%,-50%) scale(1) + &:after + transform: translate(-50%,-50%) scale(0) + &.hide + transform: scale(0) + opacity: 0 + &:before + content: "" + display: block + position: absolute + height: 16px + width: 16px + top: 50% + left: 50% + transform: translate(-50%,-50%) scale(0) + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOSIgdmlld0JveD0iMCAwIDE5IDE5Ij4gIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS13aWR0aD0iMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSI+ICAgIDxwYXRoIGQ9Ik0wLjA4MzYyOTc0OTgsMC4wNDQ5MjEyMzA4IEwxNS4zMTQzMTQ1LDE1LjI3NTYwNiIvPiAgICA8cGF0aCBkPSJNMC4wODM2Mjk3NDk4LDAuMDQ0OTIxMjMwOCBMMTUuMzE0MzE0NSwxNS4yNzU2MDYiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDE1LjM5OCAwKSIvPiAgPC9nPjwvc3ZnPg==) + background-size: cover + background-position: center + background-repeat: no-repeat + transform: scale(0) + +transition(all) + &:after + content: "" + display: block + position: absolute + height: 24px + width: 24px + top: 50% + left: 50% + transform: translate(-50%,-50%) scale(1) + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4gIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIgLTIpIj4gICAgPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+ICAgIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xMCwxNiBDNi42ODY2MTUzOCwxNiA0LDEzLjMxNTIzMDggNCwxMCBDNCw2LjY4NTY5MjMxIDYuNjg2NjE1MzgsNCAxMCw0IEMxMy4zMTMzODQ2LDQgMTYsNi42ODU2OTIzMSAxNiwxMCBDMTYsMTMuMzE1MjMwOCAxMy4zMTMzODQ2LDE2IDEwLDE2IE0xNi42MTc2MjY2LDE0LjQ5NjMwNjMgQzE3LjQ5MDAyNzEsMTMuMjE0ODk3NCAxOCwxMS42NjY5Njk1IDE4LDEwIEMxOCw1LjU4MjMxNTc5IDE0LjQxNzY4NDIsMiAxMCwyIEM1LjU4MjMxNTc5LDIgMiw1LjU4MjMxNTc5IDIsMTAgQzIsMTQuNDE4MTA1MyA1LjU4MjMxNTc5LDE4IDEwLDE4IEMxMS42NjY4ODcyLDE4IDEzLjIxNDg0MTcsMTcuNDkwMDQwMiAxNC40OTYyOTgxLDE2LjYxNzYxODQgTDE5LjMwNTM1MDcsMjEuNDI2NjcxMSBDMTkuODg5MDI4NSwyMi4wMTAzNDg5IDIwLjgzODgzNDgsMjIuMDEwNDA3NiAyMS40MjQ2MjEyLDIxLjQyNDYyMTIgQzIyLjAxNDQ5MTYsMjAuODM0NzUwOCAyMi4wMTEzMjU0LDE5Ljg5MDAwNTEgMjEuNDI2NjcxMSwxOS4zMDUzNTA3IEwxNi42MTc2MjY2LDE0LjQ5NjMwNjMgWiIvPiAgPC9nPjwvc3ZnPg==) + background-position: center + background-repeat: no-repeat + +transition(all) diff --git a/css/normalize/_import-now.scss b/css/normalize/_import-now.scss new file mode 100644 index 00000000..aac5d2b6 --- /dev/null +++ b/css/normalize/_import-now.scss @@ -0,0 +1,11 @@ +// Import Now +// +// If you import this module directly, it will immediately output all the CSS +// needed to normalize default HTML elements across all browsers. +// +// ``` +// @import "normalize/import-now"; +// ``` + +@import '../normalize'; +@include normalize(); diff --git a/css/normalize/_normalize-mixin.scss b/css/normalize/_normalize-mixin.scss new file mode 100644 index 00000000..a366f7b9 --- /dev/null +++ b/css/normalize/_normalize-mixin.scss @@ -0,0 +1,666 @@ +// Helper function for the normalize() mixin. +@function _normalize-include($section, $exclude: null) { + // Initialize the global variables needed by this function. + @if not global_variable_exists(_normalize-include) { + $_normalize-include: () !global; + $_normalize-exclude: () !global; + } + // Since we are given 2 parameters, set the global variables. + @if $exclude != null { + $include: $section; + // Sass doesn't have static variables, so the work-around is to stuff these + // values into global variables so we can access them in future calls. + $_normalize-include: if(type-of($include) == 'list', $include, ($include)) !global; + $_normalize-exclude: if(type-of($exclude) == 'list', $exclude, ($exclude)) !global; + @return true; + } + + // Check if $section is in the $include list. + @if index($_normalize-include, $section) { + @return true; + } + // If $include is set to (all), make sure $section is not in $exclude. + @else if not index($_normalize-exclude, $section) and index($_normalize-include, all) { + @return true; + } + @return false; +} + +@mixin normalize($include: (all), $exclude: ()) { + // Initialize the helper function by passing it this mixin's parameters. + $init: _normalize-include($include, $exclude); + + // If we've customized any font variables, we'll need extra properties. + @if $base-line-height != 24px + or $base-unit != 'em' + or $h2-font-size != 1.5 * $base-font-size + or $h3-font-size != 1.17 * $base-font-size + or $h4-font-size != 1 * $base-font-size + or $h5-font-size != 0.83 * $base-font-size + or $h6-font-size != 0.67 * $base-font-size { + $normalize-vertical-rhythm: true !global; + } + + /*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ + + @if _normalize-include(document) { + /* Document + ========================================================================== */ + + /** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + + html { + @if $base-font-family { + /* Change the default font family in all browsers (opinionated). */ + font-family: $base-font-family; + } + @if $base-font-size != 16px or $normalize-vertical-rhythm { + // Correct old browser bug that prevented accessible resizing of text + // when root font-size is set with px or em. + font-size: ($base-font-size / 16px) * 100%; + } + @if $normalize-vertical-rhythm { + line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + } + + @if _normalize-include(sections) { + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers (opinionated). + */ + + body { + margin: 0; + } + + /** + * Add the correct display in IE 9-. + */ + + article, + aside, + footer, + header, + nav, + section { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + @include normalize-font-size($h1-font-size); + @if $normalize-vertical-rhythm { + @include normalize-line-height($h1-font-size); + } + + @if $normalize-vertical-rhythm { + /* Set 1 unit of vertical rhythm on the top and bottom margins. */ + @include normalize-margin(1 0, $h1-font-size); + } + @else { + margin: 0.67em 0; + } + } + + @if $normalize-vertical-rhythm { + h2 { + @include normalize-font-size($h2-font-size); + @include normalize-line-height($h2-font-size); + @include normalize-margin(1 0, $h2-font-size); + } + + h3 { + @include normalize-font-size($h3-font-size); + @include normalize-line-height($h3-font-size); + @include normalize-margin(1 0, $h3-font-size); + } + + h4 { + @include normalize-font-size($h4-font-size); + @include normalize-line-height($h4-font-size); + @include normalize-margin(1 0, $h4-font-size); + } + + h5 { + @include normalize-font-size($h5-font-size); + @include normalize-line-height($h5-font-size); + @include normalize-margin(1 0, $h5-font-size); + } + + h6 { + @include normalize-font-size($h6-font-size); + @include normalize-line-height($h6-font-size); + @include normalize-margin(1 0, $h6-font-size); + } + } + } + + @if _normalize-include(grouping) { + /* Grouping content + ========================================================================== */ + + @if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + blockquote { + @include normalize-margin(1 $indent-amount); + } + + dl, + ol, + ul { + @include normalize-margin(1 0); + } + + /** + * Turn off margins on nested lists. + */ + + ol, + ul { + ol, + ul { + margin: 0; + } + } + + dd { + margin: 0 0 0 $indent-amount; + } + + ol, + ul { + padding: 0 0 0 $indent-amount; + } + } + + /** + * Add the correct display in IE 9-. + */ + + figcaption, + figure { + display: block; + } + + /** + * Add the correct margin in IE 8. + */ + + figure { + @if $normalize-vertical-rhythm { + @include normalize-margin(1 $indent-amount); + } + @else { + margin: 1em $indent-amount; + } + } + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * Add the correct display in IE. + */ + + main { + display: block; + } + + @if $normalize-vertical-rhythm { + /** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ + + p, + pre { + @include normalize-margin(1 0); + } + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + } + + @if _normalize-include(links) { + /* Links + ========================================================================== */ + + /** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + + a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ + } + } + + @if _normalize-include(text) { + /* Text-level semantics + ========================================================================== */ + + /** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + + b, + strong { + font-weight: inherit; + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font style in Android 4.3-. + */ + + dfn { + font-style: italic; + } + + /** + * Add the correct background and color in IE 9-. + */ + + mark { + background-color: #ff0; + color: #000; + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + } + + @if _normalize-include(embedded) { + /* Embedded content + ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + audio, + video { + display: inline-block; + } + + /** + * Add the correct display in iOS 4-7. + */ + + audio:not([controls]) { + display: none; + height: 0; + } + + /** + * Remove the border on images inside links in IE 10-. + */ + + img { + border-style: none; + } + + /** + * Hide the overflow in IE. + */ + + svg:not(:root) { + overflow: hidden; + } + } + + @if _normalize-include(forms) { + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: if($base-font-family, $base-font-family, sans-serif); /* 1 */ + font-size: 100%; /* 1 */ + @if $normalize-vertical-rhythm { + line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ + } + @else { + line-height: 1.15; /* 1 */ + } + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + */ + + button { + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + + button, + html [type="button"], /* 1 */ + [type="reset"], + [type="submit"] { + -webkit-appearance: button; /* 2 */ + } + + button, + [type="button"], + [type="reset"], + [type="submit"] { + + /** + * Remove the inner border and padding in Firefox. + */ + + &::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + &:-moz-focusring { + outline: 1px dotted ButtonText; + } + } + + /** + * Show the overflow in Edge. + */ + + input { + overflow: visible; + } + + /** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + } + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + color: inherit; /* 2 */ + white-space: normal; /* 1 */ + } + + /** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ + } + + /** + * Remove the default vertical scrollbar in IE. + */ + + textarea { + overflow: auto; + } + } + + @if _normalize-include(interactive) { + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* + * Add the correct display in IE 9-. + */ + + menu { + display: block; + + @if $normalize-vertical-rhythm { + /* + * 1. Set 1 unit of vertical rhythm on the top and bottom margin. + * 2. Set consistent space for the list style image. + */ + + @include normalize-margin(1 0); /* 1 */ + padding: 0 0 0 $indent-amount; /* 2 */ + + /** + * Turn off margins on nested lists. + */ + + menu &, + ol &, + ul & { + margin: 0; + } + } + } + } + + @if _normalize-include(scripting) { + /* Scripting + ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + canvas { + display: inline-block; + } + + /** + * Add the correct display in IE. + */ + + template { + display: none; + } + } + + @if _normalize-include(hidden) { + /* Hidden + ========================================================================== */ + + /** + * Add the correct display in IE 10-. + */ + + [hidden] { + display: none; + } + } +} diff --git a/css/normalize/_variables.scss b/css/normalize/_variables.scss new file mode 100644 index 00000000..10d05ed7 --- /dev/null +++ b/css/normalize/_variables.scss @@ -0,0 +1,36 @@ +// +// Variables +// +// You can override the default values by setting the variables in your Sass +// before importing the normalize-scss library. + +// The font size set on the root html element. +$base-font-size: 16px !default; + +// The base line height determines the basic unit of vertical rhythm. +$base-line-height: 24px !default; + +// The length unit in which to output vertical rhythm values. +// Supported values: px, em, rem. +$base-unit: 'em' !default; + +// The default font family. +$base-font-family: null !default; + +// The font sizes for h1-h6. +$h1-font-size: 2 * $base-font-size !default; +$h2-font-size: 1.5 * $base-font-size !default; +$h3-font-size: 1.17 * $base-font-size !default; +$h4-font-size: 1 * $base-font-size !default; +$h5-font-size: 0.83 * $base-font-size !default; +$h6-font-size: 0.67 * $base-font-size !default; + +// The amount lists and blockquotes are indented. +$indent-amount: 40px !default; + +// The following variable controls whether normalize-scss will output +// font-sizes, line-heights and block-level top/bottom margins that form a basic +// vertical rhythm on the page, which differs from the original Normalize.css. +// However, changing any of the variables above will cause +// $normalize-vertical-rhythm to be automatically set to true. +$normalize-vertical-rhythm: false !default; diff --git a/css/normalize/_vertical-rhythm.scss b/css/normalize/_vertical-rhythm.scss new file mode 100644 index 00000000..4f53647c --- /dev/null +++ b/css/normalize/_vertical-rhythm.scss @@ -0,0 +1,61 @@ +// +// Vertical Rhythm +// +// This is the minimal amount of code needed to create vertical rhythm in our +// CSS. If you are looking for a robust solution, look at the excellent Typey +// library. @see https://github.com/jptaranto/typey + +@function normalize-rhythm($value, $relative-to: $base-font-size, $unit: $base-unit) { + @if unit($value) != px { + @error "The normalize vertical-rhythm module only supports px inputs. The typey library is better."; + } + @if $unit == rem { + @return ($value / $base-font-size) * 1rem; + } + @else if $unit == em { + @return ($value / $relative-to) * 1em; + } + @else { // $unit == px + @return $value; + } +} + +@mixin normalize-font-size($value, $relative-to: $base-font-size) { + @if unit($value) != 'px' { + @error "normalize-font-size() only supports px inputs. The typey library is better."; + } + font-size: normalize-rhythm($value, $relative-to); +} + +@mixin normalize-rhythm($property, $values, $relative-to: $base-font-size) { + $value-list: $values; + $sep: space; + @if type-of($values) == 'list' { + $sep: list-separator($values); + } + @else { + $value-list: append((), $values); + } + + $normalized-values: (); + @each $value in $value-list { + @if unitless($value) and $value != 0 { + $value: $value * normalize-rhythm($base-line-height, $relative-to); + } + $normalized-values: append($normalized-values, $value, $sep); + } + #{$property}: $normalized-values; +} + +@mixin normalize-margin($values, $relative-to: $base-font-size) { + @include normalize-rhythm(margin, $values, $relative-to); +} + +@mixin normalize-line-height($font-size, $min-line-padding: 2px) { + $lines: ceil($font-size / $base-line-height); + // If lines are cramped include some extra leading. + @if ($lines * $base-line-height - $font-size) < ($min-line-padding * 2) { + $lines: $lines + 1; + } + @include normalize-rhythm(line-height, $lines, $font-size); +} diff --git a/css/tripgo-api-style.css b/css/tripgo-api-style.css new file mode 100644 index 00000000..ac49d344 --- /dev/null +++ b/css/tripgo-api-style.css @@ -0,0 +1,81 @@ +.tag-info[_ngcontent-c7] h1[_ngcontent-c7] { + color: #23b15e; +} + +[_nghost-c0] a { + color: #23b15e; +} + +.menu-item-depth-1[_ngcontent-c8] > .menu-item-header[_ngcontent-c8]:not(.disabled):hover { + color: #23b15e; +} +.menu-item-depth-1[_ngcontent-c8].active[_ngcontent-c8] > .menu-item-header[_ngcontent-c8] { + color: #23b15e; +} + +.openapi-button[_ngcontent-c6] { + border-radius: 4px; + border-color: #23b15e; + color: #23b15e; +} + +.param-name[_ngcontent-c21] { + border-color: rgba(35, 177, 94, 0.5); +} +.param-name[_ngcontent-c21] > span[_ngcontent-c21]:before { + background-color: #23b15e; +} +.param-name[_ngcontent-c21] > span[_ngcontent-c21]:after { + border-color: rgba(35, 177, 94, 0.5); +} + +api-logo { + padding: 16px; +} +api-logo img[_ngcontent-c2] { + width: 90%; +} + +@font-face { + font-family: "ProximaNovaSoft-Medium"; + src: url("./font/webfonts/234DF5_0_0.eot"); + src: url("./font/webfonts/234DF5_0_0.eot?#iefix") format("embedded-opentype"), url("f./ont/webfonts/234DF5_0_0.woff") format("woff"), url("./font/webfonts/234DF5_0_0.ttf") format("truetype"); +} +@font-face { + font-family: "ProximaNovaSoft-Semibold"; + src: url("./font/webfonts/234DF5_1_0.eot"); + src: url("./font/webfonts/234DF5_1_0.eot?#iefix") format("embedded-opentype"), url("./font/webfonts/234DF5_1_0.woff") format("woff"), url("./font/webfonts/234DF5_1_0.ttf") format("truetype"); +} +@font-face { + font-family: "ProximaNovaSoft-Regular"; + src: url("./font/webfonts/234DF5_3_0.eot"); + src: url("./font/webfonts/234DF5_3_0.eot?#iefix") format("embedded-opentype"), url("./font/webfonts/234DF5_3_0.woff") format("woff"), url("./font/webfonts/234DF5_3_0.ttf") format("truetype"); +} +p { + word-break: break-word; +} + +.redoc-wrap[_ngcontent-c0] { + font-family: "ProximaNovaSoft-Regular", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +} + +[_nghost-c0] h1, [_nghost-c0] h2, [_nghost-c0] h3, [_nghost-c0] h4, [_nghost-c0] h5, [_nghost-c0] h6 { + font-family: "ProximaNovaSoft-Semibold", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-weight: normal; +} +[_nghost-c0] h1 { + color: #25323E; +} +[_nghost-c0] p { + font-family: "ProximaNovaSoft-Regular", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +} + +.menu-item-depth-1[_ngcontent-c8] > .menu-item-header[_ngcontent-c8] { + font-family: "ProximaNovaSoft-Regular", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +} + +.search-results[_ngcontent-c3] > li[_ngcontent-c3] { + font-family: "ProximaNovaSoft-Regular", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +} + +/*# sourceMappingURL=tripgo-api-style.css.map */ diff --git a/css/tripgo-api-style.css.map b/css/tripgo-api-style.css.map new file mode 100644 index 00000000..a447cb2b --- /dev/null +++ b/css/tripgo-api-style.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../sass/_base.sass","../../sass/_logo.sass","../../sass/_font.sass","../../sass/_typo.sass"],"names":[],"mappings":"AACC;EACC;;;AAGD;EACC;;;AAGD;EACC;;AAEA;EACC;;;AAEH;EACC;EACA;EACA;;;AAED;EACC;;AAEC;EACC;;AACD;EACC;;;AC1BH;EACC;;AACA;EACC;;;ACHF;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;ACbD;EACC;;;AAED;EACC,aDiBc;;;ACdd;EACC,aDSc;ECRd;;AACD;EACC;;AACD;EACC,aDQa;;;ACLd;EACC,aDIa;;;ACDd;EACC","file":"tripgo-api-style.css"} \ No newline at end of file diff --git a/enterprise/bookings-api/index.html b/enterprise/bookings-api/index.html new file mode 100644 index 00000000..e8243f8d --- /dev/null +++ b/enterprise/bookings-api/index.html @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Bookings - TripGo Developer + + + + + + + +
+ +
+ +

Overview

+

Note: Enterprise customers-only

+

Note: Beta-only

+

The TripGo API allows making bookings for a handful of transport service providers (TSPs).

+

This enables your users to:

+
    +
  • Link their TSP accounts and keep credentials either stored on the client or server-side.
  • +
  • Get a list of available TSP products for a trip.
  • +
  • Book a specific TSP product for a single segment.
  • +
  • Update the trip with the details of the booked TSP product.
  • +
  • Update the trip with real-time data specific to that booking.
  • +
+

Coming soon:

+
    +
  • Book a complete trip consisting of multiple products from multiple TSPs.
  • +
+

In order to enable bookings for your TripGo API key, please get in touch with our team. For most TSPs, you will need to provide us with additional information of your API credentials.

+
+

API Endpoints

+

Linking and unlinking accounts

+

Before you can do any bookings, you will need to provide the relevant authentication details to the server.

+

If the user has an account (as per the userToken header), then this is only necessary once. If the user does not have an account, this is necessary for each session. Typically, the endpoints which do the bookings will tell you, if the session hasn't been authenticated yet.

+
    +
  • auth/{region}?mode={mode}: Endpoint to get the available providers for a specific region, with the information to signin/logout if a userToken is provided in the headers. If mode is provided, only information for that mode is returned.
  • +
  • auth/{provider}/signin: Endpoint to link an account for the specified provider.
  • +
  • auth/{provider}/logout: Endpoint to unlink an account for the specified provider.
  • +
+

Auth Flow

+

This flow will depend on the TSP and can be started in two separate ways:

+
    +
  • When linking accounts to a user.
  • +
  • When doing a booking for that particular TSP and the user has no account already linked.
  • +
+

This flow will use the Auth Forms to provide the apps the information to show to the user and also the information required to be POSTed to continue the flow.

+

For a TSP that allows OAuth2, the Auth Form will include the fields with the information for the apps to do OAuth, including clientId, clientSecret, scope, authUrl, tokenUrl; and also the required field to be POSTed, including accessToken, refreshToken and expiration.

+

For a TSP that provides a different authentication method, the AuthForm will include the required field to be filled by the user and also any extra information that need to be shown to the user in the same field format. This will follow the same flow approach as for Form-based Booking Flow.

+

The end of this flow will depending on how it was started. +If was started to link an account, the flow will end with an empty 204 response, when successfuly linked. +If it was started in a booking flow, the flow will automatically continue with it, attempting to do the booking and returning the status, as in step 4 of Form-based Booking Flow.

+
+

Getting available TSP for a trip

+

If there are available TSPs for a trip segment, this will be indicated by the presence of the booking object in the segment.

+

The booking object in the segment may include:

+
    +
  • a quickBookingUrl, indicating that the quick booking flow is available.
  • +
+
+

Booking a segment

+

Getting available TSP products for a trip

+

If quick booking flow is available for a segment, the available TSP products can be browsed for it without providing any authentication details.

+

As part of the quick booking flow, the quickBookingUrl will then return a list of available TSP products, which notably each come:

+
    +
  • tripUpdateURL: A URL for fetching the trip, updated for this TSP product.
  • +
  • bookingURL: A URL for initiating the booking flow for this TSP product (step 2 of form-based booking flow)
  • +
  • title
  • +
  • subtitle
  • +
  • bookingTitle
  • +
  • priceString
  • +
  • price
  • +
  • USDPrice
  • +
  • surgeString
  • +
  • surgeImageURL
  • +
  • ETA
  • +
  • imageURL
  • +
+
+

Updating trip with booking details

+

At the end of the booking flow, you will get a refreshURLForSourceObject. Hit this URL with a GET request, to get the updated trip.

+

Note that these trips can be eligible for real-time updates even if the original trip was not eligible as there might now be additional real-time information based on the booking.

+

Trips with a confirmed booking will also have extra information about the confirmed booking in a field called confirmation in the booking field of the segment.

+

This confirmation object may include detailed information about the provider, vehicle and status for the booking, with the following possible fields:

+
    +
  • a title
  • +
  • a subtitle
  • +
  • a valueUrl
  • +
  • a value
  • +
+

And also a list of possible actions depending on the status of the booking, with the following fields:

+
    +
  • a title
  • +
  • a boolean isDestructive, indicating whether this action will cancel the booking.
  • +
  • a internalUrl indicating the action of the url is a call to the same server and will return a bookingForm.
  • +
  • a externalUrl indicating that the action must be handled by the app accordingly.
  • +
+

Examples of actions with internalUrl fields are cancel booking, which will have the isDestructive field in true, and rate booking.

+

Examples of actions with externalUrl fields are qrcode values, for showing a ticket to the user, and phone numbers, starting with tel:.

+
+

Rating and Tipping

+

Whenever available, the confirmation information will include the rate booking action, which will include an internalUrl which will return the following fields:

+
    +
  • rate, an int value with min and max accepted values.
  • +
  • feedback, a string to send an appropriate msg.
  • +
  • tip, an int value indicating the amount to be paid as tip, in local currency.
  • +
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/enterprise/push/index.html b/enterprise/push/index.html new file mode 100644 index 00000000..1f46b5c4 --- /dev/null +++ b/enterprise/push/index.html @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Push Notifications - TripGo Developer + + + + + + + +
+ +
+ +

Push Notifications

+

Note: Enterprise customers-only

+

Notification

+

We support Push Notifications for both Android (using Firebase) and iOS (using APN) devices. In order to enable and use Push Notifications, the following steps are required:

+
    +
  • Register (only once) in SkedGo backend the corresponding credentials/certificates for each platform (See sections below for details).
  • +
  • Each app instance should register itself in the corresponding platform and save the obtained token in SkedGo database, using data/user/push endpoint.
  • +
  • To send PN to your user, you need to know the user ID on our database and use data/push endpoint, which is filtered by IP address (check with us whether your IP address is whitelisted).
  • +
+

Android

+

You need to create your own project in Firebase and send to us the Server Key in your project settings > cloud messaging tab.

+

For instructions on how to implement Push Notifications in Android, go to Firebase Cloud Messaging.

+

In short, your app needs to register into FCM to get a token and save it into our database for later usage (see data/user/push endpoint). Note that this token may change, any time that happens you need to save it again in the database.

+

iOS

+

You need to configure your app for APN, follow instructions from Apple or use fastlane, and then send us both the P12 file, containing the Apple Push Notification Authentication Key, and the password to unlock it.

+

For instructions on how to implement Push Notifications in iOS, go to Configuring Remote Notification.

+

In short, your app needs to register into APN to get a token and save it into our database for later usage (see data/user/push endpoint). Note that this token may change, any time that happens you need to save it again in the database. The token returned by the iOS SDK will be a binary data object, while our backend expends a string. To turn the data into a string, use this snipped:

+
let tokenString = tokenData.reduce(into: "") { $0.append(String(format: "%02X", $1)) }
+
+

When receiving push notifications, additional fields that were provide in the data part when sending the notification, will be accessible to your app via the userInfo that's attached to the content of the notification. The clickAction will end up in the notification's content's categoryIdentifier.

+

Sending PN

+

If you want to send PN to your users, you first need to have your server/s IP/s address/es whitelisted in our platform. Then, you can use data/push endpoint to send notifications to a list of users (by their userID).

+

Notifications that we send support a title, message, sound and badge, with a ttl (time to live) value, as well as custom data which will be passed on to your apps. Be mindful of size limits imposed by Firebase or APN.

+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/enterprise/tripurls/index.html b/enterprise/tripurls/index.html new file mode 100644 index 00000000..35267987 --- /dev/null +++ b/enterprise/tripurls/index.html @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Trip URLs - TripGo Developer + + + + + + + +
+ +
+ +

Trips URLs

+

This feature needs to be enabled on 3scale, setting "Keep Trips" value on true (it is disabled by default). +Whenever a trip is computed, it will be returned with a list of URLs, including:

+
    +
  • temporaryURL: Temporary URL used to retried the trip, which can be used for short-term sharing.
  • +
  • saveURL: Temporary URL used to make the trip persistent.
  • +
  • updateURL: Optional temporary URL used to update the trip with real-time data.
  • +
  • hookURL (beta): Optional temporary URL used to hook the trip with real-time updates.
  • +
  • progressURL: Optional temporary URL used to report progress updates for the trip.
  • +
  • plannedURL: Optional temporary URL used for analytics.
  • +
  • logURL (beta): Optional temporary URL used to log the trip in the user account.
  • +
  • shareURL: Optional persistent of this trip URL, which can be used for sharing trips (web access only)
  • +
  • appURL: Optional persistent of this trip URL, which can be used retrieving them long term (json access only).
  • +
+

Trip access

+

The temporaryURL allows access to the trip for a short-term period (maximum of 7 days from the time of creation), while our platform keeps the trip in the server that computed it originally. +If you want a trip to persist forever, you can use the saveURL to save it in permanent storage (requires AWS DynamoDB connection). Saving the trip will create a new unique ID, along with two new urls: shareURL for web access and appURL for app/json access.

+

Analytics

+

The plannedURL is meant to be used for analytics purposes, to keep track, from the returned trips, which of them the user actually took, if that is possible to determine or guess at a client/app level. +The progressURL goals is to enable apps to report user progress on a specific trip, also for analytics purposes.

+

Save trip

+

It's available for all trips.

+

saveURL makes sure that a trip will be accessible at a later time, beyond what would be a typical user session. +Otherwise our API makes no guarantee that a trip calculated is still available later. +It is important to mention that the trip saved could change when reconstructing it from our database if there's newer real-time data available.

+

Real-time updates

+

Its optional as not all trips would ever get real-time data updates.

+

If our platforms has real-time information that can be used to update a computed trip, both updateURL and hookURL will be present in the response. +Both support the same goal of updating the trip with real-time information, one by pulling and the other by pushing.

+

updateURL Allows providing a hash code so that it'll only return trip details if anything about the trip has changed since you last fetched it. +This is so that apps can frequently hit that endpoint and only need to parse the response if there's any changes to the trip. +See documentation

+

Pulling for changes

+

The updateURL can be used to pull our servers for changes in the trip. +This url is meant to be used by the apps to get an updated version of the trip. +This endpoint will return an empty response if there is no change, otherwise, it will return the trip in the requested format.

+

As an example, if a service is delayed, the trip will be updated to reflect that change. +Also, if the trip involves a booking to a TSP, like Uber for example, it will be getting updates of the status of the ride, as soon as those are available from the external API.

+

The expected flow in this case is the following one:

+
    +
  1. A trip is computed and our platform has sources of information for real-time updates for it, and therefore, the updateURL is returned.
  2. +
  3. The client checks whether the trip has been updated with real-time changes by doing a GET to the updateURL.
  4. +
  5. If the trip has been updated, the new updateURL should be used from now on.
  6. +
  7. After two hours of not getting any update, the trip is discarded from memory.
  8. +
+

For more details, check our docs

+

Receiving notifications

+

The hookURL can be used to register a callback or web-hook, and our platform will then inform if any change in that trip occurs by POSTing to the registered url the tripID along with the tripURL for the client to retrieve the updated trip.

+

The expected flow in this case is the following one:

+
    +
  1. A trip is computed and our platform has sources of information for real-time updates for it, and therefore, the hookURL is returned.
  2. +
  3. The client that wants to receive notifications about real-time changes does a POST to the hookURL (docs) send the webhook as url and any required header (starting with x-) as body of the request and obtains a 204 response.
  4. +
  5. At any given time the trip is updated with any real-time change, our platform does a POST to the registered web-hook.
  6. +
  7. After two hours of not getting any update, the trip is discarded from memory and won't receive any more updates.
  8. +
+

The client can also remove a web-hook, by doing a DELETE request to hookURL (docs), and can also get the status of the hook (to confirm whether there is a hook already registered), by doing a GET to hookURL (docs).

+

Note that only one web-hook per trip can be registered, and multiple calls to hookURL to register different web-hooks will override existing ones.

+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/index.html b/extensions/index.html new file mode 100644 index 00000000..1cce8f3d --- /dev/null +++ b/extensions/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Extensions - TripGo Developer + + + + + + + +
+ +
+ +

Right after signing up, the API will serve results for regions and transport providers that publish their data as Open Data and which have already been connected to our system.

+

The TripGo API can be extended in the following ways:

+
    +
  1. Unlock transport modes, regions and real-time data from services that require you to first accept their terms or acquire API credentials.
  2. +
  3. Add new transport modes through our TSP Connectors.
  4. +
  5. Add new regions through our Region Connectors (coming soon).
  6. +
+
+

Regions

+

Unlocking regions

+

To get results for regions with providers that aren't using Open Data please get in touch with our team by mail or on Slack (by self-invite).

+

Rio de Janeiro (Brazil) 🌎

+
    +
  1. Go to Fetransport Site and make sure you agree with the data terms. Contact us if you need help for this.
  2. +
  3. Forward your confirmation mail to api@skedgo.com
  4. +
  5. We will then unlock the region for your API key.
  6. +
+

Adding new regions

+

To get results for regions that are not yet covered by the TripGo API, you as an API client can help us with the integration process to add a region of interest as follows:

+
    +
  1. Collect all "Minimum required data" detailed below.
  2. +
  3. Send the URLs where we could donwload the data from the sources to api@skedgo.com. For the cases where the data is not in a public accessible repository, please also pass on necessary contact information or access details.
  4. +
  5. Wait until SkedGo processes all the information and updates the backend with the new region.
  6. +
+

This last process involves: +- Configuring the region with the required data +- Allocating cloud resources, including redunancy +- Testing and verification of data quality and routing results +- Once all tests pass, our data team will promote the new regions to our production servers

+

For expected timing and pricing, please refer to our published price list.

+

Minimum required data

+
    +
  1. Name of the country and city or area which is going to be added.
  2. +
  3. Coverage: The region's coverage area where the service is going to be provided, as a polygon or bounding rectangle.
  4. +
  5. The most important city or cities from that area.
  6. +
  7. URL(s) to the public transport timetables for that area in a standard data format that can be be consumed by our platform. A very important rule to follow, is to include data for every major public transport operator in the coverage area. Supported data formats are: + - General Transit Feed Specification (GTFS) + - NeTEx + - TransXChange
  8. +
  9. Country/region properties that configure our routing and API responses, including: + - Currency + - Timezone + - Default language + - Preferred distance unit (metric/imperial) + - Drive on left / right + - Taxi cost for that area (see TSP connectors below) + - Average fuel cost
  10. +
  11. Road and footpath information is being consumed from OpenStreetMap, so there is no need to provide that.
  12. +
+

Optional data

+
    +
  • More cities to be displayed on the map: Each of them should have a default position.
  • +
  • Public holidays information: Country default ones could be loaded from global repositories but regional or local ones could be added.
  • +
  • Public transport real-time data, using one of the following standards: + - GTFS-Realtime + - Siri
  • +
  • Car park information
  • +
  • Transport service providers (see TSP connectors below)
  • +
  • Traffic alerts (see "info" connectors below)
  • +
+

Customisations

+
    +
  • Rules for when bicycles are allowed on public transport and on which types of public transport. This is useful when this data is not provided as part of the public transport sources.
  • +
  • Icon customisation for specific transports or services.
  • +
  • Icon customisation for specific public transport nodes.
  • +
  • Public transport fare calculations, see our published price list.
  • +
+
+

Transport providers

+

Unlocking transport modes

+

To get results for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite).

+

BlaBlaCar 🌍

+

Integrations: Routing, Real-time

+
    +
  1. Read the terms of use of BlaBlaCar's API and make sure you comply with them in your app.
  2. +
  3. Sign up to BlaBlaCar's API.
  4. +
  5. Enter your BlaBlaCar auth key in your application credentials.
  6. +
  7. BlaBlaCar results will start coming through the TripGo API for your API key (after at most 5 minutes).
  8. +
+

GoGet 🇦🇺

+

Integrations: Locations, Routing, Real-time

+
    +
  1. Get in touch with GoGet's sales team and get access to their API.
  2. +
  3. Enter your GoGet ConsumerKey and GoGet ConsumerSecret in your application credentials.
  4. +
  5. GoGet results will start coming through the TripGo API for your API key (after at most 5 minutes).
  6. +
+

Lyft 🇺🇸

+

Integrations: Routing, Real-time, Bookings

+
    +
  1. Read the terms of use of Lyft's API and make sure you comply with them in your app.
  2. +
  3. Sign up to Lyft's API.
  4. +
  5. Enter your Lyft Client ID and Lyft Client Secret in your application credentials.
  6. +
  7. Lyft results will start coming through the TripGo API for your API key (after at most 5 minutes).
  8. +
+

Ola 🇮🇳 🇦🇺 🇳🇿 🇬🇧

+

Integrations: Routing, Real-time

+
    +
  1. Get in touch with Ola's sales team and get access to their API.
  2. +
  3. Enter your OLA ApiKey in your application credentials.
  4. +
  5. Ola results will start coming through the TripGo API for your API key (after at most 5 minutes).
  6. +
+ + + + +
+

Unlocking public transport real-time data

+

To get real-time data for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite).

+

Chicago's CTA 🇺🇸

+
    +
  1. Read the terms of use of CTA's API and make sure you comply with them in your app
  2. +
  3. Sign up to CTA's API
  4. +
  5. Enter your CTA key for Chicago in your application credentials.
  6. +
  7. Real-time data for CTA for your TripGo API key will be enabled (after at most 5 minutes).
  8. +
+

STIB-MIVB in Brussels 🌎

+
    +
  1. Read the terms of use of STIB-MIVB's open data platform and make sure you comply with them in your app
  2. +
  3. Sign up to STIB-MIVB's API
  4. +
  5. Enter your STIB-MIVB realtime api key in your application credentials.
  6. +
  7. Real-time data for STIB-MIVB for your TripGo API key will be enabled (after at most 5 minutes).
  8. +
+ + +

To get real-time data for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite).

+

Adding new providers: TSP connectors

+

For TSPs that are not yet integrated into our platform, you can add them by:

+
    +
  1. Implementing the corresponding API according to our API specs, and then
  2. +
  3. Sending the URL of where you have deployed your implementation to api@skedgo.com.
  4. +
+

The process then involves a manual step (which we plan to automate) to add that to our list of TSP connectors and enable it. +It will usually take 1 day after it is added to our list for results will then include the new TSP, with some exceptions like pod based share vehicles, which will take between 3 and 7 days.

+

How does this work

+

All TSP connector APIs share in common three endpoints:

+
    +
  • config: the list of endpoints that are implemented, similar to gbfs.json
  • +
  • provider: the information about the provider, which may include links to mobile apps and deep links (with a pattern); and also the list of modes for the TSP
  • +
  • coverage: a list of coverage areas of the provider, and for each area, it is possible to define available products and pricing rules
  • +
+

Config endpoint allows our platform to understand what are the capabilities of the TSP integration of each connector. +Provider information is what our platform will use to attribute results. This will be passed on with any API responses that include results from your TSP connector. +Coverage will allow our platform to know in which areas (i.e., regions) the TSP will be enabled.

+

Taxi and TNC

+

For taxi and TNC providers we defined a Taxi API which allows you to:

+
    +
  • Add static pricing (in coverage endpoint), which will be shown as an estimate cost and used by our routing engine when creating trip alternatives.
  • +
  • Provide real-time ETAs, which might differ by "product".
  • +
  • Provide real-time costs estimations based on specific trip details.
  • +
  • Enable in-app booking capabilities, so users can directly initiate the booking process through our platform.
  • +
+

Shared bikes, scooters and cars

+

For shared vehicles, such as bikes, scooters or cars, we support the GBFS standard with the addition of the shared endpoints mentioned above (except for config which is replaced by the standard gbfs.json). This includes support for car-sharing, but be aware that this part of the standard is not finalised yet (as of February 2021). +We also support GBFS sources with only one endpoint, for example just the free_bike_status.json endpoint.

+
+

Additional data sources

+

Unlocking real-time traffic

+

To get real-time traffic information, you need to unlock one of the providers below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite).

+

Live-Traffic from Google 🌎

+
    +
  1. Read the terms of use of Google Maps and make sure you comply with them in your app - in particular, that you are using a Google Map.
  2. +
  3. Sign up to the Google Maps Directions API
  4. +
  5. Enter your Google Maps Directions API key in your application credentials.
  6. +
  7. Car results leaving now will then come augmented with Google's drive time predictions through the TripGo API for your API key (after at most 5 minutes).
  8. +
+

Live-Traffic from TomTom 🌎

+
    +
  1. Sign up to the TomTom Maps API, making sure you read the terms and comply with them - in particular, that you're not affiliated with a prohibited party and that you're using a TomTom or TomTom licenses map UI (e.g., Apple Maps).
  2. +
  3. Enter your TomTom consumer API key and TomTom consumer secret in your application credentials.
  4. +
  5. Car results leaving now will then come augmented with TomTom's drive time predictions through the TripGo API for your API key (after at most 5 minutes).
  6. +
+

Unlocking geocoding providers

+

To get results from geocoding data for providers who aren't using Open Data when using geocoding.json endpoint, follow the instructions for the provider below. These providers will only apply for non auto-completion requests, except for What3Words ones, which can be used for both type of geocoding requests. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite).

+

Foursquare 🌎

+
    +
  1. Read the Foursquare Terms of Use and make sure you comply with them in your app.
  2. +
  3. Sign up to the Foursquare Developers Site
  4. +
  5. Enter your Foursquare API key in your application credentials.
  6. +
  7. Add allowFoursquare=true to your geocoding requests, and then geocoding results will then come augmented with Foursquare's API through the TripGo API for your API key (after at most 5 minutes).
  8. +
+

Google Places 🌎

+
    +
  1. Read the Places API Policies and make sure you comply with them in your app - in particular, that you are using a Google Map.
  2. +
  3. Sign up to the Google Places API
  4. +
  5. Enter your Google Places API key in your application credentials.
  6. +
  7. Add allowGoogle=true to your geocoding requests, and then geocoding results will then come augmented with Google Places's API through the TripGo API for your API key (after at most 5 minutes).
  8. +
+

What3Words 🌎

+
    +
  1. Read the API Licence Agreement and make sure you comply with them in your app.
  2. +
  3. Sign up to the What3Words API
  4. +
  5. Enter your What 3 Words key in your application credentials.
  6. +
  7. Add allowW3W=true to your geocoding requests, and then geocoding results will then come augmented with What3Words's API through the TripGo API for your API key (after at most 5 minutes).
  8. +
+

Yelp 🌎

+
    +
  1. Read the Yelp Terms of Use and make sure you comply with them in your app.
  2. +
  3. Sign up to the Yelp Developers Site
  4. +
  5. Enter your Yelp API key in your application credentials.
  6. +
  7. Add allowYelp=true to your geocoding requests, and then geocoding results will then come augmented with Yelp's API through the TripGo API for your API key (after at most 5 minutes).
  8. +
+
+

Adding "info" data sources

+

Similar to TSP connectors above, you can create a "info" connector to enhance our platform with more information, as defined in the Info API, which allows:

+
    +
  • Reporting real-time events on a given location or area. The model follows GTFS-R standard and will be added to our platform responses accordingly.
  • +
  • Integrating bike lanes, which will be used by our cycling results to prioritise those paths.
  • +
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/faq/index.html b/faq/index.html new file mode 100644 index 00000000..85e24dda --- /dev/null +++ b/faq/index.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + F.A.Q. - TripGo Developer + + + + + + + +
+ +
+ +

General

+

Languages

+
+

Which languages does the API support?

+
+

Most text that's returned in the results and meant to be displayed to users has been localised to several languages - Chinese (simplified and traditional), Danish, Dutch, English, German, Italian, Finnish, French, Korean, Portuguese, Spanish.

+

The translations are done in the open on Crowdin and everyone can contribute, including adding new languages.

+

One note of causion: Some text, such as line names and status alerts, is provided by transport providers and only available in the languages provided by them.

+
+

Regions

+
+

What are regions?

+
+

Our API splits the world into several pieces, which we call regions. Several endpoints require you to pass along a region code, e.g., because identifiers might be duplicated around the world.

+

You can get a list of regions by quering regions.json:

+
curl 'https://api.tripgo.com/v1/regions.json' -H 'Content-Type: application/json' --compressed -H "X-TripGo-Key: $tripgoKey" -d '{"v":2}'
+
+

Then extract the polylines from there and match your coordinates to a region. This endpoint also tells you which modes are supported by routing for a given region.

+
+

I noticed URLs in those regions, how can/should I use those?

+
+

Most developer should not need to worry about these and can just use the api.tripgo.com domain. However, performance critical application can use this to reduce lag and directly hit the routing servers.

+

For advanced users: This exposes to you that our API is covered by multiple servers - though not every server covers ever region. You can use the URLs to directly query servers covering a certain region – which can be beneficial to reduce lag and is recommended for server-to-server communication. However, be aware that you should add failover from one server to another yourself then, as individual servers can go down unannounced for maintenance. You should only cache this information short term as those URLs can change without notice.

+
+

Health check

+
+

How can I check whether the service is working?

+
+

You can to that by querying our regions.json endpoint, adding the X-TripGo-HealthCheck header:

+
curl 'https://api.tripgo.com/v1/regions.json' -H "X-TripGo-Key: $tripgoKey" -H "X-TripGo-HealthCheck: true"
+
+

If the health-check passed, you'll get a 200 OK back with the following body:

+
{"healthCheckPassed": true}
+
+

These requests are free of charge.

+
+

Map Data

+
+

Which Map Data Layer do you use?

+
+

Our platform uses OSM (Open Street Map) for the underlying map data, and this information is used when we calculate routes (mainly for private transport modes). This data affects, for example, how we decide what routes are faster, the shapes of the resulting trips for roads, paths and cycleways, among others. +We can also integrate other data layers (such as Here) upon request. If you want to use other data layer than OSM, please get in touch with our team by mail or on Slack (by self-invite).

+
+

But I see Google Maps in TripGo apps

+
+

TripGo Android app and our web app use Google Maps to display information on the map, whereas the TripGo iOS app uses Apple Maps. +Note, however, that this is different from the map data used by the platform to calculate routes. Google or Apple Maps are the visual map used by front-end apps to display trips and locations to the end user. +It is up to the front-ends to decide which mapping UI SDK to use. It is important to note that different mapping UIs may have restrictions in their licensing terms which other APIs and services can be used to display on and alongside those maps.

+
+

Routing

+

Mode Identifiers

+
+

What are all these peculiar looking strings such as pt_pub?

+
+

Syntax

+

The syntax of the mode string is like this:

+

<group>_<mode that makes sense to the user>[_<provider or fine-grained mode>][_<line number>]

+

List of groups

+

Warning: This list can expand at any time when types of transport are added to SkedGo's backend, so if you hard-code how to interpret these identifiers, make sure to handle it gracefully if the API returns an identifier that you haven't yet seen.

+
    +
  • pt_ is for transit which runs on schedules
  • +
  • ps_ is for taxi-like on-demand services
  • +
  • me_ is for vehicles you drive yourself
  • +
  • cy_ is for cycling Deprecated (use me_mic_ instead)
  • +
  • wa_ is for walking and similar (e.g., wheelchair)
  • +
  • in_ is for intercity long distance transport
  • +
  • stationary_ is for stationary segments in between transport segments
  • +
+

pt_

+
    +
  • pt_pub is "public transit" that is accessible to the general public
      +
    • pt_pub_bus
    • +
    • pt_pub_cablecar
    • +
    • pt_pub_carferry
    • +
    • pt_pub_coach, long-distance buses
    • +
    • pt_pub_expressbus
    • +
    • pt_pub_ferry
    • +
    • pt_pub_funicular
    • +
    • pt_pub_gondola
    • +
    • pt_pub_metro, similar to subway but also going overground
    • +
    • pt_pub_monorail
    • +
    • pt_pub_regionaltrain, e.g., inter-city trains
    • +
    • pt_pub_subway
    • +
    • pt_pub_train, primarily local/commuter trains
    • +
    • pt_pub_tram
    • +
    +
  • +
  • pt_ltd_SCHOOLBUS is public transit of limited access (school buses)
      +
    • pt_ltd_SCHOOLBUS_<line number> for a specific school bus line
    • +
    +
  • +
+

ps_

+
    +
  • ps_tax is for taxis
  • +
  • ps_tnc is for uber and alike (TNC is California's official code for them)
      +
    • ps_tnc_lyft
    • +
    • ps_tnc_sidecar
    • +
    • ps_tnc_uber
    • +
    +
  • +
+

me_

+
    +
  • me_car is for your own car
  • +
  • me_car-s is for car sharing (like ZipCar or GoGet)
  • +
  • me_car-r is for car rental (like Budget)
  • +
  • me_car-p is for car pooling (like BlaBlaCar)
  • +
  • me_mot is for your own motorbike
  • +
  • me_mic is for your own micro-mobility
      +
    • me_mic_bic, regular _bic_ycle
    • +
    • me_mic_fold-bic, _fold_ing/portable _bic_ycle that will be taken on any public transport mode, and will be taken all the way to the destination
    • +
    • me_mic_e-sco, _e-sco_oter up to 25 km/h. Portable, allowed on cycle lanes in general, except specific rules in certain countries
    • +
    • me_mic_fast-e-sco, fast _e-sco_oter up to 45 km/h. Portable, not allowed on cycle lanes in general, except specific rules in certain countries
    • +
    +
  • +
+

stationary_

+
    +
  • stationary_parking-onstreet is for parking a vehicle on-street
  • +
  • stationary_parking-offstreet is for parking a vehicle in an off-street location
  • +
  • stationary_wait is a buffer for waiting for the following transport, e.g., waiting for a taxi or ride share to show up, but not for transferring between timetable-based public transport segments which get the special identifier below.
  • +
  • stationary_transfer is for transferring between timetable-based public transport segments, often following a walk; note: you only get this if there are at least two public transport segments in a trip.
  • +
  • stationary_vehicle-collect is for picking up a shared vehicle
  • +
  • stationary_vehicle-return is for returning a shared vehicle
  • +
  • stationary_airport-checkin is for checking in at an airport
  • +
  • stationary_airport-checkout is for "checking out" off an airport, e.g., for picking up luggage and going through immigration
  • +
  • stationary_airport-transfer is for transferring between flights at an airport
  • +
+
+

Single-modal vs. multi-modal routing

+
+

How do I get these sweet results which combine taxis or other private transport modes with public transport?

+
+

You need to specify multiple modes in the routing.json requests, e.g., by using modes=pt_pub&modes=ps_tax. You can specify a long list of modes as the API will then return suitable combinations for any of those.

+
+

What if I want to get both public-transport-only results and mixed results?

+
+

By default the request with multiple modes will only return inter-modal results, no results for individual modes.

+

The preferred way is to send off separate requests, e.g., if you want public transport, taxi, and combinations of the two, you need to send three requests: one with modes=pt_pub, one with modes=ps_tax, and one with modes=pt_pub&modes=ps_tax.

+

Alternatively, you can send the optional allModes=true with the request that has all the modes. In that case a single request is sufficient to get all the single-modal and inter-modal results, but use this with caution as by the notes below.

+

A few things to note:

+
    +
  1. It is preferred to send separate per-mode requests as some modes depend on external API calls, which slow things down.
  2. +
  3. Inter-modal results are generally not as fast to calculate due to the many combinations to crunch and them being likely to depend on multiple external API calls.
  4. +
  5. By having the inter-modal request not returning single-modal results, you don't need to do any duplicate detection between the results of the different calls as they are mutually exclusive.
  6. +
  7. You'll only get such inter-modal combinations where that combination is better in some way than using any individual mode by itself. It is therefore quite common that inter-modal requests result in an empty response.
  8. +
+
+

Trips, groups, frequencies and templates

+
+

What is the logic behind trip groups and what does the frequency property mean?

+
+

Each group is one way of getting from A to B. Each trip in a group is taking the same modes, and similar stops and tickets. They can take different services and different platforms, but overall they are all the same way of getting where you want to go, just at different times.

+

Frequency is related to this. It's the average frequency for how often such trips in a group run. It's an indication of how long you'd need to wait if you missed a trip in that group.

+

In our UI, for showing alternative ways of getting from A to B, we display a list of trip groups and for each trip group we display a "representative" trip, which is the one that fits the query the best. That's the trip in the trip group with the lowest weightedScore.

+
+

Why are segments split into references and templates?

+
+

This is related to trip groups: Trips in those groups often vary in just a few components but often take the same way or share other properties. The shared properties live in the templates while the properties that typically vary between trips live in the references. This can significantly cut down the size of the results and, thus, also the parsing speed on the client.

+
+

Trips results

+
+

Why do I get trips that don't start or end at the requested coordinates?

+
+

The routing results snap to the road/footpath network. So if your requested coordinates don't fall on a the network, the trips that you get will start/end at the nearest location of the road/footpath network.

+

The start of a trip, depends on the available modes. If the query is for driving, they will start at nearest road that allows driving, while trips that allow walking (or cycling) will start at the nearest footpath. This means that if you request multiple different modes, the trips might start at different locations, depending on the modes used in the trip.

+

The end of a trip will snap to the nearest footpath, i.e., driving trips might end with parking and then a walk.

+
+

Why do I get trips with the first segment of a trip already in the past?

+
+

When you have a trip group, you will get trips departing before the best one matching the query. +What you should do is, grey it out in the UI and don't select it by default (the weighted score is a good indicator for this).

+

Note that you can even get a trip group only with a trip in the past, e.g., if you queried for 12:15am and the last ferry left at 12:10.

+
+

Why do I get trips having segments that "go back in time" and result in arriving after the depart of the next one?

+
+

There may be cases where a segment of a trip is delayed, and due to realtime updates, the trip gets negative waiting times, e.g., a bus is delayed by 5 minutes and the trip had a connection of 2 minutes to take a train.

+

These cases should be handled by the app, either by alerting the user, by recomputing the trip, or by any other measure you consider appropriate.

+
+

Why do I get trips that don't start or end at the exact coordinates that I requested?

+
+

This is expectd and intentional. Our routing engine can only route from a point on the transport network to another point on the transport network. If the requested coordinates aren't on the transport network, it looks for the closest point on the transport network to snap to and route between them. This is made explicit in the routing results which return the query inputs and also for each trip where it started and ends.

+

This also explains why some short distance routings requests don't return anything. Information on that level might not be available, and routing starts and ends at practically at effectively the same location, resulting in nothing to return.

+

Imagine you drop a pin in the middle of a lake. Our routing engine routes to the closest point along a footpath to that point, and the trips terminate there. Requesting a walk from there to the middle of the lake wouldn't return anything. The same applies to parks or routing to the middle of a block where there's no additional information in OpenStreetMap.

+

You can indicate this in your UI by drawing a hop or dashed line between the requested coordinates and where the trip starts or ends.

+

Note the fromStreetName and toStreetName input parameters which let you bias which streets our routing engine should snap to. Say, a user typed in "15 Main St" into your app, which your geocoding service turns into a point coordinate in the middle of a block which is actually closer to somewhere on "2nd St". Our route would start on "2nd St". If you provide "Main St" as the fromStreetName parameter, it'll tell our routing engine to prefer to start on nearby streets of that name, even if they aren't the closest in a straight-line distance.

+
+

Placeholders in segment templates

+
+

What are all the possible values for placeholders and how should they get interpreted?

+
+

In order to use segment templates for multiple similar segments, the notes and action fields of a segment templates use placeholders, which should be filled it at run-time with the information from the segment template, and potentially updated with real-time data.

+
    +
  • <NUMBER>: Placeholder for the number of short name of the transit service, e.g., segment.serviceNumber.
  • +
  • <LINE_NAME>: Placeholder for the long name of the transit service, e.g., segment.serviceName.
  • +
  • <DIRECTION>: Placeholder for the direction of the transit service, e.g., segment.serviceDirection.
  • +
  • <LOCATIONS>: Placeholder for the start and end location of the segment, e.g., segment.start -> segment.end.
  • +
  • <PLATFORM>: Placeholder for the embarkation platform of the transit service, e.g., segment.platform.
  • +
  • <STOPS>: Placeholder for the number of stops that a transit service takes from the start to the end of the segment (including the disembarkation, but excluding the embarkation stop), e.g., segment.stops.
  • +
  • <TIME>*: Placeholder for the departure time of the segment, e.g., segment.startTime formatted as a time. Note that this can directly follow a <NUMBER> template, so you might have to add spacing.
  • +
  • <DURATION>*: Placeholder for the total duration of the segment, e.g., segment.endTime - segment.startTime formatted as a duration string.
  • +
  • <TRAFFIC>: (Badly named) placeholder for the total duration without traffic of the segment, e.g., segment.durationWithoutTraffic formatted as a duration string.
  • +
+

*: Should be updated with real-time data.

+
+

Advanced Routing Features

+
+

How does wheelchair flag in true affect the resulting trips?

+
+

There are three possible scenarios for public services, public stops, and paths: we know they are wheelchair accessible, we know they are not wheelchair accessible, or we don't have information about them. When the wheelchair flag is on, our routing engine will try to avoid services, stops and paths that are known by us to be inaccessible. In addition, we'll change 'walking' instructions to 'rolling' instructions, and indicate which sections are accessible, inaccessible or unknown.

+
+

What's the action field in the alerts for?

+
+

Sometimes we get real-time data that may change the accessibility status for public stops, +for example when a lift is temporarily out of service in a train station. In these cases, +we provide a mechanism that allows to identify the problem and send a re-route request +specifically asking to avoid the stop(s) that have become inaccessible.

+

If the embark/disembark stop of a public segment has issues, then we'll associate that +segment with an alert describing the issue and containing a special action field of +type rerouteExcludingStops which provides a list of the affected stop codes. Then if +you want to get a new set of results avoiding those stops, you can add the avoidStops +parameter to your original routing request, using the stop codes provided in the alert +action field, and re-send it.

+

Note that this new request will only avoid the stops you specifically indicated with the +avoidStops parameter, so your new set of results may again include an alert for a different +stop that also has issues. So you may want to send a third request asking to avoid this +one too, but it's important that you include all of them in the avoidStops list, or +otherwise you'll get again the stops that were first excluded.

+
+

Locations

+

Locations, cell IDs and hash codes

+
+

What are the cell IDs in the locations.json endpoint?

+
+

The way map regions are specified takes a bit of getting used to but it's worth it, as it allows caching results on the client, while frequently calling this endpoint to make sure the local data is update without requiring a lot of data overhead (and having most of the logic on the server). This works by splitting the world into individual cells which get an identifier which represents the south-west corner as $(lat*cellsPerDegree)#$(lng*cellsPerDegree).

+
+

Got it. And cellIDHashCodes?

+
+

You typically call locations.json with the cell IDs, but if you want to cache this information on the client, then, later, you'll want to use cellIDHashCodes as the input. Here you, again, send the cell IDs but this time with the hash codes for each cell from the previous output. You'll then only get content for cells if their content changed.

+
+

Example

+

Let's say, you want the minor stops around CBD of Sydney, Australia. You'll first request:

+
{
+  "region": "AU_NSW_Sydney",
+  "level": 2,
+  "cellIDs": [
+    "-2540#11339",
+    "-2540#11340",
+    "-2540#11341",
+    "-2541#11339",
+    "-2541#11340",
+    "-2541#11341",
+    "-2542#11339",
+    "-2542#11340",
+    "-2542#11341"
+  ]
+}
+
+

You'll then get results:

+
{
+  "groups": [
+    {
+      "hashCode": 690784261,
+      "key": "-2540#11339",
+      "stops": [...]
+    },
+    {
+      "hashCode": -1940969928,
+      "key": "-2540#11340",
+      "stops": [...]
+    }
+  ]
+}
+
+

You can then cache these and later on request again for changes by supplying cellIDHashCodes:

+
{
+  "region": "AU_NSW_Sydney",
+  "level": 2,
+  "cellIDHashCodes": {
+    "-2540#11339": 690784261,
+    "-2540#11340": -1940969928
+  }
+}
+
+

Which will then only return any groups that have changed. If nothing changed, you'll just get back:

+
{
+  "groups": []
+}
+
+
+

Note: You can do the same thing for the major stations of level 1. In that case the cell ID is typically the code of the region itself:

+
{
+  "region": "AU_NSW_Sydney",
+  "cellIDHashCodes": {
+    "AU_NSW_Sydney": 1096794422
+  }
+}
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/guides/deep-links/index.html b/guides/deep-links/index.html new file mode 100644 index 00000000..ee67ada4 --- /dev/null +++ b/guides/deep-links/index.html @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Deep Linking - TripGo Developer + + + + + + + +
+ +
+ +

Deep Linking

+

For a light-weight alternative to using our API, you can also deep-link into the TripGo app.

+

Routing results

+

$schema://$host/go?$parameters

+

Opens the routing results for the specified destination, and optionally the start and time:

+
    +
  • flat, flng: Start coordinates. If not specified, the user's current location is used.
  • +
  • tlat, tlng: End coordinates. Required, unless tname is provided.
  • +
  • tname: Destination as a search string (supports what3words). Required, unless tlat and tlng are provided.
  • +
  • type: 0 for leaving ASAP, 1 for leaving after time, 2 for arriving by time. Required.
  • +
  • time: Query time in seconds since 1970. Required, unless type is set to 0.
  • +
+

Examples:

+ +

Destination information

+

$schema://$host/meet?$parameters

+

Opens the search screen with the destination and arrival time filled in.

+
    +
  • lat, lng: Coordinate where to meet. Required, unless name is provided.
  • +
  • name: Destination as a search string (supports what3words). Required, unless lat and lng are provided.
  • +
  • time: Arrival time in seconds since 1970. Required.
  • +
+

Examples:

+ +

Timetable

+

$schema://$host/stop/$region/$stopCode

+

Opens the departures timetable for a given stop. $region and $stop use region codes and stop codes as defined in our API.

+

Examples:

+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/guides/sdks/index.html b/guides/sdks/index.html new file mode 100644 index 00000000..bc5b534e --- /dev/null +++ b/guides/sdks/index.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Sdks - TripGo Developer + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 00000000..d4d44367 Binary files /dev/null and b/img/favicon.ico differ diff --git a/img/favicon/android-icon-144x144.png b/img/favicon/android-icon-144x144.png new file mode 100644 index 00000000..4be5d88c Binary files /dev/null and b/img/favicon/android-icon-144x144.png differ diff --git a/img/favicon/android-icon-192x192.png b/img/favicon/android-icon-192x192.png new file mode 100644 index 00000000..3a6f4e7f Binary files /dev/null and b/img/favicon/android-icon-192x192.png differ diff --git a/img/favicon/android-icon-36x36.png b/img/favicon/android-icon-36x36.png new file mode 100644 index 00000000..e64690de Binary files /dev/null and b/img/favicon/android-icon-36x36.png differ diff --git a/img/favicon/android-icon-48x48.png b/img/favicon/android-icon-48x48.png new file mode 100644 index 00000000..23f660f6 Binary files /dev/null and b/img/favicon/android-icon-48x48.png differ diff --git a/img/favicon/android-icon-72x72.png b/img/favicon/android-icon-72x72.png new file mode 100644 index 00000000..32506f33 Binary files /dev/null and b/img/favicon/android-icon-72x72.png differ diff --git a/img/favicon/android-icon-96x96.png b/img/favicon/android-icon-96x96.png new file mode 100644 index 00000000..779e23e9 Binary files /dev/null and b/img/favicon/android-icon-96x96.png differ diff --git a/img/favicon/apple-icon-114x114.png b/img/favicon/apple-icon-114x114.png new file mode 100644 index 00000000..07e6fec4 Binary files /dev/null and b/img/favicon/apple-icon-114x114.png differ diff --git a/img/favicon/apple-icon-120x120.png b/img/favicon/apple-icon-120x120.png new file mode 100644 index 00000000..e9c5665a Binary files /dev/null and b/img/favicon/apple-icon-120x120.png differ diff --git a/img/favicon/apple-icon-144x144.png b/img/favicon/apple-icon-144x144.png new file mode 100644 index 00000000..4be5d88c Binary files /dev/null and b/img/favicon/apple-icon-144x144.png differ diff --git a/img/favicon/apple-icon-152x152.png b/img/favicon/apple-icon-152x152.png new file mode 100644 index 00000000..5fa8cea9 Binary files /dev/null and b/img/favicon/apple-icon-152x152.png differ diff --git a/img/favicon/apple-icon-180x180.png b/img/favicon/apple-icon-180x180.png new file mode 100644 index 00000000..d2ff3ffa Binary files /dev/null and b/img/favicon/apple-icon-180x180.png differ diff --git a/img/favicon/apple-icon-57x57.png b/img/favicon/apple-icon-57x57.png new file mode 100644 index 00000000..1c80355b Binary files /dev/null and b/img/favicon/apple-icon-57x57.png differ diff --git a/img/favicon/apple-icon-60x60.png b/img/favicon/apple-icon-60x60.png new file mode 100644 index 00000000..1be29225 Binary files /dev/null and b/img/favicon/apple-icon-60x60.png differ diff --git a/img/favicon/apple-icon-72x72.png b/img/favicon/apple-icon-72x72.png new file mode 100644 index 00000000..32506f33 Binary files /dev/null and b/img/favicon/apple-icon-72x72.png differ diff --git a/img/favicon/apple-icon-76x76.png b/img/favicon/apple-icon-76x76.png new file mode 100644 index 00000000..9e890dd0 Binary files /dev/null and b/img/favicon/apple-icon-76x76.png differ diff --git a/img/favicon/apple-icon-precomposed.png b/img/favicon/apple-icon-precomposed.png new file mode 100644 index 00000000..61837fb7 Binary files /dev/null and b/img/favicon/apple-icon-precomposed.png differ diff --git a/img/favicon/apple-icon.png b/img/favicon/apple-icon.png new file mode 100644 index 00000000..61837fb7 Binary files /dev/null and b/img/favicon/apple-icon.png differ diff --git a/img/favicon/browserconfig.xml b/img/favicon/browserconfig.xml new file mode 100644 index 00000000..c5541482 --- /dev/null +++ b/img/favicon/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/img/favicon/favicon-16x16.png b/img/favicon/favicon-16x16.png new file mode 100644 index 00000000..ec34ea81 Binary files /dev/null and b/img/favicon/favicon-16x16.png differ diff --git a/img/favicon/favicon-32x32.png b/img/favicon/favicon-32x32.png new file mode 100644 index 00000000..09363254 Binary files /dev/null and b/img/favicon/favicon-32x32.png differ diff --git a/img/favicon/favicon-96x96.png b/img/favicon/favicon-96x96.png new file mode 100644 index 00000000..779e23e9 Binary files /dev/null and b/img/favicon/favicon-96x96.png differ diff --git a/img/favicon/favicon.ico b/img/favicon/favicon.ico new file mode 100644 index 00000000..d4d44367 Binary files /dev/null and b/img/favicon/favicon.ico differ diff --git a/img/favicon/manifest.json b/img/favicon/manifest.json new file mode 100644 index 00000000..013d4a6a --- /dev/null +++ b/img/favicon/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/img/favicon/ms-icon-144x144.png b/img/favicon/ms-icon-144x144.png new file mode 100644 index 00000000..4be5d88c Binary files /dev/null and b/img/favicon/ms-icon-144x144.png differ diff --git a/img/favicon/ms-icon-150x150.png b/img/favicon/ms-icon-150x150.png new file mode 100644 index 00000000..57a87983 Binary files /dev/null and b/img/favicon/ms-icon-150x150.png differ diff --git a/img/favicon/ms-icon-310x310.png b/img/favicon/ms-icon-310x310.png new file mode 100644 index 00000000..963d27b3 Binary files /dev/null and b/img/favicon/ms-icon-310x310.png differ diff --git a/img/favicon/ms-icon-70x70.png b/img/favicon/ms-icon-70x70.png new file mode 100644 index 00000000..30ffcfcf Binary files /dev/null and b/img/favicon/ms-icon-70x70.png differ diff --git a/img/icon-arrow-next.svg b/img/icon-arrow-next.svg new file mode 100644 index 00000000..1fec26b4 --- /dev/null +++ b/img/icon-arrow-next.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/icon-arrow-prev.svg b/img/icon-arrow-prev.svg new file mode 100644 index 00000000..be513576 --- /dev/null +++ b/img/icon-arrow-prev.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/icon-caret-down.svg b/img/icon-caret-down.svg new file mode 100644 index 00000000..dd9c1771 --- /dev/null +++ b/img/icon-caret-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/icon-close.svg b/img/icon-close.svg new file mode 100644 index 00000000..99990256 --- /dev/null +++ b/img/icon-close.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/img/icon-search.svg b/img/icon-search.svg new file mode 100644 index 00000000..77eb9c5d --- /dev/null +++ b/img/icon-search.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/img/tripgo-api-all-trasport@2x-100.jpg b/img/tripgo-api-all-trasport@2x-100.jpg new file mode 100644 index 00000000..eb44d8bb Binary files /dev/null and b/img/tripgo-api-all-trasport@2x-100.jpg differ diff --git a/img/tripgo-api-logo-color.svg b/img/tripgo-api-logo-color.svg new file mode 100644 index 00000000..b5045345 --- /dev/null +++ b/img/tripgo-api-logo-color.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/img/tripgo-api-logo-mono.svg b/img/tripgo-api-logo-mono.svg new file mode 100644 index 00000000..795922e0 --- /dev/null +++ b/img/tripgo-api-logo-mono.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/tripgo-api-logo-white.svg b/img/tripgo-api-logo-white.svg new file mode 100644 index 00000000..aba0b551 --- /dev/null +++ b/img/tripgo-api-logo-white.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/img/tripgo-api-notification@2x-100.jpg b/img/tripgo-api-notification@2x-100.jpg new file mode 100644 index 00000000..a2fd7304 Binary files /dev/null and b/img/tripgo-api-notification@2x-100.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..4fc09ed7 --- /dev/null +++ b/index.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + TripGo Developer + + + + + + + +
+ +
+ +

TripGo API

+

The TripGo API allows you to plan door-to-door trips using a large variety of public and private transport. It integrates real-time information and, for selected providers, allows users to book and pay for transport. +All-transports

+
+

Getting started

+

1. Getting an API key

+

Get an API key. You can try it out for free for as long as you like, as long as you stay below a threshold of API calls - no credit card required. For limits on the free tier and pricing, see the SkedGo website.

+

It may take up to 5 minutes for your key to be active.

+

Once you have an API key, send it along with every request as the X-TripGo-Key header.

+

2. Make a request

+

Our API can do a lot more than just directions, but if that is what you are interested in, then try something like:

+
curl 'https://api.tripgo.com/v1/routing.json?from=(-33.859,151.207)&to=(-33.863,151.208)&departAfter=1532799914&modes=wa_wal&v=11&locale=en' -H 'Accept: application/json' --compressed -H "X-TripGo-Key: $tripgoKey" -g
+
+

or

+
curl 'https://api.tripgo.com/v1/routing.json?from=(-33.859,151.207)&to=(-33.891,151.209)&modes=pt_pub&v=11&locale=en' -H 'Accept: application/json' --compressed -H "X-TripGo-Key: $tripgoKey" -g
+
+

Keep in mind that this API is optimised to return a large number of trip results while maintaining small response sizes. This has a number of complications. Notably, to get a trip's segments you need to combine the segment references with the segment templates. This is explained further in the F.A.Q..

+

3. Where to go from here?

+
    +
  1. +

    If you're an app developer, take a look at our open source TripKit SDKs for iOS, macOS, and Android.

    +
  2. +
  3. +

    If you're a web developer, take a look at our React SDK, or check out our Leaflet Plugin (see Demo).

    +
  4. +
  5. +

    If you're a backend developer, dive into the API specs, which are available in OpenAPI (formerly Swagger) format.

    +
  6. +
  7. +

    If you know how to debug a web app, look at the network activity for our web app to get an idea of which API calls to use when. (Filter for "satapp".)

    +
  8. +
  9. +

    To talk to us and other developers using our API, join our Slack team on this page.

    +
  10. +
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/js/app.js b/js/app.js new file mode 100644 index 00000000..40f002d5 --- /dev/null +++ b/js/app.js @@ -0,0 +1,123 @@ +$(function(){ + $('a[href*="#"]') + // Remove links that don't actually link to anything + .not('[href="#"]') + .not('[href="#0"]') + .click(function(event) { + // On-page links + if ( + location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') + && + location.hostname == this.hostname + ) { + // Figure out element to scroll to + var target = $(this.hash); + target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); + // Does a scroll target exist? + if (target.length) { + // Only prevent default if animation is actually gonna happen + event.preventDefault(); + $('html, body').animate({ + scrollTop: target.offset().top + }, 500, function() { + // Callback after animation + // Must change focus! + var $target = $(target); + $target.focus(); + if ($target.is(":focus")) { // Checking if the target was focused + return false; + } else { + $target.attr('tabindex','-1'); // Adding tabindex for elements not focusable + $target.focus(); // Set focus again + }; + }); + } + } + }); + // Keyboard navigation + document.addEventListener("keydown", function(e) { + if ($(e.target).is(':input')) return true; + var key = e.which || e.keyCode || window.event && window.event.keyCode; + var page; + switch (key) { + case 39: // right arrow + page = $('[role="navigation"] a:contains(Next):first').prop('href'); + break; + case 37: // left arrow + page = $('[role="navigation"] a:contains(Previous):first').prop('href'); + break; + // case 83: // s + // e.preventDefault(); + // $keyboard_modal.modal('hide'); + // $search_modal.modal('show'); + // $search_modal.find('#mkdocs-search-query').focus(); + // break; + // case 191: // ? + // $keyboard_modal.modal('show'); + // break; + default: break; + } + if (page) { + // $keyboard_modal.modal('hide'); + window.location.href = page; + } + }); + + reloadSideNav(); + + $('a.menu-toggle').click(function() { + $('a.search').toggleClass('hide'); + if (!($(this).hasClass('-toggle'))) { + $(this).addClass('-toggle'); + $('.menu').addClass('-show').attr('aria-hidden', 'true'); + $('.navbar').addClass('-expanded'); + + } else { + $(this).removeClass('-toggle'); + $('.menu').removeClass('-show').attr('aria-hidden', 'false'); + $('.navbar').removeClass('-expanded'); + } + }); + + $('a.search').click(function(){ + $(this).toggleClass('cross'); + if (!($('.search-form').hasClass('show'))) { + $('.search-form').addClass('show'); + $('body').addClass('lock'); + $('#mkdocs-search-query').focus(); + } else { + $('.search-form').removeClass('show'); + $('body').removeClass('lock'); + } + }); +}) + +$(window).scroll(function(){ + reloadSideNav(); +}); + +function reloadSideNav() { + var valueMin = 999999999; + var currentHeight = 0; + var currentsideitem = ''; + var currentsidebarpos = 0; + $('.content h1[id]').each(function(){ + var value = Math.abs($(this).offset().top - $(window).scrollTop()); + if ( value < valueMin) { + valueMin = value; + var sideitem = 'a[href="#'; + currentsideitem = sideitem.concat($(this).attr('id').toLowerCase(), '"]'); + } + }); + $('.content h2[id]').each(function(){ + var value = Math.abs($(this).offset().top - $(window).scrollTop()); + if ( value < valueMin) { + valueMin = value; + var sideitem = 'a[href="#'; + currentsideitem = sideitem.concat($(this).attr('id').toLowerCase(), '"]'); + } + }); + currentsidebarpos = Math.abs($(currentsideitem).offset().top - $('.sidebar').offset().top); + currentHeight = $(currentsideitem).outerHeight(); + $('.sidebar > .indicator').css({'top': currentsidebarpos, 'height': currentHeight}); +} \ No newline at end of file diff --git a/js/app.min.js b/js/app.min.js new file mode 100644 index 00000000..8dada437 --- /dev/null +++ b/js/app.min.js @@ -0,0 +1,6 @@ +$(function(){$('a[href*="#"]') +.not('[href="#"]').not('[href="#0"]').click(function(event){ if(location.pathname.replace(/^\//,'')==this.pathname.replace(/^\//,'')&&location.hostname==this.hostname){ var target=$(this.hash);target=target.length?target:$('[name='+this.hash.slice(1)+']');if(target.length){ event.preventDefault();$('html, body').animate({scrollTop:target.offset().top},500,function(){ +var $target=$(target);$target.focus();if($target.is(":focus")){ return false;}else{$target.attr('tabindex','-1'); $target.focus();};});}}}); document.addEventListener("keydown",function(e){if($(e.target).is(':input'))return true;var key=e.which||e.keyCode||window.event&&window.event.keyCode;var page;switch(key){case 39: page=$('[role="navigation"] a:contains(Next):first').prop('href');break;case 37: page=$('[role="navigation"] a:contains(Previous):first').prop('href');break; +default:break;} +if(page){window.location.href=page;}});reloadSideNav();$('a.menu-toggle').click(function(){$('a.search').toggleClass('hide');if(!($(this).hasClass('-toggle'))){$(this).addClass('-toggle');$('.menu').addClass('-show').attr('aria-hidden','true');$('.navbar').addClass('-expanded');}else{$(this).removeClass('-toggle');$('.menu').removeClass('-show').attr('aria-hidden','false');$('.navbar').removeClass('-expanded');}});$('a.search').click(function(){$(this).toggleClass('cross');if(!($('.search-form').hasClass('show'))){$('.search-form').addClass('show');$('body').addClass('lock');$('#mkdocs-search-query').focus();}else{$('.search-form').removeClass('show');$('body').removeClass('lock');}});}) +$(window).scroll(function(){reloadSideNav();});function reloadSideNav(){var valueMin=999999999;var currentHeight=0;var currentsideitem='';var currentsidebarpos=0;$('.content h1[id]').each(function(){var value=Math.abs($(this).offset().top-$(window).scrollTop());if(value .indicator').css({'top':currentsidebarpos,'height':currentHeight});} \ No newline at end of file diff --git a/search/lunr.js b/search/lunr.js new file mode 100644 index 00000000..aca0a167 --- /dev/null +++ b/search/lunr.js @@ -0,0 +1,3475 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ + +;(function(){ + +/** + * A convenience function for configuring and constructing + * a new lunr Index. + * + * A lunr.Builder instance is created and the pipeline setup + * with a trimmer, stop word filter and stemmer. + * + * This builder object is yielded to the configuration function + * that is passed as a parameter, allowing the list of fields + * and other builder parameters to be customised. + * + * All documents _must_ be added within the passed config function. + * + * @example + * var idx = lunr(function () { + * this.field('title') + * this.field('body') + * this.ref('id') + * + * documents.forEach(function (doc) { + * this.add(doc) + * }, this) + * }) + * + * @see {@link lunr.Builder} + * @see {@link lunr.Pipeline} + * @see {@link lunr.trimmer} + * @see {@link lunr.stopWordFilter} + * @see {@link lunr.stemmer} + * @namespace {function} lunr + */ +var lunr = function (config) { + var builder = new lunr.Builder + + builder.pipeline.add( + lunr.trimmer, + lunr.stopWordFilter, + lunr.stemmer + ) + + builder.searchPipeline.add( + lunr.stemmer + ) + + config.call(builder, builder) + return builder.build() +} + +lunr.version = "2.3.9" +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A namespace containing utils for the rest of the lunr library + * @namespace lunr.utils + */ +lunr.utils = {} + +/** + * Print a warning message to the console. + * + * @param {String} message The message to be printed. + * @memberOf lunr.utils + * @function + */ +lunr.utils.warn = (function (global) { + /* eslint-disable no-console */ + return function (message) { + if (global.console && console.warn) { + console.warn(message) + } + } + /* eslint-enable no-console */ +})(this) + +/** + * Convert an object to a string. + * + * In the case of `null` and `undefined` the function returns + * the empty string, in all other cases the result of calling + * `toString` on the passed object is returned. + * + * @param {Any} obj The object to convert to a string. + * @return {String} string representation of the passed object. + * @memberOf lunr.utils + */ +lunr.utils.asString = function (obj) { + if (obj === void 0 || obj === null) { + return "" + } else { + return obj.toString() + } +} + +/** + * Clones an object. + * + * Will create a copy of an existing object such that any mutations + * on the copy cannot affect the original. + * + * Only shallow objects are supported, passing a nested object to this + * function will cause a TypeError. + * + * Objects with primitives, and arrays of primitives are supported. + * + * @param {Object} obj The object to clone. + * @return {Object} a clone of the passed object. + * @throws {TypeError} when a nested object is passed. + * @memberOf Utils + */ +lunr.utils.clone = function (obj) { + if (obj === null || obj === undefined) { + return obj + } + + var clone = Object.create(null), + keys = Object.keys(obj) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i], + val = obj[key] + + if (Array.isArray(val)) { + clone[key] = val.slice() + continue + } + + if (typeof val === 'string' || + typeof val === 'number' || + typeof val === 'boolean') { + clone[key] = val + continue + } + + throw new TypeError("clone is not deep and does not support nested objects") + } + + return clone +} +lunr.FieldRef = function (docRef, fieldName, stringValue) { + this.docRef = docRef + this.fieldName = fieldName + this._stringValue = stringValue +} + +lunr.FieldRef.joiner = "/" + +lunr.FieldRef.fromString = function (s) { + var n = s.indexOf(lunr.FieldRef.joiner) + + if (n === -1) { + throw "malformed field ref string" + } + + var fieldRef = s.slice(0, n), + docRef = s.slice(n + 1) + + return new lunr.FieldRef (docRef, fieldRef, s) +} + +lunr.FieldRef.prototype.toString = function () { + if (this._stringValue == undefined) { + this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef + } + + return this._stringValue +} +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A lunr set. + * + * @constructor + */ +lunr.Set = function (elements) { + this.elements = Object.create(null) + + if (elements) { + this.length = elements.length + + for (var i = 0; i < this.length; i++) { + this.elements[elements[i]] = true + } + } else { + this.length = 0 + } +} + +/** + * A complete set that contains all elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.complete = { + intersect: function (other) { + return other + }, + + union: function () { + return this + }, + + contains: function () { + return true + } +} + +/** + * An empty set that contains no elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.empty = { + intersect: function () { + return this + }, + + union: function (other) { + return other + }, + + contains: function () { + return false + } +} + +/** + * Returns true if this set contains the specified object. + * + * @param {object} object - Object whose presence in this set is to be tested. + * @returns {boolean} - True if this set contains the specified object. + */ +lunr.Set.prototype.contains = function (object) { + return !!this.elements[object] +} + +/** + * Returns a new set containing only the elements that are present in both + * this set and the specified set. + * + * @param {lunr.Set} other - set to intersect with this set. + * @returns {lunr.Set} a new set that is the intersection of this and the specified set. + */ + +lunr.Set.prototype.intersect = function (other) { + var a, b, elements, intersection = [] + + if (other === lunr.Set.complete) { + return this + } + + if (other === lunr.Set.empty) { + return other + } + + if (this.length < other.length) { + a = this + b = other + } else { + a = other + b = this + } + + elements = Object.keys(a.elements) + + for (var i = 0; i < elements.length; i++) { + var element = elements[i] + if (element in b.elements) { + intersection.push(element) + } + } + + return new lunr.Set (intersection) +} + +/** + * Returns a new set combining the elements of this and the specified set. + * + * @param {lunr.Set} other - set to union with this set. + * @return {lunr.Set} a new set that is the union of this and the specified set. + */ + +lunr.Set.prototype.union = function (other) { + if (other === lunr.Set.complete) { + return lunr.Set.complete + } + + if (other === lunr.Set.empty) { + return this + } + + return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements))) +} +/** + * A function to calculate the inverse document frequency for + * a posting. This is shared between the builder and the index + * + * @private + * @param {object} posting - The posting for a given term + * @param {number} documentCount - The total number of documents. + */ +lunr.idf = function (posting, documentCount) { + var documentsWithTerm = 0 + + for (var fieldName in posting) { + if (fieldName == '_index') continue // Ignore the term index, its not a field + documentsWithTerm += Object.keys(posting[fieldName]).length + } + + var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5) + + return Math.log(1 + Math.abs(x)) +} + +/** + * A token wraps a string representation of a token + * as it is passed through the text processing pipeline. + * + * @constructor + * @param {string} [str=''] - The string token being wrapped. + * @param {object} [metadata={}] - Metadata associated with this token. + */ +lunr.Token = function (str, metadata) { + this.str = str || "" + this.metadata = metadata || {} +} + +/** + * Returns the token string that is being wrapped by this object. + * + * @returns {string} + */ +lunr.Token.prototype.toString = function () { + return this.str +} + +/** + * A token update function is used when updating or optionally + * when cloning a token. + * + * @callback lunr.Token~updateFunction + * @param {string} str - The string representation of the token. + * @param {Object} metadata - All metadata associated with this token. + */ + +/** + * Applies the given function to the wrapped string token. + * + * @example + * token.update(function (str, metadata) { + * return str.toUpperCase() + * }) + * + * @param {lunr.Token~updateFunction} fn - A function to apply to the token string. + * @returns {lunr.Token} + */ +lunr.Token.prototype.update = function (fn) { + this.str = fn(this.str, this.metadata) + return this +} + +/** + * Creates a clone of this token. Optionally a function can be + * applied to the cloned token. + * + * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token. + * @returns {lunr.Token} + */ +lunr.Token.prototype.clone = function (fn) { + fn = fn || function (s) { return s } + return new lunr.Token (fn(this.str, this.metadata), this.metadata) +} +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A function for splitting a string into tokens ready to be inserted into + * the search index. Uses `lunr.tokenizer.separator` to split strings, change + * the value of this property to change how strings are split into tokens. + * + * This tokenizer will convert its parameter to a string by calling `toString` and + * then will split this string on the character in `lunr.tokenizer.separator`. + * Arrays will have their elements converted to strings and wrapped in a lunr.Token. + * + * Optional metadata can be passed to the tokenizer, this metadata will be cloned and + * added as metadata to every token that is created from the object to be tokenized. + * + * @static + * @param {?(string|object|object[])} obj - The object to convert into tokens + * @param {?object} metadata - Optional metadata to associate with every token + * @returns {lunr.Token[]} + * @see {@link lunr.Pipeline} + */ +lunr.tokenizer = function (obj, metadata) { + if (obj == null || obj == undefined) { + return [] + } + + if (Array.isArray(obj)) { + return obj.map(function (t) { + return new lunr.Token( + lunr.utils.asString(t).toLowerCase(), + lunr.utils.clone(metadata) + ) + }) + } + + var str = obj.toString().toLowerCase(), + len = str.length, + tokens = [] + + for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) { + var char = str.charAt(sliceEnd), + sliceLength = sliceEnd - sliceStart + + if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) { + + if (sliceLength > 0) { + var tokenMetadata = lunr.utils.clone(metadata) || {} + tokenMetadata["position"] = [sliceStart, sliceLength] + tokenMetadata["index"] = tokens.length + + tokens.push( + new lunr.Token ( + str.slice(sliceStart, sliceEnd), + tokenMetadata + ) + ) + } + + sliceStart = sliceEnd + 1 + } + + } + + return tokens +} + +/** + * The separator used to split a string into tokens. Override this property to change the behaviour of + * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. + * + * @static + * @see lunr.tokenizer + */ +lunr.tokenizer.separator = /[\s\-]+/ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Pipelines maintain an ordered list of functions to be applied to all + * tokens in documents entering the search index and queries being ran against + * the index. + * + * An instance of lunr.Index created with the lunr shortcut will contain a + * pipeline with a stop word filter and an English language stemmer. Extra + * functions can be added before or after either of these functions or these + * default functions can be removed. + * + * When run the pipeline will call each function in turn, passing a token, the + * index of that token in the original list of all tokens and finally a list of + * all the original tokens. + * + * The output of functions in the pipeline will be passed to the next function + * in the pipeline. To exclude a token from entering the index the function + * should return undefined, the rest of the pipeline will not be called with + * this token. + * + * For serialisation of pipelines to work, all functions used in an instance of + * a pipeline should be registered with lunr.Pipeline. Registered functions can + * then be loaded. If trying to load a serialised pipeline that uses functions + * that are not registered an error will be thrown. + * + * If not planning on serialising the pipeline then registering pipeline functions + * is not necessary. + * + * @constructor + */ +lunr.Pipeline = function () { + this._stack = [] +} + +lunr.Pipeline.registeredFunctions = Object.create(null) + +/** + * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token + * string as well as all known metadata. A pipeline function can mutate the token string + * or mutate (or add) metadata for a given token. + * + * A pipeline function can indicate that the passed token should be discarded by returning + * null, undefined or an empty string. This token will not be passed to any downstream pipeline + * functions and will not be added to the index. + * + * Multiple tokens can be returned by returning an array of tokens. Each token will be passed + * to any downstream pipeline functions and all will returned tokens will be added to the index. + * + * Any number of pipeline functions may be chained together using a lunr.Pipeline. + * + * @interface lunr.PipelineFunction + * @param {lunr.Token} token - A token from the document being processed. + * @param {number} i - The index of this token in the complete list of tokens for this document/field. + * @param {lunr.Token[]} tokens - All tokens for this document/field. + * @returns {(?lunr.Token|lunr.Token[])} + */ + +/** + * Register a function with the pipeline. + * + * Functions that are used in the pipeline should be registered if the pipeline + * needs to be serialised, or a serialised pipeline needs to be loaded. + * + * Registering a function does not add it to a pipeline, functions must still be + * added to instances of the pipeline for them to be used when running a pipeline. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @param {String} label - The label to register this function with + */ +lunr.Pipeline.registerFunction = function (fn, label) { + if (label in this.registeredFunctions) { + lunr.utils.warn('Overwriting existing registered function: ' + label) + } + + fn.label = label + lunr.Pipeline.registeredFunctions[fn.label] = fn +} + +/** + * Warns if the function is not registered as a Pipeline function. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @private + */ +lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { + var isRegistered = fn.label && (fn.label in this.registeredFunctions) + + if (!isRegistered) { + lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) + } +} + +/** + * Loads a previously serialised pipeline. + * + * All functions to be loaded must already be registered with lunr.Pipeline. + * If any function from the serialised data has not been registered then an + * error will be thrown. + * + * @param {Object} serialised - The serialised pipeline to load. + * @returns {lunr.Pipeline} + */ +lunr.Pipeline.load = function (serialised) { + var pipeline = new lunr.Pipeline + + serialised.forEach(function (fnName) { + var fn = lunr.Pipeline.registeredFunctions[fnName] + + if (fn) { + pipeline.add(fn) + } else { + throw new Error('Cannot load unregistered function: ' + fnName) + } + }) + + return pipeline +} + +/** + * Adds new functions to the end of the pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. + */ +lunr.Pipeline.prototype.add = function () { + var fns = Array.prototype.slice.call(arguments) + + fns.forEach(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + this._stack.push(fn) + }, this) +} + +/** + * Adds a single function after a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.after = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + pos = pos + 1 + this._stack.splice(pos, 0, newFn) +} + +/** + * Adds a single function before a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.before = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + this._stack.splice(pos, 0, newFn) +} + +/** + * Removes a function from the pipeline. + * + * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. + */ +lunr.Pipeline.prototype.remove = function (fn) { + var pos = this._stack.indexOf(fn) + if (pos == -1) { + return + } + + this._stack.splice(pos, 1) +} + +/** + * Runs the current list of functions that make up the pipeline against the + * passed tokens. + * + * @param {Array} tokens The tokens to run through the pipeline. + * @returns {Array} + */ +lunr.Pipeline.prototype.run = function (tokens) { + var stackLength = this._stack.length + + for (var i = 0; i < stackLength; i++) { + var fn = this._stack[i] + var memo = [] + + for (var j = 0; j < tokens.length; j++) { + var result = fn(tokens[j], j, tokens) + + if (result === null || result === void 0 || result === '') continue + + if (Array.isArray(result)) { + for (var k = 0; k < result.length; k++) { + memo.push(result[k]) + } + } else { + memo.push(result) + } + } + + tokens = memo + } + + return tokens +} + +/** + * Convenience method for passing a string through a pipeline and getting + * strings out. This method takes care of wrapping the passed string in a + * token and mapping the resulting tokens back to strings. + * + * @param {string} str - The string to pass through the pipeline. + * @param {?object} metadata - Optional metadata to associate with the token + * passed to the pipeline. + * @returns {string[]} + */ +lunr.Pipeline.prototype.runString = function (str, metadata) { + var token = new lunr.Token (str, metadata) + + return this.run([token]).map(function (t) { + return t.toString() + }) +} + +/** + * Resets the pipeline by removing any existing processors. + * + */ +lunr.Pipeline.prototype.reset = function () { + this._stack = [] +} + +/** + * Returns a representation of the pipeline ready for serialisation. + * + * Logs a warning if the function has not been registered. + * + * @returns {Array} + */ +lunr.Pipeline.prototype.toJSON = function () { + return this._stack.map(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + + return fn.label + }) +} +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A vector is used to construct the vector space of documents and queries. These + * vectors support operations to determine the similarity between two documents or + * a document and a query. + * + * Normally no parameters are required for initializing a vector, but in the case of + * loading a previously dumped vector the raw elements can be provided to the constructor. + * + * For performance reasons vectors are implemented with a flat array, where an elements + * index is immediately followed by its value. E.g. [index, value, index, value]. This + * allows the underlying array to be as sparse as possible and still offer decent + * performance when being used for vector calculations. + * + * @constructor + * @param {Number[]} [elements] - The flat list of element index and element value pairs. + */ +lunr.Vector = function (elements) { + this._magnitude = 0 + this.elements = elements || [] +} + + +/** + * Calculates the position within the vector to insert a given index. + * + * This is used internally by insert and upsert. If there are duplicate indexes then + * the position is returned as if the value for that index were to be updated, but it + * is the callers responsibility to check whether there is a duplicate at that index + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @returns {Number} + */ +lunr.Vector.prototype.positionForIndex = function (index) { + // For an empty vector the tuple can be inserted at the beginning + if (this.elements.length == 0) { + return 0 + } + + var start = 0, + end = this.elements.length / 2, + sliceLength = end - start, + pivotPoint = Math.floor(sliceLength / 2), + pivotIndex = this.elements[pivotPoint * 2] + + while (sliceLength > 1) { + if (pivotIndex < index) { + start = pivotPoint + } + + if (pivotIndex > index) { + end = pivotPoint + } + + if (pivotIndex == index) { + break + } + + sliceLength = end - start + pivotPoint = start + Math.floor(sliceLength / 2) + pivotIndex = this.elements[pivotPoint * 2] + } + + if (pivotIndex == index) { + return pivotPoint * 2 + } + + if (pivotIndex > index) { + return pivotPoint * 2 + } + + if (pivotIndex < index) { + return (pivotPoint + 1) * 2 + } +} + +/** + * Inserts an element at an index within the vector. + * + * Does not allow duplicates, will throw an error if there is already an entry + * for this index. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + */ +lunr.Vector.prototype.insert = function (insertIdx, val) { + this.upsert(insertIdx, val, function () { + throw "duplicate index" + }) +} + +/** + * Inserts or updates an existing index within the vector. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + * @param {function} fn - A function that is called for updates, the existing value and the + * requested value are passed as arguments + */ +lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { + this._magnitude = 0 + var position = this.positionForIndex(insertIdx) + + if (this.elements[position] == insertIdx) { + this.elements[position + 1] = fn(this.elements[position + 1], val) + } else { + this.elements.splice(position, 0, insertIdx, val) + } +} + +/** + * Calculates the magnitude of this vector. + * + * @returns {Number} + */ +lunr.Vector.prototype.magnitude = function () { + if (this._magnitude) return this._magnitude + + var sumOfSquares = 0, + elementsLength = this.elements.length + + for (var i = 1; i < elementsLength; i += 2) { + var val = this.elements[i] + sumOfSquares += val * val + } + + return this._magnitude = Math.sqrt(sumOfSquares) +} + +/** + * Calculates the dot product of this vector and another vector. + * + * @param {lunr.Vector} otherVector - The vector to compute the dot product with. + * @returns {Number} + */ +lunr.Vector.prototype.dot = function (otherVector) { + var dotProduct = 0, + a = this.elements, b = otherVector.elements, + aLen = a.length, bLen = b.length, + aVal = 0, bVal = 0, + i = 0, j = 0 + + while (i < aLen && j < bLen) { + aVal = a[i], bVal = b[j] + if (aVal < bVal) { + i += 2 + } else if (aVal > bVal) { + j += 2 + } else if (aVal == bVal) { + dotProduct += a[i + 1] * b[j + 1] + i += 2 + j += 2 + } + } + + return dotProduct +} + +/** + * Calculates the similarity between this vector and another vector. + * + * @param {lunr.Vector} otherVector - The other vector to calculate the + * similarity with. + * @returns {Number} + */ +lunr.Vector.prototype.similarity = function (otherVector) { + return this.dot(otherVector) / this.magnitude() || 0 +} + +/** + * Converts the vector to an array of the elements within the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toArray = function () { + var output = new Array (this.elements.length / 2) + + for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { + output[j] = this.elements[i] + } + + return output +} + +/** + * A JSON serializable representation of the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toJSON = function () { + return this.elements +} +/* eslint-disable */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + +/** + * lunr.stemmer is an english language stemmer, this is a JavaScript + * implementation of the PorterStemmer taken from http://tartarus.org/~martin + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token - The string to stem + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + * @function + */ +lunr.stemmer = (function(){ + var step2list = { + "ational" : "ate", + "tional" : "tion", + "enci" : "ence", + "anci" : "ance", + "izer" : "ize", + "bli" : "ble", + "alli" : "al", + "entli" : "ent", + "eli" : "e", + "ousli" : "ous", + "ization" : "ize", + "ation" : "ate", + "ator" : "ate", + "alism" : "al", + "iveness" : "ive", + "fulness" : "ful", + "ousness" : "ous", + "aliti" : "al", + "iviti" : "ive", + "biliti" : "ble", + "logi" : "log" + }, + + step3list = { + "icate" : "ic", + "ative" : "", + "alize" : "al", + "iciti" : "ic", + "ical" : "ic", + "ful" : "", + "ness" : "" + }, + + c = "[^aeiou]", // consonant + v = "[aeiouy]", // vowel + C = c + "[^aeiouy]*", // consonant sequence + V = v + "[aeiou]*", // vowel sequence + + mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 + meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 + mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 + s_v = "^(" + C + ")?" + v; // vowel in stem + + var re_mgr0 = new RegExp(mgr0); + var re_mgr1 = new RegExp(mgr1); + var re_meq1 = new RegExp(meq1); + var re_s_v = new RegExp(s_v); + + var re_1a = /^(.+?)(ss|i)es$/; + var re2_1a = /^(.+?)([^s])s$/; + var re_1b = /^(.+?)eed$/; + var re2_1b = /^(.+?)(ed|ing)$/; + var re_1b_2 = /.$/; + var re2_1b_2 = /(at|bl|iz)$/; + var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); + var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var re_1c = /^(.+?[^aeiou])y$/; + var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + + var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + + var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + var re2_4 = /^(.+?)(s|t)(ion)$/; + + var re_5 = /^(.+?)e$/; + var re_5_1 = /ll$/; + var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var porterStemmer = function porterStemmer(w) { + var stem, + suffix, + firstch, + re, + re2, + re3, + re4; + + if (w.length < 3) { return w; } + + firstch = w.substr(0,1); + if (firstch == "y") { + w = firstch.toUpperCase() + w.substr(1); + } + + // Step 1a + re = re_1a + re2 = re2_1a; + + if (re.test(w)) { w = w.replace(re,"$1$2"); } + else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } + + // Step 1b + re = re_1b; + re2 = re2_1b; + if (re.test(w)) { + var fp = re.exec(w); + re = re_mgr0; + if (re.test(fp[1])) { + re = re_1b_2; + w = w.replace(re,""); + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = re_s_v; + if (re2.test(stem)) { + w = stem; + re2 = re2_1b_2; + re3 = re3_1b_2; + re4 = re4_1b_2; + if (re2.test(w)) { w = w + "e"; } + else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } + else if (re4.test(w)) { w = w + "e"; } + } + } + + // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) + re = re_1c; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem + "i"; + } + + // Step 2 + re = re_2; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step2list[suffix]; + } + } + + // Step 3 + re = re_3; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step3list[suffix]; + } + } + + // Step 4 + re = re_4; + re2 = re2_4; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + if (re.test(stem)) { + w = stem; + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = re_mgr1; + if (re2.test(stem)) { + w = stem; + } + } + + // Step 5 + re = re_5; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + re2 = re_meq1; + re3 = re3_5; + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { + w = stem; + } + } + + re = re_5_1; + re2 = re_mgr1; + if (re.test(w) && re2.test(w)) { + re = re_1b_2; + w = w.replace(re,""); + } + + // and turn initial Y back to y + + if (firstch == "y") { + w = firstch.toLowerCase() + w.substr(1); + } + + return w; + }; + + return function (token) { + return token.update(porterStemmer); + } +})(); + +lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.generateStopWordFilter builds a stopWordFilter function from the provided + * list of stop words. + * + * The built in lunr.stopWordFilter is built using this generator and can be used + * to generate custom stopWordFilters for applications or non English languages. + * + * @function + * @param {Array} token The token to pass through the filter + * @returns {lunr.PipelineFunction} + * @see lunr.Pipeline + * @see lunr.stopWordFilter + */ +lunr.generateStopWordFilter = function (stopWords) { + var words = stopWords.reduce(function (memo, stopWord) { + memo[stopWord] = stopWord + return memo + }, {}) + + return function (token) { + if (token && words[token.toString()] !== token.toString()) return token + } +} + +/** + * lunr.stopWordFilter is an English language stop word list filter, any words + * contained in the list will not be passed through the filter. + * + * This is intended to be used in the Pipeline. If the token does not pass the + * filter then undefined will be returned. + * + * @function + * @implements {lunr.PipelineFunction} + * @params {lunr.Token} token - A token to check for being a stop word. + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + */ +lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'all', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'any', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'do', + 'does', + 'either', + 'else', + 'ever', + 'every', + 'for', + 'from', + 'get', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'in', + 'into', + 'is', + 'it', + 'its', + 'just', + 'least', + 'let', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'only', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'where', + 'which', + 'while', + 'who', + 'whom', + 'why', + 'will', + 'with', + 'would', + 'yet', + 'you', + 'your' +]) + +lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.trimmer is a pipeline function for trimming non word + * characters from the beginning and end of tokens before they + * enter the index. + * + * This implementation may not work correctly for non latin + * characters and should either be removed or adapted for use + * with languages with non-latin characters. + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token The token to pass through the filter + * @returns {lunr.Token} + * @see lunr.Pipeline + */ +lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^\W+/, '').replace(/\W+$/, '') + }) +} + +lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A token set is used to store the unique list of all tokens + * within an index. Token sets are also used to represent an + * incoming query to the index, this query token set and index + * token set are then intersected to find which tokens to look + * up in the inverted index. + * + * A token set can hold multiple tokens, as in the case of the + * index token set, or it can hold a single token as in the + * case of a simple query token set. + * + * Additionally token sets are used to perform wildcard matching. + * Leading, contained and trailing wildcards are supported, and + * from this edit distance matching can also be provided. + * + * Token sets are implemented as a minimal finite state automata, + * where both common prefixes and suffixes are shared between tokens. + * This helps to reduce the space used for storing the token set. + * + * @constructor + */ +lunr.TokenSet = function () { + this.final = false + this.edges = {} + this.id = lunr.TokenSet._nextId + lunr.TokenSet._nextId += 1 +} + +/** + * Keeps track of the next, auto increment, identifier to assign + * to a new tokenSet. + * + * TokenSets require a unique identifier to be correctly minimised. + * + * @private + */ +lunr.TokenSet._nextId = 1 + +/** + * Creates a TokenSet instance from the given sorted array of words. + * + * @param {String[]} arr - A sorted array of strings to create the set from. + * @returns {lunr.TokenSet} + * @throws Will throw an error if the input array is not sorted. + */ +lunr.TokenSet.fromArray = function (arr) { + var builder = new lunr.TokenSet.Builder + + for (var i = 0, len = arr.length; i < len; i++) { + builder.insert(arr[i]) + } + + builder.finish() + return builder.root +} + +/** + * Creates a token set from a query clause. + * + * @private + * @param {Object} clause - A single clause from lunr.Query. + * @param {string} clause.term - The query clause term. + * @param {number} [clause.editDistance] - The optional edit distance for the term. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromClause = function (clause) { + if ('editDistance' in clause) { + return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) + } else { + return lunr.TokenSet.fromString(clause.term) + } +} + +/** + * Creates a token set representing a single string with a specified + * edit distance. + * + * Insertions, deletions, substitutions and transpositions are each + * treated as an edit distance of 1. + * + * Increasing the allowed edit distance will have a dramatic impact + * on the performance of both creating and intersecting these TokenSets. + * It is advised to keep the edit distance less than 3. + * + * @param {string} str - The string to create the token set from. + * @param {number} editDistance - The allowed edit distance to match. + * @returns {lunr.Vector} + */ +lunr.TokenSet.fromFuzzyString = function (str, editDistance) { + var root = new lunr.TokenSet + + var stack = [{ + node: root, + editsRemaining: editDistance, + str: str + }] + + while (stack.length) { + var frame = stack.pop() + + // no edit + if (frame.str.length > 0) { + var char = frame.str.charAt(0), + noEditNode + + if (char in frame.node.edges) { + noEditNode = frame.node.edges[char] + } else { + noEditNode = new lunr.TokenSet + frame.node.edges[char] = noEditNode + } + + if (frame.str.length == 1) { + noEditNode.final = true + } + + stack.push({ + node: noEditNode, + editsRemaining: frame.editsRemaining, + str: frame.str.slice(1) + }) + } + + if (frame.editsRemaining == 0) { + continue + } + + // insertion + if ("*" in frame.node.edges) { + var insertionNode = frame.node.edges["*"] + } else { + var insertionNode = new lunr.TokenSet + frame.node.edges["*"] = insertionNode + } + + if (frame.str.length == 0) { + insertionNode.final = true + } + + stack.push({ + node: insertionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str + }) + + // deletion + // can only do a deletion if we have enough edits remaining + // and if there are characters left to delete in the string + if (frame.str.length > 1) { + stack.push({ + node: frame.node, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // deletion + // just removing the last character from the str + if (frame.str.length == 1) { + frame.node.final = true + } + + // substitution + // can only do a substitution if we have enough edits remaining + // and if there are characters left to substitute + if (frame.str.length >= 1) { + if ("*" in frame.node.edges) { + var substitutionNode = frame.node.edges["*"] + } else { + var substitutionNode = new lunr.TokenSet + frame.node.edges["*"] = substitutionNode + } + + if (frame.str.length == 1) { + substitutionNode.final = true + } + + stack.push({ + node: substitutionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // transposition + // can only do a transposition if there are edits remaining + // and there are enough characters to transpose + if (frame.str.length > 1) { + var charA = frame.str.charAt(0), + charB = frame.str.charAt(1), + transposeNode + + if (charB in frame.node.edges) { + transposeNode = frame.node.edges[charB] + } else { + transposeNode = new lunr.TokenSet + frame.node.edges[charB] = transposeNode + } + + if (frame.str.length == 1) { + transposeNode.final = true + } + + stack.push({ + node: transposeNode, + editsRemaining: frame.editsRemaining - 1, + str: charA + frame.str.slice(2) + }) + } + } + + return root +} + +/** + * Creates a TokenSet from a string. + * + * The string may contain one or more wildcard characters (*) + * that will allow wildcard matching when intersecting with + * another TokenSet. + * + * @param {string} str - The string to create a TokenSet from. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromString = function (str) { + var node = new lunr.TokenSet, + root = node + + /* + * Iterates through all characters within the passed string + * appending a node for each character. + * + * When a wildcard character is found then a self + * referencing edge is introduced to continually match + * any number of any characters. + */ + for (var i = 0, len = str.length; i < len; i++) { + var char = str[i], + final = (i == len - 1) + + if (char == "*") { + node.edges[char] = node + node.final = final + + } else { + var next = new lunr.TokenSet + next.final = final + + node.edges[char] = next + node = next + } + } + + return root +} + +/** + * Converts this TokenSet into an array of strings + * contained within the TokenSet. + * + * This is not intended to be used on a TokenSet that + * contains wildcards, in these cases the results are + * undefined and are likely to cause an infinite loop. + * + * @returns {string[]} + */ +lunr.TokenSet.prototype.toArray = function () { + var words = [] + + var stack = [{ + prefix: "", + node: this + }] + + while (stack.length) { + var frame = stack.pop(), + edges = Object.keys(frame.node.edges), + len = edges.length + + if (frame.node.final) { + /* In Safari, at this point the prefix is sometimes corrupted, see: + * https://github.com/olivernn/lunr.js/issues/279 Calling any + * String.prototype method forces Safari to "cast" this string to what + * it's supposed to be, fixing the bug. */ + frame.prefix.charAt(0) + words.push(frame.prefix) + } + + for (var i = 0; i < len; i++) { + var edge = edges[i] + + stack.push({ + prefix: frame.prefix.concat(edge), + node: frame.node.edges[edge] + }) + } + } + + return words +} + +/** + * Generates a string representation of a TokenSet. + * + * This is intended to allow TokenSets to be used as keys + * in objects, largely to aid the construction and minimisation + * of a TokenSet. As such it is not designed to be a human + * friendly representation of the TokenSet. + * + * @returns {string} + */ +lunr.TokenSet.prototype.toString = function () { + // NOTE: Using Object.keys here as this.edges is very likely + // to enter 'hash-mode' with many keys being added + // + // avoiding a for-in loop here as it leads to the function + // being de-optimised (at least in V8). From some simple + // benchmarks the performance is comparable, but allowing + // V8 to optimize may mean easy performance wins in the future. + + if (this._str) { + return this._str + } + + var str = this.final ? '1' : '0', + labels = Object.keys(this.edges).sort(), + len = labels.length + + for (var i = 0; i < len; i++) { + var label = labels[i], + node = this.edges[label] + + str = str + label + node.id + } + + return str +} + +/** + * Returns a new TokenSet that is the intersection of + * this TokenSet and the passed TokenSet. + * + * This intersection will take into account any wildcards + * contained within the TokenSet. + * + * @param {lunr.TokenSet} b - An other TokenSet to intersect with. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.prototype.intersect = function (b) { + var output = new lunr.TokenSet, + frame = undefined + + var stack = [{ + qNode: b, + output: output, + node: this + }] + + while (stack.length) { + frame = stack.pop() + + // NOTE: As with the #toString method, we are using + // Object.keys and a for loop instead of a for-in loop + // as both of these objects enter 'hash' mode, causing + // the function to be de-optimised in V8 + var qEdges = Object.keys(frame.qNode.edges), + qLen = qEdges.length, + nEdges = Object.keys(frame.node.edges), + nLen = nEdges.length + + for (var q = 0; q < qLen; q++) { + var qEdge = qEdges[q] + + for (var n = 0; n < nLen; n++) { + var nEdge = nEdges[n] + + if (nEdge == qEdge || qEdge == '*') { + var node = frame.node.edges[nEdge], + qNode = frame.qNode.edges[qEdge], + final = node.final && qNode.final, + next = undefined + + if (nEdge in frame.output.edges) { + // an edge already exists for this character + // no need to create a new node, just set the finality + // bit unless this node is already final + next = frame.output.edges[nEdge] + next.final = next.final || final + + } else { + // no edge exists yet, must create one + // set the finality bit and insert it + // into the output + next = new lunr.TokenSet + next.final = final + frame.output.edges[nEdge] = next + } + + stack.push({ + qNode: qNode, + output: next, + node: node + }) + } + } + } + } + + return output +} +lunr.TokenSet.Builder = function () { + this.previousWord = "" + this.root = new lunr.TokenSet + this.uncheckedNodes = [] + this.minimizedNodes = {} +} + +lunr.TokenSet.Builder.prototype.insert = function (word) { + var node, + commonPrefix = 0 + + if (word < this.previousWord) { + throw new Error ("Out of order word insertion") + } + + for (var i = 0; i < word.length && i < this.previousWord.length; i++) { + if (word[i] != this.previousWord[i]) break + commonPrefix++ + } + + this.minimize(commonPrefix) + + if (this.uncheckedNodes.length == 0) { + node = this.root + } else { + node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child + } + + for (var i = commonPrefix; i < word.length; i++) { + var nextNode = new lunr.TokenSet, + char = word[i] + + node.edges[char] = nextNode + + this.uncheckedNodes.push({ + parent: node, + char: char, + child: nextNode + }) + + node = nextNode + } + + node.final = true + this.previousWord = word +} + +lunr.TokenSet.Builder.prototype.finish = function () { + this.minimize(0) +} + +lunr.TokenSet.Builder.prototype.minimize = function (downTo) { + for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { + var node = this.uncheckedNodes[i], + childKey = node.child.toString() + + if (childKey in this.minimizedNodes) { + node.parent.edges[node.char] = this.minimizedNodes[childKey] + } else { + // Cache the key for this node since + // we know it can't change anymore + node.child._str = childKey + + this.minimizedNodes[childKey] = node.child + } + + this.uncheckedNodes.pop() + } +} +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * An index contains the built index of all documents and provides a query interface + * to the index. + * + * Usually instances of lunr.Index will not be created using this constructor, instead + * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be + * used to load previously built and serialized indexes. + * + * @constructor + * @param {Object} attrs - The attributes of the built search index. + * @param {Object} attrs.invertedIndex - An index of term/field to document reference. + * @param {Object} attrs.fieldVectors - Field vectors + * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. + * @param {string[]} attrs.fields - The names of indexed document fields. + * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. + */ +lunr.Index = function (attrs) { + this.invertedIndex = attrs.invertedIndex + this.fieldVectors = attrs.fieldVectors + this.tokenSet = attrs.tokenSet + this.fields = attrs.fields + this.pipeline = attrs.pipeline +} + +/** + * A result contains details of a document matching a search query. + * @typedef {Object} lunr.Index~Result + * @property {string} ref - The reference of the document this result represents. + * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. + * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. + */ + +/** + * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple + * query language which itself is parsed into an instance of lunr.Query. + * + * For programmatically building queries it is advised to directly use lunr.Query, the query language + * is best used for human entered text rather than program generated text. + * + * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported + * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' + * or 'world', though those that contain both will rank higher in the results. + * + * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can + * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding + * wildcards will increase the number of documents that will be found but can also have a negative + * impact on query performance, especially with wildcards at the beginning of a term. + * + * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term + * hello in the title field will match this query. Using a field not present in the index will lead + * to an error being thrown. + * + * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term + * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported + * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. + * Avoid large values for edit distance to improve query performance. + * + * Each term also supports a presence modifier. By default a term's presence in document is optional, however + * this can be changed to either required or prohibited. For a term's presence to be required in a document the + * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and + * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not + * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. + * + * To escape special characters the backslash character '\' can be used, this allows searches to include + * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead + * of attempting to apply a boost of 2 to the search term "foo". + * + * @typedef {string} lunr.Index~QueryString + * @example Simple single term query + * hello + * @example Multiple term query + * hello world + * @example term scoped to a field + * title:hello + * @example term with a boost of 10 + * hello^10 + * @example term with an edit distance of 2 + * hello~2 + * @example terms with presence modifiers + * -foo +bar baz + */ + +/** + * Performs a search against the index using lunr query syntax. + * + * Results will be returned sorted by their score, the most relevant results + * will be returned first. For details on how the score is calculated, please see + * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. + * + * For more programmatic querying use lunr.Index#query. + * + * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. + * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.search = function (queryString) { + return this.query(function (query) { + var parser = new lunr.QueryParser(queryString, query) + parser.parse() + }) +} + +/** + * A query builder callback provides a query object to be used to express + * the query to perform on the index. + * + * @callback lunr.Index~queryBuilder + * @param {lunr.Query} query - The query object to build up. + * @this lunr.Query + */ + +/** + * Performs a query against the index using the yielded lunr.Query object. + * + * If performing programmatic queries against the index, this method is preferred + * over lunr.Index#search so as to avoid the additional query parsing overhead. + * + * A query object is yielded to the supplied function which should be used to + * express the query to be run against the index. + * + * Note that although this function takes a callback parameter it is _not_ an + * asynchronous operation, the callback is just yielded a query object to be + * customized. + * + * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.query = function (fn) { + // for each query clause + // * process terms + // * expand terms from token set + // * find matching documents and metadata + // * get document vectors + // * score documents + + var query = new lunr.Query(this.fields), + matchingFields = Object.create(null), + queryVectors = Object.create(null), + termFieldCache = Object.create(null), + requiredMatches = Object.create(null), + prohibitedMatches = Object.create(null) + + /* + * To support field level boosts a query vector is created per + * field. An empty vector is eagerly created to support negated + * queries. + */ + for (var i = 0; i < this.fields.length; i++) { + queryVectors[this.fields[i]] = new lunr.Vector + } + + fn.call(query, query) + + for (var i = 0; i < query.clauses.length; i++) { + /* + * Unless the pipeline has been disabled for this term, which is + * the case for terms with wildcards, we need to pass the clause + * term through the search pipeline. A pipeline returns an array + * of processed terms. Pipeline functions may expand the passed + * term, which means we may end up performing multiple index lookups + * for a single query term. + */ + var clause = query.clauses[i], + terms = null, + clauseMatches = lunr.Set.empty + + if (clause.usePipeline) { + terms = this.pipeline.runString(clause.term, { + fields: clause.fields + }) + } else { + terms = [clause.term] + } + + for (var m = 0; m < terms.length; m++) { + var term = terms[m] + + /* + * Each term returned from the pipeline needs to use the same query + * clause object, e.g. the same boost and or edit distance. The + * simplest way to do this is to re-use the clause object but mutate + * its term property. + */ + clause.term = term + + /* + * From the term in the clause we create a token set which will then + * be used to intersect the indexes token set to get a list of terms + * to lookup in the inverted index + */ + var termTokenSet = lunr.TokenSet.fromClause(clause), + expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() + + /* + * If a term marked as required does not exist in the tokenSet it is + * impossible for the search to return any matches. We set all the field + * scoped required matches set to empty and stop examining any further + * clauses. + */ + if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = lunr.Set.empty + } + + break + } + + for (var j = 0; j < expandedTerms.length; j++) { + /* + * For each term get the posting and termIndex, this is required for + * building the query vector. + */ + var expandedTerm = expandedTerms[j], + posting = this.invertedIndex[expandedTerm], + termIndex = posting._index + + for (var k = 0; k < clause.fields.length; k++) { + /* + * For each field that this query term is scoped by (by default + * all fields are in scope) we need to get all the document refs + * that have this term in that field. + * + * The posting is the entry in the invertedIndex for the matching + * term from above. + */ + var field = clause.fields[k], + fieldPosting = posting[field], + matchingDocumentRefs = Object.keys(fieldPosting), + termField = expandedTerm + "/" + field, + matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) + + /* + * if the presence of this term is required ensure that the matching + * documents are added to the set of required matches for this clause. + * + */ + if (clause.presence == lunr.Query.presence.REQUIRED) { + clauseMatches = clauseMatches.union(matchingDocumentsSet) + + if (requiredMatches[field] === undefined) { + requiredMatches[field] = lunr.Set.complete + } + } + + /* + * if the presence of this term is prohibited ensure that the matching + * documents are added to the set of prohibited matches for this field, + * creating that set if it does not yet exist. + */ + if (clause.presence == lunr.Query.presence.PROHIBITED) { + if (prohibitedMatches[field] === undefined) { + prohibitedMatches[field] = lunr.Set.empty + } + + prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) + + /* + * Prohibited matches should not be part of the query vector used for + * similarity scoring and no metadata should be extracted so we continue + * to the next field + */ + continue + } + + /* + * The query field vector is populated using the termIndex found for + * the term and a unit value with the appropriate boost applied. + * Using upsert because there could already be an entry in the vector + * for the term we are working with. In that case we just add the scores + * together. + */ + queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) + + /** + * If we've already seen this term, field combo then we've already collected + * the matching documents and metadata, no need to go through all that again + */ + if (termFieldCache[termField]) { + continue + } + + for (var l = 0; l < matchingDocumentRefs.length; l++) { + /* + * All metadata for this term/field/document triple + * are then extracted and collected into an instance + * of lunr.MatchData ready to be returned in the query + * results + */ + var matchingDocumentRef = matchingDocumentRefs[l], + matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), + metadata = fieldPosting[matchingDocumentRef], + fieldMatch + + if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { + matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) + } else { + fieldMatch.add(expandedTerm, field, metadata) + } + + } + + termFieldCache[termField] = true + } + } + } + + /** + * If the presence was required we need to update the requiredMatches field sets. + * We do this after all fields for the term have collected their matches because + * the clause terms presence is required in _any_ of the fields not _all_ of the + * fields. + */ + if (clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) + } + } + } + + /** + * Need to combine the field scoped required and prohibited + * matching documents into a global set of required and prohibited + * matches + */ + var allRequiredMatches = lunr.Set.complete, + allProhibitedMatches = lunr.Set.empty + + for (var i = 0; i < this.fields.length; i++) { + var field = this.fields[i] + + if (requiredMatches[field]) { + allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) + } + + if (prohibitedMatches[field]) { + allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) + } + } + + var matchingFieldRefs = Object.keys(matchingFields), + results = [], + matches = Object.create(null) + + /* + * If the query is negated (contains only prohibited terms) + * we need to get _all_ fieldRefs currently existing in the + * index. This is only done when we know that the query is + * entirely prohibited terms to avoid any cost of getting all + * fieldRefs unnecessarily. + * + * Additionally, blank MatchData must be created to correctly + * populate the results. + */ + if (query.isNegated()) { + matchingFieldRefs = Object.keys(this.fieldVectors) + + for (var i = 0; i < matchingFieldRefs.length; i++) { + var matchingFieldRef = matchingFieldRefs[i] + var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) + matchingFields[matchingFieldRef] = new lunr.MatchData + } + } + + for (var i = 0; i < matchingFieldRefs.length; i++) { + /* + * Currently we have document fields that match the query, but we + * need to return documents. The matchData and scores are combined + * from multiple fields belonging to the same document. + * + * Scores are calculated by field, using the query vectors created + * above, and combined into a final document score using addition. + */ + var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), + docRef = fieldRef.docRef + + if (!allRequiredMatches.contains(docRef)) { + continue + } + + if (allProhibitedMatches.contains(docRef)) { + continue + } + + var fieldVector = this.fieldVectors[fieldRef], + score = queryVectors[fieldRef.fieldName].similarity(fieldVector), + docMatch + + if ((docMatch = matches[docRef]) !== undefined) { + docMatch.score += score + docMatch.matchData.combine(matchingFields[fieldRef]) + } else { + var match = { + ref: docRef, + score: score, + matchData: matchingFields[fieldRef] + } + matches[docRef] = match + results.push(match) + } + } + + /* + * Sort the results objects by score, highest first. + */ + return results.sort(function (a, b) { + return b.score - a.score + }) +} + +/** + * Prepares the index for JSON serialization. + * + * The schema for this JSON blob will be described in a + * separate JSON schema file. + * + * @returns {Object} + */ +lunr.Index.prototype.toJSON = function () { + var invertedIndex = Object.keys(this.invertedIndex) + .sort() + .map(function (term) { + return [term, this.invertedIndex[term]] + }, this) + + var fieldVectors = Object.keys(this.fieldVectors) + .map(function (ref) { + return [ref, this.fieldVectors[ref].toJSON()] + }, this) + + return { + version: lunr.version, + fields: this.fields, + fieldVectors: fieldVectors, + invertedIndex: invertedIndex, + pipeline: this.pipeline.toJSON() + } +} + +/** + * Loads a previously serialized lunr.Index + * + * @param {Object} serializedIndex - A previously serialized lunr.Index + * @returns {lunr.Index} + */ +lunr.Index.load = function (serializedIndex) { + var attrs = {}, + fieldVectors = {}, + serializedVectors = serializedIndex.fieldVectors, + invertedIndex = Object.create(null), + serializedInvertedIndex = serializedIndex.invertedIndex, + tokenSetBuilder = new lunr.TokenSet.Builder, + pipeline = lunr.Pipeline.load(serializedIndex.pipeline) + + if (serializedIndex.version != lunr.version) { + lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") + } + + for (var i = 0; i < serializedVectors.length; i++) { + var tuple = serializedVectors[i], + ref = tuple[0], + elements = tuple[1] + + fieldVectors[ref] = new lunr.Vector(elements) + } + + for (var i = 0; i < serializedInvertedIndex.length; i++) { + var tuple = serializedInvertedIndex[i], + term = tuple[0], + posting = tuple[1] + + tokenSetBuilder.insert(term) + invertedIndex[term] = posting + } + + tokenSetBuilder.finish() + + attrs.fields = serializedIndex.fields + + attrs.fieldVectors = fieldVectors + attrs.invertedIndex = invertedIndex + attrs.tokenSet = tokenSetBuilder.root + attrs.pipeline = pipeline + + return new lunr.Index(attrs) +} +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Builder performs indexing on a set of documents and + * returns instances of lunr.Index ready for querying. + * + * All configuration of the index is done via the builder, the + * fields to index, the document reference, the text processing + * pipeline and document scoring parameters are all set on the + * builder before indexing. + * + * @constructor + * @property {string} _ref - Internal reference to the document reference field. + * @property {string[]} _fields - Internal reference to the document fields to index. + * @property {object} invertedIndex - The inverted index maps terms to document fields. + * @property {object} documentTermFrequencies - Keeps track of document term frequencies. + * @property {object} documentLengths - Keeps track of the length of documents added to the index. + * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. + * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. + * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. + * @property {number} documentCount - Keeps track of the total number of documents indexed. + * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. + * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. + * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. + * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. + */ +lunr.Builder = function () { + this._ref = "id" + this._fields = Object.create(null) + this._documents = Object.create(null) + this.invertedIndex = Object.create(null) + this.fieldTermFrequencies = {} + this.fieldLengths = {} + this.tokenizer = lunr.tokenizer + this.pipeline = new lunr.Pipeline + this.searchPipeline = new lunr.Pipeline + this.documentCount = 0 + this._b = 0.75 + this._k1 = 1.2 + this.termIndex = 0 + this.metadataWhitelist = [] +} + +/** + * Sets the document field used as the document reference. Every document must have this field. + * The type of this field in the document should be a string, if it is not a string it will be + * coerced into a string by calling toString. + * + * The default ref is 'id'. + * + * The ref should _not_ be changed during indexing, it should be set before any documents are + * added to the index. Changing it during indexing can lead to inconsistent results. + * + * @param {string} ref - The name of the reference field in the document. + */ +lunr.Builder.prototype.ref = function (ref) { + this._ref = ref +} + +/** + * A function that is used to extract a field from a document. + * + * Lunr expects a field to be at the top level of a document, if however the field + * is deeply nested within a document an extractor function can be used to extract + * the right field for indexing. + * + * @callback fieldExtractor + * @param {object} doc - The document being added to the index. + * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. + * @example Extracting a nested field + * function (doc) { return doc.nested.field } + */ + +/** + * Adds a field to the list of document fields that will be indexed. Every document being + * indexed should have this field. Null values for this field in indexed documents will + * not cause errors but will limit the chance of that document being retrieved by searches. + * + * All fields should be added before adding documents to the index. Adding fields after + * a document has been indexed will have no effect on already indexed documents. + * + * Fields can be boosted at build time. This allows terms within that field to have more + * importance when ranking search results. Use a field boost to specify that matches within + * one field are more important than other fields. + * + * @param {string} fieldName - The name of a field to index in all documents. + * @param {object} attributes - Optional attributes associated with this field. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. + * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. + * @throws {RangeError} fieldName cannot contain unsupported characters '/' + */ +lunr.Builder.prototype.field = function (fieldName, attributes) { + if (/\//.test(fieldName)) { + throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") + } + + this._fields[fieldName] = attributes || {} +} + +/** + * A parameter to tune the amount of field length normalisation that is applied when + * calculating relevance scores. A value of 0 will completely disable any normalisation + * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b + * will be clamped to the range 0 - 1. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.b = function (number) { + if (number < 0) { + this._b = 0 + } else if (number > 1) { + this._b = 1 + } else { + this._b = number + } +} + +/** + * A parameter that controls the speed at which a rise in term frequency results in term + * frequency saturation. The default value is 1.2. Setting this to a higher value will give + * slower saturation levels, a lower value will result in quicker saturation. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.k1 = function (number) { + this._k1 = number +} + +/** + * Adds a document to the index. + * + * Before adding fields to the index the index should have been fully setup, with the document + * ref and all fields to index already having been specified. + * + * The document must have a field name as specified by the ref (by default this is 'id') and + * it should have all fields defined for indexing, though null or undefined values will not + * cause errors. + * + * Entire documents can be boosted at build time. Applying a boost to a document indicates that + * this document should rank higher in search results than other documents. + * + * @param {object} doc - The document to add to the index. + * @param {object} attributes - Optional attributes associated with this document. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. + */ +lunr.Builder.prototype.add = function (doc, attributes) { + var docRef = doc[this._ref], + fields = Object.keys(this._fields) + + this._documents[docRef] = attributes || {} + this.documentCount += 1 + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i], + extractor = this._fields[fieldName].extractor, + field = extractor ? extractor(doc) : doc[fieldName], + tokens = this.tokenizer(field, { + fields: [fieldName] + }), + terms = this.pipeline.run(tokens), + fieldRef = new lunr.FieldRef (docRef, fieldName), + fieldTerms = Object.create(null) + + this.fieldTermFrequencies[fieldRef] = fieldTerms + this.fieldLengths[fieldRef] = 0 + + // store the length of this field for this document + this.fieldLengths[fieldRef] += terms.length + + // calculate term frequencies for this field + for (var j = 0; j < terms.length; j++) { + var term = terms[j] + + if (fieldTerms[term] == undefined) { + fieldTerms[term] = 0 + } + + fieldTerms[term] += 1 + + // add to inverted index + // create an initial posting if one doesn't exist + if (this.invertedIndex[term] == undefined) { + var posting = Object.create(null) + posting["_index"] = this.termIndex + this.termIndex += 1 + + for (var k = 0; k < fields.length; k++) { + posting[fields[k]] = Object.create(null) + } + + this.invertedIndex[term] = posting + } + + // add an entry for this term/fieldName/docRef to the invertedIndex + if (this.invertedIndex[term][fieldName][docRef] == undefined) { + this.invertedIndex[term][fieldName][docRef] = Object.create(null) + } + + // store all whitelisted metadata about this token in the + // inverted index + for (var l = 0; l < this.metadataWhitelist.length; l++) { + var metadataKey = this.metadataWhitelist[l], + metadata = term.metadata[metadataKey] + + if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { + this.invertedIndex[term][fieldName][docRef][metadataKey] = [] + } + + this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) + } + } + + } +} + +/** + * Calculates the average document length for this index + * + * @private + */ +lunr.Builder.prototype.calculateAverageFieldLengths = function () { + + var fieldRefs = Object.keys(this.fieldLengths), + numberOfFields = fieldRefs.length, + accumulator = {}, + documentsWithField = {} + + for (var i = 0; i < numberOfFields; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + field = fieldRef.fieldName + + documentsWithField[field] || (documentsWithField[field] = 0) + documentsWithField[field] += 1 + + accumulator[field] || (accumulator[field] = 0) + accumulator[field] += this.fieldLengths[fieldRef] + } + + var fields = Object.keys(this._fields) + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i] + accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] + } + + this.averageFieldLength = accumulator +} + +/** + * Builds a vector space model of every document using lunr.Vector + * + * @private + */ +lunr.Builder.prototype.createFieldVectors = function () { + var fieldVectors = {}, + fieldRefs = Object.keys(this.fieldTermFrequencies), + fieldRefsLength = fieldRefs.length, + termIdfCache = Object.create(null) + + for (var i = 0; i < fieldRefsLength; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + fieldName = fieldRef.fieldName, + fieldLength = this.fieldLengths[fieldRef], + fieldVector = new lunr.Vector, + termFrequencies = this.fieldTermFrequencies[fieldRef], + terms = Object.keys(termFrequencies), + termsLength = terms.length + + + var fieldBoost = this._fields[fieldName].boost || 1, + docBoost = this._documents[fieldRef.docRef].boost || 1 + + for (var j = 0; j < termsLength; j++) { + var term = terms[j], + tf = termFrequencies[term], + termIndex = this.invertedIndex[term]._index, + idf, score, scoreWithPrecision + + if (termIdfCache[term] === undefined) { + idf = lunr.idf(this.invertedIndex[term], this.documentCount) + termIdfCache[term] = idf + } else { + idf = termIdfCache[term] + } + + score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) + score *= fieldBoost + score *= docBoost + scoreWithPrecision = Math.round(score * 1000) / 1000 + // Converts 1.23456789 to 1.234. + // Reducing the precision so that the vectors take up less + // space when serialised. Doing it now so that they behave + // the same before and after serialisation. Also, this is + // the fastest approach to reducing a number's precision in + // JavaScript. + + fieldVector.insert(termIndex, scoreWithPrecision) + } + + fieldVectors[fieldRef] = fieldVector + } + + this.fieldVectors = fieldVectors +} + +/** + * Creates a token set of all tokens in the index using lunr.TokenSet + * + * @private + */ +lunr.Builder.prototype.createTokenSet = function () { + this.tokenSet = lunr.TokenSet.fromArray( + Object.keys(this.invertedIndex).sort() + ) +} + +/** + * Builds the index, creating an instance of lunr.Index. + * + * This completes the indexing process and should only be called + * once all documents have been added to the index. + * + * @returns {lunr.Index} + */ +lunr.Builder.prototype.build = function () { + this.calculateAverageFieldLengths() + this.createFieldVectors() + this.createTokenSet() + + return new lunr.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) +} + +/** + * Applies a plugin to the index builder. + * + * A plugin is a function that is called with the index builder as its context. + * Plugins can be used to customise or extend the behaviour of the index + * in some way. A plugin is just a function, that encapsulated the custom + * behaviour that should be applied when building the index. + * + * The plugin function will be called with the index builder as its argument, additional + * arguments can also be passed when calling use. The function will be called + * with the index builder as its context. + * + * @param {Function} plugin The plugin to apply. + */ +lunr.Builder.prototype.use = function (fn) { + var args = Array.prototype.slice.call(arguments, 1) + args.unshift(this) + fn.apply(this, args) +} +/** + * Contains and collects metadata about a matching document. + * A single instance of lunr.MatchData is returned as part of every + * lunr.Index~Result. + * + * @constructor + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + * @property {object} metadata - A cloned collection of metadata associated with this document. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData = function (term, field, metadata) { + var clonedMetadata = Object.create(null), + metadataKeys = Object.keys(metadata || {}) + + // Cloning the metadata to prevent the original + // being mutated during match data combination. + // Metadata is kept in an array within the inverted + // index so cloning the data can be done with + // Array#slice + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + clonedMetadata[key] = metadata[key].slice() + } + + this.metadata = Object.create(null) + + if (term !== undefined) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = clonedMetadata + } +} + +/** + * An instance of lunr.MatchData will be created for every term that matches a + * document. However only one instance is required in a lunr.Index~Result. This + * method combines metadata from another instance of lunr.MatchData with this + * objects metadata. + * + * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData.prototype.combine = function (otherMatchData) { + var terms = Object.keys(otherMatchData.metadata) + + for (var i = 0; i < terms.length; i++) { + var term = terms[i], + fields = Object.keys(otherMatchData.metadata[term]) + + if (this.metadata[term] == undefined) { + this.metadata[term] = Object.create(null) + } + + for (var j = 0; j < fields.length; j++) { + var field = fields[j], + keys = Object.keys(otherMatchData.metadata[term][field]) + + if (this.metadata[term][field] == undefined) { + this.metadata[term][field] = Object.create(null) + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k] + + if (this.metadata[term][field][key] == undefined) { + this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] + } else { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) + } + + } + } + } +} + +/** + * Add metadata for a term/field pair to this instance of match data. + * + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + */ +lunr.MatchData.prototype.add = function (term, field, metadata) { + if (!(term in this.metadata)) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = metadata + return + } + + if (!(field in this.metadata[term])) { + this.metadata[term][field] = metadata + return + } + + var metadataKeys = Object.keys(metadata) + + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + + if (key in this.metadata[term][field]) { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) + } else { + this.metadata[term][field][key] = metadata[key] + } + } +} +/** + * A lunr.Query provides a programmatic way of defining queries to be performed + * against a {@link lunr.Index}. + * + * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method + * so the query object is pre-initialized with the right index fields. + * + * @constructor + * @property {lunr.Query~Clause[]} clauses - An array of query clauses. + * @property {string[]} allFields - An array of all available fields in a lunr.Index. + */ +lunr.Query = function (allFields) { + this.clauses = [] + this.allFields = allFields +} + +/** + * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. + * + * This allows wildcards to be added to the beginning and end of a term without having to manually do any string + * concatenation. + * + * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. + * + * @constant + * @default + * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour + * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists + * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with trailing wildcard + * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) + * @example query term with leading and trailing wildcard + * query.term('foo', { + * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING + * }) + */ + +lunr.Query.wildcard = new String ("*") +lunr.Query.wildcard.NONE = 0 +lunr.Query.wildcard.LEADING = 1 +lunr.Query.wildcard.TRAILING = 2 + +/** + * Constants for indicating what kind of presence a term must have in matching documents. + * + * @constant + * @enum {number} + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with required presence + * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) + */ +lunr.Query.presence = { + /** + * Term's presence in a document is optional, this is the default value. + */ + OPTIONAL: 1, + + /** + * Term's presence in a document is required, documents that do not contain + * this term will not be returned. + */ + REQUIRED: 2, + + /** + * Term's presence in a document is prohibited, documents that do contain + * this term will not be returned. + */ + PROHIBITED: 3 +} + +/** + * A single clause in a {@link lunr.Query} contains a term and details on how to + * match that term against a {@link lunr.Index}. + * + * @typedef {Object} lunr.Query~Clause + * @property {string[]} fields - The fields in an index this clause should be matched against. + * @property {number} [boost=1] - Any boost that should be applied when matching this clause. + * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. + * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. + * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. + * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. + */ + +/** + * Adds a {@link lunr.Query~Clause} to this query. + * + * Unless the clause contains the fields to be matched all fields will be matched. In addition + * a default boost of 1 is applied to the clause. + * + * @param {lunr.Query~Clause} clause - The clause to add to this query. + * @see lunr.Query~Clause + * @returns {lunr.Query} + */ +lunr.Query.prototype.clause = function (clause) { + if (!('fields' in clause)) { + clause.fields = this.allFields + } + + if (!('boost' in clause)) { + clause.boost = 1 + } + + if (!('usePipeline' in clause)) { + clause.usePipeline = true + } + + if (!('wildcard' in clause)) { + clause.wildcard = lunr.Query.wildcard.NONE + } + + if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { + clause.term = "*" + clause.term + } + + if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { + clause.term = "" + clause.term + "*" + } + + if (!('presence' in clause)) { + clause.presence = lunr.Query.presence.OPTIONAL + } + + this.clauses.push(clause) + + return this +} + +/** + * A negated query is one in which every clause has a presence of + * prohibited. These queries require some special processing to return + * the expected results. + * + * @returns boolean + */ +lunr.Query.prototype.isNegated = function () { + for (var i = 0; i < this.clauses.length; i++) { + if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { + return false + } + } + + return true +} + +/** + * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} + * to the list of clauses that make up this query. + * + * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion + * to a token or token-like string should be done before calling this method. + * + * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an + * array, each term in the array will share the same options. + * + * @param {object|object[]} term - The term(s) to add to the query. + * @param {object} [options] - Any additional properties to add to the query clause. + * @returns {lunr.Query} + * @see lunr.Query#clause + * @see lunr.Query~Clause + * @example adding a single term to a query + * query.term("foo") + * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard + * query.term("foo", { + * fields: ["title"], + * boost: 10, + * wildcard: lunr.Query.wildcard.TRAILING + * }) + * @example using lunr.tokenizer to convert a string to tokens before using them as terms + * query.term(lunr.tokenizer("foo bar")) + */ +lunr.Query.prototype.term = function (term, options) { + if (Array.isArray(term)) { + term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) + return this + } + + var clause = options || {} + clause.term = term.toString() + + this.clause(clause) + + return this +} +lunr.QueryParseError = function (message, start, end) { + this.name = "QueryParseError" + this.message = message + this.start = start + this.end = end +} + +lunr.QueryParseError.prototype = new Error +lunr.QueryLexer = function (str) { + this.lexemes = [] + this.str = str + this.length = str.length + this.pos = 0 + this.start = 0 + this.escapeCharPositions = [] +} + +lunr.QueryLexer.prototype.run = function () { + var state = lunr.QueryLexer.lexText + + while (state) { + state = state(this) + } +} + +lunr.QueryLexer.prototype.sliceString = function () { + var subSlices = [], + sliceStart = this.start, + sliceEnd = this.pos + + for (var i = 0; i < this.escapeCharPositions.length; i++) { + sliceEnd = this.escapeCharPositions[i] + subSlices.push(this.str.slice(sliceStart, sliceEnd)) + sliceStart = sliceEnd + 1 + } + + subSlices.push(this.str.slice(sliceStart, this.pos)) + this.escapeCharPositions.length = 0 + + return subSlices.join('') +} + +lunr.QueryLexer.prototype.emit = function (type) { + this.lexemes.push({ + type: type, + str: this.sliceString(), + start: this.start, + end: this.pos + }) + + this.start = this.pos +} + +lunr.QueryLexer.prototype.escapeCharacter = function () { + this.escapeCharPositions.push(this.pos - 1) + this.pos += 1 +} + +lunr.QueryLexer.prototype.next = function () { + if (this.pos >= this.length) { + return lunr.QueryLexer.EOS + } + + var char = this.str.charAt(this.pos) + this.pos += 1 + return char +} + +lunr.QueryLexer.prototype.width = function () { + return this.pos - this.start +} + +lunr.QueryLexer.prototype.ignore = function () { + if (this.start == this.pos) { + this.pos += 1 + } + + this.start = this.pos +} + +lunr.QueryLexer.prototype.backup = function () { + this.pos -= 1 +} + +lunr.QueryLexer.prototype.acceptDigitRun = function () { + var char, charCode + + do { + char = this.next() + charCode = char.charCodeAt(0) + } while (charCode > 47 && charCode < 58) + + if (char != lunr.QueryLexer.EOS) { + this.backup() + } +} + +lunr.QueryLexer.prototype.more = function () { + return this.pos < this.length +} + +lunr.QueryLexer.EOS = 'EOS' +lunr.QueryLexer.FIELD = 'FIELD' +lunr.QueryLexer.TERM = 'TERM' +lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' +lunr.QueryLexer.BOOST = 'BOOST' +lunr.QueryLexer.PRESENCE = 'PRESENCE' + +lunr.QueryLexer.lexField = function (lexer) { + lexer.backup() + lexer.emit(lunr.QueryLexer.FIELD) + lexer.ignore() + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexTerm = function (lexer) { + if (lexer.width() > 1) { + lexer.backup() + lexer.emit(lunr.QueryLexer.TERM) + } + + lexer.ignore() + + if (lexer.more()) { + return lunr.QueryLexer.lexText + } +} + +lunr.QueryLexer.lexEditDistance = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexBoost = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.BOOST) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexEOS = function (lexer) { + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } +} + +// This matches the separator used when tokenising fields +// within a document. These should match otherwise it is +// not possible to search for some tokens within a document. +// +// It is possible for the user to change the separator on the +// tokenizer so it _might_ clash with any other of the special +// characters already used within the search string, e.g. :. +// +// This means that it is possible to change the separator in +// such a way that makes some words unsearchable using a search +// string. +lunr.QueryLexer.termSeparator = lunr.tokenizer.separator + +lunr.QueryLexer.lexText = function (lexer) { + while (true) { + var char = lexer.next() + + if (char == lunr.QueryLexer.EOS) { + return lunr.QueryLexer.lexEOS + } + + // Escape character is '\' + if (char.charCodeAt(0) == 92) { + lexer.escapeCharacter() + continue + } + + if (char == ":") { + return lunr.QueryLexer.lexField + } + + if (char == "~") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexEditDistance + } + + if (char == "^") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexBoost + } + + // "+" indicates term presence is required + // checking for length to ensure that only + // leading "+" are considered + if (char == "+" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + // "-" indicates term presence is prohibited + // checking for length to ensure that only + // leading "-" are considered + if (char == "-" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + if (char.match(lunr.QueryLexer.termSeparator)) { + return lunr.QueryLexer.lexTerm + } + } +} + +lunr.QueryParser = function (str, query) { + this.lexer = new lunr.QueryLexer (str) + this.query = query + this.currentClause = {} + this.lexemeIdx = 0 +} + +lunr.QueryParser.prototype.parse = function () { + this.lexer.run() + this.lexemes = this.lexer.lexemes + + var state = lunr.QueryParser.parseClause + + while (state) { + state = state(this) + } + + return this.query +} + +lunr.QueryParser.prototype.peekLexeme = function () { + return this.lexemes[this.lexemeIdx] +} + +lunr.QueryParser.prototype.consumeLexeme = function () { + var lexeme = this.peekLexeme() + this.lexemeIdx += 1 + return lexeme +} + +lunr.QueryParser.prototype.nextClause = function () { + var completedClause = this.currentClause + this.query.clause(completedClause) + this.currentClause = {} +} + +lunr.QueryParser.parseClause = function (parser) { + var lexeme = parser.peekLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.type) { + case lunr.QueryLexer.PRESENCE: + return lunr.QueryParser.parsePresence + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expected either a field or a term, found " + lexeme.type + + if (lexeme.str.length >= 1) { + errorMessage += " with value '" + lexeme.str + "'" + } + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } +} + +lunr.QueryParser.parsePresence = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.str) { + case "-": + parser.currentClause.presence = lunr.Query.presence.PROHIBITED + break + case "+": + parser.currentClause.presence = lunr.Query.presence.REQUIRED + break + default: + var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term or field, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseField = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + if (parser.query.allFields.indexOf(lexeme.str) == -1) { + var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), + errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.fields = [lexeme.str] + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseTerm = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + parser.currentClause.term = lexeme.str.toLowerCase() + + if (lexeme.str.indexOf("*") != -1) { + parser.currentClause.usePipeline = false + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseEditDistance = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var editDistance = parseInt(lexeme.str, 10) + + if (isNaN(editDistance)) { + var errorMessage = "edit distance must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.editDistance = editDistance + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseBoost = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var boost = parseInt(lexeme.str, 10) + + if (isNaN(boost)) { + var errorMessage = "boost must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.boost = boost + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + ;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + root.lunr = factory() + } + }(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return lunr + })) +})(); diff --git a/search/main.js b/search/main.js new file mode 100644 index 00000000..a5e469d7 --- /dev/null +++ b/search/main.js @@ -0,0 +1,109 @@ +function getSearchTermFromLocation() { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') { + return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); + } + } +} + +function joinUrl (base, path) { + if (path.substring(0, 1) === "/") { + // path starts with `/`. Thus it is absolute. + return path; + } + if (base.substring(base.length-1) === "/") { + // base ends with `/` + return base + path; + } + return base + "/" + path; +} + +function escapeHtml (value) { + return value.replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +} + +function formatResult (location, title, summary) { + return ''; +} + +function displayResults (results) { + var search_results = document.getElementById("mkdocs-search-results"); + while (search_results.firstChild) { + search_results.removeChild(search_results.firstChild); + } + if (results.length > 0){ + for (var i=0; i < results.length; i++){ + var result = results[i]; + var html = formatResult(result.location, result.title, result.summary); + search_results.insertAdjacentHTML('beforeend', html); + } + } else { + var noResultsText = search_results.getAttribute('data-no-results-text'); + if (!noResultsText) { + noResultsText = "No results found"; + } + search_results.insertAdjacentHTML('beforeend', '

' + noResultsText + '

'); + } +} + +function doSearch () { + var query = document.getElementById('mkdocs-search-query').value; + if (query.length > min_search_length) { + if (!window.Worker) { + displayResults(search(query)); + } else { + searchWorker.postMessage({query: query}); + } + } else { + // Clear results for short queries + displayResults([]); + } +} + +function initSearch () { + var search_input = document.getElementById('mkdocs-search-query'); + if (search_input) { + search_input.addEventListener("keyup", doSearch); + } + var term = getSearchTermFromLocation(); + if (term) { + search_input.value = term; + doSearch(); + } +} + +function onWorkerMessage (e) { + if (e.data.allowSearch) { + initSearch(); + } else if (e.data.results) { + var results = e.data.results; + displayResults(results); + } else if (e.data.config) { + min_search_length = e.data.config.min_search_length-1; + } +} + +if (!window.Worker) { + console.log('Web Worker API not supported'); + // load index in main thread + $.getScript(joinUrl(base_url, "search/worker.js")).done(function () { + console.log('Loaded worker'); + init(); + window.postMessage = function (msg) { + onWorkerMessage({data: msg}); + }; + }).fail(function (jqxhr, settings, exception) { + console.error('Could not load worker.js'); + }); +} else { + // Wrap search in a web worker + var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); + searchWorker.postMessage({init: true}); + searchWorker.onmessage = onWorkerMessage; +} diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..6f1b74b5 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"TripGo API The TripGo API allows you to plan door-to-door trips using a large variety of public and private transport. It integrates real-time information and, for selected providers, allows users to book and pay for transport. Getting started 1. Getting an API key Get an API key . You can try it out for free for as long as you like, as long as you stay below a threshold of API calls - no credit card required. For limits on the free tier and pricing, see the SkedGo website . It may take up to 5 minutes for your key to be active. Once you have an API key, send it along with every request as the X-TripGo-Key header. 2. Make a request Our API can do a lot more than just directions , but if that is what you are interested in, then try something like: curl 'https://api.tripgo.com/v1/routing.json?from=(-33.859,151.207)&to=(-33.863,151.208)&departAfter=1532799914&modes=wa_wal&v=11&locale=en' -H 'Accept: application/json' --compressed -H \"X-TripGo-Key: $tripgoKey\" -g or curl 'https://api.tripgo.com/v1/routing.json?from=(-33.859,151.207)&to=(-33.891,151.209)&modes=pt_pub&v=11&locale=en' -H 'Accept: application/json' --compressed -H \"X-TripGo-Key: $tripgoKey\" -g Keep in mind that this API is optimised to return a large number of trip results while maintaining small response sizes. This has a number of complications. Notably, to get a trip's segments you need to combine the segment references with the segment templates. This is explained further in the F.A.Q. . 3. Where to go from here? If you're an app developer, take a look at our open source TripKit SDKs for iOS, macOS , and Android . If you're a web developer, take a look at our React SDK , or check out our Leaflet Plugin (see Demo ). If you're a backend developer, dive into the API specs , which are available in OpenAPI (formerly Swagger) format. If you know how to debug a web app, look at the network activity for our web app to get an idea of which API calls to use when. (Filter for \"satapp\".) To talk to us and other developers using our API, join our Slack team on this page .","title":"Getting Started"},{"location":"#tripgo-api","text":"The TripGo API allows you to plan door-to-door trips using a large variety of public and private transport. It integrates real-time information and, for selected providers, allows users to book and pay for transport.","title":"TripGo API"},{"location":"#getting-started","text":"","title":"Getting started"},{"location":"#1-getting-an-api-key","text":"Get an API key . You can try it out for free for as long as you like, as long as you stay below a threshold of API calls - no credit card required. For limits on the free tier and pricing, see the SkedGo website . It may take up to 5 minutes for your key to be active. Once you have an API key, send it along with every request as the X-TripGo-Key header.","title":"1. Getting an API key"},{"location":"#2-make-a-request","text":"Our API can do a lot more than just directions , but if that is what you are interested in, then try something like: curl 'https://api.tripgo.com/v1/routing.json?from=(-33.859,151.207)&to=(-33.863,151.208)&departAfter=1532799914&modes=wa_wal&v=11&locale=en' -H 'Accept: application/json' --compressed -H \"X-TripGo-Key: $tripgoKey\" -g or curl 'https://api.tripgo.com/v1/routing.json?from=(-33.859,151.207)&to=(-33.891,151.209)&modes=pt_pub&v=11&locale=en' -H 'Accept: application/json' --compressed -H \"X-TripGo-Key: $tripgoKey\" -g Keep in mind that this API is optimised to return a large number of trip results while maintaining small response sizes. This has a number of complications. Notably, to get a trip's segments you need to combine the segment references with the segment templates. This is explained further in the F.A.Q. .","title":"2. Make a request"},{"location":"#3-where-to-go-from-here","text":"If you're an app developer, take a look at our open source TripKit SDKs for iOS, macOS , and Android . If you're a web developer, take a look at our React SDK , or check out our Leaflet Plugin (see Demo ). If you're a backend developer, dive into the API specs , which are available in OpenAPI (formerly Swagger) format. If you know how to debug a web app, look at the network activity for our web app to get an idea of which API calls to use when. (Filter for \"satapp\".) To talk to us and other developers using our API, join our Slack team on this page .","title":"3. Where to go from here?"},{"location":"extensions/","text":"Right after signing up, the API will serve results for regions and transport providers that publish their data as Open Data and which have already been connected to our system. The TripGo API can be extended in the following ways: Unlock transport modes, regions and real-time data from services that require you to first accept their terms or acquire API credentials. Add new transport modes through our TSP Connectors. Add new regions through our Region Connectors (coming soon). Regions Unlocking regions To get results for regions with providers that aren't using Open Data please get in touch with our team by mail or on Slack (by self-invite ). Rio de Janeiro (Brazil) \ud83c\udf0e Go to Fetransport Site and make sure you agree with the data terms. Contact us if you need help for this. Forward your confirmation mail to api@skedgo.com We will then unlock the region for your API key. Adding new regions To get results for regions that are not yet covered by the TripGo API, you as an API client can help us with the integration process to add a region of interest as follows: Collect all \"Minimum required data\" detailed below. Send the URLs where we could donwload the data from the sources to api@skedgo.com . For the cases where the data is not in a public accessible repository, please also pass on necessary contact information or access details. Wait until SkedGo processes all the information and updates the backend with the new region. This last process involves: - Configuring the region with the required data - Allocating cloud resources, including redunancy - Testing and verification of data quality and routing results - Once all tests pass, our data team will promote the new regions to our production servers For expected timing and pricing, please refer to our published price list . Minimum required data Name of the country and city or area which is going to be added. Coverage: The region's coverage area where the service is going to be provided, as a polygon or bounding rectangle. The most important city or cities from that area. URL(s) to the public transport timetables for that area in a standard data format that can be be consumed by our platform. A very important rule to follow, is to include data for every major public transport operator in the coverage area. Supported data formats are: - General Transit Feed Specification (GTFS) - NeTEx - TransXChange Country/region properties that configure our routing and API responses, including: - Currency - Timezone - Default language - Preferred distance unit (metric/imperial) - Drive on left / right - Taxi cost for that area (see TSP connectors below) - Average fuel cost Road and footpath information is being consumed from OpenStreetMap , so there is no need to provide that. Optional data More cities to be displayed on the map: Each of them should have a default position. Public holidays information: Country default ones could be loaded from global repositories but regional or local ones could be added. Public transport real-time data, using one of the following standards: - GTFS-Realtime - Siri Car park information Transport service providers (see TSP connectors below) Traffic alerts (see \"info\" connectors below) Customisations Rules for when bicycles are allowed on public transport and on which types of public transport. This is useful when this data is not provided as part of the public transport sources. Icon customisation for specific transports or services. Icon customisation for specific public transport nodes. Public transport fare calculations, see our published price list . Transport providers Unlocking transport modes To get results for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ). BlaBlaCar \ud83c\udf0d Integrations : Routing, Real-time Read the terms of use of BlaBlaCar's API and make sure you comply with them in your app. Sign up to BlaBlaCar's API . Enter your BlaBlaCar auth key in your application credentials . BlaBlaCar results will start coming through the TripGo API for your API key (after at most 5 minutes). GoGet \ud83c\udde6\ud83c\uddfa Integrations : Locations, Routing, Real-time Get in touch with GoGet 's sales team and get access to their API. Enter your GoGet ConsumerKey and GoGet ConsumerSecret in your application credentials . GoGet results will start coming through the TripGo API for your API key (after at most 5 minutes). Lyft \ud83c\uddfa\ud83c\uddf8 Integrations : Routing, Real-time, Bookings Read the terms of use of Lyft's API and make sure you comply with them in your app. Sign up to Lyft's API . Enter your Lyft Client ID and Lyft Client Secret in your application credentials . Lyft results will start coming through the TripGo API for your API key (after at most 5 minutes). Ola \ud83c\uddee\ud83c\uddf3 \ud83c\udde6\ud83c\uddfa \ud83c\uddf3\ud83c\uddff \ud83c\uddec\ud83c\udde7 Integrations : Routing, Real-time Get in touch with Ola 's sales team and get access to their API. Enter your OLA ApiKey in your application credentials . Ola results will start coming through the TripGo API for your API key (after at most 5 minutes). Unlocking public transport real-time data To get real-time data for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ). Chicago's CTA \ud83c\uddfa\ud83c\uddf8 Read the terms of use of CTA's API and make sure you comply with them in your app Sign up to CTA's API Enter your CTA key for Chicago in your application credentials . Real-time data for CTA for your TripGo API key will be enabled (after at most 5 minutes). STIB-MIVB in Brussels \ud83c\udf0e Read the terms of use of STIB-MIVB's open data platform and make sure you comply with them in your app Sign up to STIB-MIVB's API Enter your STIB-MIVB realtime api key in your application credentials . Real-time data for STIB-MIVB for your TripGo API key will be enabled (after at most 5 minutes). To get real-time data for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ). Adding new providers: TSP connectors For TSPs that are not yet integrated into our platform, you can add them by: Implementing the corresponding API according to our API specs , and then Sending the URL of where you have deployed your implementation to api@skedgo.com . The process then involves a manual step (which we plan to automate) to add that to our list of TSP connectors and enable it. It will usually take 1 day after it is added to our list for results will then include the new TSP, with some exceptions like pod based share vehicles, which will take between 3 and 7 days. How does this work All TSP connector APIs share in common three endpoints: config : the list of endpoints that are implemented, similar to gbfs.json provider : the information about the provider, which may include links to mobile apps and deep links (with a pattern); and also the list of modes for the TSP coverage : a list of coverage areas of the provider, and for each area, it is possible to define available products and pricing rules Config endpoint allows our platform to understand what are the capabilities of the TSP integration of each connector. Provider information is what our platform will use to attribute results. This will be passed on with any API responses that include results from your TSP connector. Coverage will allow our platform to know in which areas (i.e., regions) the TSP will be enabled. Taxi and TNC For taxi and TNC providers we defined a Taxi API which allows you to: Add static pricing (in coverage endpoint), which will be shown as an estimate cost and used by our routing engine when creating trip alternatives. Provide real-time ETAs, which might differ by \"product\". Provide real-time costs estimations based on specific trip details. Enable in-app booking capabilities, so users can directly initiate the booking process through our platform. Shared bikes, scooters and cars For shared vehicles, such as bikes, scooters or cars, we support the GBFS standard with the addition of the shared endpoints mentioned above (except for config which is replaced by the standard gbfs.json ). This includes support for car-sharing, but be aware that this part of the standard is not finalised yet (as of February 2021). We also support GBFS sources with only one endpoint, for example just the free_bike_status.json endpoint. Additional data sources Unlocking real-time traffic To get real-time traffic information, you need to unlock one of the providers below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ). Live-Traffic from Google \ud83c\udf0e Read the terms of use of Google Maps and make sure you comply with them in your app - in particular, that you are using a Google Map. Sign up to the Google Maps Directions API Enter your Google Maps Directions API key in your application credentials . Car results leaving now will then come augmented with Google's drive time predictions through the TripGo API for your API key (after at most 5 minutes). Live-Traffic from TomTom \ud83c\udf0e Sign up to the TomTom Maps API , making sure you read the terms and comply with them - in particular, that you're not affiliated with a prohibited party and that you're using a TomTom or TomTom licenses map UI (e.g., Apple Maps). Enter your TomTom consumer API key and TomTom consumer secret in your application credentials . Car results leaving now will then come augmented with TomTom's drive time predictions through the TripGo API for your API key (after at most 5 minutes). Unlocking geocoding providers To get results from geocoding data for providers who aren't using Open Data when using geocoding.json endpoint, follow the instructions for the provider below. These providers will only apply for non auto-completion requests, except for What3Words ones, which can be used for both type of geocoding requests. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ). Foursquare \ud83c\udf0e Read the Foursquare Terms of Use and make sure you comply with them in your app. Sign up to the Foursquare Developers Site Enter your Foursquare API key in your application credentials . Add allowFoursquare=true to your geocoding requests, and then geocoding results will then come augmented with Foursquare's API through the TripGo API for your API key (after at most 5 minutes). Google Places \ud83c\udf0e Read the Places API Policies and make sure you comply with them in your app - in particular, that you are using a Google Map. Sign up to the Google Places API Enter your Google Places API key in your application credentials . Add allowGoogle=true to your geocoding requests, and then geocoding results will then come augmented with Google Places's API through the TripGo API for your API key (after at most 5 minutes). What3Words \ud83c\udf0e Read the API Licence Agreement and make sure you comply with them in your app. Sign up to the What3Words API Enter your What 3 Words key in your application credentials . Add allowW3W=true to your geocoding requests, and then geocoding results will then come augmented with What3Words's API through the TripGo API for your API key (after at most 5 minutes). Yelp \ud83c\udf0e Read the Yelp Terms of Use and make sure you comply with them in your app. Sign up to the Yelp Developers Site Enter your Yelp API key in your application credentials . Add allowYelp=true to your geocoding requests, and then geocoding results will then come augmented with Yelp's API through the TripGo API for your API key (after at most 5 minutes). Adding \"info\" data sources Similar to TSP connectors above, you can create a \"info\" connector to enhance our platform with more information, as defined in the Info API, which allows: Reporting real-time events on a given location or area. The model follows GTFS-R standard and will be added to our platform responses accordingly. Integrating bike lanes, which will be used by our cycling results to prioritise those paths.","title":"Extensions"},{"location":"extensions/#regions","text":"","title":"Regions"},{"location":"extensions/#unlocking-regions","text":"To get results for regions with providers that aren't using Open Data please get in touch with our team by mail or on Slack (by self-invite ).","title":"Unlocking regions"},{"location":"extensions/#rio-de-janeiro-brazil","text":"Go to Fetransport Site and make sure you agree with the data terms. Contact us if you need help for this. Forward your confirmation mail to api@skedgo.com We will then unlock the region for your API key.","title":"Rio de Janeiro (Brazil) \ud83c\udf0e"},{"location":"extensions/#adding-new-regions","text":"To get results for regions that are not yet covered by the TripGo API, you as an API client can help us with the integration process to add a region of interest as follows: Collect all \"Minimum required data\" detailed below. Send the URLs where we could donwload the data from the sources to api@skedgo.com . For the cases where the data is not in a public accessible repository, please also pass on necessary contact information or access details. Wait until SkedGo processes all the information and updates the backend with the new region. This last process involves: - Configuring the region with the required data - Allocating cloud resources, including redunancy - Testing and verification of data quality and routing results - Once all tests pass, our data team will promote the new regions to our production servers For expected timing and pricing, please refer to our published price list .","title":"Adding new regions"},{"location":"extensions/#minimum-required-data","text":"Name of the country and city or area which is going to be added. Coverage: The region's coverage area where the service is going to be provided, as a polygon or bounding rectangle. The most important city or cities from that area. URL(s) to the public transport timetables for that area in a standard data format that can be be consumed by our platform. A very important rule to follow, is to include data for every major public transport operator in the coverage area. Supported data formats are: - General Transit Feed Specification (GTFS) - NeTEx - TransXChange Country/region properties that configure our routing and API responses, including: - Currency - Timezone - Default language - Preferred distance unit (metric/imperial) - Drive on left / right - Taxi cost for that area (see TSP connectors below) - Average fuel cost Road and footpath information is being consumed from OpenStreetMap , so there is no need to provide that.","title":"Minimum required data"},{"location":"extensions/#optional-data","text":"More cities to be displayed on the map: Each of them should have a default position. Public holidays information: Country default ones could be loaded from global repositories but regional or local ones could be added. Public transport real-time data, using one of the following standards: - GTFS-Realtime - Siri Car park information Transport service providers (see TSP connectors below) Traffic alerts (see \"info\" connectors below)","title":"Optional data"},{"location":"extensions/#customisations","text":"Rules for when bicycles are allowed on public transport and on which types of public transport. This is useful when this data is not provided as part of the public transport sources. Icon customisation for specific transports or services. Icon customisation for specific public transport nodes. Public transport fare calculations, see our published price list .","title":"Customisations"},{"location":"extensions/#transport-providers","text":"","title":"Transport providers"},{"location":"extensions/#unlocking-transport-modes","text":"To get results for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ).","title":"Unlocking transport modes"},{"location":"extensions/#blablacar","text":"Integrations : Routing, Real-time Read the terms of use of BlaBlaCar's API and make sure you comply with them in your app. Sign up to BlaBlaCar's API . Enter your BlaBlaCar auth key in your application credentials . BlaBlaCar results will start coming through the TripGo API for your API key (after at most 5 minutes).","title":"BlaBlaCar \ud83c\udf0d"},{"location":"extensions/#goget","text":"Integrations : Locations, Routing, Real-time Get in touch with GoGet 's sales team and get access to their API. Enter your GoGet ConsumerKey and GoGet ConsumerSecret in your application credentials . GoGet results will start coming through the TripGo API for your API key (after at most 5 minutes).","title":"GoGet \ud83c\udde6\ud83c\uddfa"},{"location":"extensions/#lyft","text":"Integrations : Routing, Real-time, Bookings Read the terms of use of Lyft's API and make sure you comply with them in your app. Sign up to Lyft's API . Enter your Lyft Client ID and Lyft Client Secret in your application credentials . Lyft results will start coming through the TripGo API for your API key (after at most 5 minutes).","title":"Lyft \ud83c\uddfa\ud83c\uddf8"},{"location":"extensions/#ola","text":"Integrations : Routing, Real-time Get in touch with Ola 's sales team and get access to their API. Enter your OLA ApiKey in your application credentials . Ola results will start coming through the TripGo API for your API key (after at most 5 minutes).","title":"Ola \ud83c\uddee\ud83c\uddf3 \ud83c\udde6\ud83c\uddfa \ud83c\uddf3\ud83c\uddff \ud83c\uddec\ud83c\udde7"},{"location":"extensions/#unlocking-public-transport-real-time-data","text":"To get real-time data for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ).","title":"Unlocking public transport real-time data"},{"location":"extensions/#chicagos-cta","text":"Read the terms of use of CTA's API and make sure you comply with them in your app Sign up to CTA's API Enter your CTA key for Chicago in your application credentials . Real-time data for CTA for your TripGo API key will be enabled (after at most 5 minutes).","title":"Chicago's CTA \ud83c\uddfa\ud83c\uddf8"},{"location":"extensions/#stib-mivb-in-brussels","text":"Read the terms of use of STIB-MIVB's open data platform and make sure you comply with them in your app Sign up to STIB-MIVB's API Enter your STIB-MIVB realtime api key in your application credentials . Real-time data for STIB-MIVB for your TripGo API key will be enabled (after at most 5 minutes). To get real-time data for providers who aren't using Open Data, follow the instructions for the provider below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ).","title":"STIB-MIVB in Brussels \ud83c\udf0e"},{"location":"extensions/#adding-new-providers-tsp-connectors","text":"For TSPs that are not yet integrated into our platform, you can add them by: Implementing the corresponding API according to our API specs , and then Sending the URL of where you have deployed your implementation to api@skedgo.com . The process then involves a manual step (which we plan to automate) to add that to our list of TSP connectors and enable it. It will usually take 1 day after it is added to our list for results will then include the new TSP, with some exceptions like pod based share vehicles, which will take between 3 and 7 days.","title":"Adding new providers: TSP connectors"},{"location":"extensions/#how-does-this-work","text":"All TSP connector APIs share in common three endpoints: config : the list of endpoints that are implemented, similar to gbfs.json provider : the information about the provider, which may include links to mobile apps and deep links (with a pattern); and also the list of modes for the TSP coverage : a list of coverage areas of the provider, and for each area, it is possible to define available products and pricing rules Config endpoint allows our platform to understand what are the capabilities of the TSP integration of each connector. Provider information is what our platform will use to attribute results. This will be passed on with any API responses that include results from your TSP connector. Coverage will allow our platform to know in which areas (i.e., regions) the TSP will be enabled.","title":"How does this work"},{"location":"extensions/#taxi-and-tnc","text":"For taxi and TNC providers we defined a Taxi API which allows you to: Add static pricing (in coverage endpoint), which will be shown as an estimate cost and used by our routing engine when creating trip alternatives. Provide real-time ETAs, which might differ by \"product\". Provide real-time costs estimations based on specific trip details. Enable in-app booking capabilities, so users can directly initiate the booking process through our platform.","title":"Taxi and TNC"},{"location":"extensions/#shared-bikes-scooters-and-cars","text":"For shared vehicles, such as bikes, scooters or cars, we support the GBFS standard with the addition of the shared endpoints mentioned above (except for config which is replaced by the standard gbfs.json ). This includes support for car-sharing, but be aware that this part of the standard is not finalised yet (as of February 2021). We also support GBFS sources with only one endpoint, for example just the free_bike_status.json endpoint.","title":"Shared bikes, scooters and cars"},{"location":"extensions/#additional-data-sources","text":"","title":"Additional data sources"},{"location":"extensions/#unlocking-real-time-traffic","text":"To get real-time traffic information, you need to unlock one of the providers below. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ).","title":"Unlocking real-time traffic"},{"location":"extensions/#live-traffic-from-google","text":"Read the terms of use of Google Maps and make sure you comply with them in your app - in particular, that you are using a Google Map. Sign up to the Google Maps Directions API Enter your Google Maps Directions API key in your application credentials . Car results leaving now will then come augmented with Google's drive time predictions through the TripGo API for your API key (after at most 5 minutes).","title":"Live-Traffic from Google \ud83c\udf0e"},{"location":"extensions/#live-traffic-from-tomtom","text":"Sign up to the TomTom Maps API , making sure you read the terms and comply with them - in particular, that you're not affiliated with a prohibited party and that you're using a TomTom or TomTom licenses map UI (e.g., Apple Maps). Enter your TomTom consumer API key and TomTom consumer secret in your application credentials . Car results leaving now will then come augmented with TomTom's drive time predictions through the TripGo API for your API key (after at most 5 minutes).","title":"Live-Traffic from TomTom \ud83c\udf0e"},{"location":"extensions/#unlocking-geocoding-providers","text":"To get results from geocoding data for providers who aren't using Open Data when using geocoding.json endpoint, follow the instructions for the provider below. These providers will only apply for non auto-completion requests, except for What3Words ones, which can be used for both type of geocoding requests. If you want to use a provider that hasn't yet been connected to our system, please get in touch with our team by mail or on Slack (by self-invite ).","title":"Unlocking geocoding providers"},{"location":"extensions/#foursquare","text":"Read the Foursquare Terms of Use and make sure you comply with them in your app. Sign up to the Foursquare Developers Site Enter your Foursquare API key in your application credentials . Add allowFoursquare=true to your geocoding requests, and then geocoding results will then come augmented with Foursquare's API through the TripGo API for your API key (after at most 5 minutes).","title":"Foursquare \ud83c\udf0e"},{"location":"extensions/#google-places","text":"Read the Places API Policies and make sure you comply with them in your app - in particular, that you are using a Google Map. Sign up to the Google Places API Enter your Google Places API key in your application credentials . Add allowGoogle=true to your geocoding requests, and then geocoding results will then come augmented with Google Places's API through the TripGo API for your API key (after at most 5 minutes).","title":"Google Places \ud83c\udf0e"},{"location":"extensions/#what3words","text":"Read the API Licence Agreement and make sure you comply with them in your app. Sign up to the What3Words API Enter your What 3 Words key in your application credentials . Add allowW3W=true to your geocoding requests, and then geocoding results will then come augmented with What3Words's API through the TripGo API for your API key (after at most 5 minutes).","title":"What3Words \ud83c\udf0e"},{"location":"extensions/#yelp","text":"Read the Yelp Terms of Use and make sure you comply with them in your app. Sign up to the Yelp Developers Site Enter your Yelp API key in your application credentials . Add allowYelp=true to your geocoding requests, and then geocoding results will then come augmented with Yelp's API through the TripGo API for your API key (after at most 5 minutes).","title":"Yelp \ud83c\udf0e"},{"location":"extensions/#adding-info-data-sources","text":"Similar to TSP connectors above, you can create a \"info\" connector to enhance our platform with more information, as defined in the Info API, which allows: Reporting real-time events on a given location or area. The model follows GTFS-R standard and will be added to our platform responses accordingly. Integrating bike lanes, which will be used by our cycling results to prioritise those paths.","title":"Adding \"info\" data sources"},{"location":"faq/","text":"General Languages Which languages does the API support? Most text that's returned in the results and meant to be displayed to users has been localised to several languages - Chinese (simplified and traditional), Danish, Dutch, English, German, Italian, Finnish, French, Korean, Portuguese, Spanish. The translations are done in the open on Crowdin and everyone can contribute, including adding new languages. One note of causion: Some text, such as line names and status alerts, is provided by transport providers and only available in the languages provided by them. Regions What are regions? Our API splits the world into several pieces, which we call regions. Several endpoints require you to pass along a region code, e.g., because identifiers might be duplicated around the world. You can get a list of regions by quering regions.json : curl 'https://api.tripgo.com/v1/regions.json' -H 'Content-Type: application/json' --compressed -H \"X-TripGo-Key: $tripgoKey\" -d '{\"v\":2}' Then extract the polylines from there and match your coordinates to a region. This endpoint also tells you which modes are supported by routing for a given region. I noticed URLs in those regions, how can/should I use those? Most developer should not need to worry about these and can just use the api.tripgo.com domain. However, performance critical application can use this to reduce lag and directly hit the routing servers. For advanced users : This exposes to you that our API is covered by multiple servers - though not every server covers ever region. You can use the URLs to directly query servers covering a certain region \u2013 which can be beneficial to reduce lag and is recommended for server-to-server communication. However, be aware that you should add failover from one server to another yourself then, as individual servers can go down unannounced for maintenance. You should only cache this information short term as those URLs can change without notice. Health check How can I check whether the service is working? You can to that by querying our regions.json endpoint, adding the X-TripGo-HealthCheck header: curl 'https://api.tripgo.com/v1/regions.json' -H \"X-TripGo-Key: $tripgoKey\" -H \"X-TripGo-HealthCheck: true\" If the health-check passed, you'll get a 200 OK back with the following body: {\"healthCheckPassed\": true} These requests are free of charge. Map Data Which Map Data Layer do you use? Our platform uses OSM ( Open Street Map ) for the underlying map data, and this information is used when we calculate routes (mainly for private transport modes). This data affects, for example, how we decide what routes are faster, the shapes of the resulting trips for roads, paths and cycleways, among others. We can also integrate other data layers (such as Here ) upon request. If you want to use other data layer than OSM, please get in touch with our team by mail or on Slack (by self-invite ). But I see Google Maps in TripGo apps TripGo Android app and our web app use Google Maps to display information on the map, whereas the TripGo iOS app uses Apple Maps . Note, however, that this is different from the map data used by the platform to calculate routes. Google or Apple Maps are the visual map used by front-end apps to display trips and locations to the end user. It is up to the front-ends to decide which mapping UI SDK to use. It is important to note that different mapping UIs may have restrictions in their licensing terms which other APIs and services can be used to display on and alongside those maps. Routing Mode Identifiers What are all these peculiar looking strings such as pt_pub ? Syntax The syntax of the mode string is like this: _[_][_] List of groups Warning : This list can expand at any time when types of transport are added to SkedGo's backend, so if you hard-code how to interpret these identifiers, make sure to handle it gracefully if the API returns an identifier that you haven't yet seen. pt_ is for transit which runs on schedules ps_ is for taxi-like on-demand services me_ is for vehicles you drive yourself cy_ is for cycling Deprecated (use me_mic_ instead) wa_ is for walking and similar (e.g., wheelchair) in_ is for intercity long distance transport stationary_ is for stationary segments in between transport segments pt_ pt_pub is \"public transit\" that is accessible to the general public pt_pub_bus pt_pub_cablecar pt_pub_carferry pt_pub_coach , long-distance buses pt_pub_expressbus pt_pub_ferry pt_pub_funicular pt_pub_gondola pt_pub_metro , similar to subway but also going overground pt_pub_monorail pt_pub_regionaltrain , e.g., inter-city trains pt_pub_subway pt_pub_train , primarily local/commuter trains pt_pub_tram pt_ltd_SCHOOLBUS is public transit of limited access (school buses) pt_ltd_SCHOOLBUS_ for a specific school bus line ps_ ps_tax is for taxis ps_tnc is for uber and alike (TNC is California's official code for them) ps_tnc_lyft ps_tnc_sidecar ps_tnc_uber me_ me_car is for your own car me_car-s is for car sharing (like ZipCar or GoGet) me_car-r is for car rental (like Budget) me_car-p is for car pooling (like BlaBlaCar) me_mot is for your own motorbike me_mic is for your own micro-mobility me_mic_bic , regular _bic_ycle me_mic_fold-bic , _fold_ing/portable _bic_ycle that will be taken on any public transport mode, and will be taken all the way to the destination me_mic_e-sco , _e-sco_oter up to 25 km/h. Portable, allowed on cycle lanes in general, except specific rules in certain countries me_mic_fast-e-sco , fast _e-sco_oter up to 45 km/h. Portable, not allowed on cycle lanes in general, except specific rules in certain countries stationary_ stationary_parking-onstreet is for parking a vehicle on-street stationary_parking-offstreet is for parking a vehicle in an off-street location stationary_wait is a buffer for waiting for the following transport, e.g., waiting for a taxi or ride share to show up, but not for transferring between timetable-based public transport segments which get the special identifier below. stationary_transfer is for transferring between timetable-based public transport segments, often following a walk; note: you only get this if there are at least two public transport segments in a trip. stationary_vehicle-collect is for picking up a shared vehicle stationary_vehicle-return is for returning a shared vehicle stationary_airport-checkin is for checking in at an airport stationary_airport-checkout is for \"checking out\" off an airport, e.g., for picking up luggage and going through immigration stationary_airport-transfer is for transferring between flights at an airport Single-modal vs. multi-modal routing How do I get these sweet results which combine taxis or other private transport modes with public transport? You need to specify multiple modes in the routing.json requests, e.g., by using modes=pt_pub&modes=ps_tax . You can specify a long list of modes as the API will then return suitable combinations for any of those. What if I want to get both public-transport-only results and mixed results? By default the request with multiple modes will only return inter-modal results, no results for individual modes. The preferred way is to send off separate requests, e.g., if you want public transport, taxi, and combinations of the two, you need to send three requests: one with modes=pt_pub , one with modes=ps_tax , and one with modes=pt_pub&modes=ps_tax . Alternatively, you can send the optional allModes=true with the request that has all the modes. In that case a single request is sufficient to get all the single-modal and inter-modal results, but use this with caution as by the notes below. A few things to note: It is preferred to send separate per-mode requests as some modes depend on external API calls, which slow things down. Inter-modal results are generally not as fast to calculate due to the many combinations to crunch and them being likely to depend on multiple external API calls. By having the inter-modal request not returning single-modal results, you don't need to do any duplicate detection between the results of the different calls as they are mutually exclusive. You'll only get such inter-modal combinations where that combination is better in some way than using any individual mode by itself. It is therefore quite common that inter-modal requests result in an empty response. Trips, groups, frequencies and templates What is the logic behind trip groups and what does the frequency property mean? Each group is one way of getting from A to B. Each trip in a group is taking the same modes, and similar stops and tickets. They can take different services and different platforms, but overall they are all the same way of getting where you want to go, just at different times. Frequency is related to this. It's the average frequency for how often such trips in a group run. It's an indication of how long you'd need to wait if you missed a trip in that group. In our UI, for showing alternative ways of getting from A to B, we display a list of trip groups and for each trip group we display a \"representative\" trip, which is the one that fits the query the best. That's the trip in the trip group with the lowest weightedScore . Why are segments split into references and templates? This is related to trip groups: Trips in those groups often vary in just a few components but often take the same way or share other properties. The shared properties live in the templates while the properties that typically vary between trips live in the references. This can significantly cut down the size of the results and, thus, also the parsing speed on the client. Trips results Why do I get trips that don't start or end at the requested coordinates? The routing results snap to the road/footpath network. So if your requested coordinates don't fall on a the network, the trips that you get will start/end at the nearest location of the road/footpath network. The start of a trip, depends on the available modes. If the query is for driving, they will start at nearest road that allows driving, while trips that allow walking (or cycling) will start at the nearest footpath. This means that if you request multiple different modes, the trips might start at different locations, depending on the modes used in the trip. The end of a trip will snap to the nearest footpath, i.e., driving trips might end with parking and then a walk. Why do I get trips with the first segment of a trip already in the past? When you have a trip group, you will get trips departing before the best one matching the query. What you should do is, grey it out in the UI and don't select it by default (the weighted score is a good indicator for this). Note that you can even get a trip group only with a trip in the past, e.g., if you queried for 12:15am and the last ferry left at 12:10. Why do I get trips having segments that \"go back in time\" and result in arriving after the depart of the next one? There may be cases where a segment of a trip is delayed, and due to realtime updates, the trip gets negative waiting times, e.g., a bus is delayed by 5 minutes and the trip had a connection of 2 minutes to take a train. These cases should be handled by the app, either by alerting the user, by recomputing the trip, or by any other measure you consider appropriate. Why do I get trips that don't start or end at the exact coordinates that I requested? This is expectd and intentional. Our routing engine can only route from a point on the transport network to another point on the transport network. If the requested coordinates aren't on the transport network, it looks for the closest point on the transport network to snap to and route between them. This is made explicit in the routing results which return the query inputs and also for each trip where it started and ends. This also explains why some short distance routings requests don't return anything. Information on that level might not be available, and routing starts and ends at practically at effectively the same location, resulting in nothing to return. Imagine you drop a pin in the middle of a lake. Our routing engine routes to the closest point along a footpath to that point, and the trips terminate there. Requesting a walk from there to the middle of the lake wouldn't return anything. The same applies to parks or routing to the middle of a block where there's no additional information in OpenStreetMap. You can indicate this in your UI by drawing a hop or dashed line between the requested coordinates and where the trip starts or ends. Note the fromStreetName and toStreetName input parameters which let you bias which streets our routing engine should snap to. Say, a user typed in \"15 Main St\" into your app, which your geocoding service turns into a point coordinate in the middle of a block which is actually closer to somewhere on \"2nd St\". Our route would start on \"2nd St\". If you provide \"Main St\" as the fromStreetName parameter, it'll tell our routing engine to prefer to start on nearby streets of that name, even if they aren't the closest in a straight-line distance. Placeholders in segment templates What are all the possible values for placeholders and how should they get interpreted? In order to use segment templates for multiple similar segments, the notes and action fields of a segment templates use placeholders, which should be filled it at run-time with the information from the segment template, and potentially updated with real-time data. : Placeholder for the number of short name of the transit service, e.g., segment.serviceNumber . : Placeholder for the long name of the transit service, e.g., segment.serviceName . : Placeholder for the direction of the transit service, e.g., segment.serviceDirection . : Placeholder for the start and end location of the segment, e.g., segment.start -> segment.end . : Placeholder for the embarkation platform of the transit service, e.g., segment.platform . : Placeholder for the number of stops that a transit service takes from the start to the end of the segment (including the disembarkation, but excluding the embarkation stop), e.g., segment.stops .
"+c(e,t)},u.fence_custom={},u.heading_open=function(e,t){return""},u.heading_close=function(e,t){return"\n"},u.hr=function(e,t,n){return(n.xhtmlOut?"
":"
")+c(e,t)},u.bullet_list_open=function(){return"
    \n"},u.bullet_list_close=function(e,t){return"
"+c(e,t)},u.list_item_open=function(){return"
  • "},u.list_item_close=function(){return"
  • \n"},u.ordered_list_open=function(e,t){var n=e[t],r=n.order>1?' start="'+n.order+'"':"";return"\n"},u.ordered_list_close=function(e,t){return""+c(e,t)},u.paragraph_open=function(e,t){return e[t].tight?"":"

    "},u.paragraph_close=function(e,t){var n=!(e[t].tight&&t&&"inline"===e[t-1].type&&!e[t-1].content);return(e[t].tight?"":"

    ")+(n?c(e,t):"")},u.link_open=function(e,t,n){var r=e[t].title?' title="'+s(a(e[t].title))+'"':"",o=n.linkTarget?' target="'+n.linkTarget+'"':"";return'"},u.link_close=function(){return""},u.image=function(e,t,n){var r=' src="'+s(e[t].src)+'"',o=e[t].title?' title="'+s(a(e[t].title))+'"':"",u=' alt="'+(e[t].alt?s(a(i(e[t].alt))):"")+'"',c=n.xhtmlOut?" /":"";return""},u.table_open=function(){return"\n"},u.table_close=function(){return"
    \n"},u.thead_open=function(){return"\n"},u.thead_close=function(){return"\n"},u.tbody_open=function(){return"\n"},u.tbody_close=function(){return"\n"},u.tr_open=function(){return""},u.tr_close=function(){return"\n"},u.th_open=function(e,t){var n=e[t];return""},u.th_close=function(){return""},u.td_open=function(e,t){var n=e[t];return""},u.td_close=function(){return""},u.strong_open=function(){return""},u.strong_close=function(){return""},u.em_open=function(){return""},u.em_close=function(){return""},u.del_open=function(){return""},u.del_close=function(){return""},u.ins_open=function(){return""},u.ins_close=function(){return""},u.mark_open=function(){return""},u.mark_close=function(){return""},u.sub=function(e,t){return""+s(e[t].content)+""},u.sup=function(e,t){return""+s(e[t].content)+""},u.hardbreak=function(e,t,n){return n.xhtmlOut?"
    \n":"
    \n"},u.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?"
    \n":"
    \n":"\n"},u.text=function(e,t){return s(e[t].content)},u.htmlblock=function(e,t){return e[t].content},u.htmltag=function(e,t){return e[t].content},u.abbr_open=function(e,t){return''},u.abbr_close=function(){return""},u.footnote_ref=function(e,t){var n=Number(e[t].id+1).toString(),r="fnref"+n;return e[t].subId>0&&(r+=":"+e[t].subId),'['+n+"]"},u.footnote_block_open=function(e,t,n){var r=n.xhtmlOut?'
    \n':'
    \n';return r+'
    \n
      \n'},u.footnote_block_close=function(){return"
    \n
    \n"},u.footnote_open=function(e,t){var n=Number(e[t].id+1).toString();return'
  • '},u.footnote_close=function(){return"
  • \n"},u.footnote_anchor=function(e,t){var n=Number(e[t].id+1).toString(),r="fnref"+n;return e[t].subId>0&&(r+=":"+e[t].subId),' '},u.dl_open=function(){return"
    \n"},u.dt_open=function(){return"
    "},u.dd_open=function(){return"
    "},u.dl_close=function(){return"
    \n"},u.dt_close=function(){return"\n"},u.dd_close=function(){return"\n"};var c=u.getBreak=function(e,t){return t=r(e,t),t8&&n<14);)if(92===n&&t+11))break;if(41===n&&(i--,i<0))break;t++}return s!==t&&(a=o(e.src.slice(s,t)),!!e.parser.validateLink(a)&&(e.linkContent=a,e.pos=t,!0))}},function(e,t,n){"use strict";var r=n(973).replaceEntities;e.exports=function(e){var t=r(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}},function(e,t,n){"use strict";var r=n(973).unescapeMd;e.exports=function(e,t){var n,o=t,i=e.posMax,a=e.src.charCodeAt(t);if(34!==a&&39!==a&&40!==a)return!1;for(t++,40===a&&(a=41);t0?a[t].count:1,r=0;r=0;t--)if(s=a[t],"text"===s.type){for(l=0,u=s.content,f.lastIndex=0,p=s.level,c=[];h=f.exec(u);)f.lastIndex>l&&c.push({type:"text",content:u.slice(l,h.index+h[1].length),level:p}),c.push({type:"abbr_open",title:e.env.abbreviations[":"+h[2]],level:p++}),c.push({type:"text",content:h[2],level:p}),c.push({type:"abbr_close",level:--p}),l=f.lastIndex-h[3].length;c.length&&(l=0;s--)if("inline"===e.tokens[s].type)for(a=e.tokens[s].children,t=a.length-1;t>=0;t--)o=a[t],"text"===o.type&&(i=o.content,i=n(i),r.test(i)&&(i=i.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),o.content=i)}},function(e,t){"use strict";function n(e,t){return!(t<0||t>=e.length)&&!a.test(e[t])}function r(e,t,n){return e.substr(0,t)+n+e.substr(t+1)}var o=/['"]/,i=/['"]/g,a=/[-\s()\[\]]/,s="’";e.exports=function(e){var t,a,u,c,l,p,f,h,d,m,y,v,g,_,b,x,w;if(e.options.typographer)for(w=[],b=e.tokens.length-1;b>=0;b--)if("inline"===e.tokens[b].type)for(x=e.tokens[b].children,w.length=0,t=0;t=0&&!(w[g].level<=f);g--);w.length=g+1,u=a.content,l=0,p=u.length;e:for(;l=0&&(m=w[g],!(w[g].level\s]/i.test(e)}function o(e){return/^<\/a\s*>/i.test(e)}function i(){var e=[],t=new a({stripPrefix:!1,url:!0,email:!0,twitter:!1,replaceFn:function(t,n){switch(n.getType()){case"url":e.push({text:n.matchedText,url:n.getUrl()});break;case"email":e.push({text:n.matchedText,url:"mailto:"+n.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:e,autolinker:t}}var a=n(994),s=/www|@|\:\/\//;e.exports=function(e){var t,n,a,u,c,l,p,f,h,d,m,y,v,g=e.tokens,_=null;if(e.options.linkify)for(n=0,a=g.length;n=0;t--)if(c=u[t],"link_close"!==c.type){if("htmltag"===c.type&&(r(c.content)&&m>0&&m--,o(c.content)&&m++),!(m>0)&&"text"===c.type&&s.test(c.content)){if(_||(_=i(),y=_.links,v=_.autolinker),l=c.content,y.length=0,v.link(l),!y.length)continue;for(p=[],d=c.level,f=0;f + * MIT Licensed. http://www.opensource.org/licenses/mit-license.php + * + * https://github.com/gregjacobs/Autolinker.js + */ +var e=function(t){e.Util.assign(this,t)};return e.prototype={constructor:e,urls:!0,email:!0,twitter:!0,newWindow:!0,stripPrefix:!0,truncate:void 0,className:"",htmlParser:void 0,matchParser:void 0,tagBuilder:void 0,link:function(e){for(var t=this.getHtmlParser(),n=t.parse(e),r=0,o=[],i=0,a=n.length;it&&(n=null==n?"..":n,e=e.substring(0,t-n.length)+n),e},indexOf:function(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n",this.getInnerHtml(),""].join("")},buildAttrsStr:function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+'="'+e[n]+'"');return t.join(" ")}}),e.AnchorTagBuilder=e.Util.extend(Object,{constructor:function(t){e.Util.assign(this,t)},build:function(t){var n=new e.HtmlTag({tagName:"a",attrs:this.createAttrs(t.getType(),t.getAnchorHref()),innerHtml:this.processAnchorText(t.getAnchorText())});return n},createAttrs:function(e,t){var n={href:t},r=this.createCssClass(e);return r&&(n.class=r),this.newWindow&&(n.target="_blank"),n},createCssClass:function(e){var t=this.className;return t?t+" "+t+"-"+e:""},processAnchorText:function(e){return e=this.doTruncate(e)},doTruncate:function(t){return e.Util.ellipsis(t,this.truncate||Number.POSITIVE_INFINITY)}}),e.htmlParser.HtmlParser=e.Util.extend(Object,{htmlRegex:function(){var e=/[0-9a-zA-Z][0-9a-zA-Z:]*/,t=/[^\s\0"'>\/=\x01-\x1F\x7F]+/,n=/(?:"[^"]*?"|'[^']*?'|[^'"=<>`\s]+)/,r=t.source+"(?:\\s*=\\s*"+n.source+")?";return new RegExp(["(?:","<(!DOCTYPE)","(?:","\\s+","(?:",r,"|",n.source+")",")*",">",")","|","(?:","<(/)?","("+e.source+")","(?:","\\s+",r,")*","\\s*/?",">",")"].join(""),"gi")}(),htmlCharacterEntitiesRegex:/( | |<|<|>|>|"|"|')/gi,parse:function(e){for(var t,n,r=this.htmlRegex,o=0,i=[];null!==(t=r.exec(e));){var a=t[0],s=t[1]||t[3],u=!!t[2],c=e.substring(o,t.index);c&&(n=this.parseTextAndEntityNodes(c),i.push.apply(i,n)),i.push(this.createElementNode(a,s,u)),o=t.index+a.length}if(o=n))&&!(e.tShift[s]=0&&(e=e.replace(s,function(t,n){var r;return 10===e.charCodeAt(n)?(a=n+1,l=0,t):(r=" ".slice((n-a-l)%4),l=n-a+1,r)})),o=new i(e,this,t,n,r),void this.tokenize(o,o.line,o.lineMax)):[]},e.exports=r},function(e,t){"use strict";function n(e,t,n,r,o){var i,a,s,u,c,l,p;for(this.src=e,this.parser=t,this.options=n,this.env=r,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType="root",this.ddIndent=-1,this.level=0,this.result="",a=this.src,l=0,p=!1,s=u=l=0,c=a.length;u=this.eMarks[e]},n.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;en;)if(t!==this.src.charCodeAt(--e))return e+1;return e},n.prototype.getLines=function(e,t,n,r){var o,i,a,s,u,c=e;if(e>=t)return"";if(c+1===t)return i=this.bMarks[c]+Math.min(this.tShift[c],n),a=r?this.eMarks[c]+1:this.eMarks[c],this.src.slice(i,a);for(s=new Array(t-e),o=0;cn&&(u=n),u<0&&(u=0),i=this.bMarks[c]+u,a=c+1=4))break;r++,o=r}return e.line=r,e.tokens.push({type:"code",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}},function(e,t){"use strict";e.exports=function(e,t,n,r){var o,i,a,s,u,c=!1,l=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(l+3>p)return!1;if(o=e.src.charCodeAt(l),126!==o&&96!==o)return!1;if(u=l,l=e.skipChars(l,o),i=l-u,i<3)return!1;if(a=e.src.slice(l,p).trim(),a.indexOf("`")>=0)return!1;if(r)return!0;for(s=t;(s++,!(s>=n))&&(l=u=e.bMarks[s]+e.tShift[s],p=e.eMarks[s],!(l=4||(l=e.skipChars(l,o),l-uy)return!1;if(62!==e.src.charCodeAt(m++))return!1;if(e.level>=e.options.maxNesting)return!1;if(r)return!0;for(32===e.src.charCodeAt(m)&&m++,u=e.blkIndent,e.blkIndent=0,s=[e.bMarks[t]],e.bMarks[t]=m,m=m=y,a=[e.tShift[t]],e.tShift[t]=m-e.bMarks[t],p=e.parser.ruler.getRules("blockquote"),o=t+1;o=y));o++)if(62!==e.src.charCodeAt(m++)){if(i)break;for(d=!1,f=0,h=p.length;f=y,a.push(e.tShift[o]),e.tShift[o]=m-e.bMarks[o];for(c=e.parentType,e.parentType="blockquote",e.tokens.push({type:"blockquote_open",lines:l=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:"blockquote_close",level:--e.level}),e.parentType=c,l[1]=e.line,f=0;fu)return!1;if(o=e.src.charCodeAt(s++),42!==o&&45!==o&&95!==o)return!1;for(i=1;s=o?-1:(n=e.src.charCodeAt(r++),42!==n&&45!==n&&43!==n?-1:r=o)return-1;if(n=e.src.charCodeAt(r++),n<48||n>57)return-1;for(;;){if(r>=o)return-1;if(n=e.src.charCodeAt(r++),!(n>=48&&n<=57)){if(41===n||46===n)break;return-1}}return r=0)_=!0;else{if(!((d=n(e,t))>=0))return!1;_=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(d-1),a)return!0;for(x=e.tokens.length,_?(h=e.bMarks[t]+e.tShift[t],v=Number(e.src.substr(h,d-h-1)),e.tokens.push({type:"ordered_list_open",order:v,lines:k=[t,0],level:e.level++})):e.tokens.push({type:"bullet_list_open",lines:k=[t,0],level:e.level++}),s=t,w=!1,E=e.parser.ruler.getRules("list");!(!(s=m?1:b-d,y>4&&(y=1),y<1&&(y=1),u=d-e.bMarks[s]+y,e.tokens.push({type:"list_item_open",lines:S=[t,0],level:e.level++}),l=e.blkIndent,p=e.tight,c=e.tShift[t],f=e.parentType,e.tShift[t]=b-e.bMarks[t],e.blkIndent=u,e.tight=!0,e.parentType="list",e.parser.tokenize(e,t,i,!0),e.tight&&!w||(T=!1),w=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=l,e.tShift[t]=c,e.tight=p,e.parentType=f,e.tokens.push({type:"list_item_close",level:--e.level}),s=t=e.line,S[1]=s,b=e.bMarks[t],s>=i)||e.isEmpty(s)||e.tShift[s]l)return!1;if(91!==e.src.charCodeAt(c))return!1;if(94!==e.src.charCodeAt(c+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(s=c+2;s=l||58!==e.src.charCodeAt(++s))&&(!!r||(s++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(c+2,s-2),e.env.footnotes.refs[":"+u]=-1,e.tokens.push({type:"footnote_reference_open",label:u,level:e.level++}),o=e.bMarks[t],i=e.tShift[t],a=e.parentType,e.tShift[t]=e.skipSpaces(s)-s,e.bMarks[t]=s,e.blkIndent+=4,e.parentType="footnote",e.tShift[t]=u)return!1;if(o=e.src.charCodeAt(s),35!==o||s>=u)return!1;for(i=1,o=e.src.charCodeAt(++s);35===o&&s6||ss&&32===e.src.charCodeAt(a-1)&&(u=a),e.line=t+1,e.tokens.push({type:"heading_open",hLevel:i,lines:[t,e.line],level:e.level}),s=n)&&(!(e.tShift[a]3)&&(o=e.bMarks[a]+e.tShift[a],i=e.eMarks[a],!(o>=i)&&(r=e.src.charCodeAt(o),(45===r||61===r)&&(o=e.skipChars(o,r),o=e.skipSpaces(o),!(o=97&&t<=122}var o=n(1006),i=/^<([a-zA-Z]{1,15})[\s\/>]/,a=/^<\/([a-zA-Z]{1,15})[\s>]/;e.exports=function(e,t,n,s){var u,c,l,p=e.bMarks[t],f=e.eMarks[t],h=e.tShift[t];if(p+=h,!e.options.html)return!1;if(h>3||p+2>=f)return!1;if(60!==e.src.charCodeAt(p))return!1;if(u=e.src.charCodeAt(p+1),33===u||63===u){if(s)return!0}else{if(47!==u&&!r(u))return!1;if(47===u){if(c=e.src.slice(p,f).match(a),!c)return!1}else if(c=e.src.slice(p,f).match(i),!c)return!1;if(o[c[1].toLowerCase()]!==!0)return!1;if(s)return!0}for(l=t+1;lr)return!1;if(c=t+1,e.tShift[c]=e.eMarks[c])return!1;if(i=e.src.charCodeAt(s),124!==i&&45!==i&&58!==i)return!1;if(a=n(e,t+1),!/^[-:| ]+$/.test(a))return!1;if(l=a.split("|"),l<=2)return!1;for(f=[],u=0;u=i?-1:(r=e.src.charCodeAt(o++),126!==r&&58!==r?-1:(n=e.skipSpaces(o),o===n?-1:n>=i?-1:n))}function r(e,t){var n,r,o=e.level+2;for(n=t+2,r=e.tokens.length-2;n=0;if(f=t+1,e.isEmpty(f)&&++f>o)return!1;if(e.tShift[f]=e.options.maxNesting)return!1;p=e.tokens.length,e.tokens.push({type:"dl_open",lines:l=[t,0],level:e.level++}),u=t,s=f;e:for(;;){for(_=!0,g=!1,e.tokens.push({type:"dt_open",lines:[u,u],level:e.level++}),e.tokens.push({type:"inline",content:e.getLines(u,u+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[u,u],children:[]}),e.tokens.push({type:"dt_close",level:--e.level});;){if(e.tokens.push({type:"dd_open",lines:c=[f,0],level:e.level++}),v=e.tight,d=e.ddIndent,h=e.blkIndent,y=e.tShift[s],m=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=a-e.bMarks[s],e.tight=!0,e.parentType="deflist",e.parser.tokenize(e,s,o,!0),e.tight&&!g||(_=!1),g=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=y,e.tight=v,e.parentType=m,e.blkIndent=h,e.ddIndent=d,e.tokens.push({type:"dd_close",level:--e.level}),c[1]=f=e.line,f>=o)break e;if(e.tShift[f]=o)break;if(u=f,e.isEmpty(u))break;if(e.tShift[u]=o)break;if(e.isEmpty(s)&&s++,s>=o)break;if(e.tShift[s]3)){for(o=!1,i=0,a=s.length;i0)return void(e.pos=n);for(t=0;t=i)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},r.prototype.parse=function(e,t,n,r){var o=new a(e,this,t,n,r);this.tokenize(o)},e.exports=r},function(e,t){"use strict";function n(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}e.exports=function(e,t){for(var r=e.pos;r=0&&32===e.pending.charCodeAt(n))if(n>=1&&32===e.pending.charCodeAt(n-1)){for(var i=n-2;i>=0;i--)if(32!==e.pending.charCodeAt(i)){e.pending=e.pending.substring(0,i+1);break}e.push({type:"hardbreak",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:"softbreak",level:e.level});else e.push({type:"softbreak",level:e.level});for(o++;o?@[]^_`{|}~-".split("").forEach(function(e){n[e.charCodeAt(0)]=1}),e.exports=function(e,t){var r,o=e.pos,i=e.posMax;if(92!==e.src.charCodeAt(o))return!1;if(o++,o=s)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(i=u>0?e.src.charCodeAt(u-1):-1,a=e.src.charCodeAt(u+2),126===i)return!1;if(126===a)return!1;if(32===a||10===a)return!1;for(r=u+2;ru+3)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1=s)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1; +if(i=u>0?e.src.charCodeAt(u-1):-1,a=e.src.charCodeAt(u+2),43===i)return!1;if(43===a)return!1;if(32===a||10===a)return!1;for(r=u+2;r=s)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(i=u>0?e.src.charCodeAt(u-1):-1,a=e.src.charCodeAt(u+2),61===i)return!1;if(61===a)return!1;if(32===a||10===a)return!1;for(r=u+2;r=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function r(e,t){var r,o,i,a=t,s=!0,u=!0,c=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;a=c&&(s=!1),i=a-t,i>=4?s=u=!1:(o=a=e.options.maxNesting)return!1;for(e.pos=p+n,u=[n];e.pos?@[\]^_`{|}~-])/g;e.exports=function(e,t){var r,o,i=e.posMax,a=e.pos;if(126!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=i)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos?@[\]^_`{|}~-])/g;e.exports=function(e,t){var r,o,i=e.posMax,a=e.pos;if(94!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=i)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos=e.options.maxNesting)return!1;if(n=v+1,s=r(e,v),s<0)return!1;if(p=s+1,p=y)return!1;for(v=p,o(e,p)?(c=e.linkContent,p=e.pos):c="",v=p;p=y||41!==e.src.charCodeAt(p))return e.pos=m,!1;p++}else{if(e.linkLevel>0)return!1;for(;p=0?u=e.src.slice(v,p++):p=v-1),u||("undefined"==typeof u&&(p=s+1),u=e.src.slice(n,s)),f=e.env.references[a(u)],!f)return e.pos=m,!1;c=f.href,l=f.title}return t||(e.pos=n,e.posMax=s,d?e.push({type:"image",src:c,title:l,alt:e.src.substr(n,s-n),level:e.level}):(e.push({type:"link_open",href:c,title:l,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:"link_close",level:--e.level}))),e.pos=p,e.posMax=y,!0}},function(e,t,n){"use strict";var r=n(982);e.exports=function(e,t){var n,o,i,a,s=e.posMax,u=e.pos;return!(u+2>=s)&&(94===e.src.charCodeAt(u)&&(91===e.src.charCodeAt(u+1)&&(!(e.level>=e.options.maxNesting)&&(n=u+2,o=r(e,u+1),!(o<0)&&(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),i=e.env.footnotes.list.length,e.pos=n,e.posMax=o,e.push({type:"footnote_ref",id:i,level:e.level}),e.linkLevel++,a=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[i]={tokens:e.tokens.splice(a)},e.linkLevel--),e.pos=o+1,e.posMax=s,!0)))))}},function(e,t){"use strict";e.exports=function(e,t){var n,r,o,i,a=e.posMax,s=e.pos;if(s+3>a)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(s))return!1;if(94!==e.src.charCodeAt(s+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(r=s+2;r=a)&&(r++,n=e.src.slice(s+2,r-1),"undefined"!=typeof e.env.footnotes.refs[":"+n]&&(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[":"+n]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:n,count:0},e.env.footnotes.refs[":"+n]=o):o=e.env.footnotes.refs[":"+n],i=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:"footnote_ref",id:o,subId:i,level:e.level})),e.pos=r,e.posMax=a,!0)))}},function(e,t,n){"use strict";var r=n(1025),o=n(985),i=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,a=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;e.exports=function(e,t){var n,s,u,c,l,p=e.pos;return 60===e.src.charCodeAt(p)&&(n=e.src.slice(p),!(n.indexOf(">")<0)&&((s=n.match(a))?!(r.indexOf(s[1].toLowerCase())<0)&&(c=s[0].slice(1,-1),l=o(c),!!e.parser.validateLink(c)&&(t||(e.push({type:"link_open",href:l,level:e.level}),e.push({type:"text",content:c,level:e.level+1}),e.push({type:"link_close",level:e.level})),e.pos+=s[0].length,!0)):(u=n.match(i),!!u&&(c=u[0].slice(1,-1),l=o("mailto:"+c),!!e.parser.validateLink(l)&&(t||(e.push({type:"link_open",href:l,level:e.level}),e.push({type:"text",content:c,level:e.level+1}),e.push({type:"link_close",level:e.level})),e.pos+=u[0].length,!0)))))}},function(e,t){"use strict";e.exports=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"]},function(e,t,n){"use strict";function r(e){var t=32|e;return t>=97&&t<=122}var o=n(1027).HTML_TAG_RE;e.exports=function(e,t){var n,i,a,s=e.pos;return!!e.options.html&&(a=e.posMax,!(60!==e.src.charCodeAt(s)||s+2>=a)&&(n=e.src.charCodeAt(s+1),!(33!==n&&63!==n&&47!==n&&!r(n))&&(!!(i=e.src.slice(s).match(o))&&(t||e.push({type:"htmltag",content:e.src.slice(s,s+i[0].length),level:e.level}),e.pos+=i[0].length,!0))))}},function(e,t){"use strict";function n(e,t){return e=e.source,t=t||"",function n(r,o){return r?(o=o.source||o,e=e.replace(r,o),n):new RegExp(e,t)}}var r=/[a-zA-Z_:][a-zA-Z0-9:._-]*/,o=/[^"'=<>`\x00-\x20]+/,i=/'[^']*'/,a=/"[^"]*"/,s=n(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",o)("single_quoted",i)("double_quoted",a)(),u=n(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",r)("attr_value",s)(),c=n(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",u)(),l=/<\/[A-Za-z][A-Za-z0-9]*\s*>/,p=//,f=/<[?].*?[?]>/,h=/]*>/,d=/])*\]\]>/,m=n(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",c)("close_tag",l)("comment",p)("processing",f)("declaration",h)("cdata",d)();e.exports.HTML_TAG_RE=m},function(e,t,n){"use strict";var r=n(974),o=n(973).has,i=n(973).isValidEntityCode,a=n(973).fromCodePoint,s=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,u=/^&([a-z][a-z0-9]{1,31});/i;e.exports=function(e,t){var n,c,l,p=e.pos,f=e.posMax;if(38!==e.src.charCodeAt(p))return!1;if(p+1=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;tl,collapsedContent:w},f.default.createElement("span",{className:"brace-open object"},v),r?f.default.createElement(x,{name:n}):null,f.default.createElement("span",{className:"inner-object"},f.default.createElement("table",{className:"model",style:{marginLeft:"2em"}},f.default.createElement("tbody",null,h?f.default.createElement("tr",{ +style:{color:"#999",fontStyle:"italic"}},f.default.createElement("td",null,"description:"),f.default.createElement("td",null,h)):null,d&&d.size?d.entrySeq().map(function(e){var t=c(e,2),r=t[0],o=t[1],l=y.List.isList(b)&&b.contains(r),p={verticalAlign:"top",paddingRight:"0.2em"};return l&&(p.fontWeight="bold"),f.default.createElement("tr",{key:r},f.default.createElement("td",{style:p},r,":"),f.default.createElement("td",{style:{verticalAlign:"top"}},f.default.createElement(k,u({key:"object-"+n+"-"+r+"_"+o},s,{required:l,getComponent:i,schema:o,depth:a+1}))))}).toArray():null,m&&m.size?f.default.createElement("tr",null,f.default.createElement("td",null,"< * >:"),f.default.createElement("td",null,f.default.createElement(k,u({},s,{required:!1,getComponent:i,schema:m,depth:a+1})))):null))),f.default.createElement("span",{className:"brace-close"},g)))}}]),t}(p.Component);b.propTypes={schema:p.PropTypes.object.isRequired,getComponent:p.PropTypes.func.isRequired,specSelectors:p.PropTypes.object.isRequired,name:p.PropTypes.string,isRef:p.PropTypes.bool,expandDepth:p.PropTypes.number,depth:p.PropTypes.number};var x=function(e){function t(){return i(this,t),a(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return s(t,e),l(t,[{key:"render",value:function(){var e=this.props,t=e.schema,n=e.required;if(!t||!t.get)return f.default.createElement("div",null);var r=t.get("type"),o=t.get("format"),i=t.get("xml"),a=t.get("enum"),s=(t.get("description"),t.filter(function(e,t){return["enum","type","format","$$ref"].indexOf(t)===-1})),u=n?{fontWeight:"bold"}:{},l={color:"#999",fontStyle:"italic"};return f.default.createElement("span",{className:"prop"},f.default.createElement("span",{className:"prop-type",style:u},r)," ",n&&f.default.createElement("span",{style:{color:"red"}},"*"),o&&f.default.createElement("span",{className:"prop-format"},"($",o,")"),s.size?s.entrySeq().map(function(e){var t=c(e,2),n=t[0],r=t[1];return f.default.createElement("span",{key:n+"-"+r,style:l},f.default.createElement("br",null),"description"!==n&&n+": ",String(r))}):null,i&&i.size?f.default.createElement("span",null,f.default.createElement("br",null),f.default.createElement("span",{style:l},"xml:"),i.entrySeq().map(function(e){var t=c(e,2),n=t[0],r=t[1];return f.default.createElement("span",{key:n+"-"+r,style:l},f.default.createElement("br",null),"   ",n,": ",String(r))}).toArray()):null,a&&f.default.createElement(_,{value:a}))}}]),t}(p.Component);x.propTypes={schema:p.PropTypes.object.isRequired,required:p.PropTypes.bool};var w=function(e){function t(){return i(this,t),a(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return s(t,e),l(t,[{key:"render",value:function(){var e=this.props,t=e.required,n=e.schema,r=e.depth,o=e.expandDepth,i=n.get("items");return f.default.createElement("span",null,f.default.createElement(E,{collapsed:r>o,collapsedContent:"[...]"},"[",f.default.createElement("span",null,f.default.createElement(k,u({},this.props,{schema:i,required:!1}))),"]"),t&&f.default.createElement("span",{style:{color:"red"}},"*"))}}]),t}(p.Component);w.propTypes={schema:p.PropTypes.object.isRequired,getComponent:p.PropTypes.func.isRequired,specSelectors:p.PropTypes.object.isRequired,name:p.PropTypes.string,required:p.PropTypes.bool,expandDepth:p.PropTypes.number,depth:p.PropTypes.number};var k=function(e){function t(){var e,n,r,o;i(this,t);for(var s=arguments.length,u=Array(s),c=0;c=400?(r.updateLoadingStatus("failedConfig"),console.log(t.statusText+" "+i)):e(f(t.text))}var r=t.specActions,o=(0,u.parseSeach)(),i=o.config;if(i)return r.downloadConfig(i).then(n,n)}}},r={getLocalConfig:function(){return f(l.default)}};return{statePlugins:{spec:{actions:n,selectors:r}}}}function i(e){var t=void 0,n={};for(t in e)p.indexOf(t)!==-1&&(n[t]=e[t]);return n}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o,t.filterConfigs=i;var a=n(297),s=r(a),u=n(46),c=n(1046),l=r(c),p=["url","spec","validatorUrl","onComplete","onFailure","authorizations","docExpansion","apisSorter","operationsSorter","supportedSubmitMethods","highlightSizeThreshold","dom_id","defaultModelRendering","oauth2RedirectUrl","showRequestHeaders"],f=function(e,t){try{return s.default.safeLoad(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t){e.exports='---\nurl: "http://petstore.swagger.io/v2/swagger.json"\ndom_id: "#swagger-ui"\nvalidatorUrl: "https://online.swagger.io/validator"\noauth2RedirectUrl: "http://localhost:3200/oauth2-redirect.html"\n'},function(e,t,n,r){var o=n(r),i=o.Symbol;e.exports=i},function(e,t,n,r){var o=n(r),i="object"==typeof self&&self&&self.Object===Object&&self,a=o||i||Function("return this")();e.exports=a},function(e,t,n,r){var o=n(r),i=o(Object.getPrototypeOf,Object);e.exports=i},function(e,t,n,r,o,i){function a(){this.size=0,this.__data__={hash:new s,map:new(c||u),string:new s}}var s=n(r),u=n(o),c=n(i);e.exports=a},function(e,t,n,r){function o(){this.__data__=i?i(null):{},this.size=0}var i=n(r);e.exports=o},function(e,t,n,r){var o=n(r),i=o(Object,"create");e.exports=i},function(e,t,n,r,o){function i(e,t){var n=s(e,t);return a(n)?n:void 0}var a=n(r),s=n(o);e.exports=i},function(e,t,n,r,o,i,a){function s(e){if(!l(e)||c(e))return!1;var t=u(e)?g:h;return t.test(p(e))}var u=n(r),c=n(o),l=n(i),p=n(a),f=/[\\^$.*+?()[\]{}|]/g,h=/^\[object .+?Constructor\]$/,d=Function.prototype,m=Object.prototype,y=d.toString,v=m.hasOwnProperty,g=RegExp("^"+y.call(v).replace(f,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=s},function(e,t,n,r){function o(e){return!!a&&a in e}var i=n(r),a=function(){var e=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();e.exports=o},function(e,t,n,r){var o=n(r),i=o["__core-js_shared__"];e.exports=i},function(e,t,n,r){function o(e){var t=this.__data__;if(i){var n=t[e];return n===a?void 0:n}return u.call(t,e)?t[e]:void 0}var i=n(r),a="__lodash_hash_undefined__",s=Object.prototype,u=s.hasOwnProperty;e.exports=o},function(e,t,n,r){function o(e){var t=this.__data__;return i?void 0!==t[e]:s.call(t,e)}var i=n(r),a=Object.prototype,s=a.hasOwnProperty;e.exports=o},function(e,t,n,r){function o(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=i&&void 0===t?a:t,this}var i=n(r),a="__lodash_hash_undefined__";e.exports=o},function(e,t,n,r){function o(e){var t=this.__data__,n=i(t,e);if(n<0)return!1;var r=t.length-1;return n==r?t.pop():s.call(t,n,1),--this.size,!0}var i=n(r),a=Array.prototype,s=a.splice;e.exports=o},function(e,t,n,r){function o(e,t){for(var n=e.length;n--;)if(i(e[n][0],t))return n;return-1}var i=n(r);e.exports=o},function(e,t,n,r){function o(e){var t=this.__data__,n=i(t,e);return n<0?void 0:t[n][1]}var i=n(r);e.exports=o},function(e,t,n,r){function o(e){return i(this.__data__,e)>-1}var i=n(r);e.exports=o},function(e,t,n,r){function o(e,t){var n=this.__data__,r=i(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}var i=n(r);e.exports=o},function(e,t,n,r,o){var i=n(r),a=n(o),s=i(a,"Map");e.exports=s},function(e,t,n,r){function o(e){var t=i(this,e).delete(e);return this.size-=t?1:0,t}var i=n(r);e.exports=o},function(e,t,n,r){function o(e,t){var n=e.__data__;return i(t)?n["string"==typeof t?"string":"hash"]:n.map}var i=n(r);e.exports=o},function(e,t,n,r){function o(e){return i(this,e).get(e)}var i=n(r);e.exports=o},function(e,t,n,r){function o(e){return i(this,e).has(e)}var i=n(r);e.exports=o},function(e,t,n,r){function o(e,t){var n=i(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this}var i=n(r);e.exports=o},function(e,t,n,r,o,i,a,s,u){function c(e){var t=this.__data__=new l(e);this.size=t.size}var l=n(r),p=n(o),f=n(i),h=n(a),d=n(s),m=n(u);c.prototype.clear=p,c.prototype.delete=f,c.prototype.get=h,c.prototype.has=d,c.prototype.set=m,e.exports=c},function(e,t,n,r){function o(){this.__data__=new i,this.size=0}var i=n(r);e.exports=o},function(e,t,n,r,o,i){function a(e,t){var n=this.__data__;if(n instanceof s){var r=n.__data__;if(!u||r.length0&&n(l)?t>1?i(l,t-1,n,r,o):a(o,l):r||(o[o.length]=l)}return o}var a=n(r),s=n(o);e.exports=i},function(e,t,n,r,o,i){function a(e){return c(e)||u(e)||!!(l&&e&&e[l])}var s=n(r),u=n(o),c=n(i),l=s?s.isConcatSpreadable:void 0;e.exports=a},function(e,t,n,r){"use strict";var o=n(r),i=(n(337),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),a=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},s=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},u=function(e,t,n,r){var o=this;if(o.instancePool.length){var i=o.instancePool.pop();return o.call(i,e,t,n,r),i}return new o(e,t,n,r)},c=function(e){var t=this;e instanceof t?void 0:o("25"),e.destructor(),t.instancePool.length1){for(var m=Array(b),x=0;x1){for(var h=Array(w),y=0;y>"),j={array:a("array"),bool:a("boolean"),func:a("function"),number:a("number"),object:a("object"),string:a("string"),symbol:a("symbol"),any:s(),arrayOf:l,element:p(),instanceOf:u,node:g(),objectOf:f,oneOf:c,oneOfType:d,shape:b};n.prototype=Error.prototype,e.exports=j},function(e,t){"use strict";var o="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";e.exports=o},function(e,t){"use strict";e.exports="15.4.2"},function(e,t,o){"use strict";function r(e){return i.isValidElement(e)?void 0:n("143"),e}var n=o(8),i=o(10);o(9);e.exports=r},function(e,t,o){var r=o(31);"string"==typeof r&&(r=[[e.id,r,""]]);o(33)(r,{});r.locals&&(e.exports=r.locals)},function(e,t,o){t=e.exports=o(32)(),t.push([e.id,"@charset \"UTF-8\";.swagger-ui html{box-sizing:border-box}.swagger-ui *,.swagger-ui :after,.swagger-ui :before{box-sizing:inherit}.swagger-ui body{margin:0;background:#fafafa}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px}.swagger-ui .opblock-tag-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .opblock-tag{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 20px 10px 10px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .opblock-tag svg{-webkit-transition:all .4s;transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;padding:0 10px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parаmeter__type{font-size:12px;padding:5px 0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;-webkit-transition:all .5s;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{padding:8px 20px;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header,.swagger-ui .opblock .opblock-section-header label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-section-header label{font-size:12px;font-weight:700;margin:0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header label span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 10px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-summary-path .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;-webkit-transition:all .5s;transition:all .5s}.swagger-ui .opblock .opblock-summary-path:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-description{font-size:13px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:-webkit-box;display:-ms-flexbox;display:flex;padding:5px;cursor:pointer;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .tab{display:-webkit-box;display:-ms-flexbox;display:flex;margin:20px 0 10px;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:100px;min-width:90px;padding:0;cursor:pointer;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:\"\";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-title_normal{padding:15px 20px}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-title_normal,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:Source Code Pro,monospace;font-weight:600;color:#999}.swagger-ui .response-col_description__inner span{font-size:12px;font-style:italic;display:block;margin:10px 0;padding:10px;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .response-col_description__inner span p{margin:0}.swagger-ui .opblock-body pre{font-size:12px;margin:0;padding:10px;white-space:pre-wrap;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre span{color:#fff!important}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:-20px 15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:\"loading\";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:\"\";-webkit-animation:rotation 1s infinite linear,opacity .5s;animation:rotation 1s infinite linear,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;-webkit-transition:all .3s;transition:all .3s;border:2px solid #888;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;font-family:Titillium Web,sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{-webkit-animation:pulse 2s infinite;animation:pulse 2s infinite;color:#fff;border-color:#4990e2}@-webkit-keyframes pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}@keyframes pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}.swagger-ui .btn-group{display:-webkit-box;display:-ms-flexbox;display:flex;padding:30px}.swagger-ui .btn-group .btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#444}.swagger-ui .expand-methods svg{-webkit-transition:all .3s;transition:all .3s;fill:#777}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:Titillium Web,sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui .opblock-body select{min-width:230px}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}.swagger-ui input[type=email].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;-webkit-transition:opacity .5s;transition:opacity .5s;color:#333}.swagger-ui .checkbox label{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;-webkit-box-flex:0;-ms-flex:none;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E\") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:\"\";background:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E\") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models.is-open h4 svg{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui section.models h4{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:10px 20px 10px 10px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;font-family:Titillium Web,sans-serif;color:#777;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui section.models h4 svg{-webkit-transition:all .4s;transition:all .4s}.swagger-ui section.models h4 span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:Titillium Web,sans-serif;color:#777}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;-webkit-transition:all .5s;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-title{font-size:16px;font-family:Titillium Web,sans-serif;color:#555}.swagger-ui span>span.model,.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#999}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:100px;padding:0}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{width:20%;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:\"required\";color:rgba(255,0,0,.6)}.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:Source Code Pro,monospace;font-weight:600;color:#888}.swagger-ui .table-container{padding:20px}.swagger-ui .topbar{padding:8px 30px;background-color:#89bf04}.swagger-ui .topbar .topbar-wrapper{-ms-flex-align:center}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;text-decoration:none;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-align:center;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .topbar .download-url-wrapper input[type=text]{min-width:350px;margin:0;border:2px solid #547f00;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 40px;border:none;border-radius:0 4px 4px 0;background:#547f00;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info p{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info code{padding:3px 5px;border-radius:4px;background:rgba(0,0,0,.05);font-family:Source Code Pro,monospace;font-weight:600;color:#9012fe}.swagger-ui .info a{font-size:14px;-webkit-transition:all .4s;transition:all .4s;font-family:Open Sans,sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.swagger-ui .auth-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper hgroup{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}",""]); +},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t=0&&h.splice(t,1)}function s(e){var t=document.createElement("style");return t.type="text/css",i(e,t),t}function l(e){var t=document.createElement("link");return t.rel="stylesheet",i(e,t),t}function p(e,t){var o,r,n;if(t.singleton){var i=w++;o=x||(x=s(t)),r=u.bind(null,o,i,!1),n=u.bind(null,o,i,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(o=l(t),r=f.bind(null,o),n=function(){a(o),o.href&&URL.revokeObjectURL(o.href)}):(o=s(t),r=c.bind(null,o),n=function(){a(o)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else n()}}function u(e,t,o,r){var n=o?"":r.css;if(e.styleSheet)e.styleSheet.cssText=y(t,n);else{var i=document.createTextNode(n),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}function c(e,t){var o=t.css,r=t.media;t.sourceMap;if(r&&e.setAttribute("media",r),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}function f(e,t){var o=t.css,r=(t.media,t.sourceMap);r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var n=new Blob([o],{type:"text/css"}),i=e.href;e.href=URL.createObjectURL(n),i&&URL.revokeObjectURL(i)}var d={},g=function(e){var t;return function(){return"undefined"==typeof t&&(t=e.apply(this,arguments)),t}},b=g(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),m=g(function(){return document.head||document.getElementsByTagName("head")[0]}),x=null,w=0,h=[];e.exports=function(e,t){t=t||{},"undefined"==typeof t.singleton&&(t.singleton=b()),"undefined"==typeof t.insertAt&&(t.insertAt="bottom");var o=n(e);return r(o,t),function(e){for(var i=[],a=0;alabel{font-size:12px;font-weight:700;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:-20px 15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:"loading";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:"";-webkit-animation:rotation 1s infinite linear,opacity .5s;animation:rotation 1s infinite linear,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;-webkit-transition:all .3s;transition:all .3s;border:2px solid #888;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;font-family:Titillium Web,sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{-webkit-animation:pulse 2s infinite;animation:pulse 2s infinite;color:#fff;border-color:#4990e2}@-webkit-keyframes pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}@keyframes pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}.swagger-ui .btn-group{display:-webkit-box;display:-ms-flexbox;display:flex;padding:30px}.swagger-ui .btn-group .btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#444}.swagger-ui .expand-methods svg{-webkit-transition:all .3s;transition:all .3s;fill:#777}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:Titillium Web,sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui .opblock-body select{min-width:230px}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}.swagger-ui input[type=email].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;-webkit-transition:opacity .5s;transition:opacity .5s;color:#333}.swagger-ui .checkbox label{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;-webkit-box-flex:0;-ms-flex:none;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models.is-open h4 svg{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui section.models h4{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:10px 20px 10px 10px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;font-family:Titillium Web,sans-serif;color:#777;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui section.models h4 svg{-webkit-transition:all .4s;transition:all .4s}.swagger-ui section.models h4 span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:Titillium Web,sans-serif;color:#777}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;-webkit-transition:all .5s;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-title{font-size:16px;font-family:Titillium Web,sans-serif;color:#555}.swagger-ui span>span.model,.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#999}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:100px;padding:0}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{width:20%;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:"required";color:rgba(255,0,0,.6)}.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:Source Code Pro,monospace;font-weight:600;color:#888}.swagger-ui .table-container{padding:20px}.swagger-ui .topbar{padding:8px 30px;background-color:#89bf04}.swagger-ui .topbar .topbar-wrapper{-ms-flex-align:center}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;text-decoration:none;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-align:center;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .topbar .download-url-wrapper input[type=text]{min-width:350px;margin:0;border:2px solid #547f00;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 40px;border:none;border-radius:0 4px 4px 0;background:#547f00;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info p{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info code{padding:3px 5px;border-radius:4px;background:rgba(0,0,0,.05);font-family:Source Code Pro,monospace;font-weight:600;color:#9012fe}.swagger-ui .info a{font-size:14px;-webkit-transition:all .4s;transition:all .4s;font-family:Open Sans,sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.swagger-ui .auth-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper hgroup{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.swagger-ui .Resizer.vertical.disabled{display:none} +/*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/swagger/swagger-ui.css.map b/swagger/swagger-ui.css.map new file mode 100644 index 00000000..dbf47ea6 --- /dev/null +++ b/swagger/swagger-ui.css.map @@ -0,0 +1 @@ +{"version":3,"file":"swagger-ui.css","sources":[],"mappings":"","sourceRoot":""} \ No newline at end of file diff --git a/swagger/swagger-ui.js b/swagger/swagger-ui.js new file mode 100644 index 00000000..92caec96 --- /dev/null +++ b/swagger/swagger-ui.js @@ -0,0 +1,9 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("deep-extend"),require("redux"),require("immutable"),require("redux-logger"),require("redux-immutable"),require("object-assign"),require("serialize-error"),require("shallowequal"),require("xml"),require("memoizee"),require("reselect"),require("js-yaml"),require("react"),require("react-dom"),require("react-redux"),require("yaml-js"),require("swagger-client"),require("btoa"),require("react-split-pane"),require("react-immutable-proptypes"),require("react-motion"),require("react-addons-shallow-compare"),require("react-collapse"),require("react-remarkable")):"function"==typeof define&&define.amd?define(["deep-extend","redux","immutable","redux-logger","redux-immutable","object-assign","serialize-error","shallowequal","xml","memoizee","reselect","js-yaml","react","react-dom","react-redux","yaml-js","swagger-client","btoa","react-split-pane","react-immutable-proptypes","react-motion","react-addons-shallow-compare","react-collapse","react-remarkable"],t):"object"==typeof exports?exports.SwaggerUICore=t(require("deep-extend"),require("redux"),require("immutable"),require("redux-logger"),require("redux-immutable"),require("object-assign"),require("serialize-error"),require("shallowequal"),require("xml"),require("memoizee"),require("reselect"),require("js-yaml"),require("react"),require("react-dom"),require("react-redux"),require("yaml-js"),require("swagger-client"),require("btoa"),require("react-split-pane"),require("react-immutable-proptypes"),require("react-motion"),require("react-addons-shallow-compare"),require("react-collapse"),require("react-remarkable")):e.SwaggerUICore=t(e["deep-extend"],e.redux,e.immutable,e["redux-logger"],e["redux-immutable"],e["object-assign"],e["serialize-error"],e.shallowequal,e.xml,e.memoizee,e.reselect,e["js-yaml"],e.react,e["react-dom"],e["react-redux"],e["yaml-js"],e["swagger-client"],e.btoa,e["react-split-pane"],e["react-immutable-proptypes"],e["react-motion"],e["react-addons-shallow-compare"],e["react-collapse"],e["react-remarkable"])}(this,function(e,t,r,n,o,a,u,i,s,c,l,p,f,d,y,h,m,v,b,g,_,E,j,w){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="/dist",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var r=t.slice(1),n=e[t[0]];return function(e,t,o){n.apply(this,[e,t,o].concat(r))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,r){r(1),e.exports=r(2)},function(e,t){},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u=r(3),i=o(u),s=r(4),c=o(s),l=r(154),p=o(l),f=r(319),d=n(f),y=r(321),h=r(13);e.exports=function(e){var t={dom_id:null,spec:{},url:"",layout:"Layout",configs:{validatorUrl:"https://online.swagger.io/validator"},presets:[],plugins:[],fn:{},components:{},state:{},store:{}},r=(0,i.default)({},t,e),n=(0,i.default)({},r.store,{system:{configs:r.configs},plugins:r.presets,state:{layout:{layout:r.layout},spec:{spec:"",url:r.url}}}),o=function(){return{fn:r.fn,components:r.components,state:r.state}},u=new c.default(n);u.register([r.plugins,o]);var s=u.getSystem(),l=(0,h.parseSeach)(),p=function(e){if("object"!==("undefined"==typeof r?"undefined":a(r)))return s;var t=s.specSelectors.getLocalConfig?s.specSelectors.getLocalConfig():{},n=(0,i.default)({},r,t,l);return u.setConfigs((0,y.filterConfigs)(n)),!l.url&&"object"===a(n.spec)&&Object.keys(n.spec).length?(s.specActions.updateUrl(""),s.specActions.updateLoadingStatus("success"),s.specActions.updateSpec(JSON.stringify(n.spec))):s.specActions.download&&n.url&&(s.specActions.updateUrl(n.url),s.specActions.download(n.url)),n.dom_id?s.render(n.dom_id,"App"):console.error("Skipped rendering: no `dom_id` was specified"),s};if(!s.specActions.getConfigByUrl||s.specActions.getConfigByUrl&&!s.specActions.getConfigByUrl(p))return p(r)},e.exports.presets={apis:p.default},e.exports.plugins=d},function(e,t){e.exports=require("deep-extend")},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t,r){var n=[(0,x.systemThunkMiddleware)(r)],o=S.default.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||y.compose;return(0,y.createStore)(e,t,o(y.applyMiddleware.apply(void 0,n)))}function i(e,t){return(0,x.isObject)(e)&&!(0,x.isArray)(e)?e:(0,x.isFunc)(e)?i(e(t),t):(0,x.isArray)(e)?e.map(function(e){return i(e,t)}).reduce(s,{}):{}}function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,x.isObject)(e))return{};if(!(0,x.isObject)(t))return e;var r=e.statePlugins;if((0,x.isObject)(r))for(var n in r){var o=r[n];if((0,x.isObject)(o)&&(0,x.isObject)(o.wrapActions)){var a=o.wrapActions;for(var u in a){var i=a[u];Array.isArray(i)||(i=[i],a[u]=i),t&&t.statePlugins&&t.statePlugins[n]&&t.statePlugins[n].wrapActions&&t.statePlugins[n].wrapActions[u]&&(t.statePlugins[n].wrapActions[u]=a[u].concat(t.statePlugins[n].wrapActions[u]))}}}return(0,b.default)(e,t)}function c(e){var t=(0,x.objMap)(e,function(e){return e.reducers});return l(t)}function l(e){var t=Object.keys(e).reduce(function(t,r){return t[r]=p(e[r]),t},{});return Object.keys(t).length?(0,_.combineReducers)(t):C}function p(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new h.Map,r=arguments[1];if(!e)return t;var n=e[r.type];return n?n(t,r):t}}function f(e,t,r){var n=u(e,t,r);return n}Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};a(this,e),(0,b.default)(this,{state:{},plugins:[],system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},t),this.getSystem=this._getSystem.bind(this),this.store=f(C,(0,h.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return d(e,[{key:"getStore",value:function(){return this.store}},{key:"register",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=i(e,this.getSystem());s(this.system,r),t&&this.buildSystem()}},{key:"buildSystem",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,r=this.getStore().getState;this.boundSystem=(0,j.default)({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getBoundSelectors(r,this.getSystem),this.getStateThunks(r),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:"_getSystem",value:function(){return this.boundSystem}},{key:"getRootInjects",value:function(){return(0,j.default)({getSystem:this.getSystem,getStore:this.getStore.bind(this),getComponents:this.getComponents.bind(this),getState:this.getStore().getState,getConfigs:this._getConfigs.bind(this),Im:m.default},this.system.rootInjects||{})}},{key:"_getConfigs",value:function(){return this.system.configs}},{key:"getConfigs",value:function(){return{configs:this.system.configs}}},{key:"setConfigs",value:function(e){this.system.configs=e}},{key:"rebuildReducer",value:function(){this.store.replaceReducer(c(this.system.statePlugins))}},{key:"getType",value:function(e){var t=e[0].toUpperCase()+e.slice(1);return(0,x.objReduce)(this.system.statePlugins,function(r,n){var a=r[e];if(a)return o({},n+t,a)})}},{key:"getSelectors",value:function(){return this.getType("selectors")}},{key:"getActions",value:function(){var e=this.getType("actions");return(0,x.objMap)(e,function(e){return(0,x.objReduce)(e,function(e,t){if((0,x.isFn)(e))return o({},t,e)})})}},{key:"getWrappedAndBoundActions",value:function(e){var t=this,r=this.getBoundActions(e);return(0,x.objMap)(r,function(e,r){var n=t.system.statePlugins[r.slice(0,-7)].wrapActions;return n?(0,x.objMap)(e,function(e,r){var o=n[r];return o?(Array.isArray(o)||(o=[o]),o.reduce(function(e,r){var n=function(){return r(e,t.getSystem()).apply(void 0,arguments)};if(!(0,x.isFn)(n))throw new TypeError("wrapActions needs to return a function that returns a new function (ie the wrapped action)");return n},e||Function.prototype)):e}):e})}},{key:"getStates",value:function(e){return Object.keys(this.system.statePlugins).reduce(function(t,r){return t[r]=e.get(r),t},{})}},{key:"getStateThunks",value:function(e){return Object.keys(this.system.statePlugins).reduce(function(t,r){return t[r]=function(){return e().get(r)},t},{})}},{key:"getFn",value:function(){return{fn:this.system.fn}}},{key:"getComponents",value:function(e){return"undefined"!=typeof e?this.system.components[e]:this.system.components}},{key:"getBoundSelectors",value:function(e,t){return(0,x.objMap)(this.getSelectors(),function(r,n){var o=[n.slice(0,-9)],a=function(){return e().getIn(o)};return(0,x.objMap)(r,function(e){return function(){for(var r=arguments.length,n=Array(r),o=0;o0&&void 0!==arguments[0]?arguments[0]:{};return{type:h,payload:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.CLEAR=t.NEW_AUTH_ERR=t.NEW_SPEC_ERR=t.NEW_THROWN_ERR_BATCH=t.NEW_THROWN_ERR=void 0,t.newThrownErr=o,t.newThrownErrBatch=a,t.newSpecErr=u,t.newAuthErr=i,t.clear=s;var c=r(10),l=n(c),p=t.NEW_THROWN_ERR="err_new_thrown_err",f=t.NEW_THROWN_ERR_BATCH="err_new_thrown_err_batch",d=t.NEW_SPEC_ERR="err_new_spec_err",y=t.NEW_AUTH_ERR="err_new_auth_err",h=t.CLEAR="err_clear"},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={location:{},history:{},open:function(){},close:function(){}};try{r=window;var n=["File","Blob","FormData"],o=!0,a=!1,u=void 0;try{for(var i,s=n[Symbol.iterator]();!(o=(i=s.next()).done);o=!0){var c=i.value;c in window&&(r[c]=window[c])}}catch(e){a=!0,u=e}finally{try{!o&&s.return&&s.return()}finally{if(a)throw u}}}catch(e){console.error(e)}t.default=r},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return l(e)?V(e)?e.toObject():e:{}}function a(e){return e?e.toArray?e.toArray():s(e):[]}function u(e){return V(e)?e:l(e)?Array.isArray(e)?S.default.Seq(e).map(u).toList():S.default.Seq(e).map(u).toOrderedMap():e}function i(e,t){var r={};return Object.keys(e).filter(function(t){return"function"==typeof e[t]}).forEach(function(n){return r[n]=e[n].bind(null,t)}),r}function s(e){return Array.isArray(e)?e:[e]}function c(e){return"function"==typeof e}function l(e){return!!e&&"object"===("undefined"==typeof e?"undefined":P(e))}function p(e){return"function"==typeof e}function f(e){return Array.isArray(e)}function d(e,t){return Object.keys(e).reduce(function(r,n){return r[n]=t(e[n],n),r},{})}function y(e,t){return Object.keys(e).reduce(function(r,n){var o=t(e[n],n);return o&&"object"===("undefined"==typeof o?"undefined":P(o))&&(0,C.default)(r,o),r},{})}function h(e){return function(t){t.dispatch,t.getState;return function(t){return function(r){return"function"==typeof r?r(e()):t(r)}}}}function m(e){var t=e.keySeq();return t.contains(B)?B:t.filter(function(e){return"2"===(e+"")[0]}).sort().first()}function v(e,t){if(!S.default.Iterable.isIterable(e))return S.default.List();var r=e.getIn(Array.isArray(t)?t:[t]);return S.default.List.isList(r)?r:S.default.List()}function b(e){var t,r,n,o,a,u,i,s,c,l,p,f,d;for(p=/(>)(<)(\/*)/g,d=/[ ]*(.*)[ ]+\n/g,t=/(<.+>)(.+\n)/g,e=e.replace(/\r\n/g,"\n").replace(p,"$1\n$2$3").replace(d,"$1\n").replace(t,"$1\n$2"),l=0,n="",s=e.split("\n"),o=0,u="other",f={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0},r=function(e){var t,r,a,i,s,c,l;c={single:Boolean(e.match(/<.+\/>/)),closing:Boolean(e.match(/<\/.+>/)),opening:Boolean(e.match(/<[^!?].*>/))},s=function(){var e;e=[];for(a in c)l=c[a],l&&e.push(a);return e}()[0],s=void 0===s?"other":s,t=u+"->"+s,u=s,i="",o+=f[t],i=function(){var e,t,n;for(n=[],r=e=0,t=o;0<=t?et;r=0<=t?++e:--e)n.push(" ");return n}().join(""),"opening->closing"===t?n=n.substr(0,n.length-1)+e+"\n":n+=i+e+"\n"},a=0,i=s.length;at)return e.textContent;var u=function(e){var t,u,i,s,c,l=e.textContent,p=0,f=l[0],d=1,y=e.innerHTML="",h=0,m=/(\d*\, \d*\, \d*)(, ([.\d]*))?/g.exec(r.getComputedStyle(e).color);for("px rgba("+m[1]+",",m[3]||1;u=t,t=h<7&&"\\"==t?1:d;){if(d=f,f=l[++p],s=y.length>1,!d||h>8&&"\n"==d||[/\S/[a](d),1,1,!/[$\w]/[a](d),("/"==t||"\n"==t)&&s,'"'==t&&s,"'"==t&&s,l[p-4]+u+t=="-->",u+t=="*/"][h])for(y&&(e[o](c=n.createElement("span")).setAttribute("style",["color: #555; font-weight: bold;","","","color: #555;",""][h?h<3?2:h>6?4:h>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/[a](y):0]),c[o](n.createTextNode(y))),i=h&&h<7?h:i,y="",h=11;![1,/[\/{}[(\-+*=<>:;|\\.,?!&@~]/[a](d),/[\])]/[a](d),/[$\w]/[a](d),"/"==d&&i<2&&"<"!=t,'"'==d,"'"==d,d+f+l[p+1]+l[p+2]=="':null;var n=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=n[1]}return(0,F.memoizedCreateXMLExample)(e,r)}return JSON.stringify((0,F.memoizedSampleFromSchema)(e,r),null,2)},t.parseSeach=function(){var e={},t=window.location.search;if(""!=t){var r=t.substr(1).split("&");for(var n in r)n=r[n].split("="),e[decodeURIComponent(n[0])]=decodeURIComponent(n[1])}return e}},function(e,t){e.exports=require("shallowequal")},function(e,t,r){var n=r(16),o=r(37),a=o(function(e,t,r){return t=t.toLowerCase(),e+(r?n(t):t)});e.exports=a},function(e,t,r){function n(e){return a(o(e).toLowerCase())}var o=r(17),a=r(29);e.exports=n},function(e,t,r){function n(e){return null==e?"":o(e)}var o=r(18);e.exports=n},function(e,t,r){function n(e){if("string"==typeof e)return e;if(u(e))return a(e,n)+"";if(i(e))return l?l.call(e):"";var t=e+"";return"0"==t&&1/e==-s?"-0":t}var o=r(19),a=r(22),u=r(23),i=r(24),s=1/0,c=o?o.prototype:void 0,l=c?c.toString:void 0;e.exports=n},function(e,t,r){var n=r(20),o=n.Symbol;e.exports=o},function(e,t,r){var n=r(21),o="object"==typeof self&&self&&self.Object===Object&&self,a=n||o||Function("return this")();e.exports=a},function(e,t){(function(t){var r="object"==typeof t&&t&&t.Object===Object&&t;e.exports=r}).call(t,function(){return this}())},function(e,t){function r(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r=n?e:o(e,t,r)}var o=r(32);e.exports=n},function(e,t){function r(e,t,r){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),r=r>o?o:r,r<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var a=Array(o);++n-1}var o=r(67);e.exports=n},function(e,t,r){function n(e,t){var r=this.__data__,n=o(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var o=r(67);e.exports=n},function(e,t,r){var n=r(52),o=r(20),a=n(o,"Map");e.exports=a},function(e,t,r){function n(e){var t=o(this,e).delete(e);return this.size-=t?1:0,t}var o=r(74);e.exports=n},function(e,t,r){function n(e,t){ +var r=e.__data__;return o(t)?r["string"==typeof t?"string":"hash"]:r.map}var o=r(75);e.exports=n},function(e,t){function r(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}e.exports=r},function(e,t,r){function n(e){return o(this,e).get(e)}var o=r(74);e.exports=n},function(e,t,r){function n(e){return o(this,e).has(e)}var o=r(74);e.exports=n},function(e,t,r){function n(e,t){var r=o(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var o=r(74);e.exports=n},function(e,t,r){function n(e,t,r){var n=i(e)?o:u;return r&&s(e,t,r)&&(t=void 0),n(e,a(t,3))}var o=r(80),a=r(81),u=r(144),i=r(23),s=r(150);e.exports=n},function(e,t){function r(e,t){for(var r=-1,n=null==e?0:e.length;++rf))return!1;var y=l.get(e);if(y&&l.get(t))return y==t;var h=-1,m=!0,v=r&s?new o:void 0;for(l.set(e,t),l.set(t,e);++h-1&&e%1==0&&e-1&&e%1==0&&e<=n}var n=9007199254740991;e.exports=r},function(e,t){function r(e){return function(t){return e(t)}}e.exports=r},function(e,t,r){(function(e){var n=r(21),o="object"==typeof t&&t&&!t.nodeType&&t,a=o&&"object"==typeof e&&e&&!e.nodeType&&e,u=a&&a.exports===o,i=u&&n.process,s=function(){try{return i&&i.binding&&i.binding("util")}catch(e){}}();e.exports=s}).call(t,r(108)(e))},function(e,t,r){function n(e){if(!o(e))return a(e);var t=[];for(var r in Object(e))i.call(e,r)&&"constructor"!=r&&t.push(r);return t}var o=r(117),a=r(118),u=Object.prototype,i=u.hasOwnProperty;e.exports=n},function(e,t){function r(e){var t=e&&e.constructor,r="function"==typeof t&&t.prototype||n;return e===r}var n=Object.prototype;e.exports=r},function(e,t,r){var n=r(119),o=n(Object.keys,Object);e.exports=o},function(e,t){function r(e,t){return function(r){return e(t(r))}}e.exports=r},function(e,t,r){function n(e){return null!=e&&a(e.length)&&!o(e)}var o=r(54),a=r(113);e.exports=n},function(e,t,r){var n=r(122),o=r(72),a=r(123),u=r(124),i=r(125),s=r(25),c=r(58),l="[object Map]",p="[object Object]",f="[object Promise]",d="[object Set]",y="[object WeakMap]",h="[object DataView]",m=c(n),v=c(o),b=c(a),g=c(u),_=c(i),E=s;(n&&E(new n(new ArrayBuffer(1)))!=h||o&&E(new o)!=l||a&&E(a.resolve())!=f||u&&E(new u)!=d||i&&E(new i)!=y)&&(E=function(e){var t=s(e),r=t==p?e.constructor:void 0,n=r?c(r):"";if(n)switch(n){case m:return h;case v:return l;case b:return f;case g:return d;case _:return y}return t}),e.exports=E},function(e,t,r){var n=r(52),o=r(20),a=n(o,"DataView");e.exports=a},function(e,t,r){var n=r(52),o=r(20),a=n(o,"Promise");e.exports=a},function(e,t,r){var n=r(52),o=r(20),a=n(o,"Set");e.exports=a},function(e,t,r){var n=r(52),o=r(20),a=n(o,"WeakMap");e.exports=a},function(e,t,r){function n(e){for(var t=a(e),r=t.length;r--;){var n=t[r],u=e[n];t[r]=[n,u,o(u)]}return t}var o=r(127),a=r(102);e.exports=n},function(e,t,r){function n(e){return e===e&&!o(e)}var o=r(55);e.exports=n},function(e,t){function r(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}}e.exports=r},function(e,t,r){function n(e,t){return i(e)&&s(t)?c(l(e),t):function(r){var n=a(r,e);return void 0===n&&n===t?u(r,e):o(t,n,p|f)}}var o=r(90),a=r(130),u=r(137),i=r(133),s=r(127),c=r(128),l=r(136),p=1,f=2;e.exports=n},function(e,t,r){function n(e,t,r){var n=null==e?void 0:o(e,t);return void 0===n?r:n}var o=r(131);e.exports=n},function(e,t,r){function n(e,t){t=o(t,e);for(var r=0,n=t.length;null!=e&&r1&&void 0!==arguments[1]?arguments[1]:{},n=(0,a.objectify)(t),o=n.type,u=n.example,i=n.properties,s=n.additionalProperties,c=n.items,l=r.includeReadOnly;if(void 0!==u)return u;if(!o)if(i)o="object";else{if(!c)return;o="array"}if("object"===o){var f=(0,a.objectify)(i),d={};for(var y in f)f[y].readOnly&&!l||(d[y]=e(f[y]));if(s===!0)d.additionalProp1={};else if(s)for(var h=(0,a.objectify)(s),m=e(h),v=1;v<4;v++)d["additionalProp"+v]=m;return d}return"array"===o?[e(c)]:t.enum?t.default?t.default:(0,a.normalizeArray)(t.enum)[0]:p(t)},d=(t.inferSchema=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type="object"),e},t.sampleXmlFromSchema=function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=(0,a.objectify)(t),o=n.type,u=n.properties,i=n.additionalProperties,s=n.items,c=n.example,l=r.includeReadOnly,f=n.default,d={},y={},h=t.xml,m=h.name,v=h.prefix,b=h.namespace,g=n.enum,_=void 0,E=void 0;if(!o)if(u||i)o="object";else{if(!s)return;o="array"}if(m=m||"notagname",_=(v?v+":":"")+m,b){var j=v?"xmlns:"+v:"xmlns";y[j]=b}if("array"===o&&s){if(s.xml=s.xml||h||{},s.xml.name=s.xml.name||h.name,h.wrapped)return d[_]=[],Array.isArray(f)?f.forEach(function(t){s.default=t,d[_].push(e(s,r))}):d[_]=[e(s,r)],y&&d[_].push({_attr:y}),d;var w=[];return Array.isArray(f)?(f.forEach(function(t){s.default=t,w.push(e(s,r))}),w):e(s,r)}if("object"===o){var O=(0,a.objectify)(u);d[_]=[],c=c||{};for(var P in O)if(!O[P].readOnly||l)if(O[P].xml=O[P].xml||{},O[P].xml.attribute){var T=Array.isArray(O[P].enum)&&O[P].enum[0],S=O[P].example,x=O[P].default;y[O[P].xml.name||P]=void 0!==S&&S||void 0!==c[P]&&c[P]||void 0!==x&&x||T||p(O[P])}else O[P].xml.name=O[P].xml.name||P,O[P].example=void 0!==O[P].example?O[P].example:c[P],d[_].push(e(O[P]));return i===!0?d[_].push({additionalProp:"Anything can be here"}):i&&d[_].push({additionalProp:p(i)}),y&&d[_].push({_attr:y}),d}return E=void 0!==c?c:void 0!==f?f:Array.isArray(g)?g[0]:p(t),d[_]=y?[{_attr:y},E]:E,d});t.memoizedCreateXMLExample=(0,c.default)(o),t.memoizedSampleFromSchema=(0,c.default)(f)},function(e,t){e.exports=require("xml")},function(e,t){e.exports=require("memoizee")},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(){return[u.default]}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var a=r(155),u=n(a)},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e={components:{App:k.default,authorizationPopup:R.default,authorizeBtn:M.default,authorizeOperationBtn:I.default,auths:U.default,authError:D.default,oauth2:H.default,apiKeyAuth:F.default,basicAuth:V.default,clear:K.default,liveResponse:Z.default,info:Te.default,onlineValidatorBadge:Q.default,operations:ee.default,operation:re.default,highlightCode:oe.default,responses:ue.default,response:se.default,responseBody:le.default,parameters:fe.default,parameterRow:ye.default,execute:me.default,headers:be.default,errors:_e.default,contentType:je.default,overview:Oe.default,footer:xe.default,ParamBody:ke.default,curl:Re.default,schemes:Me.default,modelExample:Ie.default,model:Ue.default,models:De.default,TryItOutButton:Fe.default}},t={components:Ve},r={components:He};return[O.default,m.default,f.default,l.default,u.default,s.default,y.default,e,t,_.default,r,j.default,b.default,T.default,x.default]};var a=r(156),u=o(a),i=r(176),s=o(i),c=r(180),l=o(c),p=r(186),f=o(p),d=r(237),y=o(d),h=r(238),m=o(h),v=r(239),b=o(v),g=r(250),_=o(g),E=r(252),j=o(E),w=r(258),O=o(w),P=r(260),T=o(P),S=r(266),x=o(S),C=r(267),k=o(C),A=r(268),R=o(A),q=r(269),M=o(q),N=r(270),I=o(N),z=r(272),U=o(z),L=r(273),D=o(L),J=r(274),F=o(J),B=r(275),V=o(B),W=r(276),H=o(W),$=r(278),K=o($),X=r(279),Z=o(X),G=r(280),Q=o(G),Y=r(281),ee=o(Y),te=r(283),re=o(te),ne=r(286),oe=o(ne),ae=r(287),ue=o(ae),ie=r(288),se=o(ie),ce=r(289),le=o(ce),pe=r(291),fe=o(pe),de=r(292),ye=o(de),he=r(293),me=o(he),ve=r(294),be=o(ve),ge=r(295),_e=o(ge),Ee=r(304),je=o(Ee),we=r(305),Oe=o(we),Pe=r(308),Te=o(Pe),Se=r(309),xe=o(Se),Ce=r(310),ke=o(Ce),Ae=r(311),Re=o(Ae),qe=r(313),Me=o(qe),Ne=r(314),Ie=o(Ne),ze=r(315),Ue=o(ze),Le=r(316),De=o(Le),Je=r(317),Fe=o(Je),Be=r(306),Ve=n(Be),We=r(318),He=n(We)},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{statePlugins:{err:{reducers:(0,u.default)(e),actions:s,selectors:l}}}};var a=r(157),u=o(a),i=r(11),s=n(i),c=r(174),l=n(c)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t;return t={},o(t,a.NEW_THROWN_ERR,function(t,r){var n=r.payload,o=Object.assign(f,n,{type:"thrown"});return t.update("errors",function(e){return(e||(0,s.List)()).push((0,s.fromJS)(o))}).update("errors",function(t){return(0,p.default)(t,e.getSystem())})}),o(t,a.NEW_THROWN_ERR_BATCH,function(t,r){var n=r.payload;return n=n.map(function(e){return(0,s.fromJS)(Object.assign(f,e,{type:"thrown"}))}),t.update("errors",function(e){return(e||(0,s.List)()).concat((0,s.fromJS)(n))}).update("errors",function(t){return(0,p.default)(t,e.getSystem())})}),o(t,a.NEW_SPEC_ERR,function(t,r){var n=r.payload,o=(0,s.fromJS)(n);return o=o.set("type","spec"),t.update("errors",function(e){return(e||(0,s.List)()).push((0,s.fromJS)(o)).sortBy(function(e){return e.get("line")})}).update("errors",function(t){return(0,p.default)(t,e.getSystem())})}),o(t,a.NEW_AUTH_ERR,function(t,r){var n=r.payload,o=(0,s.fromJS)(Object.assign({},n));return o=o.set("type","auth"),t.update("errors",function(e){return(e||(0,s.List)()).push((0,s.fromJS)(o))}).update("errors",function(t){return(0,p.default)(t,e.getSystem())})}),o(t,a.CLEAR,function(e,t){var r=t.payload;if(r){var n=c.default.fromJS((0,i.default)((e.get("errors")||(0,s.List)()).toJS(),r));return e.merge({errors:n})}}),t};var a=r(11),u=r(158),i=n(u),s=r(6),c=n(s),l=r(162),p=n(l),f={line:0,level:"error",message:"Unknown error"}},function(e,t,r){function n(e,t){var r=i(e)?o:a;return r(e,s(u(t,3)))}var o=r(159),a=r(160),u=r(81),i=r(23),s=r(161);e.exports=n},function(e,t){function r(e,t){for(var r=-1,n=null==e?0:e.length,o=0,a=[];++r-1||l.push({name:a(e).replace(".js","").replace("./",""),transform:c(e).transform}))})},function(e,t,r){function n(){var e=arguments.length;if(!e)return[];for(var t=Array(e-1),r=arguments[0],n=e;n--;)t[n-1]=arguments[n];return o(i(r)?u(r):[r],a(t,1))}var o=r(164),a=r(165),u=r(167),i=r(23);e.exports=n},function(e,t){function r(e,t){for(var r=-1,n=t.length,o=e.length;++r0&&r(l)?t>1?n(l,t-1,r,u,i):o(i,l):u||(i[i.length]=l)}return i}var o=r(164),a=r(166);e.exports=n},function(e,t,r){function n(e){return u(e)||a(e)||!!(i&&e&&e[i])}var o=r(19),a=r(105),u=r(23),i=o?o.isConcatSpreadable:void 0;e.exports=n},function(e,t){function r(e,t){var r=-1,n=e.length;for(t||(t=Array(n));++r-1){var o=e.get("message").slice(r+t.length).split(",");return e.set("message",e.get("message").slice(0,r)+n(o))}return e})}function n(e){return e.reduce(function(e,t,r,n){return r===n.length-1&&n.length>1?e+"or "+t:n[r+1]&&n.length>2?e+t+", ":n[r+1]?e+t+" ":e+t},"should be a")}Object.defineProperty(t,"__esModule",{value:!0}),t.transform=r},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){t.jsSpec;return e}Object.defineProperty(t,"__esModule",{value:!0}),t.transform=o;var a=r(130);n(a),r(6)},function(e,t){"use strict";function r(e){return e.map(function(e){return e.set("message",n(e.get("message"),"instance."))})}function n(e,t){return e.replace(new RegExp(t,"g"),"")}Object.defineProperty(t,"__esModule",{value:!0}),t.transform=r},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.lastError=t.allErrors=void 0;var n=r(6),o=r(175),a=function(e){return e},u=t.allErrors=(0,o.createSelector)(a,function(e){return e.get("errors",(0,n.List)())});t.lastError=(0,o.createSelector)(u,function(e){return e.last()})},function(e,t){e.exports=require("reselect")},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{statePlugins:{layout:{reducers:u.default,actions:s,selectors:l}}}};var a=r(177),u=o(a),i=r(178),s=n(i),c=r(179),l=n(c)},function(e,t,r){"use strict";function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}Object.defineProperty(t,"__esModule",{value:!0});var o,a=r(178);t.default=(o={},n(o,a.UPDATE_LAYOUT,function(e,t){return e.set("layout",t.payload)}),n(o,a.SHOW,function(e,t){var r=t.payload.thing,n=t.payload.shown;return e.setIn(["shown"].concat(r),n)}),n(o,a.UPDATE_MODE,function(e,t){var r=t.payload.thing,n=t.payload.mode;return e.setIn(["modes"].concat(r),(n||"")+"")}),o)},function(e,t,r){"use strict";function n(e){return{type:i,payload:e}}function o(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=(0,u.normalizeArray)(e),{type:c,payload:{thing:e,shown:t}}}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=(0,u.normalizeArray)(e),{type:s,payload:{thing:e,mode:t}}}Object.defineProperty(t,"__esModule",{value:!0}),t.SHOW=t.UPDATE_MODE=t.UPDATE_LAYOUT=void 0,t.updateLayout=n,t.show=o,t.changeMode=a;var u=r(13),i=t.UPDATE_LAYOUT="layout_update_layout",s=t.UPDATE_MODE="layout_update_mode",c=t.SHOW="layout_show"},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:"";return t=(0,a.normalizeArray)(t),e.getIn(["modes"].concat(n(t)),r)},t.showSummary=(0,o.createSelector)(u,function(e){return!i(e,"editor")})},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{statePlugins:{spec:{wrapActions:f,reducers:u.default,actions:s,selectors:l}}}};var a=r(181),u=o(a),i=r(182),s=n(i),c=r(184),l=n(c),p=r(185),f=n(p)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function a(e){return e instanceof Error?{type:w,error:!0,payload:e}:"string"==typeof e?{type:w,payload:e.replace(/\t/g," ")||""}:{type:w,payload:""}}function u(e){return{type:N,payload:e}}function i(e){return{type:O,payload:e}}function s(e){if(!e||"object"!==("undefined"==typeof e?"undefined":b(e)))throw new Error("updateJson must only accept a simple JSON object");return{type:P,payload:e}}function c(e,t,r,n){return{type:T,payload:{path:e,value:r,paramName:t,isXml:n}}}function l(e){return{type:S,payload:{pathMethod:e}}}function p(e){return{type:q,payload:{pathMethod:e}}}function f(e,t){return{type:M,payload:{path:e,value:t,key:"consumes_value"}}}function d(e,t){return{type:M,payload:{path:e,value:t,key:"produces_value"}}}function y(e,t){return{type:A,payload:{path:e,method:t}}}function h(e,t){return{type:R,payload:{path:e,method:t}}}function m(e,t,r){return{type:I,payload:{scheme:e,path:t,method:r}}}Object.defineProperty(t,"__esModule",{value:!0}),t.execute=t.executeRequest=t.logRequest=t.setRequest=t.setResponse=t.formatIntoYaml=t.resolveSpec=t.parseToJson=t.SET_SCHEME=t.UPDATE_RESOLVED=t.UPDATE_OPERATION_VALUE=t.ClEAR_VALIDATE_PARAMS=t.CLEAR_REQUEST=t.CLEAR_RESPONSE=t.LOG_REQUEST=t.SET_REQUEST=t.SET_RESPONSE=t.VALIDATE_PARAMS=t.UPDATE_PARAM=t.UPDATE_JSON=t.UPDATE_URL=t.UPDATE_SPEC=void 0; +var v=Object.assign||function(e){for(var t=1;t0){var o=r.map(function(e){return console.error(e),e.line=e.fullPath?l(p,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",Object.defineProperty(e,"message",{enumerable:!0,value:e.message}),e});a.newThrownErrBatch(o)}return n.updateResolved(t)})}},t.formatIntoYaml=function(){return function(e){var t=e.specActions,r=e.specSelectors,n=r.specStr,o=t.updateSpec;try{var a=_.default.safeDump(_.default.safeLoad(n()),{indent:2});o(a)}catch(e){o(e)}}},t.setResponse=function(e,t,r){return{payload:{path:e,method:t,res:r},type:x}},t.setRequest=function(e,t,r){return{payload:{path:e,method:t,req:r},type:C}},t.logRequest=function(e){return{payload:e,type:k}},t.executeRequest=function(e){return function(t){var r=t.fn,n=t.specActions,o=(t.errActions,e.pathName),a=e.method,u=Object.assign({},e);return o&&a&&(u.operationId=a.toLowerCase()+"-"+o),u=r.buildRequest(u),n.setRequest(e.pathName,e.method,u),r.execute(e).then(function(t){return n.setResponse(e.pathName,e.method,t)}).catch(function(t){return n.setResponse(e.pathName,e.method,{error:!0,err:(0,j.default)(t)})})}},function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,r=e.method,n=o(e,["path","method"]);return function(e){var o=e.fn.fetch,a=e.specSelectors,u=e.specActions,i=a.spec().toJS(),s=a.operationScheme(t,r),c=a.contentTypeValues([t,r]).toJS(),l=c.requestContentType,p=c.responseContentType,f=/xml/i.test(l),d=a.parameterValues([t,r],f).toJS();return u.executeRequest(v({fetch:o,spec:i,pathName:t,method:r,parameters:d,requestContentType:l,scheme:s,responseContentType:p},n))}});t.execute=z},function(e,t){e.exports=require("js-yaml")},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:"";if(f.List.isList(e))return e.some(function(e){return f.Map.isMap(e)&&e.get("in")===t})}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(f.List.isList(e))return e.some(function(e){return f.Map.isMap(e)&&e.get("type")===t})}function s(e,t){var r=b(e).getIn(["paths"].concat(n(t)),(0,f.fromJS)({})),o=r.get("parameters")||new f.List,a=i(o,"file")?"multipart/form-data":u(o,"formData")?"application/x-www-form-urlencoded":r.get("consumes_value");return(0,f.fromJS)({requestContentType:a,responseContentType:r.get("produces_value")})}function c(e,t){return b(e).getIn(["paths"].concat(n(t),["consumes"]),(0,f.fromJS)({}))}function l(e){return f.Map.isMap(e)?e:new f.Map}Object.defineProperty(t,"__esModule",{value:!0}),t.validateBeforeExecute=t.canExecuteScheme=t.operationScheme=t.hasHost=t.allowTryItOutFor=t.requestFor=t.responseFor=t.requests=t.responses=t.taggedOperations=t.operationsWithTags=t.tagDetails=t.tags=t.operationsWithRootInherited=t.schemes=t.host=t.basePath=t.definitions=t.findDefinition=t.securityDefinitions=t.security=t.produces=t.consumes=t.operations=t.paths=t.semver=t.version=t.externalDocs=t.info=t.spec=t.specResolved=t.specJson=t.specSource=t.specStr=t.url=t.lastError=void 0,t.getParameter=o,t.parameterValues=a,t.parametersIncludeIn=u,t.parametersIncludeType=i,t.contentTypeValues=s,t.operationConsumes=c;var p=r(175),f=r(6),d="default",y=["get","put","post","delete","options","head","patch"],h=function(e){return e||(0,f.Map)()},m=(t.lastError=(0,p.createSelector)(h,function(e){return e.get("lastError")}),t.url=(0,p.createSelector)(h,function(e){return e.get("url")}),t.specStr=(0,p.createSelector)(h,function(e){return e.get("spec")||""}),t.specSource=(0,p.createSelector)(h,function(e){return e.get("specSource")||"not-editor"}),t.specJson=(0,p.createSelector)(h,function(e){return e.get("json",(0,f.Map)())})),v=t.specResolved=(0,p.createSelector)(h,function(e){return e.get("resolved",(0,f.Map)())}),b=t.spec=function(e){var t=v(e);return t.count()<1&&(t=m(e)),t},g=t.info=(0,p.createSelector)(b,function(e){return l(e&&e.get("info"))}),_=(t.externalDocs=(0,p.createSelector)(b,function(e){return l(e&&e.get("externalDocs"))}),t.version=(0,p.createSelector)(g,function(e){return e&&e.get("version")})),E=(t.semver=(0,p.createSelector)(_,function(e){return/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(e).slice(1)}),t.paths=(0,p.createSelector)(b,function(e){return e.get("paths")})),j=t.operations=(0,p.createSelector)(E,function(e){if(!e||e.size<1)return(0,f.List)();var t=(0,f.List)();return e&&e.forEach?(e.forEach(function(e,r){return e&&e.forEach?void e.forEach(function(e,n){y.indexOf(n)!==-1&&(t=t.push((0,f.fromJS)({path:r,method:n,operation:e,id:n+"-"+r})))}):{}}),t):(0,f.List)()}),w=t.consumes=(0,p.createSelector)(b,function(e){return(0,f.Set)(e.get("consumes"))}),O=t.produces=(0,p.createSelector)(b,function(e){return(0,f.Set)(e.get("produces"))}),P=(t.security=(0,p.createSelector)(b,function(e){return e.get("security",(0,f.List)())}),t.securityDefinitions=(0,p.createSelector)(b,function(e){return e.get("securityDefinitions")}),t.findDefinition=function(e,t){return v(e).getIn(["definitions",t],null)},t.definitions=(0,p.createSelector)(b,function(e){return e.get("definitions")||(0,f.Map)()}),t.basePath=(0,p.createSelector)(b,function(e){return e.get("basePath")}),t.host=(0,p.createSelector)(b,function(e){return e.get("host")}),t.schemes=(0,p.createSelector)(b,function(e){return e.get("schemes",(0,f.Map)())}),t.operationsWithRootInherited=(0,p.createSelector)(j,w,O,function(e,t,r){return e.map(function(e){return e.update("operation",function(e){if(e){if(!f.Map.isMap(e))return;return e.withMutations(function(e){return e.get("consumes")||e.update("consumes",function(e){return(0,f.Set)(e).merge(t)}),e.get("produces")||e.update("produces",function(e){return(0,f.Set)(e).merge(r)}),e})}return(0,f.Map)()})})})),T=t.tags=(0,p.createSelector)(b,function(e){return e.get("tags",(0,f.List)())}),S=t.tagDetails=function(e,t){var r=T(e)||(0,f.List)();return r.filter(f.Map.isMap).find(function(e){return e.get("name")===t},(0,f.Map)())},x=t.operationsWithTags=(0,p.createSelector)(P,function(e){return e.reduce(function(e,t){var r=(0,f.Set)(t.getIn(["operation","tags"]));return r.count()<1?e.update(d,(0,f.List)(),function(e){return e.push(t)}):r.reduce(function(e,r){return e.update(r,(0,f.List)(),function(e){return e.push(t)})},e)},(0,f.Map)())}),C=(t.taggedOperations=(0,p.createSelector)(h,x,function(e,t){return t.map(function(t,r){return(0,f.Map)({tagDetails:S(e,r),operations:t})})}),t.responses=(0,p.createSelector)(h,function(e){return e.get("responses",(0,f.Map)())})),k=t.requests=(0,p.createSelector)(h,function(e){return e.get("requests",(0,f.Map)())}),A=(t.responseFor=function(e,t,r){return C(e).getIn([t,r],null)},t.requestFor=function(e,t,r){return k(e).getIn([t,r],null)},t.allowTryItOutFor=function(e,t,r){return!0},t.hasHost=(0,p.createSelector)(b,function(e){var t=e.get("host");return"string"==typeof t&&t.length>0&&"/"!==t[0]}),t.operationScheme=function(e,t,r){return e.getIn(["scheme",t,r])||e.getIn(["scheme","_defaultScheme"])||"http"});t.canExecuteScheme=function(e,t,r){return["http","https"].indexOf(A(e,t,r))>-1},t.validateBeforeExecute=function(e,t){var r=b(e).getIn(["paths"].concat(n(t),["parameters"]),(0,f.fromJS)([])),o=!0;return r.forEach(function(e){var t=e.get("errors");t&&t.count()&&(o=!1)}),o}},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.updateSpec=function(e,t){var r=t.specActions;return function(){e.apply(void 0,arguments),r.parseToJson.apply(r,arguments)}},t.updateJsonSpec=function(e,t){var r=t.specActions;return function(){e.apply(void 0,arguments),r.resolveSpec.apply(r,arguments)}},t.executeRequest=function(e,t){var r=t.specActions;return function(t){return r.logRequest(t),e(t)}}},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.getComponents,r=e.getStore,n=e.getSystem,o=a.getComponent,i=a.render,s=a.makeMappedContainer,c=(0,u.memoize)(o.bind(null,n,r,t)),l=(0,u.memoize)(s.bind(null,n,r,c,t));return{rootInjects:{getComponent:c,makeMappedContainer:l,render:i.bind(null,n,r,o,t)}}};var o=r(187),a=n(o),u=r(13)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.getComponent=t.render=t.makeMappedContainer=void 0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=Object.assign||function(e){for(var t=1;t1),t}),i(e,c(e),r),s&&(r=o(r,l|p|f));for(var d=t.length;d--;)a(r,t[d]);return r});e.exports=d},function(e,t,r){function n(e,t,r,S,x,C){var k,q=t&w,M=t&O,I=t&P;if(r&&(k=x?r(e,S,x,C):r(e)),void 0!==k)return k;if(!E(e))return e;var z=g(e);if(z){if(k=m(e),!q)return l(e,k)}else{var U=h(e),L=U==A||U==R;if(_(e))return c(e,q);if(U==N||U==T||L&&!x){if(k=M||L?{}:b(e),!q)return M?f(e,s(k,e)):p(e,i(k,e))}else{if(!Q[U])return x?e:{};k=v(e,U,n,q)}}C||(C=new o);var D=C.get(e);if(D)return D;C.set(e,k);var J=I?M?y:d:M?keysIn:j,F=z?void 0:J(e);return a(F||e,function(o,a){F&&(a=o,o=e[a]),u(k,a,n(o,t,r,a,e,C))}),k}var o=r(84),a=r(193),u=r(194),i=r(197),s=r(199),c=r(203),l=r(167),p=r(204),f=r(207),d=r(210),y=r(212),h=r(121),m=r(213),v=r(214),b=r(224),g=r(23),_=r(107),E=r(55),j=r(102),w=1,O=2,P=4,T="[object Arguments]",S="[object Array]",x="[object Boolean]",C="[object Date]",k="[object Error]",A="[object Function]",R="[object GeneratorFunction]",q="[object Map]",M="[object Number]",N="[object Object]",I="[object RegExp]",z="[object Set]",U="[object String]",L="[object Symbol]",D="[object WeakMap]",J="[object ArrayBuffer]",F="[object DataView]",B="[object Float32Array]",V="[object Float64Array]",W="[object Int8Array]",H="[object Int16Array]",$="[object Int32Array]",K="[object Uint8Array]",X="[object Uint8ClampedArray]",Z="[object Uint16Array]",G="[object Uint32Array]",Q={};Q[T]=Q[S]=Q[J]=Q[F]=Q[x]=Q[C]=Q[B]=Q[V]=Q[W]=Q[H]=Q[$]=Q[q]=Q[M]=Q[N]=Q[I]=Q[z]=Q[U]=Q[L]=Q[K]=Q[X]=Q[Z]=Q[G]=!0,Q[k]=Q[A]=Q[D]=!1,e.exports=n},function(e,t){function r(e,t){for(var r=-1,n=null==e?0:e.length;++r0){if(++t>=n)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var n=800,o=16,a=Date.now;e.exports=r},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{fn:a}};var o=r(151),a=n(o)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(e){for(var t,r=arguments.length,n=Array(r>1?r-1:0),a=1;a=u&&(t=console)[e].apply(t,n)}var r=e.configs,n={debug:0,info:1,log:2,warn:3,error:4},o=function(e){return n[e]||-1},a=r.logLevel,u=o(a);return t.warn=t.bind(null,"warn"),t.error=t.bind(null,"error"),t.info=t.bind(null,"info"),t.debug=t.bind(null,"debug"),{rootInjects:{log:t}}}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{fn:{AST:u},components:{JumpToPath:s.default}}};var a=r(240),u=o(a),i=r(249),s=n(i)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){function r(e,t,o){if(!e)return o&&o.start_mark?o.start_mark.line:0;if(t.length&&e.tag===v)for(n=0;n=t.column:t.line===e.start_mark.line?t.column>=e.start_mark.column:t.line===e.end_mark.line?t.column<=e.end_mark.column:e.start_mark.linet.line}var a=0;if(!e||[v,b].indexOf(e.tag)===-1)return o;if(e.tag===v)for(a=0;a-1?i[s?t[c]:c]:void 0}}var o=r(81),a=r(120),u=r(102);e.exports=n},function(e,t,r){function n(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var s=null==r?0:u(r);return s<0&&(s=i(n+s,0)),o(e,a(t,3),s)}var o=r(245),a=r(81),u=r(246),i=Math.max;e.exports=n},function(e,t){function r(e,t,r,n){for(var o=e.length,a=r+(n?1:-1);n?a--:++a=400?(u.updateLoadingStatus("failed"),o.newThrownErr(new Error(t.statusText+" "+e))):(u.updateLoadingStatus("success"),u.updateSpec(t.text),void u.updateUrl(e))}var o=r.errActions,a=r.specSelectors,u=r.specActions,i=t.fetch;e=e||a.url(),u.updateLoadingStatus("loading"),i(e,{headers:{Accept:"application/json"}}).then(n,n)}},updateLoadingStatus:function(e){var t=[null,"loading","failed","success","failedConfig"];return t.indexOf(e)===-1&&console.error("Error: "+e+" is not one of "+JSON.stringify(t)),{type:"spec_update_loading_status",payload:e}}}),n={spec_update_loading_status:function(e,t){return"string"==typeof t.payload?e.set("loadingStatus",t.payload):e}},u={loadingStatus:(0,o.createSelector)(function(e){return e||(0,a.Map)()},function(e){return e.get("loadingStatus")||null})};return{statePlugins:{spec:{actions:r,reducers:n,selectors:u}}}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n;var o=r(175),a=r(6)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r-1&&e.setState({scopes:e.state.scopes.filter(function(e){return e!==o})})},this.onInputChange=function(t){var r=t.target,n=r.dataset.name,a=r.value,u=o({},n,a);e.setState(u)},this.logout=function(t){t.preventDefault();var r=e.props,n=r.authActions,o=r.errActions,a=r.name;o.clear({authId:a,type:"auth",source:"auth"}),n.logout([a])}};t.default=v},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t,r,n){var o=e.schema,a=e.scopes,i=e.name,s=e.clientId,c=n.oauth2RedirectUrl,l=" ",p=i,f=o.get("flow"),d=void 0;return"password"===f?void t.authorizePassword(e):c?("implicit"!==f&&"accessCode"!==f||(d=o.get("authorizationUrl")+"?response_type="+("implicit"===f?"token":"code")),d+="&redirect_uri="+encodeURIComponent(c)+"&scope="+encodeURIComponent(a.join(l))+"&state="+encodeURIComponent(p)+"&client_id="+encodeURIComponent(s),u.default.swaggerUIRedirectOauth2={auth:e,state:p,callback:t.preAuthorizeOauth2,errCb:r.newAuthErr},void u.default.open(d)):void r.newAuthErr({authId:i,source:"validation",level:"error",message:"oauth2RedirectUri configuration is not passed. Oauth2 authorization cannot be performed."})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var a=r(12),u=n(a)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0){var I=!j.get(String(i.get("status")));i=i.set("notDocumented",I)}var z=this.state.tryItOutEnabled,U=this.isShown(),L=[n,o];return l.default.createElement("div",{className:_?"opblock opblock-deprecated":U?"opblock opblock-"+o+" is-open":"opblock opblock-"+o,id:t},l.default.createElement("div",{className:"opblock-summary opblock-summary-"+o,onClick:this.toggleShown},l.default.createElement("span",{className:"opblock-summary-method"},o.toUpperCase()),l.default.createElement("span",{className:_?"opblock-summary-path__deprecated":"opblock-summary-path"},l.default.createElement("span",null,n),l.default.createElement(R,{path:r})),u?l.default.createElement("div",{className:"opblock-summary-description"},b):null,w&&w.count()?l.default.createElement(A,{authActions:m,security:w,authSelectors:v}):null),l.default.createElement(q,{isOpened:U,animated:!0},l.default.createElement("div",{className:"opblock-body"},_&&l.default.createElement("h4",{className:"opblock-title_normal"}," Warning: Deprecated"),g&&l.default.createElement("div",{className:"opblock-description-wrapper"},l.default.createElement("div",{className:"opblock-description"},l.default.createElement(M,{options:{html:!0,typographer:!0,linkify:!0,linkTarget:"_blank"},source:g}))),E&&E.get("url")?l.default.createElement("div",{className:"opblock-external-docs-wrapper"},l.default.createElement("h4",{className:"opblock-title_normal"},"Find more details"),l.default.createElement("div",{className:"opblock-external-docs"},l.default.createElement("span",{className:"opblock-external-docs__description"},E.get("description")),l.default.createElement("a",{className:"opblock-external-docs__link",href:E.get("url")},E.get("url")))):null,l.default.createElement(x,{parameters:T,onChangeKey:L,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,tryItOutEnabled:z,allowTryItOut:c,fn:p,getComponent:f,specActions:y,specSelectors:h,pathMethod:[n,o]}),z&&c&&P&&P.size?l.default.createElement(N,{schemes:P,path:n,method:o,specActions:y}):null,l.default.createElement("div",{className:z&&i&&c?"btn-group":"execute-wrapper"},z&&c?l.default.createElement(C,{getComponent:f,operation:a,specActions:y,specSelectors:h,path:n,method:o,onExecute:this.onExecute}):null,z&&i&&c?l.default.createElement(k,{onClick:this.onClearClick,specActions:y,path:n,method:o}):null),this.state.executeInProgress?l.default.createElement("div",{className:"loading-container"},l.default.createElement("div",{className:"loading"})):null,j?l.default.createElement(S,{responses:j,request:s,tryItOutResponse:i,getComponent:f,specSelectors:h,specActions:y,produces:O,producesValue:a.get("produces_value"),pathMethod:[n,o],fn:p}):null)))}}]),t}(l.default.Component);m.propTypes={path:c.PropTypes.string.isRequired,method:c.PropTypes.string.isRequired,operation:c.PropTypes.object.isRequired,showSummary:c.PropTypes.bool,isShownKey:h.arrayOrString.isRequired,jumpToKey:h.arrayOrString.isRequired,allowTryItOut:c.PropTypes.bool,response:c.PropTypes.object,request:c.PropTypes.object,getComponent:c.PropTypes.func.isRequired,authActions:c.PropTypes.object,authSelectors:c.PropTypes.object,specActions:c.PropTypes.object.isRequired,specSelectors:c.PropTypes.object.isRequired,layoutActions:c.PropTypes.object.isRequired,layoutSelectors:c.PropTypes.object.isRequired,fn:c.PropTypes.object.isRequired},m.defaultProps={showSummary:!0,response:null,allowTryItOut:!0},t.default=m},function(e,t){e.exports=require("react-addons-shallow-compare")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.objectWithFuncs=t.arrayOrString=void 0;var n=r(188),o=function(e,t){return n.PropTypes.shape(e.reduce(function(e,r){return e[r]=t,e},{}))};t.arrayOrString=n.PropTypes.oneOfType([n.PropTypes.arrayOf(n.PropTypes.string),n.PropTypes.string]),t.objectWithFuncs=function(e){return o(e,n.PropTypes.func.isRequired)}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r1&&(g=E[1])}p=c.default.createElement("div",null,c.default.createElement("a",{href:v,download:g},"Download file"))}else p=c.default.createElement("pre",null,"Download headers detected but your browser does not support downloading binary via XHR (Blob).")}else p="string"==typeof t?c.default.createElement(i,{value:t}):c.default.createElement("div",null,"Unknown response type");return p?c.default.createElement("div",null,c.default.createElement("h5",null,"Response body"),p):null}}]),t}(c.default.Component);d.propTypes={content:s.PropTypes.any.isRequired,contentType:s.PropTypes.string.isRequired,getComponent:s.PropTypes.func.isRequired,headers:s.PropTypes.object,url:s.PropTypes.string},t.default=d},function(e,t,r){var n=r(37),o=n(function(e,t,r){return e+(r?" ":"")+t.toLowerCase()});e.exports=o},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r1&&u(e,t[0],t[1])?t=[]:r>2&&u(t[0],t[1],t[2])&&(t=[t[0]]),o(e,n(t,1),[])});e.exports=i},function(e,t,r){function n(e,t,r){var n=-1;t=o(t.length?t:[l],s(a));var p=u(e,function(e,r,a){var u=o(t,function(t){return t(e)});return{criteria:u,index:++n,value:e}});return i(p,function(e,t){return c(e,t,r)})}var o=r(22),a=r(81),u=r(299),i=r(300),s=r(114),c=r(301),l=r(140);e.exports=n},function(e,t,r){function n(e,t){var r=-1,n=a(e)?Array(e.length):[];return o(e,function(e,o,a){n[++r]=t(e,o,a)}),n}var o=r(145),a=r(120);e.exports=n},function(e,t){function r(e,t){var r=e.length;for(e.sort(t);r--;)e[r]=e[r].value;return e}e.exports=r},function(e,t,r){function n(e,t,r){for(var n=-1,a=e.criteria,u=t.criteria,i=a.length,s=r.length;++n=s)return c;var l=r[n];return c*("desc"==l?-1:1)}}return e.index-t.index}var o=r(302);e.exports=n},function(e,t,r){function n(e,t){if(e!==t){var r=void 0!==e,n=null===e,a=e===e,u=o(e),i=void 0!==t,s=null===t,c=t===t,l=o(t);if(!s&&!l&&!u&&e>t||u&&i&&c&&!s&&!l||n&&i&&c||!r&&c||!a)return 1;if(!n&&!u&&!l&&e=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(){for(var e=arguments.length,t=Array(e),r=0;r=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;tl,collapsedContent:j},f.default.createElement("span",{className:"brace-open object"},v),n?f.default.createElement(E,{name:r}):null,f.default.createElement("span",{className:"inner-object"},f.default.createElement("table",{className:"model",style:{marginLeft:"2em"}},f.default.createElement("tbody",null,d?f.default.createElement("tr",{style:{color:"#999",fontStyle:"italic"}},f.default.createElement("td",null,"description:"),f.default.createElement("td",null,d)):null,y&&y.size?y.entrySeq().map(function(e){var t=c(e,2),n=t[0],o=t[1],l=m.List.isList(_)&&_.contains(n),p={verticalAlign:"top",paddingRight:"0.2em"};return l&&(p.fontWeight="bold"),f.default.createElement("tr",{key:n},f.default.createElement("td",{style:p},n,":"),f.default.createElement("td",{style:{verticalAlign:"top"}},f.default.createElement(w,s({key:"object-"+r+"-"+n+"_"+o},i,{required:l,getComponent:a,schema:o,depth:u+1}))))}).toArray():null,h&&h.size?f.default.createElement("tr",null,f.default.createElement("td",null,"< * >:"),f.default.createElement("td",null,f.default.createElement(w,s({},i,{required:!1,getComponent:a,schema:h,depth:u+1})))):null))),f.default.createElement("span",{className:"brace-close"},b)))}}]),t}(p.Component);_.propTypes={schema:p.PropTypes.object.isRequired,getComponent:p.PropTypes.func.isRequired,specSelectors:p.PropTypes.object.isRequired,name:p.PropTypes.string,isRef:p.PropTypes.bool,expandDepth:p.PropTypes.number,depth:p.PropTypes.number};var E=function(e){function t(){return a(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return i(t,e),l(t,[{key:"render",value:function(){var e=this.props,t=e.schema,r=e.required;if(!t||!t.get)return f.default.createElement("div",null);var n=t.get("type"),o=t.get("format"),a=t.get("xml"),u=t.get("enum"),i=(t.get("description"),t.filter(function(e,t){return["enum","type","format","$$ref"].indexOf(t)===-1})),s=r?{fontWeight:"bold"}:{},l={color:"#999",fontStyle:"italic"};return f.default.createElement("span",{className:"prop"},f.default.createElement("span",{className:"prop-type",style:s},n)," ",r&&f.default.createElement("span",{style:{color:"red"}},"*"),o&&f.default.createElement("span",{className:"prop-format"},"($",o,")"),i.size?i.entrySeq().map(function(e){var t=c(e,2),r=t[0],n=t[1];return f.default.createElement("span",{key:r+"-"+n,style:l},f.default.createElement("br",null),"description"!==r&&r+": ",String(n))}):null,a&&a.size?f.default.createElement("span",null,f.default.createElement("br",null),f.default.createElement("span",{style:l},"xml:"),a.entrySeq().map(function(e){var t=c(e,2),r=t[0],n=t[1];return f.default.createElement("span",{key:r+"-"+n,style:l},f.default.createElement("br",null),"   ",r,": ",String(n))}).toArray()):null,u&&f.default.createElement(g,{value:u}))}}]),t}(p.Component);E.propTypes={schema:p.PropTypes.object.isRequired,required:p.PropTypes.bool};var j=function(e){function t(){return a(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return i(t,e),l(t,[{key:"render",value:function(){var e=this.props,t=e.required,r=e.schema,n=e.depth,o=e.expandDepth,a=r.get("items");return f.default.createElement("span",null,f.default.createElement(P,{collapsed:n>o,collapsedContent:"[...]"},"[",f.default.createElement("span",null,f.default.createElement(w,s({},this.props,{schema:a,required:!1}))),"]"),t&&f.default.createElement("span",{style:{color:"red"}},"*"))}}]),t}(p.Component);j.propTypes={schema:p.PropTypes.object.isRequired,getComponent:p.PropTypes.func.isRequired,specSelectors:p.PropTypes.object.isRequired,name:p.PropTypes.string,required:p.PropTypes.bool,expandDepth:p.PropTypes.number,depth:p.PropTypes.number};var w=function(e){function t(){var e,r,n,o;a(this,t);for(var i=arguments.length,s=Array(i),c=0;c=400?(n.updateLoadingStatus("failedConfig"),console.log(t.statusText+" "+a)):e(f(t.text))}var n=t.specActions,o=(0,s.parseSeach)(),a=o.config;if(a)return n.downloadConfig(a).then(r,r)}}},n={getLocalConfig:function(){return f(l.default)}};return{statePlugins:{spec:{actions:r,selectors:n}}}}function a(e){var t=void 0,r={};for(t in e)p.indexOf(t)!==-1&&(r[t]=e[t]);return r}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o,t.filterConfigs=a;var u=r(183),i=n(u),s=r(13),c=r(322),l=n(c),p=["url","spec","validatorUrl","onComplete","onFailure","authorizations","docExpansion","apisSorter","operationsSorter","supportedSubmitMethods","highlightSizeThreshold","dom_id","defaultModelRendering","oauth2RedirectUrl","showRequestHeaders"],f=function(e,t){try{return i.default.safeLoad(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t){e.exports='---\nurl: "http://petstore.swagger.io/v2/swagger.json"\ndom_id: "#swagger-ui"\nvalidatorUrl: "https://online.swagger.io/validator"\noauth2RedirectUrl: "http://localhost:3200/oauth2-redirect.html"\n'}]))}); +//# sourceMappingURL=swagger-ui.js.map \ No newline at end of file diff --git a/swagger/swagger-ui.js.map b/swagger/swagger-ui.js.map new file mode 100644 index 00000000..6e9d8657 --- /dev/null +++ b/swagger/swagger-ui.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAqnGA;AAg2HA;AA6+FA;AAgqCA;AAi+BA;AAyvCA;AA04BA","sourceRoot":""} \ No newline at end of file
    "+f+"