Compare commits

...

15 Commits

Author SHA1 Message Date
Jonathon Menz 78a5aefbad Fixed some styling issues 2024-02-20 11:03:53 -08:00
Ed Wilde fb86781725
Improved accessibility and tooling (#65)
* Updated text contrast to meet WCAG 2.1 AA standard 
* Added semantic elements and some Aria markup
* Replaced compass with modern tooling
* Replaced bitmap sprite with a vector sprite
2023-11-07 13:07:31 -08:00
Jono Menz 15f0171e51
Update README.md 2023-06-22 16:28:47 -07:00
Jono Menz d40ee44938
Update README.md 2023-06-22 16:17:36 -07:00
Florian Thoma 5e99263c33 add namespace to config, fixes #63 2023-06-22 15:53:53 -07:00
Chris Penny f9304b3441 Move templates into JonoM namespaces 2023-02-27 20:44:46 -08:00
Chris Penny 71a3ce1327 Add support for Silverstripe 5 2023-02-27 20:44:46 -08:00
Callan Stretton aaa76deba0 added null coalescing operator to fix deprecation error 2022-11-22 16:10:08 -08:00
Ed Chipman 507632fd39
Improved flexibility around enabling better navigator and edit link (#56)
* Added ability for extension to be applied to non-SiteTree objects by moving the `isAPage()` check in to the `showBetterNavigator()` method, which can be overidden.
* Added ability for edit link to be enabled via a permission code check, configurable on a per-controller basis.
* Switched to using getField/setField for caching whether better navigator should be displayed or not.
* Adjusted readme around using custom logic to control the display of the navigator.
2022-07-14 13:08:08 -07:00
Howard Grigg 92416eceef
Fix Edit link not defined if no CMS access (#57)
In the situation that a user has draft site access but no CMS access they received a '$editLink not defined error'. This corrects that by defining it as false.
2022-07-06 10:51:07 -07:00
James Cocker f55bcdadd8
Adds ability to override "Edit in CMS" link (#55)
Adds ability to override the "Edit in CMS" link, e.g. to make it jump to editing a DataObject, instead of the page.
2021-09-09 13:54:01 -07:00
Jono Menz 8df13dce17
Update README.md 2021-01-11 13:11:59 -08:00
Jono Menz 966109c7e3
Fix yml indentation in Readme 2021-01-11 13:08:40 -08:00
3Dgoo 96558495be
New: Position and translucency options (#52) 2020-12-14 14:10:20 -08:00
3Dgoo 83172d6da6
Brought images and ReadMe up to date (#50)
* Updated Readme to use new Silverstripe capitalisation without second capital s
* Updated demo image to look like the latest version (using words like "live" instead of "published")
* Optimised images
2020-11-30 16:37:42 -08:00
45 changed files with 3722 additions and 324 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
# Ignore dependencies
node_modules
vendor
# Ignore operating system files
.DS_Store
Thumbs.db

104
README.md
View File

@ -1,8 +1,8 @@
# BetterNavigator for SilverStripe
# BetterNavigator for Silverstripe
![Diagram of module](images/demo.png)
<img src="images/demo.png" alt="Diagram of module" width="618" height="393" />
This module is intended to replicate and expand upon the functionality provided by SilverStripe's built-in SilverStripeNavigator class. It provides a handy front-end menu for CMS users which offers these features:
This module is intended to replicate and expand upon the functionality provided by Silverstripe's built-in SilverStripeNavigator class. It provides a handy front-end menu for CMS users which offers these features:
**For Content Authors**
@ -12,20 +12,24 @@ This module is intended to replicate and expand upon the functionality provided
**For Developers**
* When in Dev Mode links are included for accessing most of SilverStripe's [URL Variable Tools](http://doc.silverstripe.org/framework/en/reference/urlvariabletools)
* When in Dev Mode links are included for accessing most of Silverstripe's [URL Variable Tools](http://doc.silverstripe.org/framework/en/reference/urlvariabletools)
* Developers can access these tools on a live website by nominating themselves as a developer in the site config
## Requirements
SilverStripe 4.0 (3.1+ through previous releases)
Silverstripe 5.0 (4.0+ and 3.1+ through previous releases)
## Installation
**Composer / Packagist ([best practice](http://doc.silverstripe.org/framework/en/trunk/installation/composer))**
Add "jonom/silverstripe-betternavigator" to your requirements.
Add "jonom/silverstripe-betternavigator" to your composer requirements.
**Manually**
Download, place the folder in your project root, rename it to 'betternavigator' (if applicable) and run a dev/build?flush=1.
```
composer require jonom/silverstripe-betternavigator
```
## Upgrading
* **6.0:** the namespace for this module's templates and configuration was changed in v6 to include a `JonoM` prefix. You may need to update your template directory structure and/or app configuration accordingly.
## How to use
@ -33,10 +37,23 @@ The navigator is auto-injected into your template, and no code changes are neede
If your website uses caching, make sure BetterNavigator's output is excluded.
## Disabling the navigator
### Access developer tools on a live website
You can disable the navigator using your own custom logic by defining a `showBetterNavigator(): bool`
method in any controller with the extension applied.
You can mark certain CMS users as developers in your site's config, so they can access developer tools when logged in. Example YAML:
```
JonoM\BetterNavigator:
developers:
- 'dev@yoursite.com'
- 'otherdev@yoursite.com'
```
## Customisation
### Navigator display
You can control whether the navigator is displayed by defining a `showBetterNavigator(): bool`
method in any controller with the extension applied. By default the navigator will only show on controllers that have a `dataRecord` property that is an instance of `SilverStripe\CMS\Model\SiteTree`.
```php
public function showBetterNavigator()
@ -45,19 +62,26 @@ public function showBetterNavigator()
return $this->ShowDebugTools;
}
```
**Access developer tools on a live website**
You can mark certain CMS users as developers in your site's config, so they can access developer tools when logged in. Example YAML:
### Layout options
BetterNavigator can be made translucent when collapsed by adding the following config setting:
```
BetterNavigator:
developers:
- 'dev@yoursite.com'
- 'otherdev@yoursite.com'
JonoM\BetterNavigator:
translucent: true
```
## Customisation
BetterNavigator's default position is 'right-top', but can be changed to 'right-bottom', 'left-top' or 'left-bottom'. Example:
BetterNavigator's output is controlled by templates so it can be [easily overridden](http://doc.silverstripe.org/framework/en/topics/theme-development#overriding).
```
JonoM\BetterNavigator:
position: 'right-bottom'
```
### Template additions/overrides
BetterNavigator's output is controlled by templates so it can be [easily overridden](https://docs.silverstripe.org/en/5/developer_guides/templates/template_inheritance/#cascading-themes).
Some empty `<% include %>` placeholders are included to let you easily add more content (new buttons for instance). Just create any of these templates in your theme or app directory and add your content:
@ -67,9 +91,45 @@ Some empty `<% include %>` placeholders are included to let you easily add more
The BetterNavigator.ss template's scope is set to the page that is being viewed, so any methods available in your page controller will be available in the BetterNavigator.ss template. This should allow you to add custom links by page type and introduce complex logic if you want to.
## Bonus: better debugging tools
### Overriding the "Edit in CMS" Link
This module provide quick access to SilverStripe's built in [URL Variable Tools](http://doc.silverstripe.org/framework/en/reference/urlvariabletools) but reading their output isn't much fun. You can peek under SilverStripe's hood much more conveniently using lekoala's [SilverStripe DebugBar](https://github.com/lekoala/silverstripe-debugbar)
There may be occasions when you wish to override the "Edit in CMS" link. For example to point to the edit form for a displayed DataObject, rather than for the Page itself. To do so, simply add a `BetterNavigatorEditLink()` method to your page's Controller, e.g.:
````php
// EventsPageController.php
/**
* Return an alternative URL for the BetterNavigator Edit in CMS link.
* @return string
*/
public function BetterNavigatorEditLink()
{
$event = $this->displayedEvent();
return $event->canEdit() ? CMSEditLinkAPI::find_edit_link_for_object($event) : false;
}
````
(This example uses [sunnysideup/cms_edit_link_field](https://github.com/sunnysideup/silverstripe-cms_edit_link_field) to automatically find an edit link for a specified DataObject, but you can return any URL.)
### Overriding the permissions required for the cms edit link
By default users are required to have at least the `CMS_ACCESS_CMSMain` permission in order to see the edit link in better navigator, you can override this by setting the `better_navigator_edit_permission` configuration option on your controller to another permission code or an array of permission codes, e.g.:
```yml
My\Namespace\EventController:
better_navigator_edit_permission: "CUSTOM_PERMISSION_CODE"
better_navigator_edit_permission_mode: "any" #Optional, but can be either "any" or "all" (defaults to "all")
```
## Recommended companions
### DebugBar for better debugging tools
This module provide quick access to Silverstripe's built in [URL Variable Tools](https://docs.silverstripe.org/en/developer_guides/debugging/url_variable_tools/#url-variable-tools) but reading their output isn't much fun. You can peek under Silverstripe's hood much more conveniently using lekoala's [Silverstripe DebugBar](https://github.com/lekoala/silverstripe-debugbar)
### Environment Awareness to save your sites from yourself
[Environment Awareness](https://github.com/jonom/silverstripe-environment-awareness) makes it obvious which environment you're in, to make it less likely that you nuke something in prod. You can display the current environment [right in the navigator](https://github.com/jonom/silverstripe-environment-awareness/blob/master/docs/en/how-to-use.md#include-front-end-environment-notice).
## Maintainer contact

View File

@ -1,6 +1,6 @@
{
"name": "jonom/silverstripe-betternavigator",
"description": "Front-end utility menu for SilverStripe websites featuring administration and development tools",
"description": "Front-end utility menu for Silverstripe websites featuring administration and development tools",
"type": "silverstripe-vendormodule",
"keywords": [
"silverstripe",
@ -16,10 +16,9 @@
}
],
"require": {
"silverstripe/framework": "^4.0"
"silverstripe/framework": "^5"
},
"extra": {
"installer-name": "betternavigator",
"expose": [
"css",
"images",

View File

@ -1,11 +0,0 @@
require 'compass/import-once/activate'
http_path = "/betternavigator/"
css_dir = "css"
sass_dir = "scss"
images_dir = "images"
javascripts_dir = "javascript"
fonts_dir = "fonts"
output_style = :compact
relative_assets = true
line_comments = false
sourcemap = true

View File

@ -1,55 +1,366 @@
.bn-icon-sprite, .bn-icon-close, .bn-icon-cog, .bn-icon-db, .bn-icon-devmode, .bn-icon-edit, .bn-icon-flush, .bn-icon-info, .bn-icon-tick, .bn-icon-tools, .bn-icon-user, .bn-icon-view { background-image: url('../images/bn-icon-sff60849a67.png'); background-repeat: no-repeat; }
/**
* Better navigator styles
*/
.svg-images--bn-icon--view, #BetterNavigator .bn-icon-view, .svg-images--bn-icon--user, #BetterNavigator .bn-icon-user, .svg-images--bn-icon--tools, #BetterNavigator .bn-icon-tools, .svg-images--bn-icon--tick, #BetterNavigator .bn-icon-tick, .svg-images--bn-icon--info, #BetterNavigator .bn-icon-info, .svg-images--bn-icon--flush, #BetterNavigator .bn-icon-flush, .svg-images--bn-icon--edit, #BetterNavigator .bn-icon-edit, .svg-images--bn-icon--devmode, .svg-images--bn-icon--db, #BetterNavigator .bn-icon-db, .svg-images--bn-icon--cog, #BetterNavigator .bn-icon-cog, .svg-images--bn-icon--close, #BetterNavigator .bn-icon-close {
background: url("svg/sprite.css-982681f2.svg") no-repeat;
}
.bn-icon-close { background-position: 0 0; height: 12px; width: 12px; }
.svg-images--bn-icon--close, #BetterNavigator .bn-icon-close {
background-position: 0 0;
}
.bn-icon-cog { background-position: 0 -12px; height: 17px; width: 17px; }
.svg-images--bn-icon--close-dims, #BetterNavigator .bn-icon-close {
width: 16px;
height: 16px;
}
.bn-icon-db { background-position: 0 -29px; height: 16px; width: 16px; }
.svg-images--bn-icon--cog, #BetterNavigator .bn-icon-cog {
background-position: 33.3333333333% 0;
}
.bn-icon-devmode { background-position: 0 -45px; height: 16px; width: 16px; }
.svg-images--bn-icon--cog-dims, #BetterNavigator .bn-icon-cog {
width: 16px;
height: 16px;
}
.bn-icon-edit { background-position: 0 -61px; height: 16px; width: 16px; }
.svg-images--bn-icon--db, #BetterNavigator .bn-icon-db {
background-position: 0 50%;
}
.bn-icon-flush { background-position: 0 -77px; height: 16px; width: 16px; }
.svg-images--bn-icon--db-dims, #BetterNavigator .bn-icon-db {
width: 16px;
height: 16px;
}
.bn-icon-info { background-position: 0 -93px; height: 16px; width: 16px; }
.svg-images--bn-icon--devmode {
background-position: 33.3333333333% 50%;
}
.bn-icon-tick { background-position: 0 -109px; height: 16px; width: 16px; }
.svg-images--bn-icon--devmode-dims {
width: 16px;
height: 16px;
}
.bn-icon-tools { background-position: 0 -125px; height: 16px; width: 16px; }
.svg-images--bn-icon--edit, #BetterNavigator .bn-icon-edit {
background-position: 66.6666666667% 0;
}
.bn-icon-user { background-position: 0 -141px; height: 16px; width: 16px; }
.svg-images--bn-icon--edit-dims, #BetterNavigator .bn-icon-edit {
width: 16px;
height: 16px;
}
.bn-icon-view { background-position: 0 -157px; height: 16px; width: 16px; }
.svg-images--bn-icon--flush, #BetterNavigator .bn-icon-flush {
background-position: 66.6666666667% 50%;
}
span[class^='bn-icon'], span[class*=' bn-icon'] { display: inline-block; }
.svg-images--bn-icon--flush-dims, #BetterNavigator .bn-icon-flush {
width: 16px;
height: 16px;
}
#BetterNavigator { position: fixed; top: 0; right: 0; z-index: 99999; max-height: 100%; overflow: auto; font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 16px; text-align: left; }
#BetterNavigator a { text-decoration: none; }
#BetterNavigator form { display: none; }
#BetterNavigator.collapsed { box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.5); -moz-transform-origin: right top; -ms-transform-origin: right top; -webkit-transform-origin: right top; transform-origin: right top; -moz-transform: rotate(90deg) translate(100%, 0); -ms-transform: rotate(90deg) translate(100%, 0); -webkit-transform: rotate(90deg) translate(100%, 0); transform: rotate(90deg) translate(100%, 0); border-width: 0 1px 1px 0; }
#BetterNavigator.collapsed #BetterNavigatorStatus { border-width: 0 1px 1px 0; }
#BetterNavigator.collapsed #BetterNavigatorStatus .bn-icon-close { display: none; }
#BetterNavigator.collapsed #BetterNavigatorStatus .bn-icon-cog { display: inline-block; }
#BetterNavigator.collapsed #BetterNavigatorContent { display: none; }
.svg-images--bn-icon--info, #BetterNavigator .bn-icon-info {
background-position: 0 100%;
}
#BetterNavigatorStatus { color: #fff; background: #6f6f6f; border: 1px solid #646464; border-width: 0 0 0 1px; text-transform: uppercase; cursor: pointer; padding: 10px 15px 8px; font-weight: bold; }
#BetterNavigatorStatus .bn-icon-cog { margin: -4px 8px -4px -4px; display: none; }
#BetterNavigatorStatus .bn-icon-close { float: right; margin: 1px 0 0 0; }
#BetterNavigatorStatus .bn-icon-cog, #BetterNavigatorStatus .bn-icon-close { opacity: .7; }
#BetterNavigatorStatus:hover { background: dimgray; }
#BetterNavigatorStatus:hover .bn-icon-cog, #BetterNavigatorStatus:hover .bn-icon-close { opacity: 1; }
#BetterNavigatorStatus.Live { background: #39b54a; border-color: #33a343; }
#BetterNavigatorStatus.Live:hover { background: #36ac46; }
#BetterNavigatorStatus.Draft { background: #f26c4f; border-color: #da6147; }
#BetterNavigatorStatus.Draft:hover { background: #e6674b; }
.svg-images--bn-icon--info-dims, #BetterNavigator .bn-icon-info {
width: 16px;
height: 16px;
}
#BetterNavigatorContent { padding: 6px; color: #71767a; background: #cfd8de; border: 1px solid #bac2c8; border-width: 0 0 1px 1px; }
#BetterNavigatorContent .bn-heading { text-align: center; text-transform: uppercase; font-size: 11px; margin: 8px 0 4px 0; }
#BetterNavigatorContent span[class^='bn-icon'], #BetterNavigatorContent span[class*=' bn-icon'] { margin: -2px 5px -3px -2px; }
#BetterNavigatorContent a, #BetterNavigatorContent span.bn-disabled { display: block; background: #eceff2; color: #313639; font-family: Helvetica, Arial, sans-serif; font-size: 12px; border-radius: 5px; border-bottom: 1px solid #a3aaaf; margin: 0 0 4px 0; padding: 6px 10px 5px 10px; line-height: 16px; font-weight: bold; }
#BetterNavigatorContent a .light, #BetterNavigatorContent span.bn-disabled .light { font-weight: normal; }
#BetterNavigatorContent a:focus, #BetterNavigatorContent a:hover, #BetterNavigatorContent a:active { background: #fff; color: #000; }
#BetterNavigatorContent span.bn-disabled { background: #afbac0; color: #51565a; cursor: default; }
.svg-images--bn-icon--tick, #BetterNavigator .bn-icon-tick {
background-position: 33.3333333333% 100%;
}
body > p.message { text-align: left; background: #fff; color: #222; padding: 10px 20px; margin: 0; border-bottom: 1px solid #ccc; border-left: 5px solid #1d8aff; }
.svg-images--bn-icon--tick-dims, #BetterNavigator .bn-icon-tick {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--tools, #BetterNavigator .bn-icon-tools {
background-position: 66.6666666667% 100%;
}
.svg-images--bn-icon--tools-dims, #BetterNavigator .bn-icon-tools {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--user, #BetterNavigator .bn-icon-user {
background-position: 100% 0;
}
.svg-images--bn-icon--user-dims, #BetterNavigator .bn-icon-user {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--view, #BetterNavigator .bn-icon-view {
background-position: 100% 50%;
}
.svg-images--bn-icon--view-dims, #BetterNavigator .bn-icon-view {
width: 16px;
height: 16px;
}
#BetterNavigator {
position: fixed;
z-index: 99999;
max-height: 100%;
overflow: auto;
text-align: left;
box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.25), 0px 0px 12px rgba(0, 0, 0, 0.15);
}
#BetterNavigator * {
all: initial;
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 1.2;
}
#BetterNavigator a {
text-decoration: none;
}
#BetterNavigator form {
display: none;
}
#BetterNavigator.collapsed.translucent {
opacity: 0.5;
transition: opacity 250ms;
}
#BetterNavigator.collapsed.translucent:hover {
opacity: 1;
}
#BetterNavigator.collapsed #BetterNavigatorStatus {
padding-right: 12px;
}
#BetterNavigator.collapsed #BetterNavigatorContent {
display: none;
}
#BetterNavigator.collapsed #BetterNavigatorStatusIcon {
order: -1;
}
#BetterNavigator.right-top {
right: 0;
top: 0;
}
#BetterNavigator.right-top.collapsed {
transform-origin: right top;
transform: rotate(90deg) translate(100%, 0);
}
#BetterNavigator.right-bottom {
right: 0;
bottom: 0;
}
#BetterNavigator.right-bottom.collapsed {
transform-origin: right bottom;
transform: rotate(90deg) translate(0, 100%);
}
#BetterNavigator.left-bottom {
left: 0;
bottom: 0;
}
#BetterNavigator.left-bottom.collapsed {
transform-origin: left bottom;
transform: rotate(90deg) translate(-100%, 0);
}
#BetterNavigator.left-top {
left: 0;
top: 0;
}
#BetterNavigator.left-top.collapsed {
transform-origin: left top;
transform: rotate(90deg) translate(0, -100%);
}
#BetterNavigator span[class^=bn-icon],
#BetterNavigator span[class*=" bn-icon"] {
display: inline-block;
}
#BetterNavigator .bn-icon-close {
transform: scale(1.3);
}
#BetterNavigator .bn-icon-db {
transform: scale(0.8);
}
#BetterNavigator .bn-icon-edit {
transform: scale(0.9);
}
#BetterNavigator .bn-icon-flush {
transform: scale(0.8);
}
#BetterNavigator .bn-icon-info {
transform: scale(0.7);
}
#BetterNavigator .bn-icon-tick {
transform: scale(0.7);
}
#BetterNavigator .bn-icon-tools {
transform: scale(0.9);
}
#BetterNavigator .bn-icon-view {
transform: scale(0.95);
}
#BetterNavigatorStatus {
display: flex;
gap: 10px;
justify-content: space-between;
width: 100%;
box-sizing: border-box;
align-items: center;
appearance: none;
background: #6f6f6f;
cursor: pointer;
padding: 8px 10px 8px 14px;
margin: 0;
transition: 100ms background-color ease-in-out;
white-space: nowrap;
color: #fff;
}
#BetterNavigatorStatus .status-text {
text-align: left;
color: #fff;
text-transform: uppercase;
font-family: inherit;
font-weight: bold;
font-size: 14px;
line-height: 1;
letter-spacing: 0.4px;
padding: 3px 3px 2px;
border-radius: 3px;
background: #6f6f6f;
}
#BetterNavigatorStatus:hover, #BetterNavigatorStatus:focus-visible {
background: dimgray;
}
#BetterNavigatorStatus:hover .bn-icon-cog,
#BetterNavigatorStatus:hover .bn-icon-close, #BetterNavigatorStatus:focus-visible .bn-icon-cog,
#BetterNavigatorStatus:focus-visible .bn-icon-close {
opacity: 1;
}
#BetterNavigatorStatus:focus-visible {
outline: 3px solid #646464;
outline-offset: 0;
}
#BetterNavigatorStatus.Live {
background: #06ad18;
}
#BetterNavigatorStatus.Live .status-text {
background: #068913;
}
#BetterNavigatorStatus.Live:hover {
background: #06a417;
}
#BetterNavigatorStatus.Live:focus-visible {
outline: 3px solid #059c16;
}
#BetterNavigatorStatus.Draft {
background: #e6674b;
}
#BetterNavigatorStatus.Draft .status-text {
background: #d73f1d;
}
#BetterNavigatorStatus.Draft:hover {
background: #db6247;
}
#BetterNavigatorStatus.Draft:focus-visible {
outline: 3px solid #cf5d44;
}
#BetterNavigatorStatus .bn-icon-cog,
#BetterNavigatorStatus .bn-icon-close {
opacity: 0.7;
}
#BetterNavigatorStatusIcon {
cursor: inherit;
transition: 100ms opacity ease-in-out;
}
#BetterNavigatorContent {
display: flex;
flex-direction: column;
padding: 8px;
gap: 6px;
color: #595d61;
background: #cfd8de;
min-width: 140px;
overflow: auto;
}
#BetterNavigatorContent .bn-heading {
display: block;
text-transform: uppercase;
font-size: 11px;
line-height: 1.2;
color: #595d61;
margin: 5px 0 0 0;
padding: 0;
font-weight: normal;
}
#BetterNavigatorContent span[class^=bn-icon],
#BetterNavigatorContent span[class*=" bn-icon"] {
cursor: inherit;
margin: -2px 5px -3px -2px;
}
#BetterNavigatorContent a,
#BetterNavigatorContent .bn-disabled {
display: block;
background: #eceff2;
color: #313639;
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 1.4;
border-radius: 5px;
border-bottom: 1px solid #a3aaaf;
margin: 0;
padding: 6px 10px 5px 10px;
font-weight: bold;
cursor: pointer;
transition: 100ms background-color ease-in-out;
}
#BetterNavigatorContent a .light,
#BetterNavigatorContent .bn-disabled .light {
font-weight: normal;
}
#BetterNavigatorContent a:focus-visible,
#BetterNavigatorContent a:hover {
background: #fff;
color: #000;
}
#BetterNavigatorContent a:focus-visible {
border-bottom: 1px solid transparent;
outline: 2px solid #93999e;
outline-offset: 1px;
}
#BetterNavigatorContent a:active {
background: #d4d7da;
border-color: #acb3b7;
}
#BetterNavigatorContent .bn-disabled {
background: #c6d3da;
color: #51565a;
cursor: default;
pointer-events: none;
}
#BetterNavigatorContent .bn-links {
display: flex;
flex-direction: column;
gap: 5px;
margin: 0;
padding: 0;
list-style-type: none;
}
#BetterNavigatorContent .bn-links > :last-child {
margin-bottom: 0;
}
body > p.message {
text-align: left;
background: #fff;
color: #222;
padding: 10px 20px;
margin: 0;
border-bottom: 1px solid #ccc;
border-left: 5px solid #1d8aff;
}
/*# sourceMappingURL=betternavigator.css.map */

View File

@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../scss/betternavigator.scss","../scss/_iconsprite.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;ACAA;EACI;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EAEI;;;AAGJ;EACI;EACA;;;ADnFJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGA;EAGI;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAMA;EACI;EACA;;AAEA;EACI;;AAIR;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;;AAEA;EACI;EACA;;AAIR;EACI;EACA;;AAEA;EACI;EACA;;AAIR;EACI;EACA;;AAEA;EACI;EACA;;AAIR;EACI;EACA;;AAEA;EACI;EACA;;AAKR;AAAA;EAEI;;AAGJ;EAGI;;AAQJ;EAGI;;AAGJ;EAGI;;AAGJ;EAGI;;AAGJ;EAGI;;AAGJ;EAGI;;AAGJ;EAGI;;AAQJ;EAGI;;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YA3KW;EA4KX;EACA;EACA;EACA;EACA;EACA,OA/LI;;AAiMJ;EACI;EACA,OAnMA;EAoMA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YA7LS;;AAgMb;EAEI;;AAEA;AAAA;AAAA;EAEI;;AAIR;EACI;EACA;;AAGJ;EACI,YArNI;;AAuNJ;EACI,YAvNE;;AA0NN;EACI;;AAGJ;EACI;;AAIR;EACI,YAnOK;;AAqOL;EACI,YArOG;;AAwOP;EACI;;AAGJ;EACI;;AAIR;AAAA;EAEI;;;AAIR;EACI;EACA;;;AAKJ;EACI;EACA;EACA;EACA;EACA,OA7QW;EA8QX,YA7QgB;EA8QhB;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA,OAvRO;EAwRP;EACA;EACA;;AAGJ;AAAA;EAEI;EACA;;AAGJ;AAAA;EAEI;EACA,YAlSW;EAmSX,OArSM;EAsSN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAIR;AAAA;EAEI,YA7TA;EA8TA,OA/TA;;AAkUJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI,YArUmB;EAsUnB,OAxUc;EAyUd;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAMZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA","file":"betternavigator.css"}

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><svg width="64" height="48" viewBox="0 0 64 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><svg width="16" height="16" fill="#FFF" viewBox="0 0 16 16" id="images--bn-icon--close" xmlns="http://www.w3.org/2000/svg"><path d="M11.478 11.879a.96.96 0 0 1-1.358 0L7.999 9.455l-2.121 2.423A.96.96 0 0 1 4.52 10.52L6.726 8 4.519 5.478A.96.96 0 0 1 5.877 4.12l2.122 2.425L10.12 4.12a.96.96 0 0 1 1.358 1.358L9.272 8l2.206 2.52a.96.96 0 0 1 0 1.358z"/></svg><svg width="16" height="16" fill="#FFF" viewBox="0 0 16 16" id="images--bn-icon--cog" x="16" xmlns="http://www.w3.org/2000/svg"><path d="M14.59 9.535a3.053 3.053 0 0 1 1.127-4.164l-1.572-2.723a3.017 3.017 0 0 1-1.529.414A3.052 3.052 0 0 1 9.574 0H6.429a3.009 3.009 0 0 1-.406 1.535c-.839 1.454-2.706 1.948-4.17 1.106L.281 5.364a3 3 0 0 1 1.123 1.117 3.053 3.053 0 0 1-1.12 4.16l1.572 2.723c.448-.261.967-.41 1.522-.41A3.052 3.052 0 0 1 6.42 16h3.145a3.012 3.012 0 0 1 .406-1.519 3.053 3.053 0 0 1 4.163-1.11l1.572-2.723a3.008 3.008 0 0 1-1.116-1.113zM8 11.24a3.24 3.24 0 1 1 0-6.48 3.24 3.24 0 0 1 0 6.48z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--db" y="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.582 0 0 1.119 0 2.5v2C0 5.881 3.582 7 8 7s8-1.119 8-2.5v-2C16 1.119 12.418 0 8 0z"/><path d="M8 8.5C3.582 8.5 0 7.381 0 6v3c0 1.381 3.582 2.5 8 2.5s8-1.119 8-2.5V6c0 1.381-3.582 2.5-8 2.5z"/><path d="M8 13c-4.418 0-8-1.119-8-2.5v3C0 14.881 3.582 16 8 16s8-1.119 8-2.5v-3c0 1.381-3.582 2.5-8 2.5z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--devmode" x="16" y="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 9.662c1.912 0 3.514-.65 3.61-1.498l-.9-2.522c-.211.609-1.38 1.041-2.71 1.041s-2.499-.432-2.71-1.041l-.899 2.522c.097.849 1.698 1.498 3.61 1.498zm0-5.364c.899 0 1.734-.278 1.978-.711l-.809-2.269C9.047.976 8.496.8 7.999.8s-1.048.177-1.17.518L6.02 3.587c.245.433 1.08.711 1.978.711zm7.024 6.155L12.02 9.242l.346.966c-.018 1.023-2.003 1.839-4.366 1.839s-4.35-.815-4.366-1.839l.346-.966-3.004 1.211c-.842.339-.878.967-.078 1.395l5.65 3.03c.798.428 2.106.428 2.906 0l5.65-3.03c.799-.428.763-1.056-.079-1.395z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--edit" x="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.049 1.951c-1.154-1.154-2.02-.982-2.02-.982L1.768 11.229l-.808 3.81 3.81-.808L15.031 3.973c-.001 0 .173-.866-.982-2.022zM4.544 13.774l-1.299.28c-.125-.234-.276-.469-.552-.746s-.511-.426-.746-.553l.28-1.298.376-.375s.706.014 1.505.813c.798.797.813 1.505.813 1.505l-.377.374z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--flush" x="32" y="16" xmlns="http://www.w3.org/2000/svg"><path d="M16 6h-6l2.243-2.243C11.11 2.624 9.603 2 8 2s-3.109.624-4.243 1.757C2.624 4.89 2 6.397 2 8s.624 3.109 1.757 4.243A5.961 5.961 0 0 0 8 14a5.963 5.963 0 0 0 4.516-2.049l1.505 1.317a8 8 0 1 1-.364-10.924L16 0v6z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--info" y="32" xmlns="http://www.w3.org/2000/svg"><path d="M16 9V8h-3.02a5.785 5.785 0 0 0-1.12-3.004h2.53L15.485.617l-.97-.243-.905 3.621h-2.729l-.042-.032A2.996 2.996 0 0 0 8.001-.001a2.996 2.996 0 0 0-2.838 3.964l-.042.032H2.392L1.487.374l-.97.243 1.095 4.379h2.53A5.785 5.785 0 0 0 3.022 8H.002v1h3.021c.059.713.242 1.388.526 1.996H1.612L.517 15.375l.97.243.905-3.621h1.756c.917 1.219 2.303 1.996 3.854 1.996s2.937-.777 3.854-1.996h1.756l.905 3.621.97-.243-1.095-4.379h-1.937A5.903 5.903 0 0 0 12.981 9h3.021z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--tick" x="16" y="32" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 2 6 9.5 2.5 6 0 8.5l6 6 10-10z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--tools" x="32" y="32" xmlns="http://www.w3.org/2000/svg"><path d="M2.508 5.512c.746-.58 1.366-.18 2.192.777.093.108.218-.018.289-.08S6.15 5.165 6.203 5.12c.053-.047.117-.135.033-.234a27.04 27.04 0 0 1-.594-.761C4.196 2.233 9.599.95 8.769.93 8.347.919 6.652.899 6.399.927c-1.026.108-2.315 1.067-2.964 1.514-.849.581-1.166.922-1.218.969-.24.21-.038.694-.474 1.075-.46.402-.747.098-1.014.331-.132.117-.502.394-.607.486-.106.094-.126.251-.017.377 0 0 1.011 1.117 1.096 1.216.084.098.313.182.454.057s.506-.442.566-.498c.062-.053-.04-.689.286-.942zm4.566.414c-.096-.111-.215-.114-.318-.023L5.609 6.905a.232.232 0 0 0-.022.32l6.635 7.551a.425.425 0 0 0 .601.042l.776-.65a.432.432 0 0 0 .042-.606L7.074 5.927zm8.848-3.214c-.059-.395-.264-.313-.37-.146-.106.169-.577.882-.77 1.205-.192.32-.666.953-1.547.328-.918-.649-.599-1.102-.439-1.406a32.33 32.33 0 0 1 .726-1.272c.071-.108-.012-.422-.297-.29s-2.018.82-2.258 1.808c-.246 1.005.206 1.903-.68 2.795l-1.074 1.12 1.079 1.253 1.323-1.256c.315-.317.989-.625 1.598-.486 1.306.295 2.019-.195 2.449-1.006.386-.725.322-2.251.262-2.646zM2.191 13.642a.431.431 0 0 0 0 .606l.761.744c.166.167.43.097.597-.07l3.926-3.859-1.202-1.371-4.081 3.95z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--user" x="48" xmlns="http://www.w3.org/2000/svg"><path d="M9 11.041v-.825c1.102-.621 2-2.168 2-3.716C11 4.015 11 2 8 2S5 4.015 5 6.5c0 1.548.898 3.095 2 3.716v.825c-3.392.277-6 1.944-6 3.959h14c0-2.015-2.608-3.682-6-3.959z"/></svg><svg width="16" height="16" viewBox="0 0 16 16" id="images--bn-icon--view" x="48" y="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 3.52C2.751 3.52 0 7.386 0 8c0 .613 2.751 4.48 8 4.48S16 8.613 16 8c0-.614-2.752-4.48-8-4.48zm0 7.926c-1.964 0-3.556-1.542-3.556-3.446S6.036 4.553 8 4.553 11.555 6.097 11.555 8 9.964 11.446 8 11.446zM8 8c-.326-.358.53-1.723 0-1.723-.982 0-1.778.772-1.778 1.723S7.018 9.723 8 9.723 9.778 8.951 9.778 8c0-.438-1.502.303-1.778 0z"/></svg></svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1014 B

1
images/bn-icon/close.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF"><path d="M11.478 11.879a.96.96 0 0 1-1.358 0L7.999 9.455l-2.121 2.423A.96.96 0 0 1 4.52 10.52L6.726 8 4.519 5.478A.96.96 0 0 1 5.877 4.12l2.122 2.425L10.12 4.12a.96.96 0 0 1 1.358 1.358L9.272 8l2.206 2.52a.96.96 0 0 1 0 1.358z"/></svg>

After

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

1
images/bn-icon/cog.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF"><path d="M14.59 9.535a3.053 3.053 0 0 1 1.127-4.164l-1.572-2.723a3.017 3.017 0 0 1-1.529.414A3.052 3.052 0 0 1 9.574 0H6.429a3.009 3.009 0 0 1-.406 1.535c-.839 1.454-2.706 1.948-4.17 1.106L.281 5.364a3 3 0 0 1 1.123 1.117 3.053 3.053 0 0 1-1.12 4.16l1.572 2.723c.448-.261.967-.41 1.522-.41A3.052 3.052 0 0 1 6.42 16h3.145a3.012 3.012 0 0 1 .406-1.519 3.053 3.053 0 0 1 4.163-1.11l1.572-2.723a3.008 3.008 0 0 1-1.116-1.113zM8 11.24a3.24 3.24 0 1 1 0-6.48 3.24 3.24 0 0 1 0 6.48z"/></svg>

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

1
images/bn-icon/db.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8 0C3.582 0 0 1.119 0 2.5v2C0 5.881 3.582 7 8 7s8-1.119 8-2.5v-2C16 1.119 12.418 0 8 0z"/><path d="M8 8.5C3.582 8.5 0 7.381 0 6v3c0 1.381 3.582 2.5 8 2.5s8-1.119 8-2.5V6c0 1.381-3.582 2.5-8 2.5z"/><path d="M8 13c-4.418 0-8-1.119-8-2.5v3C0 14.881 3.582 16 8 16s8-1.119 8-2.5v-3c0 1.381-3.582 2.5-8 2.5z"/></svg>

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8 9.662c1.912 0 3.514-.65 3.61-1.498l-.9-2.522c-.211.609-1.38 1.041-2.71 1.041s-2.499-.432-2.71-1.041l-.899 2.522c.097.849 1.698 1.498 3.61 1.498zm0-5.364c.899 0 1.734-.278 1.978-.711l-.809-2.269C9.047.976 8.496.8 7.999.8s-1.048.177-1.17.518L6.02 3.587c.245.433 1.08.711 1.978.711zm7.024 6.155L12.02 9.242l.346.966c-.018 1.023-2.003 1.839-4.366 1.839s-4.35-.815-4.366-1.839l.346-.966-3.004 1.211c-.842.339-.878.967-.078 1.395l5.65 3.03c.798.428 2.106.428 2.906 0l5.65-3.03c.799-.428.763-1.056-.079-1.395z"/></svg>

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

1
images/bn-icon/edit.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M14.049 1.951c-1.154-1.154-2.02-.982-2.02-.982L1.768 11.229l-.808 3.81 3.81-.808L15.031 3.973c-.001 0 .173-.866-.982-2.022zM4.544 13.774l-1.299.28c-.125-.234-.276-.469-.552-.746s-.511-.426-.746-.553l.28-1.298.376-.375s.706.014 1.505.813c.798.797.813 1.505.813 1.505l-.377.374z"/></svg>

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

1
images/bn-icon/flush.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M16 6h-6l2.243-2.243C11.11 2.624 9.603 2 8 2s-3.109.624-4.243 1.757C2.624 4.89 2 6.397 2 8s.624 3.109 1.757 4.243A5.961 5.961 0 0 0 8 14a5.963 5.963 0 0 0 4.516-2.049l1.505 1.317a8 8 0 1 1-.364-10.924L16 0v6z"/></svg>

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

1
images/bn-icon/info.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M16 9V8h-3.02a5.785 5.785 0 0 0-1.12-3.004h2.53L15.485.617l-.97-.243-.905 3.621h-2.729l-.042-.032A2.996 2.996 0 0 0 8.001-.001a2.996 2.996 0 0 0-2.838 3.964l-.042.032H2.392L1.487.374l-.97.243 1.095 4.379h2.53A5.785 5.785 0 0 0 3.022 8H.002v1h3.021c.059.713.242 1.388.526 1.996H1.612L.517 15.375l.97.243.905-3.621h1.756c.917 1.219 2.303 1.996 3.854 1.996s2.937-.777 3.854-1.996h1.756l.905 3.621.97-.243-1.095-4.379h-1.937A5.903 5.903 0 0 0 12.981 9h3.021z"/></svg>

After

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

1
images/bn-icon/tick.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.5 2 6 9.5 2.5 6 0 8.5l6 6 10-10z"/></svg>

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

1
images/bn-icon/tools.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M2.508 5.512c.746-.58 1.366-.18 2.192.777.093.108.218-.018.289-.08S6.15 5.165 6.203 5.12c.053-.047.117-.135.033-.234a27.04 27.04 0 0 1-.594-.761C4.196 2.233 9.599.95 8.769.93 8.347.919 6.652.899 6.399.927c-1.026.108-2.315 1.067-2.964 1.514-.849.581-1.166.922-1.218.969-.24.21-.038.694-.474 1.075-.46.402-.747.098-1.014.331-.132.117-.502.394-.607.486-.106.094-.126.251-.017.377 0 0 1.011 1.117 1.096 1.216.084.098.313.182.454.057s.506-.442.566-.498c.062-.053-.04-.689.286-.942zm4.566.414c-.096-.111-.215-.114-.318-.023L5.609 6.905a.232.232 0 0 0-.022.32l6.635 7.551a.425.425 0 0 0 .601.042l.776-.65a.432.432 0 0 0 .042-.606L7.074 5.927zm8.848-3.214c-.059-.395-.264-.313-.37-.146-.106.169-.577.882-.77 1.205-.192.32-.666.953-1.547.328-.918-.649-.599-1.102-.439-1.406a32.33 32.33 0 0 1 .726-1.272c.071-.108-.012-.422-.297-.29s-2.018.82-2.258 1.808c-.246 1.005.206 1.903-.68 2.795l-1.074 1.12 1.079 1.253 1.323-1.256c.315-.317.989-.625 1.598-.486 1.306.295 2.019-.195 2.449-1.006.386-.725.322-2.251.262-2.646zM2.191 13.642a.431.431 0 0 0 0 .606l.761.744c.166.167.43.097.597-.07l3.926-3.859-1.202-1.371-4.081 3.95z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

1
images/bn-icon/user.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9 11.041v-.825c1.102-.621 2-2.168 2-3.716C11 4.015 11 2 8 2S5 4.015 5 6.5c0 1.548.898 3.095 2 3.716v.825c-3.392.277-6 1.944-6 3.959h14c0-2.015-2.608-3.682-6-3.959z"/></svg>

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

1
images/bn-icon/view.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8 3.52C2.751 3.52 0 7.386 0 8c0 .613 2.751 4.48 8 4.48S16 8.613 16 8c0-.614-2.752-4.48-8-4.48zm0 7.926c-1.964 0-3.556-1.542-3.556-3.446S6.036 4.553 8 4.553 11.555 6.097 11.555 8 9.964 11.446 8 11.446zM8 8c-.326-.358.53-1.723 0-1.723-.982 0-1.778.772-1.778 1.723S7.018 9.723 8 9.723 9.778 8.951 9.778 8c0-.438-1.502.303-1.778 0z"/></svg>

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -2,9 +2,9 @@
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0)===' ') {
while (c.charAt(0) === ' ') {
c = c.substring(1);
}
if (c.indexOf(name) !== -1) {
@ -18,19 +18,44 @@ function initialiseBetterNavigator() {
// Dom elements
var BetterNavigator = document.getElementById("BetterNavigator");
var BetterNavigatorStatus = document.getElementById("BetterNavigatorStatus");
var BetterNavigatorStatusIcon = document.getElementById("BetterNavigatorStatusIcon");
var BetterNavigatorLogoutLink = document.getElementById("BetterNavigatorLogoutLink");
var BetterNavigatorLogoutForm = document.getElementById("LogoutForm_BetterNavigatorLogoutForm");
// Toggle visibility of menu by clicking status
BetterNavigatorStatus.onclick = function () {
BetterNavigator.className = BetterNavigator.className === 'collapsed' ? 'open' : 'collapsed';
//Set cookie to remember state
document.cookie = "BetterNavigator=" + BetterNavigator.className + ";path=/";
if (BetterNavigator.classList.contains('collapsed')) {
BetterNavigator.classList.add('open');
BetterNavigator.classList.remove('collapsed');
// update the button state
BetterNavigatorStatus.setAttribute('aria-expanded', 'true');
BetterNavigatorStatusIcon.classList.remove('bn-icon-cog');
BetterNavigatorStatusIcon.classList.add('bn-icon-close');
document.cookie = "BetterNavigator=open;path=/";
} else {
BetterNavigator.classList.add('collapsed');
BetterNavigator.classList.remove('open');
// update the button state
BetterNavigatorStatus.setAttribute('aria-expanded', 'false');
BetterNavigatorStatusIcon.classList.remove('bn-icon-close');
BetterNavigatorStatusIcon.classList.add('bn-icon-cog');
document.cookie = "BetterNavigator=collapsed;path=/";
}
};
// Restore menu state
if (getCookie('BetterNavigator') === 'open') {
BetterNavigator.className = 'open';
BetterNavigator.classList.add('open');
BetterNavigator.classList.remove('collapsed');
// update the button state
BetterNavigatorStatus.setAttribute('aria-expanded', 'true');
BetterNavigatorStatusIcon.classList.remove('bn-icon-cog');
BetterNavigatorStatusIcon.classList.add('bn-icon-close');
}
if (BetterNavigatorLogoutForm) {

View File

@ -4,6 +4,8 @@ de:
VIEWING_DRAFT: 'Entwurf'
VIEWING_ARCHIVED: 'Archiviert'
ARIA_MENU_LABEL: 'Werkzeugmenü'
DEVELOPER_TOOLS_HEADING: 'Entwickler Tools'
DEBUGGING_HEADING: 'Debugging'

View File

@ -4,6 +4,8 @@ en:
VIEWING_DRAFT: 'Draft'
VIEWING_ARCHIVED: 'Archived'
ARIA_MENU_LABEL: 'Tool menu'
DEVELOPER_TOOLS_HEADING: 'Developer tools'
DEBUGGING_HEADING: 'Debugging'

2580
package-lock.json generated Normal file
View File

@ -0,0 +1,2580 @@
{
"name": "silverstripe-betternavigator",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "silverstripe-betternavigator",
"devDependencies": {
"sass": "^1.64.1",
"svg-sprite": "^2.0.2"
}
},
"node_modules/@colors/colors": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
"integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
"dev": true,
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/@dabh/diagnostics": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
"integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
"dev": true,
"dependencies": {
"colorspace": "1.1.x",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
},
"node_modules/@resvg/resvg-js": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.4.1.tgz",
"integrity": "sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A==",
"dev": true,
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
"@resvg/resvg-js-android-arm-eabi": "2.4.1",
"@resvg/resvg-js-android-arm64": "2.4.1",
"@resvg/resvg-js-darwin-arm64": "2.4.1",
"@resvg/resvg-js-darwin-x64": "2.4.1",
"@resvg/resvg-js-linux-arm-gnueabihf": "2.4.1",
"@resvg/resvg-js-linux-arm64-gnu": "2.4.1",
"@resvg/resvg-js-linux-arm64-musl": "2.4.1",
"@resvg/resvg-js-linux-x64-gnu": "2.4.1",
"@resvg/resvg-js-linux-x64-musl": "2.4.1",
"@resvg/resvg-js-win32-arm64-msvc": "2.4.1",
"@resvg/resvg-js-win32-ia32-msvc": "2.4.1",
"@resvg/resvg-js-win32-x64-msvc": "2.4.1"
}
},
"node_modules/@resvg/resvg-js-android-arm-eabi": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.4.1.tgz",
"integrity": "sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-android-arm64": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.4.1.tgz",
"integrity": "sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-darwin-arm64": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.4.1.tgz",
"integrity": "sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-darwin-x64": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.4.1.tgz",
"integrity": "sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-linux-arm-gnueabihf": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.4.1.tgz",
"integrity": "sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-linux-arm64-gnu": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.4.1.tgz",
"integrity": "sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-linux-arm64-musl": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.4.1.tgz",
"integrity": "sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-linux-x64-gnu": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.4.1.tgz",
"integrity": "sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-linux-x64-musl": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.4.1.tgz",
"integrity": "sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-win32-arm64-msvc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.4.1.tgz",
"integrity": "sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-win32-ia32-msvc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.4.1.tgz",
"integrity": "sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@resvg/resvg-js-win32-x64-msvc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.4.1.tgz",
"integrity": "sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"dev": true,
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/@types/triple-beam": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
"integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==",
"dev": true
},
"node_modules/@xmldom/xmldom": {
"version": "0.8.10",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
"integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
"dev": true,
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
"node_modules/async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
"dev": true
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"dev": true
},
"node_modules/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,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/cliui/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/cliui/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"dev": true,
"engines": {
"node": ">=0.8"
}
},
"node_modules/clone-buffer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
"integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
},
"node_modules/clone-stats": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
"integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
"dev": true
},
"node_modules/cloneable-readable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
"integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
"dev": true,
"dependencies": {
"inherits": "^2.0.1",
"process-nextick-args": "^2.0.0",
"readable-stream": "^2.3.5"
}
},
"node_modules/cloneable-readable/node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
"dependencies": {
"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"
}
},
"node_modules/cloneable-readable/node_modules/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
},
"node_modules/cloneable-readable/node_modules/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,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/color": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
"integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.3",
"color-string": "^1.6.0"
}
},
"node_modules/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,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"dev": true,
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/colorspace": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
"integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
"dev": true,
"dependencies": {
"color": "^3.1.3",
"text-hex": "1.0.x"
}
},
"node_modules/commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true,
"engines": {
"node": ">= 10"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true
},
"node_modules/css-select": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
"integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
"dev": true,
"dependencies": {
"boolbase": "^1.0.0",
"css-what": "^6.0.1",
"domhandler": "^4.3.1",
"domutils": "^2.8.0",
"nth-check": "^2.0.1"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-select/node_modules/dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"dev": true,
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/css-select/node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
]
},
"node_modules/css-select/node_modules/domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"dev": true,
"dependencies": {
"domelementtype": "^2.2.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/css-select/node_modules/domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"dev": true,
"dependencies": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/css-select/node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/css-selector-parser": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
"integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==",
"dev": true
},
"node_modules/css-tree": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
"integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"dev": true,
"dependencies": {
"mdn-data": "2.0.14",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/css-tree/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/css-what": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
"integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
"dev": true,
"engines": {
"node": ">= 6"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/csso": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
"integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"dev": true,
"dependencies": {
"css-tree": "^1.1.2"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/cssom": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
"integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
"dev": true
},
"node_modules/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
},
"node_modules/enabled": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
"integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
"dev": true
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/fecha": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
"integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
"dev": true
},
"node_modules/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,
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
"dev": true
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/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,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/immutable": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz",
"integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==",
"dev": true
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"node_modules/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==",
"dev": true
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/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,
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/kuler": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
"dev": true
},
"node_modules/lodash.escape": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
"integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
"dev": true
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.trim": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
"integrity": "sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==",
"dev": true
},
"node_modules/lodash.trimstart": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz",
"integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==",
"dev": true
},
"node_modules/logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
"integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==",
"dev": true,
"dependencies": {
"@colors/colors": "1.5.0",
"@types/triple-beam": "^1.3.2",
"fecha": "^4.2.0",
"ms": "^2.1.1",
"safe-stable-stringify": "^2.3.1",
"triple-beam": "^1.3.0"
}
},
"node_modules/logform/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"dev": true,
"bin": {
"mustache": "bin/mustache"
}
},
"node_modules/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,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dev": true,
"dependencies": {
"boolbase": "^1.0.0"
},
"funding": {
"url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"dependencies": {
"wrappy": "1"
}
},
"node_modules/one-time": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
"integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
"dev": true,
"dependencies": {
"fn.name": "1.x.x"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/prettysize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prettysize/-/prettysize-2.0.0.tgz",
"integrity": "sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg==",
"dev": true
},
"node_modules/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
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
"integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
"dev": true
},
"node_modules/replace-ext": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
"integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/safe-stable-stringify": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
"integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/sass": {
"version": "1.64.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz",
"integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
"sass": "sass.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"dev": true,
"dependencies": {
"is-arrayish": "^0.3.1"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/stable": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
"dev": true
},
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/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,
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/string-width/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/string-width/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/svg-sprite": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/svg-sprite/-/svg-sprite-2.0.2.tgz",
"integrity": "sha512-vLFP/t4YCu62mvOzUt6g9bqpKrPjYsLuzegw5WsIsv3DkulAI/fRC+k7Atk//rIkUDbvKo572nJ6o4YT+FbKig==",
"dev": true,
"dependencies": {
"@resvg/resvg-js": "^2.1.0",
"@xmldom/xmldom": "^0.8.3",
"async": "^3.2.4",
"css-selector-parser": "^1.4.1",
"csso": "^4.2.0",
"cssom": "^0.5.0",
"glob": "^7.2.3",
"js-yaml": "^4.1.0",
"lodash.escape": "^4.0.1",
"lodash.merge": "^4.6.2",
"lodash.trim": "^4.5.1",
"lodash.trimstart": "^4.5.1",
"mustache": "^4.2.0",
"prettysize": "^2.0.0",
"svgo": "^2.8.0",
"vinyl": "^2.2.1",
"winston": "^3.8.2",
"xpath": "^0.0.32",
"yargs": "^17.5.1"
},
"bin": {
"svg-sprite": "bin/svg-sprite.js"
},
"engines": {
"node": ">=12"
}
},
"node_modules/svgo": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
"integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
"dev": true,
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^4.1.3",
"css-tree": "^1.1.3",
"csso": "^4.2.0",
"picocolors": "^1.0.0",
"stable": "^0.1.8"
},
"bin": {
"svgo": "bin/svgo"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
"dev": true
},
"node_modules/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,
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/triple-beam": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
"integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
"dev": true,
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
"node_modules/vinyl": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
"integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
"dev": true,
"dependencies": {
"clone": "^2.1.1",
"clone-buffer": "^1.0.0",
"clone-stats": "^1.0.0",
"cloneable-readable": "^1.0.0",
"remove-trailing-separator": "^1.0.1",
"replace-ext": "^1.0.0"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/winston": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz",
"integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==",
"dev": true,
"dependencies": {
"@colors/colors": "1.5.0",
"@dabh/diagnostics": "^2.0.2",
"async": "^3.2.3",
"is-stream": "^2.0.0",
"logform": "^2.4.0",
"one-time": "^1.0.0",
"readable-stream": "^3.4.0",
"safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
"winston-transport": "^4.5.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/winston-transport": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
"integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
"dev": true,
"dependencies": {
"logform": "^2.3.2",
"readable-stream": "^3.6.0",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 6.4.0"
}
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi/node_modules/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,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/wrap-ansi/node_modules/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
},
"node_modules/wrap-ansi/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"node_modules/xpath": {
"version": "0.0.32",
"resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
"integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
"dev": true,
"engines": {
"node": ">=0.6.0"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
"engines": {
"node": ">=12"
}
}
},
"dependencies": {
"@colors/colors": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
"integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
"dev": true
},
"@dabh/diagnostics": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
"integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
"dev": true,
"requires": {
"colorspace": "1.1.x",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
},
"@resvg/resvg-js": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.4.1.tgz",
"integrity": "sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A==",
"dev": true,
"requires": {
"@resvg/resvg-js-android-arm-eabi": "2.4.1",
"@resvg/resvg-js-android-arm64": "2.4.1",
"@resvg/resvg-js-darwin-arm64": "2.4.1",
"@resvg/resvg-js-darwin-x64": "2.4.1",
"@resvg/resvg-js-linux-arm-gnueabihf": "2.4.1",
"@resvg/resvg-js-linux-arm64-gnu": "2.4.1",
"@resvg/resvg-js-linux-arm64-musl": "2.4.1",
"@resvg/resvg-js-linux-x64-gnu": "2.4.1",
"@resvg/resvg-js-linux-x64-musl": "2.4.1",
"@resvg/resvg-js-win32-arm64-msvc": "2.4.1",
"@resvg/resvg-js-win32-ia32-msvc": "2.4.1",
"@resvg/resvg-js-win32-x64-msvc": "2.4.1"
}
},
"@resvg/resvg-js-android-arm-eabi": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.4.1.tgz",
"integrity": "sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-android-arm64": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.4.1.tgz",
"integrity": "sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-darwin-arm64": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.4.1.tgz",
"integrity": "sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-darwin-x64": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.4.1.tgz",
"integrity": "sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-linux-arm-gnueabihf": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.4.1.tgz",
"integrity": "sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-linux-arm64-gnu": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.4.1.tgz",
"integrity": "sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-linux-arm64-musl": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.4.1.tgz",
"integrity": "sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-linux-x64-gnu": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.4.1.tgz",
"integrity": "sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-linux-x64-musl": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.4.1.tgz",
"integrity": "sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-win32-arm64-msvc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.4.1.tgz",
"integrity": "sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-win32-ia32-msvc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.4.1.tgz",
"integrity": "sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg==",
"dev": true,
"optional": true
},
"@resvg/resvg-js-win32-x64-msvc": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.4.1.tgz",
"integrity": "sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw==",
"dev": true,
"optional": true
},
"@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"dev": true
},
"@types/triple-beam": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
"integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==",
"dev": true
},
"@xmldom/xmldom": {
"version": "0.8.10",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
"integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
"dev": true
},
"anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
"async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
"dev": true
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true
},
"boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"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"
}
},
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
}
},
"cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"dev": true
},
"clone-buffer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
"integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
"dev": true
},
"clone-stats": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
"integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
"dev": true
},
"cloneable-readable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
"integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
"process-nextick-args": "^2.0.0",
"readable-stream": "^2.3.5"
},
"dependencies": {
"readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"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"
}
}
}
},
"color": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
"integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"dev": true,
"requires": {
"color-convert": "^1.9.3",
"color-string": "^1.6.0"
}
},
"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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"dev": true,
"requires": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"colorspace": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
"integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
"dev": true,
"requires": {
"color": "^3.1.3",
"text-hex": "1.0.x"
}
},
"commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true
},
"css-select": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
"integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
"dev": true,
"requires": {
"boolbase": "^1.0.0",
"css-what": "^6.0.1",
"domhandler": "^4.3.1",
"domutils": "^2.8.0",
"nth-check": "^2.0.1"
},
"dependencies": {
"dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"dev": true,
"requires": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
}
},
"domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"dev": true
},
"domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"dev": true,
"requires": {
"domelementtype": "^2.2.0"
}
},
"domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"dev": true,
"requires": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
}
},
"entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true
}
}
},
"css-selector-parser": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
"integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==",
"dev": true
},
"css-tree": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
"integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"dev": true,
"requires": {
"mdn-data": "2.0.14",
"source-map": "^0.6.1"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"css-what": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
"integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
"dev": true
},
"csso": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
"integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"dev": true,
"requires": {
"css-tree": "^1.1.2"
}
},
"cssom": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
"integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
"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
},
"enabled": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
"integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
"dev": true
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"fecha": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
"integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
"dev": true
},
"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"
}
},
"fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
"dev": true
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": 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
},
"glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"immutable": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz",
"integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==",
"dev": true
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"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
},
"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==",
"dev": true
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"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
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"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-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true
},
"js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"requires": {
"argparse": "^2.0.1"
}
},
"kuler": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
"dev": true
},
"lodash.escape": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
"integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
"dev": true
},
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"lodash.trim": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
"integrity": "sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==",
"dev": true
},
"lodash.trimstart": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz",
"integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==",
"dev": true
},
"logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
"integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==",
"dev": true,
"requires": {
"@colors/colors": "1.5.0",
"@types/triple-beam": "^1.3.2",
"fecha": "^4.2.0",
"ms": "^2.1.1",
"safe-stable-stringify": "^2.3.1",
"triple-beam": "^1.3.0"
},
"dependencies": {
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
}
}
},
"mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"dev": true
},
"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
},
"nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dev": true,
"requires": {
"boolbase": "^1.0.0"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"one-time": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
"integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
"dev": true,
"requires": {
"fn.name": "1.x.x"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
"prettysize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prettysize/-/prettysize-2.0.0.tgz",
"integrity": "sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg==",
"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
},
"readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
},
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
"integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
"dev": true
},
"replace-ext": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
"integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
"dev": true
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
},
"safe-stable-stringify": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
"integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
"dev": true
},
"sass": {
"version": "1.64.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz",
"integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
}
},
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"dev": true,
"requires": {
"is-arrayish": "^0.3.1"
}
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true
},
"stable": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"dev": true
},
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
"dev": true
},
"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"
}
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"svg-sprite": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/svg-sprite/-/svg-sprite-2.0.2.tgz",
"integrity": "sha512-vLFP/t4YCu62mvOzUt6g9bqpKrPjYsLuzegw5WsIsv3DkulAI/fRC+k7Atk//rIkUDbvKo572nJ6o4YT+FbKig==",
"dev": true,
"requires": {
"@resvg/resvg-js": "^2.1.0",
"@xmldom/xmldom": "^0.8.3",
"async": "^3.2.4",
"css-selector-parser": "^1.4.1",
"csso": "^4.2.0",
"cssom": "^0.5.0",
"glob": "^7.2.3",
"js-yaml": "^4.1.0",
"lodash.escape": "^4.0.1",
"lodash.merge": "^4.6.2",
"lodash.trim": "^4.5.1",
"lodash.trimstart": "^4.5.1",
"mustache": "^4.2.0",
"prettysize": "^2.0.0",
"svgo": "^2.8.0",
"vinyl": "^2.2.1",
"winston": "^3.8.2",
"xpath": "^0.0.32",
"yargs": "^17.5.1"
}
},
"svgo": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
"integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
"dev": true,
"requires": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^4.1.3",
"css-tree": "^1.1.3",
"csso": "^4.2.0",
"picocolors": "^1.0.0",
"stable": "^0.1.8"
}
},
"text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
"dev": true
},
"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"
}
},
"triple-beam": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
"integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
"dev": true
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
"vinyl": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
"integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
"dev": true,
"requires": {
"clone": "^2.1.1",
"clone-buffer": "^1.0.0",
"clone-stats": "^1.0.0",
"cloneable-readable": "^1.0.0",
"remove-trailing-separator": "^1.0.1",
"replace-ext": "^1.0.0"
}
},
"winston": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz",
"integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==",
"dev": true,
"requires": {
"@colors/colors": "1.5.0",
"@dabh/diagnostics": "^2.0.2",
"async": "^3.2.3",
"is-stream": "^2.0.0",
"logform": "^2.4.0",
"one-time": "^1.0.0",
"readable-stream": "^3.4.0",
"safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
"winston-transport": "^4.5.0"
}
},
"winston-transport": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
"integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
"dev": true,
"requires": {
"logform": "^2.3.2",
"readable-stream": "^3.6.0",
"triple-beam": "^1.3.0"
}
},
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"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
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"xpath": {
"version": "0.0.32",
"resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
"integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
"dev": true
},
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
},
"yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"requires": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
}
},
"yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true
}
}
}

27
package.json Normal file
View File

@ -0,0 +1,27 @@
{
"name": "silverstripe-betternavigator",
"description": "Front-end utility menu for SilverStripe websites featuring administration and development tools",
"scripts": {
"build:svg": "svg-sprite --css --css-render-scss --css-render-scss-dest=../scss/_iconsprite --css-bust ./images/bn-icon/*.svg",
"build:scss": "sass --style compressed scss/betternavigator.scss css/betternavigator.css",
"build": "npm run build:svg && npm run build:scss",
"watch": "sass --watch scss/betternavigator.scss css/betternavigator.css"
},
"repository": {
"type": "git",
"url": "git+https://github.com/jonom/silverstripe-betternavigator.git"
},
"keywords": [
"silverstripe",
"navigator"
],
"author": "https://github.com/jonom",
"bugs": {
"url": "https://github.com/jonom/silverstripe-betternavigator/issues"
},
"homepage": "https://github.com/jonom/silverstripe-betternavigator#readme",
"devDependencies": {
"sass": "^1.64.1",
"svg-sprite": "^2.0.2"
}
}

38
scss/_iconsprite.md Normal file
View File

@ -0,0 +1,38 @@
# SVG Sprites
An SVG sprite is used for icons, this is generated by the [svg-sprite](https://github.com/svg-sprite/svg-sprite) node module. This means icons can be easily pre-loaded when the navigator is collapsed.
## Using the icons
After compilation, a `_iconsprite.scss` file is created. This should be included in the main scss.
To include an icon as background image in an element, extend the icon and the dimensions
```scss
.bn-icon-close {
@extend .svg-images--bn-icon--close;
@extend .svg-images--bn-icon--close-dims;
}
```
## Adding or removing icons
If you need to add or remove an icon, then add or remove it from the `./images/bn-icon/` directory and re-compile.
Only SVG is supported, and it is recommended to compress the SVG first using a tool such as [svgo](https://github.com/svg/svgo) or [svgomg](https://jakearchibald.github.io/svgomg/) first.
## Compiling the icon sprite
This can be done by running `npm run build:svg` from the root of the module.
All icons in the `./images/bn-icon/` directory are compiled into a single SVG and output to `./css/svg/`.
The `./scss/_iconsprite.scss` file is generated with the correct background positions based on the size of each icon.
## License
Icons are sourced from [IcoMoon](https://icomoon.io/) and are from the following packs:
* [IcoMoon - Free](https://icomoon.io/#icons) by [Keyamoon](http://keyamoon.com/) (GPL / CC BY 4.0)
* [Entypo+](http://www.entypo.com/) by [Daniel Bruce](http://danielbruce.se/) (CC BY-SA 4.0)
The icons have been compressed and resized.

114
scss/_iconsprite.scss Normal file
View File

@ -0,0 +1,114 @@
%svg-common {
background: url("svg/sprite.css-982681f2.svg") no-repeat;
}
.svg-images--bn-icon--close {
@extend %svg-common;
background-position: 0 0;
}
.svg-images--bn-icon--close-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--cog {
@extend %svg-common;
background-position: 33.333333333333336% 0;
}
.svg-images--bn-icon--cog-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--db {
@extend %svg-common;
background-position: 0 50%;
}
.svg-images--bn-icon--db-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--devmode {
@extend %svg-common;
background-position: 33.333333333333336% 50%;
}
.svg-images--bn-icon--devmode-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--edit {
@extend %svg-common;
background-position: 66.66666666666667% 0;
}
.svg-images--bn-icon--edit-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--flush {
@extend %svg-common;
background-position: 66.66666666666667% 50%;
}
.svg-images--bn-icon--flush-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--info {
@extend %svg-common;
background-position: 0 100%;
}
.svg-images--bn-icon--info-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--tick {
@extend %svg-common;
background-position: 33.333333333333336% 100%;
}
.svg-images--bn-icon--tick-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--tools {
@extend %svg-common;
background-position: 66.66666666666667% 100%;
}
.svg-images--bn-icon--tools-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--user {
@extend %svg-common;
background-position: 100% 0;
}
.svg-images--bn-icon--user-dims {
width: 16px;
height: 16px;
}
.svg-images--bn-icon--view {
@extend %svg-common;
background-position: 100% 50%;
}
.svg-images--bn-icon--view-dims {
width: 16px;
height: 16px;
}

View File

@ -1,174 +1,366 @@
@import "compass/css3";
@import "compass/utilities/sprites";
/**
* Better navigator styles
*/
//Icons
$bn-icon-sprite-dimensions: true;
@import "bn-icon/*.png";
@include all-bn-icon-sprites;
span[class^='bn-icon'],span[class*=' bn-icon']{
display: inline-block;
}
@import "_iconsprite";
//Container
// Variables
$black: #000;
$white: #fff;
$textColor: $white;
$contentColor: #595d61;
$contentBackground: #cfd8de;
$buttonColor: #313639;
$buttonColorDisabled: #51565a;
$buttonBackground: #eceff2;
$buttonBackgroundDisabled: #c6d3da;
$buttonBorder: #a3aaaf;
$liveColor: #06ad18;
$liveBgColor: #068913;
$stageColor: #e6674b;
$stageBgColor: #d73f1d;
$archiveColor: #6f6f6f;
$archiveBgColor: #6f6f6f;
// Container
#BetterNavigator {
position: fixed;
top: 0;
right: 0;
z-index: 99999;
max-height: 100%;
overflow: auto;
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 16px;
text-align: left;
box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.25),
0px 0px 12px rgba(0, 0, 0, 0.15);
* {
// Reset all styles to avoid inheriting from
// the parent page theme
all: initial;
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 1.2;
}
a {
text-decoration: none;
}
form {
display:none;
display: none;
}
//Toggle states
// Toggle states
&.collapsed {
box-shadow: 0px 0px 3px rgba(0,0,0,0.5);
@include transform-origin(right,top);
@include transform(rotate(90deg) translate(100%,0));
border-width: 0 1px 1px 0;
&.translucent {
opacity: 0.5;
transition: opacity 250ms;
&:hover {
opacity: 1;
}
}
#BetterNavigatorStatus {
border-width: 0 1px 1px 0;
.bn-icon-close {
display: none;
}
.bn-icon-cog {
display: inline-block;
}
padding-right: 12px;
}
#BetterNavigatorContent {
display: none;
}
#BetterNavigatorStatusIcon {
order: -1;
}
}
&.right-top {
right: 0;
top: 0;
&.collapsed {
transform-origin: right top;
transform: rotate(90deg) translate(100%, 0);
}
}
&.right-bottom {
right: 0;
bottom: 0;
&.collapsed {
transform-origin: right bottom;
transform: rotate(90deg) translate(0, 100%);
}
}
&.left-bottom {
left: 0;
bottom: 0;
&.collapsed {
transform-origin: left bottom;
transform: rotate(90deg) translate(-100%, 0);
}
}
&.left-top {
left: 0;
top: 0;
&.collapsed {
transform-origin: left top;
transform: rotate(90deg) translate(0, -100%);
}
}
// Icons
span[class^="bn-icon"],
span[class*=" bn-icon"] {
display: inline-block;
}
.bn-icon-close {
@extend .svg-images--bn-icon--close;
@extend .svg-images--bn-icon--close-dims;
transform: scale(1.3);
}
.bn-icon-cog {
@extend .svg-images--bn-icon--cog;
@extend .svg-images--bn-icon--cog-dims;
}
.bn-icon-db {
@extend .svg-images--bn-icon--db;
@extend .svg-images--bn-icon--db-dims;
transform: scale(0.8);
}
.bn-icon-edit {
@extend .svg-images--bn-icon--edit;
@extend .svg-images--bn-icon--edit-dims;
transform: scale(0.9);
}
.bn-icon-flush {
@extend .svg-images--bn-icon--flush;
@extend .svg-images--bn-icon--flush-dims;
transform: scale(0.8);
}
.bn-icon-info {
@extend .svg-images--bn-icon--info;
@extend .svg-images--bn-icon--info-dims;
transform: scale(0.7);
}
.bn-icon-tick {
@extend .svg-images--bn-icon--tick;
@extend .svg-images--bn-icon--tick-dims;
transform: scale(0.7);
}
.bn-icon-tools {
@extend .svg-images--bn-icon--tools;
@extend .svg-images--bn-icon--tools-dims;
transform: scale(0.9);
}
.bn-icon-user {
@extend .svg-images--bn-icon--user;
@extend .svg-images--bn-icon--user-dims;
}
.bn-icon-view {
@extend .svg-images--bn-icon--view;
@extend .svg-images--bn-icon--view-dims;
transform: scale(0.95);
}
}
//Status
$liveColor: #39b54a;
$stageColor: #f26c4f;
$archiveColor: #6f6f6f;
// Status
#BetterNavigatorStatus {
color: #fff;
display: flex;
gap: 10px;
justify-content: space-between;
width: 100%;
box-sizing: border-box;
align-items: center;
appearance: none;
background: $archiveColor;
border: 1px solid shade($archiveColor, 10);
border-width: 0 0 0 1px;
text-transform: uppercase;
cursor: pointer;
padding: 10px 15px 8px;
font-weight: bold;
padding: 8px 10px 8px 14px;
margin: 0;
transition: 100ms background-color ease-in-out;
white-space: nowrap;
color: $textColor;
.bn-icon-cog {
margin: -4px 8px -4px -4px;
display: none;
.status-text {
text-align: left;
color: $textColor;
text-transform: uppercase;
font-family: inherit;
font-weight: bold;
font-size: 14px;
line-height: 1;
letter-spacing: 0.4px;
padding: 3px 3px 2px;
border-radius: 3px;
background: $archiveBgColor;
}
.bn-icon-close {
float: right;
margin: 1px 0 0 0;
}
.bn-icon-cog,
.bn-icon-close {
opacity: .7;
}
&:hover {
background: shade($archiveColor, 5);
&:hover,
&:focus-visible {
background: mix($black, $archiveColor, 5%);
.bn-icon-cog,
.bn-icon-close {
opacity: 1;
opacity: 1;
}
}
&:focus-visible {
outline: 3px solid mix($black, $archiveColor, 10%);
outline-offset: 0;
}
&.Live {
background: $liveColor;
border-color: shade($liveColor, 10);
.status-text {
background: $liveBgColor;
}
&:hover {
background: shade($liveColor, 5);
background: mix($black, $liveColor, 5%);
}
&:focus-visible {
outline: 3px solid mix($black, $liveColor, 10%);
}
}
&.Draft {
background: $stageColor;
border-color: shade($stageColor, 10);
.status-text {
background: $stageBgColor;
}
&:hover {
background: shade($stageColor, 5);
background: mix($black, $stageColor, 5%);
}
&:focus-visible {
outline: 3px solid mix($black, $stageColor, 10%);
}
}
.bn-icon-cog,
.bn-icon-close {
opacity: 0.7;
}
}
//Content
#BetterNavigatorStatusIcon {
cursor: inherit;
transition: 100ms opacity ease-in-out;
}
// Content
#BetterNavigatorContent {
padding: 6px;
color: #71767a;
background: #cfd8de;
border: 1px solid shade(#cfd8de, 10);
border-width: 0 0 1px 1px;
display: flex;
flex-direction: column;
padding: 8px;
gap: 6px;
color: $contentColor;
background: $contentBackground;
min-width: 140px;
overflow: auto;
.bn-heading {
text-align: center;
display: block;
text-transform: uppercase;
font-size: 11px;
margin: 8px 0 4px 0;
line-height: 1.2;
color: $contentColor;
margin: 5px 0 0 0;
padding: 0;
font-weight: normal;
}
span[class^='bn-icon'],span[class*=' bn-icon']{
margin: -2px 5px -3px -2px;
span[class^="bn-icon"],
span[class*=" bn-icon"] {
cursor: inherit;
margin: -2px 5px -3px -2px;
}
a,
span.bn-disabled {
.bn-disabled {
display: block;
background: #eceff2;
color: #313639;
background: $buttonBackground;
color: $buttonColor;
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 1.4;
border-radius: 5px;
border-bottom: 1px solid #a3aaaf;
margin: 0 0 4px 0;
border-bottom: 1px solid $buttonBorder;
margin: 0;
padding: 6px 10px 5px 10px;
line-height: 16px;
font-weight: bold;
cursor: pointer;
transition: 100ms background-color ease-in-out;
.light {
font-weight: normal;
}
}
a:focus,
a:hover,
a:active {
background: #fff;
color: #000;
a:focus-visible,
a:hover {
background: $white;
color: $black;
}
span.bn-disabled {
background: #afbac0;
color: #51565a;
a:focus-visible {
border-bottom: 1px solid transparent;
outline: 2px solid mix($black, $buttonBorder, 10%);
outline-offset: 1px;
}
a:active {
background: mix($black, $buttonBackground, 10%);
border-color: mix($white, $buttonBorder, 10%);
}
.bn-disabled {
background: $buttonBackgroundDisabled;
color: $buttonColorDisabled;
cursor: default;
pointer-events: none;
}
.bn-links {
display: flex;
flex-direction: column;
gap: 5px;
margin: 0;
padding: 0;
list-style-type: none;
> :last-child {
margin-bottom: 0;
}
}
}
//Some help for debugging info
// Some help for debugging info
body > p.message {
text-align: left;
background: #fff;

View File

@ -2,7 +2,7 @@
namespace JonoM\BetterNavigator\Extension;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Admin\Navigator\SilverStripeNavigator;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
@ -17,15 +17,16 @@ use SilverStripe\Security\Security;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\View\Requirements;
class BetterNavigatorExtension extends DataExtension
{
private static $better_navigator_edit_permission = 'CMS_ACCESS_CMSMain';
private static $better_navigator_edit_permission_mode = 'any';
/**
* @var bool|null
* Extensions are singleton, so any cached results need to use a unique key
*/
private $shouldDisplay = null;
private $shouldDisplay = [];
/**
* @param $request
@ -53,7 +54,7 @@ class BetterNavigatorExtension extends DataExtension
$html = preg_replace(
'/(<\/body[^>]*>)/i',
$navigatorHTML . '\\1',
$html
$html ?? ''
);
if ($result instanceof DBHTMLText) {
$result->setValue($html);
@ -70,7 +71,7 @@ class BetterNavigatorExtension extends DataExtension
*/
public function showBetterNavigator()
{
return true;
return $this->isAPage();
}
/**
@ -111,14 +112,24 @@ class BetterNavigatorExtension extends DataExtension
}
}
}
// Only show edit link if user has permission to edit this page
$editLink = array_key_exists('CMSLink', $nav)
&& ($isDev || $this->owner->dataRecord->canEdit() && Permission::check('CMS_ACCESS_CMSMain'))
? $nav['CMSLink']['Link'] : false;
// Only show edit link if user has CMS access
$editLink = null;
if($isDev || Permission::check($this->owner->config()->better_navigator_edit_permission, $this->owner->config()->better_navigator_edit_permission_mode)) {
// Check for edit link override, e.g. for a DataObject
if(method_exists($this->owner, 'BetterNavigatorEditLink')) {
$editLink = $this->owner->BetterNavigatorEditLink();
} else {
// Only show edit link if user has permission to edit this page
$editLink = array_key_exists('CMSLink', $nav)
&& ($isDev || $this->owner->dataRecord->canEdit())
? $nav['CMSLink']['Link'] : false;
}
}
// Is the logged in member nominated as a developer?
$member = Member::currentUser();
$devs = Config::inst()->get('BetterNavigator', 'developers');
$member = Security::getCurrentUser();
$devs = Config::inst()->get('JonoM\BetterNavigator', 'developers');
$identifierField = Member::config()->unique_identifier_field;
$isDeveloper = $member && is_array($devs) ? in_array($member->{$identifierField}, $devs) : false;
@ -131,6 +142,7 @@ class BetterNavigatorExtension extends DataExtension
'Member' => $member,
'Stage' => Versioned::get_stage(),
'Viewing' => $viewing, // What we're viewing doesn't necessarily align with the active Stage
'CssClass' => $this->BetterNavigatorCssClass(),
'ViewingTitle' => $viewingTitle,
'LoginLink' => Controller::join_links(Director::absoluteBaseURL(), Security::config()->login_url, $backURL),
'LogoutLink' => Controller::join_links(Director::absoluteBaseURL() . Security::config()->logout_url, $backURL),
@ -145,7 +157,7 @@ class BetterNavigatorExtension extends DataExtension
// Merge with page data, send to template and render
$navigator = new ArrayData($bNData);
return $this->owner->customise($navigator)->renderWith('BetterNavigator\\BetterNavigator');
return $this->owner->customise($navigator)->renderWith('JonoM\\BetterNavigator\\BetterNavigator');
}
/**
@ -154,20 +166,27 @@ class BetterNavigatorExtension extends DataExtension
*/
private function shouldDisplay()
{
if ($this->shouldDisplay !== null) {
return $this->shouldDisplay;
$key = $this->owner->getUniqueKey();
if (array_key_exists($key, $this->shouldDisplay)) {
return $this->shouldDisplay[$key];
}
// Make sure this is a page
if (!$this->isAPage() || !$this->owner->showBetterNavigator()) {
return $this->shouldDisplay = false;
if (!$this->owner->showBetterNavigator()) {
$this->shouldDisplay[$key] = false;
return false;
}
// Only show navigator to appropriate users
$isDev = Director::isDev();
$canViewDraft = (Permission::check('VIEW_DRAFT_CONTENT') || Permission::check('CMS_ACCESS_CMSMain'));
return $this->shouldDisplay = ($isDev || $canViewDraft);
$result = ($isDev || $canViewDraft);
$this->shouldDisplay[$key] = $result;
return $result;
}
/**
@ -180,4 +199,27 @@ class BetterNavigatorExtension extends DataExtension
&& $this->owner->dataRecord instanceof SiteTree
&& $this->owner->dataRecord->ID > 0;
}
/**
* @return string
*/
private function BetterNavigatorCssClass() {
$classes = '';
$position = Config::inst()->get('JonoM\BetterNavigator', 'position');
$translucent = Config::inst()->get('JonoM\BetterNavigator', 'translucent');
if ($position === 'left-top' || $position === 'left-bottom' || $position === 'right-bottom') {
$classes .= ' ' . $position;
} else {
$classes .= ' right-top';
}
if ($translucent && $translucent == 'true') {
$classes .= ' translucent';
}
return $classes;
}
}

View File

@ -1,140 +0,0 @@
<div id="BetterNavigator" class="collapsed">
<div id="BetterNavigatorStatus" class="$Viewing">
<span class="bn-icon-cog"></span>
$ViewingTitle
<span class="bn-icon-close"></span>
</div>
<div id="BetterNavigatorContent">
<div class="bn-links">
<% if $ArchiveLink.Active %>
<% if $EditLink %><a href="$EditLink" target="_blank"><span class="bn-icon-edit"></span><%t JonoM\BetterNavigator.RESTORE_LABEL 'Restore' %></a><% end_if %>
<% else %>
<% if not $LiveLink.Active %>
<% if $LiveLink.Link %>
<a href="$LiveLink.Link"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.VIEW_LIVE_LABEL 'View live' %></a>
<% else %>
<span class="bn-disabled"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.NOT_YET_PUBLISHED_LABEL 'Not yet published' %></span>
<% end_if %>
<% end_if %>
<% if not $StageLink.Active %>
<% if $StageLink.Link %>
<a href="$StageLink.Link"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.VIEW_DRAFT_LABEL 'View draft' %></a>
<% else %>
<span class="bn-disabled"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.DELETED_FROM_DRAFT_SITE_LABEL 'Deleted from draft site' %></span>
<% end_if %>
<% end_if %>
<% if $EditLink %><a href="$EditLink" target="_blank"><span class="bn-icon-edit"></span><%t JonoM\BetterNavigator.EDIT_IN_CMS_LABEL 'Edit in CMS' %></a><% end_if %>
<% end_if %>
<% if $Member %>
$LogoutForm
<a href="$LogoutLink" id="BetterNavigatorLogoutLink"><span class="bn-icon-user"></span><%t JonoM\BetterNavigator.LOG_OUT_LABEL 'Log out' %><% if $Member.FirstName %><span class="light"> ($Member.FirstName)</span><% end_if %></a>
<% else %>
<a href="$LoginLink"><span class="bn-icon-user"></span><%t JonoM\BetterNavigator.LOG_IN_LABEL 'Log in' %></a>
<% end_if %>
</div>
<% include BetterNavigator\BetterNavigatorExtraContent %>
<% if $Mode=='dev' || $IsDeveloper %>
<div class="bn-heading"><%t JonoM\BetterNavigator.DEVELOPER_TOOLS_HEADING 'Developer tools' %></div>
<div class="bn-links">
<% if $Mode='dev' %>
<span class="bn-disabled" title="<%t JonoM\BetterNavigator.END_DEV_MODE_TITLE 'Log out to end Dev Mode' %>">
<span class="bn-icon-tick"></span>
<%t JonoM\BetterNavigator.DEV_MOVE_ON_LABEL 'Dev mode on' %>
</span>
<% else %>
<a href="{$AbsoluteLink}?isDev=1"><span class="bn-icon-devmode"></span><%t JonoM\BetterNavigator.DEV_MODE_LABEL 'Dev mode' %></a>
<% end_if %>
<a href="{$AbsoluteLink}?flush=1"
title="<%t JonoM\BetterNavigator.FLUSH_CACHE_TITLE 'Flush templates and manifest, and regenerate images for this page (behaviour varies by Framework version)' %>"
>
<span class="bn-icon-flush"></span>
<%t JonoM\BetterNavigator.FLUSH_CACHE_LABEL 'Flush caches' %>
</a>
<a href="{$AbsoluteBaseURL}dev/build/?flush=1"
target="_blank"
title="<%t JonoM\BetterNavigator.BUILD_DATABASE_TITLE 'Build database and flush caches (excludes template caches pre SS-3.1.7)' %>"
>
<span class="bn-icon-db"></span>
<%t JonoM\BetterNavigator.BUILD_DATABASE_LABEL 'Build database' %>
</a>
<a href="{$AbsoluteBaseURL}dev/" target="_blank"><span class="bn-icon-tools"></span><%t JonoM\BetterNavigator.DEV_MENU_LABEL 'Dev menu' %></a>
</div>
<% include BetterNavigator\BetterNavigatorExtraDevTools %>
<% end_if %>
<% if $Mode=='dev' %>
<div class="bn-heading"><%t JonoM\BetterNavigator.DEBUGGING_HEADING 'Debugging' %></div>
<div class="bn-links">
<a href="{$AbsoluteLink}?showtemplate=1"
title="<%t JonoM\BetterNavigator.SHOW_TEMPLATE_TITLE 'Show the compiled version of all the templates used, including line numbers. Good when you have a syntax error in a template. Cannot be used on a Live site without isDev' %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.SHOW_TEMPLATE_LABEL 'Show template' %>
</a>
<a href="{$AbsoluteLink}?execmetric=1"
title="<%t JonoM\BetterNavigator.EXEC_METRIC_TITLE 'Display the execution time and peak memory usage for the request' %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.SHOW_METRICS_LABEL 'Show metrics' %>
</a>
<a href="{$AbsoluteLink}?debug=1"
title="<%t JonoM\BetterNavigator.DEBUG_PAGE_TITLE 'Show a collection of debugging information about the director / controller operation' %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.DEBUG_PAGE_LABEL 'Debug page' %>
</a>
<a href="{$AbsoluteLink}?debug_request=1"
title="<%t JonoM\BetterNavigator.DEBUG_REQUEST_TITLE 'Show all steps of the request from initial HTTPRequest to Controller to Template Rendering' %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.DEBUG_REQUEST_LABEL 'Debug request' %>
</a>
<a href="{$AbsoluteLink}?debugfailover=1"
title="<%t JonoM\BetterNavigator.DEBUG_FAILOVER_TITLE 'Shows failover methods from classes extended' %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.DEBUG_FAILOVER_LABEL 'Debug failover' %>
</a>
<a href="{$AbsoluteLink}?showqueries=1"
title="<%t JonoM\BetterNavigator.SHOW_QUERIES_TITLE 'List all SQL queries executed' %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.SHOW_QUERIES_LABEL 'Show queries' %>
</a>
<a href="{$AbsoluteLink}?previewwrite=1"
title="<%t JonoM\BetterNavigator.PREVIEW_WRITE_TITLE "List all insert / update SQL queries, and don't execute them. Useful for previewing writes to the database" %>"
>
<span class="bn-icon-info"></span>
<%t JonoM\BetterNavigator.PREVIEW_WRITE_LABEL 'Preview write' %>
</a>
</div>
<% include BetterNavigator\BetterNavigatorExtraDebugging %>
<% end_if %>
</div>
</div>
<script type="application/javascript" src="$ScriptUrl"></script>
<link rel="stylesheet" href="$CssUrl" />

View File

@ -0,0 +1,137 @@
<section id="BetterNavigator" class="collapsed $CssClass layoutV2" aria-label="Better navigator - $ViewingTitle page">
<button id="BetterNavigatorStatus" class="$Viewing" aria-expanded="false" aria-controls="BetterNavigatorContent" aria-label="<%t JonoM\BetterNavigator.ARIA_MENU_LABEL 'Tool menu' %>">
<span class="status-text" aria-hidden="true">$ViewingTitle</span>
<span id="BetterNavigatorStatusIcon" class="bn-icon-cog"></span>
</button>
<div id="BetterNavigatorContent">
<div class="bn-links">
<% if $ArchiveLink.Active %>
<% if $EditLink %><a href="$EditLink" target="_blank"><span class="bn-icon-edit"></span><%t JonoM\BetterNavigator.RESTORE_LABEL 'Restore' %></a><% end_if %>
<% else %>
<% if not $LiveLink.Active %>
<% if $LiveLink.Link %>
<a href="$LiveLink.Link"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.VIEW_LIVE_LABEL 'View live' %></a>
<% else %>
<a href="$LiveLink.Link" aria-disabled="true" class="bn-disabled"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.NOT_YET_PUBLISHED_LABEL 'Not yet published' %></a>
<% end_if %>
<% end_if %>
<% if not $StageLink.Active %>
<% if $StageLink.Link %>
<a href="$StageLink.Link"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.VIEW_DRAFT_LABEL 'View draft' %></a>
<% else %>
<a href="$StageLink.Link" aria-disabled="true" class="bn-disabled"><span class="bn-icon-view"></span><%t JonoM\BetterNavigator.DELETED_FROM_DRAFT_SITE_LABEL 'Deleted from draft site' %></a>
<% end_if %>
<% end_if %>
<% if $EditLink %><a href="$EditLink" target="_blank"><span class="bn-icon-edit"></span><%t JonoM\BetterNavigator.EDIT_IN_CMS_LABEL 'Edit in CMS' %></a><% end_if %>
<% end_if %>
<% if $Member %>
$LogoutForm
<a href="$LogoutLink" id="BetterNavigatorLogoutLink"><span class="bn-icon-user"></span><%t JonoM\BetterNavigator.LOG_OUT_LABEL 'Log out' %><% if $Member.FirstName %><span class="light"> ($Member.FirstName)</span><% end_if %></a>
<% else %>
<a href="$LoginLink"><span class="bn-icon-user"></span><%t JonoM\BetterNavigator.LOG_IN_LABEL 'Log in' %></a>
<% end_if %>
</div>
<% include JonoM\BetterNavigator\BetterNavigatorExtraContent %>
<% if $Mode == 'dev' || $IsDeveloper %>
<h2 class="bn-heading"><%t JonoM\BetterNavigator.DEVELOPER_TOOLS_HEADING 'Developer tools' %></h2>
<ul class="bn-links">
<% if $Mode='dev' %>
<li><span class="bn-disabled" title="<%t JonoM\BetterNavigator.END_DEV_MODE_TITLE 'Log out to end Dev Mode' %>">
<span class="bn-icon-tick"></span><%t JonoM\BetterNavigator.DEV_MOVE_ON_LABEL 'Dev mode on' %>
</span></li>
<% else %>
<li><a href="{$AbsoluteLink}?isDev=1"><span class="bn-icon-devmode"></span><%t JonoM\BetterNavigator.DEV_MODE_LABEL 'Dev mode' %></a></li>
<% end_if %>
<li><a href="{$AbsoluteLink}?flush=1"
title="<%t JonoM\BetterNavigator.FLUSH_CACHE_TITLE 'Flush templates and manifest, and regenerate images for this page (behaviour varies by Framework version)' %>"
>
<span class="bn-icon-flush"></span><%t JonoM\BetterNavigator.FLUSH_CACHE_LABEL 'Flush caches' %>
</a></li>
<li><a href="/dev/build/?flush=1"
target="_blank"
title="<%t JonoM\BetterNavigator.BUILD_DATABASE_TITLE 'Build database and flush caches (excludes template caches pre SS-3.1.7)' %>"
>
<span class="bn-icon-db"></span><%t JonoM\BetterNavigator.BUILD_DATABASE_LABEL 'Build database' %>
</a></li>
<li><a href="/dev/" target="_blank"><span class="bn-icon-tools"></span><%t JonoM\BetterNavigator.DEV_MENU_LABEL 'Dev menu' %></a></li>
</ul>
<% include JonoM\BetterNavigator\BetterNavigatorExtraDevTools %>
<% end_if %>
<% if $Mode == 'dev' %>
<h2 class="bn-heading"><%t JonoM\BetterNavigator.DEBUGGING_HEADING 'Debugging' %></h2>
<ul class="bn-links">
<li><a href="{$AbsoluteLink}?showtemplate=1"
title="<%t JonoM\BetterNavigator.SHOW_TEMPLATE_TITLE 'Show the compiled version of all the templates used, including line numbers. Good when you have a syntax error in a template. Cannot be used on a Live site without isDev' %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.SHOW_TEMPLATE_LABEL 'Show template' %>
</a></li>
<li><a href="{$AbsoluteLink}?execmetric=1"
title="<%t JonoM\BetterNavigator.EXEC_METRIC_TITLE 'Display the execution time and peak memory usage for the request' %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.SHOW_METRICS_LABEL 'Show metrics' %>
</a></li>
<li><a href="{$AbsoluteLink}?debug=1"
title="<%t JonoM\BetterNavigator.DEBUG_PAGE_TITLE 'Show a collection of debugging information about the director / controller operation' %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.DEBUG_PAGE_LABEL 'Debug page' %>
</a></li>
<li><a href="{$AbsoluteLink}?debug_request=1"
title="<%t JonoM\BetterNavigator.DEBUG_REQUEST_TITLE 'Show all steps of the request from initial HTTPRequest to Controller to Template Rendering' %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.DEBUG_REQUEST_LABEL 'Debug request' %>
</a></li>
<li><a href="{$AbsoluteLink}?debugfailover=1"
title="<%t JonoM\BetterNavigator.DEBUG_FAILOVER_TITLE 'Shows failover methods from classes extended' %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.DEBUG_FAILOVER_LABEL 'Debug failover' %>
</a></li>
<li><a href="{$AbsoluteLink}?showqueries=1"
title="<%t JonoM\BetterNavigator.SHOW_QUERIES_TITLE 'List all SQL queries executed' %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.SHOW_QUERIES_LABEL 'Show queries' %>
</a></li>
<li><a href="{$AbsoluteLink}?previewwrite=1"
title="<%t JonoM\BetterNavigator.PREVIEW_WRITE_TITLE "List all insert / update SQL queries, and don't execute them. Useful for previewing writes to the database" %>"
>
<span class="bn-icon-info"></span><%t JonoM\BetterNavigator.PREVIEW_WRITE_LABEL 'Preview write' %>
</a></li>
</ul>
<% include JonoM\BetterNavigator\BetterNavigatorExtraDebugging %>
<% end_if %>
</div>
</section>
<script src="$ScriptUrl" async></script>
<link rel="stylesheet" href="$CssUrl">