From 0b867530385895ae69ef3dab4ae6074e97d25d5d Mon Sep 17 00:00:00 2001 From: Cory LaViska Date: Wed, 15 Jul 2020 17:30:37 -0400 Subject: [PATCH] 2.0 cleanup --- .editorconfig | 15 + .eslintrc.json | 39 + .github/CODE_OF_CONDUCT.md | 44 + .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 38 + .github/ISSUE_TEMPLATE/config.yml | 4 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/SECURITY.md | 7 + .gitignore | 33 + .prettierignore | 11 + CHANGELOG.md | 16 + CONTRIBUTING.md | 111 + LICENSE.md | 7 + README.md | 86 + dev-server.js | 76 + docs/.nojekyll | 0 docs/404.md | 3 + docs/_sidebar.md | 49 + docs/assets/images/chrome.png | Bin 0 -> 12226 bytes docs/assets/images/edge.png | Bin 0 -> 11311 bytes docs/assets/images/firefox.png | Bin 0 -> 15035 bytes docs/assets/images/github.svg | 1 + docs/assets/images/logo.svg | 7 + docs/assets/images/opera.png | Bin 0 -> 5749 bytes docs/assets/images/safari.png | Bin 0 -> 24056 bytes docs/assets/images/shoe.svg | 134 + docs/assets/images/twitter.svg | 1 + docs/assets/images/wordmark.svg | 7 + docs/assets/plugins/code-block/code-block.css | 108 + docs/assets/plugins/code-block/code-block.js | 133 + docs/assets/plugins/metadata/metadata.js | 371 + docs/assets/plugins/sidebar/sidebar.js | 14 + docs/assets/styles/demos.css | 52 + docs/assets/styles/docs.css | 503 ++ docs/components/alert.md | 90 + docs/components/avatar.md | 62 + docs/components/badge.md | 60 + docs/components/button.md | 134 + docs/components/checkbox.md | 39 + docs/components/color-picker.md | 39 + docs/components/details.md | 65 + docs/components/dialog.md | 111 + docs/components/drawer.md | 207 + docs/components/dropdown.md | 90 + docs/components/form.md | 69 + docs/components/icon.md | 223 + docs/components/input.md | 140 + docs/components/menu-divider.md | 22 + docs/components/menu-item.md | 29 + docs/components/menu-label.md | 23 + docs/components/menu.md | 23 + docs/components/progress-bar.md | 52 + docs/components/progress-ring.md | 71 + docs/components/radio.md | 42 + docs/components/range.md | 52 + docs/components/select.md | 159 + docs/components/spinner.md | 39 + docs/components/switch.md | 32 + docs/components/tab-group.md | 129 + docs/components/tab-panel.md | 23 + docs/components/tab.md | 15 + docs/components/tag.md | 47 + docs/components/textarea.md | 89 + docs/components/tooltip.md | 166 + docs/getting-started/customizing.md | 123 + docs/getting-started/installation.md | 35 + docs/getting-started/overview.md | 107 + docs/getting-started/roadmap.md | 41 + docs/getting-started/usage.md | 220 + docs/index.html | 87 + docs/tokens/border-radius.md | 12 + docs/tokens/color.md | 165 + docs/tokens/elevation.md | 11 + docs/tokens/spacing.md | 16 + docs/tokens/transition.md | 11 + docs/tokens/typography.md | 54 + docs/tokens/z-index.md | 10 + make-dist.js | 14 + make-icons.js | 60 + package-lock.json | 7539 +++++++++++++++++ package.json | 78 + prettier.config.js | 17 + src/components.d.ts | 2062 +++++ src/components/alert/alert.scss | 120 + src/components/alert/alert.tsx | 153 + src/components/avatar/avatar.scss | 65 + src/components/avatar/avatar.tsx | 76 + src/components/badge/badge.scss | 51 + src/components/badge/badge.tsx | 46 + src/components/button/button.scss | 396 + src/components/button/button.tsx | 165 + src/components/checkbox/checkbox.scss | 99 + src/components/checkbox/checkbox.tsx | 172 + src/components/color-picker/color-picker.scss | 297 + src/components/color-picker/color-picker.tsx | 777 ++ src/components/details/details.scss | 85 + src/components/details/details.tsx | 193 + src/components/dialog/dialog.scss | 130 + src/components/dialog/dialog.tsx | 219 + src/components/drawer/drawer.scss | 167 + src/components/drawer/drawer.tsx | 239 + src/components/dropdown/dropdown.scss | 37 + src/components/dropdown/dropdown.tsx | 287 + src/components/form/form.scss | 5 + src/components/form/form.tsx | 247 + src/components/icon/icon.scss | 16 + src/components/icon/icon.tsx | 83 + src/components/icon/request.ts | 30 + src/components/input/input.scss | 244 + src/components/input/input.tsx | 359 + src/components/menu-divider/menu-divider.scss | 10 + src/components/menu-divider/menu-divider.tsx | 19 + src/components/menu-item/menu-item.scss | 72 + src/components/menu-item/menu-item.tsx | 69 + src/components/menu-label/menu-label.scss | 16 + src/components/menu-label/menu-label.tsx | 25 + src/components/menu/menu.scss | 15 + src/components/menu/menu.tsx | 206 + src/components/progress-bar/progress-bar.scss | 33 + src/components/progress-bar/progress-bar.tsx | 47 + .../progress-ring/progress-ring.scss | 44 + .../progress-ring/progress-ring.tsx | 80 + src/components/radio/radio.scss | 96 + src/components/radio/radio.tsx | 178 + src/components/range/range.scss | 176 + src/components/range/range.tsx | 155 + src/components/select/select.scss | 36 + src/components/select/select.tsx | 388 + src/components/spinner/spinner.scss | 33 + src/components/spinner/spinner.tsx | 19 + src/components/switch/switch.scss | 125 + src/components/switch/switch.tsx | 147 + src/components/tab-group/tab-group.scss | 145 + src/components/tab-group/tab-group.tsx | 250 + src/components/tab-panel/tab-panel.scss | 10 + src/components/tab-panel/tab-panel.tsx | 40 + src/components/tab/tab.scss | 42 + src/components/tab/tab.tsx | 70 + src/components/tag/tag.scss | 112 + src/components/tag/tag.tsx | 83 + src/components/textarea/textarea.scss | 149 + src/components/textarea/textarea.tsx | 279 + src/components/tooltip/tooltip.scss | 122 + src/components/tooltip/tooltip.tsx | 239 + src/index.ts | 1 + src/styles/component.scss | 10 + src/styles/form-control-help-text.scss | 27 + src/styles/form-control-label.scss | 33 + src/styles/mixins/hide-scrollbar.scss | 10 + src/styles/mixins/make-color-palette.scss | 8 + src/styles/shoelace.scss | 267 + src/utilities/focus-visible.ts | 38 + src/utilities/math.ts | 8 + src/utilities/offset.ts | 13 + src/utilities/popover.ts | 157 + src/utilities/scroll.ts | 58 + src/utilities/slot.ts | 37 + src/utilities/throttle.ts | 45 + stencil.config.ts | 41 + tsconfig.json | 18 + vercel.json | 4 + 161 files changed, 23958 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/SECURITY.md create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 dev-server.js create mode 100644 docs/.nojekyll create mode 100644 docs/404.md create mode 100644 docs/_sidebar.md create mode 100644 docs/assets/images/chrome.png create mode 100644 docs/assets/images/edge.png create mode 100644 docs/assets/images/firefox.png create mode 100644 docs/assets/images/github.svg create mode 100644 docs/assets/images/logo.svg create mode 100644 docs/assets/images/opera.png create mode 100644 docs/assets/images/safari.png create mode 100644 docs/assets/images/shoe.svg create mode 100755 docs/assets/images/twitter.svg create mode 100644 docs/assets/images/wordmark.svg create mode 100644 docs/assets/plugins/code-block/code-block.css create mode 100644 docs/assets/plugins/code-block/code-block.js create mode 100644 docs/assets/plugins/metadata/metadata.js create mode 100644 docs/assets/plugins/sidebar/sidebar.js create mode 100644 docs/assets/styles/demos.css create mode 100644 docs/assets/styles/docs.css create mode 100644 docs/components/alert.md create mode 100644 docs/components/avatar.md create mode 100644 docs/components/badge.md create mode 100644 docs/components/button.md create mode 100644 docs/components/checkbox.md create mode 100644 docs/components/color-picker.md create mode 100644 docs/components/details.md create mode 100644 docs/components/dialog.md create mode 100644 docs/components/drawer.md create mode 100644 docs/components/dropdown.md create mode 100644 docs/components/form.md create mode 100644 docs/components/icon.md create mode 100644 docs/components/input.md create mode 100644 docs/components/menu-divider.md create mode 100644 docs/components/menu-item.md create mode 100644 docs/components/menu-label.md create mode 100644 docs/components/menu.md create mode 100644 docs/components/progress-bar.md create mode 100644 docs/components/progress-ring.md create mode 100644 docs/components/radio.md create mode 100644 docs/components/range.md create mode 100644 docs/components/select.md create mode 100644 docs/components/spinner.md create mode 100644 docs/components/switch.md create mode 100644 docs/components/tab-group.md create mode 100644 docs/components/tab-panel.md create mode 100644 docs/components/tab.md create mode 100644 docs/components/tag.md create mode 100644 docs/components/textarea.md create mode 100644 docs/components/tooltip.md create mode 100644 docs/getting-started/customizing.md create mode 100644 docs/getting-started/installation.md create mode 100644 docs/getting-started/overview.md create mode 100644 docs/getting-started/roadmap.md create mode 100644 docs/getting-started/usage.md create mode 100644 docs/index.html create mode 100644 docs/tokens/border-radius.md create mode 100644 docs/tokens/color.md create mode 100644 docs/tokens/elevation.md create mode 100644 docs/tokens/spacing.md create mode 100644 docs/tokens/transition.md create mode 100644 docs/tokens/typography.md create mode 100644 docs/tokens/z-index.md create mode 100644 make-dist.js create mode 100644 make-icons.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 prettier.config.js create mode 100644 src/components.d.ts create mode 100644 src/components/alert/alert.scss create mode 100644 src/components/alert/alert.tsx create mode 100644 src/components/avatar/avatar.scss create mode 100644 src/components/avatar/avatar.tsx create mode 100644 src/components/badge/badge.scss create mode 100644 src/components/badge/badge.tsx create mode 100644 src/components/button/button.scss create mode 100644 src/components/button/button.tsx create mode 100644 src/components/checkbox/checkbox.scss create mode 100644 src/components/checkbox/checkbox.tsx create mode 100644 src/components/color-picker/color-picker.scss create mode 100644 src/components/color-picker/color-picker.tsx create mode 100644 src/components/details/details.scss create mode 100644 src/components/details/details.tsx create mode 100644 src/components/dialog/dialog.scss create mode 100644 src/components/dialog/dialog.tsx create mode 100644 src/components/drawer/drawer.scss create mode 100644 src/components/drawer/drawer.tsx create mode 100644 src/components/dropdown/dropdown.scss create mode 100644 src/components/dropdown/dropdown.tsx create mode 100644 src/components/form/form.scss create mode 100644 src/components/form/form.tsx create mode 100644 src/components/icon/icon.scss create mode 100644 src/components/icon/icon.tsx create mode 100644 src/components/icon/request.ts create mode 100644 src/components/input/input.scss create mode 100644 src/components/input/input.tsx create mode 100644 src/components/menu-divider/menu-divider.scss create mode 100644 src/components/menu-divider/menu-divider.tsx create mode 100644 src/components/menu-item/menu-item.scss create mode 100644 src/components/menu-item/menu-item.tsx create mode 100644 src/components/menu-label/menu-label.scss create mode 100644 src/components/menu-label/menu-label.tsx create mode 100644 src/components/menu/menu.scss create mode 100644 src/components/menu/menu.tsx create mode 100644 src/components/progress-bar/progress-bar.scss create mode 100644 src/components/progress-bar/progress-bar.tsx create mode 100644 src/components/progress-ring/progress-ring.scss create mode 100644 src/components/progress-ring/progress-ring.tsx create mode 100644 src/components/radio/radio.scss create mode 100644 src/components/radio/radio.tsx create mode 100644 src/components/range/range.scss create mode 100644 src/components/range/range.tsx create mode 100644 src/components/select/select.scss create mode 100644 src/components/select/select.tsx create mode 100644 src/components/spinner/spinner.scss create mode 100644 src/components/spinner/spinner.tsx create mode 100644 src/components/switch/switch.scss create mode 100644 src/components/switch/switch.tsx create mode 100644 src/components/tab-group/tab-group.scss create mode 100644 src/components/tab-group/tab-group.tsx create mode 100644 src/components/tab-panel/tab-panel.scss create mode 100644 src/components/tab-panel/tab-panel.tsx create mode 100644 src/components/tab/tab.scss create mode 100644 src/components/tab/tab.tsx create mode 100644 src/components/tag/tag.scss create mode 100644 src/components/tag/tag.tsx create mode 100644 src/components/textarea/textarea.scss create mode 100644 src/components/textarea/textarea.tsx create mode 100644 src/components/tooltip/tooltip.scss create mode 100644 src/components/tooltip/tooltip.tsx create mode 100644 src/index.ts create mode 100644 src/styles/component.scss create mode 100644 src/styles/form-control-help-text.scss create mode 100644 src/styles/form-control-label.scss create mode 100644 src/styles/mixins/hide-scrollbar.scss create mode 100644 src/styles/mixins/make-color-palette.scss create mode 100644 src/styles/shoelace.scss create mode 100644 src/utilities/focus-visible.ts create mode 100644 src/utilities/math.ts create mode 100644 src/utilities/offset.ts create mode 100644 src/utilities/popover.ts create mode 100644 src/utilities/scroll.ts create mode 100644 src/utilities/slot.ts create mode 100644 src/utilities/throttle.ts create mode 100644 stencil.config.ts create mode 100644 tsconfig.json create mode 100644 vercel.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..f1cc3ad3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..bb790113 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,39 @@ +{ + "parserOptions": { + "project": "./tsconfig.json" + }, + "extends": ["plugin:@stencil/recommended"], + "rules": { + "@stencil/async-methods": "error", + "@stencil/ban-prefix": ["error", ["stencil", "stnl", "st"]], + "@stencil/decorators-context": "error", + "@stencil/decorators-style": [ + "error", + { + "prop": "inline", + "state": "inline", + "element": "inline", + "event": "inline", + "method": "multiline", + "watch": "multiline", + "listen": "multiline" + } + ], + "@stencil/element-type": "error", + "@stencil/host-data-deprecated": "error", + "@stencil/methods-must-be-public": "error", + "@stencil/no-unused-watch": "error", + "@stencil/own-methods-must-be-private": "off", + "@stencil/own-props-must-be-private": "off", + "@stencil/prefer-vdom-listener": "error", + "@stencil/props-must-be-public": "off", + "@stencil/props-must-be-readonly": "off", + "@stencil/render-returns-host": "error", + "@stencil/required-jsdoc": "error", + "@stencil/reserved-member-names": "error", + "@stencil/single-export": "error", + "@stencil/strict-boolean-conditions": "off", + "@stencil/strict-mutable": "off", + "react/jsx-no-bind": "off" + } +} diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..8c7b60d7 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,44 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at cory@abeautifulsite.net. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..45313954 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [claviska] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..423d5124 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug Report +about: Create a report to help us improve. +title: '' +labels: bug +assignees: claviska + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..9b6b628b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: Personal Support + url: https://github.com/sponsors/claviska + about: Support for issues outside the scope of the library can be obtained via sponsorship. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..c1926889 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature Request +about: Suggest an idea for this project. +title: '' +labels: feature +assignees: claviska + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 00000000..a3483ca8 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,7 @@ +# Reporting Security Issues + +We take security issues in Shoelace very seriously and appreciate your efforts to disclose your findings responsibly. + +To report a security issue, email [cory@abeautifulsite.net](mailto:cory@abeautifulsite.net) and include "SHOELACE SECURITY" in the subject line. + +Well respond as soon as possible and keep you updated throughout the process. diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..413ea4ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +src/components/*/readme.md +src/components/icon/icons +docs/assets/data/custom.json +docs/assets/icons/sprite.svg + +dist/ +docs/dist/ +loader/ +temp/ +www/ + +*~ +*.sw[mnpcod] +*.log +*.lock +*.tmp +*.tmp.* +log.txt +*.sublime-project +*.sublime-workspace + +.stencil/ +.idea/ +.vscode/ +.sass-cache/ +.versions/ +node_modules/ +$RECYCLE.BIN/ + +.DS_Store +Thumbs.db +UserInterfaceState.xcuserstate +.env diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..d1ed7ec9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +.github +.stencil +dist +docs/assets +docs/**/*.md +loader +node_modules +src/components/**/readme.md +src/components.d.ts +www +package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..a0ef519b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +## 2.0.0-beta.3 + +- Fix version in docs +- Remove custom elements bundle + +## 2.0.0-beta.2 + +- Fix quick start and installation URLs +- Switch Docsify theme +- Update line heights tokens + +## 2.0.0-beta.1 + +- Initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..d7029a6b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,111 @@ +# Contributing to Shoelace + +Shoelace is an open source project, meaning everyone can use it and contribute to its development. Please take a moment to review these guidelines to make the contribution process as easy as possible for both you and the project's maintainers. + +## Using the Issue Tracker + +The [issue tracker](https://github.com/shoelace-style/shoelace/issues) is for bug reports, feature requests, and pull requests. + +- Please **do not** use the issue tracker for personal support requests. Please [ask your question](https://stackoverflow.com/questions/ask) on StackOverflow instead. +- Please **do not** derail, hijack, or troll issues. Keep the discussion on topic and be respectful of others. +- Please **do not** post comments with "+1" or "๐Ÿ‘". Use [reactions](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) instead. +- Please **do** use the issue tracker for feature requests, bug reports, and pull requests. + +Issues that do not follow these guidelines are subject to closure. There simply aren't enough resources for the author and contributors to troubleshoot personal support requests. + +### Feature Requests + +Feature requests can be added using the issue tracker. + +- Please **do** search for an existing request before suggesting a new feature. +- Please **do** use the "๐Ÿ‘" reaction to vote for a feature. +- Please **do** share substantial use cases and perspective that support new features if they haven't already been mentioned. +- Please **do not** bump, spam, or ping contributors to prioritize your own feature. + +If you would like your feature prioritized, please consider [sponsoring the project](https://github.com/sponsors/claviska). + +### Bug Reports + +A bug is _a demonstrable problem_ caused by code in the library. Bug reports are an important contribution to the quality of the project. When submitting a bug report, there are a few steps you can take to make sure your issues gets attention quickly. + +- Please **do not** paste in large blocks of irrelevant code +- Please **do** search for an existing issue before creating a new one +- Please **do** explain the bug clearly +- Please **do** provide a minimal test case that demonstrates the bug (e.g. [jsfiddle.net](https://jsfiddle.net/) or [CodePen](https://codepen.io/)) +- Please **do** provide additional information, when necessary, to replicate the bug + +**A minimal test case is critical to a successful bug report.** It demonstrates that the bug exists in the library and not in surrounding code. Contributors should be able to understand the bug without studying your code, otherwise they'll probably move on to another bug. + +If you would like your bug prioritized, please consider [sponsoring the project](https://github.com/sponsors/claviska). + +### Pull Requests + +To keep the project on track, please consider the following guidelines before submitting a PR. + +- Please **do not** submit a PR without opening an issue first, especially for non-trivial changes. This may prevent you from doing work that won't be accepted for various reasons (e.g. someone is already working on it, it's not a good fit for the project, it needs additional planning, etc.) +- Please **do** make sure your PR clearly defines what you're changing. Even if you feel your changes are obvious, please explain them so other contributors can more easily review your works. PRs without detailed descriptions are subject to closure pending more details. +- Please **do not** edit anything in `dist/`. These files are generated automatically, so you need to edit the source files instead. + +The author reserves the right to reject any PR that's outside the scope of the project or doesn't meet code quality standards. + +## Conventions + +This section aims to describe some of the design decisions and code conventions that support the project. All contributors are expected to follow conventions and best practices, even those not explicitly defined in this document. When in doubt, refer to existing source code and execute your best judgment. + +In order to keep the project in a maintainable state, code that doesn't follow conventions and best practices will need to be refactored before it will be accepted. This isn't a knock on your code or your style โ€” it's something the author considers necessary to operate a successful open source project. + +### Semantic Versioning + +This project follows [Semantic Versioning](https://semver.org/). Breaking changes in stable components will not be accepted until the next major version. As such, all contributions must consider the project's roadmap and take this into consideration. Features that are deemed no longer necessary in future versions will be deprecated instead. + +**Components marked "experimental" should not be used in production,** as changes to them will not be subject to this rule. + +### Code Formatting & Linting + +The majority of code formatting is handled automatically by [Prettier](https://prettier.io/) at build time. However, for the best experience, you should [install it in your editor](https://prettier.io/docs/en/editors.html) and enable format on save. + +Linting is run automatically at build time. By design, the project will not build if the linter is unhappy. Contributors are strongly encouraged to install an ESLint plugin for your editor for the best developer experience. + +### BEM Class Names + +All components use a [shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM), so styles are completely encapsulated from the rest of the document. As a result, class names _inside_ a component won't conflict with class names _outside_ the component, so we're free to name them whatever we want. + +Internally, each component uses the [BEM methodology](http://getbem.com/) for its class names. There is no technical requirement to do this โ€” it's purely the preference of the author. However, all contributions are expected to follow this practice for the sake of consistency. + +## Developer Tips + +### Documentation is the key to success + +Nobody likes writing documentation, but not having good docs is frustrating to users and makes the project less appealing. Fortunately, writing documentation for Shoelace is really easy! + +A lot of the documentation is generated automatically based on JSDoc comments in each component's source code. If you have ESLint enabled, your editor will tell you when a comment is missing. This may feel a bit naggy, but it's a very good thing. Every property, method, event, etc. is documented this way. By adding comments as you code, the docs are more easily kept up to date. + +The documentation pages are served up by [Docsify](https://docsify.now.sh/). Check out `docs/_sidebar.md` and `docs/components/` to get an idea of how pages are created and formatted. If you're creating a new component, it may help to use an existing component's markdown file as a template. + +If you need help with documentation, feel free to reach out! + +### Choose composability when possible + +When designed right, web components are highly composable, meaning you can easily reuse them in other components. This reduces the overall size of the library, expedites feature development, and maintains a consistent user experience throughout. + +The select component, for example, makes use of the dropdown, input, and menu components. Because it's offloading most of its functionality and styles to these lower-level components, the select component remains very lightweight and its appearance and behavior is consistent with other form controls and menus. + +### When to use a standard property vs. a CSS custom property + +When designing a component's API, standard properties ("props") are generally used to change the _behavior_ of a component, whereas CSS custom properties ("CSS variables") are used to change the _appearance_ of a component. Remember that props can't respond to media queries, but CSS variables can. + +There are some exceptions to this (e.g. when it significantly improves developer experience), but a good rule of thumbs is "will this need to change based on screen size?" If so, you probably want to use a CSS variable. + +### Boolean Props + +Boolean props should _always_ default to `false`, otherwise there's no way for the user to unset it without JavaScript. To keep the API as friendly and consistent as possible, use a name like `noHeader` with a default value of `false` instead of `header` with a default value of `true`. + +### A Note About Sass + +The Shoelace _source_ is developed using Sass for the convenience of nested selectors, imports, and tedious things such as color palette generation. By design, Sass variables, color functions, and other preprocessor-specific feaures are not used in the source and will not be accepted in a PR. + +Consumers of the library should never need to worry about preprocessing the library. + +### Positioning Popovers + +Shoelace uses an internal popover utility for dropdowns, tooltips, etc. This is a light abstraction of Popper.js designed to make positioning and transitioning things easy and consistent throughout the library. When possible, use this utility instead of relying on Popper directly. See `src/utilities/popover.ts` for details. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..40f8e2ea --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Copyright (c) 2020 A Beautiful Site, LLC + +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. diff --git a/README.md b/README.md new file mode 100644 index 00000000..22655b94 --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# Shoelace + +A forward-thinking library of web components. + +- Works with all frameworks ๐Ÿงฉ +- Works with CDNs ๐Ÿš› +- Fully customizable with CSS ๐ŸŽจ +- Open source ๐Ÿ˜ธ + +Designed in New Hampshire by [Cory LaViska](https://twitter.com/claviska). + +--- + +Documentation: [shoelace.style](https://shoelace.style) + +Source: [github.com/shoelace-style/shoelace](https://github.com/shoelace-style/shoelace) + +Twitter: [@shoelace_style](https://twitter.com/shoelace_style) + +--- + +## Shoemakers ๐Ÿฅพ + +Shoemakers, or "developers," can use this documentation to learn how to build Shoelace from source. + +**You don't need to do any of this to use Shoelace!** This page is for people who want to contribute to the project, tinker with the source, or create a custom build of Shoelace. + +If that's not what you're trying to do, the [documentation website](https://shoelace.style) is where you want to be. + +### What are you using to build Shoelace? + +Components are built with [Stencil](https://stenciljs.com/), a compiler that generates standards-based web components. The source code is a combination of TypeScript + JSX (TSX). Stylesheets are written in SCSS. + +The build is done through a combination of Stencil's CLI and a handful of custom scripts. + +### Forking the Repo + +Start by [forking the repo](https://github.com/shoelace-style/shoelace/fork) on GitHub, then clone it locally and install dependencies. + +```sh +git clone https://github.com/YOUR_GITHUB_USERNAME/shoelace +cd shoelace +npm install +``` + +### Developing + +Once you've cloned the repo, run the following command. + +```sh +npm run start +``` + +This will spin up the Shoelace dev server. Note that the dev server requires ports 4000, 4001, and 4002 to be available. + +After the initial build, a browser will open at `http://localhost:4000`. + +Hot module reloading (HMR) is enabled for components, so changes will instantly reflect in the browser as you work. The documentation is powered by Docsify, which uses raw markdown files to generate pages. As such, no static files are built for the docs. Unfortunately, changes to _documentation pages_ will trigger a page refresh (no HMR). + +### Building + +To generate a production build, run the following command. + +```sh +npm run build +``` + +### Contributing + +Shoelace is an open source project and contributions are encouraged! If you're interesting in contributing, please review the [contribution guidelines](CONTRIBUTING.md) first. + +## License + +Shoelace is designed in New Hampshire by [Cory LaViska](https://twitter.com/claviska). Itโ€™s available under the terms of the MIT license. + +Designing, developing, and supporting this library requires a lot of time, effort, and skill. Iโ€™d like to keep it open source so everyone can use it, but that doesnโ€™t provide me with any income. + +**Therefore, if youโ€™re using my software to make a profit,** I respectfully ask that you help [fund its development](https://github.com/sponsors/claviska) by becoming a sponsor. There are multiple tiers to choose from with benefits at every level, including prioritized support, bug fixes, feature requests, and advertising. + +๐Ÿ‘‡ Your support is very much appreciated! ๐Ÿ‘‡ + +- [Become a sponsor](https://github.com/sponsors/claviska) +- [Star on GitHub](https://github.com/shoelace-style/shoelace/stargazers) +- [Follow on Twitter](https://twitter.com/shoelace_style) + +Whether you're building Shoelace or building something _with_ Shoelace โ€” have fun creating! ๐Ÿฅพ diff --git a/dev-server.js b/dev-server.js new file mode 100644 index 00000000..73b5cc33 --- /dev/null +++ b/dev-server.js @@ -0,0 +1,76 @@ +// +// The Shoelace dev server! ๐Ÿฅพ +// +// This is an Express + Browsersync script that: +// +// - Proxies Stencil's dev server (for HMR of components) +// - Serves dist/ and docs/ from https://localhost:3000/ +// - Launches the docs site and reloads the page when pages are modified +// +// Usage: +// +// 1. Run Stencil: `stencil build --dev --docs --watch --serve --no-open` +// +// 2. Run this script at the same time as Stencil +// + +const bs = require('browser-sync').create(); +const chalk = require('chalk'); +const express = require('express'); +const fs = require('fs').promises; +const path = require('path'); +const { createProxyMiddleware } = require('http-proxy-middleware'); + +const app = express(); +const browserPort = 4000; +const stencilPort = 4001; +const proxyPort = 4002; + +// Proxy Stencil's dev server +app.use( + '/~dev-server', + createProxyMiddleware({ + target: `http://localhost:${stencilPort}`, + changeOrigin: true, + ws: true + }) +); + +// Inject Stencil's dev server iframe into the main entry point +app.use(/^\/$/, async (req, res, next) => { + let index = await fs.readFile('./docs/index.html', 'utf8'); + index = index + .replace('', '') + .replace( + '', + '' + ); + res.type('html').send(index); +}); +app.use('/dist', express.static('./dist')); +app.use('/', express.static('./docs')); +app.listen(proxyPort); + +// Give Stencil's dev server a few seconds to spin up, then launch the browser +setTimeout(() => { + console.log(chalk.cyan(`\nLaunching the Shoelace dev server at http://localhost:${browserPort}! ๐Ÿฅพ\n`)); + + bs.init({ + startPath: '/', + port: browserPort, + proxy: { + target: `http://localhost:${proxyPort}`, + ws: true + }, + logLevel: 'silent', + notify: false, + snippetOptions: { + ignorePaths: '/~dev-server' + } + }); + + // Reload when docs change + bs.watch('docs/**/*').on('change', async () => { + bs.reload(); + }); +}, 5000); diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000..3d4de0e7 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,3 @@ +# Not Found + +Sorry, I couldn't find that page. diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 00000000..69707218 --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,49 @@ +- Getting Started + + - [Overview](/) + - [Installation](/getting-started/installation.md) + - [Usage](/getting-started/usage.md) + - [Customizing](/getting-started/customizing.md) + - [Roadmap](/getting-started/roadmap.md) + +- Components + + - [Alert](/components/alert.md) + - [Avatar](/components/avatar.md) + - [Badge](/components/badge.md) + - [Button](/components/button.md) + - [Checkbox](/components/checkbox.md) + - [Color Picker](/components/color-picker.md) + - [Details](/components/details.md) + - [Dialog](/components/dialog.md) + - [Drawer](/components/drawer.md) + - [Dropdown](/components/dropdown.md) + - [Form](/components/form.md) + - [Icon](/components/icon.md) + - [Input](/components/input.md) + - [Menu](/components/menu.md) + - [Menu Divider](/components/menu-divider.md) + - [Menu Item](/components/menu-item.md) + - [Menu Label](/components/menu-label.md) + - [Progress Bar](/components/progress-bar.md) + - [Progress Ring](/components/progress-ring.md) + - [Radio](/components/radio.md) + - [Range](/components/range.md) + - [Select](/components/select.md) + - [Spinner](/components/spinner.md) + - [Switch](/components/switch.md) + - [Tab Group](/components/tab-group.md) + - [Tab](/components/tab.md) + - [Tab Panel](/components/tab-panel.md) + - [Tag](/components/tag.md) + - [Textarea](/components/textarea.md) + - [Tooltip](/components/tooltip.md) + +- Design Tokens + - [Typography](/tokens/typography.md) + - [Color](/tokens/color.md) + - [Spacing](/tokens/spacing.md) + - [Elevation](/tokens/elevation.md) + - [Border Radius](/tokens/border-radius.md) + - [Transition](/tokens/transition.md) + - [Z-index](/tokens/z-index.md) diff --git a/docs/assets/images/chrome.png b/docs/assets/images/chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..3024356395b717fe191f1110247c05cf06625927 GIT binary patch literal 12226 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/edge.png b/docs/assets/images/edge.png new file mode 100644 index 0000000000000000000000000000000000000000..931cb1c1bf7ffb570c33c03853f0ba9432d86eb0 GIT binary patch literal 11311 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 icon diff --git a/docs/assets/images/logo.svg b/docs/assets/images/logo.svg new file mode 100644 index 00000000..287cd79a --- /dev/null +++ b/docs/assets/images/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/assets/images/opera.png b/docs/assets/images/opera.png new file mode 100644 index 0000000000000000000000000000000000000000..472a1523489e49e7d0084df66ffb9aff3fdc5a6f GIT binary patch literal 5749 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/shoe.svg b/docs/assets/images/shoe.svg new file mode 100644 index 00000000..98e53d11 --- /dev/null +++ b/docs/assets/images/shoe.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + blue boot + 2009-06-18T11:16:58 + A draw of a boot + https://openclipart.org/detail/26707/blue-boot-by-badaman + + + badaman + + + + + azul + blue + boot + bota + deporte + inkscape + line art + monochrome + sport + vectorial + + + + + + + + + + + diff --git a/docs/assets/images/twitter.svg b/docs/assets/images/twitter.svg new file mode 100755 index 00000000..227d0d9a --- /dev/null +++ b/docs/assets/images/twitter.svg @@ -0,0 +1 @@ +Twitter icon diff --git a/docs/assets/images/wordmark.svg b/docs/assets/images/wordmark.svg new file mode 100644 index 00000000..b03918ae --- /dev/null +++ b/docs/assets/images/wordmark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/assets/plugins/code-block/code-block.css b/docs/assets/plugins/code-block/code-block.css new file mode 100644 index 00000000..5574db3d --- /dev/null +++ b/docs/assets/plugins/code-block/code-block.css @@ -0,0 +1,108 @@ +.code-block { + position: relative; + border-radius: 3px; + background: hsl(var(--sl-color-gray-hue), var(--sl-color-gray-saturation), 97%); + margin-bottom: 1.5rem; +} + +.code-block__preview { + position: relative; + border: solid 1px var(--sl-color-gray-90); + border-bottom: none; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; + min-width: 20rem; + max-width: 100%; + padding: 1.5rem 3rem 1.5rem 1.5rem; +} + +.code-block__resizer { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 1.75rem; + font-size: 20px; + color: var(--sl-color-gray-50); + background-color: white; + border-left: solid 1px var(--sl-color-gray-90); + border-top-right-radius: 3px; + cursor: ew-resize; + transition: 250ms background-color; +} + +@media screen and (max-width: 600px) { + .code-block__preview { + padding-right: 1.5rem; + } + + .code-block__resizer { + display: none; + } +} + +.code-block__source { + border: solid 1px var(--sl-color-gray-90); + border-bottom: none; + border-radius: 0 !important; + margin: 0 !important; + display: none; +} + +.code-block__source .docsify-copy-code-button { + border-top-right-radius: 0; +} + +.code-block--expanded .code-block__source { + display: block; +} + +.code-block__toggle { + position: relative; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 2.5rem; + border: solid 1px var(--sl-color-gray-90); + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + background: var(--sl-color-white); + font: inherit; + font-size: 0.875rem; + color: var(--sl-color-gray-40); + cursor: pointer; + transition: 250ms background-color; + -webkit-appearance: none; +} + +.code-block__toggle:hover, +.code-block__toggle:active { + border-color: var(--sl-color-primary-80); + background-color: var(--sl-color-primary-95); + color: var(--sl-color-primary-50); +} + +.code-block__toggle:focus { + outline: none; + border-color: var(--sl-color-primary-50); + background-color: var(--sl-color-primary-95); + color: var(--sl-color-primary-50); + box-shadow: var(--sl-focus-ring-box-shadow); +} + +.code-block__toggle svg { + width: 1em; + height: 1em; + margin-left: 0.25rem; + transition: 250ms transform; +} + +.code-block--expanded .code-block__toggle svg { + transform: rotate(180deg); +} diff --git a/docs/assets/plugins/code-block/code-block.js b/docs/assets/plugins/code-block/code-block.js new file mode 100644 index 00000000..792928b9 --- /dev/null +++ b/docs/assets/plugins/code-block/code-block.js @@ -0,0 +1,133 @@ +(() => { + let count = 1; + + if (!window.$docsify) { + throw new Error('Docsify must be loaded before installing this plugin.'); + } + + function runScript(script) { + const newScript = document.createElement('script'); + newScript.appendChild( + document.createTextNode(` + (() => { + ${script.innerHTML} + })(); + `) + ); + script.parentNode.replaceChild(newScript, script); + } + + function wrap(el, wrapper) { + el.parentNode.insertBefore(wrapper, el); + wrapper.appendChild(el); + } + + window.$docsify.plugins.push((hook, vm) => { + // Convert code blocks to previews + hook.afterEach(function (html, next) { + const domParser = new DOMParser(); + const doc = domParser.parseFromString(html, 'text/html'); + + [...doc.querySelectorAll('code[class^="lang-"]')].map(code => { + if (code.classList.contains('preview')) { + const codeBlock = document.createElement('div'); + const preview = document.createElement('div'); + const pre = code.closest('pre'); + const preId = `code-block-preview-${count}`; + const toggle = document.createElement('button'); + const toggleId = `code-block-toggle-${count}`; + + wrap(pre, codeBlock); + + codeBlock.classList.add('code-block'); + + preview.classList.add('code-block__preview'); + preview.innerHTML = code.textContent; + preview.innerHTML += ` +
+ +
+ `; + + pre.id = preId; + pre.classList.add('code-block__source'); + pre.setAttribute('data-lang', pre.getAttribute('data-lang').replace(/ preview$/, '')); + pre.setAttribute('aria-labeledby', toggleId); + + toggle.id = toggleId; + toggle.type = 'button'; + toggle.classList.add('code-block__toggle'); + toggle.setAttribute('aria-expanded', 'false'); + toggle.setAttribute('aria-controls', preId); + toggle.innerHTML = ` + Source + + + + + `; + + codeBlock.prepend(preview); + codeBlock.append(toggle); + + count++; + } + }); + + next(doc.body.innerHTML); + }); + + // After the page is done loading, force scripts in previews to execute + hook.doneEach(() => { + [...document.querySelectorAll('.code-block__preview script')].map(script => runScript(script)); + }); + + // Horizontal resizing + hook.doneEach(() => { + [...document.querySelectorAll('.code-block__preview')].map(resizeElement => { + let startX; + let startY; + let startWidth; + let startHeight; + + const initDrag = event => { + startX = event.clientX; + startY = event.clientY; + startWidth = parseInt(document.defaultView.getComputedStyle(resizeElement).width, 10); + startHeight = parseInt(document.defaultView.getComputedStyle(resizeElement).height, 10); + document.documentElement.addEventListener('mousemove', doDrag, false); + document.documentElement.addEventListener('mouseup', stopDrag, false); + event.preventDefault(); + }; + + const doDrag = event => { + resizeElement.style.width = startWidth + event.clientX - startX + 'px'; + }; + + const stopDrag = event => { + document.documentElement.removeEventListener('mousemove', doDrag, false); + document.documentElement.removeEventListener('mouseup', stopDrag, false); + }; + + resizeElement.querySelector('.code-block__resizer').addEventListener('mousedown', initDrag); + }, false); + }); + }); + + // Expand and collapse code blocks + document.addEventListener('click', event => { + const toggle = event.target.closest('.code-block__toggle'); + if (toggle) { + const codeBlock = event.target.closest('.code-block'); + codeBlock.classList.toggle('code-block--expanded'); + event.target.setAttribute('aria-expanded', codeBlock.classList.contains('code-block--expanded')); + } + }); +})(); diff --git a/docs/assets/plugins/metadata/metadata.js b/docs/assets/plugins/metadata/metadata.js new file mode 100644 index 00000000..bcac4e7d --- /dev/null +++ b/docs/assets/plugins/metadata/metadata.js @@ -0,0 +1,371 @@ +(() => { + let metadataStore; + + function createPropsTable(props) { + const table = document.createElement('table'); + table.innerHTML = ` + + + Property + Attribute + Description + Type + Default + + + + ${props + .map( + prop => ` + + ${escapeHtml(prop.name)} + ${escapeHtml(prop.attr)} + ${escapeHtml(prop.docs)} + ${escapeHtml(prop.type)} + ${escapeHtml(prop.default)} + + ` + ) + .join('')} + + `; + + return table.outerHTML; + } + + function createEventsTable(events) { + const table = document.createElement('table'); + table.innerHTML = ` + + + Event + Description + Type + + + + ${events + .map( + event => ` + + ${escapeHtml(event.event)} + ${escapeHtml(event.docs)} + CustomEvent<${escapeHtml(event.detail)}> + + ` + ) + .join('')} + + `; + + return table.outerHTML; + } + + function createMethodsTable(methods) { + const table = document.createElement('table'); + table.innerHTML = ` + + + Method + Description + Returns + + + + ${methods + .map( + method => ` + + ${escapeHtml(method.name)} + ${escapeHtml(method.docs)} + ${escapeHtml(method.returns.type)} + + ` + ) + .join('')} + + `; + + return table.outerHTML; + } + + function createSlotsTable(slots) { + const table = document.createElement('table'); + table.innerHTML = ` + + + Slot + Description + + + + ${slots + .map( + slot => ` + + ${slot.name ? escapeHtml(slot.name) : '(default)'} + ${escapeHtml(slot.docs)} + + ` + ) + .join('')} + + `; + + return table.outerHTML; + } + + function createCustomPropertiesTable(styles) { + const table = document.createElement('table'); + table.innerHTML = ` + + + Name + Description + + + + ${styles + .map( + style => ` + + ${escapeHtml(style.name)} + ${escapeHtml(style.docs)} + + ` + ) + .join('')} + + `; + + return table.outerHTML; + } + + function createPartsTable(parts) { + const table = document.createElement('table'); + table.innerHTML = ` + + + Name + Description + + + + ${parts + .map( + part => ` + + ${escapeHtml(part.name)} + ${escapeHtml(part.docs)} + + ` + ) + .join('')} + + `; + + return table.outerHTML; + } + + function createDependentsList(dependents) { + const ul = document.createElement('ul'); + ul.innerHTML = ` + ${dependents + .map( + dependent => ` +
  • ${escapeHtml(dependent)}
  • + ` + ) + .join('')} + `; + + return ul.outerHTML; + } + + function escapeHtml(html) { + return (html + '') + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(/`(.*?)`/g, '$1'); + } + + function getMetadata() { + return new Promise((resolve, reject) => { + // Simple caching to prevent multiple XHR requests + if (metadataStore) { + return resolve(metadataStore); + } + + fetch('/dist/components.json') + .then(res => res.json()) + .then(data => { + metadataStore = data; + resolve(metadataStore); + }) + .catch(err => console.error(err)); + }); + } + + function getDocsTagsObject(docsTags) { + let tags = {}; + + for (const tag of docsTags) { + tags[tag.name] = tag.text; + } + + return tags; + } + + if (!window.$docsify) { + throw new Error('Docsify must be loaded before installing this plugin.'); + } + + window.$docsify.plugins.push((hook, vm) => { + hook.mounted(function () { + getMetadata().then(metadata => { + const target = document.querySelector('.app-name'); + + // Add version + const version = document.createElement('div'); + version.classList.add('sidebar-version'); + version.textContent = metadata.version; + target.appendChild(version); + + // Add repo buttons + const buttons = document.createElement('div'); + buttons.classList.add('sidebar-buttons'); + buttons.innerHTML = ` +
    + Sponsor + + + Star + + + `; + target.appendChild(buttons); + }); + }); + + hook.beforeEach(async function (content, next) { + const metadata = await getMetadata(); + + // Replace %VERSION% placeholders + content = content.replace(/%VERSION%/g, metadata.version); + + // Handle [component-header] tags + content = content.replace(/\[component-header:([a-z-]+)\]/g, (match, tag) => { + const data = metadata.components.filter(data => data.tag === tag)[0]; + let result = ''; + + if (!data) { + console.error('Component not found in metadata: ' + tag); + next(content); + } + + const tags = getDocsTagsObject(data.docsTags); + + if (tags && tags.status) { + let badgeType = 'info'; + if (tags.status === 'stable') badgeType = 'primary'; + if (tags.status === 'experimental') badgeType = 'warning'; + if (tags.status === 'planned') badgeType = 'info'; + if (tags.status === 'deprecated') badgeType = 'danger'; + + result += ` +
    +
    + <${tag}> +
    + +
    + + Since ${tags.since || '?'} + + + + ${tags.status} + +
    +
    + `; + } + + return result.replace(/^ +| +$/gm, ''); + }); + + // Handle [component-metadata] tags + content = content.replace(/\[component-metadata:([a-z-]+)\]/g, (match, tag) => { + const data = metadata.components.filter(data => data.tag === tag)[0]; + let result = ''; + + if (!data) { + console.error('Component not found in metadata: ' + tag); + next(content); + } + + if (data.props.length) { + result += ` + ## Properties + ${createPropsTable(data.props)} + `; + } + + if (data.events.length) { + result += ` + ## Events + ${createEventsTable(data.events)} + `; + } + + if (data.methods.length) { + result += ` + ## Methods + ${createMethodsTable(data.methods)} + `; + } + + if (data.slots.length) { + result += ` + ## Slots + ${createSlotsTable(data.slots)} + `; + } + + if (data.styles.length) { + result += ` + ## CSS Custom Properties + ${createCustomPropertiesTable(data.styles)} + `; + } + + if (data.parts.length) { + result += ` + ## CSS Parts + ${createPartsTable(data.parts)} + `; + } + + if (data.dependents.length) { + result += ` + ## Dependents + + The following components make use of this component. + + ${createDependentsList(data.dependents)} + `; + } + + // Strip whitespace so markdown doesn't process things as code blocks + return result.replace(/^ +| +$/gm, ''); + }); + + next(content); + }); + }); +})(); diff --git a/docs/assets/plugins/sidebar/sidebar.js b/docs/assets/plugins/sidebar/sidebar.js new file mode 100644 index 00000000..438acd5b --- /dev/null +++ b/docs/assets/plugins/sidebar/sidebar.js @@ -0,0 +1,14 @@ +(() => { + if (!window.$docsify) { + throw new Error('Docsify must be loaded before installing this plugin.'); + } + + window.$docsify.plugins.push((hook, vm) => { + hook.mounted(function () { + // Move search below the app name + const appName = document.querySelector('.sidebar .app-name'); + const search = document.querySelector('.sidebar .search'); + appName.insertAdjacentElement("afterend", search); + }); + }); +})(); diff --git a/docs/assets/styles/demos.css b/docs/assets/styles/demos.css new file mode 100644 index 00000000..ac95ce68 --- /dev/null +++ b/docs/assets/styles/demos.css @@ -0,0 +1,52 @@ +/* Color demo */ +.color-demo { + width: 4rem; + height: 2rem; + border-radius: var(--sl-border-radius-small); + box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.33); +} + +/* Border radius demo */ +.border-radius-demo { + width: 3rem; + height: 3rem; + background: var(--sl-color-primary-50); +} + +/* Transition demo */ +.transition-demo { + position: relative; + background: var(--sl-color-gray-90); + width: 8rem; + height: 2rem; +} + +.transition-demo::after { + content: ''; + position: absolute; + background-color: var(--sl-color-primary-50); + top: 0; + left: 0; + width: 0; + height: 100%; + transition-duration: inherit; + transition-property: width; +} + +.transition-demo:hover::after { + width: 100%; +} + +/* Spacing demo */ +.spacing-demo { + width: 100px; + background: var(--sl-color-primary-50); +} + +/* Elevation dmeo */ +.elevation-demo { + background: var(--sl-color-white); + border-radius: 3px; + width: 4rem; + height: 4rem; +} diff --git a/docs/assets/styles/docs.css b/docs/assets/styles/docs.css new file mode 100644 index 00000000..958227aa --- /dev/null +++ b/docs/assets/styles/docs.css @@ -0,0 +1,503 @@ +html { + box-sizing: border-box; +} + +*, *:before, *:after { + box-sizing: inherit; +} + +body { + font-family: var(--sl-font-sans); + font-size: var(--sl-font-size-medium); + font-weight: var(--sl-font-weight-normal); + letter-spacing: var(--sl-letter-spacing-normal); + color: var(--sl-color-gray-25); + line-height: var(--sl-line-height-normal); +} + +a { + color: var(--sl-color-primary-50); +} + +/* Sidebar */ +.sidebar { + background: var(--sl-color-white); + border-right: solid 1px var(--sl-color-gray-95); +} + +.sidebar .app-name { + padding: 0 1.5rem; + margin-top: 1.5rem; +} + +.sidebar-version { + font-size: var(--sl-font-size-x-small); + font-weight: var(--sl-font-weight-normal); + color: var(--sl-color-gray-60); + text-align: right; + padding: 0 var(--sl-spacing-small); + margin: -1.25rem 0 .6rem 0; +} + +.sidebar-buttons { + text-align: center; + margin-top: 0; +} + +/* Search */ +.sidebar .search { + position: relative; + border: none; +} + +.sidebar .search input[type='search'] { + border: solid 1px var(--sl-input-border-color); + border-radius: var(--sl-border-radius-pill); + padding-left: 1rem; + padding-right: 2rem; + margin: 0 1.25rem; + transition: var(--sl-transition-fast) box-shadow; +} + +.sidebar .search input[type='search']:focus { + box-shadow: var(--sl-focus-ring-box-shadow); + border-color: var(--sl-input-border-color-focus); + outline: none; +} + +.sidebar .input-wrap { + position: relative; + width: 100%; + padding: 0 .25rem; +} + +.sidebar .clear-button { + position: absolute; + right: 30px; + top: 7px; + width: 22px !important; + height: 22px !important; +} + +.sidebar .clear-button svg { + transform: scale(.75) !important; +} + +.sidebar .clear-button:focus { + outline: none; +} + +.search .results-panel { + margin-top: 1rem; +} + +.search .matching-post { + border-bottom: solid 1px var(--sl-color-gray-95) !important; + padding: .25rem 1.5rem; +} + +.search .matching-post a { + display: block; + border-radius: inherit + padding: .5rem; +} + +.search .matching-post h2 { + margin-bottom: 0; +} + +.search .matching-post p { + margin-top: 0; +} + +/* Sidebar toggle */ +.sidebar-toggle { + top: .25rem; + left: .25rem; + width: 2rem; + height: 2rem; + border-radius: var(--sl-border-radius-medium); + padding: .5rem; +} + +@media screen and (max-width: 768px) { + body.close .sidebar-toggle { + padding: .5rem; + } +} + +/* Sidebar nav */ +.sidebar-nav { + padding: 0 1rem; +} + +.sidebar-nav a { + color: inherit; + text-decoration: none; +} + +.sidebar-nav li.collapse > a, +.sidebar-nav li.active > a { + color: var(--sl-color-primary-50); +} + +.sidebar li > p { + font-weight: var(--sl-font-weight-bold); + border-bottom: solid 1px var(--sl-color-gray-90); + margin: 0 .75rem .5rem 0; +} + +.sidebar ul li ul { + padding-left: .5rem; + margin: 0 .75rem 1.5rem 0; +} + +.sidebar ul ul ul { + padding: 0; + margin: 0 0 0 .5rem; +} + + +.sidebar ul ul ul li { + list-style: disc; + margin-left: 1.5rem; +} + +/* Content */ +.content { + padding-top: 0; +} + +.markdown-section { + max-width: 860px; +} + +.markdown-section .logo { + max-width: 24rem; +} + +.markdown-section ul { + padding: 0 0 0 1.5rem; + margin: 0; +} + +.markdown-section .anchor { + color: var(--sl-color-primary-50); +} + +.markdown-section h1, +.markdown-section h2, +.markdown-section h3, +.markdown-section h4, +.markdown-section h5, +.markdown-section h6 { + font-weight: var(--sl-font-weight-normal); + margin: 0 0 1em 0; +} + +.markdown-section h1 { + font-size: var(--sl-font-size-xx-large); +} + +.markdown-section h2 { + font-size: var(--sl-font-size-x-large); + border-bottom: solid 1px var(--sl-color-gray-90); + margin-top: 2rem; +} + +.markdown-section h3 { + font-size: var(--sl-font-size-large); +} + +.markdown-section h4 { + font-size: var(--sl-font-size-medium); +} + +.markdown-section h5 { + font-size: var(--sl-font-size-small); +} + +.markdown-section h6 { + font-size: var(--sl-font-size-x-small); +} + +.markdown-section pre { + font-family: var(--sl-font-mono); +} + +.markdown-section h1:first-of-type { + margin-bottom: 0; +} + +.markdown-section code { + font-family: var(--sl-font-mono); + font-size: 87.5%; + background: hsla(var(--sl-color-gray-hue), var(--sl-color-gray-saturation), 50%, .05); + border-radius: var(--sl-border-radius-small); + padding: 2px 4px; +} + +.markdown-section table code:not([class*="lang-"]):not([class*="language-"]) { + white-space: normal; +} + +/* Code blocks */ +.markdown-section pre { + position: relative; + background: hsl(var(--sl-color-gray-hue), var(--sl-color-gray-saturation), 97%); + border-radius: var(--sl-border-radius-medium); +} + +.markdown-section pre > code { + display: block; + background: none; + color: var(--sl-color-gray-30); + padding: var(--sl-spacing-medium); + overflow: auto; + hyphens: none; + tab-size: 2; +} + +.markdown-section pre .token.comment { + color: var(--sl-color-gray-70); +} + +.markdown-section pre .token.prolog, +.markdown-section pre .token.doctype, +.markdown-section pre .token.cdata, +.markdown-section pre .token.operator { + color: var(--sl-color-gray-40); +} + +.markdown-section pre .token.punctuation { + color: var(--sl-color-gray-50); +} + +.namespace { + opacity: .7; +} + +.markdown-section pre .token.property, +.markdown-section pre .token.keyword, +.markdown-section pre .token.tag, +.markdown-section pre .token.url { + color: var(--sl-color-primary-45); +} + +.markdown-section pre .token.class-name { + color: #f8e71c; + text-decoration: underline; +} + +.markdown-section pre .token.symbol, +.markdown-section pre .token.deleted { + color: #f92672; +} + +.markdown-section pre .token.boolean, +.markdown-section pre .token.constant, +.markdown-section pre .token.selector, +.markdown-section pre .token.attr-name, +.markdown-section pre .token.string, +.markdown-section pre .token.char, +.markdown-section pre .token.builtin, +.markdown-section pre .token.inserted { + color: var(--sl-color-success-40); +} + +.markdown-section pre .token.atrule, +.markdown-section pre .token.attr-value, +.markdown-section pre .token.number, +.markdown-section pre .token.variable { + color: #9013fe; +} + +.markdown-section pre .token.function { + color: #eb9200; +} + +.markdown-section pre .token.regex { + color: #f5a623; +} + +.markdown-section pre .token.important { + color: #d0021b; +} + +.markdown-section pre .token.important, +.markdown-section pre .token.bold { + font-weight: bold; +} + +.markdown-section pre .token.italic { + font-style: italic; +} + +/* Tables */ +.markdown-section table { + margin-bottom: 1.5rem; +} + +.markdown-section tr { + border: none; +} + +.markdown-section tr:nth-child(2n) { + background: hsl(var(--sl-color-gray-hue), var(--sl-color-gray-saturation), 97%); +} + +.markdown-section th { + border: none; + font-weight: inherit; + text-align: left; +} + +.markdown-section td { + border-top: solid 1px var(--sl-color-gray-90); + border-bottom: solid 1px var(--sl-color-gray-90); + border-left: none; + border-right: none; +} + +/* Tips & Warnings */ +.markdown-section p.tip, +.markdown-section p.warn { + position: relative; + background: hsl(var(--sl-color-gray-hue), var(--sl-color-gray-saturation), 97%); + border-left: solid 4px transparent; + border-radius: var(--sl-border-radius-medium); + padding-left: 1.5rem; +} + +.markdown-section p.tip:before, +.markdown-section p.warn:before { + content: '!'; + border-radius: 100%; + color: var(--sl-color-white); + font-size: 14px; + font-weight: bold; + left: -12px; + line-height: 20px; + position: absolute; + height: 20px; + width: 20px; + text-align: center; + top: calc(50% - 10px); +} + +.markdown-section p.warn { + border-left-color: var(--sl-color-primary-50); +} + +.markdown-section p.warn:before { + background-color: var(--sl-color-primary-50); +} + +.markdown-section p.tip { + border-left-color: var(--sl-color-danger-50); +} + +.markdown-section p.tip:before { + background-color: var(--sl-color-danger-50); +} + +/* Component headers */ +.component-header { + border-bottom: solid 1px var(--sl-color-gray-90); + padding-bottom: 2rem; + margin-top: -1rem; + margin-bottom: 2rem; +} + +.component-header__tag { + border-bottom: none; + padding: 0; + margin: 0.75rem 0 0.25rem 0; +} + +.component-header__tag code { + background: none; + color: var(--sl-color-gray-50); + font-size: var(--sl-font-size-large); + padding: 0; + margin: 0; +} + +.component-header__info { + margin-bottom: 0.5rem; +} + +/* Lead sentences that occur immediately after the header */ +.component-header + p { + font-size: var(--sl-font-size-large); + line-height: 1.6; +} + +/* Copy button */ +.docsify-copy-code-button { + font-size: var(--sl-font-size-small) !important; + border-top-right-radius: var(--sl-border-radius-medium) !important; + border-bottom-left-radius: var(--sl-border-radius-medium) !important; +} + +/* Repo buttons */ +html .repo-button { + display: inline-block; + vertical-align: middle; + background-color: var(--sl-color-white); + border: solid 1px var(--sl-color-gray-85); + border-radius: var(--sl-border-radius-medium); + box-shadow: var(--sl-shadow-x-small); + font-size: var(--sl-font-size-small); + font-weight: var(--sl-font-weight-semibold); + text-decoration: none; + color: var(--sl-color-gray-30); + padding: var(--sl-spacing-xx-small) var(--sl-spacing-small); + margin-bottom: var(--sl-spacing-xx-small); + transition: 0.25s all; +} + +html .repo-button:hover { + text-decoration: none; + background-color: var(--sl-color-gray-95); + border: solid 1px var(--sl-color-gray-80); +} + +html .repo-button:focus { + outline: none; + border-color: var(--sl-color-primary-50); + box-shadow: var(--sl-focus-ring-box-shadow); +} + +html .repo-button:not(:last-of-type) { + margin-right: .125rem; +} + +html .repo-button sl-icon { + position: relative; + top: -1px; + vertical-align: middle; + margin-right: 0.125rem; +} + +html .repo-button--small { + font-size: var(--sl-font-size-x-small); + padding: var(--sl-spacing-xxx-small) var(--sl-spacing-x-small); +} + +html .repo-button--sponsor sl-icon { + color: #ea4aaa; +} + +html .repo-button--github sl-icon { + color: #242a2e; +} + +html .repo-button--twitter sl-icon { + color: #1ea0f2; +} + +body[data-page^="tokens/"] .table-wrapper td:first-child, +body[data-page^="tokens/"] .table-wrapper td:first-child code { + white-space: nowrap; +} diff --git a/docs/components/alert.md b/docs/components/alert.md new file mode 100644 index 00000000..d89679bb --- /dev/null +++ b/docs/components/alert.md @@ -0,0 +1,90 @@ +# Alert + +[component-header:sl-alert] + +Alerts are used to display important messages. + +Alerts are designed to be shown dynamically, so you need to include the `open` attribute to display them. + +```html preview + + + This is a standard alert. You can customize its content and even the icon. + +``` + +## Examples + +### Types + +Set the `type` attribute to change the alert's type. + +```html preview + + + This is super informative
    + You can tell by how pretty the alert is. +
    + +
    + + + + Your changes have been saved
    + You can safely exit the app now. +
    + +
    + + + + Your settings have been updated
    + Some settings will take affect the next time you log in. +
    + +
    + + + + This will end your session
    + You will be logged out until you log in again. +
    + +
    + + + + Delete this file?
    + This is permanent, which means forever! +
    +``` + +### Closable + +Add the `closable` attribute to show a close button that will hide the alert. + +```html preview + + + You can close this alert any time! + + + +``` + +### Without Icons + +Icons are optional. Simply omit the `icon` slot if you don't want them. + +```html preview + + Nothing fancy here, just a simple alert. + +``` + +[component-metadata:sl-alert] diff --git a/docs/components/avatar.md b/docs/components/avatar.md new file mode 100644 index 00000000..e81b89f4 --- /dev/null +++ b/docs/components/avatar.md @@ -0,0 +1,62 @@ +# Avatar + +[component-header:sl-avatar] + +Avatars are used to represent a person or object. + +```html preview + +``` + +## Examples + +### Images + +To use an image for the avatar, set the `image` and `alt` attributes. This will take priority and be shown over initials and icons. + +```html preview + +``` + +### Initials + +When you don't have an image to use, you can set the `initials` attribute to show something more personalized than an icon. + +```html preview + +``` + +### Custom Icons + +When no image or initials are set, an icon will be shown. The default avatar shows a generic "user" icon, but you can customize this with the `icon` slot. + +```html preview + + + + + + + + + + + +``` + +### Shapes + +Avatars can be shaped using the `shape` attribute. + +```html preview + + + + + +``` + +[component-metadata:sl-avatar] diff --git a/docs/components/badge.md b/docs/components/badge.md new file mode 100644 index 00000000..47ccae0b --- /dev/null +++ b/docs/components/badge.md @@ -0,0 +1,60 @@ +# Badge + +[component-header:sl-badge] + +Badges are used to draw attention and display statuses or counts. + +```html preview +Badge +``` + +## Examples + +### Types + +Set the `type` attribute to change the badge's type. + +```html preview +Primary +Success +Info +Warning +Danger +``` + +### With Buttons + +One of the most common use cases for badges is attaching them to buttons. To make this easier, badges will be automatically positioned at the top-right when they're a child of a button. + +```html preview + + Requests + 30 + + + + Warnings + 8 + + + + Errors + 6 + +``` + +### With Menu Items + +When including badges in menu items, use the `suffix` slot to make sure they're aligned correctly. + +```html preview + + Messages + Comments 4 + Replies 12 + +``` + +[component-metadata:sl-badge] diff --git a/docs/components/button.md b/docs/components/button.md new file mode 100644 index 00000000..f0b2f689 --- /dev/null +++ b/docs/components/button.md @@ -0,0 +1,134 @@ +# Button + +[component-header:sl-button] + +Buttons represent actions that are available to the user. + +```html preview +Button +``` + +## Examples + +### Types + +Use the `type` attribute to set the button's type. + +```html preview +Default +Primary +Success +Info +Warning +Danger +``` + +### Sizes + +Use the `size` prop to change a button's size. + +```html preview +Small +Medium +Large +``` + +### Pill Buttons + +Use the `pill` prop to give buttons rounded edges. + +```html preview +Small +Medium +Large +``` + +### Circle Buttons + +Use the `circle` prop to create circular icon buttons. + +```html preview + + + +``` + +### Text Buttons + +Use the `text` type to create text buttons that share the same size as regular buttons but don't have backgrounds or borders. + +```html preview +Text +Text +Text +``` + +### Setting a Custom Width + +As expected, buttons can be given a custom width by setting its `width`. This is useful for making buttons span the full width of their container on smaller screens. + +```html preview +Small +Medium +Large +``` + +### Prefix and Suffix Icons + +Use the `prefix` and `suffix` slots to add icons. + +```html preview + + + Settings + + + + + Refresh + + + + + + Open + +``` + +### Caret + +Use the `caret` prop to add a dropdown indicator when a button will trigger a dropdown, menu, or popover. + +```html preview +Small +Medium +Large +``` + +### Loading + +Use the `loading` prop to make a button busy. The width will remain the same as before, preventing adjacent elements from moving around. Clicks will be suppressed until the loading state is removed. + +```html preview +Default +Primary +Success +Info +Warning +Danger +``` + +### Disabled + +Use the `disabled` prop to disable a button. Clicks will be suppressed until the disabled state is removed. + +```html preview +Default +Primary +Success +Info +Warning +Danger +``` + +[component-metadata:sl-button] diff --git a/docs/components/checkbox.md b/docs/components/checkbox.md new file mode 100644 index 00000000..58322c5f --- /dev/null +++ b/docs/components/checkbox.md @@ -0,0 +1,39 @@ +# Checkbox + +[component-header:sl-checkbox] + +Checkboxes allow the user to toggle an option on or off. + +```html preview +Checkbox +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Checked + +Use the `checked` attribute to activate the checkbox. + +```html preview +Checked +``` + +### Indeterminate + +Use the `indeterminate` attribute to make the checkbox indeterminate. + +```html preview +Indeterminate +``` + +### Disabled + +Use the `disabled` attribute to disable the checkbox. + +```html preview +Disabled +``` + +[component-metadata:sl-checkbox] diff --git a/docs/components/color-picker.md b/docs/components/color-picker.md new file mode 100644 index 00000000..d3bde1f1 --- /dev/null +++ b/docs/components/color-picker.md @@ -0,0 +1,39 @@ +# Color Picker + +[component-header:sl-color-picker] + +Color pickers allow the user to select a color. + +```html preview + +``` + +## Examples + +### Opacity + +Use the `opacity` attribute to enable the opacity slider. When this is enabled, the value will be displayed as HEXA, RGBA, or HSLA based on `format`. + +```html preview + +``` + +### Formats + +Set the color picker's format with the `format` attribute. Valid options include `hex`, `rgb`, and `hsl`. Note that the color picker will accept any parsable format (including CSS color names) regardless of this option. + +```html preview + + + +``` + +### Inline + +The color picker can be rendered inline instead of in a dropdown using the `inline` attribute. + +```html preview + +``` + +[component-metadata:sl-color-picker] diff --git a/docs/components/details.md b/docs/components/details.md new file mode 100644 index 00000000..09b9fc3c --- /dev/null +++ b/docs/components/details.md @@ -0,0 +1,65 @@ +# Details + +[component-header:sl-details] + +Details show a brief summary and expand to show additional content. + +```html preview + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +``` + +## Examples + +### Disabled + +Use the `disable` attribute to prevent the details from expanding. + +```html preview + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +``` + +### Grouping Details + +Details are designed to function independently, but you can simulate a group or "accordion" where only one is shown at a time by listening for the `slShow` event. + +```html preview +
    + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +
    + + + + +``` + +[component-metadata:sl-details] diff --git a/docs/components/dialog.md b/docs/components/dialog.md new file mode 100644 index 00000000..baf4e18c --- /dev/null +++ b/docs/components/dialog.md @@ -0,0 +1,111 @@ +# Dialog + +[component-header:sl-dialog] + +Dialogs appear above the page and require the user's immediate attention. + +```html preview + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Close + + +Open Dialog + + +``` + +## UX Tips + +- Use a dialog when you immediately require the user's attention, e.g. confirming a destructive action. +- Always provide an obvious way for the user to dismiss the dialog. +- Don't nest dialogs. It almost always leads to a poor experience for the user. + +## Examples + +### Custom Width + +Use the `--width` custom property to set the dialog's width. + +```html preview + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Close + + +Open Dialog + + +``` + +### Scrolling + +By design, a dialog's height will never exceed that of the viewport. As such, dialogs will not scroll with the page ensuring the header and footer are always accessible to the user. + +```html preview + +
    +

    Scroll down and give it a try! ๐Ÿ‘‡

    +
    + Close +
    + +Open Dialog + + +``` + +### Ignoring Clicks on the Overlay + +By default, dialogs are closed when the user clicks or taps on the overlay. To prevent this behavior, cancel the `slOverlayDismiss` event. + +```html preview + + This dialog will not be closed when you click outside of it. + Close + + +Open Dialog + + +``` + +[component-metadata:sl-dialog] diff --git a/docs/components/drawer.md b/docs/components/drawer.md new file mode 100644 index 00000000..a1caad9a --- /dev/null +++ b/docs/components/drawer.md @@ -0,0 +1,207 @@ +# Drawer + +[component-header:sl-drawer] + +Drawers slide in from a container to expose additional options and information. + +```html preview + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Close + + +Open Drawer + + +``` + +## Examples + +### Slide in From Left + +To make the drawer slide in from the left, set the `placement` attribute to `left`. + +```html preview + + This drawer slides in from the left. + Close + + +Open Drawer + + +``` + +### Slide in From Top + +To make the drawer slide in from the top, set the `placement` attribute to `top`. + +```html preview + + This drawer slides in from the top. + Close + + +Open Drawer + + +``` + +### Slide in From Bottom + +To make the drawer slide in from the bottom, set the `placement` attribute to `bottom`. + +```html preview + + This drawer slides in from the bottom. + Close + + +Open Drawer + + +``` + +### Contained to an Element + +By default, the drawer slides out of its [containing block](https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#Identifying_the_containing_block), which is usually the viewport. To make the drawer slide out of its parent element, set this prop and add `position: relative` to the parent. + +```html preview +
    + The drawer will be contained to this box. This content won't shift or be affected in any way when the drawer opens. + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Close + +
    + +Open Drawer + + +``` + +### Custom Size + +Use the `--size` custom property to set the drawer's size. This will be applied to the drawer's width or height depending on its `placement`. + +```html preview + + This drawer is always 50% of the viewport. + Close + + +Open Drawer + + +``` + +### Scrolling + +By design, a drawer's height will never exceed 100% of its container. As such, drawers will not scroll with the page to ensure the header and footer are always accessible to the user. + +```html preview + +
    +

    Scroll down and give it a try! ๐Ÿ‘‡

    +
    + Close +
    + +Open Drawer + + +``` + +### Ignoring Clicks on the Overlay + +By default, drawers are closed when the user clicks or taps on the overlay. To prevent this behavior, cancel the `slOverlayDismiss` event. + +```html preview + + This drawer will not be closed when you click outside of it. + Close + + +Open Drawer + + +``` + +[component-metadata:sl-drawer] diff --git a/docs/components/dropdown.md b/docs/components/dropdown.md new file mode 100644 index 00000000..d6d21d44 --- /dev/null +++ b/docs/components/dropdown.md @@ -0,0 +1,90 @@ +# Dropdown + +[component-header:sl-dropdown] + +Dropdowns expose additional content that "drops down" in a panel. + +Dropdowns consist of a trigger and a panel. By default, activating the trigger will expose the panel and interacting outside of the panel will close it. + +Dropdowns are designed to work well with [menus](/components/menu.md) to provide a list of options the user can select from. However, dropdowns can also be used in lower-level applications (e.g. [color picker](/components/color-picker.md) and [select](/components/select.md)). The API gives you complete control over showing, hiding, and positioning the panel. + +```html preview + + Dropdown + + Dropdown Item 1 + Dropdown Item 2 + Dropdown Item 3 + + Checked + Disabled + + + Prefix + + + + Suffix Icon + + + + +``` + +## Examples + +### Placement + +The preferred placement of the dropdown can be set with the `placement` attribute. Note that the actual position may vary to ensure the panel remains in the viewport. + +```html preview + + Edit + + Cut + Copy + Paste + + Find + Replace + + +``` + +### Distance + +The distance from the panel to the trigger can be customized using the `distance` attribute. This value is specified in pixels. + +```html preview + + Edit + + Cut + Copy + Paste + + Find + Replace + + +``` + +### Skidding + +The offset of the panel along the trigger can be customized using the `skidding` attribute. This value is specified in pixels. + +```html preview + + Edit + + Cut + Copy + Paste + + Find + Replace + + +``` + +[component-metadata:sl-dropdown] diff --git a/docs/components/form.md b/docs/components/form.md new file mode 100644 index 00000000..82c5be79 --- /dev/null +++ b/docs/components/form.md @@ -0,0 +1,69 @@ +# Form + +[component-header:sl-form] + +Forms collect data that can easily be processed and sent to a server. + +All of Shoelace's components make use of the [shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) to encapsulate markup, style, and behavior. One caveat of this approach is that native `
    ` elements don't recognize Shoelace form controls. + +This component solves that problem by serializing _both_ Shoelace form controls and native form controls. The resulting form data is exposed in the `slSubmit` event in a [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) object. + +```html preview + + +
    + + Birds + Cats + Dogs + +
    + + I totally agree + +

    + Submit +
    + + +``` + +?> Shoelace forms don't make use of `action` and `method` attributes and they don't submit automatically like native forms. To handle submission, you need to listen for the `slSubmit` event as shown in the example above. + +[component-metadata:sl-form] diff --git a/docs/components/icon.md b/docs/components/icon.md new file mode 100644 index 00000000..cc48fb7e --- /dev/null +++ b/docs/components/icon.md @@ -0,0 +1,223 @@ +# Icon + +[component-header:sl-icon] + +Icons are symbols that can be used to represent or provide context to various options and actions within an application. + +Shoelace comes bundled with over 1,000 icons courtesy of the [Bootstrap Icons](https://icons.getbootstrap.com/) project. Click or tap on an icon below to copy the name and use it like this. + +```html + +``` + + + +## Examples + +### Icon Sizes + +Icons are sized relative to the current font size. To change their size, set the `font-size` property on the icon itself or on a parent element as shown below. + +```html preview +
    + + + + + + + + + + + + + + + + +
    +``` + +### Custom Icons + +Custom icons can be loaded by setting the `src` attribute. Only SVG images are supported + +```html preview + +``` + + + + + +[component-metadata:sl-icon] diff --git a/docs/components/input.md b/docs/components/input.md new file mode 100644 index 00000000..13649c8d --- /dev/null +++ b/docs/components/input.md @@ -0,0 +1,140 @@ +# Input + +[component-header:sl-input] + +Inputs collect data from the user. + +```html preview + +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Labels + +Use the `label` attribute to give the input an accessible label. + +```html preview + +
    + +``` + +### Help Text + +Add descriptive help text to an input with the `help-text` slot. + +```html preview + +
    What would you like people to call you?
    +
    +``` + +### Placeholder + +Use the `placeholder` attribute to add a placeholder. + +```html preview + +``` + +### Size + +Use the `size` attribute to change an input's size. + +```html preview + +
    + +
    + +``` + +### Pill + +Use the `pill` prop to give inputs rounded edges. + +```html preview + +
    + +
    + +``` + +### Prefix & Suffix Icons + +Use the `prefix` and `suffix` slots to add icons. + +```html preview + + + + +
    + + + + +
    + + + + +``` + +### Clearable + +Add the `clearable` prop to add a clear button when the input has content. + +```html preview + +
    + +
    + +``` + +### Toggle Password + +Add the `toggle-password` prop to add a toggle button that will show the password when activated. + +```html preview + +
    + +
    + +``` + +### Disabled + +Use the `disabled` attribute to disable an input. + +```html preview + +
    + +
    + +``` + +### Validation + +Show a valid or invalid state by setting the `valid` and `invalid` attributes, respectively. Help text can be used to provide feedback for validation and will be styled accordingly. + +```html preview + +
    This is a valid input
    +
    + +
    + + +
    This is an invalid input
    +
    +``` + +[component-metadata:sl-input] diff --git a/docs/components/menu-divider.md b/docs/components/menu-divider.md new file mode 100644 index 00000000..dfe14f99 --- /dev/null +++ b/docs/components/menu-divider.md @@ -0,0 +1,22 @@ +# Menu Divider + +[component-header:sl-menu-divider] + +Menu dividers are used to visually group menu items. + +```html preview + + Option 1 + Option 2 + + Option 3 + Option 4 + + Option 5 + Option 6 + +``` + +[component-metadata:sl-menu-divider] diff --git a/docs/components/menu-item.md b/docs/components/menu-item.md new file mode 100644 index 00000000..9d79b90e --- /dev/null +++ b/docs/components/menu-item.md @@ -0,0 +1,29 @@ +# Menu Item + +[component-header:sl-menu-item] + +Menu items provide options for the user to pick from in a menu. + +```html preview + + Option 1 + Option 2 + Option 3 + + Checked + Disabled + + + Prefix Icon + + + + Suffix Icon + + + +``` + +[component-metadata:sl-menu-item] diff --git a/docs/components/menu-label.md b/docs/components/menu-label.md new file mode 100644 index 00000000..6da2148c --- /dev/null +++ b/docs/components/menu-label.md @@ -0,0 +1,23 @@ +# Menu Label + +[component-header:sl-menu-label] + +Menu labels are used to describe a group of menu items. + +```html preview + + Fruits + Apple + Banana + Orange + + Vegetables + Broccoli + Carrot + Zucchini + +``` + +[component-metadata:sl-menu-label] diff --git a/docs/components/menu.md b/docs/components/menu.md new file mode 100644 index 00000000..0c03a106 --- /dev/null +++ b/docs/components/menu.md @@ -0,0 +1,23 @@ +# Menu + +[component-header:sl-menu] + +Menus provide a list of options for the user. + +Use [menu items](/components/menu-item.md), [menu dividers](/components/menu-divider.md), and [menu labels](/components/menu-label.md) to compose a menu. + +```html preview + + Undo + Redo + + Cut + Copy + Paste + Delete + +``` + +[component-metadata:sl-menu] diff --git a/docs/components/progress-bar.md b/docs/components/progress-bar.md new file mode 100644 index 00000000..db27092a --- /dev/null +++ b/docs/components/progress-bar.md @@ -0,0 +1,52 @@ +# Progress Bar + +[component-header:sl-progress-bar] + +Progress bars are used to show the progress of a determinate operation. + +```html preview + +``` + +## Examples + +### Custom Height + +Use the `--height` custom property to set the progress bar's height. + +```html preview + +``` + +### Labels + +Use the default slot to show a label. + +```html preview +50% + +
    + + + + + +``` + +[component-metadata:sl-progress-bar] diff --git a/docs/components/progress-ring.md b/docs/components/progress-ring.md new file mode 100644 index 00000000..f85bc215 --- /dev/null +++ b/docs/components/progress-ring.md @@ -0,0 +1,71 @@ +# Progress Ring + +[component-header:sl-progress-ring] + +Progress rings are used to show the progress of a determinate operation in a circular fashion. + +```html preview + +``` + +## Examples + +### Size + +Use the `size` attribute to set the diameter of the progress ring. + +```html preview + +``` + +### Stroke Width + +Use the `stroke-width` attribute to set the width of the progress ring's indicator. + +```html preview + +``` + +### Colors + +To change the color, use the `--track-color` and `--indicator-color` custom properties. + +```html preview + +``` + +### Labels + +Use the default slot to show a label. + +```html preview +50% + +
    + + + + + +``` + +[component-metadata:sl-progress-ring] diff --git a/docs/components/radio.md b/docs/components/radio.md new file mode 100644 index 00000000..fd0084ae --- /dev/null +++ b/docs/components/radio.md @@ -0,0 +1,42 @@ +# Radio + +[component-header:sl-radio] + +Radios allow the user to select one option from a group of many. + +```html preview +Radio +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Checked + +Use the `checked` attribute to activate the radio. + +```html preview +Checked +``` + +### Disabled + +Use the `disabled` attribute to disable the radio. + +```html preview +Disabled +``` + +### Grouping Radios + +Radios are grouped based on their `name` attribute and scoped to the nearest form. + +```html preview +Option 1
    +Option 2
    +Option 3
    +Option 4 +``` + +[component-metadata:sl-radio] diff --git a/docs/components/range.md b/docs/components/range.md new file mode 100644 index 00000000..73ee8bab --- /dev/null +++ b/docs/components/range.md @@ -0,0 +1,52 @@ +# Range + +[component-header:sl-range] + +Ranges allow the user to select a single value within a given range using a slider. + +```html preview + +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Disabled + +Use the `disabled` prop to disable a slider. + +```html preview + +``` + +### Tooltip Placement + +By default, the tooltip is shown on top. Set `tooltip` to `bottom` to show it below the slider. + +```html preview + +``` + +### Disable the Tooltip + +To disable the tooltip, set `tooltip` to `none`. + +```html preview + +``` + +### Custom Tooltip Formatter + +You can change the tooltip's content by setting the `tooltipFormatter` prop to a function that accepts the range's value as an argument. + +```html preview + + + +``` + +[component-metadata:sl-range] diff --git a/docs/components/select.md b/docs/components/select.md new file mode 100644 index 00000000..fd9ae1b2 --- /dev/null +++ b/docs/components/select.md @@ -0,0 +1,159 @@ +# Select + +[component-header:sl-select] + +Selects allow you to choose one or more items from a dropdown menu. + +```html preview + + Option 1 + Option 2 + Option 3 + + Option 4 + Option 5 + Option 6 + +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Labels + +Use the `label` attribute to give the select an accessible label. + +```html preview + + Option 1 + Option 2 + Option 3 + +``` + +### Help Text + +Add descriptive help text to an input with the `help-text` slot. + +```html preview + + Novice + Intermediate + Advanced + +
    Please tell us your skill level.
    +
    +``` + +### Multiple + +To allow multiple options to be selected, use the `multiple` attribute. + +```html preview + + Option 1 + Option 2 + Option 3 + + Option 4 + Option 5 + Option 6 + +``` + +### Size + +Use the `size` attribute to change a select's size. + +```html preview + + Option 1 + Option 2 + Option 3 + + +
    + + + Option 1 + Option 2 + Option 3 + + +
    + + + Option 1 + Option 2 + Option 3 + +``` + +### Pill + +Use the `pill` prop to give selects rounded edges. + +```html preview + + Option 1 + Option 2 + Option 3 + +``` + +### Groups + +Options can be grouped visually using menu labels and menu dividers. + +```html preview + + Group 1 + Option 1 + Option 2 + Option 3 + + Group 2 + Option 4 + Option 5 + Option 6 + +``` + +### Disabled + +Use the `disabled` prop to disable a select. + +```html preview + + Option 1 + Option 2 + Option 3 + +``` + +### Validation + +Show a valid or invalid state by setting the `valid` and `invalid` attributes, respectively. Help text can be used to provide feedback for validation and will be styled accordingly. + +```html preview + + Option 1 + Option 2 + Option 3 + +
    This is a valid selection!
    +
    + +
    + + + Option 1 + Option 2 + Option 3 + +
    This is not a valid selection!
    +
    +``` + +[component-metadata:sl-select] diff --git a/docs/components/spinner.md b/docs/components/spinner.md new file mode 100644 index 00000000..7afc36d4 --- /dev/null +++ b/docs/components/spinner.md @@ -0,0 +1,39 @@ +# Spinner + +[component-header:sl-spinner] + +Spinners are used to show the progress of an indeterminate operation. + +```html preview + +``` + +## Examples + +### Size + +Spinners are sized relative to the current font size. To change their size, set the `font-size` property on the spinner itself or on a parent element as shown below. + +```html preview + + + +``` + +### Stroke Width + +The width of the spinner can be changed by setting the `--stroke-width` custom property. + +```html preview + +``` + +### Color + +The spinner's color can be changed by setting the `--color` custom property. + +```html preview + +``` + +[component-metadata:sl-spinner] diff --git a/docs/components/switch.md b/docs/components/switch.md new file mode 100644 index 00000000..f919a874 --- /dev/null +++ b/docs/components/switch.md @@ -0,0 +1,32 @@ +# Switch + +[component-header:sl-switch] + +Switches allow the user to toggle an option on or off. + +```html preview +Switch +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Checked + +Use the `checked` attribute to activate the switch. + +```html preview +Checked +``` + +### Disabled + +Use the `disabled` attribute to disable the switch. + +```html preview +Disabled +``` + + +[component-metadata:sl-switch] diff --git a/docs/components/tab-group.md b/docs/components/tab-group.md new file mode 100644 index 00000000..3548d951 --- /dev/null +++ b/docs/components/tab-group.md @@ -0,0 +1,129 @@ +# Tab Group + +[component-header:sl-tab-group] + +Tab groups organize content into a container that shows one section at a time. + +Tab groups make use of [tabs](/components/tab.md) and [tab panels](/components/tab-panel.md). Each tab must be slotted into the `nav` slot and its `panel` must refer to a tab panel of the same name. + +```html preview + + General + Custom + Advanced + Disabled + + This is the general tab panel. + This is the custom tab panel. + This is the advanced tab panel. + This is a disabled tab panel. + +``` + +## Examples + +### Tabs on Bottom + +Tabs can be shown on the bottom by setting `placement` to `bottom`. + +```html preview + + General + Custom + Advanced + Disabled + + This is the general tab panel. + This is the custom tab panel. + This is the advanced tab panel. + This is a disabled tab panel. + +``` + +### Tabs on Left + +Tabs can be shown on the left by setting `placement` to `left`. + +```html preview + + General + Custom + Advanced + Disabled + + This is the general tab panel. + This is the custom tab panel. + This is the advanced tab panel. + This is a disabled tab panel. + +``` + +### Tabs on Right + +Tabs can be shown on the right by setting `placement` to `right`. + +```html preview + + General + Custom + Advanced + Disabled + + This is the general tab panel. + This is the custom tab panel. + This is the advanced tab panel. + This is a disabled tab panel. + +``` + +### Scrolling Tabs + +When there are more tabs than horizontal space allows, the nav will be scrollable. + +```html preview + + Tab 1 + Tab 2 + Tab 3 + Tab 4 + Tab 5 + Tab 6 + Tab 7 + Tab 8 + Tab 9 + Tab 10 + Tab 11 + Tab 12 + Tab 13 + Tab 14 + Tab 15 + Tab 16 + Tab 17 + Tab 18 + Tab 19 + Tab 20 + + Tab panel 1 + Tab panel 2 + Tab panel 3 + Tab panel 4 + Tab panel 5 + Tab panel 6 + Tab panel 7 + Tab panel 8 + Tab panel 9 + Tab panel 10 + Tab panel 11 + Tab panel 12 + Tab panel 13 + Tab panel 14 + Tab panel 15 + Tab panel 16 + Tab panel 17 + Tab panel 18 + Tab panel 19 + Tab panel 20 + +``` + +[component-metadata:sl-tab-group] diff --git a/docs/components/tab-panel.md b/docs/components/tab-panel.md new file mode 100644 index 00000000..bc69b23e --- /dev/null +++ b/docs/components/tab-panel.md @@ -0,0 +1,23 @@ +# Tab Panel + +[component-header:sl-tab-panel] + +Tab panels are used inside tab groups to display content. + +```html preview + + General + Custom + Advanced + Disabled + + This is the general tab panel. + This is the custom tab panel. + This is the advanced tab panel. + This is a disabled tab panel. + +``` + +?> Additional demonstrations can be found in the [tab group examples](/components/tab-group.md). + +[component-metadata:sl-tab-panel] diff --git a/docs/components/tab.md b/docs/components/tab.md new file mode 100644 index 00000000..0a4db0a1 --- /dev/null +++ b/docs/components/tab.md @@ -0,0 +1,15 @@ +# Tab + +[component-header:sl-tab] + +Tabs are used inside tab groups to represent tab panels. + +```html preview +Tab +Active +Disabled +``` + +?> Additional demonstrations can be found in the [tab group examples](/components/tab-group.md). + +[component-metadata:sl-tab] diff --git a/docs/components/tag.md b/docs/components/tag.md new file mode 100644 index 00000000..5a2642a2 --- /dev/null +++ b/docs/components/tag.md @@ -0,0 +1,47 @@ +# Tag + +[component-header:sl-tag] + +Tags are used as labels to organize things or to indicate a selection. + +```html preview +Primary +Success +Info +Warning +Danger +``` + +## Examples + +### Size + +Use the `size` prop to change a tab's size. + +```html preview +Small +Medium +Large +``` + +### Pill + +Use the `pill` prop to give tabs rounded edges. + +```html preview +Small +Medium +Large +``` + +### Clearable + +Use the `clearable` attribute to add a clear button to the tag. + +```html preview +Small +Medium +Large +``` + +[component-metadata:sl-tag] diff --git a/docs/components/textarea.md b/docs/components/textarea.md new file mode 100644 index 00000000..aec02a0d --- /dev/null +++ b/docs/components/textarea.md @@ -0,0 +1,89 @@ +# Textarea + +[component-header:sl-textarea] + +Textareas collect data from the user and allow multiple lines of text. + +```html preview + +``` + +?> This component doesn't work with standard forms. Use [``](/components/form.md) instead. + +## Examples + +### Labels + +Use the `label` attribute to give the textarea an accessible label. + +```html preview + +``` + +### Help Text + +Add descriptive help text to a textarea with the `help-text` slot. + +```html preview + +
    Please tell us what you think.
    +
    +``` + +### Rows + +Use the `rows` attribute to change the number of text rows that get shown. + +```html preview + +``` + +### Placeholders + +Use the `placeholder` attribute to add a placeholder. + +```html preview + +``` + +### Disabled + +Use the `disabled` attribute to disable an input. + +```html preview + +``` + +### Validation + +Show a valid or invalid state by setting the `valid` and `invalid` attributes, respectively. Help text can be used to provide feedback for validation and will be styled accordingly. + +```html preview + +
    This is a valid textarea.
    +
    + +
    + + +
    This is an invalid textarea.
    +
    +``` + +### Prevent Resizing + +By default, textareas can be resized vertically by the user. To prevent resizing, set the `resize` attribute to `none`. + +```html preview + +``` + +### Expand with Content + +Textareas will automatically resize to expand to fit their content when `resize` is set to `auto`. + +```html preview + +``` + +[component-metadata:sl-textarea] diff --git a/docs/components/tooltip.md b/docs/components/tooltip.md new file mode 100644 index 00000000..6d9c5545 --- /dev/null +++ b/docs/components/tooltip.md @@ -0,0 +1,166 @@ +# Tooltip + +[component-header:sl-tooltip] + +Tooltips display additional information based on a specific action. + +A tooltip's target is its _first child element_, so you should only wrap one element inside of the tooltip. If you need the tooltip to show up for multiple elements, nest them inside a container first. + +Tooltip's use `display: contents` so they won't interfere with how elements are positioned in a flex or grid layout. + +```html preview + + Hover Me + +``` + +## Examples + +### Placement + +Use the `placement` attribute to set the preferred placement of the tooltip. + +```html preview +
    +
    + + + + + + + + + + + +
    + +
    + + + + + + + +
    + +
    + + + + + + + +
    + +
    + + + + + + + +
    + +
    + + + + + + + + + + + +
    +
    + + +``` + +### Click Trigger + +Set the `trigger` attribute to `click` to toggle the tooltip on click instead of hover. + +```html preview + + Click to Toggle + +``` + +### Manual Trigger + +Tooltips can be controller programmatically by setting the `trigger` attribute to `manual`. Use the `open` prop to control when the tooltip is shown. + +```html preview +Toggle Manually + + + + + + +``` + +### Remove Arrows + +You can control the size of tooltip arrows by overriding the `--sl-tooltip-arrow-size` design token. + +```html preview +
    + + Above + + + + Below + +
    +``` + +To override it globally, set it in a root block in your stylesheet after `shoelace.css` is loaded. + +```css +:root { + --sl-tooltip-arrow-size: 0; +} +``` + + +[component-metadata:sl-tooltip] diff --git a/docs/getting-started/customizing.md b/docs/getting-started/customizing.md new file mode 100644 index 00000000..21d63550 --- /dev/null +++ b/docs/getting-started/customizing.md @@ -0,0 +1,123 @@ +# Customizing + +Shoelace components can be customized at a high level through design tokens. This gives you control over theme colors and general styling. For more advanced customizations, you can make use of component parts and custom properties to target individual components. + +## Design Tokens + +Shoelace makes use of several design tokens to provide a consistent appearance across components. You can customize them and use them in your own application with pure CSS โ€” no preprocessor required. + +Design tokens offer a high-level way to customize the library with minimal effort. There are no component-specific variables, however, as design tokens are intended to be generic and highly reusable. To customize an individual component, refer to the section entitled [Component parts](#component-parts). + +Design tokens are CSS custom properties ("CSS variables") that are defined in the `:root` block of `shoelace.css`. This stylesheet is imported when you install Shoelace, so design tokens are available on your page at that point. Because design tokens are global, they're always prefixed with `--sl` to avoid collisions with other libraries. + +To customize a design token, simply override it in your stylesheet using a `:root` block. + +```css +:root { + /* Changes the primary color to a shade of orange at 90% saturation */ + --sl-color-primary-hue: 30; + --sl-color-primary-saturation: 90%; +} +``` + +Design tokens are described further along in this documentation. For a complete list, refer to `shoelace.scss` in the project's [source code](https://github.com/shoelace-style/shoelace/blob/master/src/styles/shoelace.scss). + +!> **Never modify variables directly in `shoelace.css`** because your changes will be overwritten when you upgrade the library. Even if you don't plan on upgrading, it's always better to override design tokens in your own stylesheet for better maintainability. + +## Component Parts + +Whereas design tokens offer a high-level way to customize the library, component parts offer a low-level way to customize individual components. Again, this is done with pure CSS โ€” no preprocessor required. + +Shoelace components use a [shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) to encapsulate their styles and behaviors. As a result, you can't simply target their internals with the usual CSS selectors. Instead, components expose "parts" that can be targetted with the [CSS part selector](https://developer.mozilla.org/en-US/docs/Web/CSS/::part), or `::part()`. + +Here's an example that modifies buttons with the `tomato-button` class. + +```html preview + + Tomato Button + + + +``` + +At first glance, this approach might seem a bit verbose or even limiting, but it comes with a few important advantages: + +- Customizations can be made to components with explicit selectors, such as `::part(icon)`, rather than implicit selectors, such as `.button > div > span + .icon`, that are much more fragile. + +- The internal structure of a component will likely change as it evolves. By exposing component parts through an API, the internals can be reworked without fear of breaking customizations as long as its parts remain intact. + +- It encourages us to think more about how components are designed and how customizations should be allowed before usersย can take advantage of them. Once we opt a part into the component's API, it's guaranteed to be supported and can't be removed until a major version of the library is released. + +Most (but not all) components expose parts. You can find them in each component's API documention under the "CSS Parts" section. + +### Custom Properties + +For convenience, some components expose CSS custom properties you can override. These are not design tokens, nor do they have the same `--sl-` prefix since they're scoped to a component. + +You can set custom properties on a component in your stylesheet. + +```css +sl-avatar { + --size: 6rem; +} +``` + +This will also work if you need to target a subset of components with a specific class. + +```css +sl-avatar.your-class { + --size: 6rem; +} +``` + +Alternatively, you can set them inline directly on the element. + +```html + +``` + +Not all components expose CSS custom properties. For those that do, they can be found in the component's API documentation. + +## Writing a Theme + +Customizing Shoelace is fairly easy, but you can take things a step further and create a full-blown theme if you want. A theme is nothing more than a stylesheet that uses the APIs described above to customize Shoelace's design tokens and components. + +It's a good practice to include `shoelace.css` in your app and add your theme's stylesheet directly below it. That way, when an update introduces a new design token, your theme will still work with the default design token value. + +### Submitting a Theme + +**I am very interested in offering well-designed themes to complement this library.** To submit a theme for review, please open an issue on GitHub with the theme attached. Once approved, your theme will be showcased in the project's documentation (that section is coming soon). + +Themes that are in high demand include: + +- Dark mode ([details](https://github.com/shoelace-style/shoelace/issues/98)) +- High contrast ([details](https://github.com/shoelace-style/shoelace/issues/99)) + +**I am willing to contribute a minimum of $200 USD to commission each of the themes listed above.** + +Please note the following requirements before submitting a theme. + +- Themes must be complete and of high quality +- Themes must be available under the same open source license as Shoelace +- If a theme is not original, the derivative work must have a license that is compatible with Shoelace's license diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 00000000..3c3c39e8 --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,35 @@ +# Installation + +You can use Shoelace via CDN or by installing it locally. + +## CDN Installation (Recommended) + +The easiest way to install Shoelace is with the CDN. A lightweight loader will be added to your page that registers components asynchronously as you use them. It's like magic. โœจ + +Just add the following tags to your page. + +```html + + +``` + +Now you can [start using Shoelace components!](/getting-started/usage.md) + +## Local Installation + +If you don't want to use the CDN, you can install Shoelace locally with the following command. + +```sh +npm install @shoelace-style/shoelace +``` + +It's up to you to make the source files available to your app. One way to do this is to create a route in your app called `/assets/shoelace` that serves static files from `node_modules/@shoelace-style/shoelace`. + +Once you've done that, add the following tags to your page. Make sure to update `href` and `src` so they point to the route you created. + +```html + + +``` + +Now you can [start using Shoelace components!](/getting-started/usage.md) diff --git a/docs/getting-started/overview.md b/docs/getting-started/overview.md new file mode 100644 index 00000000..36526f32 --- /dev/null +++ b/docs/getting-started/overview.md @@ -0,0 +1,107 @@ + + +A forward-thinking library of web components. + +- Works with all frameworks ๐Ÿงฉ +- Works with CDNs ๐Ÿš› +- Fully customizable with CSS ๐ŸŽจ +- Open source ๐Ÿ˜ธ + +Designed in New Hampshire by [Cory LaViska](https://twitter.com/claviska). + +## Quick Start + +Add the following code to your page. + +```html + + +``` + +Now you have access to all of Shoelace's components! Try adding a button: + +```html +Click me +``` + +See the [installation instructions](getting-started/installation.md) for more details and other ways to install Shoelace. + +## New to Web Components? + +**TL;DR** โ€“ย we finally have a way to create [our own HTML elements](https://html.spec.whatwg.org/multipage/custom-elements.html) and use them in any framework we want! + +Thanks to the popularity of frameworks such as Angular, Vue, and React, component-driven development has become a part of our every day lives. Components help us encapsulate styles and behaviors into reusable building blocks. They make a lot of sense in terms of design, development, and testing. + +Unfortunately, _framework-specific_ components fail us in a number of ways: + +- You can only use them in the framework they're designed for ๐Ÿ”’ +- Their lifespan is limited to that of the framework's โณ +- New framework versions can lead to breaking changes, requiring substantial effort to update components ๐Ÿ˜ญ + +Web components solve these problems. They're [supported by all modern browsers](https://caniuse.com/#feat=custom-elementsv1), they're framework-agnostic, and they're [part of the standard](https://developer.mozilla.org/en-US/docs/Web/Web_Components), so we know they'll be supported for many years to come. + +This is the technology that Shoelace is built on. + +## What Problems Does This Solve? + +Shoelace provides a collection of professionally designed, every day UI components built on a framework-agnostic technology. Why spend hundreds of hours or more building a design system from scratch? Why make a component library that only works with one framework? + +With Shoelace, you can: + +- Start building things faster (no need to roll your own buttons) +- Build multiple apps with different frameworks that all share the same UI +- Skip having to learn a new component library every time you switch frameworks + +If your organization is looking to build a design system, [Shoelace will save you thousands of dollars](https://medium.com/eightshapes-llc/and-you-thought-buttons-were-easy-26eb5b5c1871).* All the foundational components you need are right here, ready to be customized for your brand. And since it's built on web standards, browsers will continue to support it for many years to come. + +Whether you use Shoelace as a starting point for your organization's design system or for a fun personal project, there's no limit to what you can do with it. + +*Please consider giving back some of what you save by [supporting this project with a sponsorship](https://github.com/sponsors/claviska). + +## Browser Support + +Shoelace is tested in the latest two versions of the following browsers. + +Chrome +Edge +Firefox +Opera +Safari + +Critical bug fixes in earlier versions will be addressed based on their severity and impact. + +If you need to support IE11 or pre-Chromium Edge, this library isn't for you. Although web components can (to some degree) be polyfilled for legacy browsers, supporting them is outside the scope of this project. If you're using Shoelace in such a browser, you're gonna have a bad time. โ›ท + +## License + +Shoelace is designed in New Hampshire by [Cory LaViska](https://twitter.com/claviska). It's available under the terms of the MIT license. + +Designing, developing, and supporting this library requires a lot of time, effort, and skill. I'd like to keep it open source so everyone can use it, but that doesn't provide me with any income. + +**Therefore, if you're using my software to make a profit,** I respectfully ask that you help [fund its development](https://github.com/sponsors/claviska) by becoming a sponsor. There are multiple tiers to choose from with benefits at every level, including prioritized support, bug fixes, feature requests, and advertising. + +๐Ÿ‘‡ Your support is very much appreciated! ๐Ÿ‘‡ + + + Become a sponsor + + + + Star + + + + +## Attribution + +Special thanks to the following projects and individuals that helped make Shoelace possible. + +- Components are compiled by [Stencil](https://stenciljs.com/) +- Documentation is powered by [Docsify](https://docsify.js.org/) +- Theme colors and form controls are inspired by [Element](element.eleme.io) +- Icons are courtesy of [Bootstrap Icons](https://icons.getbootstrap.com/) +- Positioning of menus, tooltips, et al is handled by [Popper.js](https://popper.js.org/) +- CDN services are provided by [unpkg](https://unpkg.com/) +- The Shoelace logo was designed with a single shoelace by [Adam K Olson](https://twitter.com/adamkolson) diff --git a/docs/getting-started/roadmap.md b/docs/getting-started/roadmap.md new file mode 100644 index 00000000..e9db1c88 --- /dev/null +++ b/docs/getting-started/roadmap.md @@ -0,0 +1,41 @@ +# Roadmap + +The roadmap tracks the status of components and features that are planned for development. + +## 2.1 ๐Ÿค” + +Version 2.1 is still in the planning phase. To request a feature, please [submit an issue](https://github.com/shoelace-style/shoelace/issues) on GitHub. Make sure to search for existing issues and vote using ๐Ÿ‘ to add your support! + +?> Is there a feature you really want to see here? Sponsoring Shoelace is the best way to prioritize its development. [Learn more](https://github.com/sponsors/claviska) + +## 2.0 ๐Ÿš€ + +- [x] Alert +- [x] Avatar +- [x] Button +- [x] Checkbox +- [x] Color Picker +- [x] Details +- [x] Dialog +- [x] Drawer +- [x] Dropdown +- [x] Form +- [x] Icon +- [x] Input +- [x] Menu + - [x] Menu Divider + - [x] Menu Item + - [x] Menu Label +- [x] Progress Bar +- [x] Progress Ring +- [x] Radio +- [x] Range +- [x] Select +- [x] Spinner +- [x] Switch +- [x] Tab Group + - [x] Tab + - [x] Tab Panel +- [x] Tag +- [x] Textarea +- [x] Tooltip diff --git a/docs/getting-started/usage.md b/docs/getting-started/usage.md new file mode 100644 index 00000000..1a705019 --- /dev/null +++ b/docs/getting-started/usage.md @@ -0,0 +1,220 @@ +# Usage + +Shoelace components are just regular HTML elements, or "custom elements" to be precise. You can use them like any other element. Each component has detailed documentation that describes its full API, including properties, events, methods, and more. + +## Web Component Basics + +### Properties + +Many components have properties ("props") that can be set using attributes. For example, buttons accept a `size` attribute that dictates the button's size. + +```html +Click me +``` + +Some props are booleans, so they only have true/false values. To activate a boolean prop, add the corresponding attribute without a value. + +```html +Click me +``` + +In rare cases, a prop may require an array, an object, or a function. For example, to customize the color picker's list of preset swatches, you set the `swatches` prop to an array of colors. This can be done with JavaScript. + +```html + + + +``` + +Refer to a component's documentation for a complete list of its properties. + +### Events + +You can listen for standard events such as `click`, `mouseover`, etc. as you normally would. In addition, some components emit custom events. These work the same way as standard events, but are prefixed with `sl` to prevent collisions with standard events and other libraries. + +```html +Check me + + +``` + +Refer to a component's documentation for a complete list of its custom events. + +### Methods + +Some components have methods you can call to trigger various behaviors. For example, you can set focus on a Shoelace input using the `setFocus()` method. + +```html + + + +``` + +Refer to a component's documentation for a complete list of its methods and their arguments. + +### Slots + +Many components use slots to accept content inside of them. The most common slot is the _default_ slot, which includes any content inside the component that doesn't have a `slot` attribute. + +For example, a button's default slot is used to populate its label. + +```html +Click me +``` + +Some components also have _named_ slots. A named slot can be populated by adding a child element with the appropriate `slot` attribute. Notice how the icon below has the `slot="prefix"` attribute? This tells the component to place the icon into its `prefix` slot. + +```html + + + Settings + +``` + +The location of a named slot doesn't matter. You can put it anywhere inside the component and the browser will move it to the right place automatically! + +Refer to a component's documentation for a complete list of available slots. + +### Don't Use Self-closing Tags + +Custom elements cannot have self-closing tags. Similar to ` + + + + + + +
    + + + + + + + + + + + + + diff --git a/docs/tokens/border-radius.md b/docs/tokens/border-radius.md new file mode 100644 index 00000000..845e3945 --- /dev/null +++ b/docs/tokens/border-radius.md @@ -0,0 +1,12 @@ +# Border Radius Tokens + +Border radius tokens are used to give sharp edges a more subtle, rounded effect. They use rem units so they scale with the base font size. The pixel values displayed are based on a 16px font size. + +| Token | Value | Example | +| ---------------------------- | -------------- | -------------------------------------------------------------------------------------------------------- | +| `--sl-border-radius-small` | 0.125rem (2px) |
    | +| `--sl-border-radius-medium` | 0.25rem (4px) |
    | +| `--sl-border-radius-large` | 0.5rem (8px) |
    | +| `--sl-border-radius-x-large` | 1rem (16px) |
    | +| `--sl-border-radius-circle` | 50% |
    | +| `--sl-border-radius-pill` | 9999px |
    | diff --git a/docs/tokens/color.md b/docs/tokens/color.md new file mode 100644 index 00000000..1ec32d2f --- /dev/null +++ b/docs/tokens/color.md @@ -0,0 +1,165 @@ +# Color Tokens + +Color tokens are used to maintain consistent color use throughout your app. + +## Theme Colors + +Theme colors are based on HSL values rather than hex or RGB. This technique lets us generate more consistent palettes for every theme color, ranging from 5% to 95% lightness. There are no 0% or 100% values for theme colors. Use `--sl-color-black` and `--sl-color-white` instead. + +Theme colors include primary, gray, success, info, warning, and danger. They are used extensively throughout the library to maintain a consistent appearance across components. + +To customize a theme color, change its respective hue, saturation, and text tokens. This will update all colors in the palette โ€” there's no need to update individual palette colors. In fact, doing so is strongly discouraged. + +```css +--sl-color-primary-hue: 203; +--sl-color-primary-saturation: 100%; +--sl-color-primary-text: var(--sl-color-white); +``` + +?> Color palettes are comprised of CSS custom properties ("CSS variables"), so you can update them live in your app and see the changes reflect instantly. + +## Primary + +| Token | Example | +| ----------------------- | ------------------------------------------------------------------------------------ | +| `--sl-color-primary-5` |
    | +| `--sl-color-primary-10` |
    | +| `--sl-color-primary-15` |
    | +| `--sl-color-primary-20` |
    | +| `--sl-color-primary-25` |
    | +| `--sl-color-primary-30` |
    | +| `--sl-color-primary-35` |
    | +| `--sl-color-primary-40` |
    | +| `--sl-color-primary-45` |
    | +| `--sl-color-primary-50` |
    | +| `--sl-color-primary-55` |
    | +| `--sl-color-primary-60` |
    | +| `--sl-color-primary-65` |
    | +| `--sl-color-primary-70` |
    | +| `--sl-color-primary-75` |
    | +| `--sl-color-primary-80` |
    | +| `--sl-color-primary-85` |
    | +| `--sl-color-primary-90` |
    | +| `--sl-color-primary-95` |
    | + +## Gray + +| Token | Example | +| -------------------- | --------------------------------------------------------------------------------- | +| `--sl-color-black` |
    | +| `--sl-color-gray-5` |
    | +| `--sl-color-gray-10` |
    | +| `--sl-color-gray-15` |
    | +| `--sl-color-gray-20` |
    | +| `--sl-color-gray-25` |
    | +| `--sl-color-gray-30` |
    | +| `--sl-color-gray-35` |
    | +| `--sl-color-gray-40` |
    | +| `--sl-color-gray-45` |
    | +| `--sl-color-gray-50` |
    | +| `--sl-color-gray-55` |
    | +| `--sl-color-gray-60` |
    | +| `--sl-color-gray-65` |
    | +| `--sl-color-gray-70` |
    | +| `--sl-color-gray-75` |
    | +| `--sl-color-gray-80` |
    | +| `--sl-color-gray-85` |
    | +| `--sl-color-gray-90` |
    | +| `--sl-color-gray-95` |
    | +| `--sl-color-white` |
    | + +## Success + +| Token | Example | +| ----------------------- | ------------------------------------------------------------------------------------ | +| `--sl-color-success-5` |
    | +| `--sl-color-success-10` |
    | +| `--sl-color-success-15` |
    | +| `--sl-color-success-20` |
    | +| `--sl-color-success-25` |
    | +| `--sl-color-success-30` |
    | +| `--sl-color-success-35` |
    | +| `--sl-color-success-40` |
    | +| `--sl-color-success-45` |
    | +| `--sl-color-success-50` |
    | +| `--sl-color-success-55` |
    | +| `--sl-color-success-60` |
    | +| `--sl-color-success-65` |
    | +| `--sl-color-success-70` |
    | +| `--sl-color-success-75` |
    | +| `--sl-color-success-80` |
    | +| `--sl-color-success-85` |
    | +| `--sl-color-success-90` |
    | +| `--sl-color-success-95` |
    | + +## Info + +| Token | Example | +| -------------------- | --------------------------------------------------------------------------------- | +| `--sl-color-info-5` |
    | +| `--sl-color-info-10` |
    | +| `--sl-color-info-15` |
    | +| `--sl-color-info-20` |
    | +| `--sl-color-info-25` |
    | +| `--sl-color-info-30` |
    | +| `--sl-color-info-35` |
    | +| `--sl-color-info-40` |
    | +| `--sl-color-info-45` |
    | +| `--sl-color-info-50` |
    | +| `--sl-color-info-55` |
    | +| `--sl-color-info-60` |
    | +| `--sl-color-info-65` |
    | +| `--sl-color-info-70` |
    | +| `--sl-color-info-75` |
    | +| `--sl-color-info-80` |
    | +| `--sl-color-info-85` |
    | +| `--sl-color-info-90` |
    | +| `--sl-color-info-95` |
    | + +## Warning + +| Token | Example | +| ----------------------- | ------------------------------------------------------------------------------------ | +| `--sl-color-warning-5` |
    | +| `--sl-color-warning-10` |
    | +| `--sl-color-warning-15` |
    | +| `--sl-color-warning-20` |
    | +| `--sl-color-warning-25` |
    | +| `--sl-color-warning-30` |
    | +| `--sl-color-warning-35` |
    | +| `--sl-color-warning-40` |
    | +| `--sl-color-warning-45` |
    | +| `--sl-color-warning-50` |
    | +| `--sl-color-warning-55` |
    | +| `--sl-color-warning-60` |
    | +| `--sl-color-warning-65` |
    | +| `--sl-color-warning-70` |
    | +| `--sl-color-warning-75` |
    | +| `--sl-color-warning-80` |
    | +| `--sl-color-warning-85` |
    | +| `--sl-color-warning-90` |
    | +| `--sl-color-warning-95` |
    | + +## Danger + +| Token | Example | +| ---------------------- | ----------------------------------------------------------------------------------- | +| `--sl-color-danger-5` |
    | +| `--sl-color-danger-10` |
    | +| `--sl-color-danger-15` |
    | +| `--sl-color-danger-20` |
    | +| `--sl-color-danger-25` |
    | +| `--sl-color-danger-30` |
    | +| `--sl-color-danger-35` |
    | +| `--sl-color-danger-40` |
    | +| `--sl-color-danger-45` |
    | +| `--sl-color-danger-50` |
    | +| `--sl-color-danger-55` |
    | +| `--sl-color-danger-60` |
    | +| `--sl-color-danger-65` |
    | +| `--sl-color-danger-70` |
    | +| `--sl-color-danger-75` |
    | +| `--sl-color-danger-80` |
    | +| `--sl-color-danger-85` |
    | +| `--sl-color-danger-90` |
    | +| `--sl-color-danger-95` |
    | diff --git a/docs/tokens/elevation.md b/docs/tokens/elevation.md new file mode 100644 index 00000000..f4c30c43 --- /dev/null +++ b/docs/tokens/elevation.md @@ -0,0 +1,11 @@ +# Elevation Tokens + +Elevation tokens are used to give elements the appearance of being raised off the page. Use them with the `box-shadow` property. These are especially useful for menus, popovers, and dialogs. + +| Token | Example | +| --------------------- | -------------------------------------------------------------------------------- | +| `--sl-shadow-x-small` |
    | +| `--sl-shadow-small` |
    | +| `--sl-shadow-medium` |
    | +| `--sl-shadow-large` |
    | +| `--sl-shadow-x-large` |
    | diff --git a/docs/tokens/spacing.md b/docs/tokens/spacing.md new file mode 100644 index 00000000..4376cb61 --- /dev/null +++ b/docs/tokens/spacing.md @@ -0,0 +1,16 @@ +# Spacing Tokens + +Spacing tokens are used to provide consistent spacing between components and content throughout your app. + +| Token | Value | Example | +| ------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------- | +| `--sl-spacing-xxx-small` | 0.125rem (2px) |
    | +| `--sl-spacing-xx-small` | 0.25rem (4px) |
    | +| `--sl-spacing-x-small` | 0.5rem (8px) |
    | +| `--sl-spacing-small` | 0.75rem (12px) |
    | +| `--sl-spacing-medium` | 1rem (16px) |
    | +| `--sl-spacing-large` | 1.25rem (20px) |
    | +| `--sl-spacing-x-large` | 1.75rem (28px) |
    | +| `--sl-spacing-xx-large` | 2.25rem (36px) |
    | +| `--sl-spacing-xxx-large` | 3rem (48px) |
    | +| `--sl-spacing-xxxx-large` | 4.5rem (72px) |
    | diff --git a/docs/tokens/transition.md b/docs/tokens/transition.md new file mode 100644 index 00000000..f45b2e03 --- /dev/null +++ b/docs/tokens/transition.md @@ -0,0 +1,11 @@ +# Transition Tokens + +Transition tokens are used to provide consistent transitions throughout your app. + +| Token | Value | Example | +| ------------------------ | ------ | --------------------------------------------------------------------------------------------- | +| `--sl-transition-x-slow` | 1000ms |
    | +| `--sl-transition-slow` | 500ms |
    | +| `--sl-transition-medium` | 250ms |
    | +| `--sl-transition-fast` | 150ms |
    | +| `--sl-transition-x-fast` | 50ms |
    | diff --git a/docs/tokens/typography.md b/docs/tokens/typography.md new file mode 100644 index 00000000..10d98986 --- /dev/null +++ b/docs/tokens/typography.md @@ -0,0 +1,54 @@ +# Typography Tokens + +Typography tokens are used to maintain a consistent set of font styles throughout your app. + +## Font Family + +The default font stack is designed to be simple and highly available on as many devices as possible. + +| Token | Value | Example | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `--sl-font-sans` | -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' | The quick brown fox jumped over the lazy dog. | +| `--sl-font-serif` | Georgia, 'Times New Roman', serif | The quick brown fox jumped over the lazy dog. | +| `--sl-font-mono` | Menlo, Monaco, 'Courier New', monospace | The quick brown fox jumped over the lazy dog. | + +## Font Size + +Font sizes use `rem` units so they scale with the base font size. The pixel values displayed are based on a 16px font size. + +| Token | Value | Example | +| --------------------------- | --------------- | ----------------------------------------------------------------- | +| `--sl-font-size-xx-small` | 0.625rem (10px) | Aa | +| `--sl-font-size-x-small` | 0.75rem (12px) | Aa | +| `--sl-font-size-small` | 0.875rem (14px) | Aa | +| `--sl-font-size-medium` | 1rem (16px) | Aa | +| `--sl-font-size-large` | 1.25rem (20px) | Aa | +| `--sl-font-size-x-large` | 1.5rem (24px) | Aa | +| `--sl-font-size-xx-large` | 2.25rem (36px) | Aa | +| `--sl-font-size-xxx-large` | 3rem (48px) | Aa | +| `--sl-font-size-xxxx-large` | 4.5rem (72px) | Aa | + +## Font Weight + +| Token | Value | Example | +| --------------------------- | ----- | --------------------------------------------------------------------------------------------------------------- | +| `--sl-font-weight-light` | 300 | The quick brown fox jumped over the lazy dog. | +| `--sl-font-weight-normal` | 400 | The quick brown fox jumped over the lazy dog. | +| `--sl-font-weight-semibold` | 500 | The quick brown fox jumped over the lazy dog. | +| `--sl-font-weight-bold` | 700 | The quick brown fox jumped over the lazy dog. | + +## Letter Spacing + +| Token | Value | Example | +| ---------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | +| `--sl-letter-spacing-dense` | -0.015em | The quick brown fox jumped over the lazy dog. | +| `--sl-letter-spacing-normal` | normal | The quick brown fox jumped over the lazy dog. | +| `--sl-letter-spacing-loose` | 0.075em | The quick brown fox jumped over the lazy dog. | + +## Line Height + +| Token | Value | Example | +| ------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--sl-line-height-dense` | 1.4 |
    The quick brown fox jumped over the lazy dog.
    The quick brown fox jumped over the lazy dog.
    The quick brown fox jumped over the lazy dog.
    | +| `--sl-line-height-normal` | 1.8 |
    The quick brown fox jumped over the lazy dog.
    The quick brown fox jumped over the lazy dog.
    The quick brown fox jumped over the lazy dog.
    | +| `--sl-line-height-loose` | 2.2 |
    The quick brown fox jumped over the lazy dog.
    The quick brown fox jumped over the lazy dog.
    The quick brown fox jumped over the lazy dog.
    | diff --git a/docs/tokens/z-index.md b/docs/tokens/z-index.md new file mode 100644 index 00000000..41d6f346 --- /dev/null +++ b/docs/tokens/z-index.md @@ -0,0 +1,10 @@ +# Z-Index Tokens + +Z-indexes are used to stack components in a logical manner. + +| Token | Value | +| ---------------------------- | ----- | +| `--sl-z-index-drawer` | 700 | +| `--sl-z-index-dialog` | 800 | +| `--sl-z-index-dropdown` | 900 | +| `--sl-z-index-tooltip` | 1000 | diff --git a/make-dist.js b/make-dist.js new file mode 100644 index 00000000..c72fcbd6 --- /dev/null +++ b/make-dist.js @@ -0,0 +1,14 @@ +const chalk = require('chalk'); +const copy = require('recursive-copy'); +const del = require('del'); + +(async () => { + try { + // Create the docs distribution + console.log(chalk.cyan('Creating docs distribution ๐Ÿ“š\n')); + await del('./docs/dist'); + await copy('./dist', './docs/dist'); + } catch (err) { + console.error(err); + } +})(); diff --git a/make-icons.js b/make-icons.js new file mode 100644 index 00000000..73e8ca2d --- /dev/null +++ b/make-icons.js @@ -0,0 +1,60 @@ +const Promise = require('bluebird'); +const promisify = require('util').promisify; +const chalk = require('chalk'); +const copy = require('recursive-copy'); +const del = require('del'); +const download = require('download'); +const fm = require('front-matter'); +const fs = require('fs').promises; +const glob = promisify(require('glob')); +const path = require('path'); + +let numIcons = 0; + +(async () => { + try { + const version = require('./node_modules/bootstrap-icons/package.json').version; + const srcPath = `./temp/icons-${version}`; + const url = `https://github.com/twbs/icons/archive/v${version}.zip`; + + // Download the source from GitHub (since not everything is published to NPM) + console.log(chalk.cyan(`\nDownloading and extracting Bootstrap Icons ${version}... ๐Ÿ“ฆ\n`)); + await del(['./src/components/icon/icons', './temp']); + await download(url, './temp', { extract: true }); + + // Copy icons + console.log(chalk.cyan(`Copying icons and license... ๐Ÿš›\n`)); + await Promise.all([ + copy(`${srcPath}/icons`, './src/components/icon/icons'), + copy(`${srcPath}/LICENSE.md`, './src/components/icon/icons/LICENSE.md'), + copy(`${srcPath}/bootstrap-icons.svg`, './docs/assets/icons/sprite.svg', { overwrite: true }) + ]); + + // Generate metadata + console.log(chalk.cyan(`Generating icon metadata... ๐Ÿท\n`)); + const files = await glob(`${srcPath}/docs/content/icons/**/*.md`); + + const metadata = await Promise.map(files, async file => { + const name = path.basename(file, path.extname(file)); + const data = fm(await fs.readFile(file, 'utf8')).attributes; + numIcons++; + + return { + name, + title: data.title, + categories: data.categories, + tags: data.tags + }; + }); + + await fs.writeFile('./src/components/icon/icons/icons.json', JSON.stringify(metadata, null, 2), 'utf8'); + + // More cleanup + console.log(chalk.cyan(`Cleaning up... ๐Ÿงน\n`)); + await del('./temp'); + + console.log(chalk.green(`Successfully processed ${numIcons} icons! โœจ\n`)); + } catch (err) { + console.error(err); + } +})(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..1164cf28 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7539 @@ +{ + "name": "@shoelace-style/shoelace", + "version": "2.0.0-beta.3", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", + "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", + "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + } + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.1.1.tgz", + "integrity": "sha512-sLqWxCzC5/QHLhziXSCAksBxHfOnQlhPRVgPK0egEw+ktWvG75T2k+aYWVjVh9+WKeT3tlG3ZNbZQvZLmfuOIw==" + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "@sphinxxxx/color-conversion": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" + }, + "@stencil/core": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-1.14.0.tgz", + "integrity": "sha512-3u3O8y8HIORiKuDmPowJiUu9nNmpxq4ak1kR3aVuWH6YTQ7+Uexy0dAxabn3CUoQmh6cpYsk9l5P5yIX2EQHoQ==", + "requires": { + "typescript": "3.9.3" + } + }, + "@stencil/eslint-plugin": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@stencil/eslint-plugin/-/eslint-plugin-0.3.1.tgz", + "integrity": "sha512-IcRseG06bdE36j28p7baLhLJapfGcYJG6p0aJhVWgh7TRcBNCReZEv6EGgYN6VX8j2LuH7LeFPXWHdA8ZZQylw==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "tsutils": "^3.0.0" + } + }, + "@stencil/sass": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@stencil/sass/-/sass-1.1.1.tgz", + "integrity": "sha512-Nny3JiFkpQa0RdXWCa4pzhKQYnHuDNzC9c4w35FcaZHXBVuZ1UHSHc7wI7By9SS1auYcySqpPOBVzgoCqXcYVQ==" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.6.tgz", + "integrity": "sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.28.0.tgz", + "integrity": "sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.28.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.28.0.tgz", + "integrity": "sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.28.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.28.0.tgz", + "integrity": "sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.28.0", + "@typescript-eslint/typescript-estree": "2.28.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.28.0.tgz", + "integrity": "sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dev": true, + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + } + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bootstrap-icons": { + "version": "1.0.0-alpha5", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.0.0-alpha5.tgz", + "integrity": "sha512-sQp4UESHOpN7UlkEUJmY4G8gmU4beTCv24azmOtN1vMSWTOuUZttB0269RD93JIjd4KmWb93MJaXjC6cAV5jiQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-sync": { + "version": "2.26.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz", + "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==", + "dev": true, + "requires": { + "browser-sync-client": "^2.26.6", + "browser-sync-ui": "^2.26.4", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^2.0.4", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "^3", + "localtunnel": "1.9.2", + "micromatch": "^3.1.10", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "0.7.17", + "yargs": "6.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "browser-sync-client": { + "version": "2.26.6", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.6.tgz", + "integrity": "sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + } + } + }, + "browser-sync-ui": { + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", + "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concurrently": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.1.0.tgz", + "integrity": "sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "date-fns": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", + "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "download": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", + "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", + "dev": true, + "requires": { + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "^3.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emitter-mixin": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/emitter-mixin/-/emitter-mixin-0.0.3.tgz", + "integrity": "sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.2.tgz", + "integrity": "sha512-AWjc1Xg06a6UPFOBAzJf48W1UR/qKYmv/ubgSCumo9GXgvL/xGIvo05dXoBL+2NTLMipDI7in8xK61C17L25xg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "eslint-plugin-react": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.0.tgz", + "integrity": "sha512-/5qB+Mb0m2bh86tjGbA8pB0qBfdmCIK6ZNPjcw4/TtEH0+tTf0wLA5HK4KMTweSMwLGHwBDWCBV+6+2+EuHmgg==", + "dev": true, + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-type": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", + "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", + "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.4.tgz", + "integrity": "sha512-8wiqujNWlsZNbeTSSWMLUl/u70xbJ5VYRwPR8RcAbvsNxzAZbgwLzRvT96btbm3fAitZUmo5i8LY6WKGyHDgvA==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.4", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "micromatch": "^4.0.2" + } + }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + } + } + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=", + "dev": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "localtunnel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", + "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==", + "dev": true, + "requires": { + "axios": "0.19.0", + "debug": "4.1.1", + "openurl": "1.1.1", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "dependencies": { + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "recursive-copy": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.10.tgz", + "integrity": "sha512-S9J9XJUnfZ2NUS3lK6lx6HWLl2nWui+f7AKuu+qoFs4ikEPYgZ3qKk1T6tmBnr7PzhtKnawE+6TREy9XQKmxCA==", + "dev": true, + "requires": { + "del": "^2.2.0", + "emitter-mixin": "0.0.3", + "errno": "^0.1.2", + "graceful-fs": "^4.1.4", + "junk": "^1.0.1", + "maximatch": "^0.1.0", + "mkdirp": "^0.5.1", + "pify": "^2.3.0", + "promise": "^7.0.1", + "slash": "^1.0.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", + "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dev": true, + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + } + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "object-path": "^0.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", + "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==" + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + } + }, + "workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", + "dev": true + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "dev": true, + "requires": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", + "dev": true + }, + "workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..4640954f --- /dev/null +++ b/package.json @@ -0,0 +1,78 @@ +{ + "name": "@shoelace-style/shoelace", + "version": "2.0.0-beta.3", + "description": "A forward-thinking library of web components.", + "main": "dist/index.js", + "module": "dist/index.mjs", + "es2015": "dist/esm/index.mjs", + "es2017": "dist/esm/index.mjs", + "types": "dist/types/index.d.ts", + "collection": "dist/collection/collection-manifest.json", + "collection:main": "dist/collection/index.js", + "files": [ + "dist/", + "loader/" + ], + "repository": { + "type": "git", + "url": "git://github.com/shoelace-style/shoelace.git" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/claviska" + }, + "scripts": { + "build": "stencil build --docs", + "dev": "stencil build --dev --docs --watch --serve --port 4001 --no-open", + "lint": "eslint src/**/*{.ts,.tsx}", + "make-dist": "node make-dist.js", + "make-icons": "node make-icons.js", + "prettier": "npx prettier --write --loglevel warn .", + "postbuild": "npm run make-dist", + "postinstall": "npm run make-icons", + "prebuild": "npm run prettier && npm run lint && npm run make-icons", + "serve": "node dev-server.js", + "start": "concurrently --kill-others \"npm run dev\" \"npm run serve\"", + "test.watch": "stencil test --spec --e2e --watchAll", + "test": "stencil test --spec --e2e", + "version": "npm run build" + }, + "devDependencies": { + "@stencil/eslint-plugin": "^0.3.1", + "@typescript-eslint/eslint-plugin": "^2.28.0", + "@typescript-eslint/parser": "^2.28.0", + "bluebird": "^3.7.2", + "bootstrap-icons": "^1.0.0-alpha5", + "browser-sync": "^2.26.7", + "chalk": "^4.0.0", + "concurrently": "^5.1.0", + "del": "^5.1.0", + "download": "^8.0.0", + "eslint": "^6.8.0", + "eslint-plugin-react": "^7.19.0", + "express": "^4.17.1", + "front-matter": "^4.0.2", + "glob": "^7.1.6", + "http-proxy": "^1.18.1", + "http-proxy-middleware": "^1.0.4", + "husky": "^4.2.5", + "prettier": "2.0.5", + "recursive-copy": "^2.0.10", + "through2": "^3.0.1", + "workbox-build": "4.3.1" + }, + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.1.1", + "@sphinxxxx/color-conversion": "^2.2.2", + "@stencil/core": "^1.14.0", + "@stencil/sass": "^1.1.1", + "color": "^3.1.2", + "resize-observer-polyfill": "^1.5.1" + }, + "husky": { + "hooks": { + "pre-commit": "npm run prettier && npm run lint" + } + } +} diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 00000000..08ed6805 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,17 @@ +module.exports = { + arrowParens: 'avoid', + bracketSpacing: true, + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + jsxBracketSameLine: false, + jsxSingleQuote: false, + printWidth: 120, + proseWrap: 'preserve', + quoteProps: 'as-needed', + requirePragma: false, + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + useTabs: false +}; diff --git a/src/components.d.ts b/src/components.d.ts new file mode 100644 index 00000000..1cc363a7 --- /dev/null +++ b/src/components.d.ts @@ -0,0 +1,2062 @@ +/* eslint-disable */ +/* tslint:disable */ +/** + * This is an autogenerated file created by the Stencil compiler. + * It contains typing information for all components that exist in this project. + */ +import { HTMLStencilElement, JSXBase } from "@stencil/core/internal"; +export namespace Components { + interface SlAlert { + /** + * Set to true to make the alert closable. + */ + "closable": boolean; + /** + * Hides the alert + */ + "hide": () => Promise; + /** + * Indicates whether or not the alert is open. You can use this in lieu of the show/hide methods. + */ + "open": boolean; + /** + * Shows the alert. + */ + "show": () => Promise; + /** + * The type of alert. + */ + "type": 'primary' | 'success' | 'info' | 'warning' | 'danger'; + } + interface SlAvatar { + /** + * Alternative text for the image. + */ + "alt": string; + /** + * The image source to use for the avatar. + */ + "image": string; + /** + * Initials to use as a fallback when no image is available (1-2 characters max recommended). + */ + "initials": string; + /** + * Initials to use as a fallback when no image is available (1-2 characters max recommended). + */ + "shape": 'circle' | 'square' | 'rounded'; + } + interface SlBadge { + /** + * The badge's type. + */ + "type": 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text'; + } + interface SlButton { + /** + * Set to true to draw the button with a caret for use with dropdowns, popovers, etc. + */ + "caret": boolean; + /** + * Set to true to draw a circle button. + */ + "circle": boolean; + /** + * Set to true to disable the button. + */ + "disabled": boolean; + /** + * Set to true to draw the button in a loading state. + */ + "loading": boolean; + /** + * An optional name for the button. + */ + "name": string; + /** + * Set to true to draw a pill-style button with rounded edges. + */ + "pill": boolean; + /** + * Removes focus from the button. + */ + "removeFocus": () => Promise; + /** + * Sets focus on the button. + */ + "setFocus": () => Promise; + /** + * The button's size. + */ + "size": 'small' | 'medium' | 'large'; + /** + * Indicates if activating the button should submit the form. + */ + "submit": boolean; + /** + * The button's type. + */ + "type": 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text'; + /** + * An optional value for the button. + */ + "value": string; + } + interface SlCheckbox { + /** + * Set to true to draw the checkbox in a checked state. + */ + "checked": boolean; + /** + * Set to true to disable the checkbox. + */ + "disabled": boolean; + /** + * Set to true to draw the checkbox in an indeterminate state. + */ + "indeterminate": boolean; + /** + * The checkbox's name attribute. + */ + "name": string; + /** + * Removes focus from the checkbox. + */ + "removeFocus": () => Promise; + /** + * Sets focus on the checkbox. + */ + "setFocus": () => Promise; + /** + * The checkbox's value attribute. + */ + "value": string; + } + interface SlColorPicker { + /** + * Set to true to disable the color picker. + */ + "disabled": boolean; + /** + * The format to use for the display value. If opacity is enabled, these will translate to HEXA, RGBA, and HSLA respectively. The color picker will always accept user input in any format (including CSS color names) and convert it to the desired format. + */ + "format": 'hex' | 'rgb' | 'hsl'; + /** + * Set to true to render the color picker inline rather than inside a dropdown. + */ + "inline": boolean; + /** + * Whether to show the opacity slider. + */ + "opacity": boolean; + /** + * When `inline` is true, this determines the size of the color picker's trigger. + */ + "size": 'small' | 'medium' | 'large'; + /** + * An array of predefined color swatches to display. Can include any format the color picker can parse, including HEX(A), RGB(A), HSL(A), and CSS color names. + */ + "swatches": string[]; + /** + * By default, the value will be set in lowercase. Set this to true to set it in uppercase instead. + */ + "uppercase": boolean; + /** + * The current color. + */ + "value": string; + } + interface SlDetails { + /** + * Set to true to prevent the user from toggling the details. + */ + "disabled": boolean; + /** + * Hides the alert + */ + "hide": () => Promise; + /** + * Indicates whether or not the details is open. You can use this in lieu of the show/hide methods. + */ + "open": boolean; + /** + * Shows the alert. + */ + "show": () => Promise; + /** + * The summary to show in the details header. + */ + "summary": string; + } + interface SlDialog { + /** + * Hides the dialog + */ + "hide": () => Promise; + /** + * The dialog's label as displayed in the header. You should always include a relevant label even when using `no-header`, as it is required for proper accessibility. + */ + "label": string; + /** + * Set to true to disable the footer. + */ + "noFooter": boolean; + /** + * Set to true to disable the header. This will also remove the default close button, so please ensure you provide an easy, accessible way for users to dismiss the dialog. + */ + "noHeader": boolean; + /** + * Indicates whether or not the dialog is open. You can use this in lieu of the show/hide methods. + */ + "open": boolean; + /** + * Shows the dialog + */ + "show": () => Promise; + } + interface SlDrawer { + /** + * By default, the drawer slides out of its containing block (usually the viewport). To make the drawer slide out of its parent element, set this prop and add `position: relative` to the parent. + */ + "contained": boolean; + /** + * Hides the drawer + */ + "hide": () => Promise; + /** + * The drawer's label as displayed in the header. You should always include a relevant label even when using `no-header`, as it is required for proper accessibility. + */ + "label": string; + /** + * Removes the footer. + */ + "noFooter": boolean; + /** + * Removes the header. This will also remove the default close button, so please ensure you provide an easy, accessible way for users to dismiss the drawer. + */ + "noHeader": boolean; + /** + * Indicates whether or not the drawer is open. You can use this in lieu of the show/hide methods. + */ + "open": boolean; + /** + * The direction from which the drawer will open. + */ + "placement": 'top' | 'right' | 'bottom' | 'left'; + /** + * Shows the drawer + */ + "show": () => Promise; + } + interface SlDropdown { + /** + * Determines whether the dropdown should hide when a menu item is selected. + */ + "closeOnSelect": boolean; + /** + * The dropdown will close when the user interacts outside of this element (e.g. clicking). + */ + "containingElement": HTMLElement; + /** + * The distance in pixels from which to offset the panel away from its trigger. + */ + "distance": number; + /** + * Hides the dropdown panel + */ + "hide": () => Promise; + /** + * Indicates whether or not the dropdown is open. You can use this in lieu of the show/hide methods. + */ + "open": boolean; + /** + * The preferred placement of the dropdown panel. Note that the actual placement may vary as needed to keep the panel inside of the viewport. + */ + "placement": | 'top' + | 'top-start' + | 'top-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'right' + | 'right-start' + | 'right-end' + | 'left' + | 'left-start' + | 'left-end'; + /** + * Shows the dropdown panel + */ + "show": () => Promise; + /** + * The distance in pixels from which to offset the panel along its trigger. + */ + "skidding": number; + } + interface SlForm { + /** + * Gets all form control elements (native and custom). + */ + "getFormControls": () => Promise; + /** + * Serializes all form controls elements and returns a `FormData` object. + */ + "getFormData": () => Promise; + /** + * Submits the form. + */ + "submit": () => Promise; + } + interface SlIcon { + /** + * An alternative description to use for accessibility. If omitted, the name or src will be used to generate it. + */ + "label": string; + /** + * The name of the icon to draw. + */ + "name": string; + /** + * An external URL of an SVG file. + */ + "src": string; + } + interface SlInput { + /** + * The input's autocaptialize attribute. + */ + "autocapitalize": string; + /** + * The input's autocomplete attribute. + */ + "autocomplete": string; + /** + * The input's autocorrect attribute. + */ + "autocorrect": string; + /** + * The input's autofocus attribute. + */ + "autofocus": boolean; + /** + * Set to true to add a clear button when the input is populated. + */ + "clearable": boolean; + /** + * Set to true to disable the input. + */ + "disabled": boolean; + /** + * The input's inputmode attribute. + */ + "inputmode": 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'; + /** + * Set to true to indicate that the user input is invalid. + */ + "invalid": boolean; + /** + * The input's label. + */ + "label": string; + /** + * The input's max attribute. + */ + "max": number; + /** + * The input's maxlength attribute. + */ + "maxlength": number; + /** + * The input's min attribute. + */ + "min": number; + /** + * The input's minlength attribute. + */ + "minlength": number; + /** + * The input's name attribute. + */ + "name": string; + /** + * The input's pattern attribute. + */ + "pattern": string; + /** + * Set to true to draw a pill-style input with rounded edges. + */ + "pill": boolean; + /** + * The input's placeholder text. + */ + "placeholder": string; + /** + * Set to true for a readonly input. + */ + "readonly": boolean; + /** + * Removes focus from the input. + */ + "removeFocus": () => Promise; + /** + * The input's required attribute. + */ + "required": boolean; + /** + * Selects all the text in the input. + */ + "select": () => Promise; + /** + * Sets focus on the input. + */ + "setFocus": () => Promise; + /** + * Replaces a range of text with a new string. + */ + "setRangeText": (replacement: string, start: number, end: number, selectMode?: 'select' | 'start' | 'end' | 'preserve') => Promise; + /** + * Sets the start and end positions of the text selection (0-based). + */ + "setSelectionRange": (selectionStart: number, selectionEnd: number, selectionDirection?: 'forward' | 'backward' | 'none') => Promise; + /** + * The input's size. + */ + "size": 'small' | 'medium' | 'large'; + /** + * The input's step attribute. + */ + "step": number; + /** + * Set to true to add a password toggle button for password inputs. + */ + "togglePassword": boolean; + /** + * The input's type. + */ + "type": 'email' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'url'; + /** + * Set to true to indicate that the user input is valid. + */ + "valid": boolean; + /** + * The input's value attribute. + */ + "value": string; + } + interface SlMenu { + /** + * Removes focus from the menu. + */ + "removeFocus": () => Promise; + /** + * Sets focus on the menu. + */ + "setFocus": () => Promise; + } + interface SlMenuDivider { + } + interface SlMenuItem { + /** + * Set to true to draw the menu item in an active state. + */ + "active": boolean; + /** + * Set to true to draw the item in a checked state. + */ + "checked": boolean; + /** + * Set to true to draw the menu item in a disabled state. + */ + "disabled": boolean; + /** + * A unique value to store in the menu item. + */ + "value": string; + } + interface SlMenuLabel { + } + interface SlProgressBar { + /** + * The progress bar's percentage, 0 to 100. + */ + "percentage": number; + } + interface SlProgressRing { + /** + * The current progress percentage, 0 - 100. + */ + "percentage": number; + /** + * The size of the progress ring in pixels. + */ + "size": number; + /** + * The stroke width of the progress ring in pixels. + */ + "strokeWidth": number; + } + interface SlRadio { + /** + * Set to true to draw the radio in a checked state. + */ + "checked": boolean; + /** + * Set to true to disable the radio. + */ + "disabled": boolean; + /** + * The radio's name attribute. + */ + "name": string; + /** + * Removes focus from the radio. + */ + "removeFocus": () => Promise; + /** + * Sets focus on the radio. + */ + "setFocus": () => Promise; + /** + * The radio's value attribute. + */ + "value": string; + } + interface SlRange { + /** + * Set to true to disable the input. + */ + "disabled": boolean; + /** + * The input's max attribute. + */ + "max": number; + /** + * The input's min attribute. + */ + "min": number; + /** + * The input's name attribute. + */ + "name": string; + /** + * Removes focus from the input. + */ + "removeFocus": () => Promise; + /** + * Sets focus on the input. + */ + "setFocus": () => Promise; + /** + * The input's step attribute. + */ + "step": number; + /** + * The preferred placedment of the tooltip. + */ + "tooltip": 'top' | 'bottom' | 'none'; + /** + * A function used to format the tooltip's value. + */ + "tooltipFormatter": (value: number) => string; + /** + * The input's value attribute. + */ + "value": number; + } + interface SlSelect { + /** + * Set to true to disable the select control. + */ + "disabled": boolean; + /** + * Set to true to indicate that the user input is invalid. + */ + "invalid": boolean; + /** + * The select's label. + */ + "label": string; + /** + * The maximum number of tags to show when `multiple` is true. After the maximum, "+n" will be shown to indicate the number of additional items that are selected. Set to -1 to remove the limit. + */ + "maxTagsVisible": number; + /** + * Set to true to enable multiselect. + */ + "multiple": boolean; + /** + * The select's name. + */ + "name": string; + /** + * Set to true to draw a pill-style select with rounded edges. + */ + "pill": boolean; + /** + * The select's placeholder text. + */ + "placeholder": string; + /** + * The select's size. + */ + "size": 'small' | 'medium' | 'large'; + /** + * Set to true to indicate that the user input is valid. + */ + "valid": boolean; + /** + * The value of the control. This will be a string or an array depending on `multiple`. + */ + "value": string | Array; + } + interface SlSpinner { + } + interface SlSwitch { + /** + * Set to true to draw the switch in a checked state. + */ + "checked": boolean; + /** + * Set to true to disable the switch. + */ + "disabled": boolean; + /** + * The switch's name attribute. + */ + "name": string; + /** + * Removes focus from the switch. + */ + "removeFocus": () => Promise; + /** + * Sets focus on the switch. + */ + "setFocus": () => Promise; + /** + * The switch's value attribute. + */ + "value": string; + } + interface SlTab { + /** + * Set to true to draw the tab in an active state. + */ + "active": boolean; + /** + * Set to true to draw the tab in a disabled state. + */ + "disabled": boolean; + /** + * The name of the tab panel the tab will control. The panel must be located in the same tab group. + */ + "panel": string; + /** + * Removes focus from the tab. + */ + "removeFocus": () => Promise; + /** + * Sets focus to the tab. + */ + "setFocus": () => Promise; + } + interface SlTabGroup { + /** + * The placement of the tabs. + */ + "placement": 'top' | 'bottom' | 'left' | 'right'; + /** + * Shows the specified tab panel. + */ + "show": (panel: string) => Promise; + } + interface SlTabPanel { + /** + * When true, the tab panel will be shown. + */ + "active": boolean; + /** + * The tab panel's name. + */ + "name": string; + } + interface SlTag { + /** + * Set to true to make the tag clearable. + */ + "clearable": boolean; + /** + * Set to true to draw a pill-style tag with rounded edges. + */ + "pill": boolean; + /** + * The tag's size. + */ + "size": 'small' | 'medium' | 'large'; + /** + * The tag's type. + */ + "type": 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text'; + } + interface SlTextarea { + /** + * The textarea's autocaptialize attribute. + */ + "autocapitalize": string; + /** + * The textarea's autocomplete attribute. + */ + "autocomplete": string; + /** + * The textarea's autocorrect attribute. + */ + "autocorrect": string; + /** + * The textarea's autofocus attribute. + */ + "autofocus": boolean; + /** + * Set to true to disable the textarea. + */ + "disabled": boolean; + /** + * The textarea's inputmode attribute. + */ + "inputmode": 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'; + /** + * Set to true to indicate that the user input is invalid. + */ + "invalid": boolean; + /** + * The textarea's label. + */ + "label": string; + /** + * The textarea's maxlength attribute. + */ + "maxlength": number; + /** + * The textarea's name attribute. + */ + "name": string; + /** + * The textarea's placeholder text. + */ + "placeholder": string; + /** + * Set to true for a readonly textarea. + */ + "readonly": boolean; + /** + * Removes focus fromt the textarea. + */ + "removeFocus": () => Promise; + /** + * The textarea's required attribute. + */ + "required": boolean; + /** + * Controls how the textarea can be resized. + */ + "resize": 'none' | 'vertical' | 'auto'; + /** + * The number of rows to display by default. + */ + "rows": number; + /** + * Selects all the text in the input. + */ + "select": () => Promise; + /** + * Sets focus on the textarea. + */ + "setFocus": () => Promise; + /** + * Replaces a range of text with a new string. + */ + "setRangeText": (replacement: string, start: number, end: number, selectMode?: 'select' | 'start' | 'end' | 'preserve') => Promise; + /** + * Sets the start and end positions of the text selection (0-based). + */ + "setSelectionRange": (selectionStart: number, selectionEnd: number, selectionDirection?: 'forward' | 'backward' | 'none') => Promise; + /** + * The textarea's size. + */ + "size": 'small' | 'medium' | 'large'; + /** + * Set to true to indicate that the user input is valid. + */ + "valid": boolean; + /** + * The textarea's value attribute. + */ + "value": string; + } + interface SlTooltip { + /** + * The tooltip's content. + */ + "content": string; + /** + * Set to true to disable the tooltip so it won't show when triggered. + */ + "disabled": boolean; + /** + * The distance in pixels from which to offset the tooltip away from its target. + */ + "distance": number; + /** + * Shows the tooltip. + */ + "hide": () => Promise; + /** + * Indicates whether or not the tooltip is open. You can use this in lieu of the show/hide methods. + */ + "open": boolean; + /** + * The preferred placement of the tooltip. Note that the actual placement may vary as needed to keep the tooltip inside of the viewport. + */ + "placement": | 'top' + | 'top-start' + | 'top-end' + | 'right' + | 'right-start' + | 'right-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'left' + | 'left-start' + | 'left-end'; + /** + * Shows the tooltip. + */ + "show": () => Promise; + /** + * The distance in pixels from which to offset the tooltip along its target. + */ + "skidding": number; + /** + * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple options can be passed by separating them with a space. When manual is used, the tooltip must be activated programmatically. + */ + "trigger": string; + } +} +declare global { + interface HTMLSlAlertElement extends Components.SlAlert, HTMLStencilElement { + } + var HTMLSlAlertElement: { + prototype: HTMLSlAlertElement; + new (): HTMLSlAlertElement; + }; + interface HTMLSlAvatarElement extends Components.SlAvatar, HTMLStencilElement { + } + var HTMLSlAvatarElement: { + prototype: HTMLSlAvatarElement; + new (): HTMLSlAvatarElement; + }; + interface HTMLSlBadgeElement extends Components.SlBadge, HTMLStencilElement { + } + var HTMLSlBadgeElement: { + prototype: HTMLSlBadgeElement; + new (): HTMLSlBadgeElement; + }; + interface HTMLSlButtonElement extends Components.SlButton, HTMLStencilElement { + } + var HTMLSlButtonElement: { + prototype: HTMLSlButtonElement; + new (): HTMLSlButtonElement; + }; + interface HTMLSlCheckboxElement extends Components.SlCheckbox, HTMLStencilElement { + } + var HTMLSlCheckboxElement: { + prototype: HTMLSlCheckboxElement; + new (): HTMLSlCheckboxElement; + }; + interface HTMLSlColorPickerElement extends Components.SlColorPicker, HTMLStencilElement { + } + var HTMLSlColorPickerElement: { + prototype: HTMLSlColorPickerElement; + new (): HTMLSlColorPickerElement; + }; + interface HTMLSlDetailsElement extends Components.SlDetails, HTMLStencilElement { + } + var HTMLSlDetailsElement: { + prototype: HTMLSlDetailsElement; + new (): HTMLSlDetailsElement; + }; + interface HTMLSlDialogElement extends Components.SlDialog, HTMLStencilElement { + } + var HTMLSlDialogElement: { + prototype: HTMLSlDialogElement; + new (): HTMLSlDialogElement; + }; + interface HTMLSlDrawerElement extends Components.SlDrawer, HTMLStencilElement { + } + var HTMLSlDrawerElement: { + prototype: HTMLSlDrawerElement; + new (): HTMLSlDrawerElement; + }; + interface HTMLSlDropdownElement extends Components.SlDropdown, HTMLStencilElement { + } + var HTMLSlDropdownElement: { + prototype: HTMLSlDropdownElement; + new (): HTMLSlDropdownElement; + }; + interface HTMLSlFormElement extends Components.SlForm, HTMLStencilElement { + } + var HTMLSlFormElement: { + prototype: HTMLSlFormElement; + new (): HTMLSlFormElement; + }; + interface HTMLSlIconElement extends Components.SlIcon, HTMLStencilElement { + } + var HTMLSlIconElement: { + prototype: HTMLSlIconElement; + new (): HTMLSlIconElement; + }; + interface HTMLSlInputElement extends Components.SlInput, HTMLStencilElement { + } + var HTMLSlInputElement: { + prototype: HTMLSlInputElement; + new (): HTMLSlInputElement; + }; + interface HTMLSlMenuElement extends Components.SlMenu, HTMLStencilElement { + } + var HTMLSlMenuElement: { + prototype: HTMLSlMenuElement; + new (): HTMLSlMenuElement; + }; + interface HTMLSlMenuDividerElement extends Components.SlMenuDivider, HTMLStencilElement { + } + var HTMLSlMenuDividerElement: { + prototype: HTMLSlMenuDividerElement; + new (): HTMLSlMenuDividerElement; + }; + interface HTMLSlMenuItemElement extends Components.SlMenuItem, HTMLStencilElement { + } + var HTMLSlMenuItemElement: { + prototype: HTMLSlMenuItemElement; + new (): HTMLSlMenuItemElement; + }; + interface HTMLSlMenuLabelElement extends Components.SlMenuLabel, HTMLStencilElement { + } + var HTMLSlMenuLabelElement: { + prototype: HTMLSlMenuLabelElement; + new (): HTMLSlMenuLabelElement; + }; + interface HTMLSlProgressBarElement extends Components.SlProgressBar, HTMLStencilElement { + } + var HTMLSlProgressBarElement: { + prototype: HTMLSlProgressBarElement; + new (): HTMLSlProgressBarElement; + }; + interface HTMLSlProgressRingElement extends Components.SlProgressRing, HTMLStencilElement { + } + var HTMLSlProgressRingElement: { + prototype: HTMLSlProgressRingElement; + new (): HTMLSlProgressRingElement; + }; + interface HTMLSlRadioElement extends Components.SlRadio, HTMLStencilElement { + } + var HTMLSlRadioElement: { + prototype: HTMLSlRadioElement; + new (): HTMLSlRadioElement; + }; + interface HTMLSlRangeElement extends Components.SlRange, HTMLStencilElement { + } + var HTMLSlRangeElement: { + prototype: HTMLSlRangeElement; + new (): HTMLSlRangeElement; + }; + interface HTMLSlSelectElement extends Components.SlSelect, HTMLStencilElement { + } + var HTMLSlSelectElement: { + prototype: HTMLSlSelectElement; + new (): HTMLSlSelectElement; + }; + interface HTMLSlSpinnerElement extends Components.SlSpinner, HTMLStencilElement { + } + var HTMLSlSpinnerElement: { + prototype: HTMLSlSpinnerElement; + new (): HTMLSlSpinnerElement; + }; + interface HTMLSlSwitchElement extends Components.SlSwitch, HTMLStencilElement { + } + var HTMLSlSwitchElement: { + prototype: HTMLSlSwitchElement; + new (): HTMLSlSwitchElement; + }; + interface HTMLSlTabElement extends Components.SlTab, HTMLStencilElement { + } + var HTMLSlTabElement: { + prototype: HTMLSlTabElement; + new (): HTMLSlTabElement; + }; + interface HTMLSlTabGroupElement extends Components.SlTabGroup, HTMLStencilElement { + } + var HTMLSlTabGroupElement: { + prototype: HTMLSlTabGroupElement; + new (): HTMLSlTabGroupElement; + }; + interface HTMLSlTabPanelElement extends Components.SlTabPanel, HTMLStencilElement { + } + var HTMLSlTabPanelElement: { + prototype: HTMLSlTabPanelElement; + new (): HTMLSlTabPanelElement; + }; + interface HTMLSlTagElement extends Components.SlTag, HTMLStencilElement { + } + var HTMLSlTagElement: { + prototype: HTMLSlTagElement; + new (): HTMLSlTagElement; + }; + interface HTMLSlTextareaElement extends Components.SlTextarea, HTMLStencilElement { + } + var HTMLSlTextareaElement: { + prototype: HTMLSlTextareaElement; + new (): HTMLSlTextareaElement; + }; + interface HTMLSlTooltipElement extends Components.SlTooltip, HTMLStencilElement { + } + var HTMLSlTooltipElement: { + prototype: HTMLSlTooltipElement; + new (): HTMLSlTooltipElement; + }; + interface HTMLElementTagNameMap { + "sl-alert": HTMLSlAlertElement; + "sl-avatar": HTMLSlAvatarElement; + "sl-badge": HTMLSlBadgeElement; + "sl-button": HTMLSlButtonElement; + "sl-checkbox": HTMLSlCheckboxElement; + "sl-color-picker": HTMLSlColorPickerElement; + "sl-details": HTMLSlDetailsElement; + "sl-dialog": HTMLSlDialogElement; + "sl-drawer": HTMLSlDrawerElement; + "sl-dropdown": HTMLSlDropdownElement; + "sl-form": HTMLSlFormElement; + "sl-icon": HTMLSlIconElement; + "sl-input": HTMLSlInputElement; + "sl-menu": HTMLSlMenuElement; + "sl-menu-divider": HTMLSlMenuDividerElement; + "sl-menu-item": HTMLSlMenuItemElement; + "sl-menu-label": HTMLSlMenuLabelElement; + "sl-progress-bar": HTMLSlProgressBarElement; + "sl-progress-ring": HTMLSlProgressRingElement; + "sl-radio": HTMLSlRadioElement; + "sl-range": HTMLSlRangeElement; + "sl-select": HTMLSlSelectElement; + "sl-spinner": HTMLSlSpinnerElement; + "sl-switch": HTMLSlSwitchElement; + "sl-tab": HTMLSlTabElement; + "sl-tab-group": HTMLSlTabGroupElement; + "sl-tab-panel": HTMLSlTabPanelElement; + "sl-tag": HTMLSlTagElement; + "sl-textarea": HTMLSlTextareaElement; + "sl-tooltip": HTMLSlTooltipElement; + } +} +declare namespace LocalJSX { + interface SlAlert { + /** + * Set to true to make the alert closable. + */ + "closable"?: boolean; + /** + * Emitted after the alert closes and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the alert opens and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the alert closes. Calling `event.preventDefault()` will prevent it from being closed. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the alert opens. Calling `event.preventDefault()` will prevent it from being opened. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Indicates whether or not the alert is open. You can use this in lieu of the show/hide methods. + */ + "open"?: boolean; + /** + * The type of alert. + */ + "type"?: 'primary' | 'success' | 'info' | 'warning' | 'danger'; + } + interface SlAvatar { + /** + * Alternative text for the image. + */ + "alt"?: string; + /** + * The image source to use for the avatar. + */ + "image"?: string; + /** + * Initials to use as a fallback when no image is available (1-2 characters max recommended). + */ + "initials"?: string; + /** + * Initials to use as a fallback when no image is available (1-2 characters max recommended). + */ + "shape"?: 'circle' | 'square' | 'rounded'; + } + interface SlBadge { + /** + * The badge's type. + */ + "type"?: 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text'; + } + interface SlButton { + /** + * Set to true to draw the button with a caret for use with dropdowns, popovers, etc. + */ + "caret"?: boolean; + /** + * Set to true to draw a circle button. + */ + "circle"?: boolean; + /** + * Set to true to disable the button. + */ + "disabled"?: boolean; + /** + * Set to true to draw the button in a loading state. + */ + "loading"?: boolean; + /** + * An optional name for the button. + */ + "name"?: string; + /** + * Emitted when the button loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the button gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * Set to true to draw a pill-style button with rounded edges. + */ + "pill"?: boolean; + /** + * The button's size. + */ + "size"?: 'small' | 'medium' | 'large'; + /** + * Indicates if activating the button should submit the form. + */ + "submit"?: boolean; + /** + * The button's type. + */ + "type"?: 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text'; + /** + * An optional value for the button. + */ + "value"?: string; + } + interface SlCheckbox { + /** + * Set to true to draw the checkbox in a checked state. + */ + "checked"?: boolean; + /** + * Set to true to disable the checkbox. + */ + "disabled"?: boolean; + /** + * Set to true to draw the checkbox in an indeterminate state. + */ + "indeterminate"?: boolean; + /** + * The checkbox's name attribute. + */ + "name"?: string; + /** + * Emitted when the control loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's checked state changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * The checkbox's value attribute. + */ + "value"?: string; + } + interface SlColorPicker { + /** + * Set to true to disable the color picker. + */ + "disabled"?: boolean; + /** + * The format to use for the display value. If opacity is enabled, these will translate to HEXA, RGBA, and HSLA respectively. The color picker will always accept user input in any format (including CSS color names) and convert it to the desired format. + */ + "format"?: 'hex' | 'rgb' | 'hsl'; + /** + * Set to true to render the color picker inline rather than inside a dropdown. + */ + "inline"?: boolean; + /** + * Emitted after the color picker closes and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the color picker opens and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the color picker's value changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the color picker closes. Calling `event.preventDefault()` will prevent it from being closed. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the color picker opens. Calling `event.preventDefault()` will prevent it from being opened. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Whether to show the opacity slider. + */ + "opacity"?: boolean; + /** + * When `inline` is true, this determines the size of the color picker's trigger. + */ + "size"?: 'small' | 'medium' | 'large'; + /** + * An array of predefined color swatches to display. Can include any format the color picker can parse, including HEX(A), RGB(A), HSL(A), and CSS color names. + */ + "swatches"?: string[]; + /** + * By default, the value will be set in lowercase. Set this to true to set it in uppercase instead. + */ + "uppercase"?: boolean; + /** + * The current color. + */ + "value"?: string; + } + interface SlDetails { + /** + * Set to true to prevent the user from toggling the details. + */ + "disabled"?: boolean; + /** + * Emitted after the details closes and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the details opens and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the details closes. Calling `event.preventDefault()` will prevent it from being closed. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the details opens. Calling `event.preventDefault()` will prevent it from being opened. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Indicates whether or not the details is open. You can use this in lieu of the show/hide methods. + */ + "open"?: boolean; + /** + * The summary to show in the details header. + */ + "summary"?: string; + } + interface SlDialog { + /** + * The dialog's label as displayed in the header. You should always include a relevant label even when using `no-header`, as it is required for proper accessibility. + */ + "label"?: string; + /** + * Set to true to disable the footer. + */ + "noFooter"?: boolean; + /** + * Set to true to disable the header. This will also remove the default close button, so please ensure you provide an easy, accessible way for users to dismiss the dialog. + */ + "noHeader"?: boolean; + /** + * Emitted after the dialog closes and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the dialog opens and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the dialog closes. Calling `event.preventDefault()` will prevent it from being closed. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the overlay is clicked. Calling `event.preventDefault()` will prevent the dialog from closing. + */ + "onSlOverlayDismiss"?: (event: CustomEvent) => void; + /** + * Emitted when the dialog opens. Calling `event.preventDefault()` will prevent it from being opened. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Indicates whether or not the dialog is open. You can use this in lieu of the show/hide methods. + */ + "open"?: boolean; + } + interface SlDrawer { + /** + * By default, the drawer slides out of its containing block (usually the viewport). To make the drawer slide out of its parent element, set this prop and add `position: relative` to the parent. + */ + "contained"?: boolean; + /** + * The drawer's label as displayed in the header. You should always include a relevant label even when using `no-header`, as it is required for proper accessibility. + */ + "label"?: string; + /** + * Removes the footer. + */ + "noFooter"?: boolean; + /** + * Removes the header. This will also remove the default close button, so please ensure you provide an easy, accessible way for users to dismiss the drawer. + */ + "noHeader"?: boolean; + /** + * Emitted after the drawer closes and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the drawer opens and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the drawer closes. Calling `event.preventDefault()` will prevent it from being closed. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the overlay is clicked. Calling `event.preventDefault()` will prevent the dialog from closing. + */ + "onSlOverlayDismiss"?: (event: CustomEvent) => void; + /** + * Emitted when the drawer opens. Calling `event.preventDefault()` will prevent it from being opened. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Indicates whether or not the drawer is open. You can use this in lieu of the show/hide methods. + */ + "open"?: boolean; + /** + * The direction from which the drawer will open. + */ + "placement"?: 'top' | 'right' | 'bottom' | 'left'; + } + interface SlDropdown { + /** + * Determines whether the dropdown should hide when a menu item is selected. + */ + "closeOnSelect"?: boolean; + /** + * The dropdown will close when the user interacts outside of this element (e.g. clicking). + */ + "containingElement"?: HTMLElement; + /** + * The distance in pixels from which to offset the panel away from its trigger. + */ + "distance"?: number; + /** + * Emitted after the dropdown closes and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the dropdown opens and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the dropdown closes. Calling `event.preventDefault()` will prevent it from being closed. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the dropdown opens. Calling `event.preventDefault()` will prevent it from being opened. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Indicates whether or not the dropdown is open. You can use this in lieu of the show/hide methods. + */ + "open"?: boolean; + /** + * The preferred placement of the dropdown panel. Note that the actual placement may vary as needed to keep the panel inside of the viewport. + */ + "placement"?: | 'top' + | 'top-start' + | 'top-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'right' + | 'right-start' + | 'right-end' + | 'left' + | 'left-start' + | 'left-end'; + /** + * The distance in pixels from which to offset the panel along its trigger. + */ + "skidding"?: number; + } + interface SlForm { + /** + * Emitted when the form is submitted. + */ + "onSlSubmit"?: (event: CustomEvent) => void; + } + interface SlIcon { + /** + * An alternative description to use for accessibility. If omitted, the name or src will be used to generate it. + */ + "label"?: string; + /** + * The name of the icon to draw. + */ + "name"?: string; + /** + * Emitted when the icon failed to load. + */ + "onSlError"?: (event: CustomEvent) => void; + /** + * Emitted when the icon has loaded. + */ + "onSlLoad"?: (event: CustomEvent) => void; + /** + * An external URL of an SVG file. + */ + "src"?: string; + } + interface SlInput { + /** + * The input's autocaptialize attribute. + */ + "autocapitalize"?: string; + /** + * The input's autocomplete attribute. + */ + "autocomplete"?: string; + /** + * The input's autocorrect attribute. + */ + "autocorrect"?: string; + /** + * The input's autofocus attribute. + */ + "autofocus"?: boolean; + /** + * Set to true to add a clear button when the input is populated. + */ + "clearable"?: boolean; + /** + * Set to true to disable the input. + */ + "disabled"?: boolean; + /** + * The input's inputmode attribute. + */ + "inputmode"?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'; + /** + * Set to true to indicate that the user input is invalid. + */ + "invalid"?: boolean; + /** + * The input's label. + */ + "label"?: string; + /** + * The input's max attribute. + */ + "max"?: number; + /** + * The input's maxlength attribute. + */ + "maxlength"?: number; + /** + * The input's min attribute. + */ + "min"?: number; + /** + * The input's minlength attribute. + */ + "minlength"?: number; + /** + * The input's name attribute. + */ + "name"?: string; + /** + * Emitted when the control loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's value changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * Emitted when the control receives input. + */ + "onSlInput"?: (event: CustomEvent) => void; + /** + * The input's pattern attribute. + */ + "pattern"?: string; + /** + * Set to true to draw a pill-style input with rounded edges. + */ + "pill"?: boolean; + /** + * The input's placeholder text. + */ + "placeholder"?: string; + /** + * Set to true for a readonly input. + */ + "readonly"?: boolean; + /** + * The input's required attribute. + */ + "required"?: boolean; + /** + * The input's size. + */ + "size"?: 'small' | 'medium' | 'large'; + /** + * The input's step attribute. + */ + "step"?: number; + /** + * Set to true to add a password toggle button for password inputs. + */ + "togglePassword"?: boolean; + /** + * The input's type. + */ + "type"?: 'email' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'url'; + /** + * Set to true to indicate that the user input is valid. + */ + "valid"?: boolean; + /** + * The input's value attribute. + */ + "value"?: string; + } + interface SlMenu { + /** + * Emitted when the menu loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the menu gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * Emitted when a menu item is selected. + */ + "onSlSelect"?: (event: CustomEvent) => void; + } + interface SlMenuDivider { + } + interface SlMenuItem { + /** + * Set to true to draw the menu item in an active state. + */ + "active"?: boolean; + /** + * Set to true to draw the item in a checked state. + */ + "checked"?: boolean; + /** + * Set to true to draw the menu item in a disabled state. + */ + "disabled"?: boolean; + /** + * A unique value to store in the menu item. + */ + "value"?: string; + } + interface SlMenuLabel { + } + interface SlProgressBar { + /** + * The progress bar's percentage, 0 to 100. + */ + "percentage"?: number; + } + interface SlProgressRing { + /** + * The current progress percentage, 0 - 100. + */ + "percentage"?: number; + /** + * The size of the progress ring in pixels. + */ + "size"?: number; + /** + * The stroke width of the progress ring in pixels. + */ + "strokeWidth"?: number; + } + interface SlRadio { + /** + * Set to true to draw the radio in a checked state. + */ + "checked"?: boolean; + /** + * Set to true to disable the radio. + */ + "disabled"?: boolean; + /** + * The radio's name attribute. + */ + "name"?: string; + /** + * Emitted when the control loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's checked state changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * The radio's value attribute. + */ + "value"?: string; + } + interface SlRange { + /** + * Set to true to disable the input. + */ + "disabled"?: boolean; + /** + * The input's max attribute. + */ + "max"?: number; + /** + * The input's min attribute. + */ + "min"?: number; + /** + * The input's name attribute. + */ + "name"?: string; + /** + * Emitted when the control loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's value changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * The input's step attribute. + */ + "step"?: number; + /** + * The preferred placedment of the tooltip. + */ + "tooltip"?: 'top' | 'bottom' | 'none'; + /** + * A function used to format the tooltip's value. + */ + "tooltipFormatter"?: (value: number) => string; + /** + * The input's value attribute. + */ + "value"?: number; + } + interface SlSelect { + /** + * Set to true to disable the select control. + */ + "disabled"?: boolean; + /** + * Set to true to indicate that the user input is invalid. + */ + "invalid"?: boolean; + /** + * The select's label. + */ + "label"?: string; + /** + * The maximum number of tags to show when `multiple` is true. After the maximum, "+n" will be shown to indicate the number of additional items that are selected. Set to -1 to remove the limit. + */ + "maxTagsVisible"?: number; + /** + * Set to true to enable multiselect. + */ + "multiple"?: boolean; + /** + * The select's name. + */ + "name"?: string; + /** + * Emitted when the control loses focus + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's value changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * Set to true to draw a pill-style select with rounded edges. + */ + "pill"?: boolean; + /** + * The select's placeholder text. + */ + "placeholder"?: string; + /** + * The select's size. + */ + "size"?: 'small' | 'medium' | 'large'; + /** + * Set to true to indicate that the user input is valid. + */ + "valid"?: boolean; + /** + * The value of the control. This will be a string or an array depending on `multiple`. + */ + "value"?: string | Array; + } + interface SlSpinner { + } + interface SlSwitch { + /** + * Set to true to draw the switch in a checked state. + */ + "checked"?: boolean; + /** + * Set to true to disable the switch. + */ + "disabled"?: boolean; + /** + * The switch's name attribute. + */ + "name"?: string; + /** + * Emitted when the control loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's checked state changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * The switch's value attribute. + */ + "value"?: string; + } + interface SlTab { + /** + * Set to true to draw the tab in an active state. + */ + "active"?: boolean; + /** + * Set to true to draw the tab in a disabled state. + */ + "disabled"?: boolean; + /** + * The name of the tab panel the tab will control. The panel must be located in the same tab group. + */ + "panel"?: string; + } + interface SlTabGroup { + /** + * Emitted when a tab is hidden. + */ + "onSlTabHide"?: (event: CustomEvent) => void; + /** + * Emitted when a tab is shown. + */ + "onSlTabShow"?: (event: CustomEvent) => void; + /** + * The placement of the tabs. + */ + "placement"?: 'top' | 'bottom' | 'left' | 'right'; + } + interface SlTabPanel { + /** + * When true, the tab panel will be shown. + */ + "active"?: boolean; + /** + * The tab panel's name. + */ + "name"?: string; + } + interface SlTag { + /** + * Set to true to make the tag clearable. + */ + "clearable"?: boolean; + /** + * Emitted when the clear button is activated. + */ + "onSlClear"?: (event: CustomEvent) => void; + /** + * Set to true to draw a pill-style tag with rounded edges. + */ + "pill"?: boolean; + /** + * The tag's size. + */ + "size"?: 'small' | 'medium' | 'large'; + /** + * The tag's type. + */ + "type"?: 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text'; + } + interface SlTextarea { + /** + * The textarea's autocaptialize attribute. + */ + "autocapitalize"?: string; + /** + * The textarea's autocomplete attribute. + */ + "autocomplete"?: string; + /** + * The textarea's autocorrect attribute. + */ + "autocorrect"?: string; + /** + * The textarea's autofocus attribute. + */ + "autofocus"?: boolean; + /** + * Set to true to disable the textarea. + */ + "disabled"?: boolean; + /** + * The textarea's inputmode attribute. + */ + "inputmode"?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'; + /** + * Set to true to indicate that the user input is invalid. + */ + "invalid"?: boolean; + /** + * The textarea's label. + */ + "label"?: string; + /** + * The textarea's maxlength attribute. + */ + "maxlength"?: number; + /** + * The textarea's name attribute. + */ + "name"?: string; + /** + * Emitted when the control loses focus. + */ + "onSlBlur"?: (event: CustomEvent) => void; + /** + * Emitted when the control's value changes. + */ + "onSlChange"?: (event: CustomEvent) => void; + /** + * Emitted when the control gains focus. + */ + "onSlFocus"?: (event: CustomEvent) => void; + /** + * Emitted when the control receives input. + */ + "onSlInput"?: (event: CustomEvent) => void; + /** + * The textarea's placeholder text. + */ + "placeholder"?: string; + /** + * Set to true for a readonly textarea. + */ + "readonly"?: boolean; + /** + * The textarea's required attribute. + */ + "required"?: boolean; + /** + * Controls how the textarea can be resized. + */ + "resize"?: 'none' | 'vertical' | 'auto'; + /** + * The number of rows to display by default. + */ + "rows"?: number; + /** + * The textarea's size. + */ + "size"?: 'small' | 'medium' | 'large'; + /** + * Set to true to indicate that the user input is valid. + */ + "valid"?: boolean; + /** + * The textarea's value attribute. + */ + "value"?: string; + } + interface SlTooltip { + /** + * The tooltip's content. + */ + "content"?: string; + /** + * Set to true to disable the tooltip so it won't show when triggered. + */ + "disabled"?: boolean; + /** + * The distance in pixels from which to offset the tooltip away from its target. + */ + "distance"?: number; + /** + * Emitted after the tooltip has hidden and all transitions are complete. + */ + "onSlAfterHide"?: (event: CustomEvent) => void; + /** + * Emitted after the tooltip has shown and all transitions are complete. + */ + "onSlAfterShow"?: (event: CustomEvent) => void; + /** + * Emitted when the tooltip begins to hide. Calling `event.preventDefault()` will prevent it from being hidden. + */ + "onSlHide"?: (event: CustomEvent) => void; + /** + * Emitted when the tooltip begins to show. Calling `event.preventDefault()` will prevent it from being shown. + */ + "onSlShow"?: (event: CustomEvent) => void; + /** + * Indicates whether or not the tooltip is open. You can use this in lieu of the show/hide methods. + */ + "open"?: boolean; + /** + * The preferred placement of the tooltip. Note that the actual placement may vary as needed to keep the tooltip inside of the viewport. + */ + "placement"?: | 'top' + | 'top-start' + | 'top-end' + | 'right' + | 'right-start' + | 'right-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'left' + | 'left-start' + | 'left-end'; + /** + * The distance in pixels from which to offset the tooltip along its target. + */ + "skidding"?: number; + /** + * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple options can be passed by separating them with a space. When manual is used, the tooltip must be activated programmatically. + */ + "trigger"?: string; + } + interface IntrinsicElements { + "sl-alert": SlAlert; + "sl-avatar": SlAvatar; + "sl-badge": SlBadge; + "sl-button": SlButton; + "sl-checkbox": SlCheckbox; + "sl-color-picker": SlColorPicker; + "sl-details": SlDetails; + "sl-dialog": SlDialog; + "sl-drawer": SlDrawer; + "sl-dropdown": SlDropdown; + "sl-form": SlForm; + "sl-icon": SlIcon; + "sl-input": SlInput; + "sl-menu": SlMenu; + "sl-menu-divider": SlMenuDivider; + "sl-menu-item": SlMenuItem; + "sl-menu-label": SlMenuLabel; + "sl-progress-bar": SlProgressBar; + "sl-progress-ring": SlProgressRing; + "sl-radio": SlRadio; + "sl-range": SlRange; + "sl-select": SlSelect; + "sl-spinner": SlSpinner; + "sl-switch": SlSwitch; + "sl-tab": SlTab; + "sl-tab-group": SlTabGroup; + "sl-tab-panel": SlTabPanel; + "sl-tag": SlTag; + "sl-textarea": SlTextarea; + "sl-tooltip": SlTooltip; + } +} +export { LocalJSX as JSX }; +declare module "@stencil/core" { + export namespace JSX { + interface IntrinsicElements { + "sl-alert": LocalJSX.SlAlert & JSXBase.HTMLAttributes; + "sl-avatar": LocalJSX.SlAvatar & JSXBase.HTMLAttributes; + "sl-badge": LocalJSX.SlBadge & JSXBase.HTMLAttributes; + "sl-button": LocalJSX.SlButton & JSXBase.HTMLAttributes; + "sl-checkbox": LocalJSX.SlCheckbox & JSXBase.HTMLAttributes; + "sl-color-picker": LocalJSX.SlColorPicker & JSXBase.HTMLAttributes; + "sl-details": LocalJSX.SlDetails & JSXBase.HTMLAttributes; + "sl-dialog": LocalJSX.SlDialog & JSXBase.HTMLAttributes; + "sl-drawer": LocalJSX.SlDrawer & JSXBase.HTMLAttributes; + "sl-dropdown": LocalJSX.SlDropdown & JSXBase.HTMLAttributes; + "sl-form": LocalJSX.SlForm & JSXBase.HTMLAttributes; + "sl-icon": LocalJSX.SlIcon & JSXBase.HTMLAttributes; + "sl-input": LocalJSX.SlInput & JSXBase.HTMLAttributes; + "sl-menu": LocalJSX.SlMenu & JSXBase.HTMLAttributes; + "sl-menu-divider": LocalJSX.SlMenuDivider & JSXBase.HTMLAttributes; + "sl-menu-item": LocalJSX.SlMenuItem & JSXBase.HTMLAttributes; + "sl-menu-label": LocalJSX.SlMenuLabel & JSXBase.HTMLAttributes; + "sl-progress-bar": LocalJSX.SlProgressBar & JSXBase.HTMLAttributes; + "sl-progress-ring": LocalJSX.SlProgressRing & JSXBase.HTMLAttributes; + "sl-radio": LocalJSX.SlRadio & JSXBase.HTMLAttributes; + "sl-range": LocalJSX.SlRange & JSXBase.HTMLAttributes; + "sl-select": LocalJSX.SlSelect & JSXBase.HTMLAttributes; + "sl-spinner": LocalJSX.SlSpinner & JSXBase.HTMLAttributes; + "sl-switch": LocalJSX.SlSwitch & JSXBase.HTMLAttributes; + "sl-tab": LocalJSX.SlTab & JSXBase.HTMLAttributes; + "sl-tab-group": LocalJSX.SlTabGroup & JSXBase.HTMLAttributes; + "sl-tab-panel": LocalJSX.SlTabPanel & JSXBase.HTMLAttributes; + "sl-tag": LocalJSX.SlTag & JSXBase.HTMLAttributes; + "sl-textarea": LocalJSX.SlTextarea & JSXBase.HTMLAttributes; + "sl-tooltip": LocalJSX.SlTooltip & JSXBase.HTMLAttributes; + } + } +} diff --git a/src/components/alert/alert.scss b/src/components/alert/alert.scss new file mode 100644 index 00000000..71baf49c --- /dev/null +++ b/src/components/alert/alert.scss @@ -0,0 +1,120 @@ +@import 'component'; + +:host { + display: block; + border-radius: var(--sl-border-radius-medium); + + &[hidden] { + display: none; + } +} + +.alert { + position: relative; + display: flex; + align-items: stretch; + background-color: var(--sl-color-white); + border: solid 1px var(--sl-color-gray-90); + border-top-width: 3px; + border-radius: var(--sl-border-radius-medium); + font-family: var(--sl-font-sans); + font-size: var(--sl-font-size-small); + font-weight: var(--sl-font-weight-normal); + line-height: 1.6; + color: var(--sl-color-gray-30); + opacity: 0; + transition: var(--sl-transition-medium) opacity ease; +} + +.alert--open { + opacity: 1; +} + +.alert__icon { + flex: 0 0 auto; + display: flex; + align-items: center; + font-size: var(--sl-font-size-large); + + ::slotted(*) { + margin-left: var(--sl-spacing-large); + } +} + +.alert--primary { + border-top-color: var(--sl-color-primary-50); + + .alert__icon { + color: var(--sl-color-primary-50); + } +} + +.alert--success { + border-top-color: var(--sl-color-success-50); + + .alert__icon { + color: var(--sl-color-success-50); + } +} + +.alert--info { + border-top-color: var(--sl-color-info-50); + + .alert__icon { + color: var(--sl-color-info-50); + } +} + +.alert--warning { + border-top-color: var(--sl-color-warning-50); + + .alert__icon { + color: var(--sl-color-warning-50); + } +} + +.alert--danger { + border-top-color: var(--sl-color-danger-50); + + .alert__icon { + color: var(--sl-color-danger-50); + } +} + +.alert__message { + flex: 1 1 auto; + padding: var(--sl-spacing-large); + overflow: hidden; +} + +.alert__close { + flex: 0 0 auto; + display: flex; + align-items: center; + background: none; + border: none; + border-radius: var(--sl-border-radius-small); + font-family: inherit; + font-size: var(--sl-font-size-large); + font-weight: inherit; + color: var(--sl-color-gray-50); + padding: 0 var(--sl-spacing-large); + cursor: pointer; + transition: var(--sl-transition-fast) color; + -webkit-appearance: none; + + &:hover, + &:focus, + &:active { + color: var(--sl-color-primary-50); + } + + &:focus { + outline: none; + } +} + +.focus-visible .alert__close:focus { + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-primary-hue), var(--sl-color-primary-saturation), 50%, var(--sl-focus-ring-alpha)); +} diff --git a/src/components/alert/alert.tsx b/src/components/alert/alert.tsx new file mode 100644 index 00000000..3ca980d6 --- /dev/null +++ b/src/components/alert/alert.tsx @@ -0,0 +1,153 @@ +import { Component, Element, Event, EventEmitter, Host, Method, Prop, Watch, h } from '@stencil/core'; +import { focusVisible } from '../../utilities/focus-visible'; + +/** + * @since 1.0 + * @status stable + * + * @slot - The alert's content. + * @slot icon - An icon to show in the alert. + * @slot close-icon - An icon to use in lieu of the default close icon. + * + * @part base - The component's base wrapper. + * @part icon - The container that wraps the alert icon. + * @part message - The alert message. + * @part close-button - The close button. + */ + +@Component({ + tag: 'sl-alert', + styleUrl: 'alert.scss', + shadow: true +}) +export class Tab { + constructor() { + this.handleCloseClick = this.handleCloseClick.bind(this); + this.handleTransitionEnd = this.handleTransitionEnd.bind(this); + } + + alert: HTMLElement; + + @Element() host: HTMLSlAlertElement; + + /** Indicates whether or not the alert is open. You can use this in lieu of the show/hide methods. */ + @Prop({ mutable: true, reflect: true }) open = false; + + /** Set to true to make the alert closable. */ + @Prop() closable = false; + + /** The type of alert. */ + @Prop() type: 'primary' | 'success' | 'info' | 'warning' | 'danger' = 'primary'; + + @Watch('open') + handleOpenChange() { + this.open ? this.show() : this.hide(); + } + + /** Emitted when the alert opens. Calling `event.preventDefault()` will prevent it from being opened. */ + @Event() slShow: EventEmitter; + + /** Emitted after the alert opens and all transitions are complete. */ + @Event() slAfterShow: EventEmitter; + + /** Emitted when the alert closes. Calling `event.preventDefault()` will prevent it from being closed. */ + @Event() slHide: EventEmitter; + + /** Emitted after the alert closes and all transitions are complete. */ + @Event() slAfterHide: EventEmitter; + + componentDidLoad() { + focusVisible.observe(this.alert); + + // Show on init if open + if (this.open) { + this.show(); + } + } + + componentDidUnload() { + focusVisible.unobserve(this.alert); + } + + /** Shows the alert. */ + @Method() + async show() { + const slShow = this.slShow.emit(); + + if (slShow.defaultPrevented) { + return false; + } + + this.host.hidden = false; + this.host.clientWidth; // force a reflow + this.open = true; + } + + /** Hides the alert */ + @Method() + async hide() { + const slHide = this.slHide.emit(); + + if (slHide.defaultPrevented) { + return false; + } + + this.open = false; + } + + handleCloseClick() { + this.hide(); + } + + handleTransitionEnd(event: TransitionEvent) { + const target = event.target as HTMLElement; + + // Ensure we only emit one event when the target element is no longer visible + if (event.propertyName === 'opacity' && target.classList.contains('alert')) { + this.host.hidden = !this.open; + this.open ? this.slAfterShow.emit() : this.slAfterHide.emit(); + } + } + + render() { + return ( + + ); + } +} diff --git a/src/components/avatar/avatar.scss b/src/components/avatar/avatar.scss new file mode 100644 index 00000000..33ecd887 --- /dev/null +++ b/src/components/avatar/avatar.scss @@ -0,0 +1,65 @@ +@import 'component'; + +/** + * @prop --background-color: The avatar's background color. + * @prop --size: The size of the avatar. + */ +:host { + display: inline-block; + + --size: 3rem; +} + +.avatar { + display: inline-flex; + align-items: center; + justify-content: center; + position: relative; + width: var(--size); + height: var(--size); + background-color: var(--sl-color-gray-80); + font-family: var(--sl-font-sans); + font-size: calc(var(--size) * 0.5); + font-weight: var(--sl-font-weight-normal); + color: var(--sl-color-white); + overflow: hidden; + user-select: none; + vertical-align: middle; +} + +.avatar--circle { + border-radius: var(--sl-border-radius-circle); +} + +.avatar--rounded { + border-radius: var(--sl-border-radius-medium); +} + +.avatar--square { + border-radius: 0; +} + +.avatar__icon { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.avatar__initials { + line-height: 1; + text-transform: uppercase; +} + +.avatar__image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} diff --git a/src/components/avatar/avatar.tsx b/src/components/avatar/avatar.tsx new file mode 100644 index 00000000..d0cb5eec --- /dev/null +++ b/src/components/avatar/avatar.tsx @@ -0,0 +1,76 @@ +import { Component, Prop, State, h } from '@stencil/core'; + +/** + * @since 1.0 + * @status stable + * + * @slot icon - The default icon to use when no image or initials are present. + * + * @part base - The component's base wrapper. + * @part icon - The container that wraps the avatar icon. + * @part initials - The container that wraps the avatar initials. + * @part image - The avatar image. + */ + +@Component({ + tag: 'sl-avatar', + styleUrl: 'avatar.scss', + shadow: true +}) +export class Avatar { + constructor() { + this.handleImageError = this.handleImageError.bind(this); + } + + @State() hasError = false; + + /** The image source to use for the avatar. */ + @Prop() image = ''; + + /** Alternative text for the image. */ + @Prop() alt = ''; + + /** Initials to use as a fallback when no image is available (1-2 characters max recommended). */ + @Prop() initials = ''; + + /** Initials to use as a fallback when no image is available (1-2 characters max recommended). */ + @Prop() shape: 'circle' | 'square' | 'rounded' = 'circle'; + + handleImageError() { + this.hasError = true; + } + + render() { + return ( +
    + {!this.initials && ( +
    + + + +
    + )} + + {this.initials && ( +
    + {this.initials} +
    + )} + + {this.image && !this.hasError && ( + + )} +
    + ); + } +} diff --git a/src/components/badge/badge.scss b/src/components/badge/badge.scss new file mode 100644 index 00000000..35ac9570 --- /dev/null +++ b/src/components/badge/badge.scss @@ -0,0 +1,51 @@ +@import 'component'; + +:host { + display: inline-flex; + border-radius: var(--sl-border-radius-pill); + pointer-events: none; +} + +.badge { + display: inline-flex; + align-items: center; + justify-content: center; + font-size: var(--sl-font-size-x-small); + font-weight: var(--sl-font-weight-semibold); + letter-spacing: var(--sl-letter-spacing-normal); + line-height: 1; + border-radius: inherit; + white-space: nowrap; + padding: 4px 8px; + user-select: none; + cursor: inherit; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Type modifiers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.badge--primary { + background-color: var(--sl-color-primary-50); + color: var(--sl-color-white); +} + +.badge--success { + background-color: var(--sl-color-success-50); + color: var(--sl-color-white); +} + +.badge--info { + background-color: var(--sl-color-info-50); + color: var(--sl-color-white); +} + +.badge--warning { + background-color: var(--sl-color-warning-50); + color: var(--sl-color-white); +} + +.badge--danger { + background-color: var(--sl-color-danger-50); + color: var(--sl-color-white); +} diff --git a/src/components/badge/badge.tsx b/src/components/badge/badge.tsx new file mode 100644 index 00000000..e7582bf6 --- /dev/null +++ b/src/components/badge/badge.tsx @@ -0,0 +1,46 @@ +import { Component, Prop, h } from '@stencil/core'; + +/** + * @since 1.0 + * @status experimental + * + * @slot - The badge's content. + * + * @part base - The base wrapper + */ + +@Component({ + tag: 'sl-badge', + styleUrl: 'badge.scss', + shadow: true +}) +export class Badge { + badge: HTMLElement; + hasSlot: boolean; + + /** The badge's type. */ + @Prop() type: 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text' = 'primary'; + + render() { + return ( + (this.badge = el)} + part="base" + class={{ + badge: true, + + // Types + 'badge--primary': this.type === 'primary', + 'badge--success': this.type === 'success', + 'badge--info': this.type === 'info', + 'badge--warning': this.type === 'warning', + 'badge--danger': this.type === 'danger', + 'badge--text': this.type === 'text' + }} + role="status" + > + + + ); + } +} diff --git a/src/components/button/button.scss b/src/components/button/button.scss new file mode 100644 index 00000000..ce4d3a6f --- /dev/null +++ b/src/components/button/button.scss @@ -0,0 +1,396 @@ +@import 'component'; + +:host { + display: inline-block; + width: auto; + cursor: pointer; +} + +.button { + display: inline-flex; + align-items: stretch; + justify-content: center; + width: inherit; + border-style: solid; + border-width: var(--sl-input-border-width); + font-family: var(--sl-input-font-family); + font-weight: var(--sl-font-weight-semibold); + user-select: none; + white-space: nowrap; + vertical-align: middle; + transition: var(--sl-transition-fast) background-color, var(--sl-transition-fast) color, + var(--sl-transition-fast) border, var(--sl-transition-fast) box-shadow; + cursor: inherit; + + &::-moz-focus-inner { + border: 0; + } + + &:focus { + outline: none; + } + + &[disabled] { + opacity: 0.5; + cursor: not-allowed; + } + + // Clicks on icons shouldn't prevent the button from gaining focus + ::slotted(sl-icon) { + pointer-events: none; + } +} + +.button__prefix, +.button__suffix { + flex: 0 0 auto; + display: flex; + align-items: center; +} + +.button__prefix ::slotted(:first-child) { + margin-left: calc(-1 * var(--sl-spacing-x-small)); + margin-right: var(--sl-spacing-x-small); +} + +.button__suffix ::slotted(:last-child) { + margin-left: var(--sl-spacing-x-small); + margin-right: calc(-1 * var(--sl-spacing-x-small)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Standard buttons +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button { + &.button--default { + background-color: var(--sl-color-white); + border-color: var(--sl-color-gray-80); + color: var(--sl-color-gray-40); + + &:hover:not(:disabled) { + background-color: var(--sl-color-primary-95); + border-color: var(--sl-color-primary-80); + color: var(--sl-color-primary-40); + } + + &:focus:not(:disabled) { + background-color: var(--sl-color-primary-95); + border-color: var(--sl-color-primary-70); + color: var(--sl-color-primary-40); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-primary-hue), var(--sl-color-primary-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: var(--sl-color-primary-95); + border-color: var(--sl-color-primary-50); + color: var(--sl-color-primary-30); + } + } + + &.button--primary { + background-color: var(--sl-color-primary-50); + border-color: var(--sl-color-primary-50); + color: var(--sl-color-primary-text); + + &:hover:not(:disabled) { + background-color: var(--sl-color-primary-60); + border-color: var(--sl-color-primary-60); + color: var(--sl-color-primary-text); + } + + &:focus:not(:disabled) { + background-color: var(--sl-color-primary-60); + border-color: var(--sl-color-primary-60); + color: var(--sl-color-primary-text); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-primary-hue), var(--sl-color-primary-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: var(--sl-color-primary-50); + border-color: var(--sl-color-primary-50); + color: var(--sl-color-primary-text); + } + } + + &.button--success { + background-color: var(--sl-color-success-50); + border-color: var(--sl-color-success-50); + color: var(--sl-color-success-text); + + &:hover:not(:disabled) { + background-color: var(--sl-color-success-60); + border-color: var(--sl-color-success-60); + color: var(--sl-color-success-text); + } + + &:focus:not(:disabled) { + background-color: var(--sl-color-success-60); + border-color: var(--sl-color-success-60); + color: var(--sl-color-success-text); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-success-hue), var(--sl-color-success-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: var(--sl-color-success-50); + border-color: var(--sl-color-success-50); + color: var(--sl-color-success-text); + } + } + + &.button--info { + background-color: var(--sl-color-info-50); + border-color: var(--sl-color-info-50); + color: var(--sl-color-info-text); + + &:hover:not(:disabled) { + background-color: var(--sl-color-info-60); + border-color: var(--sl-color-info-60); + color: var(--sl-color-info-text); + } + + &:focus:not(:disabled) { + background-color: var(--sl-color-info-60); + border-color: var(--sl-color-info-60); + color: var(--sl-color-info-text); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-info-hue), var(--sl-color-info-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: var(--sl-color-info-50); + border-color: var(--sl-color-info-50); + color: var(--sl-color-info-text); + } + } + + &.button--warning { + background-color: var(--sl-color-warning-50); + border-color: var(--sl-color-warning-50); + color: var(--sl-color-warning-text); + + &:hover:not(:disabled) { + background-color: var(--sl-color-warning-60); + border-color: var(--sl-color-warning-60); + color: var(--sl-color-warning-text); + } + + &:focus:not(:disabled) { + background-color: var(--sl-color-warning-60); + border-color: var(--sl-color-warning-60); + color: var(--sl-color-warning-text); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-warning-hue), var(--sl-color-warning-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: var(--sl-color-warning-50); + border-color: var(--sl-color-warning-50); + color: var(--sl-color-warning-text); + } + } + + &.button--danger { + background-color: var(--sl-color-danger-50); + border-color: var(--sl-color-danger-50); + color: var(--sl-color-danger-text); + + &:hover:not(:disabled) { + background-color: var(--sl-color-danger-60); + border-color: var(--sl-color-danger-60); + color: var(--sl-color-danger-text); + } + + &:focus:not(:disabled) { + background-color: var(--sl-color-danger-60); + border-color: var(--sl-color-danger-60); + color: var(--sl-color-danger-text); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-danger-hue), var(--sl-color-danger-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: var(--sl-color-danger-50); + border-color: var(--sl-color-danger-50); + color: var(--sl-color-danger-text); + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Text buttons +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button--text { + background-color: transparent; + border-color: transparent; + color: var(--sl-color-primary-50); + + &:hover:not(:disabled) { + background-color: transparent; + border-color: transparent; + color: var(--sl-color-primary-60); + } + + &:focus:not(:disabled) { + background-color: transparent; + border-color: transparent; + color: var(--sl-color-primary-60); + box-shadow: 0 0 0 var(--sl-focus-ring-width) + hsla(var(--sl-color-primary-hue), var(--sl-color-primary-saturation), 50%, var(--sl-focus-ring-alpha)); + } + + &:active:not(:disabled) { + background-color: transparent; + border-color: transparent; + color: var(--sl-color-primary-40); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Size modifiers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button--small { + font-size: var(--sl-button-font-size-small); + height: var(--sl-input-height-small); + line-height: calc(var(--sl-input-height-small) - var(--sl-input-border-width) * 2); + border-radius: var(--sl-input-border-radius-small); + padding: 0 var(--sl-spacing-medium); +} + +.button--medium { + font-size: var(--sl-button-font-size-medium); + height: var(--sl-input-height-medium); + line-height: calc(var(--sl-input-height-medium) - var(--sl-input-border-width) * 2); + border-radius: var(--sl-input-border-radius-medium); + padding: 0 var(--sl-spacing-large); +} + +.button--large { + font-size: var(--sl-button-font-size-large); + height: var(--sl-input-height-large); + line-height: calc(var(--sl-input-height-large) - var(--sl-input-border-width) * 2); + border-radius: var(--sl-input-border-radius-large); + padding: 0 var(--sl-spacing-x-large); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Pill modifier +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button--pill { + &.button--small { + border-radius: var(--sl-input-height-small); + } + + &.button--medium { + border-radius: var(--sl-input-height-medium); + } + + &.button--large { + border-radius: var(--sl-input-height-large); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Circle modifier +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button--circle { + padding-left: 0; + padding-right: 0; + + .button__label { + display: flex; + align-items: center; + justify-content: center; + } + + &.button--small { + width: var(--sl-input-height-small); + border-radius: 50%; + } + + &.button--medium { + width: var(--sl-input-height-medium); + border-radius: 50%; + } + + &.button--large { + width: var(--sl-input-height-large); + border-radius: 50%; + } + + .button__prefix, + .button__suffix, + .button__caret { + display: none; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Block modifier +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Caret modifier +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button--caret { + .button__suffix { + display: none; + } + + .button__caret { + display: flex; + align-items: center; + margin-left: var(--sl-spacing-xx-small); + margin-right: calc(-1 * var(--sl-spacing-xx-small)); + + svg { + width: 1em; + height: 1em; + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Loading modifier +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button--loading { + position: relative; + cursor: wait; + + .button__prefix, + .button__label, + .button__suffix, + .button__caret { + visibility: hidden; + } + + sl-spinner { + --indicator-color: currentColor; + --stroke-width: 1px; + position: absolute; + height: 1em; + width: 1em; + top: calc(50% - 0.5em); + left: calc(50% - 0.5em); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Badges +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.button ::slotted(sl-badge) { + position: absolute; + top: 0; + right: 0; + transform: translateY(-50%) translateX(50%); +} diff --git a/src/components/button/button.tsx b/src/components/button/button.tsx new file mode 100644 index 00000000..e841685e --- /dev/null +++ b/src/components/button/button.tsx @@ -0,0 +1,165 @@ +import { Component, Event, EventEmitter, Method, Prop, State, h } from '@stencil/core'; + +/** + * @since 1.0 + * @status stable + * + * @slot - The button's label. + * @slot prefix - Used to prepend an icon or similar element to the button. + * @slot suffix - Used to append an icon or similar element to the button. + * + * @part base - The component's base wrapper. + * @part prefix - The prefix container. + * @part label - The button's label. + * @part suffix - The suffix container. + * @part caret - The button's caret. + */ + +@Component({ + tag: 'sl-button', + styleUrl: 'button.scss', + shadow: true +}) +export class Button { + constructor() { + this.handleBlur = this.handleBlur.bind(this); + this.handleFocus = this.handleFocus.bind(this); + this.handleClick = this.handleClick.bind(this); + } + + button: HTMLButtonElement; + + @State() hasFocus = false; + + /** The button's type. */ + @Prop() type: 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'text' = 'default'; + + /** The button's size. */ + @Prop() size: 'small' | 'medium' | 'large' = 'medium'; + + /** Set to true to draw the button with a caret for use with dropdowns, popovers, etc. */ + @Prop() caret = false; + + /** Set to true to disable the button. */ + @Prop() disabled = false; + + /** Set to true to draw the button in a loading state. */ + @Prop() loading = false; + + /** An optional name for the button. */ + @Prop() name: string; + + /** Set to true to draw a pill-style button with rounded edges. */ + @Prop() pill = false; + + /** Set to true to draw a circle button. */ + @Prop() circle = false; + + /** An optional value for the button. */ + @Prop() value: string; + + /** Indicates if activating the button should submit the form. */ + @Prop() submit = false; + + /** Emitted when the button loses focus. */ + @Event() slBlur: EventEmitter; + + /** Emitted when the button gains focus. */ + @Event() slFocus: EventEmitter; + + /** Sets focus on the button. */ + @Method() + async setFocus() { + this.button.focus(); + } + + /** Removes focus from the button. */ + @Method() + async removeFocus() { + this.button.blur(); + } + + handleBlur() { + this.hasFocus = false; + this.slBlur.emit(); + } + + handleFocus() { + this.hasFocus = true; + this.slFocus.emit(); + } + + handleClick(event: MouseEvent) { + if (this.disabled || this.loading) { + event.preventDefault(); + event.stopPropagation(); + } + } + + render() { + return ( + + ); + } +} diff --git a/src/components/checkbox/checkbox.scss b/src/components/checkbox/checkbox.scss new file mode 100644 index 00000000..0a23404a --- /dev/null +++ b/src/components/checkbox/checkbox.scss @@ -0,0 +1,99 @@ +@import 'component'; + +:host { + display: inline-block; + cursor: pointer; +} + +.checkbox { + display: inline-flex; + align-items: center; + font-family: var(--sl-input-font-family); + font-size: var(--sl-input-font-size-medium); + font-weight: var(--sl-input-font-weight); + color: var(--sl-input-color); + vertical-align: middle; + cursor: inherit; +} + +.checkbox__control { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + width: var(--sl-toggle-size); + height: var(--sl-toggle-size); + border: solid var(--sl-input-border-width) var(--sl-input-border-color); + border-radius: 2px; + background-color: var(--sl-input-background-color); + color: var(--sl-color-white); + transition: var(--sl-transition-fast) border-color, var(--sl-transition-fast) background-color, + var(--sl-transition-fast) color, var(--sl-transition-fast) box-shadow; + + input[type='checkbox'] { + position: absolute; + opacity: 0; + padding: 0; + margin: 0; + pointer-events: none; + -webkit-appearance: none; + } + + .checkbox__icon { + display: inline-flex; + width: var(--sl-toggle-size); + height: var(--sl-toggle-size); + + svg { + width: 100%; + height: 100%; + } + } +} + +// Hover +.checkbox:not(.checkbox--checked):not(.checkbox--disabled) .checkbox__control:hover { + border-color: var(--sl-input-border-color-hover); + background-color: var(--sl-input-background-color-hover); +} + +// Focus +.checkbox.checkbox--focused:not(.checkbox--checked):not(.checkbox--disabled) .checkbox__control { + border-color: var(--sl-input-border-color-focus); + background-color: var(--sl-input-background-color-focus); + box-shadow: var(--sl-focus-ring-box-shadow); +} + +// Checked/indeterminate +.checkbox--checked .checkbox__control, +.checkbox--indeterminate .checkbox__control { + border-color: var(--sl-color-primary-50); + background-color: var(--sl-color-primary-50); +} + +// Checked/indeterminate + hover +.checkbox.checkbox--checked:not(.checkbox--disabled) .checkbox__control:hover, +.checkbox.checkbox--indeterminate:not(.checkbox--disabled) .checkbox__control:hover { + border-color: var(--sl-color-primary-60); + background-color: var(--sl-color-primary-60); +} + +// Checked/indeterminate + focus +.checkbox.checkbox--checked:not(.checkbox--disabled).checkbox--focused .checkbox__control, +.checkbox.checkbox--indeterminate:not(.checkbox--disabled).checkbox--focused .checkbox__control { + border-color: var(--sl-color-primary-60); + background-color: var(--sl-color-primary-60); + box-shadow: var(--sl-focus-ring-box-shadow); +} + +// Disabled +.checkbox--disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.checkbox__label { + line-height: var(--sl-toggle-size); + margin-left: 0.5em; + user-select: none; +} diff --git a/src/components/checkbox/checkbox.tsx b/src/components/checkbox/checkbox.tsx new file mode 100644 index 00000000..035fff86 --- /dev/null +++ b/src/components/checkbox/checkbox.tsx @@ -0,0 +1,172 @@ +import { Component, Event, EventEmitter, Method, Prop, State, Watch, h } from '@stencil/core'; + +let id = 0; + +/** + * @since 1.0 + * @status stable + * + * @slot - The checkbox's label. + * + * @part base - The component's base wrapper. + * @part control - The checkbox control. + * @part checked-icon - The container the wraps the checked icon. + * @part indeterminate-icon - The container that wraps the indeterminate icon. + * @part label - The checkbox label. + */ + +@Component({ + tag: 'sl-checkbox', + styleUrl: 'checkbox.scss', + shadow: true +}) +export class Checkbox { + constructor() { + this.handleClick = this.handleClick.bind(this); + this.handleBlur = this.handleBlur.bind(this); + this.handleFocus = this.handleFocus.bind(this); + this.handleMouseDown = this.handleMouseDown.bind(this); + } + + inputId = `checkbox-${++id}`; + labelId = `checkbox-label-${id}`; + input: HTMLInputElement; + + @State() hasFocus = false; + + /** The checkbox's name attribute. */ + @Prop() name: string; + + /** The checkbox's value attribute. */ + @Prop() value: string; + + /** Set to true to disable the checkbox. */ + @Prop() disabled = false; + + /** Set to true to draw the checkbox in a checked state. */ + @Prop({ mutable: true }) checked = false; + + /** Set to true to draw the checkbox in an indeterminate state. */ + @Prop({ mutable: true }) indeterminate = false; + + /** Emitted when the control loses focus. */ + @Event() slBlur: EventEmitter; + + /** Emitted when the control's checked state changes. */ + @Event() slChange: EventEmitter; + + /** Emitted when the control gains focus. */ + @Event() slFocus: EventEmitter; + + @Watch('checked') + @Watch('indeterminate') + handleCheckedChange() { + this.input.checked = this.checked; + this.input.indeterminate = this.indeterminate; + this.slChange.emit(); + } + + componentDidLoad() { + this.input.indeterminate = this.indeterminate; + } + + /** Sets focus on the checkbox. */ + @Method() + async setFocus() { + this.input.focus(); + } + + /** Removes focus from the checkbox. */ + @Method() + async removeFocus() { + this.input.blur(); + } + + handleClick() { + this.checked = this.input.checked; + this.indeterminate = this.input.indeterminate; + } + + handleBlur() { + this.hasFocus = false; + this.slBlur.emit(); + } + + handleFocus() { + this.hasFocus = true; + this.slFocus.emit(); + } + + handleMouseDown(event: MouseEvent) { + // Prevent clicks on the label from briefly blurring the input + event.preventDefault(); + this.input.focus(); + } + + render() { + return ( + + ); + } +} diff --git a/src/components/color-picker/color-picker.scss b/src/components/color-picker/color-picker.scss new file mode 100644 index 00000000..4462078e --- /dev/null +++ b/src/components/color-picker/color-picker.scss @@ -0,0 +1,297 @@ +@import 'component'; + +/** + * @prop --grid-width: The width of the color grid. + * @prop --grid-height: The height of the color grid. + * @prop --grid-handle-size: The size of the color grid's handle. + * @prop --slider-height: The height of the hue and alpha sliders. + * @prop --slider-handle-size: The diameter of the slider's handle. + */ +:host { + display: inline-block; + + --grid-width: 260px; + --grid-height: 200px; + --grid-handle-size: 12px; + --slider-height: 10px; + --slider-handle-size: 12px; +} + +.color-picker { + width: var(--grid-width); + font-family: var(--sl-font-sans); + font-size: var(--sl-font-size-medium); + font-weight: var(--sl-font-weight-normal); + color: var(--color); + background-color: var(--sl-color-white); + border-radius: var(--sl-border-radius-medium); + user-select: none; +} + +.color-picker--inline { + border: solid 1px var(--sl-color-gray-90); + box-shadow: var(--sl-shadow-small); +} + +.color-picker__grid { + position: relative; + height: var(--grid-height); + background-image: linear-gradient( + to bottom, + hsl(0, 0%, 100%) 0%, + hsla(0, 0%, 100%, 0) 50%, + hsla(0, 0%, 0%, 0) 50%, + hsl(0, 0%, 0%) 100% + ), + linear-gradient(to right, hsl(0, 0%, 50%) 0%, hsla(0, 0%, 50%, 0) 100%); + border-top-left-radius: var(--sl-border-radius-medium); + border-top-right-radius: var(--sl-border-radius-medium); + cursor: crosshair; +} + +.color-picker__grid-handle { + position: absolute; + width: var(--grid-handle-size); + height: var(--grid-handle-size); + border-radius: 50%; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25), inset 0 0 0 1px rgba(0, 0, 0, 0.25); + border: solid 2px white; + margin-top: calc(var(--grid-handle-size) / -2); + margin-left: calc(var(--grid-handle-size) / -2); + + &:focus { + outline: none; + box-shadow: 0 0 0 1px hsl(var(--sl-focus-ring-hue), var(--sl-focus-ring-saturation), var(--sl-focus-ring-lightness)), + inset 0 0 0 1px hsl(var(--sl-focus-ring-hue), var(--sl-focus-ring-saturation), var(--sl-focus-ring-lightness)), + var(--sl-focus-ring-box-shadow); + } +} + +.color-picker__controls { + padding: var(--sl-spacing-small); + display: flex; + align-items: center; +} + +.color-picker__sliders { + flex: 1 1 auto; +} + +.color-picker__slider { + position: relative; + height: var(--slider-height); + border-radius: var(--sl-border-radius-pill); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + + &:not(:last-of-type) { + margin-bottom: var(--sl-spacing-small); + } +} + +.color-picker__slider-handle { + position: absolute; + top: calc(50% - var(--slider-handle-size) / 2); + width: var(--slider-handle-size); + height: var(--slider-handle-size); + background-color: white; + border-radius: 50%; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25); + margin-left: calc(var(--slider-handle-size) / -2); + + &:focus { + outline: none; + box-shadow: 0 0 0 1px hsl(var(--sl-color-primary-hue), var(--sl-color-primary-saturation), 50%), + var(--sl-focus-ring-box-shadow); + } +} + +.color-picker__hue { + background-image: linear-gradient( + to right, + rgb(255, 0, 0) 0%, + rgb(255, 255, 0) 17%, + rgb(0, 255, 0) 33%, + rgb(0, 255, 255) 50%, + rgb(0, 0, 255) 67%, + rgb(255, 0, 255) 83%, + rgb(255, 0, 0) 100% + ); +} + +.color-picker__alpha { + .color-picker__alpha-gradient { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: inherit; + } +} + +.color-picker__preview { + flex: 0 0 auto; + position: relative; + width: var(--sl-input-height-small); + height: var(--sl-input-height-small); + border-radius: 50%; + margin-left: var(--sl-spacing-medium); + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: inherit; + background-color: currentColor; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + } +} + +.color-picker__preview-color { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: inherit; + border: solid 1px rgba(0, 0, 0, 0.125); +} + +.color-picker__user-input { + display: flex; + padding: 0 var(--sl-spacing-small) var(--sl-spacing-small) var(--sl-spacing-small); + + sl-input { + flex: 1 1 auto; + } + + sl-button { + flex: 0 0 auto; + margin-left: var(--sl-spacing-medium); + } +} + +.color-picker__swatches { + display: grid; + grid-template-columns: repeat(8, 1fr); + grid-gap: 6px; + justify-items: center; + border-top: solid 1px var(--sl-color-gray-90); + padding: var(--sl-spacing-small); +} + +.color-picker__swatch { + flex: 0 0 auto; + position: relative; + width: 20px; + height: 20px; + border-radius: 2px; + + .color-picker__swatch-color { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: solid 1px rgba(0, 0, 0, 0.125); + border-radius: inherit; + cursor: pointer; + } + + &:focus { + outline: none; + box-shadow: var(--sl-focus-ring-box-shadow); + } +} + +.color-picker__transparent-bg { + background-image: linear-gradient(45deg, #eee 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #eee 75%), + linear-gradient(45deg, transparent 75%, #eee 75%), linear-gradient(45deg, #eee 25%, transparent 25%); + background-size: 10px 10px; + background-position: 0 0, 0 0, -5px -5px, 5px 5px; +} + +.color-picker--disabled { + opacity: 0.5; + cursor: not-allowed; + + .color-picker__grid, + .color-picker__grid-handle, + .color-picker__slider, + .color-picker__slider-handle, + .color-picker__preview, + .color-picker__swatch, + .color-picker__swatch-color { + pointer-events: none; + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Color dropdown +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +.color-dropdown::part(panel) { + overflow: visible; +} + +.color-dropdown__trigger { + display: inline-block; + position: relative; + background-color: transparent; + border: none; + cursor: pointer; + transition: var(--sl-transition-fast) box-shadow; + -webkit-appearance: none; + + &.color-dropdown__trigger--small { + width: var(--sl-input-height-small); + height: var(--sl-input-height-small); + border-radius: var(--sl-border-radius-circle); + } + + &.color-dropdown__trigger--medium { + width: var(--sl-input-height-medium); + height: var(--sl-input-height-medium); + border-radius: var(--sl-border-radius-circle); + } + + &.color-dropdown__trigger--large { + width: var(--sl-input-height-large); + height: var(--sl-input-height-large); + border-radius: var(--sl-border-radius-circle); + } + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: inherit; + background-color: currentColor; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.25); + transition: inherit; + } + + &:focus { + outline: none; + } + + &:focus:not(.color-dropdown__trigger--disabled) { + box-shadow: var(--sl-focus-ring-box-shadow); + outline: none; + + &::before { + box-shadow: inset 0 0 0 1px var(--sl-color-primary-50); + } + } + + &.color-dropdown__trigger--disabled { + opacity: 0.5; + cursor: not-allowed; + } +} diff --git a/src/components/color-picker/color-picker.tsx b/src/components/color-picker/color-picker.tsx new file mode 100644 index 00000000..0fe07871 --- /dev/null +++ b/src/components/color-picker/color-picker.tsx @@ -0,0 +1,777 @@ +import { Component, Element, Event, EventEmitter, Prop, State, Watch, h } from '@stencil/core'; +import color from 'color'; +import { clamp } from '../../utilities/math'; + +/** + * @since 1.0 + * @status stable + * + * @part base - The component's base wrapper. + * @part swatches - The container that holds swatches. + * @part swatch - Each individual swatch. + * @part grid - The color grid. + * @part grid-handle - The color grid's handle. + * @part slider - Hue and opacity sliders. + * @part slider-handle - Hue and opacity slider handles. + * @part preview - The preview color. + * @part input - The text input. + * @part copy-button - The copy button. + */ + +@Component({ + tag: 'sl-color-picker', + styleUrl: 'color-picker.scss', + shadow: true +}) +export class ColorPicker { + constructor() { + this.handleAlphaDrag = this.handleAlphaDrag.bind(this); + this.handleAlphaInput = this.handleAlphaInput.bind(this); + this.handleAlphaKeyDown = this.handleAlphaKeyDown.bind(this); + this.handleCopy = this.handleCopy.bind(this); + this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this); + this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this); + this.handleDrag = this.handleDrag.bind(this); + this.handleDropdownAfterHide = this.handleDropdownAfterHide.bind(this); + this.handleDropdownAfterShow = this.handleDropdownAfterShow.bind(this); + this.handleDropdownHide = this.handleDropdownHide.bind(this); + this.handleDropdownShow = this.handleDropdownShow.bind(this); + this.handleGridDrag = this.handleGridDrag.bind(this); + this.handleGridKeyDown = this.handleGridKeyDown.bind(this); + this.handleHueDrag = this.handleHueDrag.bind(this); + this.handleHueInput = this.handleHueInput.bind(this); + this.handleHueKeyDown = this.handleHueKeyDown.bind(this); + this.handleLightnessInput = this.handleLightnessInput.bind(this); + this.handleSaturationInput = this.handleSaturationInput.bind(this); + this.handleTextInputChange = this.handleTextInputChange.bind(this); + this.handleTextInputKeyDown = this.handleTextInputKeyDown.bind(this); + } + + bypassValueParse = false; + copyButton: HTMLSlButtonElement; + dropdown: HTMLSlDropdownElement; + lastValueEmitted: string; + menu: HTMLElement; + textInput: HTMLSlInputElement; + trigger: HTMLElement; + + @Element() host: HTMLSlColorPickerElement; + + @State() textInputValue = ''; + @State() hue = 0; + @State() saturation = 100; + @State() lightness = 100; + @State() alpha = 100; + @State() showCopyCheckmark = false; + + /** The current color. */ + @Prop({ mutable: true, reflect: true }) value = '#ffffff'; + + /** + * The format to use for the display value. If opacity is enabled, these will translate to HEXA, RGBA, and HSLA + * respectively. The color picker will always accept user input in any format (including CSS color names) and convert + * it to the desired format. + */ + @Prop() format: 'hex' | 'rgb' | 'hsl' = 'hex'; + + /** Set to true to render the color picker inline rather than inside a dropdown. */ + @Prop() inline = false; + + /** When `inline` is true, this determines the size of the color picker's trigger. */ + @Prop() size: 'small' | 'medium' | 'large' = 'medium'; + + /** Set to true to disable the color picker. */ + @Prop() disabled = false; + + /** Whether to show the opacity slider. */ + @Prop() opacity = false; + + /** By default, the value will be set in lowercase. Set this to true to set it in uppercase instead. */ + @Prop() uppercase = false; + + /** + * An array of predefined color swatches to display. Can include any format the color picker can parse, including + * HEX(A), RGB(A), HSL(A), and CSS color names. + */ + @Prop() swatches = [ + '#d0021b', + '#f5a623', + '#f8e71c', + '#8b572a', + '#7ed321', + '#417505', + '#bd10e0', + '#9013fe', + '#4a90e2', + '#50e3c2', + '#b8e986', + '#000', + '#444', + '#888', + '#ccc', + '#fff' + ]; + + /** Emitted when the color picker's value changes. */ + @Event() slChange: EventEmitter; + + /** Emitted when the color picker opens. Calling `event.preventDefault()` will prevent it from being opened. */ + @Event() slShow: EventEmitter; + + /** Emitted after the color picker opens and all transitions are complete. */ + @Event() slAfterShow: EventEmitter; + + /** Emitted when the color picker closes. Calling `event.preventDefault()` will prevent it from being closed. */ + @Event() slHide: EventEmitter; + + /** Emitted after the color picker closes and all transitions are complete. */ + @Event() slAfterHide: EventEmitter; + + @Watch('value') + handleValueChange(newValue: string, oldValue: string) { + if (!this.bypassValueParse) { + const newColor = this.parseColor(newValue); + + if (newColor) { + this.textInputValue = this.value; + this.hue = newColor.hsla.h; + this.saturation = newColor.hsla.s; + this.lightness = newColor.hsla.l; + this.alpha = newColor.hsla.a * 100; + } else { + this.textInputValue = oldValue; + } + } + + if (this.value !== this.lastValueEmitted) { + this.slChange.emit(); + this.lastValueEmitted = this.value; + } + } + + componentWillLoad() { + if (!this.setColor(this.value)) { + this.setColor(`#ffff`); + } + + this.textInputValue = this.value; + this.lastValueEmitted = this.value; + this.syncValues(); + } + + handleCopy() { + this.textInput.select().then(() => { + document.execCommand('copy'); + this.copyButton.setFocus(); + this.showCopyCheckmark = true; + setTimeout(() => (this.showCopyCheckmark = false), 1000); + }); + } + + handleHueInput(event: Event) { + const target = event.target as HTMLInputElement; + this.hue = clamp(Number(target.value), 0, 360); + } + + handleSaturationInput(event: Event) { + const target = event.target as HTMLInputElement; + this.saturation = clamp(Number(target.value), 0, 100); + } + + handleLightnessInput(event: Event) { + const target = event.target as HTMLInputElement; + this.lightness = clamp(Number(target.value), 0, 100); + } + + handleAlphaInput(event: Event) { + const target = event.target as HTMLInputElement; + this.alpha = clamp(Number(target.value), 0, 100); + } + + handleAlphaDrag(event: any) { + const container = this.host.shadowRoot.querySelector('.color-picker__slider.color-picker__alpha') as HTMLElement; + const handle = container.querySelector('.color-picker__slider-handle') as HTMLElement; + const { width } = container.getBoundingClientRect(); + + handle.focus(); + event.preventDefault(); + + this.handleDrag(event, container, x => { + this.alpha = clamp((x / width) * 100, 0, 100); + this.syncValues(); + }); + } + + handleHueDrag(event: any) { + const container = this.host.shadowRoot.querySelector('.color-picker__slider.color-picker__hue') as HTMLElement; + const handle = container.querySelector('.color-picker__slider-handle') as HTMLElement; + const { width } = container.getBoundingClientRect(); + + handle.focus(); + event.preventDefault(); + + this.handleDrag(event, container, x => { + this.hue = clamp((x / width) * 360, 0, 360); + this.syncValues(); + }); + } + + handleGridDrag(event: any) { + const grid = this.host.shadowRoot.querySelector('.color-picker__grid') as HTMLElement; + const handle = grid.querySelector('.color-picker__grid-handle') as HTMLElement; + const { width, height } = grid.getBoundingClientRect(); + + handle.focus(); + event.preventDefault(); + + this.handleDrag(event, grid, (x, y) => { + this.saturation = clamp((x / width) * 100, 0, 100); + this.lightness = clamp(100 - (y / height) * 100, 0, 100); + this.syncValues(); + }); + } + + handleDrag(event: any, container: HTMLElement, onMove: (x: number, y: number) => void) { + if (this.disabled) { + return false; + } + + const move = (event: any) => { + const dims = container.getBoundingClientRect(); + const offsetX = dims.left + container.ownerDocument.defaultView.pageXOffset; + const offsetY = dims.top + container.ownerDocument.defaultView.pageYOffset; + const x = (event.changedTouches ? event.changedTouches[0].pageX : event.pageX) - offsetX; + const y = (event.changedTouches ? event.changedTouches[0].pageY : event.pageY) - offsetY; + + onMove(x, y); + }; + + // Move on init + move(event); + + const stop = () => { + document.removeEventListener('mousemove', move); + document.removeEventListener('touchmove', move); + document.removeEventListener('mouseup', stop); + document.removeEventListener('touchend', stop); + }; + + document.addEventListener('mousemove', move); + document.addEventListener('touchmove', move); + document.addEventListener('mouseup', stop); + document.addEventListener('touchend', stop); + } + + handleAlphaKeyDown(event: KeyboardEvent) { + const increment = event.shiftKey ? 10 : 1; + + if (event.key === 'ArrowLeft') { + event.preventDefault(); + this.alpha = clamp(this.alpha - increment, 0, 100); + this.syncValues(); + } + + if (event.key === 'ArrowRight') { + event.preventDefault(); + this.alpha = clamp(this.alpha + increment, 0, 100); + this.syncValues(); + } + + if (event.key === 'Home') { + event.preventDefault(); + this.alpha = 0; + this.syncValues(); + } + + if (event.key === 'End') { + event.preventDefault(); + this.alpha = 100; + this.syncValues(); + } + } + + handleHueKeyDown(event: KeyboardEvent) { + const increment = event.shiftKey ? 10 : 1; + + if (event.key === 'ArrowLeft') { + event.preventDefault(); + this.hue = clamp(this.hue - increment, 0, 360); + this.syncValues(); + } + + if (event.key === 'ArrowRight') { + event.preventDefault(); + this.hue = clamp(this.hue + increment, 0, 360); + this.syncValues(); + } + + if (event.key === 'Home') { + event.preventDefault(); + this.hue = 0; + this.syncValues(); + } + + if (event.key === 'End') { + event.preventDefault(); + this.hue = 360; + this.syncValues(); + } + } + + handleGridKeyDown(event: KeyboardEvent) { + const increment = event.shiftKey ? 10 : 1; + + if (event.key === 'ArrowLeft') { + event.preventDefault(); + this.saturation = clamp(this.saturation - increment, 0, 100); + this.syncValues(); + } + + if (event.key === 'ArrowRight') { + event.preventDefault(); + this.saturation = clamp(this.saturation + increment, 0, 100); + this.syncValues(); + } + + if (event.key === 'ArrowUp') { + event.preventDefault(); + this.lightness = clamp(this.lightness + increment, 0, 100); + this.syncValues(); + } + + if (event.key === 'ArrowDown') { + event.preventDefault(); + this.lightness = clamp(this.lightness - increment, 0, 100); + this.syncValues(); + } + } + + handleTextInputChange(event: CustomEvent) { + const target = event.target as HTMLInputElement; + + this.setColor(target.value); + target.value = this.value; + event.stopPropagation(); + } + + handleTextInputKeyDown(event: KeyboardEvent) { + if (event.key === 'Enter') { + this.setColor(this.textInput.value); + this.textInput.value = this.value; + setTimeout(() => this.textInput.select()); + } + } + + handleDocumentKeyDown(event: KeyboardEvent) { + // Close when pressing escape or tab + if (event.key === 'Escape') { + this.dropdown.hide(); + } + + // Close when tabbing out of the color picker + if (event.key === 'Tab') { + setTimeout(() => { + if (document.activeElement && document.activeElement.closest('sl-color-picker') !== this.host) { + this.dropdown.hide(); + } + }); + } + } + + handleDocumentMouseDown(event: MouseEvent) { + const target = event.target as HTMLElement; + + // Close when clicking outside of the dropdown + if (target.closest('sl-color-picker') !== this.host) { + this.dropdown.hide(); + } + } + + handleDropdownShow(event: CustomEvent) { + event.stopPropagation(); + this.slShow.emit(); + } + + handleDropdownAfterShow(event: CustomEvent) { + event.stopPropagation(); + this.slAfterShow.emit(); + } + + handleDropdownHide(event: CustomEvent) { + event.stopPropagation(); + this.slHide.emit(); + } + + handleDropdownAfterHide(event: CustomEvent) { + event.stopPropagation(); + this.slAfterHide.emit(); + } + + normalizeColorString(colorString: string) { + // + // The color module we're using doesn't parse % values for the alpha channel in RGBA and HSLA. It also doesn't parse + // hex colors when the # is missing. This pre-parser tries to normalize these edge cases to provide a better + // experience for users who type in color values. + // + if (/rgba?/.test(colorString)) { + const rgba = colorString + .replace(/[^\d.%]/g, ' ') + .split(' ') + .map(val => val.trim()) + .filter(val => val.length); + + if (rgba.length < 4) { + rgba[3] = '1'; + } + + if (rgba[3].indexOf('%') > -1) { + rgba[3] = (Number(rgba[3].replace(/%/g, '')) / 100).toString(); + } + + return `rgba(${rgba[0]}, ${rgba[1]}, ${rgba[2]}, ${rgba[3]})`; + } + + if (/hsla?/.test(colorString)) { + const hsla = colorString + .replace(/[^\d.%]/g, ' ') + .split(' ') + .map(val => val.trim()) + .filter(val => val.length); + + if (hsla.length < 4) { + hsla[3] = '1'; + } + + if (hsla[3].indexOf('%') > -1) { + hsla[3] = (Number(hsla[3].replace(/%/g, '')) / 100).toString(); + } + + return `hsla(${hsla[0]}, ${hsla[1]}, ${hsla[2]}, ${hsla[3]})`; + } + + if (/^[0-9a-f]+$/.test(colorString)) { + return `#${colorString}`; + } + + return colorString; + } + + parseColor(colorString: string) { + function toHex(value: number) { + const hex = Math.round(value).toString(16); + return hex.length === 1 ? `0${hex}` : hex; + } + + let parsed: any; + + // The color module has a weak parser, so we normalize certain things to make the user experience better + colorString = this.normalizeColorString(colorString); + + try { + parsed = color(colorString); + } catch { + return false; + } + + const hsl = { + h: parsed.hsl().color[0], + s: parsed.hsl().color[1], + l: parsed.hsl().color[2], + a: parsed.hsl().valpha + }; + + const rgb = { + r: parsed.rgb().color[0], + g: parsed.rgb().color[1], + b: parsed.rgb().color[2], + a: parsed.rgb().valpha + }; + + const hex = { + r: toHex(parsed.rgb().color[0]), + g: toHex(parsed.rgb().color[1]), + b: toHex(parsed.rgb().color[2]), + a: toHex(parsed.rgb().valpha * 255) + }; + + return { + hsl: { + h: hsl.h, + s: hsl.s, + l: hsl.l, + string: this.setLetterCase(`hsl(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%)`) + }, + hsla: { + h: hsl.h, + s: hsl.s, + l: hsl.l, + a: hsl.a, + string: this.setLetterCase( + `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%, ${Number( + hsl.a.toFixed(2).toString() + )})` + ) + }, + rgb: { + r: rgb.r, + g: rgb.g, + b: rgb.b, + string: this.setLetterCase(`rgb(${Math.round(rgb.r)}, ${Math.round(rgb.g)}, ${Math.round(rgb.b)})`) + }, + rgba: { + r: rgb.r, + g: rgb.g, + b: rgb.b, + a: rgb.a, + string: this.setLetterCase( + `rgba(${Math.round(rgb.r)}, ${Math.round(rgb.g)}, ${Math.round(rgb.b)}, ${Number( + rgb.a.toFixed(2).toString() + )})` + ) + }, + hex: this.setLetterCase(`#${hex.r}${hex.g}${hex.b}`), + hexa: this.setLetterCase(`#${hex.r}${hex.g}${hex.b}${hex.a}`) + }; + } + + setColor(colorString: string) { + const newColor = this.parseColor(colorString); + + if (!newColor) { + return false; + } + + this.hue = newColor.hsla.h; + this.saturation = newColor.hsla.s; + this.lightness = newColor.hsla.l; + this.alpha = this.opacity ? newColor.hsla.a * 100 : 100; + + this.syncValues(); + + return true; + } + + setLetterCase(string: string) { + return this.uppercase ? string.toUpperCase() : string.toLowerCase(); + } + + syncValues() { + const currentColor = this.parseColor( + `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha / 100})` + ); + + if (!currentColor) { + return false; + } + + // Update the value + if (this.format === 'hsl') { + this.textInputValue = this.opacity ? currentColor.hsla.string : currentColor.hsl.string; + } else if (this.format === 'rgb') { + this.textInputValue = this.opacity ? currentColor.rgba.string : currentColor.rgb.string; + } else { + this.textInputValue = this.opacity ? currentColor.hexa : currentColor.hex; + } + + // Setting this.value will trigger the watcher which parses the new color. We want to bypass that behavior because + // a) we've already done it in this function and b) conversion/rounding can lead to values changing slightly. + this.bypassValueParse = true; + this.value = this.textInputValue; + this.bypassValueParse = false; + } + + render() { + const x = this.saturation; + const y = 100 - this.lightness; + + const ColorPicker = () => { + return ( +
    +
    + +
    + +
    +
    +
    + +
    + + {this.opacity && ( +
    +
    + +
    + )} +
    + +
    +
    + +
    + (this.textInput = el)} + part="input" + size="small" + type="text" + pattern="[a-fA-F\d]+" + value={this.textInputValue} + disabled={this.disabled} + onKeyDown={this.handleTextInputKeyDown} + onSlChange={this.handleTextInputChange} + /> + (this.copyButton = el)} + part="copy-button" + slot="suffix" + class="color-picker__copy-button" + size="small" + circle + onClick={this.handleCopy} + > + + +
    + + {this.swatches && ( +
    + {this.swatches.map(swatch => ( +
    !this.disabled && this.setColor(swatch)} + onKeyDown={event => !this.disabled && event.key === 'Enter' && this.setColor(swatch)} + > +
    +
    + ))} +
    + )} +
    + ); + }; + + // Render inline + if (this.inline) { + return ; + } + + // Render as a dropdown + return ( + (this.dropdown = el)} + class="color-dropdown" + aria-disabled={this.disabled} + containingElement={this.host} + onSlShow={this.handleDropdownShow} + onSlAfterShow={this.handleDropdownAfterShow} + onSlHide={this.handleDropdownHide} + onSlAfterHide={this.handleDropdownAfterHide} + > + + + )} + +
    + +
    + + {!this.noFooter && ( +
    + +
    + )} +
    +
    + ); + } +} diff --git a/src/components/drawer/drawer.scss b/src/components/drawer/drawer.scss new file mode 100644 index 00000000..644c9a72 --- /dev/null +++ b/src/components/drawer/drawer.scss @@ -0,0 +1,167 @@ +@import 'component'; + +/** + * @prop --size: The preferred size of the drawer. This will be applied to the drawer's width or height depending on its + * `placement`. Note that the drawer will shrink to accommodate smaller screens. + */ +:host { + --size: 25rem; + + display: contents; +} + +.drawer { + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + overflow: hidden; + + &[hidden] { + display: none; + } +} + +.drawer--contained { + position: absolute; + z-index: initial; +} + +.drawer--fixed { + position: fixed; + z-index: var(--sl-z-index-drawer); +} + +.drawer__panel { + position: absolute; + display: flex; + flex-direction: column; + z-index: 2; + max-width: 100%; + max-height: 100%; + background-color: var(--sl-color-white); + box-shadow: var(--sl-shadow-x-large); + transition: var(--sl-transition-medium) transform; + overflow: auto; + pointer-events: all; + + &:focus { + outline: none; + } +} + +.drawer--top .drawer__panel { + top: 0; + left: 0; + width: 100%; + height: var(--size); + transform: translate(0, -100%); +} + +.drawer--right .drawer__panel { + top: 0; + right: 0; + width: var(--size); + height: 100%; + transform: translate(100%, 0); +} + +.drawer--bottom .drawer__panel { + bottom: 0; + left: 0; + width: 100%; + height: var(--size); + transform: translate(0, 100%); +} + +.drawer--left .drawer__panel { + top: 0; + left: 0; + width: var(--size); + height: 100%; + transform: translate(-100%, 0); +} + +.drawer--open .drawer__panel { + transform: translate(0, 0); +} + +.drawer__header { + display: flex; +} + +.drawer__title { + flex: 1 1 auto; + font-size: var(--sl-font-size-large); + line-height: var(--sl-line-height-dense); + padding: var(--sl-spacing-large); +} + +.drawer__close { + flex: 0 0 auto; + display: flex; + align-items: center; + background: none; + border: none; + border-radius: var(--sl-border-radius-small); + font-family: inherit; + font-size: var(--sl-font-size-x-large); + font-weight: inherit; + color: var(--sl-color-gray-50); + padding: 0 var(--sl-spacing-large); + cursor: pointer; + transition: var(--sl-transition-fast) color; + -webkit-appearance: none; + + &:hover, + &:focus, + &:active { + color: var(--sl-color-primary-50); + } + + &:focus { + outline: none; + } +} + +.focus-visible .drawer__close:focus { + box-shadow: var(--sl-focus-ring-box-shadow); +} + +.drawer__body { + flex: 1 1 auto; + padding: var(--sl-spacing-large); + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.drawer__footer { + text-align: right; + padding: var(--sl-spacing-large); + + ::slotted(sl-button:not(:last-of-type)) { + margin-right: var(--sl-spacing-x-small); + } +} + +.drawer__overlay { + display: block; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: var(--sl-overlay-background-color); + opacity: 0; + transition: var(--sl-transition-medium) opacity; + pointer-events: all; +} + +.drawer--contained .drawer__overlay { + position: absolute; +} + +.drawer--open .drawer__overlay { + opacity: 1; +} diff --git a/src/components/drawer/drawer.tsx b/src/components/drawer/drawer.tsx new file mode 100644 index 00000000..986a7639 --- /dev/null +++ b/src/components/drawer/drawer.tsx @@ -0,0 +1,239 @@ +import { Component, Element, Event, EventEmitter, Method, Prop, Watch, h } from '@stencil/core'; +import { lockBodyScrolling, unlockBodyScrolling } from '../../utilities/scroll'; +import { focusVisible } from '../../utilities/focus-visible'; + +let id = 0; + +/** + * @since 1.0 + * @status stable + * + * @slot - The drawer's content. + * @slot footer - The drawer's footer, usually one or more buttons representing various options. + * + * @part base - The component's base wrapper. + * @part overlay - The overlay. + * @part panel - The drawer panel (where the drawer and its is rendered). + * @part header - The drawer header. + * @part title - The drawer title. + * @part close-button - The close button. + * @part body - The drawer body. + * @part footer - The drawer footer. + */ +@Component({ + tag: 'sl-drawer', + styleUrl: 'drawer.scss', + shadow: true +}) +export class Drawer { + constructor() { + this.handleCloseClick = this.handleCloseClick.bind(this); + this.handleTransitionEnd = this.handleTransitionEnd.bind(this); + this.handleDocumentFocusIn = this.handleDocumentFocusIn.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + this.handleOverlayClick = this.handleOverlayClick.bind(this); + } + + panel: HTMLElement; + drawer: HTMLElement; + id = `drawer-${++id}`; + + @Element() host: HTMLSlDrawerElement; + + /** Indicates whether or not the drawer is open. You can use this in lieu of the show/hide methods. */ + @Prop({ mutable: true, reflect: true }) open = false; + + /** + * The drawer's label as displayed in the header. You should always include a relevant label even when using + * `no-header`, as it is required for proper accessibility. + */ + @Prop() label = ''; + + /** The direction from which the drawer will open. */ + @Prop() placement: 'top' | 'right' | 'bottom' | 'left' = 'right'; + + /** + * By default, the drawer slides out of its containing block (usually the viewport). To make the drawer slide out of + * its parent element, set this prop and add `position: relative` to the parent. + */ + @Prop() contained = false; + + /** + * Removes the header. This will also remove the default close button, so please ensure you provide an easy, + * accessible way for users to dismiss the drawer. + */ + @Prop() noHeader = false; + + /** Removes the footer. */ + @Prop() noFooter = false; + + @Watch('open') + handleOpenChange() { + this.open ? this.show() : this.hide(); + } + + /** Emitted when the drawer opens. Calling `event.preventDefault()` will prevent it from being opened. */ + @Event() slShow: EventEmitter; + + /** Emitted after the drawer opens and all transitions are complete. */ + @Event() slAfterShow: EventEmitter; + + /** Emitted when the drawer closes. Calling `event.preventDefault()` will prevent it from being closed. */ + @Event() slHide: EventEmitter; + + /** Emitted after the drawer closes and all transitions are complete. */ + @Event() slAfterHide: EventEmitter; + + /** Emitted when the overlay is clicked. Calling `event.preventDefault()` will prevent the dialog from closing. */ + @Event() slOverlayDismiss: EventEmitter; + + componentDidLoad() { + focusVisible.observe(this.drawer); + + // Show on init if open + if (this.open) { + this.show(); + } + } + + componentDidUnload() { + focusVisible.unobserve(this.drawer); + unlockBodyScrolling(this.host); + } + + /** Shows the drawer */ + @Method() + async show() { + const slShow = this.slShow.emit(); + + if (slShow.defaultPrevented) { + return false; + } + + this.drawer.hidden = false; + this.host.clientWidth; // force a reflow + this.open = true; + + // Lock body scrolling only if the drawer isn't contained + if (!this.contained) { + lockBodyScrolling(this.host); + } + + document.addEventListener('focusin', this.handleDocumentFocusIn); + } + + /** Hides the drawer */ + @Method() + async hide() { + const slHide = this.slHide.emit(); + + if (slHide.defaultPrevented) { + return false; + } + + this.open = false; + + unlockBodyScrolling(this.host); + + document.removeEventListener('focusin', this.handleDocumentFocusIn); + } + + handleCloseClick() { + this.hide(); + } + + handleDocumentFocusIn(event: Event) { + const target = event.target as HTMLElement; + + // Trap focus only if the drawer is NOT contained + if (!this.contained && target.closest('sl-drawer') !== this.host) { + this.panel.focus(); + } + } + + handleKeyDown(event: KeyboardEvent) { + if (event.key === 'Escape') { + this.hide(); + } + } + + handleOverlayClick() { + const slOverlayDismiss = this.slOverlayDismiss.emit(); + + if (!slOverlayDismiss.defaultPrevented) { + this.hide(); + } + } + + handleTransitionEnd(event: TransitionEvent) { + const target = event.target as HTMLElement; + + // Ensure we only emit one event when the target element is no longer visible + if (event.propertyName === 'transform' && target.classList.contains('drawer__panel')) { + this.drawer.hidden = !this.open; + this.open ? this.slAfterShow.emit() : this.slAfterHide.emit(); + + if (this.open) { + this.panel.focus(); + } + } + } + + render() { + return ( +
    (this.drawer = el)} + part="base" + class={{ + drawer: true, + 'drawer--open': this.open, + 'drawer--top': this.placement === 'top', + 'drawer--right': this.placement === 'right', + 'drawer--bottom': this.placement === 'bottom', + 'drawer--left': this.placement === 'left', + 'drawer--contained': this.contained, + 'drawer--fixed': !this.contained + }} + onKeyDown={this.handleKeyDown} + onTransitionEnd={this.handleTransitionEnd} + hidden + > +
    + +
    (this.panel = el)} + part="panel" + class="drawer__panel" + role="dialog" + aria-modal="true" + aria-hidden={!this.open} + aria-label={this.noHeader ? this.label : null} + aria-labeledby={!this.noHeader ? `${this.id}-title` : null} + tabIndex={0} + > + {!this.noHeader && ( +
    + + {/* If there's no label, use an invisible character to prevent the heading from collapsing */} + {this.label || String.fromCharCode(65279)} + + +
    + )} + +
    + +
    + + {!this.noFooter && ( +
    + +
    + )} +
    +
    + ); + } +} diff --git a/src/components/dropdown/dropdown.scss b/src/components/dropdown/dropdown.scss new file mode 100644 index 00000000..078e5a2e --- /dev/null +++ b/src/components/dropdown/dropdown.scss @@ -0,0 +1,37 @@ +@import 'component'; + +:host { + display: inline-block; +} + +.dropdown { + position: relative; +} + +.dropdown__trigger { + display: block; +} + +.dropdown__panel { + position: absolute; + z-index: var(--sl-z-index-dropdown); + font-family: var(--sl-font-sans); + font-size: var(--sl-font-size-medium); + font-weight: var(--sl-font-weight-normal); + color: var(--color); + background-color: var(--sl-color-white); + border: solid 1px var(--sl-color-gray-90); + border-radius: 4px; + box-shadow: var(--sl-shadow-large); + opacity: 0; + overflow: auto; + transition: var(--sl-transition-fast) opacity; + + &.popover-visible { + opacity: 1; + } + + ::slotted(sl-menu) { + max-height: 50vh; + } +} diff --git a/src/components/dropdown/dropdown.tsx b/src/components/dropdown/dropdown.tsx new file mode 100644 index 00000000..f809bba8 --- /dev/null +++ b/src/components/dropdown/dropdown.tsx @@ -0,0 +1,287 @@ +import { Component, Element, Event, EventEmitter, Method, Prop, Watch, h } from '@stencil/core'; +import Popover from '../../utilities/popover'; + +let id = 0; + +/** + * @since 1.0 + * @status stable + * + * @slot trigger - The dropdown's trigger, usually a `` element. + * @slot - The dropdown's content. + * + * @part base - The component's base wrapper. + * @part trigger - The container that wraps the trigger. + * @part panel - The panel that gets shown when the dropdown is open. + */ + +@Component({ + tag: 'sl-dropdown', + styleUrl: 'dropdown.scss', + shadow: true +}) +export class Dropdown { + constructor() { + this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this); + this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this); + this.handlePanelSelect = this.handlePanelSelect.bind(this); + this.handleTriggerKeyDown = this.handleTriggerKeyDown.bind(this); + this.togglePanel = this.togglePanel.bind(this); + } + + id = `dropdown-${++id}`; + ignoreMouseEvents = false; + ignoreMouseTimeout: any; + ignoreOpenWatcher = false; + panel: HTMLElement; + popover: Popover; + trigger: HTMLElement; + + @Element() host: HTMLSlDropdownElement; + + /** Indicates whether or not the dropdown is open. You can use this in lieu of the show/hide methods. */ + @Prop({ mutable: true, reflect: true }) open = false; + + /** + * The preferred placement of the dropdown panel. Note that the actual placement may vary as needed to keep the panel + * inside of the viewport. + */ + @Prop() placement: + | 'top' + | 'top-start' + | 'top-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'right' + | 'right-start' + | 'right-end' + | 'left' + | 'left-start' + | 'left-end' = 'bottom-start'; + + /** Determines whether the dropdown should hide when a menu item is selected. */ + @Prop() closeOnSelect = true; + + /** The dropdown will close when the user interacts outside of this element (e.g. clicking). */ + @Prop() containingElement: HTMLElement = this.host; + + /** The distance in pixels from which to offset the panel away from its trigger. */ + @Prop() distance = 2; + + /** The distance in pixels from which to offset the panel along its trigger. */ + @Prop() skidding = 0; + + /** Emitted when the dropdown opens. Calling `event.preventDefault()` will prevent it from being opened. */ + @Event() slShow: EventEmitter; + + /** Emitted after the dropdown opens and all transitions are complete. */ + @Event() slAfterShow: EventEmitter; + + /** Emitted when the dropdown closes. Calling `event.preventDefault()` will prevent it from being closed. */ + @Event() slHide: EventEmitter; + + /** Emitted after the dropdown closes and all transitions are complete. */ + @Event() slAfterHide: EventEmitter; + + @Watch('open') + handleOpenChange() { + if (!this.ignoreOpenWatcher) { + this.open ? this.show() : this.hide(); + } + } + + @Watch('placement') + @Watch('distance') + @Watch('skidding') + handlePopoverOptionsChange() { + this.popover.setOptions({ placement: this.placement }); + } + + componentDidLoad() { + this.popover = new Popover(this.trigger, this.panel, { + placement: this.placement, + skidding: this.skidding, + distance: this.distance, + onAfterHide: () => this.slAfterHide.emit(), + onAfterShow: () => this.slAfterShow.emit(), + onTransitionEnd: () => { + if (!this.open) { + this.panel.scrollTop = 0; + } + } + }); + + // Show on init if open + if (this.open) { + this.show(); + } + } + + componentDidUnload() { + this.hide(); + this.popover.destroy(); + } + + /** Shows the dropdown panel */ + @Method() + async show() { + this.ignoreOpenWatcher = true; + this.open = true; + + const slShow = this.slShow.emit(); + + if (slShow.defaultPrevented) { + this.open = false; + this.ignoreOpenWatcher = false; + return; + } + + this.popover.show(); + this.ignoreOpenWatcher = false; + + this.panel.addEventListener('slSelect', this.handlePanelSelect); + document.addEventListener('mousedown', this.handleDocumentMouseDown); + document.addEventListener('keydown', this.handleDocumentKeyDown); + } + + /** Hides the dropdown panel */ + @Method() + async hide() { + this.ignoreOpenWatcher = true; + this.open = false; + + const slHide = this.slHide.emit(); + + if (slHide.defaultPrevented) { + this.open = true; + this.ignoreOpenWatcher = false; + return; + } + + this.popover.hide(); + this.ignoreOpenWatcher = false; + + this.panel.removeEventListener('slSelect', this.handlePanelSelect); + document.removeEventListener('mousedown', this.handleDocumentMouseDown); + document.removeEventListener('keydown', this.handleDocumentKeyDown); + } + + getMenu() { + return this.panel + .querySelector('slot') + .assignedElements({ flatten: true }) + .filter(el => el.tagName.toLowerCase() === 'sl-menu')[0] as HTMLSlMenuElement; + } + + handleDocumentKeyDown(event: KeyboardEvent) { + // Close when escape is pressed + if (event.key === 'Escape') { + this.hide(); + return; + } + + // Close when tabbing results in the focus leaving the close element + if (event.key === 'Tab') { + setTimeout(() => { + if ( + document.activeElement && + document.activeElement.closest(this.containingElement.tagName.toLowerCase()) !== this.containingElement + ) { + this.hide(); + return; + } + }); + } + + // Prevent scrolling when certain keys are pressed + if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) { + event.preventDefault(); + } + + const menu = this.getMenu(); + + // If a menu is present, focus on it when certain keys are pressed + if (menu && ['ArrowDown', 'ArrowUp'].includes(event.key)) { + event.preventDefault(); + menu.setFocus(); + return; + } + + // All other keys focus the menu and pass the event through to menu (necessary for type-to-search to work) + if (menu && event.target !== menu) { + menu.setFocus(); + menu.dispatchEvent(new KeyboardEvent(event.type, event)); + return; + } + } + + handleDocumentMouseDown(event: MouseEvent) { + const target = event.target as HTMLElement; + + // Close when clicking outside of the close element + if (target.closest(this.containingElement.tagName.toLowerCase()) !== this.containingElement) { + this.hide(); + return; + } + } + + handlePanelSelect(event: CustomEvent) { + const target = event.target as HTMLElement; + + // Hide the dropdown when a menu item is selected + if (this.closeOnSelect && target.tagName.toLowerCase() === 'sl-menu') { + this.hide(); + } + } + + handleTriggerKeyDown(event: KeyboardEvent) { + // Open the panel when pressing down or up while focused on the trigger + if (!this.open && ['ArrowDown', 'ArrowUp'].includes(event.key)) { + this.show(); + event.preventDefault(); + event.stopPropagation(); + } + } + + togglePanel() { + this.open ? this.hide() : this.show(); + } + + render() { + return ( +
    + (this.trigger = el)} + onKeyDown={this.handleTriggerKeyDown} + onClick={this.togglePanel} + > + + + +
    (this.panel = el)} + part="panel" + class="dropdown__panel" + role="menu" + aria-hidden={!this.open} + aria-labeledby={this.id} + hidden + > + +
    +
    + ); + } +} diff --git a/src/components/form/form.scss b/src/components/form/form.scss new file mode 100644 index 00000000..4c0fc987 --- /dev/null +++ b/src/components/form/form.scss @@ -0,0 +1,5 @@ +@import 'component'; + +:host { + display: block; +} diff --git a/src/components/form/form.tsx b/src/components/form/form.tsx new file mode 100644 index 00000000..4bd29bde --- /dev/null +++ b/src/components/form/form.tsx @@ -0,0 +1,247 @@ +import { Component, Event, EventEmitter, Method, h } from '@stencil/core'; + +interface FormControl { + tag: string; + serialize: (el: HTMLElement, formData: FormData) => void; + click?: (event: MouseEvent) => any; + keyDown?: (event: KeyboardEvent) => any; +} + +/** + * @since 1.0 + * @status experimental + * + * @slot - The form's content. + * + * @part base - The component's base wrapper. + */ + +@Component({ + tag: 'sl-form', + styleUrl: 'form.scss', + shadow: true +}) +export class Form { + form: HTMLElement; + formControls: FormControl[]; + + constructor() { + this.formControls = [ + { + tag: 'button', + serialize: (el: HTMLButtonElement, formData) => + el.name && !el.disabled ? formData.append(el.name, el.value) : null, + click: event => { + const target = event.target as HTMLButtonElement; + if (target.type === 'submit') { + this.submit(); + } + } + }, + { + tag: 'input', + serialize: (el: HTMLInputElement, formData) => { + if (!el.name || el.disabled) { + return; + } + + if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) { + return; + } + + if (el.type === 'file') { + [...el.files].map(file => formData.append(el.name, file)); + return; + } + + formData.append(el.name, el.value); + }, + click: event => { + const target = event.target as HTMLInputElement; + if (target.type === 'submit') { + this.submit(); + } + }, + keyDown: event => { + const target = event.target as HTMLInputElement; + if (event.key === 'Enter' && !['checkbox', 'file', 'radio'].includes(target.type)) { + this.submit(); + } + } + }, + { + tag: 'select', + serialize: (el: HTMLSelectElement, formData) => { + if (el.name && !el.disabled) { + if (el.multiple) { + const selectedOptions = [...el.querySelectorAll('option:checked')]; + if (selectedOptions.length) { + selectedOptions.map((option: HTMLOptionElement) => formData.append(el.name, option.value)); + } else { + formData.append(el.name, ''); + } + } else { + formData.append(el.name, el.value); + } + } + } + }, + { + tag: 'sl-button', + serialize: (el: HTMLSlButtonElement, formData) => + el.name && !el.disabled ? formData.append(el.name, el.value) : null, + click: event => { + const target = event.target as HTMLSlButtonElement; + if (target.submit) { + this.submit(); + } + } + }, + { + tag: 'sl-checkbox', + serialize: (el: HTMLSlCheckboxElement, formData) => + el.name && el.checked && !el.disabled ? formData.append(el.name, el.value) : null + }, + { + tag: 'sl-input', + serialize: (el: HTMLSlInputElement, formData) => + el.name && !el.disabled ? formData.append(el.name, el.value) : null, + keyDown: event => { + if (event.key === 'Enter') { + this.submit(); + } + } + }, + { + tag: 'sl-radio', + serialize: (el: HTMLSlRadioElement, formData) => + el.name && el.checked && !el.disabled ? formData.append(el.name, el.value) : null + }, + { + tag: 'sl-range', + serialize: (el: HTMLSlRangeElement, formData) => { + if (el.name && !el.disabled) { + formData.append(el.name, el.value + ''); + } + } + }, + { + tag: 'sl-select', + serialize: (el: HTMLSlSelectElement, formData) => { + if (el.name && !el.disabled) { + if (el.multiple) { + const selectedOptions = [...el.value]; + if (selectedOptions.length) { + selectedOptions.map(value => formData.append(el.name, value)); + } else { + formData.append(el.name, ''); + } + } else { + formData.append(el.name, el.value + ''); + } + } + } + }, + { + tag: 'sl-switch', + serialize: (el: HTMLSlSwitchElement, formData) => + el.name && el.checked && !el.disabled ? formData.append(el.name, el.value) : null + }, + { + tag: 'sl-textarea', + serialize: (el: HTMLSlTextareaElement, formData) => + el.name && !el.disabled ? formData.append(el.name, el.value) : null + }, + { + tag: 'textarea', + serialize: (el: HTMLTextAreaElement, formData) => + el.name && !el.disabled ? formData.append(el.name, el.value) : null + } + ]; + + this.handleClick = this.handleClick.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** Emitted when the form is submitted. */ + @Event() slSubmit: EventEmitter; + + /** Serializes all form controls elements and returns a `FormData` object. */ + @Method() + async getFormData() { + const formData = new FormData(); + const formControls = await this.getFormControls(); + + formControls.map(el => this.serializeElement(el, formData)); + + return formData; + } + + /** Gets all form control elements (native and custom). */ + @Method() + async getFormControls() { + const slot = this.form.querySelector('slot'); + const tags = this.formControls.map(control => control.tag); + return slot + .assignedElements({ flatten: true }) + .filter(el => tags.includes(el.tagName.toLowerCase())) as HTMLElement[]; + } + + /** Submits the form. */ + @Method() + async submit() { + const formData = await this.getFormData(); + const formControls = await this.getFormControls(); + + this.slSubmit.emit({ formData, formControls }); + } + + handleClick(event: MouseEvent) { + const target = event.target as HTMLElement; + const tag = target.tagName.toLowerCase(); + + for (const formControl of this.formControls) { + if (formControl.tag === tag && formControl.click) { + formControl.click(event); + } + } + } + + handleKeyDown(event: KeyboardEvent) { + const target = event.target as HTMLElement; + const tag = target.tagName.toLowerCase(); + + for (const formControl of this.formControls) { + if (formControl.tag === tag && formControl.keyDown) { + formControl.keyDown(event); + } + } + } + + serializeElement(el: HTMLElement, formData: FormData) { + const tag = el.tagName.toLowerCase(); + + for (const formControl of this.formControls) { + if (formControl.tag === tag) { + return formControl.serialize(el, formData); + } + } + + return null; + } + + render() { + return ( +
    (this.form = el)} + part="base" + class="form" + role="form" + onClick={this.handleClick} + onKeyDown={this.handleKeyDown} + > + +
    + ); + } +} diff --git a/src/components/icon/icon.scss b/src/components/icon/icon.scss new file mode 100644 index 00000000..dea3b8b4 --- /dev/null +++ b/src/components/icon/icon.scss @@ -0,0 +1,16 @@ +@import 'component'; + +:host { + display: inline-block; + width: 1em; + height: 1em; + contain: strict; + box-sizing: content-box !important; +} + +.icon, +svg { + display: block; + height: 100%; + width: 100%; +} diff --git a/src/components/icon/icon.tsx b/src/components/icon/icon.tsx new file mode 100644 index 00000000..0cd5610d --- /dev/null +++ b/src/components/icon/icon.tsx @@ -0,0 +1,83 @@ +import { Component, Event, EventEmitter, Prop, State, Watch, getAssetPath, h } from '@stencil/core'; + +import { requestIcon } from './request'; + +const parser = new DOMParser(); + +/** + * @since 1.0 + * @status stable + * + * @part base - The component's base wrapper. + */ + +@Component({ + tag: 'sl-icon', + styleUrl: 'icon.scss', + shadow: true, + assetsDirs: ['icons'] +}) +export class Icon { + @State() svg: string; + + /** The name of the icon to draw. */ + @Prop() name: string; + + /** An external URL of an SVG file. */ + @Prop() src: string; + + /** An alternative description to use for accessibility. If omitted, the name or src will be used to generate it. */ + @Prop() label: string; + + /** Emitted when the icon has loaded. */ + @Event() slLoad: EventEmitter; + + /** Emitted when the icon failed to load. */ + @Event() slError: EventEmitter; + + @Watch('name') + @Watch('src') + handleChange() { + this.setIcon(); + } + + componentDidLoad() { + this.setIcon(); + } + + getLabel() { + let label = ''; + + if (this.label) { + label = this.label; + } else if (this.name) { + label = this.name.replace(/-/g, ' '); + } else if (this.src) { + label = this.src.replace(/.*\//, '').replace(/-/g, ' ').replace(/\.svg/i, ''); + } + + return label; + } + + setIcon() { + const url = this.name ? getAssetPath(`./icons/${this.name}.svg`) : this.src; + requestIcon(url) + .then(source => { + const doc = parser.parseFromString(source, 'text/html'); + const svg = doc.body.querySelector('svg'); + + if (svg) { + this.svg = svg.outerHTML; + this.slLoad.emit(); + } else { + this.svg = ''; + this.slError.emit(); + } + }) + .catch(error => this.slError.emit(error)); + } + + render() { + return