diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 4987d4ce..3144bab4 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -1,19 +1,26 @@ import dotenv from 'dotenv'; /* @ts-expect-error */ import mdFootnote from 'markdown-it-footnote'; -import { defineConfig, type HeadConfig } from 'vitepress'; +import { defineConfigWithTheme, type DefaultTheme, type HeadConfig } from 'vitepress'; import { defaultGroupLink, sidebarLinks } from '../docs/links'; dotenv.config(); -const BASE = '/'; -const BASE_WITH_ORIGIN = `https://developer.stackblitz.com${BASE}`; +const BASE_PATH = '/'; +const BASE_WITH_ORIGIN = `https://developer.stackblitz.com${BASE_PATH}`; -export default defineConfig({ +interface ThemeConfig extends DefaultTheme.Config { + chatlio: { + id: string | undefined; + allowedRoutes: (RegExp | string)[]; + }; +} + +export default defineConfigWithTheme({ srcDir: './docs', - outDir: `./build${BASE}`, + outDir: `./build${BASE_PATH}`, assetsDir: 'assets', - base: BASE, + base: BASE_PATH, // Generate files as `/path/to/page.html` and URLs as `/path/to/page` cleanUrls: true, @@ -27,7 +34,7 @@ export default defineConfig({ description: 'Discover how to use StackBlitz, an online development environment for frontend, Node.js and the JavaScript ecosystem.', head: [ - ['link', { rel: 'icon', type: 'image/png', href: `${BASE}img/theme/favicon.png` }], + ['link', { rel: 'icon', type: 'image/png', href: `${BASE_PATH}img/theme/favicon.png` }], ...getAnalyticsTags(process.env), ], @@ -95,6 +102,10 @@ export default defineConfig({ '/platform/webcontainers/': sidebarLinks('main', ['webcontainers']), '/enterprise/': sidebarLinks('enterprise', ['enterprise']), }, + chatlio: { + allowedRoutes: [`^${BASE_PATH}teams/.*`, `^${BASE_PATH}enterprise/.*`], + id: process.env.VITE_CHATLIO_ID, + }, }, postRender(context) { @@ -106,26 +117,45 @@ export default defineConfig({ md.use(mdFootnote); }, }, + + vue: { + template: { + compilerOptions: { + isCustomElement: (tag) => { + return ['chatlio-widget'].includes(tag.toLowerCase()); + }, + }, + }, + }, }); -function getAnalyticsTags(env: NodeJS.ProcessEnv): HeadConfig[] { - if (!env.VITE_GTM_ID) { - return []; +function getAnalyticsTags({ VITE_GTM_ID = '' }: NodeJS.ProcessEnv): HeadConfig[] { + const idPattern = /^GTM-[A-Z\d]+$/; + const tags: HeadConfig[] = []; + + if (VITE_GTM_ID) { + if (!idPattern.test(VITE_GTM_ID)) { + throw new Error(`Invalid VITE_GTM_ID value: '${VITE_GTM_ID}'`); + } + const source = ` + (function(w, d, s, l, i){ + w[l] = w[l] || []; + w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'}); + let f = d.getElementsByTagName(s)[0]; + let j = d.createElement(s); + let dl = l != 'dataLayer' ? '&l=' + l : ''; + j.async = true; + j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; + f.before(j); + })(window, document, 'script', 'dataLayer', '${VITE_GTM_ID}'); + `; + tags.push(['script', {}, source]); } - return [ - [ - 'script', - { src: `https://www.googletagmanager.com/gtag/js?id=${env.VITE_GTM_ID}`, async: '' }, - ], - [ - 'script', - {}, - `function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag('js',new Date),gtag('config','${env.VITE_GTM_ID}',{anonymize_ip:true})`, - ], - ]; + + return tags; } -function getSearchConfig(env: NodeJS.ProcessEnv) { +function getSearchConfig(env: NodeJS.ProcessEnv): ThemeConfig['search'] { if (env.VITE_ALGOLIA_ID && env.VITE_ALGOLIA_KEY) { return { provider: 'algolia', diff --git a/.vitepress/theme/components/AuthButtons/AuthButtons.vue b/.vitepress/theme/components/AuthButtons/AuthButtons.vue new file mode 100644 index 00000000..1492b2c7 --- /dev/null +++ b/.vitepress/theme/components/AuthButtons/AuthButtons.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/.vitepress/theme/components/AuthButtons/NavBarAuthButtons.vue b/.vitepress/theme/components/AuthButtons/NavBarAuthButtons.vue new file mode 100644 index 00000000..0a95d1ac --- /dev/null +++ b/.vitepress/theme/components/AuthButtons/NavBarAuthButtons.vue @@ -0,0 +1,7 @@ + + + diff --git a/.vitepress/theme/components/AuthButtons/NavScreenAuthButtons.vue b/.vitepress/theme/components/AuthButtons/NavScreenAuthButtons.vue new file mode 100644 index 00000000..e372a8a4 --- /dev/null +++ b/.vitepress/theme/components/AuthButtons/NavScreenAuthButtons.vue @@ -0,0 +1,7 @@ + + + diff --git a/.vitepress/theme/components/AuthButtons/linkStyles.scss b/.vitepress/theme/components/AuthButtons/linkStyles.scss new file mode 100644 index 00000000..9089ee4c --- /dev/null +++ b/.vitepress/theme/components/AuthButtons/linkStyles.scss @@ -0,0 +1,47 @@ +.link { + --outline-color-hsl: 0, 0%, 100%; + --outline-opacity: 0.08; + --text-strong-color: #fff; + display: flex; + align-items: center; + height: 36px; + padding: 0 20px; + border-radius: 8px; + color: var(--text-strong-color); + font-size: 13px; + font-weight: 500; + text-decoration: none; + box-shadow: inset 0 0 0 1px hsla(var(--outline-color-hsl), var(--outline-opacity)); + background-color: hsla(224, 32%, 28%, 0.24); + backdrop-filter: blur(8px); + transition: 0.1s ease; + transition-property: background-color, box-shadow, color; +} + +.light { + &:hover { + --outline-opacity: 0.14; + color: var(--text-strong-color); + background-color: hsla(224, 32%, 28%, 0.54); + } + :root:not(.dark) & { + --outline-color-hsl: 224, 32%, 28%; + --outline-opacity: 0.1; + color: hsl(240, 6%, 23%); + background-color: hsla(224, 32%, 28%, 0.1); + &:hover { + --outline-opacity: 0.2; + background-color: transparent; + } + } +} + +.accent { + --outline-opacity: 0.14; + color: var(--text-strong-color); + background-color: hsl(214, 87%, 51%); + &:hover { + --outline-opacity: 0.24; + background-color: hsl(208, 100%, 53%); + } +} diff --git a/.vitepress/theme/components/Chatlio.vue b/.vitepress/theme/components/Chatlio.vue new file mode 100644 index 00000000..5a524ea0 --- /dev/null +++ b/.vitepress/theme/components/Chatlio.vue @@ -0,0 +1,38 @@ + + + diff --git a/.vitepress/theme/components/CustomLayout.vue b/.vitepress/theme/components/CustomLayout.vue index abbd79a3..37735f67 100644 --- a/.vitepress/theme/components/CustomLayout.vue +++ b/.vitepress/theme/components/CustomLayout.vue @@ -1,16 +1,27 @@ diff --git a/.vitepress/theme/components/Helpers/CardLink.vue b/.vitepress/theme/components/Helpers/CardLink.vue index d5d1d99e..6c0a9e0e 100644 --- a/.vitepress/theme/components/Helpers/CardLink.vue +++ b/.vitepress/theme/components/Helpers/CardLink.vue @@ -102,8 +102,7 @@ export default { min-width: 100px; height: 64px; &:not(.has-bg)::before { - -webkit-mask-size: 32px; - mask-size: 32px; + mask-size: 32px; } } @@ -120,14 +119,10 @@ export default { height: 100%; transition: background-color 0.14s ease; background-color: var(--vp-c-text-3); - -webkit-mask-image: var(--icon-img); - mask-image: var(--icon-img); - -webkit-mask-position: center; - mask-position: center; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - -webkit-mask-size: var(--icon-mask-size); - mask-size: var(--icon-mask-size); + mask-image: var(--icon-img); + mask-position: center; + mask-repeat: no-repeat; + mask-size: var(--icon-mask-size); .card-body:hover & { background-color: var(--vp-c-text-2); } @@ -149,8 +144,7 @@ export default { min-width: 84px; height: 48px; &::before { - -webkit-mask-size: 28px; - mask-size: 28px; + mask-size: 28px; } } &.is-podcast.small, @@ -159,7 +153,6 @@ export default { min-width: 64px; height: 48px; &::before { - -webkit-mask-size: 24px; mask-size: 24px; } } diff --git a/.vitepress/theme/components/HomeIntro.vue b/.vitepress/theme/components/HomeIntro.vue index f927d295..9fcd4a70 100644 --- a/.vitepress/theme/components/HomeIntro.vue +++ b/.vitepress/theme/components/HomeIntro.vue @@ -31,14 +31,11 @@ header { } } -$icon-mask: linear-gradient(to bottom, #fff9 10%, #fffa 30%, #fff0 74%); - header .icon { width: 160px; height: 160px; color: var(--sb-foreground-highlight); - -webkit-mask-image: $icon-mask; - mask-image: $icon-mask; + mask-image: linear-gradient(to bottom, #fff9 10%, #fffa 30%, #fff0 74%); @media (prefers-contrast: more) { display: none; diff --git a/.vitepress/theme/components/Icons/CloseIcon.vue b/.vitepress/theme/components/Icons/CloseIcon.vue new file mode 100644 index 00000000..cc248414 --- /dev/null +++ b/.vitepress/theme/components/Icons/CloseIcon.vue @@ -0,0 +1,8 @@ + diff --git a/.vitepress/theme/components/Icons/SvgIcon.vue b/.vitepress/theme/components/Icons/SvgIcon.vue index 68bf2182..4b05acc2 100644 --- a/.vitepress/theme/components/Icons/SvgIcon.vue +++ b/.vitepress/theme/components/Icons/SvgIcon.vue @@ -10,10 +10,14 @@ const props = defineProps<{ const styleObj = computed(() => { const style: Record = {}; - const url = iconsUrls[props.icon]; + if (url) { - style['--icon'] = `url('${url}')`; + // Vite may transform SVG assets to data URLs, using single quotes for XML + // attribute values for some reason. This means we can't always quote URLs + // with single quotes, or the CSS value might be invalid. + const quote = url.includes(`"`) ? `'` : `"`; + style['--icon'] = `url(${quote}${url}${quote})`; } else { style['visibility'] = 'hidden'; style['--error'] = `'${props.icon} not found'`; @@ -39,10 +43,12 @@ const styleObj = computed(() => { flex: none; width: var(--size, 1em); height: var(--size, 1em); - color: inherit; - // Use SVG icon as mask for background - -webkit-mask: var(--icon) center/contain no-repeat; - mask: var(--icon) center/contain no-repeat; + // Use inherited text color to paint a square background-color: currentColor; + // Then use the SVG icon as mask + mask-image: var(--icon); + mask-position: center; + mask-repeat: no-repeat; + mask-size: contain; } diff --git a/.vitepress/theme/components/Icons/WarningIcon.vue b/.vitepress/theme/components/Icons/WarningIcon.vue new file mode 100644 index 00000000..9064bc1b --- /dev/null +++ b/.vitepress/theme/components/Icons/WarningIcon.vue @@ -0,0 +1,5 @@ + diff --git a/.vitepress/theme/components/MaintenanceBanner.vue b/.vitepress/theme/components/MaintenanceBanner.vue new file mode 100644 index 00000000..4b6c526b --- /dev/null +++ b/.vitepress/theme/components/MaintenanceBanner.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/.vitepress/theme/icons/index.ts b/.vitepress/theme/icons/index.ts index 4c198422..d9609748 100644 --- a/.vitepress/theme/icons/index.ts +++ b/.vitepress/theme/icons/index.ts @@ -1,6 +1,7 @@ // Tell Vite to load all SVG icons in the icons folder as part of the build. const importedIconsUrls = import.meta.glob('./*.svg', { - as: 'url', + query: '?url', + import: 'default', eager: true, }); @@ -9,6 +10,6 @@ const iconNamePattern = /([0-9a-zA-Z-]+)\.svg$/; export const iconsUrls: Record = Object.fromEntries( Object.entries(importedIconsUrls).map(([path, url]) => { const nameMatches = path.match(iconNamePattern); - return [nameMatches ? nameMatches[1] : path, url]; - }) + return [nameMatches ? nameMatches[1] : path, url as string]; + }), ); diff --git a/.vitepress/theme/styles/content-aside.scss b/.vitepress/theme/styles/content-aside.scss new file mode 100644 index 00000000..00f049ec --- /dev/null +++ b/.vitepress/theme/styles/content-aside.scss @@ -0,0 +1,47 @@ +// -------------------------------- +// -- Aside / Table of Contents + +// Widen aside +.VPDoc .aside { + max-width: 300px !important; + position: relative; + padding-left: 0; + @media (min-width: 1380px) { + max-width: 248px; + } + @media (min-width: 1500px) { + max-width: 300px; + } + @media (min-width: 1600px) { + max-width: 328px; + } +} +.aside-container { + width: 300px !important; + max-width: 300px; +} +.aside-content { + padding-top: 56px; +} + +// Add gap between title and list, but account for hardcoded `outline-marker` `top` +.VPDocAside .outline-title { + margin-block-end: -1px; + transform: translateY(-6px); +} + +// Space out links without affecting `outline-marker` too much +.VPDocAside .outline-link { + padding: 6px 0; + font-size: 12.5px; + transition-duration: 0.1s; +} + +// Don't clip text in the outline +.VPDocAsideOutline .outline-link { + white-space: normal; + text-overflow: initial; + padding: 5px 0; + font-size: 13px; + line-height: 18px; +} diff --git a/.vitepress/theme/styles/content.scss b/.vitepress/theme/styles/content.scss index be466a45..c9c8b5d5 100644 --- a/.vitepress/theme/styles/content.scss +++ b/.vitepress/theme/styles/content.scss @@ -1,11 +1,81 @@ +.vp-doc a { + transition: 0.1s ease; +} + +.vp-doc p > strong > a, +.vp-doc p > a, +.vp-doc li > strong > a, +.vp-doc li > a, +.vp-doc td > strong > a, +.vp-doc td > a { + text-decoration: underline; + text-underline-offset: 2px; + text-decoration-thickness: 1px; + transition: 0.1s ease; + transition-property: color, text-underline-offset; + :root.dark & { + color: rgb(131, 222, 255); + } + &:hover, + :root.dark &:hover { + color: var(--vp-c-text-1); + text-decoration-thickness: 1px; + text-underline-offset: 4px; + } +} + +.vp-doc h1, +.vp-doc h2, +.vp-doc h3, +.vp-doc h4, +.vp-doc h5, +.vp-doc h6 { + width: max-content; + max-width: 100%; +} + +.vp-doc .header-anchor { + @media (min-width: 960px) { + position: absolute; + left: -28px; + padding: 0 18px; + transform: scale(0.94); + } +} + +.vp-doc h1 + p, +.vp-doc h2 + p { + margin-top: 0; +} + .vp-doc h1 { margin-bottom: 24px; } .vp-doc h2 { margin: 44px 0 24px; + padding-top: 16px !important; border-top: 1px solid var(--vp-c-divider-light); - padding-top: 32px; +} + +.vp-doc h2 .header-anchor { + top: 16px; +} + +.vp-doc h3 { + margin-top: 40px !important; +} + +.vp-doc pre code { + font-size: 13px !important; +} + +.vp-doc :not(pre) > code { + color: var(--vp-text-code); +} + +.vp-doc div[class*='language-'] { + margin: 32px 0 40px; } // Wrap code examples @@ -16,6 +86,15 @@ word-break: break-word; } +.vp-doc p, +.vp-doc li { + font-size: 15px; + line-height: 1.8; +} +.vp-doc p { + margin: 24px 0; +} + .vp-doc td, .vp-doc th { font-size: 14px; @@ -29,10 +108,22 @@ cursor: default; } +.vp-doc p a { + display: inline-block; + text-underline-offset: 2px; + text-decoration-thickness: 1px; +} + .vp-doc img { margin: 8px 0; } +.vp-doc p > img, +.vp-doc > div > img { + margin: 40px 0; + border-radius: 6px; +} + .vp-doc figure { margin-top: 1.5rem; margin-bottom: 1.5rem; @@ -75,6 +166,11 @@ } } +.vp-code-group .tabs label { + font-size: 13px !important; + font-weight: 600; +} + .vp-doc .footnotes-sep { margin: 44px 0 32px; border-top: 1px solid var(--vp-c-divider-light); @@ -91,3 +187,93 @@ .content-container .VPDocFooter { margin-top: 30px; } + +.mx-auto { + margin-left: auto !important; + margin-right: auto !important; +} + +// -------------------------------- +// Community Projects + +.community-project-screenshot { + width: 100%; + max-width: 760px; + border-radius: 12px; + overflow: hidden; + img { + max-width: min(100%, 800px); + margin: 0 !important; + } + @media screen and (max-height: 768px) { + max-width: 680px; + max-height: 352px; + } + @media screen and (max-width: 960px) { + max-width: 680px; + max-height: 352px; + } +} + +// -------------------------------- +// Twitter Tweet Embed + +.twitter-tweet { + position: relative; + display: block; + max-width: 640px; + padding: 64px 32px 16px !important; + margin: 52px 0 !important; + color: var(--vp-c-text-2); + font-size: 14px; + font-weight: 500; + @media screen and (max-width: 960px) { + padding: 64px 24px 16px !important; + padding-right: 0 !important; + } + + & > p { + margin-bottom: 16px !important; + color: var(--vp-c-text-1) !important; + font-size: 16px; + @media screen and (max-width: 500px) { + font-size: 14px !important; + } + } + + &::before { + --twitter-icon-mask-size: 26px; + --block-icon-url: url('@theme/icons/fa-twitter.svg'); + content: ''; + position: absolute; + top: 16px; + left: 32px; + width: var(--twitter-icon-mask-size); + height: var(--twitter-icon-mask-size); + transition: background-color 0.14s ease; + background-color: #1da1f2; + mask-image: var(--twitter-icon-img); + mask-position: center; + mask-repeat: no-repeat; + mask-size: cover; + } +} + +// -------------------------------- +// Footer / Above Footer + +.VPLink.link.edit-link-button { + gap: 4px; + font-size: 13px; + svg { + transform: scale(0.92); + } +} + +.content-container footer.VPDocFooter .edit-info { + margin-top: 20px; +} + +.edit-info { + padding-bottom: 24px !important; +} diff --git a/.vitepress/theme/styles/custom-block.scss b/.vitepress/theme/styles/custom-block.scss new file mode 100644 index 00000000..10d4ddfa --- /dev/null +++ b/.vitepress/theme/styles/custom-block.scss @@ -0,0 +1,142 @@ +// -------------------------------- +// Custom Blocks + +.vp-doc .custom-block { + margin: 44px 0; + padding: 32px 32px; + padding-left: 76px; + border: none; + border-radius: 8px; + box-shadow: + inset 0 0 0 1px var(--block-border-color), + inset 40px 92px 64px -40px rgba(255, 255, 255, 0.6); + + @media (max-width: 500px) { + padding-left: 18px; + padding-right: 18px; + } + + &:not(:root.dark &) { + --vp-custom-block-tip-bg: rgb(246, 252, 250); + --vp-custom-block-tip-border: rgba(0, 136, 120, 0.5); + --vp-custom-block-tip-text: rgb(0, 125, 111); + --vp-custom-block-warning-text: rgb(202, 135, 0); + --vp-custom-block-warning-border: rgb(255, 200, 0); + --vp-custom-block-warning-bg: rgba(255, 200, 0, 0.032); + } + :root.dark & { + --vp-custom-block-tip-bg: var(--vp-c-green-dim-1); + --vp-custom-block-tip-text: hsl(165 100% 60%); + --vp-custom-block-tip-border: hsl(172, 100%, 19%); + --vp-custom-block-warning-text: rgb(255, 183, 0); + box-shadow: + inset 0 0 0 1px var(--block-border-color), + inset 40px 92px 84px -40px rgba(0, 0, 0, 0.6); + background-color: var(--vp-c-bg-alt); + } + + &.info { + --block-border-color: var(--vp-custom-block-info-border); + --block-icon-color: var(--vp-custom-block-info-text); + --block-icon-url: url('@theme/icons/fa-books-light.svg'); + } + &.tip { + --block-border-color: var(--vp-custom-block-tip-border); + --block-icon-color: var(--vp-custom-block-tip-text); + --block-icon-url: url('@theme/icons/fa-sparkles-regular.svg'); + } + &.warning { + --block-border-color: var(--vp-custom-block-warning-border); + --block-icon-color: var(--vp-custom-block-warning-text); + --block-icon-url: url('@theme/icons/fa-triangle-exclamation-regular.svg'); + } + &.danger { + --block-border-color: var(--vp-custom-block-danger-border); + --block-icon-color: var(--vp-custom-block-danger-text); + --block-icon-url: url('@theme/icons/fa-triangle-exclamation-regular.svg'); + } + &.details { + --block-border-color: var(--vp-custom-block-details-border); + --block-icon-color: var(--vp-custom-block-details-text); + --block-icon-url: url('@theme/icons/fa-gear.svg'); + } +} + +.vp-doc h2 + .custom-block { + margin-top: 32px; +} + +.vp-doc .custom-block p { + margin: 2px 0 0; + font-size: 14px; + line-height: 1.8; + + &.custom-block-title { + position: relative; + margin-bottom: 8px; + @media (max-width: 500px) { + margin-left: 42px; + margin-bottom: 14px; + } + &::before { + content: ''; + position: absolute; + top: 0; + left: -44px; + width: 24px; + height: 24px; + background-color: var(--block-icon-color); + mask-image: var(--block-icon-url); + mask-position: center; + mask-repeat: no-repeat; + mask-size: contain; + @media (max-width: 500px) { + left: -40px; + } + } + } +} + +.vp-doc .custom-block p:not(.custom-block-title), +.vp-doc .custom-block ol, +.vp-doc .custom-block ul { + color: var(--vp-c-text-1); +} +.vp-doc .custom-block ol, +.vp-doc .custom-block ul { + margin: 12px 0; +} + +.vp-doc .custom-block a { + transition-duration: 0.1s; +} + +.vp-doc .custom-block code { + color: var(--vp-c-text-1); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); + :root.dark & { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.16); + } +} + +.vp-doc .custom-block ul { + margin-bottom: 0; +} + +.vp-doc .custom-block summary { + position: relative; + margin: 0; + &::marker { + content: '▷\a0\a0\a0'; + } +} +.vp-doc .custom-block[open] summary::marker { + content: '▽\a0\a0\a0'; +} + +.vp-doc .custom-block div[class*='language-'] { + margin: 24px 0; + &:last-child { + margin-bottom: 0; + } +} diff --git a/.vitepress/theme/styles/fixes.scss b/.vitepress/theme/styles/fixes.scss deleted file mode 100644 index 28bef803..00000000 --- a/.vitepress/theme/styles/fixes.scss +++ /dev/null @@ -1,651 +0,0 @@ -// ViteConfBanner related -// Only show it in big screen for now -.Layout.with-banner { - @media (min-width: 960px) { - .VPNav { - --vp-layout-top-height: 48px; - } - .VPContent .VPDoc { - padding: 90px 32px 0; - } - .VPSidebar { - --vp-nav-height: 90px; - } - } -} - -// Remove nav border -.VPNavBar { - border-bottom: none !important; -} - -// No content-body transition (background-color fix) -.VPNavBar .content-body { - transition: none !important; -} - -// Fix enormous line-height of navbar items -.VPNavBarMenu .VPNavBarMenuLink { - min-height: var(--vp-nav-height-mobile); - line-height: 1.32; - @media (min-width: 960px) { - min-height: var(--vp-nav-height-desktop); - } -} - -// Don't clip text in the outline -.VPDocAsideOutline .outline-link { - white-space: normal; - text-overflow: initial; - padding: 5px 0; - font-size: 13px; - line-height: 18px; -} - -// We would like to have single pages in the sidebar (e.g. API Reference, Enterprise). -// VitPress expects to have you section title text + items and when you only have one item it looks like there are extra spacing. -// These styles are to adjust spacing between groups. -#VPSidebarNav .group { - padding-top: 0; -} - -.VPSidebarItem.collapsible { - padding-top: 8px; -} - -.VPSidebarGroup.collapsible.collapsed .items { - margin-bottom: -14px; -} - -.VPSidebarItem .items { - margin-top: 8px; -} - -// Move search away from logo -.VPNavBarSearch.search { - justify-content: flex-end; - margin-right: 32px; -} - -// Post 1.0.0-rc.20 - -.VPSidebarItem { - margin: 0 -14px; -} - -.VPSidebarItem.link { - transition-duration: 0.1s; - transition-property: opacity, box-shadow; -} - -.VPSidebarItem.level-0 { - padding-bottom: 8px !important; -} - -.VPSidebarItem.is-active { - position: relative; - box-shadow: inset 0 0 0 1px rgba(0,0,0,0.08); - border-radius: 8px; - background-color: #fff; - - .text { - color: var(--vp-c-text-1) !important; - } - - :root.dark & { - box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08); - background-color: var(--vp-c-bg); - } -} - -.VPSidebarItem.level-0 { - font-size: 13px; - margin: 0 4px; - &:hover:not(.is-active) { - opacity: 1; - color: var(--vp-c-text-1); - } -} - -// -------------------------------- -// Customize Navs -// -------------------------------- -// -- Content - -// Reduce .VPContent's dependency on calculated sizes -.VPContent.has-sidebar { - @media (min-width: 960px) { - padding-left: calc(var(--vp-sidebar-width) + 16px) !important; - } - @media (min-width: 1440px) { - padding-right: 0 !important; - } -} - -// Fill in space to accommodate Sidebar's width changes -.VPDoc.has-sidebar.has-aside { - @media (min-width: 960px) and (max-width: 1500px) { - padding-left: 0; - } -} - -// Increase body content width if space available. -.VPDoc.has-aside .content-container { - max-width: 820px !important; -} - -.VPDoc.has-sidebar.has-aside .container > .content { - @media (min-width: 1500px) { - padding-left: 52px; - padding-right: 52px; - } -} - -// New body styles -.vp-doc p, -.vp-doc li { - font-size: 15px; - line-height: 1.8; -} -.vp-doc p { - margin: 24px 0; -} - -.vp-doc a { - transition: 0.1s ease; -} - -.vp-doc p a { - display: inline-block; - text-underline-offset: 2px; - text-decoration-thickness: 1px; -} - -.vp-doc p > img, -.vp-doc > div > img { - margin: 40px 0; - border-radius: 6px; -} - -.vp-doc pre code { - font-size: 12.5px !important; -} - -.vp-doc :not(pre) > code { - color: var(--vp-text-code); -} - -.vp-code-group .tabs label { - font-size: 13px !important; - font-weight: 600; -} - -.vp-doc div[class*='language-'] { - margin: 32px 0 40px; -} - -.vp-doc .header-anchor { - @media (min-width: 960px) { - position: absolute; - left: -28px; - padding: 0 18px; - transform: scale(0.94); - } -} - -.vp-doc h1, -.vp-doc h2, -.vp-doc h3, -.vp-doc h4, -.vp-doc h5, -.vp-doc h6 { - width: max-content; - max-width: 100%; -} -.vp-doc h1 + p, -.vp-doc h2 + p { - margin-top: 0; -} -.vp-doc h2 { - padding-top: 16px !important; -} -.vp-doc h3 { - margin-top: 40px !important; -} - -.vp-doc p > strong > a, -.vp-doc p > a, -.vp-doc li > strong > a, -.vp-doc li > a, -.vp-doc td > strong > a, -.vp-doc td > a { - text-decoration: underline; - text-underline-offset: 2px; - text-decoration-thickness: 1px; - transition: 0.1s ease; - transition-property: color, text-underline-offset; - :root.dark & { - color: rgb(131, 222, 255); - } - &:hover, - :root.dark &:hover { - color: var(--vp-c-text-1); - text-decoration-thickness: 1px; - text-underline-offset: 4px; - } -} - -// -------------------------------- -// -- Top - -// Remove extraneous fade elements -.VPNavBar .curtain { - display: none; -} - -// Correct width on non-docs pages -.VPNavBar .container { - max-width: unset; -} - -// // Semi-transparent background above content -// .VPNavBar .content-body { -// background-color: rgba(255,255,255,0.8) !important; -// backdrop-filter: blur(6px); -// :root.dark & { -// background-color: rgba(7,8,11,0.8) !important; -// } -// } - -// Size according to Sidebar width to limit zone affected by nav overlay -.VPNavBar.has-sidebar .content { - --vp-sidebar-width: 320px; - padding-left: var(--vp-sidebar-width) !important; - padding-right: 32px !important; - @media (max-width: 960px) { - --vp-sidebar-width: 32px; - padding-right: 0 !important; - } -} - -// Position title/logo to hug left -.VPNavBar.has-sidebar .title { - padding-left: 16px !important; - border-bottom: none; - @media (max-width: 960px) { - padding-left: 0 !important; - } -} - -// Restyle top NavBarMenu links -.VPNavBarMenu.menu { - height: calc(100% - 16px); -} - -.VPNavBarMenu.menu a { - font-size: 13px; - margin: 0 4px; - opacity: 0.8; - transition-duration: 0.1s; - transition-property: color, opacity, box-shadow; - opacity: 0.7; - &:hover:not(.active) { - opacity: 1; - color: var(--vp-c-text-1); - } -} - -.VPNavBarMenuLink.active { - color: var(--vp-c-text-1) !important; - box-shadow: inset 0 -1px 0 0 var(--vp-c-brand); - opacity: 1 !important; -} - -// -------------------------------- -// -- Sidebar - -// Use empty space in docs navs more effectively. -// Using existing default fallback styles where possible to negate calc()-type sizes. -.VPSidebar { - --active-indicator-padding: 16px; - --vp-sidebar-width: 308px; - --vp-new-padding: calc(32px - var(--active-indicator-padding)); - padding-left: var(--vp-new-padding) !important; - padding-right: var(--vp-new-padding) !important; - padding-bottom: 32px !important; - width: var(--vp-sidebar-width) !important; - @media (max-width: 1500px) { - --vp-sidebar-width: 272px; - } - @media (max-width: 960px) { - --vp-sidebar-width: 308px; - } -} -// Allow .VPLink to take up all horizontal space available -#VPSidebarNav .group { - @media (min-width: 960px) { - width: unset; - } -} -#VPSidebarNav.nav { - margin-top: 24px; -} - // Hide extraneous visual elements when parent group is collapsed -// without messing with individual elements themselves. -.VPSidebarGroup.collapsed .items { - opacity: 0; -} -// Align item group container's collapsed border with child item list's -// first item's top border/box-shadow. -.VPSidebarGroup.collapsible:not(.collapsed) .items { - margin-top: 9px; -} -// Align group title with item links -.VPSidebarGroup .title { - padding-left: var(--active-indicator-padding); -} -// Ignore top nav and mobile nav -.VPLink:not(.VPNavBarMenuLink):not(.VPNavScreenMenuLink) { - line-height: 1.1; - // New link styles - &.link { - margin: 0; - padding: 9px var(--active-indicator-padding) !important; - transition-duration: 0.1s; - transition-property: background-color, box-shadow, color; - } -} - -// Post 1.0.0-rc.20 - -.VPLink .text { - padding: 0; - font-size: 13px !important; - line-height: 1.32 !important; - transition-duration: 0.1s; - transition-property: color, opacity; -} - -.VPLink:hover .text { - color: var(--vp-c-text-1) !important; -} - -// -------------------------------- -// -- Aside / Table of Contents - -// Widen aside -.VPDoc .aside { - max-width: 300px !important; - position: relative; - padding-left: 0; - @media (min-width: 1380px) { - max-width: 248px; - } - @media (min-width: 1500px) { - max-width: 300px; - } - @media (min-width: 1600px) { - max-width: 328px; - } -} -.aside-container { - width: 300px !important; - max-width: 300px; -} -.aside-content { - padding-top: 56px; -} - -// Add gap between title and list, but account for hardcoded `outline-marker` `top` -.VPDocAside .outline-title { - margin-block-end: -1px; - transform: translateY(-6px); -} - -// Space out links without affecting `outline-marker` too much -.VPDocAside .outline-link { - padding: 6px 0; - font-size: 12.5px; - transition-duration: 0.1s; -} - - -// -------------------------------- -// Custom Blocks - -.vp-doc .custom-block { - margin: 44px 0; - padding: 32px 32px; - padding-left: 76px; - border: none; - border-radius: 8px; - box-shadow: - inset 0 0 0 1px var(--block-border-color), - inset 40px 92px 64px -40px rgba(255,255,255,0.6); - - @media (max-width: 500px) { - padding-left: 18px; - padding-right: 18px; - } - - &:not(:root.dark &) { - --vp-custom-block-tip-bg: rgb(246, 252, 250); - --vp-custom-block-tip-border: rgba(0, 136, 120, 0.5); - --vp-custom-block-tip-text: rgb(0, 125, 111); - --vp-custom-block-warning-text: rgb(202, 135, 0); - --vp-custom-block-warning-border: rgb(255, 200, 0); - --vp-custom-block-warning-bg: rgba(255, 200, 0, 0.032); - } - :root.dark & { - --vp-custom-block-tip-bg: var(--vp-c-green-dim-1); - --vp-custom-block-tip-text: hsl(165 100% 60%); - --vp-custom-block-tip-border: hsl(172, 100%, 19%); - --vp-custom-block-warning-text: rgb(255, 183, 0); - box-shadow: - inset 0 0 0 1px var(--block-border-color), - inset 40px 92px 84px -40px rgba(0,0,0,0.6); - background-color: var(--vp-c-bg-alt); - } - - &.info { - --block-border-color: var(--vp-custom-block-info-border); - --block-icon-color: var(--vp-custom-block-info-text); - --block-icon-url: url('@theme/icons/fa-books-light.svg'); - } - &.tip { - --block-border-color: var(--vp-custom-block-tip-border); - --block-icon-color: var(--vp-custom-block-tip-text); - --block-icon-url: url('@theme/icons/fa-sparkles-regular.svg'); - } - &.warning { - --block-border-color: var(--vp-custom-block-warning-border); - --block-icon-color: var(--vp-custom-block-warning-text); - --block-icon-url: url('@theme/icons/fa-triangle-exclamation-regular.svg'); - } - &.danger { - --block-border-color: var(--vp-custom-block-danger-border); - --block-icon-color: var(--vp-custom-block-danger-text); - --block-icon-url: url('@theme/icons/fa-triangle-exclamation-regular.svg'); - } - &.details { - --block-border-color: var(--vp-custom-block-details-border); - --block-icon-color: var(--vp-custom-block-details-text); - --block-icon-url: url('@theme/icons/fa-gear.svg'); - } -} - -h2 + .custom-block { - margin-top: 32px !important; -} - -.vp-doc h2 { - padding-top: 0; -} - -.vp-doc .custom-block p { - margin: 2px 0 0; - font-size: 14px; - line-height: 1.8; - - &.custom-block-title { - position: relative; - margin-bottom: 8px; - @media (max-width: 500px) { - margin-left: 42px; - margin-bottom: 14px; - } - &::before { - content: ''; - position: absolute; - top: 0; - left: -44px; - width: 24px; - height: 24px; - background-color: var(--block-icon-color); - -webkit-mask-image: var(--block-icon-url); - mask-image: var(--block-icon-url); - -webkit-mask-position: center; - mask-position: center; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - -webkit-mask-size: contain; - mask-size: contain; - @media (max-width: 500px) { - left: -40px; - } - } - } -} - -.vp-doc .custom-block p:not(.custom-block-title), -.vp-doc .custom-block ol, -.vp-doc .custom-block ul { - color: var(--vp-c-text-1); -} -.vp-doc .custom-block ol, -.vp-doc .custom-block ul { - margin: 12px 0; -} - -.vp-doc .custom-block a { - transition-duration: 0.1s; -} - -.vp-doc .custom-block code { - color: var(--vp-c-text-1); - box-shadow: 0 0 0 1px rgba(0,0,0,0.1); - :root.dark & { - box-shadow: 0 0 0 1px rgba(255,255,255,0.16); - } -} - -.vp-doc .custom-block ul { - margin-bottom: 0; -} - -.vp-doc .custom-block summary { - position: relative; - margin: 0; - &::marker { - content: '▷\a0\a0\a0'; - } -} -.vp-doc .custom-block[open] summary::marker { - content: '▽\a0\a0\a0'; -} - -.vp-doc .custom-block div[class*='language-'] { - margin: 24px 0; - &:last-child { - margin-bottom: 0; - } -} - -// -------------------------------- -// Footer / Above Footer - -.VPLink.link.edit-link-button { - gap: 4px; - font-size: 13px; - svg { - transform: scale(0.92); - } -} - -.content-container footer.VPDocFooter .edit-info { - margin-top: 20px; -} - -.edit-info { - padding-bottom: 24px !important; -} - -// -------------------------------- -// Community Projects - -.community-project-screenshot { - width: 100%; - max-width: 760px; - border-radius: 12px; - overflow: hidden; - img { - max-width: min(100%, 800px); - margin: 0 !important; - } - @media screen and (max-height: 768px) { - max-width: 680px; - max-height: 352px; - } - @media screen and (max-width: 960px) { - max-width: 680px; - max-height: 352px; - } -} - -// -------------------------------- -// Twitter Tweet Embed - -.twitter-tweet { - position: relative; - display: block; - max-width: 640px; - padding: 64px 32px 16px !important; - margin: 52px 0 !important; - color: var(--vp-c-text-2); - font-size: 14px; - font-weight: 500; - @media screen and (max-width: 960px) { - padding: 64px 24px 16px !important; - padding-right: 0 !important; - } - - & > p { - margin-bottom: 16px !important; - color: var(--vp-c-text-1) !important; - font-size: 16px; - @media screen and (max-width: 500px) { - font-size: 14px !important; - } - } - - &::before { - --twitter-icon-mask-size: 26px; - --block-icon-url: url('@theme/icons/fa-twitter.svg'); - content: ''; - position: absolute; - top: 16px; - left: 32px; - width: var(--twitter-icon-mask-size); - height: var(--twitter-icon-mask-size); - transition: background-color 0.14s ease; - background-color: #1DA1F2; - -webkit-mask-image: var(--twitter-icon-img); - mask-image: var(--twitter-icon-img); - -webkit-mask-position: center; - mask-position: center; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - -webkit-mask-size: cover; - mask-size: cover; - } -} diff --git a/.vitepress/theme/styles/index.scss b/.vitepress/theme/styles/index.scss index 1909afba..78c9feeb 100644 --- a/.vitepress/theme/styles/index.scss +++ b/.vitepress/theme/styles/index.scss @@ -1,4 +1,8 @@ @import './fonts.scss'; @import './colors.scss'; -@import './fixes.scss'; +@import './layout.scss'; +@import './navbar.scss'; +@import './sidebar.scss'; @import './content.scss'; +@import './content-aside.scss'; +@import './custom-block.scss'; diff --git a/.vitepress/theme/styles/layout.scss b/.vitepress/theme/styles/layout.scss new file mode 100644 index 00000000..869a6e39 --- /dev/null +++ b/.vitepress/theme/styles/layout.scss @@ -0,0 +1,52 @@ +// MaintenanceBanner related +// Only show it in big screen for now +.Layout.with-banner { + --sbdocs-top-banner-height: 48px; + .VPNav { + --vp-layout-top-height: var(--sbdocs-top-banner-height); + } + .VPContent .VPDoc { + padding: 90px 32px 0; + } + .VPSidebar { + --vp-nav-height: 90px; + } + + @media (max-width: 600px) { + --sbdocs-top-banner-height: 60px; + } +} + +// -------------------------------- +// Customize Navs +// -------------------------------- +// -- Content + +// Reduce .VPContent's dependency on calculated sizes +.VPContent.has-sidebar { + @media (min-width: 960px) { + padding-left: calc(var(--vp-sidebar-width) + 16px) !important; + } + @media (min-width: 1440px) { + padding-right: 0 !important; + } +} + +// Fill in space to accommodate Sidebar's width changes +.VPDoc.has-sidebar.has-aside { + @media (min-width: 960px) and (max-width: 1500px) { + padding-left: 0; + } +} + +// Increase body content width if space available. +.VPDoc.has-aside .content-container { + max-width: 820px !important; +} + +.VPDoc.has-sidebar.has-aside .container > .content { + @media (min-width: 1500px) { + padding-left: 52px; + padding-right: 52px; + } +} diff --git a/.vitepress/theme/styles/navbar.scss b/.vitepress/theme/styles/navbar.scss new file mode 100644 index 00000000..b47f504c --- /dev/null +++ b/.vitepress/theme/styles/navbar.scss @@ -0,0 +1,94 @@ +// -------------------------------- +// -- Top + +// Remove nav border +.VPNavBar > .divider { + display: none !important; +} + +// Remove extraneous fade elements +.VPNavBar .curtain { + display: none; +} + +// Correct width on non-docs pages +.VPNavBar .container { + max-width: unset; +} + +// No content-body transition (background-color fix) +.VPNavBar .content-body { + transition: none !important; +} + +// // Semi-transparent background above content +// .VPNavBar .content-body { +// background-color: rgba(255,255,255,0.8) !important; +// backdrop-filter: blur(6px); +// :root.dark & { +// background-color: rgba(7,8,11,0.8) !important; +// } +// } + +// Size according to Sidebar width to limit zone affected by nav overlay +.VPNavBar.has-sidebar .content { + --vp-sidebar-width: 320px; + padding-left: var(--vp-sidebar-width) !important; + padding-right: 32px !important; + @media (max-width: 960px) { + --vp-sidebar-width: 32px; + padding-right: 0 !important; + } +} + +// Position title/logo to hug left +.VPNavBar.has-sidebar .title { + padding-left: 16px !important; + border-bottom: none; + @media (max-width: 960px) { + padding-left: 0 !important; + } +} + +// Move search away from logo +.VPNavBarSearch.search { + justify-content: flex-end; + margin-right: 32px; + + @media screen and (max-width: 500px) { + margin-right: 10px; + } +} + +// Restyle top NavBarMenu links +.VPNavBarMenu.menu { + height: calc(100% - 16px); +} + +.VPNavBarMenu.menu a { + font-size: 13px; + margin: 0 4px; + opacity: 0.8; + transition-duration: 0.1s; + transition-property: color, opacity, box-shadow; + opacity: 0.7; + &:hover:not(.active) { + opacity: 1; + color: var(--vp-c-text-1); + } +} + +// Fix enormous line-height of navbar items +.VPNavBarMenu .VPNavBarMenuLink { + min-height: var(--vp-nav-height-mobile); + line-height: 1.32; + @media (min-width: 960px) { + min-height: var(--vp-nav-height-desktop); + } +} + +.VPNavBarMenuLink.active { + color: var(--vp-c-text-1) !important; + box-shadow: inset 0 -1px 0 0 var(--vp-c-brand); + opacity: 1 !important; +} diff --git a/.vitepress/theme/styles/sidebar.scss b/.vitepress/theme/styles/sidebar.scss new file mode 100644 index 00000000..f73a01e2 --- /dev/null +++ b/.vitepress/theme/styles/sidebar.scss @@ -0,0 +1,105 @@ +// -------------------------------- +// -- Sidebar + +// Use empty space in docs navs more effectively. +// Using existing default fallback styles where possible to negate calc()-type sizes. +.VPSidebar { + --active-indicator-padding: 16px; + --vp-sidebar-width: 308px; + --vp-new-padding: calc(32px - var(--active-indicator-padding)); + padding-left: var(--vp-new-padding) !important; + padding-right: var(--vp-new-padding) !important; + padding-bottom: 32px !important; + width: var(--vp-sidebar-width) !important; + @media (max-width: 1500px) { + --vp-sidebar-width: 272px; + } + @media (max-width: 960px) { + --vp-sidebar-width: 308px; + } +} + +.VPSidebar > .nav { + margin-top: 24px; +} + +.VPSidebar > .nav > .group { + width: unset; + margin-inline: 8px; +} + +.VPSidebarItem.link { + transition-duration: 0.1s; + transition-property: opacity, box-shadow; +} + +.VPSidebarItem.level-0 { + font-size: 13px; + &:hover:not(.is-active) { + opacity: 1; + color: var(--vp-c-text-1); + } +} + +.VPSidebarItem.level-0 > .items { + margin-top: 10px; +} + +.VPSidebarItem .VPLink { + line-height: 1.1; + margin: 0; + padding: 9px 12px; + transition-duration: 0.1s; + transition-property: background-color, box-shadow, color; + + & .text { + padding: 0; + font-size: 13px !important; + line-height: 1.32 !important; + transition-duration: 0.1s; + transition-property: color, opacity; + } + + &:hover .text { + color: var(--vp-c-text-1) !important; + } +} + +.VPSidebarItem.is-active > .item > .link > .text { + color: var(--vp-c-text-1) !important; +} + +.VPSidebarItem.level-1 { + margin-inline: -12px; + &:has(.items) { + padding-bottom: 8px; + } +} + +.VPSidebarItem.level-1.has-active { + position: relative; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08); + border-radius: 8px; + background-color: #fff; + + :root.dark & { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08); + background-color: var(--vp-c-bg); + } +} + +#VPSidebarNav .VPSidebarItem.level-1 > .items { + margin-left: 14px; + padding-left: 0; + + .indicator { + left: 0px; + } + .VPLink { + padding-block: 7px; + } +} + +#VPSidebarNav .VPSidebarItem.level-1.has-active > .items { + border-color: transparent; +} diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index bcaca4ed..10ae8fc7 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,30 +1,2 @@ -# PR Description +### Summary of changes -This PR fixes the issue number: - -### Summary of my changes and explanation of my decisions - -- -- -- - -### Self-check - -Please check all that apply: - -- [ ] My code follows the style guidelines of this project -- [ ] I have reviewed my code or content update and edited it to the best of my abilities -- [ ] I have commented my code, particularly in hard-to-understand areas; my comments are concise - -### Contributors list - -Would you like your contribution to be celebrated? Please check all that apply: - -- [ ] I would like to be featured on the future contributors list in the README. If so, please tell us: - - what name you'd like to be shown there? - - we usually link GitHub profile pic -- is that ok? If not, provide another url: - - we usually link your GitHub profile but if you have a portfolio page, provide a link: - -- [ ] I would like to get a shoutout in the next monthly updates post. If so, please provide your twitter handle (or we will link to your GitHub profile). - -⚡️ ⚡️ ⚡️ Thank you for contributing to StackBlitz ⚡️ ⚡️ ⚡️ diff --git a/README.md b/README.md index 5ff51132..943a634b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Welcome to the home of the [StackBlitz documentation site](https://developer.sta Our docs site was built with [VitePress](https://vitepress.vuejs.org/) 💙 ## What is StackBlitz? -StackBlitz is an **instant fullstack web IDE for the JavaScript ecosystem**. It's powered by [WebContainers](https://blog.stackblitz.com/posts/introducing-webcontainers/), the first WebAssembly-based operating system which **boots Node.js environment in milliseconds**, securely within your browser tab. +StackBlitz is an **instant fullstack web IDE for the JavaScript ecosystem**. It is powered by [WebContainers](https://blog.stackblitz.com/posts/introducing-webcontainers/), the first WebAssembly-based operating system which **boots Node.js environment in milliseconds**, securely within your browser tab. Now you can use the web to build the web. @@ -30,7 +30,7 @@ There are numerous ways to contribute to docs: - **Create demos** - We'd like to help our users see our SDK methods in action. Would you like to create a Vanilla JS or TS demo? Before you do, please read our [contributing guide](CONTRIBUTING.md) and reach out to us on [GitHub discussions](https://github.com/stackblitz/docs/discussions). - **Fix an issue** - - You see an issue you'd like to worn on? Ask to be assigned to fix it. Before you start your work, please read our [contributing guide](CONTRIBUTING.md). + - You see an issue you'd like to work on? Ask to be assigned to fix it. Before you start your work, please read our [contributing guide](CONTRIBUTING.md). - **Reviews** - Please feel free to check existing PRs and issues. Share your loving feedback, help the other contributor approach the task in a better way, spot lurking bugs, errors, and mistakes. You can use pr.new to that end - in the URL of the issue or PR, swap "github.com" with "pr.new" to spin up the environment and the preview. @@ -72,7 +72,7 @@ There are three ways to interact with this repository: Use Web Publisher for small content updates for a pleasant editing experience: -1. Open the page on our [docs site](developer.stackblitz.com), scroll down, and click "edit this page". +1. Open any page on our docs site ([Like this one](https://developer.stackblitz.com/guides/user-guide/what-is-stackblitz)), scroll down, and click "edit this page". 2. Update the document in the editor on the left and see the rendered change in the preview window on the right. 3. Once you're done, in the top right corner click on the green button that says "Propose changes". 4. You will be redirected to a GitHub PR template page prepared for you to submit a PR. @@ -107,7 +107,7 @@ For production, the docs expect the following environment variables to be define - `VITE_ALGOLIA_KEY`: Algolia `apiKey`. - `VITE_GTM_ID`: Google Tag Manager id. -They can be defined in CI server configuration, or in a `.env` file: +They can be defined in CI configuration, or in a `.env` file: ```sh # .env diff --git a/docs/codeflow/codeflow-faq.md b/docs/codeflow/codeflow-faq.md index 3420eb28..e708d683 100644 --- a/docs/codeflow/codeflow-faq.md +++ b/docs/codeflow/codeflow-faq.md @@ -10,7 +10,7 @@ This page addresses the frequently asked questions concerning: current features, [[toc]] -## General +## General FAQs ### What is Codeflow? diff --git a/docs/codeflow/content-updates-with-web-publisher.md b/docs/codeflow/content-updates-with-web-publisher.md index 76d738e6..2023c649 100644 --- a/docs/codeflow/content-updates-with-web-publisher.md +++ b/docs/codeflow/content-updates-with-web-publisher.md @@ -18,7 +18,7 @@ This page covers using Web Publisher to update your blog posts, docs, or wiki pa To edit a page, you need to find its corresponding file on GitHub. You can do it in three ways: - ["Edit in Web Publisher"](#edit-in-web-publisher-button) button, -- ["Edit this page on GitHub"](#edit-this-page-on-github) link, +- ["Edit this page on GitHub"](#edit-this-page-on-github-link) link, - [through a GitHub repository](#through-github). ### "Edit in Web Publisher" button @@ -121,7 +121,7 @@ Before you send the changes to the owner of the page, please double check the te **Ready to submit? Follow these steps:** 1. In the top right corner, click on the green button that reads "Propose changes". -2. In the dropdown window, click on "Commit proposed changes". Web Publisher will "push changes", which means that your edits are being sent to GitHub. In fact, Web Publisher first creates "a fork" (which means "a copy") of the GitHub repository, saves the changes and only them sends them to GitHub. +2. In the dropdown window, click on "Commit proposed changes". Web Publisher will "push changes", which means that your edits are being sent to GitHub. In fact, Web Publisher first creates "a fork" (which means "a copy") of the GitHub repository, saves the changes, and only then sends them to GitHub. 3. A new browser tab will open with a form to "Open a pull request" (which means "suggest changes to the owner of the page"). Fill it out, including the description of the changes you made and explanation of your reasoning and motivation behind it. Please keep the information that the pull request was made with Web Publisher (already pre-filled). Congratulations! You've submitted the edits 🥳 diff --git a/docs/enterprise/adfs-sso.md b/docs/enterprise/adfs-sso.md index 14e9ca2b..80a93ceb 100644 --- a/docs/enterprise/adfs-sso.md +++ b/docs/enterprise/adfs-sso.md @@ -19,7 +19,10 @@ StackBlitz is excited to offer SAML-based Single Sign-on (SSO) to organizations ## StackBlitz Admin Panel Auth Settings Page :::warning IMPORTANT: -Admin accounts should not be made with an individual work email that will be used to create a separate user account later. Should this happen, we recommend the following steps: +Each user account (including the Admin User) must have a unique email address. Use a service account email address (like IT@yourcompany.com) to ensure that the admin account doesn't cause email collisions for SSO users. If your admin email address matches an SSO user's email address, said SSO user will receive an "invalid login or password" error when signing in. +\ +  +Should this happen, we recommend the following steps: - Log in as admin - Navigate to `https://editor.stackblitz.[COMPANY.COM]/users/edit` to change your email address to a different one. It will show the same screen as the changing email/password when first logging in as an admin, but you only need to change your email. ::: diff --git a/docs/enterprise/assets/okta-sso/okta-integration-5.png b/docs/enterprise/assets/okta-sso/okta-integration-5.png index 8455176b..9853d530 100644 Binary files a/docs/enterprise/assets/okta-sso/okta-integration-5.png and b/docs/enterprise/assets/okta-sso/okta-integration-5.png differ diff --git a/docs/enterprise/assets/saml-config.png b/docs/enterprise/assets/saml-config.png index 2617fae2..7892f82e 100644 Binary files a/docs/enterprise/assets/saml-config.png and b/docs/enterprise/assets/saml-config.png differ diff --git a/docs/enterprise/configuring-dns.md b/docs/enterprise/configuring-dns.md index 087f2e45..2d12c369 100644 --- a/docs/enterprise/configuring-dns.md +++ b/docs/enterprise/configuring-dns.md @@ -11,7 +11,6 @@ Based off the root DNS zone set in EE Site Configuration (for instance, `stackbl ``` A stackblitz.example.com 172.16.4.20 A *.stackblitz.example.com 172.16.4.20 -A *.preview.stackblitz.example.com 172.16.4.20 ``` ## TLS @@ -20,7 +19,6 @@ For TLS, your certificate should have `stackblitz.example.com` as the Common Nam - `stackblitz.example.com` - `*.stackblitz.example.com` -- `*.preview.stackblitz.example.com` ### TLS Certificate Renewal diff --git a/docs/enterprise/installation/quickstart-existing-cluster.md b/docs/enterprise/installation/quickstart-existing-cluster.md index 24525a45..58a481fb 100644 --- a/docs/enterprise/installation/quickstart-existing-cluster.md +++ b/docs/enterprise/installation/quickstart-existing-cluster.md @@ -20,7 +20,7 @@ For installing StackBlitz in environments with restricted network access, see [A Minimum Cluster Requirements: -- 8 vCPU, +- 16 vCPU, - 32 GB Memory, - 200 GB Storage, - `kubectl` access to the cluster, diff --git a/docs/enterprise/installation/quickstart-gcp.md b/docs/enterprise/installation/quickstart-gcp.md index e6d0cbea..6c717b0f 100644 --- a/docs/enterprise/installation/quickstart-gcp.md +++ b/docs/enterprise/installation/quickstart-gcp.md @@ -14,11 +14,11 @@ StackBlitz Enterprise is a Kubernetes application. You can install the software ## Getting started on GCP (embedded) -If you don’t have a cluster, then our install scripts can provide one. The minimum requirements for this on GCP is n1-standard-8 (8 vCPUs, 30 GB memory). +If you don’t have a cluster, then our install scripts can provide one. The minimum requirements for this on GCP is n1-standard-16 (16 vCPUs, 60 GB memory). Getting started on GCP (no GKE, no existing cluster): -- Launch an n1-standard-4 instance or larger on GCP with Ubuntu as the OS with 200gb disk space. +- Launch a n1-standard-16 instance or larger on GCP with Ubuntu as the OS with 200 GB disk space. - Make sure ports the following TCP ports are allowed through the firewall: - 22 - 80 @@ -28,6 +28,8 @@ Getting started on GCP (no GKE, no existing cluster): - 8080 - 6443 - Run the kots intaller command: `curl -sSL https://k8s.kurl.sh/stackblitz | sudo bash`. + - **Note:** The KURL installer may prompt some packages for manual installation. + See: [Host Package Requirements](https://kurl.sh/docs/add-ons/kubernetes#host-package-requirements). :::tip Using load balancers? Ports 80 and 443 should be forwarded from the load balancer. The remaining ports are for inbound rules on the security group. diff --git a/docs/enterprise/installation/quickstart.md b/docs/enterprise/installation/quickstart.md index d74ebb75..d8b2eb15 100644 --- a/docs/enterprise/installation/quickstart.md +++ b/docs/enterprise/installation/quickstart.md @@ -14,7 +14,7 @@ StackBlitz Enterprise is a Kubernetes application. You can install the software ## Getting started on bare metal (embedded) -If you don’t have a cluster, then our install scripts can provide one. The minimum requirements for this is 8 vCPUs, 32 GB memory, and 200 GB storage running Ubuntu LTS. +If you don’t have a cluster, then our install scripts can provide one. The minimum requirements for this is 16 vCPUs, 32 GB memory, and 200 GB storage running Ubuntu LTS. Getting started on bare metal (no existing Kubernetes cluster): @@ -27,6 +27,8 @@ Getting started on bare metal (no existing Kubernetes cluster): - 8080 - 6443 - Run the kots intaller command: `curl -sSL https://k8s.kurl.sh/stackblitz | sudo bash`. + - **Note:** The KURL installer may prompt some packages for manual installation. + See: [Host Package Requirements](https://kurl.sh/docs/add-ons/kubernetes#host-package-requirements). :::tip Using load balancers? Ports 80 and 443 should be forwarded from the load balancer. The remaining ports are for inbound rules on the security group. diff --git a/docs/enterprise/okta-sso.md b/docs/enterprise/okta-sso.md index 530c4539..5b805a43 100644 --- a/docs/enterprise/okta-sso.md +++ b/docs/enterprise/okta-sso.md @@ -19,7 +19,10 @@ StackBlitz SAML integration relies on a user-level token. To ensure consistent d ### Navigate to Auth Settings Page Within the Admin Panel :::warning IMPORTANT: -Admin accounts should not be made with an individual work email that will be used to create a separate user account later. Should this happen, we recommend the following steps: +Each user account (including the Admin User) must have a unique email address. Use a service account email address (like IT@yourcompany.com) to ensure that the admin account doesn't cause email collisions for SSO users. If your admin email address matches an SSO user's email address, said SSO user will receive an "invalid login or password" error when signing in. +\ +  +Should this happen, we recommend the following steps: - Log in as admin - Navigate to `https://editor.stackblitz.[COMPANY.COM]/users/edit` to change your email address to a different one. It will show the same screen as the changing email/password when first logging in as an admin, but you only need to change your email. ::: @@ -43,7 +46,7 @@ Next, fill out the `App name` for the SAML integration. This is what the App wil On the next page, you'll need to fill out a few options using values from the Auth Settings page in the StackBlitz admin dashboard. - For the `Single sign on URL`, use the `Assertion Customer Service URL` from the StackBlitz Auth Settings page. -- For `Audience URI (SP Entity ID)`, choose an identifier for the SAML application. We recommend using `stackblitz`. Use the same value in your StackBlitz SAML settings for `Issuer (Service Provider Entity ID)`. +- For `Audience URI (SP Entity ID)`, choose an identifier for the SAML application. We recommend using `stackblitz`. Use the same value in your StackBlitz SAML settings for `Client ID (Service Provider Entity ID / Issuer)`. - In the `Attribute Statements (optional)` section, you must configure the `email` and `name` attributes for your users. We recommend using `user.email` for the `email` attribute, and `user.firstName + " " + user.lastName` for the `name` attribute. ![Configure SAML Integration in Okta](./assets/okta-sso/okta-integration-3.png) diff --git a/docs/enterprise/sso.md b/docs/enterprise/sso.md index a070a217..89a781c0 100644 --- a/docs/enterprise/sso.md +++ b/docs/enterprise/sso.md @@ -17,10 +17,15 @@ StackBlitz SAML integration relies on a user-level token. To ensure consistent d - StackBlitz offers just-in-time provisioning. This means that if a user logs into StackBlitz for the first time using SSO, an account will automatically be created. ::: + + ### Configure your IdP :::warning IMPORTANT: -Admin accounts should not be made with an individual work email that will be used to create a separate user account later. Should this happen, we recommend the following steps: +Each user account (including the Admin User) must have a unique email address. Use a service account email address (like IT@yourcompany.com) to ensure that the admin account doesn't cause email collisions for SSO users. If your admin email address matches an SSO user's email address, said SSO user will receive an "invalid login or password" error when signing in. +\ +  +Should this happen, we recommend the following steps: - Log in as admin - Navigate to `https://editor.stackblitz.[COMPANY.COM]/users/edit` to change your email address to a different one. It will show the same screen as the changing email/password when first logging in as an admin, but you only need to change your email. ::: @@ -57,4 +62,4 @@ Please ensure that the email addresses in the IdP are what your users will be us ### Troubleshooting -If you're unable to login after verifying these things, please reach out to [enterprise@stackblitz.com](mailto:enterprise@stackblitz.com) for support. \ No newline at end of file +If you're unable to login after verifying these things, please reach out to [enterprise@stackblitz.com](mailto:enterprise@stackblitz.com) for support. diff --git a/docs/guides/integration/assets/figma-installation.gif b/docs/guides/integration/assets/figma-installation.gif new file mode 100644 index 00000000..d5075d0a Binary files /dev/null and b/docs/guides/integration/assets/figma-installation.gif differ diff --git a/docs/guides/integration/assets/figma-use.gif b/docs/guides/integration/assets/figma-use.gif new file mode 100644 index 00000000..6a1e33bf Binary files /dev/null and b/docs/guides/integration/assets/figma-use.gif differ diff --git a/docs/guides/integration/assets/storybook-addon.gif b/docs/guides/integration/assets/storybook-addon.gif new file mode 100644 index 00000000..d63a5d04 Binary files /dev/null and b/docs/guides/integration/assets/storybook-addon.gif differ diff --git a/docs/guides/integration/bug-reproductions.md b/docs/guides/integration/bug-reproductions.md index ce1322de..07e54e0a 100644 --- a/docs/guides/integration/bug-reproductions.md +++ b/docs/guides/integration/bug-reproductions.md @@ -1,6 +1,6 @@ --- title: Bug reproductions -description: A well-described issue is immensely helpful when developing a software product, and a minimal reproduction is one of the most useful part of the conversation. +description: A well-described issue is immensely helpful when developing a software product, and a minimal reproduction is one of the most useful parts of the conversation. og_image: bug-reproductions.png --- @@ -8,7 +8,7 @@ og_image: bug-reproductions.png ## Issue-reporting workflow -> A well-described issue is immensely helpful when developing a software product, and a minimal reproduction is one of the most useful part of the conversation. +> A well-described issue is immensely helpful when developing a software product, and a minimal reproduction is one of the most useful parts of the conversation. How can we encourage users to provide bug reproductions in a smart way? diff --git a/docs/guides/integration/create-with-sdk.md b/docs/guides/integration/create-with-sdk.md index be3445cf..d0ef5ddb 100644 --- a/docs/guides/integration/create-with-sdk.md +++ b/docs/guides/integration/create-with-sdk.md @@ -28,7 +28,7 @@ function openProjectDemo() { # {{ $frontmatter.title }} -Sometimes, instead of keeping a set of example project in a GitHub repository, it is more convenient to create them dynamically on the fly. This is often the case when you maintain a documentation with code snippets that you want your users to open in a live environment. +Sometimes, instead of keeping a set of example projects in a GitHub repository, it is more convenient to create them dynamically on the fly. This is often the case when you maintain a documentation with code snippets that you want your users to open in a live environment. In order to create a project on-demand, use our [SDK](https://www.npmjs.com/package/@stackblitz/sdk). It is a small package (just 2kb gzipped) intended to help in communication between your code and StackBlitz. @@ -94,7 +94,7 @@ Let’s take a look at some of the most crucial parts of the payload first. ### Files `files` is a flat JavaScript object where each key represents a path, and each value is the file's contents. -For example: in order to create a project with a `readme.md` file and `src` folder that contains `index.js` file inside, your `files` would look something like this: +For example: in order to create a project with a `readme.md` file and `src` folder that contains an `index.js` file inside, your `files` would look something like this: ```js { @@ -151,9 +151,9 @@ This is how the title and description look inside a StackBlitz project: ## Options: Customizing your project -To further customize your project, you can provide a second argument to the `StackBlitzSDK.openProject` method. The argument is an object that allows to provide optional adjustments: +To further customize your project, you can provide a second argument to the `StackBlitzSDK.openProject` method. The argument is an object that allows you to provide optional adjustments: -- **`openFile`** – StackBlitz displays a file in the editor on page load - depending on a project, that would usually be a readme or the index file. You can specify the featured file: +- **`openFile`** – StackBlitz displays a file in the editor on page load - depending on the project, that would usually be a readme or the index file. You can specify the featured file: ```js { openFile: 'src/app/index.tsx' diff --git a/docs/guides/integration/figma-plugin.md b/docs/guides/integration/figma-plugin.md new file mode 100644 index 00000000..d1695708 --- /dev/null +++ b/docs/guides/integration/figma-plugin.md @@ -0,0 +1,69 @@ +--- +title: How to install and use the StackBlitz plugin for Figma +description: With StackBlitz’s Figma plugin, Dev Mode users can open components in StackBlitz directly from Figma. +og_image: figma-plugin.png +--- + +# {{ $frontmatter.title }} + +[Figma](https://www.figma.com/) is a collaborative UI/UX design tool. Figma’s [Dev Mode](https://www.figma.com/dev-mode/) enables developers to inspect designs, extract code, and access design details, streamlining the design-to-production process. + +Figma supports a [number of plugins](https://www.figma.com/community/category/development/plugins) that extend the functionality and integrate additional tools with the platform. + +::: tip Available with all StackBlitz plans including **Personal**, **Personal+**, **Teams**, and **Enterprise**. + +The plugin is compatible with all Figma plans. +::: + +## About the StackBlitz plugin for Figma + +With [StackBlitz’s Figma plugin](https://www.figma.com/community/plugin/1287113487428429346), Dev Mode users can open components in StackBlitz directly from Figma. + +![StackBlitz's Plugin for Figma Dev Mode](./assets/figma-use.gif) + +After configuring the plugin, you will be able to: + +- Link layers in Figma to specific components in your design system +- Open the relevant components in an instant, browser-based development environment directly from Figma Dev Mode +- View and modify the relevant component in StackBlitz without any local configuration +- Preview any changes live within StackBlitz +- Commit edits back to the repository or open a pull request + +## **Installing the plugin** + +To use the StackBlitz plugin, add it to a Figma file from either: + +- **The [plugins directory](https://www.figma.com/community/plugin/1287113487428429346)** by clicking “Open in…” and then selecting the name of the file. + + +- **Dev Mode within your Figma file** by searching for "StackBlitz" under *Plugins* + + ![Figma plugin directory](./assets/figma-installation.gif) + *Initialize the StackBlitz plugin from within Dev Mode.* + + +## Using the StackBlitz plugin with Dev Mode + +Once you have added the plugin to your Figma file, + +1. Enable [Dev Mode](https://www.figma.com/dev-mode/) is on (`Shift` + `D`) +1. Select a layer +1. Open in the StackBlitz plugin and paste a URL of a repository with the code of your project. + - You can also use the URL of a specific file within this repository: typically, a component file, for instance: https://github.com/stackblitz/docs/blob/main/.vitepress/theme/components/CardLists/CardList.vue +1. Click the "Create instant environment link" button to have the link generated for the selected layer. + +The link is now added to the layer's Dev resources. + +When you click it, a new tab will open with the full IDE loaded with your project. If your link included a file, this file will already be open in the editor. + +### Recommended uses for the plugin + +We suggest providing instant environment links, especially for the essential components in your app. The components that might need adjustments in future are good candidates as well. + +Generally, every time a developer looks at a component in Figma to make changes in the code, having a resource link handy will make their work so much easier! + +For more information, [view the StackBlitz plugin in the Figma community directory](https://www.figma.com/community/plugin/1287113487428429346) and refer to the [Figma Dev Mode documentation](https://help.figma.com/hc/en-us/articles/15023124644247-Guide-to-Dev-Mode). + +:::info How can we improve this guide? +Haven't found an answer to your question? [Let us know!](mailto:devrel@stackblitz.com) +::: diff --git a/docs/guides/integration/storybook-addon.md b/docs/guides/integration/storybook-addon.md new file mode 100644 index 00000000..13913431 --- /dev/null +++ b/docs/guides/integration/storybook-addon.md @@ -0,0 +1,102 @@ +--- +title: How to install and use the StackBlitz addon for Storybook +description: With StackBlitz’s addon, Storybook users can open stories in StackBlitz directly from Storybook. +og_image: storybook-addon.png +--- + +# {{ $frontmatter.title }} + +[Storybook](https://storybook.js.org/) is a widely used open-source tool for building UI components in isolation. It allows developers to create and test UI components interactively, separate from the main application, facilitating easier documentation, debugging, and visual testing of different states and edge cases. + +Storybook supports a number of [addons](https://storybook.js.org/docs/addons) that extend the functionality and integrate additional tools. + +::: tip Available with all StackBlitz plans including **Personal**, **Personal+**, **Teams**, and **Enterprise**. + +The addon is compatible with all Storybook deployments including for Chromatic customers. +::: + +## About the StackBlitz addon for Storybook + +With StackBlitz’s [addon](https://storybook.js.org/addons/@stackblitz/storybook-addon-stackblitz), Storybook users can open stories in StackBlitz directly from Storybook. + +![Open Storybook stories in StackBlitz](./assets/storybook-addon.gif) + +After installation, you will be able to: + +- Open an instant, browser-based development environment directly from Storybook +- View and modify the relevant component in StackBlitz without a local development environment +- Preview any changes live within StackBlitz +- Commit edits back to the repository or open a pull request + +## **Installing the addon** + +First, install the addon by running the following command: + +::: code-group + +```bash [yarn] +yarn add --dev @stackblitz/storybook-addon-stackblitz +``` + +```bash [npm] +npm install @stackblitz/storybook-addon-stackblitz --save-dev +``` + +```bash [pnpm] +pnpm add --save-dev @stackblitz/storybook-addon-stackblitz +``` +::: + +Then, add the addon to `.storybook/main.ts|js`: + + +```tsx +export default { + addons: ['@stackblitz/storybook-addon-stackblitz'], +}; + +``` + +Configure the repository URL in `.storybook/preview.ts|js`: + +```tsx +export default { + parameters: { + repositoryUrl: 'https://github.com/[username]/[reponame]' + }, +}; +``` + +In your story files, set the file path for the specific story, for instance: + +```tsx +export const Primary: Story = { + args: {/* ... */}, + parameters: { + filePath: 'src/stories/Button.tsx' + } +}; +``` + +If your components are placed in multiple repositories, you can also define the repository URL for each specific story: + +```tsx +export const Primary: Story = { + args: {/* ... */}, + parameters: { + filePath: 'src/stories/Button.tsx', + repositoryUrl: 'https://github.com/[username]/[reponame]' + } +}; +``` + +## Using the addon + +After successful installation, you will see a new “Open in StackBlitz” button in the navigation. When clicked, this will open the current story in StackBlitz in a new tab. + +For more information, [view the StackBlitz addon on Storybook’s integrations page](https://storybook.js.org/addons/@stackblitz/storybook-addon-stackblitz/) and refer to the [Storybook documentation](https://storybook.js.org/docs/). + + +:::info How can we improve this guide? +Haven't found an answer to your question? [Let us know!](mailto:devrel@stackblitz.com) +::: diff --git a/docs/guides/user-guide/available-environments.md b/docs/guides/user-guide/available-environments.md index bd0b966a..32a34fe3 100644 --- a/docs/guides/user-guide/available-environments.md +++ b/docs/guides/user-guide/available-environments.md @@ -44,7 +44,8 @@ EngineBlock is StackBlitz's original compute environment, developed in 2017. It **Technical Characteristics**
EngineBlock uses polyfills linked to browser service workers to emulate various system functions. Due to this polyfilled architecture, it requires custom configurations to support different front-end frameworks. For instance, you can't run a React project using an Angular template in this environment. -**Framework Support** + +**Framework Support**
While EngineBlock is capable of running popular front-end frameworks, it does so with specific limitations dictated by its polyfill-based architecture. Each framework requires custom settings under the hood to function correctly and full Node.js servers are not supported. **Package Manager Compatibility**
@@ -74,7 +75,7 @@ WebContainers are available in all StackBlitz editors: [Classic Editor](/guides/ The [Classic Editor](/guides/user-guide/getting-started) supports both EngineBlock and WebContainers compute environments, wheras the [Codeflow](/codeflow/working-in-codeflow-ide) and [Web Publisher](/codeflow/content-updates-with-web-publisher) editors only support WebContainers. -If clicking the project settings gear opens the VS Code settings dialouge shown below, you are in the **Codeflow editor** an therefore using **WebContainers**: +If clicking the project settings gear opens the VS Code settings dialouge shown below, you are in the **Codeflow editor** and therefore using **WebContainers**: ![Screenshot of the Codeflow settings pane](./assets/codeflow-settings.png) diff --git a/docs/guides/user-guide/general-faqs.md b/docs/guides/user-guide/general-faqs.md index af09f1b2..f761fbb1 100644 --- a/docs/guides/user-guide/general-faqs.md +++ b/docs/guides/user-guide/general-faqs.md @@ -100,7 +100,7 @@ Check out the [Enterprise page](https://stackblitz.com/enterprise) for details a Bringing WebContainers to Enterprise Server is in the works, but not currently available. You can reach out to enterprise@stackblitz.com for details. -We do offer [WebContainer API](webcontainers.io) licenses for organizations wanting to use WebContainer technology for production usage in a for-profit setting. Check out [webcontainers.io](webcontainers.io) for more information! +We do offer [WebContainer API](https://webcontainers.io) licenses for organizations wanting to use WebContainer technology for production usage in a for-profit setting. Check out [webcontainers.io](https://webcontainers.io/enterprise) for more information! # Technology FAQs @@ -175,7 +175,7 @@ Our Codeflow editor is built on top of VS Code so you can enable the VIM extensi ### What is Web Publisher? -Web Publisher is a single file editor and publishing tools that can be used for smaller or text-based changes such as editiong documentation or blogs. Web Publisher uses Codeflow technology that allows users to create, push, and publish changes all in their browser. The GitHub integration creates a seamless workflow that's fit for developers and non-coding folks alike! +Web Publisher is a single file editor and publishing tool that can be used for smaller or text-based changes such as editing documentation or blogs. Web Publisher uses Codeflow technology that allows users to create, push, and publish changes all in their browser. The GitHub integration creates a seamless workflow that's fit for developers and non-coding folks alike! This environment is ideal for: - No-tech or low-tech users @@ -188,7 +188,7 @@ You can learn more about Web Publisher [here](https://developer.stackblitz.com/c ### What is the Classic Editor SDK? -Our JavaScript SDK (software development kit) allows users to create Classic Editor projects to be opened in a new window or embedded in your docs, example pages, or blog posts. The SDK can be used to control the UI of an embedded StackBlitz project, change the currently open file(s), and read and write files frmo the project's virtual filesystem. +Our JavaScript SDK (software development kit) allows users to create Classic Editor projects to be opened in a new window or embedded in your docs, example pages, or blog posts. The SDK can be used to control the UI of an embedded StackBlitz project, change the currently open file(s), and read and write files from the project's virtual filesystem. Details on embed options can be found [here](https://developer.stackblitz.com/platform/api/javascript-sdk). @@ -203,11 +203,11 @@ Organizations wanting to use the API for production usage in a for-profit settin - Higher API rate limits - Direct access to the StackBlitz dev team to optimize performance, prioritize bug fixes, and influence the API roadmap. -This product is ideal for organizations wanting to build completely custom user interfaces powered by Node.js without needed in use virtual machines, servers, or docker containers. +This product is ideal for organizations wanting to build completely custom user interfaces powered by Node.js without needing to use virtual machines, servers, or docker containers. WebContainer API docs can be found [here](https://webcontainers.io/). ### I see that WebContainer API is free to use, but a license is required. Can I use the WebContainer API for commercial purposes? -We are thrilled to offer free access for most users! For those with high levels of commercial usage, we do apply a nominal charge for API requests beyond 10,000 per month, at a highly competitive rate of $0.10 per API call. \ No newline at end of file +We are thrilled to offer free access for most users! For those with high levels of commercial usage, we do apply a nominal charge for API requests beyond 10,000 per month. If interested, [please reach out to sales](https://docs.google.com/forms/d/e/1FAIpQLSertiZLl-za0ZHxsWbd2IrISVft2OpPglykEHpEllPSfnZIUg/viewform) for more information! \ No newline at end of file diff --git a/docs/guides/user-guide/what-is-stackblitz.md b/docs/guides/user-guide/what-is-stackblitz.md index 4f555fad..5cc38184 100644 --- a/docs/guides/user-guide/what-is-stackblitz.md +++ b/docs/guides/user-guide/what-is-stackblitz.md @@ -60,6 +60,10 @@ You like the idea of running Node.js in the browser and feel inspired to build y Speed up your entire development process with **realtime hot-reloading in the fastest dev environment ever made**. Collaborate remotely on different devices, send and receive instant feedback, and **get to market faster**. +### Coding interviews + +Asking candidates to set up new local environments slows down the hiring process. With StackBlitz, you can create starter projects to assess candidates' skills without needing to set up a local environment. + ## What about other online IDEs? Unlike StackBlitz, legacy online IDEs run on remote servers and stream the results back to your browser. This approach yields **few security benefits** and **provides a worse experience** than your local machine in nearly every way. diff --git a/docs/links.ts b/docs/links.ts index 85589999..f6019582 100644 --- a/docs/links.ts +++ b/docs/links.ts @@ -20,6 +20,8 @@ const groupLinks: Record = { { text: 'Launching projects from GitHub', link: '/guides/integration/open-from-github' }, { text: 'Creating projects with the SDK', link: '/guides/integration/create-with-sdk' }, { text: 'Bug reproductions', link: '/guides/integration/bug-reproductions' }, + { text: 'Integrating with Storybook', link: '/guides/integration/storybook-addon' }, + { text: 'Integrating with Figma', link: '/guides/integration/figma-plugin' }, ], codeflow: [ { text: 'What is Codeflow?', link: '/codeflow/what-is-codeflow' }, @@ -128,7 +130,7 @@ export const defaultGroupLink = (linkGroup: MenuLinkGroup) => groupLinks[linkGro export const sidebarLinks = ( sidebar: 'main' | 'enterprise', - activeLinkGroups: MenuLinkGroup[] = [] + activeLinkGroups: MenuLinkGroup[] = [], ) => { if (sidebar === 'enterprise') { return [linkGroups.enterprise]; diff --git a/docs/platform/api/javascript-sdk.md b/docs/platform/api/javascript-sdk.md index 30ed982f..9714f581 100644 --- a/docs/platform/api/javascript-sdk.md +++ b/docs/platform/api/javascript-sdk.md @@ -8,6 +8,11 @@ og_image: javascript-sdk.png The StackBlitz JavaScript SDK lets you programmatically create StackBlitz projects to be opened in a new window or embedded in your docs, example pages, or blog posts. Once embedded, the projects can be controlled by using [the SDK’s VM interface][sdk_vm_docs]. +:::tip Interactive Tutorial +In addition to this guide, you can also play with our _interactive_ StackBlitz SDK tutorial (build with [TutorialKit](https://tutorialkit.dev/)): [StackBlitz SDK Tutorial](https://stackblitz-sdk-tutorial.pages.dev/) +::: + + ## Install the SDK The SDK is _3kB gzipped_ and can be installed from npm: diff --git a/docs/platform/webcontainers/assets/chrome-enable-sp.png b/docs/platform/webcontainers/assets/chrome-enable-sp.png new file mode 100644 index 00000000..1631b3b2 Binary files /dev/null and b/docs/platform/webcontainers/assets/chrome-enable-sp.png differ diff --git a/docs/platform/webcontainers/assets/chrome-memory-saver.png b/docs/platform/webcontainers/assets/chrome-memory-saver.png new file mode 100644 index 00000000..65648356 Binary files /dev/null and b/docs/platform/webcontainers/assets/chrome-memory-saver.png differ diff --git a/docs/platform/webcontainers/assets/chrome-settings-cookies-1.png b/docs/platform/webcontainers/assets/chrome-settings-cookies-1.png index 109322f4..357ef610 100644 Binary files a/docs/platform/webcontainers/assets/chrome-settings-cookies-1.png and b/docs/platform/webcontainers/assets/chrome-settings-cookies-1.png differ diff --git a/docs/platform/webcontainers/assets/chrome-settings-cookies-2.png b/docs/platform/webcontainers/assets/chrome-settings-cookies-2.png index a4105a48..1702fb5a 100644 Binary files a/docs/platform/webcontainers/assets/chrome-settings-cookies-2.png and b/docs/platform/webcontainers/assets/chrome-settings-cookies-2.png differ diff --git a/docs/platform/webcontainers/assets/chrome-settings-cookies-3.png b/docs/platform/webcontainers/assets/chrome-settings-cookies-3.png index 4288835b..a720c08f 100644 Binary files a/docs/platform/webcontainers/assets/chrome-settings-cookies-3.png and b/docs/platform/webcontainers/assets/chrome-settings-cookies-3.png differ diff --git a/docs/platform/webcontainers/assets/chrome-settings-popups.png b/docs/platform/webcontainers/assets/chrome-settings-popups.png new file mode 100644 index 00000000..01aaf569 Binary files /dev/null and b/docs/platform/webcontainers/assets/chrome-settings-popups.png differ diff --git a/docs/platform/webcontainers/assets/firefox-settings-cookies-2.png b/docs/platform/webcontainers/assets/firefox-settings-cookies-2.png index fe100a56..3c026404 100644 Binary files a/docs/platform/webcontainers/assets/firefox-settings-cookies-2.png and b/docs/platform/webcontainers/assets/firefox-settings-cookies-2.png differ diff --git a/docs/platform/webcontainers/assets/firefox-settings-popups.png b/docs/platform/webcontainers/assets/firefox-settings-popups.png new file mode 100644 index 00000000..60d39ec9 Binary files /dev/null and b/docs/platform/webcontainers/assets/firefox-settings-popups.png differ diff --git a/docs/platform/webcontainers/browser-config.md b/docs/platform/webcontainers/browser-config.md index 40b4864a..a66d5305 100644 --- a/docs/platform/webcontainers/browser-config.md +++ b/docs/platform/webcontainers/browser-config.md @@ -16,24 +16,72 @@ WebContainers use a combination of browser technologies, such as [Service Worker In some browsers, this feature is blocked by “third-party cookie” or “third-party storage” restrictions. These are legitimate restrictions when the third-party domain is an ad server or a tracking server, but in the case of WebContainers the third-party domain is where your project code runs. -## Chrome: enabling Service Workers {#chrome-service-workers} +## Chrome -If you use the “Block Third Party Cookies” option in Chrome, you will need to add exceptions for StackBlitz projects. +With Chrome's defaults, starting with version 118 or later, you should get a pretty good experience out of the box. + +Read on if you run into issues or want an even smoother experience. + +### Previews in a separate tab {#chrome-preview-separate-tab} + +Previews opened in a separate tab are not connected by default to the editor and require an extra step. To complete this step, you are usually prompted to click a button. + +This can happen automatically if your popups settings, [chrome://settings/content/popups](chrome://settings/content/popups), are adjusted with the following exception: + +``` +https://[*.]webcontainer.io +https://[*.]webcontainer-api.io +``` + +Chrome popups settings showing the *.webcontainer.io origins as exceptions + +Once done, whenever the preview needs to reconnect to the editor, it will open a popup that gets immediately closed. + +Lastly, if Chrome's [memory saver][CHROME_MEMORY_SAVER] is turned on, this step might be necessary more often than required. To avoid it, you can add the following exception in [chrome://settings/performance](chrome://settings/performance): + +``` +https://webcontainer.io +https://webcontainer-api.io +https://stackblitz.com +``` + +Your performance settings should be similar to this: + +Chrome performance settings showing the memory saver section with an exception for stackblitz.com + +### Enabling Service Workers {#chrome-service-workers} + +If you use the “Block Third Party Cookies” option in Chrome and you have “Third-party Storage Partitioning” disabled, you will need to either: + + - Enable Storage partitioning + - Or add exceptions for StackBlitz projects. + +The first option should be preferred because this is a [new feature][GOOGLE_SP] of Chrome which improves your privacy when you visit websites that embed third-party sites. + +#### Enable Storage partitioning + +Visit `chrome://flags/#third-party-storage-partitioning` and choose `Enabled` in the drop down. In recent version of Chrome, choosing the `Default` value should work too. + +Chrome flags showing the third-party Storage Partitioning option enabled. + + +#### Or add exceptions for Stackblitz To allow all StackBlitz projects to use Service Workers, go to your browser’s cookie preferences, and add exceptions for the following URL patterns: ``` https://[*.]stackblitz.io https://[*.]webcontainer.io +https://[*.]webcontainer-api.io ``` For instance, in Chrome, go to `chrome://settings/cookies` and add those exceptions in the “Sites that can always use cookies” section. -Chrome cookie settings with an empty list of “Sites that can always use cookies”. +Chrome cookie settings with an empty list of “Sites that can always use cookies”. -Chrome cookie settings showing a modal dialog for adding a site to list of third-party cookie exceptions. +Chrome cookie settings showing a modal dialog for adding a site to list of third-party cookie exceptions. -Chrome cookie settings with exceptions for stackblitz.io and local.webcontainer.io domains. +Chrome cookie settings with exceptions for stackblitz.io and local.webcontainer.io domains. :::details Advanced: enabling Service Workers for a single project @@ -53,7 +101,9 @@ Note that the list of blocked domains might look different for you. In particula ::: -## Firefox: enabling Service Workers {#firefox-service-workers} +## Firefox + +### Enabling Service Workers {#firefox-service-workers} When Firefox’s Enhanced Tracking Protection is configured in “Custom” mode with the cookie blocking option set to “All cross-site cookies”, Firefox will block the Service Workers used by WebContainers. @@ -62,12 +112,13 @@ You can work around this issue in a couple ways: 1. Use the “Strict” mode instead of “Custom” mode. It’s important to note that it's slightly more permissive than “Custom” mode with very strict options. If this is not something you'd like to allow, you can... 2. Add exceptions to cookie blocking for the domains used to run StackBlitz projects. -To do so, visit `about:preferences#privacy` to check what your current settings look like. +To do so, visit `about:preferences#privacy` to check what your current settings look like. The Firefox “Privacy & Security” settings page showing that Enhanced Tracking Protection is set to “Custom”, and to “Cookies: All cross-site cookies (may cause websites to break)”. To add exceptions for StackBlitz, scroll down to the “Cookies and Site Data” section, click on “Manage Exceptions…”, and add exceptions for the following sites: @@ -75,16 +126,32 @@ To add exceptions for StackBlitz, scroll down to the “Cookies and Site Data” ``` https://stackblitz.io https://webcontainer.io +https://webcontainer-api.io ``` The Cookies and site data exceptions management window in Firefox settings. It shows a couple entries for stackblitz.io and webcontainer.io, both with the value “Allow”. Don’t forget to click “Save Changes”. Then you should be able to reload the tab with your StackBlitz project, and hopefully everything should work! +### Previews in a separate tab {#firefox-preview-separate-tab} + +Previews opened in a separate tab are not connected by default to the editor and require an extra step. To complete this step, you are usually prompted to click a button. + +This can happen automatically if your popups settings, [about:preferences#privacy](about:preferences#privacy), are adjusted with the following exception: + +``` +https://webcontainer.io +https://webcontainer-api.io +``` + +Firefox popups settings showing the webcontainer.io site allowed as an exception + + ## Brave: enabling Service Workers {#brave-service-workers} By default, Brave’s “Shields” feature blocks [Service Workers][MDN_SERVICE_WORKER] and cookies from third-party domains. @@ -93,19 +160,19 @@ To allow WebContainers to run in Brave, you will need to add an exception for St 1. Visit a WebContainers-based project, for instance https://stackblitz.com/edit/nextjs. The project’s boot sequence might stay stuck on the “Running start command” step: -![Screenshot of Brave on a WebContainers project with the Brave Shields feature on. Loading the project’s web server is stuck on the last step.](./assets/brave-stuck-project.png) +Screenshot of Brave on a WebContainers project with the Brave Shields feature on. Loading the project’s web server is stuck on the last step 2. Click on the “Shields” icon at the right of the address bar, then click on “Advanced View”. -Screenshot showing the Shields configuration popup for stackblitz.com. +Screenshot showing the Shields configuration popup for stackblitz.com. 3. In the advanced view, change the “Cross-site cookies blocked” option to “All cookies allowed”. -![Screenshot showing the advanced view of the Shields configuration popup, with a drop-down selector for cross-site cookie permissions.](./assets/brave-shields-details.png) +Screenshot showing the advanced view of the Shields configuration popup, with a drop-down selector for cross-site cookie permissions. Brave will reload the page, and you should get a working project: -![Screenshot of Brave on a WebContainers project with the Brave Shields feature tweaked to allow third-party cookies and Service Workers. Loading the web server works, and shows the default page for Next.js’s starter project.](./assets/brave-working-project.png) +Screenshot of Brave on a WebContainers project with the Brave Shields feature tweaked to allow third-party cookies and Service Workers. Loading the web server works, and shows the default page for Next.js’s starter project. ## Edge: enabling WebAssembly {#edge-webassembly} @@ -129,3 +196,5 @@ stackblitz.com [MDN_SERVICE_WORKER]: https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API [MDN_WEB_ASSEMBLY]: https://developer.mozilla.org/en-US/docs/WebAssembly +[GOOGLE_SP]: https://developers.google.com/privacy-sandbox/3pcd/storage-partitioning +[CHROME_MEMORY_SAVER]: https://support.google.com/chrome/answer/12929150 \ No newline at end of file diff --git a/docs/platform/webcontainers/browser-support.md b/docs/platform/webcontainers/browser-support.md index d1a2b9eb..d20b7ceb 100644 --- a/docs/platform/webcontainers/browser-support.md +++ b/docs/platform/webcontainers/browser-support.md @@ -64,6 +64,8 @@ We have beta support for Firefox. Please try it and [share feedback with us](htt Firefox does not fully support the required mode for cross-origin isolation, so you might encounter limitations when **running a server in a preview frame** within the StackBlitz editor. Third-party assets might get blocked due to the limitations of cross-origin isolation policies. However, you can work around this by opening your server preview in a separate window. +If you are using Firefox Private Browsing, it's not possible to run a web server. The reason is that we need to be able to use a Service Worker, which Firefox does not allow in Private Browsing windows. + Because Firefox and Node.js use different JavaScript engines (SpiderMonkey and V8, respectively), there is a small risk of running into [JS engine differences](#js-engine-differences). ## Safari diff --git a/docs/platform/webcontainers/turbo-package-manager.md b/docs/platform/webcontainers/turbo-package-manager.md index 4098474c..ad3538bc 100644 --- a/docs/platform/webcontainers/turbo-package-manager.md +++ b/docs/platform/webcontainers/turbo-package-manager.md @@ -7,7 +7,7 @@ og_image: webcontainer-turbo-package-manager.png # {{ $frontmatter.title }} :::warning -Starting on January 1, 2024, turbo will no longer be supported and will be removed. We now offer built-in support for npm, pnpm, and yarn v1. +Starting on April 2024, turbo ceased to be supported and was removed. We offer built-in support for npm, pnpm, and yarn v1. Support for native package managers out-of-the-box offers a lot of benefits. All features of your favorite package manager will be immediately available. diff --git a/docs/public/img/logo/readme.md b/docs/public/img/logo/readme.md new file mode 100644 index 00000000..cd31f559 --- /dev/null +++ b/docs/public/img/logo/readme.md @@ -0,0 +1,16 @@ +# StackBlitz Logo + +The files in this folder serve as a resource for third parties to access StackBlitz logos. + +- ![](https://developer.stackblitz.com/img/logo/stackblitz-bolt-blue.svg) + https://developer.stackblitz.com/img/logo/stackblitz-bolt-blue.svg +- ![](https://developer.stackblitz.com/img/logo/stackblitz-bolt-white.svg) + https://developer.stackblitz.com/img/logo/stackblitz-bolt-white.svg +- ![](https://developer.stackblitz.com/img/logo/stackblitz-logo-black_blue.svg) + https://developer.stackblitz.com/img/logo/stackblitz-logo-black_blue.svg +- ![](https://developer.stackblitz.com/img/logo/stackblitz-logo-black.svg) + https://developer.stackblitz.com/img/logo/stackblitz-logo-black.svg +- ![](https://developer.stackblitz.com/img/logo/stackblitz-logo-white_blue.svg) + https://developer.stackblitz.com/img/logo/stackblitz-logo-white_blue.svg +- ![](https://developer.stackblitz.com/img/logo/stackblitz-logo-white.svg) + https://developer.stackblitz.com/img/logo/stackblitz-logo-white.svg diff --git a/docs/public/img/logo/stackblitz-bolt-blue.svg b/docs/public/img/logo/stackblitz-bolt-blue.svg new file mode 100644 index 00000000..2ffb7ab2 --- /dev/null +++ b/docs/public/img/logo/stackblitz-bolt-blue.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/public/img/logo/stackblitz-bolt-white.svg b/docs/public/img/logo/stackblitz-bolt-white.svg new file mode 100644 index 00000000..ce0fb292 --- /dev/null +++ b/docs/public/img/logo/stackblitz-bolt-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/public/img/logo/stackblitz-logo-black.svg b/docs/public/img/logo/stackblitz-logo-black.svg new file mode 100644 index 00000000..d14a5329 --- /dev/null +++ b/docs/public/img/logo/stackblitz-logo-black.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/public/img/logo/stackblitz-logo-black_blue.svg b/docs/public/img/logo/stackblitz-logo-black_blue.svg new file mode 100644 index 00000000..e61c10aa --- /dev/null +++ b/docs/public/img/logo/stackblitz-logo-black_blue.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/public/img/logo/stackblitz-logo-white.svg b/docs/public/img/logo/stackblitz-logo-white.svg new file mode 100644 index 00000000..ae8e361f --- /dev/null +++ b/docs/public/img/logo/stackblitz-logo-white.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/public/img/logo/stackblitz-logo-white_blue.svg b/docs/public/img/logo/stackblitz-logo-white_blue.svg new file mode 100644 index 00000000..67961d53 --- /dev/null +++ b/docs/public/img/logo/stackblitz-logo-white_blue.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/public/img/og/figma-plugin.png b/docs/public/img/og/figma-plugin.png new file mode 100644 index 00000000..c26e1090 Binary files /dev/null and b/docs/public/img/og/figma-plugin.png differ diff --git a/docs/public/img/og/storybook-addon.png b/docs/public/img/og/storybook-addon.png new file mode 100644 index 00000000..5d8d3712 Binary files /dev/null and b/docs/public/img/og/storybook-addon.png differ diff --git a/docs/teams/assets/project-access-settings.png b/docs/teams/assets/project-access-settings.png new file mode 100644 index 00000000..538ccd87 Binary files /dev/null and b/docs/teams/assets/project-access-settings.png differ diff --git a/docs/teams/collaboration-and-access-control.md b/docs/teams/collaboration-and-access-control.md index 151df978..b31eff4b 100644 --- a/docs/teams/collaboration-and-access-control.md +++ b/docs/teams/collaboration-and-access-control.md @@ -12,6 +12,14 @@ By default, all StackBlitz projects created within a Team are publicly viewable ![Sharing settings](./assets/sharing-settings.png) +### Team settings +When collaborating inside a StackBlitz Team, you have these additional controls: +- Allow or disallow team members from inviting external users to collaborate on projects created inside the team. +- Select the highest level of external visibility (to those outside the team) allowed for projects created inside the team (private, secret, or public). +- Default member role allows you to set the default level of access that members of the team have to newly created projects (co-owner, editor, or viewer). This can be changed on an individual project-by-project basis as well. + +![Sharing settings](./assets/project-access-settings.png) + :::tip -Currently it is not possible to hide projects (or remove edit access) from other members within the StackBlitz Team. Selecting Visibility: Private will only hide the project from users NOT in the Team. [Let us know](mailto:hello@stackblitz.com) if additional configurability here is important to you. +Currently it is not possible to hide projects from other members within the StackBlitz Team. Selecting Visibility: Private will only hide the project from users NOT in the Team. [Let us know](mailto:hello@stackblitz.com) if additional configurability here is important to you. ::: \ No newline at end of file diff --git a/docs/teams/private-npm-registry-integration.md b/docs/teams/private-npm-registry-integration.md index c4190e99..33a8d5c4 100644 --- a/docs/teams/private-npm-registry-integration.md +++ b/docs/teams/private-npm-registry-integration.md @@ -16,7 +16,7 @@ If you can ping/access your registry without a proxy or firewall then you can fo These items can be found in your private npm registry server settings. - [Jfrog Artifactory Documentation](https://jfrog.com/help/r/jfrog-artifactory-documentation/jfrog-artifactory) - [Sonatype Nexus Documentation](https://help.sonatype.com/repomanager3) -2. Navigate to `https://stackblitz.com/orgs/github/[YOUR_ORG_NAME]/settings` and scroll to the bottom of the page +2. Navigate to `https://stackblitz.com/orgs/github/[YOUR_ORG_NAME]/npm_registries` and scroll to the bottom of the page 3. Click “Add new registry” ![Add registry](./assets/add-registry.png) 4. Enter the URL and Access Token, and click “Add registry” diff --git a/docs/teams/setting-up-your-team.md b/docs/teams/setting-up-your-team.md index 309c33ab..6159f32e 100644 --- a/docs/teams/setting-up-your-team.md +++ b/docs/teams/setting-up-your-team.md @@ -1,5 +1,5 @@ --- -title: Setting Up Your Team +title: Managing your Team --- # {{ $frontmatter.title }} @@ -10,6 +10,8 @@ Each StackBlitz Team must be linked in a 1:1 relationship with a corresponding [ In the future we plan to support additional version control providers & Teams creation pathways. If linking to a Github Org doesn’t work for you, please [reach out](mailto:hello@stackblitz.com) and let us know how we can meet your team’s needs! ::: +## Creating a Team + To create a StackBlitz Team: 1. Navigate to https://stackblitz.com/pricing 2. Login with a Github account that has Administrator privileges for the Github Organization you will be using to create your StackBlitz Team @@ -22,7 +24,7 @@ To create a StackBlitz Team: 7. Enjoy frictionless collaboration with your team! -:::tip +## Upgrading during or after your free trial If you opt for the free trial, you will need to add a payment method before the trial expires to continue using the paid Teams features. To do so: 1. Click “Update Billing” on the trial banner @@ -33,4 +35,17 @@ If you opt for the free trial, you will need to add a payment method before the ![Payment Method](./assets/payment-method.png) Your StackBlitz Team will now automatically renew as a paid Teams plan at the end of your free trial! + +## Deleting a Team +:::danger This action cannot be undone. +All the projects and collections belonging to this organization will be deleted. Connected GitHub organization will remain intact. ::: + +To permanently delete your Team: +1. Navigate to [Settings](https://stackblitz.com/settings/billing) +2. Select the Team you want to remove from list labeled "Your teams" +3. Navigate to the `Profile` tab +4. Click `Delete team` under "Delete this organization" and confirm by clicking the prompt. + + + diff --git a/docs/teams/what-is-stackblitz-teams.md b/docs/teams/what-is-stackblitz-teams.md index 035d5057..7daa8bd6 100644 --- a/docs/teams/what-is-stackblitz-teams.md +++ b/docs/teams/what-is-stackblitz-teams.md @@ -14,7 +14,7 @@ StackBlitz Teams is designed to allow you to build the web with the web; collabo Traditionally, collaborating on coding projects required setting up complex repositories in local development environments, a high friction, low security process that introduces the classic “it works on my machine” style issues into the code collaboration process. StackBlitz Teams eliminates all of these issues by providing a consistent, performant and secure in-browser development environment where team members can collaborate seamlessly. ### Integrated with your GitHub Organization -StackBlitz Teams seamlessly integrates with your existing GitHub organization and all it’s existing permissions settings. This means that team members can easily access the workspace and collaborate on both public and private GitHub repositories without any additional configuration. +StackBlitz Teams seamlessly integrates with your existing GitHub organization and all its existing permissions settings. This means that team members can easily access the workspace and collaborate on both public and private GitHub repositories without any additional configuration. ### One-click Pull Request Reviews Say goodbye to the cumbersome process of local code reviews. With StackBlitz Teams, you can directly jump into any pull request with a single click. Our in-browser staging server makes the review process swift and efficient and ensures the code is actually executed (not just read over) before being pushed to production. diff --git a/netlify.toml b/netlify.toml index 1469e706..e13e1b91 100644 --- a/netlify.toml +++ b/netlify.toml @@ -2,3 +2,4 @@ for = "/img/*" [headers.values] Cross-Origin-Resource-Policy = "cross-origin" + Access-Control-Allow-Origin = "*" diff --git a/package-lock.json b/package-lock.json index 8e80ee16..0f71e765 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "stackblitz-docs", "version": "0.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -11,13 +11,13 @@ "@stackblitz/sdk": "^1.9.0" }, "devDependencies": { - "@types/node": "^20.8.9", - "@vue/tsconfig": "^0.4.0", - "dotenv": "^16.3.1", + "@types/node": "^20.11.30", + "@vue/tsconfig": "^0.5.1", + "dotenv": "^16.4.5", "markdown-it-footnote": "^3.0.3", - "prettier": "^3.0.3", - "sass": "^1.69.5", - "vitepress": "^1.0.0-rc.24" + "prettier": "^3.2.5", + "sass": "^1.72.0", + "vitepress": "~1.0.2" } }, "node_modules/@algolia/autocomplete-core": { @@ -66,138 +66,138 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", - "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.20.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/cache-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz", - "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", "dev": true }, "node_modules/@algolia/cache-in-memory": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz", - "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.20.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/client-account": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.20.0.tgz", - "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", "dev": true, "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-analytics": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.20.0.tgz", - "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", "dev": true, "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz", - "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-personalization": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.20.0.tgz", - "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", "dev": true, "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-search": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz", - "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", "dev": true, "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/logger-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz", - "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", "dev": true }, "node_modules/@algolia/logger-console": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.20.0.tgz", - "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", "dev": true, "dependencies": { - "@algolia/logger-common": "4.20.0" + "@algolia/logger-common": "4.22.1" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz", - "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.20.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/requester-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz", - "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", "dev": true }, "node_modules/@algolia/requester-node-http": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz", - "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.20.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/transporter": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz", - "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/requester-common": "4.20.0" + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -207,30 +207,30 @@ } }, "node_modules/@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", "dev": true }, "node_modules/@docsearch/js": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", - "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", "dev": true, "dependencies": { - "@docsearch/react": "3.5.2", + "@docsearch/react": "3.6.0", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dev": true, "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", + "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" }, "peerDependencies": { @@ -254,10 +254,26 @@ } } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -271,9 +287,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -287,9 +303,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -303,9 +319,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -319,9 +335,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -335,9 +351,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -351,9 +367,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -367,9 +383,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -383,9 +399,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -399,9 +415,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -415,9 +431,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -431,9 +447,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -447,9 +463,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -463,9 +479,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -479,9 +495,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -495,9 +511,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -511,9 +527,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -527,9 +543,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -543,9 +559,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -559,9 +575,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -575,9 +591,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -591,9 +607,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -612,21 +628,211 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.0.tgz", + "integrity": "sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.0.tgz", + "integrity": "sha512-xKn7DtA65DQV4FOfYsrvqM80xOy2xuXnxWWKsZmHv1VII/IOuDUDsWDu3KnpeLH6wqNJWp1GRoNUsHR1aw/VhQ==", + "dev": true, + "dependencies": { + "shiki": "1.2.0" + } + }, "node_modules/@stackblitz/sdk": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.9.0.tgz", "integrity": "sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ==" }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/@types/linkify-it": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", - "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", "dev": true }, "node_modules/@types/markdown-it": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.5.tgz", - "integrity": "sha512-QhJP7hkq3FCrFNx0szMNCT/79CXfcEgUIA3jc5GBfeXqoKsk3R8JZm2wRXJ2DiyjbPE4VMFOSDemLFcUTZmHEQ==", + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", "dev": true, "dependencies": { "@types/linkify-it": "*", @@ -634,182 +840,197 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", - "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/web-bluetooth": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz", - "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.1.tgz", - "integrity": "sha512-tUBEtWcF7wFtII7ayNiLNDTCE1X1afySEo+XNVMNkFXaThENyCowIEX095QqbJZGTgoOcSVDJGlnde2NG4jtbQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", "dev": true, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^4.0.0", + "vite": "^5.0.0", "vue": "^3.2.25" } }, "node_modules/@vue/compiler-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", - "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", - "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", - "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-ssr": "3.3.7", - "@vue/reactivity-transform": "3.3.7", - "@vue/shared": "3.3.7", + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.31", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", - "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==", - "dev": true + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.21.tgz", + "integrity": "sha512-hIkqpU3I9BM/qNUGhb/RAfEkRtFZTM4QFrBBH5gxGYubBIRctqgQk4ukLAkhaW+VmOw5DAPxQHXH4W6Oh36L6g==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.0.21" + } }, - "node_modules/@vue/reactivity": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", - "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", + "node_modules/@vue/devtools-kit": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.21.tgz", + "integrity": "sha512-tNDtcQkPHfLDH1wtZuSZ2ZfE+r/aGswkBmKmXjwfpZTsOTk/YXsgrMnBKtHOL6dpsG3GyP09gIgNkCkA5lBIPQ==", "dev": true, "dependencies": { - "@vue/shared": "3.3.7" + "@vue/devtools-shared": "^7.0.21", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" } }, - "node_modules/@vue/reactivity-transform": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", - "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", + "node_modules/@vue/devtools-shared": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.21.tgz", + "integrity": "sha512-wuIakRkSqwsk9+Y4z5QTdsmhTJRAt4aX0ROXyOOEPL+ROrN26YsPbXyqlzroU5uoOoAvx81iObIlmwZWtZztgw==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5" + "rfdc": "^1.3.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.21" } }, "node_modules/@vue/runtime-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", - "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", "dev": true, "dependencies": { - "@vue/reactivity": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", - "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.3.7", - "@vue/shared": "3.3.7", - "csstype": "^3.1.2" + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", - "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" }, "peerDependencies": { - "vue": "3.3.7" + "vue": "3.4.21" } }, "node_modules/@vue/shared": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", - "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", "dev": true }, "node_modules/@vue/tsconfig": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", - "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", "dev": true }, "node_modules/@vueuse/core": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz", - "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", "dev": true, "dependencies": { - "@types/web-bluetooth": "^0.0.18", - "@vueuse/metadata": "10.5.0", - "@vueuse/shared": "10.5.0", - "vue-demi": ">=0.14.6" + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "hasInstallScript": true, "bin": { @@ -833,14 +1054,14 @@ } }, "node_modules/@vueuse/integrations": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.5.0.tgz", - "integrity": "sha512-fm5sXLCK0Ww3rRnzqnCQRmfjDURaI4xMsx+T+cec0ngQqHx/JgUtm8G0vRjwtonIeTBsH1Q8L3SucE+7K7upJQ==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", "dev": true, "dependencies": { - "@vueuse/core": "10.5.0", - "@vueuse/shared": "10.5.0", - "vue-demi": ">=0.14.6" + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -899,9 +1120,9 @@ } }, "node_modules/@vueuse/integrations/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "hasInstallScript": true, "bin": { @@ -925,30 +1146,30 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz", - "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz", - "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", "dev": true, "dependencies": { - "vue-demi": ">=0.14.6" + "vue-demi": ">=0.14.7" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "hasInstallScript": true, "bin": { @@ -972,32 +1193,26 @@ } }, "node_modules/algoliasearch": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", - "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", "dev": true, "dependencies": { - "@algolia/cache-browser-local-storage": "4.20.0", - "@algolia/cache-common": "4.20.0", - "@algolia/cache-in-memory": "4.20.0", - "@algolia/client-account": "4.20.0", - "@algolia/client-analytics": "4.20.0", - "@algolia/client-common": "4.20.0", - "@algolia/client-personalization": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/logger-console": "4.20.0", - "@algolia/requester-browser-xhr": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/requester-node-http": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } }, "node_modules/anymatch": { "version": "3.1.3", @@ -1061,27 +1276,39 @@ } }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -1091,28 +1318,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/estree-walker": { @@ -1143,9 +1371,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -1168,6 +1396,12 @@ "node": ">= 6" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -1216,16 +1450,10 @@ "node": ">=0.12.0" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -1247,15 +1475,21 @@ "dev": true }, "node_modules/minisearch": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", - "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -1279,6 +1513,12 @@ "node": ">=0.10.0" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -1298,9 +1538,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -1317,18 +1557,18 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/preact": { - "version": "10.18.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.1.tgz", - "integrity": "sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==", + "version": "10.20.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", + "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", "dev": true, "funding": { "type": "opencollective", @@ -1336,9 +1576,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -1362,26 +1602,48 @@ "node": ">=8.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", "fsevents": "~2.3.2" } }, "node_modules/sass": { - "version": "1.69.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", - "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -1396,28 +1658,34 @@ } }, "node_modules/search-insights": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.8.3.tgz", - "integrity": "sha512-W9rZfQ9XEfF0O6ntgQOTI7Txc8nkZrO4eJ/pTHK0Br6wWND2sPGPoWg+yGhdIW7wMbLqk8dc23IyEtLlNGpeNw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", "dev": true, "peer": true }, "node_modules/shiki": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", - "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.0.tgz", + "integrity": "sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==", "dev": true, "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" + "@shikijs/core": "1.2.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1448,29 +1716,29 @@ "dev": true }, "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", + "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -1503,31 +1771,33 @@ } }, "node_modules/vitepress": { - "version": "1.0.0-rc.24", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.24.tgz", - "integrity": "sha512-RpnL8cnOGwiRlBbrYQUm9sYkJbtyOt/wYXk2diTcokY4yvks/5lq9LuSt+MURWB6ZqwpSNHvTmxgaSfLoG0/OA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.2.tgz", + "integrity": "sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==", "dev": true, "dependencies": { - "@docsearch/css": "^3.5.2", - "@docsearch/js": "^3.5.2", - "@types/markdown-it": "^13.0.4", - "@vitejs/plugin-vue": "4.3.1", - "@vue/devtools-api": "^6.5.1", - "@vueuse/core": "^10.5.0", - "@vueuse/integrations": "^10.5.0", + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", "focus-trap": "^7.5.4", "mark.js": "8.11.1", - "minisearch": "^6.1.0", - "shiki": "^0.14.5", - "vite": "^4.5.0", - "vue": "^3.3.6" + "minisearch": "^6.3.0", + "shiki": "^1.2.0", + "vite": "^5.2.2", + "vue": "^3.4.21" }, "bin": { "vitepress": "bin/vitepress.js" }, "peerDependencies": { - "markdown-it-mathjax3": "^4.3.2", - "postcss": "^8.4.31" + "markdown-it-mathjax3": "^4", + "postcss": "^8" }, "peerDependenciesMeta": { "markdown-it-mathjax3": { @@ -1538,29 +1808,17 @@ } } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, "node_modules/vue": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", - "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-sfc": "3.3.7", - "@vue/runtime-dom": "3.3.7", - "@vue/server-renderer": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" }, "peerDependencies": { "typescript": "*" @@ -1571,1000 +1829,5 @@ } } } - }, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "dev": true, - "requires": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "dev": true, - "requires": { - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "dev": true, - "requires": { - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "dev": true, - "requires": {} - }, - "@algolia/cache-browser-local-storage": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", - "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.20.0" - } - }, - "@algolia/cache-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz", - "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==", - "dev": true - }, - "@algolia/cache-in-memory": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz", - "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.20.0" - } - }, - "@algolia/client-account": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.20.0.tgz", - "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==", - "dev": true, - "requires": { - "@algolia/client-common": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "@algolia/client-analytics": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.20.0.tgz", - "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==", - "dev": true, - "requires": { - "@algolia/client-common": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "@algolia/client-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz", - "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "@algolia/client-personalization": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.20.0.tgz", - "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==", - "dev": true, - "requires": { - "@algolia/client-common": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "@algolia/client-search": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz", - "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==", - "dev": true, - "requires": { - "@algolia/client-common": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "@algolia/logger-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz", - "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==", - "dev": true - }, - "@algolia/logger-console": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.20.0.tgz", - "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==", - "dev": true, - "requires": { - "@algolia/logger-common": "4.20.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz", - "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.20.0" - } - }, - "@algolia/requester-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz", - "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==", - "dev": true - }, - "@algolia/requester-node-http": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz", - "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.20.0" - } - }, - "@algolia/transporter": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz", - "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/requester-common": "4.20.0" - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", - "dev": true - }, - "@docsearch/js": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", - "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", - "dev": true, - "requires": { - "@docsearch/react": "3.5.2", - "preact": "^10.0.0" - } - }, - "@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", - "dev": true, - "requires": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", - "algoliasearch": "^4.19.1" - } - }, - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, - "optional": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@stackblitz/sdk": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.9.0.tgz", - "integrity": "sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ==" - }, - "@types/linkify-it": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", - "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", - "dev": true - }, - "@types/markdown-it": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.5.tgz", - "integrity": "sha512-QhJP7hkq3FCrFNx0szMNCT/79CXfcEgUIA3jc5GBfeXqoKsk3R8JZm2wRXJ2DiyjbPE4VMFOSDemLFcUTZmHEQ==", - "dev": true, - "requires": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "@types/mdurl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", - "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", - "dev": true - }, - "@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/web-bluetooth": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz", - "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==", - "dev": true - }, - "@vitejs/plugin-vue": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.1.tgz", - "integrity": "sha512-tUBEtWcF7wFtII7ayNiLNDTCE1X1afySEo+XNVMNkFXaThENyCowIEX095QqbJZGTgoOcSVDJGlnde2NG4jtbQ==", - "dev": true, - "requires": {} - }, - "@vue/compiler-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", - "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "@vue/compiler-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", - "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", - "dev": true, - "requires": { - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "@vue/compiler-sfc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", - "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", - "dev": true, - "requires": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-ssr": "3.3.7", - "@vue/reactivity-transform": "3.3.7", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.31", - "source-map-js": "^1.0.2" - } - }, - "@vue/compiler-ssr": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", - "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==", - "dev": true - }, - "@vue/reactivity": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", - "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", - "dev": true, - "requires": { - "@vue/shared": "3.3.7" - } - }, - "@vue/reactivity-transform": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", - "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", - "dev": true, - "requires": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5" - } - }, - "@vue/runtime-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", - "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", - "dev": true, - "requires": { - "@vue/reactivity": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "@vue/runtime-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", - "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", - "dev": true, - "requires": { - "@vue/runtime-core": "3.3.7", - "@vue/shared": "3.3.7", - "csstype": "^3.1.2" - } - }, - "@vue/server-renderer": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", - "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", - "dev": true, - "requires": { - "@vue/compiler-ssr": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "@vue/shared": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", - "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==", - "dev": true - }, - "@vue/tsconfig": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", - "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", - "dev": true - }, - "@vueuse/core": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz", - "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==", - "dev": true, - "requires": { - "@types/web-bluetooth": "^0.0.18", - "@vueuse/metadata": "10.5.0", - "@vueuse/shared": "10.5.0", - "vue-demi": ">=0.14.6" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", - "dev": true, - "requires": {} - } - } - }, - "@vueuse/integrations": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.5.0.tgz", - "integrity": "sha512-fm5sXLCK0Ww3rRnzqnCQRmfjDURaI4xMsx+T+cec0ngQqHx/JgUtm8G0vRjwtonIeTBsH1Q8L3SucE+7K7upJQ==", - "dev": true, - "requires": { - "@vueuse/core": "10.5.0", - "@vueuse/shared": "10.5.0", - "vue-demi": ">=0.14.6" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", - "dev": true, - "requires": {} - } - } - }, - "@vueuse/metadata": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz", - "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==", - "dev": true - }, - "@vueuse/shared": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz", - "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==", - "dev": true, - "requires": { - "vue-demi": ">=0.14.6" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", - "dev": true, - "requires": {} - } - } - }, - "algoliasearch": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", - "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", - "dev": true, - "requires": { - "@algolia/cache-browser-local-storage": "4.20.0", - "@algolia/cache-common": "4.20.0", - "@algolia/cache-in-memory": "4.20.0", - "@algolia/client-account": "4.20.0", - "@algolia/client-analytics": "4.20.0", - "@algolia/client-common": "4.20.0", - "@algolia/client-personalization": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/logger-console": "4.20.0", - "@algolia/requester-browser-xhr": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/requester-node-http": "4.20.0", - "@algolia/transporter": "4.20.0" - } - }, - "ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "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 - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "dev": true - }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "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 - }, - "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" - } - }, - "focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", - "dev": true, - "requires": { - "tabbable": "^6.2.0" - } - }, - "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 - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-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 - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true - }, - "markdown-it-footnote": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", - "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==", - "dev": true - }, - "minisearch": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", - "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "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 - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "preact": { - "version": "10.18.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.1.tgz", - "integrity": "sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==", - "dev": true - }, - "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "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" - } - }, - "rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "sass": { - "version": "1.69.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", - "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "search-insights": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.8.3.tgz", - "integrity": "sha512-W9rZfQ9XEfF0O6ntgQOTI7Txc8nkZrO4eJ/pTHK0Br6wWND2sPGPoWg+yGhdIW7wMbLqk8dc23IyEtLlNGpeNw==", - "dev": true, - "peer": true - }, - "shiki": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", - "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", - "dev": true, - "requires": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "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" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", - "dev": true, - "requires": { - "esbuild": "^0.18.10", - "fsevents": "~2.3.2", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - } - }, - "vitepress": { - "version": "1.0.0-rc.24", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.24.tgz", - "integrity": "sha512-RpnL8cnOGwiRlBbrYQUm9sYkJbtyOt/wYXk2diTcokY4yvks/5lq9LuSt+MURWB6ZqwpSNHvTmxgaSfLoG0/OA==", - "dev": true, - "requires": { - "@docsearch/css": "^3.5.2", - "@docsearch/js": "^3.5.2", - "@types/markdown-it": "^13.0.4", - "@vitejs/plugin-vue": "4.3.1", - "@vue/devtools-api": "^6.5.1", - "@vueuse/core": "^10.5.0", - "@vueuse/integrations": "^10.5.0", - "focus-trap": "^7.5.4", - "mark.js": "8.11.1", - "minisearch": "^6.1.0", - "shiki": "^0.14.5", - "vite": "^4.5.0", - "vue": "^3.3.6" - } - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "vue": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", - "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-sfc": "3.3.7", - "@vue/runtime-dom": "3.3.7", - "@vue/server-renderer": "3.3.7", - "@vue/shared": "3.3.7" - } - } } } diff --git a/package.json b/package.json index 64e2e7a7..bf260b79 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "build": "vitepress build", "dev": "vitepress dev", - "format": "prettier --write '**/*.{js,ts,vue,css,scss}'", + "format": "prettier --write '**/*.{js,ts,css,scss}'", "serve": "vitepress serve", "start": "vitepress dev" }, @@ -13,13 +13,13 @@ "@stackblitz/sdk": "^1.9.0" }, "devDependencies": { - "@types/node": "^20.8.9", - "@vue/tsconfig": "^0.4.0", - "dotenv": "^16.3.1", + "@types/node": "^20.11.30", + "@vue/tsconfig": "^0.5.1", + "dotenv": "^16.4.5", "markdown-it-footnote": "^3.0.3", - "prettier": "^3.0.3", - "sass": "^1.69.5", - "vitepress": "^1.0.0-rc.24" + "prettier": "^3.2.5", + "sass": "^1.72.0", + "vitepress": "~1.0.2" }, "prettier": { "printWidth": 100,