From d42c8b528eb595101954f478e0024e3f079f6fbf Mon Sep 17 00:00:00 2001
From: schneefux
Date: Wed, 22 Mar 2017 19:19:26 +0100
Subject: first implementation of fun stats site
---
.gitignore | 91 +
app.py | 62 +
templates/assets/.DS_Store | Bin 0 -> 10244 bytes
.../assets/bootstrap-material-design/.bower.json | 40 +
.../assets/bootstrap-material-design/.travis.yml | 29 +
.../assets/bootstrap-material-design/LICENSE.md | 30 +
.../assets/bootstrap-material-design/README.md | 6 +
.../assets/bootstrap-material-design/bower.json | 29 +
.../bootstrap-material-design/js/autofill.js | 109 +
.../assets/bootstrap-material-design/js/base.js | 88 +
.../js/baseFormControl.js | 36 +
.../bootstrap-material-design/js/baseInput.js | 321 +
.../bootstrap-material-design/js/baseLayout.js | 122 +
.../bootstrap-material-design/js/baseSelection.js | 93 +
.../js/bootstrapMaterialDesign.js | 205 +
.../bootstrap-material-design/js/checkbox.js | 94 +
.../bootstrap-material-design/js/checkboxInline.js | 89 +
.../bootstrap-material-design/js/collapseInline.js | 113 +
.../assets/bootstrap-material-design/js/drawer.js | 170 +
.../assets/bootstrap-material-design/js/file.js | 139 +
.../assets/bootstrap-material-design/js/index.js | 32 +
.../assets/bootstrap-material-design/js/radio.js | 95 +
.../bootstrap-material-design/js/radioInline.js | 77 +
.../assets/bootstrap-material-design/js/ripples.js | 311 +
.../assets/bootstrap-material-design/js/select.js | 94 +
.../assets/bootstrap-material-design/js/switch.js | 72 +
.../assets/bootstrap-material-design/js/text.js | 89 +
.../bootstrap-material-design/js/textarea.js | 89 +
.../assets/bootstrap-material-design/js/util.js | 105 +
.../assets/bootstrap-material-design/package.json | 60 +
.../bootstrap-material-design/scss/_alerts.scss | 4 +
.../bootstrap-material-design/scss/_buttons.scss | 233 +
.../bootstrap-material-design/scss/_cards.scss | 58 +
.../scss/_checkboxes.scss | 256 +
.../scss/_core-bootstrap.scss | 68 +
.../bootstrap-material-design/scss/_core.scss | 33 +
.../scss/_custom-forms.scss | 10 +
.../bootstrap-material-design/scss/_drawer.scss | 122 +
.../bootstrap-material-design/scss/_dropdown.scss | 126 +
.../scss/_extensions.scss | 3 +
.../bootstrap-material-design/scss/_forms.scss | 221 +
.../scss/_input-group.scss | 39 +
.../bootstrap-material-design/scss/_layout.scss | 80 +
.../scss/_list-group.scss | 100 +
.../bootstrap-material-design/scss/_mixins.scss | 10 +
.../bootstrap-material-design/scss/_modal.scss | 26 +
.../bootstrap-material-design/scss/_nav.scss | 54 +
.../bootstrap-material-design/scss/_navbar.scss | 31 +
.../scss/_pagination.scss | 52 +
.../bootstrap-material-design/scss/_popover.scss | 19 +
.../bootstrap-material-design/scss/_progress.scss | 11 +
.../bootstrap-material-design/scss/_radios.scss | 119 +
.../bootstrap-material-design/scss/_reboot.scss | 25 +
.../bootstrap-material-design/scss/_ripples.scss | 40 +
.../bootstrap-material-design/scss/_switches.scss | 83 +
.../bootstrap-material-design/scss/_tables.scss | 26 +
.../bootstrap-material-design/scss/_themes.scss | 6 +
.../bootstrap-material-design/scss/_type.scss | 6 +
.../bootstrap-material-design/scss/_variables.scss | 139 +
.../scss/bootstrap-material-design.scss | 3 +
.../scss/extensions/_selectize.scss | 91 +
.../scss/extensions/_snackbarjs.scss | 27 +
.../scss/mixins/_animations.scss | 21 +
.../scss/mixins/_breakpoints.scss | 34 +
.../scss/mixins/_buttons.scss | 218 +
.../scss/mixins/_drawer.scss | 237 +
.../scss/mixins/_forms.scss | 283 +
.../scss/mixins/_hover.scss | 9 +
.../scss/mixins/_layout.scss | 17 +
.../scss/mixins/_navs.scss | 23 +
.../scss/mixins/_type.scss | 11 +
.../scss/mixins/_utilities.scss | 35 +
.../scss/variables/_colors-map.scss | 311 +
.../scss/variables/_colors.scss | 356 +
.../scss/variables/_drawer.scss | 5 +
.../scss/variables/_layout.scss | 1 +
.../scss/variables/_menu.scss | 18 +
.../scss/variables/_shadow.scss | 35 +
.../scss/variables/bootstrap/_body.scss | 6 +
.../scss/variables/bootstrap/_brand.scss | 6 +
.../scss/variables/bootstrap/_buttons.scss | 77 +
.../scss/variables/bootstrap/_card.scss | 13 +
.../scss/variables/bootstrap/_code.scss | 12 +
.../scss/variables/bootstrap/_components.scss | 16 +
.../scss/variables/bootstrap/_custom-forms.scss | 5 +
.../scss/variables/bootstrap/_dropdown.scss | 20 +
.../scss/variables/bootstrap/_forms.scss | 47 +
.../scss/variables/bootstrap/_list-group.scss | 21 +
.../scss/variables/bootstrap/_modals.scss | 20 +
.../scss/variables/bootstrap/_nav.scss | 62 +
.../scss/variables/bootstrap/_pagination.scss | 6 +
.../scss/variables/bootstrap/_spacing.scss | 26 +
.../scss/variables/bootstrap/_state.scss | 15 +
.../scss/variables/bootstrap/_type.scss | 66 +
templates/assets/bootstrap/.bower.json | 44 +
templates/assets/bootstrap/CHANGELOG.md | 5 +
templates/assets/bootstrap/Gemfile | 8 +
templates/assets/bootstrap/Gemfile.lock | 58 +
templates/assets/bootstrap/Gruntfile.js | 321 +
templates/assets/bootstrap/ISSUE_TEMPLATE.md | 22 +
templates/assets/bootstrap/LICENSE | 22 +
templates/assets/bootstrap/README.md | 149 +
templates/assets/bootstrap/bower.json | 35 +
templates/assets/bootstrap/grunt/change-version.js | 110 +
templates/assets/bootstrap/grunt/gcp-key.json.enc | Bin 0 -> 2304 bytes
.../assets/bootstrap/grunt/npm-shrinkwrap.json | 4164 +++++++++
templates/assets/bootstrap/grunt/postcss.config.js | 41 +
.../assets/bootstrap/grunt/sauce_browsers.yml | 84 +
templates/assets/bootstrap/grunt/upload-preview.sh | 27 +
templates/assets/bootstrap/js/.eslintrc.json | 240 +
templates/assets/bootstrap/js/src/alert.js | 193 +
templates/assets/bootstrap/js/src/button.js | 176 +
templates/assets/bootstrap/js/src/carousel.js | 497 +
templates/assets/bootstrap/js/src/collapse.js | 393 +
templates/assets/bootstrap/js/src/dropdown.js | 307 +
templates/assets/bootstrap/js/src/modal.js | 545 ++
templates/assets/bootstrap/js/src/popover.js | 179 +
templates/assets/bootstrap/js/src/scrollspy.js | 335 +
templates/assets/bootstrap/js/src/tab.js | 284 +
templates/assets/bootstrap/js/src/tooltip.js | 675 ++
templates/assets/bootstrap/js/src/util.js | 164 +
templates/assets/bootstrap/nuget/MyGet.ps1 | 18 +
templates/assets/bootstrap/nuget/bootstrap.nuspec | 27 +
.../assets/bootstrap/nuget/bootstrap.sass.nuspec | 27 +
templates/assets/bootstrap/package.js | 19 +
templates/assets/bootstrap/package.json | 114 +
templates/assets/bootstrap/sache.json | 5 +
templates/assets/bootstrap/scss/.scss-lint.yml | 536 ++
templates/assets/bootstrap/scss/_alert.scss | 55 +
templates/assets/bootstrap/scss/_badge.scss | 76 +
templates/assets/bootstrap/scss/_breadcrumb.scss | 38 +
templates/assets/bootstrap/scss/_button-group.scss | 204 +
templates/assets/bootstrap/scss/_buttons.scss | 170 +
templates/assets/bootstrap/scss/_card.scss | 276 +
templates/assets/bootstrap/scss/_carousel.scss | 177 +
templates/assets/bootstrap/scss/_close.scss | 29 +
templates/assets/bootstrap/scss/_code.scss | 64 +
templates/assets/bootstrap/scss/_custom-forms.scss | 258 +
templates/assets/bootstrap/scss/_custom.scss | 4 +
templates/assets/bootstrap/scss/_dropdown.scss | 156 +
templates/assets/bootstrap/scss/_forms.scss | 387 +
templates/assets/bootstrap/scss/_grid.scss | 52 +
templates/assets/bootstrap/scss/_images.scss | 43 +
templates/assets/bootstrap/scss/_input-group.scss | 175 +
templates/assets/bootstrap/scss/_jumbotron.scss | 20 +
templates/assets/bootstrap/scss/_list-group.scss | 116 +
templates/assets/bootstrap/scss/_media.scss | 8 +
templates/assets/bootstrap/scss/_mixins.scss | 43 +
templates/assets/bootstrap/scss/_modal.scss | 142 +
templates/assets/bootstrap/scss/_nav.scss | 120 +
templates/assets/bootstrap/scss/_navbar.scss | 276 +
templates/assets/bootstrap/scss/_pagination.scss | 67 +
templates/assets/bootstrap/scss/_popover.scss | 171 +
templates/assets/bootstrap/scss/_print.scss | 119 +
templates/assets/bootstrap/scss/_progress.scss | 30 +
templates/assets/bootstrap/scss/_reboot.scss | 484 +
.../assets/bootstrap/scss/_responsive-embed.scss | 52 +
templates/assets/bootstrap/scss/_tables.scss | 169 +
templates/assets/bootstrap/scss/_tooltip.scss | 90 +
templates/assets/bootstrap/scss/_transitions.scss | 34 +
templates/assets/bootstrap/scss/_type.scss | 143 +
templates/assets/bootstrap/scss/_utilities.scss | 13 +
templates/assets/bootstrap/scss/_variables.scss | 921 ++
.../assets/bootstrap/scss/bootstrap-grid.scss | 37 +
.../assets/bootstrap/scss/bootstrap-reboot.scss | 9 +
templates/assets/bootstrap/scss/bootstrap.scss | 52 +
templates/assets/bootstrap/scss/mixins/_alert.scss | 14 +
.../bootstrap/scss/mixins/_background-variant.scss | 12 +
templates/assets/bootstrap/scss/mixins/_badge.scss | 11 +
.../bootstrap/scss/mixins/_border-radius.scss | 35 +
.../assets/bootstrap/scss/mixins/_box-shadow.scss | 5 +
.../assets/bootstrap/scss/mixins/_breakpoints.scss | 95 +
.../assets/bootstrap/scss/mixins/_buttons.scss | 86 +
templates/assets/bootstrap/scss/mixins/_cards.scss | 47 +
.../assets/bootstrap/scss/mixins/_clearfix.scss | 7 +
templates/assets/bootstrap/scss/mixins/_float.scss | 9 +
templates/assets/bootstrap/scss/mixins/_forms.scss | 55 +
.../assets/bootstrap/scss/mixins/_gradients.scss | 37 +
.../bootstrap/scss/mixins/_grid-framework.scss | 65 +
templates/assets/bootstrap/scss/mixins/_grid.scss | 100 +
templates/assets/bootstrap/scss/mixins/_hover.scss | 60 +
templates/assets/bootstrap/scss/mixins/_image.scss | 36 +
.../assets/bootstrap/scss/mixins/_list-group.scss | 26 +
templates/assets/bootstrap/scss/mixins/_lists.scss | 7 +
.../assets/bootstrap/scss/mixins/_nav-divider.scss | 10 +
.../bootstrap/scss/mixins/_navbar-align.scss | 9 +
.../assets/bootstrap/scss/mixins/_pagination.scss | 21 +
.../assets/bootstrap/scss/mixins/_reset-text.scss | 18 +
.../assets/bootstrap/scss/mixins/_resize.scss | 6 +
.../bootstrap/scss/mixins/_screen-reader.scss | 35 +
templates/assets/bootstrap/scss/mixins/_size.scss | 6 +
.../assets/bootstrap/scss/mixins/_table-row.scss | 30 +
.../bootstrap/scss/mixins/_text-emphasis.scss | 12 +
.../assets/bootstrap/scss/mixins/_text-hide.scss | 8 +
.../bootstrap/scss/mixins/_text-truncate.scss | 8 +
.../assets/bootstrap/scss/mixins/_transforms.scss | 14 +
.../assets/bootstrap/scss/mixins/_transition.scss | 9 +
.../assets/bootstrap/scss/mixins/_visibility.scss | 5 +
.../assets/bootstrap/scss/utilities/_align.scss | 6 +
.../bootstrap/scss/utilities/_background.scss | 19 +
.../assets/bootstrap/scss/utilities/_borders.scss | 37 +
.../assets/bootstrap/scss/utilities/_clearfix.scss | 3 +
.../assets/bootstrap/scss/utilities/_display.scss | 53 +
.../assets/bootstrap/scss/utilities/_flex.scss | 48 +
.../assets/bootstrap/scss/utilities/_float.scss | 9 +
.../assets/bootstrap/scss/utilities/_position.scss | 23 +
.../bootstrap/scss/utilities/_screenreaders.scss | 11 +
.../assets/bootstrap/scss/utilities/_sizing.scss | 10 +
.../assets/bootstrap/scss/utilities/_spacing.scss | 41 +
.../assets/bootstrap/scss/utilities/_text.scss | 61 +
.../bootstrap/scss/utilities/_visibility.scss | 11 +
templates/assets/images/items/aegis.png | Bin 0 -> 19322 bytes
templates/assets/images/items/aftershock.png | Bin 0 -> 22083 bytes
.../assets/images/items/alternating-current.png | Bin 0 -> 22617 bytes
templates/assets/images/items/atlas-pauldron.png | Bin 0 -> 23389 bytes
templates/assets/images/items/barbed-needle.png | Bin 0 -> 21230 bytes
templates/assets/images/items/blazing-salvo.png | Bin 0 -> 18369 bytes
templates/assets/images/items/bonesaw.png | Bin 0 -> 23268 bytes
templates/assets/images/items/book-of-eulogies.png | Bin 0 -> 21908 bytes
templates/assets/images/items/breaking-point.png | Bin 0 -> 22995 bytes
templates/assets/images/items/broken-myth.png | Bin 0 -> 20976 bytes
templates/assets/images/items/chronograph.png | Bin 0 -> 22940 bytes
templates/assets/images/items/clockwork.png | Bin 0 -> 25189 bytes
templates/assets/images/items/coat-of-plates.png | Bin 0 -> 23762 bytes
templates/assets/images/items/contraption.png | Bin 0 -> 39535 bytes
templates/assets/images/items/crucible.png | Bin 0 -> 22502 bytes
templates/assets/images/items/crystal-bit.png | Bin 0 -> 17129 bytes
templates/assets/images/items/crystal-infusion.png | Bin 0 -> 22131 bytes
templates/assets/images/items/dragon-heart.png | Bin 0 -> 39947 bytes
.../assets/images/items/dragonblood-contract.png | Bin 0 -> 30790 bytes
templates/assets/images/items/echo.png | Bin 0 -> 46264 bytes
templates/assets/images/items/eclipse-prism.png | Bin 0 -> 20643 bytes
templates/assets/images/items/energy-battery.png | Bin 0 -> 16888 bytes
templates/assets/images/items/eve-of-harvest.png | Bin 0 -> 20851 bytes
templates/assets/images/items/flare-gun.png | Bin 0 -> 30178 bytes
templates/assets/images/items/flare.png | Bin 0 -> 16840 bytes
.../assets/images/items/fountain-of-renewal.png | Bin 0 -> 21872 bytes
templates/assets/images/items/frostburn.png | Bin 0 -> 23201 bytes
templates/assets/images/items/halcyon-chargers.png | Bin 0 -> 29937 bytes
templates/assets/images/items/halcyon-potion.png | Bin 0 -> 18093 bytes
templates/assets/images/items/heavy-prism.png | Bin 0 -> 20052 bytes
templates/assets/images/items/heavy-steel.png | Bin 0 -> 19149 bytes
templates/assets/images/items/hour-glass.png | Bin 0 -> 19167 bytes
.../assets/images/items/ironguard-contract.png | Bin 0 -> 30429 bytes
templates/assets/images/items/journey-boots.png | Bin 0 -> 21534 bytes
templates/assets/images/items/kinetic-shield.png | Bin 0 -> 19986 bytes
templates/assets/images/items/level-juice.png | Bin 0 -> 39265 bytes
templates/assets/images/items/lifespring.png | Bin 0 -> 22698 bytes
templates/assets/images/items/light-armor.png | Bin 0 -> 23137 bytes
templates/assets/images/items/light-shield.png | Bin 0 -> 19073 bytes
templates/assets/images/items/lucky-strike.png | Bin 0 -> 20864 bytes
templates/assets/images/items/metal-jacket.png | Bin 0 -> 23441 bytes
templates/assets/images/items/minion-candy.png | Bin 0 -> 18688 bytes
templates/assets/images/items/minions-foot.png | Bin 0 -> 31219 bytes
.../assets/images/items/nullwave-gauntlet.png | Bin 0 -> 40802 bytes
templates/assets/images/items/oak-heart.png | Bin 0 -> 36045 bytes
templates/assets/images/items/piercing-shard.png | Bin 0 -> 20772 bytes
templates/assets/images/items/piercing-spear.png | Bin 0 -> 20240 bytes
templates/assets/images/items/poisoned-shiv.png | Bin 0 -> 38375 bytes
templates/assets/images/items/pot-of-gold.png | Bin 0 -> 37175 bytes
.../assets/images/items/protector-contract.png | Bin 0 -> 27988 bytes
templates/assets/images/items/reflex-block.png | Bin 0 -> 23995 bytes
templates/assets/images/items/scout-trap.png | Bin 0 -> 17566 bytes
templates/assets/images/items/serpent-mask.png | Bin 0 -> 23338 bytes
templates/assets/images/items/shatter-glass.png | Bin 0 -> 20011 bytes
templates/assets/images/items/shiversteel.png | Bin 0 -> 21307 bytes
templates/assets/images/items/six-sins.png | Bin 0 -> 21977 bytes
templates/assets/images/items/slumbering-husk.png | Bin 0 -> 41172 bytes
templates/assets/images/items/sorrow-blade.png | Bin 0 -> 23440 bytes
templates/assets/images/items/sprint-boots.png | Bin 0 -> 19904 bytes
templates/assets/images/items/stormcrown.png | Bin 0 -> 30233 bytes
.../assets/images/items/stormguard-banner.png | Bin 0 -> 23057 bytes
templates/assets/images/items/swift-shooter.png | Bin 0 -> 17836 bytes
templates/assets/images/items/tension-bow.png | Bin 0 -> 21725 bytes
templates/assets/images/items/tornado-trigger.png | Bin 0 -> 21436 bytes
templates/assets/images/items/travel-boots.png | Bin 0 -> 21182 bytes
templates/assets/images/items/tyrants-monocle.png | Bin 0 -> 23363 bytes
templates/assets/images/items/void-battery.png | Bin 0 -> 20194 bytes
templates/assets/images/items/war-treads.png | Bin 0 -> 29666 bytes
templates/assets/images/items/weapon-blade.png | Bin 0 -> 15893 bytes
templates/assets/images/items/weapon-infusion.png | Bin 0 -> 22134 bytes
templates/assets/jquery/.bower.json | 25 +
templates/assets/jquery/AUTHORS.txt | 278 +
templates/assets/jquery/LICENSE.txt | 36 +
templates/assets/jquery/README.md | 65 +
templates/assets/jquery/bower.json | 14 +
.../assets/jquery/external/sizzle/LICENSE.txt | 36 +
templates/assets/jquery/src/.jshintrc | 29 +
templates/assets/jquery/src/ajax.js | 845 ++
templates/assets/jquery/src/ajax/jsonp.js | 100 +
templates/assets/jquery/src/ajax/load.js | 83 +
templates/assets/jquery/src/ajax/parseJSON.js | 13 +
templates/assets/jquery/src/ajax/parseXML.js | 27 +
templates/assets/jquery/src/ajax/script.js | 68 +
templates/assets/jquery/src/ajax/xhr.js | 167 +
templates/assets/jquery/src/attributes.js | 11 +
templates/assets/jquery/src/attributes/attr.js | 142 +
templates/assets/jquery/src/attributes/classes.js | 177 +
templates/assets/jquery/src/attributes/prop.js | 125 +
templates/assets/jquery/src/attributes/support.js | 36 +
templates/assets/jquery/src/attributes/val.js | 177 +
templates/assets/jquery/src/callbacks.js | 232 +
templates/assets/jquery/src/core.js | 494 +
templates/assets/jquery/src/core/access.js | 65 +
templates/assets/jquery/src/core/init.js | 134 +
templates/assets/jquery/src/core/parseHTML.js | 41 +
templates/assets/jquery/src/core/ready.js | 103 +
templates/assets/jquery/src/css.js | 502 +
templates/assets/jquery/src/css/addGetHookIf.js | 24 +
templates/assets/jquery/src/css/adjustCSS.js | 65 +
templates/assets/jquery/src/css/curCSS.js | 60 +
templates/assets/jquery/src/css/defaultDisplay.js | 72 +
.../jquery/src/css/hiddenVisibleSelectors.js | 18 +
templates/assets/jquery/src/css/showHide.js | 48 +
templates/assets/jquery/src/css/support.js | 121 +
templates/assets/jquery/src/data.js | 187 +
templates/assets/jquery/src/data/Data.js | 200 +
templates/assets/jquery/src/deferred.js | 158 +
templates/assets/jquery/src/deprecated.js | 32 +
templates/assets/jquery/src/dimensions.js | 54 +
templates/assets/jquery/src/effects.js | 629 ++
templates/assets/jquery/src/effects/Tween.js | 121 +
.../assets/jquery/src/effects/animatedSelector.js | 13 +
templates/assets/jquery/src/event.js | 711 ++
templates/assets/jquery/src/event/ajax.js | 20 +
templates/assets/jquery/src/event/alias.js | 27 +
templates/assets/jquery/src/event/focusin.js | 53 +
templates/assets/jquery/src/event/support.js | 9 +
templates/assets/jquery/src/event/trigger.js | 183 +
templates/assets/jquery/src/exports/amd.js | 24 +
templates/assets/jquery/src/exports/global.js | 26 +
templates/assets/jquery/src/intro.js | 44 +
templates/assets/jquery/src/jquery.js | 37 +
templates/assets/jquery/src/manipulation.js | 481 +
.../assets/jquery/src/manipulation/_evalUrl.js | 20 +
.../jquery/src/manipulation/buildFragment.js | 102 +
templates/assets/jquery/src/manipulation/getAll.js | 21 +
.../jquery/src/manipulation/setGlobalEval.js | 20 +
.../assets/jquery/src/manipulation/support.js | 33 +
.../assets/jquery/src/manipulation/wrapMap.js | 27 +
templates/assets/jquery/src/offset.js | 218 +
templates/assets/jquery/src/outro.js | 2 +
templates/assets/jquery/src/queue.js | 143 +
templates/assets/jquery/src/queue/delay.js | 22 +
templates/assets/jquery/src/selector-native.js | 211 +
templates/assets/jquery/src/selector-sizzle.js | 14 +
templates/assets/jquery/src/selector.js | 1 +
templates/assets/jquery/src/serialize.js | 125 +
templates/assets/jquery/src/traversing.js | 175 +
.../assets/jquery/src/traversing/findFilter.js | 100 +
templates/assets/jquery/src/wrap.js | 79 +
templates/assets/sass/.DS_Store | Bin 0 -> 6148 bytes
templates/assets/sass/material-kit.scss | 24 +
templates/assets/sass/material-kit/.DS_Store | Bin 0 -> 6148 bytes
templates/assets/sass/material-kit/_alerts.scss | 41 +
templates/assets/sass/material-kit/_buttons.scss | 245 +
templates/assets/sass/material-kit/_cards.scss | 164 +
templates/assets/sass/material-kit/_carousel.scss | 52 +
.../assets/sass/material-kit/_checkboxes.scss | 195 +
templates/assets/sass/material-kit/_colors.scss | 326 +
templates/assets/sass/material-kit/_core.scss | 115 +
templates/assets/sass/material-kit/_dialogs.scss | 69 +
templates/assets/sass/material-kit/_dividers.scss | 73 +
templates/assets/sass/material-kit/_dropdown.scss | 58 +
.../assets/sass/material-kit/_example-pages.scss | 236 +
templates/assets/sass/material-kit/_footers.scss | 38 +
templates/assets/sass/material-kit/_form.scss | 42 +
templates/assets/sass/material-kit/_images.scss | 6 +
.../assets/sass/material-kit/_import-bs-less.scss | 4 +
.../assets/sass/material-kit/_import-bs-sass.scss | 2 +
.../assets/sass/material-kit/_info-areas.scss | 38 +
.../assets/sass/material-kit/_inputs-size.scss | 223 +
templates/assets/sass/material-kit/_inputs.scss | 369 +
templates/assets/sass/material-kit/_labels.scss | 10 +
templates/assets/sass/material-kit/_lists.scss | 104 +
templates/assets/sass/material-kit/_mixins.scss | 326 +
templates/assets/sass/material-kit/_navbar.scss | 287 +
.../assets/sass/material-kit/_pagination.scss | 91 +
templates/assets/sass/material-kit/_panels.scss | 23 +
templates/assets/sass/material-kit/_pills.scss | 91 +
templates/assets/sass/material-kit/_popups.scss | 72 +
templates/assets/sass/material-kit/_progress.scss | 28 +
templates/assets/sass/material-kit/_radios.scss | 114 +
templates/assets/sass/material-kit/_ripples.scss | 36 +
templates/assets/sass/material-kit/_sections.scss | 13 +
templates/assets/sass/material-kit/_shadows.scss | 138 +
templates/assets/sass/material-kit/_tabs.scss | 53 +
.../assets/sass/material-kit/_togglebutton.scss | 87 +
.../assets/sass/material-kit/_typography.scss | 66 +
templates/assets/sass/material-kit/_variables.scss | 198 +
.../sass/material-kit/_variables_bootstrap.scss | 882 ++
templates/assets/sass/material-kit/_welljumbo.scss | 28 +
.../material-kit/plugins/_plugin-datepicker.scss | 220 +
.../material-kit/plugins/_plugin-dropdownjs.scss | 17 +
.../material-kit/plugins/_plugin-nouislider.scss | 161 +
.../material-kit/plugins/_plugin-selectize.scss | 93 +
.../material-kit/plugins/_plugin-snackbarjs.scss | 34 +
templates/assets/tether/.bower.json | 35 +
templates/assets/tether/CHANGELOG.md | 13 +
templates/assets/tether/CONTRIBUTING.md | 59 +
templates/assets/tether/LICENSE | 8 +
templates/assets/tether/README.md | 106 +
templates/assets/tether/bower.json | 26 +
templates/assets/tether/component.json | 22 +
.../docs/1-Overview/1-why_you_should_use_tether.md | 43 +
.../tether/docs/1-Overview/2-repositioning.md | 46 +
.../docs/1-Overview/3-why_we_dont_support_IE_8.md | 47 +
.../tether/docs/2-Examples/1-list_of_examples.md | 27 +
.../docs/2-Examples/2-projects_using_tether.md | 37 +
.../tether/docs/3-Advanced/1-embedding_tether.md | 9 +
.../tether/docs/3-Advanced/2-extending_tether.md | 54 +
templates/assets/tether/docs/coffee/intro.coffee | 113 +
templates/assets/tether/docs/css/intro.css | 218 +
templates/assets/tether/docs/intro.md | 591 ++
templates/assets/tether/docs/js/intro.js | 117 +
templates/assets/tether/docs/js/markAttachment.js | 51 +
templates/assets/tether/docs/sass/intro.sass | 233 +
.../assets/tether/docs/welcome/browser-demo.html | 76 +
.../tether/docs/welcome/coffee/welcome.coffee | 212 +
.../tether/docs/welcome/css/browser-demo.css | 86 +
templates/assets/tether/docs/welcome/css/prism.css | 2 +
.../assets/tether/docs/welcome/css/welcome.css | 247 +
templates/assets/tether/docs/welcome/index.html | 226 +
templates/assets/tether/docs/welcome/js/drop.js | 239 +
templates/assets/tether/docs/welcome/js/jquery.js | 9597 ++++++++++++++++++++
templates/assets/tether/docs/welcome/js/log.js | 134 +
.../assets/tether/docs/welcome/js/tether-v0.1.3.js | 2 +
templates/assets/tether/docs/welcome/js/welcome.js | 193 +
.../tether/docs/welcome/sass/_inline-block.sass | 6 +
.../tether/docs/welcome/sass/browser-demo.sass | 93 +
.../assets/tether/docs/welcome/sass/welcome.sass | 285 +
.../tether/examples/chosen/chosen-sprite.png | Bin 0 -> 646 bytes
.../tether/examples/chosen/chosen-sprite@2x.png | Bin 0 -> 738 bytes
templates/assets/tether/examples/chosen/chosen.css | 430 +
templates/assets/tether/examples/chosen/chosen.js | 1166 +++
templates/assets/tether/examples/chosen/index.html | 110 +
.../assets/tether/examples/common/css/style.css | 48 +
.../tether/examples/content-visible/index.html | 64 +
templates/assets/tether/examples/dolls/dolls.css | 18 +
templates/assets/tether/examples/dolls/dolls.js | 83 +
templates/assets/tether/examples/dolls/index.html | 7 +
.../tether/examples/element-scroll/index.html | 499 +
.../tether/examples/enable-disable/index.html | 37 +
.../assets/tether/examples/facebook/facebook.css | 86 +
.../assets/tether/examples/facebook/index.html | 209 +
.../tether/examples/out-of-bounds/index.html | 38 +
templates/assets/tether/examples/pin/index.html | 30 +
.../assets/tether/examples/resources/css/base.css | 10 +
.../assets/tether/examples/resources/js/jquery.js | 9597 ++++++++++++++++++++
.../assets/tether/examples/resources/js/log.js | 134 +
templates/assets/tether/examples/scroll/index.html | 922 ++
templates/assets/tether/examples/simple/index.html | 30 +
.../assets/tether/examples/testbed/index.html | 36 +
.../assets/tether/examples/tooltip/index.html | 86 +
.../assets/tether/examples/viewport/colors.css | 145 +
.../assets/tether/examples/viewport/index.html | 70 +
templates/assets/tether/gulpfile.js | 96 +
templates/assets/tether/package.json | 40 +
.../src/css/helpers/_tether-theme-arrows.sass | 192 +
.../src/css/helpers/_tether-theme-basic.sass | 14 +
.../assets/tether/src/css/helpers/_tether.sass | 12 +
.../tether/src/css/mixins/_inline-block.sass | 6 +
.../tether/src/css/mixins/_pie-clearfix.sass | 7 +
.../tether/src/css/tether-theme-arrows-dark.sass | 12 +
.../assets/tether/src/css/tether-theme-arrows.sass | 12 +
.../assets/tether/src/css/tether-theme-basic.sass | 10 +
templates/assets/tether/src/css/tether.sass | 5 +
templates/assets/tether/src/js/abutment.js | 61 +
templates/assets/tether/src/js/constraint.js | 366 +
templates/assets/tether/src/js/markAttachment.js | 46 +
templates/assets/tether/src/js/shift.js | 32 +
templates/assets/tether/src/js/tether.js | 809 ++
templates/assets/tether/src/js/utils.js | 370 +
templates/index.html | 115 +
474 files changed, 66937 insertions(+)
create mode 100644 .gitignore
create mode 100644 app.py
create mode 100644 templates/assets/.DS_Store
create mode 100644 templates/assets/bootstrap-material-design/.bower.json
create mode 100644 templates/assets/bootstrap-material-design/.travis.yml
create mode 100644 templates/assets/bootstrap-material-design/LICENSE.md
create mode 100644 templates/assets/bootstrap-material-design/README.md
create mode 100644 templates/assets/bootstrap-material-design/bower.json
create mode 100644 templates/assets/bootstrap-material-design/js/autofill.js
create mode 100644 templates/assets/bootstrap-material-design/js/base.js
create mode 100644 templates/assets/bootstrap-material-design/js/baseFormControl.js
create mode 100644 templates/assets/bootstrap-material-design/js/baseInput.js
create mode 100644 templates/assets/bootstrap-material-design/js/baseLayout.js
create mode 100644 templates/assets/bootstrap-material-design/js/baseSelection.js
create mode 100644 templates/assets/bootstrap-material-design/js/bootstrapMaterialDesign.js
create mode 100644 templates/assets/bootstrap-material-design/js/checkbox.js
create mode 100644 templates/assets/bootstrap-material-design/js/checkboxInline.js
create mode 100644 templates/assets/bootstrap-material-design/js/collapseInline.js
create mode 100644 templates/assets/bootstrap-material-design/js/drawer.js
create mode 100644 templates/assets/bootstrap-material-design/js/file.js
create mode 100644 templates/assets/bootstrap-material-design/js/index.js
create mode 100644 templates/assets/bootstrap-material-design/js/radio.js
create mode 100644 templates/assets/bootstrap-material-design/js/radioInline.js
create mode 100644 templates/assets/bootstrap-material-design/js/ripples.js
create mode 100644 templates/assets/bootstrap-material-design/js/select.js
create mode 100644 templates/assets/bootstrap-material-design/js/switch.js
create mode 100644 templates/assets/bootstrap-material-design/js/text.js
create mode 100644 templates/assets/bootstrap-material-design/js/textarea.js
create mode 100644 templates/assets/bootstrap-material-design/js/util.js
create mode 100644 templates/assets/bootstrap-material-design/package.json
create mode 100644 templates/assets/bootstrap-material-design/scss/_alerts.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_buttons.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_cards.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_checkboxes.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_core-bootstrap.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_core.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_custom-forms.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_drawer.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_dropdown.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_extensions.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_forms.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_input-group.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_layout.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_list-group.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_mixins.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_modal.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_nav.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_navbar.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_pagination.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_popover.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_progress.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_radios.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_reboot.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_ripples.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_switches.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_tables.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_themes.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_type.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/_variables.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/bootstrap-material-design.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/extensions/_selectize.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/extensions/_snackbarjs.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_animations.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_breakpoints.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_buttons.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_drawer.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_forms.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_hover.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_layout.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_navs.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_type.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/mixins/_utilities.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/_colors-map.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/_colors.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/_drawer.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/_layout.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/_menu.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/_shadow.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_body.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_brand.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_buttons.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_card.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_code.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_components.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_custom-forms.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_dropdown.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_forms.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_list-group.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_modals.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_nav.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_pagination.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_spacing.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_state.scss
create mode 100644 templates/assets/bootstrap-material-design/scss/variables/bootstrap/_type.scss
create mode 100644 templates/assets/bootstrap/.bower.json
create mode 100644 templates/assets/bootstrap/CHANGELOG.md
create mode 100644 templates/assets/bootstrap/Gemfile
create mode 100644 templates/assets/bootstrap/Gemfile.lock
create mode 100644 templates/assets/bootstrap/Gruntfile.js
create mode 100644 templates/assets/bootstrap/ISSUE_TEMPLATE.md
create mode 100644 templates/assets/bootstrap/LICENSE
create mode 100644 templates/assets/bootstrap/README.md
create mode 100644 templates/assets/bootstrap/bower.json
create mode 100755 templates/assets/bootstrap/grunt/change-version.js
create mode 100644 templates/assets/bootstrap/grunt/gcp-key.json.enc
create mode 100644 templates/assets/bootstrap/grunt/npm-shrinkwrap.json
create mode 100644 templates/assets/bootstrap/grunt/postcss.config.js
create mode 100644 templates/assets/bootstrap/grunt/sauce_browsers.yml
create mode 100755 templates/assets/bootstrap/grunt/upload-preview.sh
create mode 100644 templates/assets/bootstrap/js/.eslintrc.json
create mode 100644 templates/assets/bootstrap/js/src/alert.js
create mode 100644 templates/assets/bootstrap/js/src/button.js
create mode 100644 templates/assets/bootstrap/js/src/carousel.js
create mode 100644 templates/assets/bootstrap/js/src/collapse.js
create mode 100644 templates/assets/bootstrap/js/src/dropdown.js
create mode 100644 templates/assets/bootstrap/js/src/modal.js
create mode 100644 templates/assets/bootstrap/js/src/popover.js
create mode 100644 templates/assets/bootstrap/js/src/scrollspy.js
create mode 100644 templates/assets/bootstrap/js/src/tab.js
create mode 100644 templates/assets/bootstrap/js/src/tooltip.js
create mode 100644 templates/assets/bootstrap/js/src/util.js
create mode 100644 templates/assets/bootstrap/nuget/MyGet.ps1
create mode 100644 templates/assets/bootstrap/nuget/bootstrap.nuspec
create mode 100644 templates/assets/bootstrap/nuget/bootstrap.sass.nuspec
create mode 100644 templates/assets/bootstrap/package.js
create mode 100644 templates/assets/bootstrap/package.json
create mode 100644 templates/assets/bootstrap/sache.json
create mode 100644 templates/assets/bootstrap/scss/.scss-lint.yml
create mode 100644 templates/assets/bootstrap/scss/_alert.scss
create mode 100644 templates/assets/bootstrap/scss/_badge.scss
create mode 100644 templates/assets/bootstrap/scss/_breadcrumb.scss
create mode 100644 templates/assets/bootstrap/scss/_button-group.scss
create mode 100644 templates/assets/bootstrap/scss/_buttons.scss
create mode 100644 templates/assets/bootstrap/scss/_card.scss
create mode 100644 templates/assets/bootstrap/scss/_carousel.scss
create mode 100644 templates/assets/bootstrap/scss/_close.scss
create mode 100644 templates/assets/bootstrap/scss/_code.scss
create mode 100644 templates/assets/bootstrap/scss/_custom-forms.scss
create mode 100644 templates/assets/bootstrap/scss/_custom.scss
create mode 100644 templates/assets/bootstrap/scss/_dropdown.scss
create mode 100644 templates/assets/bootstrap/scss/_forms.scss
create mode 100644 templates/assets/bootstrap/scss/_grid.scss
create mode 100644 templates/assets/bootstrap/scss/_images.scss
create mode 100644 templates/assets/bootstrap/scss/_input-group.scss
create mode 100644 templates/assets/bootstrap/scss/_jumbotron.scss
create mode 100644 templates/assets/bootstrap/scss/_list-group.scss
create mode 100644 templates/assets/bootstrap/scss/_media.scss
create mode 100644 templates/assets/bootstrap/scss/_mixins.scss
create mode 100644 templates/assets/bootstrap/scss/_modal.scss
create mode 100644 templates/assets/bootstrap/scss/_nav.scss
create mode 100644 templates/assets/bootstrap/scss/_navbar.scss
create mode 100644 templates/assets/bootstrap/scss/_pagination.scss
create mode 100644 templates/assets/bootstrap/scss/_popover.scss
create mode 100644 templates/assets/bootstrap/scss/_print.scss
create mode 100644 templates/assets/bootstrap/scss/_progress.scss
create mode 100644 templates/assets/bootstrap/scss/_reboot.scss
create mode 100644 templates/assets/bootstrap/scss/_responsive-embed.scss
create mode 100644 templates/assets/bootstrap/scss/_tables.scss
create mode 100644 templates/assets/bootstrap/scss/_tooltip.scss
create mode 100644 templates/assets/bootstrap/scss/_transitions.scss
create mode 100644 templates/assets/bootstrap/scss/_type.scss
create mode 100644 templates/assets/bootstrap/scss/_utilities.scss
create mode 100644 templates/assets/bootstrap/scss/_variables.scss
create mode 100644 templates/assets/bootstrap/scss/bootstrap-grid.scss
create mode 100644 templates/assets/bootstrap/scss/bootstrap-reboot.scss
create mode 100644 templates/assets/bootstrap/scss/bootstrap.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_alert.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_background-variant.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_badge.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_border-radius.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_box-shadow.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_breakpoints.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_buttons.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_cards.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_clearfix.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_float.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_forms.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_gradients.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_grid-framework.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_grid.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_hover.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_image.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_list-group.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_lists.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_nav-divider.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_navbar-align.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_pagination.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_reset-text.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_resize.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_screen-reader.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_size.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_table-row.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_text-emphasis.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_text-hide.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_text-truncate.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_transforms.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_transition.scss
create mode 100644 templates/assets/bootstrap/scss/mixins/_visibility.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_align.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_background.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_borders.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_clearfix.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_display.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_flex.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_float.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_position.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_screenreaders.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_sizing.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_spacing.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_text.scss
create mode 100644 templates/assets/bootstrap/scss/utilities/_visibility.scss
create mode 100644 templates/assets/images/items/aegis.png
create mode 100644 templates/assets/images/items/aftershock.png
create mode 100644 templates/assets/images/items/alternating-current.png
create mode 100644 templates/assets/images/items/atlas-pauldron.png
create mode 100644 templates/assets/images/items/barbed-needle.png
create mode 100644 templates/assets/images/items/blazing-salvo.png
create mode 100644 templates/assets/images/items/bonesaw.png
create mode 100644 templates/assets/images/items/book-of-eulogies.png
create mode 100644 templates/assets/images/items/breaking-point.png
create mode 100644 templates/assets/images/items/broken-myth.png
create mode 100644 templates/assets/images/items/chronograph.png
create mode 100644 templates/assets/images/items/clockwork.png
create mode 100644 templates/assets/images/items/coat-of-plates.png
create mode 100644 templates/assets/images/items/contraption.png
create mode 100644 templates/assets/images/items/crucible.png
create mode 100644 templates/assets/images/items/crystal-bit.png
create mode 100644 templates/assets/images/items/crystal-infusion.png
create mode 100644 templates/assets/images/items/dragon-heart.png
create mode 100644 templates/assets/images/items/dragonblood-contract.png
create mode 100644 templates/assets/images/items/echo.png
create mode 100644 templates/assets/images/items/eclipse-prism.png
create mode 100644 templates/assets/images/items/energy-battery.png
create mode 100644 templates/assets/images/items/eve-of-harvest.png
create mode 100644 templates/assets/images/items/flare-gun.png
create mode 100644 templates/assets/images/items/flare.png
create mode 100644 templates/assets/images/items/fountain-of-renewal.png
create mode 100644 templates/assets/images/items/frostburn.png
create mode 100644 templates/assets/images/items/halcyon-chargers.png
create mode 100644 templates/assets/images/items/halcyon-potion.png
create mode 100644 templates/assets/images/items/heavy-prism.png
create mode 100644 templates/assets/images/items/heavy-steel.png
create mode 100644 templates/assets/images/items/hour-glass.png
create mode 100644 templates/assets/images/items/ironguard-contract.png
create mode 100644 templates/assets/images/items/journey-boots.png
create mode 100644 templates/assets/images/items/kinetic-shield.png
create mode 100644 templates/assets/images/items/level-juice.png
create mode 100644 templates/assets/images/items/lifespring.png
create mode 100644 templates/assets/images/items/light-armor.png
create mode 100644 templates/assets/images/items/light-shield.png
create mode 100644 templates/assets/images/items/lucky-strike.png
create mode 100644 templates/assets/images/items/metal-jacket.png
create mode 100644 templates/assets/images/items/minion-candy.png
create mode 100644 templates/assets/images/items/minions-foot.png
create mode 100644 templates/assets/images/items/nullwave-gauntlet.png
create mode 100644 templates/assets/images/items/oak-heart.png
create mode 100644 templates/assets/images/items/piercing-shard.png
create mode 100644 templates/assets/images/items/piercing-spear.png
create mode 100644 templates/assets/images/items/poisoned-shiv.png
create mode 100644 templates/assets/images/items/pot-of-gold.png
create mode 100644 templates/assets/images/items/protector-contract.png
create mode 100644 templates/assets/images/items/reflex-block.png
create mode 100644 templates/assets/images/items/scout-trap.png
create mode 100644 templates/assets/images/items/serpent-mask.png
create mode 100644 templates/assets/images/items/shatter-glass.png
create mode 100644 templates/assets/images/items/shiversteel.png
create mode 100644 templates/assets/images/items/six-sins.png
create mode 100644 templates/assets/images/items/slumbering-husk.png
create mode 100644 templates/assets/images/items/sorrow-blade.png
create mode 100644 templates/assets/images/items/sprint-boots.png
create mode 100644 templates/assets/images/items/stormcrown.png
create mode 100644 templates/assets/images/items/stormguard-banner.png
create mode 100644 templates/assets/images/items/swift-shooter.png
create mode 100644 templates/assets/images/items/tension-bow.png
create mode 100644 templates/assets/images/items/tornado-trigger.png
create mode 100644 templates/assets/images/items/travel-boots.png
create mode 100644 templates/assets/images/items/tyrants-monocle.png
create mode 100644 templates/assets/images/items/void-battery.png
create mode 100644 templates/assets/images/items/war-treads.png
create mode 100644 templates/assets/images/items/weapon-blade.png
create mode 100644 templates/assets/images/items/weapon-infusion.png
create mode 100644 templates/assets/jquery/.bower.json
create mode 100644 templates/assets/jquery/AUTHORS.txt
create mode 100644 templates/assets/jquery/LICENSE.txt
create mode 100644 templates/assets/jquery/README.md
create mode 100644 templates/assets/jquery/bower.json
create mode 100644 templates/assets/jquery/external/sizzle/LICENSE.txt
create mode 100644 templates/assets/jquery/src/.jshintrc
create mode 100644 templates/assets/jquery/src/ajax.js
create mode 100644 templates/assets/jquery/src/ajax/jsonp.js
create mode 100644 templates/assets/jquery/src/ajax/load.js
create mode 100644 templates/assets/jquery/src/ajax/parseJSON.js
create mode 100644 templates/assets/jquery/src/ajax/parseXML.js
create mode 100644 templates/assets/jquery/src/ajax/script.js
create mode 100644 templates/assets/jquery/src/ajax/xhr.js
create mode 100644 templates/assets/jquery/src/attributes.js
create mode 100644 templates/assets/jquery/src/attributes/attr.js
create mode 100644 templates/assets/jquery/src/attributes/classes.js
create mode 100644 templates/assets/jquery/src/attributes/prop.js
create mode 100644 templates/assets/jquery/src/attributes/support.js
create mode 100644 templates/assets/jquery/src/attributes/val.js
create mode 100644 templates/assets/jquery/src/callbacks.js
create mode 100644 templates/assets/jquery/src/core.js
create mode 100644 templates/assets/jquery/src/core/access.js
create mode 100644 templates/assets/jquery/src/core/init.js
create mode 100644 templates/assets/jquery/src/core/parseHTML.js
create mode 100644 templates/assets/jquery/src/core/ready.js
create mode 100644 templates/assets/jquery/src/css.js
create mode 100644 templates/assets/jquery/src/css/addGetHookIf.js
create mode 100644 templates/assets/jquery/src/css/adjustCSS.js
create mode 100644 templates/assets/jquery/src/css/curCSS.js
create mode 100644 templates/assets/jquery/src/css/defaultDisplay.js
create mode 100644 templates/assets/jquery/src/css/hiddenVisibleSelectors.js
create mode 100644 templates/assets/jquery/src/css/showHide.js
create mode 100644 templates/assets/jquery/src/css/support.js
create mode 100644 templates/assets/jquery/src/data.js
create mode 100644 templates/assets/jquery/src/data/Data.js
create mode 100644 templates/assets/jquery/src/deferred.js
create mode 100644 templates/assets/jquery/src/deprecated.js
create mode 100644 templates/assets/jquery/src/dimensions.js
create mode 100644 templates/assets/jquery/src/effects.js
create mode 100644 templates/assets/jquery/src/effects/Tween.js
create mode 100644 templates/assets/jquery/src/effects/animatedSelector.js
create mode 100644 templates/assets/jquery/src/event.js
create mode 100644 templates/assets/jquery/src/event/ajax.js
create mode 100644 templates/assets/jquery/src/event/alias.js
create mode 100644 templates/assets/jquery/src/event/focusin.js
create mode 100644 templates/assets/jquery/src/event/support.js
create mode 100644 templates/assets/jquery/src/event/trigger.js
create mode 100644 templates/assets/jquery/src/exports/amd.js
create mode 100644 templates/assets/jquery/src/exports/global.js
create mode 100644 templates/assets/jquery/src/intro.js
create mode 100644 templates/assets/jquery/src/jquery.js
create mode 100644 templates/assets/jquery/src/manipulation.js
create mode 100644 templates/assets/jquery/src/manipulation/_evalUrl.js
create mode 100644 templates/assets/jquery/src/manipulation/buildFragment.js
create mode 100644 templates/assets/jquery/src/manipulation/getAll.js
create mode 100644 templates/assets/jquery/src/manipulation/setGlobalEval.js
create mode 100644 templates/assets/jquery/src/manipulation/support.js
create mode 100644 templates/assets/jquery/src/manipulation/wrapMap.js
create mode 100644 templates/assets/jquery/src/offset.js
create mode 100644 templates/assets/jquery/src/outro.js
create mode 100644 templates/assets/jquery/src/queue.js
create mode 100644 templates/assets/jquery/src/queue/delay.js
create mode 100644 templates/assets/jquery/src/selector-native.js
create mode 100644 templates/assets/jquery/src/selector-sizzle.js
create mode 100644 templates/assets/jquery/src/selector.js
create mode 100644 templates/assets/jquery/src/serialize.js
create mode 100644 templates/assets/jquery/src/traversing.js
create mode 100644 templates/assets/jquery/src/traversing/findFilter.js
create mode 100644 templates/assets/jquery/src/wrap.js
create mode 100644 templates/assets/sass/.DS_Store
create mode 100755 templates/assets/sass/material-kit.scss
create mode 100644 templates/assets/sass/material-kit/.DS_Store
create mode 100755 templates/assets/sass/material-kit/_alerts.scss
create mode 100755 templates/assets/sass/material-kit/_buttons.scss
create mode 100755 templates/assets/sass/material-kit/_cards.scss
create mode 100644 templates/assets/sass/material-kit/_carousel.scss
create mode 100755 templates/assets/sass/material-kit/_checkboxes.scss
create mode 100755 templates/assets/sass/material-kit/_colors.scss
create mode 100755 templates/assets/sass/material-kit/_core.scss
create mode 100755 templates/assets/sass/material-kit/_dialogs.scss
create mode 100755 templates/assets/sass/material-kit/_dividers.scss
create mode 100644 templates/assets/sass/material-kit/_dropdown.scss
create mode 100644 templates/assets/sass/material-kit/_example-pages.scss
create mode 100644 templates/assets/sass/material-kit/_footers.scss
create mode 100755 templates/assets/sass/material-kit/_form.scss
create mode 100644 templates/assets/sass/material-kit/_images.scss
create mode 100755 templates/assets/sass/material-kit/_import-bs-less.scss
create mode 100755 templates/assets/sass/material-kit/_import-bs-sass.scss
create mode 100644 templates/assets/sass/material-kit/_info-areas.scss
create mode 100755 templates/assets/sass/material-kit/_inputs-size.scss
create mode 100755 templates/assets/sass/material-kit/_inputs.scss
create mode 100755 templates/assets/sass/material-kit/_labels.scss
create mode 100755 templates/assets/sass/material-kit/_lists.scss
create mode 100755 templates/assets/sass/material-kit/_mixins.scss
create mode 100755 templates/assets/sass/material-kit/_navbar.scss
create mode 100644 templates/assets/sass/material-kit/_pagination.scss
create mode 100755 templates/assets/sass/material-kit/_panels.scss
create mode 100644 templates/assets/sass/material-kit/_pills.scss
create mode 100755 templates/assets/sass/material-kit/_popups.scss
create mode 100755 templates/assets/sass/material-kit/_progress.scss
create mode 100755 templates/assets/sass/material-kit/_radios.scss
create mode 100755 templates/assets/sass/material-kit/_ripples.scss
create mode 100644 templates/assets/sass/material-kit/_sections.scss
create mode 100755 templates/assets/sass/material-kit/_shadows.scss
create mode 100755 templates/assets/sass/material-kit/_tabs.scss
create mode 100755 templates/assets/sass/material-kit/_togglebutton.scss
create mode 100755 templates/assets/sass/material-kit/_typography.scss
create mode 100755 templates/assets/sass/material-kit/_variables.scss
create mode 100644 templates/assets/sass/material-kit/_variables_bootstrap.scss
create mode 100755 templates/assets/sass/material-kit/_welljumbo.scss
create mode 100644 templates/assets/sass/material-kit/plugins/_plugin-datepicker.scss
create mode 100755 templates/assets/sass/material-kit/plugins/_plugin-dropdownjs.scss
create mode 100755 templates/assets/sass/material-kit/plugins/_plugin-nouislider.scss
create mode 100755 templates/assets/sass/material-kit/plugins/_plugin-selectize.scss
create mode 100755 templates/assets/sass/material-kit/plugins/_plugin-snackbarjs.scss
create mode 100644 templates/assets/tether/.bower.json
create mode 100644 templates/assets/tether/CHANGELOG.md
create mode 100644 templates/assets/tether/CONTRIBUTING.md
create mode 100644 templates/assets/tether/LICENSE
create mode 100644 templates/assets/tether/README.md
create mode 100644 templates/assets/tether/bower.json
create mode 100644 templates/assets/tether/component.json
create mode 100644 templates/assets/tether/docs/1-Overview/1-why_you_should_use_tether.md
create mode 100644 templates/assets/tether/docs/1-Overview/2-repositioning.md
create mode 100644 templates/assets/tether/docs/1-Overview/3-why_we_dont_support_IE_8.md
create mode 100644 templates/assets/tether/docs/2-Examples/1-list_of_examples.md
create mode 100644 templates/assets/tether/docs/2-Examples/2-projects_using_tether.md
create mode 100644 templates/assets/tether/docs/3-Advanced/1-embedding_tether.md
create mode 100644 templates/assets/tether/docs/3-Advanced/2-extending_tether.md
create mode 100644 templates/assets/tether/docs/coffee/intro.coffee
create mode 100644 templates/assets/tether/docs/css/intro.css
create mode 100644 templates/assets/tether/docs/intro.md
create mode 100644 templates/assets/tether/docs/js/intro.js
create mode 100644 templates/assets/tether/docs/js/markAttachment.js
create mode 100644 templates/assets/tether/docs/sass/intro.sass
create mode 100644 templates/assets/tether/docs/welcome/browser-demo.html
create mode 100644 templates/assets/tether/docs/welcome/coffee/welcome.coffee
create mode 100644 templates/assets/tether/docs/welcome/css/browser-demo.css
create mode 100644 templates/assets/tether/docs/welcome/css/prism.css
create mode 100644 templates/assets/tether/docs/welcome/css/welcome.css
create mode 100644 templates/assets/tether/docs/welcome/index.html
create mode 100644 templates/assets/tether/docs/welcome/js/drop.js
create mode 100644 templates/assets/tether/docs/welcome/js/jquery.js
create mode 100644 templates/assets/tether/docs/welcome/js/log.js
create mode 100644 templates/assets/tether/docs/welcome/js/tether-v0.1.3.js
create mode 100644 templates/assets/tether/docs/welcome/js/welcome.js
create mode 100644 templates/assets/tether/docs/welcome/sass/_inline-block.sass
create mode 100644 templates/assets/tether/docs/welcome/sass/browser-demo.sass
create mode 100644 templates/assets/tether/docs/welcome/sass/welcome.sass
create mode 100644 templates/assets/tether/examples/chosen/chosen-sprite.png
create mode 100644 templates/assets/tether/examples/chosen/chosen-sprite@2x.png
create mode 100644 templates/assets/tether/examples/chosen/chosen.css
create mode 100644 templates/assets/tether/examples/chosen/chosen.js
create mode 100644 templates/assets/tether/examples/chosen/index.html
create mode 100644 templates/assets/tether/examples/common/css/style.css
create mode 100644 templates/assets/tether/examples/content-visible/index.html
create mode 100644 templates/assets/tether/examples/dolls/dolls.css
create mode 100644 templates/assets/tether/examples/dolls/dolls.js
create mode 100644 templates/assets/tether/examples/dolls/index.html
create mode 100644 templates/assets/tether/examples/element-scroll/index.html
create mode 100644 templates/assets/tether/examples/enable-disable/index.html
create mode 100644 templates/assets/tether/examples/facebook/facebook.css
create mode 100644 templates/assets/tether/examples/facebook/index.html
create mode 100644 templates/assets/tether/examples/out-of-bounds/index.html
create mode 100644 templates/assets/tether/examples/pin/index.html
create mode 100644 templates/assets/tether/examples/resources/css/base.css
create mode 100644 templates/assets/tether/examples/resources/js/jquery.js
create mode 100644 templates/assets/tether/examples/resources/js/log.js
create mode 100644 templates/assets/tether/examples/scroll/index.html
create mode 100644 templates/assets/tether/examples/simple/index.html
create mode 100644 templates/assets/tether/examples/testbed/index.html
create mode 100644 templates/assets/tether/examples/tooltip/index.html
create mode 100644 templates/assets/tether/examples/viewport/colors.css
create mode 100644 templates/assets/tether/examples/viewport/index.html
create mode 100644 templates/assets/tether/gulpfile.js
create mode 100644 templates/assets/tether/package.json
create mode 100644 templates/assets/tether/src/css/helpers/_tether-theme-arrows.sass
create mode 100644 templates/assets/tether/src/css/helpers/_tether-theme-basic.sass
create mode 100644 templates/assets/tether/src/css/helpers/_tether.sass
create mode 100644 templates/assets/tether/src/css/mixins/_inline-block.sass
create mode 100644 templates/assets/tether/src/css/mixins/_pie-clearfix.sass
create mode 100644 templates/assets/tether/src/css/tether-theme-arrows-dark.sass
create mode 100644 templates/assets/tether/src/css/tether-theme-arrows.sass
create mode 100644 templates/assets/tether/src/css/tether-theme-basic.sass
create mode 100644 templates/assets/tether/src/css/tether.sass
create mode 100644 templates/assets/tether/src/js/abutment.js
create mode 100644 templates/assets/tether/src/js/constraint.js
create mode 100644 templates/assets/tether/src/js/markAttachment.js
create mode 100644 templates/assets/tether/src/js/shift.js
create mode 100644 templates/assets/tether/src/js/tether.js
create mode 100644 templates/assets/tether/src/js/utils.js
create mode 100644 templates/index.html
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9a05e2d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,91 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# dotenv
+.env
+
+# virtualenv
+.venv/
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+
+# Rope project settings
+.ropeproject
diff --git a/app.py b/app.py
new file mode 100644
index 0000000..3eaafb2
--- /dev/null
+++ b/app.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python3
+
+import os
+import psycopg2
+import psycopg2.pool
+import psycopg2.extras
+from flask import Flask, g, render_template, send_from_directory
+from werkzeug.contrib.cache import SimpleCache
+
+app = Flask(__name__)
+cache = SimpleCache()
+
+db_config = {
+ "host": os.environ.get("POSTGRESQL_DEST_HOST") or "localhost",
+ "port": os.environ.get("POSTGRESQL_DEST_PORT") or 5432,
+ "user": os.environ.get("POSTGRESQL_DEST_USER") or "vainweb",
+ "password": os.environ.get("POSTGRESQL_DEST_PASSWORD") or "vainweb",
+ "dbname": os.environ.get("POSTGRESQL_DEST_DB") or "vainsocial-web"
+}
+
+def dbpool():
+ if not hasattr(g, "db_pool"):
+ g.db_pool = psycopg2.pool.ThreadedConnectionPool(
+ **db_config, minconn=1, maxconn=10)
+ return g.db_pool
+
+@app.teardown_appcontext
+def db_disconnect(err):
+ if hasattr(g, "db_pool"):
+ g.db_pool.closeall()
+
+@app.context_processor
+def sql_processor():
+ def sql_val(query):
+ val = cache.get(query)
+ if val is not None:
+ return val.get(0)
+
+ con = dbpool().getconn()
+ c = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+
+ c.execute(query)
+ val = c.fetchone()
+ cache.set(query, val, timeout=60*60) # seconds
+
+ c.close()
+ dbpool().putconn(con)
+
+ return val.get(0)
+
+ return dict(sql_val=sql_val)
+
+@app.route("/")
+def index():
+ return render_template("index.html")
+
+@app.route("/assets/")
+def send_assets(path):
+ return send_from_directory("templates/assets", path)
+
+if __name__ == "__main__":
+ app.run(debug=True)
diff --git a/templates/assets/.DS_Store b/templates/assets/.DS_Store
new file mode 100644
index 0000000..00e8144
Binary files /dev/null and b/templates/assets/.DS_Store differ
diff --git a/templates/assets/bootstrap-material-design/.bower.json b/templates/assets/bootstrap-material-design/.bower.json
new file mode 100644
index 0000000..cc4d06b
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/.bower.json
@@ -0,0 +1,40 @@
+{
+ "name": "bootstrap-material-design",
+ "description": "Bootstrap Material Design 4",
+ "keywords": [
+ "material",
+ "design",
+ "bootstrap",
+ "css",
+ "js",
+ "sass",
+ "mobile-first",
+ "responsive",
+ "front-end",
+ "framework",
+ "web"
+ ],
+ "homepage": "http://fezvrasta.github.io/bootstrap-material-design",
+ "license": "MIT",
+ "moduleType": "globals",
+ "main": [
+ "scss/_core.scss",
+ "dist/bootstrap-material-design.iife.js"
+ ],
+ "dependencies": {
+ "jquery": "^2.2",
+ "tether": "^1.2",
+ "bootstrap": "v4-dev"
+ },
+ "version": "4.0.2",
+ "_release": "4.0.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v4.0.2",
+ "commit": "ec3a7ffc23d1f18ac822442fe06d3688d29cbbea"
+ },
+ "_source": "https://github.com/FezVrasta/bootstrap-material-design.git",
+ "_target": "v4.0.2",
+ "_originalSource": "bootstrap-material-design",
+ "_direct": true
+}
\ No newline at end of file
diff --git a/templates/assets/bootstrap-material-design/.travis.yml b/templates/assets/bootstrap-material-design/.travis.yml
new file mode 100644
index 0000000..34b0d78
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/.travis.yml
@@ -0,0 +1,29 @@
+sudo: false
+git:
+ depth: 10
+
+# remove the dist branch and dist tags from travis builds
+branches:
+ except:
+ - dist
+ - /^v(\d+\.)?(\d+\.)?(\*|\d+)$/
+
+language: node_js
+node_js:
+ - "5" # "node" (v6.x) yielded v8::ObjectTemplate::Set() with non-primitive values is deprecated
+
+# enable this once we have reliable builds
+cache:
+ directories:
+ - node_modules
+ - vendor/bundle
+
+before_install:
+ - rvm install 2.2
+ - rvm use 2.2 --fuzzy
+ - gem install scss-lint
+
+before_script:
+ - npm install -g gulp-cli
+
+script: gulp all
diff --git a/templates/assets/bootstrap-material-design/LICENSE.md b/templates/assets/bootstrap-material-design/LICENSE.md
new file mode 100644
index 0000000..4199bf6
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/LICENSE.md
@@ -0,0 +1,30 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2016, Federico Zivolo and contributors - https://github.com/FezVrasta/bootstrap-material-design
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+## Acknowledgements:
+
+- Some original Bootstrap code and documentation http://getbootstrap.com
+`Copyright (c) 2011-2015 Twitter, Inc`
+
+- Some original MDL code http://www.getmdl.io/
+`Copyright 2015 Google Inc. All Rights Reserved.`
diff --git a/templates/assets/bootstrap-material-design/README.md b/templates/assets/bootstrap-material-design/README.md
new file mode 100644
index 0000000..9fe60b2
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/README.md
@@ -0,0 +1,6 @@
+# bootstrap-material-design
+
+[`v4.0.2`](../../releases/tag/v4.0.2) built from commit [`f2ac8b1`](../../commit/f2ac8b142aba7e0cda5c945b04649269d1ff3d5a) on branch `v4-dev`. See the [README](../..) for more details
+
+---
+Built and published by [gulp-pipeline](https://github.com/alienfast/gulp-pipeline) using [build-control](https://github.com/alienfast/build-control)
diff --git a/templates/assets/bootstrap-material-design/bower.json b/templates/assets/bootstrap-material-design/bower.json
new file mode 100644
index 0000000..a312e33
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/bower.json
@@ -0,0 +1,29 @@
+{
+ "name": "bootstrap-material-design",
+ "description": "Bootstrap Material Design 4",
+ "keywords": [
+ "material",
+ "design",
+ "bootstrap",
+ "css",
+ "js",
+ "sass",
+ "mobile-first",
+ "responsive",
+ "front-end",
+ "framework",
+ "web"
+ ],
+ "homepage": "http://fezvrasta.github.io/bootstrap-material-design",
+ "license": "MIT",
+ "moduleType": "globals",
+ "main": [
+ "scss/_core.scss",
+ "dist/bootstrap-material-design.iife.js"
+ ],
+ "dependencies": {
+ "jquery": "^2.2",
+ "tether": "^1.2",
+ "bootstrap": "v4-dev"
+ }
+}
diff --git a/templates/assets/bootstrap-material-design/js/autofill.js b/templates/assets/bootstrap-material-design/js/autofill.js
new file mode 100644
index 0000000..2ada9ec
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/js/autofill.js
@@ -0,0 +1,109 @@
+import Base from './base'
+
+const Autofill = (($) => {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ const NAME = 'autofill'
+ const DATA_KEY = `bmd.${NAME}`
+ const JQUERY_NAME = `bmd${NAME.charAt(0).toUpperCase() + NAME.slice(1)}`
+ const JQUERY_NO_CONFLICT = $.fn[JQUERY_NAME]
+
+ const Default = {}
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ class Autofill extends Base {
+
+ constructor($element, config) {
+ super($element, $.extend(true, {}, Default, config))
+
+ this._watchLoading()
+ this._attachEventHandlers()
+ }
+
+ dispose() {
+ super.dispose(DATA_KEY)
+ }
+
+ // ------------------------------------------------------------------------
+ // private
+
+ _watchLoading() {
+ // After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
+ setTimeout(() => {
+ clearInterval(this._onLoading)
+ }, 10000)
+ }
+
+ // This part of code will detect autofill when the page is loading (username and password inputs for example)
+ _onLoading() {
+ setInterval(() => {
+ $('input[type!=checkbox]').each((index, element) => {
+ let $element = $(element)
+ if ($element.val() && $element.val() !== $element.attr('value')) {
+ $element.trigger('change')
+ }
+ })
+ }, 100)
+ }
+
+ _attachEventHandlers() {
+ // Listen on inputs of the focused form
+ // (because user can select from the autofill dropdown only when the input has focus)
+ let focused = null
+ $(document)
+ .on('focus', 'input', (event) => {
+ let $inputs = $(event.currentTarget).closest('form').find('input').not('[type=file]')
+ focused = setInterval(() => {
+ $inputs.each((index, element) => {
+ let $element = $(element)
+ if ($element.val() !== $element.attr('value')) {
+ $element.trigger('change')
+ }
+ })
+ }, 100)
+ })
+ .on('blur', '.form-group input', () => {
+ clearInterval(focused)
+ })
+ }
+
+ // ------------------------------------------------------------------------
+ // static
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let $element = $(this)
+ let data = $element.data(DATA_KEY)
+
+ if (!data) {
+ data = new Autofill($element, config)
+ $element.data(DATA_KEY, data)
+ }
+ })
+ }
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+ $.fn[JQUERY_NAME] = Autofill._jQueryInterface
+ $.fn[JQUERY_NAME].Constructor = Autofill
+ $.fn[JQUERY_NAME].noConflict = () => {
+ $.fn[JQUERY_NAME] = JQUERY_NO_CONFLICT
+ return Autofill._jQueryInterface
+ }
+
+ return Autofill
+
+})(jQuery)
+
+export default Autofill
diff --git a/templates/assets/bootstrap-material-design/js/base.js b/templates/assets/bootstrap-material-design/js/base.js
new file mode 100644
index 0000000..283b976
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/js/base.js
@@ -0,0 +1,88 @@
+import Util from './util'
+
+const Base = (($) => {
+
+ const ClassName = {
+ BMD_FORM_GROUP: 'bmd-form-group',
+ IS_FILLED: 'is-filled',
+ IS_FOCUSED: 'is-focused'
+ }
+
+ const Selector = {
+ BMD_FORM_GROUP: `.${ClassName.BMD_FORM_GROUP}`
+ }
+
+ const Default = {}
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ class Base {
+
+ /**
+ *
+ * @param element
+ * @param config
+ * @param properties - anything that needs to be set as this[key] = value. Works around the need to call `super` before using `this`
+ */
+ constructor($element, config, properties = {}) {
+ this.$element = $element
+ this.config = $.extend(true, {}, Default, config)
+
+ // set properties for use in the constructor initialization
+ for (let key in properties) {
+ this[key] = properties[key]
+ }
+ }
+
+ dispose(dataKey) {
+ this.$element.data(dataKey, null)
+ this.$element = null
+ this.config = null
+ }
+
+ // ------------------------------------------------------------------------
+ // protected
+
+ addFormGroupFocus() {
+ if (!this.$element.prop('disabled')) {
+ this.$bmdFormGroup.addClass(ClassName.IS_FOCUSED)
+ }
+ }
+
+ removeFormGroupFocus() {
+ this.$bmdFormGroup.removeClass(ClassName.IS_FOCUSED)
+ }
+
+ removeIsFilled() {
+ this.$bmdFormGroup.removeClass(ClassName.IS_FILLED)
+ }
+
+ addIsFilled() {
+ this.$bmdFormGroup.addClass(ClassName.IS_FILLED)
+ }
+
+ // Find bmd-form-group
+ findMdbFormGroup(raiseError = true) {
+ let mfg = this.$element.closest(Selector.BMD_FORM_GROUP)
+ if (mfg.length === 0 && raiseError) {
+ $.error(`Failed to find ${Selector.BMD_FORM_GROUP} for ${Util.describe(this.$element)}`)
+ }
+ return mfg
+ }
+
+ // ------------------------------------------------------------------------
+ // private
+
+ // ------------------------------------------------------------------------
+ // static
+
+ }
+
+ return Base
+
+})(jQuery)
+
+export default Base
diff --git a/templates/assets/bootstrap-material-design/js/baseFormControl.js b/templates/assets/bootstrap-material-design/js/baseFormControl.js
new file mode 100644
index 0000000..8481070
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/js/baseFormControl.js
@@ -0,0 +1,36 @@
+import BaseInput from './baseInput'
+
+const BaseFormControl = (($) => {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ const Default = {
+ requiredClasses: ['form-control']
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ class BaseFormControl extends BaseInput {
+
+ constructor($element, config) {
+ super($element, $.extend(true, Default, config))
+
+ // Initially mark as empty
+ if (this.isEmpty()) {
+ this.removeIsFilled()
+ }
+ }
+ }
+
+
+ return BaseFormControl
+
+})(jQuery)
+
+export default BaseFormControl
diff --git a/templates/assets/bootstrap-material-design/js/baseInput.js b/templates/assets/bootstrap-material-design/js/baseInput.js
new file mode 100644
index 0000000..5396ccb
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/js/baseInput.js
@@ -0,0 +1,321 @@
+import Base from './base'
+import Util from './util'
+
+const BaseInput = (($) => {
+
+ const ClassName = {
+ FORM_GROUP: 'form-group',
+ BMD_FORM_GROUP: 'bmd-form-group',
+ BMD_LABEL: 'bmd-label',
+ BMD_LABEL_STATIC: 'bmd-label-static',
+ BMD_LABEL_PLACEHOLDER: 'bmd-label-placeholder',
+ BMD_LABEL_FLOATING: 'bmd-label-floating',
+ HAS_DANGER: 'has-danger',
+ IS_FILLED: 'is-filled',
+ IS_FOCUSED: 'is-focused',
+ INPUT_GROUP: 'input-group'
+ }
+
+ const Selector = {
+ FORM_GROUP: `.${ClassName.FORM_GROUP}`,
+ BMD_FORM_GROUP: `.${ClassName.BMD_FORM_GROUP}`,
+ BMD_LABEL_WILDCARD: `label[class^='${ClassName.BMD_LABEL}'], label[class*=' ${ClassName.BMD_LABEL}']` // match any label variant if specified
+ }
+
+ const Default = {
+ validate: false,
+ formGroup: {
+ required: false
+ },
+ bmdFormGroup: {
+ template: ``,
+ create: true, // create a wrapper if form-group not found
+ required: true // not recommended to turn this off, only used for inline components
+ },
+ label: {
+ required: false,
+
+ // Prioritized find order for resolving the label to be used as an bmd-label if not specified in the markup
+ // - a function(thisComponent); or
+ // - a string selector used like $bmdFormGroup.find(selector)
+ //
+ // Note this only runs if $bmdFormGroup.find(Selector.BMD_LABEL_WILDCARD) fails to find a label (as authored in the markup)
+ //
+ selectors: [
+ `.form-control-label`, // in the case of horizontal or inline forms, this will be marked
+ `> label` // usual case for text inputs, first child. Deeper would find toggle labels so don't do that.
+ ],
+ className: ClassName.BMD_LABEL_STATIC
+ },
+ requiredClasses: [],
+ invalidComponentMatches: [],
+ convertInputSizeVariations: true
+ }
+
+ const FormControlSizeMarkers = {
+ 'form-control-lg': 'bmd-form-group-lg',
+ 'form-control-sm': 'bmd-form-group-sm'
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ class BaseInput extends Base {
+
+ /**
+ *
+ * @param element
+ * @param config
+ * @param properties - anything that needs to be set as this[key] = value. Works around the need to call `super` before using `this`
+ */
+ constructor($element, config, properties = {}) {
+ super($element, $.extend(true, {}, Default, config), properties)
+
+ // Enforce no overlap between components to prevent side effects
+ this._rejectInvalidComponentMatches()
+
+ // Enforce expected structure (if any)
+ this.rejectWithoutRequiredStructure()
+
+ // Enforce required classes for a consistent rendering
+ this._rejectWithoutRequiredClasses()
+
+ // Resolve the form-group first, it will be used for bmd-form-group if possible
+ // note: different components have different rules
+ this.$formGroup = this.findFormGroup(this.config.formGroup.required)
+
+ // Will add bmd-form-group to form-group or create an bmd-form-group
+ // Performance Note: for those forms that are really performance driven, create the markup with the .bmd-form-group to avoid
+ // rendering changes once added.
+ this.$bmdFormGroup = this.resolveMdbFormGroup()
+
+ // Resolve and mark the bmdLabel if necessary as defined by the config
+ this.$bmdLabel = this.resolveMdbLabel()
+
+ // Signal to the bmd-form-group that a form-control-* variation is being used
+ this.resolveMdbFormGroupSizing()
+
+ this.addFocusListener()
+ this.addChangeListener()
+
+ if(this.$element.val() != ''){
+ this.addIsFilled()
+ }
+ }
+
+ dispose(dataKey) {
+ super.dispose(dataKey)
+ this.$bmdFormGroup = null
+ this.$formGroup = null
+ }
+
+ // ------------------------------------------------------------------------
+ // protected
+
+ rejectWithoutRequiredStructure() {
+ // implement
+ }
+
+ addFocusListener() {
+ this.$element
+ .on('focus', () => {
+ this.addFormGroupFocus()
+ })
+ .on('blur', () => {
+ this.removeFormGroupFocus()
+ })
+ }
+
+ addChangeListener() {
+ this.$element
+ .on('keydown paste', (event) => {
+ if (Util.isChar(event)) {
+ this.addIsFilled()
+ }
+ })
+ .on('keyup change', () => {
+
+ // make sure empty is added back when there is a programmatic value change.
+ // NOTE: programmatic changing of value using $.val() must trigger the change event i.e. $.val('x').trigger('change')
+ if (this.isEmpty()) {
+ this.removeIsFilled()
+ } else {
+ this.addIsFilled()
+ }
+
+ if (this.config.validate) {
+ // Validation events do not bubble, so they must be attached directly to the text: http://jsfiddle.net/PEpRM/1/
+ // Further, even the bind method is being caught, but since we are already calling #checkValidity here, just alter
+ // the form-group on change.
+ //
+ // NOTE: I'm not sure we should be intervening regarding validation, this seems better as a README and snippet of code.
+ // BUT, I've left it here for backwards compatibility.
+ let isValid = (typeof this.$element[0].checkValidity === 'undefined' || this.$element[0].checkValidity())
+ if (isValid) {
+ this.removeHasDanger()
+ } else {
+ this.addHasDanger()
+ }
+ }
+ })
+ }
+
+ addHasDanger() {
+ this.$bmdFormGroup.addClass(ClassName.HAS_DANGER)
+ }
+
+ removeHasDanger() {
+ this.$bmdFormGroup.removeClass(ClassName.HAS_DANGER)
+ }
+
+ isEmpty() {
+ return (this.$element.val() === null || this.$element.val() === undefined || this.$element.val() === '')
+ }
+
+ // Will add bmd-form-group to form-group or create a bmd-form-group if necessary
+ resolveMdbFormGroup() {
+ let mfg = this.findMdbFormGroup(false)
+ if (mfg === undefined || mfg.length === 0) {
+ if (this.config.bmdFormGroup.create && (this.$formGroup === undefined || this.$formGroup.length === 0)) {
+ // If a form-group doesn't exist (not recommended), take a guess and wrap the element (assuming no label).
+ // note: it's possible to make this smarter, but I need to see valid cases before adding any complexity.
+
+ // this may be an input-group, wrap that instead
+ if(this.outerElement().parent().hasClass(ClassName.INPUT_GROUP)){
+ this.outerElement().parent().wrap(this.config.bmdFormGroup.template)
+ }
+ else{
+ this.outerElement().wrap(this.config.bmdFormGroup.template)
+ }
+ } else {
+ // a form-group does exist, add our marker class to it
+ this.$formGroup.addClass(ClassName.BMD_FORM_GROUP)
+
+ // OLD: may want to implement this after all, see how the styling turns out, but using an existing form-group is less manipulation of the dom and therefore preferable
+ // A form-group does exist, so add an bmd-form-group wrapping it's internal contents
+ //fg.wrapInner(this.config.bmdFormGroup.template)
+ }
+
+ mfg = this.findMdbFormGroup(this.config.bmdFormGroup.required)
+ }
+
+ return mfg
+ }
+
+ // Demarcation element (e.g. first child of a form-group)
+ // Subclasses such as file inputs may have different structures
+ outerElement() {
+ return this.$element
+ }
+
+ // Will add bmd-label to bmd-form-group if not already specified
+ resolveMdbLabel() {
+
+ let label = this.$bmdFormGroup.find(Selector.BMD_LABEL_WILDCARD)
+ if (label === undefined || label.length === 0) {
+ // we need to find it based on the configured selectors
+ label = this.findMdbLabel(this.config.label.required)
+
+ if (label === undefined || label.length === 0) {
+ // no label found, and finder did not require one
+ } else {
+ // a candidate label was found, add the configured default class name
+ label.addClass(this.config.label.className)
+ }
+ }
+
+ return label
+ }
+
+ // Find bmd-label variant based on the config selectors
+ findMdbLabel(raiseError = true) {
+ let label = null
+
+ // use the specified selector order
+ for (let selector of this.config.label.selectors) {
+ if ($.isFunction(selector)) {
+ label = selector(this)
+ } else {
+ label = this.$bmdFormGroup.find(selector)
+ }
+
+ if (label !== undefined && label.length > 0) {
+ break
+ }
+ }
+
+ if (label.length === 0 && raiseError) {
+ $.error(`Failed to find ${Selector.BMD_LABEL_WILDCARD} within form-group for ${Util.describe(this.$element)}`)
+ }
+ return label
+ }
+
+ // Find bmd-form-group
+ findFormGroup(raiseError = true) {
+ let fg = this.$element.closest(Selector.FORM_GROUP)
+ if (fg.length === 0 && raiseError) {
+ $.error(`Failed to find ${Selector.FORM_GROUP} for ${Util.describe(this.$element)}`)
+ }
+ return fg
+ }
+
+ // Due to the interconnected nature of labels/inputs/help-blocks, signal the bmd-form-group-* size variation based on
+ // a found form-control-* size
+ resolveMdbFormGroupSizing() {
+ if (!this.config.convertInputSizeVariations) {
+ return
+ }
+
+ // Modification - Change text-sm/lg to form-group-sm/lg instead (preferred standard and simpler css/less variants)
+ for (let inputSize in FormControlSizeMarkers) {
+ if (this.$element.hasClass(inputSize)) {
+ //this.$element.removeClass(inputSize)
+ this.$bmdFormGroup.addClass(FormControlSizeMarkers[inputSize])
+ }
+ }
+ }
+
+ // ------------------------------------------------------------------------
+ // private
+ _rejectInvalidComponentMatches() {
+ for (let otherComponent of this.config.invalidComponentMatches) {
+ otherComponent.rejectMatch(this.constructor.name, this.$element)
+ }
+ }
+
+ _rejectWithoutRequiredClasses() {
+ for (let requiredClass of this.config.requiredClasses) {
+
+ let found = false
+ // allow one of several classes to be passed in x||y
+ if (requiredClass.indexOf('||') !== -1) {
+ let oneOf = requiredClass.split('||')
+ for (let requiredClass of oneOf) {
+ if (this.$element.hasClass(requiredClass)) {
+ found = true
+ break
+ }
+ }
+ } else if (this.$element.hasClass(requiredClass)) {
+ found = true
+ }
+
+ // error if not found
+ if (!found) {
+ $.error(`${this.constructor.name} element: ${Util.describe(this.$element)} requires class: ${requiredClass}`)
+ }
+ }
+ }
+
+ // ------------------------------------------------------------------------
+ // static
+
+ }
+
+ return BaseInput
+
+})(jQuery)
+
+export default BaseInput
diff --git a/templates/assets/bootstrap-material-design/js/baseLayout.js b/templates/assets/bootstrap-material-design/js/baseLayout.js
new file mode 100644
index 0000000..8dc87ed
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/js/baseLayout.js
@@ -0,0 +1,122 @@
+import Base from './base'
+import Util from './util'
+
+const BaseLayout = (($) => {
+
+ const ClassName = {
+ CANVAS: 'bmd-layout-canvas',
+ CONTAINER: 'bmd-layout-container',
+ BACKDROP: `bmd-layout-backdrop`
+ }
+
+ const Selector = {
+ CANVAS: `.${ClassName.CANVAS}`,
+ CONTAINER: `.${ClassName.CONTAINER}`,
+ BACKDROP: `.${ClassName.BACKDROP}`
+ }
+
+ const Default = {
+ canvas: {
+ create: true,
+ required: true,
+ template: ``
+ },
+ backdrop: {
+ create: true,
+ required: true,
+ template: ``
+ }
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ class BaseLayout extends Base {
+
+ constructor($element, config, properties = {}) {
+ super($element, $.extend(true, {}, Default, config), properties)
+
+ this.$container = this.findContainer(true)
+ this.$backdrop = this.resolveBackdrop()
+ this.resolveCanvas();
+ }
+
+ dispose(dataKey) {
+ super.dispose(dataKey)
+ this.$container = null
+ this.$backdrop = null
+ }
+
+ // ------------------------------------------------------------------------
+ // protected
+
+ // Will wrap container in bmd-layout-canvas if necessary
+ resolveCanvas() {
+ let bd = this.findCanvas(false)
+ if (bd === undefined || bd.length === 0) {
+ if (this.config.canvas.create) {
+ this.$container.wrap(this.config.canvas.template)
+ }
+
+ bd = this.findCanvas(this.config.canvas.required)
+ }
+
+ return bd
+ }
+
+ // Find closest bmd-layout-container based on the given context
+ findCanvas(raiseError = true, context = this.$container) {
+ let canvas = context.closest(Selector.CANVAS)
+ if (canvas.length === 0 && raiseError) {
+ $.error(`Failed to find ${Selector.CANVAS} for ${Util.describe(context)}`)
+ }
+ return canvas
+ }
+
+ // Will add bmd-layout-backdrop to bmd-layout-container if necessary
+ resolveBackdrop() {
+ let bd = this.findBackdrop(false)
+ if (bd === undefined || bd.length === 0) {
+ if (this.config.backdrop.create) {
+ this.$container.append(this.config.backdrop.template)
+ }
+
+ bd = this.findBackdrop(this.config.backdrop.required)
+ }
+
+ return bd
+ }
+
+ // Find closest bmd-layout-container based on the given context
+ findBackdrop(raiseError = true, context = this.$container) {
+ let backdrop = context.find(`> ${Selector.BACKDROP}`)
+ if (backdrop.length === 0 && raiseError) {
+ $.error(`Failed to find ${Selector.BACKDROP} for ${Util.describe(context)}`)
+ }
+ return backdrop
+ }
+
+ // Find closest bmd-layout-container based on the given context
+ findContainer(raiseError = true, context = this.$element) {
+ let container = context.closest(Selector.CONTAINER)
+ if (container.length === 0 && raiseError) {
+ $.error(`Failed to find ${Selector.CONTAINER} for ${Util.describe(context)}`)
+ }
+ return container
+ }
+
+ // ------------------------------------------------------------------------
+ // private
+
+ // ------------------------------------------------------------------------
+ // static
+
+ }
+
+ return BaseLayout
+
+})(jQuery)
+
+export default BaseLayout
diff --git a/templates/assets/bootstrap-material-design/js/baseSelection.js b/templates/assets/bootstrap-material-design/js/baseSelection.js
new file mode 100644
index 0000000..765d1c3
--- /dev/null
+++ b/templates/assets/bootstrap-material-design/js/baseSelection.js
@@ -0,0 +1,93 @@
+import BaseInput from './baseInput'
+import Util from './util'
+
+const BaseSelection = (($) => {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ const Default = {
+ label: {
+ required: false
+
+ // Prioritized find order for resolving the label to be used as an bmd-label if not specified in the markup
+ // - a function(thisComponent); or
+ // - a string selector used like $bmdFormGroup.find(selector)
+ //
+ // Note this only runs if $bmdFormGroup.find(Selector.BMD_LABEL_WILDCARD) fails to find a label (as authored in the markup)
+ //
+ //selectors: [
+ // `.form-control-label`, // in the case of horizontal or inline forms, this will be marked
+ // `> label` // usual case for text inputs
+ //]
+ }
+ }
+
+ const Selector = {
+ LABEL: 'label'
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ class BaseSelection extends BaseInput {
+
+ constructor($element, config, properties) {
+ // properties = {inputType: checkbox, outerClass: checkbox-inline}
+ // '.checkbox|switch|radio > label > input[type=checkbox|radio]'
+ // '.${this.outerClass} > label > input[type=${this.inputType}]'
+
+ super($element, $.extend(true, {}, Default, config), properties)
+ this.decorateMarkup()
+ }
+
+ // ------------------------------------------------------------------------
+ // protected
+
+ decorateMarkup() {
+ this.$element.after(this.config.template)
+ }
+
+ // Demarcation element (e.g. first child of a form-group)
+ outerElement() {
+ // .checkbox|switch|radio > label > input[type=checkbox|radio]
+ // label.checkbox-inline > input[type=checkbox|radio]
+ // .${this.outerClass} > label > input[type=${this.inputType}]
+ return this.$element.parent().closest(`.${this.outerClass}`)
+ }
+
+ rejectWithoutRequiredStructure() {
+ // '.checkbox|switch|radio > label > input[type=checkbox|radio]'
+ // '.${this.outerClass} > label > input[type=${this.inputType}]'
+ Util.assert(this.$element, !this.$element.parent().prop('tagName') === 'label', `${this.constructor.name}'s ${Util.describe(this.$element)} parent element should be
+
+
+
+## Table of contents
+
+- [Quick start](#quick-start)
+- [Status](#status)
+- [What's included](#whats-included)
+- [Bugs and feature requests](#bugs-and-feature-requests)
+- [Documentation](#documentation)
+- [Contributing](#contributing)
+- [Community](#community)
+- [Versioning](#versioning)
+- [Creators](#creators)
+- [Copyright and license](#copyright-and-license)
+
+## Quick start
+
+Several quick start options are available:
+
+- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.0.0-alpha.6.zip)
+- Clone the repo: `git clone https://github.com/twbs/bootstrap.git`
+- Install with [npm](https://www.npmjs.com): `npm install bootstrap@4.0.0-alpha.6`
+- Install with [yarn](https://github.com/yarnpkg/yarn): `yarn add bootstrap@4.0.0-alpha.6`
+- Install with [Composer](https://getcomposer.org): `composer require twbs/bootstrap:4.0.0-alpha.6`
+- Install with [Bower](https://bower.io): `bower install bootstrap#v4.0.0-alpha.6`
+- Install with [NuGet](https://www.nuget.org): CSS: `Install-Package bootstrap -Pre` Sass: `Install-Package bootstrap.sass -Pre` (`-Pre` is only required until Bootstrap v4 has a stable release).
+
+Read the [Getting started page](https://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more.
+
+## Status
+
+[](https://bootstrap-slack.herokuapp.com)
+
+[](https://www.npmjs.com/package/bootstrap)
+[](https://rubygems.org/gems/bootstrap)
+[](https://travis-ci.org/twbs/bootstrap)
+[](https://david-dm.org/twbs/bootstrap?type=dev)
+[](https://atmospherejs.com/twbs/bootstrap)
+[](https://packagist.org/packages/twbs/bootstrap)
+[](https://www.nuget.org/packages/bootstrap/4.0.0-alpha5)
+
+[](https://saucelabs.com/u/bootstrap)
+
+## What's included
+
+Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this:
+
+```
+bootstrap/
+├── css/
+│ ├── bootstrap.css
+│ ├── bootstrap.css.map
+│ ├── bootstrap.min.css
+│ └── bootstrap.min.css.map
+└── js/
+ ├── bootstrap.js
+ └── bootstrap.min.js
+```
+
+We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). CSS [source maps](https://developers.google.com/web/tools/chrome-devtools/debug/readability/source-maps) (`bootstrap.*.map`) are available for use with certain browsers' developer tools.
+
+
+## Bugs and feature requests
+
+Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new).
+
+
+## Documentation
+
+Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](https://jekyllrb.com) and publicly hosted on GitHub Pages at . The docs may also be run locally.
+
+### Running documentation locally
+
+1. Run through the [tooling setup](https://github.com/twbs/bootstrap/blob/v4-dev/docs/getting-started/build-tools.md#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`.
+2. Run `grunt` (or a specific set of Grunt tasks) to rebuild distributed CSS and JavaScript files, as well as our docs assets.
+3. From the root `/bootstrap` directory, run `bundle exec jekyll serve` in the command line.
+4. Open in your browser, and voilà.
+
+Learn more about using Jekyll by reading its [documentation](https://jekyllrb.com/docs/home/).
+
+### Documentation for previous releases
+
+Documentation for v2.3.2 has been made available for the time being at while folks transition to Bootstrap 3.
+
+[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.
+
+
+
+## Contributing
+
+Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
+
+Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/master/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo).
+
+Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at .
+
+
+
+## Community
+
+Get updates on Bootstrap's development and chat with the project maintainers and community members.
+
+- Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap).
+- Read and subscribe to [The Official Bootstrap Blog](https://blog.getbootstrap.com).
+- Join [the official Slack room](https://bootstrap-slack.herokuapp.com).
+- Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel.
+- Implementation help may be found at Stack Overflow (tagged [`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4)).
+- Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability.
+
+
+
+## Versioning
+
+For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible.
+
+See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](https://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release.
+
+
+## Creators
+
+**Mark Otto**
+
+-
+-
+
+**Jacob Thornton**
+
+-
+-
+
+
+
+## Copyright and license
+
+Code and documentation copyright 2011-2017 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/master/LICENSE). Docs released under [Creative Commons](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE).
diff --git a/templates/assets/bootstrap/bower.json b/templates/assets/bootstrap/bower.json
new file mode 100644
index 0000000..5107709
--- /dev/null
+++ b/templates/assets/bootstrap/bower.json
@@ -0,0 +1,35 @@
+{
+ "name": "bootstrap",
+ "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
+ "keywords": [
+ "css",
+ "js",
+ "sass",
+ "mobile-first",
+ "responsive",
+ "front-end",
+ "framework",
+ "web"
+ ],
+ "homepage": "https://getbootstrap.com",
+ "license": "MIT",
+ "moduleType": "globals",
+ "main": [
+ "scss/bootstrap.scss",
+ "dist/js/bootstrap.js"
+ ],
+ "ignore": [
+ "/.*",
+ "_config.yml",
+ "CNAME",
+ "composer.json",
+ "CONTRIBUTING.md",
+ "docs",
+ "js/tests",
+ "test-infra"
+ ],
+ "dependencies": {
+ "jquery": ">=1.9.1",
+ "tether": "^1.4.0"
+ }
+}
diff --git a/templates/assets/bootstrap/grunt/change-version.js b/templates/assets/bootstrap/grunt/change-version.js
new file mode 100755
index 0000000..5ea5918
--- /dev/null
+++ b/templates/assets/bootstrap/grunt/change-version.js
@@ -0,0 +1,110 @@
+#!/usr/bin/env node
+
+'use strict'
+
+/*!
+ * Script to update version number references in the project.
+ * Copyright 2017 The Bootstrap Authors
+ * Copyright 2017 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/* global Set */
+
+var fs = require('fs')
+var path = require('path')
+var sh = require('shelljs')
+sh.config.fatal = true
+var sed = sh.sed
+
+// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
+RegExp.quote = function (string) {
+ return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
+}
+RegExp.quoteReplacement = function (string) {
+ return string.replace(/[$]/g, '$$')
+}
+
+var DRY_RUN = false
+
+function walkAsync(directory, excludedDirectories, fileCallback, errback) {
+ if (excludedDirectories.has(path.parse(directory).base)) {
+ return
+ }
+ fs.readdir(directory, function (err, names) {
+ if (err) {
+ errback(err)
+ return
+ }
+ names.forEach(function (name) {
+ var filepath = path.join(directory, name)
+ fs.lstat(filepath, function (err, stats) {
+ if (err) {
+ process.nextTick(errback, err)
+ return
+ }
+ if (stats.isSymbolicLink()) {
+ return
+ }
+ else if (stats.isDirectory()) {
+ process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback)
+ }
+ else if (stats.isFile()) {
+ process.nextTick(fileCallback, filepath)
+ }
+ })
+ })
+ })
+}
+
+function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
+ original = new RegExp(RegExp.quote(original), 'g')
+ replacement = RegExp.quoteReplacement(replacement)
+ var updateFile = !DRY_RUN ? function (filepath) {
+ if (allowedExtensions.has(path.parse(filepath).ext)) {
+ sed('-i', original, replacement, filepath)
+ }
+ } : function (filepath) {
+ if (allowedExtensions.has(path.parse(filepath).ext)) {
+ console.log('FILE: ' + filepath)
+ }
+ else {
+ console.log('EXCLUDED:' + filepath)
+ }
+ }
+ walkAsync(directory, excludedDirectories, updateFile, function (err) {
+ console.error('ERROR while traversing directory!:')
+ console.error(err)
+ process.exit(1)
+ })
+}
+
+function main(args) {
+ if (args.length !== 2) {
+ console.error('USAGE: change-version old_version new_version')
+ console.error('Got arguments:', args)
+ process.exit(1)
+ }
+ var oldVersion = args[0]
+ var newVersion = args[1]
+ var EXCLUDED_DIRS = new Set([
+ '.git',
+ 'node_modules',
+ 'vendor'
+ ])
+ var INCLUDED_EXTENSIONS = new Set([
+ // This extension whitelist is how we avoid modifying binary files
+ '',
+ '.css',
+ '.html',
+ '.js',
+ '.json',
+ '.md',
+ '.scss',
+ '.txt',
+ '.yml'
+ ])
+ replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion)
+}
+
+main(process.argv.slice(2))
diff --git a/templates/assets/bootstrap/grunt/gcp-key.json.enc b/templates/assets/bootstrap/grunt/gcp-key.json.enc
new file mode 100644
index 0000000..6e1856a
Binary files /dev/null and b/templates/assets/bootstrap/grunt/gcp-key.json.enc differ
diff --git a/templates/assets/bootstrap/grunt/npm-shrinkwrap.json b/templates/assets/bootstrap/grunt/npm-shrinkwrap.json
new file mode 100644
index 0000000..f35e330
--- /dev/null
+++ b/templates/assets/bootstrap/grunt/npm-shrinkwrap.json
@@ -0,0 +1,4164 @@
+{
+ "name": "bootstrap",
+ "version": "4.0.0-alpha.6",
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.0",
+ "from": "abbrev@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.3",
+ "from": "accepts@>=1.3.3 <1.4.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
+ "dev": true
+ },
+ "acorn": {
+ "version": "4.0.4",
+ "from": "acorn@4.0.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "from": "acorn-jsx@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "from": "acorn@>=3.0.4 <4.0.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "agent-base": {
+ "version": "2.0.1",
+ "from": "agent-base@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "from": "semver@>=5.0.1 <5.1.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "4.11.5",
+ "from": "ajv@>=4.7.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.5.tgz",
+ "dev": true
+ },
+ "ajv-keywords": {
+ "version": "1.5.1",
+ "from": "ajv-keywords@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "from": "align-text@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "from": "ansi-escapes@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "from": "ansi-regex@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "from": "ansi-styles@>=2.2.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "dev": true
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "from": "any-promise@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "1.3.0",
+ "from": "anymatch@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.1.1",
+ "from": "aproba@>=1.0.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz",
+ "dev": true
+ },
+ "archiver": {
+ "version": "1.3.0",
+ "from": "archiver@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "async": {
+ "version": "2.1.5",
+ "from": "async@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.1.5.tgz",
+ "dev": true
+ }
+ }
+ },
+ "archiver-utils": {
+ "version": "1.3.0",
+ "from": "archiver-utils@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+ "dev": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.2",
+ "from": "are-we-there-yet@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "from": "argparse@>=1.0.7 <2.0.0",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "dev": true
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "from": "arr-diff@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.0.1",
+ "from": "arr-flatten@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz",
+ "dev": true
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "from": "array-differ@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "from": "array-find-index@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "from": "array-union@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "dev": true
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "from": "array-uniq@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "from": "array-unique@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "from": "arrify@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.5",
+ "from": "asap@>=2.0.3 <2.1.0",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "from": "asn1@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "from": "assert-plus@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "from": "async@>=1.5.2 <1.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "from": "async-each@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "dev": true
+ },
+ "async-foreach": {
+ "version": "0.1.3",
+ "from": "async-foreach@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "from": "asynckit@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "6.7.7",
+ "from": "autoprefixer@>=6.7.7 <7.0.0",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "from": "aws-sign2@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "from": "aws4@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.22.0",
+ "from": "babel-code-frame@>=6.16.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-core": {
+ "version": "6.24.0",
+ "from": "babel-core@>=6.0.12 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.0.tgz",
+ "dev": true
+ },
+ "babel-eslint": {
+ "version": "7.1.1",
+ "from": "babel-eslint@>=7.1.1 <8.0.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.1.1.tgz",
+ "dev": true
+ },
+ "babel-generator": {
+ "version": "6.24.0",
+ "from": "babel-generator@>=6.24.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "jsesc": {
+ "version": "1.3.0",
+ "from": "jsesc@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.22.0",
+ "from": "babel-helper-call-delegate@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-helper-define-map": {
+ "version": "6.23.0",
+ "from": "babel-helper-define-map@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-helper-function-name": {
+ "version": "6.23.0",
+ "from": "babel-helper-function-name@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.22.0",
+ "from": "babel-helper-get-function-arity@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.22.0",
+ "from": "babel-helper-hoist-variables@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.23.0",
+ "from": "babel-helper-optimise-call-expression@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-helper-regex": {
+ "version": "6.22.0",
+ "from": "babel-helper-regex@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.23.0",
+ "from": "babel-helper-replace-supers@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-helpers": {
+ "version": "6.23.0",
+ "from": "babel-helpers@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "from": "babel-messages@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.0",
+ "from": "babel-plugin-transform-es2015-modules-amd@>=6.24.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.24.0",
+ "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.24.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-modules-strip": {
+ "version": "0.1.0",
+ "from": "babel-plugin-transform-es2015-modules-strip@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-strip/-/babel-plugin-transform-es2015-modules-strip-0.1.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.0",
+ "from": "babel-plugin-transform-es2015-modules-umd@>=6.24.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.22.0",
+ "from": "babel-plugin-transform-strict-mode@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz",
+ "dev": true
+ },
+ "babel-preset-es2015": {
+ "version": "6.24.0",
+ "from": "babel-preset-es2015@>=6.24.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.0.tgz",
+ "dev": true
+ },
+ "babel-register": {
+ "version": "6.24.0",
+ "from": "babel-register@>=6.24.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.0.tgz",
+ "dev": true
+ },
+ "babel-runtime": {
+ "version": "6.23.0",
+ "from": "babel-runtime@>=6.22.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-template": {
+ "version": "6.23.0",
+ "from": "babel-template@>=6.23.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
+ "dev": true
+ },
+ "babel-traverse": {
+ "version": "6.23.1",
+ "from": "babel-traverse@>=6.15.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
+ "dev": true
+ },
+ "babel-types": {
+ "version": "6.23.0",
+ "from": "babel-types@>=6.15.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
+ "dev": true
+ },
+ "babylon": {
+ "version": "6.16.1",
+ "from": "babylon@>=6.13.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.16.1.tgz",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "dev": true
+ },
+ "basic-auth": {
+ "version": "1.1.0",
+ "from": "basic-auth@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz",
+ "dev": true
+ },
+ "batch": {
+ "version": "0.5.3",
+ "from": "batch@0.5.3",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "binary-extensions": {
+ "version": "1.8.0",
+ "from": "binary-extensions@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz",
+ "dev": true
+ },
+ "bl": {
+ "version": "1.2.0",
+ "from": "bl@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.0.tgz",
+ "dev": true
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "from": "block-stream@*",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.5.0",
+ "from": "bluebird@>=3.0.6 <4.0.0",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.14.2",
+ "from": "body-parser@>=1.14.0 <1.15.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "from": "debug@>=2.2.0 <2.3.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.3.1",
+ "from": "http-errors@>=1.3.1 <1.4.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.13",
+ "from": "iconv-lite@0.4.13",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.1",
+ "from": "ms@0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "dev": true
+ },
+ "qs": {
+ "version": "5.2.0",
+ "from": "qs@5.2.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "from": "boom@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "from": "braces@>=1.8.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "dev": true
+ },
+ "browserslist": {
+ "version": "1.7.6",
+ "from": "browserslist@>=1.7.6 <2.0.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.6.tgz",
+ "dev": true
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "from": "buffer-crc32@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "dev": true
+ },
+ "buffer-shims": {
+ "version": "1.0.0",
+ "from": "buffer-shims@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "from": "builtin-modules@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "dev": true
+ },
+ "bulk-require": {
+ "version": "1.0.0",
+ "from": "bulk-require@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/bulk-require/-/bulk-require-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "glob": {
+ "version": "3.2.11",
+ "from": "glob@>=3.2.7 <3.3.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.3.0",
+ "from": "minimatch@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "bytes": {
+ "version": "2.2.0",
+ "from": "bytes@2.2.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "from": "caller-path@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "from": "callsites@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "from": "camelcase@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "from": "camelcase-keys@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "dev": true
+ },
+ "caniuse-db": {
+ "version": "1.0.30000637",
+ "from": "caniuse-db@>=1.0.30000634 <2.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000637.tgz",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "from": "caseless@>=0.11.0 <0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "from": "center-align@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "from": "chalk@>=1.1.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "from": "supports-color@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "chokidar": {
+ "version": "1.6.1",
+ "from": "chokidar@>=1.6.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.1",
+ "from": "circular-json@>=0.3.1 <0.4.0",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz",
+ "dev": true
+ },
+ "cjson": {
+ "version": "0.5.0",
+ "from": "cjson@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.5.0.tgz",
+ "dev": true
+ },
+ "clean-css": {
+ "version": "4.0.9",
+ "from": "clean-css@>=4.0.9 <5.0.0",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.9.tgz",
+ "dev": true
+ },
+ "clean-css-cli": {
+ "version": "4.0.9",
+ "from": "clean-css-cli@>=4.0.9 <5.0.0",
+ "resolved": "https://registry.npmjs.org/clean-css-cli/-/clean-css-cli-4.0.9.tgz",
+ "dev": true
+ },
+ "cli": {
+ "version": "0.6.6",
+ "from": "cli@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz",
+ "dev": true,
+ "dependencies": {
+ "glob": {
+ "version": "3.2.11",
+ "from": "glob@>=3.2.1 <3.3.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.3.0",
+ "from": "minimatch@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "cli-cursor": {
+ "version": "1.0.2",
+ "from": "cli-cursor@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "dev": true
+ },
+ "cli-spinners": {
+ "version": "1.0.0",
+ "from": "cli-spinners@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz",
+ "dev": true
+ },
+ "cli-width": {
+ "version": "2.1.0",
+ "from": "cli-width@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "from": "cliui@>=3.2.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "from": "co@>=4.6.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "from": "code-point-at@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "dev": true
+ },
+ "coffee-script": {
+ "version": "1.10.0",
+ "from": "coffee-script@>=1.10.0 <1.11.0",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "from": "colors@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "from": "combined-stream@>=1.0.5 <1.1.0",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.9.0",
+ "from": "commander@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "dev": true
+ },
+ "compress-commons": {
+ "version": "1.2.0",
+ "from": "compress-commons@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "from": "concat-stream@>=1.5.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "dev": true
+ },
+ "connect": {
+ "version": "3.6.0",
+ "from": "connect@>=3.4.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.6.1",
+ "from": "debug@2.6.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "connect-livereload": {
+ "version": "0.5.4",
+ "from": "connect-livereload@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "from": "console-browserify@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "from": "console-control-strings@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.2",
+ "from": "content-type@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.4.0",
+ "from": "convert-source-map@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.4.1",
+ "from": "core-js@>=2.4.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "from": "core-util-is@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "2.1.1",
+ "from": "cosmiconfig@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.1.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "from": "minimist@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "crc": {
+ "version": "3.4.4",
+ "from": "crc@>=3.4.4 <4.0.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
+ "dev": true
+ },
+ "crc32-stream": {
+ "version": "2.0.0",
+ "from": "crc32-stream@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "3.0.1",
+ "from": "cross-spawn@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": {
+ "version": "4.0.2",
+ "from": "lru-cache@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz",
+ "dev": true
+ }
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "from": "cryptiles@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "dev": true
+ },
+ "csslint": {
+ "version": "0.10.0",
+ "from": "csslint@0.10.0",
+ "resolved": "https://registry.npmjs.org/csslint/-/csslint-0.10.0.tgz",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "from": "currently-unhandled@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "dev": true
+ },
+ "d": {
+ "version": "1.0.0",
+ "from": "d@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "from": "dashdash@>=1.12.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "from": "date-now@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "dev": true
+ },
+ "date-time": {
+ "version": "1.1.0",
+ "from": "date-time@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz",
+ "dev": true
+ },
+ "dateformat": {
+ "version": "1.0.12",
+ "from": "dateformat@>=1.0.12 <1.1.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.3",
+ "from": "debug@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.3.tgz",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "from": "decamelize@>=1.1.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "from": "deep-is@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "dev": true
+ },
+ "del": {
+ "version": "2.2.2",
+ "from": "del@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "from": "delayed-stream@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "dev": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "from": "delegates@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.0",
+ "from": "depd@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "from": "destroy@>=1.0.4 <1.1.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "0.1.0",
+ "from": "detect-file@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "from": "detect-indent@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.0.0",
+ "from": "doctrine@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz",
+ "dev": true
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "from": "dom-serializer@>=0.0.0 <1.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "from": "domelementtype@>=1.1.1 <1.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "dev": true
+ },
+ "entities": {
+ "version": "1.1.1",
+ "from": "entities@>=1.1.1 <1.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "from": "domelementtype@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.3.0",
+ "from": "domhandler@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+ "dev": true
+ },
+ "domutils": {
+ "version": "1.5.1",
+ "from": "domutils@>=1.5.0 <1.6.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "from": "ecc-jsbn@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "from": "ee-first@1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.2.7",
+ "from": "electron-to-chromium@>=1.2.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.2.7.tgz",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.1",
+ "from": "encodeurl@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.0",
+ "from": "end-of-stream@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
+ "dev": true
+ },
+ "entities": {
+ "version": "1.0.0",
+ "from": "entities@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "from": "error-ex@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.14",
+ "from": "es5-ext@>=0.10.14 <0.11.0",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.14.tgz",
+ "dev": true
+ },
+ "es6-iterator": {
+ "version": "2.0.1",
+ "from": "es6-iterator@>=2.0.1 <2.1.0",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
+ "dev": true
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "from": "es6-map@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "dev": true
+ },
+ "es6-object-assign": {
+ "version": "1.1.0",
+ "from": "es6-object-assign@>=1.0.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
+ "dev": true
+ },
+ "es6-promise": {
+ "version": "4.0.5",
+ "from": "es6-promise@>=4.0.3 <4.1.0",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz",
+ "dev": true
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "from": "es6-set@>=0.1.5 <0.2.0",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "from": "es6-symbol@>=3.1.1 <3.2.0",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "dev": true
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "from": "es6-weak-map@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "from": "escape-html@>=1.0.3 <1.1.0",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "from": "escape-string-regexp@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "dev": true
+ },
+ "escope": {
+ "version": "3.6.0",
+ "from": "escope@>=3.6.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "dev": true
+ },
+ "eslint": {
+ "version": "3.18.0",
+ "from": "eslint@>=3.18.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.4.0",
+ "from": "espree@>=3.4.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.0.tgz",
+ "dev": true
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "from": "esprima@>=3.1.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "from": "esquery@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "dev": true
+ },
+ "esrecurse": {
+ "version": "4.1.0",
+ "from": "esrecurse@>=4.1.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "estraverse": {
+ "version": "4.1.1",
+ "from": "estraverse@>=4.1.0 <4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "from": "estraverse@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "from": "esutils@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.0",
+ "from": "etag@>=1.8.0 <1.9.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "from": "event-emitter@>=0.3.5 <0.4.0",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "dev": true
+ },
+ "eventemitter2": {
+ "version": "0.4.14",
+ "from": "eventemitter2@>=0.4.13 <0.5.0",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "dev": true
+ },
+ "exit": {
+ "version": "0.1.2",
+ "from": "exit@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "dev": true
+ },
+ "exit-hook": {
+ "version": "1.1.1",
+ "from": "exit-hook@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "from": "expand-brackets@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "dev": true
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "from": "expand-range@>=1.8.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "dev": true
+ },
+ "expand-tilde": {
+ "version": "1.2.2",
+ "from": "expand-tilde@>=1.2.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.0",
+ "from": "extend@>=3.0.0 <3.1.0",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
+ "dev": true
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "from": "extglob@>=0.3.1 <0.4.0",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "dev": true
+ },
+ "extract-zip": {
+ "version": "1.5.0",
+ "from": "extract-zip@>=1.5.0 <1.6.0",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.5.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.5.0",
+ "from": "concat-stream@1.5.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz",
+ "dev": true
+ },
+ "debug": {
+ "version": "0.7.4",
+ "from": "debug@0.7.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.0",
+ "from": "mkdirp@0.5.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "from": "readable-stream@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "dev": true
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "from": "extsprintf@1.0.2",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "from": "fast-levenshtein@>=2.0.4 <2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "dev": true
+ },
+ "faye-websocket": {
+ "version": "0.10.0",
+ "from": "faye-websocket@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "from": "fd-slicer@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "dev": true
+ },
+ "fg-lodash": {
+ "version": "0.0.2",
+ "from": "fg-lodash@0.0.2",
+ "resolved": "https://registry.npmjs.org/fg-lodash/-/fg-lodash-0.0.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "2.4.2",
+ "from": "lodash@>=2.4.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "2.3.3",
+ "from": "underscore.string@>=2.3.3 <2.4.0",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
+ "dev": true
+ }
+ }
+ },
+ "figures": {
+ "version": "1.7.0",
+ "from": "figures@>=1.3.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "from": "file-entry-cache@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "dev": true
+ },
+ "file-sync-cmp": {
+ "version": "0.1.1",
+ "from": "file-sync-cmp@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
+ "dev": true
+ },
+ "filename-regex": {
+ "version": "2.0.0",
+ "from": "filename-regex@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "from": "fill-range@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "dev": true
+ },
+ "finalhandler": {
+ "version": "1.0.0",
+ "from": "finalhandler@1.0.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.6.1",
+ "from": "debug@2.6.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "from": "find-up@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "dev": true
+ },
+ "findup-sync": {
+ "version": "0.3.0",
+ "from": "findup-sync@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "from": "glob@>=5.0.0 <5.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "dev": true
+ }
+ }
+ },
+ "fined": {
+ "version": "1.0.2",
+ "from": "fined@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.0.2.tgz",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "0.3.2",
+ "from": "flagged-respawn@>=0.3.2 <0.4.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.2.2",
+ "from": "flat-cache@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz",
+ "dev": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "from": "for-in@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "from": "for-own@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "from": "forever-agent@>=0.6.1 <0.7.0",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.2",
+ "from": "form-data@>=2.1.1 <2.2.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.5.0",
+ "from": "fresh@0.5.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "from": "fs-exists-sync@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "1.0.0",
+ "from": "fs-extra@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
+ "dev": true
+ },
+ "fs-promise": {
+ "version": "1.0.0",
+ "from": "fs-promise@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-1.0.0.tgz",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "from": "fs.realpath@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "dev": true
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "from": "fstream@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "dev": true
+ },
+ "gauge": {
+ "version": "2.7.3",
+ "from": "gauge@>=2.7.1 <2.8.0",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz",
+ "dev": true
+ },
+ "gaze": {
+ "version": "1.1.2",
+ "from": "gaze@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
+ "dev": true
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "from": "generate-function@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "from": "generate-object-property@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "from": "get-caller-file@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "from": "get-stdin@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "dev": true
+ },
+ "getobject": {
+ "version": "0.1.0",
+ "from": "getobject@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.6",
+ "from": "getpass@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "from": "glob@>=7.0.3 <8.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "dev": true
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "from": "glob-base@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "dev": true
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "from": "glob-parent@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "dev": true
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "from": "global-modules@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "dev": true
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "from": "global-prefix@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "dev": true
+ },
+ "globals": {
+ "version": "9.16.0",
+ "from": "globals@>=9.0.0 <10.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.16.0.tgz",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "from": "globby@>=5.0.0 <6.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "dev": true
+ },
+ "globule": {
+ "version": "1.1.0",
+ "from": "globule@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "4.16.6",
+ "from": "lodash@>=4.16.4 <4.17.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz",
+ "dev": true
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "from": "graceful-fs@>=4.1.2 <5.0.0",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "from": "graceful-readlink@>=1.0.0",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "dev": true
+ },
+ "grunt": {
+ "version": "1.0.1",
+ "from": "grunt@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "from": "esprima@>=2.6.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.0.6",
+ "from": "glob@>=7.0.0 <7.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+ "dev": true
+ },
+ "grunt-cli": {
+ "version": "1.2.0",
+ "from": "grunt-cli@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.5.5",
+ "from": "js-yaml@>=3.5.2 <3.6.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "from": "resolve@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.2.8",
+ "from": "rimraf@>=2.2.8 <2.3.0",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-babel": {
+ "version": "6.0.0",
+ "from": "grunt-babel@>=6.0.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-babel/-/grunt-babel-6.0.0.tgz",
+ "dev": true
+ },
+ "grunt-build-control": {
+ "version": "0.7.1",
+ "from": "grunt-build-control@>=0.7.1 <0.8.0",
+ "resolved": "https://registry.npmjs.org/grunt-build-control/-/grunt-build-control-0.7.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "semver": {
+ "version": "4.3.6",
+ "from": "semver@>=4.3.3 <4.4.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.2.6",
+ "from": "shelljs@>=0.2.6 <0.3.0",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-contrib-clean": {
+ "version": "1.0.0",
+ "from": "grunt-contrib-clean@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.0.0.tgz",
+ "dev": true
+ },
+ "grunt-contrib-compress": {
+ "version": "1.4.1",
+ "from": "grunt-contrib-compress@>=1.4.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.4.1.tgz",
+ "dev": true
+ },
+ "grunt-contrib-concat": {
+ "version": "1.0.1",
+ "from": "grunt-contrib-concat@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz",
+ "dev": true
+ },
+ "grunt-contrib-connect": {
+ "version": "1.0.2",
+ "from": "grunt-contrib-connect@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz",
+ "dev": true
+ },
+ "grunt-contrib-copy": {
+ "version": "1.0.0",
+ "from": "grunt-contrib-copy@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
+ "dev": true
+ },
+ "grunt-contrib-qunit": {
+ "version": "1.3.0",
+ "from": "grunt-contrib-qunit@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-1.3.0.tgz",
+ "dev": true
+ },
+ "grunt-contrib-watch": {
+ "version": "1.0.0",
+ "from": "grunt-contrib-watch@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "from": "lodash@>=3.10.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-exec": {
+ "version": "2.0.0",
+ "from": "grunt-exec@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-2.0.0.tgz",
+ "dev": true
+ },
+ "grunt-known-options": {
+ "version": "1.1.0",
+ "from": "grunt-known-options@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz",
+ "dev": true
+ },
+ "grunt-legacy-log": {
+ "version": "1.0.0",
+ "from": "grunt-legacy-log@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "from": "lodash@>=3.10.1 <3.11.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-legacy-log-utils": {
+ "version": "1.0.0",
+ "from": "grunt-legacy-log-utils@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "4.3.0",
+ "from": "lodash@>=4.3.0 <4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-legacy-util": {
+ "version": "1.0.0",
+ "from": "grunt-legacy-util@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "4.3.0",
+ "from": "lodash@>=4.3.0 <4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-lib-phantomjs": {
+ "version": "1.1.0",
+ "from": "grunt-lib-phantomjs@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-1.1.0.tgz",
+ "dev": true
+ },
+ "grunt-saucelabs": {
+ "version": "9.0.0",
+ "from": "grunt-saucelabs@>=9.0.0 <10.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-saucelabs/-/grunt-saucelabs-9.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "4.13.1",
+ "from": "lodash@>=4.13.1 <4.14.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-stamp": {
+ "version": "0.3.0",
+ "from": "grunt-stamp@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/grunt-stamp/-/grunt-stamp-0.3.0.tgz",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "from": "har-validator@>=2.0.6 <2.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "from": "has-ansi@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "from": "has-flag@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "dev": true
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "from": "has-unicode@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "dev": true
+ },
+ "hasha": {
+ "version": "2.2.0",
+ "from": "hasha@>=2.2.0 <2.3.0",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
+ "dev": true
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "from": "hawk@>=3.1.3 <3.2.0",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "from": "hoek@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "from": "home-or-tmp@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "dev": true
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "from": "homedir-polyfill@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "dev": true
+ },
+ "hooker": {
+ "version": "0.2.3",
+ "from": "hooker@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.3.1",
+ "from": "hosted-git-info@>=2.1.4 <3.0.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.3.1.tgz",
+ "dev": true
+ },
+ "htmlhint": {
+ "version": "0.9.13",
+ "from": "htmlhint@>=0.9.13 <0.10.0",
+ "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.9.13.tgz",
+ "dev": true,
+ "dependencies": {
+ "async": {
+ "version": "1.4.2",
+ "from": "async@1.4.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "from": "colors@1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.6.0",
+ "from": "commander@2.6.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
+ "dev": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "from": "glob@5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "1.0.4",
+ "from": "strip-json-comments@1.0.4",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+ "dev": true
+ }
+ }
+ },
+ "htmllint": {
+ "version": "0.6.0",
+ "from": "htmllint@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/htmllint/-/htmllint-0.6.0.tgz",
+ "dev": true
+ },
+ "htmllint-cli": {
+ "version": "0.0.6",
+ "from": "htmllint-cli@>=0.0.6 <0.0.7",
+ "resolved": "https://registry.npmjs.org/htmllint-cli/-/htmllint-cli-0.0.6.tgz",
+ "dev": true
+ },
+ "htmlparser2": {
+ "version": "3.8.3",
+ "from": "htmlparser2@>=3.8.0 <3.9.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "from": "isarray@0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "from": "readable-stream@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "dev": true
+ }
+ }
+ },
+ "http-errors": {
+ "version": "1.5.1",
+ "from": "http-errors@>=1.5.0 <1.6.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "from": "http-signature@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "dev": true
+ },
+ "http2": {
+ "version": "3.3.6",
+ "from": "http2@>=3.3.4 <4.0.0",
+ "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.6.tgz",
+ "dev": true
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "from": "https-proxy-agent@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.15",
+ "from": "iconv-lite@>=0.4.13 <0.5.0",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.2.6",
+ "from": "ignore@>=3.2.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.6.tgz",
+ "dev": true
+ },
+ "iltorb": {
+ "version": "1.0.13",
+ "from": "iltorb@>=1.0.13 <2.0.0",
+ "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-1.0.13.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "from": "imurmurhash@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "dev": true
+ },
+ "in-publish": {
+ "version": "2.0.0",
+ "from": "in-publish@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "from": "indent-string@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "from": "inflight@>=1.0.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "from": "inherits@>=2.0.3 <3.0.0",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.4",
+ "from": "ini@>=1.3.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "0.12.0",
+ "from": "inquirer@>=0.12.0 <0.13.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
+ "dev": true
+ },
+ "interpret": {
+ "version": "1.0.1",
+ "from": "interpret@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "from": "invariant@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "from": "invert-kv@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "0.2.6",
+ "from": "is-absolute@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "from": "is-arrayish@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "from": "is-binary-path@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.5",
+ "from": "is-buffer@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "from": "is-builtin-module@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "dev": true
+ },
+ "is-dotfile": {
+ "version": "1.0.2",
+ "from": "is-dotfile@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "from": "is-equal-shallow@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "dev": true
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "from": "is-extendable@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "from": "is-extglob@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "from": "is-finite@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "from": "is-glob@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "dev": true
+ },
+ "is-my-json-valid": {
+ "version": "2.16.0",
+ "from": "is-my-json-valid@>=2.10.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz",
+ "dev": true
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "from": "is-number@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "dev": true
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "from": "is-path-cwd@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "from": "is-path-in-cwd@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "dev": true
+ },
+ "is-path-inside": {
+ "version": "1.0.0",
+ "from": "is-path-inside@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz",
+ "dev": true
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "from": "is-posix-bracket@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "from": "is-primitive@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "from": "is-property@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "0.2.1",
+ "from": "is-relative@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz",
+ "dev": true
+ },
+ "is-resolvable": {
+ "version": "1.0.0",
+ "from": "is-resolvable@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "from": "is-stream@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "dev": true
+ },
+ "is-travis": {
+ "version": "1.0.0",
+ "from": "is-travis@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-travis/-/is-travis-1.0.0.tgz",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "from": "is-typedarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "0.1.2",
+ "from": "is-unc-path@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "from": "is-utf8@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "from": "is-windows@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "from": "isarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "dev": true
+ },
+ "isexe": {
+ "version": "1.1.2",
+ "from": "isexe@>=1.1.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "from": "isobject@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "from": "isstream@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "dev": true
+ },
+ "jju": {
+ "version": "1.3.0",
+ "from": "jju@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz",
+ "dev": true
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "from": "jodid25519@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "jquery": {
+ "version": "3.2.0",
+ "from": "jquery@>=1.9.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.0.tgz"
+ },
+ "js-base64": {
+ "version": "2.1.9",
+ "from": "js-base64@>=2.1.9 <3.0.0",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.1",
+ "from": "js-tokens@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.8.2",
+ "from": "js-yaml@>=3.5.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.2.tgz",
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "from": "jsbn@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "0.5.0",
+ "from": "jsesc@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "dev": true
+ },
+ "jshint": {
+ "version": "2.8.0",
+ "from": "jshint@2.8.0",
+ "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "3.7.0",
+ "from": "lodash@>=3.7.0 <3.8.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "from": "minimatch@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.3.0",
+ "from": "shelljs@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "1.0.4",
+ "from": "strip-json-comments@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+ "dev": true
+ }
+ }
+ },
+ "json-parse-helpfulerror": {
+ "version": "1.0.3",
+ "from": "json-parse-helpfulerror@>=1.0.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "from": "json-schema@0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "from": "json-stable-stringify@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "from": "json-stringify-safe@>=5.0.1 <5.1.0",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "from": "json5@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "from": "jsonfile@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "dev": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "from": "jsonify@>=0.0.0 <0.1.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "from": "jsonpointer@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "from": "jsprim@>=1.2.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "kew": {
+ "version": "0.7.0",
+ "from": "kew@>=0.7.0 <0.8.0",
+ "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.1.0",
+ "from": "kind-of@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
+ "dev": true
+ },
+ "klaw": {
+ "version": "1.3.1",
+ "from": "klaw@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "dev": true
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "from": "lazy-cache@>=1.0.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "dev": true
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "from": "lazystream@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "from": "lcid@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "from": "levn@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "dev": true
+ },
+ "liftoff": {
+ "version": "2.3.0",
+ "from": "liftoff@>=2.3.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "findup-sync": {
+ "version": "0.4.3",
+ "from": "findup-sync@>=0.4.2 <0.5.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz",
+ "dev": true
+ }
+ }
+ },
+ "livereload-js": {
+ "version": "2.2.2",
+ "from": "livereload-js@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz",
+ "dev": true
+ },
+ "load-grunt-tasks": {
+ "version": "3.5.2",
+ "from": "load-grunt-tasks@>=3.5.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.5.2.tgz",
+ "dev": true
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "from": "load-json-file@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "from": "strip-bom@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "from": "lodash@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "dev": true
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "from": "lodash.assign@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "dev": true
+ },
+ "lodash.assignwith": {
+ "version": "4.2.0",
+ "from": "lodash.assignwith@>=4.0.7 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz",
+ "dev": true
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "from": "lodash.clonedeep@>=4.3.2 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "dev": true
+ },
+ "lodash.isempty": {
+ "version": "4.4.0",
+ "from": "lodash.isempty@>=4.2.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "from": "lodash.isplainobject@>=4.0.4 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "dev": true
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "from": "lodash.isstring@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "dev": true
+ },
+ "lodash.mapvalues": {
+ "version": "4.6.0",
+ "from": "lodash.mapvalues@>=4.4.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+ "dev": true
+ },
+ "lodash.mergewith": {
+ "version": "4.6.0",
+ "from": "lodash.mergewith@>=4.6.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz",
+ "dev": true
+ },
+ "lodash.pick": {
+ "version": "4.4.0",
+ "from": "lodash.pick@>=4.2.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "dev": true
+ },
+ "lodash.pickby": {
+ "version": "4.6.0",
+ "from": "lodash.pickby@>=4.6.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "from": "log-symbols@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "from": "longest@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "from": "loose-envify@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "dev": true
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "from": "loud-rejection@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "from": "lru-cache@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "dev": true
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "from": "map-cache@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "from": "map-obj@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "dev": true
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "from": "media-typer@0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "from": "meow@>=3.3.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "from": "minimist@>=1.1.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "from": "micromatch@>=2.3.7 <3.0.0",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.3.4",
+ "from": "mime@1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.26.0",
+ "from": "mime-db@>=1.26.0 <1.27.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.14",
+ "from": "mime-types@>=2.1.11 <2.2.0",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz",
+ "dev": true
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "from": "mimic-fn@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "dev": true
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "from": "minimist@0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "from": "mkdirp@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "dev": true
+ },
+ "morgan": {
+ "version": "1.8.1",
+ "from": "morgan@>=1.6.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.6.1",
+ "from": "debug@2.6.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "from": "ms@0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "dev": true
+ },
+ "multimatch": {
+ "version": "2.1.0",
+ "from": "multimatch@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.5",
+ "from": "mute-stream@0.0.5",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.6.0",
+ "from": "mz@>=2.3.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.6.0.tgz",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.5.1",
+ "from": "nan@>=2.4.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.5.1.tgz",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "from": "natural-compare@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "from": "negotiator@0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "dev": true
+ },
+ "node-gyp": {
+ "version": "3.6.0",
+ "from": "node-gyp@>=3.3.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz",
+ "dev": true
+ },
+ "node-sass": {
+ "version": "4.5.0",
+ "from": "node-sass@>=4.5.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.0.tgz",
+ "dev": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "from": "nopt@>=3.0.6 <3.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.3.6",
+ "from": "normalize-package-data@>=2.3.4 <3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.6.tgz",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "2.0.1",
+ "from": "normalize-path@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "from": "normalize-range@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "dev": true
+ },
+ "npmlog": {
+ "version": "4.0.2",
+ "from": "npmlog@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz",
+ "dev": true
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "from": "num2fraction@>=1.2.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "from": "number-is-nan@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "from": "oauth-sign@>=0.8.1 <0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "from": "object-assign@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "dev": true
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "from": "object.omit@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "from": "on-finished@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "dev": true
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "from": "on-headers@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "from": "once@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "dev": true
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "from": "onetime@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "dev": true
+ },
+ "opn": {
+ "version": "4.0.2",
+ "from": "opn@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "from": "optionator@>=0.8.2 <0.9.0",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "dev": true
+ },
+ "ora": {
+ "version": "1.1.0",
+ "from": "ora@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-1.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "cli-cursor": {
+ "version": "2.1.0",
+ "from": "cli-cursor@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "dev": true
+ },
+ "onetime": {
+ "version": "2.0.0",
+ "from": "onetime@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.0.tgz",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "from": "restore-cursor@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "from": "os-homedir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "from": "os-locale@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "from": "os-tmpdir@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "from": "osenv@>=0.0.0 <1.0.0",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+ "dev": true
+ },
+ "package": {
+ "version": "1.0.1",
+ "from": "package@>=1.0.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz",
+ "dev": true
+ },
+ "parse-filepath": {
+ "version": "1.0.1",
+ "from": "parse-filepath@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz",
+ "dev": true
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "from": "parse-glob@3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "from": "parse-json@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "dev": true
+ },
+ "parse-ms": {
+ "version": "1.0.1",
+ "from": "parse-ms@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz",
+ "dev": true
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "from": "parse-passwd@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "dev": true
+ },
+ "parserlib": {
+ "version": "0.2.5",
+ "from": "parserlib@>=0.2.2 <0.3.0",
+ "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-0.2.5.tgz",
+ "dev": true
+ },
+ "parseurl": {
+ "version": "1.3.1",
+ "from": "parseurl@>=1.3.1 <1.4.0",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "from": "path-exists@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "from": "path-is-absolute@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "from": "path-is-inside@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "from": "path-parse@>=1.0.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "from": "path-root@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "dev": true
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "from": "path-root-regex@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "from": "path-type@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "dev": true
+ },
+ "pend": {
+ "version": "1.2.0",
+ "from": "pend@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "dev": true
+ },
+ "phantomjs-prebuilt": {
+ "version": "2.1.14",
+ "from": "phantomjs-prebuilt@>=2.1.3 <3.0.0",
+ "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "from": "pify@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "from": "pinkie@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "from": "pinkie-promise@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "dev": true
+ },
+ "pkg-up": {
+ "version": "1.0.0",
+ "from": "pkg-up@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz",
+ "dev": true
+ },
+ "plur": {
+ "version": "1.0.0",
+ "from": "plur@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz",
+ "dev": true
+ },
+ "pluralize": {
+ "version": "1.2.1",
+ "from": "pluralize@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
+ "dev": true
+ },
+ "portscanner": {
+ "version": "1.2.0",
+ "from": "portscanner@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.16",
+ "from": "postcss@>=5.2.16 <6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz",
+ "dev": true
+ },
+ "postcss-cli": {
+ "version": "3.0.0",
+ "from": "postcss-cli@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-3.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "from": "camelcase@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "5.0.1",
+ "from": "get-stdin@>=5.0.1 <6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
+ "dev": true
+ },
+ "globby": {
+ "version": "6.1.0",
+ "from": "globby@>=6.1.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "dev": true
+ },
+ "yargs": {
+ "version": "7.0.2",
+ "from": "yargs@>=7.0.2 <8.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.0.2.tgz",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "from": "yargs-parser@>=5.0.0 <6.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "postcss-flexbugs-fixes": {
+ "version": "2.1.0",
+ "from": "postcss-flexbugs-fixes@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-2.1.0.tgz",
+ "dev": true
+ },
+ "postcss-load-config": {
+ "version": "1.2.0",
+ "from": "postcss-load-config@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz",
+ "dev": true
+ },
+ "postcss-load-options": {
+ "version": "1.2.0",
+ "from": "postcss-load-options@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz",
+ "dev": true
+ },
+ "postcss-load-plugins": {
+ "version": "2.3.0",
+ "from": "postcss-load-plugins@>=2.3.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
+ "dev": true
+ },
+ "postcss-reporter": {
+ "version": "3.0.0",
+ "from": "postcss-reporter@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-3.0.0.tgz",
+ "dev": true
+ },
+ "postcss-value-parser": {
+ "version": "3.3.0",
+ "from": "postcss-value-parser@>=3.2.3 <4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "from": "prelude-ls@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "from": "preserve@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "3.0.1",
+ "from": "pretty-bytes@>=3.0.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
+ "dev": true
+ },
+ "pretty-ms": {
+ "version": "2.1.0",
+ "from": "pretty-ms@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.7",
+ "from": "private@>=0.1.6 <0.2.0",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "from": "process-nextick-args@>=1.0.6 <1.1.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "dev": true
+ },
+ "progress": {
+ "version": "1.1.8",
+ "from": "progress@>=1.1.8 <2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+ "dev": true
+ },
+ "promise": {
+ "version": "7.1.1",
+ "from": "promise@>=7.1.1 <8.0.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "from": "pseudomap@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "from": "punycode@>=1.4.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "from": "q@>=1.4.1 <1.5.0",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.3.2",
+ "from": "qs@>=6.3.0 <6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.6",
+ "from": "randomatic@>=1.1.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
+ "dev": true
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "from": "range-parser@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.1.7",
+ "from": "raw-body@>=2.1.5 <2.2.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz",
+ "dev": true,
+ "dependencies": {
+ "bytes": {
+ "version": "2.4.0",
+ "from": "bytes@2.4.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.13",
+ "from": "iconv-lite@0.4.13",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "from": "read-pkg@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "dev": true
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "from": "read-pkg-up@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.2.6",
+ "from": "readable-stream@>=2.2.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.6.tgz",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "from": "readdirp@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "dev": true
+ },
+ "readline2": {
+ "version": "1.0.1",
+ "from": "readline2@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
+ "dev": true
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "from": "rechoir@>=0.6.2 <0.7.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "dev": true
+ },
+ "redent": {
+ "version": "1.0.0",
+ "from": "redent@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.2",
+ "from": "regenerate@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.10.3",
+ "from": "regenerator-runtime@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.9.8",
+ "from": "regenerator-transform@0.9.8",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.8.tgz",
+ "dev": true
+ },
+ "regex-cache": {
+ "version": "0.4.3",
+ "from": "regex-cache@>=0.4.2 <0.5.0",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "from": "regexpu-core@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "dev": true
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "from": "regjsgen@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "from": "regjsparser@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "from": "repeat-element@>=1.1.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "from": "repeat-string@>=1.5.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "from": "repeating@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "dev": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "from": "request@>=2.79.0 <2.80.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "dev": true
+ },
+ "request-progress": {
+ "version": "2.0.1",
+ "from": "request-progress@>=2.0.1 <2.1.0",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
+ "dev": true
+ },
+ "requestretry": {
+ "version": "1.9.1",
+ "from": "requestretry@>=1.9.0 <1.10.0",
+ "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.9.1.tgz",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "from": "require-directory@>=2.1.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "1.2.1",
+ "from": "require-from-string@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "from": "require-main-filename@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "from": "require-uncached@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.3.2",
+ "from": "resolve@>=1.1.6 <2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz",
+ "dev": true
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "from": "resolve-dir@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "from": "resolve-from@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "dev": true
+ },
+ "resolve-pkg": {
+ "version": "0.1.0",
+ "from": "resolve-pkg@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-0.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": {
+ "version": "2.0.0",
+ "from": "resolve-from@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "restore-cursor": {
+ "version": "1.0.1",
+ "from": "restore-cursor@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "dev": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "from": "right-align@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "from": "rimraf@>=2.2.8 <3.0.0",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
+ "dev": true
+ },
+ "run-async": {
+ "version": "0.1.0",
+ "from": "run-async@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
+ "dev": true
+ },
+ "rx-lite": {
+ "version": "3.1.2",
+ "from": "rx-lite@>=3.1.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
+ "dev": true
+ },
+ "sass-graph": {
+ "version": "2.1.2",
+ "from": "sass-graph@>=2.1.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.1.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "from": "camelcase@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "dev": true
+ },
+ "yargs": {
+ "version": "4.8.1",
+ "from": "yargs@>=4.7.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "2.4.1",
+ "from": "yargs-parser@>=2.4.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "sauce-tunnel": {
+ "version": "2.5.0",
+ "from": "sauce-tunnel@>=2.5.0 <2.6.0",
+ "resolved": "https://registry.npmjs.org/sauce-tunnel/-/sauce-tunnel-2.5.0.tgz",
+ "dev": true
+ },
+ "saucelabs": {
+ "version": "1.2.0",
+ "from": "saucelabs@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.2.0.tgz",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.3.0",
+ "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "dev": true
+ },
+ "send": {
+ "version": "0.15.1",
+ "from": "send@0.15.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.15.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.6.1",
+ "from": "debug@2.6.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.1",
+ "from": "http-errors@>=1.6.1 <1.7.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "from": "setprototypeof@1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "dev": true
+ }
+ }
+ },
+ "serve-index": {
+ "version": "1.8.0",
+ "from": "serve-index@>=1.7.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "from": "debug@>=2.2.0 <2.3.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.1",
+ "from": "ms@0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.12.1",
+ "from": "serve-static@>=1.10.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.1.tgz",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "from": "set-blocking@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "from": "set-immediate-shim@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.2",
+ "from": "setprototypeof@1.0.2",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.7.7",
+ "from": "shelljs@>=0.7.7 <0.8.0",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz",
+ "dev": true
+ },
+ "shx": {
+ "version": "0.2.2",
+ "from": "shx@>=0.2.2 <0.3.0",
+ "resolved": "https://registry.npmjs.org/shx/-/shx-0.2.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "from": "minimist@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "from": "sigmund@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "from": "signal-exit@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "from": "slash@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "0.0.4",
+ "from": "slice-ansi@0.0.4",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
+ "dev": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "from": "sntp@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.6",
+ "from": "source-map@>=0.5.6 <0.6.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.4.14",
+ "from": "source-map-support@>=0.4.2 <0.5.0",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.14.tgz",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "from": "spdx-correct@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "from": "spdx-expression-parse@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "from": "spdx-license-ids@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "dev": true
+ },
+ "split": {
+ "version": "1.0.0",
+ "from": "split@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "from": "sprintf-js@>=1.0.2 <1.1.0",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.11.0",
+ "from": "sshpk@>=1.7.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "from": "statuses@>=1.3.1 <1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "dev": true
+ },
+ "stdout-stream": {
+ "version": "1.4.0",
+ "from": "stdout-stream@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
+ "dev": true
+ },
+ "stream-buffers": {
+ "version": "2.2.0",
+ "from": "stream-buffers@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "from": "string_decoder@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "from": "string-width@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "dev": true
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "from": "stringstream@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "from": "strip-ansi@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "from": "strip-bom@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "from": "strip-indent@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "from": "strip-json-comments@>=2.0.1 <2.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "from": "supports-color@>=3.2.3 <4.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "dev": true
+ },
+ "table": {
+ "version": "3.8.3",
+ "from": "table@>=3.7.8 <4.0.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.0.0",
+ "from": "string-width@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "tar": {
+ "version": "2.2.1",
+ "from": "tar@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "dev": true
+ },
+ "tar-stream": {
+ "version": "1.5.2",
+ "from": "tar-stream@>=1.5.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "dev": true
+ },
+ "temporary": {
+ "version": "0.0.8",
+ "from": "temporary@>=0.0.8 <0.0.9",
+ "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz",
+ "dev": true
+ },
+ "tether": {
+ "version": "1.4.0",
+ "from": "tether@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz"
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "from": "text-table@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.2.1",
+ "from": "thenify@>=3.1.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.2.1.tgz",
+ "dev": true
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "from": "thenify-all@>=1.6.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "dev": true
+ },
+ "throttleit": {
+ "version": "1.0.0",
+ "from": "throttleit@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "from": "through@>=2.3.6 <3.0.0",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "dev": true
+ },
+ "time-grunt": {
+ "version": "1.4.0",
+ "from": "time-grunt@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz",
+ "dev": true
+ },
+ "time-zone": {
+ "version": "0.1.0",
+ "from": "time-zone@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz",
+ "dev": true
+ },
+ "tiny-lr": {
+ "version": "0.2.1",
+ "from": "tiny-lr@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "from": "debug@>=2.2.0 <2.3.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.1",
+ "from": "ms@0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "dev": true
+ },
+ "qs": {
+ "version": "5.1.0",
+ "from": "qs@>=5.1.0 <5.2.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.2",
+ "from": "to-fast-properties@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "from": "tough-cookie@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
+ "dev": true
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "from": "trim-newlines@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "from": "trim-right@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "dev": true
+ },
+ "tryit": {
+ "version": "1.0.3",
+ "from": "tryit@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "from": "tunnel-agent@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "from": "tweetnacl@>=0.14.0 <0.15.0",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "from": "type-check@>=0.3.2 <0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.14",
+ "from": "type-is@>=1.6.10 <1.7.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "from": "typedarray@>=0.0.6 <0.0.7",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.14",
+ "from": "uglify-js@>=2.8.14 <3.0.0",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.14.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "from": "camelcase@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "dev": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "from": "cliui@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "dev": true
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "from": "window-size@0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "from": "wordwrap@0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "dev": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "from": "yargs@>=3.10.0 <3.11.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "from": "uglify-to-browserify@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "dev": true
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "from": "unc-path-regex@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.2.3",
+ "from": "underscore.string@>=3.2.3 <3.3.0",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "from": "unpipe@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "dev": true
+ },
+ "user-home": {
+ "version": "2.0.0",
+ "from": "user-home@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "from": "util-deprecate@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.0",
+ "from": "utils-merge@1.0.0",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "from": "uuid@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "from": "validate-npm-package-license@>=3.0.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.3.6",
+ "from": "verror@1.3.6",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
+ "dev": true
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "from": "walkdir@>=0.0.11 <0.0.12",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "dev": true
+ },
+ "websocket-driver": {
+ "version": "0.6.5",
+ "from": "websocket-driver@>=0.5.1",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+ "dev": true
+ },
+ "websocket-extensions": {
+ "version": "0.1.1",
+ "from": "websocket-extensions@>=0.1.1",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
+ "dev": true
+ },
+ "when": {
+ "version": "3.7.8",
+ "from": "when@>=3.7.5 <3.8.0",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+ "dev": true
+ },
+ "which": {
+ "version": "1.2.12",
+ "from": "which@>=1.2.1 <1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.12.tgz",
+ "dev": true
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "from": "which-module@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.0",
+ "from": "wide-align@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz",
+ "dev": true
+ },
+ "window-size": {
+ "version": "0.2.0",
+ "from": "window-size@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "from": "wordwrap@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "from": "wrap-ansi@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "from": "wrappy@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "from": "write@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "dev": true
+ },
+ "xml": {
+ "version": "1.0.0",
+ "from": "xml@1.0.0",
+ "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.0.tgz",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "from": "xtend@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "from": "y18n@>=3.2.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "from": "yallist@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "dev": true
+ },
+ "yargs": {
+ "version": "6.6.0",
+ "from": "yargs@>=6.6.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "from": "camelcase@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "4.2.1",
+ "from": "yargs-parser@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "from": "camelcase@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "from": "yauzl@2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "dev": true
+ },
+ "zip-stream": {
+ "version": "1.1.1",
+ "from": "zip-stream@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.1.1.tgz",
+ "dev": true
+ }
+ }
+}
diff --git a/templates/assets/bootstrap/grunt/postcss.config.js b/templates/assets/bootstrap/grunt/postcss.config.js
new file mode 100644
index 0000000..803078a
--- /dev/null
+++ b/templates/assets/bootstrap/grunt/postcss.config.js
@@ -0,0 +1,41 @@
+module.exports = (ctx) => ({
+ map: ctx.file.dirname.startsWith('docs') ? false : {
+ inline: false,
+ annotation: true,
+ sourcesContent: true
+ },
+ plugins: {
+ autoprefixer: {
+ browsers: [
+ //
+ // Official browser support policy:
+ // https://v4-alpha.getbootstrap.com/getting-started/browsers-devices/#supported-browsers
+ //
+ 'Chrome >= 35', // Exact version number here is kinda arbitrary
+ // Rather than using Autoprefixer's native "Firefox ESR" version specifier string,
+ // we deliberately hardcode the number. This is to avoid unwittingly severely breaking the previous ESR in the event that:
+ // (a) we happen to ship a new Bootstrap release soon after the release of a new ESR,
+ // such that folks haven't yet had a reasonable amount of time to upgrade; and
+ // (b) the new ESR has unprefixed CSS properties/values whose absence would severely break webpages
+ // (e.g. `box-sizing`, as opposed to `background: linear-gradient(...)`).
+ // Since they've been unprefixed, Autoprefixer will stop prefixing them,
+ // thus causing them to not work in the previous ESR (where the prefixes were required).
+ 'Firefox >= 38', // Current Firefox Extended Support Release (ESR); https://www.mozilla.org/en-US/firefox/organizations/faq/
+ // Note: Edge versions in Autoprefixer & Can I Use refer to the EdgeHTML rendering engine version,
+ // NOT the Edge app version shown in Edge's "About" screen.
+ // For example, at the time of writing, Edge 20 on an up-to-date system uses EdgeHTML 12.
+ // See also https://github.com/Fyrd/caniuse/issues/1928
+ 'Edge >= 12',
+ 'Explorer >= 10',
+ // Out of leniency, we prefix these 1 version further back than the official policy.
+ 'iOS >= 8',
+ 'Safari >= 8',
+ // The following remain NOT officially supported, but we're lenient and include their prefixes to avoid severely breaking in them.
+ 'Android 2.3',
+ 'Android >= 4',
+ 'Opera >= 12'
+ ]
+ },
+ 'postcss-flexbugs-fixes': {}
+ }
+})
diff --git a/templates/assets/bootstrap/grunt/sauce_browsers.yml b/templates/assets/bootstrap/grunt/sauce_browsers.yml
new file mode 100644
index 0000000..4d5041b
--- /dev/null
+++ b/templates/assets/bootstrap/grunt/sauce_browsers.yml
@@ -0,0 +1,84 @@
+[
+ # Docs: https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
+
+ {
+ browserName: "safari",
+ platform: "OS X 10.11"
+ },
+ {
+ browserName: "chrome",
+ platform: "OS X 10.11",
+ version: "latest"
+ },
+ {
+ browserName: "firefox",
+ platform: "OS X 10.11",
+ version: "latest"
+ },
+
+ # Mac Opera not currently supported by Sauce Labs
+
+ {
+ browserName: "MicrosoftEdge",
+ platform: "Windows 10",
+ version: "latest"
+ },
+ {
+ browserName: "internet explorer",
+ version: "11",
+ platform: "Windows 8.1"
+ },
+ {
+ browserName: "internet explorer",
+ version: "10",
+ platform: "Windows 8"
+ },
+ {
+ browserName: "internet explorer",
+ version: "9",
+ platform: "Windows 7"
+ },
+
+ {
+ browserName: "chrome",
+ platform: "Windows 10",
+ version: "latest"
+ },
+ {
+ browserName: "firefox",
+ platform: "Windows 10",
+ version: "latest"
+ },
+
+ # Win Opera 15+ not currently supported by Sauce Labs
+
+ {
+ browserName: "Safari",
+ deviceName: "iPhone Simulator",
+ platformVersion: "9.3",
+ platformName: "iOS"
+ },
+
+ # iOS Chrome not currently supported by Sauce Labs
+
+ # Linux (unofficial)
+ {
+ browserName: "chrome",
+ platform: "Linux",
+ version: "latest"
+ },
+ {
+ browserName: "firefox",
+ platform: "Linux",
+ version: "latest"
+ },
+
+ # Android
+ {
+ platform: "Linux",
+ browserName: "android",
+ deviceName: "Android Emulator",
+ version: "latest",
+ deviceType: "phone"
+ }
+]
diff --git a/templates/assets/bootstrap/grunt/upload-preview.sh b/templates/assets/bootstrap/grunt/upload-preview.sh
new file mode 100755
index 0000000..08e7fa2
--- /dev/null
+++ b/templates/assets/bootstrap/grunt/upload-preview.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+# Upload built docs to preview.twbsapps.com
+
+if [ "$TRAVIS_REPO_SLUG" != twbs-savage/bootstrap ]; then exit 0; fi
+
+# Add build metadata to version
+sed -i "/^current_version:/ s/\$/+pr.${TRAVIS_COMMIT}/" _config.yml
+# Fix URLs since the site's root is now a subdirectory
+bundle exec jekyll build --destination "$TRAVIS_COMMIT" --baseurl "/c/${TRAVIS_COMMIT}"
+
+# Install gcloud & gsutil
+GSUTIL_VERSION=$(gsutil version | cut -d ' ' -f 3)
+if [ ! -d "${HOME}/google-cloud-sdk" ] || [ "${GSUTIL_VERSION}" != '4.19' ]; then
+ rm -rf "${HOME}/google-cloud-sdk" # Kill Travis' outdated non-updateable preinstalled version
+ echo 'Installing google-cloud-sdk...'
+ export CLOUDSDK_CORE_DISABLE_PROMPTS=1
+ time (curl -S -s https://sdk.cloud.google.com | bash &>/dev/null)
+ echo 'Done.'
+fi
+source "${HOME}/google-cloud-sdk/path.bash.inc"
+
+openssl aes-256-cbc -K $encrypted_2b749c8e6327_key -iv $encrypted_2b749c8e6327_iv -in grunt/gcp-key.json.enc -out grunt/gcp-key.json -d
+gcloud auth activate-service-account "$GCP_SERVICE_ACCOUNT" --key-file grunt/gcp-key.json &> /dev/null || (echo 'GCP login failed!'; exit 1)
+
+echo "Uploading to http://preview.twbsapps.com/c/${TRAVIS_COMMIT} ..."
+time gsutil -q -m cp -z html,css,js,svg -r "./${TRAVIS_COMMIT}" gs://preview.twbsapps.com/c/
+echo 'Done.'
diff --git a/templates/assets/bootstrap/js/.eslintrc.json b/templates/assets/bootstrap/js/.eslintrc.json
new file mode 100644
index 0000000..07a307a
--- /dev/null
+++ b/templates/assets/bootstrap/js/.eslintrc.json
@@ -0,0 +1,240 @@
+{
+ "root": true,
+ "parser": "babel-eslint",
+ "env": {
+ "browser": true,
+ "es6": true,
+ "jquery": true
+ },
+ "extends": "eslint:recommended",
+ "parserOptions": {
+ "ecmaVersion": 8,
+ "sourceType": "module"
+ },
+ "rules": {
+ // Possible Errors
+ "no-await-in-loop": "error",
+ "no-compare-neg-zero": "error",
+ "no-extra-parens": "error",
+ "no-prototype-builtins": "off",
+ "no-template-curly-in-string": "error",
+ "no-unsafe-negation": "error",
+ "valid-jsdoc": "error",
+
+ // Best Practices
+ "accessor-pairs": "error",
+ "array-callback-return": "error",
+ "block-scoped-var": "error",
+ "class-methods-use-this": "off",
+ "complexity": "error",
+ "consistent-return": "error",
+ "curly": "error",
+ "default-case": "error",
+ "dot-location": ["error", "property"],
+ "dot-notation": "error",
+ "eqeqeq": "error",
+ "guard-for-in": "error",
+ "no-alert": "error",
+ "no-caller": "error",
+ "no-div-regex": "error",
+ "no-else-return": "error",
+ "no-empty-function": "error",
+ "no-eq-null": "error",
+ "no-eval": "error",
+ "no-extend-native": "error",
+ "no-extra-bind": "error",
+ "no-extra-label": "error",
+ "no-floating-decimal": "error",
+ "no-global-assign": "error",
+ "no-implicit-coercion": "error",
+ "no-implicit-globals": "error",
+ "no-implied-eval": "error",
+ "no-invalid-this": "off",
+ "no-iterator": "error",
+ "no-labels": "error",
+ "no-lone-blocks": "error",
+ "no-loop-func": "error",
+ "no-magic-numbers": ["error", {
+ "ignore": [-1, 0, 1],
+ "ignoreArrayIndexes": true
+ }
+ ],
+ "no-multi-spaces": ["error", {
+ "exceptions": {
+ "AssignmentExpression": true,
+ "ArrowFunctionExpression": true,
+ "CallExpression": true,
+ "VariableDeclarator": true
+ }
+ }
+ ],
+ "no-multi-str": "error",
+ "no-new": "error",
+ "no-new-func": "off",
+ "no-new-wrappers": "error",
+ "no-new": "error",
+ "no-octal-escape": "error",
+ "no-param-reassign": "off",
+ "no-proto": "error",
+ "no-restricted-properties": "error",
+ "no-return-assign": "off",
+ "no-return-await": "error",
+ "no-script-url": "error",
+ "no-self-compare": "error",
+ "no-sequences": "error",
+ "no-throw-literal": "error",
+ "no-unmodified-loop-condition": "error",
+ "no-unused-expressions": "error",
+ "no-useless-call": "error",
+ "no-useless-concat": "error",
+ "no-useless-escape": "error",
+ "no-useless-return": "off",
+ "no-void": "error",
+ "no-warning-comments": "off",
+ "no-with": "error",
+ "prefer-promise-reject-errors": "error",
+ "radix": "error",
+ "vars-on-top": "error",
+ "wrap-iife": "error",
+ "yoda": "error",
+
+ // Strict Mode
+ "strict": "error",
+
+ // Variables
+ "init-declarations": "off",
+ "no-catch-shadow": "error",
+ "no-label-var": "error",
+ "no-restricted-globals": "error",
+ "no-shadow": "off",
+ "no-shadow-restricted-names": "error",
+ "no-undef-init": "error",
+ "no-undefined": "off",
+ "no-use-before-define": "off",
+
+ // Node.js and CommonJS
+ "callback-return": "off",
+ "global-require": "error",
+ "handle-callback-err": "error",
+ "no-mixed-requires": "error",
+ "no-new-require": "error",
+ "no-path-concat": "error",
+ "no-process-env": "error",
+ "no-process-exit": "error",
+ "no-restricted-modules": "error",
+ "no-sync": "error",
+
+ // Stylistic Issues
+ "array-bracket-spacing": "error",
+ "block-spacing": "error",
+ "brace-style": "error",
+ "capitalized-comments": "off",
+ "camelcase": "error",
+ "comma-dangle": "error",
+ "comma-spacing": "error",
+ "comma-style": "error",
+ "computed-property-spacing": "error",
+ "consistent-this": "error",
+ "eol-last": "error",
+ "func-call-spacing": "error",
+ "func-name-matching": "error",
+ "func-names": "off",
+ "func-style": ["error", "declaration"],
+ "id-blacklist": "error",
+ "id-length": "off",
+ "id-match": "error",
+ "indent": ["error", 2, { "SwitchCase": 1 }],
+ "jsx-quotes": "error",
+ "key-spacing": "off",
+ "keyword-spacing": "error",
+ "line-comment-position": "off",
+ "linebreak-style": ["error", "unix"],
+ "lines-around-comment": "off",
+ "lines-around-directive": "error",
+ "max-depth": ["error", 10],
+ "max-len": "off",
+ "max-lines": "off",
+ "max-nested-callbacks": "error",
+ "max-params": "off",
+ "max-statements": "off",
+ "max-statements-per-line": "error",
+ "multiline-ternary": "off",
+ "new-cap": ["error", { "capIsNewExceptionPattern": "$.*" }],
+ "new-parens": "error",
+ "newline-after-var": "off",
+ "newline-before-return": "off",
+ "newline-per-chained-call": ["error", { "ignoreChainWithDepth": 5 }],
+ "no-array-constructor": "error",
+ "no-bitwise": "error",
+ "no-continue": "off",
+ "no-inline-comments": "off",
+ "no-lonely-if": "error",
+ "no-mixed-operators": "off",
+ "no-multi-assign": "error",
+ "no-multiple-empty-lines": "error",
+ "no-negated-condition": "off",
+ "no-nested-ternary": "error",
+ "no-new-object": "error",
+ "no-plusplus": "off",
+ "no-restricted-syntax": "error",
+ "no-tabs": "error",
+ "no-ternary": "off",
+ "no-trailing-spaces": "error",
+ "no-underscore-dangle": "off",
+ "no-unneeded-ternary": "error",
+ "no-whitespace-before-property": "error",
+ "nonblock-statement-body-position": "error",
+ "object-curly-newline": ["error", { "minProperties": 1 }],
+ "object-curly-spacing": ["error", "always"],
+ "object-property-newline": "error",
+ "one-var": ["error", "never"],
+ "one-var-declaration-per-line": "error",
+ "operator-assignment": "error",
+ "operator-linebreak": "off",
+ "padded-blocks": "off",
+ "quote-props": ["error", "as-needed"],
+ "quotes": ["error", "single"],
+ "require-jsdoc": "off",
+ "semi": ["error", "never"],
+ "semi-spacing": "error",
+ "sort-keys": "off",
+ "sort-vars": "error",
+ "space-before-blocks": "error",
+ "space-before-function-paren": ["error", {
+ "anonymous": "always",
+ "named": "never"
+ }],
+ "space-in-parens": "error",
+ "space-infix-ops": "error",
+ "space-unary-ops": "error",
+ "spaced-comment": "error",
+ "template-tag-spacing": "error",
+ "unicode-bom": "error",
+ "wrap-regex": "off",
+
+ // ECMAScript 6
+ "arrow-body-style": "off",
+ "arrow-parens": "error",
+ "arrow-spacing": "error",
+ "generator-star-spacing": "error",
+ "no-confusing-arrow": "error",
+ "no-duplicate-imports": "error",
+ "no-restricted-imports": "error",
+ "no-useless-computed-key": "error",
+ "no-useless-constructor": "error",
+ "no-useless-rename": "error",
+ "no-var": "error",
+ "object-shorthand": "error",
+ "prefer-arrow-callback": "error",
+ "prefer-const": "error",
+ "prefer-numeric-literals": "error",
+ "prefer-rest-params": "error",
+ "prefer-spread": "error",
+ "prefer-template": "error",
+ "rest-spread-spacing": "error",
+ "sort-imports": "error",
+ "symbol-description": "error",
+ "template-curly-spacing": "error",
+ "yield-star-spacing": "error"
+ }
+}
diff --git a/templates/assets/bootstrap/js/src/alert.js b/templates/assets/bootstrap/js/src/alert.js
new file mode 100644
index 0000000..b30d0d3
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/alert.js
@@ -0,0 +1,193 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): alert.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Alert = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'alert'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.alert'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 150
+
+ const Selector = {
+ DISMISS : '[data-dismiss="alert"]'
+ }
+
+ const Event = {
+ CLOSE : `close${EVENT_KEY}`,
+ CLOSED : `closed${EVENT_KEY}`,
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ ALERT : 'alert',
+ FADE : 'fade',
+ SHOW : 'show'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Alert {
+
+ constructor(element) {
+ this._element = element
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+
+ // public
+
+ close(element) {
+ element = element || this._element
+
+ const rootElement = this._getRootElement(element)
+ const customEvent = this._triggerCloseEvent(rootElement)
+
+ if (customEvent.isDefaultPrevented()) {
+ return
+ }
+
+ this._removeElement(rootElement)
+ }
+
+ dispose() {
+ $.removeData(this._element, DATA_KEY)
+ this._element = null
+ }
+
+
+ // private
+
+ _getRootElement(element) {
+ const selector = Util.getSelectorFromElement(element)
+ let parent = false
+
+ if (selector) {
+ parent = $(selector)[0]
+ }
+
+ if (!parent) {
+ parent = $(element).closest(`.${ClassName.ALERT}`)[0]
+ }
+
+ return parent
+ }
+
+ _triggerCloseEvent(element) {
+ const closeEvent = $.Event(Event.CLOSE)
+
+ $(element).trigger(closeEvent)
+ return closeEvent
+ }
+
+ _removeElement(element) {
+ $(element).removeClass(ClassName.SHOW)
+
+ if (!Util.supportsTransitionEnd() ||
+ !$(element).hasClass(ClassName.FADE)) {
+ this._destroyElement(element)
+ return
+ }
+
+ $(element)
+ .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
+ .emulateTransitionEnd(TRANSITION_DURATION)
+ }
+
+ _destroyElement(element) {
+ $(element)
+ .detach()
+ .trigger(Event.CLOSED)
+ .remove()
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ const $element = $(this)
+ let data = $element.data(DATA_KEY)
+
+ if (!data) {
+ data = new Alert(this)
+ $element.data(DATA_KEY, data)
+ }
+
+ if (config === 'close') {
+ data[config](this)
+ }
+ })
+ }
+
+ static _handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ alertInstance.close(this)
+ }
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(
+ Event.CLICK_DATA_API,
+ Selector.DISMISS,
+ Alert._handleDismiss(new Alert())
+ )
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Alert._jQueryInterface
+ $.fn[NAME].Constructor = Alert
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Alert._jQueryInterface
+ }
+
+ return Alert
+
+})(jQuery)
+
+export default Alert
diff --git a/templates/assets/bootstrap/js/src/button.js b/templates/assets/bootstrap/js/src/button.js
new file mode 100644
index 0000000..76c5cdd
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/button.js
@@ -0,0 +1,176 @@
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): button.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Button = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'button'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.button'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const ClassName = {
+ ACTIVE : 'active',
+ BUTTON : 'btn',
+ FOCUS : 'focus'
+ }
+
+ const Selector = {
+ DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
+ DATA_TOGGLE : '[data-toggle="buttons"]',
+ INPUT : 'input',
+ ACTIVE : '.active',
+ BUTTON : '.btn'
+ }
+
+ const Event = {
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
+ FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} `
+ + `blur${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Button {
+
+ constructor(element) {
+ this._element = element
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+
+ // public
+
+ toggle() {
+ let triggerChangeEvent = true
+ const rootElement = $(this._element).closest(
+ Selector.DATA_TOGGLE
+ )[0]
+
+ if (rootElement) {
+ const input = $(this._element).find(Selector.INPUT)[0]
+
+ if (input) {
+ if (input.type === 'radio') {
+ if (input.checked &&
+ $(this._element).hasClass(ClassName.ACTIVE)) {
+ triggerChangeEvent = false
+
+ } else {
+ const activeElement = $(rootElement).find(Selector.ACTIVE)[0]
+
+ if (activeElement) {
+ $(activeElement).removeClass(ClassName.ACTIVE)
+ }
+ }
+ }
+
+ if (triggerChangeEvent) {
+ input.checked = !$(this._element).hasClass(ClassName.ACTIVE)
+ $(input).trigger('change')
+ }
+
+ input.focus()
+ }
+
+ }
+
+ this._element.setAttribute('aria-pressed',
+ !$(this._element).hasClass(ClassName.ACTIVE))
+
+ if (triggerChangeEvent) {
+ $(this._element).toggleClass(ClassName.ACTIVE)
+ }
+ }
+
+ dispose() {
+ $.removeData(this._element, DATA_KEY)
+ this._element = null
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+
+ if (!data) {
+ data = new Button(this)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (config === 'toggle') {
+ data[config]()
+ }
+ })
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document)
+ .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
+ event.preventDefault()
+
+ let button = event.target
+
+ if (!$(button).hasClass(ClassName.BUTTON)) {
+ button = $(button).closest(Selector.BUTTON)
+ }
+
+ Button._jQueryInterface.call($(button), 'toggle')
+ })
+ .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
+ const button = $(event.target).closest(Selector.BUTTON)[0]
+ $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Button._jQueryInterface
+ $.fn[NAME].Constructor = Button
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Button._jQueryInterface
+ }
+
+ return Button
+
+})(jQuery)
+
+export default Button
diff --git a/templates/assets/bootstrap/js/src/carousel.js b/templates/assets/bootstrap/js/src/carousel.js
new file mode 100644
index 0000000..8a75cb2
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/carousel.js
@@ -0,0 +1,497 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): carousel.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Carousel = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'carousel'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.carousel'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 600
+ const ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key
+ const ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key
+
+ const Default = {
+ interval : 5000,
+ keyboard : true,
+ slide : false,
+ pause : 'hover',
+ wrap : true
+ }
+
+ const DefaultType = {
+ interval : '(number|boolean)',
+ keyboard : 'boolean',
+ slide : '(boolean|string)',
+ pause : '(string|boolean)',
+ wrap : 'boolean'
+ }
+
+ const Direction = {
+ NEXT : 'next',
+ PREV : 'prev',
+ LEFT : 'left',
+ RIGHT : 'right'
+ }
+
+ const Event = {
+ SLIDE : `slide${EVENT_KEY}`,
+ SLID : `slid${EVENT_KEY}`,
+ KEYDOWN : `keydown${EVENT_KEY}`,
+ MOUSEENTER : `mouseenter${EVENT_KEY}`,
+ MOUSELEAVE : `mouseleave${EVENT_KEY}`,
+ LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ CAROUSEL : 'carousel',
+ ACTIVE : 'active',
+ SLIDE : 'slide',
+ RIGHT : 'carousel-item-right',
+ LEFT : 'carousel-item-left',
+ NEXT : 'carousel-item-next',
+ PREV : 'carousel-item-prev',
+ ITEM : 'carousel-item'
+ }
+
+ const Selector = {
+ ACTIVE : '.active',
+ ACTIVE_ITEM : '.active.carousel-item',
+ ITEM : '.carousel-item',
+ NEXT_PREV : '.carousel-item-next, .carousel-item-prev',
+ INDICATORS : '.carousel-indicators',
+ DATA_SLIDE : '[data-slide], [data-slide-to]',
+ DATA_RIDE : '[data-ride="carousel"]'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Carousel {
+
+ constructor(element, config) {
+ this._items = null
+ this._interval = null
+ this._activeElement = null
+
+ this._isPaused = false
+ this._isSliding = false
+
+ this._config = this._getConfig(config)
+ this._element = $(element)[0]
+ this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0]
+
+ this._addEventListeners()
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+
+ // public
+
+ next() {
+ if (this._isSliding) {
+ throw new Error('Carousel is sliding')
+ }
+ this._slide(Direction.NEXT)
+ }
+
+ nextWhenVisible() {
+ // Don't call next when the page isn't visible
+ if (!document.hidden) {
+ this.next()
+ }
+ }
+
+ prev() {
+ if (this._isSliding) {
+ throw new Error('Carousel is sliding')
+ }
+ this._slide(Direction.PREV)
+ }
+
+ pause(event) {
+ if (!event) {
+ this._isPaused = true
+ }
+
+ if ($(this._element).find(Selector.NEXT_PREV)[0] &&
+ Util.supportsTransitionEnd()) {
+ Util.triggerTransitionEnd(this._element)
+ this.cycle(true)
+ }
+
+ clearInterval(this._interval)
+ this._interval = null
+ }
+
+ cycle(event) {
+ if (!event) {
+ this._isPaused = false
+ }
+
+ if (this._interval) {
+ clearInterval(this._interval)
+ this._interval = null
+ }
+
+ if (this._config.interval && !this._isPaused) {
+ this._interval = setInterval(
+ (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),
+ this._config.interval
+ )
+ }
+ }
+
+ to(index) {
+ this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
+
+ const activeIndex = this._getItemIndex(this._activeElement)
+
+ if (index > this._items.length - 1 || index < 0) {
+ return
+ }
+
+ if (this._isSliding) {
+ $(this._element).one(Event.SLID, () => this.to(index))
+ return
+ }
+
+ if (activeIndex === index) {
+ this.pause()
+ this.cycle()
+ return
+ }
+
+ const direction = index > activeIndex ?
+ Direction.NEXT :
+ Direction.PREV
+
+ this._slide(direction, this._items[index])
+ }
+
+ dispose() {
+ $(this._element).off(EVENT_KEY)
+ $.removeData(this._element, DATA_KEY)
+
+ this._items = null
+ this._config = null
+ this._element = null
+ this._interval = null
+ this._isPaused = null
+ this._isSliding = null
+ this._activeElement = null
+ this._indicatorsElement = null
+ }
+
+
+ // private
+
+ _getConfig(config) {
+ config = $.extend({}, Default, config)
+ Util.typeCheckConfig(NAME, config, DefaultType)
+ return config
+ }
+
+ _addEventListeners() {
+ if (this._config.keyboard) {
+ $(this._element)
+ .on(Event.KEYDOWN, (event) => this._keydown(event))
+ }
+
+ if (this._config.pause === 'hover' &&
+ !('ontouchstart' in document.documentElement)) {
+ $(this._element)
+ .on(Event.MOUSEENTER, (event) => this.pause(event))
+ .on(Event.MOUSELEAVE, (event) => this.cycle(event))
+ }
+ }
+
+ _keydown(event) {
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return
+ }
+
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE:
+ event.preventDefault()
+ this.prev()
+ break
+ case ARROW_RIGHT_KEYCODE:
+ event.preventDefault()
+ this.next()
+ break
+ default:
+ return
+ }
+ }
+
+ _getItemIndex(element) {
+ this._items = $.makeArray($(element).parent().find(Selector.ITEM))
+ return this._items.indexOf(element)
+ }
+
+ _getItemByDirection(direction, activeElement) {
+ const isNextDirection = direction === Direction.NEXT
+ const isPrevDirection = direction === Direction.PREV
+ const activeIndex = this._getItemIndex(activeElement)
+ const lastItemIndex = this._items.length - 1
+ const isGoingToWrap = isPrevDirection && activeIndex === 0 ||
+ isNextDirection && activeIndex === lastItemIndex
+
+ if (isGoingToWrap && !this._config.wrap) {
+ return activeElement
+ }
+
+ const delta = direction === Direction.PREV ? -1 : 1
+ const itemIndex = (activeIndex + delta) % this._items.length
+
+ return itemIndex === -1 ?
+ this._items[this._items.length - 1] : this._items[itemIndex]
+ }
+
+
+ _triggerSlideEvent(relatedTarget, eventDirectionName) {
+ const slideEvent = $.Event(Event.SLIDE, {
+ relatedTarget,
+ direction: eventDirectionName
+ })
+
+ $(this._element).trigger(slideEvent)
+
+ return slideEvent
+ }
+
+ _setActiveIndicatorElement(element) {
+ if (this._indicatorsElement) {
+ $(this._indicatorsElement)
+ .find(Selector.ACTIVE)
+ .removeClass(ClassName.ACTIVE)
+
+ const nextIndicator = this._indicatorsElement.children[
+ this._getItemIndex(element)
+ ]
+
+ if (nextIndicator) {
+ $(nextIndicator).addClass(ClassName.ACTIVE)
+ }
+ }
+ }
+
+ _slide(direction, element) {
+ const activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
+ const nextElement = element || activeElement &&
+ this._getItemByDirection(direction, activeElement)
+
+ const isCycling = Boolean(this._interval)
+
+ let directionalClassName
+ let orderClassName
+ let eventDirectionName
+
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName.LEFT
+ orderClassName = ClassName.NEXT
+ eventDirectionName = Direction.LEFT
+ } else {
+ directionalClassName = ClassName.RIGHT
+ orderClassName = ClassName.PREV
+ eventDirectionName = Direction.RIGHT
+ }
+
+ if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
+ this._isSliding = false
+ return
+ }
+
+ const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)
+ if (slideEvent.isDefaultPrevented()) {
+ return
+ }
+
+ if (!activeElement || !nextElement) {
+ // some weirdness is happening, so we bail
+ return
+ }
+
+ this._isSliding = true
+
+ if (isCycling) {
+ this.pause()
+ }
+
+ this._setActiveIndicatorElement(nextElement)
+
+ const slidEvent = $.Event(Event.SLID, {
+ relatedTarget: nextElement,
+ direction: eventDirectionName
+ })
+
+ if (Util.supportsTransitionEnd() &&
+ $(this._element).hasClass(ClassName.SLIDE)) {
+
+ $(nextElement).addClass(orderClassName)
+
+ Util.reflow(nextElement)
+
+ $(activeElement).addClass(directionalClassName)
+ $(nextElement).addClass(directionalClassName)
+
+ $(activeElement)
+ .one(Util.TRANSITION_END, () => {
+ $(nextElement)
+ .removeClass(`${directionalClassName} ${orderClassName}`)
+ .addClass(ClassName.ACTIVE)
+
+ $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)
+
+ this._isSliding = false
+
+ setTimeout(() => $(this._element).trigger(slidEvent), 0)
+
+ })
+ .emulateTransitionEnd(TRANSITION_DURATION)
+
+ } else {
+ $(activeElement).removeClass(ClassName.ACTIVE)
+ $(nextElement).addClass(ClassName.ACTIVE)
+
+ this._isSliding = false
+ $(this._element).trigger(slidEvent)
+ }
+
+ if (isCycling) {
+ this.cycle()
+ }
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _config = $.extend({}, Default, $(this).data())
+
+ if (typeof config === 'object') {
+ $.extend(_config, config)
+ }
+
+ const action = typeof config === 'string' ? config : _config.slide
+
+ if (!data) {
+ data = new Carousel(this, _config)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'number') {
+ data.to(config)
+ } else if (typeof action === 'string') {
+ if (data[action] === undefined) {
+ throw new Error(`No method named "${action}"`)
+ }
+ data[action]()
+ } else if (_config.interval) {
+ data.pause()
+ data.cycle()
+ }
+ })
+ }
+
+ static _dataApiClickHandler(event) {
+ const selector = Util.getSelectorFromElement(this)
+
+ if (!selector) {
+ return
+ }
+
+ const target = $(selector)[0]
+
+ if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
+ return
+ }
+
+ const config = $.extend({}, $(target).data(), $(this).data())
+ const slideIndex = this.getAttribute('data-slide-to')
+
+ if (slideIndex) {
+ config.interval = false
+ }
+
+ Carousel._jQueryInterface.call($(target), config)
+
+ if (slideIndex) {
+ $(target).data(DATA_KEY).to(slideIndex)
+ }
+
+ event.preventDefault()
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document)
+ .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
+
+ $(window).on(Event.LOAD_DATA_API, () => {
+ $(Selector.DATA_RIDE).each(function () {
+ const $carousel = $(this)
+ Carousel._jQueryInterface.call($carousel, $carousel.data())
+ })
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Carousel._jQueryInterface
+ $.fn[NAME].Constructor = Carousel
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Carousel._jQueryInterface
+ }
+
+ return Carousel
+
+})(jQuery)
+
+export default Carousel
diff --git a/templates/assets/bootstrap/js/src/collapse.js b/templates/assets/bootstrap/js/src/collapse.js
new file mode 100644
index 0000000..13c4450
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/collapse.js
@@ -0,0 +1,393 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): collapse.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Collapse = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'collapse'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.collapse'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 600
+
+ const Default = {
+ toggle : true,
+ parent : ''
+ }
+
+ const DefaultType = {
+ toggle : 'boolean',
+ parent : 'string'
+ }
+
+ const Event = {
+ SHOW : `show${EVENT_KEY}`,
+ SHOWN : `shown${EVENT_KEY}`,
+ HIDE : `hide${EVENT_KEY}`,
+ HIDDEN : `hidden${EVENT_KEY}`,
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ SHOW : 'show',
+ COLLAPSE : 'collapse',
+ COLLAPSING : 'collapsing',
+ COLLAPSED : 'collapsed'
+ }
+
+ const Dimension = {
+ WIDTH : 'width',
+ HEIGHT : 'height'
+ }
+
+ const Selector = {
+ ACTIVES : '.card > .show, .card > .collapsing',
+ DATA_TOGGLE : '[data-toggle="collapse"]',
+ DATA_CHILDREN : 'data-children'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Collapse {
+
+ constructor(element, config) {
+ this._isTransitioning = false
+ this._element = element
+ this._config = this._getConfig(config)
+ this._triggerArray = $.makeArray($(
+ `[data-toggle="collapse"][href="#${element.id}"],` +
+ `[data-toggle="collapse"][data-target="#${element.id}"]`
+ ))
+ this._parent = this._config.parent ? this._getParent() : null
+
+ if (!this._config.parent) {
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray)
+ }
+
+ this._selectorActives = Selector.ACTIVES
+ if (this._parent) {
+ const childrenSelector = this._parent.hasAttribute(Selector.DATA_CHILDREN) ? this._parent.getAttribute(Selector.DATA_CHILDREN) : null
+ if (childrenSelector !== null) {
+ this._selectorActives = `${childrenSelector} > .show, ${childrenSelector} > .collapsing`
+ }
+ }
+
+ if (this._config.toggle) {
+ this.toggle()
+ }
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+
+ // public
+
+ toggle() {
+ if ($(this._element).hasClass(ClassName.SHOW)) {
+ this.hide()
+ } else {
+ this.show()
+ }
+ }
+
+ show() {
+ if (this._isTransitioning) {
+ throw new Error('Collapse is transitioning')
+ }
+
+ if ($(this._element).hasClass(ClassName.SHOW)) {
+ return
+ }
+
+ let actives
+ let activesData
+
+ if (this._parent) {
+ actives = $.makeArray($(this._parent).find(this._selectorActives))
+ if (!actives.length) {
+ actives = null
+ }
+ }
+
+ if (actives) {
+ activesData = $(actives).data(DATA_KEY)
+ if (activesData && activesData._isTransitioning) {
+ return
+ }
+ }
+
+ const startEvent = $.Event(Event.SHOW)
+ $(this._element).trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) {
+ return
+ }
+
+ if (actives) {
+ Collapse._jQueryInterface.call($(actives), 'hide')
+ if (!activesData) {
+ $(actives).data(DATA_KEY, null)
+ }
+ }
+
+ const dimension = this._getDimension()
+
+ $(this._element)
+ .removeClass(ClassName.COLLAPSE)
+ .addClass(ClassName.COLLAPSING)
+
+ this._element.style[dimension] = 0
+ this._element.setAttribute('aria-expanded', true)
+
+ if (this._triggerArray.length) {
+ $(this._triggerArray)
+ .removeClass(ClassName.COLLAPSED)
+ .attr('aria-expanded', true)
+ }
+
+ this.setTransitioning(true)
+
+ const complete = () => {
+ $(this._element)
+ .removeClass(ClassName.COLLAPSING)
+ .addClass(ClassName.COLLAPSE)
+ .addClass(ClassName.SHOW)
+
+ this._element.style[dimension] = ''
+
+ this.setTransitioning(false)
+
+ $(this._element).trigger(Event.SHOWN)
+ }
+
+ if (!Util.supportsTransitionEnd()) {
+ complete()
+ return
+ }
+
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
+ const scrollSize = `scroll${capitalizedDimension}`
+
+ $(this._element)
+ .one(Util.TRANSITION_END, complete)
+ .emulateTransitionEnd(TRANSITION_DURATION)
+
+ this._element.style[dimension] = `${this._element[scrollSize]}px`
+ }
+
+ hide() {
+ if (this._isTransitioning) {
+ throw new Error('Collapse is transitioning')
+ }
+
+ if (!$(this._element).hasClass(ClassName.SHOW)) {
+ return
+ }
+
+ const startEvent = $.Event(Event.HIDE)
+ $(this._element).trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) {
+ return
+ }
+
+ const dimension = this._getDimension()
+
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`
+
+ Util.reflow(this._element)
+
+ $(this._element)
+ .addClass(ClassName.COLLAPSING)
+ .removeClass(ClassName.COLLAPSE)
+ .removeClass(ClassName.SHOW)
+
+ this._element.setAttribute('aria-expanded', false)
+
+ if (this._triggerArray.length) {
+ $(this._triggerArray)
+ .addClass(ClassName.COLLAPSED)
+ .attr('aria-expanded', false)
+ }
+
+ this.setTransitioning(true)
+
+ const complete = () => {
+ this.setTransitioning(false)
+ $(this._element)
+ .removeClass(ClassName.COLLAPSING)
+ .addClass(ClassName.COLLAPSE)
+ .trigger(Event.HIDDEN)
+ }
+
+ this._element.style[dimension] = ''
+
+ if (!Util.supportsTransitionEnd()) {
+ complete()
+ return
+ }
+
+ $(this._element)
+ .one(Util.TRANSITION_END, complete)
+ .emulateTransitionEnd(TRANSITION_DURATION)
+ }
+
+ setTransitioning(isTransitioning) {
+ this._isTransitioning = isTransitioning
+ }
+
+ dispose() {
+ $.removeData(this._element, DATA_KEY)
+
+ this._config = null
+ this._parent = null
+ this._element = null
+ this._triggerArray = null
+ this._isTransitioning = null
+ }
+
+
+ // private
+
+ _getConfig(config) {
+ config = $.extend({}, Default, config)
+ config.toggle = Boolean(config.toggle) // coerce string values
+ Util.typeCheckConfig(NAME, config, DefaultType)
+ return config
+ }
+
+ _getDimension() {
+ const hasWidth = $(this._element).hasClass(Dimension.WIDTH)
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
+ }
+
+ _getParent() {
+ const parent = $(this._config.parent)[0]
+ const selector =
+ `[data-toggle="collapse"][data-parent="${this._config.parent}"]`
+
+ $(parent).find(selector).each((i, element) => {
+ this._addAriaAndCollapsedClass(
+ Collapse._getTargetFromElement(element),
+ [element]
+ )
+ })
+
+ return parent
+ }
+
+ _addAriaAndCollapsedClass(element, triggerArray) {
+ if (element) {
+ const isOpen = $(element).hasClass(ClassName.SHOW)
+ element.setAttribute('aria-expanded', isOpen)
+
+ if (triggerArray.length) {
+ $(triggerArray)
+ .toggleClass(ClassName.COLLAPSED, !isOpen)
+ .attr('aria-expanded', isOpen)
+ }
+ }
+ }
+
+
+ // static
+
+ static _getTargetFromElement(element) {
+ const selector = Util.getSelectorFromElement(element)
+ return selector ? $(selector)[0] : null
+ }
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ const $this = $(this)
+ let data = $this.data(DATA_KEY)
+ const _config = $.extend(
+ {},
+ Default,
+ $this.data(),
+ typeof config === 'object' && config
+ )
+
+ if (!data && _config.toggle && /show|hide/.test(config)) {
+ _config.toggle = false
+ }
+
+ if (!data) {
+ data = new Collapse(this, _config)
+ $this.data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config]()
+ }
+ })
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault()
+
+ const target = Collapse._getTargetFromElement(this)
+ const data = $(target).data(DATA_KEY)
+ const config = data ? 'toggle' : $(this).data()
+
+ Collapse._jQueryInterface.call($(target), config)
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Collapse._jQueryInterface
+ $.fn[NAME].Constructor = Collapse
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Collapse._jQueryInterface
+ }
+
+ return Collapse
+
+})(jQuery)
+
+export default Collapse
diff --git a/templates/assets/bootstrap/js/src/dropdown.js b/templates/assets/bootstrap/js/src/dropdown.js
new file mode 100644
index 0000000..644273a
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/dropdown.js
@@ -0,0 +1,307 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): dropdown.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Dropdown = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'dropdown'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.dropdown'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
+ const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key
+ const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key
+ const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key
+ const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
+ const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}|${SPACE_KEYCODE}`)
+
+ const Event = {
+ HIDE : `hide${EVENT_KEY}`,
+ HIDDEN : `hidden${EVENT_KEY}`,
+ SHOW : `show${EVENT_KEY}`,
+ SHOWN : `shown${EVENT_KEY}`,
+ CLICK : `click${EVENT_KEY}`,
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
+ FOCUSIN_DATA_API : `focusin${EVENT_KEY}${DATA_API_KEY}`,
+ KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ BACKDROP : 'dropdown-backdrop',
+ DISABLED : 'disabled',
+ SHOW : 'show'
+ }
+
+ const Selector = {
+ BACKDROP : '.dropdown-backdrop',
+ DATA_TOGGLE : '[data-toggle="dropdown"]',
+ FORM_CHILD : '.dropdown form',
+ ROLE_MENU : '[role="menu"]',
+ ROLE_LISTBOX : '[role="listbox"]',
+ NAVBAR_NAV : '.navbar-nav',
+ VISIBLE_ITEMS : '[role="menu"] li:not(.disabled) a, '
+ + '[role="listbox"] li:not(.disabled) a'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Dropdown {
+
+ constructor(element) {
+ this._element = element
+
+ this._addEventListeners()
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+
+ // public
+
+ toggle() {
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ return false
+ }
+
+ const parent = Dropdown._getParentFromElement(this)
+ const isActive = $(parent).hasClass(ClassName.SHOW)
+
+ Dropdown._clearMenus()
+
+ if (isActive) {
+ return false
+ }
+
+ const relatedTarget = {
+ relatedTarget : this
+ }
+ const showEvent = $.Event(Event.SHOW, relatedTarget)
+
+ $(parent).trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented()) {
+ return false
+ }
+
+ // set the backdrop only if the dropdown menu will be opened
+ if ('ontouchstart' in document.documentElement &&
+ !$(parent).closest(Selector.NAVBAR_NAV).length) {
+
+ // if mobile we use a backdrop because click events don't delegate
+ const dropdown = document.createElement('div')
+ dropdown.className = ClassName.BACKDROP
+ $(dropdown).insertBefore(this)
+ $(dropdown).on('click', Dropdown._clearMenus)
+ }
+
+ this.focus()
+ this.setAttribute('aria-expanded', true)
+
+ $(parent).toggleClass(ClassName.SHOW)
+ $(parent).trigger($.Event(Event.SHOWN, relatedTarget))
+
+ return false
+ }
+
+ dispose() {
+ $.removeData(this._element, DATA_KEY)
+ $(this._element).off(EVENT_KEY)
+ this._element = null
+ }
+
+
+ // private
+
+ _addEventListeners() {
+ $(this._element).on(Event.CLICK, this.toggle)
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+
+ if (!data) {
+ data = new Dropdown(this)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config].call(this)
+ }
+ })
+ }
+
+ static _clearMenus(event) {
+ if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {
+ return
+ }
+
+ const toggles = $.makeArray($(Selector.DATA_TOGGLE))
+
+ for (let i = 0; i < toggles.length; i++) {
+ const parent = Dropdown._getParentFromElement(toggles[i])
+ const relatedTarget = {
+ relatedTarget : toggles[i]
+ }
+
+ if (!$(parent).hasClass(ClassName.SHOW)) {
+ continue
+ }
+
+ if (event && (event.type === 'click' &&
+ /input|textarea/i.test(event.target.tagName) || event.type === 'focusin')
+ && $.contains(parent, event.target)) {
+ continue
+ }
+
+ const hideEvent = $.Event(Event.HIDE, relatedTarget)
+ $(parent).trigger(hideEvent)
+ if (hideEvent.isDefaultPrevented()) {
+ continue
+ }
+
+ // remove backdrop only if the dropdown menu will be hidden
+ const backdrop = $(parent).find(Selector.BACKDROP)[0]
+ if (backdrop) {
+ backdrop.parentNode.removeChild(backdrop)
+ }
+
+ toggles[i].setAttribute('aria-expanded', 'false')
+
+ $(parent)
+ .removeClass(ClassName.SHOW)
+ .trigger($.Event(Event.HIDDEN, relatedTarget))
+ }
+ }
+
+ static _getParentFromElement(element) {
+ let parent
+ const selector = Util.getSelectorFromElement(element)
+
+ if (selector) {
+ parent = $(selector)[0]
+ }
+
+ return parent || element.parentNode
+ }
+
+ static _dataApiKeydownHandler(event) {
+ if (!REGEXP_KEYDOWN.test(event.which) ||
+ /input|textarea/i.test(event.target.tagName)) {
+ return
+ }
+
+ event.preventDefault()
+ event.stopPropagation()
+
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ return
+ }
+
+ const parent = Dropdown._getParentFromElement(this)
+ const isActive = $(parent).hasClass(ClassName.SHOW)
+
+ if (!isActive && event.which !== ESCAPE_KEYCODE ||
+ isActive && event.which === ESCAPE_KEYCODE) {
+
+ if (event.which === ESCAPE_KEYCODE) {
+ const toggle = $(parent).find(Selector.DATA_TOGGLE)[0]
+ $(toggle).trigger('focus')
+ }
+
+ $(this).trigger('click')
+ return
+ }
+
+ const items = $(parent).find(Selector.VISIBLE_ITEMS).get()
+
+ if (!items.length) {
+ return
+ }
+
+ let index = items.indexOf(event.target)
+
+ if (event.which === ARROW_UP_KEYCODE && index > 0) { // up
+ index--
+ }
+
+ if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // down
+ index++
+ }
+
+ if (index < 0) {
+ index = 0
+ }
+
+ items[index].focus()
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document)
+ .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
+ .on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler)
+ .on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler)
+ .on(`${Event.CLICK_DATA_API} ${Event.FOCUSIN_DATA_API}`, Dropdown._clearMenus)
+ .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle)
+ .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
+ e.stopPropagation()
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Dropdown._jQueryInterface
+ $.fn[NAME].Constructor = Dropdown
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Dropdown._jQueryInterface
+ }
+
+ return Dropdown
+
+})(jQuery)
+
+export default Dropdown
diff --git a/templates/assets/bootstrap/js/src/modal.js b/templates/assets/bootstrap/js/src/modal.js
new file mode 100644
index 0000000..9263efd
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/modal.js
@@ -0,0 +1,545 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): modal.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Modal = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'modal'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.modal'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 300
+ const BACKDROP_TRANSITION_DURATION = 150
+ const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
+
+ const Default = {
+ backdrop : true,
+ keyboard : true,
+ focus : true,
+ show : true
+ }
+
+ const DefaultType = {
+ backdrop : '(boolean|string)',
+ keyboard : 'boolean',
+ focus : 'boolean',
+ show : 'boolean'
+ }
+
+ const Event = {
+ HIDE : `hide${EVENT_KEY}`,
+ HIDDEN : `hidden${EVENT_KEY}`,
+ SHOW : `show${EVENT_KEY}`,
+ SHOWN : `shown${EVENT_KEY}`,
+ FOCUSIN : `focusin${EVENT_KEY}`,
+ RESIZE : `resize${EVENT_KEY}`,
+ CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
+ KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,
+ MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,
+ MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ SCROLLBAR_MEASURER : 'modal-scrollbar-measure',
+ BACKDROP : 'modal-backdrop',
+ OPEN : 'modal-open',
+ FADE : 'fade',
+ SHOW : 'show'
+ }
+
+ const Selector = {
+ DIALOG : '.modal-dialog',
+ DATA_TOGGLE : '[data-toggle="modal"]',
+ DATA_DISMISS : '[data-dismiss="modal"]',
+ FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Modal {
+
+ constructor(element, config) {
+ this._config = this._getConfig(config)
+ this._element = element
+ this._dialog = $(element).find(Selector.DIALOG)[0]
+ this._backdrop = null
+ this._isShown = false
+ this._isBodyOverflowing = false
+ this._ignoreBackdropClick = false
+ this._isTransitioning = false
+ this._originalBodyPadding = 0
+ this._scrollbarWidth = 0
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+
+ // public
+
+ toggle(relatedTarget) {
+ return this._isShown ? this.hide() : this.show(relatedTarget)
+ }
+
+ show(relatedTarget) {
+ if (this._isTransitioning) {
+ throw new Error('Modal is transitioning')
+ }
+
+ if (Util.supportsTransitionEnd() &&
+ $(this._element).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true
+ }
+ const showEvent = $.Event(Event.SHOW, {
+ relatedTarget
+ })
+
+ $(this._element).trigger(showEvent)
+
+ if (this._isShown || showEvent.isDefaultPrevented()) {
+ return
+ }
+
+ this._isShown = true
+
+ this._checkScrollbar()
+ this._setScrollbar()
+
+ $(document.body).addClass(ClassName.OPEN)
+
+ this._setEscapeEvent()
+ this._setResizeEvent()
+
+ $(this._element).on(
+ Event.CLICK_DISMISS,
+ Selector.DATA_DISMISS,
+ (event) => this.hide(event)
+ )
+
+ $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
+ $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
+ if ($(event.target).is(this._element)) {
+ this._ignoreBackdropClick = true
+ }
+ })
+ })
+
+ this._showBackdrop(() => this._showElement(relatedTarget))
+ }
+
+ hide(event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ if (this._isTransitioning) {
+ throw new Error('Modal is transitioning')
+ }
+
+ const transition = Util.supportsTransitionEnd() &&
+ $(this._element).hasClass(ClassName.FADE)
+ if (transition) {
+ this._isTransitioning = true
+ }
+
+ const hideEvent = $.Event(Event.HIDE)
+ $(this._element).trigger(hideEvent)
+
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
+ return
+ }
+
+ this._isShown = false
+
+ this._setEscapeEvent()
+ this._setResizeEvent()
+
+ $(document).off(Event.FOCUSIN)
+
+ $(this._element).removeClass(ClassName.SHOW)
+
+ $(this._element).off(Event.CLICK_DISMISS)
+ $(this._dialog).off(Event.MOUSEDOWN_DISMISS)
+
+ if (transition) {
+ $(this._element)
+ .one(Util.TRANSITION_END, (event) => this._hideModal(event))
+ .emulateTransitionEnd(TRANSITION_DURATION)
+ } else {
+ this._hideModal()
+ }
+ }
+
+ dispose() {
+ $.removeData(this._element, DATA_KEY)
+
+ $(window, document, this._element, this._backdrop).off(EVENT_KEY)
+
+ this._config = null
+ this._element = null
+ this._dialog = null
+ this._backdrop = null
+ this._isShown = null
+ this._isBodyOverflowing = null
+ this._ignoreBackdropClick = null
+ this._originalBodyPadding = null
+ this._scrollbarWidth = null
+ }
+
+
+ // private
+
+ _getConfig(config) {
+ config = $.extend({}, Default, config)
+ Util.typeCheckConfig(NAME, config, DefaultType)
+ return config
+ }
+
+ _showElement(relatedTarget) {
+ const transition = Util.supportsTransitionEnd() &&
+ $(this._element).hasClass(ClassName.FADE)
+
+ if (!this._element.parentNode ||
+ this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
+ // don't move modals dom position
+ document.body.appendChild(this._element)
+ }
+
+ this._element.style.display = 'block'
+ this._element.removeAttribute('aria-hidden')
+ this._element.scrollTop = 0
+
+ if (transition) {
+ Util.reflow(this._element)
+ }
+
+ $(this._element).addClass(ClassName.SHOW)
+
+ if (this._config.focus) {
+ this._enforceFocus()
+ }
+
+ const shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget
+ })
+
+ const transitionComplete = () => {
+ if (this._config.focus) {
+ this._element.focus()
+ }
+ this._isTransitioning = false
+ $(this._element).trigger(shownEvent)
+ }
+
+ if (transition) {
+ $(this._dialog)
+ .one(Util.TRANSITION_END, transitionComplete)
+ .emulateTransitionEnd(TRANSITION_DURATION)
+ } else {
+ transitionComplete()
+ }
+ }
+
+ _enforceFocus() {
+ $(document)
+ .off(Event.FOCUSIN) // guard against infinite focus loop
+ .on(Event.FOCUSIN, (event) => {
+ if (document !== event.target &&
+ this._element !== event.target &&
+ !$(this._element).has(event.target).length) {
+ this._element.focus()
+ }
+ })
+ }
+
+ _setEscapeEvent() {
+ if (this._isShown && this._config.keyboard) {
+ $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
+ if (event.which === ESCAPE_KEYCODE) {
+ this.hide()
+ }
+ })
+
+ } else if (!this._isShown) {
+ $(this._element).off(Event.KEYDOWN_DISMISS)
+ }
+ }
+
+ _setResizeEvent() {
+ if (this._isShown) {
+ $(window).on(Event.RESIZE, (event) => this._handleUpdate(event))
+ } else {
+ $(window).off(Event.RESIZE)
+ }
+ }
+
+ _hideModal() {
+ this._element.style.display = 'none'
+ this._element.setAttribute('aria-hidden', 'true')
+ this._isTransitioning = false
+ this._showBackdrop(() => {
+ $(document.body).removeClass(ClassName.OPEN)
+ this._resetAdjustments()
+ this._resetScrollbar()
+ $(this._element).trigger(Event.HIDDEN)
+ })
+ }
+
+ _removeBackdrop() {
+ if (this._backdrop) {
+ $(this._backdrop).remove()
+ this._backdrop = null
+ }
+ }
+
+ _showBackdrop(callback) {
+ const animate = $(this._element).hasClass(ClassName.FADE) ?
+ ClassName.FADE : ''
+
+ if (this._isShown && this._config.backdrop) {
+ const doAnimate = Util.supportsTransitionEnd() && animate
+
+ this._backdrop = document.createElement('div')
+ this._backdrop.className = ClassName.BACKDROP
+
+ if (animate) {
+ $(this._backdrop).addClass(animate)
+ }
+
+ $(this._backdrop).appendTo(document.body)
+
+ $(this._element).on(Event.CLICK_DISMISS, (event) => {
+ if (this._ignoreBackdropClick) {
+ this._ignoreBackdropClick = false
+ return
+ }
+ if (event.target !== event.currentTarget) {
+ return
+ }
+ if (this._config.backdrop === 'static') {
+ this._element.focus()
+ } else {
+ this.hide()
+ }
+ })
+
+ if (doAnimate) {
+ Util.reflow(this._backdrop)
+ }
+
+ $(this._backdrop).addClass(ClassName.SHOW)
+
+ if (!callback) {
+ return
+ }
+
+ if (!doAnimate) {
+ callback()
+ return
+ }
+
+ $(this._backdrop)
+ .one(Util.TRANSITION_END, callback)
+ .emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
+
+ } else if (!this._isShown && this._backdrop) {
+ $(this._backdrop).removeClass(ClassName.SHOW)
+
+ const callbackRemove = () => {
+ this._removeBackdrop()
+ if (callback) {
+ callback()
+ }
+ }
+
+ if (Util.supportsTransitionEnd() &&
+ $(this._element).hasClass(ClassName.FADE)) {
+ $(this._backdrop)
+ .one(Util.TRANSITION_END, callbackRemove)
+ .emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
+ } else {
+ callbackRemove()
+ }
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+
+ // ----------------------------------------------------------------------
+ // the following methods are used to handle overflowing modals
+ // todo (fat): these should probably be refactored out of modal.js
+ // ----------------------------------------------------------------------
+
+ _handleUpdate() {
+ this._adjustDialog()
+ }
+
+ _adjustDialog() {
+ const isModalOverflowing =
+ this._element.scrollHeight > document.documentElement.clientHeight
+
+ if (!this._isBodyOverflowing && isModalOverflowing) {
+ this._element.style.paddingLeft = `${this._scrollbarWidth}px`
+ }
+
+ if (this._isBodyOverflowing && !isModalOverflowing) {
+ this._element.style.paddingRight = `${this._scrollbarWidth}px`
+ }
+ }
+
+ _resetAdjustments() {
+ this._element.style.paddingLeft = ''
+ this._element.style.paddingRight = ''
+ }
+
+ _checkScrollbar() {
+ this._isBodyOverflowing = document.body.clientWidth < window.innerWidth
+ this._scrollbarWidth = this._getScrollbarWidth()
+ }
+
+ _setScrollbar() {
+ const bodyPadding = parseInt(
+ $(Selector.FIXED_CONTENT).css('padding-right') || 0,
+ 10
+ )
+
+ this._originalBodyPadding = document.body.style.paddingRight || ''
+
+ if (this._isBodyOverflowing) {
+ document.body.style.paddingRight =
+ `${bodyPadding + this._scrollbarWidth}px`
+ }
+ }
+
+ _resetScrollbar() {
+ document.body.style.paddingRight = this._originalBodyPadding
+ }
+
+ _getScrollbarWidth() { // thx d.walsh
+ const scrollDiv = document.createElement('div')
+ scrollDiv.className = ClassName.SCROLLBAR_MEASURER
+ document.body.appendChild(scrollDiv)
+ const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth
+ document.body.removeChild(scrollDiv)
+ return scrollbarWidth
+ }
+
+
+ // static
+
+ static _jQueryInterface(config, relatedTarget) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _config = $.extend(
+ {},
+ Modal.Default,
+ $(this).data(),
+ typeof config === 'object' && config
+ )
+
+ if (!data) {
+ data = new Modal(this, _config)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config](relatedTarget)
+ } else if (_config.show) {
+ data.show(relatedTarget)
+ }
+ })
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ let target
+ const selector = Util.getSelectorFromElement(this)
+
+ if (selector) {
+ target = $(selector)[0]
+ }
+
+ const config = $(target).data(DATA_KEY) ?
+ 'toggle' : $.extend({}, $(target).data(), $(this).data())
+
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
+ event.preventDefault()
+ }
+
+ const $target = $(target).one(Event.SHOW, (showEvent) => {
+ if (showEvent.isDefaultPrevented()) {
+ // only register focus restorer if modal will actually get shown
+ return
+ }
+
+ $target.one(Event.HIDDEN, () => {
+ if ($(this).is(':visible')) {
+ this.focus()
+ }
+ })
+ })
+
+ Modal._jQueryInterface.call($(target), config, this)
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Modal._jQueryInterface
+ $.fn[NAME].Constructor = Modal
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Modal._jQueryInterface
+ }
+
+ return Modal
+
+})(jQuery)
+
+export default Modal
diff --git a/templates/assets/bootstrap/js/src/popover.js b/templates/assets/bootstrap/js/src/popover.js
new file mode 100644
index 0000000..b68b479
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/popover.js
@@ -0,0 +1,179 @@
+import Tooltip from './tooltip'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): popover.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Popover = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'popover'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.popover'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Default = $.extend({}, Tooltip.Default, {
+ placement : 'right',
+ trigger : 'click',
+ content : '',
+ template : ''
+ })
+
+ const DefaultType = $.extend({}, Tooltip.DefaultType, {
+ content : '(string|element|function)'
+ })
+
+ const ClassName = {
+ FADE : 'fade',
+ SHOW : 'show'
+ }
+
+ const Selector = {
+ TITLE : '.popover-title',
+ CONTENT : '.popover-content'
+ }
+
+ const Event = {
+ HIDE : `hide${EVENT_KEY}`,
+ HIDDEN : `hidden${EVENT_KEY}`,
+ SHOW : `show${EVENT_KEY}`,
+ SHOWN : `shown${EVENT_KEY}`,
+ INSERTED : `inserted${EVENT_KEY}`,
+ CLICK : `click${EVENT_KEY}`,
+ FOCUSIN : `focusin${EVENT_KEY}`,
+ FOCUSOUT : `focusout${EVENT_KEY}`,
+ MOUSEENTER : `mouseenter${EVENT_KEY}`,
+ MOUSELEAVE : `mouseleave${EVENT_KEY}`
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Popover extends Tooltip {
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+ static get NAME() {
+ return NAME
+ }
+
+ static get DATA_KEY() {
+ return DATA_KEY
+ }
+
+ static get Event() {
+ return Event
+ }
+
+ static get EVENT_KEY() {
+ return EVENT_KEY
+ }
+
+ static get DefaultType() {
+ return DefaultType
+ }
+
+
+ // overrides
+
+ isWithContent() {
+ return this.getTitle() || this._getContent()
+ }
+
+ getTipElement() {
+ return this.tip = this.tip || $(this.config.template)[0]
+ }
+
+ setContent() {
+ const $tip = $(this.getTipElement())
+
+ // we use append for html objects to maintain js events
+ this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
+ this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
+
+ $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
+
+ this.cleanupTether()
+ }
+
+ // private
+
+ _getContent() {
+ return this.element.getAttribute('data-content')
+ || (typeof this.config.content === 'function' ?
+ this.config.content.call(this.element) :
+ this.config.content)
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _config = typeof config === 'object' ? config : null
+
+ if (!data && /destroy|hide/.test(config)) {
+ return
+ }
+
+ if (!data) {
+ data = new Popover(this, _config)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config]()
+ }
+ })
+ }
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Popover._jQueryInterface
+ $.fn[NAME].Constructor = Popover
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Popover._jQueryInterface
+ }
+
+ return Popover
+
+})(jQuery)
+
+export default Popover
diff --git a/templates/assets/bootstrap/js/src/scrollspy.js b/templates/assets/bootstrap/js/src/scrollspy.js
new file mode 100644
index 0000000..15541b8
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/scrollspy.js
@@ -0,0 +1,335 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): scrollspy.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const ScrollSpy = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'scrollspy'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.scrollspy'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Default = {
+ offset : 10,
+ method : 'auto',
+ target : ''
+ }
+
+ const DefaultType = {
+ offset : 'number',
+ method : 'string',
+ target : '(string|element)'
+ }
+
+ const Event = {
+ ACTIVATE : `activate${EVENT_KEY}`,
+ SCROLL : `scroll${EVENT_KEY}`,
+ LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ DROPDOWN_ITEM : 'dropdown-item',
+ DROPDOWN_MENU : 'dropdown-menu',
+ NAV_LINK : 'nav-link',
+ NAV : 'nav',
+ ACTIVE : 'active'
+ }
+
+ const Selector = {
+ DATA_SPY : '[data-spy="scroll"]',
+ ACTIVE : '.active',
+ LIST_ITEM : '.list-item',
+ LI : 'li',
+ LI_DROPDOWN : 'li.dropdown',
+ NAV_LINKS : '.nav-link',
+ DROPDOWN : '.dropdown',
+ DROPDOWN_ITEMS : '.dropdown-item',
+ DROPDOWN_TOGGLE : '.dropdown-toggle'
+ }
+
+ const OffsetMethod = {
+ OFFSET : 'offset',
+ POSITION : 'position'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class ScrollSpy {
+
+ constructor(element, config) {
+ this._element = element
+ this._scrollElement = element.tagName === 'BODY' ? window : element
+ this._config = this._getConfig(config)
+ this._selector = `${this._config.target} ${Selector.NAV_LINKS},`
+ + `${this._config.target} ${Selector.DROPDOWN_ITEMS}`
+ this._offsets = []
+ this._targets = []
+ this._activeTarget = null
+ this._scrollHeight = 0
+
+ $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))
+
+ this.refresh()
+ this._process()
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+
+ // public
+
+ refresh() {
+ const autoMethod = this._scrollElement !== this._scrollElement.window ?
+ OffsetMethod.POSITION : OffsetMethod.OFFSET
+
+ const offsetMethod = this._config.method === 'auto' ?
+ autoMethod : this._config.method
+
+ const offsetBase = offsetMethod === OffsetMethod.POSITION ?
+ this._getScrollTop() : 0
+
+ this._offsets = []
+ this._targets = []
+
+ this._scrollHeight = this._getScrollHeight()
+
+ const targets = $.makeArray($(this._selector))
+
+ targets
+ .map((element) => {
+ let target
+ const targetSelector = Util.getSelectorFromElement(element)
+
+ if (targetSelector) {
+ target = $(targetSelector)[0]
+ }
+
+ if (target) {
+ const targetBCR = target.getBoundingClientRect()
+ if (targetBCR.width || targetBCR.height) {
+ // todo (fat): remove sketch reliance on jQuery position/offset
+ return [
+ $(target)[offsetMethod]().top + offsetBase,
+ targetSelector
+ ]
+ }
+ }
+ return null
+ })
+ .filter((item) => item)
+ .sort((a, b) => a[0] - b[0])
+ .forEach((item) => {
+ this._offsets.push(item[0])
+ this._targets.push(item[1])
+ })
+ }
+
+ dispose() {
+ $.removeData(this._element, DATA_KEY)
+ $(this._scrollElement).off(EVENT_KEY)
+
+ this._element = null
+ this._scrollElement = null
+ this._config = null
+ this._selector = null
+ this._offsets = null
+ this._targets = null
+ this._activeTarget = null
+ this._scrollHeight = null
+ }
+
+
+ // private
+
+ _getConfig(config) {
+ config = $.extend({}, Default, config)
+
+ if (typeof config.target !== 'string') {
+ let id = $(config.target).attr('id')
+ if (!id) {
+ id = Util.getUID(NAME)
+ $(config.target).attr('id', id)
+ }
+ config.target = `#${id}`
+ }
+
+ Util.typeCheckConfig(NAME, config, DefaultType)
+
+ return config
+ }
+
+ _getScrollTop() {
+ return this._scrollElement === window ?
+ this._scrollElement.pageYOffset : this._scrollElement.scrollTop
+ }
+
+ _getScrollHeight() {
+ return this._scrollElement.scrollHeight || Math.max(
+ document.body.scrollHeight,
+ document.documentElement.scrollHeight
+ )
+ }
+
+ _getOffsetHeight() {
+ return this._scrollElement === window ?
+ window.innerHeight : this._scrollElement.getBoundingClientRect().height
+ }
+
+ _process() {
+ const scrollTop = this._getScrollTop() + this._config.offset
+ const scrollHeight = this._getScrollHeight()
+ const maxScroll = this._config.offset
+ + scrollHeight
+ - this._getOffsetHeight()
+
+ if (this._scrollHeight !== scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ const target = this._targets[this._targets.length - 1]
+
+ if (this._activeTarget !== target) {
+ this._activate(target)
+ }
+ return
+ }
+
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
+ this._activeTarget = null
+ this._clear()
+ return
+ }
+
+ for (let i = this._offsets.length; i--;) {
+ const isActiveTarget = this._activeTarget !== this._targets[i]
+ && scrollTop >= this._offsets[i]
+ && (this._offsets[i + 1] === undefined ||
+ scrollTop < this._offsets[i + 1])
+
+ if (isActiveTarget) {
+ this._activate(this._targets[i])
+ }
+ }
+ }
+
+ _activate(target) {
+ this._activeTarget = target
+
+ this._clear()
+
+ let queries = this._selector.split(',')
+ queries = queries.map((selector) => {
+ return `${selector}[data-target="${target}"],` +
+ `${selector}[href="${target}"]`
+ })
+
+ const $link = $(queries.join(','))
+
+ if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
+ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
+ $link.addClass(ClassName.ACTIVE)
+ } else {
+ // todo (fat) this is kinda sus...
+ // recursively add actives to tested nav-links
+ $link.parents(Selector.LI).find(`> ${Selector.NAV_LINKS}`).addClass(ClassName.ACTIVE)
+ }
+
+ $(this._scrollElement).trigger(Event.ACTIVATE, {
+ relatedTarget: target
+ })
+ }
+
+ _clear() {
+ $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _config = typeof config === 'object' && config
+
+ if (!data) {
+ data = new ScrollSpy(this, _config)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config]()
+ }
+ })
+ }
+
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(window).on(Event.LOAD_DATA_API, () => {
+ const scrollSpys = $.makeArray($(Selector.DATA_SPY))
+
+ for (let i = scrollSpys.length; i--;) {
+ const $spy = $(scrollSpys[i])
+ ScrollSpy._jQueryInterface.call($spy, $spy.data())
+ }
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = ScrollSpy._jQueryInterface
+ $.fn[NAME].Constructor = ScrollSpy
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return ScrollSpy._jQueryInterface
+ }
+
+ return ScrollSpy
+
+})(jQuery)
+
+export default ScrollSpy
diff --git a/templates/assets/bootstrap/js/src/tab.js b/templates/assets/bootstrap/js/src/tab.js
new file mode 100644
index 0000000..d5669b7
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/tab.js
@@ -0,0 +1,284 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): tab.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Tab = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'tab'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.tab'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const DATA_API_KEY = '.data-api'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 150
+
+ const Event = {
+ HIDE : `hide${EVENT_KEY}`,
+ HIDDEN : `hidden${EVENT_KEY}`,
+ SHOW : `show${EVENT_KEY}`,
+ SHOWN : `shown${EVENT_KEY}`,
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
+ }
+
+ const ClassName = {
+ DROPDOWN_MENU : 'dropdown-menu',
+ ACTIVE : 'active',
+ DISABLED : 'disabled',
+ FADE : 'fade',
+ SHOW : 'show'
+ }
+
+ const Selector = {
+ A : 'a',
+ LI : 'li',
+ DROPDOWN : '.dropdown',
+ LIST : 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu), .list-group:not(.dropdown-menu)',
+ FADE_CHILD : '> .nav-item .fade, > .list-group-item .fade, > .fade',
+ ACTIVE : '.active',
+ ACTIVE_CHILD : '> .nav-item > .active, > .list-group-item > .active, > .active',
+ DATA_TOGGLE : '[data-toggle="tab"], [data-toggle="pill"]',
+ DROPDOWN_TOGGLE : '.dropdown-toggle',
+ DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Tab {
+
+ constructor(element) {
+ this._element = element
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+
+ // public
+
+ show() {
+ if (this._element.parentNode &&
+ this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
+ $(this._element).hasClass(ClassName.ACTIVE) ||
+ $(this._element).hasClass(ClassName.DISABLED)) {
+ return
+ }
+
+ let target
+ let previous
+ const listElement = $(this._element).closest(Selector.LIST)[0]
+ const selector = Util.getSelectorFromElement(this._element)
+
+ if (listElement) {
+ previous = $.makeArray($(listElement).find(Selector.ACTIVE))
+ previous = previous[previous.length - 1]
+ }
+
+ const hideEvent = $.Event(Event.HIDE, {
+ relatedTarget: this._element
+ })
+
+ const showEvent = $.Event(Event.SHOW, {
+ relatedTarget: previous
+ })
+
+ if (previous) {
+ $(previous).trigger(hideEvent)
+ }
+
+ $(this._element).trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented() ||
+ hideEvent.isDefaultPrevented()) {
+ return
+ }
+
+ if (selector) {
+ target = $(selector)[0]
+ }
+
+ this._activate(
+ this._element,
+ listElement
+ )
+
+ const complete = () => {
+ const hiddenEvent = $.Event(Event.HIDDEN, {
+ relatedTarget: this._element
+ })
+
+ const shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget: previous
+ })
+
+ $(previous).trigger(hiddenEvent)
+ $(this._element).trigger(shownEvent)
+ }
+
+ if (target) {
+ this._activate(target, target.parentNode, complete)
+ } else {
+ complete()
+ }
+ }
+
+ dispose() {
+ $.removeClass(this._element, DATA_KEY)
+ this._element = null
+ }
+
+
+ // private
+
+ _activate(element, container, callback) {
+ const active = $(container).find(Selector.ACTIVE_CHILD)[0]
+ const isTransitioning = callback
+ && Util.supportsTransitionEnd()
+ && (active && $(active).hasClass(ClassName.FADE)
+ || Boolean($(container).find(Selector.FADE_CHILD)[0]))
+
+ const complete = () => this._transitionComplete(
+ element,
+ active,
+ isTransitioning,
+ callback
+ )
+
+ if (active && isTransitioning) {
+ $(active)
+ .one(Util.TRANSITION_END, complete)
+ .emulateTransitionEnd(TRANSITION_DURATION)
+
+ } else {
+ complete()
+ }
+
+ if (active) {
+ $(active).removeClass(ClassName.SHOW)
+ }
+ }
+
+ _transitionComplete(element, active, isTransitioning, callback) {
+ if (active) {
+ $(active).removeClass(ClassName.ACTIVE)
+ if ($(active).hasClass('list-group-item')) {
+ $(active).find('a.nav-link').removeClass(ClassName.ACTIVE)
+ }
+
+ const dropdownChild = $(active.parentNode).find(
+ Selector.DROPDOWN_ACTIVE_CHILD
+ )[0]
+
+ if (dropdownChild) {
+ $(dropdownChild).removeClass(ClassName.ACTIVE)
+ }
+
+ active.setAttribute('aria-expanded', false)
+ }
+
+ $(element).addClass(ClassName.ACTIVE)
+ if ($(element.parentNode).hasClass('list-group-item')) {
+ $(element.parentNode).addClass(ClassName.ACTIVE)
+ }
+ element.setAttribute('aria-expanded', true)
+
+ if (isTransitioning) {
+ Util.reflow(element)
+ $(element).addClass(ClassName.SHOW)
+ } else {
+ $(element).removeClass(ClassName.FADE)
+ }
+
+ if (element.parentNode &&
+ $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
+
+ const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
+ if (dropdownElement) {
+ $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
+ }
+
+ element.setAttribute('aria-expanded', true)
+ }
+
+ if (callback) {
+ callback()
+ }
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ const $this = $(this)
+ let data = $this.data(DATA_KEY)
+
+ if (!data) {
+ data = new Tab(this)
+ $this.data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config]()
+ }
+ })
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document)
+ .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault()
+ Tab._jQueryInterface.call($(this), 'show')
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Tab._jQueryInterface
+ $.fn[NAME].Constructor = Tab
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Tab._jQueryInterface
+ }
+
+ return Tab
+
+})(jQuery)
+
+export default Tab
diff --git a/templates/assets/bootstrap/js/src/tooltip.js b/templates/assets/bootstrap/js/src/tooltip.js
new file mode 100644
index 0000000..e750dce
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/tooltip.js
@@ -0,0 +1,675 @@
+/* global Tether */
+
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): tooltip.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Tooltip = (($) => {
+
+ /**
+ * Check for Tether dependency
+ * Tether - http://tether.io/
+ */
+ if (typeof Tether === 'undefined') {
+ throw new Error('Bootstrap tooltips require Tether (http://tether.io/)')
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'tooltip'
+ const VERSION = '4.0.0-alpha.6'
+ const DATA_KEY = 'bs.tooltip'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 150
+ const CLASS_PREFIX = 'bs-tether'
+
+ const Default = {
+ animation : true,
+ template : '',
+ trigger : 'hover focus',
+ title : '',
+ delay : 0,
+ html : false,
+ selector : false,
+ placement : 'top',
+ offset : '0 0',
+ constraints : [],
+ container : false
+ }
+
+ const DefaultType = {
+ animation : 'boolean',
+ template : 'string',
+ title : '(string|element|function)',
+ trigger : 'string',
+ delay : '(number|object)',
+ html : 'boolean',
+ selector : '(string|boolean)',
+ placement : '(string|function)',
+ offset : 'string',
+ constraints : 'array',
+ container : '(string|element|boolean)'
+ }
+
+ const AttachmentMap = {
+ TOP : 'bottom center',
+ RIGHT : 'middle left',
+ BOTTOM : 'top center',
+ LEFT : 'middle right'
+ }
+
+ const HoverState = {
+ SHOW : 'show',
+ OUT : 'out'
+ }
+
+ const Event = {
+ HIDE : `hide${EVENT_KEY}`,
+ HIDDEN : `hidden${EVENT_KEY}`,
+ SHOW : `show${EVENT_KEY}`,
+ SHOWN : `shown${EVENT_KEY}`,
+ INSERTED : `inserted${EVENT_KEY}`,
+ CLICK : `click${EVENT_KEY}`,
+ FOCUSIN : `focusin${EVENT_KEY}`,
+ FOCUSOUT : `focusout${EVENT_KEY}`,
+ MOUSEENTER : `mouseenter${EVENT_KEY}`,
+ MOUSELEAVE : `mouseleave${EVENT_KEY}`
+ }
+
+ const ClassName = {
+ FADE : 'fade',
+ SHOW : 'show'
+ }
+
+ const Selector = {
+ TOOLTIP : '.tooltip',
+ TOOLTIP_INNER : '.tooltip-inner'
+ }
+
+ const TetherClass = {
+ element : false,
+ enabled : false
+ }
+
+ const Trigger = {
+ HOVER : 'hover',
+ FOCUS : 'focus',
+ CLICK : 'click',
+ MANUAL : 'manual'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Tooltip {
+
+ constructor(element, config) {
+
+ // private
+ this._isEnabled = true
+ this._timeout = 0
+ this._hoverState = ''
+ this._activeTrigger = {}
+ this._isTransitioning = false
+ this._tether = null
+
+ // protected
+ this.element = element
+ this.config = this._getConfig(config)
+ this.tip = null
+
+ this._setListeners()
+
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+ static get NAME() {
+ return NAME
+ }
+
+ static get DATA_KEY() {
+ return DATA_KEY
+ }
+
+ static get Event() {
+ return Event
+ }
+
+ static get EVENT_KEY() {
+ return EVENT_KEY
+ }
+
+ static get DefaultType() {
+ return DefaultType
+ }
+
+
+ // public
+
+ enable() {
+ this._isEnabled = true
+ }
+
+ disable() {
+ this._isEnabled = false
+ }
+
+ toggleEnabled() {
+ this._isEnabled = !this._isEnabled
+ }
+
+ toggle(event) {
+ if (event) {
+ const dataKey = this.constructor.DATA_KEY
+ let context = $(event.currentTarget).data(dataKey)
+
+ if (!context) {
+ context = new this.constructor(
+ event.currentTarget,
+ this._getDelegateConfig()
+ )
+ $(event.currentTarget).data(dataKey, context)
+ }
+
+ context._activeTrigger.click = !context._activeTrigger.click
+
+ if (context._isWithActiveTrigger()) {
+ context._enter(null, context)
+ } else {
+ context._leave(null, context)
+ }
+
+ } else {
+
+ if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
+ this._leave(null, this)
+ return
+ }
+
+ this._enter(null, this)
+ }
+ }
+
+ dispose() {
+ clearTimeout(this._timeout)
+
+ this.cleanupTether()
+
+ $.removeData(this.element, this.constructor.DATA_KEY)
+
+ $(this.element).off(this.constructor.EVENT_KEY)
+ $(this.element).closest('.modal').off('hide.bs.modal')
+
+ if (this.tip) {
+ $(this.tip).remove()
+ }
+
+ this._isEnabled = null
+ this._timeout = null
+ this._hoverState = null
+ this._activeTrigger = null
+ this._tether = null
+
+ this.element = null
+ this.config = null
+ this.tip = null
+ }
+
+ show() {
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements')
+ }
+
+ const showEvent = $.Event(this.constructor.Event.SHOW)
+ if (this.isWithContent() && this._isEnabled) {
+ if (this._isTransitioning) {
+ throw new Error('Tooltip is transitioning')
+ }
+ $(this.element).trigger(showEvent)
+
+ const isInTheDom = $.contains(
+ this.element.ownerDocument.documentElement,
+ this.element
+ )
+
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
+ return
+ }
+
+ const tip = this.getTipElement()
+ const tipId = Util.getUID(this.constructor.NAME)
+
+ tip.setAttribute('id', tipId)
+ this.element.setAttribute('aria-describedby', tipId)
+
+ this.setContent()
+
+ if (this.config.animation) {
+ $(tip).addClass(ClassName.FADE)
+ }
+
+ const placement = typeof this.config.placement === 'function' ?
+ this.config.placement.call(this, tip, this.element) :
+ this.config.placement
+
+ const attachment = this._getAttachment(placement)
+
+ const container = this.config.container === false ? document.body : $(this.config.container)
+
+ $(tip)
+ .data(this.constructor.DATA_KEY, this)
+ .appendTo(container)
+
+ $(this.element).trigger(this.constructor.Event.INSERTED)
+
+ this._tether = new Tether({
+ attachment,
+ element : tip,
+ target : this.element,
+ classes : TetherClass,
+ classPrefix : CLASS_PREFIX,
+ offset : this.config.offset,
+ constraints : this.config.constraints,
+ addTargetClasses: false
+ })
+
+ Util.reflow(tip)
+ this._tether.position()
+
+ $(tip).addClass(ClassName.SHOW)
+
+ const complete = () => {
+ const prevHoverState = this._hoverState
+ this._hoverState = null
+ this._isTransitioning = false
+
+ $(this.element).trigger(this.constructor.Event.SHOWN)
+
+ if (prevHoverState === HoverState.OUT) {
+ this._leave(null, this)
+ }
+ }
+
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true
+ $(this.tip)
+ .one(Util.TRANSITION_END, complete)
+ .emulateTransitionEnd(Tooltip._TRANSITION_DURATION)
+ return
+ }
+
+ complete()
+ }
+ }
+
+ hide(callback) {
+ const tip = this.getTipElement()
+ const hideEvent = $.Event(this.constructor.Event.HIDE)
+ if (this._isTransitioning) {
+ throw new Error('Tooltip is transitioning')
+ }
+ const complete = () => {
+ if (this._hoverState !== HoverState.SHOW && tip.parentNode) {
+ tip.parentNode.removeChild(tip)
+ }
+
+ this.element.removeAttribute('aria-describedby')
+ $(this.element).trigger(this.constructor.Event.HIDDEN)
+ this._isTransitioning = false
+ this.cleanupTether()
+
+ if (callback) {
+ callback()
+ }
+ }
+
+ $(this.element).trigger(hideEvent)
+
+ if (hideEvent.isDefaultPrevented()) {
+ return
+ }
+
+ $(tip).removeClass(ClassName.SHOW)
+
+ this._activeTrigger[Trigger.CLICK] = false
+ this._activeTrigger[Trigger.FOCUS] = false
+ this._activeTrigger[Trigger.HOVER] = false
+
+ if (Util.supportsTransitionEnd() &&
+ $(this.tip).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true
+ $(tip)
+ .one(Util.TRANSITION_END, complete)
+ .emulateTransitionEnd(TRANSITION_DURATION)
+
+ } else {
+ complete()
+ }
+
+ this._hoverState = ''
+ }
+
+
+ // protected
+
+ isWithContent() {
+ return Boolean(this.getTitle())
+ }
+
+ getTipElement() {
+ return this.tip = this.tip || $(this.config.template)[0]
+ }
+
+ setContent() {
+ const $tip = $(this.getTipElement())
+
+ this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
+
+ $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
+
+ this.cleanupTether()
+ }
+
+ setElementContent($element, content) {
+ const html = this.config.html
+ if (typeof content === 'object' && (content.nodeType || content.jquery)) {
+ // content is a DOM node or a jQuery
+ if (html) {
+ if (!$(content).parent().is($element)) {
+ $element.empty().append(content)
+ }
+ } else {
+ $element.text($(content).text())
+ }
+ } else {
+ $element[html ? 'html' : 'text'](content)
+ }
+ }
+
+ getTitle() {
+ let title = this.element.getAttribute('data-original-title')
+
+ if (!title) {
+ title = typeof this.config.title === 'function' ?
+ this.config.title.call(this.element) :
+ this.config.title
+ }
+
+ return title
+ }
+
+ cleanupTether() {
+ if (this._tether) {
+ this._tether.destroy()
+ }
+ }
+
+
+ // private
+
+ _getAttachment(placement) {
+ return AttachmentMap[placement.toUpperCase()]
+ }
+
+ _setListeners() {
+ const triggers = this.config.trigger.split(' ')
+
+ triggers.forEach((trigger) => {
+ if (trigger === 'click') {
+ $(this.element).on(
+ this.constructor.Event.CLICK,
+ this.config.selector,
+ (event) => this.toggle(event)
+ )
+
+ } else if (trigger !== Trigger.MANUAL) {
+ const eventIn = trigger === Trigger.HOVER ?
+ this.constructor.Event.MOUSEENTER :
+ this.constructor.Event.FOCUSIN
+ const eventOut = trigger === Trigger.HOVER ?
+ this.constructor.Event.MOUSELEAVE :
+ this.constructor.Event.FOCUSOUT
+
+ $(this.element)
+ .on(
+ eventIn,
+ this.config.selector,
+ (event) => this._enter(event)
+ )
+ .on(
+ eventOut,
+ this.config.selector,
+ (event) => this._leave(event)
+ )
+ }
+
+ $(this.element).closest('.modal').on(
+ 'hide.bs.modal',
+ () => this.hide()
+ )
+ })
+
+ if (this.config.selector) {
+ this.config = $.extend({}, this.config, {
+ trigger : 'manual',
+ selector : ''
+ })
+ } else {
+ this._fixTitle()
+ }
+ }
+
+ _fixTitle() {
+ const titleType = typeof this.element.getAttribute('data-original-title')
+ if (this.element.getAttribute('title') ||
+ titleType !== 'string') {
+ this.element.setAttribute(
+ 'data-original-title',
+ this.element.getAttribute('title') || ''
+ )
+ this.element.setAttribute('title', '')
+ }
+ }
+
+ _enter(event, context) {
+ const dataKey = this.constructor.DATA_KEY
+
+ context = context || $(event.currentTarget).data(dataKey)
+
+ if (!context) {
+ context = new this.constructor(
+ event.currentTarget,
+ this._getDelegateConfig()
+ )
+ $(event.currentTarget).data(dataKey, context)
+ }
+
+ if (event) {
+ context._activeTrigger[
+ event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER
+ ] = true
+ }
+
+ if ($(context.getTipElement()).hasClass(ClassName.SHOW) ||
+ context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW
+ return
+ }
+
+ clearTimeout(context._timeout)
+
+ context._hoverState = HoverState.SHOW
+
+ if (!context.config.delay || !context.config.delay.show) {
+ context.show()
+ return
+ }
+
+ context._timeout = setTimeout(() => {
+ if (context._hoverState === HoverState.SHOW) {
+ context.show()
+ }
+ }, context.config.delay.show)
+ }
+
+ _leave(event, context) {
+ const dataKey = this.constructor.DATA_KEY
+
+ context = context || $(event.currentTarget).data(dataKey)
+
+ if (!context) {
+ context = new this.constructor(
+ event.currentTarget,
+ this._getDelegateConfig()
+ )
+ $(event.currentTarget).data(dataKey, context)
+ }
+
+ if (event) {
+ context._activeTrigger[
+ event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER
+ ] = false
+ }
+
+ if (context._isWithActiveTrigger()) {
+ return
+ }
+
+ clearTimeout(context._timeout)
+
+ context._hoverState = HoverState.OUT
+
+ if (!context.config.delay || !context.config.delay.hide) {
+ context.hide()
+ return
+ }
+
+ context._timeout = setTimeout(() => {
+ if (context._hoverState === HoverState.OUT) {
+ context.hide()
+ }
+ }, context.config.delay.hide)
+ }
+
+ _isWithActiveTrigger() {
+ for (const trigger in this._activeTrigger) {
+ if (this._activeTrigger[trigger]) {
+ return true
+ }
+ }
+
+ return false
+ }
+
+ _getConfig(config) {
+ config = $.extend(
+ {},
+ this.constructor.Default,
+ $(this.element).data(),
+ config
+ )
+
+ if (config.delay && typeof config.delay === 'number') {
+ config.delay = {
+ show : config.delay,
+ hide : config.delay
+ }
+ }
+
+ Util.typeCheckConfig(
+ NAME,
+ config,
+ this.constructor.DefaultType
+ )
+
+ return config
+ }
+
+ _getDelegateConfig() {
+ const config = {}
+
+ if (this.config) {
+ for (const key in this.config) {
+ if (this.constructor.Default[key] !== this.config[key]) {
+ config[key] = this.config[key]
+ }
+ }
+ }
+
+ return config
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _config = typeof config === 'object' && config
+
+ if (!data && /dispose|hide/.test(config)) {
+ return
+ }
+
+ if (!data) {
+ data = new Tooltip(this, _config)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error(`No method named "${config}"`)
+ }
+ data[config]()
+ }
+ })
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Tooltip._jQueryInterface
+ $.fn[NAME].Constructor = Tooltip
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Tooltip._jQueryInterface
+ }
+
+ return Tooltip
+
+})(jQuery)
+
+export default Tooltip
diff --git a/templates/assets/bootstrap/js/src/util.js b/templates/assets/bootstrap/js/src/util.js
new file mode 100644
index 0000000..3c0d022
--- /dev/null
+++ b/templates/assets/bootstrap/js/src/util.js
@@ -0,0 +1,164 @@
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): util.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Util = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Private TransitionEnd Helpers
+ * ------------------------------------------------------------------------
+ */
+
+ let transition = false
+
+ const MAX_UID = 1000000
+
+ const TransitionEndEvent = {
+ WebkitTransition : 'webkitTransitionEnd',
+ MozTransition : 'transitionend',
+ OTransition : 'oTransitionEnd otransitionend',
+ transition : 'transitionend'
+ }
+
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
+ function toType(obj) {
+ return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
+ }
+
+ function isElement(obj) {
+ return (obj[0] || obj).nodeType
+ }
+
+ function getSpecialTransitionEndEvent() {
+ return {
+ bindType: transition.end,
+ delegateType: transition.end,
+ handle(event) {
+ if ($(event.target).is(this)) {
+ return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
+ }
+ return undefined
+ }
+ }
+ }
+
+ function transitionEndTest() {
+ if (window.QUnit) {
+ return false
+ }
+
+ const el = document.createElement('bootstrap')
+
+ for (const name in TransitionEndEvent) {
+ if (el.style[name] !== undefined) {
+ return {
+ end: TransitionEndEvent[name]
+ }
+ }
+ }
+
+ return false
+ }
+
+ function transitionEndEmulator(duration) {
+ let called = false
+
+ $(this).one(Util.TRANSITION_END, () => {
+ called = true
+ })
+
+ setTimeout(() => {
+ if (!called) {
+ Util.triggerTransitionEnd(this)
+ }
+ }, duration)
+
+ return this
+ }
+
+ function setTransitionEndSupport() {
+ transition = transitionEndTest()
+
+ $.fn.emulateTransitionEnd = transitionEndEmulator
+
+ if (Util.supportsTransitionEnd()) {
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
+ }
+ }
+
+
+ /**
+ * --------------------------------------------------------------------------
+ * Public Util Api
+ * --------------------------------------------------------------------------
+ */
+
+ const Util = {
+
+ TRANSITION_END: 'bsTransitionEnd',
+
+ getUID(prefix) {
+ do {
+ // eslint-disable-next-line no-bitwise
+ prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
+ } while (document.getElementById(prefix))
+ return prefix
+ },
+
+ getSelectorFromElement(element) {
+ let selector = element.getAttribute('data-target')
+ if (!selector || selector === '#') {
+ selector = element.getAttribute('href') || ''
+ }
+
+ try {
+ const $selector = $(selector)
+ return $selector.length > 0 ? selector : null
+ } catch (error) {
+ return null
+ }
+ },
+
+ reflow(element) {
+ return element.offsetHeight
+ },
+
+ triggerTransitionEnd(element) {
+ $(element).trigger(transition.end)
+ },
+
+ supportsTransitionEnd() {
+ return Boolean(transition)
+ },
+
+ typeCheckConfig(componentName, config, configTypes) {
+ for (const property in configTypes) {
+ if (configTypes.hasOwnProperty(property)) {
+ const expectedTypes = configTypes[property]
+ const value = config[property]
+ const valueType = value && isElement(value) ?
+ 'element' : toType(value)
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(
+ `${componentName.toUpperCase()}: ` +
+ `Option "${property}" provided type "${valueType}" ` +
+ `but expected type "${expectedTypes}".`)
+ }
+ }
+ }
+ }
+ }
+
+ setTransitionEndSupport()
+
+ return Util
+
+})(jQuery)
+
+export default Util
diff --git a/templates/assets/bootstrap/nuget/MyGet.ps1 b/templates/assets/bootstrap/nuget/MyGet.ps1
new file mode 100644
index 0000000..71110b5
--- /dev/null
+++ b/templates/assets/bootstrap/nuget/MyGet.ps1
@@ -0,0 +1,18 @@
+# set env vars usually set by MyGet (enable for local testing)
+#$env:SourcesPath = '..'
+#$env:NuGet = "./nuget.exe" #https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
+
+$nuget = $env:NuGet
+
+# parse the version number out of package.json
+$bsversionParts = ((Get-Content $env:SourcesPath\package.json) -join "`n" | ConvertFrom-Json).version.split('-', 2) # split the version on the '-'
+$bsversion = $bsversionParts[0]
+
+if ($bsversionParts.Length -gt 1)
+{
+ $bsversion += '-' + $bsversionParts[1].replace('.', '').replace('-', '_') # strip out invalid chars from the PreRelease part
+}
+
+# create packages
+& $nuget pack "$env:SourcesPath\nuget\bootstrap.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion
+& $nuget pack "$env:SourcesPath\nuget\bootstrap.sass.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion
diff --git a/templates/assets/bootstrap/nuget/bootstrap.nuspec b/templates/assets/bootstrap/nuget/bootstrap.nuspec
new file mode 100644
index 0000000..bbb4582
--- /dev/null
+++ b/templates/assets/bootstrap/nuget/bootstrap.nuspec
@@ -0,0 +1,27 @@
+
+
+
+ bootstrap
+ 4.0.0
+ Bootstrap CSS
+ The Bootstrap Authors, Twitter Inc.
+ bootstrap
+ The most popular front-end framework for developing responsive, mobile first projects on the web.
+ https://blog.getbootstrap.com
+ Bootstrap framework in CSS. Includes fonts and JavaScript
+ en-us
+ https://getbootstrap.com
+ https://getbootstrap.com/apple-touch-icon.png
+ https://github.com/twbs/bootstrap/blob/master/LICENSE
+ Copyright 2017
+ false
+
+
+
+ css mobile-first responsive front-end framework web
+
+
+
+
+
+
diff --git a/templates/assets/bootstrap/nuget/bootstrap.sass.nuspec b/templates/assets/bootstrap/nuget/bootstrap.sass.nuspec
new file mode 100644
index 0000000..aba443c
--- /dev/null
+++ b/templates/assets/bootstrap/nuget/bootstrap.sass.nuspec
@@ -0,0 +1,27 @@
+
+
+
+ bootstrap.sass
+ 4.0.0
+ Bootstrap Sass
+ The Bootstrap Authors, Twitter Inc.
+ bootstrap
+ The most popular front-end framework for developing responsive, mobile first projects on the web.
+ https://blog.getbootstrap.com
+ Bootstrap framework in Sass. Includes fonts and JavaScript
+ en-us
+ https://getbootstrap.com
+ https://getbootstrap.com/apple-touch-icon.png
+ https://github.com/twbs/bootstrap/blob/master/LICENSE
+ Copyright 2017
+ false
+
+
+
+ css sass mobile-first responsive front-end framework web
+
+
+
+
+
+
diff --git a/templates/assets/bootstrap/package.js b/templates/assets/bootstrap/package.js
new file mode 100644
index 0000000..ce21bad
--- /dev/null
+++ b/templates/assets/bootstrap/package.js
@@ -0,0 +1,19 @@
+// package metadata file for Meteor.js
+
+/* global Package:true */
+
+Package.describe({
+ name: 'twbs:bootstrap', // https://atmospherejs.com/twbs/bootstrap
+ summary: 'The most popular front-end framework for developing responsive, mobile first projects on the web.',
+ version: '4.0.0-alpha.6',
+ git: 'https://github.com/twbs/bootstrap.git'
+});
+
+Package.onUse(function (api) {
+ api.versionsFrom('METEOR@1.0');
+ api.use('jquery', 'client');
+ api.addFiles([
+ 'dist/css/bootstrap.css',
+ 'dist/js/bootstrap.js'
+ ], 'client');
+});
diff --git a/templates/assets/bootstrap/package.json b/templates/assets/bootstrap/package.json
new file mode 100644
index 0000000..d11ffbf
--- /dev/null
+++ b/templates/assets/bootstrap/package.json
@@ -0,0 +1,114 @@
+{
+ "name": "bootstrap",
+ "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
+ "version": "4.0.0-alpha.6",
+ "keywords": [
+ "css",
+ "sass",
+ "mobile-first",
+ "responsive",
+ "front-end",
+ "framework",
+ "web"
+ ],
+ "homepage": "https://getbootstrap.com",
+ "author": "The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)",
+ "contributors": [
+ "Twitter, Inc."
+ ],
+ "scripts": {
+ "change-version": "node grunt/change-version.js",
+ "clean-css": "cleancss --level 1 --source-map --output dist/css/bootstrap.min.css dist/css/bootstrap.css && cleancss --level 1 --source-map --output dist/css/bootstrap-grid.min.css dist/css/bootstrap-grid.css && cleancss --level 1 --source-map --output dist/css/bootstrap-reboot.min.css dist/css/bootstrap-reboot.css",
+ "clean-css-docs": "cleancss --level 1 --source-map --output docs/assets/css/docs.min.css docs/assets/css/docs.min.css",
+ "eslint": "eslint --ignore-path .eslintignore js && eslint --config js/tests/.eslintrc.json --env node grunt Gruntfile.js && eslint --config js/tests/.eslintrc.json docs/assets/js/src docs/assets/js/ie-emulation-modes-warning.js docs/assets/js/ie10-viewport-bug-workaround.js",
+ "htmlhint": "htmlhint --config docs/.htmlhintrc _gh_pages/",
+ "htmllint": "htmllint --rc docs/.htmllintrc _gh_pages/**/*.html js/tests/visual/*.html",
+ "jekyll": "bundle exec jekyll build",
+ "jekyll-github": "shx echo 'github: true' > $npm_config_tmp/twbsjekyll.yml && npm run jekyll -- --config _config.yml,$npm_config_tmp/twbsjekyll.yml && shx rm $npm_config_tmp/twbsjekyll.yml",
+ "postcss": "postcss --config grunt/ --replace dist/css/*.css",
+ "postcss-docs": "postcss --config grunt/ --replace docs/assets/css/docs.min.css && postcss --config grunt/ --replace docs/examples/**/*.css",
+ "sass": "node-sass --output-style expanded --source-map true --precision 6 scss/bootstrap.scss dist/css/bootstrap.css && node-sass --output-style expanded --source-map true --precision 6 scss/bootstrap-grid.scss dist/css/bootstrap-grid.css && node-sass --output-style expanded --source-map true --precision 6 scss/bootstrap-reboot.scss dist/css/bootstrap-reboot.css",
+ "sass-docs": "node-sass --output-style expanded --source-map true --precision 6 docs/assets/scss/docs.scss docs/assets/css/docs.min.css",
+ "scss-lint": "bundle exec scss-lint --config scss/.scss-lint.yml scss/*.scss",
+ "scss-lint-docs": "bundle exec scss-lint --config scss/.scss-lint.yml --exclude docs/assets/scss/docs.scss docs/assets/scss/*.scss",
+ "uglify": "uglifyjs --compress warnings=false --mangle --comments '/^!/' --output dist/js/bootstrap.min.js dist/js/bootstrap.js",
+ "uglify-docs": "uglifyjs --compress warnings=false --mangle --comments '/^!/' --output docs/assets/js/docs.min.js docs/assets/js/vendor/anchor.min.js docs/assets/js/vendor/clipboard.min.js docs/assets/js/vendor/holder.min.js docs/assets/js/src/application.js",
+ "update-shrinkwrap": "npm shrinkwrap --dev && shx mv ./npm-shrinkwrap.json ./grunt/npm-shrinkwrap.json",
+ "test": "npm run eslint && grunt test"
+ },
+ "style": "dist/css/bootstrap.css",
+ "sass": "scss/bootstrap.scss",
+ "main": "dist/js/bootstrap",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/twbs/bootstrap.git"
+ },
+ "bugs": {
+ "url": "https://github.com/twbs/bootstrap/issues"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "jquery": ">=1.9.1",
+ "tether": "^1.4.0"
+ },
+ "devDependencies": {
+ "autoprefixer": "^6.7.7",
+ "babel-eslint": "^7.1.1",
+ "babel-plugin-transform-es2015-modules-strip": "^0.1.0",
+ "babel-preset-es2015": "^6.24.0",
+ "clean-css-cli": "^4.0.9",
+ "eslint": "^3.18.0",
+ "grunt": "^1.0.1",
+ "grunt-babel": "^6.0.0",
+ "grunt-build-control": "^0.7.1",
+ "grunt-contrib-clean": "^1.0.0",
+ "grunt-contrib-compress": "^1.4.1",
+ "grunt-contrib-concat": "^1.0.1",
+ "grunt-contrib-connect": "^1.0.2",
+ "grunt-contrib-copy": "^1.0.0",
+ "grunt-contrib-qunit": "^1.3.0",
+ "grunt-contrib-watch": "^1.0.0",
+ "grunt-exec": "^2.0.0",
+ "grunt-saucelabs": "^9.0.0",
+ "grunt-stamp": "^0.3.0",
+ "htmlhint": "^0.9.13",
+ "htmllint-cli": "^0.0.6",
+ "is-travis": "^1.0.0",
+ "load-grunt-tasks": "^3.5.2",
+ "node-sass": "^4.5.0",
+ "postcss-cli": "^3.0.0",
+ "postcss-flexbugs-fixes": "^2.1.0",
+ "shelljs": "^0.7.7",
+ "shx": "^0.2.2",
+ "time-grunt": "^1.4.0",
+ "uglify-js": "^2.8.14"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "files": [
+ "dist",
+ "grunt",
+ "js/**/*.js",
+ "scss/**/*.scss",
+ "Gruntfile.js",
+ "LICENSE"
+ ],
+ "jspm": {
+ "main": "js/bootstrap",
+ "directories": {
+ "lib": "dist"
+ },
+ "shim": {
+ "js/bootstrap": {
+ "deps": [
+ "jquery"
+ ],
+ "exports": "$"
+ }
+ },
+ "dependencies": {
+ "jquery": "3"
+ }
+ }
+}
diff --git a/templates/assets/bootstrap/sache.json b/templates/assets/bootstrap/sache.json
new file mode 100644
index 0000000..cd1a8c4
--- /dev/null
+++ b/templates/assets/bootstrap/sache.json
@@ -0,0 +1,5 @@
+{
+ "name": "bootstrap",
+ "description": "The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.",
+ "tags": ["bootstrap", "grid", "typography", "buttons", "ui", "responsive-web-design"]
+}
diff --git a/templates/assets/bootstrap/scss/.scss-lint.yml b/templates/assets/bootstrap/scss/.scss-lint.yml
new file mode 100644
index 0000000..845001e
--- /dev/null
+++ b/templates/assets/bootstrap/scss/.scss-lint.yml
@@ -0,0 +1,536 @@
+# Default application configuration that all configurations inherit from.
+scss_files:
+ - "**/*.scss"
+ - "docs/assets/scss/**/*.scss"
+
+plugin_directories: ['.scss-linters']
+
+# List of gem names to load custom linters from (make sure they are already
+# installed)
+plugin_gems: []
+
+# Default severity of all linters.
+severity: warning
+
+linters:
+ BangFormat:
+ enabled: true
+ space_before_bang: true
+ space_after_bang: false
+
+ BemDepth:
+ enabled: false
+ max_elements: 1
+
+ BorderZero:
+ enabled: true
+ convention: zero # or `none`
+
+ ChainedClasses:
+ enabled: false
+
+ ColorKeyword:
+ enabled: true
+
+ ColorVariable:
+ enabled: false
+
+ Comment:
+ enabled: true
+ exclude:
+ - bootstrap.scss
+ style: silent
+
+ DebugStatement:
+ enabled: true
+
+ DeclarationOrder:
+ enabled: false
+
+ DisableLinterReason:
+ enabled: false
+
+ DuplicateProperty:
+ enabled: true
+
+ ElsePlacement:
+ enabled: true
+ style: same_line # or 'new_line'
+
+ EmptyLineBetweenBlocks:
+ enabled: false
+ ignore_single_line_blocks: true
+
+ EmptyRule:
+ enabled: true
+
+ ExtendDirective:
+ enabled: false
+
+ FinalNewline:
+ enabled: true
+ present: true
+
+ HexLength:
+ enabled: true
+ style: short # or 'long'
+
+ HexNotation:
+ enabled: true
+ style: lowercase # or 'uppercase'
+
+ HexValidation:
+ enabled: true
+
+ IdSelector:
+ enabled: true
+
+ ImportantRule:
+ enabled: false
+
+ ImportPath:
+ enabled: true
+ leading_underscore: false
+ filename_extension: false
+
+ Indentation:
+ enabled: true
+ allow_non_nested_indentation: false
+ character: space # or 'tab'
+ width: 2
+
+ LeadingZero:
+ enabled: true
+ style: exclude_zero # or 'include_zero'
+
+ MergeableSelector:
+ enabled: false
+ force_nesting: true
+
+ NameFormat:
+ enabled: true
+ allow_leading_underscore: true
+ convention: hyphenated_lowercase # or 'camel_case', or 'snake_case', or a regex pattern
+
+ NestingDepth:
+ enabled: true
+ max_depth: 4
+ ignore_parent_selectors: false
+
+ PlaceholderInExtend:
+ enabled: false
+
+ PropertyCount:
+ enabled: false
+ include_nested: false
+ max_properties: 10
+
+ PropertySortOrder:
+ enabled: true
+ ignore_unspecified: false
+ min_properties: 2
+ separate_groups: false
+ order:
+ - position
+ - top
+ - right
+ - bottom
+ - left
+ - z-index
+ - -webkit-box-sizing
+ - -moz-box-sizing
+ - box-sizing
+ - display
+ - flex
+ - flex-align
+ - flex-basis
+ - flex-direction
+ - flex-wrap
+ - flex-flow
+ - flex-grow
+ - flex-order
+ - flex-pack
+ - align-items
+ - align-self
+ - justify-content
+ - float
+ - width
+ - min-width
+ - max-width
+ - height
+ - min-height
+ - max-height
+ - padding
+ - padding-top
+ - padding-right
+ - padding-bottom
+ - padding-left
+ - margin
+ - margin-top
+ - margin-right
+ - margin-bottom
+ - margin-left
+ - overflow
+ - overflow-x
+ - overflow-y
+ - -webkit-overflow-scrolling
+ - -ms-overflow-x
+ - -ms-overflow-y
+ - -ms-overflow-style
+ - clip
+ - clear
+ - font
+ - font-family
+ - font-size
+ - font-style
+ - font-weight
+ - font-variant
+ - font-size-adjust
+ - font-stretch
+ - font-effect
+ - font-emphasize
+ - font-emphasize-position
+ - font-emphasize-style
+ - font-smooth
+ - -webkit-hyphens
+ - -moz-hyphens
+ - hyphens
+ - line-height
+ - color
+ - text-align
+ - -webkit-text-align-last
+ - -moz-text-align-last
+ - -ms-text-align-last
+ - text-align-last
+ - text-emphasis
+ - text-emphasis-color
+ - text-emphasis-style
+ - text-emphasis-position
+ - text-decoration
+ - text-indent
+ - text-justify
+ - text-outline
+ - -ms-text-overflow
+ - text-overflow
+ - text-overflow-ellipsis
+ - text-overflow-mode
+ - text-shadow
+ - text-transform
+ - text-wrap
+ - -webkit-text-size-adjust
+ - -ms-text-size-adjust
+ - letter-spacing
+ - -ms-word-break
+ - word-break
+ - word-spacing
+ - -ms-word-wrap
+ - word-wrap
+ - overflow-wrap
+ - -moz-tab-size
+ - -o-tab-size
+ - tab-size
+ - white-space
+ - vertical-align
+ - list-style
+ - list-style-position
+ - list-style-type
+ - list-style-image
+ - pointer-events
+ - -ms-touch-action
+ - touch-action
+ - cursor
+ - visibility
+ - zoom
+ - table-layout
+ - empty-cells
+ - caption-side
+ - border-spacing
+ - border-collapse
+ - content
+ - quotes
+ - counter-reset
+ - counter-increment
+ - resize
+ - -webkit-user-select
+ - -moz-user-select
+ - -ms-user-select
+ - -o-user-select
+ - user-select
+ - nav-index
+ - nav-up
+ - nav-right
+ - nav-down
+ - nav-left
+ - background
+ - background-color
+ - background-image
+ - -ms-filter:\\'progid:DXImageTransform.Microsoft.gradient
+ - filter:progid:DXImageTransform.Microsoft.gradient
+ - filter:progid:DXImageTransform.Microsoft.AlphaImageLoader
+ - filter
+ - background-repeat
+ - background-attachment
+ - background-position
+ - background-position-x
+ - background-position-y
+ - -webkit-background-clip
+ - -moz-background-clip
+ - background-clip
+ - background-origin
+ - -webkit-background-size
+ - -moz-background-size
+ - -o-background-size
+ - background-size
+ - border
+ - border-color
+ - border-style
+ - border-width
+ - border-top
+ - border-top-color
+ - border-top-style
+ - border-top-width
+ - border-right
+ - border-right-color
+ - border-right-style
+ - border-right-width
+ - border-bottom
+ - border-bottom-color
+ - border-bottom-style
+ - border-bottom-width
+ - border-left
+ - border-left-color
+ - border-left-style
+ - border-left-width
+ - border-radius
+ - border-top-left-radius
+ - border-top-right-radius
+ - border-bottom-right-radius
+ - border-bottom-left-radius
+ - -webkit-border-image
+ - -moz-border-image
+ - -o-border-image
+ - border-image
+ - -webkit-border-image-source
+ - -moz-border-image-source
+ - -o-border-image-source
+ - border-image-source
+ - -webkit-border-image-slice
+ - -moz-border-image-slice
+ - -o-border-image-slice
+ - border-image-slice
+ - -webkit-border-image-width
+ - -moz-border-image-width
+ - -o-border-image-width
+ - border-image-width
+ - -webkit-border-image-outset
+ - -moz-border-image-outset
+ - -o-border-image-outset
+ - border-image-outset
+ - -webkit-border-image-repeat
+ - -moz-border-image-repeat
+ - -o-border-image-repeat
+ - border-image-repeat
+ - outline
+ - outline-width
+ - outline-style
+ - outline-color
+ - outline-offset
+ - -webkit-box-shadow
+ - -moz-box-shadow
+ - box-shadow
+ - filter:progid:DXImageTransform.Microsoft.Alpha(Opacity
+ - -ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha
+ - opacity
+ - -ms-interpolation-mode
+ - -webkit-transition
+ - -moz-transition
+ - -ms-transition
+ - -o-transition
+ - transition
+ - -webkit-transition-delay
+ - -moz-transition-delay
+ - -ms-transition-delay
+ - -o-transition-delay
+ - transition-delay
+ - -webkit-transition-timing-function
+ - -moz-transition-timing-function
+ - -ms-transition-timing-function
+ - -o-transition-timing-function
+ - transition-timing-function
+ - -webkit-transition-duration
+ - -moz-transition-duration
+ - -ms-transition-duration
+ - -o-transition-duration
+ - transition-duration
+ - -webkit-transition-property
+ - -moz-transition-property
+ - -ms-transition-property
+ - -o-transition-property
+ - transition-property
+ - -webkit-transform
+ - -moz-transform
+ - -ms-transform
+ - -o-transform
+ - transform
+ - -webkit-transform-origin
+ - -moz-transform-origin
+ - -ms-transform-origin
+ - -o-transform-origin
+ - transform-origin
+ - -webkit-animation
+ - -moz-animation
+ - -ms-animation
+ - -o-animation
+ - animation
+ - -webkit-animation-name
+ - -moz-animation-name
+ - -ms-animation-name
+ - -o-animation-name
+ - animation-name
+ - -webkit-animation-duration
+ - -moz-animation-duration
+ - -ms-animation-duration
+ - -o-animation-duration
+ - animation-duration
+ - -webkit-animation-play-state
+ - -moz-animation-play-state
+ - -ms-animation-play-state
+ - -o-animation-play-state
+ - animation-play-state
+ - -webkit-animation-timing-function
+ - -moz-animation-timing-function
+ - -ms-animation-timing-function
+ - -o-animation-timing-function
+ - animation-timing-function
+ - -webkit-animation-delay
+ - -moz-animation-delay
+ - -ms-animation-delay
+ - -o-animation-delay
+ - animation-delay
+ - -webkit-animation-iteration-count
+ - -moz-animation-iteration-count
+ - -ms-animation-iteration-count
+ - -o-animation-iteration-count
+ - animation-iteration-count
+ - -webkit-animation-direction
+ - -moz-animation-direction
+ - -ms-animation-direction
+ - -o-animation-direction
+
+
+ PropertySpelling:
+ enabled: true
+ extra_properties: []
+ disabled_properties: []
+
+ PropertyUnits:
+ enabled: true
+ global: [
+ 'ch', 'em', 'ex', 'rem', # Font-relative lengths
+ 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths
+ 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths
+ 'deg', 'grad', 'rad', 'turn', # Angle
+ 'ms', 's', # Duration
+ 'Hz', 'kHz', # Frequency
+ 'dpi', 'dpcm', 'dppx', # Resolution
+ '%'] # Other
+ properties: {}
+
+ PseudoElement:
+ enabled: true
+
+ QualifyingElement:
+ enabled: true
+ allow_element_with_attribute: false
+ allow_element_with_class: false
+ allow_element_with_id: false
+
+ SelectorDepth:
+ enabled: true
+ max_depth: 4
+
+ SelectorFormat:
+ enabled: false
+ convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern
+
+ Shorthand:
+ enabled: true
+ allowed_shorthands: [1, 2, 3, 4]
+
+ SingleLinePerProperty:
+ enabled: false
+ allow_single_line_rule_sets: true
+
+ SingleLinePerSelector:
+ enabled: false
+
+ SpaceAfterComma:
+ enabled: false
+ style: one_space # or 'no_space', or 'at_least_one_space'
+
+ SpaceAfterPropertyColon:
+ enabled: true
+ style: at_least_one_space # or 'no_space', or 'at_least_one_space', or 'aligned'
+
+ SpaceAfterPropertyName:
+ enabled: true
+
+ SpaceAfterVariableName:
+ enabled: true
+
+ SpaceAroundOperator:
+ enabled: true
+ style: one_space # or 'at_least_one_space', or 'no_space'
+
+ SpaceBeforeBrace:
+ enabled: true
+ style: space # or 'new_line'
+ allow_single_line_padding: true
+
+ SpaceBetweenParens:
+ enabled: true
+ spaces: 0
+
+ StringQuotes:
+ enabled: true
+ style: double_quotes # or double_quotes
+
+ TrailingSemicolon:
+ enabled: true
+
+ TrailingWhitespace:
+ enabled: true
+
+ TrailingZero:
+ enabled: false
+
+ TransitionAll:
+ enabled: false
+
+ UnnecessaryMantissa:
+ enabled: true
+
+ UnnecessaryParentReference:
+ enabled: true
+
+ UrlFormat:
+ enabled: true
+
+ UrlQuotes:
+ enabled: true
+
+ VariableForProperty:
+ enabled: false
+ properties: []
+
+ VendorPrefix:
+ enabled: true
+ identifier_list: base
+ additional_identifiers: []
+ excluded_identifiers: []
+
+ ZeroUnit:
+ enabled: true
+
+ Compass::*:
+ enabled: false
diff --git a/templates/assets/bootstrap/scss/_alert.scss b/templates/assets/bootstrap/scss/_alert.scss
new file mode 100644
index 0000000..d9b4e9b
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_alert.scss
@@ -0,0 +1,55 @@
+//
+// Base styles
+//
+
+.alert {
+ padding: $alert-padding-y $alert-padding-x;
+ margin-bottom: $alert-margin-bottom;
+ border: $alert-border-width solid transparent;
+ @include border-radius($alert-border-radius);
+}
+
+// Headings for larger alerts
+.alert-heading {
+ // Specified to prevent conflicts of changing $headings-color
+ color: inherit;
+}
+
+// Provide class for links that match alerts
+.alert-link {
+ font-weight: $alert-link-font-weight;
+}
+
+
+// Dismissible alerts
+//
+// Expand the right padding and account for the close button's positioning.
+
+.alert-dismissible {
+ // Adjust close link position
+ .close {
+ position: relative;
+ top: -$alert-padding-y;
+ right: -$alert-padding-x;
+ padding: $alert-padding-y $alert-padding-x;
+ color: inherit;
+ }
+}
+
+
+// Alternate styles
+//
+// Generate contextual modifier classes for colorizing the alert.
+
+.alert-success {
+ @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
+}
+.alert-info {
+ @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
+}
+.alert-warning {
+ @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
+}
+.alert-danger {
+ @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
+}
diff --git a/templates/assets/bootstrap/scss/_badge.scss b/templates/assets/bootstrap/scss/_badge.scss
new file mode 100644
index 0000000..175b19d
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_badge.scss
@@ -0,0 +1,76 @@
+// Base class
+//
+// Requires one of the contextual, color modifier classes for `color` and
+// `background-color`.
+
+.badge {
+ display: inline-block;
+ padding: $badge-padding-y $badge-padding-x;
+ font-size: $badge-font-size;
+ font-weight: $badge-font-weight;
+ line-height: 1;
+ color: $badge-color;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ @include border-radius();
+
+ // Empty badges collapse automatically
+ &:empty {
+ display: none;
+ }
+}
+
+// Quick fix for badges in buttons
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+// scss-lint:disable QualifyingElement
+// Add hover effects, but only for links
+a.badge {
+ @include hover-focus {
+ color: $badge-link-hover-color;
+ text-decoration: none;
+ }
+}
+// scss-lint:enable QualifyingElement
+
+// Pill badges
+//
+// Make them extra rounded with a modifier to replace v3's badges.
+
+.badge-pill {
+ padding-right: $badge-pill-padding-x;
+ padding-left: $badge-pill-padding-x;
+ @include border-radius($badge-pill-border-radius);
+}
+
+// Colors
+//
+// Contextual variations (linked badges get darker on :hover).
+
+.badge-default {
+ @include badge-variant($badge-default-bg);
+}
+
+.badge-primary {
+ @include badge-variant($badge-primary-bg);
+}
+
+.badge-success {
+ @include badge-variant($badge-success-bg);
+}
+
+.badge-info {
+ @include badge-variant($badge-info-bg);
+}
+
+.badge-warning {
+ @include badge-variant($badge-warning-bg);
+}
+
+.badge-danger {
+ @include badge-variant($badge-danger-bg);
+}
diff --git a/templates/assets/bootstrap/scss/_breadcrumb.scss b/templates/assets/bootstrap/scss/_breadcrumb.scss
new file mode 100644
index 0000000..2bc0e20
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_breadcrumb.scss
@@ -0,0 +1,38 @@
+.breadcrumb {
+ padding: $breadcrumb-padding-y $breadcrumb-padding-x;
+ margin-bottom: 1rem;
+ list-style: none;
+ background-color: $breadcrumb-bg;
+ @include border-radius($border-radius);
+ @include clearfix;
+}
+
+.breadcrumb-item {
+ float: left;
+
+ // The separator between breadcrumbs (by default, a forward-slash: "/")
+ + .breadcrumb-item::before {
+ display: inline-block; // Suppress underlining of the separator in modern browsers
+ padding-right: $breadcrumb-item-padding;
+ padding-left: $breadcrumb-item-padding;
+ color: $breadcrumb-divider-color;
+ content: "#{$breadcrumb-divider}";
+ }
+
+ // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
+ // without ``s. The `::before` pseudo-element generates an element
+ // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
+ //
+ // To trick IE into suppressing the underline, we give the pseudo-element an
+ // underline and then immediately remove it.
+ + .breadcrumb-item:hover::before {
+ text-decoration: underline;
+ }
+ + .breadcrumb-item:hover::before {
+ text-decoration: none;
+ }
+
+ &.active {
+ color: $breadcrumb-active-color;
+ }
+}
diff --git a/templates/assets/bootstrap/scss/_button-group.scss b/templates/assets/bootstrap/scss/_button-group.scss
new file mode 100644
index 0000000..facecd3
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_button-group.scss
@@ -0,0 +1,204 @@
+// scss-lint:disable QualifyingElement
+
+// Make the div behave like a button
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle; // match .btn alignment given font-size hack above
+
+ > .btn {
+ position: relative;
+ flex: 0 1 auto;
+ margin-bottom: 0;
+
+ // Bring the hover, focused, and "active" buttons to the fron to overlay
+ // the borders properly
+ @include hover {
+ z-index: 2;
+ }
+ &:focus,
+ &:active,
+ &.active {
+ z-index: 2;
+ }
+ }
+
+ // Prevent double borders when buttons are next to each other
+ .btn + .btn,
+ .btn + .btn-group,
+ .btn-group + .btn,
+ .btn-group + .btn-group {
+ margin-left: -$input-btn-border-width;
+ }
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+
+ .input-group {
+ width: auto;
+ }
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
+.btn-group > .btn:first-child {
+ margin-left: 0;
+
+ &:not(:last-child):not(.dropdown-toggle) {
+ @include border-right-radius(0);
+ }
+}
+// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ @include border-left-radius(0);
+}
+
+// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
+.btn-group > .btn-group {
+ float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) {
+ > .btn:last-child,
+ > .dropdown-toggle {
+ @include border-right-radius(0);
+ }
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ @include border-left-radius(0);
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+
+// Sizing
+//
+// Remix the default button sizing classes into new ones for easier manipulation.
+
+.btn-group-sm > .btn { @extend .btn-sm; }
+.btn-group-lg > .btn { @extend .btn-lg; }
+
+
+//
+// Split button dropdowns
+//
+
+.btn + .dropdown-toggle-split {
+ padding-right: $btn-padding-x * .75;
+ padding-left: $btn-padding-x * .75;
+
+ &::after {
+ margin-left: 0;
+ }
+}
+
+.btn-sm + .dropdown-toggle-split {
+ padding-right: $btn-padding-x-sm * .75;
+ padding-left: $btn-padding-x-sm * .75;
+}
+
+.btn-lg + .dropdown-toggle-split {
+ padding-right: $btn-padding-x-lg * .75;
+ padding-left: $btn-padding-x-lg * .75;
+}
+
+
+// The clickable button for toggling the menu
+// Remove the gradient and set the same inset shadow as the :active state
+.btn-group.open .dropdown-toggle {
+ @include box-shadow($btn-active-box-shadow);
+
+ // Show no shadow for `.btn-link` since it has no other button styles.
+ &.btn-link {
+ @include box-shadow(none);
+ }
+}
+
+
+//
+// Vertical button groups
+//
+
+.btn-group-vertical {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+
+ .btn,
+ .btn-group {
+ width: 100%;
+ }
+
+ > .btn + .btn,
+ > .btn + .btn-group,
+ > .btn-group + .btn,
+ > .btn-group + .btn-group {
+ margin-top: -$input-btn-border-width;
+ margin-left: 0;
+ }
+}
+
+.btn-group-vertical > .btn {
+ &:not(:first-child):not(:last-child) {
+ border-radius: 0;
+ }
+ &:first-child:not(:last-child) {
+ @include border-bottom-radius(0);
+ }
+ &:last-child:not(:first-child) {
+ @include border-top-radius(0);
+ }
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) {
+ > .btn:last-child,
+ > .dropdown-toggle {
+ @include border-bottom-radius(0);
+ }
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ @include border-top-radius(0);
+}
+
+
+// Checkbox and radio options
+//
+// In order to support the browser's form validation feedback, powered by the
+// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
+// `display: none;` or `visibility: hidden;` as that also hides the popover.
+// Simply visually hiding the inputs via `opacity` would leave them clickable in
+// certain cases which is prevented by using `clip` and `pointer-events`.
+// This way, we ensure a DOM element is visible to position the popover from.
+//
+// See https://github.com/twbs/bootstrap/pull/12794 and
+// https://github.com/twbs/bootstrap/pull/14559 for more information.
+
+[data-toggle="buttons"] {
+ > .btn,
+ > .btn-group > .btn {
+ input[type="radio"],
+ input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0,0,0,0);
+ pointer-events: none;
+ }
+ }
+}
diff --git a/templates/assets/bootstrap/scss/_buttons.scss b/templates/assets/bootstrap/scss/_buttons.scss
new file mode 100644
index 0000000..2964a52
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_buttons.scss
@@ -0,0 +1,170 @@
+// scss-lint:disable QualifyingElement
+
+//
+// Base styles
+//
+
+.btn {
+ display: inline-block;
+ font-weight: $btn-font-weight;
+ line-height: $btn-line-height;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ user-select: none;
+ border: $input-btn-border-width solid transparent;
+ @include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-border-radius);
+ @include transition($btn-transition);
+
+ // Share hover and focus styles
+ @include hover-focus {
+ text-decoration: none;
+ }
+ &:focus,
+ &.focus {
+ outline: 0;
+ box-shadow: $btn-focus-box-shadow;
+ }
+
+ // Disabled comes first so active can properly restyle
+ &.disabled,
+ &:disabled {
+ cursor: $cursor-disabled;
+ opacity: .65;
+ @include box-shadow(none);
+ }
+
+ &:active,
+ &.active {
+ background-image: none;
+ @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
+ }
+}
+
+// Future-proof disabling of clicks on `` elements
+a.btn.disabled,
+fieldset[disabled] a.btn {
+ pointer-events: none;
+}
+
+
+//
+// Alternate buttons
+//
+
+.btn-primary {
+ @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
+}
+.btn-secondary {
+ @include button-variant($btn-secondary-color, $btn-secondary-bg, $btn-secondary-border);
+}
+.btn-info {
+ @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
+}
+.btn-success {
+ @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
+}
+.btn-warning {
+ @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
+}
+.btn-danger {
+ @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
+}
+
+// Remove all backgrounds
+.btn-outline-primary {
+ @include button-outline-variant($btn-primary-bg, $btn-primary-color);
+}
+.btn-outline-secondary {
+ @include button-outline-variant($btn-secondary-border, $btn-secondary-color);
+}
+.btn-outline-info {
+ @include button-outline-variant($btn-info-bg, $btn-info-color);
+}
+.btn-outline-success {
+ @include button-outline-variant($btn-success-bg, $btn-success-color);
+}
+.btn-outline-warning {
+ @include button-outline-variant($btn-warning-bg, $btn-warning-color);
+}
+.btn-outline-danger {
+ @include button-outline-variant($btn-danger-bg, $btn-danger-color);
+}
+
+
+//
+// Link buttons
+//
+
+// Make a button look and behave like a link
+.btn-link {
+ font-weight: $font-weight-normal;
+ color: $link-color;
+ border-radius: 0;
+
+ &,
+ &:active,
+ &.active,
+ &:disabled {
+ background-color: transparent;
+ @include box-shadow(none);
+ }
+ &,
+ &:focus,
+ &:active {
+ border-color: transparent;
+ }
+ @include hover {
+ border-color: transparent;
+ }
+ @include hover-focus {
+ color: $link-hover-color;
+ text-decoration: $link-hover-decoration;
+ background-color: transparent;
+ }
+ &:disabled {
+ color: $btn-link-disabled-color;
+
+ @include hover-focus {
+ text-decoration: none;
+ }
+ }
+}
+
+
+//
+// Button Sizes
+//
+
+.btn-lg {
+ // line-height: ensure even-numbered height of button next to large input
+ @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $font-size-lg, $btn-border-radius-lg);
+}
+.btn-sm {
+ // line-height: ensure proper height of button next to small input
+ @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-sm, $btn-border-radius-sm);
+}
+
+
+//
+// Block button
+//
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+ margin-top: $btn-block-spacing-y;
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ &.btn-block {
+ width: 100%;
+ }
+}
diff --git a/templates/assets/bootstrap/scss/_card.scss b/templates/assets/bootstrap/scss/_card.scss
new file mode 100644
index 0000000..9fe70e8
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_card.scss
@@ -0,0 +1,276 @@
+//
+// Base styles
+//
+
+.card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ background-color: $card-bg;
+ border: $card-border-width solid $card-border-color;
+ @include border-radius($card-border-radius);
+}
+
+.card-block {
+ // Enable `flex-grow: 1` for decks and groups so that card blocks take up
+ // as much space as possible, ensuring footers are aligned to the bottom.
+ flex: 1 1 auto;
+ padding: $card-spacer-x;
+}
+
+.card-title {
+ margin-bottom: $card-spacer-y;
+}
+
+.card-subtitle {
+ margin-top: -($card-spacer-y / 2);
+ margin-bottom: 0;
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link {
+ @include hover {
+ text-decoration: none;
+ }
+
+ + .card-link {
+ margin-left: $card-spacer-x;
+ }
+}
+
+.card {
+ > .list-group:first-child {
+ .list-group-item:first-child {
+ @include border-top-radius($card-border-radius);
+ }
+ }
+
+ > .list-group:last-child {
+ .list-group-item:last-child {
+ @include border-bottom-radius($card-border-radius);
+ }
+ }
+}
+
+
+//
+// Optional textual caps
+//
+
+.card-header {
+ padding: $card-spacer-y $card-spacer-x;
+ margin-bottom: 0; // Removes the default margin-bottom of
+ background-color: $card-cap-bg;
+ border-bottom: $card-border-width solid $card-border-color;
+
+ &:first-child {
+ @include border-radius($card-border-radius-inner $card-border-radius-inner 0 0);
+ }
+}
+
+.card-footer {
+ padding: $card-spacer-y $card-spacer-x;
+ background-color: $card-cap-bg;
+ border-top: $card-border-width solid $card-border-color;
+
+ &:last-child {
+ @include border-radius(0 0 $card-border-radius-inner $card-border-radius-inner);
+ }
+}
+
+
+//
+// Header navs
+//
+
+.card-header-tabs {
+ margin-right: -($card-spacer-x / 2);
+ margin-bottom: -$card-spacer-y;
+ margin-left: -($card-spacer-x / 2);
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -($card-spacer-x / 2);
+ margin-left: -($card-spacer-x / 2);
+}
+
+
+//
+// Background variations
+//
+
+.card-primary {
+ @include card-variant($brand-primary, $brand-primary);
+}
+.card-success {
+ @include card-variant($brand-success, $brand-success);
+}
+.card-info {
+ @include card-variant($brand-info, $brand-info);
+}
+.card-warning {
+ @include card-variant($brand-warning, $brand-warning);
+}
+.card-danger {
+ @include card-variant($brand-danger, $brand-danger);
+}
+
+// Remove all backgrounds
+.card-outline-primary {
+ @include card-outline-variant($btn-primary-bg);
+}
+.card-outline-secondary {
+ @include card-outline-variant($btn-secondary-border);
+}
+.card-outline-info {
+ @include card-outline-variant($btn-info-bg);
+}
+.card-outline-success {
+ @include card-outline-variant($btn-success-bg);
+}
+.card-outline-warning {
+ @include card-outline-variant($btn-warning-bg);
+}
+.card-outline-danger {
+ @include card-outline-variant($btn-danger-bg);
+}
+
+//
+// Inverse text within a card for use with dark backgrounds
+//
+
+.card-inverse {
+ @include card-inverse;
+}
+
+//
+// Blockquote
+//
+
+.card-blockquote {
+ padding: 0;
+ margin-bottom: 0;
+ border-left: 0;
+}
+
+// Card image
+.card-img {
+ // margin: -1.325rem;
+ @include border-radius($card-border-radius-inner);
+}
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: $card-img-overlay-padding;
+}
+
+
+
+// Card image caps
+.card-img-top {
+ @include border-top-radius($card-border-radius-inner);
+}
+.card-img-bottom {
+ @include border-bottom-radius($card-border-radius-inner);
+}
+
+
+// Card deck
+
+@include media-breakpoint-up(sm) {
+ .card-deck {
+ display: flex;
+ flex-flow: row wrap;
+
+ .card {
+ display: flex;
+ flex: 1 0 0;
+ flex-direction: column;
+
+ // Selectively apply horizontal margins to cards to avoid doing the
+ // negative margin dance like our grid. This differs from the grid
+ // due to the use of margins as gutters instead of padding.
+ &:not(:first-child) { margin-left: $card-deck-margin; }
+ &:not(:last-child) { margin-right: $card-deck-margin; }
+ }
+ }
+}
+
+
+//
+// Card groups
+//
+
+@include media-breakpoint-up(sm) {
+ .card-group {
+ display: flex;
+ flex-flow: row wrap;
+
+ .card {
+ flex: 1 0 0;
+
+ + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ // Handle rounded corners
+ @if $enable-rounded {
+ &:first-child {
+ @include border-right-radius(0);
+
+ .card-img-top {
+ border-top-right-radius: 0;
+ }
+ .card-img-bottom {
+ border-bottom-right-radius: 0;
+ }
+ }
+ &:last-child {
+ @include border-left-radius(0);
+
+ .card-img-top {
+ border-top-left-radius: 0;
+ }
+ .card-img-bottom {
+ border-bottom-left-radius: 0;
+ }
+ }
+
+ &:not(:first-child):not(:last-child) {
+ border-radius: 0;
+
+ .card-img-top,
+ .card-img-bottom {
+ border-radius: 0;
+ }
+ }
+ }
+ }
+ }
+}
+
+
+//
+// Columns
+//
+
+@include media-breakpoint-up(sm) {
+ .card-columns {
+ column-count: $card-columns-count;
+ column-gap: $card-columns-gap;
+
+ .card {
+ display: inline-block; // Don't let them vertically span multiple columns
+ width: 100%; // Don't let their width change
+ margin-bottom: $card-columns-margin;
+ }
+ }
+}
diff --git a/templates/assets/bootstrap/scss/_carousel.scss b/templates/assets/bootstrap/scss/_carousel.scss
new file mode 100644
index 0000000..1b6e450
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_carousel.scss
@@ -0,0 +1,177 @@
+// Wrapper for the slide container and indicators
+.carousel {
+ position: relative;
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.carousel-item {
+ position: relative;
+ display: none;
+ width: 100%;
+
+ @include if-supports-3d-transforms() {
+ @include transition($carousel-transition);
+ backface-visibility: hidden;
+ perspective: 1000px;
+ }
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: flex;
+}
+
+.carousel-item-next,
+.carousel-item-prev {
+ position: absolute;
+ top: 0;
+}
+
+// CSS3 transforms when supported by the browser
+@include if-supports-3d-transforms() {
+ .carousel-item-next.carousel-item-left,
+ .carousel-item-prev.carousel-item-right {
+ transform: translate3d(0, 0, 0);
+ }
+
+ .carousel-item-next,
+ .active.carousel-item-right {
+ transform: translate3d(100%, 0, 0);
+ }
+
+ .carousel-item-prev,
+ .active.carousel-item-left {
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+
+//
+// Left/right controls for nav
+//
+
+.carousel-control-prev,
+.carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ // Use flex for alignment (1-3)
+ display: flex; // 1. allow flex styles
+ align-items: center; // 2. vertically center contents
+ justify-content: center; // 3. horizontally center contents
+ width: $carousel-control-width;
+ color: $carousel-control-color;
+ text-align: center;
+ opacity: $carousel-control-opacity;
+ // We can't have a transition here because WebKit cancels the carousel
+ // animation if you trip this while in the middle of another animation.
+
+ // Hover/focus state
+ @include hover-focus {
+ color: $carousel-control-color;
+ text-decoration: none;
+ outline: 0;
+ opacity: .9;
+ }
+}
+.carousel-control-prev {
+ left: 0;
+}
+.carousel-control-next {
+ right: 0;
+}
+
+// Icons for within
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: $carousel-control-icon-width;
+ height: $carousel-control-icon-width;
+ background: transparent no-repeat center center;
+ background-size: 100% 100%;
+}
+.carousel-control-prev-icon {
+ background-image: $carousel-control-prev-icon-bg;
+}
+.carousel-control-next-icon {
+ background-image: $carousel-control-next-icon-bg;
+}
+
+
+// Optional indicator pips
+//
+// Add an ordered list with the following class and add a list item for each
+// slide your carousel holds.
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 10px;
+ left: 0;
+ z-index: 15;
+ display: flex;
+ justify-content: center;
+ padding-left: 0; // override default
+ // Use the .carousel-control's width as margin so we don't overlay those
+ margin-right: $carousel-control-width;
+ margin-left: $carousel-control-width;
+ list-style: none;
+
+ li {
+ position: relative;
+ flex: 1 0 auto;
+ max-width: $carousel-indicator-width;
+ height: $carousel-indicator-height;
+ margin-right: $carousel-indicator-spacer;
+ margin-left: $carousel-indicator-spacer;
+ text-indent: -999px;
+ background-color: rgba($carousel-indicator-active-bg, .5);
+
+ // Use pseudo classes to increase the hit area by 10px on top and bottom.
+ &::before {
+ position: absolute;
+ top: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+ }
+ &::after {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+ }
+ }
+
+ .active {
+ background-color: $carousel-indicator-active-bg;
+ }
+}
+
+
+// Optional captions
+//
+//
+
+.carousel-caption {
+ position: absolute;
+ right: ((100% - $carousel-caption-width) / 2);
+ bottom: 20px;
+ left: ((100% - $carousel-caption-width) / 2);
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: $carousel-caption-color;
+ text-align: center;
+}
diff --git a/templates/assets/bootstrap/scss/_close.scss b/templates/assets/bootstrap/scss/_close.scss
new file mode 100644
index 0000000..f181490
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_close.scss
@@ -0,0 +1,29 @@
+.close {
+ float: right;
+ font-size: $close-font-size;
+ font-weight: $close-font-weight;
+ line-height: 1;
+ color: $close-color;
+ text-shadow: $close-text-shadow;
+ opacity: .5;
+
+ @include hover-focus {
+ color: $close-color;
+ text-decoration: none;
+ opacity: .75;
+ }
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
+
+// scss-lint:disable QualifyingElement
+button.close {
+ padding: 0;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+// scss-lint:enable QualifyingElement
diff --git a/templates/assets/bootstrap/scss/_code.scss b/templates/assets/bootstrap/scss/_code.scss
new file mode 100644
index 0000000..759da15
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_code.scss
@@ -0,0 +1,64 @@
+// Inline and block code styles
+code,
+kbd,
+pre,
+samp {
+ font-family: $font-family-monospace;
+}
+
+// Inline code
+code {
+ padding: $code-padding-y $code-padding-x;
+ font-size: $code-font-size;
+ color: $code-color;
+ background-color: $code-bg;
+ @include border-radius($border-radius);
+
+ // Streamline the style when inside anchors to avoid broken underline and more
+ a > & {
+ padding: 0;
+ color: inherit;
+ background-color: inherit;
+ }
+}
+
+// User input typically entered via keyboard
+kbd {
+ padding: $code-padding-y $code-padding-x;
+ font-size: $code-font-size;
+ color: $kbd-color;
+ background-color: $kbd-bg;
+ @include border-radius($border-radius-sm);
+ @include box-shadow($kbd-box-shadow);
+
+ kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: $nested-kbd-font-weight;
+ @include box-shadow(none);
+ }
+}
+
+// Blocks of code
+pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ font-size: $code-font-size;
+ color: $pre-color;
+
+ // Account for some code outputs that place code tags in pre tags
+ code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ background-color: transparent;
+ border-radius: 0;
+ }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+ max-height: $pre-scrollable-max-height;
+ overflow-y: scroll;
+}
diff --git a/templates/assets/bootstrap/scss/_custom-forms.scss b/templates/assets/bootstrap/scss/_custom-forms.scss
new file mode 100644
index 0000000..d303c48
--- /dev/null
+++ b/templates/assets/bootstrap/scss/_custom-forms.scss
@@ -0,0 +1,258 @@
+// scss-lint:disable PropertyCount, VendorPrefix
+
+// Embedded icons from Open Iconic.
+// Released under MIT and copyright 2014 Waybury.
+// https://useiconic.com/open
+
+
+// Checkboxes and radios
+//
+// Base class takes care of all the key behavioral aspects.
+
+.custom-control {
+ position: relative;
+ display: inline-flex;
+ min-height: (1rem * $line-height-base);
+ padding-left: $custom-control-gutter;
+ margin-right: $custom-control-spacer-x;
+}
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1; // Put the input behind the label so it doesn't overlay text
+ opacity: 0;
+
+ &:checked ~ .custom-control-indicator {
+ color: $custom-control-checked-indicator-color;
+ background-color: $custom-control-checked-indicator-bg;
+ @include box-shadow($custom-control-checked-indicator-box-shadow);
+ }
+
+ &:focus ~ .custom-control-indicator {
+ // the mixin is not used here to make sure there is feedback
+ box-shadow: $custom-control-focus-indicator-box-shadow;
+ }
+
+ &:active ~ .custom-control-indicator {
+ color: $custom-control-active-indicator-color;
+ background-color: $custom-control-active-indicator-bg;
+ @include box-shadow($custom-control-active-indicator-box-shadow);
+ }
+
+ &:disabled {
+ ~ .custom-control-indicator {
+ cursor: $custom-control-disabled-cursor;
+ background-color: $custom-control-disabled-indicator-bg;
+ }
+
+ ~ .custom-control-description {
+ color: $custom-control-disabled-description-color;
+ cursor: $custom-control-disabled-cursor;
+ }
+ }
+}
+
+// Custom indicator
+//
+// Generates a shadow element to create our makeshift checkbox/radio background.
+
+.custom-control-indicator {
+ position: absolute;
+ top: (($line-height-base - $custom-control-indicator-size) / 2);
+ left: 0;
+ display: block;
+ width: $custom-control-indicator-size;
+ height: $custom-control-indicator-size;
+ pointer-events: none;
+ user-select: none;
+ background-color: $custom-control-indicator-bg;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: $custom-control-indicator-bg-size;
+ @include box-shadow($custom-control-indicator-box-shadow);
+}
+
+// Checkboxes
+//
+// Tweak just a few things for checkboxes.
+
+.custom-checkbox {
+ .custom-control-indicator {
+ @include border-radius($custom-checkbox-radius);
+ }
+
+ .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: $custom-checkbox-checked-icon;
+ }
+
+ .custom-control-input:indeterminate ~ .custom-control-indicator {
+ background-color: $custom-checkbox-indeterminate-bg;
+ background-image: $custom-checkbox-indeterminate-icon;
+ @include box-shadow($custom-checkbox-indeterminate-box-shadow);
+ }
+}
+
+// Radios
+//
+// Tweak just a few things for radios.
+
+.custom-radio {
+ .custom-control-indicator {
+ border-radius: $custom-radio-radius;
+ }
+
+ .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: $custom-radio-checked-icon;
+ }
+}
+
+
+// Layout options
+//
+// By default radios and checkboxes are `inline-block` with no additional spacing
+// set. Use these optional classes to tweak the layout.
+
+.custom-controls-stacked {
+ display: flex;
+ flex-direction: column;
+
+ .custom-control {
+ margin-bottom: $custom-control-spacer-y;
+
+ + .custom-control {
+ margin-left: 0;
+ }
+ }
+}
+
+
+// Select
+//
+// Replaces the browser default select with a custom one, mostly pulled from
+// http://primercss.io.
+//
+
+.custom-select {
+ display: inline-block;
+ max-width: 100%;
+ $select-border-width: ($custom-select-border-width * 2);
+ height: calc(#{$input-height} + #{$select-border-width});
+ padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
+ line-height: $custom-select-line-height;
+ color: $custom-select-color;
+ vertical-align: middle;
+ background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;
+ background-size: $custom-select-bg-size;
+ border: $custom-select-border-width solid $custom-select-border-color;
+ @include border-radius($custom-select-border-radius);
+ appearance: none;
+
+ &:focus {
+ border-color: $custom-select-focus-border-color;
+ outline: none;
+ @include box-shadow($custom-select-focus-box-shadow);
+
+ &::-ms-value {
+ // For visual consistency with other platforms/browsers,
+ // supress the default white text on blue background highlight given to
+ // the selected option text when the (still closed)