+ A Panel is a container styled with a slight background color and no borders.
+
+
+ Hello world! I am a Panel!
+
+
+
+
+ Box
+
+
+ A Box is a container adding borders of all four sides to the base appearence of a Panel.
+
+
+ This Box contains a hidden Snake. 🐍
+
+
+
+
+ Dialog
+
+
+ A Dialog is a container adding a left border to the base appearence of a Panel.
+
+
+ Snake? Snake??? SNAKEEEEEEE!
+
+
+
+
+ Parenthesis
+
+
+ A Parenthesis is a container styled as a Panel and with smaller text.
+
+
+ I think we lost the Snake...
+
+
+
+
+ Panel usage
+
+
+ When using Bluelib, text should always be either an header or inside a Panel.
+
+
+ Since Panels often denote "sections" of text, they should usually be <section> elements.
+
+
+ When they are only used cosmetically, <div> elements should be used instead.
+
+
+ When used to create forms, they may also be <form> elements.
+
+
+
+
+ Box usage
+
+
+ A Box creates a visible separation between the content inside it and the content outside it, and should be used when this separation is desired, like when describing a topic (like here).
+
+
+ To achieve the best visual style, Boxes should always be the outmost panels: you should never place a Box inside a Panel or a Dialog, but you can place one inside another Box.
+
+
+
+
+ Dialog usage
+
+
+ A Dialog creates a visible indentation of the content inside it, and should be used when this indentation is desired, like in quotes or examples.
+
+
+ When containing a quote, they should use <blockquote> elements.
+
+
+ Like Boxes, Dialogs should never be placed into containers with less borders than them, such as Panels.
+
+
+
+
+ Parenthesis usage
+
+
+ A Parenthesisremoves importance from its contents, and therefore makes for a great container for notes or additional information about a topic.
+
+
+ Having no borders, they should be considered as Panels when placing them: never add Boxes or Dialogs inside them.
+
+
+
+
+
+
+ Nesting
+
+
+ As you have seen in the sections before, panels can be nested many times (until the text becomes undistinguishable)!
+
+ A chapter is a grouping of an heading and multiple panels containing tightly related information.
+
+
+ They split their children into a preset amount of columns: this one, for example, splits panels into two columns.
+
+
+ The maximum number of columns in a chapter is 9; beyond that, you'll need to write your own chapter code.
+
+
+
+
+ Panel heights
+
+
+ In a chapter, all panels on a row inherit the height of the tallest panel in it, so that no empty space is left.
+
+
+
+
+ Element floats
+
+
+ A float is a utility class to align items in panels without having to write CSS.
+
+
+ For example, if a panel has some empty space, elements can be made to float to the bottom, which can be useful for example for buttons in sibling panels.
+
+
+
+
+ Auto-wrapping
+
+
+ Panels in a numbered chapter will automatically wrap if their contents won't fit horizontally.
+
+
+ Wrapped panels' heights ignore the height of panels in other rows.
+
+
+ To have a constant height, one has to be set manually.
+
+
+
+
+ Auto-sizing
+
+
+ Panels in a "zero" chapter will instead automatically resize to fit everything in a single row.
+
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ 4
+
+
+ 5
+
+
+ 6
+
+
+ 7
+
+
+ 8
+
+
+ 9
+
+
+ 10
+
+
+
+ To set a constant width, one has to be set manually.
+
+
+
+
+
+ Modifiers
+
+
+
+ Fade
+
+
+ The fade modifier reduces the opacity of the elements it is applied to.
+
+
+
+ I'm a faded box!
+
+
+
+ I'm faded too!
+
+
+
+ But they can be faded more.
+
+
+
+
+
+
+
+ Mark
+
+
+ The mark modifier distinguishes the elements it is applied to from the surrounding ones by applying a strong color contrast.
+
+
+
+ Think of it like an highlighter, but for anything!
+
+
+
+ Which can be nested to negate its effect.
+
+
+
+ Up to 3 times and not any more.
+
+
+
+
+
+
+
+ To do
+
+
+ The todo modifier emphasises that the contents of the elements it is applied to are not correct or final.
+
+
+
+ Like this!
+
+
+
+ As with other modifiers, it is inherited.
+
+
+
+ And it does nothing if reapplied.
+
+
+
+
+
+
+
+ Color modifiers
+
+
+ The color modifiers change the colors of the elements they are applied to.
+
+
+
+
+ Red
+
+
+ * warns angrily!
+
+
+
+
+ Yellow
+
+
+ * warns.
+
+
+
+
+ Green
+
+
+ * is a success!
+
+
+
+
+ Cyan
+
+
+ * informs...
+
+
+
+
+ Blue
+
+
+ * annotates
+
+
+
+
+ Magenta
+
+
+ * asks a question?
+
+
+
+
+
+
+
+ Separators
+
+
+
+ Separator
+
+
+ A separator is a horizontal line that fills all the horizontal space available on a panel, forcing a line wrap.
+
+
+
+ Top Text
+
+
+
+
+ Light separator
+
+
+ A light separator is a less eye-catching separator, to be used if the regular separator distracts too much from the flow of the text.
+
+
+
+ Bottom Text
+
+
+
+
+ Heavy separator
+
+
+ A heavy separator is a very eye-catching separator, to be used if the regular separator isn't apparent enough.
+
+
+
+ Bottom Text 2: Electric Boogaloo
+
+
+
+
+
+ Lists
+
+
+
+ Ordered list
+
+
+ A ordered list displays a series of items whose order is relevant.
+
+
+
First
+
Second
+
Third
+
Fourth
+
Fifth
+
Sixth
+
Seventh
+
Eight
+
Ninth
+
Tenth
+
Eleventh
+
Twelfth
+
+
+
+
+ Unordered list
+
+
+ An unordered list displays a series of items whose order is irrelevant.
+
+
+
First
+
Second
+
Third
+
Fourth
+
Fifth
+
Sixth
+
Seventh
+
Eight
+
Ninth
+
Tenth
+
Eleventh
+
Twelfth
+
+
+
+
+
+ Glossaries
+
+
+
+ Definition list
+
+
+ A definition list displays a series of term-description pairs.
+
+
+
+ Term
+
+
+ Description
+
+
+ Other term
+
+
+ Other description
+
+
+
+
+
+ Collapsible details
+
+
+ A details element hides its contents, displaying only a summary until either the marker or the summary itself is activated.
+
+
+ Something
+
+ Something else
+
+
+
+ Something more
+
+ Something different
+
+
+
+
+
+
+ Text
+
+
+
+ Anchors
+
+
+ An anchor is an interactable element which can be clicked to go to a different page, or a different part of the same page, or to perform an action with a different application!
+
+ Input samples and output samples from a computer have elements which denote them, and are formatted appropriately.
+
+
+ A sample inside another creates emphasises the individual element, creating a combination.
+
+
+
+ If you press Ctrl+Alt+Del, something will happen!
+
+
+ If you're on Windows, a menu will appear, and one of the options will say Task Manager.
+
+
+
+
+
+ Variables
+
+
+ A variable denotes a placeholder for something in a formula or algorithm.
+
+
+
+ Sum: Whatever + Anything = Something
+
+
+
+
+
+ Quotes and citations
+
+
+ A quote element indicates an inline quote, and may be optionally include a citation element indicating the source of the quote.
+
+
+
+ Objection!
+ —Phoenix Wright, Ace Attorney
+
+
+
+
+
+ Definitions
+
+
+ A definition element indicates the term that is being defined in the contained paragraph.
+
+
+
+ This definition example is getting a bit too meta for my tastes.
+
+
+
+
+
+ Abbreviations
+
+
+ An abbreviation element marks its contents as an acronym or abbreviation and allows the user to view the expanded abbreviation by hovering it with the mouse.
+
+
+ Note that no mobile browsers currently support this feature, so you'll have to manually provide an alternative for mobile users to see the full abbreviation.
+
+
+
+ Two companies against each other: BLU vs. RED!
+
+
+
+
+
+ Ruby
+
+
+ A ruby text element is text with small annotations above, commonly used in East Asian texts.
+
+
+
+
+ Mo
+ de
+ na
+
+
+
+
+ 漢
+ 字
+
+
+
+
+ 明日
+
+
+
+
+
+
+
+ Tables
+
+
+
+ Table
+
+
+ A table is an element whose children are aligned in a grid.
+
+
+
+
+
Emoji
+
Meaning
+
+
+
+
+
🙂
+
Slightly Smiling Face
+
+
+
🌑
+
New Moon
+
+
+
🌚
+
New Moon with Face
+
+
+
+
+
+
+ Table caption
+
+
+ Tables can have captions attached to their top.
+
+
+
+ Apple emoji meanings
+
+
+
+
Emoji
+
Meaning
+
+
+
+
+
🍎
+
Red Apple
+
+
+
🍏
+
Green Apple
+
+
+
+
Hopefully a square with F8FF written inside it
+
+
+
+
+ Tables can also have headings and captions attached to their bottom.
+
+
+
+ Pear emoji meanings
+
+
+
+
🍐
+
Pear
+
+
+
+
+
Emoji
+
Meaning
+
+
+
+
+
+
+
+ Table panels
+
+
+ A table panel is a special table which is rendered as a panel.
+
+
+ This table in particular is rendered as a box panel, and is about what two brothers think of the following objects:
+
+
+
+
+
+
Mario
+
Luigi
+
+
+
+
+
Tables
+
They're cool and allow you to do cool stuff
+
They need chairs to be useful
+
+
+
Flexboxes
+
They're very useful
+
Not enough flexible for me
+
+
+
Grids
+
I love them
+
Bleargh
+
+
+
+
+
Overall
+
<3
+
0/10
+
+
+
+
+
+
+ Table dialogs
+
+
+ Panel tables can also be dialogs and parentheses.
+
+
+ This table in particular is a dialog panel, and is about example features for a robot:
+
+
+
+
+
Feature
+
Description
+
+
+
+
+
Base
+
All the base features of your home robot!
+
+
+
Extra
+
Everything a robot should be able to do, plus an infinite bubblewrap dispenser!
+
+
+
Super
+
The robot is now armed with a non-free printer, and is ready to conquer the world!
+
+
+
+
+
Ultimate
+
A time machine has been embedded into the robot, and it is free to use it at will.
+
+
+
+
+
+
+ Cell modifiers
+
+
+ Cells in tables have modifiers applied like all elements.
+
+
+ This table in particular is for a game of tic-tac-toe.
+
+
+
+
+
O
+
+
X
+
+
+
X
+
X
+
O
+
+
+
X
+
O
+
+
+
+
+
+
+
+ Images
+
+
+
+ Default
+
+
+ Images are automatically centered and resized to fit the panel they are in.
+
+
+
+
+
+ Limited
+
+
+ Images can be limited to prevent them from taking up too much screen space, like the previous one did.
+
+
+
+ Half
+
+
+ The following image has a limit of half the vertical viewport:
+
+
+
+
+ Quarter
+
+
+ The following image has a limit of a quarter of the vertical viewport:
+
+
+
+
+
+
+ Inputs
+
+
+
+ Input
+
+
+ An Input is an interactive element which allows the user to interact with the web page.
+
+
+
+
+
+
+ Field
+
+
+ A Field is an Input which allows the user to enter single-line free-form text.
+
+
+
+
+ Special types of Fields
+
+
+ A Field may require a particular type of data, such as an email or a phone number.
+
+
+
+
+
+ Area
+
+
+ An Area is a resizable Input which allows the user to enter multi-line free-form text.
+
+
+
+
+
+ Select
+
+
+ A Select is an Input which allow the user to select between one of multiple options.
+
+
+
+
+
+ Multiselect
+
+
+ A Multiselect is an Input which allows the user to enable or disable multiple options.
+
+
+ Be aware that the average user will probably not know how to interact with the Multiselect: to select options not adjacent to each other on a desktop browser, it requires holding the Ctrl key.
+
+
+
+
+
+ Radio
+
+
+ Radios are Inputs which, like a Select, allow the user to select between one of multiple options when grouped together.
+
+
+
+
+
+ Checkbox
+
+
+ Checkboxes are Inputs which, like a Multiselect, allows the user to enable or disable multiple options when grouped together.
+
+
+
+
+
+ Color
+
+
+ A Color (Input) is an Input which allows the user to select a RGB color.
+
+
+ Since browsers usually delegate the rendering of this element to the operating system, it cannot be styled.
+
+
+
+
+
+ File
+
+
+ A File is an Input which allows the user to upload a file from their computer.
+
+
+ Since browsers usually delegate the rendering of this element to the operating system, it cannot be styled.
+
+
+
+
+
+ Range
+
+
+ A Range is an Input which allows the user to inaccurately select a value from a given range.
+
+
+
+
+
+ Button
+
+
+ A Button is an Input which the user can click to trigger an action.
+
+
+
+
+
+
+ Forms
+
+
+
+ Form
+
+
+ An form is a non-interactive element which positions Inputs in commonly used ways.
+
+
+
+
+ Flex form
+
+
+ A flex form is a block form aligning labels and inputs to a pseudo-grid.
+
- A chapter is a grouping of an heading and multiple panels containing tightly related information.
-
-
- You're seeing one right now!
-
-
-
-
- Panel heights
-
-
- In a chapter, all panels on a row inherit the height of the tallest panel in it, so that no empty space is left.
-
-
-
-
- Auto-wrapping
-
-
- Additionaly, panels in a chapter will automatically wrap if their contents won't fit horizontally.
-
-
-
-
-
- Force-wrapping
-
-
- You can override the automatic wrapping and manually decide where a chapter should wrap by inserting a force-wrap element where you want the chapter to wrap.
-
-
- Due to technical limitations, panels will have a 16px vertical margin when a chapter is force-wrapped.
-
-
-
-
-
- Separators
-
-
-
- Separator
-
-
- A separator is a horizontal line that fills all the horizontal space available on a panel, forcing a line wrap.
-
-
-
- Top Text
-
-
-
-
-
- Light separator
-
-
- A light separator is a slightly more transparent separator, to be used if the regular color distracts too much from the flow of the text.
-
-
-
- Bottom Text
-
-
-
-
- Heavy separator
-
-
- A heavy separator is a non-transparent separator, to be used if the regular color isn't apparent enough.
-
-
-
- Bottom Text 2: Electric Boogaloo
-
-
-
-
-
- Images
-
-
-
- Default
-
-
- Images are automatically centered and resized to fit the panel they are in.
-
-
-
-
-
-
- Limited
-
-
- Images can be limited to prevent them from taking up too much screen space.
-
-
-
-
- Half
-
-
- The following image has a limit of half the vertical viewport:
-
-
-
-
-
- Quarter
-
-
- The following image has a limit of a quarter of the vertical viewport:
-
-
-
-
-
-
-
-
- Figures
-
-
- Images can be wrapped in a figure element to semantically provide additional detail to them.
-
-
-
-
-
-
- Tables
-
-
-
- Table
-
-
- A table is an element displaying data aligned and ordered by rows and columns.
-
-
-
What do the brothers think of the following elements?
-
-
-
-
Mario
-
Luigi
-
-
-
-
-
Tables
-
They're cool and allow you to do cool stuff
-
They need chairs to be useful
-
-
-
Flexboxes
-
They're very useful
-
Not enough flexible for me
-
-
-
Grids
-
I love them
-
Bleargh
-
-
-
-
-
Overall
-
<3
-
0/10
-
-
-
-
- Elements in tables can be marked to increase their contrast with the rest.
-
-
-
- A game of tic-tac-toe.
-
-
-
-
O
-
-
X
-
-
-
X
-
X
-
O
-
-
-
X
-
O
-
-
-
-
-
- Captions can are above the table by default, but they can be moved below the table.
-
-
-
- HTML elements tier list
-
-
-
-
S
-
<span>
-
-
-
A
-
<a>
-
-
-
B
-
<body>
-
-
-
C
-
<caption>
-
-
-
-
-
-
-
- Lists
-
-
-
- Unordered lists
-
-
- An unordered list displays a series of items whose order is irrelevant.
-
-
-
This
-
That
-
Wooper
-
Quagsire
-
-
-
-
- Ordered lists
-
-
- A ordered list displays a series of items whose order is relevant.
-
-
-
Gold
-
Silver
-
Bronze
-
Iron
-
-
-
-
- Description lists
-
-
- A description list displays a series of name-description pairs.
-
-
-
- Key
-
-
- Value
-
-
- Other key
-
-
- Other value
-
-
-
-
-
-
- Status
-
-
-
- Disabled
-
-
- An element can be disabled to make it partially transparent, non-interactable and displaying the not-allowed cursor when hovered.
-
-
- Any element, from a <span> to a chapter, can be disabled.
-
-
- Please re-enable me, I did nothing wrong! I just said "AMOGU—"
-
-
-
-
-
- Inputs
-
-
-
- Input
-
-
- An input is an interactive element that allows the reader of the page to interact with it.
-
-
- They come in multiple kinds:
-
-
-
-
- Field
-
-
- A field is an input where the user can insert text with their keyboard.
-
-
-
-
-
-
- Select
-
-
- A select is an input where the user can select one between multiple options.
-
-
-
-
-
-
-
- Area
-
-
- A area is a resizable input where the user can insert multiple lines of text with their keyboard.
-
-
-
-
-
-
- Multiselect
-
-
- A multiselect is an input where the user can select many options from a list.
-
-
-
-
-
-
-
- Radio
-
-
- A radio is an input which the user can either select or not, deselecting the other radios with the same name.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Checkbox
-
-
- A checkbox is an input which the user can either select or not.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Button
-
-
- A button is an input which the user can interact with to trigger a reaction.
-
-
-
-
-
-
-
-
-
-
- Forms
-
-
-
- Forms, labels and inputs
-
-
- A form is a grouping of labels and inputs with the same purpose, with the former describing what should be entered in the latter.
-
-
-
-
-
-
- Form groups
-
-
- Inputs such as radios or checkboxes should be grouped together when inserted in a form.
-
-
-
- Groups automatically wrap if the inputs don't fit on a single line.
-
-
-
-
-
- Row groups
-
-
- A row group is a form group where the inputs are arranged vertically instead of horizontally.
-
-
-
-
-
-
- Form rows
-
-
- Forms can also contain form rows, elements which ignore the form columns and instead take up the whole row.
-
-
-
-
-
-
- Common elements
-
-
-
- Headings
-
-
- An heading is the title of an article, chapter or panel.
-
-
-
Level-1
-
Level-2
-
Level-3
-
Level-4
-
Level-5
-
Level-6
-
-
- Generally, panels look nicer if they start with a level-3 heading, but you may use whichever you want, as Bluelib will automatically handle the margin.
-
-
-
-
- Anchors
-
-
- An anchor is a part of text which can be clicked to move to a different page or part of page.
-
- A ruby is an inline element with annotations above the text.
-
-
-
- Mo
- de
- na
-
-
-
-
- 漢
- 字
-
-
-
-
- 明日
-
-
-
-
-
- Todo
-
-
- A todo is a panel marked as incomplete by the page author.
-
-
- Its colors are palette-independent and derive from the 🚧 Twemoji.
-
-
- 🚧 Write a description for this element.
-
-
- 🚧 Write a description for this element.
-
-
- 🚧 Write a description for this element.
-
-
- 🚧 Write a description for this element.
-
-
-
-
-
- Semantics
-
-
-
- Semantics
-
-
- A semantic is an inline element having a specific meaning defined by the HTML specification.
-
-
- Here's the full list of them:
-
-
-
- Abbreviation
-
-
- Bring Attention
-
-
- Citation
-
-
- Code with variable
-
-
- Definition
-
-
- Emphasis
-
-
- Idiomatic Text
-
-
- Mark Text
-
-
- Inline Quotation
-
-
- Strikethrough
-
-
- Sample Output
-
-
- Side Comment
-
-
- Strong Importance
-
-
- Unarticulated Annotation
-
-
- Variable
-
-
-
-
-
-
- Keyboard
-
-
- A keyboard element represents an interaction of the user with any kind of interface, such as a keyboard key like Enter, a combination of key presses like Ctrl + Alt + Del, or the interaction with an UI element like the Refresh button.
-
-
- Key presses and releases can be distinguished via special classes: Press ARelease A
-
-
-
-
- Preformatted and code
-
-
- A preformatted text element displays its content as it is, preserving all spaces, newlines, and indentation.
-
-
-
This is regular preformatted text. :)
-
-
- If code is being represented, it should be wrapped inside a code element.
-
-
-
This is preformatted code text. :)
-
-
-
-
-
- Colors
-
-
-
- Bluelib color
-
-
- All Bluelib elements get their Bluelib color dynamically from the --bluelib-color-* CSS variables, and then use it to paint themselves.
-
-
- It is possible to change this color to alter the color of not only text, but panels and other elements as well!
-
-
-
-
-
- Red
-
-
- This is a red box.
-
-
-
-
- Orange
-
-
- This is an orange box.
-
-
-
-
- Yellow
-
-
- This is a yellow box.
-
-
-
-
- Lime
-
-
- This is a lime box.
-
-
-
-
- Cyan
-
-
- This is a cyan box.
-
-
-
-
- Blue
-
-
- This is a blue box.
-
-
-
-
- Magenta
-
-
- This is a magenta box.
-
-
-
-
- Gray
-
-
- This is a gray box.
-
-
-
-
-
- White
-
-
- This box has a custom color: it is always white!
-
-
-
-
- Black
-
-
- This box has a custom color: it is always black!
-
-
-
-
-
-
-
-
-
diff --git a/package.json b/package.json
index 57bbd70..199a296 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,10 @@
{
"name": "@steffo/bluelib",
- "version": "4.0.2",
+ "version": "5.0.0",
"description": "A stylesheet that supports fast dynamic recoloring via CSS variables",
+ "scripts": {
+ "dev": "web-dev-server --watch"
+ },
"keywords": [
"bluelib",
"css",
@@ -45,5 +48,8 @@
"url": "https://github.com/Steffo99/bluelib.git"
},
"license": "AGPL-3.0-or-later",
- "private": false
+ "private": false,
+ "devDependencies": {
+ "@web/dev-server": "^0.1.34"
+ }
}
diff --git a/src/hacks/intellij-shut-up.less b/src/hacks/intellij-shut-up.less
new file mode 100644
index 0000000..ea231b9
--- /dev/null
+++ b/src/hacks/intellij-shut-up.less
@@ -0,0 +1,3 @@
+// IntelliJ does not support yet accessors, so this will make it stop reporting errors without affecting anything else.
+@c: 0;
+
diff --git a/src/mixins/fonts.less b/src/mixins/fonts.less
new file mode 100644
index 0000000..7ed7d84
--- /dev/null
+++ b/src/mixins/fonts.less
@@ -0,0 +1,29 @@
+//! These mixins allow the abstraction of the fonts used by elements by having them use named "mixins".
+//!
+//! For example, all h1, h2, h3, and .title elements might use the "title" group, whose font may be dynamically changed at the time of the page viewing.
+
+
+/// Set the CSS variables of a certain font group to the given values.
+///
+/// See `.use-font-group`.
+.create-font-group(@name; @style; @variant; @weight; @stretch; @size; @height; @family) {
+ --bfont-@{name}-style: @style;
+ --bfont-@{name}-variant: @variant;
+ --bfont-@{name}-weight: @weight;
+ --bfont-@{name}-stretch: @stretch;
+ --bfont-@{name}-height: @height;
+ --bfont-@{name}-family: @family;
+}
+
+
+/// Set the `font` CSS property to the CSS variables of the given font name.
+///
+/// See `.create-font-group`.
+.use-font-group(@name) {
+ font-style: var(~"--bfont-@{name}-style");
+ font-variant: var(~"--bfont-@{name}-variant");
+ font-weight: var(~"--bfont-@{name}-weight");
+ font-stretch: var(~"--bfont-@{name}-stretch");
+ line-height: var(~"--bfont-@{name}-height");
+ font-family: var(~"--bfont-@{name}-family");
+}
diff --git a/src/mixins/hsl.less b/src/mixins/hsl.less
new file mode 100644
index 0000000..8bf5824
--- /dev/null
+++ b/src/mixins/hsl.less
@@ -0,0 +1,51 @@
+//! These mixins allow the abstraction of the colors used by elements by having them use named "mixins".
+//!
+//! For example, the body's foreground color and the buttons' background color might use the "foreground" group, whose color may be dynamically changed at the time of the page viewing.
+//!
+//! Color mixins can only be defined via HSL due to the absence of color interpolation functions in the CSS Color Level 4 Specification.
+
+
+/// Set the CSS variables of a certain color group to the given values.
+.create-hsl-group(@name; @hue; @saturation; @lightness) {
+ --bhsl-@{name}-hue: @hue;
+ --bhsl-@{name}-saturation: @saturation;
+ --bhsl-@{name}-lightness: @lightness;
+}
+
+
+/// Set the CSS variables of a certain color group to the ones of another.
+.map-hsl-group(@to; @from) {
+ --bhsl-@{to}-hue: var(~"--bhsl-@{from}-hue");
+ --bhsl-@{to}-saturation: var(~"--bhsl-@{from}-saturation");
+ --bhsl-@{to}-lightness: var(~"--bhsl-@{from}-lightness");
+}
+
+
+/// Set a CSS property to the color obtained from the CSS variables of the given color group.
+///
+/// The color may be altered via the @hue-changes, @saturation-changes and @lightness-changes parameters, which specify a string calculation to be appended to the CSS variables in a calc function.
+///
+/// For example, acceptable parameters may be: "+ 10deg", "/ 2", "* 1000", "- var(--something)", and so on.
+.hsl-group(@name) {
+ @c: hsl(
+ var(~"--bhsl-@{name}-hue")
+ var(~"--bhsl-@{name}-saturation")
+ var(~"--bhsl-@{name}-lightness")
+ );
+}
+.hsl-group(@name; @alpha) {
+ @c: hsl(
+ var(~"--bhsl-@{name}-hue")
+ var(~"--bhsl-@{name}-saturation")
+ var(~"--bhsl-@{name}-lightness")
+ / @alpha
+ );
+}
+.hsl-group(@name; @hue-changes; @saturation-changes; @lightness-changes; @alpha) {
+ @c: hsl(
+ calc(var(~"--bhsl-@{name}-hue") ~"@{hue-changes}")
+ calc(var(~"--bhsl-@{name}-saturation") ~"@{saturation-changes}")
+ calc(var(~"--bhsl-@{name}-lightness") ~"@{lightness-changes}")
+ / @alpha
+ );
+}
diff --git a/src/rules/base.less b/src/rules/base.less
new file mode 100644
index 0000000..45719c4
--- /dev/null
+++ b/src/rules/base.less
@@ -0,0 +1,891 @@
+/*
+ * Bluelib Base
+ * by
+ */
+
+@{bluelib} {
+
+ /// ===== Body =====
+ /// The body element has some rules.
+
+ //
+
+ & {
+ // Set the current color
+ .map-hsl-group(current, foreground);
+
+ // Set the background defined in the palette
+ background-color: .hsl-group(background)[@c];
+
+ // Make the element fill all available space
+ width: 100%;
+ height: 100%;
+
+ // And remove its margin, in case it is the "real" body
+ margin: 0;
+
+ // Set the default font family
+ .use-font-group(text)
+ }
+
+ //
+
+ /// ===== All =====
+ /// By default, browsers style elements with some weird rules.
+ /// This is an attempt to correct them, and to implement some Bluelib magic.
+
+ //
+
+ &, @{all} {
+ // Globally set the box-sizing to border-box, as content-box is completely insane
+ &, &::before, &::after {
+ box-sizing: border-box;
+ }
+
+ // Remove all default margins and paddings
+ margin: 0;
+ padding: 0;
+
+ // Bluelib magic!
+ // This rule sets the color of all text to be equal to the current .bluelib-color() at 100% opacity.
+ // Thanks, CSS variables!
+ color: .hsl-group(current)[@c];
+ border-color: .hsl-group(current)[@c];
+
+ // Set the default border properties for no unexpected behaviour from browser styles
+ border-width: 0;
+ border-style: solid;
+
+ // Get the scrollbar color from the theme
+ scrollbar-color: .hsl-group(current)[@c] .hsl-group(background)[@c];
+
+ // TODO: I HATE HOW BROWSERS HANDLE THIS
+ &:focus-visible {
+ outline-width: 4px;
+ outline-style: solid;
+ outline-color: .hsl-group(current; 0.3)[@c];
+ }
+ }
+
+ //
+
+ /// ===== Page =====
+ /// These rules apply to the four page areas: main, aside, header and footer
+
+ //
+
+ @{page-footer} {
+ margin: 1rem 0;
+ text-align: center;
+ font-size: x-small;
+ }
+
+ //
+
+ /// ===== Floats =====
+ /// Floats allow for elements to be automatically positioned in a different position than normal.
+
+ //
+
+ @{float-top} {
+ margin-bottom: auto;
+ }
+ @{float-right} {
+ margin-left: auto;
+ }
+ @{float-bottom} {
+ margin-top: auto;
+ }
+ @{float-left} {
+ margin-right: auto;
+ }
+ @{float-hcenter} {
+ margin-left: auto;
+ margin-right: auto;
+ }
+ @{float-vcenter} {
+ margin-top: auto;
+ margin-bottom: auto;
+ }
+
+ //
+
+ /// ===== Headers =====
+ /// Headers are the titles of the page.
+
+ //
+
+ @{header-1} {
+ // Make h1 larger than h2
+ // Why is it not so by default?!
+ font-size: 2.5em;
+ }
+
+ @{header-2} {
+ // Make h2 a bit larger as well
+ font-size: 1.75em;
+ }
+
+ @{header-1}, @{header-2}, @{header-3}, @{header-4}, @{header-5}, @{header-6} {
+ text-align: center;
+
+ .map-hsl-group(current; primary);
+
+ .use-font-group(header);
+ }
+
+ //
+
+ /// ===== Panels =====
+ /// Panels are the main sectioning elements available in Bluelib.
+ /// Many instances of them should be present on the page!
+ /// They should group small amounts of tightly related content, which can be understood more or less separately from the rest of the page.
+
+ //
+
+ // The base panel class.
+ @{panel} {
+ // And a padding to separate them from their contents
+ padding-top: 0.5em;
+ padding-right: 0.5em;
+ padding-left: 0.5em;
+ padding-bottom: 0.5em;
+ // Remove the border, just to be sure
+ border-width: 0;
+ border-style: solid;
+
+ // Panels should try to fill the most space possible
+ width: 100%;
+
+ // Have panels be column-flex objects to facilitate alignments
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ // Give the first panel in a stack a fixed background color, so it may be seen against a background
+ background-color: .hsl-group(background)[@c];
+
+ // Make borders togglable
+ &@{border-top}, &@{panel-box} {
+ border-top-width: 2px;
+ padding-top: calc(0.5em - 2px);
+ }
+ &@{border-right}, &@{panel-box} {
+ border-right-width: 2px;
+ padding-right: calc(0.5em - 2px);
+ }
+ &@{border-left}, &@{panel-box}, &@{panel-dialog} {
+ border-left-width: 2px;
+ padding-left: calc(0.5em - 2px);
+ }
+ &@{border-bottom}, &@{panel-box} {
+ border-bottom-width: 2px;
+ padding-bottom: calc(0.5em - 2px);
+ }
+
+ // For compatibility, make panel-parenthesis available
+ &@{panel-parenthesis} {
+ font-size: smaller;
+ }
+ }
+
+ //
+
+
+ /// ===== Chapters =====
+ /// A chapter is a decorative element separating its children in a certain number of columns.
+
+ //
+
+ @{chapter-0}, @{chapter-1}, @{chapter-2}, @{chapter-3}, @{chapter-4}, @{chapter-5}, @{chapter-6}, @{chapter-7}, @{chapter-8}, @{chapter-9} {
+ // Be a row flexbox to separate elements in columns
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: row;
+ gap: 0.5em;
+ justify-content: stretch;
+ align-items: stretch;
+
+ // Add the gap as a vertical margin, so that multiple chapters can be placed next to each other
+ margin: 0.5em;
+
+ > @{all} {
+ // Allow all children to grow
+ flex-grow: 1;
+ // But not to shrink
+ flex-shrink: 0;
+ }
+
+ > @{header-1}, > @{header-2}, > @{header-3}, > @{header-4}, > @{header-5}, > @{header-6} {
+ // Headings should fill up all horizontal space available and force a wrap
+ flex-basis: 100%;
+
+ margin-top: 1.2em;
+ }
+ }
+
+ // Chapter zero means that the number of panels is not set and they should not be wrapped
+ @{chapter-0} {
+ flex-wrap: nowrap;
+
+ > @{all} {
+ // Elements inside may be forced to shrink
+ flex-shrink: 1;
+ }
+ }
+
+ // Set the basis of elements of the various chapter sizes
+ @{chapter-1} {
+ > @{all} {
+ flex-basis: calc(100% / 2);
+ }
+ }
+ @{chapter-2} {
+ > @{all} {
+ flex-basis: calc(100% / 3);
+ }
+ }
+ @{chapter-3} {
+ > @{all} {
+ flex-basis: calc(100% / 4);
+ }
+ }
+ @{chapter-4} {
+ > @{all} {
+ flex-basis: calc(100% / 5);
+ }
+ }
+ @{chapter-5} {
+ > @{all} {
+ flex-basis: calc(100% / 6);
+ }
+ }
+ @{chapter-6} {
+ > @{all} {
+ flex-basis: calc(100% / 7);
+ }
+ }
+ @{chapter-7} {
+ > @{all} {
+ flex-basis: calc(100% / 8);
+ }
+ }
+ @{chapter-8} {
+ > @{all} {
+ flex-basis: calc(100% / 9);
+ }
+ }
+ @{chapter-9} {
+ > @{all} {
+ flex-basis: calc(100% / 10);
+ }
+ }
+
+ //
+
+ /// ===== Separators =====
+ /// Separators are horizontal lines separating elements.
+
+ //
+
+ @{separator} {
+ border-width: 1px;
+ border-style: dashed;
+ }
+
+ @{separator-light} {
+ border-style: dotted;
+ }
+
+ @{separator-heavy} {
+ border-style: solid;
+ }
+
+ //
+
+ /// ===== Images =====
+ /// Images are changed to block elements and automatically resized to fit their container.
+
+ //
+
+ @{image} {
+ // Change images to block
+ display: block;
+
+ // Limit their width
+ max-width: 100%;
+ // Resize the contained image to fully fit the element
+ object-fit: contain;
+ }
+
+ @{image-limit-half} {
+ // Limit the image size to half of the vertical viewport
+ max-height: max(28.2vw, 50vh);
+ }
+
+ @{image-limit-quarter} {
+ // Limit the image size to a quarter of the vertical viewport
+ max-height: max(14.1vw, 25vh);
+ }
+
+ //
+
+ /// ===== Tables =====
+ /// Tables are elements whose children are aligned in a grid.
+
+ //
+
+ @{table} {
+ // Prevent ugly stacking borders
+ border-collapse: collapse;
+
+ @{table-head}, @{table-data} {
+ // Leave a little breathing room between table elements, even if not as much as with a table panel
+ padding: 3px 7px;
+ border-width: 1px;
+ }
+
+ @{table-caption} {
+ // Make captions have the same border as the cells
+ border-width: 1px;
+
+ // Assign captions to their own font group
+ .use-font-group(caption);
+
+ &@{table-caption-top} {
+ // Place captions on the correct side of the table
+ caption-side: top;
+ // Remove the bottom border as it cannot collapse
+ border-bottom-width: 0;
+ }
+
+ &@{table-caption-bottom} {
+ // Place captions on the correct side of the table
+ caption-side: bottom;
+ // Remove the top border as it cannot collapse
+ border-top-width: 0;
+ }
+ }
+
+ /// ----- Panels -----
+ /// Tables can be integrated with panels!
+
+ &@{panel} {
+ // Override the flex display of panels
+ display: table;
+
+ @{table-head}, @{table-data} {
+ // Have more space between cells
+ padding: 8px;
+ }
+
+ @{table-caption} {
+ // Behave as a regular panel and have text where it usually is
+ text-align: inherit;
+
+ // Add a background color to top-level table panel captions as if they were panels themselves
+ background-color: .hsl-group(background)[@c];
+
+ // Use the same padding as cells
+ padding: 8px;
+
+ // Since captions can't be made flex, go back to the old style of defining margins
+ @{all} {
+ margin-top: 8px;
+ margin-bottom: 8px;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+
+ &@{panel-box} {
+ @{table-row} {
+ border-width: 1px;
+ }
+
+ @{table-head}, @{table-data} {
+ border-width: 1px;
+ padding: 7px;
+ }
+
+ @{table-caption} {
+ border-width: 2px;
+ padding: 6px;
+
+ &@{table-caption-top} {
+ // Remove the bottom border again because specificity
+ border-bottom-width: 0;
+ }
+
+ &@{table-caption-bottom} {
+ // Remove the top border again because specificity
+ border-top-width: 0;
+ }
+ }
+ }
+
+ &@{panel-dialog} {
+ @{table-header} > @{table-row} {
+ border-bottom-width: 1px;
+ }
+
+ @{table-body} > @{table-row} {
+ border-width: 0;
+ }
+
+ @{table-footer} > @{table-row} {
+ border-top-width: 1px;
+ }
+
+ @{table-head}, @{table-data} {
+ border-width: 0 0 0 1px;
+ padding: 8px 8px 8px 7px;
+ }
+
+ @{table-caption} {
+ border-width: 0 0 0 2px;
+ padding: 8px 8px 8px 6px;
+ }
+ }
+ }
+
+ //
+
+ /// ===== Lists =====
+ /// Lists are marked series of children elements
+
+ //
+
+ @{panel} {
+ > @{list-unordered}, > @{list-ordered} {
+ margin-left: 6ex;
+ }
+ }
+
+ //
+
+ /// ===== Glossaries =====
+ /// Glossaries are key-value pairs of items
+
+ //
+
+ @{glossary-term} {
+ margin-top: 0.5em;
+ padding: 0.2em 0;
+
+ .map-hsl-group(current; primary);
+
+ .use-font-group(term);
+ }
+
+ @{glossary-description} {
+ margin-left: 4.5ex;
+ margin-bottom: 0.5em;
+ }
+
+ @{glossary-details} {
+ margin-left: 4.5ex;
+ }
+
+ @{glossary-summary} {
+ cursor: pointer;
+
+ margin-left: -4ex;
+ padding: 0.2em 0;
+
+ .use-font-group(summary);
+
+ // Prevent the user from accidentaly selecting the summary
+ user-select: none;
+ }
+
+ //
+
+ /// ===== Modifiers =====
+
+ //
+
+ @{modifier-fade} {
+ opacity: 0.3;
+ }
+
+ @{modifier-mark}, @{element-mark} {
+ // Assign marks to their own font group
+ .use-font-group(mark);
+
+ // Use the set color as background for marking
+ background-color: .hsl-group(mark-background)[@c];
+ .map-hsl-group(current; mark-foreground);
+
+ // If applied twice, go back to "normality"
+ @{modifier-mark}, @{element-mark} {
+ background-color: .hsl-group(background)[@c];
+ .map-hsl-group(current; foreground);
+
+ // If applied thrice, mark again and not anymore
+ @{modifier-mark}, @{element-mark} {
+ background-color: .hsl-group(mark-background)[@c];
+ .map-hsl-group(current; mark-foreground);
+ }
+ }
+ }
+
+ @{modifier-todo} {
+ .map-hsl-group(current; todo-foreground);
+
+ // Ensure it overrides properly the background color of panels
+ &, @{panel} {
+ border-style: dashed;
+ background-color: .hsl-group(todo-background)[@c];
+ }
+ }
+
+ @{modifier-red} {
+ .map-hsl-group(current; red);
+ }
+ @{modifier-yellow} {
+ .map-hsl-group(current; yellow);
+ }
+ @{modifier-green} {
+ .map-hsl-group(current; green);
+ }
+ @{modifier-cyan} {
+ .map-hsl-group(current; cyan);
+ }
+ @{modifier-blue} {
+ .map-hsl-group(current; blue);
+ }
+ @{modifier-magenta} {
+ .map-hsl-group(current; magenta);
+ }
+
+ //
+
+ /// ===== Inputs =====
+
+ //
+
+ @{input} {
+ // Disable the browser font override
+ font: inherit;
+
+ // Make the element feel clickable
+ cursor: pointer;
+
+ // Uniform the various properties of the elements
+ background-color: transparent;
+
+ // Add some padding to avoid visual overload
+ padding: 0.125em 0.75ex;
+
+ // Align all inputs to the middle
+ vertical-align: middle;
+
+
+ // By default, no borders should be present
+ border-width: 0;
+
+ border-color: .hsl-group(current; 0.4)[@c];
+
+ &::placeholder {
+ opacity: 1;
+ color: .hsl-group(current; 0.4)[@c];
+ }
+
+ &:hover {
+ border-color: .hsl-group(current; 0.7)[@c];
+
+ &::placeholder {
+ color: .hsl-group(current; 0.7)[@c];
+ }
+ }
+
+ &:active, &:focus {
+ border-color: .hsl-group(current)[@c];
+ }
+ }
+
+ // Prevent the wild resizing of areas
+ @{input-area} {
+ resize: vertical;
+ }
+
+ @{input-field}, @{input-select} {
+ // Fields and selects should have a bottom border
+ border-bottom-width: 2px;
+ }
+ @{input-area}, @{input-multiselect} {
+ // Areas and multiselects should have a left border
+ border-left-width: 2px;
+ }
+
+ // Mark interactivity by changing the mouse cursor
+ @{input-field}, @{input-area} {
+ cursor: text;
+ }
+ @{input-select}, @{input-multiselect} {
+ cursor: vertical-text;
+ }
+ @{input-range} {
+ cursor: ew-resize;
+ }
+
+ // Configure option display
+ @{input-select}, @{input-multiselect} {
+ & optgroup {
+ // Clearly display the grouping of options
+ padding-bottom: 0.25em;
+
+ // Use the header font
+ .use-font-group(header);
+
+ & option {
+ // Indent and pad
+ padding: 0.125em 0 0.125em 2ex;
+ }
+ }
+
+ & option {
+ // Use the regular font
+ .use-font-group(text)
+ }
+ }
+
+ // Override the default browser appearence for radios and checkboxes
+ @{input-radio}, @{input-checkbox} {
+ appearance: none;
+
+ // Make the element feel clickable
+ cursor: pointer;
+
+ // Set a fixed size
+ width: 1em;
+ height: 1em;
+
+ // Remove the padding
+ padding: 2px;
+
+ // Override the default border width
+ border-width: 2px;
+
+ // Prepare the element to display something inside
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+
+ &::before {
+ // Force the creation of a pseudo-element inside
+ display: block;
+ content: "";
+
+ width: 100%;
+ height: 100%;
+ }
+
+ // If the element is checked, display it
+ &:checked::before {
+ background-color: .hsl-group(current)[@c];
+ }
+ }
+ @{input-radio} {
+ // Radios should be round
+ border-radius: 100%;
+
+ &::before {
+ border-radius: 100%;
+ }
+ }
+
+ @{input-range} {
+ padding: 0;
+
+ /*
+ appearance: none;
+
+ &::-moz-range-thumb {
+ width: 0;
+ border-radius: 0;
+ border-style: outset;
+
+ border-color: .hsl-group(current)[@c];
+ border-width: 4px;
+
+ background-color: .hsl-group(primary)[@c];
+ }
+
+ &::-moz-range-track {
+ height: 0.125em;
+ background-color: .hsl-group(current)[@c];
+ }
+
+ &::-moz-range-progress {
+ height: 0.5em;
+ background-color: .hsl-group(current)[@c];
+ }
+ */
+ }
+
+ @{input-button} {
+ border-width: 2px;
+
+ // Borders should reflect the interactible feeling of the element
+ border-style: outset;
+
+ &:active {
+ border-style: inset;
+ }
+ }
+
+ // Unmanaged inputs
+ @{input-file}, @{input-color} {
+ padding: 0;
+ }
+
+ // Webkit hacks
+ @media screen and (-webkit-min-device-pixel-ratio:0) {
+ // Make the icons that webkit randomly add to fields AT LEAST use the correct color
+ @{input-field} {
+ &::-webkit-calendar-picker-indicator {
+ // smh why doesn't it support fill
+ filter: invert(calc(calc(var(--bhsl-current-lightness) - 50%) * 1000))
+ }
+ }
+
+ // Draw a background color on the option dropdown menu
+ @{input-select} optgroup, @{input-select} option {
+ background-color: .hsl-group(background)[@c];
+
+ &::before {
+ // Remove the tabs that Chrome adds before the options
+ content: "";
+ }
+ }
+ }
+
+ //
+
+ /// ===== Forms =====
+
+ //
+
+ @{form-flex} {
+ display: flex;
+ flex-direction: column;
+
+ justify-content: stretch;
+
+ > @{element-paragraph} {
+ margin: 0.5em 0;
+ }
+
+ > @{element-label} {
+ display: flex;
+ gap: 1ex;
+
+ > @{element-span}:first-child, > @{element-span}:last-child {
+ margin: auto 0;
+ flex-basis: 15%;
+
+ .use-font-group(label);
+ .map-hsl-group(current; primary);
+ }
+
+ > @{element-span}:first-child {
+ text-align: right;
+ }
+
+ > @{element-span}:last-child {
+ text-align: left;
+ }
+
+ > @{input} {
+ flex-grow: 1;
+ }
+ }
+ }
+
+ //
+
+ /// ===== Text =====
+
+ //
+
+ @{text-anchor} {
+ .map-hsl-group(current; link);
+ }
+
+ @{text-idiomatic} {
+ .use-font-group(idiomatic);
+ }
+ @{text-emphasis} {
+ .use-font-group(emphasis);
+ }
+
+ @{text-attention} {
+ .use-font-group(attention);
+ }
+ @{text-strong} {
+ .use-font-group(strong);
+ }
+
+ @{text-inserted} {
+ .map-hsl-group(current; inserted);
+ }
+ @{text-deleted} {
+ .map-hsl-group(current; deleted);
+ }
+
+ @{text-code}, @{text-preformatted}, @{text-input}, @{text-output} {
+ .use-font-group(code);
+ }
+ @{text-preformatted} {
+ overflow-x: scroll;
+ }
+ @{text-input}, @{text-output} {
+ padding: 0 0.25ex;
+ }
+ @{text-input} {
+ background-color: .hsl-group(sample-output)[@c];
+ .map-hsl-group(current; sample-input);
+
+ @{text-input} {
+ .use-font-group(boldcode);
+ }
+ }
+ @{text-output} {
+ background-color: .hsl-group(sample-input)[@c];
+ .map-hsl-group(current; sample-output);
+
+ @{text-output} {
+ .use-font-group(boldcode);
+ }
+ }
+
+ @{text-variable} {
+ .use-font-group(variable);
+ }
+
+ @{text-citation} {
+ .use-font-group(citation);
+ }
+
+ @{text-definition} {
+ .use-font-group(term);
+ .map-hsl-group(current; primary);
+ }
+
+ @{text-abbreviation} {
+ cursor: help;
+ }
+
+ //
+
+
+}
\ No newline at end of file
diff --git a/src/rules/classic.less b/src/rules/classic.less
new file mode 100644
index 0000000..2e7f558
--- /dev/null
+++ b/src/rules/classic.less
@@ -0,0 +1,165 @@
+/*
+ * Bluelib Classic
+ * by
+ */
+
+@{bluelib} {
+
+ & {
+ // Sets the border radius of all panels
+ --b-border-radius: 8px;
+ }
+
+ &, @{all} {
+ // Lower the default border opacity
+ border-color: .hsl-group(current; 0.15)[@c];
+ }
+
+ // Give headers a slight shadow so they are easier to read outside of panels
+ @{header-1}, @{header-2}, @{header-3}, @{header-4}, @{header-5}, @{header-6} {
+ text-shadow: 2px 2px 4px .hsl-group(background)[@c];
+ }
+
+ // But do not give it to headers inside panels
+ @{panel} {
+ @{header-1}, @{header-2}, @{header-3}, @{header-4}, @{header-5}, @{header-6} {
+ text-shadow: none;
+ }
+ }
+
+ @{panel}, @{table}@{panel} > @{table-caption} {
+ border-radius: var(--b-border-radius);
+
+ // And a shadow effect
+ box-shadow: 2px 2px 4px .hsl-group(background)[@c];
+
+ // Do not give the same effects to nested panels
+ @{panel} {
+ background-color: .hsl-group(foreground; 0.075)[@c];
+ backdrop-filter: none;
+ box-shadow: none;
+ }
+ }
+
+ // Make sure mark still works, even considering specificity
+ @{modifier-mark}, @{element-mark}, @{panel}@{modifier-mark} {
+ background-color: .hsl-group(mark-background)[@c];
+
+ // Make the modifier toggle properly
+ @{modifier-mark}, @{element-mark}, @{panel}@{modifier-mark} {
+ background-color: .hsl-group(background)[@c];
+
+ // Make the modifier toggle properly
+ @{modifier-mark}, @{element-mark}, @{panel}@{modifier-mark} {
+ background-color: .hsl-group(mark-background)[@c];
+ }
+ }
+ }
+
+ // Make sure to-do still works, even considering specificity
+ @{modifier-todo}, @{panel}@{modifier-todo} {
+ background-color: .hsl-group(todo-background)[@c];
+ border-color: .hsl-group(current)[@c];
+
+ // Make the modifier inherit properly
+ @{panel} {
+ background-color: .hsl-group(todo-background)[@c];
+ border-color: .hsl-group(current)[@c];
+ }
+ }
+
+ // Fixup table panels
+ @{table}@{panel} {
+ // Ensure table panels have no rounded borders
+ border-radius: 0;
+
+ > @{table-caption} {
+ // And ensure neither do table panel captions
+ border-radius: 0;
+
+ // Minimize the visibility of the caption's box shadow to prevent overlap with the table itself
+ box-shadow: 0.0625em 0 0.25em .hsl-group(background)[@c];
+ }
+ }
+
+ @{table}@{panel-dialog} > @{table-caption} {
+ border-bottom-width: 2px;
+ }
+
+ @{input} {
+ background-color: .hsl-group(current; 0.025)[@c];
+
+ &:hover {
+ background-color: .hsl-group(current; 0.05)[@c];
+ }
+
+ &:active {
+ background-color: .hsl-group(current; 0.075)[@c];
+ }
+ }
+
+ @{input-field}, @{input-select} {
+ border-radius: var(--b-border-radius) var(--b-border-radius) 0 0;
+ }
+ @{input-area}, @{input-multiselect} {
+ border-radius: 0 var(--b-border-radius) var(--b-border-radius) 0;
+ }
+ @{input-button} {
+ border-radius: var(--b-border-radius);
+ }
+
+ @{list-unordered}, @{list-ordered} {
+ > *::marker {
+ color: .hsl-group(current; 0.5)[@c];
+ }
+ }
+
+ @{glossary-summary} {
+ color: .hsl-group(current; 0.7)[@c];
+
+ &::marker {
+ color: .hsl-group(current; 0.5)[@c];
+ }
+
+ &:hover {
+ color: .hsl-group(current)[@c];
+ }
+
+ &:hover::marker {
+ color: .hsl-group(current; 0.7)[@c];
+ }
+
+ &:active::marker {
+ color: .hsl-group(current)[@c];
+ }
+ }
+
+ // FIXME: may not work well for lighter themes
+ @{text-anchor} {
+ &:hover {
+ color: .hsl-group(link; "+ 0deg"; "+ 0%"; "+ 20%"; 1.0)[@c];
+ }
+
+ &:active {
+ color: .hsl-group(link; "+ 0deg"; "+ 0%"; "+ 40%"; 1.0)[@c];
+ }
+ }
+
+ @{text-input}, @{text-output} {
+ border-radius: calc(var(--b-border-radius) / 4);
+ }
+
+ @{text-variable} {
+ color: .hsl-group(current; 0.7)[@c];
+ }
+
+ @{text-quote} {
+ &::before, &::after {
+ color: .hsl-group(current; 0.7)[@c];
+ }
+ }
+
+ @{text-ruby-annotation} {
+ color: .hsl-group(current; 0.7)[@c];
+ }
+}
\ No newline at end of file
diff --git a/src/rules/colors/colors-royalblue.less b/src/rules/colors/colors-royalblue.less
new file mode 100644
index 0000000..142cab2
--- /dev/null
+++ b/src/rules/colors/colors-royalblue.less
@@ -0,0 +1,30 @@
+/*
+ * Bluelib Royal Blue Colors
+ * by
+ */
+
+@{bluelib} {
+ .create-hsl-group(background; 224deg; 64%; 14%);
+ .create-hsl-group(foreground; 212deg; 100%; 81%);
+ .create-hsl-group(primary; 0deg; 0%; 100%);
+ .create-hsl-group(link; 180deg; 100%; 40%);
+
+ .create-hsl-group(mark-foreground; 32deg; 64%; 14%);
+ .create-hsl-group(mark-background; 32deg; 100%; 81%);
+
+ .create-hsl-group(todo-foreground; 43deg; 100%; 65%);
+ .create-hsl-group(todo-background; 204deg; 11%; 18%);
+
+ .create-hsl-group(sample-input; 0deg; 100%; 0%);
+ .create-hsl-group(sample-output; 0deg; 100%; 100%);
+
+ .create-hsl-group(red; 0deg; 100%; 75%);
+ .create-hsl-group(yellow; 60deg; 100%; 75%);
+ .create-hsl-group(green; 120deg; 100%; 75%);
+ .create-hsl-group(cyan; 180deg; 100%; 75%);
+ .create-hsl-group(blue; 240deg; 100%; 75%);
+ .create-hsl-group(magenta; 300deg; 100%; 75%);
+
+ .map-hsl-group(inserted; green);
+ .map-hsl-group(deleted; red);
+}
diff --git a/src/rules/fonts/fonts-fira-ghpages.less b/src/rules/fonts/fonts-fira-ghpages.less
new file mode 100644
index 0000000..57802f1
--- /dev/null
+++ b/src/rules/fonts/fonts-fira-ghpages.less
@@ -0,0 +1,247 @@
+/*
+ * Bluelib Fira Sans Font from GitHub Pages
+ * by
+ */
+
+/// This file imports Fira from github.com/mozilla/Fira .
+/// It may break if the repository's structure is changed, do not use it if possible.
+
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Hair.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Hair.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Hair.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Hair.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Hair.ttf') format('truetype');
+ font-weight: 100;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-HairItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-HairItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-HairItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-HairItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-HairItalic.ttf') format('truetype');
+ font-weight: 100;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-UltraLight.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-UltraLight.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-UltraLight.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-UltraLight.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-UltraLight.ttf') format('truetype');
+ font-weight: 200;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-UltraLightItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-UltraLightItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-UltraLightItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-UltraLightItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-UltraLightItalic.ttf') format('truetype');
+ font-weight: 200;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Light.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Light.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Light.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Light.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Light.ttf') format('truetype');
+ font-weight: 300;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-LightItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-LightItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-LightItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-LightItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-LightItalic.ttf') format('truetype');
+ font-weight: 300;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Regular.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Regular.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Regular.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Regular.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Italic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Italic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Italic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Italic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Italic.ttf') format('truetype');
+ font-weight: 400;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Medium.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Medium.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Medium.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Medium.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Medium.ttf') format('truetype');
+ font-weight: 500;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-MediumItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-MediumItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-MediumItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-MediumItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-MediumItalic.ttf') format('truetype');
+ font-weight: 500;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-SemiBold.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-SemiBold.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-SemiBold.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-SemiBold.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-SemiBold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-SemiBoldItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-SemiBoldItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-SemiBoldItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-SemiBoldItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-SemiBoldItalic.ttf') format('truetype');
+ font-weight: 600;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Bold.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Bold.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Bold.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Bold.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-BoldItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-BoldItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-BoldItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-BoldItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-BoldItalic.ttf') format('truetype');
+ font-weight: 700;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-ExtraBold.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-ExtraBold.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-ExtraBold.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-ExtraBold.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-ExtraBold.ttf') format('truetype');
+ font-weight: 800;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-ExtraBoldItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-ExtraBoldItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-ExtraBoldItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-ExtraBoldItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-ExtraBoldItalic.ttf') format('truetype');
+ font-weight: 800;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Heavy.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-Heavy.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-Heavy.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-Heavy.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-Heavy.ttf') format('truetype');
+ font-weight: 900;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Sans';
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-HeavyItalic.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraSans-HeavyItalic.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraSans-HeavyItalic.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraSans-HeavyItalic.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraSans-HeavyItalic.ttf') format('truetype');
+ font-weight: 900;
+ font-style: italic;
+}
+
+
+@font-face {
+ font-family: 'Fira Mono';
+ src: url('https://mozilla.github.io/Fira/eot/FiraMono-Regular.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraMono-Regular.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraMono-Regular.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraMono-Regular.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraMono-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Mono';
+ src: url('https://mozilla.github.io/Fira/eot/FiraMono-Bold.eot');
+ src: url('https://mozilla.github.io/Fira/eot/FiraMono-Bold.eot') format('embedded-opentype'),
+ url('https://mozilla.github.io/Fira/woff2/FiraMono-Bold.woff2') format('woff2'),
+ url('https://mozilla.github.io/Fira/woff/FiraMono-Bold.woff') format('woff'),
+ url('https://mozilla.github.io/Fira/ttf/FiraMono-Bold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+
+
+@{bluelib} {
+ // @name; @style; @variant; @weight;@stretch; @size; @height; @family
+ .create-font-group( text; normal; normal; 400; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( header; normal; normal; 600; normal; regular; 1.7; "Fira Sans", sans-serif);
+ .create-font-group( code; normal; normal; 400; normal; regular; 1.3; "Fira Mono", monospace);
+ .create-font-group( boldcode; normal; normal; 600; normal; regular; 1.3; "Fira Mono", monospace);
+ .create-font-group( term; italic; normal; 500; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( summary; italic; normal; 400; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group(idiomatic; italic; normal; 400; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( emphasis; italic; normal; 500; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group(attention; normal; normal; 600; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( strong; normal; normal; 900; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( variable; normal; normal; 300; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( citation; normal; small-caps; 400; normal; regular; 1.3; "Fira Sans", sans-serif);
+ .create-font-group( label; normal; normal; 500; normal; regular; 1.3; "Fira Sans", sans-serif);
+}
diff --git a/src/rules/fun.less b/src/rules/fun.less
new file mode 100644
index 0000000..e60c8ec
--- /dev/null
+++ b/src/rules/fun.less
@@ -0,0 +1,25 @@
+/*
+ * Bluelib Fun Experiments
+ * by
+ */
+
+//noinspection CssInvalidAtRule
+@property --bhsl-current-hue {
+ syntax: '';
+ initial-value: 0deg;
+ inherits: true;
+}
+
+@keyframes rainbow {
+ 0% {
+ --bhsl-current-hue: 0deg;
+ }
+
+ 100% {
+ --bhsl-current-hue: 360deg;
+ }
+}
+
+@{animation-rainbow} {
+ animation: 2s linear infinite rainbow;
+}
\ No newline at end of file
diff --git a/src/rules/glass.less b/src/rules/glass.less
new file mode 100644
index 0000000..dd5ee63
--- /dev/null
+++ b/src/rules/glass.less
@@ -0,0 +1,65 @@
+/*
+ * Bluelib Glass
+ * by
+ */
+
+@{bluelib} {
+ & {
+ // Sets the backdrop-filter blur radius of all panels
+ --b-panel-blur: 16px;
+ }
+
+ @{panel}, @{table}@{panel} > @{table-caption} {
+ background-color: .hsl-group(background; 0.3)[@c];
+ backdrop-filter:
+ blur(var(--b-panel-blur))
+ hue-rotate(calc(var(--bhsl-current-hue) - var(--bhsl-foreground-hue)))
+ ;
+
+ @{panel} {
+ background-color: .hsl-group(current; 0.075)[@c];
+ backdrop-filter: none;
+ }
+ }
+
+ // Make sure mark still works, even considering specificity
+ @{modifier-mark}, @{element-mark}, @{panel}@{modifier-mark} {
+ background-color: .hsl-group(mark-background)[@c];
+ backdrop-filter: none;
+
+ // Make the modifier toggle properly
+ @{modifier-mark}, @{element-mark}, @{panel}@{modifier-mark} {
+ background-color: .hsl-group(background)[@c];
+
+ // Make the modifier toggle properly
+ @{modifier-mark}, @{element-mark}, @{panel}@{modifier-mark} {
+ background-color: .hsl-group(mark-background)[@c];
+ }
+ }
+ }
+
+ // Make sure to-do still works, even considering specificity
+ @{modifier-todo}, @{panel}@{modifier-todo} {
+ background-color: .hsl-group(todo-background)[@c];
+
+ // Make the modifier inherit properly
+ @{panel} {
+ background-color: .hsl-group(todo-background)[@c];
+ backdrop-filter: none;
+ }
+ }
+
+ // Make to-do have a glass background too
+ @{panel}@{modifier-todo} {
+ background-color: .hsl-group(todo-background; 0.3)[@c];
+ backdrop-filter:
+ blur(var(--b-panel-blur))
+ grayscale(100%)
+ ;
+ }
+ @{panel} {
+ @{panel}@{modifier-todo} {
+ background-color: .hsl-group(todo-background)[@c];
+ }
+ }
+}
diff --git a/src/selectors/module.less b/src/selectors/module.less
new file mode 100644
index 0000000..bdd3d57
--- /dev/null
+++ b/src/selectors/module.less
@@ -0,0 +1,82 @@
+@bluelib: ~".bluelib";
+
+@all: ~"*";
+
+@page-main: ~".page-main";
+@page-aside: ~".page-aside";
+@page-header: ~".page-header";
+@page-footer: ~".page-footer";
+
+@border-top: ~".border-top";
+@border-right: ~".border-right";
+@border-bottom: ~".border-bottom";
+@border-left: ~".border-left";
+
+@float-top: ~".float-top";
+@float-right: ~".float-right";
+@float-bottom: ~".float-bottom";
+@float-left: ~".float-left";
+@float-hcenter: ~".float-hcenter";
+@float-vcenter: ~".float-vcenter";
+
+@header-1: ~"h1";
+@header-2: ~"h2";
+@header-3: ~"h3";
+@header-4: ~"h4";
+@header-5: ~"h5";
+@header-6: ~"h6";
+
+@panel: ~".panel";
+@panel-box: ~".panel-box";
+@panel-dialog: ~".panel-dialog";
+@panel-parenthesis: ~".panel-parenthesis";
+
+@chapter-0: ~".chapter-0";
+@chapter-1: ~".chapter-1";
+@chapter-2: ~".chapter-2";
+@chapter-3: ~".chapter-3";
+@chapter-4: ~".chapter-4";
+@chapter-5: ~".chapter-5";
+@chapter-6: ~".chapter-6";
+@chapter-7: ~".chapter-7";
+@chapter-8: ~".chapter-8";
+@chapter-9: ~".chapter-9";
+
+@separator: ~".separator";
+@separator-light: ~".separator-light";
+@separator-heavy: ~".separator-heavy";
+
+@image: ~".image";
+@image-limit-half: ~".image-limit-half";
+@image-limit-quarter: ~".image-limit-quarter";
+@figure: ~".figure";
+@figure-caption: ~".figure-caption";
+
+@table: ~".table";
+@table-caption: ~".table-caption";
+@table-caption-top: ~".table-caption-top";
+@table-caption-bottom: ~".table-caption-bottom";
+@table-header: ~".table-header";
+@table-body: ~".table-body";
+@table-footer: ~".table-footer";
+@table-row: ~".table-row";
+@table-head: ~".table-head";
+@table-data: ~".table-data";
+
+@list-unordered: ~".list-unordered";
+@list-ordered: ~".list-ordered";
+
+@glossary: ~".glossary";
+@glossary-term: ~".glossary-term";
+@glossary-description: ~".glossary-description";
+
+@modifier-fade: ~".modifier-fade";
+@modifier-mark: ~".modifier-mark";
+@element-mark: ~".element-mark";
+@modifier-todo: ~".modifier-todo";
+@modifier-red: ~".modifier-red";
+@modifier-yellow: ~".modifier-yellow";
+@modifier-green: ~".modifier-green";
+@modifier-cyan: ~".modifier-cyan";
+@modifier-blue: ~".modifier-blue";
+@modifier-magenta: ~".modifier-magenta";
diff --git a/src/selectors/root.less b/src/selectors/root.less
new file mode 100644
index 0000000..a1d2cea
--- /dev/null
+++ b/src/selectors/root.less
@@ -0,0 +1,125 @@
+@bluelib: ~"body";
+
+@all: ~"*";
+
+@page-main: ~"main";
+@page-aside: ~"aside";
+@page-header: ~"header";
+@page-footer: ~"footer";
+
+@border-top: ~".border-top";
+@border-right: ~".border-right";
+@border-bottom: ~".border-bottom";
+@border-left: ~".border-left";
+
+@float-top: ~".float-top";
+@float-right: ~".float-right";
+@float-bottom: ~".float-bottom";
+@float-left: ~".float-left";
+@float-hcenter: ~".float-hcenter";
+@float-vcenter: ~".float-vcenter";
+
+@header-1: ~"h1";
+@header-2: ~"h2";
+@header-3: ~"h3";
+@header-4: ~"h4";
+@header-5: ~"h5";
+@header-6: ~"h6";
+
+@panel: ~".panel";
+@panel-box: ~".panel-box";
+@panel-dialog: ~".panel-dialog";
+@panel-parenthesis: ~".panel-parenthesis";
+
+@chapter-0: ~".chapter-0";
+@chapter-1: ~".chapter-1";
+@chapter-2: ~".chapter-2";
+@chapter-3: ~".chapter-3";
+@chapter-4: ~".chapter-4";
+@chapter-5: ~".chapter-5";
+@chapter-6: ~".chapter-6";
+@chapter-7: ~".chapter-7";
+@chapter-8: ~".chapter-8";
+@chapter-9: ~".chapter-9";
+
+@separator: ~"hr";
+@separator-light: ~".separator-light";
+@separator-heavy: ~".separator-heavy";
+
+@image: ~"img";
+@image-limit-half: ~".image-limit-half";
+@image-limit-quarter: ~".image-limit-quarter";
+@figure: ~"figure";
+@figure-caption: ~"figcaption";
+
+@table: ~"table";
+@table-caption: ~"caption";
+@table-caption-top: ~".table-caption-top";
+@table-caption-bottom: ~".table-caption-bottom";
+@table-header: ~"thead";
+@table-body: ~"tbody";
+@table-footer: ~"tfoot";
+@table-row: ~"tr";
+@table-head: ~"th";
+@table-data: ~"td";
+
+@list-unordered: ~"ul";
+@list-ordered: ~"ol";
+
+@glossary-term: ~"dt";
+@glossary-description: ~"dd";
+@glossary-details: ~"details";
+@glossary-summary: ~"summary";
+
+@modifier-fade: ~".fade";
+@modifier-mark: ~".mark";
+@element-mark: ~"mark";
+@modifier-todo: ~".todo";
+@modifier-red: ~".red";
+@modifier-yellow: ~".yellow";
+@modifier-green: ~".green";
+@modifier-cyan: ~".cyan";
+@modifier-blue: ~".blue";
+@modifier-magenta: ~".magenta";
+
+@input: ~"input, textarea, select, button";
+@input-field: ~'input[type="text"], input[type="password"], input[type="email"], input[type="number"], input[type="search"], input[type="tel"], input[type="datetime-local"], input[type="date"], input[type="time"]';
+@input-area: ~"textarea";
+@input-select: ~"select:not([multiple])";
+@input-multiselect: ~"select[multiple]";
+@input-radio: ~'input[type="radio"]';
+@input-checkbox: ~'input[type="checkbox"]';
+@input-color: ~'input[type="color"]';
+@input-file: ~'input[type="file"]';
+@input-range: ~'input[type="range"]';
+@input-button: ~'input[type="button"], button';
+
+@form-flex: ~'.form-flex';
+@element-label: ~'label';
+@element-span: ~'span';
+@element-paragraph: ~'p';
+
+@animation-rainbow: ~".rainbow";
+
+@text-anchor: ~"a";
+@text-idiomatic: ~"i";
+@text-emphasis: ~"em";
+@text-attention: ~"b";
+@text-strong: ~"strong";
+@text-annotation: ~"u";
+@text-strike: ~"s";
+@text-inserted: ~"ins";
+@text-deleted: ~"del";
+@text-preformatted: ~"pre";
+@text-code: ~"code";
+@text-input: ~"kbd";
+@text-input-pressed: ~".press";
+@text-input-released: ~".release";
+@text-output: ~"samp";
+@text-variable: ~"var";
+@text-quote: ~"q";
+@text-citation: ~"cite";
+@text-definition: ~"dfn";
+@text-abbreviation: ~"abbr";
+@text-ruby: ~"ruby";
+@text-ruby-annotation: ~"rt";
diff --git a/src/targets/apache.less b/src/targets/apache.less
deleted file mode 100644
index 6dddf06..0000000
--- a/src/targets/apache.less
+++ /dev/null
@@ -1,126 +0,0 @@
-@bluelib: ~"body, .bluelib";
-@all: ~"*";
-
-@page-footer: ~"footer, .page-footer";
-
-@layout: ~".layout";
-@layout-fill: ~".layout-fill";
-@layout-fill-single: ~".layout-fill-single";
-@layout-threecol: ~".layout-threecol";
-@layout-threecol-left: ~".layout-threecol-left";
-@layout-threecol-center: ~".layout-threecol-center";
-@layout-threecol-right: ~".layout-threecol-right";
-
-@panel: ~".panel";
-@panel-box: ~".panel-box";
-@panel-dialog: ~".panel-dialog";
-@panel-parenthesis: ~".panel-parenthesis";
-@panel-table: ".panel-table";
-
-@chapter: ~".chapter";
-@chapter-forcewrap: ~".chapter-forcewrap";
-
-@separator: ~"hr, .separator";
-@separator-light: ~".separator-light";
-@separator-heavy: ~".separator-heavy";
-
-@image: ~"img, .image";
-@image-limit-half: ~".image-limit-half";
-@image-limit-quarter: ~".image-limit-quarter";
-@figure: ~"figure, .figure";
-
-@table: ~"table, .table";
-@table-caption: ~"table caption, .table-caption";
-@table-caption-fixer: ~"table[disabled] caption, table.status-disabled caption, .table[disabled] caption, .table.status-disabled caption, table[disabled] .table-caption, table.status-disabled .table-caption, .table[disabled] .table-caption, .table.status-disabled .table-caption";
-@table-caption-top: ~"table caption, .table-caption-top";
-@table-caption-bottom: ~".table-caption-bottom";
-@table-header: ~"table thead, .table-header";
-@table-body: ~"table tbody, .table-body";
-@table-footer: ~"table tfoot, .table-footer";
-@table-row: ~"table tr, .table-row";
-@table-data: ~"table td, .table-data";
-@table-head: ~"table th, .table-head";
-@table-mark: ~".table-mark";
-
-@list: ~"ol, ul, dl, .list";
-@list-unordered: ~"ul, .list-unordered";
-@list-ordered: ~"ol, .list-ordered";
-@list-description: ~"dl, .list-description";
-@list-item: ~"li, .list-item";
-@list-description-term: ~"dt, .list-description-term";
-@list-description-details: ~"dd, .list-description-details";
-
-@status-disabled: ~"[disabled], .status-disabled";
-
-@input: ~'@{input-field}, @{input-area}, @{input-select}, @{input-multiselect}, @{input-button}, @{input-checkbox}, @{input-radio}, .input';
-@INPUT: ~'> @{input-field}, > @{input-area}, > @{input-select}, > @{input-multiselect}, > @{input-button}, > @{input-checkbox}, > @{input-radio}, > .input';
-@input-field: ~'.input-field, input[type="color"], input[type="date"], input[type="datetime-local"], input[type="email"], input[type="file"], input[type="image"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]';
-@input-area: ~'textarea, .input-area';
-@input-select: ~'select:not([multiple]), .input-select';
-@input-multiselect: ~'select[multiple], .input-multiselect';
-@input-option: ~'option, .input-option';
-@input-optgroup: ~'optgroup, .input-optgroup';
-@input-button: ~'button, input[type="submit"], input[type="reset"], .input-button';
-@input-checkbox: ~'input[type="checkbox"], .input-checkbox';
-@input-radio: ~'input[type="radio"], .input-radio';
-
-@form: ~"form, .form";
-@form-label: ~"> label, .form-label";
-@form-label-full: ~".form-label-full";
-@form-input: ~"@{INPUT}, .form-input";
-@form-row: ~".form-row";
-@form-group: ~'.form-group';
-@form-group-label: ~'> label, .form-group-label';
-@form-group-row: ~'.form-group-row';
-
-@heading: ~"h1, h2, h3, h4, h5, h6, .heading";
-@HEADING: ~"> h1, > h2, > h3, > h4, > h5, > h6, > .heading";
-
-@details: ~".details, details";
-@DETAILS: ~"> .details, > details";
-@details-open: ~".details[open], details[open]";
-@details-summary: ~"> .details-summary, > summary";
-@details-content: ~"> .details-content, > :not(summary)";
-
-@anchor: ~"a, .anchor";
-@anchor-broken: ~'a:not([href]), .anchor-broken';
-@anchor-link: ~'a[href], .anchor-link';
-@anchor-download: ~'a[download], .anchor-download';
-
-@ruby-parenthesis: ~"rp, .ruby-parenthesis";
-@ruby-text: ~"rt, .ruby-text";
-
-@todo: ~".todo";
-
-@semantic-abbr: ~"abbr, .semantic-abbr";
-@semantic-b: ~"b, .semantic-b";
-@semantic-cite: ~"cite, .semantic-cite";
-@semantic-code: ~"code, .semantic-code";
-@semantic-dfn: ~"dfn, .semantic-dfn";
-@semantic-em: ~"em, .semantic-em";
-@semantic-i: ~"i, .semantic-i";
-@semantic-kbd: ~"kbd, .semantic-kbd";
-@semantic-kbd-press: ~".semantic-kbd-press";
-@semantic-kbd-release: ~".semantic-kbd-release";
-@semantic-mark: ~"mark, .semantic-mark";
-@semantic-pre: ~"pre, .semantic-pre";
-@semantic-q: ~"q, .semantic-q";
-@semantic-s: ~"s, .semantic-s";
-@semantic-samp: ~"samp, .semantic-samp";
-@semantic-small: ~"small, .semantic-small";
-@semantic-strong: ~"strong, .semantic-strong";
-@semantic-u: ~"u, .semantic-u";
-@semantic-var: ~"var, .semantic-var";
-
-@color-red: ~".color-red";
-@color-orange: ~".color-orange";
-@color-yellow: ~".color-yellow";
-@color-lime: ~".color-lime, .color-green";
-@color-cyan: ~".color-cyan";
-@color-blue: ~".color-blue";
-@color-magenta: ~".color-magenta";
-@color-gray: ~".color-gray";
-
-@special-remove: ~".special-remove, .indexbreakrow";
-@special-hide: ~".special-hide";
-@special-block-center: ~".special-block-center, #indexlist";
diff --git a/src/targets/module.less b/src/targets/module.less
deleted file mode 100644
index 39d2321..0000000
--- a/src/targets/module.less
+++ /dev/null
@@ -1,124 +0,0 @@
-@bluelib: ~".bluelib";
-@all: ~"*, .all";
-
-@page-footer: ~".page-footer";
-
-@layout: ~".layout";
-@layout-fill: ~".layout-fill";
-@layout-fill-single: ~".layout-fill-single";
-@layout-threecol: ~".layout-threecol";
-@layout-threecol-left: ~".layout-threecol-left";
-@layout-threecol-center: ~".layout-threecol-center";
-@layout-threecol-right: ~".layout-threecol-right";
-
-@panel: ~".panel";
-@panel-box: ~".panel-box";
-@panel-dialog: ~".panel-dialog";
-@panel-parenthesis: ~".panel-parenthesis";
-
-@chapter: ~".chapter";
-@chapter-forcewrap: ~".chapter-forcewrap";
-
-@separator: ~".separator";
-@separator-light: ~".separator-light";
-@separator-heavy: ~".separator-heavy";
-
-@image: ~".image";
-@image-limit-half: ~".image-limit-half";
-@image-limit-quarter: ~".image-limit-quarter";
-@figure: ~".figure";
-
-@table: ~".table";
-@table-caption: ~".table-caption";
-@table-caption-fixer: ~".table.status-disabled .table-caption";
-@table-caption-top: ~".table-caption-top";
-@table-caption-bottom: ~".table-caption-bottom";
-@table-header: ~".table-header";
-@table-body: ~".table-body";
-@table-footer: ~".table-footer";
-@table-row: ~".table-row";
-@table-data: ~".table-data";
-@table-head: ~".table-head";
-@table-mark: ~".table-mark";
-
-@list: ~".list";
-@list-unordered: ~".list-unordered";
-@list-ordered: ~".list-ordered";
-@list-description: ~".list-description";
-@list-item: ~".list-item";
-@list-description-term: ~".list-description-term";
-@list-description-details: ~".list-description-details";
-
-@status-disabled: ~".status-disabled";
-
-@input: ~'.input';
-@input-field: ~'.input-field';
-@input-area: ~'.input-area';
-@input-select: ~'.input-select';
-@input-multiselect: ~'.input-multiselect';
-@input-option: ~'.input-option';
-@input-optgroup: ~'.input-optgroup';
-@input-button: ~'.input-button';
-@input-checkbox: ~'.input-checkbox';
-@input-radio: ~'.input-radio';
-
-@form: ~".form";
-@form-label: ~".form-label";
-@form-label-full: ~".form-label-full";
-@form-input: ~".form-input";
-@form-row: ~".form-row";
-@form-group: ~'.form-group';
-@form-group-label: ~'.form-group-label';
-@form-group-row: ~'.form-group-row';
-
-@heading: ~".heading";
-@HEADING: ~"> .heading";
-
-@details: ~".details";
-@DETAILS: ~"> .details";
-@details-open: ~".details[open]";
-@details-summary: ~"> .details-summary";
-@details-content: ~"> .details-content";
-
-@anchor: ~".anchor";
-@anchor-broken: ~'.anchor-broken';
-@anchor-link: ~'.anchor-link';
-@anchor-download: ~'.anchor-download';
-
-@ruby-parenthesis: ~".ruby-parenthesis";
-@ruby-text: ~".ruby-text";
-
-@todo: ~".todo";
-
-@semantic-abbr: ~"abbr, .semantic-abbr";
-@semantic-b: ~".semantic-b";
-@semantic-cite: ~".semantic-cite";
-@semantic-code: ~".semantic-code";
-@semantic-dfn: ~".semantic-dfn";
-@semantic-em: ~".semantic-em";
-@semantic-i: ~".semantic-i";
-@semantic-kbd: ~".semantic-kbd";
-@semantic-kbd-press: ~".semantic-kbd-press";
-@semantic-kbd-release: ~".semantic-kbd-release";
-@semantic-mark: ~".semantic-mark";
-@semantic-pre: ~".semantic-pre";
-@semantic-q: ~".semantic-q";
-@semantic-s: ~".semantic-s";
-@semantic-samp: ~".semantic-samp";
-@semantic-small: ~".semantic-small";
-@semantic-strong: ~".semantic-strong";
-@semantic-u: ~".semantic-u";
-@semantic-var: ~".semantic-var";
-
-@color-red: ~".color-red";
-@color-orange: ~".color-orange";
-@color-yellow: ~".color-yellow";
-@color-lime: ~".color-lime";
-@color-cyan: ~".color-cyan";
-@color-blue: ~".color-blue";
-@color-magenta: ~".color-magenta";
-@color-gray: ~".color-gray";
-
-@special-remove: ~".special-remove";
-@special-hide: ~".special-hide";
-@special-block-center: ~".special-block-center";
diff --git a/src/targets/root.less b/src/targets/root.less
deleted file mode 100644
index f76ad84..0000000
--- a/src/targets/root.less
+++ /dev/null
@@ -1,128 +0,0 @@
-// The root target defines selector in a way that allows for it to be added to a simple HTML page and for it to be displayed with
-
-@bluelib: ~"body, .bluelib";
-@all: ~"*";
-
-@page-footer: ~"footer, .page-footer";
-
-@layout: ~".layout";
-@layout-fill: ~".layout-fill";
-@layout-fill-single: ~".layout-fill-single";
-@layout-threecol: ~".layout-threecol";
-@layout-threecol-left: ~".layout-threecol-left";
-@layout-threecol-center: ~".layout-threecol-center";
-@layout-threecol-right: ~".layout-threecol-right";
-
-@panel: ~".panel";
-@panel-box: ~".panel-box";
-@panel-dialog: ~".panel-dialog";
-@panel-parenthesis: ~".panel-parenthesis";
-@panel-table: ".panel-table";
-
-@chapter: ~".chapter";
-@chapter-forcewrap: ~".chapter-forcewrap";
-
-@separator: ~"hr, .separator";
-@separator-light: ~".separator-light";
-@separator-heavy: ~".separator-heavy";
-
-@image: ~"img, .image";
-@image-limit-half: ~".image-limit-half";
-@image-limit-quarter: ~".image-limit-quarter";
-@figure: ~"figure, .figure";
-
-@table: ~"table, .table";
-@table-caption: ~"table caption, .table-caption";
-@table-caption-fixer: ~"table[disabled] caption, table.status-disabled caption, .table[disabled] caption, .table.status-disabled caption, table[disabled] .table-caption, table.status-disabled .table-caption, .table[disabled] .table-caption, .table.status-disabled .table-caption";
-@table-caption-top: ~"table caption, .table-caption-top";
-@table-caption-bottom: ~".table-caption-bottom";
-@table-header: ~"table thead, .table-header";
-@table-body: ~"table tbody, .table-body";
-@table-footer: ~"table tfoot, .table-footer";
-@table-row: ~"table tr, .table-row";
-@table-data: ~"table td, .table-data";
-@table-head: ~"table th, .table-head";
-@table-mark: ~".table-mark";
-
-@list: ~"ol, ul, dl, .list";
-@list-unordered: ~"ul, .list-unordered";
-@list-ordered: ~"ol, .list-ordered";
-@list-description: ~"dl, .list-description";
-@list-item: ~"li, .list-item";
-@list-description-term: ~"dt, .list-description-term";
-@list-description-details: ~"dd, .list-description-details";
-
-@status-disabled: ~"[disabled], .status-disabled";
-
-@input: ~'@{input-field}, @{input-area}, @{input-select}, @{input-multiselect}, @{input-button}, @{input-checkbox}, @{input-radio}, .input';
-@INPUT: ~'> @{input-field}, > @{input-area}, > @{input-select}, > @{input-multiselect}, > @{input-button}, > @{input-checkbox}, > @{input-radio}, > .input';
-@input-field: ~'.input-field, input[type="color"], input[type="date"], input[type="datetime-local"], input[type="email"], input[type="file"], input[type="image"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]';
-@input-area: ~'textarea, .input-area';
-@input-select: ~'select:not([multiple]), .input-select';
-@input-multiselect: ~'select[multiple], .input-multiselect';
-@input-option: ~'option, .input-option';
-@input-optgroup: ~'optgroup, .input-optgroup';
-@input-button: ~'button, input[type="submit"], input[type="reset"], .input-button';
-@input-checkbox: ~'input[type="checkbox"], .input-checkbox';
-@input-radio: ~'input[type="radio"], .input-radio';
-
-@form: ~"form, .form";
-@form-label: ~"> label, .form-label";
-@form-label-full: ~".form-label-full";
-@form-input: ~"@{INPUT}, .form-input";
-@form-row: ~".form-row";
-@form-group: ~'.form-group';
-@form-group-label: ~'> label, .form-group-label';
-@form-group-row: ~'.form-group-row';
-
-@heading: ~"h1, h2, h3, h4, h5, h6, .heading";
-@HEADING: ~"> h1, > h2, > h3, > h4, > h5, > h6, > .heading";
-
-@details: ~".details, details";
-@DETAILS: ~"> .details, > details";
-@details-open: ~".details[open], details[open]";
-@details-summary: ~"> .details-summary, > summary";
-@details-content: ~"> .details-content, > :not(summary)";
-
-@anchor: ~"a, .anchor";
-@anchor-broken: ~'a:not([href]), .anchor-broken';
-@anchor-link: ~'a[href], .anchor-link';
-@anchor-download: ~'a[download], .anchor-download';
-
-@ruby-parenthesis: ~"rp, .ruby-parenthesis";
-@ruby-text: ~"rt, .ruby-text";
-
-@todo: ~".todo";
-
-@semantic-abbr: ~"abbr, .semantic-abbr";
-@semantic-b: ~"b, .semantic-b";
-@semantic-cite: ~"cite, .semantic-cite";
-@semantic-code: ~"code, .semantic-code";
-@semantic-dfn: ~"dfn, .semantic-dfn";
-@semantic-em: ~"em, .semantic-em";
-@semantic-i: ~"i, .semantic-i";
-@semantic-kbd: ~"kbd, .semantic-kbd";
-@semantic-kbd-press: ~".semantic-kbd-press";
-@semantic-kbd-release: ~".semantic-kbd-release";
-@semantic-mark: ~"mark, .semantic-mark";
-@semantic-pre: ~"pre, .semantic-pre";
-@semantic-q: ~"q, .semantic-q";
-@semantic-s: ~"s, .semantic-s";
-@semantic-samp: ~"samp, .semantic-samp";
-@semantic-small: ~"small, .semantic-small";
-@semantic-strong: ~"strong, .semantic-strong";
-@semantic-u: ~"u, .semantic-u";
-@semantic-var: ~"var, .semantic-var";
-
-@color-red: ~".color-red";
-@color-orange: ~".color-orange";
-@color-yellow: ~".color-yellow";
-@color-lime: ~".color-lime, .color-green";
-@color-cyan: ~".color-cyan";
-@color-blue: ~".color-blue";
-@color-magenta: ~".color-magenta";
-@color-gray: ~".color-gray";
-
-@special-remove: ~".special-remove";
-@special-hide: ~".special-hide";
-@special-block-center: ~".special-block-center";
diff --git a/src/themes/amber.less b/src/themes/amber.less
deleted file mode 100644
index 93abdf9..0000000
--- a/src/themes/amber.less
+++ /dev/null
@@ -1,21 +0,0 @@
-@{bluelib} {
- .set-var-rgb(bluelib-background; 39; 33; 33);
- .set-var-rgb(bluelib-foreground; 225; 80; 11);
- .set-var-rgb(bluelib-accent; 246; 233; 233);
-
- .set-var-rgb(bluelib-link; 255; 239; 154);
- .set-var-rgb(bluelib-broken; 218; 153; 246);
- .set-var-rgb(bluelib-visited; 255; 187; 154);
- .set-var-rgb(bluelib-download; 149; 246; 212);
-
- .set-var-rgb(bluelib-red; 255; 80; 80);
- .set-var-rgb(bluelib-orange; 255; 175; 80);
- .set-var-rgb(bluelib-yellow; 255; 255; 80);
- .set-var-rgb(bluelib-lime; 80; 255; 80);
- .set-var-rgb(bluelib-cyan; 80; 255; 255);
- .set-var-rgb(bluelib-blue; 80; 80; 255);
- .set-var-rgb(bluelib-magenta; 255; 80; 255);
- .set-var-rgb(bluelib-gray; 187; 187; 187);
-
- --bluelib-polarity: 1;
-}
diff --git a/src/themes/hacker.less b/src/themes/hacker.less
deleted file mode 100644
index d8ead2a..0000000
--- a/src/themes/hacker.less
+++ /dev/null
@@ -1,21 +0,0 @@
-@{bluelib} {
- .set-var-rgb(bluelib-background; 4; 4; 4);
- .set-var-rgb(bluelib-foreground; 0; 255; 0);
- .set-var-rgb(bluelib-accent; 0; 255; 0);
-
- .set-var-rgb(bluelib-link; 127; 255; 127);
- .set-var-rgb(bluelib-broken; 255; 0; 0);
- .set-var-rgb(bluelib-visited; 64; 180; 64);
- .set-var-rgb(bluelib-download; 255; 255; 255);
-
- .set-var-rgb(bluelib-red; 255; 125; 125);
- .set-var-rgb(bluelib-orange; 255; 187; 125);
- .set-var-rgb(bluelib-yellow; 255; 255; 125);
- .set-var-rgb(bluelib-lime; 125; 255; 125);
- .set-var-rgb(bluelib-cyan; 125; 255; 255);
- .set-var-rgb(bluelib-blue; 125; 125; 255);
- .set-var-rgb(bluelib-magenta; 255; 125; 255);
- .set-var-rgb(bluelib-gray; 187; 187; 187);
-
- --bluelib-polarity: 1;
-}
\ No newline at end of file
diff --git a/src/themes/paper.less b/src/themes/paper.less
deleted file mode 100644
index e5dc8a9..0000000
--- a/src/themes/paper.less
+++ /dev/null
@@ -1,21 +0,0 @@
-@{bluelib} {
- .set-var-rgb(bluelib-background; 255; 255; 255);
- .set-var-rgb(bluelib-foreground; 24; 24; 24);
- .set-var-rgb(bluelib-accent; 24; 24; 24);
-
- .set-var-rgb(bluelib-link; 0; 147; 147);
- .set-var-rgb(bluelib-broken; 245; 111; 0);
- .set-var-rgb(bluelib-visited; 9; 101; 156);
- .set-var-rgb(bluelib-download; 0; 164; 106);
-
- .set-var-rgb(bluelib-red; 200; 0; 0);
- .set-var-rgb(bluelib-orange; 200; 165; 0);
- .set-var-rgb(bluelib-yellow; 200; 200; 0);
- .set-var-rgb(bluelib-lime; 0; 200; 0);
- .set-var-rgb(bluelib-cyan; 0; 200; 200);
- .set-var-rgb(bluelib-blue; 0; 0; 200);
- .set-var-rgb(bluelib-magenta; 200; 0; 200);
- .set-var-rgb(bluelib-gray; 128; 128; 128);
-
- --bluelib-polarity: -1;
-}
diff --git a/src/themes/pumpkin.less b/src/themes/pumpkin.less
deleted file mode 100644
index f6a7bbf..0000000
--- a/src/themes/pumpkin.less
+++ /dev/null
@@ -1,21 +0,0 @@
-@{bluelib} {
- .set-var-rgb(bluelib-background; 25; 16; 48);
- .set-var-rgb(bluelib-foreground; 226; 140; 35);
- .set-var-rgb(bluelib-accent; 254; 237; 180);
-
- .set-var-rgb(bluelib-link; 0; 202; 202);
- .set-var-rgb(bluelib-broken; 255; 116; 0);
- .set-var-rgb(bluelib-visited; 12; 134; 207);
- .set-var-rgb(bluelib-download; 0; 211; 137);
-
- .set-var-rgb(bluelib-red; 255; 125; 125);
- .set-var-rgb(bluelib-orange; 255; 187; 125);
- .set-var-rgb(bluelib-yellow; 255; 255; 125);
- .set-var-rgb(bluelib-lime; 125; 255; 125);
- .set-var-rgb(bluelib-cyan; 125; 255; 255);
- .set-var-rgb(bluelib-blue; 125; 125; 255);
- .set-var-rgb(bluelib-magenta; 255; 125; 255);
- .set-var-rgb(bluelib-gray; 187; 187; 187);
-
- --bluelib-polarity: 1;
-}
diff --git a/src/themes/royalblue.less b/src/themes/royalblue.less
deleted file mode 100644
index a6a367b..0000000
--- a/src/themes/royalblue.less
+++ /dev/null
@@ -1,21 +0,0 @@
-@{bluelib} {
- .set-var-rgb(bluelib-background; 13; 25; 59);
- .set-var-rgb(bluelib-foreground; 160; 204; 255);
- .set-var-rgb(bluelib-accent; 255; 255; 255);
-
- .set-var-rgb(bluelib-link; 0; 202; 202);
- .set-var-rgb(bluelib-broken; 255; 116; 0);
- .set-var-rgb(bluelib-visited; 12; 134; 207);
- .set-var-rgb(bluelib-download; 0; 211; 137);
-
- .set-var-rgb(bluelib-red; 255; 125; 125);
- .set-var-rgb(bluelib-orange; 255; 187; 125);
- .set-var-rgb(bluelib-yellow; 255; 255; 125);
- .set-var-rgb(bluelib-lime; 125; 255; 125);
- .set-var-rgb(bluelib-cyan; 125; 255; 255);
- .set-var-rgb(bluelib-blue; 125; 125; 255);
- .set-var-rgb(bluelib-magenta; 255; 125; 255);
- .set-var-rgb(bluelib-gray; 187; 187; 187);
-
- --bluelib-polarity: 1;
-}
diff --git a/src/themes/royaldawn.less b/src/themes/royaldawn.less
deleted file mode 100644
index 18a4a85..0000000
--- a/src/themes/royaldawn.less
+++ /dev/null
@@ -1,24 +0,0 @@
-@{bluelib} {
- .set-var-rgb(bluelib-background; 117; 55; 90);
- .set-var-rgb(bluelib-foreground; 254; 237; 180);
- .set-var-rgb(bluelib-accent; 255; 255; 255);
-
- .set-var-rgb(bluelib-link; 87; 255; 255);
- .set-var-rgb(bluelib-broken; 255; 140; 87);
- .set-var-rgb(bluelib-visited; 87; 135; 255);
- .set-var-rgb(bluelib-download; 87; 255; 175);
-
- .set-var-rgb(bluelib-red; 255; 125; 125);
- .set-var-rgb(bluelib-orange; 255; 187; 125);
- .set-var-rgb(bluelib-yellow; 255; 255; 125);
- .set-var-rgb(bluelib-lime; 125; 255; 125);
- .set-var-rgb(bluelib-cyan; 125; 255; 255);
- .set-var-rgb(bluelib-blue; 125; 125; 255);
- .set-var-rgb(bluelib-magenta; 255; 125; 255);
- .set-var-rgb(bluelib-gray; 187; 187; 187);
-
- --bluelib-polarity: 1;
-
- background: linear-gradient(45deg, rgba(222,98,14,1) 0%, rgba(117,55,90,1) 50%, rgba(62,37,125,1) 100%);
- background-attachment: fixed;
-}
diff --git a/src/themes/skeleton.less b/src/themes/skeleton.less
deleted file mode 100644
index f54ae20..0000000
--- a/src/themes/skeleton.less
+++ /dev/null
@@ -1,1418 +0,0 @@
-/// ===== Root =====
-/// Every HTML document using Bluelib must define a root, an element where all bluelib styles can start being applied.
-/// Elements outside the root won't be styled at all, allowing Bluelib's styling to be contained in components or modules of a website.
-
-@{bluelib} {
-
- /// ===== Macros =====
- /// Less allows defining variables to reduce the amount of boilerplate code to write while defining the rules.
- /// In Bluelib, these are called macros.
-
- //
-
- @rgb-background: rgb(
- var(--bluelib-background-r),
- var(--bluelib-background-g),
- var(--bluelib-background-b)
- );
- @rgb-foreground: rgb(
- var(--bluelib-foreground-r),
- var(--bluelib-foreground-g),
- var(--bluelib-foreground-b)
- );
- @rgb-accent: rgb(
- var(--bluelib-accent-r),
- var(--bluelib-accent-g),
- var(--bluelib-accent-b)
- );
-
- @rgb-link: rgb(
- var(--bluelib-link-r),
- var(--bluelib-link-g),
- var(--bluelib-link-b)
- );
- @rgb-broken: rgb(
- var(--bluelib-broken-r),
- var(--bluelib-broken-g),
- var(--bluelib-broken-b)
- );
- @rgb-visited: rgb(
- var(--bluelib-visited-r),
- var(--bluelib-visited-g),
- var(--bluelib-visited-b)
- );
- @rgb-download: rgb(
- var(--bluelib-download-r),
- var(--bluelib-download-g),
- var(--bluelib-download-b)
- );
-
- @rgb-red: rgb(
- var(--bluelib-red-r),
- var(--bluelib-red-g),
- var(--bluelib-red-b)
- );
- @rgb-orange: rgb(
- var(--bluelib-orange-r),
- var(--bluelib-orange-g),
- var(--bluelib-orange-b)
- );
- @rgb-yellow: rgb(
- var(--bluelib-yellow-r),
- var(--bluelib-yellow-g),
- var(--bluelib-yellow-b)
- );
- @rgb-lime: rgb(
- var(--bluelib-lime-r),
- var(--bluelib-lime-g),
- var(--bluelib-lime-b)
- );
- @rgb-cyan: rgb(
- var(--bluelib-cyan-r),
- var(--bluelib-cyan-g),
- var(--bluelib-cyan-b)
- );
- @rgb-blue: rgb(
- var(--bluelib-blue-r),
- var(--bluelib-blue-g),
- var(--bluelib-blue-b)
- );
- @rgb-magenta: rgb(
- var(--bluelib-magenta-r),
- var(--bluelib-magenta-g),
- var(--bluelib-magenta-b)
- );
- @rgb-gray: rgb(
- var(--bluelib-gray-r),
- var(--bluelib-gray-g),
- var(--bluelib-gray-b)
- );
-
- @rgb-leaving: rgba(
- calc(255 * (((var(--bluelib-polarity) / 2) * -1) + 0.5)),
- calc(255 * (((var(--bluelib-polarity) / 2) * -1) + 0.5)),
- calc(255 * (((var(--bluelib-polarity) / 2) * -1) + 0.5)),
- 1.000
- );
- @rgb-towards: rgba(
- calc(255 * ((var(--bluelib-polarity) / 2) + 0.5)),
- calc(255 * ((var(--bluelib-polarity) / 2) + 0.5)),
- calc(255 * ((var(--bluelib-polarity) / 2) + 0.5)),
- 1.000
- );
-
- @c0: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.030
- );
- @c1: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.125
- );
- @c2: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.220
- );
- @c3: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.315
- );
- @c4: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.410
- );
- @c5: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.505
- );
- @c6: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.600
- );
- @c7: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.700
- );
- @c8: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.800
- );
- @c9: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 0.900
- );
- @cA: rgba(
- var(--bluelib-color-r),
- var(--bluelib-color-g),
- var(--bluelib-color-b),
- 1.000
- );
- @cB: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 10)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 10)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 10)),
- 1.000
- );
- @cC: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 20)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 20)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 20)),
- 1.000
- );
- @cD: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 30)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 30)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 30)),
- 1.000
- );
- @cE: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 40)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 40)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 40)),
- 1.000
- );
- @cF: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 50)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 50)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 50)),
- 1.000
- );
- @cG: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 60)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 60)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 60)),
- 1.000
- );
- @cH: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 70)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 70)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 70)),
- 1.000
- );
- @cI: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 80)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 80)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 80)),
- 1.000
- );
- @cJ: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 90)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 90)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 90)),
- 1.000
- );
- @cK: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 100)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 100)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 100)),
- 1.000
- );
- @cL: rgba(
- calc(var(--bluelib-color-r) + (var(--bluelib-polarity) * 110)),
- calc(var(--bluelib-color-g) + (var(--bluelib-polarity) * 110)),
- calc(var(--bluelib-color-b) + (var(--bluelib-polarity) * 110)),
- 1.000
- );
-
- //
-
- /// ===== All =====
- /// By default, browsers style elements with some weird rules.
- /// This is an attempt to correct them, and to implement some Bluelib magic.
-
- //
-
- &, @{all} {
-
- // Globally set the box-sizing to border-box, as content-box is completely insane
- &, &::before, &::after {
- box-sizing: border-box;
- }
-
- // Bluelib magic!
- // This rule sets the color of all text to be equal to the current .bluelib-color() at 100% opacity.
- // Thanks, CSS variables!
- color: @cA;
-
- // Get the scrollbar color from the theme
- scrollbar-color: @rgb-foreground @rgb-background;
- }
-
- //
-
- /// ===== Root =====
- /// The root element has some rules itself.
-
- //
-
- // Set default fonts
- --bluelib-title-family: sans-serif;
- --bluelib-title-weight: 400;
- --bluelib-text-family: sans-serif;
- --bluelib-text-weight: 400;
- --bluelib-code-family: monospace;
- --bluelib-code-weight: 400;
-
- // Set the background defined in the palette
- background-color: @rgb-background;
-
- // Make the element fill all available space
- width: 100%;
- height: 100%;
-
- // And remove its margin, in case it is the body
- margin: 0;
-
- // Set the base color to the foreground defined in the palette
- .map-var-rgb(bluelib-color; bluelib-foreground);
-
- // Set the base font
- .use-var-font(bluelib-text);
-
- //
-
- /// ===== Page =====
- /// These rules apply to the four page areas: main, aside, header and footer
-
- //
- @{page-footer} {
- margin-top: 1em;
- text-align: center;
- font-size: x-small;
- }
- //
-
- /// ===== Layouts =====
- /// Layouts arrange the content displayed inside the root.
- /// Layouts are the second element in the Bluelib hierarchy, immediately following the root.
- /// Ideally, a single layout should be used per page.
-
- //
-
- // The base layout class.
- @{layout} {
- display: grid;
- justify-content: stretch;
- align-items: stretch;
- }
-
- // A layout with a single container spanning the whole screen.
- @{layout-fill} {
- padding: 4px;
-
- grid-template-areas:
- "single";
- grid-template-columns: 1fr;
- grid-template-rows: 1fr;
- }
-
- @{layout-fill-single} {
- grid-area: single;
- }
-
- // A layout with a centered 1024px wide main container and two symmetric containers at the sides.
- @{layout-threecol} {
- padding: 4px;
- grid-column-gap: 8px;
-
- @media screen and (min-width: 1281px) {
- grid-template-areas:
- "left center right";
- grid-template-columns: 1fr auto 1fr;
- grid-template-rows: 1fr;
- }
-
- // If the side containers would be smaller than 128px (if the screen is narrower than 1280px), the smaller containers are moved below the main one.
- @media screen and (max-width: 1280px) {
- grid-template-areas:
- "center center"
- "left right";
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto auto;
-
- // Keep the container limited to 1024px and centered
- max-width: 1024px;
- margin-left: auto;
- margin-right: auto;
- }
- }
-
- @{layout-threecol-left} {
- grid-area: left;
-
- @media screen and (min-width: 1281px) {
- justify-self: end;
- }
-
- @media screen and (max-width: 1280px) {
- justify-self: stretch;
- }
- }
-
- @{layout-threecol-center} {
- grid-area: center;
-
- @media screen and (min-width: 1281px) {
- width: 1024px;
- }
-
- @media screen and (max-width: 1280px) {
- // Ensure the container doesn't eat up all the space
- max-width: 1024px;
- }
- }
-
- @{layout-threecol-right} {
- grid-area: right;
-
- @media screen and (min-width: 1281px) {
- justify-self: start;
- }
-
- @media screen and (max-width: 1280px) {
- justify-self: stretch;
- }
- }
-
- //
-
- /// ===== Panels =====
- /// Panels are the main sectioning elements available in Bluelib.
- /// Many instances of them should be present on the page!
- /// They should group small amounts of tightly related content, which can be understood more or less separately from the rest of the page.
-
- //
-
- // The base panel class.
- @{panel} {
- // Panels have a margin to separate them from other elements
- margin: 8px 0;
- // And a padding to separate them from their contents
- padding: 8px;
- // And a nice round border
- border-radius: 4px;
-
- // Panels should try to fill the most space possible
- width: 100%;
-
- // And should be wide at least 312px
- min-width: 312px;
-
- background-color: @c0;
- border-color: @c1;
-
- // The first and last elements of a panel should not have a margin
- > @{all} {
- &:first-child {
- margin-top: 0;
- }
-
- &:last-child {
- margin-bottom: 0;
- }
- }
- }
-
- // A panel which encloses its contents with a border.
- @{panel-box} {
- border-width: 2px;
- border-style: solid;
- }
-
- // A panel which encloses its contents with a quote-like border.
- @{panel-dialog} {
- border-width: 0 0 0 2px;
- border-style: solid;
- }
-
- // A panel with no border whose contents are made smaller.
- @{panel-parenthesis} {
- border-width: 0;
- font-size: smaller;
- }
-
- //
-
- /// ===== Chapters =====
- /// A chapter is an element represents a larger section of text.
-
- //
-
- @{chapter} {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- justify-content: stretch;
- align-items: stretch;
-
- margin: 8px 0;
-
- > @{all} {
- // Allow all children to grow
- flex-grow: 1;
- // But not to shrink
- flex-shrink: 0;
- }
-
- @{HEADING} {
- // Headings should fill up all horizontal space available and force a wrap
- flex-basis: 100%;
-
- // They should have a bit of margin to separate them from the other elements
- margin-top: 0.2rem;
- margin-bottom: 0.2rem;
-
- // Especially if they are the first or the last children of a chapter, where they have to separate the chapters from each other
- &:first-child {
- margin-top: 1rem;
- }
- &:last-child {
- margin-bottom: 1rem;
- }
- }
-
- > @{panel} {
- // Remove the innate margin panels have
- margin: 0;
- // Have panels split the free space in equal parts
- flex-basis: 0;
- }
-
- }
-
- // Force a split to wrap
- @{chapter-forcewrap} {
- flex-grow: 0;
- flex-shrink: 0;
- flex-basis: 100%;
-
- position: relative;
- }
-
- //
-
- /// ===== Separators =====
- /// Separators are horizontal lines separating elements.
-
- //
-
- @{separator} {
- border-width: 1px;
- border-style: solid;
- border-color: @c5;
- }
-
- @{separator-light} {
- border-color: @c1;
- }
-
- @{separator-heavy} {
- border-color: @cA;
- }
-
- //
-
- /// ===== Images =====
- /// Images are changed to block elements and are automatically centered.
-
- //
-
- @{image} {
- display: block;
-
- max-width: 100%;
-
- margin-left: auto;
- margin-right: auto;
-
- object-fit: contain;
- }
-
- @{image-limit-half} {
- max-height: max(28.2vw, 50vh);
- }
-
- @{image-limit-quarter} {
- max-height: max(14.1vw, 25vh);
- }
-
- @{figure} {
- display: inline-flex;
- flex-direction: column;
- gap: 8px;
-
- font-size: small;
- font-style: italic;
- text-align: center;
-
- margin: 8px 0;
- padding: 8px;
-
- border-width: 2px;
- border-style: solid;
- border-radius: 4px;
-
- background-color: @c1;
- border-color: @c2;
- }
-
- //
-
- /// ===== Tables =====
-
- //
- @{table} {
- display: table;
-
- background-color: @c0;
-
- border-width: 2px;
- border-style: solid;
- border-color: @c1;
- border-radius: 0 0 4px 4px;
- border-collapse: collapse;
-
- padding: 8px;
- margin: 8px 0;
- }
-
- @{table-caption} {
- display: table-caption;
-
- background-color: @c0;
-
- padding: 4px;
-
- font-style: italic;
- font-size: small;
- }
-
- // Fix for table-caption not disabling itself
- @{table-caption-fixer} {
- opacity: 50%;
- }
-
- @{table-caption-top} {
- caption-side: top;
-
- border-width: 2px 2px 0 2px;
- border-style: solid;
- border-color: @c1;
- border-radius: 4px 4px 0 0;
- }
-
- @{table-caption-bottom} {
- caption-side: bottom;
-
- border-width: 0 2px 2px 2px;
- border-style: solid;
- border-color: @c1;
- border-radius: 0 0 4px 4px;
- }
-
- @{table-header} {
- display: table-header-group;
-
- background-color: @c0;
- }
-
- @{table-body} {
- display: table-row-group;
- }
-
- @{table-footer} {
- display: table-footer-group;
-
- background-color: @c0;
- }
-
- @{table-row} {
- display: table-row;
-
- border: 1px solid @c1;
- }
-
- @{table-data}, @{table-head} {
- display: table-cell;
-
- border: 1px solid @c1;
- padding: 8px;
- }
-
- @{table-data} {
-
- }
-
- @{table-head} {
- color: @rgb-accent;
- }
-
- @{table-mark} {
- background-color: @c2;
- color: @cF;
- }
-
- /// ===== Lists =====
-
- @{list} {
-
- }
-
- @{list-unordered} {
-
- }
-
- @{list-ordered} {
-
- }
-
- @{list-item} {
- margin: 0.35rem 0;
-
- &::marker {
- color: @c5;
- }
- }
-
- @{list-description} {
-
- }
-
- @{list-description-term} {
- margin-top: 0.7rem;
- margin-bottom: 0.35rem;
-
- font-size: larger;
- }
-
- @{list-description-details} {
- margin-top: 0.35rem;
- margin-bottom: 0.7rem;
- margin-left: 16px;
- }
-
- //
-
- /// ===== Status =====
- /// Status are classes that can be applied to elements to indicate that special interactions are available.
-
- //
-
- @{status-disabled} {
- opacity: 50%;
-
- // All sub-elements of a disabled element should have a not-allowed cursor
- &, @{all} {
- cursor: not-allowed !important;
- }
- }
-
- //
-
- /// ===== Inputs =====
- /// Inputs are the interactable parts of a website.
-
- //
-
- @{input} {
- // Disable the browser font override
- font: inherit;
-
- // Use the maximum width possible
- width: 100%;
-
- // They should have a solid border
- border-style: solid;
- // Unless they are disabled, then they should have a dashed one
- &@{status-disabled} {
- border-style: dashed;
- }
-
- // They should use the current bluelib color
- border-color: @c3;
- color: @cA;
- background-color: @c0;
-
- // Both for themselves and their placeholder
- &::placeholder {
- color: @c4;
- opacity: 1;
- }
-
- // They should become lighter if hovered
- &:hover {
- border-color: @c6;
- color: @cC;
- background-color: @c1;
-
- &::placeholder {
- color: @c7;
- }
- }
-
- // And even lighter if focused
- &:focus {
- border-color: @cA;
- color: @cF;
- background-color: @c2;
-
- &::placeholder {
- color: @c7;
- }
- }
-
- // Unless they are disabled
- &@{status-disabled} {
- &:hover, &:focus {
- border-color: @c3;
- color: @cA;
- background-color: @c0;
-
- &::placeholder {
- color: @c4;
- }
- }
- }
-
- // If they are optional, their contents should be in italic
- &:optional, &:optional::placeholder {
- font-style: italic;
- }
-
- // Color the elements based on validation
- // Temporarily disabled due to some browser quirks
- // &:invalid {
- // .bluelib-color(@hex-red);
- // }
- // &:valid {
- // .bluelib-color(@hex-lime)
- // }
-
- // If the browser wants the focus to be more appearent, don't draw an ugly focus ring and let every element define a better way
- &:focus-visible {
- outline: none;
- }
- }
-
- /// Fields are inputs where text can be entered
- @{input-field} {
- cursor: text;
-
- border-width: 0 0 2px 0;
- border-radius: 4px 4px 0 0;
- padding: 6px;
- }
-
- @{input-area} {
- cursor: text;
-
- border-width: 0 0 0 2px;
- border-radius: 0 4px 4px 0;
- padding: 6px;
- }
-
- /// Selects are inputs where one option between many can be selected
- @{input-select} {
- cursor: context-menu;
-
- border-width: 0 0 2px 0;
- border-radius: 4px 4px 0 0;
-
- @media screen and (-webkit-min-device-pixel-ratio:0) {
- @{input-option}, @{input-optgroup} {
- .use-var-rgb(background-color; bluelib-background);
- }
- }
- }
-
- /// Multiselects are inputs where multiple options between many can be selected
- @{input-multiselect} {
- cursor: vertical-text;
-
- border-width: 0 0 0 2px;
- border-radius: 0 4px 4px 0;
-
- // This is how you change color of the selected options of the multiselect
- // But it is very quirky and never works as expected, so it is disabled
- // @{input-option} {
- // &:checked {
- // background-image: linear-gradient(0deg, @bA 0%, @bA 100%);
- // }
- // }
- }
-
- // Some rules apply to both of them
- @{input-select}, @{input-multiselect} {
- // Browsers add 4px of unremovable horizontal padding to options for some reason
- padding: 6px 4px;
-
- @{input-option} {
- font-weight: normal;
- color: @cA;
-
- // Options should be slightly padded too
- padding: 4px;
- }
-
- @{input-optgroup} {
- // Style option groups as titles
- font-weight: bold;
- color: @rgb-accent;
-
- // Options groups should be slightly padded too
- padding: 4px;
-
- @{input-option} {
- // Add a slight indentation
- padding: 4px 20px;
-
- &::before {
- // Remove the tabs that Chrome adds before the options
- content: "";
- }
- }
- }
-
- // Nested optgroups aren't allowed by browsers, so no need to worry about that
- }
-
- @{input-button} {
- cursor: pointer;
-
- // Buttons are rendered as inline elements, but should arrange their contents as if they were flex
- display: inline-flex;
- // Center the button contents both vertically and horizontally
- justify-content: center;
- align-items: center;
-
- // Give the button a nice shape
- padding: 6px 16px;
- border-radius: 4px;
-
- // Give them a good clicking feedback
- // (sadly it doesn't work if using the keyboard)
- &:active {
- border-color: @cC;
- color: @cF;
- background-color: @c3;
- }
-
- // But not if they're disabled
- @{status-disabled} {
- &:active {
- border-color: @c3;
- color: @cA;
- background-color: @c0;
- }
- }
- }
-
- @{input-checkbox}, @{input-radio} {
- // Disable the default browser style
- appearance: none;
-
- // Make the element feel clickable
- cursor: pointer;
-
- // Set a fixed size
- width: 24px;
- height: 24px;
-
- // Override the default border width
- border-width: 2px;
-
- // Prepare the element to display something inside
- display: inline-flex;
- justify-content: center;
- align-items: center;
-
- &::before {
- // Force the creation of a pseudo-element inside
- display: block;
- content: "";
-
- width: 14px;
- height: 14px;
- }
-
- // If the element is checked, display it
- &:checked::before {
- background-color: @c9;
- }
-
- &:hover:checked::before {
- background-color: @cB;
- }
-
- &:focus:checked::before {
- background-color: @cD;
- }
-
- &:active:checked::before {
- background-color: @cD;
- }
- }
-
- // Checkbox buttons denote that multiple options can be selected
- @{input-checkbox} {
- // Checkboxes should be square
- border-radius: 4px;
-
- &::before {
- border-radius: 2px;
- }
- }
-
- // Radio buttons denote that only an option can be selected
- @{input-radio} {
- // Radios should be round
- border-radius: 100%;
-
- &::before {
- border-radius: 100%;
- }
- }
-
- //
-
- /// ===== Forms =====
- /// Forms are containers where interactable elements are contained.
- /// Every interactable is split in two parts: a label on the left and the control on the right.
- ///
- /// Example:
- ///
- /// Username | Steffo
- /// Email | ste.pigozzi@gmail.com
- /// Password | ············
- /// Country | Italy ↓
- ///
- /// [Submit]
-
- //
-
- @{form} {
- display: grid;
-
- align-items: center;
- row-gap: 4px;
- column-gap: 8px;
-
- // Labels should have the greater width between the one they require and 1/6 of the form width.
- grid-template-columns: minmax(auto, 1fr) 5fr;
-
- @{form-label} {
- // Labels are on the left column of the grid
- grid-column: 1;
- // They should be right-aligned
- justify-self: end;
- text-align: right;
-
- // Give the labels the accent color
- .map-var-rgb(bluelib-color, bluelib-accent);
- // And make them slightly bold
- font-weight: 500;
- }
-
-
- @{form-input} {
- // Inputs are on the right column of the grid
- grid-column: 2;
- // They should occupy all the available space
- justify-self: stretch;
- }
-
- // Groups are similar to form-inputs, but may contain multiple inputs inside them
- @{form-group} {
- grid-column: 2;
-
- display: flex;
- gap: 8px 16px;
- justify-content: space-evenly;
- align-items: center;
- flex-wrap: wrap;
- width: 100%;
-
- background-color: @c0;
- padding: 6px;
- border-radius: 4px;
-
- @{form-group-label} {
- display: flex;
- gap: 6px;
- justify-content: center;
- align-items: center;
-
- // Align text to the left
- text-align: left;
- }
-
- @{form-group-row} {
- flex-basis: 100%;
-
- justify-content: start;
- }
- }
-
- // An element filling a whole row of a form
- // Useful for adding buttons or similar flow interruptions
- @{form-row} {
- grid-column-start: 1;
- grid-column-end: 3;
-
- display: flex;
- gap: 8px;
- justify-content: center;
- align-items: center;
- width: 100%;
-
- margin-top: 8px;
- margin-bottom: 8px;
-
- @{panel} {
- margin: 0;
- }
-
- &:first-child {
- margin-top: 0;
- }
-
- &:last-child {
- margin-bottom: 0;
- }
- }
- }
-
- //
-
- /// ===== Headings =====
- /// Headings are titles with a block display.
-
- //
-
- @{heading} {
- text-align: center;
- .map-var-rgb(bluelib-color, bluelib-accent);
- .use-var-font(bluelib-title);
- }
-
- //
-
- /// ===== Anchors =====
- /// Anchors are clickable links to another place, such as a paragraph or a page.
-
- //
-
- @{anchor} {
- text-decoration-line: underline;
- text-decoration-thickness: 1px;
-
- &:focus-visible {
- text-decoration-thickness: 2px;
- }
-
- &:hover, &:focus {
- color: @cD;
- }
-
- &:active {
- color: @cG;
- }
- }
-
- @{anchor-broken} {
- cursor: not-allowed;
-
- .map-var-rgb(bluelib-color, bluelib-broken);
- text-decoration-style: dashed;
-
- &:hover, &:focus, &:active {
- color: @cA;
- }
- }
-
- @{anchor-link} {
- cursor: pointer;
-
- .map-var-rgb(bluelib-color, bluelib-link);
- text-decoration-style: solid;
-
- &:visited {
- .map-var-rgb(bluelib-color, bluelib-visited);
- }
- }
-
- @{anchor-download} {
- cursor: pointer;
-
- .map-var-rgb(bluelib-color, bluelib-download);
- text-decoration-style: solid;
- }
-
- //
-
- /// ===== Details and summaries =====
- /// Details are collapsible elements which only display their summary until they are clicked.
-
- //
-
- @{details} {
- margin-top: 8px;
- margin-bottom: 8px;
-
- @{details-summary} {
- cursor: pointer;
-
- font-size: larger;
-
- // Prevent the user from accidentaly selecting the summary
- user-select: none;
-
- &:hover {
- color: @cC;
- }
-
- &:focus-visible {
- color: @cD;
- }
-
- &:active {
- color: @cJ;
- }
- }
-
- @{details-content} {
- margin-top: 0.5rem;
- }
-
- @{DETAILS} {
- margin-left: 16px;
- }
- }
-
- //
-
- /// ===== Ruby =====
- /// Ruby text is used in various languages to add annotations to text.
- /// Bluelib makes the annotations slightly transparent to differentiate them from the rest of the text.
- /// See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby
-
- //
-
- @{ruby-parenthesis} {
- color: @c1;
- }
-
- @{ruby-text} {
- color: @c6;
- }
-
- //
-
- /// ===== Todos =====
- /// Todos are used to mark unfinished parts of a website.
- /// Their color ignores the palette and derives from the 🚧 emoji
-
- //
-
- @{todo} {
- background-color: #292F33;
-
- --bluelib-color-r: 255;
- --bluelib-color-g: 204;
- --bluelib-color-b: 77;
-
- border-color: #FFCC4D;
- }
-
- //
-
- /// ===== Semantics =====
- /// Semantics are special font effects applied to text with a certain meaning.
-
- //
-
- @{semantic-abbr} {
- cursor: help;
- text-decoration: underline 1px dotted currentColor;
- }
-
- @{semantic-b} {
- font-weight: 500;
- color: @rgb-accent;
- }
-
- @{semantic-cite} {
- font-variant: small-caps;
- }
-
- @{semantic-code} {
- .use-var-font(bluelib-code);
- }
-
- @{semantic-dfn} {
- text-decoration: underline 1px solid currentColor;
- font-style: italic;
- }
-
- @{semantic-em} {
- color: @rgb-accent;
- }
-
- @{semantic-i} {
- font-style: italic;
- }
-
- @{semantic-kbd} {
- background-color: @cA;
- border-color: @cA;
- color: @rgb-background;
-
- border-width: 3px;
- border-style: ridge;
-
- padding: 1px;
- .use-var-font(bluelib-code);
-
- > @{semantic-kbd} {
- border: none;
- padding: 0;
- background-color: transparent;
-
- font-weight: 600;
- }
- }
-
- @{semantic-kbd-press} {
- border-style: inset;
- }
-
- @{semantic-kbd-release} {
- border-style: outset;
- }
-
- @{semantic-mark} {
- background-color: @c2;
- color: @cF;
- }
-
- @{semantic-pre} {
- // Override the default browser behaviour of applying a monospace font to basic pre tags
- .use-var-font(bluelib-text)
- }
-
- @{semantic-q} {
- font-style: oblique;
-
- &:before, &:after {
- color: @c5;
- }
- }
-
- @{semantic-s} {
- text-decoration: currentColor line-through;
- }
-
- @{semantic-samp} {
- background-color: @rgb-leaving;
- color: @rgb-towards;
- }
-
- @{semantic-small} {
- font-size: smaller;
- }
-
- @{semantic-strong} {
- font-weight: 800;
- color: @rgb-accent;
- }
-
- @{semantic-u} {
- text-decoration: currentColor underline;
- }
-
- @{semantic-var} {
- font-style: normal;
- color: @rgb-accent;
- }
-
- //
-
- /// ===== Colors =====
- /// Colors are classes which apply a certain color from the palette to the bluelib-color of the element which has them.
-
- //
-
- @{color-red} {
- .map-var-rgb(bluelib-color, bluelib-red);
- }
-
- @{color-orange} {
- .map-var-rgb(bluelib-color, bluelib-orange);
- }
-
- @{color-yellow} {
- .map-var-rgb(bluelib-color, bluelib-yellow);
- }
-
- @{color-lime} {
- .map-var-rgb(bluelib-color, bluelib-lime);
- }
-
- @{color-cyan} {
- .map-var-rgb(bluelib-color, bluelib-cyan);
- }
-
- @{color-blue} {
- .map-var-rgb(bluelib-color, bluelib-blue);
- }
-
- @{color-magenta} {
- .map-var-rgb(bluelib-color, bluelib-magenta);
- }
-
- @{color-gray} {
- .map-var-rgb(bluelib-color, bluelib-gray);
- }
-
- //
-
- /// ===== Special =====
- /// Special rules apply particular properties to certain pre-existing elements for certain targets.
-
- //
-
- @{special-remove} {
- display: none !important;
- }
-
- @{special-hide} {
- visibility: hidden !important;
- }
-
- @{special-block-center} {
- margin-left: auto !important;
- margin-right: auto !important;
- }
-
- //
-}
diff --git a/src/themes/sophon.less b/src/themes/sophon.less
deleted file mode 100644
index b307bc3..0000000
--- a/src/themes/sophon.less
+++ /dev/null
@@ -1,22 +0,0 @@
-@{bluelib} {
- // rgb(0, 0, 20)
- .set-var-rgb(bluelib-background; 0; 0; 20);
- .set-var-rgb(bluelib-foreground; 45; 154; 255);
- .set-var-rgb(bluelib-accent; 250; 250; 250);
-
- .set-var-rgb(bluelib-link; 0; 202; 202);
- .set-var-rgb(bluelib-broken; 255; 116; 0);
- .set-var-rgb(bluelib-visited; 134; 33; 207);
- .set-var-rgb(bluelib-download; 0; 211; 137);
-
- .set-var-rgb(bluelib-red; 255; 125; 125);
- .set-var-rgb(bluelib-orange; 255; 187; 125);
- .set-var-rgb(bluelib-yellow; 255; 255; 125);
- .set-var-rgb(bluelib-lime; 125; 255; 125);
- .set-var-rgb(bluelib-cyan; 125; 255; 255);
- .set-var-rgb(bluelib-blue; 125; 125; 255);
- .set-var-rgb(bluelib-magenta; 255; 125; 255);
- .set-var-rgb(bluelib-gray; 187; 187; 187);
-
- --bluelib-polarity: 1;
-}
diff --git a/src/utils/mixins.less b/src/utils/mixins.less
deleted file mode 100644
index 7cc9087..0000000
--- a/src/utils/mixins.less
+++ /dev/null
@@ -1,43 +0,0 @@
-.set-var-rgb(@property; @r; @g; @b) {
- --@{property}-r: @r;
- --@{property}-g: @g;
- --@{property}-b: @b;
-}
-
-.map-var-rgb(@property; @source) {
- --@{property}-r: var( ~"--@{source}-r" );
- --@{property}-g: var( ~"--@{source}-g" );
- --@{property}-b: var( ~"--@{source}-b" );
-}
-
-.use-var-rgb(@property; @source) {
- @{property}: rgb(
- var(~"--@{source}-r"),
- var(~"--@{source}-g"),
- var(~"--@{source}-b")
- );
-}
-
-.use-var-rgb-with-alpha(@property; @source; @alpha) {
- @{property}: rgba(
- var(~"--@{source}-r"),
- var(~"--@{source}-g"),
- var(~"--@{source}-b"),
- @alpha
- );
-}
-
-.set-var-font(@property; @family; @weight) {
- --@{property}-family: @family;
- --@{property}-weight: @weight;
-}
-
-.map-var-font(@property; @source) {
- --@{property}-family: var( ~"--@{source}-family");
- --@{property}-weight: var( ~"--@{source}-weight");
-}
-
-.use-var-font(@source) {
- font-family: var( ~"--@{source}-family");
- font-weight: var( ~"--@{source}-weight");
-}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..6153add
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,1073 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.12.11":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
+ integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
+ dependencies:
+ "@babel/highlight" "^7.18.6"
+
+"@babel/helper-validator-identifier@^7.18.6":
+ version "7.19.1"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
+ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
+
+"@babel/highlight@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
+ integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.18.6"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@rollup/plugin-node-resolve@^13.0.4":
+ version "13.3.0"
+ resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c"
+ integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==
+ dependencies:
+ "@rollup/pluginutils" "^3.1.0"
+ "@types/resolve" "1.17.1"
+ deepmerge "^4.2.2"
+ is-builtin-module "^3.1.0"
+ is-module "^1.0.0"
+ resolve "^1.19.0"
+
+"@rollup/pluginutils@^3.1.0":
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
+ integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
+ dependencies:
+ "@types/estree" "0.0.39"
+ estree-walker "^1.0.1"
+ picomatch "^2.2.2"
+
+"@types/accepts@*":
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+ integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/body-parser@*":
+ version "1.19.2"
+ resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
+ integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/command-line-args@^5.0.0":
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz#adbb77980a1cc376bb208e3f4142e907410430f6"
+ integrity sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==
+
+"@types/connect@*":
+ version "3.4.35"
+ resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+ integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/content-disposition@*":
+ version "0.5.5"
+ resolved "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3"
+ integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==
+
+"@types/cookies@*":
+ version "0.7.7"
+ resolved "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81"
+ integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==
+ dependencies:
+ "@types/connect" "*"
+ "@types/express" "*"
+ "@types/keygrip" "*"
+ "@types/node" "*"
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
+
+"@types/express-serve-static-core@^4.17.18":
+ version "4.17.31"
+ resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f"
+ integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@types/express@*":
+ version "4.17.14"
+ resolved "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c"
+ integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/http-assert@*":
+ version "1.5.3"
+ resolved "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661"
+ integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==
+
+"@types/http-errors@*":
+ version "1.8.2"
+ resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1"
+ integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==
+
+"@types/keygrip@*":
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
+ integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==
+
+"@types/koa-compose@*":
+ version "3.2.5"
+ resolved "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d"
+ integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==
+ dependencies:
+ "@types/koa" "*"
+
+"@types/koa@*", "@types/koa@^2.11.6":
+ version "2.13.5"
+ resolved "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61"
+ integrity sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==
+ dependencies:
+ "@types/accepts" "*"
+ "@types/content-disposition" "*"
+ "@types/cookies" "*"
+ "@types/http-assert" "*"
+ "@types/http-errors" "*"
+ "@types/keygrip" "*"
+ "@types/koa-compose" "*"
+ "@types/node" "*"
+
+"@types/mime@*":
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10"
+ integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==
+
+"@types/node@*":
+ version "18.8.3"
+ resolved "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz#ce750ab4017effa51aed6a7230651778d54e327c"
+ integrity sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==
+
+"@types/parse5@^6.0.1":
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb"
+ integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
+
+"@types/qs@*":
+ version "6.9.7"
+ resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/range-parser@*":
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+
+"@types/resolve@1.17.1":
+ version "1.17.1"
+ resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
+ integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/serve-static@*":
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155"
+ integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==
+ dependencies:
+ "@types/mime" "*"
+ "@types/node" "*"
+
+"@types/ws@^7.4.0":
+ version "7.4.7"
+ resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702"
+ integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==
+ dependencies:
+ "@types/node" "*"
+
+"@web/config-loader@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz#8325ea54f75ef2ee7166783e64e66936db25bff7"
+ integrity sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==
+ dependencies:
+ semver "^7.3.4"
+
+"@web/dev-server-core@^0.3.19":
+ version "0.3.19"
+ resolved "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz#b61f9a0b92351371347a758b30ba19e683c72e94"
+ integrity sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==
+ dependencies:
+ "@types/koa" "^2.11.6"
+ "@types/ws" "^7.4.0"
+ "@web/parse5-utils" "^1.2.0"
+ chokidar "^3.4.3"
+ clone "^2.1.2"
+ es-module-lexer "^1.0.0"
+ get-stream "^6.0.0"
+ is-stream "^2.0.0"
+ isbinaryfile "^4.0.6"
+ koa "^2.13.0"
+ koa-etag "^4.0.0"
+ koa-send "^5.0.1"
+ koa-static "^5.0.0"
+ lru-cache "^6.0.0"
+ mime-types "^2.1.27"
+ parse5 "^6.0.1"
+ picomatch "^2.2.2"
+ ws "^7.4.2"
+
+"@web/dev-server-rollup@^0.3.19":
+ version "0.3.19"
+ resolved "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.19.tgz#188f3a37bcc38f4dc1b208663b14ab2d17321a57"
+ integrity sha512-IwiwI+fyX0YuvAOldStlYJ+Zm/JfSCk9OSGIs7+fWbOYysEHwkEVvBwoPowaclSZA44Tobvqt+6ej9udbbZ/WQ==
+ dependencies:
+ "@rollup/plugin-node-resolve" "^13.0.4"
+ "@web/dev-server-core" "^0.3.19"
+ nanocolors "^0.2.1"
+ parse5 "^6.0.1"
+ rollup "^2.67.0"
+ whatwg-url "^11.0.0"
+
+"@web/dev-server@^0.1.34":
+ version "0.1.34"
+ resolved "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.34.tgz#4a94ea6dcf1c8081b97f5dd6d9790dc7e5c5039d"
+ integrity sha512-+te6iwxAQign1KyhHpkR/a3+5qw/Obg/XWCES2So6G5LcZ86zIKXbUpWAJuNOqiBV6eGwqEB1AozKr2Jj7gj/Q==
+ dependencies:
+ "@babel/code-frame" "^7.12.11"
+ "@types/command-line-args" "^5.0.0"
+ "@web/config-loader" "^0.1.3"
+ "@web/dev-server-core" "^0.3.19"
+ "@web/dev-server-rollup" "^0.3.19"
+ camelcase "^6.2.0"
+ command-line-args "^5.1.1"
+ command-line-usage "^6.1.1"
+ debounce "^1.2.0"
+ deepmerge "^4.2.2"
+ ip "^1.1.5"
+ nanocolors "^0.2.1"
+ open "^8.0.2"
+ portfinder "^1.0.28"
+
+"@web/parse5-utils@^1.2.0":
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.0.tgz#e2e9e98b31a4ca948309f74891bda8d77399f6bd"
+ integrity sha512-Pgkx3ECc8EgXSlS5EyrgzSOoUbM6P8OKS471HLAyvOBcP1NCBn0to4RN/OaKASGq8qa3j+lPX9H14uA5AHEnQg==
+ dependencies:
+ "@types/parse5" "^6.0.1"
+ parse5 "^6.0.1"
+
+accepts@^1.3.5:
+ version "1.3.8"
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+array-back@^3.0.1, array-back@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
+ integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
+
+array-back@^4.0.1, array-back@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e"
+ integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==
+
+async@^2.6.4:
+ version "2.6.4"
+ resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
+ integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
+ dependencies:
+ lodash "^4.17.14"
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+builtin-modules@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
+ integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
+
+cache-content-type@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c"
+ integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==
+ dependencies:
+ mime-types "^2.1.18"
+ ylru "^1.2.0"
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+chalk@^2.0.0, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^3.4.3:
+ version "3.5.3"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ 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"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+clone@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+command-line-args@^5.1.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e"
+ integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
+ dependencies:
+ array-back "^3.1.0"
+ find-replace "^3.0.0"
+ lodash.camelcase "^4.3.0"
+ typical "^4.0.0"
+
+command-line-usage@^6.1.1:
+ version "6.1.3"
+ resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957"
+ integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==
+ dependencies:
+ array-back "^4.0.2"
+ chalk "^2.4.2"
+ table-layout "^1.0.2"
+ typical "^5.2.0"
+
+content-disposition@~0.5.2:
+ version "0.5.4"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+cookies@~0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
+ integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
+ dependencies:
+ depd "~2.0.0"
+ keygrip "~1.1.0"
+
+debounce@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
+ integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
+
+debug@^3.1.0, debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.1, debug@^4.3.2:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+deep-equal@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+ integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==
+
+deep-extend@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deepmerge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+ integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+define-lazy-prop@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+ integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+depd@^2.0.0, depd@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+
+destroy@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+encodeurl@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+es-module-lexer@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.0.3.tgz#f0d8d35b36d13024110000d5e6fadc8eeaeb66b8"
+ integrity sha512-iC67eXHToclrlVhQfpRawDiF8D8sQxNxmbqw5oebegOaJkyx/w9C/k57/5e6yJR2zIByRt9OXdqX50DV2t6ZKw==
+
+escape-html@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+estree-walker@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
+ integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
+
+etag@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-replace@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
+ integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
+ dependencies:
+ array-back "^3.0.1"
+
+fresh@~0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-symbols@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+http-assert@^1.3.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f"
+ integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==
+ dependencies:
+ deep-equal "~1.0.1"
+ http-errors "~1.8.0"
+
+http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
+ integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.1"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
+
+inherits@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ip@^1.1.5:
+ version "1.1.8"
+ resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48"
+ integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-builtin-module@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0"
+ integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==
+ dependencies:
+ builtin-modules "^3.3.0"
+
+is-core-module@^2.9.0:
+ version "2.10.0"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
+ integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
+ dependencies:
+ has "^1.0.3"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-generator-function@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+ integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isbinaryfile@^4.0.6:
+ version "4.0.10"
+ resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3"
+ integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+keygrip@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
+ integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
+ dependencies:
+ tsscmp "1.0.6"
+
+koa-compose@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+ integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
+
+koa-convert@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5"
+ integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==
+ dependencies:
+ co "^4.6.0"
+ koa-compose "^4.1.0"
+
+koa-etag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz#2c2bb7ae69ca1ac6ced09ba28dcb78523c810414"
+ integrity sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==
+ dependencies:
+ etag "^1.8.1"
+
+koa-send@^5.0.0, koa-send@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79"
+ integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==
+ dependencies:
+ debug "^4.1.1"
+ http-errors "^1.7.3"
+ resolve-path "^1.4.0"
+
+koa-static@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943"
+ integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==
+ dependencies:
+ debug "^3.1.0"
+ koa-send "^5.0.0"
+
+koa@^2.13.0:
+ version "2.13.4"
+ resolved "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e"
+ integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==
+ dependencies:
+ accepts "^1.3.5"
+ cache-content-type "^1.0.0"
+ content-disposition "~0.5.2"
+ content-type "^1.0.4"
+ cookies "~0.8.0"
+ debug "^4.3.2"
+ delegates "^1.0.0"
+ depd "^2.0.0"
+ destroy "^1.0.4"
+ encodeurl "^1.0.2"
+ escape-html "^1.0.3"
+ fresh "~0.5.2"
+ http-assert "^1.3.0"
+ http-errors "^1.6.3"
+ is-generator-function "^1.0.7"
+ koa-compose "^4.1.0"
+ koa-convert "^2.0.0"
+ on-finished "^2.3.0"
+ only "~0.0.2"
+ parseurl "^1.3.2"
+ statuses "^1.5.0"
+ type-is "^1.6.16"
+ vary "^1.1.2"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash@^4.17.14:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.18, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+mkdirp@^0.5.6:
+ version "0.5.6"
+ resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanocolors@^0.2.1:
+ version "0.2.13"
+ resolved "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz#dfd1ed0bfab05e9fe540eb6874525f0a1684099b"
+ integrity sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+on-finished@^2.3.0:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+only@~0.0.2:
+ version "0.0.2"
+ resolved "https://registry.npmjs.org/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+ integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==
+
+open@^8.0.2:
+ version "8.4.0"
+ resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
+ integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==
+ dependencies:
+ define-lazy-prop "^2.0.0"
+ is-docker "^2.1.1"
+ is-wsl "^2.2.0"
+
+parse5@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+parseurl@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-is-absolute@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+portfinder@^1.0.28:
+ version "1.0.32"
+ resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81"
+ integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==
+ dependencies:
+ async "^2.6.4"
+ debug "^3.2.7"
+ mkdirp "^0.5.6"
+
+punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+reduce-flatten@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27"
+ integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==
+
+resolve-path@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
+ integrity sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==
+ dependencies:
+ http-errors "~1.6.2"
+ path-is-absolute "1.0.1"
+
+resolve@^1.19.0:
+ version "1.22.1"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^2.67.0:
+ version "2.79.1"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
+ integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+safe-buffer@5.2.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+semver@^7.3.4:
+ version "7.3.8"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+ integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+ dependencies:
+ lru-cache "^6.0.0"
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+table-layout@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04"
+ integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==
+ dependencies:
+ array-back "^4.0.1"
+ deep-extend "~0.6.0"
+ typical "^5.2.0"
+ wordwrapjs "^4.0.0"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tr46@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
+ integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
+ dependencies:
+ punycode "^2.1.1"
+
+tsscmp@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
+ integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+
+type-is@^1.6.16:
+ version "1.6.18"
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typical@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4"
+ integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
+
+typical@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066"
+ integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==
+
+vary@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+whatwg-url@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
+ integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
+ dependencies:
+ tr46 "^3.0.0"
+ webidl-conversions "^7.0.0"
+
+wordwrapjs@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f"
+ integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==
+ dependencies:
+ reduce-flatten "^2.0.0"
+ typical "^5.2.0"
+
+ws@^7.4.2:
+ version "7.5.9"
+ resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
+ integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+ylru@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785"
+ integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==