diff --git a/apple-touch-icon.png b/apple-touch-icon.png
new file mode 100644
index 0000000..c389bc0
Binary files /dev/null and b/apple-touch-icon.png differ
diff --git a/assets/css/panel.css b/assets/css/panel.css
index 658eb3d..3b53cbb 100644
--- a/assets/css/panel.css
+++ b/assets/css/panel.css
@@ -8,3 +8,18 @@
.k-panel-menu-button[aria-current] * {
color: #000;
}
+
+.k-panel[data-template="year"] .k-list-items .k-item:first-child {
+ margin-bottom: 2rem;
+}
+.k-panel[data-template="year"] .k-list-items::before {
+ content: "Texte princeps";
+ display: block;
+ padding: 0.5rem;
+ padding-bottom: 0.7rem;
+ border-radius: var(--rounded-md) var(--rounded-md) 0 0;
+ transform: translateY(0.3rem);
+
+ background-color: #000;
+ color: #fff;
+}
diff --git a/assets/css/src/article.css b/assets/css/src/article.css
index 7398007..191b259 100644
--- a/assets/css/src/article.css
+++ b/assets/css/src/article.css
@@ -1,8 +1,39 @@
article #main-content {
- max-width: calc(18 * var(--unit--horizontal));
scroll-margin-block-start: calc(var(--unit--vertical) * 6);
- margin-top: calc(var(--unit--vertical) * 2);
padding-bottom: calc(var(--unit--vertical) * 2);
+ margin-top: calc(2 * var(--unit--vertical));
+}
+
+#main-content .texts {
+ margin-top: calc(2 * var(--unit--vertical));
+}
+
+#main-content .see-more {
+ margin-top: calc(var(--unit--vertical) * 0.5);
+}
+
+[data-template="year"] article > h1 {
+ margin-bottom: 0;
+}
+
+article #main-content #chapo::after {
+ content: "";
+ display: block;
+ margin-top: calc(2 * var(--unit--vertical));
+ margin-bottom: calc(4 * var(--unit--vertical));
+
+ width: 100%;
+ height: 1px;
+ background-color: #fff;
+}
+
+article #main-content li:not(.text) {
+ list-style-type: inherit;
+}
+
+article h3 {
+ margin-top: calc(3 * var(--unit--vertical));
+ margin-bottom: calc(1 * var(--unit--vertical));
}
@media screen and (min-width: 640px) {
diff --git a/assets/css/src/footer.css b/assets/css/src/footer.css
index 0376ecf..5c92f4d 100644
--- a/assets/css/src/footer.css
+++ b/assets/css/src/footer.css
@@ -1,36 +1,72 @@
#main-footer {
position: fixed;
bottom: 0;
- width: 100%;
box-sizing: border-box;
- padding: var(--unit--horizontal);
+
+ border-bottom: 0;
}
+
[data-template="home"] #main-footer {
position: fixed;
left: 0;
bottom: 0;
}
-#main-footer ul {
- display: flex;
- justify-content: center;
- gap: calc(2 * var(--unit--horizontal));
+#main-footer li:not(.open-nav-wrapper) {
+ display: none;
}
-#main-footer a {
- text-shadow: 0 0 2px #000;
- -moz-text-shadow: 0 0 2px #000;
- -webkit-text-shadow: 0 0 2px #000;
+#main-footer button.open-nav {
+ transform: translateY(-1px);
+}
+
+[data-template="home"] .title-wrapper button.open-nav {
+ display: inline-block !important;
+}
+
+@media screen and (max-width: 640px) {
+ #main-footer .open-nav {
+ box-sizing: border-box;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ width: 100%;
+ outline: none;
+ border-top: 1px solid #fff;
+ font-size: var(--font-size-m);
+ background-color: #000;
+ padding: calc(var(--unit--vertical) / 2) var(--unit--horizontal);
+ margin-bottom: env(safe-area-inset-bottom);
+ }
}
@media screen and (min-width: 640px) {
+ #main-footer li {
+ display: block !important;
+ }
#main-footer {
position: fixed;
left: 0;
bottom: 0;
width: var(--body-padding);
+ background-color: transparent;
+ padding: var(--unit--vertical) var(--unit--horizontal);
}
#main-footer ul {
display: block;
}
+
+ #main-footer button.open-nav {
+ margin-bottom: var(--unit--vertical);
+ }
+
+ [data-template="home"] #main-footer .open-nav-wrapper {
+ display: none !important;
+ }
+
+ .open-nav-wrapper {
+ padding: 0;
+ border: none;
+ background-color: transparent;
+ }
}
diff --git a/assets/css/src/generic.css b/assets/css/src/generic.css
index df55578..9c30da6 100644
--- a/assets/css/src/generic.css
+++ b/assets/css/src/generic.css
@@ -74,6 +74,18 @@ body {
opacity: var(--opacity-light);
}
+.footnote::before {
+ content: "[";
+}
+.footnote::after {
+ content: "]";
+}
+
+/* ================= COLORS ================= */
+.texts .text {
+ margin-bottom: var(--unit--vertical);
+}
+
/* ================= COLORS ================= */
.color {
color: var(--color);
@@ -84,7 +96,8 @@ body {
/* ================= BUTTONS ================= */
.toggle-btn--left::after,
-button.plus::after {
+button.plus::after,
+button.less::after {
margin-left: var(--unit--horizontal);
}
@@ -92,7 +105,8 @@ button.plus::after {
button.plus::after {
content: "+";
}
-.toggle-btn--left.open::after {
+.toggle-btn--left.open::after,
+button.less::after {
content: "-";
}
.toggle-btn--right::before {
@@ -108,3 +122,19 @@ button.plus::after {
.transition {
transition: all 0.5s var(--curve-sine);
}
+
+.short {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 5;
+ overflow: hidden;
+
+ /* Do not remove : required not to crop letters descenders */
+ padding-bottom: 0.16rem;
+ height: 8.5rem;
+}
+
+.see-more {
+ width: 100%;
+ margin-top: calc(var(--unit--vertical) / 2);
+}
diff --git a/assets/css/src/grid.css b/assets/css/src/grid.css
index fe61cc6..28594cf 100644
--- a/assets/css/src/grid.css
+++ b/assets/css/src/grid.css
@@ -13,13 +13,6 @@ body.full-width #main-content {
box-sizing: border-box;
}
-.grid {
- display: grid;
- grid-template-columns: repeat(39, 1fr);
- column-gap: var(--unit--horizontal);
- margin-bottom: calc(var(--unit--vertical) * 2);
-}
-
.grid .column {
grid-column: span var(--span);
}
@@ -27,3 +20,26 @@ body.full-width #main-content {
.grid[data-columns="1"] .column {
grid-column: 11 / span 20;
}
+
+[data-template="grid"] main #main-content {
+ margin-left: inherit;
+}
+
+@media screen and (max-width: 640px) {
+ .grid .column:not(:last-child) {
+ margin-bottom: calc(2 * var(--unit--vertical));
+ }
+}
+
+@media screen and (min-width: 640px) {
+ [data-template="grid"] main #main-content {
+ margin-left: calc(0px - calc(4 * var(--unit--horizontal)));
+ }
+
+ [data-template="grid"] .grid {
+ display: grid;
+ grid-template-columns: repeat(39, 1fr);
+ column-gap: var(--unit--horizontal);
+ margin-bottom: calc(var(--unit--vertical) * 2);
+ }
+}
diff --git a/assets/css/src/header.css b/assets/css/src/header.css
index 09bf056..f1d7518 100644
--- a/assets/css/src/header.css
+++ b/assets/css/src/header.css
@@ -1,12 +1,29 @@
+main {
+ pointer-events: none;
+}
+
+main article > div {
+ pointer-events: all;
+}
+
+.page-cover > * {
+ pointer-events: all;
+}
+
#main-header {
position: fixed;
+ z-index: 2;
box-sizing: border-box;
width: 100vw;
padding-top: calc(var(--unit--vertical) / 2);
}
+[data-template="home"] #main-header {
+ pointer-events: none;
+}
+
#logo * {
- font-size: 26.65vw;
+ font-size: 25.3vw;
font-weight: var(--font-weight-extra-bold);
}
@@ -14,7 +31,7 @@
height: 20vw;
width: 100%;
box-sizing: border-box;
- padding-right: 1vw;
+ padding-right: 3vw;
display: flex;
justify-content: flex-end;
align-items: center;
@@ -24,6 +41,10 @@
text-align: right;
}
+#logo #actuel {
+ font-weight: 550;
+}
+
#logo #actuel,
#logo #inactuel {
mix-blend-mode: difference;
@@ -35,82 +56,91 @@
#main-header.minimized #inactuel {
margin-top: -20vw;
- transform: translateX(-2px) translateY(-2px);
+ transform: translateX(-1px) translateY(-1px);
}
#main-header.minimized #inactuel:not([data-template="home"] *) {
transform: translateX(-1px) translateY(-1px) !important;
}
+.page-cover,
+article > h1 {
+ padding-top: calc(50vw);
+}
+
.page-cover {
position: relative;
height: 100svh;
box-sizing: border-box;
- padding-top: calc(var(--unit--vertical-relative) * 9);
display: flex;
flex-direction: column;
}
+[data-template="home"] .page-cover {
+ padding-top: calc(42.5vw);
+}
+
+.page-cover .title-wrapper h1 {
+ margin-bottom: calc(0.255 * var(--unit--vertical));
+}
+
.page-cover .text-wrapper {
height: 100%;
overflow: auto;
}
-/* ================= ENTRY BTNS ================= */
-#entry-btns {
- position: sticky;
- position: -webkit-sticky;
- top: calc(var(--unit--vertical) * 4);
- height: var(--entry-btns-height);
- display: flex;
- justify-content: space-between;
-}
-[data-template="info"] #entry-btns {
- top: calc(var(--unit--vertical) * 4);
-}
-
-[data-template="home"] .entry-btn {
- align-items: start;
-}
-
button.toggle.left::after,
button.toggle.right::before {
transition: all 0.5s var(--curve-sine);
content: "+";
}
-#entry-btns.minimized {
- color: #000;
-}
-#entry-btns.minimized .entry-btn--left::before,
-#entry-btns.minimized .entry-btn--right::after {
- background-color: var(--color-secondary);
+.page-cover .links {
+ position: absolute;
+ bottom: 8px;
+ width: 100%;
+ box-sizing: border-box;
}
-#entry-btns.minimized .entry-btn::before,
-#entry-btns.minimized .entry-btn::after {
- font-weight: bold;
+.page-cover .links li {
+ display: inline-block;
+ margin-right: var(--unit--horizontal);
}
-#entry-btns.minimized .entry-btn--left {
- padding-right: 4px;
- margin-left: calc(-4px - var(--width));
+[data-template="author"] .page-cover,
+[data-template="category"] .page-cover,
+[data-template="year"] .page-cover,
+[data-template="email"] .page-cover,
+[data-template="error"] .page-cover,
+[data-template="info"] .page-cover {
+ height: initial !important;
}
-#entry-btns.minimized .entry-btn--right {
- padding-left: 4px;
- margin-right: calc(-4px - var(--width));
+[data-template="author"] .page-cover .links,
+[data-template="category"] .page-cover .links,
+[data-template="year"] .page-cover .links,
+[data-template="email"] .page-cover .links,
+[data-template="error"] .page-cover .links,
+[data-template="info"] .page-cover .links {
+ display: none;
}
@media screen and (min-width: 640px) {
body:not([data-template="home"]) #main-header {
width: var(--body-padding);
}
+ #logo * {
+ font-size: 26.65vw;
+ }
+ #logo span {
+ padding-right: 1vw;
+ }
body:not([data-template="home"]) #logo * {
- font-size: 6vw;
+ font-size: 5.6vw;
}
body:not([data-template="home"]) #logo span {
height: 5vw;
+ padding-right: calc(var(--unit--horizontal) - 0.3vw);
}
body:not([data-template="home"]) #main-header.minimized #inactuel {
margin-top: -4.9vw;
@@ -123,20 +153,21 @@ button.toggle.right::before {
[data-template="category"] .page-cover
) {
height: 100vh;
- padding: calc(10 * var(--unit--vertical)) 0;
- padding-top: calc(var(--unit--vertical) * 8);
}
+
+ .page-cover,
+ article > h1 {
+ padding-top: 15vw;
+ }
+ .page-cover {
+ min-height: calc(22 * var(--unit--vertical));
+ }
+
[data-template="home"] .page-cover {
padding-top: calc(42.5vw) !important;
}
- [data-template="author"] .page-cover,
- [data-template="category"] .page-cover,
- [data-template="year"] .page-cover {
- height: initial;
- }
-
- #entry-btns {
+ .page-cover .links {
display: none;
}
}
diff --git a/assets/css/src/home.css b/assets/css/src/home.css
index 8b13789..ea18cf4 100644
--- a/assets/css/src/home.css
+++ b/assets/css/src/home.css
@@ -1 +1,9 @@
+.main-edito-btn {
+ display: inline-block;
+ margin-right: calc(2 * var(--unit--horizontal));
+}
+#main-edito {
+ margin-top: calc(var(--unit--vertical) * 4);
+ scroll-margin-block-start: 25vw;
+}
diff --git a/assets/css/src/html.css b/assets/css/src/html.css
index 3f2e157..6b6e1cf 100644
--- a/assets/css/src/html.css
+++ b/assets/css/src/html.css
@@ -8,10 +8,11 @@ body {
main {
padding: 0 var(--unit--horizontal);
+ padding-bottom: calc(2 * var(--unit--vertical)) !important;
}
-[data-template="info"] main {
+/* [data-template="info"] main {
margin-top: calc(var(--unit--vertical) * 2);
-}
+} */
hr {
height: 1px;
@@ -38,7 +39,7 @@ html {
* {
scrollbar-width: thin;
- scrollbar-color: rgba(255, 255, 255, 0.25) transparent;
+ scrollbar-color: rgba(255, 255, 255) transparent;
}
/* Works on Chrome, Edge, and Safari */
@@ -53,7 +54,7 @@ html {
}
*::-webkit-scrollbar-thumb {
- background-color: rgba(255, 255, 255, 0.25);
+ background-color: rgba(255, 255, 255);
border-radius: 0px;
border: none;
}
@@ -69,6 +70,7 @@ html {
}
main {
- padding: 0 var(--body-padding);
+ width: min(60vw, 45rem);
+ padding-left: var(--body-padding);
}
}
diff --git a/assets/css/src/nav.css b/assets/css/src/nav.css
index e243dcc..976fa24 100644
--- a/assets/css/src/nav.css
+++ b/assets/css/src/nav.css
@@ -1,4 +1,3 @@
-/* ================= PANELS ================= */
#nav-overlay {
position: fixed;
inset: 0;
@@ -105,6 +104,9 @@ button.search__icon {
padding: var(--unit--vertical) var(--unit--horizontal);
}
+footer {
+ width: 100%;
+}
.panel-close {
position: fixed;
box-sizing: border-box;
@@ -134,15 +136,15 @@ button.search__icon {
}
/* ================= YEARS ================= */
+.panel__collection .panel__item:last-child {
+ margin-bottom: 6rem;
+}
.panel-item-content__edito {
margin-bottom: calc(var(--unit--vertical) / 2);
}
-.panel-item-content__edito.short {
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 5;
- overflow: hidden;
+.panel-item-content__edito p:not(:last-child) {
+ margin-bottom: var(--unit--vertical);
}
button.see-more {
@@ -154,43 +156,37 @@ button.see-more {
}
/* ================= TEXT ITEM ================= */
-.text {
- margin-bottom: var(--unit--vertical);
+.panel .text:first-child,
+.panel .text:last-child {
+ margin-bottom: calc(var(--unit--vertical) * 2);
+}
+
+.panel__collection--years .text:first-child .text__title {
+ display: inline-block;
+ padding-left: var(--unit--horizontal);
+}
+
+.panel .text__subtitle {
+ margin-bottom: calc(var(--unit--vertical) / 4);
+}
+
+.panel__collection--years .text:first-child .text__infos {
+ padding-left: var(--unit--horizontal);
+}
+.panel__collection--years .text:first-child .text__infos::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ width: 1px;
+ background-color: #fff;
}
@media screen and (min-width: 640px) {
nav.panel {
width: 40rem;
}
- #subscribe-btn-wrapper {
- height: 2.5rem;
- margin-bottom: 0.2rem;
- }
-
- #subscribe-form {
- position: relative;
- width: fit-content;
- }
-
- #subscribe-form input {
- background-color: transparent;
- border: none;
- border-bottom: 1px solid #fff;
- box-sizing: border-box;
- padding-bottom: 0.3rem;
- padding-right: 2rem;
- color: #fff;
- width: 15rem;
- }
- #subscribe-form input:focus-visible {
- outline: none;
- }
- #subscribe-form button[type="submit"] {
- color: #fff;
- position: absolute;
- top: 0;
- right: 0;
- }
.panel {
z-index: 4;
diff --git a/assets/css/src/newsletter.css b/assets/css/src/newsletter.css
new file mode 100644
index 0000000..9910c30
--- /dev/null
+++ b/assets/css/src/newsletter.css
@@ -0,0 +1,29 @@
+#subscribe-btn-wrapper {
+ height: 2.5rem;
+ margin-bottom: 0.2rem;
+}
+
+#subscribe-form {
+ position: relative;
+ width: fit-content;
+}
+
+#subscribe-form input {
+ background-color: transparent;
+ border: none;
+ border-bottom: 1px solid #fff;
+ box-sizing: border-box;
+ padding-bottom: 0.3rem;
+ padding-right: 2rem;
+ color: #fff;
+ width: 15rem;
+}
+#subscribe-form input:focus-visible {
+ outline: none;
+}
+#subscribe-form button[type="submit"] {
+ color: #fff;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
diff --git a/assets/css/src/tabs.css b/assets/css/src/tabs.css
index 9581fc3..358cd33 100644
--- a/assets/css/src/tabs.css
+++ b/assets/css/src/tabs.css
@@ -76,18 +76,6 @@ button.toggle.right.open::before {
border: none;
}
-.texts__year.short .year__edito {
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 5;
- overflow: hidden;
-}
-
-.texts__year .see-more {
- width: 100%;
- margin-top: calc(var(--unit--vertical) / 2);
-}
-
@media screen and (min-width: 640px) {
[data-template="home"] #tabs {
margin-top: calc(0px - (10 * var(--unit--vertical)));
diff --git a/assets/css/src/texts.css b/assets/css/src/texts.css
index 9459a0a..6bdb636 100644
--- a/assets/css/src/texts.css
+++ b/assets/css/src/texts.css
@@ -28,12 +28,12 @@ h4 *,
h5,
h5 *,
p,
-p * {
+p *:not(strong) {
font-weight: var(--font-weight-light);
line-height: 1;
}
-h2 {
+h1 {
font-size: var(--font-size-xl);
}
@@ -87,11 +87,11 @@ button,
}
.fs-l {
font-size: var(--font-size-l) !important;
- line-height: var(--unit--vertical);
+ line-height: calc(var(--unit--vertical) * 1.3);
}
.fs-xl {
font-size: var(--font-size-xl) !important;
- line-height: calc(var(--unit--vertical) * 1.5) !important;
+ line-height: calc(var(--unit--vertical) * 2) !important;
}
.fs-xxl {
font-size: var(--font-size-xxl) !important;
@@ -137,6 +137,14 @@ button {
align-items: center;
}
+a {
+ word-break: break-word;
+}
+
+a > * {
+ word-break: normal;
+}
+
a * {
transition: font 0.2s ease-in-out;
}
@@ -166,14 +174,29 @@ article p:not(:last-child) {
.footnote,
.footnote * {
+ font-style: normal !important;
scroll-margin-block-start: calc(var(--unit--vertical) * 6);
- color: var(--color-secondary);
+ color: var(--color-primary);
text-decoration: none !important;
font-weight: var(--font-weight-bold) !important;
}
+.footnote sup {
+ all: unset;
+}
+
+.footnote:focus-visible,
+.footnote:target {
+ text-decoration: underline !important;
+ text-underline-offset: 0.5rem;
+}
+
@media screen and (min-width: 640px) {
.title-center {
margin-left: calc(2 * var(--unit--horizontal));
}
+
+ .fs-l {
+ line-height: calc(var(--unit--vertical) * 1.5);
+ }
}
diff --git a/assets/css/style.css b/assets/css/style.css
index 1bbc632..cfc8277 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -8,6 +8,7 @@
@import url("src/virtual.css");
@import url("src/home.css");
@import url("src/grid.css");
+@import url("src/newsletter.css");
@import url("src/footer.css");
@import url("src/print.css");
:root {
diff --git a/assets/dist/script.js b/assets/dist/script.js
index 987e69e..1a85ce6 100644
--- a/assets/dist/script.js
+++ b/assets/dist/script.js
@@ -1,63 +1,181 @@
"use strict";
-var remFactor = 16;
-var verticalUnit = 1.3 * remFactor;
-function toggleTab(data, tab) {
- if (data.activeTab === tab) {
- window.scrollTo({
- top: 0,
- behavior: "smooth"
- });
- setTimeout(function () {
- data.isOpen = false;
- data.activeTab = "";
- }, 500);
- } else {
- data.activeTab = tab;
- data.isOpen = true;
- scrollToElem(".active-tab");
- }
+var verticalUnit = getUnit("--unit--vertical");
+function getUnit(id) {
+ var remFactor = 16;
+ var rawUnit = getComputedStyle(document.documentElement).getPropertyValue(id) || "1.7rem";
+ var remUnit = parseFloat(rawUnit);
+ var pxUnit = remUnit * remFactor;
+ return pxUnit;
}
-function scrollToElem(selector) {
- document.querySelector(".active-tab").scrollTop = 0;
- setTimeout(function () {
- var yOffset = -7 * verticalUnit;
- var elem = document.querySelector(selector);
- var top = elem.getBoundingClientRect().top;
- window.scrollTo({
- top: top + window.scrollY + yOffset,
- behavior: "smooth"
- });
- }, 100);
+
+// Throttle found here : https://gist.github.com/ionurboz/51b505ee3281cd713747b4a84d69f434
+function throttle(func, wait, options) {
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ if (!options) options = {};
+ var later = function later() {
+ previous = options.leading === false ? 0 : Date.now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+ return function () {
+ var now = Date.now();
+ if (!previous && options.leading === false) previous = now;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
}
function setWindowHeightFactor() {
var windowHeight = window.innerHeight;
var min = 650;
var delta = windowHeight - min;
var factor = roundToNearestHalf(delta / 300) + 1;
- var head = document.querySelector("head");
- var style = document.createElement("style");
- style.innerText = ":root { --window-height-factor:".concat(factor, " }");
- head.appendChild(style);
+ document.querySelector(":root").style.setProperty("--window-height-factor", factor);
}
function roundToNearestHalf(num) {
var round = Math.round(num * 2) / 2;
return Math.max(round, 0);
}
-setWindowHeightFactor();
-document.addEventListener("DOMContentLoaded", function () {
- function toggleLogoState() {
- var scrollY = window.scrollY || window.pageYOffset;
- if (scrollY > 10) {
- document.querySelector("#main-header").classList.add("minimized");
- } else {
- document.querySelector("#main-header").classList.remove("minimized");
- }
+function toggleLogoState() {
+ var scrollY = window.scrollY || window.pageYOffset;
+ if (scrollY > 10) {
+ document.querySelector("#main-header").classList.add("minimized");
+ } else {
+ document.querySelector("#main-header").classList.remove("minimized");
}
+}
+function toggleFooterState() {
+ if (scrollY > 90) {
+ document.querySelector("#main-footer").classList.add("main-footer--background");
+ } else {
+ document.querySelector("#main-footer").classList.remove("main-footer--background");
+ }
+}
+function fixFootNotes() {
+ var footnotes = document.querySelectorAll('a[href^="#sdfootnote"]');
+ footnotes.forEach(function (footnote) {
+ var href = footnote.href;
+ footnote.classList.add("footnote");
+ if (href.includes("sym")) {
+ footnote.id = footnote.hash.replace("sym", "anc").replace("#", "");
+ } else if (href.includes("anc")) {
+ footnote.id = footnote.hash.replace("anc", "sym").replace("#", "");
+ }
+ });
+}
+function removeAccents(str) {
+ var from = "áäâàãåčçćďéěëèêẽĕȇíìîïňñóöòôõøðřŕšťúůüùûýÿžþÞĐđ߯a·/_,:;";
+ var to = "aaaaaacccdeeeeeeeeiiiinnooooooorrstuuuuuyyzbBDdBAa------";
+ for (var i = 0, l = from.length; i < l; i++) {
+ str = str.replace(new RegExp(from.charAt(i), "g"), to.charAt(i));
+ }
+ return str;
+}
+function slugify(str) {
+ return removeAccents(str.toLowerCase());
+}
+function subscribe(event) {
+ event.preventDefault();
+ var emailInput = document.querySelector("#subscribe-form input");
+ if (emailInput.value.toLowerCase().match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
+ var header = {
+ method: "POST",
+ body: JSON.stringify(emailInput.value)
+ };
+ fetch("/subscribe.json", header).then(function (res) {
+ return res.json();
+ }).then(function (data) {
+ var formNode = emailInput.parentNode.parentNode;
+ formNode.outerHTML = "
" + data.message + "
";
+ });
+ } else {
+ emailInput.value = "E-mail invalide. Recommencez.";
+ }
+}
+var panelNav = document.querySelector(".panel");
+var navOverlay = document.querySelector("#nav-overlay");
+var openNavBtn = document.querySelector("button.open-nav");
+var closeNavBtn = document.querySelector(".panel-close");
+function closeNav() {
+ panelNav.classList.remove("panel--visible");
+ navOverlay.classList.remove("nav-overlay--visible");
+ document.body.classList.remove("no-scroll");
+}
+document.addEventListener("DOMContentLoaded", function () {
+ ragadjust("h1, h2, h4, h5", ["all"]);
window.window.scrollTo({
top: 0
});
- window.addEventListener("scroll", function () {
+ var handleScroll = throttle(function () {
toggleLogoState();
+ if (window.innerWidth <= 680) {
+ toggleFooterState();
+ }
+ }, 100);
+ window.addEventListener("scroll", handleScroll);
+ setWindowHeightFactor();
+ window.addEventListener("resize", function () {
+ setWindowHeightFactor();
+ });
+ fixFootNotes();
+ window.addEventListener("keyup", function (event) {
+ if (event.key === "Escape") {
+ closeNav();
+ }
+ });
+ document.querySelectorAll(".panel").forEach(function (panel) {
+ panel.addEventListener("click", function (event) {
+ event.stopPropagation();
+ });
+ });
+ var navSortBtns = document.querySelectorAll("nav .sort-btn");
+ var navSections = document.querySelectorAll(".panel__all-texts, .panel__collection");
+ navSortBtns.forEach(function (sortBtn) {
+ sortBtn.addEventListener("click", function () {
+ navSortBtns.forEach(function (btn) {
+ return btn.classList.remove("active");
+ });
+ sortBtn.classList.add("active");
+ var sections = {
+ "sort-btn--all": ".panel__all-texts",
+ "sort-btn--years": ".panel__collection--years",
+ "sort-btn--categories": ".panel__collection--categories"
+ };
+ navSections.forEach(function (navSection) {
+ return navSection.classList.add("hidden");
+ });
+ Object.keys(sections).forEach(function (key) {
+ if (sortBtn.classList.contains(key)) {
+ document.querySelector(sections[key]).classList.remove("hidden");
+ }
+ });
+ });
+ });
+ openNavBtn.addEventListener("click", function () {
+ panelNav.classList.add("panel--visible");
+ navOverlay.classList.add("nav-overlay--visible");
+ document.body.classList.add("no-scroll");
+ });
+ closeNavBtn.addEventListener("click", function () {
+ closeNav();
+ });
+ navOverlay.addEventListener("click", function () {
+ closeNav();
});
});
\ No newline at end of file
diff --git a/assets/dist/style.css b/assets/dist/style.css
index 594e110..d0d607c 100644
--- a/assets/dist/style.css
+++ b/assets/dist/style.css
@@ -1,474 +1 @@
-body,
-h1,
-h2,
-h3,
-h4,
-h5,
-html,
-p,
-ul {
- margin: 0;
- padding: 0;
-}
-button {
- background: none;
- border: none;
- padding: 0;
- font: inherit;
- cursor: pointer;
- outline: inherit;
-}
-a,
-button {
- color: inherit;
-}
-a {
- text-decoration: none;
-}
-li {
- list-style-type: none;
-}
-:root {
- --color-background: #000;
- --color-primary: #fff;
- --color-primary--transparent: hsla(0, 0%, 100%, 0.86);
- --color-secondary: rgba(120, 171, 150, 0.86);
- --color-secondary--light: rgba(119, 177, 157, 0.2);
- --color-secondary--x-light: rgba(119, 177, 157, 0.1);
- --unit--horizontal: 5vw;
- --unit--vertical: 1.7rem;
- --unit--vertical-relative: calc(
- var(--unit--vertical) * var(--window-height-factor)
- );
- --font-size-s: 0.8rem;
- --font-size-m: calc(var(--font-size-s) * 1.5);
- --font-size-l: calc(var(--font-size-m) * 1.5);
- --font-size-xl: calc(var(--font-size-l) * 1.5);
- --font-size-xxl: calc(var(--font-size-xl) * 1.5);
- --font-weight-light: 200;
- --font-weight-bold: 400;
- --font-weight-extra-bold: 550;
-}
-@media screen and (min-width: 640px) {
- :root {
- --color-background: #000;
- --color-primary: #fff;
- --color-primary--transparent: hsla(0, 0%, 100%, 0.86);
- --color-secondary: rgba(120, 171, 150, 0.86);
- --color-secondary--light: rgba(119, 177, 157, 0.25);
- --color-secondary--x-light: rgba(119, 177, 157, 0.15);
- --unit--horizontal: 5vw;
- --unit--vertical: 1.7rem;
- --font-size-s: 0.9rem;
- --font-size-m: calc(var(--font-size-s) * 1.5);
- --font-size-l: calc(var(--font-size-m) * 1.5);
- --font-size-xl: calc(var(--font-size-l) * 1.5);
- --font-size-xxl: calc(var(--font-size-xl) * 1.5);
- --font-weight-light: 200;
- --font-weight-bold: 400;
- --font-weight-extra-bold: 550;
- }
-}
-body {
- box-sizing: border-box;
- padding: 0 var(--unit--horizontal);
- background-color: var(--color-background);
- color: var(--color-primary);
-}
-body,
-main {
- position: relative;
-}
-hr {
- height: calc(var(--unit--vertical) / 2);
- border: none;
- background-color: var(--color-primary);
- width: calc(var(--unit--horizontal) * 4);
- margin: calc(var(--unit--vertical) * 2) calc(var(--unit--horizontal));
-}
-nav hr {
- background-color: var(--color-background);
- margin-left: 0;
-}
-body,
-html {
- scroll-behavior: smooth;
-}
-* {
- scrollbar-width: thin;
- scrollbar-color: transparent transparent;
-}
-::-webkit-scrollbar {
- width: 6px;
- height: 6px;
-}
-::-webkit-scrollbar-track {
- background: transparent;
-}
-::-webkit-scrollbar-thumb {
- background-color: transparent;
- border-radius: 0;
- border: none;
-}
-@media screen and (min-width: 640px) {
- body {
- padding: 0 calc(6 * var(--unit--horizontal));
- }
-}
-.hidden {
- display: none;
-}
-.background-grid {
- background-size: var(--unit--horizontal) var(--unit--vertical);
- background-image: linear-gradient(
- 90deg,
- var(--color-secondary--x-light) 1px,
- transparent 0
- ),
- linear-gradient(180deg, var(--color-secondary--light) 1px, transparent 0),
- linear-gradient(180deg, var(--color-secondary--x-light) 1px, transparent 0);
- background-position: 0 0, 0 0, 0 calc(var(--unit--vertical) / 2);
- background-attachment: fixed;
-}
-.left:not(.padding) {
- margin-left: calc(var(--unit--horizontal) * var(--left));
-}
-.padding.left {
- padding-left: calc(var(--unit--horizontal) * var(--left));
-}
-.top:not(.padding) {
- margin-top: calc(var(--unit--vertical) * var(--top));
-}
-.padding.top {
- padding-top: calc(var(--unit--vertical) * var(--top));
-}
-.right:not(.padding) {
- margin-right: calc(var(--unit--horizontal) * var(--right));
-}
-.padding.right {
- padding-right: calc(var(--unit--horizontal) * var(--right));
-}
-.bottom:not(.padding) {
- margin-bottom: calc(var(--unit--vertical) * var(--bottom));
-}
-.padding.bottom {
- padding-bottom: calc(var(--unit--vertical) * var(--bottom));
-}
-.full-width {
- width: 100%;
-}
-.width {
- width: calc(var(--unit--horizontal) * var(--width));
-}
-.flex {
- display: flex;
- justify-content: var(--content);
- align-items: var(--align);
- gap: calc(var(--gap) * var(--unit--horizontal));
-}
-.flex.column {
- flex-direction: column;
-}
-.color {
- color: var(--color);
-}
-.opacity {
- opacity: var(--opacity);
-}
-@font-face {
- font-family: Switzer-Variable;
- src: url(/assets/fonts/Switzer-Variable.woff2) format("woff2"),
- url(/assets/fonts/Switzer-Variable.woff) format("woff"),
- url(/assets/fonts/Switzer-Variable.ttf) format("truetype");
- font-weight: 100 900;
- font-display: swap;
- font-style: normal;
-}
-.accent {
- color: var(--color-secondary);
- font-weight: 400;
-}
-* {
- font-family: Switzer-Variable, sans-serif;
-}
-#logo * {
- font-size: 25vw;
- line-height: 4rem;
- transform: translate(-2px, -13px);
- font-weight: var(--font-weight-extra-bold);
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-p {
- font-weight: var(--font-weight-light);
- line-height: 1;
-}
-h2 {
- font-size: var(--font-size-xl);
-}
-article h2 {
- margin-bottom: calc(var(--unit--vertical) / 2);
-}
-.title-center {
- --margin-left: calc(4 * var(--unit--horizontal));
- width: calc(100% - var(--margin-left));
- margin-left: var(--margin-left);
- font-size: var(--font-size-l);
- line-height: var(--unit--vertical);
-}
-.main-title {
- line-height: calc(var(--unit--vertical) * 2);
- text-align: left;
- box-sizing: border-box;
- font-weight: var(--font-weight-light);
- margin-bottom: var(--unit--vertical);
-}
-.texts__title {
- font-size: var(--font-size-l);
-}
-.fs-m,
-button,
-li,
-p {
- transform: translateY(calc(var(--unit--vertical) * 0.12));
- font-size: var(--font-size-m);
- line-height: calc(var(--unit--vertical));
-}
-.fs-s {
- font-size: var(--font-size-s) !important;
-}
-.fs-m {
- font-size: var(--font-size-m) !important;
-}
-.fs-l {
- font-size: var(--font-size-l) !important;
-}
-.fs-xl {
- font-size: var(--font-size-xl) !important;
- line-height: calc(var(--unit--vertical) * 1.5) !important;
-}
-.fs-xxl {
- font-size: var(--font-size-xxl) !important;
- line-height: calc(var(--unit--vertical) * 2.5) !important;
-}
-.fw-light,
-button,
-li,
-p {
- font-weight: var(--font-weight-light);
-}
-.fw-bold {
- font-weight: var(--font-weight-bold);
-}
-.fw-extra-bold {
- font-weight: var(--font-weight-extra-bold);
-}
-.f-inherit {
- font-size: inherit;
- line-height: inherit;
- font-weight: inherit;
-}
-.ta-center {
- text-align: center;
-}
-p {
- transform: translateY(3px);
-}
-button {
- display: flex;
- align-items: center;
-}
-a * {
- transition: font 0.2s ease-in-out;
-}
-a.no-underline:hover * {
- font-weight: 250;
-}
-a:not(.no-underline):hover {
- text-decoration: none;
-}
-a:not(.no-underline) {
- text-decoration: underline;
- text-decoration-color: inherit;
- text-decoration-line: underline;
- text-underline-offset: 0.2rem;
- text-decoration-thickness: 0.5px;
-}
-article p:not(:last-child) {
- margin-bottom: var(--unit--vertical);
-}
-@media screen and (min-width: 640px) {
- .title-center {
- margin-left: calc(2 * var(--unit--horizontal));
- }
-}
-#main-header {
- position: fixed;
- z-index: 1;
- top: 0;
- left: 0;
- box-sizing: border-box;
- width: 100vw;
- height: calc(var(--unit--vertical) * 5);
- padding: var(--unit--vertical) var(--unit--horizontal);
- transition: height 0.2s ease-in-out;
-}
-#logo {
- position: relative;
-}
-#main-header.open #actuel {
- color: var(--color-background);
-}
-#logo #actuel {
- color: var(--color-primary--transparent);
- position: relative;
- z-index: 1;
-}
-#logo #inactuel {
- position: absolute;
- z-index: 0;
- color: var(--color-secondary);
- bottom: -48%;
- transition: bottom 0.2s ease-in-out;
-}
-#main-header.minimized #logo #inactuel {
- bottom: 0;
-}
-.page-cover {
- position: relative;
- box-sizing: border-box;
- height: 100svh;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- padding-top: calc(var(--unit--vertical-relative) * 5);
- padding-bottom: calc(5 * var(--unit--vertical));
-}
-.page-cover.open + * {
- margin-top: calc(var(--unit--vertical-relative) * 19);
-}
-[data-template="home"] .page-cover {
- padding-top: calc(var(--unit--vertical-relative) * 6);
-}
-#category .page-cover {
- height: auto;
- padding-bottom: 0;
- margin-bottom: calc(2 * var(--unit--vertical));
-}
-#category .active-tab {
- max-height: none;
-}
-@media screen and (min-width: 640px) {
- #main-header {
- display: flex;
- justify-content: center;
- }
- #logo {
- width: 37vw;
- }
- #logo * {
- font-size: 11vw;
- }
- #main-header.minimized {
- height: calc(var(--unit--vertical) * 4.3);
- }
- .page-cover {
- padding: calc(10 * var(--unit--vertical)) 0;
- }
-}
-.toggle-btns {
- position: sticky;
-}
-button.toggle.open:not(.see-more) {
- font-weight: 700;
-}
-button.toggle.left:after {
- margin-left: var(--unit--horizontal);
-}
-button.toggle.left.close:after {
- content: "+";
-}
-button.toggle.left.open:after {
- content: "-";
-}
-button.toggle.right:before {
- margin-right: var(--unit--horizontal);
-}
-button.toggle.right.close:before {
- content: "+";
-}
-button.toggle.right.open:before {
- content: "-";
-}
-#tabs {
- position: absolute;
- width: 100%;
- z-index: 1;
- bottom: calc(var(--unit--vertical-relative) * 4);
-}
-.active-tab {
- position: absolute;
- max-height: calc(var(--unit--vertical-relative) * 17);
- overflow: auto;
- transition: max-height 0.5s ease-in-out;
- padding: var(--unit--vertical) 0;
- scrollbar-width: thin;
- scrollbar-color: #fff transparent;
-}
-.active-tab::-webkit-scrollbar {
- width: 3px;
- height: auto;
-}
-.active-tab::-webkit-scrollbar-track {
- background: transparent;
-}
-.active-tab::-webkit-scrollbar-thumb {
- background-color: #fff;
- border-radius: 1px;
- border: none;
-}
-.texts__year.short .year__edito {
- display: -webkit-box;
- -webkit-line-clamp: 5;
- overflow: hidden;
-}
-.texts__year .see-more {
- width: 100%;
- margin-top: calc(var(--unit--vertical) / 2);
-}
-@media screen and (min-width: 640px) {
- [data-template="home"] #tabs {
- margin-top: calc(0px - (10 * var(--unit--vertical)));
- }
- button.toggle.left:after {
- margin-left: calc(var(--unit--horizontal) / 2);
- }
- button.toggle.right:before {
- margin-right: calc(var(--unit--horizontal) / 2);
- }
-}
-.article-header .title-wrapper {
- --margin-left: 2;
- width: calc(100% - (var(--margin-left) * var(--unit--horizontal)));
- padding-left: calc(var(--margin-left) * var(--unit--horizontal));
-}
-#main-footer {
- position: fixed;
- left: 0;
- bottom: 0;
- width: calc(18 * var(--unit--horizontal));
- padding: var(--unit--horizontal);
-}
-#main-footer a {
- text-shadow: 0 0 2px #000;
- -moz-text-shadow: 0 0 2px #000;
- -webkit-text-shadow: 0 0 2px #000;
-}
-@media screen and (min-width: 640px) {
- #main-footer {
- padding: calc(var(--unit--horizontal) / 2) var(--unit--horizontal);
- }
-}
+body,h1,h2,h3,h4,h5,html,p,ul{margin:0;padding:0}button{all:unset;cursor:pointer}a{text-decoration:none;color:inherit}a:focus-visible{outline:none}li{list-style-type:none}body{position:relative;margin:0;background-color:var(--color-background);color:var(--color-primary);overflow-x:clip}main{padding:0 var(--unit--horizontal);padding-bottom:calc(2 * var(--unit--vertical))!important}hr{height:1px;border:none;background-color:var(--color-primary)}nav hr{background-color:var(--color-background);margin-left:0}input[type=text]:focus-visible{outline:none}body,html{scroll-behavior:smooth}*{scrollbar-width:thin;scrollbar-color:hsla(0,0%,100%,.25) transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background-color:hsla(0,0%,100%,.25);border-radius:0;border:none}@media screen and (min-width:640px){body.full-width{--padding-body:calc(var(--unit--horizontal) * 10)}body{padding-left:var(--padding-body)!important;box-sizing:content-box}main{padding:0 var(--body-padding)}}.panel-item-content__edito.short{display:-webkit-box;-webkit-line-clamp:5;overflow:hidden;padding-bottom:.16rem;height:8.5rem}.hidden{display:none}.no-scroll{overflow:hidden!important}body{background-size:var(--unit--horizontal) var(--unit--vertical);background-image:linear-gradient(90deg,var(--color-secondary--x-light) 1px,transparent 0),linear-gradient(180deg,var(--color-secondary--light) 1px,transparent 0),linear-gradient(180deg,var(--color-secondary--x-light) 1px,transparent 0);background-position:0 0,0 0,0 calc(var(--unit--vertical) / 2);background-attachment:fixed}.left:not(.padding){margin-left:calc(var(--unit--horizontal) * var(--left))}.padding.left{padding-left:calc(var(--unit--horizontal) * var(--left))}.top:not(.padding){margin-top:calc(var(--unit--vertical) * var(--top))}.padding.top{padding-top:calc(var(--unit--vertical) * var(--top))}.right:not(.padding){margin-right:calc(var(--unit--horizontal) * var(--right))}.padding.right{padding-right:calc(var(--unit--horizontal) * var(--right))}.bottom:not(.padding){margin-bottom:calc(var(--unit--vertical) * var(--bottom))}.padding.bottom{padding-bottom:calc(var(--unit--vertical) * var(--bottom))}.full-width{width:100%}.width{width:calc(var(--unit--horizontal) * var(--width))}.flex{display:flex;justify-content:var(--content);align-items:var(--align);gap:calc(var(--gap) * var(--unit--horizontal))}.flex.column{flex-direction:column}.light{opacity:var(--opacity-light)}.footnote:before{content:" ["}.footnote:after{content:"]"}.texts .text{margin-bottom:var(--unit--vertical)}.color{color:var(--color)}.opacity{opacity:var(--opacity)}.toggle-btn--left:after,button.plus:after{margin-left:var(--unit--horizontal);content:"+"}.toggle-btn--left.open:after{content:"-"}.toggle-btn--right:before{margin-right:var(--unit--horizontal);content:"+"}.toggle-btn--right.open:before{content:"-"}.transition{transition:all .5s var(--curve-sine)}@font-face{font-family:Switzer-Variable;src:url(/assets/fonts/Switzer-Variable.woff2) format("woff2"),url(/assets/fonts/Switzer-Variable.woff) format("woff"),url(/assets/fonts/Switzer-Variable.ttf) format("truetype");font-weight:100 900;font-display:swap;font-style:normal}.accent{color:var(--color-secondary);font-weight:400}*{font-family:Switzer-Variable,sans-serif}h1,h1 *,h2,h2 *,h3,h3 *,h4,h4 *,h5,h5 *,p,p *{font-weight:var(--font-weight-light);line-height:1}.h3,h1,h3{font-size:var(--font-size-xl)}.h3,h3{color:var(--color-primary)}article h2{margin-bottom:calc(var(--unit--vertical) / 2)}.title-center{--margin-left:calc(3 * var(--unit--horizontal));width:calc(100% - var(--margin-left));margin-left:var(--margin-left);line-height:var(--unit--vertical)}.title-center,.title-center h2{font-size:var(--font-size-l)}.main-title{line-height:calc(var(--unit--vertical) * 2);text-align:left;box-sizing:border-box;font-weight:var(--font-weight-light);margin-bottom:var(--unit--vertical)}.text__title{font-size:var(--font-size-l)}.fs-m,button,li,p{transform:translateY(calc(var(--unit--vertical) * .12));font-size:var(--font-size-m);line-height:calc(var(--unit--vertical))}.fs-s{font-size:var(--font-size-s)!important}.fs-m{font-size:var(--font-size-m)!important}.fs-l{font-size:var(--font-size-l)!important;line-height:calc(var(--unit--vertical) * 1.5)}.fs-xl{font-size:var(--font-size-xl)!important;line-height:calc(var(--unit--vertical) * 2)!important}.fs-xxl{font-size:var(--font-size-xxl)!important;line-height:calc(var(--unit--vertical) * 2.5)!important}.fw-light,button,li,p{font-weight:var(--font-weight-light)}.fw-bold{font-weight:var(--font-weight-bold)}.fw-extra-bold{font-weight:var(--font-weight-extra-bold)}.f-inherit{font-size:inherit;line-height:inherit;font-weight:inherit}.ta-center{text-align:center}p{transform:translateY(3px)}input{font-size:var(--font-size-s);font-weight:var(--font-weight-light)}button{display:flex;align-items:center}a *{transition:font .2s ease-in-out}a.no-underline.text__title:hover *{text-decoration:underline;text-decoration-color:inherit;text-decoration-line:underline;text-underline-offset:.2rem;text-decoration-thickness:.5px}a:not(.no-underline):hover{text-decoration:none}a:not(.no-underline){text-decoration:underline;text-decoration-color:inherit;text-decoration-line:underline;text-underline-offset:.2rem;text-decoration-thickness:.5px}article p:not(:last-child){margin-bottom:var(--unit--vertical)}.footnote,.footnote *{scroll-margin-block-start:calc(var(--unit--vertical) * 6);color:var(--color-secondary);text-decoration:none!important;font-weight:var(--font-weight-bold)!important}@media screen and (min-width:640px){.title-center{margin-left:calc(2 * var(--unit--horizontal))}}main{pointer-events:none}.page-cover>*,main article>div{pointer-events:all}#main-header{position:fixed;z-index:2;box-sizing:border-box;width:100vw;padding-top:calc(var(--unit--vertical) / 2)}#logo *{font-size:25.3vw;font-weight:var(--font-weight-extra-bold)}#logo span{height:20vw;width:100%;box-sizing:border-box;padding-right:3vw;display:flex;justify-content:flex-end;align-items:center}#logo{text-align:right}#logo #actuel,#logo #inactuel{mix-blend-mode:difference}#logo #inactuel{transition:margin-top .3s ease-in-out,transform .3s ease-in-out}#main-header.minimized #inactuel{margin-top:-20vw;transform:translateX(-1px) translateY(-1px)}#main-header.minimized #inactuel:not([data-template=home] *){transform:translateX(-1px) translateY(-1px)!important}.page-cover{position:relative;height:100svh;box-sizing:border-box;padding-top:calc(var(--unit--vertical-relative) * 7);display:flex;flex-direction:column}.page-cover .text-wrapper{height:100%;overflow:auto}button.toggle.left:after,button.toggle.right:before{transition:all .5s var(--curve-sine);content:"+"}.page-cover .links{position:absolute;bottom:8px;padding-left:calc(5rem + var(--unit--horizontal));width:100%;box-sizing:border-box}.page-cover .links li{display:inline-block;margin-right:var(--unit--horizontal)}[data-template=author] .page-cover,[data-template=category] .page-cover,[data-template=email] .page-cover,[data-template=error] .page-cover,[data-template=info] .page-cover,[data-template=year] .page-cover{height:auto!important}[data-template=author] .page-cover .links,[data-template=category] .page-cover .links,[data-template=email] .page-cover .links,[data-template=error] .page-cover .links,[data-template=info] .page-cover .links,[data-template=year] .page-cover .links{display:none}@media screen and (min-width:640px){body:not([data-template=home]) #main-header{width:var(--body-padding)}#logo *{font-size:26.65vw}#logo span{padding-right:1vw}body:not([data-template=home]) #logo *{font-size:6vw}body:not([data-template=home]) #logo span{height:5vw}body:not([data-template=home]) #main-header.minimized #inactuel{margin-top:-4.9vw;transform:translateX(-2px) translateY(-2px)}.page-cover:not([data-template=author] .page-cover,[data-template=year] .page-cover,[data-template=category] .page-cover){height:100vh}[data-template=home] .page-cover{padding-top:42.5vw!important}.page-cover .links{display:none}}button.open-nav{display:inline-block}#nav-overlay{position:fixed;inset:0;background-color:#000;opacity:.7;z-index:2;cursor:w-resize}#nav-overlay:not(.nav-overlay--visible),.panel{display:none}.panel{position:fixed;overflow:auto;width:100vw;height:100dvh;top:0;background-color:#000;outline:1px solid #fff;transition:all .5s var(--curve-sine);z-index:3;box-sizing:border-box;flex-direction:column}.panel.panel--visible{display:flex}.panel header{position:sticky;top:0;z-index:1;background-color:#000;padding:var(--unit--vertical) var(--unit--horizontal);padding-bottom:0}.sort-btns{box-sizing:border-box}.sort-btns button{all:unset;cursor:pointer;display:inline-block;margin-right:2vw}.sort-btns button.active,.sort-btns button:hover{text-decoration:underline;text-underline-offset:4px}.search{position:relative;width:100%;margin-top:var(--unit--vertical);background-color:#000;z-index:1;top:0;box-sizing:border-box}.search__input{all:unset;width:100%;background-color:transparent;padding:calc(var(--unit--vertical) / 4) 0;border:none;border-bottom:1px solid #fff;color:#fff;font-size:var(--font-size-m);font-weight:var(--font-weight-light)}.search__input::placeholder{font-size:var(--font-size-sm);letter-spacing:1px}.search__icon{all:unset;position:absolute;width:1.2rem;height:1.2rem;padding:.5rem;right:0;transform:translateX(.5rem) translateY(.2rem)}button.search__icon{cursor:pointer}.panel__collection{scroll-behavior:smooth;height:100%;overflow:auto;padding:var(--unit--vertical) var(--unit--horizontal)}.panel-close{position:fixed;box-sizing:border-box;bottom:0;justify-content:center;width:100%;outline:none;border-top:1px solid #fff;font-size:var(--font-size-m);background-color:#000;padding:calc(var(--unit--vertical) / 2) var(--unit--horizontal);margin-bottom:env(safe-area-inset-bottom)}.panel__toggle-btn{width:100%;display:flex;justify-content:space-between;margin-bottom:var(--unit--vertical)}.panel__toggle-icon{color:var(--color-secondary);font-size:var(--font-size-xl)}.panel-item-content__edito{margin-bottom:calc(var(--unit--vertical) / 2)}.panel-item-content__edito p:not(:last-child),button.see-more{margin-bottom:var(--unit--vertical)}.panel-item-content__texts:not(.panel__collection .panel-item-content__texts){padding:var(--unit--vertical) var(--unit--horizontal)}.panel .text:first-child,.panel .text:last-child{margin-bottom:calc(var(--unit--vertical) * 2)}.panel__collection--years .text:first-child .text__title{display:inline-block;padding-left:var(--unit--horizontal)}.panel .text__subtitle{margin-bottom:calc(var(--unit--vertical) / 4)}.panel__collection--years .text:first-child .text__infos{padding-left:var(--unit--horizontal)}.panel__collection--years .text:first-child .text__infos:before{content:"";position:absolute;left:0;top:0;height:100%;width:1px;background-color:#fff}@media screen and (min-width:640px){nav.panel{width:40rem}.panel{z-index:4;width:var(--padding-body)}.panel-close{display:none}.panel--right{right:auto;left:calc(-100vw - 1px)}.panel--right.open{left:0}}article #main-content{max-width:calc(18 * var(--unit--horizontal));scroll-margin-block-start:calc(var(--unit--vertical) * 6);padding-bottom:calc(var(--unit--vertical) * 2);margin-top:calc(2 * var(--unit--vertical))}#chapo{font-style:italic}#main-content .texts{margin-top:calc(2 * var(--unit--vertical))}#main-content .see-more{margin-top:calc(var(--unit--vertical) * .5)}#chapo em{font-style:normal}article #main-content #chapo:after{content:"";display:block;margin:calc(2 * var(--unit--vertical)) 0;width:100%;height:1px;background-color:#fff}article #main-content li:not(.text){list-style-type:inherit}@media screen and (min-width:640px){article #main-content{max-width:auto}}[data-template=year] .edito{margin-bottom:var(--unit--vertical)}.main-edito-btn{display:inline-block;margin-right:calc(2 * var(--unit--horizontal))}#main-edito{margin-top:calc(var(--unit--vertical) * 4);scroll-margin-block-start:25vw}body.full-width #desktop-nav{height:auto}body.full-width #desktop-nav .empty{height:calc(var(--unit--vertical) / 2)}body.full-width #main-content{position:absolute;left:0;width:100vw;padding:0 var(--unit--horizontal) var(--unit--vertical);box-sizing:border-box}.grid .column{grid-column:span var(--span)}.grid[data-columns="1"] .column{grid-column:11/span 20}[data-template=grid] main #main-content{margin-left:inherit}@media screen and (min-width:640px){[data-template=grid] main #main-content{margin-left:calc(0px - (4 * var(--unit--horizontal)))}[data-template=grid] .grid{display:grid;grid-template-columns:repeat(39,1fr);column-gap:var(--unit--horizontal);margin-bottom:calc(var(--unit--vertical) * 2)}}#subscribe-btn-wrapper{height:2.5rem;margin-bottom:.2rem}#subscribe-form{position:relative;width:-moz-fit-content;width:fit-content}#subscribe-form input{background-color:transparent;border:none;border-bottom:1px solid #fff;box-sizing:border-box;padding-bottom:.3rem;padding-right:2rem;color:#fff;width:15rem}#subscribe-form input:focus-visible{outline:none}#subscribe-form button[type=submit]{color:#fff;position:absolute;top:0;right:0}#main-footer{position:fixed;bottom:0;box-sizing:border-box;padding:3px var(--unit--horizontal) 6px;border-bottom:0}.main-footer--background{border-top:1px solid #eee;border-right:1px solid #eee;background-color:#000}[data-template=home] #main-footer{position:fixed;left:0;bottom:0}#main-footer li:not(.open-nav-wrapper){display:none}#main-footer button.open-nav{transform:translateY(-1px)}@media screen and (min-width:640px){#main-footer li{display:block!important}#main-footer{position:fixed;left:0;bottom:0;width:var(--body-padding);background-color:transparent;padding:var(--unit--vertical) var(--unit--horizontal)}#main-footer ul{display:block}#main-footer button.open-nav{margin-bottom:var(--unit--vertical)}}@media print{@page{margin:0;size:auto;@top-left{content:none}@top-right{content:none}@top-center{content:none}@bottom-left{content:none}@bottom-right{content:none}@bottom-center{content:none}}body{padding-top:4rem;color:#000}.panel{display:none}.main-title.fs-xxl{font-size:7rem!important;line-height:1!important}#main-header{position:relative}#logo #actuel{color:#000;opacity:.8}#logo #inactuel{color:#56d9a3}#entry-btns{display:none}a{text-decoration:none!important}article #main-content{width:60%;margin:auto}}:root{--color-background:#000;--color-primary:#fff;--color-primary--transparent:hsla(0,0%,100%,.86);--color-secondary-rgb:200,200,200;--color-secondary:rgba(var(--color-secondary-rgb),0.86);--color-secondary--light:rgba(var(--color-secondary-rgb),0.2);--color-secondary--x-light:rgb(var(--color-secondary-rgb),0.1);--color-tertiary-rgb:200,200,200;--color-tertiary:rgba(var(--color-tertiary-rgb),0.86);--color-tertiary--light:rgba(var(--color-tertiary-rgb),0.2);--color-tertiary--x-light:rgb(var(--color-tertiary-rgb),0.1);--unit--horizontal:5vw;--unit--vertical:1.7rem;--unit--vertical-relative:calc(var(--unit--vertical) * var(--window-height-factor));--font-size-s:0.8rem;--font-size-m:calc(var(--font-size-s) * 1.5);--font-size-l:calc(var(--font-size-m) * 1.5);--font-size-xl:calc(var(--font-size-l) * 1.5);--font-size-xxl:calc(var(--font-size-xl) * 1.5);--font-weight-light:200;--font-weight-bold:400;--font-weight-extra-bold:550;--opacity-light:0.6;--curve-sine:cubic-bezier(0.445,0.05,0.55,0.95)}@media screen and (min-width:640px){:root{--unit--horizontal:2.5vw;--unit--vertical:1.7rem;--font-size-s:0.9rem;--font-size-m:calc(var(--font-size-s) * 1.5);--font-size-l:calc(var(--font-size-m) * 1.5);--font-size-xl:calc(var(--font-size-l) * 1.5);--font-size-xxl:calc(var(--font-size-xl) * 1.5);--font-weight-light:200;--font-weight-bold:400;--font-weight-extra-bold:550;--body-padding:calc(10 * var(--unit--horizontal))}}
\ No newline at end of file
diff --git a/assets/js/script.js b/assets/js/script.js
index 4bad7a0..f734272 100644
--- a/assets/js/script.js
+++ b/assets/js/script.js
@@ -9,16 +9,36 @@ function getUnit(id) {
return pxUnit;
}
-function throttle(callback, limit) {
- let waiting = false;
+// Throttle found here : https://gist.github.com/ionurboz/51b505ee3281cd713747b4a84d69f434
+function throttle(func, wait, options) {
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ if (!options) options = {};
+ var later = function () {
+ previous = options.leading === false ? 0 : Date.now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
return function () {
- if (!waiting) {
- callback.apply(this, arguments);
- waiting = true;
- setTimeout(function () {
- waiting = false;
- }, limit);
+ var now = Date.now();
+ if (!previous && options.leading === false) previous = now;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
}
+ return result;
};
}
@@ -47,17 +67,25 @@ function toggleLogoState() {
document.querySelector("#main-header").classList.remove("minimized");
}
}
+function toggleFooterState() {
+ if (scrollY > 90) {
+ document.querySelector(".open-nav-wrapper").classList.remove("hidden");
+ } else {
+ document.querySelector(".open-nav-wrapper").classList.add("hidden");
+ }
+}
function fixFootNotes() {
const footnotes = document.querySelectorAll('a[href^="#sdfootnote"]');
footnotes.forEach((footnote) => {
const href = footnote.href;
+
footnote.classList.add("footnote");
+
if (href.includes("sym")) {
footnote.id = footnote.hash.replace("sym", "anc").replace("#", "");
- }
- if (href.includes("anc")) {
+ } else if (href.includes("anc")) {
footnote.id = footnote.hash.replace("anc", "sym").replace("#", "");
}
});
@@ -76,38 +104,30 @@ function slugify(str) {
return removeAccents(str.toLowerCase());
}
-const subscribeBtn = document.querySelector("#subscribe-btn");
-function showSubscribeField(event) {
- event.preventDefault();
- const button = event.target;
- const li = button.parentNode;
- const form = li.querySelector("#subscribe-form");
- const input = form.querySelector("input");
-
- form.classList.remove("hidden");
- button.classList.add("hidden");
- input.focus();
-}
-
function subscribe(event) {
event.preventDefault();
- const email = document.querySelector("#subscribe-form input");
+ const emailInput = document.querySelector("#subscribe-form input");
- if (email.value.toLowerCase().match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
+ if (emailInput.value.toLowerCase().match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
const header = {
method: "POST",
- body: email.value,
+ body: JSON.stringify(emailInput.value),
};
- fetch("/subscribe.json");
+ fetch("/subscribe.json", header)
+ .then((res) => res.json())
+ .then((data) => {
+ const formNode = emailInput.parentNode.parentNode;
+ formNode.outerHTML = "" + data.message + "
";
+ });
} else {
- email.value = "E-mail invalide. Recommencez.";
+ emailInput.value = "E-mail invalide. Recommencez.";
}
}
const panelNav = document.querySelector(".panel");
const navOverlay = document.querySelector("#nav-overlay");
-const openNavBtn = document.querySelector("button.open-nav");
+const openNavBtns = document.querySelectorAll("button.open-nav");
const closeNavBtn = document.querySelector(".panel-close");
function closeNav() {
panelNav.classList.remove("panel--visible");
@@ -116,14 +136,18 @@ function closeNav() {
}
document.addEventListener("DOMContentLoaded", () => {
- ragadjust("h1, h2, h3, h4, h5", ["all"]);
+ ragadjust("h1, h2, h4, h5", ["all"]);
window.window.scrollTo({
top: 0,
});
- window.addEventListener("scroll", () => {
+ const handleScroll = throttle(() => {
toggleLogoState();
- });
+ if (window.innerWidth <= 680) {
+ toggleFooterState();
+ }
+ }, 100);
+ window.addEventListener("scroll", handleScroll);
setWindowHeightFactor();
window.addEventListener("resize", () => {
@@ -169,10 +193,12 @@ document.addEventListener("DOMContentLoaded", () => {
});
});
- openNavBtn.addEventListener("click", () => {
- panelNav.classList.add("panel--visible");
- navOverlay.classList.add("nav-overlay--visible");
- document.body.classList.add("no-scroll");
+ openNavBtns.forEach((openNavBtn) => {
+ openNavBtn.addEventListener("click", () => {
+ panelNav.classList.add("panel--visible");
+ navOverlay.classList.add("nav-overlay--visible");
+ document.body.classList.add("no-scroll");
+ });
});
closeNavBtn.addEventListener("click", () => {
@@ -181,6 +207,4 @@ document.addEventListener("DOMContentLoaded", () => {
navOverlay.addEventListener("click", () => {
closeNav();
});
-
- subscribeBtn.addEventListener("click", showSubscribeField);
});
diff --git a/composer.json b/composer.json
index b490cfa..ffcade6 100644
--- a/composer.json
+++ b/composer.json
@@ -23,11 +23,21 @@
},
"require": {
"php": "~8.1.0 || ~8.2.0 || ~8.3.0",
- "getkirby/cms": "^4.0"
+ "getkirby/cms": "^4.5",
+ "symfony/http-client": "^7.2",
+ "nyholm/psr7": "^1.8",
+ "php-http/guzzle7-adapter": "^1.1",
+ "mailersend/mailersend": "^0.28.0",
+ "sylvainjule/code-editor": "^1.0",
+ "tobimori/kirby-seo": "^1.1"
},
"config": {
+ "platform": {
+ "php": "8.3.0"
+ },
"allow-plugins": {
- "getkirby/composer-installer": true
+ "getkirby/composer-installer": true,
+ "php-http/discovery": true
},
"optimize-autoloader": true
},
diff --git a/composer.lock b/composer.lock
index 755dda1..f9e2f85 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,75 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "749a661738bcd5b9428c88a1da847bc7",
+ "content-hash": "30f9edc8f90ec79150fffac01e3b80fd",
"packages": [
+ {
+ "name": "beberlei/assert",
+ "version": "v3.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/beberlei/assert.git",
+ "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/beberlei/assert/zipball/b5fd8eacd8915a1b627b8bfc027803f1939734dd",
+ "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": ">=6.0.0",
+ "yoast/phpunit-polyfills": "^0.1.0"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/Assert/functions.php"
+ ],
+ "psr-4": {
+ "Assert\\": "lib/Assert"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Collaborator"
+ }
+ ],
+ "description": "Thin assertion library for input validation in business models.",
+ "keywords": [
+ "assert",
+ "assertion",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/beberlei/assert/issues",
+ "source": "https://github.com/beberlei/assert/tree/v3.3.3"
+ },
+ "time": "2024-07-15T13:18:35+00:00"
+ },
{
"name": "christian-riesen/base32",
"version": "1.6.0",
@@ -67,16 +134,16 @@
},
{
"name": "claviska/simpleimage",
- "version": "4.0.6",
+ "version": "4.2.1",
"source": {
"type": "git",
"url": "https://github.com/claviska/SimpleImage.git",
- "reference": "969de5e61810ef91f6f83c475b192c4841367dfa"
+ "reference": "ec6d5021e5a7153a2520d64c59b86b6f3c4157c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/969de5e61810ef91f6f83c475b192c4841367dfa",
- "reference": "969de5e61810ef91f6f83c475b192c4841367dfa",
+ "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/ec6d5021e5a7153a2520d64c59b86b6f3c4157c5",
+ "reference": "ec6d5021e5a7153a2520d64c59b86b6f3c4157c5",
"shasum": ""
},
"require": {
@@ -108,7 +175,7 @@
"description": "A PHP class that makes working with images as simple as possible.",
"support": {
"issues": "https://github.com/claviska/SimpleImage/issues",
- "source": "https://github.com/claviska/SimpleImage/tree/4.0.6"
+ "source": "https://github.com/claviska/SimpleImage/tree/4.2.1"
},
"funding": [
{
@@ -116,28 +183,94 @@
"type": "github"
}
],
- "time": "2023-07-27T16:48:12+00:00"
+ "time": "2024-11-22T13:25:03+00:00"
},
{
- "name": "composer/semver",
- "version": "3.4.0",
+ "name": "clue/stream-filter",
+ "version": "v1.7.0",
"source": {
"type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
+ "url": "https://github.com/clue/stream-filter.git",
+ "reference": "049509fef80032cb3f051595029ab75b49a3c2f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
- "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
+ "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7",
+ "reference": "049509fef80032cb3f051595029ab75b49a3c2f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "Clue\\StreamFilter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "A simple and modern approach to stream filtering in PHP",
+ "homepage": "https://github.com/clue/stream-filter",
+ "keywords": [
+ "bucket brigade",
+ "callback",
+ "filter",
+ "php_user_filter",
+ "stream",
+ "stream_filter_append",
+ "stream_filter_register"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/stream-filter/issues",
+ "source": "https://github.com/clue/stream-filter/tree/v1.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-20T15:40:13+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^1.4",
- "symfony/phpunit-bridge": "^4.2 || ^5"
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
@@ -181,7 +314,7 @@
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.4.0"
+ "source": "https://github.com/composer/semver/tree/3.4.3"
},
"funding": [
{
@@ -197,30 +330,30 @@
"type": "tidelift"
}
],
- "time": "2023-08-31T09:50:34+00:00"
+ "time": "2024-09-19T14:15:21+00:00"
},
{
"name": "filp/whoops",
- "version": "2.15.4",
+ "version": "2.17.0",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
+ "reference": "075bc0c26631110584175de6523ab3f1652eb28e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e",
+ "reference": "075bc0c26631110584175de6523ab3f1652eb28e",
"shasum": ""
},
"require": {
- "php": "^5.5.9 || ^7.0 || ^8.0",
+ "php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"require-dev": {
- "mockery/mockery": "^0.9 || ^1.0",
- "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
- "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^4.0 || ^5.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -260,7 +393,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
- "source": "https://github.com/filp/whoops/tree/2.15.4"
+ "source": "https://github.com/filp/whoops/tree/2.17.0"
},
"funding": [
{
@@ -268,26 +401,26 @@
"type": "github"
}
],
- "time": "2023-11-03T12:00:00+00:00"
+ "time": "2025-01-25T12:00:00+00:00"
},
{
"name": "getkirby/cms",
- "version": "4.1.2",
+ "version": "4.6.0",
"source": {
"type": "git",
"url": "https://github.com/getkirby/kirby.git",
- "reference": "6b7ac66c55ecac20d6b580ef01a667d1806d5c72"
+ "reference": "994556ca78eab3c11415702870b6388e8472addc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/getkirby/kirby/zipball/6b7ac66c55ecac20d6b580ef01a667d1806d5c72",
- "reference": "6b7ac66c55ecac20d6b580ef01a667d1806d5c72",
+ "url": "https://api.github.com/repos/getkirby/kirby/zipball/994556ca78eab3c11415702870b6388e8472addc",
+ "reference": "994556ca78eab3c11415702870b6388e8472addc",
"shasum": ""
},
"require": {
"christian-riesen/base32": "1.6.0",
- "claviska/simpleimage": "4.0.6",
- "composer/semver": "3.4.0",
+ "claviska/simpleimage": "4.2.1",
+ "composer/semver": "3.4.3",
"ext-ctype": "*",
"ext-curl": "*",
"ext-dom": "*",
@@ -299,15 +432,15 @@
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-simplexml": "*",
- "filp/whoops": "2.15.4",
+ "filp/whoops": "2.17.0",
"getkirby/composer-installer": "^1.2.1",
- "laminas/laminas-escaper": "2.13.0",
+ "laminas/laminas-escaper": "2.15.0",
"michelf/php-smartypants": "1.8.1",
- "php": "~8.1.0 || ~8.2.0 || ~8.3.0",
- "phpmailer/phpmailer": "6.9.1",
- "symfony/polyfill-intl-idn": "1.28.0",
- "symfony/polyfill-mbstring": "1.28.0",
- "symfony/yaml": "6.4.0"
+ "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0",
+ "phpmailer/phpmailer": "6.9.3",
+ "symfony/polyfill-intl-idn": "1.31.0",
+ "symfony/polyfill-mbstring": "1.31.0",
+ "symfony/yaml": "6.4.18"
},
"replace": {
"symfony/polyfill-php72": "*"
@@ -371,7 +504,7 @@
"type": "custom"
}
],
- "time": "2024-03-06T11:38:42+00:00"
+ "time": "2025-01-30T11:02:53+00:00"
},
{
"name": "getkirby/composer-installer",
@@ -421,34 +554,555 @@
"time": "2020-12-28T12:54:39+00:00"
},
{
- "name": "laminas/laminas-escaper",
- "version": "2.13.0",
+ "name": "guzzlehttp/guzzle",
+ "version": "7.9.2",
"source": {
"type": "git",
- "url": "https://github.com/laminas/laminas-escaper.git",
- "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba"
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba",
- "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^2.7.0",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ext-curl": "*",
+ "guzzle/client-integration-tests": "3.0.2",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-24T11:22:20+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-17T10:06:22+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-18T11:15:46+00:00"
+ },
+ {
+ "name": "illuminate/collections",
+ "version": "v11.41.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/collections.git",
+ "reference": "80c85f81573cc4c024da05312119f9149a6b64c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/80c85f81573cc4c024da05312119f9149a6b64c1",
+ "reference": "80c85f81573cc4c024da05312119f9149a6b64c1",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/conditionable": "^11.0",
+ "illuminate/contracts": "^11.0",
+ "illuminate/macroable": "^11.0",
+ "php": "^8.2"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Required to use the dump method (^7.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "11.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "functions.php",
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Collections package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-01-24T15:40:32+00:00"
+ },
+ {
+ "name": "illuminate/conditionable",
+ "version": "v11.41.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/conditionable.git",
+ "reference": "911df1bda950a3b799cf80671764e34eede131c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/conditionable/zipball/911df1bda950a3b799cf80671764e34eede131c6",
+ "reference": "911df1bda950a3b799cf80671764e34eede131c6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Conditionable package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2024-11-21T16:28:56+00:00"
+ },
+ {
+ "name": "illuminate/contracts",
+ "version": "v11.41.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/contracts.git",
+ "reference": "534b697fc1dd9fbdd9fbf2f33fc9dcbb943dea75"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/534b697fc1dd9fbdd9fbf2f33fc9dcbb943dea75",
+ "reference": "534b697fc1dd9fbdd9fbf2f33fc9dcbb943dea75",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2",
+ "psr/container": "^1.1.1|^2.0.1",
+ "psr/simple-cache": "^1.0|^2.0|^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Contracts\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Contracts package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-01-10T20:57:00+00:00"
+ },
+ {
+ "name": "illuminate/macroable",
+ "version": "v11.41.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/macroable.git",
+ "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed",
+ "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Macroable package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2024-06-28T20:10:30+00:00"
+ },
+ {
+ "name": "laminas/laminas-escaper",
+ "version": "2.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-escaper.git",
+ "reference": "c612b0488ae486284c39885efca494c180f16351"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/c612b0488ae486284c39885efca494c180f16351",
+ "reference": "c612b0488ae486284c39885efca494c180f16351",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-mbstring": "*",
- "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
+ "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"conflict": {
"zendframework/zend-escaper": "*"
},
"require-dev": {
- "infection/infection": "^0.27.0",
- "laminas/laminas-coding-standard": "~2.5.0",
+ "infection/infection": "^0.27.11",
+ "laminas/laminas-coding-standard": "~3.0.1",
"maglnet/composer-require-checker": "^3.8.0",
- "phpunit/phpunit": "^9.6.7",
- "psalm/plugin-phpunit": "^0.18.4",
- "vimeo/psalm": "^5.9"
+ "phpunit/phpunit": "^9.6.22",
+ "psalm/plugin-phpunit": "^0.19.0",
+ "vimeo/psalm": "^5.26.1"
},
"type": "library",
"autoload": {
@@ -480,7 +1134,7 @@
"type": "community_bridge"
}
],
- "time": "2023-10-10T08:35:13+00:00"
+ "time": "2024-12-17T19:39:54+00:00"
},
{
"name": "league/color-extractor",
@@ -543,6 +1197,73 @@
},
"time": "2022-09-24T15:57:16+00:00"
},
+ {
+ "name": "mailersend/mailersend",
+ "version": "v0.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mailersend/mailersend-php.git",
+ "reference": "e91977866825ca7b26cec23ebf38759a051c3c07"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mailersend/mailersend-php/zipball/e91977866825ca7b26cec23ebf38759a051c3c07",
+ "reference": "e91977866825ca7b26cec23ebf38759a051c3c07",
+ "shasum": ""
+ },
+ "require": {
+ "beberlei/assert": "^3.2",
+ "ext-json": "*",
+ "illuminate/collections": "^8.0 || ^9.0 || ^10.0 || ^11.0",
+ "php": "^7.4|^8.0",
+ "php-http/client-common": "^2.2",
+ "php-http/discovery": "^1.9",
+ "php-http/httplug": "^2.1",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "^4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.4.0",
+ "guzzlehttp/psr7": "^1.5.2",
+ "http-interop/http-factory-guzzle": "^1.0",
+ "mockery/mockery": "^0.9.4",
+ "php-http/guzzle7-adapter": "^0.1 || ^1.0",
+ "php-http/message": "^1.0",
+ "php-http/mock-client": "^1.0",
+ "phpunit/phpunit": "^7.5.15 || ^8.4 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "MailerSend\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tautvydas Tijūnaitis",
+ "email": "tautvydas@mailersend.com",
+ "homepage": "https://mailersend.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "MailerSend PHP SDK",
+ "homepage": "https://github.com/mailersend/mailersend-php",
+ "keywords": [
+ "email",
+ "mailersend",
+ "transactional"
+ ],
+ "support": {
+ "issues": "https://github.com/mailersend/mailersend-php/issues",
+ "source": "https://github.com/mailersend/mailersend-php/tree/v0.28.0"
+ },
+ "time": "2024-11-25T15:35:57+00:00"
+ },
{
"name": "michelf/php-smartypants",
"version": "1.8.1",
@@ -598,17 +1319,480 @@
"time": "2016-12-13T01:01:17+00:00"
},
{
- "name": "phpmailer/phpmailer",
- "version": "v6.9.1",
+ "name": "nyholm/psr7",
+ "version": "1.8.2",
"source": {
"type": "git",
- "url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
+ "url": "https://github.com/Nyholm/psr7.git",
+ "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
- "reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
+ "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+ "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0",
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "php-http/message-factory": "^1.0",
+ "php-http/psr7-integration-tests": "^1.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
+ "symfony/error-handler": "^4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "description": "A fast PHP7 implementation of PSR-7",
+ "homepage": "https://tnyholm.se",
+ "keywords": [
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/Nyholm/psr7/issues",
+ "source": "https://github.com/Nyholm/psr7/tree/1.8.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Zegnat",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-09T07:06:30+00:00"
+ },
+ {
+ "name": "php-http/client-common",
+ "version": "2.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/client-common.git",
+ "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/httplug": "^2.0",
+ "php-http/message": "^1.6",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.1",
+ "guzzlehttp/psr7": "^1.4",
+ "nyholm/psr7": "^1.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "phpspec/prophecy": "^1.10.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+ },
+ "suggest": {
+ "ext-json": "To detect JSON responses with the ContentTypePlugin",
+ "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+ "php-http/cache-plugin": "PSR-6 Cache plugin",
+ "php-http/logger-plugin": "PSR-3 Logger plugin",
+ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Common HTTP Client implementations and tools for HTTPlug",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "common",
+ "http",
+ "httplug"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/client-common/issues",
+ "source": "https://github.com/php-http/client-common/tree/2.7.2"
+ },
+ "time": "2024-09-24T06:21:48+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d",
+ "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "sebastian/comparator": "^3.0.5 || ^4.0.8",
+ "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.20.0"
+ },
+ "time": "2024-10-02T11:20:13+00:00"
+ },
+ {
+ "name": "php-http/guzzle7-adapter",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/guzzle7-adapter.git",
+ "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/03a415fde709c2f25539790fecf4d9a31bc3d0eb",
+ "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^7.0",
+ "php": "^7.3 | ^8.0",
+ "php-http/httplug": "^2.0",
+ "psr/http-client": "^1.0"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "1.0",
+ "php-http/client-implementation": "1.0",
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "php-http/client-integration-tests": "^3.0",
+ "php-http/message-factory": "^1.1",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^8.0|^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Adapter\\Guzzle7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ }
+ ],
+ "description": "Guzzle 7 HTTP Adapter",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "Guzzle",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/guzzle7-adapter/issues",
+ "source": "https://github.com/php-http/guzzle7-adapter/tree/1.1.0"
+ },
+ "time": "2024-11-26T11:14:36+00:00"
+ },
+ {
+ "name": "php-http/httplug",
+ "version": "2.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/httplug.git",
+ "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4",
+ "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/promise": "^1.1",
+ "psr/http-client": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "HTTPlug, the HTTP client abstraction for PHP",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/2.4.1"
+ },
+ "time": "2024-09-23T11:39:58+00:00"
+ },
+ {
+ "name": "php-http/message",
+ "version": "1.16.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message.git",
+ "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
+ "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
+ "shasum": ""
+ },
+ "require": {
+ "clue/stream-filter": "^1.5",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.6",
+ "ext-zlib": "*",
+ "guzzlehttp/psr7": "^1.0 || ^2.0",
+ "laminas/laminas-diactoros": "^2.0 || ^3.0",
+ "php-http/message-factory": "^1.0.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "slim/slim": "^3.0"
+ },
+ "suggest": {
+ "ext-zlib": "Used with compressor/decompressor streams",
+ "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+ "laminas/laminas-diactoros": "Used with Diactoros Factories",
+ "slim/slim": "Used with Slim Framework PSR-7 implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/filters.php"
+ ],
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "HTTP Message related tools",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message/issues",
+ "source": "https://github.com/php-http/message/tree/1.16.2"
+ },
+ "time": "2024-10-02T11:34:13+00:00"
+ },
+ {
+ "name": "php-http/promise",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/promise.git",
+ "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+ "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+ "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joel Wurtz",
+ "email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Promise used for asynchronous HTTP requests",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.3.1"
+ },
+ "time": "2024-03-15T13:55:21+00:00"
+ },
+ {
+ "name": "phpmailer/phpmailer",
+ "version": "v6.9.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPMailer/PHPMailer.git",
+ "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2f5c94fe7493efc213f643c23b1b1c249d40f47e",
+ "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e",
"shasum": ""
},
"require": {
@@ -668,7 +1852,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1"
+ "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.3"
},
"funding": [
{
@@ -676,20 +1860,233 @@
"type": "github"
}
],
- "time": "2023-11-25T22:23:28+00:00"
+ "time": "2024-11-24T18:04:13+00:00"
},
{
- "name": "psr/log",
- "version": "3.0.0",
+ "name": "psr/container",
+ "version": "2.0.2",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
"shasum": ""
},
"require": {
@@ -724,22 +2121,228 @@
"psr-3"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/3.0.0"
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
},
- "time": "2021-07-14T16:46:02+00:00"
+ "time": "2024-09-11T13:17:53+00:00"
},
{
- "name": "symfony/deprecation-contracts",
- "version": "v3.4.0",
+ "name": "psr/simple-cache",
+ "version": "3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
- "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
+ },
+ "time": "2021-10-29T13:26:27+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "spatie/schema-org",
+ "version": "3.23.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/schema-org.git",
+ "reference": "a8dc1b6fcdd06afc1ab084c3ead9b7a4c3d7a35d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/schema-org/zipball/a8dc1b6fcdd06afc1ab084c3ead9b7a4c3d7a35d",
+ "reference": "a8dc1b6fcdd06afc1ab084c3ead9b7a4c3d7a35d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.6",
+ "graham-campbell/analyzer": "^4.2",
+ "illuminate/collections": "^8.62.0",
+ "league/flysystem": "^2.3.0 || ^3.0",
+ "pestphp/pest": "^1.21",
+ "symfony/console": "^5.3.7 || 6.0",
+ "twig/twig": "^3.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\SchemaOrg\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian De Deyne",
+ "email": "sebastian@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ },
+ {
+ "name": "Tom Witkowski",
+ "email": "dev.gummibeer@gmail.com",
+ "homepage": "https://gummibeer.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A fluent builder Schema.org types and ld+json generator",
+ "homepage": "https://github.com/spatie/schema-org",
+ "keywords": [
+ "schema-org",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/schema-org/issues",
+ "source": "https://github.com/spatie/schema-org/tree/3.23.1"
+ },
+ "funding": [
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2025-01-31T14:54:12+00:00"
+ },
+ {
+ "name": "sylvainjule/code-editor",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sylvainjule/kirby-code-editor.git",
+ "reference": "9795565acbf64f92c46423ed4cb5c94bb8a738ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sylvainjule/kirby-code-editor/zipball/9795565acbf64f92c46423ed4cb5c94bb8a738ea",
+ "reference": "9795565acbf64f92c46423ed4cb5c94bb8a738ea",
+ "shasum": ""
+ },
+ "require": {
+ "getkirby/composer-installer": "^1.1"
+ },
+ "type": "kirby-plugin",
+ "extra": {
+ "installer-name": "code-editor"
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Sylvain Julé",
+ "email": "contact@sylvain-jule.fr"
+ }
+ ],
+ "description": "Code editor field for Kirby 3 and 4",
+ "support": {
+ "issues": "https://github.com/sylvainjule/kirby-code-editor/issues",
+ "source": "https://github.com/sylvainjule/kirby-code-editor/tree/1.0.3"
+ },
+ "time": "2024-03-06T18:19:23+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"shasum": ""
},
"require": {
@@ -747,12 +2350,12 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "3.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
}
},
"autoload": {
@@ -777,7 +2380,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -793,24 +2396,264 @@
"type": "tidelift"
}
],
- "time": "2023-05-23T14:45:45+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.29.0",
+ "name": "symfony/http-client",
+ "version": "v7.2.3",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "7ce6078c79a4a7afff931c413d2959d3bffbfb8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
- "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/7ce6078c79a4a7afff931c413d2959d3bffbfb8d",
+ "reference": "7ce6078c79a4a7afff931c413d2959d3bffbfb8d",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-client-contracts": "~3.4.4|^3.5.2",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "amphp/amp": "<2.5",
+ "php-http/discovery": "<1.15",
+ "symfony/http-foundation": "<6.4"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "1.0",
+ "symfony/http-client-implementation": "3.0"
+ },
+ "require-dev": {
+ "amphp/http-client": "^4.2.1|^5.0",
+ "amphp/http-tunnel": "^1.0|^2.0",
+ "amphp/socket": "^1.1",
+ "guzzlehttp/promises": "^1.4|^2.0",
+ "nyholm/psr7": "^1.0",
+ "php-http/httplug": "^1.0|^2.0",
+ "psr/http-client": "^1.0",
+ "symfony/amphp-http-client-meta": "^1.0|^2.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/rate-limiter": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "http"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client/tree/v7.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-28T15:51:35+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v3.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645",
+ "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:49:48+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
+ "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-20T11:17:29+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
},
"provide": {
"ext-ctype": "*"
@@ -821,8 +2664,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -856,7 +2699,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
},
"funding": [
{
@@ -872,38 +2715,34 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "ecaafce9f77234a6a449d29e49267ba10499116d"
+ "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d",
- "reference": "ecaafce9f77234a6a449d29e49267ba10499116d",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
+ "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "symfony/polyfill-intl-normalizer": "^1.10",
- "symfony/polyfill-php72": "^1.10"
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -943,7 +2782,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
@@ -959,24 +2798,24 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:30:37+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.29.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
- "reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
@@ -984,8 +2823,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1024,7 +2863,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
},
"funding": [
{
@@ -1040,24 +2879,24 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "42292d99c55abe617799667f454222c54c60e229"
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
- "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
@@ -1067,12 +2906,9 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1107,7 +2943,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
},
"funding": [
{
@@ -1123,20 +2959,183 @@
"type": "tidelift"
}
],
- "time": "2023-07-28T09:04:16+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/yaml",
- "version": "v6.4.0",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.31.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587",
- "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v6.4.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5",
+ "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5",
"shasum": ""
},
"require": {
@@ -1179,7 +3178,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v6.4.0"
+ "source": "https://github.com/symfony/yaml/tree/v6.4.18"
},
"funding": [
{
@@ -1195,7 +3194,64 @@
"type": "tidelift"
}
],
- "time": "2023-11-06T11:00:25+00:00"
+ "time": "2025-01-07T09:44:41+00:00"
+ },
+ {
+ "name": "tobimori/kirby-seo",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tobimori/kirby-seo.git",
+ "reference": "a06eb676f699797fdd04a515149559ffd4746be7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tobimori/kirby-seo/zipball/a06eb676f699797fdd04a515149559ffd4746be7",
+ "reference": "a06eb676f699797fdd04a515149559ffd4746be7",
+ "shasum": ""
+ },
+ "require": {
+ "getkirby/composer-installer": "^1.2.1",
+ "php": ">=8.1.0",
+ "spatie/schema-org": "^3.14"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.48",
+ "getkirby/cli": "^1.2",
+ "getkirby/cms": "^4.0"
+ },
+ "type": "kirby-plugin",
+ "extra": {
+ "kirby-cms-path": false
+ },
+ "autoload": {
+ "psr-4": {
+ "tobimori\\Seo\\": "classes"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Möritz",
+ "email": "tobias@moeritz.io"
+ }
+ ],
+ "description": "The ultimate Kirby SEO toolkit",
+ "homepage": "https://github.com/tobimori/kirby-seo#readme",
+ "support": {
+ "issues": "https://github.com/tobimori/kirby-seo/issues",
+ "source": "https://github.com/tobimori/kirby-seo/tree/1.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/tobimori",
+ "type": "github"
+ }
+ ],
+ "time": "2024-04-10T09:49:19+00:00"
}
],
"packages-dev": [],
@@ -1208,5 +3264,8 @@
"php": "~8.1.0 || ~8.2.0 || ~8.3.0"
},
"platform-dev": [],
+ "platform-overrides": {
+ "php": "8.3.0"
+ },
"plugin-api-version": "2.6.0"
}
diff --git a/favicon-96x96.png b/favicon-96x96.png
new file mode 100644
index 0000000..903441a
Binary files /dev/null and b/favicon-96x96.png differ
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..37bc881
Binary files /dev/null and b/favicon.ico differ
diff --git a/favicon.svg b/favicon.svg
new file mode 100644
index 0000000..b197d82
--- /dev/null
+++ b/favicon.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/site.webmanifest b/site.webmanifest
new file mode 100644
index 0000000..fb5c8ae
--- /dev/null
+++ b/site.webmanifest
@@ -0,0 +1,21 @@
+{
+ "name": "actuel-inactuel",
+ "short_name": "a-i",
+ "icons": [
+ {
+ "src": "/web-app-manifest-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "/web-app-manifest-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ],
+ "theme_color": "#000000",
+ "background_color": "#000000",
+ "display": "standalone"
+}
\ No newline at end of file
diff --git a/site/blueprints/fields/body.yml b/site/blueprints/fields/body.yml
new file mode 100644
index 0000000..94ab6af
--- /dev/null
+++ b/site/blueprints/fields/body.yml
@@ -0,0 +1,8 @@
+label: Corps
+type: writer
+headings:
+ - 3
+marks:
+ - bold
+ - italic
+ - link
diff --git a/site/blueprints/pages/author.yml b/site/blueprints/pages/author.yml
index bbe1921..7860b89 100644
--- a/site/blueprints/pages/author.yml
+++ b/site/blueprints/pages/author.yml
@@ -9,11 +9,16 @@ tabs:
type: fields
fields:
presentation:
+ extends: fields/body
label: Présentation
- type: writer
- help: Optionnelle
+ help: |
+ Optionnelle, sans mention du poste. Peut inclure un lien.
+ Exemple : "Co-fondateur des éditions [Athom](http://www.athom.xyz/)."
texts:
label: Textes
type: pages
create: false
query: page.getTexts()
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/authors.yml b/site/blueprints/pages/authors.yml
index 3231859..3ac73b3 100644
--- a/site/blueprints/pages/authors.yml
+++ b/site/blueprints/pages/authors.yml
@@ -7,3 +7,6 @@ tabs:
label: Liste
type: pages
template: author
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/email.yml b/site/blueprints/pages/email.yml
index 3897d39..d62e459 100644
--- a/site/blueprints/pages/email.yml
+++ b/site/blueprints/pages/email.yml
@@ -6,21 +6,41 @@ image:
back: black
color: white
icon: email
-options:
- changeStatus: false
tabs:
contentTab:
- fields:
- month:
- label: Mois
- type: date
- display: "mmmm YYYY"
- default: today
- width: 1/4
- sendBtn:
- type: send-button
- width: 1/4
- content:
- label: Contenu
- type: writer
+ label: Contenu
+ icon: text
+ columns:
+ - width: 1/1
+ fields:
+ body:
+ label: Contenu
+ type: writer
+ sendTab:
+ label: Envoi
+ icon: plane
+ columns:
+ - width: 1/4
+ fields:
+ published:
+ label: Date d'envoi
+ type: date
+ help: Automatiquement rempli au moment de l'envoi.
+ disabled: true
+ width: 1/2
+ - width: 1/2
+ fields:
+ testAdressList:
+ label: Liste d'adresses de test
+ type: structure
+ sortBy: email asc
+ help: Le bouton "Tester" ci-dessous tentera d'envoyer l'email aux adresses de cette liste
+ fields:
+ email:
+ type: email
+ sendBtn:
+ type: send-button
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/grid.yml b/site/blueprints/pages/grid.yml
index 53206c5..414460c 100644
--- a/site/blueprints/pages/grid.yml
+++ b/site/blueprints/pages/grid.yml
@@ -18,6 +18,17 @@ tabs:
fullWidth:
label: Pleine largeur
type: toggle
+ subtitle:
+ label: Sous-titre
+ type: writer
+ help: optionnel
+ marks:
+ - italic
+ node: false
+ chapo:
+ label: Chapo
+ extends: fields/body
+ help: optionnel
body:
label: Corps
type: layout
@@ -31,4 +42,9 @@ tabs:
- image
- line
- quote
+
metaTab: tabs/meta
+
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/info.yml b/site/blueprints/pages/info.yml
index 4b34ad9..67a9664 100644
--- a/site/blueprints/pages/info.yml
+++ b/site/blueprints/pages/info.yml
@@ -15,6 +15,7 @@ tabs:
label: Corps
type: fields
fields:
- body:
- label: Corps
- type: writer
+ body: fields/body
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/linear.yml b/site/blueprints/pages/linear.yml
index a9e13d5..e6cf2e5 100644
--- a/site/blueprints/pages/linear.yml
+++ b/site/blueprints/pages/linear.yml
@@ -15,7 +15,36 @@ tabs:
label: Corps
type: fields
fields:
- body:
- label: Corps
+ subtitle:
+ label: Sous-titre
type: writer
+ help: optionnel
+ marks:
+ - italic
+ node: false
+ chapo:
+ label: Chapo
+ extends: fields/body
+ help: optionnel
+ body:
+ extends: fields/body
+ when:
+ isHtmlMode: false
+ htmlBody:
+ label: Corps
+ type: textarea
+ buttons:
+ - headlines
+ - bold
+ - italic
+ - link
+ when:
+ isHtmlMode: true
+
+ paramsTab: tabs/params
+
metaTab: tabs/meta
+
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/newsletter.yml b/site/blueprints/pages/newsletter.yml
index 8d9273b..080f2e5 100644
--- a/site/blueprints/pages/newsletter.yml
+++ b/site/blueprints/pages/newsletter.yml
@@ -3,19 +3,26 @@ title: Liste de diffusion
tabs:
content:
columns:
+ - width: 1/1
+ fields:
+ body:
+ extends: fields/body
- width: 1/2
fields:
subscribers:
label: Abonnés
type: structure
+ sortBy: email asc
fields:
email:
type: email
- width: 1/2
sections:
newsletters:
- label: Emails
+ label: Lettres
type: pages
template: email
- info: "{{ page.month.toDate('M Y') }}"
- sortBy: month desc
+ info: "{{ page.status == 'listed' ? 'envoyée' : 'brouillon' }}"
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/texts.yml b/site/blueprints/pages/texts.yml
index c010564..8a3347b 100644
--- a/site/blueprints/pages/texts.yml
+++ b/site/blueprints/pages/texts.yml
@@ -1,24 +1,30 @@
title: texts
-columns:
- - width: 1/2
- fields:
- categories:
- type: tags
- - width: 1/2
- sections:
- yearsSection:
- label: Années
- type: pages
- template: year
- sortBy: title desc
- - width: 1/1
- sections:
- allTextsSection:
- label: Tous les textes
- type: pages
- create: false
- search: true
- query: page.children.children
- info: "{{ page.author.toPage.title }} [{{ page.category }}]"
- sortBy: modified desc
+tabs:
+ contentTab:
+ label: Contenu
+ columns:
+ - width: 1/2
+ fields:
+ categories:
+ type: tags
+ - width: 1/2
+ sections:
+ yearsSection:
+ label: Années
+ type: pages
+ template: year
+ sortBy: title desc
+ - width: 1/1
+ sections:
+ allTextsSection:
+ label: Tous les textes
+ type: pages
+ create: false
+ search: true
+ query: page.children.children
+ info: "{{ page.author.toPage.title }} [{{ page.category }}]"
+ sortBy: modified desc
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/pages/year.yml b/site/blueprints/pages/year.yml
index dd1fc5e..d0ad42e 100644
--- a/site/blueprints/pages/year.yml
+++ b/site/blueprints/pages/year.yml
@@ -4,16 +4,30 @@ image:
back: black
color: white
-columns:
- - width: 1/3
- sections:
- texts:
- label: Textes
- type: pages
- templates:
- - linear
- - grid
- - width: 2/3
- fields:
- edito:
- type: writer
+tabs:
+ contentTab:
+ label: Contenu
+ columns:
+ - width: 1/3
+ sections:
+ fieldsSection:
+ type: fields
+ fields:
+ openDate:
+ label: Date d'ouverture
+ type: date
+ display: DD/MM/YYYY
+ texts:
+ label: Textes
+ type: pages
+ help: **Pour réorganiser les textes**, utiliser la poignée ⁝⁝ qui apparait au survol.
+ templates:
+ - linear
+ - grid
+ - width: 2/3
+ fields:
+ edito:
+ type: writer
+ seo:
+ extends: seo/page
+ label: Indexation
diff --git a/site/blueprints/site.yml b/site/blueprints/site.yml
index d9399f4..6ab1ccf 100644
--- a/site/blueprints/site.yml
+++ b/site/blueprints/site.yml
@@ -9,6 +9,7 @@ tabs:
type: writer
nodes: false
marks: false
- edito:
- label: Éditorial
- type: writer
+ edito: fields/body
+ seo:
+ extends: seo/site
+ label: Indexation
diff --git a/site/blueprints/tabs/meta.yml b/site/blueprints/tabs/meta.yml
index 9ca2155..5836a3c 100644
--- a/site/blueprints/tabs/meta.yml
+++ b/site/blueprints/tabs/meta.yml
@@ -3,6 +3,9 @@ sections:
metadata:
type: fields
fields:
+ keywords:
+ label: Mots-clés
+ type: tags
published:
label: Date de publication
type: date
diff --git a/site/blueprints/tabs/params.yml b/site/blueprints/tabs/params.yml
new file mode 100644
index 0000000..b7379de
--- /dev/null
+++ b/site/blueprints/tabs/params.yml
@@ -0,0 +1,13 @@
+label: Paramètres
+fields:
+ isHtmlMode:
+ label: Mode HTML
+ type: toggle
+ width: 1/3
+ help: |
+ Actif : le code HTML du corps sera exécuté.
+ additionnalCss:
+ label: CSS additionnel
+ type: code-editor
+ help: Le point de rupture mobile / ordinateur se situe à 640px.
+ width: 2/3
diff --git a/site/blueprints/users/author.yml b/site/blueprints/users/author.yml
deleted file mode 100644
index 04e5565..0000000
--- a/site/blueprints/users/author.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-title: Auteur
-description: Droits de lecture et écriture de certaines pages.
-image:
- icon: pen
- color: "#FFF"
-
-permissions:
- access:
- *: false
- files:
- *: false
- languages:
- *: false
- pages:
- *: false
- site:
- *: false
- user:
- *: false
- users:
- *: false
-
-fields:
- presentation:
- type: writer
diff --git a/site/collections/categories.php b/site/collections/categories.php
index b6e6c5e..81ec8f6 100644
--- a/site/collections/categories.php
+++ b/site/collections/categories.php
@@ -1,26 +1,28 @@
categories()->split() as $categoryName) {
$category = new Page([
- 'slug' => Str::slug($categoryName),
+ 'slug' => Str::slug($categoryName),
'template' => 'category',
- 'status' => 'listed',
- 'content' => [
+ 'status' => 'listed',
+ 'content' => [
'title' => $categoryName,
],
- 'children' => []
+ 'children' => [],
]);
$categories->add($category);
- }
+ }
return $categories;
}
-function createCategories() {
+function createCategories()
+{
$emptyCategories = createEmptyCategories();
foreach (page('textes')->grandChildren() as $text) {
try {
diff --git a/site/config/config.php b/site/config/config.php
index b173029..3b05f4d 100644
--- a/site/config/config.php
+++ b/site/config/config.php
@@ -1,25 +1,29 @@
true,
- 'panel' => array(
+ 'panel' => [
'menu' => require __DIR__ . '/menu.php',
- 'css' => 'assets/css/panel.css'
- ),
- 'email' => [
- 'transport' => [
- 'type' => 'smtp',
- 'host' => 'smtp.outlook.com',
- 'port' => 587,
- 'security' => 'tls',
- 'auth' => true,
- 'username' => 'adrien.payet@outlook.com',
- 'password' => 't8nVpxCpEZcqH8y'
- ]
+ 'css' => 'assets/css/panel.css',
],
- 'routes' => array(
- require __DIR__ . '/routes/virtual-author.php',
+ 'mailerSendApiKey' => 'mlsn.0a9f20751951e3c2d130b1d6c3749b0a0f5b14f1c52da65a3369d658c736513c',
+ 'email' => [
+ 'transport' => [
+ 'type' => 'smtp',
+ 'host' => 'smtp.mailersend.net',
+ 'port' => 587,
+ 'security' => true,
+ 'auth' => true,
+ 'username' => 'MS_ncQ2K5@actuel-inactuel.fr',
+ 'password' => 'mssp.ou3hOyX.z86org8y2kklew13.raOTfvP',
+ ],
+ ],
+ 'routes' => [
require __DIR__ . '/routes/virtual-category.php',
- require __DIR__ . '/routes/send-newsletter.php',
- ),
-);
+ require __DIR__ . '/routes/subscribe.php',
+ require __DIR__ . '/routes/virtual-pending.php',
+ ],
+ 'hooks' => [
+ 'page.create:after' => require __DIR__ . '/hooks/prefill-test-adress-list.php',
+ ],
+];
diff --git a/site/config/hooks/prefill-test-adress-list.php b/site/config/hooks/prefill-test-adress-list.php
new file mode 100644
index 0000000..f28dc3d
--- /dev/null
+++ b/site/config/hooks/prefill-test-adress-list.php
@@ -0,0 +1,17 @@
+template() == 'email') {
+ $list = [
+ ['email' => 'fournelcecile@yahoo.fr'],
+ ['email' => 'payet.adrien@protonmail.com'],
+ ['email' => 'mazet.zaccardelli@free.fr'],
+ ['email' => 'wafaabida@hotmail.com'],
+ ['email' => 'elisegarraud@yahoo.fr'],
+ ['email' => 'pierre-damien.huyghe@univ-paris1.fr'],
+ ];
+ $page->update([
+ 'testAdressList' => Yaml::encode($list),
+ ]);
+ }
+};
diff --git a/site/config/menu.php b/site/config/menu.php
index aa2c6cb..5b57f01 100644
--- a/site/config/menu.php
+++ b/site/config/menu.php
@@ -2,62 +2,62 @@
return [
'site' => [
- 'label' => 'Accueil',
+ 'label' => 'Accueil',
'current' => function ($current) {
$path = Kirby::instance()->request()->path()->toString();
return Str::contains($path, 'site');
- }
+ },
],
'texts' => [
- 'icon' => 'pen',
- 'label' => 'Textes',
- 'link' => 'pages/textes',
+ 'icon' => 'pen',
+ 'label' => 'Textes',
+ 'link' => 'pages/textes',
'current' => function ($current) {
$path = Kirby::instance()->request()->path()->toString();
return Str::contains($path, 'pages/textes');
- }
+ },
],
'authors' => [
- 'icon' => 'users',
- 'label' => 'Auteurs',
- 'link' => 'pages/auteurs',
+ 'icon' => 'users',
+ 'label' => 'Auteurs',
+ 'link' => 'pages/auteurs',
'current' => function ($current) {
- $path = Kirby::instance()->request()->path()->toString();
- return Str::contains($path, 'pages/auteurs');
- }
+ $path = Kirby::instance()->request()->path()->toString();
+ return Str::contains($path, 'pages/auteurs');
+ },
],
'-',
'-',
'infos' => [
- 'icon' => 'question',
- 'label' => 'À propos',
- 'link' => 'pages/a-propos',
+ 'icon' => 'question',
+ 'label' => 'À propos',
+ 'link' => 'pages/a-propos',
'current' => function ($current) {
$path = Kirby::instance()->request()->path()->toString();
return Str::contains($path, 'pages/a-propos');
- }
+ },
],
- 'newsletter' => [
- 'icon' => 'email',
- 'label' => 'Liste de diffusion',
- 'link' => 'pages/liste-de-diffusion',
+ 'subscription' => [
+ 'icon' => 'email',
+ 'label' => 'Liste de diffusion',
+ 'link' => 'pages/lettre',
'current' => function ($current) {
$path = Kirby::instance()->request()->path()->toString();
return Str::contains($path, 'pages/liste-de-diffusion');
- }
+ },
],
'-',
'-',
'users',
'comments',
'admin' => [
- 'icon' => 'folder',
- 'label' => 'Administration',
- 'link' => 'pages/admin',
+ 'icon' => 'folder',
+ 'label' => 'Administration',
+ 'link' => 'pages/admin',
'current' => function ($current) {
$path = Kirby::instance()->request()->path()->toString();
return Str::contains($path, 'pages/admin');
- }
+ },
],
'-',
'-',
diff --git a/site/config/routes/send-newsletter.php b/site/config/routes/send-newsletter.php
deleted file mode 100644
index 3828bc6..0000000
--- a/site/config/routes/send-newsletter.php
+++ /dev/null
@@ -1,24 +0,0 @@
- '/send-newsletter.json',
- 'method' => 'POST',
- 'action' => function () {
- $jsonRequest = file_get_contents("php://input");
- $request = json_decode($jsonRequest);
-
- $kirby = kirby();
-
- try {
- $kirby->email([
- 'from' => "adrien.payet@outlook.com",
- 'to' => 'payet.adrien@protonmail.com',
- 'subject' => 'actualités',
- 'body' => 'Ceci est un test simple.',
- ]);
- return json_encode(['status' => 'success', 'message' => 'Email envoyé avec succès.']);
- } catch (Exception $error) {
- return json_encode(['status' => 'error', 'message' => $error->getMessage()]);
- }
- }
-];
diff --git a/site/config/routes/subscribe.php b/site/config/routes/subscribe.php
new file mode 100644
index 0000000..7d183d1
--- /dev/null
+++ b/site/config/routes/subscribe.php
@@ -0,0 +1,43 @@
+ '/subscribe.json',
+ 'method' => 'POST',
+ 'action' => function () {
+ $jsonRequest = file_get_contents('php://input');
+ $email = Str::lower(json_decode($jsonRequest));
+
+ if (V::email($email)) {
+ kirby()->impersonate('kirby');
+
+ $page = page('lettre');
+ $subscribers = $page->subscribers()->yaml();
+
+ $emailExists = in_array(['email' => $email], $subscribers);
+
+ if ($emailExists) {
+ return [
+ 'status' => 'error',
+ 'message' => 'Cet email est déjà inscris.',
+ ];
+ }
+
+ $newSubscriber = ['email' => $email];
+ $subscribers[] = $newSubscriber;
+
+ $page->update([
+ 'subscribers' => $subscribers,
+ ]);
+
+ return [
+ 'status' => 'success',
+ 'message' => 'lettre réussie.',
+ ];
+ } else {
+ return [
+ 'status' => 'error',
+ 'message' => 'Email invalide.',
+ ];
+ }
+ },
+];
diff --git a/site/config/routes/virtual-author.php b/site/config/routes/virtual-author.php
deleted file mode 100644
index 0a067a1..0000000
--- a/site/config/routes/virtual-author.php
+++ /dev/null
@@ -1,25 +0,0 @@
- 'auteurs/(:any)',
- 'action' => function ($slug) {
- $kirby = kirby();
- $author = getAuthorBySlug($slug);
-
- return Page::factory(
- [
- 'slug' => '',
- 'template' => 'author',
- 'model' => 'authors',
- 'content' => [
- 'title' => $author->name(),
- 'presentation' => $author->presentation(),
- 'author' => $author->name(),
- 'uuid' => Uuid::generate(),
- ]
- ]
- );
- }
-];
diff --git a/site/config/routes/virtual-category.php b/site/config/routes/virtual-category.php
index 95b525c..75023aa 100644
--- a/site/config/routes/virtual-category.php
+++ b/site/config/routes/virtual-category.php
@@ -5,18 +5,33 @@ use Kirby\Uuid\Uuid;
return [
'pattern' => 'categories/(:any)',
'action' => function ($category) {
- $kirby = kirby();
- return Page::factory(
- [
- 'slug' => '',
- 'template' => 'category',
- 'model' => 'categories',
- 'content' => [
- 'title' => $category,
- 'uuid' => Uuid::generate(),
- ]
- ]
+ $allTexts = page('textes')->grandChildren();
+ $textsInCategory = $allTexts->filter(
+ fn($text) => Str::slug($text->category()) === $category
);
- }
+
+ $texts = [];
+
+ foreach ($textsInCategory as $text) {
+ $texts[] = (string) $text->uri();
+ }
+
+ try {
+ $title = $textsInCategory->first()->category();
+ } catch (\Throwable $th) {
+ go('/erreur');
+ }
+
+ return Page::factory([
+ 'slug' => Str::slug($category) . '-' . Uuid::generate(),
+ 'template' => 'category',
+ 'model' => 'category',
+ 'content' => [
+ 'title' => $title,
+ 'texts' => Yaml::encode($texts),
+ 'uuid' => Uuid::generate(),
+ ],
+ ]);
+ },
];
diff --git a/site/config/routes/virtual-pending.php b/site/config/routes/virtual-pending.php
new file mode 100644
index 0000000..1343227
--- /dev/null
+++ b/site/config/routes/virtual-pending.php
@@ -0,0 +1,18 @@
+ 'a-venir',
+ 'action' => function () {
+ return Page::factory([
+ 'slug' => 'a-venir',
+ 'template' => 'error',
+ 'content' => [
+ 'title' => 'Textes disponibles à partir du 21 janvier',
+ 'body' => 'Rendez-vous vendredi 21 février à partir de 18h, au Centre Césure (ancien campus Censier), 13 rue Santeuil, 75005 Paris - salle Las Vergnas (métro Censier-Daubenton ou Saint-Marcel).
',
+ 'uuid' => Uuid::generate(),
+ ],
+ ]);
+ },
+];
diff --git a/site/plugins/code-editor/.editorconfig b/site/plugins/code-editor/.editorconfig
new file mode 100644
index 0000000..3c7a80f
--- /dev/null
+++ b/site/plugins/code-editor/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.php]
+indent_size = 4
diff --git a/site/plugins/code-editor/.eslintrc.json b/site/plugins/code-editor/.eslintrc.json
new file mode 100644
index 0000000..ee215b4
--- /dev/null
+++ b/site/plugins/code-editor/.eslintrc.json
@@ -0,0 +1,15 @@
+{
+ "env": {
+ "browser": true,
+ "es2021": true
+ },
+ "extends": [
+ "eslint:recommended",
+ "plugin:vue/recommended",
+ "prettier"
+ ],
+ "parserOptions": {
+ "ecmaVersion": 12,
+ "sourceType": "module"
+ }
+}
diff --git a/site/plugins/code-editor/.gitignore b/site/plugins/code-editor/.gitignore
new file mode 100644
index 0000000..9daa824
--- /dev/null
+++ b/site/plugins/code-editor/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+node_modules
diff --git a/site/plugins/code-editor/LICENSE b/site/plugins/code-editor/LICENSE
new file mode 100644
index 0000000..ee27a83
--- /dev/null
+++ b/site/plugins/code-editor/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Sylvain Julé
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/site/plugins/code-editor/README.md b/site/plugins/code-editor/README.md
new file mode 100644
index 0000000..5a1abbf
--- /dev/null
+++ b/site/plugins/code-editor/README.md
@@ -0,0 +1,111 @@
+# Kirby – Code editor
+
+Code editor field for Kirby 3 and 4.
+
+
+
+
+
+## Overview
+
+> This plugin is completely free and published under the MIT license. However, if you are using it in a commercial project and want to help me keep up with maintenance, please consider [making a donation of your choice](https://paypal.me/sylvainjl) or purchasing your license(s) through [my affiliate link](https://a.paddle.com/v2/click/1129/36369?link=1170).
+
+- [1. Installation](#1-installation)
+- [2. Setup](#2-setup)
+- [3. Options](#3-options)
+- [4. Available languages](#4-available-languages)
+- [5. License](#5-license)
+- [6. Credits](#6-credits)
+
+
+
+## 1. Installation
+
+Download and copy this repository to ```/site/plugins/code-editor```
+
+Alternatively, you can install it with composer: ```composer require sylvainjule/code-editor```
+
+
+
+## 2. Setup
+
+This field adds a code editor in the panel:
+
+```yaml
+editor:
+ label: My code editor
+ type: code-editor
+```
+
+
+
+## 3. Options
+
+| Name | Type | Default | Options | Description |
+| -------------------- | ------------------ | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| language | `String` | `'css'` | - | Syntax mode of the editor. See below for available languages |
+| size | `String` | `'small'` | - | Min height of the editor. `small / medium / large / huge` |
+| lineNumbers | `Boolean` | `true` | - | Whether to show line numbers. |
+| tabSize | `number` | `4` | - | The number of characters to insert when pressing tab key. |
+| insertSpaces | `boolean` | `true` | - | Whether to use spaces for indentation. If you set it to `false`, you might also want to set `tabSize` to `1` |
+| ignoreTabKey | `boolean` | `false` | - | Whether the editor should ignore tab key presses so that keyboard users can tab past the editor. Users can toggle this behaviour using `Ctrl+Shift+M` (Mac) / `Ctrl+M` manually when this is `false`. |
+
+
+Note that you can make the default height any height you want with some [custom panel CSS](https://getkirby.com/docs/reference/system/options/panel#custom-panel-css). First, set the `size` option to any string you'd like:
+
+```yaml
+size: custom-size
+```
+
+Then in your `panel.css`:
+
+```css
+.k-code-editor-input[data-size="custom-size"] {
+ min-height: 15rem;
+}
+```
+
+### 3.1. Default options
+
+You can globally override the default options, instead of setting them on a per-field basis. In your `site/config/config.php`:
+
+```php
+return [
+ 'sylvainjule.code-editor.language' => 'css',
+ 'sylvainjule.code-editor.size' => 'small',
+ 'sylvainjule.code-editor.lineNumbers' => true,
+ 'sylvainjule.code-editor.tabSize' => 4,
+ 'sylvainjule.code-editor.insertSpaces' => true,
+ 'sylvainjule.code-editor.ignoreTabKey' => false,
+];
+```
+
+
+
+## 4. Available languages
+
+Currently supported languages are:
+
+* `css`
+* `javascript`
+* `json`
+* `less`
+* `php`
+* `python`
+* `ruby`
+* `scss`
+* `yaml`
+
+
+
+## 5. License
+
+MIT
+
+
+
+## 6. Credits
+
+**Code editor:**
+
+- [Vue Prism Editor](https://github.com/koca/vue-prism-editor)
diff --git a/site/plugins/code-editor/composer.json b/site/plugins/code-editor/composer.json
new file mode 100644
index 0000000..e14bec8
--- /dev/null
+++ b/site/plugins/code-editor/composer.json
@@ -0,0 +1,20 @@
+{
+ "name": "sylvainjule/code-editor",
+ "description": "Code editor field for Kirby 3 and 4",
+ "type": "kirby-plugin",
+ "license": "MIT",
+ "version": "1.0.3",
+ "authors": [
+ {
+ "name": "Sylvain Julé",
+ "email": "contact@sylvain-jule.fr"
+ }
+ ],
+ "require": {
+ "getkirby/composer-installer": "^1.1"
+ },
+ "extra": {
+ "installer-name": "code-editor"
+ },
+ "minimum-stability": "beta"
+}
diff --git a/site/plugins/code-editor/index.css b/site/plugins/code-editor/index.css
new file mode 100644
index 0000000..8abe982
--- /dev/null
+++ b/site/plugins/code-editor/index.css
@@ -0,0 +1 @@
+.prism-editor-wrapper{width:100%;height:100%;display:flex;align-items:flex-start;overflow:auto;-o-tab-size:1.5em;tab-size:1.5em;-moz-tab-size:1.5em}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.prism-editor-wrapper .prism-editor__textarea{color:transparent!important}.prism-editor-wrapper .prism-editor__textarea::-moz-selection{background-color:#accef7!important;color:transparent!important}.prism-editor-wrapper .prism-editor__textarea::selection{background-color:#accef7!important;color:transparent!important}}.prism-editor-wrapper .prism-editor__container{position:relative;text-align:left;box-sizing:border-box;padding:0;overflow:hidden;width:100%}.prism-editor-wrapper .prism-editor__line-numbers{height:100%;overflow:hidden;flex-shrink:0;padding-top:4px;margin-top:0;margin-right:10px}.prism-editor-wrapper .prism-editor__line-number{text-align:right;white-space:nowrap}.prism-editor-wrapper .prism-editor__textarea{position:absolute;top:0;left:0;height:100%;width:100%;resize:none;color:inherit;overflow:hidden;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-text-fill-color:transparent}.prism-editor-wrapper .prism-editor__editor,.prism-editor-wrapper .prism-editor__textarea{margin:0;border:0;background:none;box-sizing:inherit;display:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-variant-ligatures:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;-moz-tab-size:inherit;-o-tab-size:inherit;tab-size:inherit;text-indent:inherit;text-rendering:inherit;text-transform:inherit;white-space:pre-wrap;word-wrap:keep-all;overflow-wrap:break-word;padding:0}.prism-editor-wrapper .prism-editor__textarea--empty{-webkit-text-fill-color:inherit!important}.prism-editor-wrapper .prism-editor__editor{position:relative;pointer-events:none}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.k-code-editor-input{background:#2d2d2d;color:#ccc;font-family:Fira code,Fira Mono,Consolas,Menlo,Courier,monospace;font-size:.9rem;line-height:1.5;padding:10px}.k-code-editor-input[data-size=small]{min-height:7.5rem}.k-code-editor-input[data-size=medium]{min-height:15rem}.k-code-editor-input[data-size=large],.k-code-editor-input[data-size=huge]{min-height:30rem}.prism-editor__textarea:focus{outline:none}
diff --git a/site/plugins/code-editor/index.js b/site/plugins/code-editor/index.js
new file mode 100644
index 0000000..a51c14c
--- /dev/null
+++ b/site/plugins/code-editor/index.js
@@ -0,0 +1,14 @@
+(()=>{(function(){"use strict";function D(){return D=Object.assign||function(r){for(var e=1;e ";return e},lineNumbersCount:function(){var e=this.codeData.split(/\r\n|\n/).length;return e}},mounted:function(){this._recordCurrentState(),this.styleLineNumbers()},methods:{setLineNumbersHeight:function(){this.lineNumbersHeight=getComputedStyle(this.$refs.pre).height},styleLineNumbers:function(){if(!(!this.lineNumbers||!this.autoStyleLineNumbers)){var e=this.$refs.pre,i=this.$el.querySelector(".prism-editor__line-numbers"),d=window.getComputedStyle(e);this.$nextTick(function(){var h="border-top-left-radius",b="border-bottom-left-radius";if(!!i){i.style[h]=d[h],i.style[b]=d[b],e.style[h]="0",e.style[b]="0";var p=["background-color","margin-top","padding-top","font-family","font-size","line-height"];p.forEach(function(a){i.style[a]=d[a]}),i.style["margin-bottom"]="-"+d["padding-top"]}})}},_recordCurrentState:function(){var e=this.$refs.textarea;if(!!e){var i=e.value,d=e.selectionStart,h=e.selectionEnd;this._recordChange({value:i,selectionStart:d,selectionEnd:h})}},_getLines:function(e,i){return e.substring(0,i).split(`
+`)},_applyEdits:function(e){var i=this.$refs.textarea,d=this.history.stack[this.history.offset];d&&i&&(this.history.stack[this.history.offset]=D({},d,{selectionStart:i.selectionStart,selectionEnd:i.selectionEnd})),this._recordChange(e),this._updateInput(e)},_recordChange:function(e,i){i===void 0&&(i=!1);var d=this.history,h=d.stack,b=d.offset;if(h.length&&b>-1){this.history.stack=h.slice(0,b+1);var p=this.history.stack.length;if(p>X){var a=p-X;this.history.stack=h.slice(a,p),this.history.offset=Math.max(this.history.offset-a,0)}}var u=Date.now();if(i){var c=this.history.stack[this.history.offset];if(c&&u-c.timestamp=$&&K<=v&&k.startsWith(c)?k.substring(c.length):k}).join(`
+`);if(p!==S){var F=x[$];this._applyEdits({value:S,selectionStart:F.startsWith(c)?a-c.length:a,selectionEnd:u-(p.length-S.length)})}}else if(a!==u){var E=this._getLines(p,a),z=E.length-1,P=this._getLines(p,u).length-1,t=E[z];this._applyEdits({value:p.split(`
+`).map(function(k,K){return K>=z&&K<=P?c+k:k}).join(`
+`),selectionStart:/\S/.test(t)?a+c.length:a,selectionEnd:u+c.length*(P-z+1)})}else{var n=a+c.length;this._applyEdits({value:p.substring(0,a)+c+p.substring(u),selectionStart:n,selectionEnd:n})}else if(e.keyCode===ie){var s=a!==u,o=p.substring(0,a);if(o.endsWith(c)&&!s){e.preventDefault();var l=a-c.length;this._applyEdits({value:p.substring(0,a-c.length)+p.substring(u),selectionStart:l,selectionEnd:l})}}else if(e.keyCode===ae){if(a===u){var f=this._getLines(p,a).pop(),y=f==null?void 0:f.match(/^\s+/);if(y&&y[0]){e.preventDefault();var g=`
+`+y[0],w=a+g.length;this._applyEdits({value:p.substring(0,a)+g+p.substring(u),selectionStart:w,selectionEnd:w})}}}else if(e.keyCode===Y||e.keyCode===G||e.keyCode===U||e.keyCode===Q){var m;e.keyCode===Y&&e.shiftKey?m=["(",")"]:e.keyCode===G?e.shiftKey?m=["{","}"]:m=["[","]"]:e.keyCode===U?e.shiftKey?m=['"','"']:m=["'","'"]:e.keyCode===Q&&!e.shiftKey&&(m=["`","`"]),a!==u&&m&&(e.preventDefault(),this._applyEdits({value:p.substring(0,a)+m[0]+p.substring(a,u)+m[1]+p.substring(u),selectionStart:a,selectionEnd:u+2}))}else(M?e.metaKey&&e.keyCode===B:e.ctrlKey&&e.keyCode===B)&&!e.shiftKey&&!e.altKey?(e.preventDefault(),this._undoEdit()):(M?e.metaKey&&e.keyCode===B&&e.shiftKey:de?e.ctrlKey&&e.keyCode===se:e.ctrlKey&&e.keyCode===B&&e.shiftKey)&&!e.altKey?(e.preventDefault(),this._redoEdit()):e.keyCode===oe&&e.ctrlKey&&(M?e.shiftKey:!0)&&(e.preventDefault(),this.capture=!this.capture)}}},render:function(e){var i=this,d=e("div",{attrs:{class:"prism-editor__line-width-calc",style:"height: 0px; visibility: hidden; pointer-events: none;"}},"999"),h=e("div",{staticClass:"prism-editor__line-numbers",style:{"min-height":this.lineNumbersHeight},attrs:{"aria-hidden":"true"}},[d,Array.from(Array(this.lineNumbersCount).keys()).map(function(u,c){return e("div",{attrs:{class:"prism-editor__line-number token comment"}},""+ ++c)})]),b=e("textarea",{ref:"textarea",on:{input:this.handleChange,keydown:this.handleKeyDown,click:function(c){i.$emit("click",c)},keyup:function(c){i.$emit("keyup",c)},focus:function(c){i.$emit("focus",c)},blur:function(c){i.$emit("blur",c)}},staticClass:"prism-editor__textarea",class:{"prism-editor__textarea--empty":this.isEmpty},attrs:{spellCheck:"false",autocapitalize:"off",autocomplete:"off",autocorrect:"off","data-gramm":"false",placeholder:this.placeholder,"data-testid":"textarea",readonly:this.readonly},domProps:{value:this.codeData}}),p=e("pre",{ref:"pre",staticClass:"prism-editor__editor",attrs:{"data-testid":"preview"},domProps:{innerHTML:this.content}}),a=e("div",{staticClass:"prism-editor__container"},[b,p]);return e("div",{staticClass:"prism-editor-wrapper"},[this.lineNumbers&&h,a])}},xe="",J=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},R={exports:{}};(function(r){var e=typeof window!="undefined"?window:typeof WorkerGlobalScope!="undefined"&&self instanceof WorkerGlobalScope?self:{};/**
+ * Prism: Lightweight, robust, elegant syntax highlighting
+ *
+ * @license MIT
+ * @author Lea Verou
+ * @namespace
+ * @public
+ */var i=function(d){var h=/\blang(?:uage)?-([\w-]+)\b/i,b=0,p={},a={manual:d.Prism&&d.Prism.manual,disableWorkerMessageHandler:d.Prism&&d.Prism.disableWorkerMessageHandler,util:{encode:function t(n){return n instanceof u?new u(n.type,t(n.content),n.alias):Array.isArray(n)?n.map(t):n.replace(/&/g,"&").replace(/"+l.content+""+l.tag+">"};function c(t,n,s,o){t.lastIndex=n;var l=t.exec(s);if(l&&o&&l[1]){var f=l[1].length;l.index+=f,l[0]=l[0].slice(f)}return l}function x(t,n,s,o,l,f){for(var y in s)if(!(!s.hasOwnProperty(y)||!s[y])){var g=s[y];g=Array.isArray(g)?g:[g];for(var w=0;w=f.reach);C+=_.value.length,_=_.next){var T=_.value;if(n.length>t.length)return;if(!(T instanceof u)){var I=1,A;if(ee){if(A=c(te,C,t,K),!A)break;var j=A.index,_e=A.index+A[0].length,N=C;for(N+=_.value.length;j>=N;)_=_.next,N+=_.value.length;if(N-=_.value.length,C=N,_.value instanceof u)continue;for(var O=_;O!==n.tail&&(N<_e||typeof O.value=="string");O=O.next)I++,N+=O.value.length;I--,T=t.slice(C,N),A.index-=C}else if(A=c(te,0,T,K),!A)continue;var j=A.index,L=A[0],Z=T.slice(0,j),ne=T.slice(j+L.length),H=C+T.length;f&&H>f.reach&&(f.reach=H);var q=_.prev;Z&&(q=v(n,q,Z),C+=Z.length),S(n,q,I);var ke=new u(y,k?a.tokenize(L,k):L,ve,L);if(_=v(n,q,ke),ne&&v(n,_,ne),I>1){var W={cause:y+","+w,reach:H};x(t,n,s,_.prev,C,W),f&&W.reach>f.reach&&(f.reach=W.reach)}}}}}}function $(){var t={value:null,prev:null,next:null},n={value:null,prev:t,next:null};t.next=n,this.head=t,this.tail=n,this.length=0}function v(t,n,s){var o=n.next,l={value:s,prev:n,next:o};return n.next=l,o.prev=l,t.length++,l}function S(t,n,s){for(var o=n.next,l=0;l=b.length);u++){var c=a[u];if(typeof c=="string"||c.content&&typeof c.content=="string"){var x=b[h],$=i.tokenStack[x],v=typeof c=="string"?c:c.content,S=e(d,x),F=v.indexOf(S);if(F>-1){++h;var E=v.substring(0,F),z=new r.Token(d,r.tokenize($,i.grammar),"language-"+d,$),P=v.substring(F+S.length),t=[];E&&t.push.apply(t,p([E])),t.push(z),P&&t.push.apply(t,p([P])),typeof c=="string"?a.splice.apply(a,[u,1].concat(t)):c.content=t}}else c.content&&p(c.content)}return a}p(i.tokens)}}})}(Prism),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(r){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;r.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},r.languages.css.atrule.inside.rest=r.languages.css;var i=r.languages.markup;i&&(i.tag.addInlined("style","css"),i.tag.addAttribute("style","css"))}(Prism),Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json,Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),function(r){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,i=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],d=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,h=/=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,b=/[{}\[\](),:;]/;r.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:i,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:d,operator:h,punctuation:b};var p={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:r.languages.php},a=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:p}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:p}}];r.languages.insertBefore("php","variable",{string:a,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:a,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:i,number:d,operator:h,punctuation:b}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),r.hooks.add("before-tokenize",function(u){if(!!/<\?/.test(u.code)){var c=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi;r.languages["markup-templating"].buildPlaceholders(u,"php",c)}}),r.hooks.add("after-tokenize",function(u){r.languages["markup-templating"].tokenizePlaceholders(u,"php")})}(Prism),Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern://,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(r){r.languages.ruby=r.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var e={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:r.languages.ruby}};delete r.languages.ruby.function,r.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:e}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:e}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:r.languages.ruby}}}),r.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),r.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:e}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:e}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:e}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],r.languages.rb=r.languages.ruby}(Prism),Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|forward|for|each|while|import|use|extend|debug|warn|mixin|include|function|return|content)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|with|show|hide)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss,function(r){var e=/[*&][^\s[\]{},]+/,i=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,d="(?:"+i.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+i.source+")?)",h=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),b=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function p(a,u){u=(u||"").replace(/m/g,"")+"m";var c=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return d}).replace(/<>/g,function(){return a});return RegExp(c,u)}r.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return d})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return d}).replace(/<>/g,function(){return"(?:"+h+"|"+b+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:p(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:p(/true|false/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:p(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:p(b),lookbehind:!0,greedy:!0},number:{pattern:p(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:i,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},r.languages.yml=r.languages.yaml}(Prism);var $e="",pe=function(){var r=this,e=r.$createElement,i=r._self._c||e;return i("k-field",r._b({staticClass:"k-code-editor-field",attrs:{input:r.uid}},"k-field",r.$props,!1),[i("prism-editor",{staticClass:"k-code-editor-input",attrs:{highlight:r.highlighter,"line-numbers":r.lineNumbers,"tab-size":r.tabSize,"insert-spaces":r.insertSpaces,"ignore-tab-key":r.ignoreTabKey,"data-size":r.size},on:{input:r.onCodeInput},model:{value:r.code,callback:function(d){r.code=d},expression:"code"}})],1)},fe=[],Se="";function ge(r,e,i,d,h,b,p,a){var u=typeof r=="function"?r.options:r;e&&(u.render=e,u.staticRenderFns=i,u._compiled=!0),d&&(u.functional=!0),b&&(u._scopeId="data-v-"+b);var c;if(p?(c=function(v){v=v||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,!v&&typeof __VUE_SSR_CONTEXT__!="undefined"&&(v=__VUE_SSR_CONTEXT__),h&&h.call(this,v),v&&v._registeredComponents&&v._registeredComponents.add(p)},u._ssrRegister=c):h&&(c=a?function(){h.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:h),c)if(u.functional){u._injectStyles=c;var x=u.render;u.render=function(S,F){return c.call(F),x(S,F)}}else{var $=u.beforeCreate;u.beforeCreate=$?[].concat($,c):[c]}return{exports:r,options:u}}const he={components:{PrismEditor:ce},extends:"k-textarea-field",props:{size:String,language:String,lineNumbers:Boolean,tabSize:Number,insertSpaces:Boolean,ignoreTabKey:Boolean},data(){return{code:""}},mounted(){this.code=this.value},methods:{highlighter(){return R.exports.highlight(this.code,R.exports.languages[this.language])},onCodeInput(){this.$emit("input",this.code)}}},V={};var be=ge(he,pe,fe,!1,ye,null,null,null);function ye(r){for(let e in V)this[e]=V[e]}var me=function(){return be.exports}();window.panel.plugin("sylvainjule/code-editor",{fields:{"code-editor":me}})})();})();
diff --git a/site/plugins/code-editor/index.php b/site/plugins/code-editor/index.php
new file mode 100644
index 0000000..ba1302a
--- /dev/null
+++ b/site/plugins/code-editor/index.php
@@ -0,0 +1,15 @@
+ [
+ 'language' => 'css',
+ 'size' => 'small',
+ 'lineNumbers' => true,
+ 'tabSize' => 4,
+ 'insertSpaces' => true,
+ 'ignoreTabKey' => false,
+ ],
+ 'fields' => [
+ 'code-editor' => require_once __DIR__ . '/lib/fields/code-editor.php',
+ ],
+]);
diff --git a/site/plugins/code-editor/lib/fields/code-editor.php b/site/plugins/code-editor/lib/fields/code-editor.php
new file mode 100644
index 0000000..343b545
--- /dev/null
+++ b/site/plugins/code-editor/lib/fields/code-editor.php
@@ -0,0 +1,32 @@
+root('kirby') . '/config/fields/textarea.php';
+
+/* Merge new properties
+--------------------------------*/
+
+$options = A::merge($options, [
+ 'props' => [
+ 'size' => function($size = null) {
+ return $size ?? option('sylvainjule.code-editor.size');
+ },
+ 'language' => function($language = null) {
+ return $language ?? option('sylvainjule.code-editor.language');
+ },
+ 'lineNumbers' => function($lineNumbers = null) {
+ return $lineNumbers ?? option('sylvainjule.code-editor.lineNumbers');
+ },
+ 'tabSize' => function($tabSize = null) {
+ return $tabSize ?? option('sylvainjule.code-editor.tabSize');
+ },
+ 'insertSpaces' => function($insertSpaces = null) {
+ return $tabSize ?? option('sylvainjule.code-editor.insertSpaces');
+ },
+ 'ignoreTabKey' => function($ignoreTabKey = null) {
+ return $tabSize ?? option('sylvainjule.code-editor.ignoreTabKey');
+ },
+ ]
+]);
+
+// return the updated options
+return $options;
diff --git a/site/plugins/code-editor/package-lock.json b/site/plugins/code-editor/package-lock.json
new file mode 100644
index 0000000..adfcff1
--- /dev/null
+++ b/site/plugins/code-editor/package-lock.json
@@ -0,0 +1,6615 @@
+{
+ "name": "kirby-code-editor",
+ "version": "0.1.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "kirby-code-editor",
+ "version": "0.1.0",
+ "license": "MIT",
+ "devDependencies": {
+ "consola": "^2.15.3",
+ "eslint": "^8.3.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-vue": "^8.1.1",
+ "kirbyup": "^0.21.1",
+ "prettier": "^2.5.0",
+ "prismjs": "^1.25.0",
+ "vue-prism-editor": "^1.3.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
+ "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.16.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
+ "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz",
+ "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "@babel/generator": "^7.16.0",
+ "@babel/helper-compilation-targets": "^7.16.0",
+ "@babel/helper-module-transforms": "^7.16.0",
+ "@babel/helpers": "^7.16.0",
+ "@babel/parser": "^7.16.0",
+ "@babel/template": "^7.16.0",
+ "@babel/traverse": "^7.16.0",
+ "@babel/types": "^7.16.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.1.2",
+ "semver": "^6.3.0",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/core/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz",
+ "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
+ "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.16.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
+ "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.16.0",
+ "@babel/helper-validator-option": "^7.14.5",
+ "browserslist": "^4.17.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz",
+ "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.0",
+ "@babel/helper-function-name": "^7.16.0",
+ "@babel/helper-member-expression-to-functions": "^7.16.0",
+ "@babel/helper-optimise-call-expression": "^7.16.0",
+ "@babel/helper-replace-supers": "^7.16.0",
+ "@babel/helper-split-export-declaration": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
+ "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.16.0",
+ "@babel/template": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
+ "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
+ "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz",
+ "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
+ "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz",
+ "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.0",
+ "@babel/helper-replace-supers": "^7.16.0",
+ "@babel/helper-simple-access": "^7.16.0",
+ "@babel/helper-split-export-declaration": "^7.16.0",
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/template": "^7.16.0",
+ "@babel/traverse": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
+ "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
+ "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz",
+ "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.16.0",
+ "@babel/helper-optimise-call-expression": "^7.16.0",
+ "@babel/traverse": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
+ "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
+ "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.15.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+ "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.16.3",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz",
+ "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.16.0",
+ "@babel/traverse": "^7.16.3",
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
+ "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.16.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz",
+ "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz",
+ "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.16.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.4.tgz",
+ "integrity": "sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-decorators": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz",
+ "integrity": "sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz",
+ "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz",
+ "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz",
+ "integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-typescript": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
+ "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "@babel/parser": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.16.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz",
+ "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "@babel/generator": "^7.16.0",
+ "@babel/helper-function-name": "^7.16.0",
+ "@babel/helper-hoist-variables": "^7.16.0",
+ "@babel/helper-split-export-declaration": "^7.16.0",
+ "@babel/parser": "^7.16.3",
+ "@babel/types": "^7.16.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
+ "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
+ "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.0.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
+ "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz",
+ "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==",
+ "dev": true,
+ "dependencies": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-jsx-merge-props": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz",
+ "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==",
+ "dev": true
+ },
+ "node_modules/@vue/babel-plugin-transform-vue-jsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz",
+ "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "html-tags": "^2.0.0",
+ "lodash.kebabcase": "^4.1.1",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-preset-jsx": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz",
+ "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==",
+ "dev": true,
+ "dependencies": {
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "@vue/babel-sugar-composition-api-inject-h": "^1.2.1",
+ "@vue/babel-sugar-composition-api-render-instance": "^1.2.4",
+ "@vue/babel-sugar-functional-vue": "^1.2.2",
+ "@vue/babel-sugar-inject-h": "^1.2.2",
+ "@vue/babel-sugar-v-model": "^1.2.3",
+ "@vue/babel-sugar-v-on": "^1.2.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-composition-api-inject-h": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz",
+ "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-composition-api-render-instance": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz",
+ "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-functional-vue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz",
+ "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-inject-h": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz",
+ "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-model": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz",
+ "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "camelcase": "^5.0.0",
+ "html-tags": "^2.0.0",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-on": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz",
+ "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "camelcase": "^5.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz",
+ "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==",
+ "dev": true,
+ "dependencies": {
+ "consolidate": "^0.15.1",
+ "hash-sum": "^1.0.2",
+ "lru-cache": "^4.1.2",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^7.0.36",
+ "postcss-selector-parser": "^6.0.2",
+ "source-map": "~0.6.1",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "optionalDependencies": {
+ "prettier": "^1.18.2 || ^2.0.0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/consolidate": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+ "dev": true
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz",
+ "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "node_modules/babel-code-frame/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "dev": true
+ },
+ "node_modules/babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "dev": true
+ },
+ "node_modules/babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "dev": true
+ },
+ "node_modules/babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "dependencies": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-preset-env": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ }
+ },
+ "node_modules/babel-preset-env/node_modules/browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "dev": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ }
+ },
+ "node_modules/babel-preset-env/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "node_modules/babel-types/node_modules/to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true,
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz",
+ "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==",
+ "dev": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001280",
+ "electron-to-chromium": "^1.3.896",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.12",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.12.tgz",
+ "integrity": "sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001283",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
+ "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/consola": {
+ "version": "2.15.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
+ "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
+ "dev": true
+ },
+ "node_modules/consolidate": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz",
+ "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.7.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
+ "dev": true,
+ "hasInstallScript": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz",
+ "integrity": "sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg==",
+ "dev": true
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz",
+ "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "optionalDependencies": {
+ "esbuild-android-arm64": "0.13.15",
+ "esbuild-darwin-64": "0.13.15",
+ "esbuild-darwin-arm64": "0.13.15",
+ "esbuild-freebsd-64": "0.13.15",
+ "esbuild-freebsd-arm64": "0.13.15",
+ "esbuild-linux-32": "0.13.15",
+ "esbuild-linux-64": "0.13.15",
+ "esbuild-linux-arm": "0.13.15",
+ "esbuild-linux-arm64": "0.13.15",
+ "esbuild-linux-mips64le": "0.13.15",
+ "esbuild-linux-ppc64le": "0.13.15",
+ "esbuild-netbsd-64": "0.13.15",
+ "esbuild-openbsd-64": "0.13.15",
+ "esbuild-sunos-64": "0.13.15",
+ "esbuild-windows-32": "0.13.15",
+ "esbuild-windows-64": "0.13.15",
+ "esbuild-windows-arm64": "0.13.15"
+ }
+ },
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz",
+ "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz",
+ "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/esbuild-darwin-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz",
+ "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz",
+ "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz",
+ "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz",
+ "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz",
+ "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz",
+ "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz",
+ "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz",
+ "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz",
+ "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz",
+ "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ]
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz",
+ "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz",
+ "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ]
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz",
+ "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz",
+ "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz",
+ "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
+ "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.0.4",
+ "@humanwhocodes/config-array": "^0.6.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.0",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.1.0",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
+ "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.1.1.tgz",
+ "integrity": "sha512-rx64IrlhdfPya6u2V5ukOGiLCTgaCBdMSpczLVqyo8A0l+Vbo+lzvIfEUfAQ2auj+MF6y0TwxLorzdCIzHunnw==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
+ "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
+ "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
+ "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.6.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^3.1.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
+ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
+ "dev": true
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
+ "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
+ "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/kirbyup": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/kirbyup/-/kirbyup-0.21.1.tgz",
+ "integrity": "sha512-EPm7EoQMLhTSfm+WDGgVmHgFb8EDxVLrJf65IQgqz+S90G4GbSnTkyBShXzVTjfd2jbuN+JgEOaB/ahp9Jt4fg==",
+ "dev": true,
+ "dependencies": {
+ "cac": "^6.7.11",
+ "chokidar": "^3.5.2",
+ "colorette": "^2.0.16",
+ "consola": "^2.15.3",
+ "pathe": "^0.2.0",
+ "postcss-dir-pseudo-class": "^6.0.0",
+ "postcss-logical": "^5.0.0",
+ "sass": "^1.43.4",
+ "vite": "^2.6.14",
+ "vite-plugin-vue2": "^1.9.0",
+ "vue": "^2.6.14",
+ "vue-template-compiler": "^2.6.14"
+ },
+ "bin": {
+ "kirbyup": "bin/kirbyup.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "dev": true,
+ "dependencies": {
+ "sourcemap-codec": "^1.4.4"
+ }
+ },
+ "node_modules/merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/merge-source-map/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.1.30",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
+ "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+ "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/pathe": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz",
+ "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.3.tgz",
+ "integrity": "sha512-d5gVKo8ekrircqHOQNvSQk8dhGOuAfu1iP6dzfAlnAmcu7EBJ9cFuZG8B1KZK362aaEO3L1H+WM3ny9xQ29tFw==",
+ "dev": true,
+ "dependencies": {
+ "nanoid": "^3.1.30",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz",
+ "integrity": "sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "6.0.6"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.0.tgz",
+ "integrity": "sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz",
+ "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz",
+ "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==",
+ "dev": true
+ },
+ "node_modules/private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/querystring": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+ "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.60.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz",
+ "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/sass": {
+ "version": "1.43.5",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz",
+ "integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
+ "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+ "dev": true
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.14.tgz",
+ "integrity": "sha512-2HA9xGyi+EhY2MXo0+A2dRsqsAG3eFNEVIo12olkWhOmc8LfiM+eMdrXf+Ruje9gdXgvSqjLI9freec1RUM5EA==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.13.2",
+ "postcss": "^8.3.8",
+ "resolve": "^1.20.0",
+ "rollup": "^2.57.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": ">=12.2.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "less": "*",
+ "sass": "*",
+ "stylus": "*"
+ },
+ "peerDependenciesMeta": {
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-vue2": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-vue2/-/vite-plugin-vue2-1.9.0.tgz",
+ "integrity": "sha512-4vmcoiOmOTGjRnA0hk8tHYqk96ZxRpe4AmeCqJJ8jQuNo+SDF1zXPyhxAUIK1tuK354No77WVHHIimVvZQuvIA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.15.8",
+ "@babel/parser": "^7.15.8",
+ "@babel/plugin-proposal-class-properties": "^7.14.5",
+ "@babel/plugin-proposal-decorators": "^7.15.8",
+ "@babel/plugin-transform-typescript": "^7.15.8",
+ "@rollup/pluginutils": "^4.1.1",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-preset-jsx": "^1.2.4",
+ "@vue/component-compiler-utils": "^3.2.2",
+ "babel-preset-env": "^1.7.0",
+ "consolidate": "^0.16.0",
+ "debug": "^4.3.2",
+ "fs-extra": "^9.1.0",
+ "hash-sum": "^2.0.0",
+ "magic-string": "^0.25.7",
+ "prettier": "^2.4.1",
+ "querystring": "^0.2.1",
+ "rollup": "^2.58.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.7.3",
+ "vue-template-es2015-compiler": "^1.9.1"
+ },
+ "peerDependencies": {
+ "vite": "^2.0.0-beta.23",
+ "vue-template-compiler": "^2.2.0"
+ }
+ },
+ "node_modules/vue": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
+ "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
+ "dev": true
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.0.1.tgz",
+ "integrity": "sha512-lhWjDXJhe3UZw2uu3ztX51SJAPGPey1Tff2RK3TyZURwbuI4vximQLzz4nQfCv8CZq4xx7uIiogHMMoSJPr33A==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^6.0.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz",
+ "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/vue-prism-editor": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/vue-prism-editor/-/vue-prism-editor-1.3.0.tgz",
+ "integrity": "sha512-54RfgtMGRMNr9484zKMOZs1wyLDR6EfFylzE2QrMCD9alCvXyYYcS0vX8oUHh+6pMUu6ts59uSN9cHglpU2NRQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "vue": "^2.6.11"
+ }
+ },
+ "node_modules/vue-template-compiler": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
+ "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
+ "dev": true,
+ "dependencies": {
+ "de-indent": "^1.0.2",
+ "he": "^1.1.0"
+ }
+ },
+ "node_modules/vue-template-es2015-compiler": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
+ "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.16.0"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.16.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
+ "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz",
+ "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.0",
+ "@babel/generator": "^7.16.0",
+ "@babel/helper-compilation-targets": "^7.16.0",
+ "@babel/helper-module-transforms": "^7.16.0",
+ "@babel/helpers": "^7.16.0",
+ "@babel/parser": "^7.16.0",
+ "@babel/template": "^7.16.0",
+ "@babel/traverse": "^7.16.0",
+ "@babel/types": "^7.16.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.1.2",
+ "semver": "^6.3.0",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz",
+ "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
+ "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.16.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
+ "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.16.0",
+ "@babel/helper-validator-option": "^7.14.5",
+ "browserslist": "^4.17.5",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz",
+ "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.0",
+ "@babel/helper-function-name": "^7.16.0",
+ "@babel/helper-member-expression-to-functions": "^7.16.0",
+ "@babel/helper-optimise-call-expression": "^7.16.0",
+ "@babel/helper-replace-supers": "^7.16.0",
+ "@babel/helper-split-export-declaration": "^7.16.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
+ "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.16.0",
+ "@babel/template": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
+ "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
+ "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz",
+ "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
+ "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz",
+ "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.0",
+ "@babel/helper-replace-supers": "^7.16.0",
+ "@babel/helper-simple-access": "^7.16.0",
+ "@babel/helper-split-export-declaration": "^7.16.0",
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/template": "^7.16.0",
+ "@babel/traverse": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
+ "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
+ "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
+ "dev": true
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz",
+ "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.16.0",
+ "@babel/helper-optimise-call-expression": "^7.16.0",
+ "@babel/traverse": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
+ "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
+ "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.15.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+ "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.16.3",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz",
+ "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.16.0",
+ "@babel/traverse": "^7.16.3",
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
+ "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/parser": {
+ "version": "7.16.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz",
+ "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==",
+ "dev": true
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz",
+ "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-decorators": {
+ "version": "7.16.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.4.tgz",
+ "integrity": "sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-decorators": "^7.16.0"
+ }
+ },
+ "@babel/plugin-syntax-decorators": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz",
+ "integrity": "sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz",
+ "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-typescript": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz",
+ "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-typescript": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz",
+ "integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-typescript": "^7.16.0"
+ }
+ },
+ "@babel/template": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
+ "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.0",
+ "@babel/parser": "^7.16.0",
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.16.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz",
+ "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.0",
+ "@babel/generator": "^7.16.0",
+ "@babel/helper-function-name": "^7.16.0",
+ "@babel/helper-hoist-variables": "^7.16.0",
+ "@babel/helper-split-export-declaration": "^7.16.0",
+ "@babel/parser": "^7.16.3",
+ "@babel/types": "^7.16.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
+ "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
+ "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.0.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
+ "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@rollup/pluginutils": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz",
+ "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==",
+ "dev": true,
+ "requires": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ }
+ },
+ "@vue/babel-helper-vue-jsx-merge-props": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz",
+ "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==",
+ "dev": true
+ },
+ "@vue/babel-plugin-transform-vue-jsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz",
+ "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "html-tags": "^2.0.0",
+ "lodash.kebabcase": "^4.1.1",
+ "svg-tags": "^1.0.0"
+ }
+ },
+ "@vue/babel-preset-jsx": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz",
+ "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==",
+ "dev": true,
+ "requires": {
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "@vue/babel-sugar-composition-api-inject-h": "^1.2.1",
+ "@vue/babel-sugar-composition-api-render-instance": "^1.2.4",
+ "@vue/babel-sugar-functional-vue": "^1.2.2",
+ "@vue/babel-sugar-inject-h": "^1.2.2",
+ "@vue/babel-sugar-v-model": "^1.2.3",
+ "@vue/babel-sugar-v-on": "^1.2.3"
+ }
+ },
+ "@vue/babel-sugar-composition-api-inject-h": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz",
+ "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-composition-api-render-instance": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz",
+ "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-functional-vue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz",
+ "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-inject-h": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz",
+ "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-v-model": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz",
+ "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "camelcase": "^5.0.0",
+ "html-tags": "^2.0.0",
+ "svg-tags": "^1.0.0"
+ }
+ },
+ "@vue/babel-sugar-v-on": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz",
+ "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "camelcase": "^5.0.0"
+ }
+ },
+ "@vue/component-compiler-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz",
+ "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==",
+ "dev": true,
+ "requires": {
+ "consolidate": "^0.15.1",
+ "hash-sum": "^1.0.2",
+ "lru-cache": "^4.1.2",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^7.0.36",
+ "postcss-selector-parser": "^6.0.2",
+ "prettier": "^1.18.2 || ^2.0.0",
+ "source-map": "~0.6.1",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "dependencies": {
+ "consolidate": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.1.1"
+ }
+ },
+ "hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
+ }
+ },
+ "acorn": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz",
+ "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "dev": true,
+ "requires": {
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "dev": true
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "dev": true
+ },
+ "babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "dev": true
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-preset-env": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ },
+ "dependencies": {
+ "browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz",
+ "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001280",
+ "electron-to-chromium": "^1.3.896",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "cac": {
+ "version": "6.7.12",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.12.tgz",
+ "integrity": "sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==",
+ "dev": true
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001283",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
+ "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "colorette": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "consola": {
+ "version": "2.15.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
+ "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
+ "dev": true
+ },
+ "consolidate": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz",
+ "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.7.2"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz",
+ "integrity": "sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg==",
+ "dev": true
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "esbuild": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz",
+ "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==",
+ "dev": true,
+ "requires": {
+ "esbuild-android-arm64": "0.13.15",
+ "esbuild-darwin-64": "0.13.15",
+ "esbuild-darwin-arm64": "0.13.15",
+ "esbuild-freebsd-64": "0.13.15",
+ "esbuild-freebsd-arm64": "0.13.15",
+ "esbuild-linux-32": "0.13.15",
+ "esbuild-linux-64": "0.13.15",
+ "esbuild-linux-arm": "0.13.15",
+ "esbuild-linux-arm64": "0.13.15",
+ "esbuild-linux-mips64le": "0.13.15",
+ "esbuild-linux-ppc64le": "0.13.15",
+ "esbuild-netbsd-64": "0.13.15",
+ "esbuild-openbsd-64": "0.13.15",
+ "esbuild-sunos-64": "0.13.15",
+ "esbuild-windows-32": "0.13.15",
+ "esbuild-windows-64": "0.13.15",
+ "esbuild-windows-arm64": "0.13.15"
+ }
+ },
+ "esbuild-android-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz",
+ "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz",
+ "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz",
+ "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz",
+ "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz",
+ "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-32": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz",
+ "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz",
+ "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz",
+ "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz",
+ "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-mips64le": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz",
+ "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-ppc64le": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz",
+ "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-netbsd-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz",
+ "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-openbsd-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz",
+ "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-sunos-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz",
+ "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-32": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz",
+ "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz",
+ "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-arm64": {
+ "version": "0.13.15",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz",
+ "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==",
+ "dev": true,
+ "optional": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
+ "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.0.4",
+ "@humanwhocodes/config-array": "^0.6.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.0",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.1.0",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
+ "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-vue": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.1.1.tgz",
+ "integrity": "sha512-rx64IrlhdfPya6u2V5ukOGiLCTgaCBdMSpczLVqyo8A0l+Vbo+lzvIfEUfAQ2auj+MF6y0TwxLorzdCIzHunnw==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ }
+ },
+ "eslint-scope": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
+ "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
+ "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
+ "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.6.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^3.1.0"
+ }
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
+ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
+ "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "html-tags": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
+ "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "kirbyup": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/kirbyup/-/kirbyup-0.21.1.tgz",
+ "integrity": "sha512-EPm7EoQMLhTSfm+WDGgVmHgFb8EDxVLrJf65IQgqz+S90G4GbSnTkyBShXzVTjfd2jbuN+JgEOaB/ahp9Jt4fg==",
+ "dev": true,
+ "requires": {
+ "cac": "^6.7.11",
+ "chokidar": "^3.5.2",
+ "colorette": "^2.0.16",
+ "consola": "^2.15.3",
+ "pathe": "^0.2.0",
+ "postcss-dir-pseudo-class": "^6.0.0",
+ "postcss-logical": "^5.0.0",
+ "sass": "^1.43.4",
+ "vite": "^2.6.14",
+ "vite-plugin-vue2": "^1.9.0",
+ "vue": "^2.6.14",
+ "vue-template-compiler": "^2.6.14"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "dev": true,
+ "requires": {
+ "sourcemap-codec": "^1.4.4"
+ }
+ },
+ "merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.1.30",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
+ "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+ "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "pathe": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz",
+ "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.3.tgz",
+ "integrity": "sha512-d5gVKo8ekrircqHOQNvSQk8dhGOuAfu1iP6dzfAlnAmcu7EBJ9cFuZG8B1KZK362aaEO3L1H+WM3ny9xQ29tFw==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.1.30",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.1"
+ }
+ },
+ "postcss-dir-pseudo-class": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz",
+ "integrity": "sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "6.0.6"
+ }
+ },
+ "postcss-logical": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.0.tgz",
+ "integrity": "sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz",
+ "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==",
+ "dev": true
+ },
+ "prismjs": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz",
+ "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "querystring": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+ "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "rollup": {
+ "version": "2.60.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz",
+ "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "sass": {
+ "version": "1.43.5",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz",
+ "integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ },
+ "source-map-js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
+ "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
+ "dev": true
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "vite": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.14.tgz",
+ "integrity": "sha512-2HA9xGyi+EhY2MXo0+A2dRsqsAG3eFNEVIo12olkWhOmc8LfiM+eMdrXf+Ruje9gdXgvSqjLI9freec1RUM5EA==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.13.2",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.3.8",
+ "resolve": "^1.20.0",
+ "rollup": "^2.57.0"
+ }
+ },
+ "vite-plugin-vue2": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-vue2/-/vite-plugin-vue2-1.9.0.tgz",
+ "integrity": "sha512-4vmcoiOmOTGjRnA0hk8tHYqk96ZxRpe4AmeCqJJ8jQuNo+SDF1zXPyhxAUIK1tuK354No77WVHHIimVvZQuvIA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.15.8",
+ "@babel/parser": "^7.15.8",
+ "@babel/plugin-proposal-class-properties": "^7.14.5",
+ "@babel/plugin-proposal-decorators": "^7.15.8",
+ "@babel/plugin-transform-typescript": "^7.15.8",
+ "@rollup/pluginutils": "^4.1.1",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-preset-jsx": "^1.2.4",
+ "@vue/component-compiler-utils": "^3.2.2",
+ "babel-preset-env": "^1.7.0",
+ "consolidate": "^0.16.0",
+ "debug": "^4.3.2",
+ "fs-extra": "^9.1.0",
+ "hash-sum": "^2.0.0",
+ "magic-string": "^0.25.7",
+ "prettier": "^2.4.1",
+ "querystring": "^0.2.1",
+ "rollup": "^2.58.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.7.3",
+ "vue-template-es2015-compiler": "^1.9.1"
+ }
+ },
+ "vue": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
+ "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
+ "dev": true
+ },
+ "vue-eslint-parser": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.0.1.tgz",
+ "integrity": "sha512-lhWjDXJhe3UZw2uu3ztX51SJAPGPey1Tff2RK3TyZURwbuI4vximQLzz4nQfCv8CZq4xx7uIiogHMMoSJPr33A==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^6.0.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz",
+ "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ }
+ }
+ },
+ "vue-prism-editor": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/vue-prism-editor/-/vue-prism-editor-1.3.0.tgz",
+ "integrity": "sha512-54RfgtMGRMNr9484zKMOZs1wyLDR6EfFylzE2QrMCD9alCvXyYYcS0vX8oUHh+6pMUu6ts59uSN9cHglpU2NRQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "vue-template-compiler": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
+ "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
+ "dev": true,
+ "requires": {
+ "de-indent": "^1.0.2",
+ "he": "^1.1.0"
+ }
+ },
+ "vue-template-es2015-compiler": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+}
diff --git a/site/plugins/code-editor/package.json b/site/plugins/code-editor/package.json
new file mode 100644
index 0000000..2c28c0c
--- /dev/null
+++ b/site/plugins/code-editor/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "kirby-code-editor",
+ "version": "1.0.3",
+ "description": "Code editor field for Kirby 3 and 4",
+ "main": "index.js",
+ "author": "Kirby Community",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:sylvainjule/kirby-code-editor.git"
+ },
+ "scripts": {
+ "dev": "kirbyup src/index.js --watch",
+ "build": "kirbyup src/index.js",
+ "lint": "eslint \"src/**/*.{js,vue}\"",
+ "lint:fix": "npm run lint -- --fix",
+ "format": "prettier --write \"src/**/*.{css,js,vue}\"",
+ "prepare": "node src/node/patchVuePrismEditor.mjs"
+ },
+ "devDependencies": {
+ "consola": "^2.15.3",
+ "eslint": "^8.3.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-vue": "^8.1.1",
+ "kirbyup": "^0.21.1",
+ "prettier": "^2.5.0",
+ "prismjs": "^1.25.0",
+ "vue-prism-editor": "^1.3.0"
+ }
+}
diff --git a/site/plugins/code-editor/src/assets/css/abstracts/_variables.scss b/site/plugins/code-editor/src/assets/css/abstracts/_variables.scss
new file mode 100644
index 0000000..c04bd5a
--- /dev/null
+++ b/site/plugins/code-editor/src/assets/css/abstracts/_variables.scss
@@ -0,0 +1,62 @@
+/* Colors
+---------------------------------*/
+
+$color-black: #000;
+$color-white: #fff;
+$color-dark: #16171a;
+$color-dark-grey: #777;
+$color-light: #efefef;
+$color-light-grey: #999;
+$color-background: $color-light;
+$color-positive: #5d800d;
+$color-positive-border: $color-positive;
+$color-positive-outline: rgba($color-positive, 0.25);
+$color-positive-on-dark: #a7bd68;
+$color-focus: #4271ae;
+$color-focus-border: $color-focus;
+$color-focus-outline: rgba($color-focus, 0.25);
+$color-focus-on-dark: #81a2be;
+$color-notice: #f5871f;
+$color-notice-on-dark: #de935f;
+$color-negative: #c82829;
+$color-negative-border: $color-negative;
+$color-negative-outline: rgba($color-negative, 0.25);
+$color-negative-on-dark: #d16464;
+$color-border: #ccc;
+$color-backdrop: rgba($color-dark, 0.6);
+$color-inset: #ebebeb;
+
+
+/* Breakpoint
+---------------------------------*/
+
+$breakpoint-small: 30em;
+$breakpoint-menu: 45em;
+$breakpoint-medium: 65em;
+$breakpoint-large: 90em;
+$breakpoint-huge: 120em;
+
+
+/* Fields
+---------------------------------*/
+
+$field-input-padding: .5rem;
+$field-input-height: 2.25rem;
+$field-input-line-height: 1.25rem;
+
+
+/* Typography
+---------------------------------*/
+
+$font-size-tiny: 0.75rem;
+$font-size-small: 0.875rem;
+$font-size-medium: 1rem;
+$font-size-large: 1.25rem;
+$font-size-huge: 1.5rem;
+$font-size-monster: 1.75rem;
+
+$font-weight-normal: 400;
+$font-weight-bold: 600;
+
+$font-family-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+$font-family-mono: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
diff --git a/site/plugins/code-editor/src/assets/css/styles.scss b/site/plugins/code-editor/src/assets/css/styles.scss
new file mode 100644
index 0000000..c443871
--- /dev/null
+++ b/site/plugins/code-editor/src/assets/css/styles.scss
@@ -0,0 +1,29 @@
+@import
+ 'abstracts/variables.scss';
+
+.k-code-editor-input {
+ background: #2d2d2d;
+ color: #ccc;
+ font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
+ font-size: .9rem;
+ line-height: 1.5;
+ padding: 10px;
+
+ &[data-size="small"] {
+ min-height: 7.5rem;
+ }
+ &[data-size="medium"] {
+ min-height: 15rem;
+ }
+ &[data-size="large"] {
+ min-height: 30rem;
+ }
+ &[data-size="huge"] {
+ min-height: 30rem;
+ }
+
+}
+
+.prism-editor__textarea:focus {
+ outline: none;
+}
diff --git a/site/plugins/code-editor/src/components/field/CodeEditor.vue b/site/plugins/code-editor/src/components/field/CodeEditor.vue
new file mode 100644
index 0000000..d6b486d
--- /dev/null
+++ b/site/plugins/code-editor/src/components/field/CodeEditor.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
diff --git a/site/plugins/code-editor/src/index.js b/site/plugins/code-editor/src/index.js
new file mode 100644
index 0000000..89e4600
--- /dev/null
+++ b/site/plugins/code-editor/src/index.js
@@ -0,0 +1,7 @@
+import CodeEditor from "./components/field/CodeEditor.vue";
+
+window.panel.plugin("sylvainjule/code-editor", {
+ fields: {
+ "code-editor": CodeEditor,
+ },
+});
diff --git a/site/plugins/code-editor/src/node/patchVuePrismEditor.mjs b/site/plugins/code-editor/src/node/patchVuePrismEditor.mjs
new file mode 100644
index 0000000..3b80640
--- /dev/null
+++ b/site/plugins/code-editor/src/node/patchVuePrismEditor.mjs
@@ -0,0 +1,38 @@
+import { existsSync, readFileSync, writeFileSync } from "fs";
+import chalk from "chalk";
+import consola from "consola";
+
+const srcPath = "node_modules/vue-prism-editor/dist/prismeditor.esm.js";
+
+async function main() {
+ consola.start("Vue Prism Editor patcher");
+
+ if (!existsSync(srcPath)) {
+ consola.error(
+ `couldn't find ${chalk.cyan(srcPath)}, did you run ${chalk.green(
+ "npm install"
+ )}?`
+ );
+ return;
+ }
+
+ const source = readFileSync(srcPath, "utf8");
+
+ if (!source.includes("Vue.extend")) {
+ consola.success("already patched");
+ return;
+ }
+
+ consola.info("patching the source component...");
+
+ let output = source
+ .replace(/^import Vue from 'vue';/, "")
+ .replace("/*#__PURE__*/Vue.extend(", "")
+ .replace(/\}\)(;\s+export)/, "}$1");
+
+ writeFileSync(srcPath, output, "utf8");
+
+ consola.success("successfully patched");
+}
+
+main().catch((err) => consola.error(err));
diff --git a/site/plugins/helpers/index.php b/site/plugins/helpers/index.php
index c01e7ad..69357d7 100644
--- a/site/plugins/helpers/index.php
+++ b/site/plugins/helpers/index.php
@@ -23,15 +23,10 @@ function setTitleFontSizeClass($title, $level = 'h1')
function getAuthorBySlug($slug)
{
- $kirby = kirby();
- $author = '';
- foreach ($kirby->users() as $user) {
-
- if (Str::slug($user->name()) === $slug) {
-
- $author = $user;
- }
- }
+ $site = site();
+ $authors = page("auteurs")->children();
+ $author = $authors->find($slug);
return $author;
}
+
\ No newline at end of file
diff --git a/site/plugins/kirby-seo/.husky/pre-commit b/site/plugins/kirby-seo/.husky/pre-commit
new file mode 100755
index 0000000..7dc800e
--- /dev/null
+++ b/site/plugins/kirby-seo/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+pnpm run build && git add index.css index.js
diff --git a/site/plugins/kirby-seo/.nvmrc b/site/plugins/kirby-seo/.nvmrc
new file mode 100644
index 0000000..2edeafb
--- /dev/null
+++ b/site/plugins/kirby-seo/.nvmrc
@@ -0,0 +1 @@
+20
\ No newline at end of file
diff --git a/site/plugins/kirby-seo/.php-cs-fixer.dist.php b/site/plugins/kirby-seo/.php-cs-fixer.dist.php
new file mode 100644
index 0000000..6abe02c
--- /dev/null
+++ b/site/plugins/kirby-seo/.php-cs-fixer.dist.php
@@ -0,0 +1,59 @@
+exclude('vendor')
+ ->in(__DIR__);
+
+$config = new PhpCsFixer\Config();
+return $config
+ ->setRules([
+ '@PSR12' => true,
+ 'align_multiline_comment' => ['comment_type' => 'phpdocs_like'],
+ 'array_indentation' => true,
+ 'array_syntax' => ['syntax' => 'short'],
+ 'cast_spaces' => ['space' => 'none'],
+ // 'class_keyword_remove' => true, // replaces static::class with 'static' (won't work)
+ 'combine_consecutive_issets' => true,
+ 'combine_consecutive_unsets' => true,
+ 'combine_nested_dirname' => true,
+ 'concat_space' => ['spacing' => 'one'],
+ 'declare_equal_normalize' => ['space' => 'single'],
+ 'dir_constant' => true,
+ 'function_typehint_space' => true,
+ 'include' => true,
+ 'logical_operators' => true,
+ 'lowercase_cast' => true,
+ 'lowercase_static_reference' => true,
+ 'magic_constant_casing' => true,
+ 'magic_method_casing' => true,
+ 'method_chaining_indentation' => true,
+ 'modernize_types_casting' => true,
+ 'multiline_comment_opening_closing' => true,
+ 'native_function_casing' => true,
+ 'native_function_type_declaration_casing' => true,
+ 'new_with_braces' => true,
+ 'no_blank_lines_after_class_opening' => true,
+ 'no_blank_lines_after_phpdoc' => true,
+ 'no_empty_comment' => true,
+ 'no_empty_phpdoc' => true,
+ 'no_empty_statement' => true,
+ 'no_leading_namespace_whitespace' => true,
+ 'no_mixed_echo_print' => ['use' => 'echo'],
+ 'no_unneeded_control_parentheses' => true,
+ 'no_unused_imports' => true,
+ 'no_useless_return' => true,
+ 'ordered_imports' => ['sort_algorithm' => 'alpha'],
+ // 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], // adds params in the wrong order
+ 'phpdoc_align' => ['align' => 'left'],
+ 'phpdoc_indent' => true,
+ 'phpdoc_scalar' => true,
+ 'phpdoc_trim' => true,
+ 'short_scalar_cast' => true,
+ 'single_line_comment_style' => true,
+ 'single_quote' => true,
+ 'ternary_to_null_coalescing' => true,
+ 'whitespace_after_comma_in_array' => true
+ ])
+ ->setRiskyAllowed(true)
+ ->setIndent("\t")
+ ->setFinder($finder);
diff --git a/site/plugins/kirby-seo/LICENSE b/site/plugins/kirby-seo/LICENSE
new file mode 100644
index 0000000..8bf1eeb
--- /dev/null
+++ b/site/plugins/kirby-seo/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023-2024 Tobias Möritz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/site/plugins/kirby-seo/README.md b/site/plugins/kirby-seo/README.md
new file mode 100644
index 0000000..832fb31
--- /dev/null
+++ b/site/plugins/kirby-seo/README.md
@@ -0,0 +1,30 @@
+
+
+Kirby SEO
+All-in-one toolkit that makes implementing SEO & Meta best practices a breeze
+
+---
+
+## Features
+
+- 🔎 All-in-one SEO and meta solution
+- 🪜 The Meta Cascade: Intelligently merge metadata from multiple sources
+- 🎛 Completely configurable: Disable features you don't need
+- 💻 Simple Panel UI with previews for Google, Twitter, Facebook & Co.
+- 📮 [Schema.org (JSON-LD)](https://schema.org/) support with fluent classes
+- 🤖 Automatic Robots rule generation, based on page status
+- 📝 Sitemap generation with multi-lang support
+
+## Get started
+
+[Read the documentation](https://plugins.andkindness.com/seo/docs/get-started/feature-overview) to get started with Kirby SEO.
+
+## Support the project
+
+> [!NOTE]
+> This plugin is provided free of charge & published under the permissive MIT License. If you use it in a commercial project, please consider sponsoring me on GitHub to support further development and continued maintenance of Kirby SEO.
+
+## License
+
+[MIT License](./../LICENSE)
+Copyright © 2023-2024 Tobias Möritz
diff --git a/site/plugins/kirby-seo/blueprints/fields/meta-group.yml b/site/plugins/kirby-seo/blueprints/fields/meta-group.yml
new file mode 100644
index 0000000..8845eb1
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/fields/meta-group.yml
@@ -0,0 +1,33 @@
+type: group
+fields:
+ metaHeadline:
+ label: meta-headline
+ type: headline
+ numbered: false
+ metaTitle:
+ label: title-overwrite
+ type: text
+ placeholder: '{{ page.title }}'
+ metaTemplate:
+ label: meta-title-template
+ type: text
+ help: meta-title-template-help
+ width: 2/3
+ placeholder: '{{ page.metadata.metaTemplate }}'
+ useTitleTemplate:
+ label: use-title-template
+ type: toggle
+ help: use-title-template-help
+ width: 1/3
+ default: true
+ text:
+ - "{{ t('use-title-template-no') }}"
+ - "{{ t('use-title-template-yes') }}"
+ metaDescription:
+ label: meta-description
+ type: textarea
+ help: meta-description-help
+ placeholder: '{{ page.metadata.metaDescription }}'
+ buttons: false
+ seoLine1:
+ type: line
diff --git a/site/plugins/kirby-seo/blueprints/fields/og-group.yml b/site/plugins/kirby-seo/blueprints/fields/og-group.yml
new file mode 100644
index 0000000..11fc7b8
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/fields/og-group.yml
@@ -0,0 +1,48 @@
+type: group
+fields:
+ ogHeadline:
+ label: og-headline
+ type: headline
+ numbered: false
+ help: global-og-headline-help
+ ogTemplate:
+ label: og-title-template
+ type: text
+ width: 2/3
+ help: meta-title-template-help
+ placeholder: '{{ page.metadata.ogTemplate }}'
+ useOgTemplate:
+ label: use-title-template
+ type: toggle
+ help: use-title-template-help
+ width: 1/3
+ default: true
+ text:
+ - "{{ t('use-title-template-no') }}"
+ - "{{ t('use-title-template-yes') }}"
+ ogDescription:
+ label: og-description
+ type: textarea
+ buttons: false
+ placeholder: '{{ page.metadata.ogDescription }}'
+ ogImage:
+ label: og-image
+ extends: seo/fields/og-image
+ empty: og-image-empty
+ twitterCardType:
+ label: twitter-card-type
+ width: 1/2
+ placeholder: "{{ t('default-select') }} {{ t(site.twitterCardType) }}"
+ type: select
+ options:
+ summary: "{{ t('summary') }}"
+ summary_large_image: "{{ t('summary_large_image') }}"
+ help: twitter-card-type-help
+ twitterAuthor:
+ label: twitter-author
+ width: 1/2
+ type: text
+ before: '@'
+ placeholder: '{{ page.metadata.twitterCreator }}'
+ seoLine2:
+ type: line
diff --git a/site/plugins/kirby-seo/blueprints/fields/og-image.php b/site/plugins/kirby-seo/blueprints/fields/og-image.php
new file mode 100644
index 0000000..05462a9
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/fields/og-image.php
@@ -0,0 +1,31 @@
+ 'files',
+ 'multiple' => false,
+ 'uploads' => [],
+ 'query' => Str::contains($kirby->path(), '/site') && !Str::contains($kirby->path(), 'pages') ? 'site.images' : 'page.images' // small hack to get context for field using api path
+ ];
+
+ if ($parent = option('tobimori.seo.files.parent')) {
+ $blueprint['uploads'] = [
+ 'parent' => $parent
+ ];
+ $blueprint['query'] = "{$parent}.images";
+ }
+
+ if ($template = option('tobimori.seo.files.template')) {
+ $blueprint['uploads'] = [
+ ...$blueprint['uploads'],
+ 'template' => $template
+ ];
+
+ $blueprint['query'] = "{$blueprint['query']}.filterBy('template', '{$template}')";
+ }
+
+ return $blueprint;
+};
diff --git a/site/plugins/kirby-seo/blueprints/fields/robots.php b/site/plugins/kirby-seo/blueprints/fields/robots.php
new file mode 100644
index 0000000..1aebd1f
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/fields/robots.php
@@ -0,0 +1,55 @@
+option('tobimori.seo.robots.active') || !$kirby->option('tobimori.seo.robots.pageSettings')) {
+ return [
+ 'type' => 'hidden'
+ ];
+ }
+
+ $fields = [
+ 'robotsHeadline' => [
+ 'label' => 'robots',
+ 'type' => 'headline',
+ 'numbered' => false,
+ ]
+ ];
+
+ $page = Meta::currentPage();
+ foreach ($kirby->option('tobimori.seo.robots.types') as $robots) {
+ $upper = Str::ucfirst($robots);
+
+ $fields["robots{$upper}"] = [
+ 'label' => "robots-{$robots}",
+ 'type' => 'toggles',
+ 'help' => "robots-{$robots}-help",
+ 'width' => '1/2',
+ 'default' => 'default',
+ 'reset' => false,
+ 'options' => [
+ 'default' => $page ?
+ A::join([
+ t('default-select'),
+ $page->metadata()->get("robots{$upper}", ['fields'])->toBool() ? t('yes') : t('no')
+ ], ' ')
+ : t('default-select'),
+ 'true' => t('yes'),
+ 'false' => t('no'),
+ ]
+ ];
+ }
+
+ $fields['seoLine3'] = [
+ 'type' => 'line'
+ ];
+
+ return [
+ 'type' => 'group',
+ 'fields' => $fields,
+ ];
+};
diff --git a/site/plugins/kirby-seo/blueprints/fields/site-robots.php b/site/plugins/kirby-seo/blueprints/fields/site-robots.php
new file mode 100644
index 0000000..17bfcc9
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/fields/site-robots.php
@@ -0,0 +1,49 @@
+option('tobimori.seo.robots.active') || !$kirby->option('tobimori.seo.robots.pageSettings')) {
+ return [
+ 'type' => 'hidden'
+ ];
+ }
+
+ $fields = [
+ 'robotsHeadline' => [
+ 'label' => 'robots',
+ 'type' => 'headline',
+ 'numbered' => false,
+ ]
+ ];
+
+ foreach ($kirby->option('tobimori.seo.robots.types') as $robots) {
+ $index = $kirby->option('tobimori.seo.robots.index');
+ if (is_callable($index)) {
+ $index = $index();
+ }
+
+ $fields["robots{$robots}"] = [
+ 'label' => "robots-{$robots}",
+ 'type' => 'toggles',
+ 'help' => "robots-{$robots}-help",
+ 'width' => '1/2',
+ 'default' => 'default',
+ 'reset' => false,
+ 'options' => [
+ 'default' => t('default-select') . ' ' . ($index ? t('yes') : t('no')),
+ 'true' => t('yes'),
+ 'false' => t('no'),
+ ]
+ ];
+ }
+
+ $fields['seoLine3'] = [
+ 'type' => 'line'
+ ];
+
+ return [
+ 'type' => 'group',
+ 'fields' => $fields,
+ ];
+};
diff --git a/site/plugins/kirby-seo/blueprints/fields/social-media.php b/site/plugins/kirby-seo/blueprints/fields/social-media.php
new file mode 100644
index 0000000..8ab9f33
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/fields/social-media.php
@@ -0,0 +1,30 @@
+option('tobimori.seo.socialMedia') as $key => $value) {
+ if ($value) {
+ $fields[$key] = [
+ 'label' => ucfirst($key),
+ 'type' => 'url',
+ 'icon' => strtolower($key),
+ 'placeholder' => $value
+ ];
+ }
+ }
+
+ return [
+ 'label' => 'social-media-accounts',
+ 'type' => 'object',
+ 'help' => 'social-media-accounts-help',
+ 'fields' => $fields
+ ];
+};
diff --git a/site/plugins/kirby-seo/blueprints/page.yml b/site/plugins/kirby-seo/blueprints/page.yml
new file mode 100644
index 0000000..ed86854
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/page.yml
@@ -0,0 +1,29 @@
+label: metadata-site
+icon: search
+
+columns:
+ main:
+ width: 7/12
+ fields:
+ metaGroup: seo/fields/meta-group
+ ogGroup: seo/fields/og-group
+ robots: seo/fields/robots
+ metaInherit:
+ label: inherit-settings
+ type: multiselect
+ help: inherit-settings-help
+ options:
+ metaTemplate: "{{ t('meta-title-template') }}"
+ metaDescription: "{{ t('meta-description') }}"
+ ogTemplate: "{{ t('og-title-template') }}"
+ ogDescription: "{{ t('og-description') }}"
+ ogImage: "{{ t('og-image') }}"
+ twitterCardType: "{{ t('twitter-card-type') }}"
+ twitterAuthor: "{{ t('twitter-author') }}"
+ robots: '{{ t("robots") }}'
+ sidebar:
+ width: 5/12
+ sticky: true
+ sections:
+ seoPreview:
+ type: seo-preview
diff --git a/site/plugins/kirby-seo/blueprints/site.yml b/site/plugins/kirby-seo/blueprints/site.yml
new file mode 100644
index 0000000..eebba22
--- /dev/null
+++ b/site/plugins/kirby-seo/blueprints/site.yml
@@ -0,0 +1,70 @@
+label: metadata-site
+icon: search
+
+columns:
+ main:
+ width: 7/12
+ fields:
+ metaHeadline:
+ label: global-meta-headline
+ type: headline
+ numbered: false
+ help: global-meta-headline-help
+ metaTemplate:
+ label: meta-title-template
+ type: text
+ help: meta-title-template-help
+ metaDescription:
+ label: meta-description
+ type: textarea
+ help: meta-description-help
+ buttons: false
+ seoLine1:
+ type: line
+ ogHeadline:
+ label: global-og-headline
+ type: headline
+ numbered: false
+ help: global-og-headline-help
+ ogTemplate:
+ label: og-title-template
+ type: text
+ default: '{{ title }}'
+ help: meta-title-template-help
+ placeholder: '{{ site.metaTemplate }}'
+ ogDescription:
+ label: og-description
+ type: textarea
+ buttons: false
+ placeholder: '{{ site.metaDescription }}'
+ ogSiteName:
+ label: og-site-name
+ type: text
+ default: '{{ site.title }}'
+ placeholder: '{{ site.title }}'
+ width: 1/2
+ ogImage:
+ label: og-image
+ extends: seo/fields/og-image
+ empty: og-image-empty
+ width: 1/2
+ twitterCardType:
+ label: twitter-card-type
+ width: 1/2
+ type: select
+ default: summary
+ required: true
+ options:
+ summary: "{{ t('summary') }}"
+ summary_large_image: "{{ t('summary_large_image') }}"
+ help: twitter-card-type-help
+ seoLine2:
+ type: line
+ robots: seo/fields/site-robots
+ socialMediaAccounts: seo/fields/social-media
+ sidebar:
+ width: 5/12
+ sticky: true
+ sections:
+ seoPreview:
+ type: seo-preview
diff --git a/site/plugins/kirby-seo/classes/Meta.php b/site/plugins/kirby-seo/classes/Meta.php
new file mode 100644
index 0000000..806152b
--- /dev/null
+++ b/site/plugins/kirby-seo/classes/Meta.php
@@ -0,0 +1,670 @@
+page = $page;
+ $this->lang = $lang;
+
+ if (method_exists($this->page, 'metaDefaults')) {
+ $this->metaDefaults = $this->page->metaDefaults($this->lang);
+ }
+ }
+
+ /**
+ * Returns the meta array which maps meta tags to their fieldnames
+ */
+ protected function metaArray(): array
+ {
+ if ($this->metaArray) {
+ return $this->metaArray;
+ }
+
+ /**
+ * We have to specify field names and resolve them later, so we can use this
+ * function to resolve meta tags from field names in the programmatic function
+ */
+ $meta =
+ [
+ 'title' => 'metaTitle',
+ 'description' => 'metaDescription',
+ 'date' => fn () => $this->page->modified($this->dateFormat()),
+ 'og:title' => 'ogTitle',
+ 'og:description' => 'ogDescription',
+ 'og:site_name' => 'ogSiteName',
+ 'og:image' => 'ogImage',
+ 'og:image:width' => fn () => $this->ogImage() ? $this->get('ogImage')->toFile()?->width() : null,
+ 'og:image:height' => fn () => $this->ogImage() ? $this->get('ogImage')->toFile()?->height() : null,
+ 'og:image:alt' => fn () => $this->get('ogImage')->toFile()?->alt(),
+ 'og:type' => 'ogType',
+ ];
+
+
+ // Robots
+ if ($robotsActive = option('tobimori.seo.robots.active')) {
+ $meta['robots'] = fn () => $this->robots();
+ }
+
+ // only add canonical and alternate tags if the page is indexable
+ // we have to resolve this lazily (using a callable) to avoid an infinite loop
+ $allowsIndexFn = fn () => !$robotsActive || !Str::contains($this->robots(), 'noindex');
+
+ // canonical
+ $canonicalFn = fn () => $allowsIndexFn() ? $this->canonicalUrl() : null;
+ $meta['canonical'] = $canonicalFn;
+ $meta['og:url'] = $canonicalFn;
+
+ // Multi-lang alternate tags
+ if (kirby()->languages()->count() > 1 && kirby()->language() !== null) {
+ foreach (kirby()->languages() as $lang) {
+ // only add alternate tags if the page is indexable
+ $meta['alternate'][] = fn () => $allowsIndexFn() ? [
+ 'hreflang' => $lang->code(),
+ 'href' => $this->page->url($lang->code()),
+ ] : null;
+
+ if ($lang !== kirby()->language()) {
+ $meta['og:locale:alternate'][] = fn () => $lang->code();
+ }
+ }
+
+ // only add alternate tags if the page is indexable
+ $meta['alternate'][] = fn () => $allowsIndexFn() ? [
+ 'hreflang' => 'x-default',
+ 'href' => $this->page->url(kirby()->language()->code()),
+ ] : null;
+ $meta['og:locale'] = fn () => kirby()->language()->locale(LC_ALL);
+ } else {
+ $meta['og:locale'] = fn () => $this->locale(LC_ALL);
+ }
+
+ // Twitter tags "opt-in" - TODO: wip
+ if (option('tobimori.seo.twitter', true)) {
+ $meta = array_merge($meta, [
+ 'twitter:card' => 'twitterCardType',
+ 'twitter:title' => 'ogTitle',
+ 'twitter:description' => 'ogDescription',
+ 'twitter:image' => 'ogImage',
+ 'twitter:site' => 'twitterSite',
+ 'twitter:creator' => 'twitterCreator',
+ ]);
+ }
+
+ // This array will be normalized for use in the snippet in $this->snippetData()
+ return $this->metaArray = $meta;
+ }
+
+ /**
+ * This array defines what HTML tag the corresponding meta tags are using including the attributes,
+ * so everything is a bit more elegant when defining programmatic content (supports regex)
+ */
+ public const TAG_TYPE_MAP = [
+ [
+ 'tag' => 'title',
+ 'tags' => [
+ 'title'
+ ]
+ ],
+ [
+ 'tag' => 'link',
+ 'attributes' => [
+ 'name' => 'rel',
+ 'content' => 'href',
+ ],
+ 'tags' => [
+ 'canonical',
+ 'alternate',
+ ]
+ ],
+ [
+ 'tag' => 'meta',
+ 'attributes' => [
+ 'name' => 'property',
+ 'content' => 'content',
+ ],
+ 'tags' => [
+ '/og:.+/'
+ ]
+ ]
+ ];
+
+ /**
+ * Normalize the meta array and remaining meta defaults to be used in the snippet,
+ * also resolve the content, if necessary
+ */
+ public function snippetData(array $raw = null): array
+ {
+ $mergeWithDefaults = !isset($raw);
+ $raw ??= $this->metaArray();
+ $tags = [];
+
+ foreach ($raw as $name => $value) {
+ // if the key is numeric, it is already normalized to the correct array syntax
+ if (is_numeric($name)) {
+ // but we still check if the array is valid
+ if (!is_array($value) || count(array_intersect(['tag', 'content', 'attributes'], array_keys($value))) !== count($value)) {
+ throw new InvalidArgumentException("[kirby-seo] Invalid array structure found in programmatic content for page {$this->slug()}. Please check your metaDefaults method for template {$this->template()->name()}.");
+ }
+
+ $tags[] = $value;
+ continue;
+ }
+
+ // allow overrides from metaDefaults for keys that are a callable or array by default
+ // (all fields from meta array that are not part of the regular cascade)
+ if ((is_callable($value) || is_array($value)) && $mergeWithDefaults && array_key_exists($name, $this->metaDefaults)) {
+ $this->consumed[] = $name;
+ $value = $this->metaDefaults[$name];
+ }
+
+ // if the value is a string, we know it's a field name
+ if (is_string($value)) {
+ $value = $this->$value($name);
+ }
+
+ // if the value is a callable, we resolve it
+ if (is_callable($value)) {
+ $value = $value($this->page);
+ }
+
+ // if the value is empty, we don't want to output it
+ if ((is_a($value, 'Kirby\Content\Field') && $value->isEmpty()) || !$value) {
+ continue;
+ }
+
+ // resolve the tag type from the meta array
+ // so we can use the correct attributes to normalize it
+ $tag = $this->resolveTag($name);
+
+ // if the value is an associative array now, all of them are attributes
+ // and we don't look for what the TAG_TYPE_MAP says
+ // or there should be multiple tags with the same name (non-associative array)
+ if (is_array($value)) {
+ if (!A::isAssociative($value)) {
+ foreach ($value as $val) {
+ $tags = array_merge($tags, $this->snippetData([$name => $val]));
+ }
+ continue;
+ }
+
+ // array is associative, so it's an array of attributes
+ // we resolve the values, if they are callable
+ array_walk($value, function (&$item) {
+ if (is_callable($item)) {
+ $item = $item($this->page);
+ }
+ });
+
+ // add the tag to the array
+ $tags[] = [
+ 'tag' => $tag['tag'],
+ 'attributes' => $value,
+ 'content' => null,
+ ];
+ continue;
+ }
+
+ // if the value is a string, we use the TAG_TYPE_MAP
+ // to correctly map the attributes
+ $tags[] = [
+ 'tag' => $tag['tag'],
+ 'attributes' => isset($tag['attributes']) ? [
+ $tag['attributes']['name'] => $name,
+ $tag['attributes']['content'] => $value,
+ ] : null,
+ 'content' => !isset($tag['attributes']) ? $value : null,
+ ];
+ }
+
+ if ($mergeWithDefaults) {
+ // merge the remaining meta defaults
+ $tags = array_merge($tags, $this->snippetData(array_diff_key($this->metaDefaults, array_flip($this->consumed))));
+ }
+
+ return $tags;
+ }
+
+ /**
+ * Resolves the tag type from the meta array
+ */
+ protected function resolveTag(string $tag): array
+ {
+ foreach (self::TAG_TYPE_MAP as $type) {
+ foreach ($type['tags'] as $regexOrString) {
+ // Check if the supplied tag is a regex or a normal tag name
+ if (Str::startsWith($regexOrString, '/') && Str::endsWith($regexOrString, '/') ?
+ Str::match($tag, $regexOrString) : $tag === $regexOrString
+ ) {
+ return $type;
+ }
+ }
+ }
+
+ return [
+ 'tag' => 'meta',
+ 'attributes' => [
+ 'name' => 'name',
+ 'content' => 'content',
+ ]
+ ];
+ }
+
+ /**
+ * Magic method to get a meta value by calling the method name
+ */
+ public function __call($name, $args = null): mixed
+ {
+ if (method_exists($this, $name)) {
+ return $this->$name($args);
+ }
+
+ return $this->get($name);
+ }
+
+ /**
+ * Get the meta value for a given key
+ */
+ public function get(string $key, array $exclude = []): Field
+ {
+ $cascade = option('tobimori.seo.cascade');
+ if (count(array_intersect(get_class_methods($this), $cascade)) !== count($cascade)) {
+ throw new InvalidArgumentException('[kirby-seo] Invalid cascade method in config. Please check your options for `tobimori.seo.cascade`.');
+ }
+
+ // Track consumed keys, so we don't output legacy field values
+ $toBeConsumed = $key;
+ if (
+ (array_key_exists($toBeConsumed, $this->metaDefaults)
+ || array_key_exists($toBeConsumed = $this->findTagForField($toBeConsumed), $this->metaDefaults))
+ && !in_array($toBeConsumed, $this->consumed)
+ ) {
+ $this->consumed[] = $toBeConsumed;
+ }
+
+ foreach (array_diff($cascade, $exclude) as $method) {
+ if ($field = $this->$method($key)) {
+ return $field;
+ }
+ }
+
+ return new Field($this->page, $key, '');
+ }
+
+ /**
+ * Get the meta value for a given key from the page's fields
+ */
+ protected function fields(string $key): Field|null
+ {
+ if (($field = $this->page->content($this->lang)->get($key))) {
+ if (Str::contains($key, 'robots') && !option('tobimori.seo.robots.pageSettings')) {
+ return null;
+ }
+
+ if ($field->isNotEmpty() && !A::has(self::DEFAULT_VALUES, $field->value())) {
+ return $field;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Maps Open Graph fields to Meta fields for fallbackFields
+ * cascade method
+ */
+ public const FALLBACK_MAP = [
+ 'ogTitle' => 'metaTitle',
+ 'ogDescription' => 'metaDescription',
+ 'ogTemplate' => 'metaTemplate',
+ ];
+
+ /**
+ * We only allow the following cascade methods for fallbacks,
+ * because we don't want to fallback to the config defaults for
+ * Meta fields, because we most likely already have those set
+ * for the Open Graph fields
+ */
+ public const FALLBACK_CASCADE = [
+ 'fields',
+ 'programmatic',
+ 'parent',
+ 'site'
+ ];
+
+ /**
+ * Get the meta value for a given key using the fallback fields
+ * defined above (usually Open Graph > Meta Fields)
+ */
+ protected function fallbackFields(string $key): Field|null
+ {
+ if (array_key_exists($key, self::FALLBACK_MAP)) {
+ $fallback = self::FALLBACK_MAP[$key];
+ $cascade = option('tobimori.seo.cascade');
+
+ foreach (array_intersect($cascade, self::FALLBACK_CASCADE) as $method) {
+ if ($field = $this->$method($fallback)) {
+ return $field;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ protected function findTagForField(string $fieldName): string|null
+ {
+ return array_search($fieldName, $this->metaArray());
+ }
+
+ /**
+ * Get the meta value for a given key from the page's meta
+ * array, which can be set in the page's model metaDefaults method
+ */
+ protected function programmatic(string $key): Field|null
+ {
+ if (!$this->metaDefaults) {
+ return null;
+ }
+
+ // Check if the key (field name) is in the array syntax
+ if (array_key_exists($key, $this->metaDefaults)) {
+ $val = $this->metaDefaults[$key];
+ }
+
+ /* If there is no programmatic value for the key,
+ * try looking it up in the meta array
+ * maybe it is a meta tag and not a field name?
+ */
+ if (!isset($val) && ($key = $this->findTagForField($key)) && array_key_exists($key, $this->metaDefaults)) {
+ $val = $this->metaDefaults[$key];
+ }
+
+ if (isset($val)) {
+ if (is_callable($val)) {
+ $val = $val($this->page);
+ }
+
+ if (is_array($val)) {
+ $val = $val['content'] ?? $val['href'] ?? null;
+
+ // Last sanity check, if the array syntax doesn't have a supported key
+ if ($val === null) {
+ // Remove the key from the consumed array, so it doesn't get filtered out
+ // (we can assume the entry is a custom meta tag that uses different attributes)
+ $this->consumed = array_filter($this->consumed, fn ($item) => $item !== $key);
+ return null;
+ }
+ }
+
+ if (is_a($val, 'Kirby\Content\Field')) {
+ return new Field($this->page, $key, $val->value());
+ }
+
+ return new Field($this->page, $key, $val);
+ }
+
+ return null;
+ }
+
+ /**
+ * Get the meta value for a given key from the page's parent,
+ * if the page is allowed to inherit the value
+ */
+ protected function parent(string $key): Field|null
+ {
+ if ($this->canInherit($key)) {
+ $parent = $this->page->parent();
+ $parentMeta = new Meta($parent, $this->lang);
+ if ($value = $parentMeta->get($key)) {
+ return $value;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Get the meta value for a given key from the
+ * site's meta blueprint & content
+ */
+ protected function site(string $key): Field|null
+ {
+ if (($site = $this->page->site()->content($this->lang)->get($key)) && ($site->isNotEmpty() && !A::has(self::DEFAULT_VALUES, $site->value))) {
+ return $site;
+ }
+
+ return null;
+ }
+
+ /**
+ * Get the meta value for a given key from the
+ * config.php options
+ */
+ protected function options(string $key): Field|null
+ {
+ if ($option = option("tobimori.seo.default.{$key}")) {
+ if (is_callable($option)) {
+ $option = $option($this->page);
+ }
+
+ if (is_a($option, 'Kirby\Content\Field')) {
+ return $option;
+ }
+
+ return new Field($this->page, $key, $option);
+ }
+
+ return null;
+ }
+
+ /**
+ * Checks if the page can inherit a meta value from its parent
+ */
+ private function canInherit(string $key): bool
+ {
+ $parent = $this->page->parent();
+ if (!$parent) {
+ return false;
+ }
+
+ $inherit = $parent->metaInherit()->split();
+ if (Str::contains($key, 'robots') && A::has($inherit, 'robots')) {
+ return true;
+ }
+ return A::has($inherit, $key);
+ }
+
+ /**
+ * Applies the title template, and returns the correct title
+ */
+ public function metaTitle()
+ {
+ $title = $this->get('metaTitle');
+ $template = $this->get('metaTemplate');
+
+ $useTemplate = $this->page->useTitleTemplate();
+ $useTemplate = $useTemplate->isEmpty() ? true : $useTemplate->toBool();
+
+ $string = $title->value();
+ if ($useTemplate) {
+ $string = $this->page->toString(
+ $template,
+ ['title' => $title]
+ );
+ }
+
+ return new Field(
+ $this->page,
+ 'metaTitle',
+ $string
+ );
+ }
+
+ /**
+ * Applies the OG title template, and returns the OG Title
+ */
+ public function ogTitle()
+ {
+ $title = $this->get('metaTitle');
+ $template = $this->get('ogTemplate');
+
+ $useTemplate = $this->page->useOgTemplate();
+ $useTemplate = $useTemplate->isEmpty() ? true : $useTemplate->toBool();
+
+ $string = $title->value();
+ if ($useTemplate) {
+ $string = $this->page->toString(
+ $template,
+ ['title' => $title]
+ );
+ }
+
+ return new Field(
+ $this->page,
+ 'ogTitle',
+ $string
+ );
+ }
+
+ /**
+ * Gets the canonical url for the page
+ */
+ public function canonicalUrl()
+ {
+ return $this->page->site()->canonicalFor($this->page->url());
+ }
+
+ /**
+ * Get the Twitter username from an account url set in the site options
+ */
+ public function twitterSite()
+ {
+ $accs = $this->page->site()->socialMediaAccounts()->toObject();
+ $username = '';
+
+ if ($accs->twitter()->isNotEmpty()) {
+ // tries to match all twitter urls, and extract the username
+ $matches = [];
+ preg_match('/^(https?:\/\/)?(www\.)?twitter\.com\/(#!\/)?@?(?[^\/\?]*)$/', $accs->twitter()->value(), $matches);
+ if (isset($matches['name'])) {
+ $username = $matches['name'];
+ }
+ }
+
+ return new Field($this->page, 'twitter', $username);
+ }
+
+ /**
+ * Gets the date format for modified meta tags, based on the registered date handler
+ */
+ public function dateFormat(): string
+ {
+ if ($custom = option('tobimori.seo.dateFormat')) {
+ if (is_callable($custom)) {
+ return $custom($this->page);
+ }
+
+ return $custom;
+ }
+
+ switch (option('date.handler')) {
+ case 'strftime':
+ return '%Y-%m-%d';
+ case 'intl':
+ return 'yyyy-MM-dd';
+ case 'date':
+ default:
+ return 'Y-m-d';
+ }
+ }
+
+ /**
+ * Get the pages' robots rules as string
+ */
+ public function robots()
+ {
+ $robots = [];
+ foreach (option('tobimori.seo.robots.types') as $type) {
+ if (!$this->get('robots' . Str::ucfirst($type))->toBool()) {
+ $robots[] = 'no' . Str::lower($type);
+ }
+ }
+
+ if (A::count($robots) === 0) {
+ $robots = ['all'];
+ }
+
+ return A::join($robots, ',');
+ }
+
+ /**
+ * Get the og:image url
+ */
+ public function ogImage(): string|null
+ {
+ $field = $this->get('ogImage');
+
+ if ($ogImage = $field->toFile()?->thumb([
+ 'width' => 1200,
+ 'height' => 630,
+ 'crop' => true,
+ ])) {
+ return $ogImage->url();
+ }
+
+ if ($field->isNotEmpty()) {
+ return $field->value();
+ }
+
+ return null;
+ }
+
+ /**
+ * Helper method the get the current page from the URL path,
+ * for use in programmatic blueprints
+ */
+ public static function currentPage(): Page|null
+ {
+ $path = App::instance()->request()->url()->toString();
+ $matches = Str::match($path, "/pages\/([a-zA-Z0-9-_+]+)\/?/m");
+ $segments = Str::split($matches[1], '+');
+
+ $page = App::instance()->site();
+ foreach ($segments as $segment) {
+ if ($page = $page->findPageOrDraft($segment)) {
+ continue;
+ }
+
+ return null;
+ }
+
+ return $page;
+ }
+}
diff --git a/site/plugins/kirby-seo/classes/SchemaSingleton.php b/site/plugins/kirby-seo/classes/SchemaSingleton.php
new file mode 100644
index 0000000..c5057b7
--- /dev/null
+++ b/site/plugins/kirby-seo/classes/SchemaSingleton.php
@@ -0,0 +1,29 @@
+id() ?? 'default'][$type])) {
+ self::$instances[$page?->id() ?? 'default'][$type] = Schema::{$type}();
+ }
+
+ return self::$instances[$page?->id() ?? 'default'][$type];
+ }
+
+ public static function getInstances(Page|null $page = null): array
+ {
+ return self::$instances[$page?->id() ?? 'default'] ?? [];
+ }
+}
diff --git a/site/plugins/kirby-seo/classes/Sitemap/Sitemap.php b/site/plugins/kirby-seo/classes/Sitemap/Sitemap.php
new file mode 100644
index 0000000..7264bcf
--- /dev/null
+++ b/site/plugins/kirby-seo/classes/Sitemap/Sitemap.php
@@ -0,0 +1,82 @@
+key;
+ }
+
+ public function loc(): string
+ {
+ return kirby()->site()->canonicalFor('sitemap-' . $this->key . '.xml');
+ }
+
+ public function lastmod(): string
+ {
+ $lastmod = 0;
+ foreach ($this as $url) {
+ $lastmod = max($lastmod, strtotime($url->lastmod()));
+ }
+
+ if ($lastmod > 0) {
+ return date('c', $lastmod);
+ }
+
+ return date('c');
+ }
+
+ public function createUrl(string $loc): SitemapUrl
+ {
+ $url = $this->makeUrl($loc);
+ $this->append($url);
+ return $url;
+ }
+
+ public static function makeUrl(string $url): SitemapUrl
+ {
+ return new SitemapUrl($url);
+ }
+
+ public function toDOMNode(DOMDocument $doc = new DOMDocument('1.0', 'UTF-8'))
+ {
+ $doc->formatOutput = true;
+
+ $root = $doc->createElement('sitemap');
+ foreach (['loc', 'lastmod'] as $key) {
+ $root->appendChild($doc->createElement($key, $this->$key()));
+ }
+
+ return $root;
+ }
+
+ public function toString(): string
+ {
+ $doc = new DOMDocument('1.0', 'UTF-8');
+ $doc->formatOutput = true;
+
+ $doc->appendChild($doc->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="/sitemap.xsl"'));
+
+ $root = $doc->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset');
+ $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xhtml', 'http://www.w3.org/1999/xhtml');
+ $root->setAttribute('seo-version', App::plugin('tobimori/seo')->version());
+
+ foreach ($this as $url) {
+ $root->appendChild($url->toDOMNode($doc));
+ }
+
+ $doc->appendChild($root);
+ return $doc->saveXML();
+ }
+}
diff --git a/site/plugins/kirby-seo/classes/Sitemap/SitemapIndex.php b/site/plugins/kirby-seo/classes/Sitemap/SitemapIndex.php
new file mode 100644
index 0000000..e8d12a2
--- /dev/null
+++ b/site/plugins/kirby-seo/classes/Sitemap/SitemapIndex.php
@@ -0,0 +1,100 @@
+make($key);
+ $this->append($sitemap);
+ return $sitemap;
+ }
+
+ public static function make(string $key = 'pages'): Sitemap
+ {
+ return new Sitemap($key);
+ }
+
+ public static function makeUrl(string $url): SitemapUrl
+ {
+ return new SitemapUrl($url);
+ }
+
+ public function toString(): string
+ {
+ $doc = new DOMDocument('1.0', 'UTF-8');
+ $doc->formatOutput = true;
+
+ $doc->appendChild($doc->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="sitemap.xsl"'));
+
+ $root = $doc->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'sitemapindex');
+ $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xhtml', 'http://www.w3.org/1999/xhtml');
+ $root->setAttribute('seo-version', App::plugin('tobimori/seo')->version());
+ $doc->appendChild($root);
+
+ foreach ($this as $sitemap) {
+ $root->appendChild($sitemap->toDOMNode($doc));
+ }
+
+ return $doc->saveXML();
+ }
+
+ public function isValidIndex(string $key = null): bool
+ {
+ if ($key === null) {
+ return $this->count() > 1;
+ }
+
+ return !!$this->findBy('key', $key) && $this->count() > 1;
+ }
+
+ public function generate(): void
+ {
+ $generator = option('tobimori.seo.sitemap.generator');
+ if (is_callable($generator)) {
+ $generator($this);
+ }
+ }
+
+ public function render(Page $page): string|null
+ {
+ // There always has to be at least one index,
+ // otherwise the sitemap will fail to render
+ if ($this->count() === 0) {
+ $this->generate();
+ }
+
+ if ($this->count() === 0) {
+ $this->create();
+ }
+
+ if (($index = $page->content()->get('index'))->isEmpty()) {
+ // If there is only one index, we do not need to render the index page
+ return $this->count() > 1 ? $this->toString() : $this->first()->toString();
+ }
+
+ $sitemap = $this->findBy('key', $index->value());
+ if ($sitemap) {
+ return $sitemap->toString();
+ }
+
+ return null;
+ }
+}
diff --git a/site/plugins/kirby-seo/classes/Sitemap/SitemapUrl.php b/site/plugins/kirby-seo/classes/Sitemap/SitemapUrl.php
new file mode 100644
index 0000000..886844c
--- /dev/null
+++ b/site/plugins/kirby-seo/classes/Sitemap/SitemapUrl.php
@@ -0,0 +1,113 @@
+loc;
+ }
+
+ $this->loc = $url;
+ return $this;
+ }
+
+ public function lastmod(string $lastmod = null): SitemapUrl|string
+ {
+ if ($lastmod === null) {
+ return $this->lastmod;
+ }
+
+ $this->lastmod = date('c', $lastmod);
+ return $this;
+ }
+
+ public function changefreq(string $changefreq = null): SitemapUrl|string
+ {
+ if ($changefreq === null) {
+ return $this->changefreq;
+ }
+
+ $this->changefreq = $changefreq;
+ return $this;
+ }
+
+ public function priority(string $priority = null): SitemapUrl|string
+ {
+ if ($priority === null) {
+ return $this->priority;
+ }
+
+ $this->priority = $priority;
+ return $this;
+ }
+
+ public function alternates(array $alternates = []): SitemapUrl|array
+ {
+ if (empty($alternates)) {
+ return $this->alternates;
+ }
+
+ foreach ($alternates as $alternate) {
+ foreach (['href', 'hreflang'] as $key) {
+ if (!array_key_exists($key, $alternate)) {
+ new Exception("[kirby-seo] The alternate link to '{$this->loc()} is missing the '{$key}' attribute");
+ }
+ }
+ }
+
+
+ $this->alternates = $alternates;
+ return $this;
+ }
+
+ public function toDOMNode(DOMDocument $doc = new DOMDocument('1.0', 'UTF-8')): DOMNode
+ {
+ $doc->formatOutput = true;
+
+ $node = $doc->createElement('url');
+
+ foreach (array_diff_key(get_object_vars($this), array_flip(['alternates'])) as $key => $value) {
+ $node->appendChild($doc->createElement($key, $value));
+ }
+
+ if (!empty($this->alternates())) {
+ foreach ($this->alternates() as $alternate) {
+ $alternateNode = $doc->createElement('xhtml:link');
+ foreach ($alternate as $key => $value) {
+ $alternateNode->setAttribute($key, $value);
+ }
+
+ $node->appendChild($alternateNode);
+ }
+ }
+
+ return $node;
+ }
+
+ public function toString(): string
+ {
+ $doc = new DOMDocument('1.0', 'UTF-8');
+ $doc->formatOutput = true;
+
+ $node = $this->toDOMNode();
+ $doc->appendChild($node);
+
+ return $doc->saveXML($node);
+ }
+}
diff --git a/site/plugins/kirby-seo/composer.json b/site/plugins/kirby-seo/composer.json
new file mode 100644
index 0000000..b2d5582
--- /dev/null
+++ b/site/plugins/kirby-seo/composer.json
@@ -0,0 +1,41 @@
+{
+ "name": "tobimori/kirby-seo",
+ "description": "The ultimate Kirby SEO toolkit",
+ "type": "kirby-plugin",
+ "version": "1.1.2",
+ "license": "MIT",
+ "homepage": "https://github.com/tobimori/kirby-seo#readme",
+ "authors": [
+ {
+ "name": "Tobias Möritz",
+ "email": "tobias@moeritz.io"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "tobimori\\Seo\\": "classes"
+ }
+ },
+ "require": {
+ "php": ">=8.1.0",
+ "getkirby/composer-installer": "^1.2.1",
+ "spatie/schema-org": "^3.14"
+ },
+ "require-dev": {
+ "getkirby/cms": "^4.0",
+ "getkirby/cli": "^1.2",
+ "friendsofphp/php-cs-fixer": "^3.48"
+ },
+ "scripts": {
+ "dist": "composer install --no-dev --optimize-autoloader"
+ },
+ "config": {
+ "optimize-autoloader": true,
+ "allow-plugins": {
+ "getkirby/composer-installer": true
+ }
+ },
+ "extra": {
+ "kirby-cms-path": false
+ }
+}
diff --git a/site/plugins/kirby-seo/config/api.php b/site/plugins/kirby-seo/config/api.php
new file mode 100644
index 0000000..0470e1c
--- /dev/null
+++ b/site/plugins/kirby-seo/config/api.php
@@ -0,0 +1,102 @@
+ [
+ 'dirtyPageOrSite' => function (string $slug) {
+ $kirby = kirby();
+ $page = $slug == 'site' ? $kirby->site() : $kirby->page(Str::replace($slug, '+', '/'));
+
+ if ($this->requestBody()) {
+ $form = Form::for($page, [ // Form class handles transformation of changed items
+ 'ignoreDisabled' => true,
+ 'input' => array_merge(['title' => $page->title()], $page->content()->data(), $this->requestBody()),
+ 'language' => $kirby->language()?->code()
+ ]);
+
+ $page = $page->clone(['content' => $form->data()]);
+ }
+
+ return $page;
+ }
+ ],
+ 'routes' => [
+ [
+ 'pattern' => '/k-seo/(:any)/heading-structure',
+ 'method' => 'POST',
+ 'action' => function (string $slug) {
+ $model = $this->dirtyPageOrSite($slug);
+
+ if ($model instanceof Page) {
+ $page = $model->render();
+ $dom = new DOMDocument();
+ $dom->loadHTML(htmlspecialchars_decode(mb_convert_encoding(htmlentities($page, ENT_COMPAT, 'UTF-8'), 'ISO-8859-1', 'UTF-8'), ENT_QUOTES), libxml_use_internal_errors(true));
+
+ $xpath = new DOMXPath($dom);
+ $headings = $xpath->query('//h1|//h2|//h3|//h4|//h5|//h6');
+ $data = [];
+
+ foreach ($headings as $heading) {
+ $data[] = [
+ 'level' => (int)str_replace('h', '', $heading->nodeName),
+ 'text' => $heading->textContent,
+ ];
+ }
+
+ return $data;
+ }
+
+ return null;
+ }
+ ],
+ [
+ 'pattern' => '/k-seo/(:any)/seo-preview',
+ 'method' => 'POST',
+ 'action' => function (string $slug) {
+ $model = $this->dirtyPageOrSite($slug);
+
+ if ($model instanceof Site) {
+ $model = $model->homePage();
+ }
+
+ if ($model instanceof Page) {
+ $meta = $model->metadata();
+
+ return [
+ 'page' => $model->slug(),
+ 'url' => $model->url(),
+ 'title' => $meta->metaTitle()->value(),
+ 'description' => $meta->metaDescription()->value(),
+ 'ogSiteName' => $meta->ogSiteName()->value(),
+ 'ogTitle' => $meta->ogTitle()->value(),
+ 'ogDescription' => $meta->ogDescription()->value(),
+ 'ogImage' => $meta->ogImage(),
+ 'twitterCardType' => $meta->twitterCardType()->value(),
+ ];
+ }
+
+ return null;
+ }
+ ],
+ [
+ 'pattern' => '/k-seo/(:any)/robots',
+ 'method' => 'POST',
+ 'action' => function (string $slug) {
+ $model = $this->dirtyPageOrSite($slug);
+ if (!($model instanceof Page)) {
+ return null;
+ }
+ $robots = $model->robots();
+
+ return [
+ 'active' => option('tobimori.seo.robots.indicator', option('tobimori.seo.robots.active', true)),
+ 'state' => $robots,
+ ];
+ }
+ ]
+ ]
+];
diff --git a/site/plugins/kirby-seo/config/commands/hello.php b/site/plugins/kirby-seo/config/commands/hello.php
new file mode 100644
index 0000000..f41b20b
--- /dev/null
+++ b/site/plugins/kirby-seo/config/commands/hello.php
@@ -0,0 +1,11 @@
+ 'Hello world',
+ 'args' => [],
+ 'command' => static function (CLI $cli): void {
+ $cli->success('Hello world! This command is a preparation for a future release.');
+ }
+];
diff --git a/site/plugins/kirby-seo/config/hooks.php b/site/plugins/kirby-seo/config/hooks.php
new file mode 100644
index 0000000..f5c8a9f
--- /dev/null
+++ b/site/plugins/kirby-seo/config/hooks.php
@@ -0,0 +1,27 @@
+ function (Page $newPage, Page $oldPage) {
+ foreach ($newPage->kirby()->option('tobimori.seo.robots.types') as $robots) {
+ $upper = Str::ucfirst($robots);
+ if ($newPage->content()->get("robots{$upper}")->value() === "") {
+ $newPage = $newPage->update([
+ "robots{$upper}" => 'default'
+ ]);
+ }
+ }
+ },
+ 'page.render:before' => function (string $contentType, array $data, Page $page) {
+ if (option('tobimori.seo.generateSchema')) {
+ $page->schema('WebSite')
+ ->url($page->metadata()->canonicalUrl())
+ ->copyrightYear(date('Y'))
+ ->description($page->metadata()->metaDescription())
+ ->name($page->metadata()->metaTitle())
+ ->headline($page->metadata()->title());
+ }
+ },
+];
diff --git a/site/plugins/kirby-seo/config/options.php b/site/plugins/kirby-seo/config/options.php
new file mode 100644
index 0000000..0d5ea67
--- /dev/null
+++ b/site/plugins/kirby-seo/config/options.php
@@ -0,0 +1,82 @@
+ [
+ 'fields',
+ 'programmatic',
+ // 'fallbackFields', // fallback to meta fields for open graph fields
+ 'parent',
+ 'site',
+ 'options'
+ ],
+ 'default' => [ // default field values for metadata, format is [field => value]
+ 'metaTitle' => fn (Page $page) => $page->title(),
+ 'metaTemplate' => '{{ title }} - {{ site.title }}',
+ 'ogTemplate' => '{{ title }}',
+ 'ogSiteName' => fn (Page $page) => $page->site()->title(),
+ 'ogType' => 'website',
+ 'twitterCardType' => 'summary',
+ 'ogDescription' => fn (Page $page) => $page->metadata()->metaDescription(),
+ 'twitterCreator' => fn (Page $page) => $page->metadata()->twitterSite(),
+ 'lang' => fn (Page $page) => $page->kirby()->language()?->locale(LC_ALL) ?? $page->kirby()->option('tobimori.seo.lang', 'en_US'),
+ // default for robots: noIndex if global index configuration is set, otherwise fall back to page status
+ 'robotsIndex' => function (Page $page) {
+ $index = $page->kirby()->option('tobimori.seo.robots.index');
+ if (is_callable($index)) {
+ $index = $index();
+ }
+
+ if (!$index) {
+ return false;
+ }
+
+ return $page->kirby()->option('tobimori.seo.robots.followPageStatus', true) ? $page->isListed() : true;
+ },
+ 'robotsFollow' => fn (Page $page) => $page->kirby()->option('tobimori.seo.default.robotsIndex')($page),
+ 'robotsArchive' => fn (Page $page) => $page->kirby()->option('tobimori.seo.default.robotsIndex')($page),
+ 'robotsImageindex' => fn (Page $page) => $page->kirby()->option('tobimori.seo.default.robotsIndex')($page),
+ 'robotsSnippet' => fn (Page $page) => $page->kirby()->option('tobimori.seo.default.robotsIndex')($page),
+ ],
+ 'socialMedia' => [ // default fields for social media links, format is [field => placeholder]
+ 'twitter' => 'https://twitter.com/my-company',
+ 'facebook' => 'https://facebook.com/my-company',
+ 'instagram' => 'https://instagram.com/my-company',
+ 'youtube' => 'https://youtube.com/channel/my-company',
+ 'linkedin' => 'https://linkedin.com/company/my-company',
+ ],
+ 'previews' => [
+ 'google',
+ 'facebook',
+ 'slack'
+ ],
+ 'robots' => [
+ 'active' => true, // whether robots handling should be done by the plugin
+ 'followPageStatus' => true, // should unlisted pages be noindex by default?
+ 'pageSettings' => true, // whether to have robots settings on each page
+ 'indicator' => true, // whether the indicator should be shown in the panel
+ 'index' => fn () => !option('debug'), // default site-wide robots setting
+ 'sitemap' => null, // sets sitemap url, will be replaced by plugin sitemap in the future
+ 'content' => [], // custom robots content
+ 'types' => ['index', 'follow', 'archive', 'imageindex', 'snippet'] // available robots types
+ ],
+ 'sitemap' => [
+ 'active' => true,
+ 'redirect' => true, // redirect /sitemap to /sitemap.xml
+ 'lang' => 'en',
+ 'generator' => require __DIR__ . '/options/sitemap.php',
+ 'changefreq' => 'weekly',
+ 'groupByTemplate' => false,
+ 'excludeTemplates' => ['error'],
+ 'priority' => fn (Page $p) => number_format(($p->isHomePage()) ? 1 : max(1 - 0.2 * $p->depth(), 0.2), 1),
+ ],
+ 'files' => [
+ 'parent' => null,
+ 'template' => null,
+ ],
+ 'canonicalBase' => null, // base url for canonical links
+ 'generateSchema' => true, // whether to generate default schema.org data
+ 'lang' => 'en_US', // default language, used for single-language sites
+ 'dateFormat' => null, // custom date format
+];
diff --git a/site/plugins/kirby-seo/config/options/sitemap.php b/site/plugins/kirby-seo/config/options/sitemap.php
new file mode 100644
index 0000000..2cf2486
--- /dev/null
+++ b/site/plugins/kirby-seo/config/options/sitemap.php
@@ -0,0 +1,37 @@
+index()->filter(fn ($page) => $page->metadata()->robotsIndex()->toBool() && !in_array($page->intendedTemplate()->name(), $exclude));
+
+ if ($group = option('tobimori.seo.sitemap.groupByTemplate')) {
+ $pages = $pages->group('intendedTemplate');
+ }
+
+ if (is_a($pages->first(), 'Kirby\Cms\Page')) {
+ $pages = $pages->group(fn () => 'pages');
+ }
+
+ foreach ($pages as $group) {
+ $index = $sitemap->create($group ? $group->first()->intendedTemplate()->name() : 'pages');
+
+ foreach ($group as $page) {
+ $url = $index->createUrl($page->metadata()->canonicalUrl())
+ ->lastmod($page->modified() ?? (int)(date('c')))
+ ->changefreq(is_callable($changefreq = option('tobimori.seo.sitemap.changefreq')) ? $changefreq($page) : $changefreq)
+ ->priority(is_callable($priority = option('tobimori.seo.sitemap.priority')) ? $priority($page) : $priority);
+
+ if (kirby()->languages()->count() > 1 && kirby()->language() !== null) {
+ $url->alternates(
+ kirby()->languages()->map(fn ($language) => new Obj([
+ 'hreflang' => $language->code() === kirby()->language()->code() ? 'x-default' : $language->code(),
+ 'href' => $page->url($language->code()),
+ ]))->toArray()
+ );
+ }
+ }
+ }
+};
diff --git a/site/plugins/kirby-seo/config/pageMethods.php b/site/plugins/kirby-seo/config/pageMethods.php
new file mode 100644
index 0000000..76c2baf
--- /dev/null
+++ b/site/plugins/kirby-seo/config/pageMethods.php
@@ -0,0 +1,11 @@
+ fn ($type) => SchemaSingleton::getInstance($type, $this),
+ 'schemas' => fn () => SchemaSingleton::getInstances($this),
+ 'metadata' => fn (?string $lang = null) => new Meta($this, $lang),
+ 'robots' => fn (?string $lang = null) => $this->metadata($lang)->robots(),
+];
diff --git a/site/plugins/kirby-seo/config/routes.php b/site/plugins/kirby-seo/config/routes.php
new file mode 100644
index 0000000..fe070f0
--- /dev/null
+++ b/site/plugins/kirby-seo/config/routes.php
@@ -0,0 +1,98 @@
+ 'robots.txt',
+ 'action' => function () {
+ if (option('tobimori.seo.robots.active', true)) {
+ $content = snippet('seo/robots.txt', [], true);
+ return new Response($content, 'text/plain', 200);
+ }
+
+ $this->next();
+ }
+ ],
+ [
+ 'pattern' => 'sitemap',
+ 'action' => function () {
+ if (!option('tobimori.seo.sitemap.redirect', true) || !option('tobimori.seo.sitemap.active', true)) {
+ $this->next();
+ }
+
+ go('/sitemap.xml');
+ }
+ ],
+ [
+ 'pattern' => 'sitemap.xsl',
+ 'action' => function () {
+ if (!option('tobimori.seo.sitemap.active', true)) {
+ $this->next();
+ }
+
+ kirby()->response()->type('text/xsl');
+
+ $lang = option('tobimori.seo.sitemap.lang', 'en');
+ if (is_callable($lang)) {
+ $lang = $lang();
+ }
+ kirby()->setCurrentTranslation($lang);
+
+ return Page::factory([
+ 'slug' => 'sitemap',
+ 'template' => 'sitemap',
+ 'model' => 'sitemap',
+ 'content' => [
+ 'title' => t('sitemap'),
+ ],
+ ])->render(contentType: 'xsl');
+ }
+ ],
+ [
+ 'pattern' => 'sitemap.xml',
+ 'action' => function () {
+ if (!option('tobimori.seo.sitemap.active', true)) {
+ $this->next();
+ }
+
+ SitemapIndex::instance()->generate();
+ kirby()->response()->type('text/xml');
+ return Page::factory([
+ 'slug' => 'sitemap',
+ 'template' => 'sitemap',
+ 'model' => 'sitemap',
+ 'content' => [
+ 'title' => t('sitemap'),
+ 'index' => null,
+ ],
+ ])->render(contentType: 'xml');
+ }
+ ],
+ [
+ 'pattern' => 'sitemap-(:any).xml',
+ 'action' => function (string $index) {
+ if (!option('tobimori.seo.sitemap.active', true)) {
+ $this->next();
+ }
+
+ SitemapIndex::instance()->generate();
+ if (!SitemapIndex::instance()->isValidIndex($index)) {
+ $this->next();
+ }
+
+ kirby()->response()->type('text/xml');
+ return Page::factory([
+ 'slug' => 'sitemap-' . $index,
+ 'template' => 'sitemap',
+ 'model' => 'sitemap',
+ 'content' => [
+ 'title' => t('sitemap'),
+ 'index' => $index,
+ ],
+ ])->render(contentType: 'xml');
+ }
+ ]
+];
diff --git a/site/plugins/kirby-seo/config/sections.php b/site/plugins/kirby-seo/config/sections.php
new file mode 100644
index 0000000..74eeef3
--- /dev/null
+++ b/site/plugins/kirby-seo/config/sections.php
@@ -0,0 +1,20 @@
+ [
+ 'mixins' => ['headline'],
+ 'computed' => [
+ 'options' => function () {
+ return A::map(option('tobimori.seo.previews'), fn ($item) => [
+ 'value' => $item,
+ 'text' => t($item)
+ ]);
+ }
+ ]
+ ],
+ 'heading-structure' => [
+ 'mixins' => ['headline']
+ ]
+];
diff --git a/site/plugins/kirby-seo/config/siteMethods.php b/site/plugins/kirby-seo/config/siteMethods.php
new file mode 100644
index 0000000..13e6180
--- /dev/null
+++ b/site/plugins/kirby-seo/config/siteMethods.php
@@ -0,0 +1,28 @@
+ fn ($type) => SchemaSingleton::getInstance($type),
+ 'schemas' => fn () => SchemaSingleton::getInstances(),
+ 'lang' => fn () => Str::replace(option('tobimori.seo.default.lang')($this->homePage()), '_', '-'),
+ 'canonicalFor' => function (string $url) {
+ $base = option('tobimori.seo.canonicalBase');
+ if (is_callable($base)) {
+ $base = $base($url);
+ }
+
+ if ($base === null) {
+ $base = $this->url(); // graceful fallback to site url
+ }
+
+ if (Str::startsWith($url, $base)) {
+ return $url;
+ }
+
+ $path = Url::path($url);
+ return url($base . '/' . $path);
+ }
+];
diff --git a/site/plugins/kirby-seo/index.css b/site/plugins/kirby-seo/index.css
new file mode 100644
index 0000000..0dd6799
--- /dev/null
+++ b/site/plugins/kirby-seo/index.css
@@ -0,0 +1 @@
+@charset "UTF-8";.k-heading-structure__label{display:flex;align-items:center;justify-content:flex-start;gap:var(--spacing-2)}.k-heading-structure__label>.k-icon{color:var(--color-gray-700)}.k-heading-structure__label>.k-loader{margin-left:auto;color:var(--color-gray-700)}.k-heading-structure__notice{margin-top:var(--spacing-2);display:flex;align-items:flex-start}.k-heading-structure__notice>.k-icon{margin-top:.125rem;margin-right:var(--spacing-1);color:var(--color-red)}.k-heading-structure__list{overflow:hidden}.k-heading-structure__item{position:relative;background:var(--theme-color-back);padding-top:var(--spacing-px);padding-bottom:var(--spacing-px);display:flex}.k-heading-structure__item__level{font-family:var(--font-mono);font-weight:700;margin-right:var(--spacing-2)}.k-heading-structure__item__text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.k-heading-structure__item.is-invalid{color:var(--color-red)}.k-heading-structure__item.level-2{margin-left:0rem;padding-left:1.6rem}.k-heading-structure__item.level-2:before{content:"";position:absolute;top:calc(50% - .0625rem);left:.4rem;width:.8rem;height:.125rem;background-color:currentColor}.k-heading-structure__item.level-2:after{content:"";position:absolute;bottom:calc(50% - .0625rem);left:.4rem;height:9999px;width:.125rem;background-color:currentColor}.k-heading-structure__item.level-3{margin-left:1.6rem;padding-left:1.6rem}.k-heading-structure__item.level-3:before{content:"";position:absolute;top:calc(50% - .0625rem);left:.4rem;width:.8rem;height:.125rem;background-color:currentColor}.k-heading-structure__item.level-3:after{content:"";position:absolute;bottom:calc(50% - .0625rem);left:.4rem;height:9999px;width:.125rem;background-color:currentColor}.k-heading-structure__item.level-4{margin-left:3.2rem;padding-left:1.6rem}.k-heading-structure__item.level-4:before{content:"";position:absolute;top:calc(50% - .0625rem);left:.4rem;width:.8rem;height:.125rem;background-color:currentColor}.k-heading-structure__item.level-4:after{content:"";position:absolute;bottom:calc(50% - .0625rem);left:.4rem;height:9999px;width:.125rem;background-color:currentColor}.k-heading-structure__item.level-5{margin-left:4.8rem;padding-left:1.6rem}.k-heading-structure__item.level-5:before{content:"";position:absolute;top:calc(50% - .0625rem);left:.4rem;width:.8rem;height:.125rem;background-color:currentColor}.k-heading-structure__item.level-5:after{content:"";position:absolute;bottom:calc(50% - .0625rem);left:.4rem;height:9999px;width:.125rem;background-color:currentColor}.k-heading-structure__item.level-6{margin-left:6.4rem;padding-left:1.6rem}.k-heading-structure__item.level-6:before{content:"";position:absolute;top:calc(50% - .0625rem);left:.4rem;width:.8rem;height:.125rem;background-color:currentColor}.k-heading-structure__item.level-6:after{content:"";position:absolute;bottom:calc(50% - .0625rem);left:.4rem;height:9999px;width:.125rem;background-color:currentColor}.k-facebook-preview{background:#f0f2f5;border:1px solid #ced0d4;overflow:hidden;border-radius:var(--rounded)}.k-facebook-preview__image{width:100%;height:0;padding-bottom:52.355%;position:relative}.k-facebook-preview__image img{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover}.k-facebook-preview__content{padding:.75rem 1rem}.k-facebook-preview__title,.k-facebook-preview__description,.k-facebook-preview__url{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:1}.k-facebook-preview__url{color:#65676b;font-size:.75rem;text-transform:uppercase;line-height:1.1;margin-bottom:.25rem}.k-facebook-preview__title{font-weight:600;line-height:1.1765;font-size:1rem;color:#050505;margin:.3125rem 0}.k-facebook-preview__description{line-height:1.3333;color:#65676b;font-size:.875rem}.k-google-search-preview{padding:1em;background:#fff;border:1px solid #ccc;letter-spacing:-.005em;border-radius:var(--rounded)}.k-google-search-preview__headline,.k-google-search-preview__paragraph{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.k-google-search-preview__headline{margin-top:0;margin-bottom:.25em;font-size:1.25em;font-weight:400;color:#1a0dab;-webkit-line-clamp:1}.k-google-search-preview__headline:hover{text-decoration:underline}.k-google-search-preview__url{display:inline-block;margin-bottom:.5em;font-size:.875em;line-height:1.3;color:#202124;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:100%}.k-google-search-preview__url>*{margin-right:.25em}.k-google-search-preview__url__breadcrumb{color:#5f6368;display:inline-block}.k-google-search-preview__url__breadcrumb:before{content:"› "}.k-google-search-preview__url .k-icon{margin-left:.1em}.k-google-search-preview__paragraph{margin:0;font-size:.875em;line-height:1.3em;color:#3c4043;-webkit-line-clamp:3}.k-slack-preview{max-width:32.5rem;position:relative;padding-left:1rem;line-height:1.46666667;font-size:.9375rem}.k-slack-preview:before{position:absolute;content:"";top:0;left:0;bottom:0;width:.25rem;border-radius:.5rem;background:#ddd}.k-slack-preview__site-name{display:flex;align-items:center;color:#717274}.k-slack-preview__title{font-weight:700;display:block;color:#0576b9;cursor:pointer}.k-slack-preview__title:hover{text-decoration:underline}.k-slack-preview__description{color:#2c2d30}.k-slack-preview__image{border-radius:.5rem;max-width:22.5rem;overflow:hidden;position:relative;margin-top:.5rem}.k-slack-preview__image:before{border-radius:.5rem;content:"";top:0;right:0;bottom:0;left:0;z-index:2;position:absolute;box-shadow:inset 0 0 0 1px #0000001a}.k-slack-preview__image img{width:100%;height:100%;display:block}.k-field-name-seo-preview-type .k-field-header{display:none}.k-seo-preview__inner{margin-top:var(--spacing-2)}.k-seo-preview__debugger{margin-top:1rem;display:flex;font-size:var(--text-sm);color:var(--color-gray-700);line-height:1.25rem;width:-moz-max-content;width:max-content;margin-left:auto}.k-seo-preview__debugger:hover{text-decoration:underline;color:var(--text-gray-800)}.k-seo-preview__debugger>.k-icon{margin-left:var(--spacing-2)}.k-seo-preview__label{display:flex;align-items:center;justify-content:flex-start;gap:var(--spacing-2)}.k-seo-preview__label>.k-icon{color:var(--color-gray-700)}.k-seo-preview__label>.k-loader{margin-left:auto;color:var(--color-gray-700)}.k-page-view-robots{--color-green-boost: -15%}
diff --git a/site/plugins/kirby-seo/index.js b/site/plugins/kirby-seo/index.js
new file mode 100644
index 0000000..daf1e3c
--- /dev/null
+++ b/site/plugins/kirby-seo/index.js
@@ -0,0 +1 @@
+(function(){"use strict";function l(s,e,t,a,i,c,_,X){var n=typeof s=="function"?s.options:s;e&&(n.render=e,n.staticRenderFns=t,n._compiled=!0),a&&(n.functional=!0),c&&(n._scopeId="data-v-"+c);var o;if(_?(o=function(r){r=r||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,!r&&typeof __VUE_SSR_CONTEXT__<"u"&&(r=__VUE_SSR_CONTEXT__),i&&i.call(this,r),r&&r._registeredComponents&&r._registeredComponents.add(_)},n._ssrRegister=o):i&&(o=X?function(){i.call(this,(n.functional?this.parent:this).$root.$options.shadowRoot)}:i),o)if(n.functional){n._injectStyles=o;var W=n.render;n.render=function(q,u){return o.call(u),W(q,u)}}else{var d=n.beforeCreate;n.beforeCreate=d?[].concat(d,o):[o]}return{exports:s,options:n}}const p={data(){return{label:null,value:null,isLoading:!0}},created(){this.isLoading=!0,this.load().then(s=>{this.label=s.label}),this.handleLoad(),this.debouncedLoad=this.$helper.debounce(s=>{this.handleLoad(s)},200)},computed:{changes(){return this.$store.getters["content/changes"]()},incorrectOrder(){var s;return(s=this.value)==null?void 0:s.some((e,t)=>{var a;return e.level>(((a=this.value[t-1])==null?void 0:a.level)??0)+1})},multipleH1(){var s;return((s=this.value)==null?void 0:s.filter(e=>e.level===1).length)>1},noH1(){var s;return((s=this.value)==null?void 0:s.filter(e=>e.level===1).length)===0}},methods:{async handleLoad(s){this.isLoading=!0;const e=panel.view.props.model.id;if(!e)throw new Error("[kirby-seo] The Heading structure section is only available for pages");const t=await panel.api.post(`/k-seo/${e.replaceAll("/","+")}/heading-structure`,s??this.changes);this.value=t,this.isLoading=!1},itemInvalid(s,e){var t;return!!(s.level>(((t=this.value[e-1])==null?void 0:t.level)??0)+1||s.level===1&&this.value[e-1]||s.level===1&&this.value.filter(a=>a.level===1).length>1)}},watch:{changes(s){this.debouncedLoad(s)}}};var v=function(){var e=this,t=e._self._c;return e.value?t("div",{staticClass:"k-section k-heading-structure"},[t("div",{staticClass:"k-field-header k-heading-structure__label k-label k-field-label"},[t("k-icon",{attrs:{type:"headline"}}),t("span",{staticClass:"k-label-text"},[e._v(e._s(e.label||e.$t("heading-structure")))]),e.isLoading?t("k-loader"):e._e()],1),t("k-box",{attrs:{theme:"white"}},[t("ol",{staticClass:"k-heading-structure__list"},e._l(e.value,function(a,i){return t("li",{key:i,class:`k-heading-structure__item level-${a.level} ${e.itemInvalid(a,i)?"is-invalid":""}`,style:`z-index: ${e.value.length-i}`},[t("span",{staticClass:"k-heading-structure__item__level"},[e._v("H"+e._s(a.level))]),t("span",{staticClass:"k-heading-structure__item__text"},[e._v(e._s(a.text))])])}),0)]),e.incorrectOrder&&!e.noH1?t("k-box",{staticClass:"k-heading-structure__notice",attrs:{theme:"negative"}},[t("k-icon",{attrs:{type:"alert"}}),t("k-text",[e._v(e._s(e.$t("incorrect-heading-order")))])],1):e._e(),e.multipleH1?t("k-box",{staticClass:"k-heading-structure__notice",attrs:{theme:"negative"}},[t("k-icon",{attrs:{type:"alert"}}),t("k-text",[e._v(e._s(e.$t("multiple-h1-tags")))])],1):e._e(),e.noH1?t("k-box",{staticClass:"k-heading-structure__notice",attrs:{theme:"negative"}},[t("k-icon",{attrs:{type:"alert"}}),t("k-text",[e._v(e._s(e.$t("missing-h1-tag")))])],1):e._e()],1):e._e()},g=[],h=l(p,v,g,!1,null,null,null,null);const f=h.exports,k=Object.freeze(Object.defineProperty({__proto__:null,default:f},Symbol.toStringTag,{value:"Module"})),b={props:{ogTitle:String,url:String,ogDescription:String,ogImage:String},computed:{host(){return new URL(this.url).host}}};var m=function(){var e=this,t=e._self._c;return t("div",[t("div",{staticClass:"k-facebook-preview"},[e.ogImage?t("div",{staticClass:"k-facebook-preview__image"},[t("img",{staticClass:"k-facebook-preview__img",attrs:{src:e.ogImage}})]):e._e(),t("div",{staticClass:"k-facebook-preview__content"},[t("span",{staticClass:"k-facebook-preview__url"},[e._v(e._s(e.host))]),t("span",{staticClass:"k-facebook-preview__title"},[e._v(e._s(e.ogTitle))]),t("p",{staticClass:"k-facebook-preview__description"},[e._v(e._s(e.ogDescription))])])]),t("a",{staticClass:"k-seo-preview__debugger",attrs:{href:"https://developers.facebook.com/tools/debug/","aria-label":"Facebook Sharing Debugger",target:"_blank",rel:"noopener noreferrer"}},[e._v(" "+e._s(e.$t("open-debugger"))+" "),t("k-icon",{attrs:{type:"open"}})],1)])},w=[],$=l(b,m,w,!1,null,null,null,null);const C=$.exports,y={props:{title:String,url:String,description:String},computed:{origin(){return new URL(this.url).origin},breadcrumbs(){return this.url.split("/").slice(3)}}};var L=function(){var e=this,t=e._self._c;return t("div",[t("div",{staticClass:"k-google-search-preview"},[t("span",{staticClass:"k-google-search-preview__url"},[t("span",[e._v(e._s(e.origin))]),e._l(e.breadcrumbs,function(a,i){return t("span",{key:i,staticClass:"k-google-search-preview__url__breadcrumb"},[e._v(" "+e._s(a)+" ")])})],2),t("h2",{staticClass:"k-google-search-preview__headline"},[e._v(e._s(e.title))]),t("p",{staticClass:"k-google-search-preview__paragraph"},[e._v(" "+e._s(e.description)+" ")])]),t("a",{staticClass:"k-seo-preview__debugger",attrs:{href:"https://search.google.com/search-console","aria-label":"Google Search Console",target:"_blank",rel:"noopener noreferrer"}},[e._v(" "+e._s(e.$t("open-search-console"))+" "),t("k-icon",{attrs:{type:"open"}})],1)])},S=[],x=l(y,L,S,!1,null,null,null,null);const T=x.exports,O={props:{ogTitle:String,ogSiteName:String,ogDescription:String,ogImage:String},computed:{origin(){return new URL(this.url).origin}}};var H=function(){var e=this,t=e._self._c;return t("div",{staticClass:"k-slack-preview"},[t("div",{staticClass:"k-slack-preview__content"},[t("div",{staticClass:"k-slack-preview__site-name"},[e._v(e._s(e.ogSiteName||e.origin))]),t("span",{staticClass:"k-slack-preview__title"},[e._v(e._s(e.ogTitle))]),t("p",{staticClass:"k-slack-preview__description"},[e._v(e._s(e.ogDescription))])]),e.ogImage?t("div",{staticClass:"k-slack-preview__image"},[t("img",{attrs:{src:e.ogImage}})]):e._e()])},R=[],I=l(O,H,R,!1,null,null,null,null);const Z=I.exports,V={components:{GooglePreview:T,FacebookPreview:C,SlackPreview:Z},data(){const s=localStorage.getItem("kSEOPreviewType")??"google";return{label:null,value:null,isLoading:!0,options:[],type:s}},created(){this.isLoading=!0,this.load().then(s=>{this.label=s.label,this.options=s.options}),this.handleLoad(),this.debouncedLoad=this.$helper.debounce(s=>{this.handleLoad(s)},200)},computed:{changes(){return this.$store.getters["content/changes"]()}},methods:{async handleLoad(s){var a,i;this.isLoading=!0;const e=((i=(a=panel.view.props.model)==null?void 0:a.id)==null?void 0:i.replaceAll("/","+"))??"site",t=await panel.api.post(`/k-seo/${e}/seo-preview`,s??this.changes);this.value=t,this.isLoading=!1}},watch:{changes(s){this.debouncedLoad(s)},type(){localStorage.setItem("kSEOPreviewType",this.type)}}};var F=function(){var e=this,t=e._self._c;return t("div",{staticClass:"k-section k-seo-preview"},[t("div",{staticClass:"k-field-header k-seo-preview__label k-label k-field-label"},[t("k-icon",{attrs:{type:"preview"}}),t("span",{staticClass:"k-label-text"},[e._v(e._s(e.label||e.$t("seo-preview")))]),e.isLoading?t("k-loader"):e._e()],1),t("k-select-field",{attrs:{type:"select",name:"seo-preview-type",before:e.$t("seo-preview-for"),options:e.options,empty:!1},model:{value:e.type,callback:function(a){e.type=a},expression:"type"}}),e.value?t("div",{staticClass:"k-seo-preview__inner"},[e.type==="google"?t("google-preview",e._b({},"google-preview",e.value,!1)):e._e(),e.type==="facebook"?t("facebook-preview",e._b({},"facebook-preview",e.value,!1)):e._e(),e.type==="slack"?t("slack-preview",e._b({},"slack-preview",e.value,!1)):e._e()],1):e._e()],1)},P=[],z=l(V,F,P,!1,null,null,null,null);const M=z.exports,U=Object.freeze(Object.defineProperty({__proto__:null,default:M},Symbol.toStringTag,{value:"Module"})),j=Object.freeze({import(s){return Object.entries(s).reduce((t,[a,i])=>(t[A(a)]=i.default,t),{})}});function A(s){return s.substring(s.lastIndexOf("/")+1,s.lastIndexOf(".")).toLowerCase()}const D={extends:"k-page-view",data(){return{dirty:!1,robots:{active:!1,state:[]}}},async mounted(){await this.handleLoad()},methods:{openSeoTab(){panel.view.open(panel.view.path+"?tab=seo")},async handleLoad(s){if(!panel.view.props.tabs.some(t=>t.name==="seo"))return;const e=this.model.id.replaceAll("/","+");this.robots=await panel.api.post(`/k-seo/${e}/robots`,s??this.changes)}},computed:{changes(){return this.$store.getters["content/changes"]()},robotsBtn(){const s={responsive:!0,size:"sm",icon:"robots",theme:"positive",text:this.$t("indicator-index"),variant:"filled"};return this.robots.state.includes("no")&&(s.text=this.$t("indicator-any"),s.theme="notice",s.icon="robots-off"),this.robots.state.includes("noindex")&&(s.text=this.$t("indicator-noindex"),s.theme="negative"),s}},watch:{changes(s){(Object.keys(s).some(e=>e.includes("robots"))||this.dirty)&&(this.dirty=!1,this.handleLoad(s),s&&(this.dirty=!0))}}};var N=function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-page-view",attrs:{"data-has-tabs":e.tabs.length>1,"data-id":e.model.id,"data-locked":e.isLocked,"data-template":e.blueprint},scopedSlots:e._u([{key:"topbar",fn:function(){return[e.model.id?t("k-prev-next",{attrs:{prev:e.prev,next:e.next}}):e._e()]},proxy:!0}])},[t("k-header",{staticClass:"k-page-view-header",attrs:{editable:e.permissions.changeTitle&&!e.isLocked},on:{edit:function(a){return e.$dialog(e.id+"/changeTitle")}},scopedSlots:e._u([{key:"buttons",fn:function(){return[t("k-button-group",[e.permissions.preview&&e.model.previewUrl?t("k-button",{staticClass:"k-page-view-preview",attrs:{link:e.model.previewUrl,title:e.$t("open"),icon:"open",target:"_blank",variant:"filled",size:"sm"}}):e._e(),t("k-button",{staticClass:"k-page-view-options",attrs:{disabled:e.isLocked===!0,dropdown:!0,title:e.$t("settings"),icon:"cog",variant:"filled",size:"sm"},on:{click:function(a){return e.$refs.settings.toggle()}}}),t("k-dropdown-content",{ref:"settings",attrs:{options:e.$dropdown(e.id),"align-x":"end"}}),t("k-languages-dropdown"),e.status?t("k-button",e._b({staticClass:"k-page-view-status",attrs:{variant:"filled"},on:{click:function(a){return e.$dialog(e.id+"/changeStatus")}}},"k-button",e.statusBtn,!1)):e._e(),e.robots&&e.robots.active?t("k-button",e._b({staticClass:"k-page-view-status k-page-view-robots",on:{click:e.openSeoTab}},"k-button",e.robotsBtn,!1)):e._e()],1),t("k-form-buttons",{attrs:{lock:e.lock}})]},proxy:!0}])},[e._v(" "+e._s(e.model.title)+" ")]),t("k-model-tabs",{attrs:{tab:e.tab.name,tabs:e.tabs}}),t("k-sections",{attrs:{blueprint:e.blueprint,empty:e.$t("page.blueprint",{blueprint:e.$esc(e.blueprint)}),lock:e.lock,parent:e.id,tab:e.tab}})],1)},E=[],B=l(D,N,E,!1,null,null,null,null);const G=B.exports;panel.plugin("tobimori/seo",{icons:{robots:' ',"robots-off":' '},sections:j.import(Object.assign({"./sections/heading-structure.vue":k,"./sections/seo-preview.vue":U})),components:{"k-page-view":G}})})();
diff --git a/site/plugins/kirby-seo/index.php b/site/plugins/kirby-seo/index.php
new file mode 100644
index 0000000..704dd45
--- /dev/null
+++ b/site/plugins/kirby-seo/index.php
@@ -0,0 +1,69 @@
+') === true
+) {
+ throw new Exception('Kirby SEO requires Kirby 4.0.2 or higher.');
+}
+
+App::plugin('tobimori/seo', [
+ 'options' => require __DIR__ . '/config/options.php',
+ 'sections' => require __DIR__ . '/config/sections.php',
+ 'api' => require __DIR__ . '/config/api.php',
+ 'siteMethods' => require __DIR__ . '/config/siteMethods.php',
+ 'pageMethods' => require __DIR__ . '/config/pageMethods.php',
+ 'hooks' => require __DIR__ . '/config/hooks.php',
+ 'routes' => require __DIR__ . '/config/routes.php',
+ // load all commands automatically
+ 'commands' => A::keyBy(A::map(
+ Dir::read(__DIR__ . '/config/commands'),
+ fn ($file) => A::merge([
+ 'id' => 'seo:' . F::name($file),
+ ], require __DIR__ . '/config/commands/' . $file)
+ ), 'id'),
+ // get all files from /translations and register them as language files
+ 'translations' => A::keyBy(A::map(
+ Dir::read(__DIR__ . '/translations'),
+ fn ($file) => A::merge([
+ 'lang' => F::name($file),
+ ], Yaml::decode(F::read(__DIR__ . '/translations/' . $file)))
+ ), 'lang'),
+ 'snippets' => [
+ 'seo/schemas' => __DIR__ . '/snippets/schemas.php',
+ 'seo/head' => __DIR__ . '/snippets/head.php',
+ 'seo/robots.txt' => __DIR__ . '/snippets/robots.txt.php',
+ ],
+ 'templates' => [
+ 'sitemap' => __DIR__ . '/templates/sitemap.php',
+ 'sitemap.xml' => __DIR__ . '/templates/sitemap.xml.php',
+ 'sitemap.xsl' => __DIR__ . '/templates/sitemap.xsl.php',
+ ],
+ 'blueprints' => [
+ 'seo/site' => __DIR__ . '/blueprints/site.yml',
+ 'seo/page' => __DIR__ . '/blueprints/page.yml',
+ 'seo/fields/og-image' => require __DIR__ . '/blueprints/fields/og-image.php',
+ 'seo/fields/og-group' => __DIR__ . '/blueprints/fields/og-group.yml',
+ 'seo/fields/meta-group' => __DIR__ . '/blueprints/fields/meta-group.yml',
+ 'seo/fields/robots' => require __DIR__ . '/blueprints/fields/robots.php',
+ 'seo/fields/site-robots' => require __DIR__ . '/blueprints/fields/site-robots.php',
+ 'seo/fields/social-media' => require __DIR__ . '/blueprints/fields/social-media.php',
+ ],
+]);
+
+if (!function_exists('schema')) {
+ function schema($type)
+ {
+ return Schema::{$type}();
+ }
+}
diff --git a/site/plugins/kirby-seo/package.json b/site/plugins/kirby-seo/package.json
new file mode 100644
index 0000000..b63c9dd
--- /dev/null
+++ b/site/plugins/kirby-seo/package.json
@@ -0,0 +1,17 @@
+{
+ "private": true,
+ "license": "MIT",
+ "author": "Tobias Möritz",
+ "type": "module",
+ "scripts": {
+ "dev": "kirbyup serve src/index.js",
+ "build": "kirbyup src/index.js",
+ "prepare": "husky install"
+ },
+ "devDependencies": {
+ "husky": "^9.0.11",
+ "kirbyup": "^3.1.4",
+ "postcss": "^8.4.35",
+ "sass": "^1.71.1"
+ }
+}
diff --git a/site/plugins/kirby-seo/postcss.config.js b/site/plugins/kirby-seo/postcss.config.js
new file mode 100644
index 0000000..9091bd5
--- /dev/null
+++ b/site/plugins/kirby-seo/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ 'postcss-logical': {},
+ autoprefixer: {}
+ }
+}
diff --git a/site/plugins/kirby-seo/snippets/head.php b/site/plugins/kirby-seo/snippets/head.php
new file mode 100644
index 0000000..a742523
--- /dev/null
+++ b/site/plugins/kirby-seo/snippets/head.php
@@ -0,0 +1,13 @@
+metadata()->snippetData();
+
+foreach ($tags as $tag) {
+ echo Html::tag($tag['tag'], $tag['content'] ?? null, $tag['attributes'] ?? []) . PHP_EOL;
+}
diff --git a/site/plugins/kirby-seo/snippets/robots.txt.php b/site/plugins/kirby-seo/snippets/robots.txt.php
new file mode 100644
index 0000000..51efe27
--- /dev/null
+++ b/site/plugins/kirby-seo/snippets/robots.txt.php
@@ -0,0 +1,58 @@
+ $data) {
+ $str[] = 'User-agent: ' . $ua;
+ foreach ($data as $type => $values) {
+ foreach ($values as $value) {
+ $str[] = $type . ': ' . $value;
+ }
+ }
+ }
+
+ $content = A::join($str, PHP_EOL);
+ }
+
+ echo $content;
+} else {
+ // output default
+ echo "User-agent: *\n";
+
+ $index = option('tobimori.seo.robots.index');
+ if (is_callable($index)) {
+ $index = $index();
+ }
+
+ if ($index) {
+ echo 'Allow: /';
+ echo "\nDisallow: /panel";
+ } else {
+ echo 'Disallow: /';
+ }
+}
+
+if (($sitemap = option('tobimori.seo.robots.sitemap')) || ($sitemapModule = option('tobimori.seo.sitemap.active'))) {
+ // Allow closure to be used
+ if (is_callable($sitemap)) {
+ $sitemap = $sitemap();
+ }
+
+ // Use default sitemap if none is set
+ if (!$sitemap && $sitemapModule) {
+ $sitemap = site()->canonicalFor('/sitemap.xml');
+ }
+
+ // Check again, so falsy values can't be used
+ if ($sitemap) {
+ echo "\n\nSitemap: {$sitemap}";
+ }
+}
diff --git a/site/plugins/kirby-seo/snippets/schemas.php b/site/plugins/kirby-seo/snippets/schemas.php
new file mode 100644
index 0000000..d87c130
--- /dev/null
+++ b/site/plugins/kirby-seo/snippets/schemas.php
@@ -0,0 +1,8 @@
+schemas() : [], $pageSchema ? $page->schemas() : []) as $schema) {
+ echo $schema;
+}
diff --git a/site/plugins/kirby-seo/src/components/Previews/FacebookPreview.vue b/site/plugins/kirby-seo/src/components/Previews/FacebookPreview.vue
new file mode 100644
index 0000000..d467e0f
--- /dev/null
+++ b/site/plugins/kirby-seo/src/components/Previews/FacebookPreview.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
diff --git a/site/plugins/kirby-seo/src/components/Previews/GooglePreview.vue b/site/plugins/kirby-seo/src/components/Previews/GooglePreview.vue
new file mode 100644
index 0000000..4273404
--- /dev/null
+++ b/site/plugins/kirby-seo/src/components/Previews/GooglePreview.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
diff --git a/site/plugins/kirby-seo/src/components/Previews/SlackPreview.vue b/site/plugins/kirby-seo/src/components/Previews/SlackPreview.vue
new file mode 100644
index 0000000..b3901c4
--- /dev/null
+++ b/site/plugins/kirby-seo/src/components/Previews/SlackPreview.vue
@@ -0,0 +1,93 @@
+
+
+
+
{{ ogSiteName || origin }}
+
{{ ogTitle }}
+
{{ ogDescription }}
+
+
+
+
+
+
+
+
+
+
diff --git a/site/plugins/kirby-seo/src/components/Views/PageView.vue b/site/plugins/kirby-seo/src/components/Views/PageView.vue
new file mode 100644
index 0000000..871021c
--- /dev/null
+++ b/site/plugins/kirby-seo/src/components/Views/PageView.vue
@@ -0,0 +1,150 @@
+https://github.com/getkirby/kirby/blob/main/panel/src/components/Views/Pages/PageView.vue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/plugins/kirby-seo/src/index.js b/site/plugins/kirby-seo/src/index.js
new file mode 100644
index 0000000..f664df4
--- /dev/null
+++ b/site/plugins/kirby-seo/src/index.js
@@ -0,0 +1,13 @@
+import { kirbyup } from 'kirbyup/plugin'
+import PageView from './components/Views/PageView.vue'
+
+panel.plugin('tobimori/seo', {
+ icons: {
+ robots: ` `,
+ 'robots-off': ` `
+ },
+ sections: kirbyup.import('./sections/*.vue'),
+ components: {
+ 'k-page-view': PageView
+ }
+})
diff --git a/site/plugins/kirby-seo/src/sections/heading-structure.vue b/site/plugins/kirby-seo/src/sections/heading-structure.vue
new file mode 100644
index 0000000..eb5c2c4
--- /dev/null
+++ b/site/plugins/kirby-seo/src/sections/heading-structure.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+ H{{ item.level }}
+ {{ item.text }}
+
+
+
+
+
+ {{ $t('incorrect-heading-order') }}
+
+
+
+ {{ $t('multiple-h1-tags') }}
+
+
+
+ {{ $t('missing-h1-tag') }}
+
+
+
+
+
+
+
diff --git a/site/plugins/kirby-seo/src/sections/seo-preview.vue b/site/plugins/kirby-seo/src/sections/seo-preview.vue
new file mode 100644
index 0000000..209ba08
--- /dev/null
+++ b/site/plugins/kirby-seo/src/sections/seo-preview.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
diff --git a/site/plugins/kirby-seo/templates/sitemap.php b/site/plugins/kirby-seo/templates/sitemap.php
new file mode 100644
index 0000000..618162b
--- /dev/null
+++ b/site/plugins/kirby-seo/templates/sitemap.php
@@ -0,0 +1,3 @@
+url() . '.xml');
diff --git a/site/plugins/kirby-seo/templates/sitemap.xml.php b/site/plugins/kirby-seo/templates/sitemap.xml.php
new file mode 100644
index 0000000..f57b648
--- /dev/null
+++ b/site/plugins/kirby-seo/templates/sitemap.xml.php
@@ -0,0 +1,5 @@
+render($page);
diff --git a/site/plugins/kirby-seo/templates/sitemap.xsl.php b/site/plugins/kirby-seo/templates/sitemap.xsl.php
new file mode 100644
index 0000000..5cf4eb4
--- /dev/null
+++ b/site/plugins/kirby-seo/templates/sitemap.xsl.php
@@ -0,0 +1,196 @@
+= '' ?>
+
+
+
+
+
+
+ = $page->metadata()->title()->escape() ?>
+
+
+
+
+
+
= $page->title() ?>
+
= t('sitemap-description') ?>
+
+
+
+
+
+ = t('sitemap') ?>
+ = t('sitemap-last-updated') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = t('sitemap-url') ?>
+ = t('sitemap-priority') ?>
+ = t('sitemap-changefreq') ?>
+ = t('sitemap-last-updated') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = t('sitemap-no-entries') ?>
+
+
+
+
+ Kirby SEO
+
+ v
+
+
+ v
+
+ = t('sitemap-by') ?> Tobias Möritz
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/plugins/kirby-seo/translations/de.yml b/site/plugins/kirby-seo/translations/de.yml
new file mode 100644
index 0000000..9472d59
--- /dev/null
+++ b/site/plugins/kirby-seo/translations/de.yml
@@ -0,0 +1,87 @@
+# Heading Structure
+heading-structure: Überschriftenstruktur
+incorrect-heading-order: Deine Überschriftenstruktur hat eine falsche Abfolge und ist ungültig.
+missing-h1-tag: Deine Überschriftenstruktur enthält keine H1 und ist ungültig.
+multiple-h1-tags: Deine Überschriftenstruktur enthält mehr als eine H1 und ist ungültig.
+
+# SEO Preview
+seo-preview: Vorschau
+seo-preview-for: Zeige mir
+open-debugger: Sharing-Debugger öffnen
+open-search-console: Search Console öffnen
+
+# Robots
+indicator-index: Indexierung erlaubt
+indicator-any: Indexierung teilw. verboten
+indicator-noindex: Indexierung verboten
+robots: Richtlinien für Suchmaschinen & Crawler
+robots-index: Indexierung
+robots-index-help: Ob Suchmaschinen die Seite indexieren dürfen.
+robots-follow: Links folgen
+robots-follow-help: Ob Suchmaschinen Links auf dieser Seite folgen dürfen.
+robots-archive: Archivierung
+robots-archive-help: Ob Suchmaschinen zwischengespeicherte Versionen der Seite ausliefern dürfen.
+robots-imageindex: Bilder-Indexierung
+robots-imageindex-help: Ob Bilder dieser Seite in der Bildersuche angezeigt werden dürfen.
+robots-snippet: Snippets
+robots-snippet-help: Ob Suchmaschinen Textausschnitte aus der Seite anzeigen dürfen.
+
+# Blueprint - Site/Common
+metadata-site: Metadaten & SEO
+global-meta-headline: Globale SEO-Einstellungen
+global-meta-headline-help: |
+ Diese Einstellungen werden für alle Seiten verwendet, die keine eigenen Metadaten haben.
+ Du kannst sie für jede Seite überschreiben.
+meta-title-template: Titel-Template
+meta-title-template-help: |
+ Ein Template, das für alle Seitentitel verwendet werden soll.
+ "\{\{ title }}" wird durch den Titel der Seite ersetzt.
+meta-description: Seitenbeschreibung
+meta-description-help: Empfohlene Länge von max. 150 Zeichen. Wird verwendet, falls keine Seitenbeschreibung angegeben ist.
+
+global-og-headline: Globale Open Graph-Einstellungen
+global-og-headline-help: Stelle ein, wie deine Website erscheint, wenn sie auf sozialen Netzwerken wie Facebook oder Twitter geteilt wird.
+og-title-template: Open Graph-Titel-Template
+og-description: Open Graph-Beschreibung
+og-site-name: Open Graph-Seitenname
+og-image: Open Graph-Bild
+og-image-help: Empfohlene Größe von 1200x630 Pixeln.
+og-image-empty: Kein Open Graph-Bild ausgewählt
+twitter-card-type: Twitter-Kartentyp
+twitter-card-type-help: Der Twitter-Kartentyp bestimmt, wie deine Website aussieht, wenn sie auf Twitter geteilt wird. [Mehr Informationen](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards).
+
+social-media-accounts: Social Media-Accounts
+social-media-accounts-help: URLs bzw. @-Handles zu deinen Social Media-Accounts. Werden verwendet, um Links zu deinen Accounts in den Metadaten zu setzen.
+
+# Blueprint - Page
+meta-headline: SEO-Einstellungen
+og-headline: Open Graph-Einstellungen
+title-overwrite: Titel (Überschreiben)
+summary: Karte mit quadratischem Bild
+summary_large_image: Karte mit großem Bild
+default-select: 'Standard:'
+twitter-author: '@username des Autors auf Twitter'
+inherit-settings: Einstellungen vererben
+inherit-settings-help: |
+ Wähle aus, welche Einstellungen an Unterseiten vererbt werden sollen.
+ Dies kann z.B. hilfreich sein, wenn alle Beiträge eines Blogs ein eigenes Titel-Template haben sollen, welches vom Seiten-Standard abweicht. Alle Einstellungen lassen sich weiterhin in der Hauptseite überschreiben.
+use-title-template: Titel-Template verwenden?
+use-title-template-no: 'Nein - reiner Titel'
+use-title-template-yes: 'Ja - mit Template'
+use-title-template-help: Gibt an, ob das Titel-Template verwendet werden soll. Wird nicht vererbt.
+
+# Labels
+google: Google
+facebook: Facebook
+slack: Slack
+
+# Sitemap
+sitemap: Sitemap
+sitemap-index: Sitemap-Index
+sitemap-description: Dies ist die Sitemap für deine Website, die Suchmaschinen über die Seiten auf deiner Website informiert, die indexiert werden können.
+sitemap-by: von
+sitemap-changefreq: Änderungsfrequenz
+sitemap-last-updated: Letzte Änderung
+sitemap-priority: Priorität
+sitemap-url: URL
+sitemap-no-entries: Keine Einträge
diff --git a/site/plugins/kirby-seo/translations/en.yml b/site/plugins/kirby-seo/translations/en.yml
new file mode 100644
index 0000000..f41a224
--- /dev/null
+++ b/site/plugins/kirby-seo/translations/en.yml
@@ -0,0 +1,87 @@
+# Heading Structure
+heading-structure: Heading Structure
+incorrect-heading-order: Your heading structure has an incorrect order and is invalid.
+missing-h1-tag: Your heading structure does not contain an H1 and is invalid.
+multiple-h1-tags: Your heading structure contains more than one H1 and is invalid.
+
+# SEO Preview
+seo-preview: Preview
+seo-preview-for: Show me
+open-debugger: Open Sharing Debugger
+open-search-console: Open Search Console
+
+# Robots
+indicator-index: Indexing allowed
+indicator-any: Indexing partly forbidden
+indicator-noindex: Indexing forbidden
+robots: Robots Directives
+robots-index: Indexing
+robots-index-help: Whether search engines may index this page.
+robots-follow: Follow Links
+robots-follow-help: Whether search engines may follow links on this page.
+robots-archive: Archive
+robots-archive-help: Whether search engines may archive this page.
+robots-imageindex: Image Indexing
+robots-imageindex-help: Whether search engines may index images on this page.
+robots-snippet: Snippets
+robots-snippet-help: Whether search engines may show text snippets of this page.
+
+# Blueprint - Site/Common
+metadata-site: Metadata & SEO
+global-meta-headline: Global SEO Settings
+global-meta-headline-help: |
+ These settings are used for all pages that do not have their own metadata.
+ You can override them for each page.
+meta-title-template: Title Template
+meta-title-template-help: |
+ A template to use for all page titles.
+ "\{\{ title }}" will be replaced with the page title.
+meta-description: Page Description
+meta-description-help: Recommended length of 150 characters max. Used if no page description is specified.
+
+global-og-headline: Global Open Graph Settings
+global-og-headline-help: Set how your website appears when shared on social networks like Facebook or Twitter.
+og-title-template: Open Graph Title Template
+og-description: Open Graph Description
+og-site-name: Open Graph Site Name
+og-image: Open Graph Image
+og-image-help: Recommended size of 1200x630 pixels.
+og-image-empty: No Open Graph Image selected
+twitter-card-type: Twitter Card Type
+twitter-card-type-help: Twitter Card Type determines how your website looks when shared on Twitter. [Read more](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards).
+
+social-media-accounts: Social Media Accounts
+social-media-accounts-help: URLs or @handles to your social media accounts. Used to put links to your accounts in the metadata.
+
+# Blueprint - Page
+meta-headline: SEO Settings
+og-headline: Open Graph Settings
+title-overwrite: Title (overwrite)
+summary: Summary with Square Image
+summary_large_image: Summary with Large Image
+default-select: 'Default:'
+twitter-author: 'Author @username on Twitter'
+inherit-settings: Inherit Settings
+inherit-settings-help: |
+ Select which settings should be inherited by subpages.
+ This can be helpful, for example, if all posts of a blog should have their own title template, which differs from the page default. All settings can still be overridden in the main page.
+use-title-template: Use title template?
+use-title-template-no: 'No - only title'
+use-title-template-yes: 'Yes - with template'
+use-title-template-help: Specifies whether the title template should be used. Will not be inherited.
+
+# Labels
+google: Google
+facebook: Facebook
+slack: Slack
+
+# Sitemap
+sitemap: Sitemap
+sitemap-index: Sitemap Index
+sitemap-description: This is the sitemap for your website that informs search engines about the pages on your website that can be indexed.
+sitemap-by: by
+sitemap-changefreq: Change Frequency
+sitemap-last-updated: Last Updated
+sitemap-priority: Priority
+sitemap-url: URL
+sitemap-no-entries: No entries
diff --git a/site/plugins/kirby-seo/translations/fr.yml b/site/plugins/kirby-seo/translations/fr.yml
new file mode 100644
index 0000000..932a93b
--- /dev/null
+++ b/site/plugins/kirby-seo/translations/fr.yml
@@ -0,0 +1,75 @@
+# Heading Structure
+heading-structure: Structure des titres
+incorrect-heading-order: Votre structure de titres a un ordre incorrect et est invalide.
+missing-h1-tag: Votre structure de titres ne contient pas de balise H1 et est invalide.
+multiple-h1-tags: Votre structure de titres contient plus d’une balise H1 et est invalide.
+
+# SEO Preview
+seo-preview: Aperçu
+seo-preview-for: Montre-moi
+open-debugger: Ouvrir le débogueur de partage
+open-search-console: Ouvrir la Console de recherche
+
+# Robots
+indicator-index: Indexation autorisée
+indicator-any: Indexation partiellement interdite
+indicator-noindex: Indexation interdite
+robots: Directives des robots
+robots-index: Indexation
+robots-index-help: Indique si les moteurs de recherche peuvent indexer cette page.
+robots-follow: Suivre les liens
+robots-follow-help: Indique si les moteurs de recherche peuvent suivre les liens de cette page.
+robots-archive: Archiver
+robots-archive-help: Indique si les moteurs de recherche peuvent archiver cette page.
+robots-imageindex: Indexation des images
+robots-imageindex-help: Indique si les moteurs de recherche peuvent indexer les images de cette page.
+robots-snippet: Extraits
+robots-snippet-help: Indique si les moteurs de recherche peuvent afficher des extraits de texte de cette page.
+
+# Blueprint - Site/Common
+metadata-site: Métadonnées et SEO
+global-meta-headline: Paramètres SEO globaux
+global-meta-headline-help: |
+ Ces paramètres sont utilisés pour toutes les pages qui n’ont pas leurs propres métadonnées.
+ Vous pouvez les remplacer pour chaque page.
+meta-title-template: Modèle de titre
+meta-title-template-help: |
+ Un modèle à utiliser pour tous les titres de page.
+ "\{\{ title }}" sera remplacé par le titre de la page.
+meta-description: Description de la page
+meta-description-help: Longueur recommandée de 150 caractères maximum. Utilisée si aucune description de page n’est spécifiée.
+
+global-og-headline: Paramètres globaux Open Graph
+global-og-headline-help: Définissez l’apparence de votre site web lorsqu’il est partagé sur les réseaux sociaux tels que Facebook ou Twitter.
+og-title-template: Modèle de titre Open Graph
+og-description: Description Open Graph
+og-site-name: Nom du site Open Graph
+og-image: Image Open Graph
+og-image-help: Taille recommandée de 1200x630 pixels.
+og-image-empty: Aucune image Open Graph sélectionnée
+twitter-card-type: Type de carte Twitter
+twitter-card-type-help: Le type de carte Twitter détermine l’apparence de votre site web lorsqu’il est partagé sur Twitter. [En savoir plus](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards).
+
+social-media-accounts: Comptes de réseaux sociaux
+social-media-accounts-help: URLs ou @nom_utilisateur de vos comptes de réseaux sociaux. Utilisés pour mettre des liens vers vos comptes dans les métadonnées.
+# Blueprint - Page
+meta-headline: Paramètres SEO
+og-headline: Paramètres Open Graph
+title-overwrite: Titre (remplacement)
+summary: Résumé avec une image carrée
+summary_large_image: Résumé avec une grande image
+default-select: 'Par défaut :'
+twitter-author: 'Auteur @nom_utilisateur sur Twitter'
+inherit-settings: Hériter des paramètres
+inherit-settings-help: |
+ Sélectionnez les paramètres à hériter par les sous-pages.
+ Cela peut être utile, par exemple, si tous les articles d’un blog doivent avoir leur propre modèle de titre, différent de celui de la page par défaut. Tous les paramètres peuvent toujours être remplacés dans la page principale.
+use-title-template: Utiliser le modèle de titre ?
+use-title-template-no: 'Non - seulement le titre'
+use-title-template-yes: 'Oui - avec le modèle'
+use-title-template-help: Indique si le modèle de titre doit être utilisé. Ne sera pas hérité.
+
+# Labels
+google: Google
+facebook: Facebook
+slack: Slack
diff --git a/site/plugins/kirby-seo/translations/pt_PT.yml b/site/plugins/kirby-seo/translations/pt_PT.yml
new file mode 100644
index 0000000..06caab9
--- /dev/null
+++ b/site/plugins/kirby-seo/translations/pt_PT.yml
@@ -0,0 +1,87 @@
+# Heading Structure
+heading-structure: Estrutura de Títulos
+incorrect-heading-order: A estrutura de títulos tem uma ordem incorrecta e é inválida.
+missing-h1-tag: A estrutura de títulos não contém uma tag H1 e é inválida.
+multiple-h1-tags: A estrutura de títulos contém mais do que uma tag H1 e é inválida.
+
+# SEO Preview
+seo-preview: Pré-visualização
+seo-preview-for: Mostrar
+open-debugger: Abrir Sharing Debugger
+open-search-console: Abrir Search Console
+
+# Robots
+indicator-index: Indexação permitida
+indicator-any: Indexação parcialmente proibida
+indicator-noindex: Indexação proibida
+robots: Diretivas Robots
+robots-index: Indexação
+robots-index-help: Se os motores de pesquisa podem indexar esta página.
+robots-follow: Seguir Links
+robots-follow-help: Se os motores de pesquisa podem seguir links nesta página.
+robots-archive: Arquivo
+robots-archive-help: Se os motores de pesquisa podem arquivar esta página.
+robots-imageindex: Indexação de Imagens
+robots-imageindex-help: Se os motores de pesquisa podem indexar imagens desta página.
+robots-snippet: Snippets
+robots-snippet-help: Se os motores de pesquisa podem mostrar snippets de texto desta página.
+
+# Blueprint - Site/Common
+metadata-site: Metadados & SEO
+global-meta-headline: Configurações Globais SEO
+global-meta-headline-help: |
+ Estas configurações são usadas para todas as páginas que não têm os seus próprios metadados.
+ Pode substituí-las em cada página.
+meta-title-template: Template de Título
+meta-title-template-help: |
+ Template para usar em todos os títulos de páginas.
+ "\{\{ title }}" será substituído pelo título da página.
+meta-description: Descrição de Página
+meta-description-help: Recomendado um tamanho de 150 caracteres no máximo. Usada se nenhuma descrição de página for especificada.
+
+global-og-headline: Configurações Globais Open Graph
+global-og-headline-help: Defina como o seu site aparece quando é partilhado em redes sociais como o Facebook ou o Twitter.
+og-title-template: Template de Título Open Graph
+og-description: Descrição Open Graph
+og-site-name: Nome do Site Open Graph
+og-image: Imagem Open Graph
+og-image-help: Tamanho recomendado de 1200x630 pixels.
+og-image-empty: Nenhuma Imagem Open Graph selecionada
+twitter-card-type: Tipo de Twitter Card
+twitter-card-type-help: O tipo de Twitter Card determina a aparência do seu site quando é partilhado no Twitter. [Leia mais](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards).
+
+social-media-accounts: Contas de Redes Sociais
+social-media-accounts-help: URLs ou @handles para as suas contas de redes sociais. Usado para colocar links para as suas contas nos metadados.
+
+# Blueprint - Page
+meta-headline: Configurações SEO
+og-headline: Configurações Open Graph
+title-overwrite: Título (substituir)
+summary: Resumo com Imagem Quadrada
+summary_large_image: Resumo com Imagem Grande
+default-select: 'Por defeito:'
+twitter-author: 'Autor @username no Twitter'
+inherit-settings: Herdar Configurações
+inherit-settings-help: |
+ Selecione quais as configurações que devem ser herdadas pelas subpáginas.
+ Isto pode ser útil, por exemplo, se todos os posts de um blog tiverem o seu próprio template de título, que pode ser diferente do pré-configurado na página. Todas as configurações continuam a poder ser substituídas na página principal.
+use-title-template: Usar o template de título?
+use-title-template-no: 'Não - apenas o título'
+use-title-template-yes: 'Sim - com template'
+use-title-template-help: Especifica se o template de título deve ser usado. Não será herdado.
+
+# Labels
+google: Google
+facebook: Facebook
+slack: Slack
+
+# Sitemap
+sitemap: Sitemap
+sitemap-index: Índice Sitemap
+sitemap-description: Este é o sitemap do site que informa os motores de pesquisa sobre as páginas que podem ser indexadas.
+sitemap-by: por
+sitemap-changefreq: Frequência de Mudança
+sitemap-last-updated: Última Atualização
+sitemap-priority: Prioridade
+sitemap-url: URL
+sitemap-no-entries: Sem registos
diff --git a/site/plugins/kirby-seo/translations/tr.yml b/site/plugins/kirby-seo/translations/tr.yml
new file mode 100644
index 0000000..531694f
--- /dev/null
+++ b/site/plugins/kirby-seo/translations/tr.yml
@@ -0,0 +1,87 @@
+# Başlık Yapısı
+heading-structure: Başlık Yapısı
+incorrect-heading-order: Başlık yapınız yanlış bir sıraya sahip ve geçersizdir.
+missing-h1-tag: Başlık yapınızda bir H1 etiketi bulunmuyor ve geçersizdir.
+multiple-h1-tags: Başlık yapınızda birden fazla H1 etiketi bulunuyor ve geçersizdir.
+
+# SEO Önizleme
+seo-preview: Önizleme
+seo-preview-for: Bana göster
+open-debugger: Paylaşım Hata Ayıklayıcıyı Aç
+open-search-console: Arama Konsolunu Aç
+
+# Robotlar
+indicator-index: İndekslemeye izin verildi
+indicator-any: İndeksleme kısmen yasaklandı
+indicator-noindex: İndeksleme yasaklandı
+robots: Robot Talimatları
+robots-index: İndeksleme
+robots-index-help: Arama motorlarının bu sayfayı indeksleyip indekslemeyeceğini belirtir.
+robots-follow: Bağlantıları Takip Et
+robots-follow-help: Arama motorlarının bu sayfadaki bağlantıları takip edip etmeyeceğini belirtir.
+robots-archive: Arşivle
+robots-archive-help: Arama motorlarının bu sayfayı arşivleyip arşivlemeyeceğini belirtir.
+robots-imageindex: İmaj İndeksleme
+robots-imageindex-help: Arama motorlarının bu sayfadaki görüntüleri indeksleyip indekslemeyeceğini belirtir.
+robots-snippet: Özetler
+robots-snippet-help: Arama motorlarının bu sayfanın metin özetlerini gösterip göstermeyeceğini belirtir.
+
+# Şablona Dayalı - Site/Ortak
+metadata-site: Meta Verileri ve SEO
+global-meta-headline: Genel SEO Ayarları
+global-meta-headline-help: |
+ Bu ayarlar, kendi meta verileri olmayan tüm sayfalar için kullanılır.
+ Her sayfa için bunları geçersiz kılabilirsiniz.
+meta-title-template: Başlık Şablonu
+meta-title-template-help: |
+ Tüm sayfa başlıkları için kullanılacak bir şablon.
+ "\{\{ başlık }}" sayfa başlığı ile değiştirilecektir.
+meta-description: Sayfa Açıklaması
+meta-description-help: Maksimum 150 karakter uzunluğunda önerilen bir sayfa açıklamasıdır. Sayfa açıklaması belirtilmemişse kullanılır.
+
+global-og-headline: Genel Açık Grafik (OG) Ayarları
+global-og-headline-help: Web sitenizin Facebook veya Twitter gibi sosyal ağlarda paylaşıldığında nasıl göründüğünü ayarlar.
+og-title-template: Açık Grafik (OG) Başlık Şablonu
+og-description: Açık Grafik (OG) Açıklaması
+og-site-name: Açık Grafik (OG) Site Adı
+og-image: Açık Grafik (OG) Görseli
+og-image-help: Önerilen boyut 1200x630 pikseldir.
+og-image-empty: Boş Açık Grafik (OG) Görseli
+twitter-card-type: Twitter Kart Türü
+twitter-card-type-help: Twitter Kart Türü, Twitter'da paylaşıldığında web sitenizin nasıl göründüğünü belirler. [Daha fazla bilgi](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards).
+
+social-media-accounts: Sosyal Medya Hesapları
+social-media-accounts-help: Sosyal medya hesaplarınızın URL'leri veya @kullanici_adi. Meta verilerinde hesaplarınıza bağlantı eklemek için kullanılır.
+
+# Şablona Dayalı - Sayfa
+meta-headline: SEO Ayarları
+og-headline: Açık Grafik (OG) Ayarları
+title-overwrite: Başlık (üzerine yaz)
+summary: Kare İmaj ile Özet
+summary_large_image: Büyük İmaj ile Özet
+default-select: 'Varsayılan:'
+twitter-author: Twitter'da @kullanici_adi
+inherit-settings: Ayarları Miras Al
+inherit-settings-help: |
+ Alt sayfalar tarafından miras alınacak ayarları seçin.
+ Örneğin, bir blogun tüm yazılarının sayfa varsayılanından farklı bir başlık şablonuna sahip olması gerekiyorsa bu yardımcı olabilir. Tüm ayarlar ana sayfada hala geçersiz kılınabilir.
+use-title-template: Başlık şablonunu kullan?
+use-title-template-no: 'Hayır - sadece başlık'
+use-title-template-yes: 'Evet - şablonla'
+use-title-template-help: Başlık şablonunun kullanılıp kullanılmayacağını belirtir. Miras alınmayacaktır.
+
+# Etiketler
+google: Google
+facebook: Facebook
+slack: Slack
+
+# Sitemap
+sitemap: Site Haritası
+sitemap-index: Site Haritası Dizini
+sitemap-description: Web sitenizdeki dizine eklenebilecek sayfalar hakkında arama motorlarını bilgilendiren web sitenizin site haritasıdır.
+sitemap-by: tarafından
+sitemap-changefreq: Değişim Sıklığı
+sitemap-last-updated: Son Güncelleme
+sitemap-priority: Öncelik
+sitemap-url: URL
+sitemap-no-entries: Giriş yok
diff --git a/site/plugins/send-button/index.css b/site/plugins/send-button/index.css
index f96ab1a..104dc38 100644
--- a/site/plugins/send-button/index.css
+++ b/site/plugins/send-button/index.css
@@ -1,4 +1,14 @@
+.wrapper[data-v-4847e765] {
+ display: flex;
+ justify-content: space-between;
+ width: 100%;
+}
+@media screen and (max-width: 800px) {
+.k-field-footer[data-v-4847e765] {
+ width: 9rem;
+}
+}
@media screen and (min-width: 533px) {
button[data-v-4847e765] {
margin-top: 2.15rem;
diff --git a/site/plugins/send-button/index.js b/site/plugins/send-button/index.js
index c89a1bc..8e191d6 100644
--- a/site/plugins/send-button/index.js
+++ b/site/plugins/send-button/index.js
@@ -2,7 +2,7 @@
"use strict";
function normalizeComponent(scriptExports, render, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier, shadowMode) {
var options = typeof scriptExports === "function" ? scriptExports.options : scriptExports;
- if (render) {
+ {
options.render = render;
options.staticRenderFns = staticRenderFns;
options._compiled = true;
@@ -18,31 +18,86 @@
const _sfc_main = {
__name: "SendButtonField",
props: {
- pageUri: String
+ pageUri: String,
+ pageStatus: String
},
setup(__props) {
const { pageUri } = __props;
- const text = Vue.ref("Envoyer");
- const headers = {
- method: "POST",
- body: JSON.stringify({
- pageUri
- })
- };
- function send(event) {
+ const testBtnState = Vue.ref({
+ icon: "plane",
+ text: "Tester",
+ theme: null,
+ error: null
+ });
+ const sendBtnState = Vue.ref({
+ icon: "plane",
+ text: "Envoyer",
+ theme: "orange",
+ error: null
+ });
+ async function send(event, isTest = false) {
event.preventDefault();
- fetch("/send-newsletter.json", headers).then((res) => res.json()).then((json) => console.log(json));
+ const currentBtnState = isTest ? testBtnState : sendBtnState;
+ currentBtnState.value = {
+ theme: "blue",
+ text: "En cours…",
+ icon: "loader",
+ error: null
+ };
+ const headers = {
+ method: "POST",
+ body: JSON.stringify({
+ pageUri,
+ isTest
+ })
+ };
+ try {
+ const response = await fetch("/send-newsletter.json", headers);
+ const data = await response.json();
+ console.log(data);
+ if (data.status === "success") {
+ currentBtnState.value = {
+ theme: "green",
+ icon: "check",
+ text: isTest ? "Test envoyé" : "Envoi réussi",
+ error: null
+ };
+ setTimeout(() => {
+ location.href = location.href;
+ }, 2e3);
+ } else {
+ let errorMessage = data.message || "Erreur inconnue";
+ throw new Error(errorMessage);
+ }
+ } catch (error) {
+ currentBtnState.value = {
+ theme: "red",
+ icon: "alert",
+ text: isTest ? "Échec du test" : "Erreur",
+ error: error.message
+ };
+ }
}
- return { __sfc: true, text, headers, send };
+ return { __sfc: true, testBtnState, sendBtnState, send };
}
};
var _sfc_render = function render() {
var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
- return _c("k-button", { attrs: { "variant": "filled", "icon": "plane" }, on: { "click": function($event) {
+ return _vm.pageStatus !== "listed" ? _c("div", { staticClass: "wrapper" }, [_c("div", { staticClass: "test-wrapper" }, [_c("k-button", { staticStyle: { "width": "max-content" }, attrs: { "variant": "filled", "help": "test", "theme": _setup.testBtnState.theme, "icon": _setup.testBtnState.icon }, on: { "click": function($event) {
+ return _setup.send($event, true);
+ } } }, [_vm._v(_vm._s(_setup.testBtnState.text))]), _vm._m(0), _setup.testBtnState.error ? _c("k-box", { staticStyle: { "margin-top": "var(--spacing-1)" }, attrs: { "theme": "error" } }, [_vm._v(_vm._s(_setup.testBtnState.error))]) : _vm._e()], 1), _c("div", { staticClass: "send-wrapper" }, [_c("k-button", { attrs: { "variant": "filled", "theme": _setup.sendBtnState.theme, "icon": _setup.sendBtnState.icon }, on: { "click": function($event) {
return _setup.send($event);
- } } }, [_vm._v(_vm._s(_setup.text))]);
+ } } }, [_vm._v(_vm._s(_setup.sendBtnState.text))]), _setup.sendBtnState.error ? _c("k-box", { staticStyle: { "margin-top": "var(--spacing-1)" }, attrs: { "theme": "error" } }, [_vm._v(_vm._s(_setup.sendBtnState.error))]) : _vm._e(), _vm._m(1)], 1)]) : _vm._e();
};
- var _sfc_staticRenderFns = [];
+ var _sfc_staticRenderFns = [function() {
+ var _vm = this, _c = _vm._self._c;
+ _vm._self._setupProxy;
+ return _c("footer", { staticClass: "k-field-footer" }, [_c("div", { staticClass: "k-help k-field-help k-text" }, [_c("p", [_vm._v("Envoie seulement à la liste ci-dessus")])])]);
+ }, function() {
+ var _vm = this, _c = _vm._self._c;
+ _vm._self._setupProxy;
+ return _c("footer", { staticClass: "k-field-footer" }, [_c("div", { staticClass: "k-help k-field-help k-text" }, [_c("strong", [_vm._v("⚠ Envoie à tous les abonnés.")])])]);
+ }];
_sfc_render._withStripped = true;
var __component__ = /* @__PURE__ */ normalizeComponent(
_sfc_main,
diff --git a/site/plugins/send-button/index.php b/site/plugins/send-button/index.php
index ee3acc1..5b596b4 100755
--- a/site/plugins/send-button/index.php
+++ b/site/plugins/send-button/index.php
@@ -5,9 +5,16 @@ Kirby::plugin('adrienpayet/send-button', [
'send-button' => [
'computed' => [
'pageUri' => function () {
- return $this->model()->uri();
+ return $this->model()->uri();
},
- ]
- ]
- ]
+ 'pageStatus' => function () {
+ return $this->model()->status();
+ },
+ ],
+ ],
+ ],
+ 'routes' => [
+ require __DIR__ . '/routes/send-newsletter.php',
+ require __DIR__ . '/routes/unsubscribe-newsletter.php',
+ ],
]);
diff --git a/site/plugins/send-button/routes/save-send-newsletter.php b/site/plugins/send-button/routes/save-send-newsletter.php
new file mode 100644
index 0000000..63aec20
--- /dev/null
+++ b/site/plugins/send-button/routes/save-send-newsletter.php
@@ -0,0 +1,95 @@
+ '/send-newsletter.json',
+ 'method' => 'POST',
+ 'action' => function () {
+ $jsonRequest = file_get_contents('php://input');
+ $data = json_decode($jsonRequest);
+
+ if (!$data || !isset($data->pageUri) || !isset($data->isTest)) {
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'Invalid request data. Required fields: pageUri, isTest.',
+ ]);
+ }
+
+ $kirby = kirby();
+ $emailPage = page('lettre')->childrenAndDrafts()->find($data->pageUri);
+
+ if (!$emailPage) {
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'The specified page does not exist.',
+ ]);
+ }
+
+ $recipients = $data->isTest
+ ? $kirby->users()->pluck('email', null, true)
+ : page('lettre')->subscribers()->toStructure()->pluck('email', ',', true);
+
+ if (empty($recipients)) {
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'No recipients found.',
+ ]);
+ }
+
+ $subject = $data->isTest
+ ? '[TEST] - ' . $emailPage->title()->value()
+ : $emailPage->title()->value();
+
+ $from = new \Kirby\Cms\User([
+ 'email' => 'info@actuel-inactuel.fr',
+ 'name' => 'actuel-inactuel',
+ ]);
+
+ $sentEmails = [];
+ $errors = [];
+
+ $batchSize = 5;
+ $pauseBetweenBatches = 1;
+
+ foreach (array_chunk($recipients, $batchSize) as $batch) {
+ foreach ($batch as $recipient) {
+ try {
+ $kirby->email([
+ 'from' => $from,
+ 'to' => $recipient,
+ 'subject' => $subject,
+ 'template' => 'newsletter',
+ 'data' => [
+ 'body' => $emailPage->body(),
+ 'url' => (string) $emailPage->url(),
+ 'recipient' => $recipient,
+ ],
+ ]);
+ $sentEmails[] = $recipient;
+ } catch (Exception $error) {
+ $errors[] = [
+ 'email' => $recipient,
+ 'message' => $error->getMessage(),
+ ];
+ }
+ }
+
+ sleep($pauseBetweenBatches);
+ }
+
+ if (!$data->isTest) {
+ $emailPage->changeStatus('listed');
+ } else {
+ $emailPage->changeStatus('unlisted');
+ }
+
+ return json_encode([
+ 'status' => empty($errors) ? 'success' : 'partial',
+ 'message' => empty($errors) ? 'All emails sent successfully.' : 'Certains emails n\'ont pas pu être envoyé.',
+ 'sent' => $sentEmails,
+ 'failed' => $errors,
+ ]);
+ },
+];
diff --git a/site/plugins/send-button/routes/send-newsletter.php b/site/plugins/send-button/routes/send-newsletter.php
new file mode 100644
index 0000000..ef4c4b8
--- /dev/null
+++ b/site/plugins/send-button/routes/send-newsletter.php
@@ -0,0 +1,89 @@
+ '/send-newsletter.json',
+ 'method' => 'POST',
+ 'action' => function () {
+ $jsonRequest = file_get_contents('php://input');
+ $data = json_decode($jsonRequest);
+
+ if (!$data || !isset($data->pageUri) || !isset($data->isTest)) {
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'Invalid request data. Required fields: pageUri, isTest.',
+ ]);
+ }
+
+ $kirby = kirby();
+ $emailPage = page('lettre')->childrenAndDrafts()->find($data->pageUri);
+
+ if (!$emailPage) {
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'The specified page does not exist.',
+ ]);
+ }
+
+ $recipients = $data->isTest
+ ? $emailPage->testAdressList()->toStructure()->pluck('email', ',', true)
+ : page('lettre')->subscribers()->toStructure()->pluck('email', ',', true);
+
+ if (empty($recipients)) {
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'No recipients found.',
+ ]);
+ }
+
+ $subject = $data->isTest
+ ? '[TEST] - ' . $emailPage->title()->value()
+ : $emailPage->title()->value();
+
+ $mailersend = new MailerSend(['api_key' => kirby()->option('mailerSendApiKey')]);
+ $bulkEmailParams = [];
+
+ foreach ($recipients as $recipient) {
+ $bulkEmailParams[] = (new EmailParams())
+ ->setFrom('info@actuel-inactuel.fr')
+ ->setFromName('actuel-inactuel')
+ ->setRecipients([new Recipient($recipient, 'abonné')])
+ ->setSubject($subject)
+ ->setHtml($emailPage->body())
+ ->setReplyTo('info@actuel-inactuel.fr')
+ ->setReplyToName('actuel-inactuel');
+ }
+
+ try {
+ $response = $mailersend->bulkEmail->send($bulkEmailParams);
+ file_put_contents($emailPage->root() . '/mailersend_log.json', json_encode($response, JSON_PRETTY_PRINT));
+ return json_encode([
+ 'status' => 'success',
+ 'message' => 'All emails sent successfully.',
+ ]);
+ } catch (\Exception $e) {
+ $date = Kirby\Toolkit\Date::now(new DateTimeZone('Europe/Paris'));
+ file_put_contents(
+ $emailPage->root() . '/mailersend_errors.log',
+ $date->format('d/m/Y H:i:s') . ' ' . $e->getMessage() . PHP_EOL,
+ FILE_APPEND
+ );
+ return json_encode([
+ 'status' => 'error',
+ 'message' => 'Erreur enregistrée dans le log : ' . $e->getMessage(),
+ ]);
+ }
+
+ if (!$data->isTest) {
+ $emailPage->update([
+ 'published' => Kirby\Toolkit\Date::Today(),
+ ]);
+ $emailPage->changeStatus('listed');
+ }
+ },
+];
diff --git a/site/plugins/send-button/routes/unsubscribe-newsletter.php b/site/plugins/send-button/routes/unsubscribe-newsletter.php
new file mode 100644
index 0000000..6158a04
--- /dev/null
+++ b/site/plugins/send-button/routes/unsubscribe-newsletter.php
@@ -0,0 +1,42 @@
+ '/desinscription',
+ 'action' => function () {
+ $kirby = kirby();
+ $kirby->impersonate('kirby');
+
+ $email = get('email');
+ $page = page('lettre');
+
+ $emailExists = in_array(['email' => $email], $page->subscribers()->yaml());
+
+ if (!$emailExists) {
+ $title = 'Erreur';
+ $body = '' . $email . ' est introuvable dans la base de données. Vous pouvez demander une désinscription manuelle en écrivant à info@actuel-inactuel.fr .
';
+ } else {
+ $subscribers = array_filter(
+ $page->subscribers()->yaml(),
+ fn($subscriber) => $subscriber !== ['email' => $email]
+ );
+
+ $page->update([
+ 'subscribers' => $subscribers,
+ ]);
+
+ $title = $email . ' désinscrit';
+ $body = 'Si la désinscription automatique n\'a pas fonctionné et que vous continuez à recevoir des mails, vous pouvez demander une désinscription manuelle en écrivant à info@actuel-inactuel.fr .
';
+
+ }
+
+ return new Page([
+ 'slug' => Str::slug('desinscription'),
+ 'template' => 'error',
+ 'status' => 'unlisted',
+ 'content' => [
+ 'title' => $title,
+ 'body' => $body,
+ ],
+ ]);
+ },
+];
diff --git a/site/plugins/send-button/src/components/SendButtonField.vue b/site/plugins/send-button/src/components/SendButtonField.vue
index 6cbfd23..5bba736 100755
--- a/site/plugins/send-button/src/components/SendButtonField.vue
+++ b/site/plugins/send-button/src/components/SendButtonField.vue
@@ -1,7 +1,48 @@
- {{
- text
- }}
+
+
+ {{ testBtnState.text }}
+
+ {{ testBtnState.error }}
+
+
+ {{ sendBtnState.text }}
+ {{ sendBtnState.error }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/snippets/nav.php b/site/snippets/nav.php
index ead623a..6521d0b 100644
--- a/site/snippets/nav.php
+++ b/site/snippets/nav.php
@@ -1,8 +1,4 @@
-
-
+
- "categories"]) ?>
- "years"]) ?>
- fermer
+ 'categories']) ?>
+ 'years']) ?>
+ textes
\ No newline at end of file
diff --git a/site/snippets/nav__texts--all.php b/site/snippets/nav__texts--all.php
index 205444c..8ee0245 100644
--- a/site/snippets/nav__texts--all.php
+++ b/site/snippets/nav__texts--all.php
@@ -1,32 +1,40 @@
-
+
grandChildren()->sortBy('published', 'desc') as $article): ?>
- author()->toPage() == null ? "inconnu" : $article->author()->toPage()->title();
- ?>
- title()->value()) ?>',
author: '= $author ?>',
category: '= $article->category() ?>',
- }"
- x-show="
+ keywords: '= $article->keywords() ?>',
+ }" x-show="
slugify(title).includes(slugify(search))
|| slugify(author).includes(slugify(search))
|| slugify(category).includes(slugify(search))
- "
- >
-
- = $article->title() ?>
-
-
-
- par
- = $author ?>
- publié le = $article->published()->toDate('d/m/Y') ?>
- dans = $article->parent()->title() ?> / = $article->category() ?>
-
-
-
+ || slugify(keywords).includes(slugify(search))
+ ">
+
+ = $article->title() ?>
+ subtitle()->isNotEmpty()): ?>
+ = $article->subtitle()->inline() ?>
+
+
+
+
+ par
+ = $author ?>
+
+ publié le published()->toDate('d/m/Y') ?>
+
+ dans = $article->parent()->title() ?>
+ / = $article->category() ?>
+
+
+
\ No newline at end of file
diff --git a/site/snippets/nav__texts--collection.php b/site/snippets/nav__texts--collection.php
index 5519c4b..cf29a0e 100644
--- a/site/snippets/nav__texts--collection.php
+++ b/site/snippets/nav__texts--collection.php
@@ -1,72 +1,60 @@
-
+
collection($collection) as $section): ?>
-
-
-
+
+
+
= $section->title() ?>
-
+
-
-
-
- = $section->edito() ?>
-
-
Lire
+
+
+
+ = $section->edito() ?>
+
+
Lire
-
+
children() as $article): ?>
- author()->toPage() == null ? "inconnu" : $article->author()->toPage()->title();
- ?>
- title()->value()) ?>',
author: '= $author ?>',
category: '= $article->category() ?>',
- }"
- x-show="
+ keywords: '= $article->keywords() ?>',
+ }" x-show="
slugify(title).includes(slugify(search))
|| slugify(author).includes(slugify(search))
|| slugify(category).includes(slugify(search))
- "
- >
-
- = $article->title() ?>
-
-
-
- par
- = $author ?>
- publié le = $article->published()->toDate('d/m/Y') ?>
- dans = $article->parent()->title() ?> / = $article->category() ?>
-
-
-
+ || slugify(keywords).includes(slugify(search))
+ ">
+
+ = $article->title() ?>
+ subtitle()->isNotEmpty()): ?>
+ = $article->subtitle()->inline() ?>
+
+
+
+
+ par
+ = $author ?>
+
+ publié le published()->toDate('d/m/Y') ?>
+
+ dans = $article->parent()->title() ?>
+ / = $article->category() ?>
+
+
+
diff --git a/site/templates/author.php b/site/templates/author.php
index bd2acf8..d002cf9 100644
--- a/site/templates/author.php
+++ b/site/templates/author.php
@@ -1,13 +1,16 @@
-
-
-
- = $page->title() ?>
- = $page->presentation() ?>
+
+
+
+ = $page->title() ?>
+ = $page->presentation() ?>
+
+
+
textes :
-
+
grandChildren() as $article): ?>
author()->toPage()->title()->value() == $page->title()->value()): ?>
@@ -19,17 +22,14 @@
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/site/templates/category.php b/site/templates/category.php
index e401df3..bf96628 100644
--- a/site/templates/category.php
+++ b/site/templates/category.php
@@ -1,36 +1,42 @@
-
-
+
-
-
-
-
-
- = $page->title() ?>
+
+ = $page->title() ?>
+
+
+ edito()->isNotEmpty()): ?>
+
+ = $page->edito() ?>
+
+
Lire
+
- collection('categories') as $category): ?>
- title()->value()): ?>
-
-
-
- = $article->title() ?>
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ texts()->toPages() as $article): ?>
+
+
+ = $article->title() ?>
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/templates/email.php b/site/templates/email.php
new file mode 100644
index 0000000..e14299f
--- /dev/null
+++ b/site/templates/email.php
@@ -0,0 +1,23 @@
+
+
+
+ true), slots: true) ?>
+
+ = $page->title() ?>
+
+ published()->isNotEmpty()): ?>
+
+ courrier du = $page->published()->toDate('d/m/Y') ?>
+
+
+
+
+
+
+
+ = $page->body() ?>
+
+
+
+
+
\ No newline at end of file
diff --git a/site/templates/emails/newsletter.html.php b/site/templates/emails/newsletter.html.php
new file mode 100644
index 0000000..efeaffc
--- /dev/null
+++ b/site/templates/emails/newsletter.html.php
@@ -0,0 +1,4 @@
+= $body ?>
+
+se désinscrire - voir la version web
+
\ No newline at end of file
diff --git a/site/templates/error.php b/site/templates/error.php
new file mode 100644
index 0000000..b930d26
--- /dev/null
+++ b/site/templates/error.php
@@ -0,0 +1,18 @@
+
+
+
+ true], slots: true) ?>
+
+
+ = $page->title() ?>
+
+
+
+ = $page->body() ?>
+
Retour à l'accueil
+
+
+
+
+
\ No newline at end of file
diff --git a/site/templates/grid.php b/site/templates/grid.php
index 1b48a89..2f0a22a 100644
--- a/site/templates/grid.php
+++ b/site/templates/grid.php
@@ -1,22 +1,38 @@
- true), slots: true) ?>
-
- = $page->title() ?>
-
- par
- = $page->author()->toPage()->title() ?>
- publié le = $page->published()->toDate('d/m/Y') ?>
- dans = $page->parent()->title() ?> / = $page->category() ?>
-
-
+ true], slots: true) ?>
+
+
+ = $page->title() ?>
+
+ par
+ = $page->author()->toPage()->title() ?>
+ publié le
+ = $page->published()->toDate('d/m/Y') ?>
+ dans = $page->parent()->title() ?>
+ / = $page->category() ?>
+
+
+
+
+ chapo()->isNotEmpty()): ?>
+
+ = $page->chapo() ?>
+
+
+
body()->toLayouts() as $layout): ?>
-
+
columns() as $column): ?>
-
+
= $column->blocks() ?>
@@ -24,6 +40,7 @@
+
diff --git a/site/templates/home.php b/site/templates/home.php
index f8bd4ef..8b0d181 100644
--- a/site/templates/home.php
+++ b/site/templates/home.php
@@ -6,14 +6,17 @@
= $site->subtitle()->inline() ?>
+
+
éditorial
+
textes
diff --git a/site/templates/info.php b/site/templates/info.php
index 8b8addc..cf7689c 100644
--- a/site/templates/info.php
+++ b/site/templates/info.php
@@ -1,19 +1,17 @@
-
- années
- categories
-
-
- = $page->body() ?>
-
+ true], slots: true) ?>
+
+
+ = $page->title() ?>
+
+ = $page->body() ?>
+
+
+
+
diff --git a/site/templates/linear.php b/site/templates/linear.php
index bd2cc73..beab9b3 100644
--- a/site/templates/linear.php
+++ b/site/templates/linear.php
@@ -1,19 +1,39 @@
- true), slots: true) ?>
-
- = $page->title() ?>
-
- par
- = $page->author()->toPage()->title() ?>
- publié le = $page->published()->toDate('d/m/Y') ?>
- dans = $page->parent()->title() ?> / = $page->category() ?>
-
-
+ true], slots: true) ?>
+
+ = $page->title() ?>
+ subtitle()->isNotEmpty()): ?>
+ = $page->subtitle()->inline() ?>
+
+
+
+ par
+ = $page->author()->toPage()->title() ?>
+ publié le
+ = $page->published()->toDate('d/m/Y') ?>
+ dans = $page->parent()->title() ?>
+ / = $page->category() ?>
+
+
+
+ chapo()->isNotEmpty()): ?>
+
+ = $page->chapo() ?>
+
+
+ isHtmlMode()->isTrue()): ?>
+ = $page->htmlBody()->kt() ?>
+
= $page->body() ?>
+
diff --git a/site/templates/newsletter.php b/site/templates/newsletter.php
new file mode 100644
index 0000000..7e1e5b8
--- /dev/null
+++ b/site/templates/newsletter.php
@@ -0,0 +1,19 @@
+
+
+
+ true), slots: true) ?>
+
+ = $page->title() ?>
+ = $page->body() ?>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/templates/year.php b/site/templates/year.php
index 4bf720f..b4f08eb 100644
--- a/site/templates/year.php
+++ b/site/templates/year.php
@@ -1,32 +1,53 @@
-
-
+
-
-
-
- = $page->title() ?>
- = $page->edito() ?>
- textes :
-
- children() as $article): ?>
-
-
- = $article->title() ?>
-
-
-
- par
- = $article->author()->toPage()->title() ?>
- publié le = $article->published()->toDate('d/m/Y') ?>
- dans = $article->parent()->title() ?> / = $article->category() ?>
-
+
+ année = $page->title() ?>
+
+ openDate()->isNotEmpty()): ?>
+
+ ouverte depuis le = $page->openDate()->toDate('d/m/Y') ?>
+
+
+
+
+ edito()->isNotEmpty()): ?>
+
+ = $page->edito() ?>
-
-
-
-
-
-
-
\ No newline at end of file
+
Lire
+
+
+ children() as $article): ?>
+
+
+ = $article->title() ?>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web-app-manifest-192x192.png b/web-app-manifest-192x192.png
new file mode 100644
index 0000000..9f3f92f
Binary files /dev/null and b/web-app-manifest-192x192.png differ
diff --git a/web-app-manifest-512x512.png b/web-app-manifest-512x512.png
new file mode 100644
index 0000000..7f8cd7f
Binary files /dev/null and b/web-app-manifest-512x512.png differ