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. + +![screenshot-code-editor](https://user-images.githubusercontent.com/14079751/109679014-7b043800-7b7b-11eb-8c4e-2ae25da8288d.png) + +
+ +## 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+""};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:/![sra](?=[:}]$)/,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 Banner](/.github/new-banner.png) + +

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 @@ + + + + + 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 @@ + + + + + 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() ?> + + + + +
+

title() ?>

+

+ + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ + +
+ +
+
+ +

+ Kirby SEO + + v + + + v + + 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 @@ + + + + + +

+ +
+ \ 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 @@ - -