Compare commits

...

31 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
Andreas Lang 19eb60bd62
Added i18n support (#48) 2020-11-20 15:10:34 -08:00
Jonathon Menz 02e84d7b99 Fix conditional rendering
Ensure scripts and css are only loaded with navigator markup is present, and support HTTPResponse as input. Fixes #46
2020-08-27 11:43:54 -07:00
Jonathon Menz d037dc8ebd Added sponsorship info 2020-05-27 10:02:22 -07:00
Bram de Leeuw da6e75c1b1 Fix injection on Form posts
In use with Silvershop, a form post from the AddProductForm would pass the form trough the `afterCallActionHandler` as the `$result`. This causes the `getValue` to error. By checking if the result is an instance of `DBHTMLText` this error can't happen anymore.
2019-09-04 11:01:10 -07:00
Jonathon Menz 1c61f86f36 Update URL debugging tools
* Only show if in dev mode
* Updated collection to match what is in docs
2019-08-23 11:00:52 -07:00
Jonathon Menz 01b41ac1a0 Fix logout form return destination 2019-08-23 11:00:52 -07:00
Jonathon Menz 4aed34ddb0 Updated ReadMe to in line with v5 changes
* script and CSS are hard-coded now
* updated external debugging tools recommendation
2019-08-23 11:00:52 -07:00
Aaron Carlino a5e3f0d88f NEW: Auto-injection into template (#43)
* `$BetterNavigator` no longer required in template
* Uses locally scoped render for navigator
* Added shouldShowBetterNavigator() method
2019-08-23 10:10:19 -07:00
wernerkrauss db3c7d8e39 Fix potential "undefined index" notice (#41)
CMSLink might not be set on RedirectorPage for example
2018-04-06 15:41:08 -07:00
Ed Chipman cd9c2083c8 Conversion to a Vendor Module (#40) 2018-03-20 12:24:06 -07:00
Jason Korth 39d1aed274 Don't upgrade logout link if form doesn't exist (#39)
Fixes #38
2018-03-19 15:15:46 -07:00
Jonathon Menz bfa6a310b6 Update login functions for SS4
Fixes #35
2017-11-20 11:30:11 -08:00
Jonathon Menz e23a257b37 Remove source map
Fixes #29
2017-11-20 11:28:52 -08:00
Michal Kleiner 132a98be68 Support async script loading
Use addEventListener to schedule BN initialisation only if document is still loading (#34)
2017-11-20 09:58:24 -08:00
Jonathon Menz 2a9df8695d Fix composer autoload error 2017-04-24 10:33:16 -07:00
Andrew Aitken-Fincham 79a585eda4 Update to be compatible with SS4 (#27)
plus some code tidying
2017-04-24 10:17:09 -07:00
47 changed files with 4040 additions and 354 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

126
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,53 +12,131 @@ 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 3.1
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
Just place **$BetterNavigator** somewhere in your template(s). If your website uses caching, make sure BetterNavigator's output is excluded.
The navigator is auto-injected into your template, and no code changes are needed.
If your website uses caching, make sure BetterNavigator's output is excluded.
### Access developer tools on a live website
**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:
```
BetterNavigator:
developers:
- 'dev@yoursite.com'
- 'otherdev@yoursite.com'
JonoM\BetterNavigator:
developers:
- 'dev@yoursite.com'
- 'otherdev@yoursite.com'
```
## Customisation
BetterNavigator's output is controlled by templates so it can be [easily overridden](http://doc.silverstripe.org/framework/en/topics/theme-development# overriding).
### Navigator display
#### Option 1: Add some stuff
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`.
If you want to add some content (new buttons for instance) to BetterNavigator, just create a template called *BetterNavigatorExtraContent.ss* or *BetterNavigatorExtraDevTools.ss* and add your content to it. Place the template in the includes folder for your website's theme, or in *mysite/templates/includes/* if you want to use it across multiple themes.
```php
public function showBetterNavigator()
{
// A user-defined setting
return $this->ShowDebugTools;
}
```
#### Option 2: Complete control
### Layout options
All content, scripts and CSS are loaded via the BetterNavigator.ss template, so you can completely customise BetterNavigator's front-end code by copying or creating your own BetterNavigator.ss template.
BetterNavigator can be made translucent when collapsed by adding the following config setting:
```
JonoM\BetterNavigator:
translucent: true
```
BetterNavigator's default position is 'right-top', but can be changed to 'right-bottom', 'left-top' or 'left-bottom'. Example:
```
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:
* *templates/JonoM/BetterNavigator/Includes/* BetterNavigatorExtraContent.ss
* *templates/JonoM/BetterNavigator/Includes/* BetterNavigatorExtraDebugging.ss
* *templates/JonoM/BetterNavigator/Includes/* BetterNavigatorExtraDevTools.ss
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.
## Known issues
### Overriding the "Edit in CMS" Link
* Probably won't work in IE8 or lower.
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.:
## Bonus: better debugging tools
````php
// EventsPageController.php
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 the recently released [SilverStripe Clockwork](https://github.com/markguinn/silverstripe-clockwork) by Mark Guinn. Out of the box SQL Queries and controller events are logged. It's Chrome only for now.
/**
* 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
[Jono Menz](https://jonomenz.com)
## Sponsorship
If you want to boost morale of the maintainer you're welcome to make a small monthly donation through [**GitHub**](https://github.com/sponsors/jonom), or a one time donation through [**PayPal**](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Z5HEZREZSKA6A). ❤️ Thank you!
Please also feel free to [get in touch](https://jonomenz.com) if you want to hire the maintainer to develop a new feature, or discuss another opportunity.

View File

@ -1,10 +1,10 @@
---
Name: betternavigator
After: 'framework/*','cms/*'
After: 'framework/*, cms/*'
---
LeftAndMain:
SilverStripe\Admin\LeftAndMain:
extra_requirements_javascript:
- 'betternavigator/javascript/BN.LeftAndMain.Preview.js'
ContentController:
- 'jonom/silverstripe-betternavigator: javascript/BN.LeftAndMain.Preview.js'
SilverStripe\CMS\Controllers\ContentController:
extensions:
- BetterNavigatorExtension
- JonoM\BetterNavigator\Extension\BetterNavigatorExtension

View File

@ -1,66 +0,0 @@
<?php
class BetterNavigatorExtension extends DataExtension {
/**
* Provides a front-end utility menu with administrative functions and developer tools
* Relies on SilverStripeNavigator
*
* @return string
*/
public function BetterNavigator() {
// Make sure this is a page
if (!($this->owner && $this->owner->dataRecord && $this->owner->dataRecord instanceof SiteTree && $this->owner->dataRecord->ID > 0)) return false;
// Only show navigator to appropriate users
$isDev = Director::isDev();
$canViewDraft = (Permission::check('VIEW_DRAFT_CONTENT') || Permission::check('CMS_ACCESS_CMSMain'));
if($isDev || $canViewDraft) {
// Get SilverStripeNavigator links & stage info (CMS/Stage/Live/Archive)
$nav = array();
$viewing = '';
$navigator = new SilverStripeNavigator($this->owner->dataRecord);
$items = $navigator->getItems();
foreach($items as $item) {
$name = $item->getName();
$active = $item->isActive();
$nav[$name] = array(
'Link' => $item->getLink(),
'Active' => $active
);
if ($active) {
if ($name == 'LiveLink') $viewing = 'Live';
if ($name == 'StageLink') $viewing = 'Draft';
if ($name == 'ArchiveLink') $viewing = 'Archived';
}
}
// Only show edit link if user has permission to edit this page
$editLink = (($this->owner->dataRecord->canEdit() && Permission::check('CMS_ACCESS_CMSMain')) || $isDev) ? Controller::join_links(Director::absoluteBaseURL(), $nav['CMSLink']['Link']) : false;
// Is the logged in member nominated as a developer?
$member = Member::currentUser();
$devs = Config::inst()->get('BetterNavigator', 'developers');
$identifierField = Member::config()->unique_identifier_field;
$isDeveloper = $member && is_array($devs) ? in_array($member->{$identifierField}, $devs) : false;
// Add other data for template
$backURL = '?BackURL=' . urlencode($this->owner->Link());
$bNData = array_merge($nav, array(
'Member' => $member,
'Stage' => Versioned::current_stage(),
'Viewing' => $viewing, // What we're viewing doesn't necessarily align with the active Stage
'LoginLink' => Controller::join_links(Director::absoluteBaseURL(), Config::inst()->get('Security', 'login_url'), $backURL),
'LogoutLink' => Controller::join_links(Director::absoluteBaseURL() . 'Security/logout', $backURL),
'EditLink' => $editLink,
'Mode' => Director::get_environment_type(),
'IsDeveloper' => $isDeveloper
));
// Merge with page data, send to template and render
$bNData = new ArrayData($bNData);
$page = $this->owner->customise(array('BetterNavigator' => $bNData));
return $page->renderWith('BetterNavigator');
}
return false;
}
}

View File

@ -1,17 +1,33 @@
{
"name": "jonom/silverstripe-betternavigator",
"description": "Front-end utility menu for SilverStripe websites featuring administration and development tools",
"type": "silverstripe-module",
"keywords": ["silverstripe", "navigator", "SilverStripeNavigator", "BetterNavigator"],
"license": "BSD-3-Clause",
"authors": [{
"name": "Jonathon Menz",
"homepage": "http://jonathonmenz.com"
}],
"require": {
"silverstripe/framework": "~3.1"
},
"extra": {
"installer-name": "betternavigator"
}
"name": "jonom/silverstripe-betternavigator",
"description": "Front-end utility menu for Silverstripe websites featuring administration and development tools",
"type": "silverstripe-vendormodule",
"keywords": [
"silverstripe",
"navigator",
"SilverStripeNavigator",
"BetterNavigator"
],
"license": "BSD-3-Clause",
"authors": [
{
"name": "Jonathon Menz",
"homepage": "http://jonathonmenz.com"
}
],
"require": {
"silverstripe/framework": "^5"
},
"extra": {
"expose": [
"css",
"images",
"javascript"
]
},
"autoload": {
"psr-4": {
"JonoM\\BetterNavigator\\": "src/"
}
}
}

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,56 +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.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

@ -1,7 +1 @@
{
"version": 3,
"mappings": ";;AAmFQ,cAAsB,GAlE5B,mBAAmB,EAAE,GACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,YAAsB,GAlE5B,mBAAmB,EAAE,OACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,WAAsB,GAlE5B,mBAAmB,EAAE,OACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,gBAAsB,GAlE5B,mBAAmB,EAAE,OACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,aAAsB,GAlE5B,mBAAmB,EAAE,OACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,cAAsB,GAlE5B,mBAAmB,EAAE,OACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,aAAsB,GAlE5B,mBAAmB,EAAE,OACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,aAAsB,GAlE5B,mBAAmB,EAAE,QACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,cAAsB,GAlE5B,mBAAmB,EAAE,QACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,aAAsB,GAlE5B,mBAAmB,EAAE,QACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;AA4ExC,aAAsB,GAlE5B,mBAAmB,EAAE,QACJ,EAZjB,MAAM,EAAE,IAAwC,EAChD,KAAK,EAAE,IAAuC;;ACAhD,+CAA8C,GAC5C,OAAO,EAAE,YAAY;;AAKvB,gBAAiB,GACb,QAAQ,EAAE,KAAK,EACf,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,4BAA4B,EACzC,SAAS,EAAE,IAAI,EACf,WAAW,EAAE,IAAI,EACjB,UAAU,EAAE,IAAI;AAEhB,kBAAE,GACE,eAAe,EAAE,IAAI;AAKzB,0BAAY,GACR,UAAU,EAAE,8BAA2B,EC4T7C,qBAAwC,EC5Nb,SAAiB,ED4N5C,oBAAwC,EC5Nb,SAAiB,ED4N5C,wBAAwC,EC5Nb,SAAiB,ED4N5C,gBAAwC,EC5Nb,SAAiB,ED4N5C,cAAwC,ED1Tf,gCAA+B,EC0TxD,aAAwC,ED1Tf,gCAA+B,EC0TxD,iBAAwC,ED1Tf,gCAA+B,EC0TxD,SAAwC,ED1Tf,gCAA+B,EAClD,YAAY,EAAE,WAAW;AAEzB,iDAAuB,GACnB,YAAY,EAAE,WAAW;AAEzB,gEAAe,GACX,OAAO,EAAE,IAAI;AAEjB,8DAAa,GACT,OAAO,EAAE,YAAY;AAI7B,kDAAwB,GACpB,OAAO,EAAE,IAAI;;AAWzB,sBAAuB,GACnB,KAAK,EAAE,IAAI,EACX,UAAU,EAJC,OAAO,EAKlB,MAAM,EAAE,iBAAkC,EAC1C,YAAY,EAAE,SAAS,EACvB,cAAc,EAAE,SAAS,EACzB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,IAAI;AAEjB,mCAAa,GACX,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,IAAI;AAGf,qCAAe,GACb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,SAAS;AAGnB,0EACe,GACb,OAAO,EAAE,EAAE;AAGb,4BAAQ,GACJ,UAAU,EAAE,OAAuB;AAEnC,sFACe,GACb,OAAO,EAAE,CAAC;AAIhB,2BAAO,GACH,UAAU,EAvCN,OAAO,EAwCX,YAAY,EAAE,OAAqB;AAEnC,iCAAQ,GACJ,UAAU,EAAE,OAAoB;AAIxC,4BAAQ,GACJ,UAAU,EA/CL,OAAO,EAgDZ,YAAY,EAAE,OAAsB;AAEpC,kCAAQ,GACJ,UAAU,EAAE,OAAqB;;AAO7C,uBAAwB,GACpB,OAAO,EAAE,GAAG,EACZ,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,iBAA4B,EACpC,YAAY,EAAE,WAAW;AAEzB,mCAAY,GACR,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,SAAS,EACzB,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,WAAW;AAGvB,+FAA8C,GAC5C,MAAM,EAAE,kBAAkB;AAG5B,mEACiB,GACb,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,4BAA4B,EACzC,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,GAAG,EAClB,aAAa,EAAE,iBAAiB,EAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,iBAAiB,EAC1B,WAAW,EAAE,IAAI,EACjB,WAAW,EAAE,IAAI;AAEjB,iFAAO,GACH,WAAW,EAAE,MAAM;AAI3B,kGAES,GACL,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,IAAI;AAGf,wCAAiB,GACb,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO;;AAKvB,gBAAiB,GACb,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,CAAC,EACT,aAAa,EAAE,cAAc,EAC7B,WAAW,EAAE,iBAAiB",
"sources": ["../../../../../../Applications/CodeKit.app/Contents/Resources/engines/compass/compass-core/stylesheets/compass/utilities/sprites/_base.scss","../scss/betternavigator.scss","../../../../../../Applications/CodeKit.app/Contents/Resources/engines/compass/compass-core/stylesheets/compass/_support.scss","../../../../../../Applications/CodeKit.app/Contents/Resources/engines/compass/compass-core/stylesheets/compass/css3/_transform.scss"],
"names": [],
"file": "betternavigator.css"
}
{"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

@ -1,10 +1,10 @@
//For reading cookies
// For reading cookies
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) {
@ -15,30 +15,65 @@ function getCookie(cname) {
}
function initialiseBetterNavigator() {
//Dom elements
// 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
// 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
// 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) {
// Upgrade logout link to directly log users out instead of redirecting to logout form
BetterNavigatorLogoutLink.onclick = function (e) {
e.preventDefault();
BetterNavigatorLogoutForm.submit();
};
}
}
if (document.addEventListener) {
if (document.addEventListener && document.readyState === 'loading') {
document.addEventListener("DOMContentLoaded", function () {
//wait til DOM is ready
// wait til DOM finishes loading
initialiseBetterNavigator();
});
} else {
//This is the case for IE8 and below
//initialise straight away - fine if script is loaded after BN dom element
// This is the case for IE8 and below OR already loaded document (e.g. when using async)
// initialise straight away - fine if script is loaded after BN dom element
initialiseBetterNavigator();
}

42
lang/de.yml Normal file
View File

@ -0,0 +1,42 @@
de:
JonoM\BetterNavigator:
VIEWING_LIVE: 'Live'
VIEWING_DRAFT: 'Entwurf'
VIEWING_ARCHIVED: 'Archiviert'
ARIA_MENU_LABEL: 'Werkzeugmenü'
DEVELOPER_TOOLS_HEADING: 'Entwickler Tools'
DEBUGGING_HEADING: 'Debugging'
RESTORE_LABEL: 'Wiederherstellen'
VIEW_LIVE_LABEL: 'Live ansehen'
NOT_YET_PUBLISHED_LABEL: 'Noch nicht veröffentlicht'
VIEW_DRAFT_LABEL: 'Entwurf ansehen'
DELETED_FROM_DRAFT_SITE_LABEL: 'Aus dem Entwurf gelöscht'
EDIT_IN_CMS_LABEL: 'Im CMS bearbeiten'
LOG_OUT_LABEL: 'Ausloggen'
LOG_IN_LABEL: 'Einloggen'
DEV_MOVE_ON_LABEL: 'Dev Modus aktiviert'
DEV_MODE_LABEL: 'Dev Modus'
FLUSH_CACHE_LABEL: 'Caches leeren'
BUILD_DATABASE_LABEL: 'Datenbank generieren'
DEV_MENU_LABEL: 'Dev Menü'
SHOW_TEMPLATE_LABEL: 'Template anzeigen'
SHOW_METRICS_LABEL: 'Metrics anzeigen'
DEBUG_PAGE_LABEL: 'Seite debuggen'
DEBUG_REQUEST_LABEL: 'Request debuggen'
DEBUG_FAILOVER_LABEL: 'Debug Failover'
SHOW_QUERIES_LABEL: 'Queries anzeigen'
PREVIEW_WRITE_LABEL: 'Queryvorschau'
END_DEV_MODE_TITLE: 'Ausloggen um den Dev Modus zu beenden'
FLUSH_CACHE_TITLE: 'Templates + Manifest neu einlesen und Bilder für diese Seite generieren (Verhalten kann sich je nach Framework-Version unterscheiden)'
BUILD_DATABASE_TITLE: 'Datenbank generieren und die Caches leeren (Template-Caches vor SS-3.1.7 sind ausgeschlossen)'
SHOW_TEMPLATE_TITLE: 'Zeigt die kompilierte Version von allen benutzten Templates mit Zeilenangaben an. Gut geeignet, wenn Syntax-Fehler in einem Template vorhanden sind. Kann auf einer Live-Seite ohne isDev nicht benutzt werden'
EXEC_METRIC_TITLE: 'Zeigt die vergangene Zeit zum Ausführen und die Spitzenauslastung der Speichernutzung für diesen Request an'
DEBUG_PAGE_TITLE: 'Zeigt eine Sammlung an Debugging-informationen über die Director- / Controller-operationen'
DEBUG_REQUEST_TITLE: 'Listet alle Schritte des Requests vom ursprünglichen HTTPRequest bis hin zum Controller und dem Template-Rendering auf'
DEBUG_FAILOVER_TITLE: 'Zeigt die Failover Methoden von vererbten Klassen an'
SHOW_QUERIES_TITLE: 'Listet alle ausgeführten SQL queries auf'
PREVIEW_WRITE_TITLE: "Listet alle Insert / Update SQL Queries auf, führt sie aber nicht aus. Als Vorschau für Änderungen in der Datenbank nützlich"

42
lang/en.yml Normal file
View File

@ -0,0 +1,42 @@
en:
JonoM\BetterNavigator:
VIEWING_LIVE: 'Live'
VIEWING_DRAFT: 'Draft'
VIEWING_ARCHIVED: 'Archived'
ARIA_MENU_LABEL: 'Tool menu'
DEVELOPER_TOOLS_HEADING: 'Developer tools'
DEBUGGING_HEADING: 'Debugging'
RESTORE_LABEL: 'Restore'
VIEW_LIVE_LABEL: 'View live'
NOT_YET_PUBLISHED_LABEL: 'Not yet published'
VIEW_DRAFT_LABEL: 'View draft'
DELETED_FROM_DRAFT_SITE_LABEL: 'Deleted from draft site'
EDIT_IN_CMS_LABEL: 'Edit in CMS'
LOG_OUT_LABEL: 'Log out'
LOG_IN_LABEL: 'Log in'
DEV_MOVE_ON_LABEL: 'Dev mode on'
DEV_MODE_LABEL: 'Dev mode'
FLUSH_CACHE_LABEL: 'Flush caches'
BUILD_DATABASE_LABEL: 'Build database'
DEV_MENU_LABEL: 'Dev menu'
SHOW_TEMPLATE_LABEL: 'Show template'
SHOW_METRICS_LABEL: 'Show metrics'
DEBUG_PAGE_LABEL: 'Debug page'
DEBUG_REQUEST_LABEL: 'Debug request'
DEBUG_FAILOVER_LABEL: 'Debug failover'
SHOW_QUERIES_LABEL: 'Show queries'
PREVIEW_WRITE_LABEL: 'Preview write'
END_DEV_MODE_TITLE: 'Log out to end Dev Mode'
FLUSH_CACHE_TITLE: 'Flush templates and manifest, and regenerate images for this page (behaviour varies by Framework version)'
BUILD_DATABASE_TITLE: 'Build database and flush caches (excludes template caches pre SS-3.1.7)'
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'
EXEC_METRIC_TITLE: 'Display the execution time and peak memory usage for the request'
DEBUG_PAGE_TITLE: 'Show a collection of debugging information about the director / controller operation'
DEBUG_REQUEST_TITLE: 'Show all steps of the request from initial HTTPRequest to Controller to Template Rendering'
DEBUG_FAILOVER_TITLE: 'Shows failover methods from classes extended'
SHOW_QUERIES_TITLE: 'List all SQL queries executed'
PREVIEW_WRITE_TITLE: "List all insert / update SQL queries, and don't execute them. Useful for previewing writes to the database"

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,170 +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;
}
//Toggle states
form {
display: none;
}
// 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 hlep for debugging info
// Some help for debugging info
body > p.message {
text-align: left;
background: #fff;

View File

@ -0,0 +1,225 @@
<?php
namespace JonoM\BetterNavigator\Extension;
use SilverStripe\Admin\Navigator\SilverStripeNavigator;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Security\LogoutForm;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\ORM\FieldType\DBHTMLText;
class BetterNavigatorExtension extends DataExtension
{
private static $better_navigator_edit_permission = 'CMS_ACCESS_CMSMain';
private static $better_navigator_edit_permission_mode = 'any';
/**
* Extensions are singleton, so any cached results need to use a unique key
*/
private $shouldDisplay = [];
/**
* @param $request
* @param $action
* @param DBHTMLText|HTTPResponse $result (actually could be anything such as a string, controller or object)
* @return DBHTMLText|HTTPResponse
*/
public function afterCallActionHandler($request, $action, $result)
{
// Known issue: if $result is a Controller then BetterNavigator won't be rendered.
// See https://github.com/jonom/silverstripe-betternavigator/issues/47#issuecomment-682120739
// Check that we're dealing with HTML
$isHtmlResponse = $result instanceof DBHTMLText ||
$result instanceof HTTPResponse && strpos($result->getHeader('content-type'), 'text/html') !== false;
if (!$isHtmlResponse || !$this->shouldDisplay()) {
return $result;
}
$html = $result instanceof DBHTMLText ? $result->getValue() : $result->getBody();
$navigatorHTML = $this->generateNavigator()->getValue();
// Inject the NavigatorHTML before the closing </body> tag
$html = preg_replace(
'/(<\/body[^>]*>)/i',
$navigatorHTML . '\\1',
$html ?? ''
);
if ($result instanceof DBHTMLText) {
$result->setValue($html);
} else {
$result->setBody($html);
}
return $result;
}
/**
* Override on a per-controller basis to add custom logic
* @return bool
*/
public function showBetterNavigator()
{
return $this->isAPage();
}
/**
* Provides a front-end utility menu with administrative functions and developer tools
* Relies on SilverStripeNavigator
*
* @return DBHTMLText
*/
private function generateNavigator()
{
// Get SilverStripeNavigator links & stage info (CMS/Stage/Live/Archive)
$nav = [];
$viewing = '';
$viewingTitle = '';
$navigator = SilverStripeNavigator::create($this->owner->dataRecord);
$isDev = Director::isDev();
$items = $navigator->getItems();
foreach ($items as $item) {
$name = $item->getName();
$active = $item->isActive();
$nav[$name] = [
'Link' => $item->getLink(),
'Active' => $active
];
if ($active) {
if ($name == 'LiveLink') {
$viewing = 'Live';
$viewingTitle = _t('JonoM\BetterNavigator.VIEWING_LIVE', 'Live');
}
else if ($name == 'StageLink') {
$viewing = 'Draft';
$viewingTitle = _t('JonoM\BetterNavigator.VIEWING_DRAFT', 'Draft');
}
else if ($name == 'ArchiveLink') {
$viewing = 'Archived';
$viewingTitle = _t('JonoM\BetterNavigator.VIEWING_ARCHIVED', 'Archived');
}
}
}
// 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 = 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;
// Add other data for template
$backURL = '?BackURL=' . urlencode($this->owner->Link());
$logoutForm = LogoutForm::create($this->owner)->setName('BetterNavigatorLogoutForm');
$logoutForm->Fields()->fieldByName('BackURL')->setValue($this->owner->Link());
$bnModule = ModuleLoader::getModule('jonom/silverstripe-betternavigator');
$bNData = array_merge($nav, [
'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),
'LogoutForm' => $logoutForm,
'EditLink' => $editLink,
'Mode' => Director::get_environment_type(),
'IsDeveloper' => $isDeveloper,
'ScriptUrl' => $bnModule->getResource('javascript/betternavigator.js')->getURL(),
'CssUrl' => $bnModule->getResource('css/betternavigator.css')->getURL(),
]);
// Merge with page data, send to template and render
$navigator = new ArrayData($bNData);
return $this->owner->customise($navigator)->renderWith('JonoM\\BetterNavigator\\BetterNavigator');
}
/**
* Internally compute and cache weather the navigator should display
* @return bool
*/
private function shouldDisplay()
{
$key = $this->owner->getUniqueKey();
if (array_key_exists($key, $this->shouldDisplay)) {
return $this->shouldDisplay[$key];
}
// Make sure this is a page
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'));
$result = ($isDev || $canViewDraft);
$this->shouldDisplay[$key] = $result;
return $result;
}
/**
* @return boolean
*/
private function isAPage()
{
return $this->owner
&& $this->owner->dataRecord
&& $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,90 +0,0 @@
<% require javascript("betternavigator/javascript/betternavigator.js") %>
<% require css("betternavigator/css/betternavigator.css") %>
<div id="BetterNavigator" class="collapsed">
<% with $BetterNavigator %>
<div id="BetterNavigatorStatus" class="$Viewing">
<span class="bn-icon-cog"></span>
$Viewing
<span class="bn-icon-close"></span>
</div>
<% end_with %>
<div id="BetterNavigatorContent">
<div class="bn-links">
<% with $BetterNavigator %>
<% if $ArchiveLink.Active %>
<% if $EditLink %><a href="$EditLink" target="_blank"><span class="bn-icon-edit"></span>Restore</a><% end_if %>
<% else %>
<% if not $LiveLink.Active %>
<% if $LiveLink.Link %>
<a href="$LiveLink.Link"><span class="bn-icon-view"></span>View live</a>
<% else %>
<span class="bn-disabled"><span class="bn-icon-view"></span>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>View draft</a>
<% else %>
<span class="bn-disabled"><span class="bn-icon-view"></span>Deleted from draft site</span>
<% end_if %>
<% end_if %>
<% if $EditLink %><a href="$EditLink" target="_blank"><span class="bn-icon-edit"></span>Edit in CMS</a><% end_if %>
<% end_if %>
<% if $Member %>
<a href="$LogoutLink"><span class="bn-icon-user"></span>Log out<% if $Member.FirstName %><span class="light"> ($Member.FirstName)</span><% end_if %></a>
<% else %>
<a href="$LoginLink"><span class="bn-icon-user"></span>Log in</a>
<% end_if %>
<% end_with %>
</div>
<% include BetterNavigatorExtraContent %>
<% if $BetterNavigator.Mode=='dev' || $BetterNavigator.IsDeveloper %>
<div class="bn-heading">Developer tools</div>
<div class="bn-links">
<% if $BetterNavigator.Mode='dev' %>
<span class="bn-disabled" title="Log out to end Dev Mode"><span class="bn-icon-tick"></span>Dev mode on</span>
<% else %>
<a href="{$AbsoluteLink}?isDev=1"><span class="bn-icon-devmode"></span>Dev mode</a>
<% end_if %>
<a href="{$AbsoluteLink}?flush=1" title="Flush templates and manifest, and regenerate images for this page (behaviour varies by Framework version)"><span class="bn-icon-flush"></span>Flush caches</a>
<a href="{$AbsoluteBaseURL}dev/build/?flush=1" target="_blank" title="Build database and flush caches (excludes template caches pre SS-3.1.7)"><span class="bn-icon-db"></span>Build database</a>
<a href="{$AbsoluteBaseURL}dev/" target="_blank"><span class="bn-icon-tools"></span>Dev menu</a>
</div>
<% include BetterNavigatorExtraDevTools %>
<div class="bn-heading">Debugging</div>
<div class="bn-links">
<a href="{$AbsoluteLink}?showtemplate=1"><span class="bn-icon-info"></span>Show template</a>
<a href="{$AbsoluteLink}?debug=1&amp;isDev=1"><span class="bn-icon-info"></span>Debug page</a>
<a href="{$AbsoluteLink}?debugmethods=1"><span class="bn-icon-info"></span>Debug methods</a>
<a href="{$AbsoluteLink}?debug_request=1&amp;isDev=1"><span class="bn-icon-info"></span>Debug request</a>
<a href="{$AbsoluteLink}?debugfailover=1&amp;isDev=1"><span class="bn-icon-info"></span>Debug failover</a>
<a href="{$AbsoluteLink}?showqueries=1&amp;isDev=1"><span class="bn-icon-info"></span>Show queries</a>
<a href="{$AbsoluteLink}?previewwrite=1&amp;isDev=1"><span class="bn-icon-info"></span>Preview write</a>
</div>
<% include BetterNavigatorExtraDebugging %>
<% end_if %>
</div>
</div>

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">