From 3f2b55734b80d390b9da2fc0b0c12d78334ad4bf Mon Sep 17 00:00:00 2001 From: mrKazzila Date: Fri, 18 Sep 2026 11:35:04 +0300 Subject: [PATCH] feat: add VitePress website with GitHub Pages deployment --- .github/workflows/pages.yml | 52 + .gitignore | 3 + CONTRIBUTING.md | 19 + README.md | 2 + docs-site/.vitepress/.temp/app.js | 5169 +++++++++++++++++ .../.temp/assets/style.BUGfHx7t.css | 4863 ++++++++++++++++ .../.vitepress/.temp/docs_path-rules.md.js | 20 + .../.vitepress/.temp/docs_path-tester.md.js | 20 + .../.temp/docs_troubleshooting.md.js | 19 + docs-site/.vitepress/.temp/faq.md.js | 19 + .../guides_make-all-notes-read-only.md.js | 19 + .../.temp/guides_make-folder-read-only.md.js | 19 + .../.temp/guides_make-note-read-only.md.js | 19 + .../.temp/guides_mobile-reading-view.md.js | 19 + .../guides_prevent-accidental-editing.md.js | 19 + docs-site/.vitepress/.temp/index.md.js | 20 + docs-site/.vitepress/.temp/package.json | 1 + .../plugin-vue_export-helper.1tPrXgE0.js | 10 + docs-site/.vitepress/.temp/robots.txt | 4 + docs-site/.vitepress/config.ts | 64 + docs-site/.vitepress/theme/index.ts | 4 + docs-site/.vitepress/theme/style.css | 15 + docs-site/docs/path-rules.md | 114 + docs-site/docs/path-tester.md | 43 + docs-site/docs/troubleshooting.md | 46 + docs-site/faq.md | 93 + docs-site/guides/make-all-notes-read-only.md | 85 + docs-site/guides/make-folder-read-only.md | 84 + docs-site/guides/make-note-read-only.md | 44 + docs-site/guides/mobile-reading-view.md | 37 + .../guides/prevent-accidental-editing.md | 36 + docs-site/index.md | 65 + docs-site/public/robots.txt | 4 + docs/PROJECT_STATE.md | 13 + eslint.config.mts | 1 + package-lock.json | 2511 +++++++- package.json | 6 +- 37 files changed, 13577 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/pages.yml create mode 100644 docs-site/.vitepress/.temp/app.js create mode 100644 docs-site/.vitepress/.temp/assets/style.BUGfHx7t.css create mode 100644 docs-site/.vitepress/.temp/docs_path-rules.md.js create mode 100644 docs-site/.vitepress/.temp/docs_path-tester.md.js create mode 100644 docs-site/.vitepress/.temp/docs_troubleshooting.md.js create mode 100644 docs-site/.vitepress/.temp/faq.md.js create mode 100644 docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js create mode 100644 docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js create mode 100644 docs-site/.vitepress/.temp/guides_make-note-read-only.md.js create mode 100644 docs-site/.vitepress/.temp/guides_mobile-reading-view.md.js create mode 100644 docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js create mode 100644 docs-site/.vitepress/.temp/index.md.js create mode 100644 docs-site/.vitepress/.temp/package.json create mode 100644 docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js create mode 100644 docs-site/.vitepress/.temp/robots.txt create mode 100644 docs-site/.vitepress/config.ts create mode 100644 docs-site/.vitepress/theme/index.ts create mode 100644 docs-site/.vitepress/theme/style.css create mode 100644 docs-site/docs/path-rules.md create mode 100644 docs-site/docs/path-tester.md create mode 100644 docs-site/docs/troubleshooting.md create mode 100644 docs-site/faq.md create mode 100644 docs-site/guides/make-all-notes-read-only.md create mode 100644 docs-site/guides/make-folder-read-only.md create mode 100644 docs-site/guides/make-note-read-only.md create mode 100644 docs-site/guides/mobile-reading-view.md create mode 100644 docs-site/guides/prevent-accidental-editing.md create mode 100644 docs-site/index.md create mode 100644 docs-site/public/robots.txt diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..51a1a53 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,52 @@ +name: Documentation website + +on: + push: + branches: [master] + pull_request: + branches: [master] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: pages-${{ github.event_name == 'pull_request' && github.ref || 'production' }} + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: npm + - name: Install dependencies + run: npm ci + - name: Build website and check Markdown links + run: npm run docs:build + - name: Configure Pages + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' + uses: actions/configure-pages@v5 + - name: Upload Pages artifact + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' + uses: actions/upload-pages-artifact@v3 + with: + path: docs-site/.vitepress/dist + + deploy: + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' + needs: build + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 45535e6..bac59b7 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ pnpm-debug.log* # python **/__pycache__ + +# VitePress cache +docs-site/.vitepress/cache/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41b90ed..a0f309b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,6 +36,25 @@ npm test npm run lint ``` +## Documentation website + +The public VitePress site lives in `docs-site/`; `docs/` remains internal project documentation and the source of shared screenshots. Use Node.js 22.18+ (Node 22 is also used in CI) and the root npm lockfile: + +```bash +npm ci +npm run docs:dev +npm run docs:build +npm run docs:preview +``` + +Open the URL printed by VitePress, including `/Read-Only-View/`. The build checks Markdown links and writes `docs-site/.vitepress/dist/`. Preview that production build to check images and navigation under the repository base path. VitePress configuration and theme files are separate from the Obsidian runtime lint configuration; validate them with the site build. + +Reuse images from `docs/images/` with relative Markdown image links; Vite includes them in the site's output without maintaining duplicate source copies. Give each page a unique frontmatter title and description. Canonical URLs and Open Graph tags are generated from page metadata; the homepage also includes factual SoftwareApplication JSON-LD. There is no standalone favicon asset in the current repository, so the site does not invent one. + +`.github/workflows/pages.yml` builds pull requests and deploys pushes to `master` through the official Pages artifact/deploy actions. In GitHub **Settings → Pages → Build and deployment → Source**, select **GitHub Actions**. Merge the site changes into `master` (or run **Documentation website** manually on `master`). The resulting URL is . Existing plugin CI and release workflows are independent. + +The site emits `sitemap.xml` and `robots.txt`. Because this is a project site, its robots file lives at `/Read-Only-View/robots.txt`; crawlers only use robots directives at the origin root. If you maintain `mrkazzila.github.io`, add the sitemap URL to its root robots file, or submit the sitemap directly in your search-engine webmaster tools. + ## Development workflow ### 1) Run in Obsidian diff --git a/README.md b/README.md index 3bf02e3..e8d824b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ Keep Markdown notes in Obsidian Reading view, either across the whole vault or o Privacy: Read Only View makes no network requests, and all rule matching stays local. When you import an absolute system path, the plugin stores only its portable path inside the vault, not the full local path. +Documentation: https://mrkazzila.github.io/Read-Only-View/ + ## What it does Read Only View keeps matching `.md` notes in Reading view to help prevent accidental edits. diff --git a/docs-site/.vitepress/.temp/app.js b/docs-site/.vitepress/.temp/app.js new file mode 100644 index 0000000..79647d4 --- /dev/null +++ b/docs-site/.vitepress/.temp/app.js @@ -0,0 +1,5169 @@ +import { ssrRenderAttrs, ssrRenderSlot, ssrInterpolate, ssrRenderAttr, ssrRenderList, ssrRenderComponent, ssrRenderVNode, ssrRenderClass, renderToString } from "vue/server-renderer"; +import { defineComponent, mergeProps, useSSRContext, shallowRef, inject, computed, ref, watch, onUnmounted, reactive, markRaw, readonly, nextTick, h, unref, onMounted, watchEffect, watchPostEffect, onUpdated, resolveComponent, createVNode, resolveDynamicComponent, withCtx, renderSlot, createTextVNode, toDisplayString, openBlock, createBlock, createCommentVNode, Fragment, renderList, provide, toHandlers, withKeys, onBeforeUnmount, useSlots, createSSRApp } from "vue"; +import { usePreferredDark, useDark, useMediaQuery, useWindowSize, onKeyStroke, useWindowScroll, useScrollLock } from "@vueuse/core"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const _sfc_main$14 = /* @__PURE__ */ defineComponent({ + __name: "VPBadge", + __ssrInlineRender: true, + props: { + text: {}, + type: { default: "tip" } + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderSlot(_ctx.$slots, "default", {}, () => { + _push(`${ssrInterpolate(__props.text)}`); + }, _push, _parent); + _push(``); + }; + } +}); +const _sfc_setup$14 = _sfc_main$14.setup; +_sfc_main$14.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue"); + return _sfc_setup$14 ? _sfc_setup$14(props, ctx) : void 0; +}; +function deserializeFunctions(r) { + return Array.isArray(r) ? r.map(deserializeFunctions) : typeof r == "object" && r !== null ? Object.keys(r).reduce((t, n) => (t[n] = deserializeFunctions(r[n]), t), {}) : typeof r == "string" && r.startsWith("_vp-fn_") ? new Function(`return ${r.slice(7)}`)() : r; +} +const siteData = deserializeFunctions(JSON.parse('{"lang":"en-US","dir":"ltr","title":"Read Only View","description":"Keep selected Obsidian notes in Reading view and prevent accidental edits with local include and exclude path rules.","base":"/Read-Only-View/","head":[],"router":{"prefetchLinks":true},"appearance":true,"themeConfig":{"nav":[{"text":"Guides","link":"/guides/make-note-read-only"},{"text":"Path rules","link":"/docs/path-rules"},{"text":"FAQ","link":"/faq"}],"sidebar":[{"text":"Guides","items":[{"text":"Keep all notes in Reading view","link":"/guides/make-all-notes-read-only"},{"text":"Make a note read-only","link":"/guides/make-note-read-only"},{"text":"Make a folder read-only","link":"/guides/make-folder-read-only"},{"text":"Prevent accidental editing","link":"/guides/prevent-accidental-editing"},{"text":"Reading view on mobile","link":"/guides/mobile-reading-view"}]},{"text":"Documentation","items":[{"text":"Path rules","link":"/docs/path-rules"},{"text":"Path tester","link":"/docs/path-tester"},{"text":"Troubleshooting","link":"/docs/troubleshooting"},{"text":"FAQ","link":"/faq"}]}],"socialLinks":[{"icon":"github","link":"https://github.com/mrKazzila/Read-Only-View"}],"footer":{"message":"Released under the 0BSD license."}},"locales":{},"scrollOffset":134,"cleanUrls":true}')); +const __vite_import_meta_env__ = {}; +const EXTERNAL_URL_RE = /^(?:[a-z]+:|\/\/)/i; +const APPEARANCE_KEY = "vitepress-theme-appearance"; +const HASH_RE = /#.*$/; +const HASH_OR_QUERY_RE = /[?#].*$/; +const INDEX_OR_EXT_RE = /(?:(^|\/)index)?\.(?:md|html)$/; +const inBrowser = typeof document !== "undefined"; +const notFoundPageData = { + relativePath: "404.md", + filePath: "", + title: "404", + description: "Not Found", + headers: [], + frontmatter: { sidebar: false, layout: "page" }, + lastUpdated: 0, + isNotFound: true +}; +function isActive(currentPath, matchPath, asRegex = false) { + if (matchPath === void 0) { + return false; + } + currentPath = normalize(`/${currentPath}`); + if (asRegex) { + return new RegExp(matchPath).test(currentPath); + } + if (normalize(matchPath) !== currentPath) { + return false; + } + const hashMatch = matchPath.match(HASH_RE); + if (hashMatch) { + return (inBrowser ? location.hash : "") === hashMatch[0]; + } + return true; +} +function normalize(path) { + return decodeURI(path).replace(HASH_OR_QUERY_RE, "").replace(INDEX_OR_EXT_RE, "$1"); +} +function isExternal(path) { + return EXTERNAL_URL_RE.test(path); +} +function getLocaleForPath(siteData2, relativePath) { + return Object.keys((siteData2 == null ? void 0 : siteData2.locales) || {}).find((key) => key !== "root" && !isExternal(key) && isActive(relativePath, `/${key}/`, true)) || "root"; +} +function resolveSiteDataByRoute(siteData2, relativePath) { + var _a, _b, _c, _d, _e, _f, _g; + const localeIndex = getLocaleForPath(siteData2, relativePath); + return Object.assign({}, siteData2, { + localeIndex, + lang: ((_a = siteData2.locales[localeIndex]) == null ? void 0 : _a.lang) ?? siteData2.lang, + dir: ((_b = siteData2.locales[localeIndex]) == null ? void 0 : _b.dir) ?? siteData2.dir, + title: ((_c = siteData2.locales[localeIndex]) == null ? void 0 : _c.title) ?? siteData2.title, + titleTemplate: ((_d = siteData2.locales[localeIndex]) == null ? void 0 : _d.titleTemplate) ?? siteData2.titleTemplate, + description: ((_e = siteData2.locales[localeIndex]) == null ? void 0 : _e.description) ?? siteData2.description, + head: mergeHead(siteData2.head, ((_f = siteData2.locales[localeIndex]) == null ? void 0 : _f.head) ?? []), + themeConfig: { + ...siteData2.themeConfig, + ...(_g = siteData2.locales[localeIndex]) == null ? void 0 : _g.themeConfig + } + }); +} +function createTitle(siteData2, pageData) { + const title = pageData.title || siteData2.title; + const template = pageData.titleTemplate ?? siteData2.titleTemplate; + if (typeof template === "string" && template.includes(":title")) { + return template.replace(/:title/g, title); + } + const templateString = createTitleTemplate(siteData2.title, template); + if (title === templateString.slice(3)) { + return title; + } + return `${title}${templateString}`; +} +function createTitleTemplate(siteTitle, template) { + if (template === false) { + return ""; + } + if (template === true || template === void 0) { + return ` | ${siteTitle}`; + } + if (siteTitle === template) { + return ""; + } + return ` | ${template}`; +} +function hasTag(head, tag) { + const [tagType, tagAttrs] = tag; + if (tagType !== "meta") + return false; + const keyAttr = Object.entries(tagAttrs)[0]; + if (keyAttr == null) + return false; + return head.some(([type, attrs]) => type === tagType && attrs[keyAttr[0]] === keyAttr[1]); +} +function mergeHead(prev, curr) { + return [...prev.filter((tagAttrs) => !hasTag(curr, tagAttrs)), ...curr]; +} +const INVALID_CHAR_REGEX = /[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g; +const DRIVE_LETTER_REGEX = /^[a-z]:/i; +function sanitizeFileName(name) { + const match = DRIVE_LETTER_REGEX.exec(name); + const driveLetter = match ? match[0] : ""; + return driveLetter + name.slice(driveLetter.length).replace(INVALID_CHAR_REGEX, "_").replace(/(^|\/)_+(?=[^/]*$)/, "$1"); +} +const KNOWN_EXTENSIONS = /* @__PURE__ */ new Set(); +function treatAsHtml(filename) { + var _a; + if (KNOWN_EXTENSIONS.size === 0) { + const extraExts = typeof process === "object" && ((_a = process.env) == null ? void 0 : _a.VITE_EXTRA_EXTENSIONS) || (__vite_import_meta_env__ == null ? void 0 : __vite_import_meta_env__.VITE_EXTRA_EXTENSIONS) || ""; + ("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip" + (extraExts && typeof extraExts === "string" ? "," + extraExts : "")).split(",").forEach((ext2) => KNOWN_EXTENSIONS.add(ext2)); + } + const ext = filename.split(".").pop(); + return ext == null || !KNOWN_EXTENSIONS.has(ext.toLowerCase()); +} +const dataSymbol = Symbol(); +const siteDataRef = shallowRef(siteData); +function initData(route) { + const site = computed(() => resolveSiteDataByRoute(siteDataRef.value, route.data.relativePath)); + const appearance = site.value.appearance; + const isDark = appearance === "force-dark" ? ref(true) : appearance === "force-auto" ? usePreferredDark() : appearance ? useDark({ + storageKey: APPEARANCE_KEY, + initialValue: () => appearance === "dark" ? "dark" : "auto", + ...typeof appearance === "object" ? appearance : {} + }) : ref(false); + const hashRef = ref(inBrowser ? location.hash : ""); + if (inBrowser) { + window.addEventListener("hashchange", () => { + hashRef.value = location.hash; + }); + } + watch(() => route.data, () => { + hashRef.value = inBrowser ? location.hash : ""; + }); + return { + site, + theme: computed(() => site.value.themeConfig), + page: computed(() => route.data), + frontmatter: computed(() => route.data.frontmatter), + params: computed(() => route.data.params), + lang: computed(() => site.value.lang), + dir: computed(() => route.data.frontmatter.dir || site.value.dir), + localeIndex: computed(() => site.value.localeIndex || "root"), + title: computed(() => createTitle(site.value, route.data)), + description: computed(() => route.data.description || site.value.description), + isDark, + hash: computed(() => hashRef.value) + }; +} +function useData$1() { + const data = inject(dataSymbol); + if (!data) { + throw new Error("vitepress data not properly injected in app"); + } + return data; +} +function joinPath(base, path) { + return `${base}${path}`.replace(/\/+/g, "/"); +} +function withBase(path) { + return EXTERNAL_URL_RE.test(path) || !path.startsWith("/") ? path : joinPath(siteDataRef.value.base, path); +} +function pathToFile(path) { + let pagePath = path.replace(/\.html$/, ""); + pagePath = decodeURIComponent(pagePath); + pagePath = pagePath.replace(/\/$/, "/index"); + { + if (inBrowser) { + const base = "/Read-Only-View/"; + pagePath = sanitizeFileName(pagePath.slice(base.length).replace(/\//g, "_") || "index") + ".md"; + let pageHash = __VP_HASH_MAP__[pagePath.toLowerCase()]; + if (!pageHash) { + pagePath = pagePath.endsWith("_index.md") ? pagePath.slice(0, -9) + ".md" : pagePath.slice(0, -3) + "_index.md"; + pageHash = __VP_HASH_MAP__[pagePath.toLowerCase()]; + } + if (!pageHash) + return null; + pagePath = `${base}${"assets"}/${pagePath}.${pageHash}.js`; + } else { + pagePath = `./${sanitizeFileName(pagePath.slice(1).replace(/\//g, "_"))}.md.js`; + } + } + return pagePath; +} +let contentUpdatedCallbacks = []; +function onContentUpdated(fn) { + contentUpdatedCallbacks.push(fn); + onUnmounted(() => { + contentUpdatedCallbacks = contentUpdatedCallbacks.filter((f) => f !== fn); + }); +} +function getScrollOffset() { + let scrollOffset = siteDataRef.value.scrollOffset; + let offset = 0; + let padding = 24; + if (typeof scrollOffset === "object" && "padding" in scrollOffset) { + padding = scrollOffset.padding; + scrollOffset = scrollOffset.selector; + } + if (typeof scrollOffset === "number") { + offset = scrollOffset; + } else if (typeof scrollOffset === "string") { + offset = tryOffsetSelector(scrollOffset, padding); + } else if (Array.isArray(scrollOffset)) { + for (const selector of scrollOffset) { + const res = tryOffsetSelector(selector, padding); + if (res) { + offset = res; + break; + } + } + } + return offset; +} +function tryOffsetSelector(selector, padding) { + const el = document.querySelector(selector); + if (!el) + return 0; + const bot = el.getBoundingClientRect().bottom; + if (bot < 0) + return 0; + return bot + padding; +} +const RouterSymbol = Symbol(); +const fakeHost = "http://a.com"; +const getDefaultRoute = () => ({ + path: "/", + component: null, + data: notFoundPageData +}); +function createRouter(loadPageModule, fallbackComponent) { + const route = reactive(getDefaultRoute()); + const router = { + route, + go + }; + async function go(href = inBrowser ? location.href : "/") { + var _a, _b; + href = normalizeHref(href); + if (await ((_a = router.onBeforeRouteChange) == null ? void 0 : _a.call(router, href)) === false) + return; + if (inBrowser && href !== normalizeHref(location.href)) { + history.replaceState({ scrollPosition: window.scrollY }, ""); + history.pushState({}, "", href); + } + await loadPage(href); + await ((_b = router.onAfterRouteChange ?? router.onAfterRouteChanged) == null ? void 0 : _b(href)); + } + let latestPendingPath = null; + async function loadPage(href, scrollPosition = 0, isRetry = false) { + var _a, _b; + if (await ((_a = router.onBeforePageLoad) == null ? void 0 : _a.call(router, href)) === false) + return; + const targetLoc = new URL(href, fakeHost); + const pendingPath = latestPendingPath = targetLoc.pathname; + try { + let page = await loadPageModule(pendingPath); + if (!page) { + throw new Error(`Page not found: ${pendingPath}`); + } + if (latestPendingPath === pendingPath) { + latestPendingPath = null; + const { default: comp, __pageData } = page; + if (!comp) { + throw new Error(`Invalid route component: ${comp}`); + } + await ((_b = router.onAfterPageLoad) == null ? void 0 : _b.call(router, href)); + route.path = inBrowser ? pendingPath : withBase(pendingPath); + route.component = markRaw(comp); + route.data = true ? markRaw(__pageData) : readonly(__pageData); + if (inBrowser) { + nextTick(() => { + let actualPathname = siteDataRef.value.base + __pageData.relativePath.replace(/(?:(^|\/)index)?\.md$/, "$1"); + if (!siteDataRef.value.cleanUrls && !actualPathname.endsWith("/")) { + actualPathname += ".html"; + } + if (actualPathname !== targetLoc.pathname) { + targetLoc.pathname = actualPathname; + href = actualPathname + targetLoc.search + targetLoc.hash; + history.replaceState({}, "", href); + } + if (targetLoc.hash && !scrollPosition) { + let target = null; + try { + target = document.getElementById(decodeURIComponent(targetLoc.hash).slice(1)); + } catch (e) { + console.warn(e); + } + if (target) { + scrollTo(target, targetLoc.hash); + return; + } + } + window.scrollTo(0, scrollPosition); + }); + } + } + } catch (err) { + if (!/fetch|Page not found/.test(err.message) && !/^\/404(\.html|\/)?$/.test(href)) { + console.error(err); + } + if (!isRetry) { + try { + const res = await fetch(siteDataRef.value.base + "hashmap.json"); + window.__VP_HASH_MAP__ = await res.json(); + await loadPage(href, scrollPosition, true); + return; + } catch (e) { + } + } + if (latestPendingPath === pendingPath) { + latestPendingPath = null; + route.path = inBrowser ? pendingPath : withBase(pendingPath); + route.component = fallbackComponent ? markRaw(fallbackComponent) : null; + const relativePath = inBrowser ? pendingPath.replace(/(^|\/)$/, "$1index").replace(/(\.html)?$/, ".md").replace(/^\//, "") : "404.md"; + route.data = { ...notFoundPageData, relativePath }; + } + } + } + if (inBrowser) { + if (history.state === null) { + history.replaceState({}, ""); + } + window.addEventListener("click", (e) => { + if (e.defaultPrevented || !(e.target instanceof Element) || e.target.closest("button") || // temporary fix for docsearch action buttons + e.button !== 0 || e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) + return; + const link2 = e.target.closest("a"); + if (!link2 || link2.closest(".vp-raw") || link2.hasAttribute("download") || link2.hasAttribute("target")) + return; + const linkHref = link2.getAttribute("href") ?? (link2 instanceof SVGAElement ? link2.getAttribute("xlink:href") : null); + if (linkHref == null) + return; + const { href, origin, pathname, hash, search } = new URL(linkHref, link2.baseURI); + const currentUrl = new URL(location.href); + if (origin === currentUrl.origin && treatAsHtml(pathname)) { + e.preventDefault(); + if (pathname === currentUrl.pathname && search === currentUrl.search) { + if (hash !== currentUrl.hash) { + history.pushState({}, "", href); + window.dispatchEvent(new HashChangeEvent("hashchange", { + oldURL: currentUrl.href, + newURL: href + })); + } + if (hash) { + scrollTo(link2, hash, link2.classList.contains("header-anchor")); + } else { + window.scrollTo(0, 0); + } + } else { + go(href); + } + } + }, { capture: true }); + window.addEventListener("popstate", async (e) => { + var _a; + if (e.state === null) + return; + const href = normalizeHref(location.href); + await loadPage(href, e.state && e.state.scrollPosition || 0); + await ((_a = router.onAfterRouteChange ?? router.onAfterRouteChanged) == null ? void 0 : _a(href)); + }); + window.addEventListener("hashchange", (e) => { + e.preventDefault(); + }); + } + return router; +} +function useRouter() { + const router = inject(RouterSymbol); + if (!router) { + throw new Error("useRouter() is called without provider."); + } + return router; +} +function useRoute() { + return useRouter().route; +} +function scrollTo(el, hash, smooth = false) { + let target = null; + try { + target = el.classList.contains("header-anchor") ? el : document.getElementById(decodeURIComponent(hash).slice(1)); + } catch (e) { + console.warn(e); + } + if (target) { + let scrollToTarget = function() { + if (!smooth || Math.abs(targetTop - window.scrollY) > window.innerHeight) + window.scrollTo(0, targetTop); + else + window.scrollTo({ left: 0, top: targetTop, behavior: "smooth" }); + }; + const targetPadding = parseInt(window.getComputedStyle(target).paddingTop, 10); + const targetTop = window.scrollY + target.getBoundingClientRect().top - getScrollOffset() + targetPadding; + requestAnimationFrame(scrollToTarget); + } +} +function normalizeHref(href) { + const url = new URL(href, fakeHost); + url.pathname = url.pathname.replace(/(^|\/)index(\.html)?$/, "$1"); + if (siteDataRef.value.cleanUrls) + url.pathname = url.pathname.replace(/\.html$/, ""); + else if (!url.pathname.endsWith("/") && !url.pathname.endsWith(".html")) + url.pathname += ".html"; + return url.pathname + url.search + url.hash; +} +const runCbs = () => contentUpdatedCallbacks.forEach((fn) => fn()); +const Content = defineComponent({ + name: "VitePressContent", + props: { + as: { type: [Object, String], default: "div" } + }, + setup(props) { + const route = useRoute(); + const { frontmatter, site } = useData$1(); + watch(frontmatter, runCbs, { deep: true, flush: "post" }); + return () => h(props.as, site.value.contentProps ?? { style: { position: "relative" } }, [ + route.component ? h(route.component, { + onVnodeMounted: runCbs, + onVnodeUpdated: runCbs, + onVnodeUnmounted: runCbs + }) : "404 Page Not Found" + ]); + } +}); +const _sfc_main$13 = /* @__PURE__ */ defineComponent({ + __name: "VPBackdrop", + __ssrInlineRender: true, + props: { + show: { type: Boolean } + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + if (__props.show) { + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$13 = _sfc_main$13.setup; +_sfc_main$13.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPBackdrop.vue"); + return _sfc_setup$13 ? _sfc_setup$13(props, ctx) : void 0; +}; +const VPBackdrop = /* @__PURE__ */ _export_sfc(_sfc_main$13, [["__scopeId", "data-v-c79a1216"]]); +const useData = useData$1; +function throttleAndDebounce(fn, delay) { + let timeoutId; + let called = false; + return () => { + if (timeoutId) + clearTimeout(timeoutId); + if (!called) { + fn(); + (called = true) && setTimeout(() => called = false, delay); + } else + timeoutId = setTimeout(fn, delay); + }; +} +function ensureStartingSlash(path) { + return path.startsWith("/") ? path : `/${path}`; +} +function normalizeLink$1(url) { + const { pathname, search, hash, protocol } = new URL(url, "http://a.com"); + if (isExternal(url) || url.startsWith("#") || !protocol.startsWith("http") || !treatAsHtml(pathname)) + return url; + const { site } = useData(); + const normalizedPath = pathname.endsWith("/") || pathname.endsWith(".html") ? url : url.replace(/(?:(^\.+)\/)?.*$/, `$1${pathname.replace(/(\.md)?$/, site.value.cleanUrls ? "" : ".html")}${search}${hash}`); + return withBase(normalizedPath); +} +function useLangs({ correspondingLink = false } = {}) { + const { site, localeIndex, page, theme: theme2, hash } = useData(); + const currentLang = computed(() => { + var _a, _b; + return { + label: (_a = site.value.locales[localeIndex.value]) == null ? void 0 : _a.label, + link: ((_b = site.value.locales[localeIndex.value]) == null ? void 0 : _b.link) || (localeIndex.value === "root" ? "/" : `/${localeIndex.value}/`) + }; + }); + const localeLinks = computed(() => Object.entries(site.value.locales).flatMap(([key, value]) => currentLang.value.label === value.label ? [] : { + text: value.label, + link: normalizeLink(value.link || (key === "root" ? "/" : `/${key}/`), theme2.value.i18nRouting !== false && correspondingLink, page.value.relativePath.slice(currentLang.value.link.length - 1), !site.value.cleanUrls) + hash.value + })); + return { localeLinks, currentLang }; +} +function normalizeLink(link2, addPath, path, addExt) { + return addPath ? link2.replace(/\/$/, "") + ensureStartingSlash(path.replace(/(^|\/)index\.md$/, "$1").replace(/\.md$/, addExt ? ".html" : "")) : link2; +} +const _sfc_main$12 = /* @__PURE__ */ defineComponent({ + __name: "NotFound", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + const { currentLang } = useLangs(); + return (_ctx, _push, _parent, _attrs) => { + var _a, _b, _c, _d, _e; + _push(`

${ssrInterpolate(((_a = unref(theme2).notFound) == null ? void 0 : _a.code) ?? "404")}

${ssrInterpolate(((_b = unref(theme2).notFound) == null ? void 0 : _b.title) ?? "PAGE NOT FOUND")}

${ssrInterpolate(((_c = unref(theme2).notFound) == null ? void 0 : _c.quote) ?? "But if you don't change your direction, and if you keep looking, you may end up where you are heading.")}
`); + }; + } +}); +const _sfc_setup$12 = _sfc_main$12.setup; +_sfc_main$12.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/NotFound.vue"); + return _sfc_setup$12 ? _sfc_setup$12(props, ctx) : void 0; +}; +const NotFound = /* @__PURE__ */ _export_sfc(_sfc_main$12, [["__scopeId", "data-v-d6be1790"]]); +function getSidebar(_sidebar, path) { + if (Array.isArray(_sidebar)) + return addBase(_sidebar); + if (_sidebar == null) + return []; + path = ensureStartingSlash(path); + const dir = Object.keys(_sidebar).sort((a, b) => { + return b.split("/").length - a.split("/").length; + }).find((dir2) => { + return path.startsWith(ensureStartingSlash(dir2)); + }); + const sidebar = dir ? _sidebar[dir] : []; + return Array.isArray(sidebar) ? addBase(sidebar) : addBase(sidebar.items, sidebar.base); +} +function getSidebarGroups(sidebar) { + const groups = []; + let lastGroupIndex = 0; + for (const index in sidebar) { + const item = sidebar[index]; + if (item.items) { + lastGroupIndex = groups.push(item); + continue; + } + if (!groups[lastGroupIndex]) { + groups.push({ items: [] }); + } + groups[lastGroupIndex].items.push(item); + } + return groups; +} +function getFlatSideBarLinks(sidebar) { + const links = []; + function recursivelyExtractLinks(items) { + for (const item of items) { + if (item.text && item.link) { + links.push({ + text: item.text, + link: item.link, + docFooterText: item.docFooterText + }); + } + if (item.items) { + recursivelyExtractLinks(item.items); + } + } + } + recursivelyExtractLinks(sidebar); + return links; +} +function hasActiveLink(path, items) { + if (Array.isArray(items)) { + return items.some((item) => hasActiveLink(path, item)); + } + return isActive(path, items.link) ? true : items.items ? hasActiveLink(path, items.items) : false; +} +function addBase(items, _base) { + return [...items].map((_item) => { + const item = { ..._item }; + const base = item.base || _base; + if (base && item.link) + item.link = base + item.link; + if (item.items) + item.items = addBase(item.items, base); + return item; + }); +} +function useSidebar() { + const { frontmatter, page, theme: theme2 } = useData(); + const is960 = useMediaQuery("(min-width: 960px)"); + const isOpen = ref(false); + const _sidebar = computed(() => { + const sidebarConfig = theme2.value.sidebar; + const relativePath = page.value.relativePath; + return sidebarConfig ? getSidebar(sidebarConfig, relativePath) : []; + }); + const sidebar = ref(_sidebar.value); + watch(_sidebar, (next, prev) => { + if (JSON.stringify(next) !== JSON.stringify(prev)) + sidebar.value = _sidebar.value; + }); + const hasSidebar = computed(() => { + return frontmatter.value.sidebar !== false && sidebar.value.length > 0 && frontmatter.value.layout !== "home"; + }); + const leftAside = computed(() => { + if (hasAside) + return frontmatter.value.aside == null ? theme2.value.aside === "left" : frontmatter.value.aside === "left"; + return false; + }); + const hasAside = computed(() => { + if (frontmatter.value.layout === "home") + return false; + if (frontmatter.value.aside != null) + return !!frontmatter.value.aside; + return theme2.value.aside !== false; + }); + const isSidebarEnabled = computed(() => hasSidebar.value && is960.value); + const sidebarGroups = computed(() => { + return hasSidebar.value ? getSidebarGroups(sidebar.value) : []; + }); + function open() { + isOpen.value = true; + } + function close() { + isOpen.value = false; + } + function toggle() { + isOpen.value ? close() : open(); + } + return { + isOpen, + sidebar, + sidebarGroups, + hasSidebar, + hasAside, + leftAside, + isSidebarEnabled, + open, + close, + toggle + }; +} +function useCloseSidebarOnEscape(isOpen, close) { + let triggerElement; + watchEffect(() => { + triggerElement = isOpen.value ? document.activeElement : void 0; + }); + onMounted(() => { + window.addEventListener("keyup", onEscape); + }); + onUnmounted(() => { + window.removeEventListener("keyup", onEscape); + }); + function onEscape(e) { + if (e.key === "Escape" && isOpen.value) { + close(); + triggerElement == null ? void 0 : triggerElement.focus(); + } + } +} +function useSidebarControl(item) { + const { page, hash } = useData(); + const collapsed = ref(false); + const collapsible = computed(() => { + return item.value.collapsed != null; + }); + const isLink = computed(() => { + return !!item.value.link; + }); + const isActiveLink = ref(false); + const updateIsActiveLink = () => { + isActiveLink.value = isActive(page.value.relativePath, item.value.link); + }; + watch([page, item, hash], updateIsActiveLink); + onMounted(updateIsActiveLink); + const hasActiveLink$1 = computed(() => { + if (isActiveLink.value) { + return true; + } + return item.value.items ? hasActiveLink(page.value.relativePath, item.value.items) : false; + }); + const hasChildren = computed(() => { + return !!(item.value.items && item.value.items.length); + }); + watchEffect(() => { + collapsed.value = !!(collapsible.value && item.value.collapsed); + }); + watchPostEffect(() => { + (isActiveLink.value || hasActiveLink$1.value) && (collapsed.value = false); + }); + function toggle() { + if (collapsible.value) { + collapsed.value = !collapsed.value; + } + } + return { + collapsed, + collapsible, + isLink, + isActiveLink, + hasActiveLink: hasActiveLink$1, + hasChildren, + toggle + }; +} +function useAside() { + const { hasSidebar } = useSidebar(); + const is960 = useMediaQuery("(min-width: 960px)"); + const is1280 = useMediaQuery("(min-width: 1280px)"); + const isAsideEnabled = computed(() => { + if (!is1280.value && !is960.value) { + return false; + } + return hasSidebar.value ? is1280.value : is960.value; + }); + return { + isAsideEnabled + }; +} +const ignoreRE = /\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/; +const resolvedHeaders = []; +function resolveTitle(theme2) { + return typeof theme2.outline === "object" && !Array.isArray(theme2.outline) && theme2.outline.label || theme2.outlineTitle || "On this page"; +} +function getHeaders(range) { + const headers = [ + ...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)") + ].filter((el) => el.id && el.hasChildNodes()).map((el) => { + const level = Number(el.tagName[1]); + return { + element: el, + title: serializeHeader(el), + link: "#" + el.id, + level + }; + }); + return resolveHeaders(headers, range); +} +function serializeHeader(h2) { + let ret = ""; + for (const node of h2.childNodes) { + if (node.nodeType === 1) { + if (ignoreRE.test(node.className)) + continue; + ret += node.textContent; + } else if (node.nodeType === 3) { + ret += node.textContent; + } + } + return ret.trim(); +} +function resolveHeaders(headers, range) { + if (range === false) { + return []; + } + const levelsRange = (typeof range === "object" && !Array.isArray(range) ? range.level : range) || 2; + const [high, low] = typeof levelsRange === "number" ? [levelsRange, levelsRange] : levelsRange === "deep" ? [2, 6] : levelsRange; + return buildTree(headers, high, low); +} +function useActiveAnchor(container, marker) { + const { isAsideEnabled } = useAside(); + const onScroll = throttleAndDebounce(setActiveLink, 100); + let prevActiveLink = null; + onMounted(() => { + requestAnimationFrame(setActiveLink); + window.addEventListener("scroll", onScroll); + }); + onUpdated(() => { + activateLink(location.hash); + }); + onUnmounted(() => { + window.removeEventListener("scroll", onScroll); + }); + function setActiveLink() { + if (!isAsideEnabled.value) { + return; + } + const scrollY = window.scrollY; + const innerHeight = window.innerHeight; + const offsetHeight = document.body.offsetHeight; + const isBottom = Math.abs(scrollY + innerHeight - offsetHeight) < 1; + const headers = resolvedHeaders.map(({ element, link: link2 }) => ({ + link: link2, + top: getAbsoluteTop(element) + })).filter(({ top }) => !Number.isNaN(top)).sort((a, b) => a.top - b.top); + if (!headers.length) { + activateLink(null); + return; + } + if (scrollY < 1) { + activateLink(null); + return; + } + if (isBottom) { + activateLink(headers[headers.length - 1].link); + return; + } + let activeLink = null; + for (const { link: link2, top } of headers) { + if (top > scrollY + getScrollOffset() + 4) { + break; + } + activeLink = link2; + } + activateLink(activeLink); + } + function activateLink(hash) { + if (prevActiveLink) { + prevActiveLink.classList.remove("active"); + } + if (hash == null) { + prevActiveLink = null; + } else { + prevActiveLink = container.value.querySelector(`a[href="${decodeURIComponent(hash)}"]`); + } + const activeLink = prevActiveLink; + if (activeLink) { + activeLink.classList.add("active"); + marker.value.style.top = activeLink.offsetTop + 39 + "px"; + marker.value.style.opacity = "1"; + } else { + marker.value.style.top = "33px"; + marker.value.style.opacity = "0"; + } + } +} +function getAbsoluteTop(element) { + let offsetTop = 0; + while (element !== document.body) { + if (element === null) { + return NaN; + } + offsetTop += element.offsetTop; + element = element.offsetParent; + } + return offsetTop; +} +function buildTree(data, min, max) { + resolvedHeaders.length = 0; + const result = []; + const stack = []; + data.forEach((item) => { + const node = { ...item, children: [] }; + let parent = stack[stack.length - 1]; + while (parent && parent.level >= node.level) { + stack.pop(); + parent = stack[stack.length - 1]; + } + if (node.element.classList.contains("ignore-header") || parent && "shouldIgnore" in parent) { + stack.push({ level: node.level, shouldIgnore: true }); + return; + } + if (node.level > max || node.level < min) + return; + resolvedHeaders.push({ element: node.element, link: node.link }); + if (parent) + parent.children.push(node); + else + result.push(node); + stack.push(node); + }); + return result; +} +const _sfc_main$11 = /* @__PURE__ */ defineComponent({ + __name: "VPDocOutlineItem", + __ssrInlineRender: true, + props: { + headers: {}, + root: { type: Boolean } + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + const _component_VPDocOutlineItem = resolveComponent("VPDocOutlineItem", true); + _push(``); + ssrRenderList(__props.headers, ({ children, link: link2, title }) => { + _push(`
  • ${ssrInterpolate(title)}`); + if (children == null ? void 0 : children.length) { + _push(ssrRenderComponent(_component_VPDocOutlineItem, { headers: children }, null, _parent)); + } else { + _push(``); + } + _push(`
  • `); + }); + _push(``); + }; + } +}); +const _sfc_setup$11 = _sfc_main$11.setup; +_sfc_main$11.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocOutlineItem.vue"); + return _sfc_setup$11 ? _sfc_setup$11(props, ctx) : void 0; +}; +const VPDocOutlineItem = /* @__PURE__ */ _export_sfc(_sfc_main$11, [["__scopeId", "data-v-b933a997"]]); +const _sfc_main$10 = /* @__PURE__ */ defineComponent({ + __name: "VPDocAsideOutline", + __ssrInlineRender: true, + setup(__props) { + const { frontmatter, theme: theme2 } = useData(); + const headers = shallowRef([]); + onContentUpdated(() => { + headers.value = getHeaders(frontmatter.value.outline ?? theme2.value.outline); + }); + const container = ref(); + const marker = ref(); + useActiveAnchor(container, marker); + return (_ctx, _push, _parent, _attrs) => { + _push(` 0 }], + ref_key: "container", + ref: container + }, _attrs))} data-v-a5bbad30>
    ${ssrInterpolate(unref(resolveTitle)(unref(theme2)))}
    `); + _push(ssrRenderComponent(VPDocOutlineItem, { + headers: headers.value, + root: true + }, null, _parent)); + _push(`
    `); + }; + } +}); +const _sfc_setup$10 = _sfc_main$10.setup; +_sfc_main$10.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocAsideOutline.vue"); + return _sfc_setup$10 ? _sfc_setup$10(props, ctx) : void 0; +}; +const VPDocAsideOutline = /* @__PURE__ */ _export_sfc(_sfc_main$10, [["__scopeId", "data-v-a5bbad30"]]); +const _sfc_main$$ = /* @__PURE__ */ defineComponent({ + __name: "VPDocAsideCarbonAds", + __ssrInlineRender: true, + props: { + carbonAds: {} + }, + setup(__props) { + const VPCarbonAds = () => null; + return (_ctx, _push, _parent, _attrs) => { + _push(``); + _push(ssrRenderComponent(unref(VPCarbonAds), { "carbon-ads": __props.carbonAds }, null, _parent)); + _push(``); + }; + } +}); +const _sfc_setup$$ = _sfc_main$$.setup; +_sfc_main$$.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocAsideCarbonAds.vue"); + return _sfc_setup$$ ? _sfc_setup$$(props, ctx) : void 0; +}; +const _sfc_main$_ = /* @__PURE__ */ defineComponent({ + __name: "VPDocAside", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderSlot(_ctx.$slots, "aside-top", {}, null, _push, _parent); + ssrRenderSlot(_ctx.$slots, "aside-outline-before", {}, null, _push, _parent); + _push(ssrRenderComponent(VPDocAsideOutline, null, null, _parent)); + ssrRenderSlot(_ctx.$slots, "aside-outline-after", {}, null, _push, _parent); + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "aside-ads-before", {}, null, _push, _parent); + if (unref(theme2).carbonAds) { + _push(ssrRenderComponent(_sfc_main$$, { + "carbon-ads": unref(theme2).carbonAds + }, null, _parent)); + } else { + _push(``); + } + ssrRenderSlot(_ctx.$slots, "aside-ads-after", {}, null, _push, _parent); + ssrRenderSlot(_ctx.$slots, "aside-bottom", {}, null, _push, _parent); + _push(``); + }; + } +}); +const _sfc_setup$_ = _sfc_main$_.setup; +_sfc_main$_.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocAside.vue"); + return _sfc_setup$_ ? _sfc_setup$_(props, ctx) : void 0; +}; +const VPDocAside = /* @__PURE__ */ _export_sfc(_sfc_main$_, [["__scopeId", "data-v-3f215769"]]); +function useEditLink() { + const { theme: theme2, page } = useData(); + return computed(() => { + const { text = "Edit this page", pattern = "" } = theme2.value.editLink || {}; + let url; + if (typeof pattern === "function") { + url = pattern(page.value); + } else { + url = pattern.replace(/:path/g, page.value.filePath); + } + return { url, text }; + }); +} +function usePrevNext() { + const { page, theme: theme2, frontmatter } = useData(); + return computed(() => { + var _a, _b, _c, _d, _e, _f, _g, _h; + const sidebar = getSidebar(theme2.value.sidebar, page.value.relativePath); + const links = getFlatSideBarLinks(sidebar); + const candidates = uniqBy(links, (link2) => link2.link.replace(/[?#].*$/, "")); + const index = candidates.findIndex((link2) => { + return isActive(page.value.relativePath, link2.link); + }); + const hidePrev = ((_a = theme2.value.docFooter) == null ? void 0 : _a.prev) === false && !frontmatter.value.prev || frontmatter.value.prev === false; + const hideNext = ((_b = theme2.value.docFooter) == null ? void 0 : _b.next) === false && !frontmatter.value.next || frontmatter.value.next === false; + return { + prev: hidePrev ? void 0 : { + text: (typeof frontmatter.value.prev === "string" ? frontmatter.value.prev : typeof frontmatter.value.prev === "object" ? frontmatter.value.prev.text : void 0) ?? ((_c = candidates[index - 1]) == null ? void 0 : _c.docFooterText) ?? ((_d = candidates[index - 1]) == null ? void 0 : _d.text), + link: (typeof frontmatter.value.prev === "object" ? frontmatter.value.prev.link : void 0) ?? ((_e = candidates[index - 1]) == null ? void 0 : _e.link) + }, + next: hideNext ? void 0 : { + text: (typeof frontmatter.value.next === "string" ? frontmatter.value.next : typeof frontmatter.value.next === "object" ? frontmatter.value.next.text : void 0) ?? ((_f = candidates[index + 1]) == null ? void 0 : _f.docFooterText) ?? ((_g = candidates[index + 1]) == null ? void 0 : _g.text), + link: (typeof frontmatter.value.next === "object" ? frontmatter.value.next.link : void 0) ?? ((_h = candidates[index + 1]) == null ? void 0 : _h.link) + } + }; + }); +} +function uniqBy(array, keyFn) { + const seen = /* @__PURE__ */ new Set(); + return array.filter((item) => { + const k = keyFn(item); + return seen.has(k) ? false : seen.add(k); + }); +} +const _sfc_main$Z = /* @__PURE__ */ defineComponent({ + __name: "VPLink", + __ssrInlineRender: true, + props: { + tag: {}, + href: {}, + noIcon: { type: Boolean }, + target: {}, + rel: {} + }, + setup(__props) { + const props = __props; + const tag = computed(() => props.tag ?? (props.href ? "a" : "span")); + const isExternal2 = computed( + () => props.href && EXTERNAL_URL_RE.test(props.href) || props.target === "_blank" + ); + return (_ctx, _push, _parent, _attrs) => { + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(tag.value), mergeProps({ + class: ["VPLink", { + link: __props.href, + "vp-external-link-icon": isExternal2.value, + "no-icon": __props.noIcon + }], + href: __props.href ? unref(normalizeLink$1)(__props.href) : void 0, + target: __props.target ?? (isExternal2.value ? "_blank" : void 0), + rel: __props.rel ?? (isExternal2.value ? "noreferrer" : void 0) + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "default", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "default") + ]; + } + }), + _: 3 + }), _parent); + }; + } +}); +const _sfc_setup$Z = _sfc_main$Z.setup; +_sfc_main$Z.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPLink.vue"); + return _sfc_setup$Z ? _sfc_setup$Z(props, ctx) : void 0; +}; +const _sfc_main$Y = /* @__PURE__ */ defineComponent({ + __name: "VPDocFooterLastUpdated", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2, page, lang } = useData(); + const date = computed( + () => new Date(page.value.lastUpdated) + ); + const isoDatetime = computed(() => date.value.toISOString()); + const datetime = ref(""); + onMounted(() => { + watchEffect(() => { + var _a, _b, _c; + datetime.value = new Intl.DateTimeFormat( + ((_b = (_a = theme2.value.lastUpdated) == null ? void 0 : _a.formatOptions) == null ? void 0 : _b.forceLocale) ? lang.value : void 0, + ((_c = theme2.value.lastUpdated) == null ? void 0 : _c.formatOptions) ?? { + dateStyle: "short", + timeStyle: "short" + } + ).format(date.value); + }); + }); + return (_ctx, _push, _parent, _attrs) => { + var _a; + _push(`${ssrInterpolate(((_a = unref(theme2).lastUpdated) == null ? void 0 : _a.text) || unref(theme2).lastUpdatedText || "Last updated")}: ${ssrInterpolate(datetime.value)}

    `); + }; + } +}); +const _sfc_setup$Y = _sfc_main$Y.setup; +_sfc_main$Y.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocFooterLastUpdated.vue"); + return _sfc_setup$Y ? _sfc_setup$Y(props, ctx) : void 0; +}; +const VPDocFooterLastUpdated = /* @__PURE__ */ _export_sfc(_sfc_main$Y, [["__scopeId", "data-v-e98dd255"]]); +const _sfc_main$X = /* @__PURE__ */ defineComponent({ + __name: "VPDocFooter", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2, page, frontmatter } = useData(); + const editLink = useEditLink(); + const control = usePrevNext(); + const hasEditLink = computed( + () => theme2.value.editLink && frontmatter.value.editLink !== false + ); + const hasLastUpdated = computed(() => page.value.lastUpdated); + const showFooter = computed( + () => hasEditLink.value || hasLastUpdated.value || control.value.prev || control.value.next + ); + return (_ctx, _push, _parent, _attrs) => { + var _a, _b, _c, _d; + if (showFooter.value) { + _push(``); + ssrRenderSlot(_ctx.$slots, "doc-footer-before", {}, null, _push, _parent); + if (hasEditLink.value || hasLastUpdated.value) { + _push(`
    `); + if (hasEditLink.value) { + _push(``); + } else { + _push(``); + } + if (hasLastUpdated.value) { + _push(`
    `); + _push(ssrRenderComponent(VPDocFooterLastUpdated, null, null, _parent)); + _push(`
    `); + } else { + _push(``); + } + _push(`
    `); + } else { + _push(``); + } + if (((_a = unref(control).prev) == null ? void 0 : _a.link) || ((_b = unref(control).next) == null ? void 0 : _b.link)) { + _push(``); + } else { + _push(``); + } + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$X = _sfc_main$X.setup; +_sfc_main$X.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocFooter.vue"); + return _sfc_setup$X ? _sfc_setup$X(props, ctx) : void 0; +}; +const VPDocFooter = /* @__PURE__ */ _export_sfc(_sfc_main$X, [["__scopeId", "data-v-e257564d"]]); +const _sfc_main$W = /* @__PURE__ */ defineComponent({ + __name: "VPDoc", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + const route = useRoute(); + const { hasSidebar, hasAside, leftAside } = useSidebar(); + const pageName = computed( + () => route.path.replace(/[./]+/g, "_").replace(/_html$/, "") + ); + return (_ctx, _push, _parent, _attrs) => { + const _component_Content = resolveComponent("Content"); + _push(``); + ssrRenderSlot(_ctx.$slots, "doc-top", {}, null, _push, _parent); + _push(`
    `); + if (unref(hasAside)) { + _push(`
    `); + _push(ssrRenderComponent(VPDocAside, null, { + "aside-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-top", {}, void 0, true) + ]; + } + }), + "aside-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-bottom", {}, void 0, true) + ]; + } + }), + "aside-outline-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-outline-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-outline-before", {}, void 0, true) + ]; + } + }), + "aside-outline-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-outline-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-outline-after", {}, void 0, true) + ]; + } + }), + "aside-ads-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-ads-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-ads-before", {}, void 0, true) + ]; + } + }), + "aside-ads-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-ads-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-ads-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(`
    `); + } else { + _push(``); + } + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "doc-before", {}, null, _push, _parent); + _push(`
    `); + _push(ssrRenderComponent(_component_Content, { + class: ["vp-doc", [ + pageName.value, + unref(theme2).externalLinkIcon && "external-link-icon-enabled" + ]] + }, null, _parent)); + _push(`
    `); + _push(ssrRenderComponent(VPDocFooter, null, { + "doc-footer-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-footer-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-footer-before", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + ssrRenderSlot(_ctx.$slots, "doc-after", {}, null, _push, _parent); + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "doc-bottom", {}, null, _push, _parent); + _push(``); + }; + } +}); +const _sfc_setup$W = _sfc_main$W.setup; +_sfc_main$W.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDoc.vue"); + return _sfc_setup$W ? _sfc_setup$W(props, ctx) : void 0; +}; +const VPDoc = /* @__PURE__ */ _export_sfc(_sfc_main$W, [["__scopeId", "data-v-39a288b8"]]); +const _sfc_main$V = /* @__PURE__ */ defineComponent({ + __name: "VPButton", + __ssrInlineRender: true, + props: { + tag: {}, + size: { default: "medium" }, + theme: { default: "brand" }, + text: {}, + href: {}, + target: {}, + rel: {} + }, + setup(__props) { + const props = __props; + const isExternal2 = computed( + () => props.href && EXTERNAL_URL_RE.test(props.href) + ); + const component = computed(() => { + return props.tag || (props.href ? "a" : "button"); + }); + return (_ctx, _push, _parent, _attrs) => { + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(component.value), mergeProps({ + class: ["VPButton", [__props.size, __props.theme]], + href: __props.href ? unref(normalizeLink$1)(__props.href) : void 0, + target: props.target ?? (isExternal2.value ? "_blank" : void 0), + rel: props.rel ?? (isExternal2.value ? "noreferrer" : void 0) + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${ssrInterpolate(__props.text)}`); + } else { + return [ + createTextVNode(toDisplayString(__props.text), 1) + ]; + } + }), + _: 1 + }), _parent); + }; + } +}); +const _sfc_setup$V = _sfc_main$V.setup; +_sfc_main$V.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPButton.vue"); + return _sfc_setup$V ? _sfc_setup$V(props, ctx) : void 0; +}; +const VPButton = /* @__PURE__ */ _export_sfc(_sfc_main$V, [["__scopeId", "data-v-fa7799d5"]]); +const _sfc_main$U = /* @__PURE__ */ defineComponent({ + ...{ inheritAttrs: false }, + __name: "VPImage", + __ssrInlineRender: true, + props: { + image: {}, + alt: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + const _component_VPImage = resolveComponent("VPImage", true); + if (__props.image) { + _push(``); + if (typeof __props.image === "string" || "src" in __props.image) { + _push(``); + } else { + _push(``); + _push(ssrRenderComponent(_component_VPImage, mergeProps({ + class: "dark", + image: __props.image.dark, + alt: __props.image.alt + }, _ctx.$attrs), null, _parent)); + _push(ssrRenderComponent(_component_VPImage, mergeProps({ + class: "light", + image: __props.image.light, + alt: __props.image.alt + }, _ctx.$attrs), null, _parent)); + _push(``); + } + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$U = _sfc_main$U.setup; +_sfc_main$U.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPImage.vue"); + return _sfc_setup$U ? _sfc_setup$U(props, ctx) : void 0; +}; +const VPImage = /* @__PURE__ */ _export_sfc(_sfc_main$U, [["__scopeId", "data-v-8426fc1a"]]); +const _sfc_main$T = /* @__PURE__ */ defineComponent({ + __name: "VPHero", + __ssrInlineRender: true, + props: { + name: {}, + text: {}, + tagline: {}, + image: {}, + actions: {} + }, + setup(__props) { + const heroImageSlotExists = inject("hero-image-slot-exists"); + return (_ctx, _push, _parent, _attrs) => { + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "home-hero-info-before", {}, null, _push, _parent); + ssrRenderSlot(_ctx.$slots, "home-hero-info", {}, () => { + _push(`

    `); + if (__props.name) { + _push(`${__props.name ?? ""}`); + } else { + _push(``); + } + if (__props.text) { + _push(`${__props.text ?? ""}`); + } else { + _push(``); + } + _push(`

    `); + if (__props.tagline) { + _push(`

    ${__props.tagline ?? ""}

    `); + } else { + _push(``); + } + }, _push, _parent); + ssrRenderSlot(_ctx.$slots, "home-hero-info-after", {}, null, _push, _parent); + if (__props.actions) { + _push(`
    `); + ssrRenderList(__props.actions, (action) => { + _push(`
    `); + _push(ssrRenderComponent(VPButton, { + tag: "a", + size: "medium", + theme: action.theme, + text: action.text, + href: action.link, + target: action.target, + rel: action.rel + }, null, _parent)); + _push(`
    `); + }); + _push(`
    `); + } else { + _push(``); + } + ssrRenderSlot(_ctx.$slots, "home-hero-actions-after", {}, null, _push, _parent); + _push(`
    `); + if (__props.image || unref(heroImageSlotExists)) { + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "home-hero-image", {}, () => { + if (__props.image) { + _push(ssrRenderComponent(VPImage, { + class: "image-src", + image: __props.image + }, null, _parent)); + } else { + _push(``); + } + }, _push, _parent); + _push(`
    `); + } else { + _push(``); + } + _push(`
    `); + }; + } +}); +const _sfc_setup$T = _sfc_main$T.setup; +_sfc_main$T.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPHero.vue"); + return _sfc_setup$T ? _sfc_setup$T(props, ctx) : void 0; +}; +const VPHero = /* @__PURE__ */ _export_sfc(_sfc_main$T, [["__scopeId", "data-v-4f9c455b"]]); +const _sfc_main$S = /* @__PURE__ */ defineComponent({ + __name: "VPHomeHero", + __ssrInlineRender: true, + setup(__props) { + const { frontmatter: fm } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(fm).hero) { + _push(ssrRenderComponent(VPHero, mergeProps({ + class: "VPHomeHero", + name: unref(fm).hero.name, + text: unref(fm).hero.text, + tagline: unref(fm).hero.tagline, + image: unref(fm).hero.image, + actions: unref(fm).hero.actions + }, _attrs), { + "home-hero-info-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-before") + ]; + } + }), + "home-hero-info": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info") + ]; + } + }), + "home-hero-info-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-after") + ]; + } + }), + "home-hero-actions-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-actions-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-actions-after") + ]; + } + }), + "home-hero-image": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-image", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-image") + ]; + } + }), + _: 3 + }, _parent)); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$S = _sfc_main$S.setup; +_sfc_main$S.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue"); + return _sfc_setup$S ? _sfc_setup$S(props, ctx) : void 0; +}; +const _sfc_main$R = /* @__PURE__ */ defineComponent({ + __name: "VPFeature", + __ssrInlineRender: true, + props: { + icon: {}, + title: {}, + details: {}, + link: {}, + linkText: {}, + rel: {}, + target: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(ssrRenderComponent(_sfc_main$Z, mergeProps({ + class: "VPFeature", + href: __props.link, + rel: __props.rel, + target: __props.target, + "no-icon": true, + tag: __props.link ? "a" : "div" + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`
    `); + if (typeof __props.icon === "object" && __props.icon.wrap) { + _push2(`
    `); + _push2(ssrRenderComponent(VPImage, { + image: __props.icon, + alt: __props.icon.alt, + height: __props.icon.height || 48, + width: __props.icon.width || 48 + }, null, _parent2, _scopeId)); + _push2(`
    `); + } else if (typeof __props.icon === "object") { + _push2(ssrRenderComponent(VPImage, { + image: __props.icon, + alt: __props.icon.alt, + height: __props.icon.height || 48, + width: __props.icon.width || 48 + }, null, _parent2, _scopeId)); + } else if (__props.icon) { + _push2(`
    ${__props.icon ?? ""}
    `); + } else { + _push2(``); + } + _push2(`

    ${__props.title ?? ""}

    `); + if (__props.details) { + _push2(`

    ${__props.details ?? ""}

    `); + } else { + _push2(``); + } + if (__props.linkText) { + _push2(``); + } else { + _push2(``); + } + _push2(`
    `); + } else { + return [ + createVNode("article", { class: "box" }, [ + typeof __props.icon === "object" && __props.icon.wrap ? (openBlock(), createBlock("div", { + key: 0, + class: "icon" + }, [ + createVNode(VPImage, { + image: __props.icon, + alt: __props.icon.alt, + height: __props.icon.height || 48, + width: __props.icon.width || 48 + }, null, 8, ["image", "alt", "height", "width"]) + ])) : typeof __props.icon === "object" ? (openBlock(), createBlock(VPImage, { + key: 1, + image: __props.icon, + alt: __props.icon.alt, + height: __props.icon.height || 48, + width: __props.icon.width || 48 + }, null, 8, ["image", "alt", "height", "width"])) : __props.icon ? (openBlock(), createBlock("div", { + key: 2, + class: "icon", + innerHTML: __props.icon + }, null, 8, ["innerHTML"])) : createCommentVNode("", true), + createVNode("h2", { + class: "title", + innerHTML: __props.title + }, null, 8, ["innerHTML"]), + __props.details ? (openBlock(), createBlock("p", { + key: 3, + class: "details", + innerHTML: __props.details + }, null, 8, ["innerHTML"])) : createCommentVNode("", true), + __props.linkText ? (openBlock(), createBlock("div", { + key: 4, + class: "link-text" + }, [ + createVNode("p", { class: "link-text-value" }, [ + createTextVNode(toDisplayString(__props.linkText) + " ", 1), + createVNode("span", { class: "vpi-arrow-right link-text-icon" }) + ]) + ])) : createCommentVNode("", true) + ]) + ]; + } + }), + _: 1 + }, _parent)); + }; + } +}); +const _sfc_setup$R = _sfc_main$R.setup; +_sfc_main$R.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPFeature.vue"); + return _sfc_setup$R ? _sfc_setup$R(props, ctx) : void 0; +}; +const VPFeature = /* @__PURE__ */ _export_sfc(_sfc_main$R, [["__scopeId", "data-v-a3976bdc"]]); +const _sfc_main$Q = /* @__PURE__ */ defineComponent({ + __name: "VPFeatures", + __ssrInlineRender: true, + props: { + features: {} + }, + setup(__props) { + const props = __props; + const grid = computed(() => { + const length = props.features.length; + if (!length) { + return; + } else if (length === 2) { + return "grid-2"; + } else if (length === 3) { + return "grid-3"; + } else if (length % 3 === 0) { + return "grid-6"; + } else if (length > 3) { + return "grid-4"; + } + }); + return (_ctx, _push, _parent, _attrs) => { + if (__props.features) { + _push(`
    `); + ssrRenderList(__props.features, (feature) => { + _push(`
    `); + _push(ssrRenderComponent(VPFeature, { + icon: feature.icon, + title: feature.title, + details: feature.details, + link: feature.link, + "link-text": feature.linkText, + rel: feature.rel, + target: feature.target + }, null, _parent)); + _push(`
    `); + }); + _push(`
    `); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$Q = _sfc_main$Q.setup; +_sfc_main$Q.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPFeatures.vue"); + return _sfc_setup$Q ? _sfc_setup$Q(props, ctx) : void 0; +}; +const VPFeatures = /* @__PURE__ */ _export_sfc(_sfc_main$Q, [["__scopeId", "data-v-a6181336"]]); +const _sfc_main$P = /* @__PURE__ */ defineComponent({ + __name: "VPHomeFeatures", + __ssrInlineRender: true, + setup(__props) { + const { frontmatter: fm } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(fm).features) { + _push(ssrRenderComponent(VPFeatures, mergeProps({ + class: "VPHomeFeatures", + features: unref(fm).features + }, _attrs), null, _parent)); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$P = _sfc_main$P.setup; +_sfc_main$P.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue"); + return _sfc_setup$P ? _sfc_setup$P(props, ctx) : void 0; +}; +const _sfc_main$O = /* @__PURE__ */ defineComponent({ + __name: "VPHomeContent", + __ssrInlineRender: true, + setup(__props) { + const { width: vw } = useWindowSize({ + initialWidth: 0, + includeScrollbar: false + }); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent); + _push(``); + }; + } +}); +const _sfc_setup$O = _sfc_main$O.setup; +_sfc_main$O.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPHomeContent.vue"); + return _sfc_setup$O ? _sfc_setup$O(props, ctx) : void 0; +}; +const VPHomeContent = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["__scopeId", "data-v-8e2d4988"]]); +const _sfc_main$N = /* @__PURE__ */ defineComponent({ + __name: "VPHome", + __ssrInlineRender: true, + setup(__props) { + const { frontmatter, theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + const _component_Content = resolveComponent("Content"); + _push(``); + ssrRenderSlot(_ctx.$slots, "home-hero-before", {}, null, _push, _parent); + _push(ssrRenderComponent(_sfc_main$S, null, { + "home-hero-info-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-before", {}, void 0, true) + ]; + } + }), + "home-hero-info": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info", {}, void 0, true) + ]; + } + }), + "home-hero-info-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-after", {}, void 0, true) + ]; + } + }), + "home-hero-actions-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-actions-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-actions-after", {}, void 0, true) + ]; + } + }), + "home-hero-image": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-image", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-image", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + ssrRenderSlot(_ctx.$slots, "home-hero-after", {}, null, _push, _parent); + ssrRenderSlot(_ctx.$slots, "home-features-before", {}, null, _push, _parent); + _push(ssrRenderComponent(_sfc_main$P, null, null, _parent)); + ssrRenderSlot(_ctx.$slots, "home-features-after", {}, null, _push, _parent); + if (unref(frontmatter).markdownStyles !== false) { + _push(ssrRenderComponent(VPHomeContent, null, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(ssrRenderComponent(_component_Content, null, null, _parent2, _scopeId)); + } else { + return [ + createVNode(_component_Content) + ]; + } + }), + _: 1 + }, _parent)); + } else { + _push(ssrRenderComponent(_component_Content, null, null, _parent)); + } + _push(``); + }; + } +}); +const _sfc_setup$N = _sfc_main$N.setup; +_sfc_main$N.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPHome.vue"); + return _sfc_setup$N ? _sfc_setup$N(props, ctx) : void 0; +}; +const VPHome = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["__scopeId", "data-v-8b561e3d"]]); +const _sfc_main$M = {}; +function _sfc_ssrRender$1(_ctx, _push, _parent, _attrs) { + const _component_Content = resolveComponent("Content"); + _push(``); + ssrRenderSlot(_ctx.$slots, "page-top", {}, null, _push, _parent); + _push(ssrRenderComponent(_component_Content, null, null, _parent)); + ssrRenderSlot(_ctx.$slots, "page-bottom", {}, null, _push, _parent); + _push(``); +} +const _sfc_setup$M = _sfc_main$M.setup; +_sfc_main$M.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPPage.vue"); + return _sfc_setup$M ? _sfc_setup$M(props, ctx) : void 0; +}; +const VPPage = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["ssrRender", _sfc_ssrRender$1]]); +const _sfc_main$L = /* @__PURE__ */ defineComponent({ + __name: "VPContent", + __ssrInlineRender: true, + setup(__props) { + const { page, frontmatter } = useData(); + const { hasSidebar } = useSidebar(); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + if (unref(page).isNotFound) { + ssrRenderSlot(_ctx.$slots, "not-found", {}, () => { + _push(ssrRenderComponent(NotFound, null, null, _parent)); + }, _push, _parent); + } else if (unref(frontmatter).layout === "page") { + _push(ssrRenderComponent(VPPage, null, { + "page-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "page-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "page-top", {}, void 0, true) + ]; + } + }), + "page-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "page-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "page-bottom", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + } else if (unref(frontmatter).layout === "home") { + _push(ssrRenderComponent(VPHome, null, { + "home-hero-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-before", {}, void 0, true) + ]; + } + }), + "home-hero-info-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-before", {}, void 0, true) + ]; + } + }), + "home-hero-info": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info", {}, void 0, true) + ]; + } + }), + "home-hero-info-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-after", {}, void 0, true) + ]; + } + }), + "home-hero-actions-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-actions-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-actions-after", {}, void 0, true) + ]; + } + }), + "home-hero-image": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-image", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-image", {}, void 0, true) + ]; + } + }), + "home-hero-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-after", {}, void 0, true) + ]; + } + }), + "home-features-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-features-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-features-before", {}, void 0, true) + ]; + } + }), + "home-features-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-features-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-features-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + } else if (unref(frontmatter).layout && unref(frontmatter).layout !== "doc") { + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(unref(frontmatter).layout), null, null), _parent); + } else { + _push(ssrRenderComponent(VPDoc, null, { + "doc-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-top", {}, void 0, true) + ]; + } + }), + "doc-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-bottom", {}, void 0, true) + ]; + } + }), + "doc-footer-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-footer-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-footer-before", {}, void 0, true) + ]; + } + }), + "doc-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-before", {}, void 0, true) + ]; + } + }), + "doc-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-after", {}, void 0, true) + ]; + } + }), + "aside-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-top", {}, void 0, true) + ]; + } + }), + "aside-outline-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-outline-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-outline-before", {}, void 0, true) + ]; + } + }), + "aside-outline-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-outline-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-outline-after", {}, void 0, true) + ]; + } + }), + "aside-ads-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-ads-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-ads-before", {}, void 0, true) + ]; + } + }), + "aside-ads-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-ads-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-ads-after", {}, void 0, true) + ]; + } + }), + "aside-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-bottom", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + } + _push(``); + }; + } +}); +const _sfc_setup$L = _sfc_main$L.setup; +_sfc_main$L.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPContent.vue"); + return _sfc_setup$L ? _sfc_setup$L(props, ctx) : void 0; +}; +const VPContent = /* @__PURE__ */ _export_sfc(_sfc_main$L, [["__scopeId", "data-v-1428d186"]]); +const _sfc_main$K = /* @__PURE__ */ defineComponent({ + __name: "VPFooter", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2, frontmatter } = useData(); + const { hasSidebar } = useSidebar(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(theme2).footer && unref(frontmatter).footer !== false) { + _push(`
    `); + if (unref(theme2).footer.message) { + _push(`

    ${unref(theme2).footer.message ?? ""}

    `); + } else { + _push(``); + } + if (unref(theme2).footer.copyright) { + _push(``); + } else { + _push(``); + } + _push(`
    `); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$K = _sfc_main$K.setup; +_sfc_main$K.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPFooter.vue"); + return _sfc_setup$K ? _sfc_setup$K(props, ctx) : void 0; +}; +const VPFooter = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["__scopeId", "data-v-e315a0ad"]]); +function useLocalNav() { + const { theme: theme2, frontmatter } = useData(); + const headers = shallowRef([]); + const hasLocalNav = computed(() => { + return headers.value.length > 0; + }); + onContentUpdated(() => { + headers.value = getHeaders(frontmatter.value.outline ?? theme2.value.outline); + }); + return { + headers, + hasLocalNav + }; +} +const _sfc_main$J = /* @__PURE__ */ defineComponent({ + __name: "VPLocalNavOutlineDropdown", + __ssrInlineRender: true, + props: { + headers: {}, + navHeight: {} + }, + setup(__props) { + const { theme: theme2 } = useData(); + const open = ref(false); + const vh = ref(0); + const main = ref(); + ref(); + function closeOnClickOutside(e) { + var _a; + if (!((_a = main.value) == null ? void 0 : _a.contains(e.target))) { + open.value = false; + } + } + watch(open, (value) => { + if (value) { + document.addEventListener("click", closeOnClickOutside); + return; + } + document.removeEventListener("click", closeOnClickOutside); + }); + onKeyStroke("Escape", () => { + open.value = false; + }); + onContentUpdated(() => { + open.value = false; + }); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + if (__props.headers.length > 0) { + _push(``); + } else { + _push(``); + } + if (open.value) { + _push(`
    `); + _push(ssrRenderComponent(VPDocOutlineItem, { headers: __props.headers }, null, _parent)); + _push(`
    `); + } else { + _push(``); + } + _push(``); + }; + } +}); +const _sfc_setup$J = _sfc_main$J.setup; +_sfc_main$J.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPLocalNavOutlineDropdown.vue"); + return _sfc_setup$J ? _sfc_setup$J(props, ctx) : void 0; +}; +const VPLocalNavOutlineDropdown = /* @__PURE__ */ _export_sfc(_sfc_main$J, [["__scopeId", "data-v-8a42e2b4"]]); +const _sfc_main$I = /* @__PURE__ */ defineComponent({ + __name: "VPLocalNav", + __ssrInlineRender: true, + props: { + open: { type: Boolean } + }, + emits: ["open-menu"], + setup(__props) { + const { theme: theme2, frontmatter } = useData(); + const { hasSidebar } = useSidebar(); + const { headers } = useLocalNav(); + const { y } = useWindowScroll(); + const navHeight = ref(0); + onMounted(() => { + navHeight.value = parseInt( + getComputedStyle(document.documentElement).getPropertyValue( + "--vp-nav-height" + ) + ); + }); + onContentUpdated(() => { + headers.value = getHeaders(frontmatter.value.outline ?? theme2.value.outline); + }); + const empty = computed(() => { + return headers.value.length === 0; + }); + const emptyAndNoSidebar = computed(() => { + return empty.value && !hasSidebar.value; + }); + const classes = computed(() => { + return { + VPLocalNav: true, + "has-sidebar": hasSidebar.value, + empty: empty.value, + fixed: emptyAndNoSidebar.value + }; + }); + return (_ctx, _push, _parent, _attrs) => { + if (unref(frontmatter).layout !== "home" && (!emptyAndNoSidebar.value || unref(y) >= navHeight.value)) { + _push(`
    `); + if (unref(hasSidebar)) { + _push(``); + } else { + _push(``); + } + _push(ssrRenderComponent(VPLocalNavOutlineDropdown, { + headers: unref(headers), + navHeight: navHeight.value + }, null, _parent)); + _push(`
    `); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$I = _sfc_main$I.setup; +_sfc_main$I.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPLocalNav.vue"); + return _sfc_setup$I ? _sfc_setup$I(props, ctx) : void 0; +}; +const VPLocalNav = /* @__PURE__ */ _export_sfc(_sfc_main$I, [["__scopeId", "data-v-a6f0e41e"]]); +function useNav() { + const isScreenOpen = ref(false); + function openScreen() { + isScreenOpen.value = true; + window.addEventListener("resize", closeScreenOnTabletWindow); + } + function closeScreen() { + isScreenOpen.value = false; + window.removeEventListener("resize", closeScreenOnTabletWindow); + } + function toggleScreen() { + isScreenOpen.value ? closeScreen() : openScreen(); + } + function closeScreenOnTabletWindow() { + window.outerWidth >= 768 && closeScreen(); + } + const route = useRoute(); + watch(() => route.path, closeScreen); + return { + isScreenOpen, + openScreen, + closeScreen, + toggleScreen + }; +} +const _sfc_main$H = {}; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs) { + _push(``); + if (_ctx.$slots.default) { + _push(``); + ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent); + _push(``); + } else { + _push(``); + } + _push(``); +} +const _sfc_setup$H = _sfc_main$H.setup; +_sfc_main$H.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSwitch.vue"); + return _sfc_setup$H ? _sfc_setup$H(props, ctx) : void 0; +}; +const VPSwitch = /* @__PURE__ */ _export_sfc(_sfc_main$H, [["ssrRender", _sfc_ssrRender], ["__scopeId", "data-v-1d5665e3"]]); +const _sfc_main$G = /* @__PURE__ */ defineComponent({ + __name: "VPSwitchAppearance", + __ssrInlineRender: true, + setup(__props) { + const { isDark, theme: theme2 } = useData(); + const toggleAppearance = inject("toggle-appearance", () => { + isDark.value = !isDark.value; + }); + const switchTitle = ref(""); + watchPostEffect(() => { + switchTitle.value = isDark.value ? theme2.value.lightModeSwitchTitle || "Switch to light theme" : theme2.value.darkModeSwitchTitle || "Switch to dark theme"; + }); + return (_ctx, _push, _parent, _attrs) => { + _push(ssrRenderComponent(VPSwitch, mergeProps({ + title: switchTitle.value, + class: "VPSwitchAppearance", + "aria-checked": unref(isDark), + onClick: unref(toggleAppearance) + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(``); + } else { + return [ + createVNode("span", { class: "vpi-sun sun" }), + createVNode("span", { class: "vpi-moon moon" }) + ]; + } + }), + _: 1 + }, _parent)); + }; + } +}); +const _sfc_setup$G = _sfc_main$G.setup; +_sfc_main$G.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSwitchAppearance.vue"); + return _sfc_setup$G ? _sfc_setup$G(props, ctx) : void 0; +}; +const VPSwitchAppearance = /* @__PURE__ */ _export_sfc(_sfc_main$G, [["__scopeId", "data-v-5337faa4"]]); +const _sfc_main$F = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarAppearance", + __ssrInlineRender: true, + setup(__props) { + const { site } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(site).appearance && unref(site).appearance !== "force-dark" && unref(site).appearance !== "force-auto") { + _push(``); + _push(ssrRenderComponent(VPSwitchAppearance, null, null, _parent)); + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$F = _sfc_main$F.setup; +_sfc_main$F.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarAppearance.vue"); + return _sfc_setup$F ? _sfc_setup$F(props, ctx) : void 0; +}; +const VPNavBarAppearance = /* @__PURE__ */ _export_sfc(_sfc_main$F, [["__scopeId", "data-v-6c893767"]]); +const focusedElement = ref(); +let active = false; +let listeners = 0; +function useFlyout(options) { + const focus = ref(false); + if (inBrowser) { + !active && activateFocusTracking(); + listeners++; + const unwatch = watch(focusedElement, (el) => { + var _a, _b, _c; + if (el === options.el.value || ((_a = options.el.value) == null ? void 0 : _a.contains(el))) { + focus.value = true; + (_b = options.onFocus) == null ? void 0 : _b.call(options); + } else { + focus.value = false; + (_c = options.onBlur) == null ? void 0 : _c.call(options); + } + }); + onUnmounted(() => { + unwatch(); + listeners--; + if (!listeners) { + deactivateFocusTracking(); + } + }); + } + return readonly(focus); +} +function activateFocusTracking() { + document.addEventListener("focusin", handleFocusIn); + active = true; + focusedElement.value = document.activeElement; +} +function deactivateFocusTracking() { + document.removeEventListener("focusin", handleFocusIn); +} +function handleFocusIn() { + focusedElement.value = document.activeElement; +} +const _sfc_main$E = /* @__PURE__ */ defineComponent({ + __name: "VPMenuLink", + __ssrInlineRender: true, + props: { + item: {} + }, + setup(__props) { + const { page } = useData(); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + _push(ssrRenderComponent(_sfc_main$Z, { + class: { + active: unref(isActive)( + unref(page).relativePath, + __props.item.activeMatch || __props.item.link, + !!__props.item.activeMatch + ) + }, + href: __props.item.link, + target: __props.item.target, + rel: __props.item.rel, + "no-icon": __props.item.noIcon + }, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${__props.item.text ?? ""}`); + } else { + return [ + createVNode("span", { + innerHTML: __props.item.text + }, null, 8, ["innerHTML"]) + ]; + } + }), + _: 1 + }, _parent)); + _push(``); + }; + } +}); +const _sfc_setup$E = _sfc_main$E.setup; +_sfc_main$E.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPMenuLink.vue"); + return _sfc_setup$E ? _sfc_setup$E(props, ctx) : void 0; +}; +const VPMenuLink = /* @__PURE__ */ _export_sfc(_sfc_main$E, [["__scopeId", "data-v-35975db6"]]); +const _sfc_main$D = /* @__PURE__ */ defineComponent({ + __name: "VPMenuGroup", + __ssrInlineRender: true, + props: { + text: {}, + items: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + if (__props.text) { + _push(`

    ${ssrInterpolate(__props.text)}

    `); + } else { + _push(``); + } + _push(``); + ssrRenderList(__props.items, (item) => { + _push(``); + if ("link" in item) { + _push(ssrRenderComponent(VPMenuLink, { item }, null, _parent)); + } else { + _push(``); + } + _push(``); + }); + _push(``); + }; + } +}); +const _sfc_setup$D = _sfc_main$D.setup; +_sfc_main$D.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPMenuGroup.vue"); + return _sfc_setup$D ? _sfc_setup$D(props, ctx) : void 0; +}; +const VPMenuGroup = /* @__PURE__ */ _export_sfc(_sfc_main$D, [["__scopeId", "data-v-69e747b5"]]); +const _sfc_main$C = /* @__PURE__ */ defineComponent({ + __name: "VPMenu", + __ssrInlineRender: true, + props: { + items: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + if (__props.items) { + _push(`
    `); + ssrRenderList(__props.items, (item) => { + _push(``); + if ("link" in item) { + _push(ssrRenderComponent(VPMenuLink, { item }, null, _parent)); + } else if ("component" in item) { + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(item.component), mergeProps({ ref_for: true }, item.props), null), _parent); + } else { + _push(ssrRenderComponent(VPMenuGroup, { + text: item.text, + items: item.items + }, null, _parent)); + } + _push(``); + }); + _push(`
    `); + } else { + _push(``); + } + ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent); + _push(``); + }; + } +}); +const _sfc_setup$C = _sfc_main$C.setup; +_sfc_main$C.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPMenu.vue"); + return _sfc_setup$C ? _sfc_setup$C(props, ctx) : void 0; +}; +const VPMenu = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["__scopeId", "data-v-b98bc113"]]); +const _sfc_main$B = /* @__PURE__ */ defineComponent({ + __name: "VPFlyout", + __ssrInlineRender: true, + props: { + icon: {}, + button: {}, + label: {}, + items: {} + }, + setup(__props) { + const open = ref(false); + const el = ref(); + useFlyout({ el, onBlur }); + function onBlur() { + open.value = false; + } + return (_ctx, _push, _parent, _attrs) => { + _push(``); + }; + } +}); +const _sfc_setup$B = _sfc_main$B.setup; +_sfc_main$B.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPFlyout.vue"); + return _sfc_setup$B ? _sfc_setup$B(props, ctx) : void 0; +}; +const VPFlyout = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["__scopeId", "data-v-cf11d7a2"]]); +const _sfc_main$A = /* @__PURE__ */ defineComponent({ + __name: "VPSocialLink", + __ssrInlineRender: true, + props: { + icon: {}, + link: {}, + ariaLabel: {} + }, + setup(__props) { + var _a; + const props = __props; + const el = ref(); + onMounted(async () => { + var _a2; + await nextTick(); + const span = (_a2 = el.value) == null ? void 0 : _a2.children[0]; + if (span instanceof HTMLElement && span.className.startsWith("vpi-social-") && (getComputedStyle(span).maskImage || getComputedStyle(span).webkitMaskImage) === "none") { + span.style.setProperty( + "--icon", + `url('https://api.iconify.design/simple-icons/${props.icon}.svg')` + ); + } + }); + const svg = computed(() => { + if (typeof props.icon === "object") return props.icon.svg; + return ``; + }); + { + typeof props.icon === "string" && ((_a = useSSRContext()) == null ? void 0 : _a.vpSocialIcons.add(props.icon)); + } + return (_ctx, _push, _parent, _attrs) => { + _push(`${svg.value ?? ""}`); + }; + } +}); +const _sfc_setup$A = _sfc_main$A.setup; +_sfc_main$A.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSocialLink.vue"); + return _sfc_setup$A ? _sfc_setup$A(props, ctx) : void 0; +}; +const VPSocialLink = /* @__PURE__ */ _export_sfc(_sfc_main$A, [["__scopeId", "data-v-bd121fe5"]]); +const _sfc_main$z = /* @__PURE__ */ defineComponent({ + __name: "VPSocialLinks", + __ssrInlineRender: true, + props: { + links: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderList(__props.links, ({ link: link2, icon, ariaLabel }) => { + _push(ssrRenderComponent(VPSocialLink, { + key: link2, + icon, + link: link2, + ariaLabel + }, null, _parent)); + }); + _push(``); + }; + } +}); +const _sfc_setup$z = _sfc_main$z.setup; +_sfc_main$z.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSocialLinks.vue"); + return _sfc_setup$z ? _sfc_setup$z(props, ctx) : void 0; +}; +const VPSocialLinks = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["__scopeId", "data-v-7bc22406"]]); +const _sfc_main$y = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarExtra", + __ssrInlineRender: true, + setup(__props) { + const { site, theme: theme2 } = useData(); + const { localeLinks, currentLang } = useLangs({ correspondingLink: true }); + const hasExtraContent = computed( + () => localeLinks.value.length && currentLang.value.label || site.value.appearance || theme2.value.socialLinks + ); + return (_ctx, _push, _parent, _attrs) => { + if (hasExtraContent.value) { + _push(ssrRenderComponent(VPFlyout, mergeProps({ + class: "VPNavBarExtra", + label: "extra navigation" + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + if (unref(localeLinks).length && unref(currentLang).label) { + _push2(`

    ${ssrInterpolate(unref(currentLang).label)}

    `); + ssrRenderList(unref(localeLinks), (locale) => { + _push2(ssrRenderComponent(VPMenuLink, { item: locale }, null, _parent2, _scopeId)); + }); + _push2(`
    `); + } else { + _push2(``); + } + if (unref(site).appearance && unref(site).appearance !== "force-dark" && unref(site).appearance !== "force-auto") { + _push2(`

    ${ssrInterpolate(unref(theme2).darkModeSwitchLabel || "Appearance")}

    `); + _push2(ssrRenderComponent(VPSwitchAppearance, null, null, _parent2, _scopeId)); + _push2(`
    `); + } else { + _push2(``); + } + if (unref(theme2).socialLinks) { + _push2(`
    `); + } else { + _push2(``); + } + } else { + return [ + unref(localeLinks).length && unref(currentLang).label ? (openBlock(), createBlock("div", { + key: 0, + class: "group translations" + }, [ + createVNode("p", { class: "trans-title" }, toDisplayString(unref(currentLang).label), 1), + (openBlock(true), createBlock(Fragment, null, renderList(unref(localeLinks), (locale) => { + return openBlock(), createBlock(VPMenuLink, { + key: locale.link, + item: locale + }, null, 8, ["item"]); + }), 128)) + ])) : createCommentVNode("", true), + unref(site).appearance && unref(site).appearance !== "force-dark" && unref(site).appearance !== "force-auto" ? (openBlock(), createBlock("div", { + key: 1, + class: "group" + }, [ + createVNode("div", { class: "item appearance" }, [ + createVNode("p", { class: "label" }, toDisplayString(unref(theme2).darkModeSwitchLabel || "Appearance"), 1), + createVNode("div", { class: "appearance-action" }, [ + createVNode(VPSwitchAppearance) + ]) + ]) + ])) : createCommentVNode("", true), + unref(theme2).socialLinks ? (openBlock(), createBlock("div", { + key: 2, + class: "group" + }, [ + createVNode("div", { class: "item social-links" }, [ + createVNode(VPSocialLinks, { + class: "social-links-list", + links: unref(theme2).socialLinks + }, null, 8, ["links"]) + ]) + ])) : createCommentVNode("", true) + ]; + } + }), + _: 1 + }, _parent)); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$y = _sfc_main$y.setup; +_sfc_main$y.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarExtra.vue"); + return _sfc_setup$y ? _sfc_setup$y(props, ctx) : void 0; +}; +const VPNavBarExtra = /* @__PURE__ */ _export_sfc(_sfc_main$y, [["__scopeId", "data-v-bb2aa2f0"]]); +const _sfc_main$x = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarHamburger", + __ssrInlineRender: true, + props: { + active: { type: Boolean } + }, + emits: ["click"], + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + }; + } +}); +const _sfc_setup$x = _sfc_main$x.setup; +_sfc_main$x.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarHamburger.vue"); + return _sfc_setup$x ? _sfc_setup$x(props, ctx) : void 0; +}; +const VPNavBarHamburger = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["__scopeId", "data-v-e5dd9c1c"]]); +const _sfc_main$w = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarMenuLink", + __ssrInlineRender: true, + props: { + item: {} + }, + setup(__props) { + const { page } = useData(); + return (_ctx, _push, _parent, _attrs) => { + _push(ssrRenderComponent(_sfc_main$Z, mergeProps({ + class: { + VPNavBarMenuLink: true, + active: unref(isActive)( + unref(page).relativePath, + __props.item.activeMatch || __props.item.link, + !!__props.item.activeMatch + ) + }, + href: __props.item.link, + target: __props.item.target, + rel: __props.item.rel, + "no-icon": __props.item.noIcon, + tabindex: "0" + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${__props.item.text ?? ""}`); + } else { + return [ + createVNode("span", { + innerHTML: __props.item.text + }, null, 8, ["innerHTML"]) + ]; + } + }), + _: 1 + }, _parent)); + }; + } +}); +const _sfc_setup$w = _sfc_main$w.setup; +_sfc_main$w.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarMenuLink.vue"); + return _sfc_setup$w ? _sfc_setup$w(props, ctx) : void 0; +}; +const VPNavBarMenuLink = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["__scopeId", "data-v-e56f3d57"]]); +const _sfc_main$v = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarMenuGroup", + __ssrInlineRender: true, + props: { + item: {} + }, + setup(__props) { + const props = __props; + const { page } = useData(); + const isChildActive = (navItem) => { + if ("component" in navItem) return false; + if ("link" in navItem) { + return isActive( + page.value.relativePath, + navItem.link, + !!props.item.activeMatch + ); + } + return navItem.items.some(isChildActive); + }; + const childrenActive = computed(() => isChildActive(props.item)); + return (_ctx, _push, _parent, _attrs) => { + _push(ssrRenderComponent(VPFlyout, mergeProps({ + class: { + VPNavBarMenuGroup: true, + active: unref(isActive)(unref(page).relativePath, __props.item.activeMatch, !!__props.item.activeMatch) || childrenActive.value + }, + button: __props.item.text, + items: __props.item.items + }, _attrs), null, _parent)); + }; + } +}); +const _sfc_setup$v = _sfc_main$v.setup; +_sfc_main$v.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarMenuGroup.vue"); + return _sfc_setup$v ? _sfc_setup$v(props, ctx) : void 0; +}; +const _sfc_main$u = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarMenu", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(theme2).nav) { + _push(` Main Navigation `); + ssrRenderList(unref(theme2).nav, (item) => { + _push(``); + if ("link" in item) { + _push(ssrRenderComponent(VPNavBarMenuLink, { item }, null, _parent)); + } else if ("component" in item) { + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(item.component), mergeProps({ ref_for: true }, item.props), null), _parent); + } else { + _push(ssrRenderComponent(_sfc_main$v, { item }, null, _parent)); + } + _push(``); + }); + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$u = _sfc_main$u.setup; +_sfc_main$u.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarMenu.vue"); + return _sfc_setup$u ? _sfc_setup$u(props, ctx) : void 0; +}; +const VPNavBarMenu = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["__scopeId", "data-v-dc692963"]]); +function createSearchTranslate(defaultTranslations) { + const { localeIndex, theme: theme2 } = useData(); + function translate(key) { + var _a, _b, _c; + const keyPath = key.split("."); + const themeObject = (_a = theme2.value.search) == null ? void 0 : _a.options; + const isObject = themeObject && typeof themeObject === "object"; + const locales = isObject && ((_c = (_b = themeObject.locales) == null ? void 0 : _b[localeIndex.value]) == null ? void 0 : _c.translations) || null; + const translations = isObject && themeObject.translations || null; + let localeResult = locales; + let translationResult = translations; + let defaultResult = defaultTranslations; + const lastKey = keyPath.pop(); + for (const k of keyPath) { + let fallbackResult = null; + const foundInFallback = defaultResult == null ? void 0 : defaultResult[k]; + if (foundInFallback) { + fallbackResult = defaultResult = foundInFallback; + } + const foundInTranslation = translationResult == null ? void 0 : translationResult[k]; + if (foundInTranslation) { + fallbackResult = translationResult = foundInTranslation; + } + const foundInLocale = localeResult == null ? void 0 : localeResult[k]; + if (foundInLocale) { + fallbackResult = localeResult = foundInLocale; + } + if (!foundInFallback) { + defaultResult = fallbackResult; + } + if (!foundInTranslation) { + translationResult = fallbackResult; + } + if (!foundInLocale) { + localeResult = fallbackResult; + } + } + return (localeResult == null ? void 0 : localeResult[lastKey]) ?? (translationResult == null ? void 0 : translationResult[lastKey]) ?? (defaultResult == null ? void 0 : defaultResult[lastKey]) ?? ""; + } + return translate; +} +const _sfc_main$t = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarSearchButton", + __ssrInlineRender: true, + setup(__props) { + const defaultTranslations = { + button: { + buttonText: "Search", + buttonAriaLabel: "Search" + } + }; + const translate = createSearchTranslate(defaultTranslations); + return (_ctx, _push, _parent, _attrs) => { + _push(`${ssrInterpolate(unref(translate)("button.buttonText"))}K`); + }; + } +}); +const _sfc_setup$t = _sfc_main$t.setup; +_sfc_main$t.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearchButton.vue"); + return _sfc_setup$t ? _sfc_setup$t(props, ctx) : void 0; +}; +const _sfc_main$s = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarSearch", + __ssrInlineRender: true, + setup(__props) { + const VPLocalSearchBox = () => null; + const VPAlgoliaSearchBox = () => null; + const { theme: theme2 } = useData(); + const loaded = ref(false); + const actuallyLoaded = ref(false); + onMounted(() => { + { + return; + } + }); + function load() { + if (!loaded.value) { + loaded.value = true; + setTimeout(poll, 16); + } + } + function poll() { + const e = new Event("keydown"); + e.key = "k"; + e.metaKey = true; + window.dispatchEvent(e); + setTimeout(() => { + if (!document.querySelector(".DocSearch-Modal")) { + poll(); + } + }, 16); + } + const showSearch = ref(false); + const provider = ""; + return (_ctx, _push, _parent, _attrs) => { + var _a; + _push(``); + if (unref(provider) === "local") { + _push(``); + if (showSearch.value) { + _push(ssrRenderComponent(unref(VPLocalSearchBox), { + onClose: ($event) => showSearch.value = false + }, null, _parent)); + } else { + _push(``); + } + _push(``); + } else if (unref(provider) === "algolia") { + _push(``); + if (loaded.value) { + _push(ssrRenderComponent(unref(VPAlgoliaSearchBox), { + algolia: ((_a = unref(theme2).search) == null ? void 0 : _a.options) ?? unref(theme2).algolia, + onVnodeBeforeMount: ($event) => actuallyLoaded.value = true + }, null, _parent)); + } else { + _push(``); + } + if (!actuallyLoaded.value) { + _push(`
    `); + _push(ssrRenderComponent(_sfc_main$t, { onClick: load }, null, _parent)); + _push(`
    `); + } else { + _push(``); + } + _push(``); + } else { + _push(``); + } + _push(``); + }; + } +}); +const _sfc_setup$s = _sfc_main$s.setup; +_sfc_main$s.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearch.vue"); + return _sfc_setup$s ? _sfc_setup$s(props, ctx) : void 0; +}; +const _sfc_main$r = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarSocialLinks", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(theme2).socialLinks) { + _push(ssrRenderComponent(VPSocialLinks, mergeProps({ + class: "VPNavBarSocialLinks", + links: unref(theme2).socialLinks + }, _attrs), null, _parent)); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$r = _sfc_main$r.setup; +_sfc_main$r.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarSocialLinks.vue"); + return _sfc_setup$r ? _sfc_setup$r(props, ctx) : void 0; +}; +const VPNavBarSocialLinks = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["__scopeId", "data-v-0394ad82"]]); +const _sfc_main$q = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarTitle", + __ssrInlineRender: true, + setup(__props) { + const { site, theme: theme2 } = useData(); + const { hasSidebar } = useSidebar(); + const { currentLang } = useLangs(); + const link2 = computed( + () => { + var _a; + return typeof theme2.value.logoLink === "string" ? theme2.value.logoLink : (_a = theme2.value.logoLink) == null ? void 0 : _a.link; + } + ); + const rel = computed( + () => { + var _a; + return typeof theme2.value.logoLink === "string" ? void 0 : (_a = theme2.value.logoLink) == null ? void 0 : _a.rel; + } + ); + const target = computed( + () => { + var _a; + return typeof theme2.value.logoLink === "string" ? void 0 : (_a = theme2.value.logoLink) == null ? void 0 : _a.target; + } + ); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderSlot(_ctx.$slots, "nav-bar-title-before", {}, null, _push, _parent); + if (unref(theme2).logo) { + _push(ssrRenderComponent(VPImage, { + class: "logo", + image: unref(theme2).logo + }, null, _parent)); + } else { + _push(``); + } + if (unref(theme2).siteTitle) { + _push(`${unref(theme2).siteTitle ?? ""}`); + } else if (unref(theme2).siteTitle === void 0) { + _push(`${ssrInterpolate(unref(site).title)}`); + } else { + _push(``); + } + ssrRenderSlot(_ctx.$slots, "nav-bar-title-after", {}, null, _push, _parent); + _push(``); + }; + } +}); +const _sfc_setup$q = _sfc_main$q.setup; +_sfc_main$q.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarTitle.vue"); + return _sfc_setup$q ? _sfc_setup$q(props, ctx) : void 0; +}; +const VPNavBarTitle = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["__scopeId", "data-v-1168a8e4"]]); +const _sfc_main$p = /* @__PURE__ */ defineComponent({ + __name: "VPNavBarTranslations", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + const { localeLinks, currentLang } = useLangs({ correspondingLink: true }); + return (_ctx, _push, _parent, _attrs) => { + if (unref(localeLinks).length && unref(currentLang).label) { + _push(ssrRenderComponent(VPFlyout, mergeProps({ + class: "VPNavBarTranslations", + icon: "vpi-languages", + label: unref(theme2).langMenuLabel || "Change language" + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`

    ${ssrInterpolate(unref(currentLang).label)}

    `); + ssrRenderList(unref(localeLinks), (locale) => { + _push2(ssrRenderComponent(VPMenuLink, { item: locale }, null, _parent2, _scopeId)); + }); + _push2(`
    `); + } else { + return [ + createVNode("div", { class: "items" }, [ + createVNode("p", { class: "title" }, toDisplayString(unref(currentLang).label), 1), + (openBlock(true), createBlock(Fragment, null, renderList(unref(localeLinks), (locale) => { + return openBlock(), createBlock(VPMenuLink, { + key: locale.link, + item: locale + }, null, 8, ["item"]); + }), 128)) + ]) + ]; + } + }), + _: 1 + }, _parent)); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$p = _sfc_main$p.setup; +_sfc_main$p.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBarTranslations.vue"); + return _sfc_setup$p ? _sfc_setup$p(props, ctx) : void 0; +}; +const VPNavBarTranslations = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["__scopeId", "data-v-88af2de4"]]); +const _sfc_main$o = /* @__PURE__ */ defineComponent({ + __name: "VPNavBar", + __ssrInlineRender: true, + props: { + isScreenOpen: { type: Boolean } + }, + emits: ["toggle-screen"], + setup(__props) { + const props = __props; + const { y } = useWindowScroll(); + const { hasSidebar } = useSidebar(); + const { frontmatter } = useData(); + const classes = ref({}); + watchPostEffect(() => { + classes.value = { + "has-sidebar": hasSidebar.value, + "home": frontmatter.value.layout === "home", + "top": y.value === 0, + "screen-open": props.isScreenOpen + }; + }); + return (_ctx, _push, _parent, _attrs) => { + _push(`
    `); + _push(ssrRenderComponent(VPNavBarTitle, null, { + "nav-bar-title-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-title-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-title-before", {}, void 0, true) + ]; + } + }), + "nav-bar-title-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-title-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-title-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "nav-bar-content-before", {}, null, _push, _parent); + _push(ssrRenderComponent(_sfc_main$s, { class: "search" }, null, _parent)); + _push(ssrRenderComponent(VPNavBarMenu, { class: "menu" }, null, _parent)); + _push(ssrRenderComponent(VPNavBarTranslations, { class: "translations" }, null, _parent)); + _push(ssrRenderComponent(VPNavBarAppearance, { class: "appearance" }, null, _parent)); + _push(ssrRenderComponent(VPNavBarSocialLinks, { class: "social-links" }, null, _parent)); + _push(ssrRenderComponent(VPNavBarExtra, { class: "extra" }, null, _parent)); + ssrRenderSlot(_ctx.$slots, "nav-bar-content-after", {}, null, _push, _parent); + _push(ssrRenderComponent(VPNavBarHamburger, { + class: "hamburger", + active: __props.isScreenOpen, + onClick: ($event) => _ctx.$emit("toggle-screen") + }, null, _parent)); + _push(`
    `); + }; + } +}); +const _sfc_setup$o = _sfc_main$o.setup; +_sfc_main$o.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavBar.vue"); + return _sfc_setup$o ? _sfc_setup$o(props, ctx) : void 0; +}; +const VPNavBar = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["__scopeId", "data-v-6aa21345"]]); +const _sfc_main$n = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenAppearance", + __ssrInlineRender: true, + setup(__props) { + const { site, theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(site).appearance && unref(site).appearance !== "force-dark" && unref(site).appearance !== "force-auto") { + _push(`

    ${ssrInterpolate(unref(theme2).darkModeSwitchLabel || "Appearance")}

    `); + _push(ssrRenderComponent(VPSwitchAppearance, null, null, _parent)); + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$n = _sfc_main$n.setup; +_sfc_main$n.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenAppearance.vue"); + return _sfc_setup$n ? _sfc_setup$n(props, ctx) : void 0; +}; +const VPNavScreenAppearance = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["__scopeId", "data-v-b44890b2"]]); +const _sfc_main$m = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenMenuLink", + __ssrInlineRender: true, + props: { + item: {} + }, + setup(__props) { + const closeScreen = inject("close-screen"); + return (_ctx, _push, _parent, _attrs) => { + _push(ssrRenderComponent(_sfc_main$Z, mergeProps({ + class: "VPNavScreenMenuLink", + href: __props.item.link, + target: __props.item.target, + rel: __props.item.rel, + "no-icon": __props.item.noIcon, + onClick: unref(closeScreen) + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${__props.item.text ?? ""}`); + } else { + return [ + createVNode("span", { + innerHTML: __props.item.text + }, null, 8, ["innerHTML"]) + ]; + } + }), + _: 1 + }, _parent)); + }; + } +}); +const _sfc_setup$m = _sfc_main$m.setup; +_sfc_main$m.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenMenuLink.vue"); + return _sfc_setup$m ? _sfc_setup$m(props, ctx) : void 0; +}; +const VPNavScreenMenuLink = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["__scopeId", "data-v-df37e6dd"]]); +const _sfc_main$l = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenMenuGroupLink", + __ssrInlineRender: true, + props: { + item: {} + }, + setup(__props) { + const closeScreen = inject("close-screen"); + return (_ctx, _push, _parent, _attrs) => { + _push(ssrRenderComponent(_sfc_main$Z, mergeProps({ + class: "VPNavScreenMenuGroupLink", + href: __props.item.link, + target: __props.item.target, + rel: __props.item.rel, + "no-icon": __props.item.noIcon, + onClick: unref(closeScreen) + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${__props.item.text ?? ""}`); + } else { + return [ + createVNode("span", { + innerHTML: __props.item.text + }, null, 8, ["innerHTML"]) + ]; + } + }), + _: 1 + }, _parent)); + }; + } +}); +const _sfc_setup$l = _sfc_main$l.setup; +_sfc_main$l.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenMenuGroupLink.vue"); + return _sfc_setup$l ? _sfc_setup$l(props, ctx) : void 0; +}; +const VPNavScreenMenuGroupLink = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["__scopeId", "data-v-3e9c20e4"]]); +const _sfc_main$k = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenMenuGroupSection", + __ssrInlineRender: true, + props: { + text: {}, + items: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + if (__props.text) { + _push(`

    ${ssrInterpolate(__props.text)}

    `); + } else { + _push(``); + } + _push(``); + ssrRenderList(__props.items, (item) => { + _push(ssrRenderComponent(VPNavScreenMenuGroupLink, { + key: item.text, + item + }, null, _parent)); + }); + _push(``); + }; + } +}); +const _sfc_setup$k = _sfc_main$k.setup; +_sfc_main$k.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenMenuGroupSection.vue"); + return _sfc_setup$k ? _sfc_setup$k(props, ctx) : void 0; +}; +const VPNavScreenMenuGroupSection = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-8133b170"]]); +const _sfc_main$j = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenMenuGroup", + __ssrInlineRender: true, + props: { + text: {}, + items: {} + }, + setup(__props) { + const props = __props; + const isOpen = ref(false); + const groupId = computed( + () => `NavScreenGroup-${props.text.replace(" ", "-").toLowerCase()}` + ); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderList(__props.items, (item) => { + _push(``); + if ("link" in item) { + _push(`
    `); + _push(ssrRenderComponent(VPNavScreenMenuGroupLink, { item }, null, _parent)); + _push(`
    `); + } else if ("component" in item) { + _push(`
    `); + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(item.component), mergeProps({ ref_for: true }, item.props, { "screen-menu": "" }), null), _parent); + _push(`
    `); + } else { + _push(`
    `); + _push(ssrRenderComponent(VPNavScreenMenuGroupSection, { + text: item.text, + items: item.items + }, null, _parent)); + _push(`
    `); + } + _push(``); + }); + _push(``); + }; + } +}); +const _sfc_setup$j = _sfc_main$j.setup; +_sfc_main$j.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenMenuGroup.vue"); + return _sfc_setup$j ? _sfc_setup$j(props, ctx) : void 0; +}; +const VPNavScreenMenuGroup = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["__scopeId", "data-v-b9ab8c58"]]); +const _sfc_main$i = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenMenu", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(theme2).nav) { + _push(``); + ssrRenderList(unref(theme2).nav, (item) => { + _push(``); + if ("link" in item) { + _push(ssrRenderComponent(VPNavScreenMenuLink, { item }, null, _parent)); + } else if ("component" in item) { + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(item.component), mergeProps({ ref_for: true }, item.props, { "screen-menu": "" }), null), _parent); + } else { + _push(ssrRenderComponent(VPNavScreenMenuGroup, { + text: item.text || "", + items: item.items + }, null, _parent)); + } + _push(``); + }); + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$i = _sfc_main$i.setup; +_sfc_main$i.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenMenu.vue"); + return _sfc_setup$i ? _sfc_setup$i(props, ctx) : void 0; +}; +const _sfc_main$h = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenSocialLinks", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + return (_ctx, _push, _parent, _attrs) => { + if (unref(theme2).socialLinks) { + _push(ssrRenderComponent(VPSocialLinks, mergeProps({ + class: "VPNavScreenSocialLinks", + links: unref(theme2).socialLinks + }, _attrs), null, _parent)); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$h = _sfc_main$h.setup; +_sfc_main$h.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenSocialLinks.vue"); + return _sfc_setup$h ? _sfc_setup$h(props, ctx) : void 0; +}; +const _sfc_main$g = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreenTranslations", + __ssrInlineRender: true, + setup(__props) { + const { localeLinks, currentLang } = useLangs({ correspondingLink: true }); + const isOpen = ref(false); + return (_ctx, _push, _parent, _attrs) => { + if (unref(localeLinks).length && unref(currentLang).label) { + _push(`
      `); + ssrRenderList(unref(localeLinks), (locale) => { + _push(`
    • `); + _push(ssrRenderComponent(_sfc_main$Z, { + class: "link", + href: locale.link + }, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${ssrInterpolate(locale.text)}`); + } else { + return [ + createTextVNode(toDisplayString(locale.text), 1) + ]; + } + }), + _: 2 + }, _parent)); + _push(`
    • `); + }); + _push(`
    `); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$g = _sfc_main$g.setup; +_sfc_main$g.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreenTranslations.vue"); + return _sfc_setup$g ? _sfc_setup$g(props, ctx) : void 0; +}; +const VPNavScreenTranslations = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["__scopeId", "data-v-858fe1a4"]]); +const _sfc_main$f = /* @__PURE__ */ defineComponent({ + __name: "VPNavScreen", + __ssrInlineRender: true, + props: { + open: { type: Boolean } + }, + setup(__props) { + const screen = ref(null); + useScrollLock(inBrowser ? document.body : null); + return (_ctx, _push, _parent, _attrs) => { + if (__props.open) { + _push(`
    `); + ssrRenderSlot(_ctx.$slots, "nav-screen-content-before", {}, null, _push, _parent); + _push(ssrRenderComponent(_sfc_main$i, { class: "menu" }, null, _parent)); + _push(ssrRenderComponent(VPNavScreenTranslations, { class: "translations" }, null, _parent)); + _push(ssrRenderComponent(VPNavScreenAppearance, { class: "appearance" }, null, _parent)); + _push(ssrRenderComponent(_sfc_main$h, { class: "social-links" }, null, _parent)); + ssrRenderSlot(_ctx.$slots, "nav-screen-content-after", {}, null, _push, _parent); + _push(`
    `); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$f = _sfc_main$f.setup; +_sfc_main$f.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNavScreen.vue"); + return _sfc_setup$f ? _sfc_setup$f(props, ctx) : void 0; +}; +const VPNavScreen = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-f2779853"]]); +const _sfc_main$e = /* @__PURE__ */ defineComponent({ + __name: "VPNav", + __ssrInlineRender: true, + setup(__props) { + const { isScreenOpen, closeScreen, toggleScreen } = useNav(); + const { frontmatter } = useData(); + const hasNavbar = computed(() => { + return frontmatter.value.navbar !== false; + }); + provide("close-screen", closeScreen); + watchEffect(() => { + if (inBrowser) { + document.documentElement.classList.toggle("hide-nav", !hasNavbar.value); + } + }); + return (_ctx, _push, _parent, _attrs) => { + if (hasNavbar.value) { + _push(``); + _push(ssrRenderComponent(VPNavBar, { + "is-screen-open": unref(isScreenOpen), + onToggleScreen: unref(toggleScreen) + }, { + "nav-bar-title-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-title-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-title-before", {}, void 0, true) + ]; + } + }), + "nav-bar-title-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-title-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-title-after", {}, void 0, true) + ]; + } + }), + "nav-bar-content-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-content-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-content-before", {}, void 0, true) + ]; + } + }), + "nav-bar-content-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-content-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-content-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(ssrRenderComponent(VPNavScreen, { open: unref(isScreenOpen) }, { + "nav-screen-content-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-screen-content-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-screen-content-before", {}, void 0, true) + ]; + } + }), + "nav-screen-content-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-screen-content-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-screen-content-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(``); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$e = _sfc_main$e.setup; +_sfc_main$e.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPNav.vue"); + return _sfc_setup$e ? _sfc_setup$e(props, ctx) : void 0; +}; +const VPNav = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-ae24b3ad"]]); +const _sfc_main$d = /* @__PURE__ */ defineComponent({ + __name: "VPSidebarItem", + __ssrInlineRender: true, + props: { + item: {}, + depth: {} + }, + setup(__props) { + const props = __props; + const { + collapsed, + collapsible, + isLink, + isActiveLink, + hasActiveLink: hasActiveLink2, + hasChildren, + toggle + } = useSidebarControl(computed(() => props.item)); + const sectionTag = computed(() => hasChildren.value ? "section" : `div`); + const linkTag = computed(() => isLink.value ? "a" : "div"); + const textTag = computed(() => { + return !hasChildren.value ? "p" : props.depth + 2 === 7 ? "p" : `h${props.depth + 2}`; + }); + const itemRole = computed(() => isLink.value ? void 0 : "button"); + const classes = computed(() => [ + [`level-${props.depth}`], + { collapsible: collapsible.value }, + { collapsed: collapsed.value }, + { "is-link": isLink.value }, + { "is-active": isActiveLink.value }, + { "has-active": hasActiveLink2.value } + ]); + function onItemInteraction(e) { + if ("key" in e && e.key !== "Enter") { + return; + } + !props.item.link && toggle(); + } + function onCaretClick() { + props.item.link && toggle(); + } + return (_ctx, _push, _parent, _attrs) => { + const _component_VPSidebarItem = resolveComponent("VPSidebarItem", true); + ssrRenderVNode(_push, createVNode(resolveDynamicComponent(sectionTag.value), mergeProps({ + class: ["VPSidebarItem", classes.value] + }, _attrs), { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + if (__props.item.text) { + _push2(`
    `); + if (__props.item.link) { + _push2(ssrRenderComponent(_sfc_main$Z, { + tag: linkTag.value, + class: "link", + href: __props.item.link, + rel: __props.item.rel, + target: __props.item.target + }, { + default: withCtx((_2, _push3, _parent3, _scopeId2) => { + if (_push3) { + ssrRenderVNode(_push3, createVNode(resolveDynamicComponent(textTag.value), { class: "text" }, null), _parent3, _scopeId2); + } else { + return [ + (openBlock(), createBlock(resolveDynamicComponent(textTag.value), { + class: "text", + innerHTML: __props.item.text + }, null, 8, ["innerHTML"])) + ]; + } + }), + _: 1 + }, _parent2, _scopeId)); + } else { + ssrRenderVNode(_push2, createVNode(resolveDynamicComponent(textTag.value), { class: "text" }, null), _parent2, _scopeId); + } + if (__props.item.collapsed != null && __props.item.items && __props.item.items.length) { + _push2(`
    `); + } else { + _push2(``); + } + _push2(`
    `); + } else { + _push2(``); + } + if (__props.item.items && __props.item.items.length) { + _push2(`
    `); + if (__props.depth < 5) { + _push2(``); + ssrRenderList(__props.item.items, (i) => { + _push2(ssrRenderComponent(_component_VPSidebarItem, { + key: i.text, + item: i, + depth: __props.depth + 1 + }, null, _parent2, _scopeId)); + }); + _push2(``); + } else { + _push2(``); + } + _push2(`
    `); + } else { + _push2(``); + } + } else { + return [ + __props.item.text ? (openBlock(), createBlock("div", mergeProps({ + key: 0, + class: "item", + role: itemRole.value + }, toHandlers( + __props.item.items ? { click: onItemInteraction, keydown: onItemInteraction } : {}, + true + ), { + tabindex: __props.item.items && 0 + }), [ + createVNode("div", { class: "indicator" }), + __props.item.link ? (openBlock(), createBlock(_sfc_main$Z, { + key: 0, + tag: linkTag.value, + class: "link", + href: __props.item.link, + rel: __props.item.rel, + target: __props.item.target + }, { + default: withCtx(() => [ + (openBlock(), createBlock(resolveDynamicComponent(textTag.value), { + class: "text", + innerHTML: __props.item.text + }, null, 8, ["innerHTML"])) + ]), + _: 1 + }, 8, ["tag", "href", "rel", "target"])) : (openBlock(), createBlock(resolveDynamicComponent(textTag.value), { + key: 1, + class: "text", + innerHTML: __props.item.text + }, null, 8, ["innerHTML"])), + __props.item.collapsed != null && __props.item.items && __props.item.items.length ? (openBlock(), createBlock("div", { + key: 2, + class: "caret", + role: "button", + "aria-label": "toggle section", + onClick: onCaretClick, + onKeydown: withKeys(onCaretClick, ["enter"]), + tabindex: "0" + }, [ + createVNode("span", { class: "vpi-chevron-right caret-icon" }) + ], 32)) : createCommentVNode("", true) + ], 16, ["role", "tabindex"])) : createCommentVNode("", true), + __props.item.items && __props.item.items.length ? (openBlock(), createBlock("div", { + key: 1, + class: "items" + }, [ + __props.depth < 5 ? (openBlock(true), createBlock(Fragment, { key: 0 }, renderList(__props.item.items, (i) => { + return openBlock(), createBlock(_component_VPSidebarItem, { + key: i.text, + item: i, + depth: __props.depth + 1 + }, null, 8, ["item", "depth"]); + }), 128)) : createCommentVNode("", true) + ])) : createCommentVNode("", true) + ]; + } + }), + _: 1 + }), _parent); + }; + } +}); +const _sfc_setup$d = _sfc_main$d.setup; +_sfc_main$d.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSidebarItem.vue"); + return _sfc_setup$d ? _sfc_setup$d(props, ctx) : void 0; +}; +const VPSidebarItem = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["__scopeId", "data-v-b3fd67f8"]]); +const _sfc_main$c = /* @__PURE__ */ defineComponent({ + __name: "VPSidebarGroup", + __ssrInlineRender: true, + props: { + items: {} + }, + setup(__props) { + const disableTransition = ref(true); + let timer = null; + onMounted(() => { + timer = setTimeout(() => { + timer = null; + disableTransition.value = false; + }, 300); + }); + onBeforeUnmount(() => { + if (timer != null) { + clearTimeout(timer); + timer = null; + } + }); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderList(__props.items, (item) => { + _push(`
    `); + _push(ssrRenderComponent(VPSidebarItem, { + item, + depth: 0 + }, null, _parent)); + _push(`
    `); + }); + _push(``); + }; + } +}); +const _sfc_setup$c = _sfc_main$c.setup; +_sfc_main$c.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSidebarGroup.vue"); + return _sfc_setup$c ? _sfc_setup$c(props, ctx) : void 0; +}; +const VPSidebarGroup = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-c40bc020"]]); +const _sfc_main$b = /* @__PURE__ */ defineComponent({ + __name: "VPSidebar", + __ssrInlineRender: true, + props: { + open: { type: Boolean } + }, + setup(__props) { + const { sidebarGroups, hasSidebar } = useSidebar(); + const props = __props; + const navEl = ref(null); + const isLocked = useScrollLock(inBrowser ? document.body : null); + watch( + [props, navEl], + () => { + var _a; + if (props.open) { + isLocked.value = true; + (_a = navEl.value) == null ? void 0 : _a.focus(); + } else isLocked.value = false; + }, + { immediate: true, flush: "post" } + ); + const key = ref(0); + watch( + sidebarGroups, + () => { + key.value += 1; + }, + { deep: true } + ); + return (_ctx, _push, _parent, _attrs) => { + if (unref(hasSidebar)) { + _push(`
    `); + } else { + _push(``); + } + }; + } +}); +const _sfc_setup$b = _sfc_main$b.setup; +_sfc_main$b.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSidebar.vue"); + return _sfc_setup$b ? _sfc_setup$b(props, ctx) : void 0; +}; +const VPSidebar = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__scopeId", "data-v-319d5ca6"]]); +const _sfc_main$a = /* @__PURE__ */ defineComponent({ + __name: "VPSkipLink", + __ssrInlineRender: true, + setup(__props) { + const { theme: theme2 } = useData(); + const route = useRoute(); + const backToTop = ref(); + watch(() => route.path, () => backToTop.value.focus()); + return (_ctx, _push, _parent, _attrs) => { + _push(`${ssrInterpolate(unref(theme2).skipToContentLabel || "Skip to content")}`); + }; + } +}); +const _sfc_setup$a = _sfc_main$a.setup; +_sfc_main$a.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSkipLink.vue"); + return _sfc_setup$a ? _sfc_setup$a(props, ctx) : void 0; +}; +const VPSkipLink = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-0b0ada53"]]); +const _sfc_main$9 = /* @__PURE__ */ defineComponent({ + __name: "Layout", + __ssrInlineRender: true, + setup(__props) { + const { + isOpen: isSidebarOpen, + open: openSidebar, + close: closeSidebar + } = useSidebar(); + const route = useRoute(); + watch(() => route.path, closeSidebar); + useCloseSidebarOnEscape(isSidebarOpen, closeSidebar); + const { frontmatter } = useData(); + const slots = useSlots(); + const heroImageSlotExists = computed(() => !!slots["home-hero-image"]); + provide("hero-image-slot-exists", heroImageSlotExists); + return (_ctx, _push, _parent, _attrs) => { + const _component_Content = resolveComponent("Content"); + if (unref(frontmatter).layout !== false) { + _push(``); + ssrRenderSlot(_ctx.$slots, "layout-top", {}, null, _push, _parent); + _push(ssrRenderComponent(VPSkipLink, null, null, _parent)); + _push(ssrRenderComponent(VPBackdrop, { + class: "backdrop", + show: unref(isSidebarOpen), + onClick: unref(closeSidebar) + }, null, _parent)); + _push(ssrRenderComponent(VPNav, null, { + "nav-bar-title-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-title-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-title-before", {}, void 0, true) + ]; + } + }), + "nav-bar-title-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-title-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-title-after", {}, void 0, true) + ]; + } + }), + "nav-bar-content-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-content-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-content-before", {}, void 0, true) + ]; + } + }), + "nav-bar-content-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-bar-content-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-bar-content-after", {}, void 0, true) + ]; + } + }), + "nav-screen-content-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-screen-content-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-screen-content-before", {}, void 0, true) + ]; + } + }), + "nav-screen-content-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "nav-screen-content-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "nav-screen-content-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(ssrRenderComponent(VPLocalNav, { + open: unref(isSidebarOpen), + onOpenMenu: unref(openSidebar) + }, null, _parent)); + _push(ssrRenderComponent(VPSidebar, { open: unref(isSidebarOpen) }, { + "sidebar-nav-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "sidebar-nav-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "sidebar-nav-before", {}, void 0, true) + ]; + } + }), + "sidebar-nav-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "sidebar-nav-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "sidebar-nav-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(ssrRenderComponent(VPContent, null, { + "page-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "page-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "page-top", {}, void 0, true) + ]; + } + }), + "page-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "page-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "page-bottom", {}, void 0, true) + ]; + } + }), + "not-found": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "not-found", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "not-found", {}, void 0, true) + ]; + } + }), + "home-hero-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-before", {}, void 0, true) + ]; + } + }), + "home-hero-info-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-before", {}, void 0, true) + ]; + } + }), + "home-hero-info": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info", {}, void 0, true) + ]; + } + }), + "home-hero-info-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-info-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-info-after", {}, void 0, true) + ]; + } + }), + "home-hero-actions-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-actions-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-actions-after", {}, void 0, true) + ]; + } + }), + "home-hero-image": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-image", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-image", {}, void 0, true) + ]; + } + }), + "home-hero-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-hero-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-hero-after", {}, void 0, true) + ]; + } + }), + "home-features-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-features-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-features-before", {}, void 0, true) + ]; + } + }), + "home-features-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "home-features-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "home-features-after", {}, void 0, true) + ]; + } + }), + "doc-footer-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-footer-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-footer-before", {}, void 0, true) + ]; + } + }), + "doc-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-before", {}, void 0, true) + ]; + } + }), + "doc-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-after", {}, void 0, true) + ]; + } + }), + "doc-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-top", {}, void 0, true) + ]; + } + }), + "doc-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "doc-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "doc-bottom", {}, void 0, true) + ]; + } + }), + "aside-top": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-top", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-top", {}, void 0, true) + ]; + } + }), + "aside-bottom": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-bottom", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-bottom", {}, void 0, true) + ]; + } + }), + "aside-outline-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-outline-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-outline-before", {}, void 0, true) + ]; + } + }), + "aside-outline-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-outline-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-outline-after", {}, void 0, true) + ]; + } + }), + "aside-ads-before": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-ads-before", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-ads-before", {}, void 0, true) + ]; + } + }), + "aside-ads-after": withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + ssrRenderSlot(_ctx.$slots, "aside-ads-after", {}, null, _push2, _parent2, _scopeId); + } else { + return [ + renderSlot(_ctx.$slots, "aside-ads-after", {}, void 0, true) + ]; + } + }), + _: 3 + }, _parent)); + _push(ssrRenderComponent(VPFooter, null, null, _parent)); + ssrRenderSlot(_ctx.$slots, "layout-bottom", {}, null, _push, _parent); + _push(``); + } else { + _push(ssrRenderComponent(_component_Content, _attrs, null, _parent)); + } + }; + } +}); +const _sfc_setup$9 = _sfc_main$9.setup; +_sfc_main$9.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/Layout.vue"); + return _sfc_setup$9 ? _sfc_setup$9(props, ctx) : void 0; +}; +const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-5d98c3a5"]]); +const GridSettings = { + xmini: [[0, 2]], + mini: [], + small: [ + [920, 6], + [768, 5], + [640, 4], + [480, 3], + [0, 2] + ], + medium: [ + [960, 5], + [832, 4], + [640, 3], + [480, 2] + ], + big: [ + [832, 3], + [640, 2] + ] +}; +function useSponsorsGrid({ el, size = "medium" }) { + const onResize = throttleAndDebounce(manage, 100); + onMounted(() => { + manage(); + window.addEventListener("resize", onResize); + }); + onUnmounted(() => { + window.removeEventListener("resize", onResize); + }); + function manage() { + adjustSlots(el.value, size); + } +} +function adjustSlots(el, size) { + const tsize = el.children.length; + const asize = el.querySelectorAll(".vp-sponsor-grid-item:not(.empty)").length; + const grid = setGrid(el, size, asize); + manageSlots(el, grid, tsize, asize); +} +function setGrid(el, size, items) { + const settings = GridSettings[size]; + const screen = window.innerWidth; + let grid = 1; + settings.some(([breakpoint, value]) => { + if (screen >= breakpoint) { + grid = items < value ? items : value; + return true; + } + }); + setGridData(el, grid); + return grid; +} +function setGridData(el, value) { + el.dataset.vpGrid = String(value); +} +function manageSlots(el, grid, tsize, asize) { + const diff = tsize - asize; + const rem = asize % grid; + const drem = rem === 0 ? rem : grid - rem; + neutralizeSlots(el, drem - diff); +} +function neutralizeSlots(el, count) { + if (count === 0) { + return; + } + count > 0 ? addSlots(el, count) : removeSlots(el, count * -1); +} +function addSlots(el, count) { + for (let i = 0; i < count; i++) { + const slot = document.createElement("div"); + slot.classList.add("vp-sponsor-grid-item", "empty"); + el.append(slot); + } +} +function removeSlots(el, count) { + for (let i = 0; i < count; i++) { + el.removeChild(el.lastElementChild); + } +} +const _sfc_main$8 = /* @__PURE__ */ defineComponent({ + __name: "VPSponsorsGrid", + __ssrInlineRender: true, + props: { + size: { default: "medium" }, + data: {} + }, + setup(__props) { + const props = __props; + const el = ref(null); + useSponsorsGrid({ el, size: props.size }); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderList(__props.data, (sponsor) => { + _push(``); + }); + _push(``); + }; + } +}); +const _sfc_setup$8 = _sfc_main$8.setup; +_sfc_main$8.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSponsorsGrid.vue"); + return _sfc_setup$8 ? _sfc_setup$8(props, ctx) : void 0; +}; +const _sfc_main$7 = /* @__PURE__ */ defineComponent({ + __name: "VPSponsors", + __ssrInlineRender: true, + props: { + mode: { default: "normal" }, + tier: {}, + size: {}, + data: {} + }, + setup(__props) { + const props = __props; + const sponsors = computed(() => { + const isSponsors = props.data.some((s) => { + return "items" in s; + }); + if (isSponsors) { + return props.data; + } + return [ + { tier: props.tier, size: props.size, items: props.data } + ]; + }); + return (_ctx, _push, _parent, _attrs) => { + _push(``); + ssrRenderList(sponsors.value, (sponsor, index) => { + _push(`
    `); + if (sponsor.tier) { + _push(`

    ${ssrInterpolate(sponsor.tier)}

    `); + } else { + _push(``); + } + _push(ssrRenderComponent(_sfc_main$8, { + size: sponsor.size, + data: sponsor.items + }, null, _parent)); + _push(`
    `); + }); + _push(``); + }; + } +}); +const _sfc_setup$7 = _sfc_main$7.setup; +_sfc_main$7.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPSponsors.vue"); + return _sfc_setup$7 ? _sfc_setup$7(props, ctx) : void 0; +}; +const _sfc_main$6 = /* @__PURE__ */ defineComponent({ + __name: "VPDocAsideSponsors", + __ssrInlineRender: true, + props: { + tier: {}, + size: {}, + data: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(``); + _push(ssrRenderComponent(_sfc_main$7, { + mode: "aside", + tier: __props.tier, + size: __props.size, + data: __props.data + }, null, _parent)); + _push(``); + }; + } +}); +const _sfc_setup$6 = _sfc_main$6.setup; +_sfc_main$6.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue"); + return _sfc_setup$6 ? _sfc_setup$6(props, ctx) : void 0; +}; +const _sfc_main$5 = /* @__PURE__ */ defineComponent({ + __name: "VPHomeSponsors", + __ssrInlineRender: true, + props: { + message: {}, + actionText: { default: "Become a sponsor" }, + actionLink: {}, + data: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(`
    `); + if (__props.message) { + _push(`

    ${ssrInterpolate(__props.message)}

    `); + } else { + _push(``); + } + _push(`
    `); + _push(ssrRenderComponent(_sfc_main$7, { data: __props.data }, null, _parent)); + _push(`
    `); + if (__props.actionLink) { + _push(`
    `); + _push(ssrRenderComponent(VPButton, { + theme: "sponsor", + text: __props.actionText, + href: __props.actionLink + }, null, _parent)); + _push(`
    `); + } else { + _push(``); + } + _push(`
    `); + }; + } +}); +const _sfc_setup$5 = _sfc_main$5.setup; +_sfc_main$5.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue"); + return _sfc_setup$5 ? _sfc_setup$5(props, ctx) : void 0; +}; +const _sfc_main$4 = /* @__PURE__ */ defineComponent({ + __name: "VPTeamMembersItem", + __ssrInlineRender: true, + props: { + size: { default: "medium" }, + member: {} + }, + setup(__props) { + return (_ctx, _push, _parent, _attrs) => { + _push(`

    ${ssrInterpolate(__props.member.name)}

    `); + if (__props.member.title || __props.member.org) { + _push(`

    `); + if (__props.member.title) { + _push(`${ssrInterpolate(__props.member.title)}`); + } else { + _push(``); + } + if (__props.member.title && __props.member.org) { + _push(` @ `); + } else { + _push(``); + } + if (__props.member.org) { + _push(ssrRenderComponent(_sfc_main$Z, { + class: ["org", { link: __props.member.orgLink }], + href: __props.member.orgLink, + "no-icon": "" + }, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(`${ssrInterpolate(__props.member.org)}`); + } else { + return [ + createTextVNode(toDisplayString(__props.member.org), 1) + ]; + } + }), + _: 1 + }, _parent)); + } else { + _push(``); + } + _push(`

    `); + } else { + _push(``); + } + if (__props.member.desc) { + _push(`

    ${__props.member.desc ?? ""}

    `); + } else { + _push(``); + } + if (__props.member.links) { + _push(``); + } else { + _push(``); + } + _push(`
    `); + if (__props.member.sponsor) { + _push(`
    `); + _push(ssrRenderComponent(_sfc_main$Z, { + class: "sp-link", + href: __props.member.sponsor, + "no-icon": "" + }, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(` ${ssrInterpolate(__props.member.actionText || "Sponsor")}`); + } else { + return [ + createVNode("span", { class: "vpi-heart sp-icon" }), + createTextVNode(" " + toDisplayString(__props.member.actionText || "Sponsor"), 1) + ]; + } + }), + _: 1 + }, _parent)); + _push(`
    `); + } else { + _push(``); + } + _push(``); + }; + } +}); +const _sfc_setup$4 = _sfc_main$4.setup; +_sfc_main$4.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPTeamMembersItem.vue"); + return _sfc_setup$4 ? _sfc_setup$4(props, ctx) : void 0; +}; +const VPTeamMembersItem = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-f3fa364a"]]); +const _sfc_main$3 = /* @__PURE__ */ defineComponent({ + __name: "VPTeamMembers", + __ssrInlineRender: true, + props: { + size: { default: "medium" }, + members: {} + }, + setup(__props) { + const props = __props; + const classes = computed(() => [props.size, `count-${props.members.length}`]); + return (_ctx, _push, _parent, _attrs) => { + _push(`
    `); + ssrRenderList(__props.members, (member) => { + _push(`
    `); + _push(ssrRenderComponent(VPTeamMembersItem, { + size: __props.size, + member + }, null, _parent)); + _push(`
    `); + }); + _push(`
    `); + }; + } +}); +const _sfc_setup$3 = _sfc_main$3.setup; +_sfc_main$3.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue"); + return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0; +}; +const _sfc_main$2 = {}; +const _sfc_setup$2 = _sfc_main$2.setup; +_sfc_main$2.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue"); + return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0; +}; +const _sfc_main$1 = {}; +const _sfc_setup$1 = _sfc_main$1.setup; +_sfc_main$1.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue"); + return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0; +}; +const _sfc_main = {}; +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const theme = { + Layout, + enhanceApp: ({ app }) => { + app.component("Badge", _sfc_main$14); + } +}; +const ClientOnly = defineComponent({ + setup(_, { slots }) { + const show = ref(false); + onMounted(() => { + show.value = true; + }); + return () => show.value && slots.default ? slots.default() : null; + } +}); +function useCodeGroups() { + if (inBrowser) { + window.addEventListener("click", (e) => { + var _a; + const el = e.target; + if (el.matches(".vp-code-group input")) { + const group = (_a = el.parentElement) == null ? void 0 : _a.parentElement; + if (!group) + return; + const i = Array.from(group.querySelectorAll("input")).indexOf(el); + if (i < 0) + return; + const blocks = group.querySelector(".blocks"); + if (!blocks) + return; + const current = Array.from(blocks.children).find((child) => child.classList.contains("active")); + if (!current) + return; + const next = blocks.children[i]; + if (!next || current === next) + return; + current.classList.remove("active"); + next.classList.add("active"); + const label = group == null ? void 0 : group.querySelector(`label[for="${el.id}"]`); + label == null ? void 0 : label.scrollIntoView({ block: "nearest" }); + } + }); + } +} +function useCopyCode() { + if (inBrowser) { + const timeoutIdMap = /* @__PURE__ */ new WeakMap(); + window.addEventListener("click", (e) => { + var _a; + const el = e.target; + if (el.matches('div[class*="language-"] > button.copy')) { + const parent = el.parentElement; + const sibling = (_a = el.nextElementSibling) == null ? void 0 : _a.nextElementSibling; + if (!parent || !sibling) { + return; + } + const isShell = /language-(shellscript|shell|bash|sh|zsh)/.test(parent.className); + const ignoredNodes = [".vp-copy-ignore", ".diff.remove"]; + const clone = sibling.cloneNode(true); + clone.querySelectorAll(ignoredNodes.join(",")).forEach((node) => node.remove()); + let text = clone.textContent || ""; + if (isShell) { + text = text.replace(/^ *(\$|>) /gm, "").trim(); + } + copyToClipboard(text).then(() => { + el.classList.add("copied"); + clearTimeout(timeoutIdMap.get(el)); + const timeoutId = setTimeout(() => { + el.classList.remove("copied"); + el.blur(); + timeoutIdMap.delete(el); + }, 2e3); + timeoutIdMap.set(el, timeoutId); + }); + } + }); + } +} +async function copyToClipboard(text) { + try { + return navigator.clipboard.writeText(text); + } catch { + const element = document.createElement("textarea"); + const previouslyFocusedElement = document.activeElement; + element.value = text; + element.setAttribute("readonly", ""); + element.style.contain = "strict"; + element.style.position = "absolute"; + element.style.left = "-9999px"; + element.style.fontSize = "12pt"; + const selection = document.getSelection(); + const originalRange = selection ? selection.rangeCount > 0 && selection.getRangeAt(0) : null; + document.body.appendChild(element); + element.select(); + element.selectionStart = 0; + element.selectionEnd = text.length; + document.execCommand("copy"); + document.body.removeChild(element); + if (originalRange) { + selection.removeAllRanges(); + selection.addRange(originalRange); + } + if (previouslyFocusedElement) { + previouslyFocusedElement.focus(); + } + } +} +function useUpdateHead(route, siteDataByRouteRef) { + let isFirstUpdate = true; + let managedHeadElements = []; + const updateHeadTags = (newTags) => { + if (isFirstUpdate) { + isFirstUpdate = false; + newTags.forEach((tag) => { + const headEl = createHeadElement(tag); + for (const el of document.head.children) { + if (el.isEqualNode(headEl)) { + managedHeadElements.push(el); + return; + } + } + }); + return; + } + const newElements = newTags.map(createHeadElement); + managedHeadElements.forEach((oldEl, oldIndex) => { + const matchedIndex = newElements.findIndex((newEl) => newEl == null ? void 0 : newEl.isEqualNode(oldEl ?? null)); + if (matchedIndex !== -1) { + delete newElements[matchedIndex]; + } else { + oldEl == null ? void 0 : oldEl.remove(); + delete managedHeadElements[oldIndex]; + } + }); + newElements.forEach((el) => el && document.head.appendChild(el)); + managedHeadElements = [...managedHeadElements, ...newElements].filter(Boolean); + }; + watchEffect(() => { + const pageData = route.data; + const siteData2 = siteDataByRouteRef.value; + const pageDescription = pageData && pageData.description; + const frontmatterHead = pageData && pageData.frontmatter.head || []; + const title = createTitle(siteData2, pageData); + if (title !== document.title) { + document.title = title; + } + const description = pageDescription || siteData2.description; + let metaDescriptionElement = document.querySelector(`meta[name=description]`); + if (metaDescriptionElement) { + if (metaDescriptionElement.getAttribute("content") !== description) { + metaDescriptionElement.setAttribute("content", description); + } + } else { + createHeadElement(["meta", { name: "description", content: description }]); + } + updateHeadTags(mergeHead(siteData2.head, filterOutHeadDescription(frontmatterHead))); + }); +} +function createHeadElement([tag, attrs, innerHTML]) { + const el = document.createElement(tag); + for (const key in attrs) { + el.setAttribute(key, attrs[key]); + } + if (innerHTML) { + el.innerHTML = innerHTML; + } + if (tag === "script" && attrs.async == null) { + el.async = false; + } + return el; +} +function isMetaDescription(headConfig) { + return headConfig[0] === "meta" && headConfig[1] && headConfig[1].name === "description"; +} +function filterOutHeadDescription(head) { + return head.filter((h2) => !isMetaDescription(h2)); +} +const hasFetched = /* @__PURE__ */ new Set(); +const createLink = () => document.createElement("link"); +const viaDOM = (url) => { + const link2 = createLink(); + link2.rel = `prefetch`; + link2.href = url; + document.head.appendChild(link2); +}; +const viaXHR = (url) => { + const req = new XMLHttpRequest(); + req.open("GET", url, req.withCredentials = true); + req.send(); +}; +let link; +const doFetch = inBrowser && (link = createLink()) && link.relList && link.relList.supports && link.relList.supports("prefetch") ? viaDOM : viaXHR; +function usePrefetch() { + if (!inBrowser) { + return; + } + if (!window.IntersectionObserver) { + return; + } + let conn; + if ((conn = navigator.connection) && (conn.saveData || /2g/.test(conn.effectiveType))) { + return; + } + const rIC = window.requestIdleCallback || setTimeout; + let observer = null; + const observeLinks = () => { + if (observer) { + observer.disconnect(); + } + observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + const link2 = entry.target; + observer.unobserve(link2); + const { pathname } = link2; + if (!hasFetched.has(pathname)) { + hasFetched.add(pathname); + const pageChunkPath = pathToFile(pathname); + if (pageChunkPath) + doFetch(pageChunkPath); + } + } + }); + }); + rIC(() => { + document.querySelectorAll("#app a").forEach((link2) => { + const { hostname, pathname } = new URL(link2.href instanceof SVGAnimatedString ? link2.href.animVal : link2.href, link2.baseURI); + const extMatch = pathname.match(/\.\w+$/); + if (extMatch && extMatch[0] !== ".html") { + return; + } + if ( + // only prefetch same tab navigation, since a new tab will load + // the lean js chunk instead. + link2.target !== "_blank" && // only prefetch inbound links + hostname === location.hostname + ) { + if (pathname !== location.pathname) { + observer.observe(link2); + } else { + hasFetched.add(pathname); + } + } + }); + }); + }; + onMounted(observeLinks); + const route = useRoute(); + watch(() => route.path, observeLinks); + onUnmounted(() => { + observer && observer.disconnect(); + }); +} +function resolveThemeExtends(theme2) { + if (theme2.extends) { + const base = resolveThemeExtends(theme2.extends); + return { + ...base, + ...theme2, + async enhanceApp(ctx) { + if (base.enhanceApp) + await base.enhanceApp(ctx); + if (theme2.enhanceApp) + await theme2.enhanceApp(ctx); + } + }; + } + return theme2; +} +const Theme = resolveThemeExtends(theme); +const VitePressApp = defineComponent({ + name: "VitePressApp", + setup() { + const { site, lang, dir } = useData$1(); + onMounted(() => { + watchEffect(() => { + document.documentElement.lang = lang.value; + document.documentElement.dir = dir.value; + }); + }); + if (site.value.router.prefetchLinks) { + usePrefetch(); + } + useCopyCode(); + useCodeGroups(); + if (Theme.setup) + Theme.setup(); + return () => h(Theme.Layout); + } +}); +async function createApp() { + globalThis.__VITEPRESS__ = true; + const router = newRouter(); + const app = newApp(); + app.provide(RouterSymbol, router); + const data = initData(router.route); + app.provide(dataSymbol, data); + app.component("Content", Content); + app.component("ClientOnly", ClientOnly); + Object.defineProperties(app.config.globalProperties, { + $frontmatter: { + get() { + return data.frontmatter.value; + } + }, + $params: { + get() { + return data.page.value.params; + } + } + }); + if (Theme.enhanceApp) { + await Theme.enhanceApp({ + app, + router, + siteData: siteDataRef + }); + } + return { app, router, data }; +} +function newApp() { + return createSSRApp(VitePressApp); +} +function newRouter() { + let isInitialPageLoad = inBrowser; + return createRouter((path) => { + let pageFilePath = pathToFile(path); + let pageModule = null; + if (pageFilePath) { + if (isInitialPageLoad) { + pageFilePath = pageFilePath.replace(/\.js$/, ".lean.js"); + } + if (false) ; + else { + pageModule = import( + /*@vite-ignore*/ + pageFilePath + ); + } + } + if (inBrowser) { + isInitialPageLoad = false; + } + return pageModule; + }, Theme.NotFound); +} +if (inBrowser) { + createApp().then(({ app, router, data }) => { + router.go().then(() => { + useUpdateHead(router.route, data.site); + app.mount("#app"); + }); + }); +} +async function render(path) { + const { app, router } = await createApp(); + await router.go(path); + const ctx = { content: "", vpSocialIcons: /* @__PURE__ */ new Set() }; + ctx.content = await renderToString(app, ctx); + return ctx; +} +export { + render +}; diff --git a/docs-site/.vitepress/.temp/assets/style.BUGfHx7t.css b/docs-site/.vitepress/.temp/assets/style.BUGfHx7t.css new file mode 100644 index 0000000..45154a9 --- /dev/null +++ b/docs-site/.vitepress/.temp/assets/style.BUGfHx7t.css @@ -0,0 +1,4863 @@ + + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2') format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-cyrillic.C5lxZ8CY.woff2') format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-greek-ext.CqjqNYQ-.woff2') format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-greek.BBVDIX6e.woff2') format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-vietnamese.BjW4sHH5.woff2') format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, + U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, + U+0329, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-latin-ext.4ZJIpNVo.woff2') format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: Inter; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-roman-latin.Di8DUHzh.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-cyrillic-ext.r48I6akx.woff2') format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-cyrillic.By2_1cv3.woff2') format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-greek-ext.1u6EdAuj.woff2') format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-greek.DJ8dCoTZ.woff2') format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-vietnamese.BSbpV94h.woff2') format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, + U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, + U+0329, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-latin-ext.CN1xVJS-.woff2') format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: Inter; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url('/Read-Only-View/assets/inter-italic-latin.C2AdPX0b.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'Punctuation SC'; + font-weight: 400; + src: local('PingFang SC Regular'), local('Noto Sans CJK SC'), + local('Microsoft YaHei'); + unicode-range: U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, + U+00B7, U+007E, U+002F; +} + +@font-face { + font-family: 'Punctuation SC'; + font-weight: 500; + src: local('PingFang SC Medium'), local('Noto Sans CJK SC'), + local('Microsoft YaHei'); + unicode-range: U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, + U+00B7, U+007E, U+002F; +} + +@font-face { + font-family: 'Punctuation SC'; + font-weight: 600; + src: local('PingFang SC Semibold'), local('Noto Sans CJK SC Bold'), + local('Microsoft YaHei Bold'); + unicode-range: U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, + U+00B7, U+007E, U+002F; +} + +@font-face { + font-family: 'Punctuation SC'; + font-weight: 700; + src: local('PingFang SC Semibold'), local('Noto Sans CJK SC Bold'), + local('Microsoft YaHei Bold'); + unicode-range: U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, + U+00B7, U+007E, U+002F; +} + +/* Generate the subsetted fonts using: `pyftsubset .woff2 --unicodes="" --output-file="inter-\3c style>-.woff2" --flavor=woff2` */ +/** + * Colors: Solid + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-white: #ffffff; + --vp-c-black: #000000; + + --vp-c-neutral: var(--vp-c-black); + --vp-c-neutral-inverse: var(--vp-c-white); +} + +.dark { + --vp-c-neutral: var(--vp-c-white); + --vp-c-neutral-inverse: var(--vp-c-black); +} + +/** + * Colors: Palette + * + * The primitive colors used for accent colors. These colors are referenced + * by functional colors such as "Text", "Background", or "Brand". + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-gray-1: #dddde3; + --vp-c-gray-2: #e4e4e9; + --vp-c-gray-3: #ebebef; + --vp-c-gray-soft: rgba(142, 150, 170, 0.14); + + --vp-c-indigo-1: #3451b2; + --vp-c-indigo-2: #3a5ccc; + --vp-c-indigo-3: #5672cd; + --vp-c-indigo-soft: rgba(100, 108, 255, 0.14); + + --vp-c-purple-1: #6f42c1; + --vp-c-purple-2: #7e4cc9; + --vp-c-purple-3: #8e5cd9; + --vp-c-purple-soft: rgba(159, 122, 234, 0.14); + + --vp-c-green-1: #18794e; + --vp-c-green-2: #299764; + --vp-c-green-3: #30a46c; + --vp-c-green-soft: rgba(16, 185, 129, 0.14); + + --vp-c-yellow-1: #915930; + --vp-c-yellow-2: #946300; + --vp-c-yellow-3: #9f6a00; + --vp-c-yellow-soft: rgba(234, 179, 8, 0.14); + + --vp-c-red-1: #b8272c; + --vp-c-red-2: #d5393e; + --vp-c-red-3: #e0575b; + --vp-c-red-soft: rgba(244, 63, 94, 0.14); + + --vp-c-sponsor: #db2777; +} + +.dark { + --vp-c-gray-1: #515c67; + --vp-c-gray-2: #414853; + --vp-c-gray-3: #32363f; + --vp-c-gray-soft: rgba(101, 117, 133, 0.16); + + --vp-c-indigo-1: #a8b1ff; + --vp-c-indigo-2: #5c73e7; + --vp-c-indigo-3: #3e63dd; + --vp-c-indigo-soft: rgba(100, 108, 255, 0.16); + + --vp-c-purple-1: #c8abfa; + --vp-c-purple-2: #a879e6; + --vp-c-purple-3: #8e5cd9; + --vp-c-purple-soft: rgba(159, 122, 234, 0.16); + + --vp-c-green-1: #3dd68c; + --vp-c-green-2: #30a46c; + --vp-c-green-3: #298459; + --vp-c-green-soft: rgba(16, 185, 129, 0.16); + + --vp-c-yellow-1: #f9b44e; + --vp-c-yellow-2: #da8b17; + --vp-c-yellow-3: #a46a0a; + --vp-c-yellow-soft: rgba(234, 179, 8, 0.16); + + --vp-c-red-1: #f66f81; + --vp-c-red-2: #f14158; + --vp-c-red-3: #b62a3c; + --vp-c-red-soft: rgba(244, 63, 94, 0.16); +} + +/** + * Colors: Background + * + * - `bg`: The bg color used for main screen. + * + * - `bg-alt`: The alternative bg color used in places such as "sidebar", + * or "code block". + * + * - `bg-elv`: The elevated bg color. This is used at parts where it "floats", + * such as "dialog". + * + * - `bg-soft`: The bg color to slightly distinguish some components from + * the page. Used for things like "carbon ads" or "table". + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-bg: #ffffff; + --vp-c-bg-alt: #f6f6f7; + --vp-c-bg-elv: #ffffff; + --vp-c-bg-soft: #f6f6f7; +} + +.dark { + --vp-c-bg: #1b1b1f; + --vp-c-bg-alt: #161618; + --vp-c-bg-elv: #202127; + --vp-c-bg-soft: #202127; +} + +/** + * Colors: Borders + * + * - `divider`: This is used for separators. This is used to divide sections + * within the same components, such as having separator on "h2" heading. + * + * - `border`: This is designed for borders on interactive components. + * For example this should be used for a button outline. + * + * - `gutter`: This is used to divide components in the page. For example + * the header and the lest of the page. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-border: #c2c2c4; + --vp-c-divider: #e2e2e3; + --vp-c-gutter: #e2e2e3; +} + +.dark { + --vp-c-border: #3c3f44; + --vp-c-divider: #2e2e32; + --vp-c-gutter: #000000; +} + +/** + * Colors: Text + * + * - `text-1`: Used for primary text. + * + * - `text-2`: Used for muted texts, such as "inactive menu" or "info texts". + * + * - `text-3`: Used for subtle texts, such as "placeholders" or "caret icon". + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-text-1: #3c3c43; + --vp-c-text-2: #67676c; + --vp-c-text-3: #929295; +} + +.dark { + --vp-c-text-1: #dfdfd6; + --vp-c-text-2: #98989f; + --vp-c-text-3: #6a6a71; +} + +/** + * Colors: Function + * + * - `default`: The color used purely for subtle indication without any + * special meanings attached to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * + * To understand the scaling system, refer to "Colors: Palette" section. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-indigo-1); + --vp-c-brand-2: var(--vp-c-indigo-2); + --vp-c-brand-3: var(--vp-c-indigo-3); + --vp-c-brand-soft: var(--vp-c-indigo-soft); + + /* DEPRECATED: Use `--vp-c-brand-1` instead. */ + --vp-c-brand: var(--vp-c-brand-1); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-note-1: var(--vp-c-brand-1); + --vp-c-note-2: var(--vp-c-brand-2); + --vp-c-note-3: var(--vp-c-brand-3); + --vp-c-note-soft: var(--vp-c-brand-soft); + + --vp-c-success-1: var(--vp-c-green-1); + --vp-c-success-2: var(--vp-c-green-2); + --vp-c-success-3: var(--vp-c-green-3); + --vp-c-success-soft: var(--vp-c-green-soft); + + --vp-c-important-1: var(--vp-c-purple-1); + --vp-c-important-2: var(--vp-c-purple-2); + --vp-c-important-3: var(--vp-c-purple-3); + --vp-c-important-soft: var(--vp-c-purple-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); + + --vp-c-caution-1: var(--vp-c-red-1); + --vp-c-caution-2: var(--vp-c-red-2); + --vp-c-caution-3: var(--vp-c-red-3); + --vp-c-caution-soft: var(--vp-c-red-soft); +} + +/** + * Typography + * -------------------------------------------------------------------------- */ + +:root { + --vp-font-family-base: 'Inter', ui-sans-serif, system-ui, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --vp-font-family-mono: ui-monospace, 'Menlo', 'Monaco', 'Consolas', + 'Liberation Mono', 'Courier New', monospace; + font-optical-sizing: auto; +} + +:root:where(:lang(zh)) { + --vp-font-family-base: 'Punctuation SC', 'Inter', ui-sans-serif, system-ui, + sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; +} + +/** + * Shadows + * -------------------------------------------------------------------------- */ + +:root { + --vp-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); + --vp-shadow-2: 0 3px 12px rgba(0, 0, 0, 0.07), 0 1px 4px rgba(0, 0, 0, 0.07); + --vp-shadow-3: 0 12px 32px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(0, 0, 0, 0.08); + --vp-shadow-4: 0 14px 44px rgba(0, 0, 0, 0.12), 0 3px 9px rgba(0, 0, 0, 0.12); + --vp-shadow-5: 0 18px 56px rgba(0, 0, 0, 0.16), 0 4px 12px rgba(0, 0, 0, 0.16); +} + +/** + * Z-indexes + * -------------------------------------------------------------------------- */ + +:root { + --vp-z-index-footer: 10; + --vp-z-index-local-nav: 20; + --vp-z-index-nav: 30; + --vp-z-index-layout-top: 40; + --vp-z-index-backdrop: 50; + --vp-z-index-sidebar: 60; +} + +@media (min-width: 960px) { + :root { + --vp-z-index-sidebar: 25; + } +} + +/** + * Layouts + * -------------------------------------------------------------------------- */ + +:root { + --vp-layout-max-width: 1440px; +} + +/** + * Component: Header Anchor + * -------------------------------------------------------------------------- */ + +:root { + --vp-header-anchor-symbol: '#'; +} + +/** + * Component: Code + * -------------------------------------------------------------------------- */ + +:root { + --vp-code-line-height: 1.7; + --vp-code-font-size: 0.875em; + --vp-code-color: var(--vp-c-brand-1); + --vp-code-link-color: var(--vp-c-brand-1); + --vp-code-link-hover-color: var(--vp-c-brand-2); + --vp-code-bg: var(--vp-c-default-soft); + + --vp-code-block-color: var(--vp-c-text-2); + --vp-code-block-bg: var(--vp-c-bg-alt); + --vp-code-block-divider-color: var(--vp-c-gutter); + + --vp-code-lang-color: var(--vp-c-text-3); + + --vp-code-line-highlight-color: var(--vp-c-default-soft); + --vp-code-line-number-color: var(--vp-c-text-3); + + --vp-code-line-diff-add-color: var(--vp-c-success-soft); + --vp-code-line-diff-add-symbol-color: var(--vp-c-success-1); + + --vp-code-line-diff-remove-color: var(--vp-c-danger-soft); + --vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1); + + --vp-code-line-warning-color: var(--vp-c-warning-soft); + --vp-code-line-error-color: var(--vp-c-danger-soft); + + --vp-code-copy-code-border-color: var(--vp-c-divider); + --vp-code-copy-code-bg: var(--vp-c-bg-soft); + --vp-code-copy-code-hover-border-color: var(--vp-c-divider); + --vp-code-copy-code-hover-bg: var(--vp-c-bg); + --vp-code-copy-code-active-text: var(--vp-c-text-2); + --vp-code-copy-copied-text-content: 'Copied'; + + --vp-code-tab-divider: var(--vp-code-block-divider-color); + --vp-code-tab-text-color: var(--vp-c-text-2); + --vp-code-tab-bg: var(--vp-code-block-bg); + --vp-code-tab-hover-text-color: var(--vp-c-text-1); + --vp-code-tab-active-text-color: var(--vp-c-text-1); + --vp-code-tab-active-bar-color: var(--vp-c-brand-1); +} + +:lang(es), +:lang(pt) { + --vp-code-copy-copied-text-content: 'Copiado'; +} +:lang(fa) { + --vp-code-copy-copied-text-content: 'کپی شد'; +} +:lang(ko) { + --vp-code-copy-copied-text-content: '복사됨'; +} +:lang(ru) { + --vp-code-copy-copied-text-content: 'Скопировано'; +} +:lang(zh) { + --vp-code-copy-copied-text-content: '已复制'; +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-brand-3); + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-brand-2); + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-brand-1); + + --vp-button-alt-border: transparent; + --vp-button-alt-text: var(--vp-c-text-1); + --vp-button-alt-bg: var(--vp-c-default-3); + --vp-button-alt-hover-border: transparent; + --vp-button-alt-hover-text: var(--vp-c-text-1); + --vp-button-alt-hover-bg: var(--vp-c-default-2); + --vp-button-alt-active-border: transparent; + --vp-button-alt-active-text: var(--vp-c-text-1); + --vp-button-alt-active-bg: var(--vp-c-default-1); + + --vp-button-sponsor-border: var(--vp-c-text-2); + --vp-button-sponsor-text: var(--vp-c-text-2); + --vp-button-sponsor-bg: transparent; + --vp-button-sponsor-hover-border: var(--vp-c-sponsor); + --vp-button-sponsor-hover-text: var(--vp-c-sponsor); + --vp-button-sponsor-hover-bg: transparent; + --vp-button-sponsor-active-border: var(--vp-c-sponsor); + --vp-button-sponsor-active-text: var(--vp-c-sponsor); + --vp-button-sponsor-active-bg: transparent; +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-font-size: 14px; + --vp-custom-block-code-font-size: 13px; + + --vp-custom-block-info-border: transparent; + --vp-custom-block-info-text: var(--vp-c-text-1); + --vp-custom-block-info-bg: var(--vp-c-default-soft); + --vp-custom-block-info-code-bg: var(--vp-c-default-soft); + + --vp-custom-block-note-border: transparent; + --vp-custom-block-note-text: var(--vp-c-text-1); + --vp-custom-block-note-bg: var(--vp-c-default-soft); + --vp-custom-block-note-code-bg: var(--vp-c-default-soft); + + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-tip-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-tip-soft); + + --vp-custom-block-important-border: transparent; + --vp-custom-block-important-text: var(--vp-c-text-1); + --vp-custom-block-important-bg: var(--vp-c-important-soft); + --vp-custom-block-important-code-bg: var(--vp-c-important-soft); + + --vp-custom-block-warning-border: transparent; + --vp-custom-block-warning-text: var(--vp-c-text-1); + --vp-custom-block-warning-bg: var(--vp-c-warning-soft); + --vp-custom-block-warning-code-bg: var(--vp-c-warning-soft); + + --vp-custom-block-danger-border: transparent; + --vp-custom-block-danger-text: var(--vp-c-text-1); + --vp-custom-block-danger-bg: var(--vp-c-danger-soft); + --vp-custom-block-danger-code-bg: var(--vp-c-danger-soft); + + --vp-custom-block-caution-border: transparent; + --vp-custom-block-caution-text: var(--vp-c-text-1); + --vp-custom-block-caution-bg: var(--vp-c-caution-soft); + --vp-custom-block-caution-code-bg: var(--vp-c-caution-soft); + + --vp-custom-block-details-border: var(--vp-custom-block-info-border); + --vp-custom-block-details-text: var(--vp-custom-block-info-text); + --vp-custom-block-details-bg: var(--vp-custom-block-info-bg); + --vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg); +} + +/** + * Component: Input + * -------------------------------------------------------------------------- */ + +:root { + --vp-input-border-color: var(--vp-c-border); + --vp-input-bg-color: var(--vp-c-bg-alt); + + --vp-input-switch-bg-color: var(--vp-c-default-soft); +} + +/** + * Component: Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-nav-height: 64px; + --vp-nav-bg-color: var(--vp-c-bg); + --vp-nav-screen-bg-color: var(--vp-c-bg); + --vp-nav-logo-height: 24px; +} + +.hide-nav { + --vp-nav-height: 0px; +} + +.hide-nav .VPSidebar { + --vp-nav-height: 22px; +} + +/** + * Component: Local Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-nav-bg-color: var(--vp-c-bg); +} + +/** + * Component: Sidebar + * -------------------------------------------------------------------------- */ + +:root { + --vp-sidebar-width: 272px; + --vp-sidebar-bg-color: var(--vp-c-bg-alt); +} + +/** + * Colors Backdrop + * -------------------------------------------------------------------------- */ + +:root { + --vp-backdrop-bg-color: rgba(0, 0, 0, 0.6); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: var(--vp-c-brand-1); + --vp-home-hero-name-background: transparent; + + --vp-home-hero-image-background-image: none; + --vp-home-hero-image-filter: none; +} + +/** + * Component: Badge + * -------------------------------------------------------------------------- */ + +:root { + --vp-badge-info-border: transparent; + --vp-badge-info-text: var(--vp-c-text-2); + --vp-badge-info-bg: var(--vp-c-default-soft); + + --vp-badge-tip-border: transparent; + --vp-badge-tip-text: var(--vp-c-tip-1); + --vp-badge-tip-bg: var(--vp-c-tip-soft); + + --vp-badge-warning-border: transparent; + --vp-badge-warning-text: var(--vp-c-warning-1); + --vp-badge-warning-bg: var(--vp-c-warning-soft); + + --vp-badge-danger-border: transparent; + --vp-badge-danger-text: var(--vp-c-danger-1); + --vp-badge-danger-bg: var(--vp-c-danger-soft); +} + +/** + * Component: Carbon Ads + * -------------------------------------------------------------------------- */ + +:root { + --vp-carbon-ads-text-color: var(--vp-c-text-1); + --vp-carbon-ads-poweredby-color: var(--vp-c-text-2); + --vp-carbon-ads-bg-color: var(--vp-c-bg-soft); + --vp-carbon-ads-hover-text-color: var(--vp-c-brand-1); + --vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1); +} + +/** + * Component: Local Search + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-search-bg: var(--vp-c-bg); + --vp-local-search-result-bg: var(--vp-c-bg); + --vp-local-search-result-border: var(--vp-c-divider); + --vp-local-search-result-selected-bg: var(--vp-c-bg); + --vp-local-search-result-selected-border: var(--vp-c-brand-1); + --vp-local-search-highlight-bg: var(--vp-c-brand-1); + --vp-local-search-highlight-text: var(--vp-c-neutral-inverse); +} +@media (prefers-reduced-motion: reduce) { + *, + ::before, + ::after { + animation-delay: -1ms !important; + animation-duration: 1ms !important; + animation-iteration-count: 1 !important; + background-attachment: initial !important; + scroll-behavior: auto !important; + transition-duration: 0s !important; + transition-delay: 0s !important; + } +} + +*, +::before, +::after { + box-sizing: border-box; +} + +html { + line-height: 1.4; + font-size: 16px; + -webkit-text-size-adjust: 100%; +} + +html.dark { + color-scheme: dark; +} + +body { + margin: 0; + width: 100%; + min-width: 320px; + min-height: 100vh; + line-height: 24px; + font-family: var(--vp-font-family-base); + font-size: 16px; + font-weight: 400; + color: var(--vp-c-text-1); + background-color: var(--vp-c-bg); + font-synthesis: style; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +main { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + line-height: 24px; + font-size: 16px; + font-weight: 400; +} + +p { + margin: 0; +} + +strong, +b { + font-weight: 600; +} + +/** + * Avoid 300ms click delay on touch devices that support the `touch-action` + * CSS property. + * + * In particular, unlike most other browsers, IE11+Edge on Windows 10 on + * touch devices and IE Mobile 10-11 DON'T remove the click delay when + * `` is present. + * However, they DO support removing the click delay via + * `touch-action: manipulation`. + * + * See: + * - http://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch + * - http://caniuse.com/#feat=css-touch-action + * - http://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay + */ +a, +area, +button, +[role='button'], +input, +label, +select, +summary, +textarea { + touch-action: manipulation; +} + +a { + color: inherit; + text-decoration: inherit; +} + +ol, +ul { + list-style: none; + margin: 0; + padding: 0; +} + +blockquote { + margin: 0; +} + +pre, +code, +kbd, +samp { + font-family: var(--vp-font-family-mono); +} + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; +} + +figure { + margin: 0; +} + +img, +video { + max-width: 100%; + height: auto; +} + +button, +input, +optgroup, +select, +textarea { + border: 0; + padding: 0; + line-height: inherit; + color: inherit; +} + +button { + padding: 0; + font-family: inherit; + background-color: transparent; + background-image: none; +} + +button:enabled, +[role='button']:enabled { + cursor: pointer; +} + +button:focus, +button:focus-visible { + outline: 1px dotted; + outline: 4px auto -webkit-focus-ring-color; +} + +button:focus:not(:focus-visible) { + outline: none !important; +} + +input:focus, +textarea:focus, +select:focus { + outline: none; +} + +table { + border-collapse: collapse; +} + +input { + background-color: transparent; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: var(--vp-c-text-3); +} + +input::-ms-input-placeholder, +textarea::-ms-input-placeholder { + color: var(--vp-c-text-3); +} + +input::placeholder, +textarea::placeholder { + color: var(--vp-c-text-3); +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type='number'] { + -moz-appearance: textfield; +} + +textarea { + resize: vertical; +} + +select { + -webkit-appearance: none; +} + +fieldset { + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +li, +p { + overflow-wrap: break-word; +} + +vite-error-overlay { + z-index: 9999; +} + +mjx-container { + overflow-x: auto; +} + +mjx-container > svg { + display: inline-block; + margin: auto; +} +[class^='vpi-'], +[class*=' vpi-'], +.vp-icon { + width: 1em; + height: 1em; +} +[class^='vpi-'].bg, +[class*=' vpi-'].bg, +.vp-icon.bg { + background-size: 100% 100%; + background-color: transparent; +} +[class^='vpi-']:not(.bg), +[class*=' vpi-']:not(.bg), +.vp-icon:not(.bg) { + -webkit-mask: var(--icon) no-repeat; + mask: var(--icon) no-repeat; + -webkit-mask-size: 100% 100%; + mask-size: 100% 100%; + background-color: currentColor; + color: inherit; +} + +/* internal icons - used under ISC from https://lucide.dev/ */ +.vpi-align-left { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E"); +} +.vpi-arrow-right, +.vpi-arrow-down, +.vpi-arrow-left, +.vpi-arrow-up { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E"); +} +.vpi-chevron-right, +.vpi-chevron-down, +.vpi-chevron-left, +.vpi-chevron-up { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E"); +} +.vpi-chevron-down, +.vpi-arrow-down { + /*rtl:ignore*/ + transform: rotate(90deg); +} +.vpi-chevron-left, +.vpi-arrow-left { + /*rtl:ignore*/ + transform: rotate(180deg); +} +.vpi-chevron-up, +.vpi-arrow-up { + /*rtl:ignore*/ + transform: rotate(-90deg); +} +.vpi-square-pen { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E"); +} +.vpi-plus { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E"); +} +.vpi-sun { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E"); +} +.vpi-moon { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E"); +} +.vpi-more-horizontal { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E"); +} +.vpi-languages { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E"); +} +.vpi-heart { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E"); +} +.vpi-search { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E"); +} +.vpi-layout-list { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E"); +} +.vpi-delete { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E"); +} +.vpi-corner-down-left { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E"); +} +:root { + /* clipboard */ + --vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E"); + /* clipboard-copy */ + --vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E"); +} +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + white-space: nowrap; + clip: rect(0 0 0 0); + clip-path: inset(50%); + overflow: hidden; +} +.custom-block { + border: 1px solid transparent; + border-radius: 8px; + padding: 16px 16px 8px; + line-height: 24px; + font-size: var(--vp-custom-block-font-size); + color: var(--vp-c-text-2); +} + +.custom-block.info { + border-color: var(--vp-custom-block-info-border); + color: var(--vp-custom-block-info-text); + background-color: var(--vp-custom-block-info-bg); +} + +.custom-block.info a, +.custom-block.info code { + color: var(--vp-c-brand-1); +} + +.custom-block.info a:hover, +.custom-block.info a:hover > code { + color: var(--vp-c-brand-2); +} + +.custom-block.info code { + background-color: var(--vp-custom-block-info-code-bg); +} + +.custom-block.note { + border-color: var(--vp-custom-block-note-border); + color: var(--vp-custom-block-note-text); + background-color: var(--vp-custom-block-note-bg); +} + +.custom-block.note a, +.custom-block.note code { + color: var(--vp-c-brand-1); +} + +.custom-block.note a:hover, +.custom-block.note a:hover > code { + color: var(--vp-c-brand-2); +} + +.custom-block.note code { + background-color: var(--vp-custom-block-note-code-bg); +} + +.custom-block.tip { + border-color: var(--vp-custom-block-tip-border); + color: var(--vp-custom-block-tip-text); + background-color: var(--vp-custom-block-tip-bg); +} + +.custom-block.tip a, +.custom-block.tip code { + color: var(--vp-c-tip-1); +} + +.custom-block.tip a:hover, +.custom-block.tip a:hover > code { + color: var(--vp-c-tip-2); +} + +.custom-block.tip code { + background-color: var(--vp-custom-block-tip-code-bg); +} + +.custom-block.important { + border-color: var(--vp-custom-block-important-border); + color: var(--vp-custom-block-important-text); + background-color: var(--vp-custom-block-important-bg); +} + +.custom-block.important a, +.custom-block.important code { + color: var(--vp-c-important-1); +} + +.custom-block.important a:hover, +.custom-block.important a:hover > code { + color: var(--vp-c-important-2); +} + +.custom-block.important code { + background-color: var(--vp-custom-block-important-code-bg); +} + +.custom-block.warning { + border-color: var(--vp-custom-block-warning-border); + color: var(--vp-custom-block-warning-text); + background-color: var(--vp-custom-block-warning-bg); +} + +.custom-block.warning a, +.custom-block.warning code { + color: var(--vp-c-warning-1); +} + +.custom-block.warning a:hover, +.custom-block.warning a:hover > code { + color: var(--vp-c-warning-2); +} + +.custom-block.warning code { + background-color: var(--vp-custom-block-warning-code-bg); +} + +.custom-block.danger { + border-color: var(--vp-custom-block-danger-border); + color: var(--vp-custom-block-danger-text); + background-color: var(--vp-custom-block-danger-bg); +} + +.custom-block.danger a, +.custom-block.danger code { + color: var(--vp-c-danger-1); +} + +.custom-block.danger a:hover, +.custom-block.danger a:hover > code { + color: var(--vp-c-danger-2); +} + +.custom-block.danger code { + background-color: var(--vp-custom-block-danger-code-bg); +} + +.custom-block.caution { + border-color: var(--vp-custom-block-caution-border); + color: var(--vp-custom-block-caution-text); + background-color: var(--vp-custom-block-caution-bg); +} + +.custom-block.caution a, +.custom-block.caution code { + color: var(--vp-c-caution-1); +} + +.custom-block.caution a:hover, +.custom-block.caution a:hover > code { + color: var(--vp-c-caution-2); +} + +.custom-block.caution code { + background-color: var(--vp-custom-block-caution-code-bg); +} + +.custom-block.details { + border-color: var(--vp-custom-block-details-border); + color: var(--vp-custom-block-details-text); + background-color: var(--vp-custom-block-details-bg); +} + +.custom-block.details a { + color: var(--vp-c-brand-1); +} + +.custom-block.details a:hover, +.custom-block.details a:hover > code { + color: var(--vp-c-brand-2); +} + +.custom-block.details code { + background-color: var(--vp-custom-block-details-code-bg); +} + +.custom-block-title { + font-weight: 600; +} + +.custom-block p + p { + margin: 8px 0; +} + +.custom-block.details summary { + margin: 0 0 8px; + font-weight: 700; + cursor: pointer; + user-select: none; +} + +.custom-block.details summary + p { + margin: 8px 0; +} + +.custom-block a { + color: inherit; + font-weight: 600; + text-decoration: underline; + text-underline-offset: 2px; + transition: opacity 0.25s; +} + +.custom-block a:hover { + opacity: 0.75; +} + +.custom-block code { + font-size: var(--vp-custom-block-code-font-size); +} + +.custom-block.custom-block th, +.custom-block.custom-block blockquote > p { + font-size: var(--vp-custom-block-font-size); + color: inherit; +} +.dark .vp-code span { + color: var(--shiki-dark, inherit); +} + +html:not(.dark) .vp-code span { + color: var(--shiki-light, inherit); +} +.vp-code-group { + margin-top: 16px; +} + +.vp-code-group .tabs { + position: relative; + display: flex; + margin-right: -24px; + margin-left: -24px; + padding: 0 12px; + background-color: var(--vp-code-tab-bg); + overflow-x: auto; + overflow-y: hidden; + box-shadow: inset 0 -1px var(--vp-code-tab-divider); +} + +@media (min-width: 640px) { + .vp-code-group .tabs { + margin-right: 0; + margin-left: 0; + border-radius: 8px 8px 0 0; + } +} + +.vp-code-group .tabs input { + position: fixed; + opacity: 0; + pointer-events: none; +} + +.vp-code-group .tabs label { + position: relative; + display: inline-block; + border-bottom: 1px solid transparent; + padding: 0 12px; + line-height: 48px; + font-size: 14px; + font-weight: 500; + color: var(--vp-code-tab-text-color); + white-space: nowrap; + cursor: pointer; + transition: color 0.25s; +} + +.vp-code-group .tabs label::after { + position: absolute; + right: 8px; + bottom: -1px; + left: 8px; + z-index: 1; + height: 2px; + border-radius: 2px; + content: ''; + background-color: transparent; + transition: background-color 0.25s; +} + +.vp-code-group label:hover { + color: var(--vp-code-tab-hover-text-color); +} + +.vp-code-group input:checked + label { + color: var(--vp-code-tab-active-text-color); +} + +.vp-code-group input:checked + label::after { + background-color: var(--vp-code-tab-active-bar-color); +} + +.vp-code-group div[class*='language-'], +.vp-block { + display: none; + margin-top: 0 !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.vp-code-group div[class*='language-'].active, +.vp-block.active { + display: block; +} + +.vp-block { + padding: 20px 24px; +} +/** + * Headings + * -------------------------------------------------------------------------- */ + +.vp-doc h1, +.vp-doc h2, +.vp-doc h3, +.vp-doc h4, +.vp-doc h5, +.vp-doc h6 { + position: relative; + font-weight: 600; + outline: none; +} + +.vp-doc h1 { + letter-spacing: -0.02em; + line-height: 40px; + font-size: 28px; +} + +.vp-doc h2 { + margin: 48px 0 16px; + border-top: 1px solid var(--vp-c-divider); + padding-top: 24px; + letter-spacing: -0.02em; + line-height: 32px; + font-size: 24px; +} + +.vp-doc h3 { + margin: 32px 0 0; + letter-spacing: -0.01em; + line-height: 28px; + font-size: 20px; +} + +.vp-doc h4 { + margin: 24px 0 0; + letter-spacing: -0.01em; + line-height: 24px; + font-size: 18px; +} + +.vp-doc .header-anchor { + position: absolute; + top: 0; + left: 0; + margin-left: -0.87em; + font-weight: 500; + user-select: none; + opacity: 0; + text-decoration: none; + transition: + color 0.25s, + opacity 0.25s; +} + +.vp-doc .header-anchor:before { + content: var(--vp-header-anchor-symbol); +} + +.vp-doc h1:hover .header-anchor, +.vp-doc h1 .header-anchor:focus, +.vp-doc h2:hover .header-anchor, +.vp-doc h2 .header-anchor:focus, +.vp-doc h3:hover .header-anchor, +.vp-doc h3 .header-anchor:focus, +.vp-doc h4:hover .header-anchor, +.vp-doc h4 .header-anchor:focus, +.vp-doc h5:hover .header-anchor, +.vp-doc h5 .header-anchor:focus, +.vp-doc h6:hover .header-anchor, +.vp-doc h6 .header-anchor:focus { + opacity: 1; +} + +@media (min-width: 768px) { + .vp-doc h1 { + letter-spacing: -0.02em; + line-height: 40px; + font-size: 32px; + } +} + +.vp-doc h2 .header-anchor { + top: 24px; +} + +/** + * Paragraph and inline elements + * -------------------------------------------------------------------------- */ + +.vp-doc p, +.vp-doc summary { + margin: 16px 0; +} + +.vp-doc p { + line-height: 28px; +} + +.vp-doc blockquote { + margin: 16px 0; + border-left: 2px solid var(--vp-c-divider); + padding-left: 16px; + transition: border-color 0.5s; + color: var(--vp-c-text-2); +} + +.vp-doc blockquote > p { + margin: 0; + font-size: 16px; + transition: color 0.5s; +} + +.vp-doc a { + font-weight: 500; + color: var(--vp-c-brand-1); + text-decoration: underline; + text-underline-offset: 2px; + transition: + color 0.25s, + opacity 0.25s; +} + +.vp-doc a:hover { + color: var(--vp-c-brand-2); +} + +.vp-doc strong { + font-weight: 600; +} + +/** + * Lists + * -------------------------------------------------------------------------- */ + +.vp-doc ul, +.vp-doc ol { + padding-left: 1.25rem; + margin: 16px 0; +} + +.vp-doc ul { + list-style: disc; +} + +.vp-doc ol { + list-style: decimal; +} + +.vp-doc li + li { + margin-top: 8px; +} + +.vp-doc li > ol, +.vp-doc li > ul { + margin: 8px 0 0; +} + +/** + * Table + * -------------------------------------------------------------------------- */ + +.vp-doc table { + display: block; + border-collapse: collapse; + margin: 20px 0; + overflow-x: auto; +} + +.vp-doc tr { + background-color: var(--vp-c-bg); + border-top: 1px solid var(--vp-c-divider); + transition: background-color 0.5s; +} + +.vp-doc tr:nth-child(2n) { + background-color: var(--vp-c-bg-soft); +} + +.vp-doc th, +.vp-doc td { + border: 1px solid var(--vp-c-divider); + padding: 8px 16px; +} + +.vp-doc th { + text-align: left; + font-size: 14px; + font-weight: 600; + color: var(--vp-c-text-2); + background-color: var(--vp-c-bg-soft); +} + +.vp-doc td { + font-size: 14px; +} + +/** + * Decorational elements + * -------------------------------------------------------------------------- */ + +.vp-doc hr { + margin: 16px 0; + border: none; + border-top: 1px solid var(--vp-c-divider); +} + +/** + * Custom Block + * -------------------------------------------------------------------------- */ + +.vp-doc .custom-block { + margin: 16px 0; +} + +.vp-doc .custom-block p { + margin: 8px 0; + line-height: 24px; +} + +.vp-doc .custom-block p:first-child { + margin: 0; +} + +.vp-doc .custom-block div[class*='language-'] { + margin: 8px 0; + border-radius: 8px; +} + +.vp-doc .custom-block div[class*='language-'] code { + font-weight: 400; + background-color: transparent; +} + +.vp-doc .custom-block .vp-code-group .tabs { + margin: 0; + border-radius: 8px 8px 0 0; +} + +/** + * Code + * -------------------------------------------------------------------------- */ + +/* inline code */ +.vp-doc :not(pre, h1, h2, h3, h4, h5, h6) > code { + font-size: var(--vp-code-font-size); + color: var(--vp-code-color); +} + +.vp-doc :not(pre) > code { + border-radius: 4px; + padding: 3px 6px; + background-color: var(--vp-code-bg); + transition: + color 0.25s, + background-color 0.5s; +} + +.vp-doc a > code { + color: var(--vp-code-link-color); +} + +.vp-doc a:hover > code { + color: var(--vp-code-link-hover-color); +} + +.vp-doc h1 > code, +.vp-doc h2 > code, +.vp-doc h3 > code, +.vp-doc h4 > code { + font-size: 0.9em; +} + +.vp-doc div[class*='language-'], +.vp-block { + position: relative; + margin: 16px -24px; + background-color: var(--vp-code-block-bg); + overflow-x: auto; + transition: background-color 0.5s; +} + +@media (min-width: 640px) { + .vp-doc div[class*='language-'], + .vp-block { + border-radius: 8px; + margin: 16px 0; + } +} + +@media (max-width: 639px) { + .vp-doc li div[class*='language-'] { + border-radius: 8px 0 0 8px; + } +} + +.vp-doc div[class*='language-'] + div[class*='language-'], +.vp-doc div[class$='-api'] + div[class*='language-'], +.vp-doc div[class*='language-'] + div[class$='-api'] > div[class*='language-'] { + margin-top: -8px; +} + +.vp-doc [class*='language-'] pre, +.vp-doc [class*='language-'] code { + /*rtl:ignore*/ + direction: ltr; + /*rtl:ignore*/ + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +.vp-doc [class*='language-'] pre { + position: relative; + z-index: 1; + margin: 0; + padding: 20px 0; + background: transparent; + overflow-x: auto; +} + +.vp-doc [class*='language-'] code { + display: block; + padding: 0 24px; + width: fit-content; + min-width: 100%; + line-height: var(--vp-code-line-height); + font-size: var(--vp-code-font-size); + color: var(--vp-code-block-color); + transition: color 0.5s; +} + +.vp-doc [class*='language-'] code .highlighted { + background-color: var(--vp-code-line-highlight-color); + transition: background-color 0.5s; + margin: 0 -24px; + padding: 0 24px; + width: calc(100% + 2 * 24px); + display: inline-block; +} + +.vp-doc [class*='language-'] code .highlighted.error { + background-color: var(--vp-code-line-error-color); +} + +.vp-doc [class*='language-'] code .highlighted.warning { + background-color: var(--vp-code-line-warning-color); +} + +.vp-doc [class*='language-'] code .diff { + transition: background-color 0.5s; + margin: 0 -24px; + padding: 0 24px; + width: calc(100% + 2 * 24px); + display: inline-block; +} + +.vp-doc [class*='language-'] code .diff::before { + position: absolute; + left: 10px; +} + +.vp-doc [class*='language-'] .has-focused-lines .line:not(.has-focus) { + filter: blur(0.095rem); + opacity: 0.4; + transition: + filter 0.35s, + opacity 0.35s; +} + +.vp-doc [class*='language-'] .has-focused-lines .line:not(.has-focus) { + opacity: 0.7; + transition: + filter 0.35s, + opacity 0.35s; +} + +.vp-doc [class*='language-']:hover .has-focused-lines .line:not(.has-focus) { + filter: blur(0); + opacity: 1; +} + +.vp-doc [class*='language-'] code .diff.remove { + background-color: var(--vp-code-line-diff-remove-color); + opacity: 0.7; +} + +.vp-doc [class*='language-'] code .diff.remove::before { + content: '-'; + color: var(--vp-code-line-diff-remove-symbol-color); +} + +.vp-doc [class*='language-'] code .diff.add { + background-color: var(--vp-code-line-diff-add-color); +} + +.vp-doc [class*='language-'] code .diff.add::before { + content: '+'; + color: var(--vp-code-line-diff-add-symbol-color); +} + +.vp-doc div[class*='language-'].line-numbers-mode { + /*rtl:ignore*/ + padding-left: 32px; +} + +.vp-doc .line-numbers-wrapper { + position: absolute; + top: 0; + bottom: 0; + /*rtl:ignore*/ + left: 0; + z-index: 3; + /*rtl:ignore*/ + border-right: 1px solid var(--vp-code-block-divider-color); + padding-top: 20px; + width: 32px; + text-align: center; + font-family: var(--vp-font-family-mono); + line-height: var(--vp-code-line-height); + font-size: var(--vp-code-font-size); + color: var(--vp-code-line-number-color); + transition: + border-color 0.5s, + color 0.5s; +} + +.vp-doc [class*='language-'] > button.copy { + /*rtl:ignore*/ + direction: ltr; + position: absolute; + top: 12px; + /*rtl:ignore*/ + right: 12px; + z-index: 3; + border: 1px solid var(--vp-code-copy-code-border-color); + border-radius: 4px; + width: 40px; + height: 40px; + background-color: var(--vp-code-copy-code-bg); + opacity: 0; + cursor: pointer; + background-image: var(--vp-icon-copy); + background-position: 50%; + background-size: 20px; + background-repeat: no-repeat; + transition: + border-color 0.25s, + background-color 0.25s, + opacity 0.25s; +} + +.vp-doc [class*='language-']:hover > button.copy, +.vp-doc [class*='language-'] > button.copy:focus { + opacity: 1; +} + +.vp-doc [class*='language-'] > button.copy:hover, +.vp-doc [class*='language-'] > button.copy.copied { + border-color: var(--vp-code-copy-code-hover-border-color); + background-color: var(--vp-code-copy-code-hover-bg); +} + +.vp-doc [class*='language-'] > button.copy.copied, +.vp-doc [class*='language-'] > button.copy:hover.copied { + /*rtl:ignore*/ + border-radius: 0 4px 4px 0; + background-color: var(--vp-code-copy-code-hover-bg); + background-image: var(--vp-icon-copied); +} + +.vp-doc [class*='language-'] > button.copy.copied::before, +.vp-doc [class*='language-'] > button.copy:hover.copied::before { + position: relative; + top: -1px; + /*rtl:ignore*/ + transform: translateX(calc(-100% - 1px)); + display: flex; + justify-content: center; + align-items: center; + border: 1px solid var(--vp-code-copy-code-hover-border-color); + /*rtl:ignore*/ + border-right: 0; + /*rtl:ignore*/ + border-radius: 4px 0 0 4px; + padding: 0 10px; + width: fit-content; + height: 40px; + text-align: center; + font-size: 12px; + font-weight: 500; + color: var(--vp-code-copy-code-active-text); + background-color: var(--vp-code-copy-code-hover-bg); + white-space: nowrap; + content: var(--vp-code-copy-copied-text-content); +} + +.vp-doc [class*='language-'] > span.lang { + position: absolute; + top: 2px; + /*rtl:ignore*/ + right: 8px; + z-index: 2; + font-size: 12px; + font-weight: 500; + user-select: none; + color: var(--vp-code-lang-color); + transition: + color 0.4s, + opacity 0.4s; +} + +.vp-doc [class*='language-']:hover > button.copy + span.lang, +.vp-doc [class*='language-'] > button.copy:focus + span.lang { + opacity: 0; +} + +/** + * Component: Team + * -------------------------------------------------------------------------- */ + +.vp-doc .VPTeamMembers { + margin-top: 24px; +} + +.vp-doc .VPTeamMembers.small.count-1 .container { + margin: 0 !important; + max-width: calc((100% - 24px) / 2) !important; +} + +.vp-doc .VPTeamMembers.small.count-2 .container, +.vp-doc .VPTeamMembers.small.count-3 .container { + max-width: 100% !important; +} + +.vp-doc .VPTeamMembers.medium.count-1 .container { + margin: 0 !important; + max-width: calc((100% - 24px) / 2) !important; +} + +/** + * External links + * -------------------------------------------------------------------------- */ + +/* prettier-ignore */ +:is(.vp-external-link-icon, .vp-doc a[href*='://'], .vp-doc a[target='_blank']):not(:is(.no-icon, svg a, :has(img, svg)))::after { + display: inline-block; + margin-top: -1px; + margin-left: 4px; + width: 11px; + height: 11px; + background: currentColor; + color: var(--vp-c-text-3); + flex-shrink: 0; + --icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E"); + -webkit-mask-image: var(--icon); + mask-image: var(--icon); + /*rtl:raw:transform: scaleX(-1);*/ +} + +.vp-external-link-icon::after { + content: ''; +} + +/* prettier-ignore */ +.external-link-icon-enabled :is(.vp-doc a[href*='://'], .vp-doc a[target='_blank']):not(:is(.no-icon, svg a, :has(img, svg)))::after { + content: ''; + color: currentColor; +} +/** + * VPSponsors styles are defined as global because a new class gets + * allied in onMounted` hook and we can't use scoped style. + */ +.vp-sponsor { + border-radius: 16px; + overflow: hidden; +} + +.vp-sponsor.aside { + border-radius: 12px; +} + +.vp-sponsor-section + .vp-sponsor-section { + margin-top: 4px; +} + +.vp-sponsor-tier { + margin: 0 0 4px !important; + text-align: center; + letter-spacing: 1px !important; + line-height: 24px; + width: 100%; + font-weight: 600; + color: var(--vp-c-text-2); + background-color: var(--vp-c-bg-soft); +} + +.vp-sponsor.normal .vp-sponsor-tier { + padding: 13px 0 11px; + font-size: 14px; +} + +.vp-sponsor.aside .vp-sponsor-tier { + padding: 9px 0 7px; + font-size: 12px; +} + +.vp-sponsor-grid + .vp-sponsor-tier { + margin-top: 4px; +} + +.vp-sponsor-grid { + display: flex; + flex-wrap: wrap; + gap: 4px; +} + +.vp-sponsor-grid.xmini .vp-sponsor-grid-link { + height: 64px; +} +.vp-sponsor-grid.xmini .vp-sponsor-grid-image { + max-width: 64px; + max-height: 22px; +} + +.vp-sponsor-grid.mini .vp-sponsor-grid-link { + height: 72px; +} +.vp-sponsor-grid.mini .vp-sponsor-grid-image { + max-width: 96px; + max-height: 24px; +} + +.vp-sponsor-grid.small .vp-sponsor-grid-link { + height: 96px; +} +.vp-sponsor-grid.small .vp-sponsor-grid-image { + max-width: 96px; + max-height: 24px; +} + +.vp-sponsor-grid.medium .vp-sponsor-grid-link { + height: 112px; +} +.vp-sponsor-grid.medium .vp-sponsor-grid-image { + max-width: 120px; + max-height: 36px; +} + +.vp-sponsor-grid.big .vp-sponsor-grid-link { + height: 184px; +} +.vp-sponsor-grid.big .vp-sponsor-grid-image { + max-width: 192px; + max-height: 56px; +} + +.vp-sponsor-grid[data-vp-grid='2'] .vp-sponsor-grid-item { + width: calc((100% - 4px) / 2); +} + +.vp-sponsor-grid[data-vp-grid='3'] .vp-sponsor-grid-item { + width: calc((100% - 4px * 2) / 3); +} + +.vp-sponsor-grid[data-vp-grid='4'] .vp-sponsor-grid-item { + width: calc((100% - 4px * 3) / 4); +} + +.vp-sponsor-grid[data-vp-grid='5'] .vp-sponsor-grid-item { + width: calc((100% - 4px * 4) / 5); +} + +.vp-sponsor-grid[data-vp-grid='6'] .vp-sponsor-grid-item { + width: calc((100% - 4px * 5) / 6); +} + +.vp-sponsor-grid-item { + flex-shrink: 0; + width: 100%; + background-color: var(--vp-c-bg-soft); + transition: background-color 0.25s; +} + +.vp-sponsor-grid-item:hover { + background-color: var(--vp-c-default-soft); +} + +.vp-sponsor-grid-item:hover .vp-sponsor-grid-image { + filter: grayscale(0) invert(0); +} + +.vp-sponsor-grid-item.empty:hover { + background-color: var(--vp-c-bg-soft); +} + +.dark .vp-sponsor-grid-item:hover { + background-color: var(--vp-c-white); +} + +.dark .vp-sponsor-grid-item.empty:hover { + background-color: var(--vp-c-bg-soft); +} + +.vp-sponsor-grid-link { + display: flex; +} + +.vp-sponsor-grid-box { + display: flex; + justify-content: center; + align-items: center; + width: 100%; +} + +.vp-sponsor-grid-image { + max-width: 100%; + filter: grayscale(1); + transition: filter 0.25s; +} + +.dark .vp-sponsor-grid-image { + filter: grayscale(1) invert(1); +} + +.VPBadge { + display: inline-block; + margin-left: 2px; + border: 1px solid transparent; + border-radius: 12px; + padding: 0 10px; + line-height: 22px; + font-size: 12px; + font-weight: 500; + transform: translateY(-2px); +} +.VPBadge.small { + padding: 0 6px; + line-height: 18px; + font-size: 10px; + transform: translateY(-8px); +} +.VPDocFooter .VPBadge { + display: none; +} +.vp-doc h1 > .VPBadge { + margin-top: 4px; + vertical-align: top; +} +.vp-doc h2 > .VPBadge { + margin-top: 3px; + padding: 0 8px; + vertical-align: top; +} +.vp-doc h3 > .VPBadge { + vertical-align: middle; +} +.vp-doc h4 > .VPBadge, +.vp-doc h5 > .VPBadge, +.vp-doc h6 > .VPBadge { + vertical-align: middle; + line-height: 18px; +} +.VPBadge.info { + border-color: var(--vp-badge-info-border); + color: var(--vp-badge-info-text); + background-color: var(--vp-badge-info-bg); +} +.VPBadge.tip { + border-color: var(--vp-badge-tip-border); + color: var(--vp-badge-tip-text); + background-color: var(--vp-badge-tip-bg); +} +.VPBadge.warning { + border-color: var(--vp-badge-warning-border); + color: var(--vp-badge-warning-text); + background-color: var(--vp-badge-warning-bg); +} +.VPBadge.danger { + border-color: var(--vp-badge-danger-border); + color: var(--vp-badge-danger-text); + background-color: var(--vp-badge-danger-bg); +} + +.VPBackdrop[data-v-c79a1216] { + position: fixed; + top: 0; + /*rtl:ignore*/ + right: 0; + bottom: 0; + /*rtl:ignore*/ + left: 0; + z-index: var(--vp-z-index-backdrop); + background: var(--vp-backdrop-bg-color); + transition: opacity 0.5s; +} +.VPBackdrop.fade-enter-from[data-v-c79a1216], +.VPBackdrop.fade-leave-to[data-v-c79a1216] { + opacity: 0; +} +.VPBackdrop.fade-leave-active[data-v-c79a1216] { + transition-duration: .25s; +} +@media (min-width: 1280px) { +.VPBackdrop[data-v-c79a1216] { + display: none; +} +} + +.NotFound[data-v-d6be1790] { + padding: 64px 24px 96px; + text-align: center; +} +@media (min-width: 768px) { +.NotFound[data-v-d6be1790] { + padding: 96px 32px 168px; +} +} +.code[data-v-d6be1790] { + line-height: 64px; + font-size: 64px; + font-weight: 600; +} +.title[data-v-d6be1790] { + padding-top: 12px; + letter-spacing: 2px; + line-height: 20px; + font-size: 20px; + font-weight: 700; +} +.divider[data-v-d6be1790] { + margin: 24px auto 18px; + width: 64px; + height: 1px; + background-color: var(--vp-c-divider); +} +.quote[data-v-d6be1790] { + margin: 0 auto; + max-width: 256px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-2); +} +.action[data-v-d6be1790] { + padding-top: 20px; +} +.link[data-v-d6be1790] { + display: inline-block; + border: 1px solid var(--vp-c-brand-1); + border-radius: 16px; + padding: 3px 16px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-brand-1); + transition: + border-color 0.25s, + color 0.25s; +} +.link[data-v-d6be1790]:hover { + border-color: var(--vp-c-brand-2); + color: var(--vp-c-brand-2); +} + +.root[data-v-b933a997] { + position: relative; + z-index: 1; +} +.nested[data-v-b933a997] { + padding-right: 16px; + padding-left: 16px; +} +.outline-link[data-v-b933a997] { + display: block; + line-height: 32px; + font-size: 14px; + font-weight: 400; + color: var(--vp-c-text-2); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: color 0.5s; +} +.outline-link[data-v-b933a997]:hover, +.outline-link.active[data-v-b933a997] { + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.outline-link.nested[data-v-b933a997] { + padding-left: 13px; +} + +.VPDocAsideOutline[data-v-a5bbad30] { + display: none; +} +.VPDocAsideOutline.has-outline[data-v-a5bbad30] { + display: block; +} +.content[data-v-a5bbad30] { + position: relative; + border-left: 1px solid var(--vp-c-divider); + padding-left: 16px; + font-size: 13px; + font-weight: 500; +} +.outline-marker[data-v-a5bbad30] { + position: absolute; + top: 32px; + left: -1px; + z-index: 0; + opacity: 0; + width: 2px; + border-radius: 2px; + height: 18px; + background-color: var(--vp-c-brand-1); + transition: + top 0.25s cubic-bezier(0, 1, 0.5, 1), + background-color 0.5s, + opacity 0.25s; +} +.outline-title[data-v-a5bbad30] { + line-height: 32px; + font-size: 14px; + font-weight: 600; +} + +.VPDocAside[data-v-3f215769] { + display: flex; + flex-direction: column; + flex-grow: 1; +} +.spacer[data-v-3f215769] { + flex-grow: 1; +} +.VPDocAside[data-v-3f215769] .spacer + .VPDocAsideSponsors, +.VPDocAside[data-v-3f215769] .spacer + .VPDocAsideCarbonAds { + margin-top: 24px; +} +.VPDocAside[data-v-3f215769] .VPDocAsideSponsors + .VPDocAsideCarbonAds { + margin-top: 16px; +} + +.VPLastUpdated[data-v-e98dd255] { + line-height: 24px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-2); +} +@media (min-width: 640px) { +.VPLastUpdated[data-v-e98dd255] { + line-height: 32px; + font-size: 14px; + font-weight: 500; +} +} + +.VPDocFooter[data-v-e257564d] { + margin-top: 64px; +} +.edit-info[data-v-e257564d] { + padding-bottom: 18px; +} +@media (min-width: 640px) { +.edit-info[data-v-e257564d] { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 14px; +} +} +.edit-link-button[data-v-e257564d] { + display: flex; + align-items: center; + border: 0; + line-height: 32px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-brand-1); + transition: color 0.25s; +} +.edit-link-button[data-v-e257564d]:hover { + color: var(--vp-c-brand-2); +} +.edit-link-icon[data-v-e257564d] { + margin-right: 8px; +} +.prev-next[data-v-e257564d] { + border-top: 1px solid var(--vp-c-divider); + padding-top: 24px; + display: grid; + grid-row-gap: 8px; +} +@media (min-width: 640px) { +.prev-next[data-v-e257564d] { + grid-template-columns: repeat(2, 1fr); + grid-column-gap: 16px; +} +} +.pager-link[data-v-e257564d] { + display: block; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + padding: 11px 16px 13px; + width: 100%; + height: 100%; + transition: border-color 0.25s; +} +.pager-link[data-v-e257564d]:hover { + border-color: var(--vp-c-brand-1); +} +.pager-link.next[data-v-e257564d] { + margin-left: auto; + text-align: right; +} +.desc[data-v-e257564d] { + display: block; + line-height: 20px; + font-size: 12px; + font-weight: 500; + color: var(--vp-c-text-2); +} +.title[data-v-e257564d] { + display: block; + line-height: 20px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-brand-1); + transition: color 0.25s; +} + +.VPDoc[data-v-39a288b8] { + padding: 32px 24px 96px; + width: 100%; +} +@media (min-width: 768px) { +.VPDoc[data-v-39a288b8] { + padding: 48px 32px 128px; +} +} +@media (min-width: 960px) { +.VPDoc[data-v-39a288b8] { + padding: 48px 32px 0; +} +.VPDoc:not(.has-sidebar) .container[data-v-39a288b8] { + display: flex; + justify-content: center; + max-width: 992px; +} +.VPDoc:not(.has-sidebar) .content[data-v-39a288b8] { + max-width: 752px; +} +} +@media (min-width: 1280px) { +.VPDoc .container[data-v-39a288b8] { + display: flex; + justify-content: center; +} +.VPDoc .aside[data-v-39a288b8] { + display: block; +} +} +@media (min-width: 1440px) { +.VPDoc:not(.has-sidebar) .content[data-v-39a288b8] { + max-width: 784px; +} +.VPDoc:not(.has-sidebar) .container[data-v-39a288b8] { + max-width: 1104px; +} +} +.container[data-v-39a288b8] { + margin: 0 auto; + width: 100%; +} +.aside[data-v-39a288b8] { + position: relative; + display: none; + order: 2; + flex-grow: 1; + padding-left: 32px; + width: 100%; + max-width: 256px; +} +.left-aside[data-v-39a288b8] { + order: 1; + padding-left: unset; + padding-right: 32px; +} +.aside-container[data-v-39a288b8] { + position: fixed; + top: 0; + padding-top: calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px); + width: 224px; + height: 100vh; + overflow-x: hidden; + overflow-y: auto; + scrollbar-width: none; +} +.aside-container[data-v-39a288b8]::-webkit-scrollbar { + display: none; +} +.aside-curtain[data-v-39a288b8] { + position: fixed; + bottom: 0; + z-index: 10; + width: 224px; + height: 32px; + background: linear-gradient(transparent, var(--vp-c-bg) 70%); +} +.aside-content[data-v-39a288b8] { + display: flex; + flex-direction: column; + min-height: calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px)); + padding-bottom: 32px; +} +.content[data-v-39a288b8] { + position: relative; + margin: 0 auto; + width: 100%; +} +@media (min-width: 960px) { +.content[data-v-39a288b8] { + padding: 0 32px 128px; +} +} +@media (min-width: 1280px) { +.content[data-v-39a288b8] { + order: 1; + margin: 0; + min-width: 640px; +} +} +.content-container[data-v-39a288b8] { + margin: 0 auto; +} +.VPDoc.has-aside .content-container[data-v-39a288b8] { + max-width: 688px; +} + +.VPButton[data-v-fa7799d5] { + display: inline-block; + border: 1px solid transparent; + text-align: center; + font-weight: 600; + white-space: nowrap; + transition: color 0.25s, border-color 0.25s, background-color 0.25s; +} +.VPButton[data-v-fa7799d5]:active { + transition: color 0.1s, border-color 0.1s, background-color 0.1s; +} +.VPButton.medium[data-v-fa7799d5] { + border-radius: 20px; + padding: 0 20px; + line-height: 38px; + font-size: 14px; +} +.VPButton.big[data-v-fa7799d5] { + border-radius: 24px; + padding: 0 24px; + line-height: 46px; + font-size: 16px; +} +.VPButton.brand[data-v-fa7799d5] { + border-color: var(--vp-button-brand-border); + color: var(--vp-button-brand-text); + background-color: var(--vp-button-brand-bg); +} +.VPButton.brand[data-v-fa7799d5]:hover { + border-color: var(--vp-button-brand-hover-border); + color: var(--vp-button-brand-hover-text); + background-color: var(--vp-button-brand-hover-bg); +} +.VPButton.brand[data-v-fa7799d5]:active { + border-color: var(--vp-button-brand-active-border); + color: var(--vp-button-brand-active-text); + background-color: var(--vp-button-brand-active-bg); +} +.VPButton.alt[data-v-fa7799d5] { + border-color: var(--vp-button-alt-border); + color: var(--vp-button-alt-text); + background-color: var(--vp-button-alt-bg); +} +.VPButton.alt[data-v-fa7799d5]:hover { + border-color: var(--vp-button-alt-hover-border); + color: var(--vp-button-alt-hover-text); + background-color: var(--vp-button-alt-hover-bg); +} +.VPButton.alt[data-v-fa7799d5]:active { + border-color: var(--vp-button-alt-active-border); + color: var(--vp-button-alt-active-text); + background-color: var(--vp-button-alt-active-bg); +} +.VPButton.sponsor[data-v-fa7799d5] { + border-color: var(--vp-button-sponsor-border); + color: var(--vp-button-sponsor-text); + background-color: var(--vp-button-sponsor-bg); +} +.VPButton.sponsor[data-v-fa7799d5]:hover { + border-color: var(--vp-button-sponsor-hover-border); + color: var(--vp-button-sponsor-hover-text); + background-color: var(--vp-button-sponsor-hover-bg); +} +.VPButton.sponsor[data-v-fa7799d5]:active { + border-color: var(--vp-button-sponsor-active-border); + color: var(--vp-button-sponsor-active-text); + background-color: var(--vp-button-sponsor-active-bg); +} + +html:not(.dark) .VPImage.dark[data-v-8426fc1a] { + display: none; +} +.dark .VPImage.light[data-v-8426fc1a] { + display: none; +} + +.VPHero[data-v-4f9c455b] { + margin-top: calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1); + padding: calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px; +} +@media (min-width: 640px) { +.VPHero[data-v-4f9c455b] { + padding: calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px; +} +} +@media (min-width: 960px) { +.VPHero[data-v-4f9c455b] { + padding: calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px; +} +} +.container[data-v-4f9c455b] { + display: flex; + flex-direction: column; + margin: 0 auto; + max-width: 1152px; +} +@media (min-width: 960px) { +.container[data-v-4f9c455b] { + flex-direction: row; +} +} +.main[data-v-4f9c455b] { + position: relative; + z-index: 10; + order: 2; + flex-grow: 1; + flex-shrink: 0; +} +.VPHero.has-image .container[data-v-4f9c455b] { + text-align: center; +} +@media (min-width: 960px) { +.VPHero.has-image .container[data-v-4f9c455b] { + text-align: left; +} +} +@media (min-width: 960px) { +.main[data-v-4f9c455b] { + order: 1; + width: calc((100% / 3) * 2); +} +.VPHero.has-image .main[data-v-4f9c455b] { + max-width: 592px; +} +} +.heading[data-v-4f9c455b] { + display: flex; + flex-direction: column; +} +.name[data-v-4f9c455b], +.text[data-v-4f9c455b] { + width: fit-content; + max-width: 392px; + letter-spacing: -0.4px; + line-height: 40px; + font-size: 32px; + font-weight: 700; + white-space: pre-wrap; +} +.VPHero.has-image .name[data-v-4f9c455b], +.VPHero.has-image .text[data-v-4f9c455b] { + margin: 0 auto; +} +.name[data-v-4f9c455b] { + color: var(--vp-home-hero-name-color); +} +.clip[data-v-4f9c455b] { + background: var(--vp-home-hero-name-background); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: var(--vp-home-hero-name-color); +} +@media (min-width: 640px) { +.name[data-v-4f9c455b], + .text[data-v-4f9c455b] { + max-width: 576px; + line-height: 56px; + font-size: 48px; +} +} +@media (min-width: 960px) { +.name[data-v-4f9c455b], + .text[data-v-4f9c455b] { + line-height: 64px; + font-size: 56px; +} +.VPHero.has-image .name[data-v-4f9c455b], + .VPHero.has-image .text[data-v-4f9c455b] { + margin: 0; +} +} +.tagline[data-v-4f9c455b] { + padding-top: 8px; + max-width: 392px; + line-height: 28px; + font-size: 18px; + font-weight: 500; + white-space: pre-wrap; + color: var(--vp-c-text-2); +} +.VPHero.has-image .tagline[data-v-4f9c455b] { + margin: 0 auto; +} +@media (min-width: 640px) { +.tagline[data-v-4f9c455b] { + padding-top: 12px; + max-width: 576px; + line-height: 32px; + font-size: 20px; +} +} +@media (min-width: 960px) { +.tagline[data-v-4f9c455b] { + line-height: 36px; + font-size: 24px; +} +.VPHero.has-image .tagline[data-v-4f9c455b] { + margin: 0; +} +} +.actions[data-v-4f9c455b] { + display: flex; + flex-wrap: wrap; + margin: -6px; + padding-top: 24px; +} +.VPHero.has-image .actions[data-v-4f9c455b] { + justify-content: center; +} +@media (min-width: 640px) { +.actions[data-v-4f9c455b] { + padding-top: 32px; +} +} +@media (min-width: 960px) { +.VPHero.has-image .actions[data-v-4f9c455b] { + justify-content: flex-start; +} +} +.action[data-v-4f9c455b] { + flex-shrink: 0; + padding: 6px; +} +.image[data-v-4f9c455b] { + order: 1; + margin: -76px -24px -48px; +} +@media (min-width: 640px) { +.image[data-v-4f9c455b] { + margin: -108px -24px -48px; +} +} +@media (min-width: 960px) { +.image[data-v-4f9c455b] { + flex-grow: 1; + order: 2; + margin: 0; + min-height: 100%; +} +} +.image-container[data-v-4f9c455b] { + position: relative; + margin: 0 auto; + width: 320px; + height: 320px; +} +@media (min-width: 640px) { +.image-container[data-v-4f9c455b] { + width: 392px; + height: 392px; +} +} +@media (min-width: 960px) { +.image-container[data-v-4f9c455b] { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + /*rtl:ignore*/ + transform: translate(-32px, -32px); +} +} +.image-bg[data-v-4f9c455b] { + position: absolute; + top: 50%; + /*rtl:ignore*/ + left: 50%; + border-radius: 50%; + width: 192px; + height: 192px; + background-image: var(--vp-home-hero-image-background-image); + filter: var(--vp-home-hero-image-filter); + /*rtl:ignore*/ + transform: translate(-50%, -50%); +} +@media (min-width: 640px) { +.image-bg[data-v-4f9c455b] { + width: 256px; + height: 256px; +} +} +@media (min-width: 960px) { +.image-bg[data-v-4f9c455b] { + width: 320px; + height: 320px; +} +} +[data-v-4f9c455b] .image-src { + position: absolute; + top: 50%; + /*rtl:ignore*/ + left: 50%; + max-width: 192px; + max-height: 192px; + /*rtl:ignore*/ + transform: translate(-50%, -50%); +} +@media (min-width: 640px) { +[data-v-4f9c455b] .image-src { + max-width: 256px; + max-height: 256px; +} +} +@media (min-width: 960px) { +[data-v-4f9c455b] .image-src { + max-width: 320px; + max-height: 320px; +} +} + +.VPFeature[data-v-a3976bdc] { + display: block; + border: 1px solid var(--vp-c-bg-soft); + border-radius: 12px; + height: 100%; + background-color: var(--vp-c-bg-soft); + transition: border-color 0.25s, background-color 0.25s; +} +.VPFeature.link[data-v-a3976bdc]:hover { + border-color: var(--vp-c-brand-1); +} +.box[data-v-a3976bdc] { + display: flex; + flex-direction: column; + padding: 24px; + height: 100%; +} +.box[data-v-a3976bdc] > .VPImage { + margin-bottom: 20px; +} +.icon[data-v-a3976bdc] { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 20px; + border-radius: 6px; + background-color: var(--vp-c-default-soft); + width: 48px; + height: 48px; + font-size: 24px; + transition: background-color 0.25s; +} +.title[data-v-a3976bdc] { + line-height: 24px; + font-size: 16px; + font-weight: 600; +} +.details[data-v-a3976bdc] { + flex-grow: 1; + padding-top: 8px; + line-height: 24px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-2); +} +.link-text[data-v-a3976bdc] { + padding-top: 8px; +} +.link-text-value[data-v-a3976bdc] { + display: flex; + align-items: center; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-brand-1); +} +.link-text-icon[data-v-a3976bdc] { + margin-left: 6px; +} + +.VPFeatures[data-v-a6181336] { + position: relative; + padding: 0 24px; +} +@media (min-width: 640px) { +.VPFeatures[data-v-a6181336] { + padding: 0 48px; +} +} +@media (min-width: 960px) { +.VPFeatures[data-v-a6181336] { + padding: 0 64px; +} +} +.container[data-v-a6181336] { + margin: 0 auto; + max-width: 1152px; +} +.items[data-v-a6181336] { + display: flex; + flex-wrap: wrap; + margin: -8px; +} +.item[data-v-a6181336] { + padding: 8px; + width: 100%; +} +@media (min-width: 640px) { +.item.grid-2[data-v-a6181336], + .item.grid-4[data-v-a6181336], + .item.grid-6[data-v-a6181336] { + width: calc(100% / 2); +} +} +@media (min-width: 768px) { +.item.grid-2[data-v-a6181336], + .item.grid-4[data-v-a6181336] { + width: calc(100% / 2); +} +.item.grid-3[data-v-a6181336], + .item.grid-6[data-v-a6181336] { + width: calc(100% / 3); +} +} +@media (min-width: 960px) { +.item.grid-4[data-v-a6181336] { + width: calc(100% / 4); +} +} + +.container[data-v-8e2d4988] { + margin: auto; + width: 100%; + max-width: 1280px; + padding: 0 24px; +} +@media (min-width: 640px) { +.container[data-v-8e2d4988] { + padding: 0 48px; +} +} +@media (min-width: 960px) { +.container[data-v-8e2d4988] { + width: 100%; + padding: 0 64px; +} +} +.vp-doc[data-v-8e2d4988] .VPHomeSponsors, +.vp-doc[data-v-8e2d4988] .VPTeamPage { + margin-left: var(--vp-offset, calc(50% - 50vw)); + margin-right: var(--vp-offset, calc(50% - 50vw)); +} +.vp-doc[data-v-8e2d4988] .VPHomeSponsors h2 { + border-top: none; + letter-spacing: normal; +} +.vp-doc[data-v-8e2d4988] .VPHomeSponsors a, +.vp-doc[data-v-8e2d4988] .VPTeamPage a { + text-decoration: none; +} + +.VPHome[data-v-8b561e3d] { + margin-bottom: 96px; +} +@media (min-width: 768px) { +.VPHome[data-v-8b561e3d] { + margin-bottom: 128px; +} +} + +.VPContent[data-v-1428d186] { + flex-grow: 1; + flex-shrink: 0; + margin: var(--vp-layout-top-height, 0px) auto 0; + width: 100%; +} +.VPContent.is-home[data-v-1428d186] { + width: 100%; + max-width: 100%; +} +.VPContent.has-sidebar[data-v-1428d186] { + margin: 0; +} +@media (min-width: 960px) { +.VPContent[data-v-1428d186] { + padding-top: var(--vp-nav-height); +} +.VPContent.has-sidebar[data-v-1428d186] { + margin: var(--vp-layout-top-height, 0px) 0 0; + padding-left: var(--vp-sidebar-width); +} +} +@media (min-width: 1440px) { +.VPContent.has-sidebar[data-v-1428d186] { + padding-right: calc((100vw - var(--vp-layout-max-width)) / 2); + padding-left: calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)); +} +} + +.VPFooter[data-v-e315a0ad] { + position: relative; + z-index: var(--vp-z-index-footer); + border-top: 1px solid var(--vp-c-gutter); + padding: 32px 24px; + background-color: var(--vp-c-bg); +} +.VPFooter.has-sidebar[data-v-e315a0ad] { + display: none; +} +.VPFooter[data-v-e315a0ad] a { + text-decoration-line: underline; + text-underline-offset: 2px; + transition: color 0.25s; +} +.VPFooter[data-v-e315a0ad] a:hover { + color: var(--vp-c-text-1); +} +@media (min-width: 768px) { +.VPFooter[data-v-e315a0ad] { + padding: 32px; +} +} +.container[data-v-e315a0ad] { + margin: 0 auto; + max-width: var(--vp-layout-max-width); + text-align: center; +} +.message[data-v-e315a0ad], +.copyright[data-v-e315a0ad] { + line-height: 24px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-2); +} + +.VPLocalNavOutlineDropdown[data-v-8a42e2b4] { + padding: 12px 20px 11px; +} +@media (min-width: 960px) { +.VPLocalNavOutlineDropdown[data-v-8a42e2b4] { + padding: 12px 36px 11px; +} +} +.VPLocalNavOutlineDropdown button[data-v-8a42e2b4] { + display: block; + font-size: 12px; + font-weight: 500; + line-height: 24px; + color: var(--vp-c-text-2); + transition: color 0.5s; + position: relative; +} +.VPLocalNavOutlineDropdown button[data-v-8a42e2b4]:hover { + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.VPLocalNavOutlineDropdown button.open[data-v-8a42e2b4] { + color: var(--vp-c-text-1); +} +.icon[data-v-8a42e2b4] { + display: inline-block; + vertical-align: middle; + margin-left: 2px; + font-size: 14px; + transform: rotate(0)/*rtl:rotate(180deg)*/; + transition: transform 0.25s; +} +@media (min-width: 960px) { +.VPLocalNavOutlineDropdown button[data-v-8a42e2b4] { + font-size: 14px; +} +.icon[data-v-8a42e2b4] { + font-size: 16px; +} +} +.open > .icon[data-v-8a42e2b4] { + /*rtl:ignore*/ + transform: rotate(90deg); +} +.items[data-v-8a42e2b4] { + position: absolute; + top: 40px; + right: 16px; + left: 16px; + display: grid; + gap: 1px; + border: 1px solid var(--vp-c-border); + border-radius: 8px; + background-color: var(--vp-c-gutter); + max-height: calc(var(--vp-vh, 100vh) - 86px); + overflow: hidden auto; + box-shadow: var(--vp-shadow-3); +} +@media (min-width: 960px) { +.items[data-v-8a42e2b4] { + right: auto; + left: calc(var(--vp-sidebar-width) + 32px); + width: 320px; +} +} +.header[data-v-8a42e2b4] { + background-color: var(--vp-c-bg-soft); +} +.top-link[data-v-8a42e2b4] { + display: block; + padding: 0 16px; + line-height: 48px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-brand-1); +} +.outline[data-v-8a42e2b4] { + padding: 8px 0; + background-color: var(--vp-c-bg-soft); +} +.flyout-enter-active[data-v-8a42e2b4] { + transition: all 0.2s ease-out; +} +.flyout-leave-active[data-v-8a42e2b4] { + transition: all 0.15s ease-in; +} +.flyout-enter-from[data-v-8a42e2b4], +.flyout-leave-to[data-v-8a42e2b4] { + opacity: 0; + transform: translateY(-16px); +} + +.VPLocalNav[data-v-a6f0e41e] { + position: sticky; + top: 0; + /*rtl:ignore*/ + left: 0; + z-index: var(--vp-z-index-local-nav); + border-bottom: 1px solid var(--vp-c-gutter); + padding-top: var(--vp-layout-top-height, 0px); + width: 100%; + background-color: var(--vp-local-nav-bg-color); +} +.VPLocalNav.fixed[data-v-a6f0e41e] { + position: fixed; +} +@media (min-width: 960px) { +.VPLocalNav[data-v-a6f0e41e] { + top: var(--vp-nav-height); +} +.VPLocalNav.has-sidebar[data-v-a6f0e41e] { + padding-left: var(--vp-sidebar-width); +} +.VPLocalNav.empty[data-v-a6f0e41e] { + display: none; +} +} +@media (min-width: 1280px) { +.VPLocalNav[data-v-a6f0e41e] { + display: none; +} +} +@media (min-width: 1440px) { +.VPLocalNav.has-sidebar[data-v-a6f0e41e] { + padding-left: calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)); +} +} +.container[data-v-a6f0e41e] { + display: flex; + justify-content: space-between; + align-items: center; +} +.menu[data-v-a6f0e41e] { + display: flex; + align-items: center; + padding: 12px 24px 11px; + line-height: 24px; + font-size: 12px; + font-weight: 500; + color: var(--vp-c-text-2); + transition: color 0.5s; +} +.menu[data-v-a6f0e41e]:hover { + color: var(--vp-c-text-1); + transition: color 0.25s; +} +@media (min-width: 768px) { +.menu[data-v-a6f0e41e] { + padding: 0 32px; +} +} +@media (min-width: 960px) { +.menu[data-v-a6f0e41e] { + display: none; +} +} +.menu-icon[data-v-a6f0e41e] { + margin-right: 8px; + font-size: 14px; +} +.VPOutlineDropdown[data-v-a6f0e41e] { + padding: 12px 24px 11px; +} +@media (min-width: 768px) { +.VPOutlineDropdown[data-v-a6f0e41e] { + padding: 12px 32px 11px; +} +} + +.VPSwitch[data-v-1d5665e3] { + position: relative; + border-radius: 11px; + display: block; + width: 40px; + height: 22px; + flex-shrink: 0; + border: 1px solid var(--vp-input-border-color); + background-color: var(--vp-input-switch-bg-color); + transition: border-color 0.25s !important; +} +.VPSwitch[data-v-1d5665e3]:hover { + border-color: var(--vp-c-brand-1); +} +.check[data-v-1d5665e3] { + position: absolute; + top: 1px; + /*rtl:ignore*/ + left: 1px; + width: 18px; + height: 18px; + border-radius: 50%; + background-color: var(--vp-c-neutral-inverse); + box-shadow: var(--vp-shadow-1); + transition: transform 0.25s !important; +} +.icon[data-v-1d5665e3] { + position: relative; + display: block; + width: 18px; + height: 18px; + border-radius: 50%; + overflow: hidden; +} +.icon[data-v-1d5665e3] [class^='vpi-'] { + position: absolute; + top: 3px; + left: 3px; + width: 12px; + height: 12px; + color: var(--vp-c-text-2); +} +.dark .icon[data-v-1d5665e3] [class^='vpi-'] { + color: var(--vp-c-text-1); + transition: opacity 0.25s !important; +} + +.sun[data-v-5337faa4] { + opacity: 1; +} +.moon[data-v-5337faa4] { + opacity: 0; +} +.dark .sun[data-v-5337faa4] { + opacity: 0; +} +.dark .moon[data-v-5337faa4] { + opacity: 1; +} +.dark .VPSwitchAppearance[data-v-5337faa4] .check { + /*rtl:ignore*/ + transform: translateX(18px); +} + +.VPNavBarAppearance[data-v-6c893767] { + display: none; +} +@media (min-width: 1280px) { +.VPNavBarAppearance[data-v-6c893767] { + display: flex; + align-items: center; +} +} + +.VPMenuGroup + .VPMenuLink[data-v-35975db6] { + margin: 12px -12px 0; + border-top: 1px solid var(--vp-c-divider); + padding: 12px 12px 0; +} +.link[data-v-35975db6] { + display: block; + border-radius: 6px; + padding: 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + white-space: nowrap; + transition: + background-color 0.25s, + color 0.25s; +} +.link[data-v-35975db6]:hover { + color: var(--vp-c-brand-1); + background-color: var(--vp-c-default-soft); +} +.link.active[data-v-35975db6] { + color: var(--vp-c-brand-1); +} + +.VPMenuGroup[data-v-69e747b5] { + margin: 12px -12px 0; + border-top: 1px solid var(--vp-c-divider); + padding: 12px 12px 0; +} +.VPMenuGroup[data-v-69e747b5]:first-child { + margin-top: 0; + border-top: 0; + padding-top: 0; +} +.VPMenuGroup + .VPMenuGroup[data-v-69e747b5] { + margin-top: 12px; + border-top: 1px solid var(--vp-c-divider); +} +.title[data-v-69e747b5] { + padding: 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 600; + color: var(--vp-c-text-2); + white-space: nowrap; + transition: color 0.25s; +} + +.VPMenu[data-v-b98bc113] { + border-radius: 12px; + padding: 12px; + min-width: 128px; + border: 1px solid var(--vp-c-divider); + background-color: var(--vp-c-bg-elv); + box-shadow: var(--vp-shadow-3); + transition: background-color 0.5s; + max-height: calc(100vh - var(--vp-nav-height)); + overflow-y: auto; +} +.VPMenu[data-v-b98bc113] .group { + margin: 0 -12px; + padding: 0 12px 12px; +} +.VPMenu[data-v-b98bc113] .group + .group { + border-top: 1px solid var(--vp-c-divider); + padding: 11px 12px 12px; +} +.VPMenu[data-v-b98bc113] .group:last-child { + padding-bottom: 0; +} +.VPMenu[data-v-b98bc113] .group + .item { + border-top: 1px solid var(--vp-c-divider); + padding: 11px 16px 0; +} +.VPMenu[data-v-b98bc113] .item { + padding: 0 16px; + white-space: nowrap; +} +.VPMenu[data-v-b98bc113] .label { + flex-grow: 1; + line-height: 28px; + font-size: 12px; + font-weight: 500; + color: var(--vp-c-text-2); + transition: color 0.5s; +} +.VPMenu[data-v-b98bc113] .action { + padding-left: 24px; +} + +.VPFlyout[data-v-cf11d7a2] { + position: relative; +} +.VPFlyout[data-v-cf11d7a2]:hover { + color: var(--vp-c-brand-1); + transition: color 0.25s; +} +.VPFlyout:hover .text[data-v-cf11d7a2] { + color: var(--vp-c-text-2); +} +.VPFlyout:hover .icon[data-v-cf11d7a2] { + fill: var(--vp-c-text-2); +} +.VPFlyout.active .text[data-v-cf11d7a2] { + color: var(--vp-c-brand-1); +} +.VPFlyout.active:hover .text[data-v-cf11d7a2] { + color: var(--vp-c-brand-2); +} +.button[aria-expanded="false"] + .menu[data-v-cf11d7a2] { + opacity: 0; + visibility: hidden; + transform: translateY(0); +} +.VPFlyout:hover .menu[data-v-cf11d7a2], +.button[aria-expanded="true"] + .menu[data-v-cf11d7a2] { + opacity: 1; + visibility: visible; + transform: translateY(0); +} +.button[data-v-cf11d7a2] { + display: flex; + align-items: center; + padding: 0 12px; + height: var(--vp-nav-height); + color: var(--vp-c-text-1); + transition: color 0.5s; +} +.text[data-v-cf11d7a2] { + display: flex; + align-items: center; + line-height: var(--vp-nav-height); + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.option-icon[data-v-cf11d7a2] { + margin-right: 0px; + font-size: 16px; +} +.text-icon[data-v-cf11d7a2] { + margin-left: 4px; + font-size: 14px; +} +.icon[data-v-cf11d7a2] { + font-size: 20px; + transition: fill 0.25s; +} +.menu[data-v-cf11d7a2] { + position: absolute; + top: calc(var(--vp-nav-height) / 2 + 20px); + right: 0; + opacity: 0; + visibility: hidden; + transition: opacity 0.25s, visibility 0.25s, transform 0.25s; +} + +.VPSocialLink[data-v-bd121fe5] { + display: flex; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + color: var(--vp-c-text-2); + transition: color 0.5s; +} +.VPSocialLink[data-v-bd121fe5]:hover { + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.VPSocialLink[data-v-bd121fe5] > svg, +.VPSocialLink[data-v-bd121fe5] > [class^="vpi-social-"] { + width: 20px; + height: 20px; + fill: currentColor; +} + +.VPSocialLinks[data-v-7bc22406] { + display: flex; + justify-content: center; +} + +.VPNavBarExtra[data-v-bb2aa2f0] { + display: none; + margin-right: -12px; +} +@media (min-width: 768px) { +.VPNavBarExtra[data-v-bb2aa2f0] { + display: block; +} +} +@media (min-width: 1280px) { +.VPNavBarExtra[data-v-bb2aa2f0] { + display: none; +} +} +.trans-title[data-v-bb2aa2f0] { + padding: 0 24px 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 700; + color: var(--vp-c-text-1); +} +.item.appearance[data-v-bb2aa2f0], +.item.social-links[data-v-bb2aa2f0] { + display: flex; + align-items: center; + padding: 0 12px; +} +.item.appearance[data-v-bb2aa2f0] { + min-width: 176px; +} +.appearance-action[data-v-bb2aa2f0] { + margin-right: -2px; +} +.social-links-list[data-v-bb2aa2f0] { + margin: -4px -8px; +} + +.VPNavBarHamburger[data-v-e5dd9c1c] { + display: flex; + justify-content: center; + align-items: center; + width: 48px; + height: var(--vp-nav-height); +} +@media (min-width: 768px) { +.VPNavBarHamburger[data-v-e5dd9c1c] { + display: none; +} +} +.container[data-v-e5dd9c1c] { + position: relative; + width: 16px; + height: 14px; + overflow: hidden; +} +.VPNavBarHamburger:hover .top[data-v-e5dd9c1c] { top: 0; left: 0; transform: translateX(4px); +} +.VPNavBarHamburger:hover .middle[data-v-e5dd9c1c] { top: 6px; left: 0; transform: translateX(0); +} +.VPNavBarHamburger:hover .bottom[data-v-e5dd9c1c] { top: 12px; left: 0; transform: translateX(8px); +} +.VPNavBarHamburger.active .top[data-v-e5dd9c1c] { top: 6px; transform: translateX(0) rotate(225deg); +} +.VPNavBarHamburger.active .middle[data-v-e5dd9c1c] { top: 6px; transform: translateX(16px); +} +.VPNavBarHamburger.active .bottom[data-v-e5dd9c1c] { top: 6px; transform: translateX(0) rotate(135deg); +} +.VPNavBarHamburger.active:hover .top[data-v-e5dd9c1c], +.VPNavBarHamburger.active:hover .middle[data-v-e5dd9c1c], +.VPNavBarHamburger.active:hover .bottom[data-v-e5dd9c1c] { + background-color: var(--vp-c-text-2); + transition: top .25s, background-color .25s, transform .25s; +} +.top[data-v-e5dd9c1c], +.middle[data-v-e5dd9c1c], +.bottom[data-v-e5dd9c1c] { + position: absolute; + width: 16px; + height: 2px; + background-color: var(--vp-c-text-1); + transition: top .25s, background-color .5s, transform .25s; +} +.top[data-v-e5dd9c1c] { top: 0; left: 0; transform: translateX(0); +} +.middle[data-v-e5dd9c1c] { top: 6px; left: 0; transform: translateX(8px); +} +.bottom[data-v-e5dd9c1c] { top: 12px; left: 0; transform: translateX(4px); +} + +.VPNavBarMenuLink[data-v-e56f3d57] { + display: flex; + align-items: center; + padding: 0 12px; + line-height: var(--vp-nav-height); + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.VPNavBarMenuLink.active[data-v-e56f3d57] { + color: var(--vp-c-brand-1); +} +.VPNavBarMenuLink[data-v-e56f3d57]:hover { + color: var(--vp-c-brand-1); +} + +.VPNavBarMenu[data-v-dc692963] { + display: none; +} +@media (min-width: 768px) { +.VPNavBarMenu[data-v-dc692963] { + display: flex; +} +} +/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ +:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}} +[class*='DocSearch'] { + --docsearch-primary-color: var(--vp-c-brand-1); + --docsearch-highlight-color: var(--docsearch-primary-color); + --docsearch-text-color: var(--vp-c-text-1); + --docsearch-muted-color: var(--vp-c-text-2); + --docsearch-searchbox-shadow: none; + --docsearch-searchbox-background: transparent; + --docsearch-searchbox-focus-background: transparent; + --docsearch-key-gradient: transparent; + --docsearch-key-shadow: none; + --docsearch-modal-background: var(--vp-c-bg-soft); + --docsearch-footer-background: var(--vp-c-bg); +} +.dark [class*='DocSearch'] { + --docsearch-modal-shadow: none; + --docsearch-footer-shadow: none; + --docsearch-logo-color: var(--vp-c-text-2); + --docsearch-hit-background: var(--vp-c-default-soft); + --docsearch-hit-color: var(--vp-c-text-2); + --docsearch-hit-shadow: none; +} +.DocSearch-Button { + display: flex; + justify-content: center; + align-items: center; + margin: 0; + padding: 0; + width: 48px; + height: 55px; + background: transparent; + transition: border-color 0.25s; +} +.DocSearch-Button:hover { + background: transparent; +} +.DocSearch-Button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} +.DocSearch-Button-Key--pressed { + transform: none; + box-shadow: none; +} +.DocSearch-Button:focus:not(:focus-visible) { + outline: none !important; +} +@media (min-width: 768px) { +.DocSearch-Button { + justify-content: flex-start; + border: 1px solid transparent; + border-radius: 8px; + padding: 0 10px 0 12px; + width: 100%; + height: 40px; + background-color: var(--vp-c-bg-alt); +} +.DocSearch-Button:hover { + border-color: var(--vp-c-brand-1); + background: var(--vp-c-bg-alt); +} +} +.DocSearch-Button .DocSearch-Button-Container { + display: flex; + align-items: center; +} +.DocSearch-Button .DocSearch-Search-Icon { + position: relative; + width: 16px; + height: 16px; + color: var(--vp-c-text-1); + fill: currentColor; + transition: color 0.5s; +} +.DocSearch-Button:hover .DocSearch-Search-Icon { + color: var(--vp-c-text-1); +} +@media (min-width: 768px) { +.DocSearch-Button .DocSearch-Search-Icon { + top: 1px; + margin-right: 8px; + width: 14px; + height: 14px; + color: var(--vp-c-text-2); +} +} +.DocSearch-Button .DocSearch-Button-Placeholder { + display: none; + margin-top: 2px; + padding: 0 16px 0 0; + font-size: 13px; + font-weight: 500; + color: var(--vp-c-text-2); + transition: color 0.5s; +} +.DocSearch-Button:hover .DocSearch-Button-Placeholder { + color: var(--vp-c-text-1); +} +@media (min-width: 768px) { +.DocSearch-Button .DocSearch-Button-Placeholder { + display: inline-block; +} +} +.DocSearch-Button .DocSearch-Button-Keys { + /*rtl:ignore*/ + direction: ltr; + display: none; + min-width: auto; +} +@media (min-width: 768px) { +.DocSearch-Button .DocSearch-Button-Keys { + display: flex; + align-items: center; +} +} +.DocSearch-Button .DocSearch-Button-Key { + display: block; + margin: 2px 0 0 0; + border: 1px solid var(--vp-c-divider); + /*rtl:begin:ignore*/ + border-right: none; + border-radius: 4px 0 0 4px; + padding-left: 6px; + /*rtl:end:ignore*/ + min-width: 0; + width: auto; + height: 22px; + line-height: 22px; + font-family: var(--vp-font-family-base); + font-size: 12px; + font-weight: 500; + transition: color 0.5s, border-color 0.5s; +} +.DocSearch-Button .DocSearch-Button-Key + .DocSearch-Button-Key { + /*rtl:begin:ignore*/ + border-right: 1px solid var(--vp-c-divider); + border-left: none; + border-radius: 0 4px 4px 0; + padding-left: 2px; + padding-right: 6px; + /*rtl:end:ignore*/ +} +.DocSearch-Button .DocSearch-Button-Key:first-child { + font-size: 0 !important; +} +.DocSearch-Button .DocSearch-Button-Key:first-child:after { + content: 'Ctrl'; + font-size: 12px; + letter-spacing: normal; + color: var(--docsearch-muted-color); +} +.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after { + content: '\2318'; +} +.DocSearch-Button .DocSearch-Button-Key:first-child > * { + display: none; +} +.DocSearch-Search-Icon { + --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E"); +} + +.VPNavBarSearch { + display: flex; + align-items: center; +} +@media (min-width: 768px) { +.VPNavBarSearch { + flex-grow: 1; + padding-left: 24px; +} +} +@media (min-width: 960px) { +.VPNavBarSearch { + padding-left: 32px; +} +} +.dark .DocSearch-Footer { + border-top: 1px solid var(--vp-c-divider); +} +.DocSearch-Form { + border: 1px solid var(--vp-c-brand-1); + background-color: var(--vp-c-white); +} +.dark .DocSearch-Form { + background-color: var(--vp-c-default-soft); +} +.DocSearch-Screen-Icon > svg { + margin: auto; +} + +.VPNavBarSocialLinks[data-v-0394ad82] { + display: none; +} +@media (min-width: 1280px) { +.VPNavBarSocialLinks[data-v-0394ad82] { + display: flex; + align-items: center; +} +} + +.title[data-v-1168a8e4] { + display: flex; + align-items: center; + border-bottom: 1px solid transparent; + width: 100%; + height: var(--vp-nav-height); + font-size: 16px; + font-weight: 600; + color: var(--vp-c-text-1); + transition: opacity 0.25s; +} +@media (min-width: 960px) { +.title[data-v-1168a8e4] { + flex-shrink: 0; +} +.VPNavBarTitle.has-sidebar .title[data-v-1168a8e4] { + border-bottom-color: var(--vp-c-divider); +} +} +[data-v-1168a8e4] .logo { + margin-right: 8px; + height: var(--vp-nav-logo-height); +} + +.VPNavBarTranslations[data-v-88af2de4] { + display: none; +} +@media (min-width: 1280px) { +.VPNavBarTranslations[data-v-88af2de4] { + display: flex; + align-items: center; +} +} +.title[data-v-88af2de4] { + padding: 0 24px 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 700; + color: var(--vp-c-text-1); +} + +.VPNavBar[data-v-6aa21345] { + position: relative; + height: var(--vp-nav-height); + pointer-events: none; + white-space: nowrap; + transition: background-color 0.25s; +} +.VPNavBar.screen-open[data-v-6aa21345] { + transition: none; + background-color: var(--vp-nav-bg-color); + border-bottom: 1px solid var(--vp-c-divider); +} +.VPNavBar[data-v-6aa21345]:not(.home) { + background-color: var(--vp-nav-bg-color); +} +@media (min-width: 960px) { +.VPNavBar[data-v-6aa21345]:not(.home) { + background-color: transparent; +} +.VPNavBar[data-v-6aa21345]:not(.has-sidebar):not(.home.top) { + background-color: var(--vp-nav-bg-color); +} +} +.wrapper[data-v-6aa21345] { + padding: 0 8px 0 24px; +} +@media (min-width: 768px) { +.wrapper[data-v-6aa21345] { + padding: 0 32px; +} +} +@media (min-width: 960px) { +.VPNavBar.has-sidebar .wrapper[data-v-6aa21345] { + padding: 0; +} +} +.container[data-v-6aa21345] { + display: flex; + justify-content: space-between; + margin: 0 auto; + max-width: calc(var(--vp-layout-max-width) - 64px); + height: var(--vp-nav-height); + pointer-events: none; +} +.container > .title[data-v-6aa21345], +.container > .content[data-v-6aa21345] { + pointer-events: none; +} +.container[data-v-6aa21345] * { + pointer-events: auto; +} +@media (min-width: 960px) { +.VPNavBar.has-sidebar .container[data-v-6aa21345] { + max-width: 100%; +} +} +.title[data-v-6aa21345] { + flex-shrink: 0; + height: calc(var(--vp-nav-height) - 1px); + transition: background-color 0.5s; +} +@media (min-width: 960px) { +.VPNavBar.has-sidebar .title[data-v-6aa21345] { + position: absolute; + top: 0; + left: 0; + z-index: 2; + padding: 0 32px; + width: var(--vp-sidebar-width); + height: var(--vp-nav-height); + background-color: transparent; +} +} +@media (min-width: 1440px) { +.VPNavBar.has-sidebar .title[data-v-6aa21345] { + padding-left: max(32px, calc((100% - (var(--vp-layout-max-width) - 64px)) / 2)); + width: calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px); +} +} +.content[data-v-6aa21345] { + flex-grow: 1; +} +@media (min-width: 960px) { +.VPNavBar.has-sidebar .content[data-v-6aa21345] { + position: relative; + z-index: 1; + padding-right: 32px; + padding-left: var(--vp-sidebar-width); +} +} +@media (min-width: 1440px) { +.VPNavBar.has-sidebar .content[data-v-6aa21345] { + padding-right: calc((100vw - var(--vp-layout-max-width)) / 2 + 32px); + padding-left: calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)); +} +} +.content-body[data-v-6aa21345] { + display: flex; + justify-content: flex-end; + align-items: center; + height: var(--vp-nav-height); + transition: background-color 0.5s; +} +@media (min-width: 960px) { +.VPNavBar:not(.home.top) .content-body[data-v-6aa21345] { + position: relative; + background-color: var(--vp-nav-bg-color); +} +.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-6aa21345] { + background-color: transparent; +} +} +@media (max-width: 767px) { +.content-body[data-v-6aa21345] { + column-gap: 0.5rem; +} +} +.menu + .translations[data-v-6aa21345]::before, +.menu + .appearance[data-v-6aa21345]::before, +.menu + .social-links[data-v-6aa21345]::before, +.translations + .appearance[data-v-6aa21345]::before, +.appearance + .social-links[data-v-6aa21345]::before { + margin-right: 8px; + margin-left: 8px; + width: 1px; + height: 24px; + background-color: var(--vp-c-divider); + content: ""; +} +.menu + .appearance[data-v-6aa21345]::before, +.translations + .appearance[data-v-6aa21345]::before { + margin-right: 16px; +} +.appearance + .social-links[data-v-6aa21345]::before { + margin-left: 16px; +} +.social-links[data-v-6aa21345] { + margin-right: -8px; +} +.divider[data-v-6aa21345] { + width: 100%; + height: 1px; +} +@media (min-width: 960px) { +.VPNavBar.has-sidebar .divider[data-v-6aa21345] { + padding-left: var(--vp-sidebar-width); +} +} +@media (min-width: 1440px) { +.VPNavBar.has-sidebar .divider[data-v-6aa21345] { + padding-left: calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)); +} +} +.divider-line[data-v-6aa21345] { + width: 100%; + height: 1px; + transition: background-color 0.5s; +} +.VPNavBar:not(.home) .divider-line[data-v-6aa21345] { + background-color: var(--vp-c-gutter); +} +@media (min-width: 960px) { +.VPNavBar:not(.home.top) .divider-line[data-v-6aa21345] { + background-color: var(--vp-c-gutter); +} +.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-6aa21345] { + background-color: var(--vp-c-gutter); +} +} + +.VPNavScreenAppearance[data-v-b44890b2] { + display: flex; + justify-content: space-between; + align-items: center; + border-radius: 8px; + padding: 12px 14px 12px 16px; + background-color: var(--vp-c-bg-soft); +} +.text[data-v-b44890b2] { + line-height: 24px; + font-size: 12px; + font-weight: 500; + color: var(--vp-c-text-2); +} + +.VPNavScreenMenuLink[data-v-df37e6dd] { + display: block; + border-bottom: 1px solid var(--vp-c-divider); + padding: 12px 0 11px; + line-height: 24px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + transition: + border-color 0.25s, + color 0.25s; +} +.VPNavScreenMenuLink[data-v-df37e6dd]:hover { + color: var(--vp-c-brand-1); +} + +.VPNavScreenMenuGroupLink[data-v-3e9c20e4] { + display: block; + margin-left: 12px; + line-height: 32px; + font-size: 14px; + font-weight: 400; + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.VPNavScreenMenuGroupLink[data-v-3e9c20e4]:hover { + color: var(--vp-c-brand-1); +} + +.VPNavScreenMenuGroupSection[data-v-8133b170] { + display: block; +} +.title[data-v-8133b170] { + line-height: 32px; + font-size: 13px; + font-weight: 700; + color: var(--vp-c-text-2); + transition: color 0.25s; +} + +.VPNavScreenMenuGroup[data-v-b9ab8c58] { + border-bottom: 1px solid var(--vp-c-divider); + height: 48px; + overflow: hidden; + transition: border-color 0.5s; +} +.VPNavScreenMenuGroup .items[data-v-b9ab8c58] { + visibility: hidden; +} +.VPNavScreenMenuGroup.open .items[data-v-b9ab8c58] { + visibility: visible; +} +.VPNavScreenMenuGroup.open[data-v-b9ab8c58] { + padding-bottom: 10px; + height: auto; +} +.VPNavScreenMenuGroup.open .button[data-v-b9ab8c58] { + padding-bottom: 6px; + color: var(--vp-c-brand-1); +} +.VPNavScreenMenuGroup.open .button-icon[data-v-b9ab8c58] { + /*rtl:ignore*/ + transform: rotate(45deg); +} +.button[data-v-b9ab8c58] { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 4px 11px 0; + width: 100%; + line-height: 24px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + transition: color 0.25s; +} +.button[data-v-b9ab8c58]:hover { + color: var(--vp-c-brand-1); +} +.button-icon[data-v-b9ab8c58] { + transition: transform 0.25s; +} +.group[data-v-b9ab8c58]:first-child { + padding-top: 0px; +} +.group + .group[data-v-b9ab8c58], +.group + .item[data-v-b9ab8c58] { + padding-top: 4px; +} + +.VPNavScreenTranslations[data-v-858fe1a4] { + height: 24px; + overflow: hidden; +} +.VPNavScreenTranslations.open[data-v-858fe1a4] { + height: auto; +} +.title[data-v-858fe1a4] { + display: flex; + align-items: center; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); +} +.icon[data-v-858fe1a4] { + font-size: 16px; +} +.icon.lang[data-v-858fe1a4] { + margin-right: 8px; +} +.icon.chevron[data-v-858fe1a4] { + margin-left: 4px; +} +.list[data-v-858fe1a4] { + padding: 4px 0 0 24px; +} +.link[data-v-858fe1a4] { + line-height: 32px; + font-size: 13px; + color: var(--vp-c-text-1); +} + +.VPNavScreen[data-v-f2779853] { + position: fixed; + top: calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px)); + /*rtl:ignore*/ + right: 0; + bottom: 0; + /*rtl:ignore*/ + left: 0; + padding: 0 32px; + width: 100%; + background-color: var(--vp-nav-screen-bg-color); + overflow-y: auto; + transition: background-color 0.25s; + pointer-events: auto; +} +.VPNavScreen.fade-enter-active[data-v-f2779853], +.VPNavScreen.fade-leave-active[data-v-f2779853] { + transition: opacity 0.25s; +} +.VPNavScreen.fade-enter-active .container[data-v-f2779853], +.VPNavScreen.fade-leave-active .container[data-v-f2779853] { + transition: transform 0.25s ease; +} +.VPNavScreen.fade-enter-from[data-v-f2779853], +.VPNavScreen.fade-leave-to[data-v-f2779853] { + opacity: 0; +} +.VPNavScreen.fade-enter-from .container[data-v-f2779853], +.VPNavScreen.fade-leave-to .container[data-v-f2779853] { + transform: translateY(-8px); +} +@media (min-width: 768px) { +.VPNavScreen[data-v-f2779853] { + display: none; +} +} +.container[data-v-f2779853] { + margin: 0 auto; + padding: 24px 0 96px; + max-width: 288px; +} +.menu + .translations[data-v-f2779853], +.menu + .appearance[data-v-f2779853], +.translations + .appearance[data-v-f2779853] { + margin-top: 24px; +} +.menu + .social-links[data-v-f2779853] { + margin-top: 16px; +} +.appearance + .social-links[data-v-f2779853] { + margin-top: 16px; +} + +.VPNav[data-v-ae24b3ad] { + position: relative; + top: var(--vp-layout-top-height, 0px); + /*rtl:ignore*/ + left: 0; + z-index: var(--vp-z-index-nav); + width: 100%; + pointer-events: none; + transition: background-color 0.5s; +} +@media (min-width: 960px) { +.VPNav[data-v-ae24b3ad] { + position: fixed; +} +} + +.VPSidebarItem.level-0[data-v-b3fd67f8] { + padding-bottom: 24px; +} +.VPSidebarItem.collapsed.level-0[data-v-b3fd67f8] { + padding-bottom: 10px; +} +.item[data-v-b3fd67f8] { + position: relative; + display: flex; + width: 100%; +} +.VPSidebarItem.collapsible > .item[data-v-b3fd67f8] { + cursor: pointer; +} +.indicator[data-v-b3fd67f8] { + position: absolute; + top: 6px; + bottom: 6px; + left: -17px; + width: 2px; + border-radius: 2px; + transition: background-color 0.25s; +} +.VPSidebarItem.level-2.is-active > .item > .indicator[data-v-b3fd67f8], +.VPSidebarItem.level-3.is-active > .item > .indicator[data-v-b3fd67f8], +.VPSidebarItem.level-4.is-active > .item > .indicator[data-v-b3fd67f8], +.VPSidebarItem.level-5.is-active > .item > .indicator[data-v-b3fd67f8] { + background-color: var(--vp-c-brand-1); +} +.link[data-v-b3fd67f8] { + display: flex; + align-items: center; + flex-grow: 1; +} +.text[data-v-b3fd67f8] { + flex-grow: 1; + padding: 4px 0; + line-height: 24px; + font-size: 14px; + transition: color 0.25s; +} +.VPSidebarItem.level-0 .text[data-v-b3fd67f8] { + font-weight: 700; + color: var(--vp-c-text-1); +} +.VPSidebarItem.level-1 .text[data-v-b3fd67f8], +.VPSidebarItem.level-2 .text[data-v-b3fd67f8], +.VPSidebarItem.level-3 .text[data-v-b3fd67f8], +.VPSidebarItem.level-4 .text[data-v-b3fd67f8], +.VPSidebarItem.level-5 .text[data-v-b3fd67f8] { + font-weight: 500; + color: var(--vp-c-text-2); +} +.VPSidebarItem.level-0.is-link > .item > .link:hover .text[data-v-b3fd67f8], +.VPSidebarItem.level-1.is-link > .item > .link:hover .text[data-v-b3fd67f8], +.VPSidebarItem.level-2.is-link > .item > .link:hover .text[data-v-b3fd67f8], +.VPSidebarItem.level-3.is-link > .item > .link:hover .text[data-v-b3fd67f8], +.VPSidebarItem.level-4.is-link > .item > .link:hover .text[data-v-b3fd67f8], +.VPSidebarItem.level-5.is-link > .item > .link:hover .text[data-v-b3fd67f8] { + color: var(--vp-c-brand-1); +} +.VPSidebarItem.level-0.has-active > .item > .text[data-v-b3fd67f8], +.VPSidebarItem.level-1.has-active > .item > .text[data-v-b3fd67f8], +.VPSidebarItem.level-2.has-active > .item > .text[data-v-b3fd67f8], +.VPSidebarItem.level-3.has-active > .item > .text[data-v-b3fd67f8], +.VPSidebarItem.level-4.has-active > .item > .text[data-v-b3fd67f8], +.VPSidebarItem.level-5.has-active > .item > .text[data-v-b3fd67f8], +.VPSidebarItem.level-0.has-active > .item > .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-1.has-active > .item > .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-2.has-active > .item > .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-3.has-active > .item > .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-4.has-active > .item > .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-5.has-active > .item > .link > .text[data-v-b3fd67f8] { + color: var(--vp-c-text-1); +} +.VPSidebarItem.level-0.is-active > .item .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-1.is-active > .item .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-2.is-active > .item .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-3.is-active > .item .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-4.is-active > .item .link > .text[data-v-b3fd67f8], +.VPSidebarItem.level-5.is-active > .item .link > .text[data-v-b3fd67f8] { + color: var(--vp-c-brand-1); +} +.caret[data-v-b3fd67f8] { + display: flex; + justify-content: center; + align-items: center; + margin-right: -7px; + width: 32px; + height: 32px; + color: var(--vp-c-text-3); + cursor: pointer; + transition: color 0.25s; + flex-shrink: 0; +} +.item:hover .caret[data-v-b3fd67f8] { + color: var(--vp-c-text-2); +} +.item:hover .caret[data-v-b3fd67f8]:hover { + color: var(--vp-c-text-1); +} +.caret-icon[data-v-b3fd67f8] { + font-size: 18px; + /*rtl:ignore*/ + transform: rotate(90deg); + transition: transform 0.25s; +} +.VPSidebarItem.collapsed .caret-icon[data-v-b3fd67f8] { + transform: rotate(0)/*rtl:rotate(180deg)*/; +} +.VPSidebarItem.level-1 .items[data-v-b3fd67f8], +.VPSidebarItem.level-2 .items[data-v-b3fd67f8], +.VPSidebarItem.level-3 .items[data-v-b3fd67f8], +.VPSidebarItem.level-4 .items[data-v-b3fd67f8], +.VPSidebarItem.level-5 .items[data-v-b3fd67f8] { + border-left: 1px solid var(--vp-c-divider); + padding-left: 16px; +} +.VPSidebarItem.collapsed .items[data-v-b3fd67f8] { + display: none; +} + +.no-transition[data-v-c40bc020] .caret-icon { + transition: none; +} +.group + .group[data-v-c40bc020] { + border-top: 1px solid var(--vp-c-divider); + padding-top: 10px; +} +@media (min-width: 960px) { +.group[data-v-c40bc020] { + padding-top: 10px; + width: calc(var(--vp-sidebar-width) - 64px); +} +} + +.VPSidebar[data-v-319d5ca6] { + position: fixed; + top: var(--vp-layout-top-height, 0px); + bottom: 0; + left: 0; + z-index: var(--vp-z-index-sidebar); + padding: 32px 32px 96px; + width: calc(100vw - 64px); + max-width: 320px; + background-color: var(--vp-sidebar-bg-color); + opacity: 0; + box-shadow: var(--vp-c-shadow-3); + overflow-x: hidden; + overflow-y: auto; + transform: translateX(-100%); + transition: opacity 0.5s, transform 0.25s ease; + overscroll-behavior: contain; +} +.VPSidebar.open[data-v-319d5ca6] { + opacity: 1; + visibility: visible; + transform: translateX(0); + transition: opacity 0.25s, + transform 0.5s cubic-bezier(0.19, 1, 0.22, 1); +} +.dark .VPSidebar[data-v-319d5ca6] { + box-shadow: var(--vp-shadow-1); +} +@media (min-width: 960px) { +.VPSidebar[data-v-319d5ca6] { + padding-top: var(--vp-nav-height); + width: var(--vp-sidebar-width); + max-width: 100%; + background-color: var(--vp-sidebar-bg-color); + opacity: 1; + visibility: visible; + box-shadow: none; + transform: translateX(0); +} +} +@media (min-width: 1440px) { +.VPSidebar[data-v-319d5ca6] { + padding-left: max(32px, calc((100% - (var(--vp-layout-max-width) - 64px)) / 2)); + width: calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px); +} +} +@media (min-width: 960px) { +.curtain[data-v-319d5ca6] { + position: sticky; + top: -64px; + left: 0; + z-index: 1; + margin-top: calc(var(--vp-nav-height) * -1); + margin-right: -32px; + margin-left: -32px; + height: var(--vp-nav-height); + background-color: var(--vp-sidebar-bg-color); +} +} +.nav[data-v-319d5ca6] { + outline: 0; +} + +.VPSkipLink[data-v-0b0ada53] { + top: 8px; + left: 8px; + padding: 8px 16px; + z-index: 999; + border-radius: 8px; + font-size: 12px; + font-weight: bold; + text-decoration: none; + color: var(--vp-c-brand-1); + box-shadow: var(--vp-shadow-3); + background-color: var(--vp-c-bg); +} +.VPSkipLink[data-v-0b0ada53]:focus { + height: auto; + width: auto; + clip: auto; + clip-path: none; +} +@media (min-width: 1280px) { +.VPSkipLink[data-v-0b0ada53] { + top: 14px; + left: 16px; +} +} + +.Layout[data-v-5d98c3a5] { + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.VPHomeSponsors[data-v-3d121b4a] { + border-top: 1px solid var(--vp-c-gutter); + padding-top: 88px !important; +} +.VPHomeSponsors[data-v-3d121b4a] { + margin: 96px 0; +} +@media (min-width: 768px) { +.VPHomeSponsors[data-v-3d121b4a] { + margin: 128px 0; +} +} +.VPHomeSponsors[data-v-3d121b4a] { + padding: 0 24px; +} +@media (min-width: 768px) { +.VPHomeSponsors[data-v-3d121b4a] { + padding: 0 48px; +} +} +@media (min-width: 960px) { +.VPHomeSponsors[data-v-3d121b4a] { + padding: 0 64px; +} +} +.container[data-v-3d121b4a] { + margin: 0 auto; + max-width: 1152px; +} +.love[data-v-3d121b4a] { + margin: 0 auto; + width: fit-content; + font-size: 28px; + color: var(--vp-c-text-3); +} +.icon[data-v-3d121b4a] { + display: inline-block; +} +.message[data-v-3d121b4a] { + margin: 0 auto; + padding-top: 10px; + max-width: 320px; + text-align: center; + line-height: 24px; + font-size: 16px; + font-weight: 500; + color: var(--vp-c-text-2); +} +.sponsors[data-v-3d121b4a] { + padding-top: 32px; +} +.action[data-v-3d121b4a] { + padding-top: 40px; + text-align: center; +} + +.VPTeamMembersItem[data-v-f3fa364a] { + display: flex; + flex-direction: column; + gap: 2px; + border-radius: 12px; + width: 100%; + height: 100%; + overflow: hidden; +} +.VPTeamMembersItem.small .profile[data-v-f3fa364a] { + padding: 32px; +} +.VPTeamMembersItem.small .data[data-v-f3fa364a] { + padding-top: 20px; +} +.VPTeamMembersItem.small .avatar[data-v-f3fa364a] { + width: 64px; + height: 64px; +} +.VPTeamMembersItem.small .name[data-v-f3fa364a] { + line-height: 24px; + font-size: 16px; +} +.VPTeamMembersItem.small .affiliation[data-v-f3fa364a] { + padding-top: 4px; + line-height: 20px; + font-size: 14px; +} +.VPTeamMembersItem.small .desc[data-v-f3fa364a] { + padding-top: 12px; + line-height: 20px; + font-size: 14px; +} +.VPTeamMembersItem.small .links[data-v-f3fa364a] { + margin: 0 -16px -20px; + padding: 10px 0 0; +} +.VPTeamMembersItem.medium .profile[data-v-f3fa364a] { + padding: 48px 32px; +} +.VPTeamMembersItem.medium .data[data-v-f3fa364a] { + padding-top: 24px; + text-align: center; +} +.VPTeamMembersItem.medium .avatar[data-v-f3fa364a] { + width: 96px; + height: 96px; +} +.VPTeamMembersItem.medium .name[data-v-f3fa364a] { + letter-spacing: 0.15px; + line-height: 28px; + font-size: 20px; +} +.VPTeamMembersItem.medium .affiliation[data-v-f3fa364a] { + padding-top: 4px; + font-size: 16px; +} +.VPTeamMembersItem.medium .desc[data-v-f3fa364a] { + padding-top: 16px; + max-width: 288px; + font-size: 16px; +} +.VPTeamMembersItem.medium .links[data-v-f3fa364a] { + margin: 0 -16px -12px; + padding: 16px 12px 0; +} +.profile[data-v-f3fa364a] { + flex-grow: 1; + background-color: var(--vp-c-bg-soft); +} +.data[data-v-f3fa364a] { + text-align: center; +} +.avatar[data-v-f3fa364a] { + position: relative; + flex-shrink: 0; + margin: 0 auto; + border-radius: 50%; + box-shadow: var(--vp-shadow-3); +} +.avatar-img[data-v-f3fa364a] { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: 50%; + object-fit: cover; +} +.name[data-v-f3fa364a] { + margin: 0; + font-weight: 600; +} +.affiliation[data-v-f3fa364a] { + margin: 0; + font-weight: 500; + color: var(--vp-c-text-2); +} +.org.link[data-v-f3fa364a] { + color: var(--vp-c-text-2); + transition: color 0.25s; +} +.org.link[data-v-f3fa364a]:hover { + color: var(--vp-c-brand-1); +} +.desc[data-v-f3fa364a] { + margin: 0 auto; +} +.desc[data-v-f3fa364a] a { + font-weight: 500; + color: var(--vp-c-brand-1); + text-decoration-style: dotted; + transition: color 0.25s; +} +.links[data-v-f3fa364a] { + display: flex; + justify-content: center; + height: 56px; +} +.sp-link[data-v-f3fa364a] { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + padding: 16px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-sponsor); + background-color: var(--vp-c-bg-soft); + transition: color 0.25s, background-color 0.25s; +} +.sp .sp-link.link[data-v-f3fa364a]:hover, +.sp .sp-link.link[data-v-f3fa364a]:focus { + outline: none; + color: var(--vp-c-white); + background-color: var(--vp-c-sponsor); +} +.sp-icon[data-v-f3fa364a] { + margin-right: 8px; + font-size: 16px; +} + +.VPTeamMembers.small .container[data-v-6cb0dbc4] { + grid-template-columns: repeat(auto-fit, minmax(224px, 1fr)); +} +.VPTeamMembers.small.count-1 .container[data-v-6cb0dbc4] { + max-width: 276px; +} +.VPTeamMembers.small.count-2 .container[data-v-6cb0dbc4] { + max-width: calc(276px * 2 + 24px); +} +.VPTeamMembers.small.count-3 .container[data-v-6cb0dbc4] { + max-width: calc(276px * 3 + 24px * 2); +} +.VPTeamMembers.medium .container[data-v-6cb0dbc4] { + grid-template-columns: repeat(auto-fit, minmax(256px, 1fr)); +} +@media (min-width: 375px) { +.VPTeamMembers.medium .container[data-v-6cb0dbc4] { + grid-template-columns: repeat(auto-fit, minmax(288px, 1fr)); +} +} +.VPTeamMembers.medium.count-1 .container[data-v-6cb0dbc4] { + max-width: 368px; +} +.VPTeamMembers.medium.count-2 .container[data-v-6cb0dbc4] { + max-width: calc(368px * 2 + 24px); +} +.container[data-v-6cb0dbc4] { + display: grid; + gap: 24px; + margin: 0 auto; + max-width: 1152px; +} + +.VPTeamPage[data-v-7c57f839] { + margin: 96px 0; +} +@media (min-width: 768px) { +.VPTeamPage[data-v-7c57f839] { + margin: 128px 0; +} +} +.VPHome .VPTeamPageTitle[data-v-7c57f839-s] { + border-top: 1px solid var(--vp-c-gutter); + padding-top: 88px !important; +} +.VPTeamPageSection + .VPTeamPageSection[data-v-7c57f839-s],.VPTeamMembers + .VPTeamPageSection[data-v-7c57f839-s] { + margin-top: 64px; +} +.VPTeamMembers + .VPTeamMembers[data-v-7c57f839-s] { + margin-top: 24px; +} +@media (min-width: 768px) { +.VPTeamPageTitle + .VPTeamPageSection[data-v-7c57f839-s] { + margin-top: 16px; +} +.VPTeamPageSection + .VPTeamPageSection[data-v-7c57f839-s],.VPTeamMembers + .VPTeamPageSection[data-v-7c57f839-s] { + margin-top: 96px; +} +} +.VPTeamMembers[data-v-7c57f839-s] { + padding: 0 24px; +} +@media (min-width: 768px) { +.VPTeamMembers[data-v-7c57f839-s] { + padding: 0 48px; +} +} +@media (min-width: 960px) { +.VPTeamMembers[data-v-7c57f839-s] { + padding: 0 64px; +} +} + +.VPTeamPageSection[data-v-b1a88750] { + padding: 0 32px; +} +@media (min-width: 768px) { +.VPTeamPageSection[data-v-b1a88750] { + padding: 0 48px; +} +} +@media (min-width: 960px) { +.VPTeamPageSection[data-v-b1a88750] { + padding: 0 64px; +} +} +.title[data-v-b1a88750] { + position: relative; + margin: 0 auto; + max-width: 1152px; + text-align: center; + color: var(--vp-c-text-2); +} +.title-line[data-v-b1a88750] { + position: absolute; + top: 16px; + left: 0; + width: 100%; + height: 1px; + background-color: var(--vp-c-divider); +} +.title-text[data-v-b1a88750] { + position: relative; + display: inline-block; + padding: 0 24px; + letter-spacing: 0; + line-height: 32px; + font-size: 20px; + font-weight: 500; + background-color: var(--vp-c-bg); +} +.lead[data-v-b1a88750] { + margin: 0 auto; + max-width: 480px; + padding-top: 12px; + text-align: center; + line-height: 24px; + font-size: 16px; + font-weight: 500; + color: var(--vp-c-text-2); +} +.members[data-v-b1a88750] { + padding-top: 40px; +} + +.VPTeamPageTitle[data-v-bf2cbdac] { + padding: 48px 32px; + text-align: center; +} +@media (min-width: 768px) { +.VPTeamPageTitle[data-v-bf2cbdac] { + padding: 64px 48px 48px; +} +} +@media (min-width: 960px) { +.VPTeamPageTitle[data-v-bf2cbdac] { + padding: 80px 64px 48px; +} +} +.title[data-v-bf2cbdac] { + letter-spacing: 0; + line-height: 44px; + font-size: 36px; + font-weight: 500; +} +@media (min-width: 768px) { +.title[data-v-bf2cbdac] { + letter-spacing: -0.5px; + line-height: 56px; + font-size: 48px; +} +} +.lead[data-v-bf2cbdac] { + margin: 0 auto; + max-width: 512px; + padding-top: 12px; + line-height: 24px; + font-size: 16px; + font-weight: 500; + color: var(--vp-c-text-2); +} +@media (min-width: 768px) { +.lead[data-v-bf2cbdac] { + max-width: 592px; + letter-spacing: 0.15px; + line-height: 28px; + font-size: 20px; +} +} +:root { + --vp-c-brand-1: #7054bd; + --vp-c-brand-2: #8065ca; + --vp-c-brand-3: #7054bd; +} + +.dark { + --vp-c-brand-1: #b7a0f3; + --vp-c-brand-2: #a68ce7; + --vp-c-brand-3: #7054bd; +} + +.vp-doc img { + border-radius: 8px; +} diff --git a/docs-site/.vitepress/.temp/docs_path-rules.md.js b/docs-site/.vitepress/.temp/docs_path-rules.md.js new file mode 100644 index 0000000..1d5bae1 --- /dev/null +++ b/docs-site/.vitepress/.temp/docs_path-rules.md.js @@ -0,0 +1,20 @@ +import { ssrRenderAttrs, ssrRenderAttr } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const _imports_0 = "/Read-Only-View/assets/Read-Only-View-path-rules-1200x800.BCpXUl9n.png"; +const __pageData = JSON.parse('{"title":"Path Rules for Read Only View","description":"Learn how Include and Exclude rules, folder prefixes, exact imported notes, glob patterns, and matching precedence work in Read Only View.","frontmatter":{"title":"Path Rules for Read Only View","description":"Learn how Include and Exclude rules, folder prefixes, exact imported notes, glob patterns, and matching precedence work in Read Only View."},"headers":[],"relativePath":"docs/path-rules.md","filePath":"docs/path-rules.md"}'); +const _sfc_main = { name: "docs/path-rules.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    Path rules ​

    Path rules select which Markdown notes stay in Reading view. Open Settings → Read Only View to add, disable, or remove a rule.

    Modes and precedence ​

    With Enabled on, the plugin evaluates a Markdown note in this order:

    1. An enabled Exclude match leaves it editable.
    2. Otherwise, All Markdown files protects it.
    3. Otherwise, Only matched paths requires an enabled Include match to protect it.

    New installations start in All Markdown files mode. Include rules are retained but inactive in that mode. In Only matched paths, an empty rule list protects nothing. Changing or deleting rules does not switch modes.

    Each row has an Enabled checkbox, an Include or Exclude type, a Value field, and a Delete button. Disable a row to keep it for later without applying it. Disabled and unresolved rules do not participate in matching or active-rule counts.

    Ordinary vault paths ​

    By default, Use glob patterns is off and Case sensitive is on. Ordinary rules use literal path-prefix matching.

    ValueUse
    Reference/Notes in Reference and all its subfolders
    Archive/Notes in Archive and all its subfolders
    Notes/Summaries/Notes under this nested folder
    Reference/Handbook.mdA prefix beginning with this note path

    Keep the trailing / for folder rules. In prefix mode, a plain name without .md or wildcards is treated as a folder prefix after source resolution. When entering an existing vault path without an extension, the source resolver first checks for a matching Markdown note; an existing folder is normalized with a trailing slash. Use / explicitly if a note and folder share a name and you intend to select the folder.

    A .md vault path remains a prefix rule, not an exact equality check. To target exactly one existing note regardless of prefix or glob mode, import its Obsidian URL or desktop system file path.

    Editable exceptions ​

    With Only matched paths, these rules protect reference notes but allow drafts:

    TypeValue
    IncludeReference/
    ExcludeReference/Drafts/

    With All Markdown files, an Exclude for Inbox/ leaves that folder editable and protects other Markdown notes. An include rule cannot override an exclude.

    Can I use wildcards in Obsidian read-only path rules? ​

    Yes. Turn on Advanced → Matching → Use glob patterns to enable the plugin's glob matcher for ordinary paths. Patterns match the entire vault-relative path.

    PatternMeaning
    **All paths, including vault-root notes; protection still applies only to Markdown
    Reference/*.mdMarkdown notes directly inside Reference
    Reference/**Notes anywhere under Reference
    Reference/**/Summary.mdSummary.md directly inside Reference or deeper below it
    Notes/Summary?.mdOne non-slash character after Summary, such as Summary1.md

    * matches zero or more characters except /; ** can cross folder separators; ? matches one character except /. The /**/ form can cover zero or more nested folders. A leading **/README.md requires a slash, so use README.md separately if you also want the vault-root note.

    There is no regular-expression, brace-alternative, or character-class syntax. With glob matching off, * and ? are literal characters. Switching matching modes affects ordinary saved path rules, so replace a prefix such as Reference/ with Reference/** when enabling globs.

    To protect the whole vault using **, follow Keep all Obsidian notes in Reading view.

    Can I make note-path matching case-sensitive? ​

    Yes. Open Settings → Read Only View → Advanced → Matching and turn Case sensitive on. It is enabled by default. Turn it off to ignore uppercase/lowercase differences when matching paths. This is a shared setting for include and exclude rules, not a per-rule option.

    With Only matched paths, glob matching off, and an enabled Include Reference/:

    Note pathCase sensitive onCase sensitive off
    Reference/Handbook.mdRead-onlyRead-only
    reference/Handbook.mdEditableRead-only

    This example assumes no other rules match. The setting applies to prefix and glob matching, as well as comparisons against resolved exact-file rules. It does not rename files or make an invalid Obsidian URL or system path resolve: imported sources must still identify an existing item in the current vault. Verify the actual note path with Path tester.

    Can I temporarily disable a path rule without deleting it? ​

    Yes. Uncheck Enabled on the rule's row under Path rules. The plugin keeps its value and type, so you can re-enable it later without entering the path again.

    To edit a note protected by its own include rule:

    1. In Only matched paths, find the note's Include row.
    2. Uncheck that row's Enabled checkbox, leaving the global Enabled toggle on.
    3. Wait for Saved. and test the note. If it is Editable, switch it into editing and make your changes.
    4. Check the row's Enabled checkbox again and wait for Saved. to restore that rule.

    If another include, such as Reference/ or **, also matches, disabling only the note rule will not make the note editable. Add an Exclude for the note instead. Keep that exclude row saved: enable it when editing and disable it when you want protection back. Disabling a folder include affects every note it was protecting.

    In All Markdown files, include rows are already inactive. Use an exclude for a particular note, or use Disable read-only mode and Enable read-only mode to pause and restore protection globally. Neither approach needs you to delete saved paths, and protection does not resume on a timer.

    Can I use an Obsidian URL, system path, or vault path in a rule? ​

    Yes. Add an enabled Include under Path rules in Only matched paths, then paste any of the following sources into Value. The field detects the source format. The same source formats also work for Exclude rules:

    SourceExampleBehavior
    Vault pathReference/Handbook.mdUses the configured prefix or glob matching
    Obsidian URLobsidian://open?vault=MyVault&file=Reference%2FHandbookResolves one exact existing Markdown note in the current vault
    Desktop system path/Users/name/MyVault/Reference/Handbook.mdImports one exact existing Markdown note inside the current vault
    Desktop system folder/Users/name/MyVault/Reference/Imports a folder using ordinary folder matching

    Obsidian URLs may omit .md. Heading and block locators do not change which note is selected. A URL must name the current vault. Absolute system-path imports are available only on desktop, but the saved vault-relative path remains portable to mobile. The full system path is not persisted after successful import.

    If a source cannot be resolved, its value remains visible with an explanation, but it does not match anything. Imported sources require existing targets and do not automatically follow later renames.

    Verify the result ​

    Wait for Saved., then paste a specific Markdown note path into Path tester. If the result is unexpected, check the selected mode, exclude matches, enabled rows, case sensitivity, and matching mode.

    For very large configurations, settings show warnings and ignore rules beyond the limits: at most 200 includes, 300 excludes, and 400 total. Include rules are counted first; exclude rules at the end are trimmed if the total exceeds 400. Prefer a few folder rules where possible and review any limit warnings.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("docs/path-rules.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const pathRules = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + pathRules as default +}; diff --git a/docs-site/.vitepress/.temp/docs_path-tester.md.js b/docs-site/.vitepress/.temp/docs_path-tester.md.js new file mode 100644 index 0000000..0e5d66e --- /dev/null +++ b/docs-site/.vitepress/.temp/docs_path-tester.md.js @@ -0,0 +1,20 @@ +import { ssrRenderAttrs, ssrRenderAttr } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const _imports_0 = "/Read-Only-View/assets/Read-Only-View-path-tester-read-only-1200x800.FabEG4bU.png"; +const __pageData = JSON.parse('{"title":"How to Check Whether an Obsidian Note Will Be Read-Only","description":"Diagnose whether an Obsidian note is Read-only or Editable using source resolution, matching Include and Exclude rules, and the all-Markdown preset.","frontmatter":{"title":"How to Check Whether an Obsidian Note Will Be Read-Only","description":"Diagnose whether an Obsidian note is Read-only or Editable using source resolution, matching Include and Exclude rules, and the all-Markdown preset."},"headers":[],"relativePath":"docs/path-tester.md","filePath":"docs/path-tester.md"}'); +const _sfc_main = { name: "docs/path-tester.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    How to Check Whether an Obsidian Note Will Be Read-Only ​

    Path tester is built into Settings → Read Only View. Use it to understand why a specific note is protected or remains editable; this website does not run the tester or access your vault.

    Can I test a note path before opening the note? ​

    Yes. Path tester evaluates the current configuration for the supplied path without requiring you to open the note. Obsidian URLs and system paths must resolve to existing items; enter a specific Markdown note to get a read-only result.

    1. Configure your Path rules and wait for Saved.
    2. Find Path tester in the plugin settings.
    3. Paste a vault-relative note path such as Reference/Handbook.md, an Obsidian URL, or a desktop system path.
    4. Review the detected source type and resolved vault path.
    5. Check the matching include and exclude rules, the all-Markdown preset explanation, and the final Read-only or Editable status.

    Interpret a result ​

    With Enabled on, Only matched paths selected, glob matching off, an Include for Reference/, and an Exclude for Reference/Drafts/:

    Tested pathExpected resultReason
    Reference/Handbook.mdRead-onlyInclude matches; no exclude matches
    Reference/Drafts/Handbook.mdEditableExclude wins
    Inbox/Capture.mdEditableNo include matches

    In All Markdown files, a note can be read-only without any include matches. The preset determines the result unless an exclude matches. Turning Enabled off disables protection.

    Resolve input problems ​

    • Wrong vault or missing note: an Obsidian URL must resolve to an existing Markdown note in the current vault.
    • System path on mobile: import new absolute paths on desktop, or enter the portable vault-relative path instead.
    • Folder instead of a note: for a system folder, the tester shows the resolved folder and asks for a specific Markdown note before evaluating matches.
    • Unexpected Editable status: check excludes, the row's Enabled checkbox, letter case, and whether glob matching is on.
    • Unexpected Read-only status: check whether All Markdown files is selected.

    The result explains the current configuration; it is not a filesystem-permission check or a guarantee for every embedded view. If open notes do not reflect saved changes, run Re-apply rules now from the Command Palette and reopen the note if necessary.

    For a step-by-step diagnosis of unexpected results, see Troubleshooting read-only notes.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("docs/path-tester.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const pathTester = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + pathTester as default +}; diff --git a/docs-site/.vitepress/.temp/docs_troubleshooting.md.js b/docs-site/.vitepress/.temp/docs_troubleshooting.md.js new file mode 100644 index 0000000..e3db80d --- /dev/null +++ b/docs-site/.vitepress/.temp/docs_troubleshooting.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"Why Is My Obsidian Note Read-Only or Still Editable?","description":"Troubleshoot Read Only View rules when a note stays editable, remains read-only after disabling an Include, or does not reflect saved settings.","frontmatter":{"title":"Why Is My Obsidian Note Read-Only or Still Editable?","description":"Troubleshoot Read Only View rules when a note stays editable, remains read-only after disabling an Include, or does not reflect saved settings."},"headers":[],"relativePath":"docs/troubleshooting.md","filePath":"docs/troubleshooting.md"}'); +const _sfc_main = { name: "docs/troubleshooting.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    Why Is My Obsidian Note Read-Only or Still Editable? ​

    Start with Path tester in Settings → Read Only View. Enter the specific Markdown note path and check its resolved path, matching rules, and final Read-only or Editable status. This separates a rule-configuration problem from a view that has not reflected the configuration yet.

    Why is my note still editable after I added an Include? ​

    An include protects a Markdown note only while the plugin is enabled and no enabled exclude matches. Check these points in order:

    1. Confirm the global Enabled toggle is on and the file is a Markdown note.
    2. Look for an Exclude match in Path tester. Excludes always win; adding another include cannot override one.
    3. In Only matched paths, confirm the Include row is enabled and its source resolves without an inline error.
    4. Check Advanced → Matching. Use Reference/ for a folder with glob matching off, or Reference/** with glob matching on. With globs off, * and ? are literal characters.
    5. Check spelling and capitalization. Case sensitive is on by default. Imported URLs and system paths must still resolve to existing items in the current vault.
    6. If the note was moved or renamed, update the saved path. Imported rules do not automatically follow renames.

    For example, Include Reference/ and Exclude Reference/Drafts/ leave Reference/Drafts/Plan.md editable. Disable or narrow that exclude if you want the note protected.

    If settings show a rule-limit warning, review which rules were ignored. See Path rules for the limits.

    Why is my note read-only when I want to edit it? ​

    Check Mode first. New installations use All Markdown files, which protects Markdown notes even without include rules. Choose Only matched paths for selected-path protection, or add an enabled exclude for an exception.

    In Only matched paths, check every matching include in Path tester. A broad include such as Reference/ in prefix mode, or ** in glob mode, may protect the note alongside its individual rule.

    For example, a vault in All Markdown files mode needs an Exclude for Daily Notes/ to leave that folder editable with glob matching off. With glob matching on, use Daily Notes/**. See the daily notes example.

    Why does disabling an Include not let me edit the note? ​

    Either All Markdown files is active or another enabled include still matches. Disabling one rule does not override those other sources of protection.

    For a temporary exception, keep an Exclude row for the note: enable the exclude while editing, then disable it to restore protection. Its path stays saved. To pause enforcement for every note, run Disable read-only mode and later Enable read-only mode. See temporarily disabling rules.

    Why does Path tester disagree with the open note? ​

    Confirm you tested the actual note path and waited for Saved. after editing rules. If settings report Save failed., the changes have not saved successfully.

    Run Re-apply rules now from the Command Palette, then reopen the note if necessary. An Editable result means Read Only View is not enforcing protection; you may still need to switch the note from Reading view to editing yourself.

    If Path tester reports Read-only but editing remains possible in a hover, embedded, or nonstandard view, that context may depend on Obsidian internals. Protection is not guaranteed in every such view, and it does not prevent another plugin or application from modifying files.

    If the problem continues, report an issue with your Obsidian and plugin versions, platform, mode, matching settings, and a minimal rule example. Use anonymized paths and describe whether it occurs in a normal note tab or a preview. See Path tester for the available diagnostics.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("docs/troubleshooting.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const troubleshooting = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + troubleshooting as default +}; diff --git a/docs-site/.vitepress/.temp/faq.md.js b/docs-site/.vitepress/.temp/faq.md.js new file mode 100644 index 0000000..2287925 --- /dev/null +++ b/docs-site/.vitepress/.temp/faq.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"Read Only View FAQ","description":"Answers about read-only Obsidian notes and folders, temporary editing, mobile support, Markdown files, local matching, and file-permission limitations.","frontmatter":{"title":"Read Only View FAQ","description":"Answers about read-only Obsidian notes and folders, temporary editing, mobile support, Markdown files, local matching, and file-permission limitations."},"headers":[],"relativePath":"faq.md","filePath":"faq.md"}'); +const _sfc_main = { name: "faq.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    Frequently asked questions ​

    Can I make an Obsidian note read-only? ​

    You can keep it in Reading view with Read Only View. Choose Only matched paths and add an enabled Include for the note. The plugin enforces view behavior and blocks input in supported Markdown editors; it does not make the underlying file immutable. Follow the single-note guide.

    Can I make an entire folder read-only? ​

    Yes, for Markdown note views. With glob matching off, include a folder such as Reference/ to cover its notes and subfolders. Add Exclude rules for editable exceptions. Attachments are unaffected. See the folder guide.

    Does Read Only View change filesystem permissions? ​

    No. It changes Obsidian view behavior only. It is not an operating-system lock, security boundary, or access-control system.

    Can another application still edit the Markdown file? ​

    Yes. Other applications, external tools, and plugins can still change files. Read Only View is intended to prevent accidental editing while reading in Obsidian.

    Can I temporarily edit a matched note? ​

    Yes. Run Disable read-only mode in the Command Palette, switch to editing, then run Enable read-only mode when finished. This pauses protection globally and does not resume automatically.

    To exempt only a particular note or folder, add an enabled Exclude rule and remove or disable it later. In Only matched paths, disabling an include row also stops that rule from protecting notes, provided no other include matches. In All Markdown files, disabling an include has no effect.

    Does it work on mobile? ​

    Yes. The plugin supports desktop and mobile and requires Obsidian 1.10.3 or newer. Narrow settings panes use a stacked layout. New absolute system paths can only be imported on desktop; their saved vault-relative paths remain portable to mobile. See the mobile guide.

    Are network requests required? ​

    The plugin makes no network requests during normal operation. Rule matching stays local. Downloading the plugin or its updates is separate from that operation.

    Does it modify my Markdown files? ​

    The plugin does not rewrite Markdown content to enforce read-only behavior. It controls note views and editor input and saves its own configuration as plugin data. It does not add frontmatter or permission markers to notes.

    Why are all my notes in Reading view? ​

    New installations default to All Markdown files mode with Enabled on. Switch to Only matched paths to protect only selected paths, or add excludes for working notes and folders.

    Why does a matching note remain editable? ​

    Check that Enabled is on, the note is Markdown, and an enabled exclude does not match. In Only matched paths, an enabled include must match. Check case sensitivity and glob settings with Path tester.

    Some hover, embedded, or nonstandard editor contexts depend on Obsidian internals. Protection is not guaranteed in every such context.

    Will a rule follow a renamed note? ​

    Imported rules do not automatically follow later renames. Review the saved path after moving or renaming a note or folder and verify the new note path in Path tester.

    How do I switch all Obsidian notes to Reading view? ​

    Select All Markdown files with Enabled on. Alternatively, select Only matched paths, enable Use glob patterns, and add an enabled Include **. Enabled excludes still win. Follow the whole-vault guide.

    Can I protect a folder but keep one note editable? ​

    Yes. With glob matching off, include Reference/ and exclude Reference/Working notes.md. For an exact-file exception in either matching mode, use the note's Obsidian URL. See the folder and single-note exception example.

    Can I use an Obsidian URL or system path instead of a vault path? ​

    Yes. The rule's Value field accepts all three. URLs must resolve to an existing Markdown note in the current vault; system-path imports are desktop-only and must point inside that vault. Successful system-path imports save portable vault-relative paths. See source formats and examples.

    Can I disable a rule temporarily without retyping the path later? ​

    Yes. Uncheck the rule row's Enabled checkbox, then recheck it when needed. Its path and type stay saved. Other includes or All Markdown files may still protect the note; a saved exclude can provide a temporary exception in either mode. See temporarily disabling rules.

    Can I check whether a note will be read-only by entering its path? ​

    Yes. Paste a specific note path into Path tester in the plugin settings. It shows source resolution, matching rules, and the final Read-only or Editable status. See how to test a note path.

    Can I use wildcards such as *, **, and ? in path rules? ​

    Yes, after enabling Advanced → Matching → Use glob patterns. Use * within one path segment, ** across folders, and ? for one non-slash character. With glob matching off, these characters are literal. See wildcard examples.

    Can I turn case-sensitive path matching on or off? ​

    Yes. Use Advanced → Matching → Case sensitive. It is on by default; turn it off to ignore case when matching include and exclude paths. See case-sensitive matching examples.

    Can I keep daily notes editable while protecting the rest of my vault? ​

    Yes. In All Markdown files, exclude your daily-notes folder: Daily Notes/ with glob matching off, or Daily Notes/** with it on. Use your actual folder path; the plugin does not identify daily notes automatically. See the daily notes and Inbox example.

    Can I protect notes in a folder without protecting its subfolders? ​

    Yes. Select Only matched paths, enable Use glob patterns, and include Reference/*.md. Remove or disable broader includes if they also protect the subfolders. See the direct notes versus subfolders example.

    How do I troubleshoot a note that is protected or editable unexpectedly? ​

    Start with Path tester, then check the global Enabled toggle, selected mode, matching excludes, and enabled includes. Follow Troubleshooting for each result, including what to do when disabling an include does not remove protection.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("faq.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const faq = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + faq as default +}; diff --git a/docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js b/docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js new file mode 100644 index 0000000..d3a00fc --- /dev/null +++ b/docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"How to Keep All Obsidian Notes in Reading View","description":"Make all Markdown notes in an Obsidian vault read-only using All Markdown files mode or an Include rule with **, while keeping editable exceptions.","frontmatter":{"title":"How to Keep All Obsidian Notes in Reading View","description":"Make all Markdown notes in an Obsidian vault read-only using All Markdown files mode or an Include rule with **, while keeping editable exceptions."},"headers":[],"relativePath":"guides/make-all-notes-read-only.md","filePath":"guides/make-all-notes-read-only.md"}'); +const _sfc_main = { name: "guides/make-all-notes-read-only.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    How to Keep All Obsidian Notes in Reading View ​

    To keep every Markdown note in your Obsidian vault in Reading view, enable Read Only View and select All Markdown files. You can also use an Include rule with ** when glob matching is enabled.

    Both options help prevent accidental edits in Obsidian. They do not change filesystem permissions or protect attachments and changes made by other applications.

    How do I make my entire Obsidian vault read-only? ​

    1. Open Settings → Community plugins → Browse, search for Read Only View, then Install and Enable it.
    2. Open Settings → Read Only View and keep Enabled on.
    3. Select All Markdown files. This is the default for new installations.
    4. Review existing Exclude rules: any enabled matching exclude leaves the note editable.
    5. Open a Markdown note, or run Re-apply rules now to apply the configuration across open Markdown notes.

    No include rules are required. Saved include rules remain available but inactive in this mode. Use glob patterns does not need to be enabled for the all-Markdown preset; it still controls how ordinary exclude rules match.

    Can I match all notes with an Include rule and **? ​

    Yes. The ** glob matches paths at every depth, including notes directly in the vault root.

    1. Select Only matched paths and keep the global Enabled toggle on.
    2. Under Advanced → Matching, turn on Use glob patterns.
    3. Under Path rules, add an enabled Include with Value set to **.
    4. Wait for Saved. and check a note with Path tester.
    Tested pathResult with Include ** and no matching exclude
    Home.mdRead-only
    Reference/Handbook.mdRead-only
    Archive/2025/Meeting.mdRead-only

    Only Markdown notes are protected even though ** can match other path strings. With Use glob patterns off, ** is literal text and does not select all notes. A single * cannot cross folder separators.

    Review existing rules when enabling globs

    Glob matching is a shared setting for ordinary path rules. Change folder prefixes such as Reference/ to Reference/** when switching to glob mode. Exact imported note rules keep their exact-file behavior.

    How do I keep some notes editable in a read-only vault? ​

    Add enabled Exclude rules. Excludes take precedence in both approaches.

    Matching modeExclude valueEditable exception
    Glob matching offInbox/Markdown notes in Inbox and its subfolders
    Glob matching onInbox/**Markdown notes in Inbox and its subfolders
    Either modeReference/Working notes.mdThe named note; ordinary paths remain prefixes when globs are off

    For an exact-file exception regardless of matching mode, paste the existing note's Obsidian URL into an Exclude row. See supported path sources.

    How do I make my vault read-only except for daily notes? ​

    Use All Markdown files with an enabled Exclude for the folder where you keep daily notes. For example, protect reference material while keeping your journal and quick captures editable:

    1. Open Settings → Read Only View, keep Enabled on, and select All Markdown files.
    2. With Use glob patterns off, add these enabled Exclude rows under Path rules:
    TypeValue
    ExcludeDaily Notes/
    ExcludeInbox/
    1. Replace the example folder names with the actual vault-relative paths you use. Read Only View matches paths; it does not detect daily notes by date or automatically read another plugin's folder setting.
    2. Wait for Saved. and check representative notes with Path tester.
    Tested pathExpected result with only the rules above
    Daily Notes/2026-09-18.mdEditable
    Daily Notes/2026/09/18.mdEditable
    Inbox/Quick capture.mdEditable
    Reference/Handbook.mdRead-only
    Home.mdRead-only

    New Markdown notes created under the excluded folders also match those folder rules. A daily note saved elsewhere does not get an exception just because it is a daily note.

    If Use glob patterns is already on, use Daily Notes/** and Inbox/** instead. These excludes also work with Only matched paths and Include **. Review existing rules before changing the shared matching mode.

    Can I temporarily allow editing without deleting my rules? ​

    Run Disable read-only mode, switch into editing, then run Enable read-only mode when finished. This pauses protection globally and does not resume automatically.

    If you use the ** include in Only matched paths, you can instead uncheck that row's Enabled checkbox and recheck it later. Other enabled includes may still protect some notes. Disabling an include does not pause All Markdown files mode. See temporarily disabling path rules.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/make-all-notes-read-only.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const makeAllNotesReadOnly = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + makeAllNotesReadOnly as default +}; diff --git a/docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js b/docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js new file mode 100644 index 0000000..fe6f182 --- /dev/null +++ b/docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"How to Make a Folder Read-Only in Obsidian","description":"Keep Markdown notes in a reference or archive folder in Reading view, with include rules for folders and exclude rules for one editable note or a drafts subfolder.","frontmatter":{"title":"How to Make a Folder Read-Only in Obsidian","description":"Keep Markdown notes in a reference or archive folder in Reading view, with include rules for folders and exclude rules for one editable note or a drafts subfolder."},"headers":[],"relativePath":"guides/make-folder-read-only.md","filePath":"guides/make-folder-read-only.md"}'); +const _sfc_main = { name: "guides/make-folder-read-only.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    How to Make a Folder Read-Only in Obsidian ​

    Add a folder path such as Reference/ as an Include rule in Read Only View. With ordinary path matching, Markdown notes inside that folder and its subfolders stay in Reading view.

    Protect a reference or archive folder ​

    1. Install and enable Read Only View.
    2. Open Settings → Read Only View. Keep Enabled on and select Only matched paths.
    3. Under Advanced → Matching, keep Use glob patterns off.
    4. Under Path rules, add an enabled Include row with Value set to Reference/.
    5. Wait for Saved. and open a Markdown note inside that folder.

    Use a vault-relative path, not the vault's name. Keep the trailing / to make the folder intent clear. For an archive, use Archive/; for a nested folder, use Notes/Summaries/.

    How do I make a folder read-only but leave one note editable? ​

    Add an Exclude for that note alongside the folder's Include. With Only matched paths selected and Use glob patterns off, enable both rows:

    TypeValue
    IncludeReference/
    ExcludeReference/Working notes.md

    Reference/Handbook.md and Reference/Policies/Security.md stay in Reading view, while Reference/Working notes.md remains editable. Excludes always win, even when an include also matches.

    Ordinary file paths use prefix matching with glob matching off. To exempt exactly one existing note, paste its Obsidian URL into the exclude row instead. With glob matching on, use Reference/** for the folder include and Reference/Working notes.md for the note exclude.

    Check both the exception and another note using Path tester. To protect the exception again without retyping its path, uncheck the exclude row's Enabled checkbox; recheck it when you want to edit that note again.

    Leave drafts editable ​

    Add these two rules:

    TypeValue
    IncludeReference/
    ExcludeReference/Drafts/

    The resulting behavior is:

    NoteResult
    Reference/Handbook.mdRead-only
    Reference/Policies/Security.mdRead-only
    Reference/Drafts/New policy.mdEditable
    Inbox/Capture.mdEditable, unless another include rule matches

    An enabled Exclude always wins, even if another include rule also matches. Check any note with Path tester.

    Protect everything except a working folder ​

    If almost the whole vault is for reading, select All Markdown files and add an Exclude rule for Inbox/. Include rules are saved but inactive in this mode.

    If you enable glob matching, use Reference/** instead of the plain folder rule. See Path rules before changing the matching mode, because it applies to ordinary path rules throughout the configuration.

    How do I make only the notes directly in a folder read-only, without subfolders? ​

    Use the glob Reference/*.md in Only matched paths mode. A single * cannot cross /, so it selects Markdown notes directly inside Reference/ without selecting notes in nested folders.

    1. Keep the global Enabled toggle on and select Only matched paths.
    2. Under Advanced → Matching, turn on Use glob patterns.
    3. Add an enabled Include with Value set to Reference/*.md.
    4. Disable broader includes such as Reference/** or ** if you want the subfolders to remain editable.
    5. Wait for Saved. and test both a direct note and a nested note with Path tester.
    NoteWith Include Reference/*.mdWith Include Reference/**
    Reference/Handbook.mdRead-onlyRead-only
    Reference/Policies/Security.mdEditableRead-only
    Inbox/Capture.mdEditableEditable

    This comparison assumes Only matched paths, glob matching on, and only the include shown in each column, with no excludes. In All Markdown files, nested Markdown notes remain protected unless excluded.

    Glob matching applies to all ordinary path rules. Review existing folder rules when turning it on: a prefix such as Inbox/ needs to become Inbox/** to continue matching its contents. With glob matching off, Reference/*.md treats * literally and will not behave as this example describes.

    What a folder rule does not lock ​

    The rule affects Markdown note views, not the directory's filesystem permissions. It does not protect PDFs, images, other attachments, or changes made by external tools. Review rules after moving or renaming notes and folders; imported paths do not automatically track renames.

    For reading on a phone or tablet, see Reading view on mobile.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/make-folder-read-only.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const makeFolderReadOnly = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + makeFolderReadOnly as default +}; diff --git a/docs-site/.vitepress/.temp/guides_make-note-read-only.md.js b/docs-site/.vitepress/.temp/guides_make-note-read-only.md.js new file mode 100644 index 0000000..b14043c --- /dev/null +++ b/docs-site/.vitepress/.temp/guides_make-note-read-only.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"How to Make a Note Read-Only in Obsidian","description":"Configure Read Only View to keep one Obsidian Markdown note in Reading view, verify its path rule, and temporarily allow editing when needed.","frontmatter":{"title":"How to Make a Note Read-Only in Obsidian","description":"Configure Read Only View to keep one Obsidian Markdown note in Reading view, verify its path rule, and temporarily allow editing when needed."},"headers":[],"relativePath":"guides/make-note-read-only.md","filePath":"guides/make-note-read-only.md"}'); +const _sfc_main = { name: "guides/make-note-read-only.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    How to Make a Note Read-Only in Obsidian ​

    Use Read Only View with an Include rule for the note's vault path. The plugin keeps matching Markdown notes in Reading view to help prevent accidental edits.

    Reading view and protection ​

    Obsidian already provides Reading view and lets you switch between reading and editing. Live Preview is still an editing mode. See Obsidian's guide to views and editing modes.

    Read Only View adds automatic enforcement for selected paths: it returns matching notes to Reading view and blocks editor input in supported Markdown editors. The underlying file does not become read-only at the operating-system level.

    Protect a reference note ​

    1. Open Settings → Community plugins → Browse, find Read Only View, then Install and Enable it.
    2. Open Settings → Read Only View and keep Enabled on.
    3. Select Only matched paths. A new installation defaults to All Markdown files, which protects all Markdown notes instead.
    4. Under Path rules, select Add rule. Keep the row enabled, select Include, and enter Reference/Travel checklist.md in Value.
    5. Under Advanced → Matching, keep Use glob patterns off for this example. Keep the path's spelling and capitalization consistent with the vault.
    6. Wait for Saved., then open the note.

    Paste Reference/Travel checklist.md into Path tester. It should report Read-only unless an enabled exclude rule matches.

    Ordinary paths use prefix matching. To target exactly one existing note, you can also paste its obsidian://open URL into the rule. See Path rules for the distinction.

    Can I temporarily edit this note without deleting its rule? ​

    Yes. In Only matched paths, uncheck Enabled on the note's Include row and wait for Saved. The path stays saved. Edit the note, then check the row again to restore protection. This works only if no other enabled include also protects the note.

    If a folder rule or ** also matches, use a saved Exclude for the note: enable the exclude to allow editing, then disable it to restore protection. See how to pause individual rules.

    Pause protection for all notes ​

    Run Disable read-only mode from the Command Palette, then switch the note into editing. This disables enforcement across the vault. When finished, run Enable read-only mode.

    For an exception limited to this note, add an Exclude rule instead. Excludes always take precedence. Remove or disable the exception to protect the note again.

    Limitations ​

    Only Markdown notes are affected. Other applications and plugins can still modify files, and imported note rules do not follow later renames automatically. Some preview and embedded contexts depend on Obsidian's internal view behavior; this is accidental-edit prevention, not an access-control mechanism.

    To cover several notes together, follow Make a folder read-only.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/make-note-read-only.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const makeNoteReadOnly = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + makeNoteReadOnly as default +}; diff --git a/docs-site/.vitepress/.temp/guides_mobile-reading-view.md.js b/docs-site/.vitepress/.temp/guides_mobile-reading-view.md.js new file mode 100644 index 0000000..a512464 --- /dev/null +++ b/docs-site/.vitepress/.temp/guides_mobile-reading-view.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"Keep Obsidian Notes in Reading View on Mobile","description":"Use Read Only View on phones and tablets to keep reference notes in Reading view, configure folder rules, and allow deliberate edits.","frontmatter":{"title":"Keep Obsidian Notes in Reading View on Mobile","description":"Use Read Only View on phones and tablets to keep reference notes in Reading view, configure folder rules, and allow deliberate edits."},"headers":[],"relativePath":"guides/mobile-reading-view.md","filePath":"guides/mobile-reading-view.md"}'); +const _sfc_main = { name: "guides/mobile-reading-view.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    Keep Obsidian Notes in Reading View on Mobile ​

    Read Only View supports Obsidian on phones and tablets as well as desktop. Use it for notes you mainly consume: reference material, checklists, summaries, or an archive.

    An accidental switch into editing can open the keyboard and interrupt reading. The plugin returns matching Markdown notes to Reading view and blocks editor input in supported editors. It does not promise to suppress every keyboard appearance or control every plugin-provided view.

    Set up a reading folder ​

    1. In Obsidian, open Settings → Community plugins → Browse. Search for Read Only View, then Install and Enable it.
    2. Open Settings → Read Only View. Keep Enabled on and select Only matched paths.
    3. Under Path rules, add an enabled Include rule for Reference/.
    4. Keep Use glob patterns off under Advanced → Matching.
    5. Wait for Saved., then open a note in that folder.

    Use Path tester with a specific note such as Reference/Travel checklist.md to check the result. On narrow screens, settings controls and rule rows use a stacked layout.

    For an entire vault used mainly for reading, keep All Markdown files selected and add Exclude rules for notes you need to edit.

    Use portable paths ​

    Vault-relative paths work on desktop and mobile. Obsidian URLs must resolve to an existing Markdown note in the current vault.

    Importing a new absolute system path is desktop-only. Once imported, the rule stores its resolved vault-relative path, so that saved rule remains portable to mobile. You can enter the vault-relative path directly on your phone; no system path is needed.

    Edit when you intend to ​

    Run Disable read-only mode, switch to editing, and make your change. Then run Enable read-only mode. The disable command pauses enforcement for all notes, not just the current one.

    For a permanent writing area, add an Exclude rule such as Reference/Drafts/. See folder rules.

    Limits and privacy ​

    Only Markdown notes are affected. The plugin does not change file permissions or prevent external applications from editing notes. Rule matching stays local, and the plugin makes no network requests. Installation and updates are separate from normal plugin operation.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/mobile-reading-view.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const mobileReadingView = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + mobileReadingView as default +}; diff --git a/docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js b/docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js new file mode 100644 index 0000000..46387d3 --- /dev/null +++ b/docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js @@ -0,0 +1,19 @@ +import { ssrRenderAttrs } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const __pageData = JSON.parse('{"title":"How to Prevent Accidental Editing in Obsidian","description":"Keep reference notes in Reading view while leaving working notes editable, and deliberately pause Read Only View when you need to make changes.","frontmatter":{"title":"How to Prevent Accidental Editing in Obsidian","description":"Keep reference notes in Reading view while leaving working notes editable, and deliberately pause Read Only View when you need to make changes."},"headers":[],"relativePath":"guides/prevent-accidental-editing.md","filePath":"guides/prevent-accidental-editing.md"}'); +const _sfc_main = { name: "guides/prevent-accidental-editing.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    How to Prevent Accidental Editing in Obsidian ​

    If you mostly read reference notes, configure Read Only View to keep those notes in Reading view. It helps when an unintended tap, click, or view switch takes you into editing while you are trying to read.

    Separate reading notes from working notes ​

    A practical setup keeps reference material protected and daily writing editable:

    1. Install Read Only View and open its settings.
    2. Keep Enabled on and choose Only matched paths.
    3. Keep Use glob patterns off under Advanced → Matching.
    4. Add enabled Include rules for Reference/ and Archive/.
    5. If needed, add an Exclude rule for Reference/Drafts/.
    6. Wait for Saved. and check a representative note with Path tester.

    Notes outside those includes remain editable unless another rule matches them. If you mainly read the entire vault, use All Markdown files with exclusions for working folders instead.

    Make editing deliberate ​

    Use Disable read-only mode in the Command Palette before editing protected material. This pauses protection globally; it does not automatically resume. Run Enable read-only mode when you finish. Re-apply rules now enforces the current configuration across open Markdown notes.

    For a continuing exception, use an exclude rule instead of repeatedly pausing protection.

    Phones, tablets, and preview contexts ​

    An unwanted switch into editing can interrupt reading and bring up the keyboard on a touch device. Keeping matching notes in Reading view helps reduce these interruptions. See the mobile guide for configuration details.

    The plugin also blocks editor input in supported CodeMirror-backed Markdown contexts, including some preview contexts. Coverage of every hover or embedded view is not guaranteed because it depends on Obsidian's internal behavior.

    Protection is not access control ​

    Read Only View does not enforce security permissions, make files immutable, or stop another plugin or application from changing them. Its purpose is to reduce accidental edits during normal reading in Obsidian. It does not replace backups or file-access controls.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/prevent-accidental-editing.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const preventAccidentalEditing = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + preventAccidentalEditing as default +}; diff --git a/docs-site/.vitepress/.temp/index.md.js b/docs-site/.vitepress/.temp/index.md.js new file mode 100644 index 0000000..4562226 --- /dev/null +++ b/docs-site/.vitepress/.temp/index.md.js @@ -0,0 +1,20 @@ +import { ssrRenderAttrs, ssrRenderAttr } from "vue/server-renderer"; +import { useSSRContext } from "vue"; +import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js"; +const _imports_0 = "/Read-Only-View/assets/Read-Only-View-matched-paths-mode-1200x800.ALYpEN-F.png"; +const __pageData = JSON.parse('{"title":"Read Only View for Obsidian","description":"Keep selected notes and folders in Obsidian Reading view. Prevent accidental edits on desktop, phone, and tablet with local path rules.","frontmatter":{"layout":"home","title":"Read Only View for Obsidian","description":"Keep selected notes and folders in Obsidian Reading view. Prevent accidental edits on desktop, phone, and tablet with local path rules.","hero":{"name":"Read Only View","text":"Keep selected Obsidian notes in Reading view and prevent accidental edits.","tagline":"Read reference notes comfortably on desktop, phone, and tablet. Choose individual notes, whole folders, or every Markdown note in your vault.","actions":[{"theme":"brand","text":"Install from Community Plugins","link":"https://community.obsidian.md/plugins/read-only-view"},{"theme":"alt","text":"Read the guides","link":"/guides/make-note-read-only"},{"theme":"alt","text":"GitHub","link":"https://github.com/mrKazzila/Read-Only-View"}]},"features":[{"title":"Choose what stays in Reading view","details":"Include notes or folders with Path rules. Exclude drafts and working notes so they remain editable."},{"title":"Check a rule before relying on it","details":"The built-in Path tester shows the resolved path, matching rules, and whether a note is Read-only or Editable.","link":"/docs/path-tester"},{"title":"Read on mobile and tablet","details":"Keep reference notes in Reading view while browsing. Matching runs locally, with no network requests from the plugin.","link":"/guides/mobile-reading-view"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'); +const _sfc_main = { name: "index.md" }; +function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) { + _push(`

    Get started ​

    In Obsidian, open Settings → Community plugins → Browse, search for Read Only View, then select Install and Enable. Requires Obsidian 1.10.3 or newer; supports desktop and mobile.

    Choose your scope

    New installations use All Markdown files mode. To protect selected notes or folders, open Settings → Read Only View, select Only matched paths, and add an Include rule under Path rules.

    Find your workflow ​

    See Path rules for matching syntax and Path tester for diagnostics.

    Questions about path rules ​

    What protection means ​

    Read Only View returns matching Markdown notes to Reading view and blocks editor input in supported Markdown editors. It changes Obsidian view behavior; it does not change filesystem permissions, rewrite your Markdown files, or prevent other applications from editing them. See the FAQ for limitations and temporary editing.

    `); +} +const _sfc_setup = _sfc_main.setup; +_sfc_main.setup = (props, ctx) => { + const ssrContext = useSSRContext(); + (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("index.md"); + return _sfc_setup ? _sfc_setup(props, ctx) : void 0; +}; +const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]); +export { + __pageData, + index as default +}; diff --git a/docs-site/.vitepress/.temp/package.json b/docs-site/.vitepress/.temp/package.json new file mode 100644 index 0000000..25d9dcf --- /dev/null +++ b/docs-site/.vitepress/.temp/package.json @@ -0,0 +1 @@ +{ "private": true, "type": "module" } \ No newline at end of file diff --git a/docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js b/docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js new file mode 100644 index 0000000..84d1cb5 --- /dev/null +++ b/docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js @@ -0,0 +1,10 @@ +const _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc; + for (const [key, val] of props) { + target[key] = val; + } + return target; +}; +export { + _export_sfc as _ +}; diff --git a/docs-site/.vitepress/.temp/robots.txt b/docs-site/.vitepress/.temp/robots.txt new file mode 100644 index 0000000..04da39e --- /dev/null +++ b/docs-site/.vitepress/.temp/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: /Read-Only-View/ + +Sitemap: https://mrkazzila.github.io/Read-Only-View/sitemap.xml diff --git a/docs-site/.vitepress/config.ts b/docs-site/.vitepress/config.ts new file mode 100644 index 0000000..76a742c --- /dev/null +++ b/docs-site/.vitepress/config.ts @@ -0,0 +1,64 @@ +import { defineConfig } from 'vitepress'; + +const siteUrl = 'https://mrkazzila.github.io/Read-Only-View/'; +const description = 'Keep selected Obsidian notes in Reading view and prevent accidental edits with local include and exclude path rules.'; +const guides = [ + { text: 'Keep all notes in Reading view', link: '/guides/make-all-notes-read-only' }, + { text: 'Make a note read-only', link: '/guides/make-note-read-only' }, + { text: 'Make a folder read-only', link: '/guides/make-folder-read-only' }, + { text: 'Prevent accidental editing', link: '/guides/prevent-accidental-editing' }, + { text: 'Reading view on mobile', link: '/guides/mobile-reading-view' }, +]; + +export default defineConfig({ + title: 'Read Only View', + description, + lang: 'en-US', + base: '/Read-Only-View/', + cleanUrls: true, + sitemap: { hostname: siteUrl }, + themeConfig: { + nav: [ + { text: 'Guides', link: '/guides/make-note-read-only' }, + { text: 'Path rules', link: '/docs/path-rules' }, + { text: 'FAQ', link: '/faq' }, + ], + sidebar: [ + { text: 'Guides', items: guides }, + { text: 'Documentation', items: [ + { text: 'Path rules', link: '/docs/path-rules' }, + { text: 'Path tester', link: '/docs/path-tester' }, + { text: 'Troubleshooting', link: '/docs/troubleshooting' }, + { text: 'FAQ', link: '/faq' }, + ] }, + ], + socialLinks: [{ icon: 'github', link: 'https://github.com/mrKazzila/Read-Only-View' }], + footer: { message: 'Released under the 0BSD license.' }, + }, + transformHead({ pageData }) { + if (pageData.relativePath === '404.md') return [['meta', { name: 'robots', content: 'noindex' }]]; + const path = pageData.relativePath.replace(/index\.md$/, '').replace(/\.md$/, ''); + const url = new URL(path, siteUrl).href; + return [ + ['link', { rel: 'canonical', href: url }], + ['meta', { property: 'og:type', content: 'website' }], + ['meta', { property: 'og:site_name', content: 'Read Only View' }], + ['meta', { property: 'og:title', content: pageData.title }], + ['meta', { property: 'og:description', content: pageData.description || description }], + ['meta', { property: 'og:url', content: url }], + ...(pageData.relativePath === 'index.md' ? [[ + 'script', { type: 'application/ld+json' }, JSON.stringify({ + '@context': 'https://schema.org', + '@type': 'SoftwareApplication', + name: 'Read Only View', + applicationCategory: 'ProductivityApplication', + description, + url: siteUrl, + downloadUrl: 'https://community.obsidian.md/plugins/read-only-view', + softwareRequirements: 'Obsidian 1.10.3 or newer', + license: 'https://github.com/mrKazzila/Read-Only-View/blob/master/LICENSE', + }), + ] as [string, Record, string]] : []), + ]; + }, +}); diff --git a/docs-site/.vitepress/theme/index.ts b/docs-site/.vitepress/theme/index.ts new file mode 100644 index 0000000..d050e52 --- /dev/null +++ b/docs-site/.vitepress/theme/index.ts @@ -0,0 +1,4 @@ +import DefaultTheme from 'vitepress/theme'; +import './style.css'; + +export default DefaultTheme; diff --git a/docs-site/.vitepress/theme/style.css b/docs-site/.vitepress/theme/style.css new file mode 100644 index 0000000..8539bb9 --- /dev/null +++ b/docs-site/.vitepress/theme/style.css @@ -0,0 +1,15 @@ +:root { + --vp-c-brand-1: #7054bd; + --vp-c-brand-2: #8065ca; + --vp-c-brand-3: #7054bd; +} + +.dark { + --vp-c-brand-1: #b7a0f3; + --vp-c-brand-2: #a68ce7; + --vp-c-brand-3: #7054bd; +} + +.vp-doc img { + border-radius: 8px; +} diff --git a/docs-site/docs/path-rules.md b/docs-site/docs/path-rules.md new file mode 100644 index 0000000..f23a755 --- /dev/null +++ b/docs-site/docs/path-rules.md @@ -0,0 +1,114 @@ +--- +title: Path Rules for Read Only View +description: Learn how Include and Exclude rules, folder prefixes, exact imported notes, glob patterns, and matching precedence work in Read Only View. +--- +# Path rules + +**Path rules** select which Markdown notes stay in Reading view. Open **Settings → Read Only View** to add, disable, or remove a rule. + +## Modes and precedence + +With **Enabled** on, the plugin evaluates a Markdown note in this order: + +1. An enabled **Exclude** match leaves it editable. +2. Otherwise, **All Markdown files** protects it. +3. Otherwise, **Only matched paths** requires an enabled **Include** match to protect it. + +New installations start in **All Markdown files** mode. Include rules are retained but inactive in that mode. In **Only matched paths**, an empty rule list protects nothing. Changing or deleting rules does not switch modes. + +Each row has an **Enabled** checkbox, an **Include** or **Exclude** type, a **Value** field, and a Delete button. Disable a row to keep it for later without applying it. Disabled and unresolved rules do not participate in matching or active-rule counts. + +![Path rules showing vault paths, Obsidian URLs, and system paths](../../docs/images/community-images/Read-Only-View-path-rules-1200x800.png) + +## Ordinary vault paths + +By default, **Use glob patterns** is off and **Case sensitive** is on. Ordinary rules use literal path-prefix matching. + +| Value | Use | +| --- | --- | +| `Reference/` | Notes in Reference and all its subfolders | +| `Archive/` | Notes in Archive and all its subfolders | +| `Notes/Summaries/` | Notes under this nested folder | +| `Reference/Handbook.md` | A prefix beginning with this note path | + +Keep the trailing `/` for folder rules. In prefix mode, a plain name without `.md` or wildcards is treated as a folder prefix after source resolution. When entering an existing vault path without an extension, the source resolver first checks for a matching Markdown note; an existing folder is normalized with a trailing slash. Use `/` explicitly if a note and folder share a name and you intend to select the folder. + +A `.md` vault path remains a prefix rule, not an exact equality check. To target exactly one existing note regardless of prefix or glob mode, import its Obsidian URL or desktop system file path. + +### Editable exceptions + +With **Only matched paths**, these rules protect reference notes but allow drafts: + +| Type | Value | +| --- | --- | +| Include | `Reference/` | +| Exclude | `Reference/Drafts/` | + +With **All Markdown files**, an **Exclude** for `Inbox/` leaves that folder editable and protects other Markdown notes. An include rule cannot override an exclude. + +## Can I use wildcards in Obsidian read-only path rules? {#glob-patterns} + +Yes. Turn on **Advanced → Matching → Use glob patterns** to enable the plugin's glob matcher for ordinary paths. Patterns match the entire vault-relative path. + +| Pattern | Meaning | +| --- | --- | +| `**` | All paths, including vault-root notes; protection still applies only to Markdown | +| `Reference/*.md` | Markdown notes directly inside Reference | +| `Reference/**` | Notes anywhere under Reference | +| `Reference/**/Summary.md` | Summary.md directly inside Reference or deeper below it | +| `Notes/Summary?.md` | One non-slash character after Summary, such as Summary1.md | + +`*` matches zero or more characters except `/`; `**` can cross folder separators; `?` matches one character except `/`. The `/**/` form can cover zero or more nested folders. A leading `**/README.md` requires a slash, so use `README.md` separately if you also want the vault-root note. + +There is no regular-expression, brace-alternative, or character-class syntax. With glob matching off, `*` and `?` are literal characters. Switching matching modes affects ordinary saved path rules, so replace a prefix such as `Reference/` with `Reference/**` when enabling globs. + +To protect the whole vault using `**`, follow [Keep all Obsidian notes in Reading view](../guides/make-all-notes-read-only.md). + +## Can I make note-path matching case-sensitive? {#case-sensitivity} + +Yes. Open **Settings → Read Only View → Advanced → Matching** and turn **Case sensitive** on. It is enabled by default. Turn it off to ignore uppercase/lowercase differences when matching paths. This is a shared setting for include and exclude rules, not a per-rule option. + +With **Only matched paths**, glob matching off, and an enabled Include `Reference/`: + +| Note path | Case sensitive on | Case sensitive off | +| --- | --- | --- | +| `Reference/Handbook.md` | Read-only | Read-only | +| `reference/Handbook.md` | Editable | Read-only | + +This example assumes no other rules match. The setting applies to prefix and glob matching, as well as comparisons against resolved exact-file rules. It does not rename files or make an invalid Obsidian URL or system path resolve: imported sources must still identify an existing item in the current vault. Verify the actual note path with [Path tester](./path-tester.md). + +## Can I temporarily disable a path rule without deleting it? {#temporarily-disable-rules} + +Yes. Uncheck **Enabled** on the rule's row under **Path rules**. The plugin keeps its value and type, so you can re-enable it later without entering the path again. + +To edit a note protected by its own include rule: + +1. In **Only matched paths**, find the note's **Include** row. +2. Uncheck that row's **Enabled** checkbox, leaving the global **Enabled** toggle on. +3. Wait for **Saved.** and test the note. If it is **Editable**, switch it into editing and make your changes. +4. Check the row's **Enabled** checkbox again and wait for **Saved.** to restore that rule. + +If another include, such as `Reference/` or `**`, also matches, disabling only the note rule will not make the note editable. Add an **Exclude** for the note instead. Keep that exclude row saved: enable it when editing and disable it when you want protection back. Disabling a folder include affects every note it was protecting. + +In **All Markdown files**, include rows are already inactive. Use an exclude for a particular note, or use **Disable read-only mode** and **Enable read-only mode** to pause and restore protection globally. Neither approach needs you to delete saved paths, and protection does not resume on a timer. + +## Can I use an Obsidian URL, system path, or vault path in a rule? {#import-a-note-or-folder} + +Yes. Add an enabled **Include** under **Path rules** in **Only matched paths**, then paste any of the following sources into **Value**. The field detects the source format. The same source formats also work for **Exclude** rules: + +| Source | Example | Behavior | +| --- | --- | --- | +| Vault path | `Reference/Handbook.md` | Uses the configured prefix or glob matching | +| Obsidian URL | `obsidian://open?vault=MyVault&file=Reference%2FHandbook` | Resolves one exact existing Markdown note in the current vault | +| Desktop system path | `/Users/name/MyVault/Reference/Handbook.md` | Imports one exact existing Markdown note inside the current vault | +| Desktop system folder | `/Users/name/MyVault/Reference/` | Imports a folder using ordinary folder matching | + +Obsidian URLs may omit `.md`. Heading and block locators do not change which note is selected. A URL must name the current vault. Absolute system-path imports are available only on desktop, but the saved vault-relative path remains portable to mobile. The full system path is not persisted after successful import. + +If a source cannot be resolved, its value remains visible with an explanation, but it does not match anything. Imported sources require existing targets and do not automatically follow later renames. + +## Verify the result + +Wait for **Saved.**, then paste a specific Markdown note path into [Path tester](./path-tester.md). If the result is unexpected, check the selected mode, exclude matches, enabled rows, case sensitivity, and matching mode. + +For very large configurations, settings show warnings and ignore rules beyond the limits: at most 200 includes, 300 excludes, and 400 total. Include rules are counted first; exclude rules at the end are trimmed if the total exceeds 400. Prefer a few folder rules where possible and review any limit warnings. diff --git a/docs-site/docs/path-tester.md b/docs-site/docs/path-tester.md new file mode 100644 index 0000000..103fef4 --- /dev/null +++ b/docs-site/docs/path-tester.md @@ -0,0 +1,43 @@ +--- +title: How to Check Whether an Obsidian Note Will Be Read-Only +description: Diagnose whether an Obsidian note is Read-only or Editable using source resolution, matching Include and Exclude rules, and the all-Markdown preset. +--- +# How to Check Whether an Obsidian Note Will Be Read-Only + +**Path tester** is built into **Settings → Read Only View**. Use it to understand why a specific note is protected or remains editable; this website does not run the tester or access your vault. + +## Can I test a note path before opening the note? {#test-a-note} + +Yes. **Path tester** evaluates the current configuration for the supplied path without requiring you to open the note. Obsidian URLs and system paths must resolve to existing items; enter a specific Markdown note to get a read-only result. + +1. Configure your [Path rules](./path-rules.md) and wait for **Saved.** +2. Find **Path tester** in the plugin settings. +3. Paste a vault-relative note path such as `Reference/Handbook.md`, an Obsidian URL, or a desktop system path. +4. Review the detected source type and resolved vault path. +5. Check the matching include and exclude rules, the all-Markdown preset explanation, and the final **Read-only** or **Editable** status. + +![Path tester resolving an Obsidian URL and reporting Read-only](../../docs/images/community-images/Read-Only-View-path-tester-read-only-1200x800.png) + +## Interpret a result + +With **Enabled** on, **Only matched paths** selected, glob matching off, an **Include** for `Reference/`, and an **Exclude** for `Reference/Drafts/`: + +| Tested path | Expected result | Reason | +| --- | --- | --- | +| `Reference/Handbook.md` | Read-only | Include matches; no exclude matches | +| `Reference/Drafts/Handbook.md` | Editable | Exclude wins | +| `Inbox/Capture.md` | Editable | No include matches | + +In **All Markdown files**, a note can be read-only without any include matches. The preset determines the result unless an exclude matches. Turning **Enabled** off disables protection. + +## Resolve input problems + +- **Wrong vault or missing note:** an Obsidian URL must resolve to an existing Markdown note in the current vault. +- **System path on mobile:** import new absolute paths on desktop, or enter the portable vault-relative path instead. +- **Folder instead of a note:** for a system folder, the tester shows the resolved folder and asks for a specific Markdown note before evaluating matches. +- **Unexpected Editable status:** check excludes, the row's Enabled checkbox, letter case, and whether glob matching is on. +- **Unexpected Read-only status:** check whether **All Markdown files** is selected. + +The result explains the current configuration; it is not a filesystem-permission check or a guarantee for every embedded view. If open notes do not reflect saved changes, run **Re-apply rules now** from the Command Palette and reopen the note if necessary. + +For a step-by-step diagnosis of unexpected results, see [Troubleshooting read-only notes](./troubleshooting.md). diff --git a/docs-site/docs/troubleshooting.md b/docs-site/docs/troubleshooting.md new file mode 100644 index 0000000..c7ddae2 --- /dev/null +++ b/docs-site/docs/troubleshooting.md @@ -0,0 +1,46 @@ +--- +title: Why Is My Obsidian Note Read-Only or Still Editable? +description: Troubleshoot Read Only View rules when a note stays editable, remains read-only after disabling an Include, or does not reflect saved settings. +--- +# Why Is My Obsidian Note Read-Only or Still Editable? + +Start with **Path tester** in **Settings → Read Only View**. Enter the specific Markdown note path and check its resolved path, matching rules, and final **Read-only** or **Editable** status. This separates a rule-configuration problem from a view that has not reflected the configuration yet. + +## Why is my note still editable after I added an Include? {#still-editable} + +An include protects a Markdown note only while the plugin is enabled and no enabled exclude matches. Check these points in order: + +1. Confirm the global **Enabled** toggle is on and the file is a Markdown note. +2. Look for an **Exclude** match in Path tester. Excludes always win; adding another include cannot override one. +3. In **Only matched paths**, confirm the Include row is enabled and its source resolves without an inline error. +4. Check **Advanced → Matching**. Use `Reference/` for a folder with glob matching off, or `Reference/**` with glob matching on. With globs off, `*` and `?` are literal characters. +5. Check spelling and capitalization. **Case sensitive** is on by default. Imported URLs and system paths must still resolve to existing items in the current vault. +6. If the note was moved or renamed, update the saved path. Imported rules do not automatically follow renames. + +For example, Include `Reference/` and Exclude `Reference/Drafts/` leave `Reference/Drafts/Plan.md` editable. Disable or narrow that exclude if you want the note protected. + +If settings show a rule-limit warning, review which rules were ignored. See [Path rules](./path-rules.md#verify-the-result) for the limits. + +## Why is my note read-only when I want to edit it? {#unexpectedly-read-only} + +Check **Mode** first. New installations use **All Markdown files**, which protects Markdown notes even without include rules. Choose **Only matched paths** for selected-path protection, or add an enabled exclude for an exception. + +In **Only matched paths**, check every matching include in Path tester. A broad include such as `Reference/` in prefix mode, or `**` in glob mode, may protect the note alongside its individual rule. + +For example, a vault in **All Markdown files** mode needs an Exclude for `Daily Notes/` to leave that folder editable with glob matching off. With glob matching on, use `Daily Notes/**`. See the [daily notes example](../guides/make-all-notes-read-only.md#except-daily-notes). + +## Why does disabling an Include not let me edit the note? {#disabled-include} + +Either **All Markdown files** is active or another enabled include still matches. Disabling one rule does not override those other sources of protection. + +For a temporary exception, keep an **Exclude** row for the note: enable the exclude while editing, then disable it to restore protection. Its path stays saved. To pause enforcement for every note, run **Disable read-only mode** and later **Enable read-only mode**. See [temporarily disabling rules](./path-rules.md#temporarily-disable-rules). + +## Why does Path tester disagree with the open note? {#view-not-updated} + +Confirm you tested the actual note path and waited for **Saved.** after editing rules. If settings report **Save failed.**, the changes have not saved successfully. + +Run **Re-apply rules now** from the Command Palette, then reopen the note if necessary. An **Editable** result means Read Only View is not enforcing protection; you may still need to switch the note from Reading view to editing yourself. + +If Path tester reports **Read-only** but editing remains possible in a hover, embedded, or nonstandard view, that context may depend on Obsidian internals. Protection is not guaranteed in every such view, and it does not prevent another plugin or application from modifying files. + +If the problem continues, [report an issue](https://github.com/mrKazzila/Read-Only-View/issues) with your Obsidian and plugin versions, platform, mode, matching settings, and a minimal rule example. Use anonymized paths and describe whether it occurs in a normal note tab or a preview. See [Path tester](./path-tester.md) for the available diagnostics. diff --git a/docs-site/faq.md b/docs-site/faq.md new file mode 100644 index 0000000..dd9e19d --- /dev/null +++ b/docs-site/faq.md @@ -0,0 +1,93 @@ +--- +title: Read Only View FAQ +description: Answers about read-only Obsidian notes and folders, temporary editing, mobile support, Markdown files, local matching, and file-permission limitations. +--- +# Frequently asked questions + +## Can I make an Obsidian note read-only? + +You can keep it in Reading view with Read Only View. Choose **Only matched paths** and add an enabled **Include** for the note. The plugin enforces view behavior and blocks input in supported Markdown editors; it does not make the underlying file immutable. Follow the [single-note guide](./guides/make-note-read-only.md). + +## Can I make an entire folder read-only? + +Yes, for Markdown note views. With glob matching off, include a folder such as `Reference/` to cover its notes and subfolders. Add **Exclude** rules for editable exceptions. Attachments are unaffected. See the [folder guide](./guides/make-folder-read-only.md). + +## Does Read Only View change filesystem permissions? + +No. It changes Obsidian view behavior only. It is not an operating-system lock, security boundary, or access-control system. + +## Can another application still edit the Markdown file? + +Yes. Other applications, external tools, and plugins can still change files. Read Only View is intended to prevent accidental editing while reading in Obsidian. + +## Can I temporarily edit a matched note? + +Yes. Run **Disable read-only mode** in the Command Palette, switch to editing, then run **Enable read-only mode** when finished. This pauses protection globally and does not resume automatically. + +To exempt only a particular note or folder, add an enabled **Exclude** rule and remove or disable it later. In **Only matched paths**, disabling an include row also stops that rule from protecting notes, provided no other include matches. In **All Markdown files**, disabling an include has no effect. + +## Does it work on mobile? + +Yes. The plugin supports desktop and mobile and requires Obsidian **1.10.3 or newer**. Narrow settings panes use a stacked layout. New absolute system paths can only be imported on desktop; their saved vault-relative paths remain portable to mobile. See the [mobile guide](./guides/mobile-reading-view.md). + +## Are network requests required? + +The plugin makes no network requests during normal operation. Rule matching stays local. Downloading the plugin or its updates is separate from that operation. + +## Does it modify my Markdown files? + +The plugin does not rewrite Markdown content to enforce read-only behavior. It controls note views and editor input and saves its own configuration as plugin data. It does not add frontmatter or permission markers to notes. + +## Why are all my notes in Reading view? + +New installations default to **All Markdown files** mode with **Enabled** on. Switch to **Only matched paths** to protect only selected paths, or add excludes for working notes and folders. + +## Why does a matching note remain editable? + +Check that **Enabled** is on, the note is Markdown, and an enabled exclude does not match. In **Only matched paths**, an enabled include must match. Check case sensitivity and glob settings with [Path tester](./docs/path-tester.md). + +Some hover, embedded, or nonstandard editor contexts depend on Obsidian internals. Protection is not guaranteed in every such context. + +## Will a rule follow a renamed note? + +Imported rules do not automatically follow later renames. Review the saved path after moving or renaming a note or folder and verify the new note path in **Path tester**. + +## How do I switch all Obsidian notes to Reading view? + +Select **All Markdown files** with **Enabled** on. Alternatively, select **Only matched paths**, enable **Use glob patterns**, and add an enabled Include `**`. Enabled excludes still win. Follow the [whole-vault guide](./guides/make-all-notes-read-only.md). + +## Can I protect a folder but keep one note editable? + +Yes. With glob matching off, include `Reference/` and exclude `Reference/Working notes.md`. For an exact-file exception in either matching mode, use the note's Obsidian URL. See the [folder and single-note exception example](./guides/make-folder-read-only.md#leave-one-note-editable). + +## Can I use an Obsidian URL or system path instead of a vault path? + +Yes. The rule's **Value** field accepts all three. URLs must resolve to an existing Markdown note in the current vault; system-path imports are desktop-only and must point inside that vault. Successful system-path imports save portable vault-relative paths. See [source formats and examples](./docs/path-rules.md#import-a-note-or-folder). + +## Can I disable a rule temporarily without retyping the path later? + +Yes. Uncheck the rule row's **Enabled** checkbox, then recheck it when needed. Its path and type stay saved. Other includes or **All Markdown files** may still protect the note; a saved exclude can provide a temporary exception in either mode. See [temporarily disabling rules](./docs/path-rules.md#temporarily-disable-rules). + +## Can I check whether a note will be read-only by entering its path? + +Yes. Paste a specific note path into **Path tester** in the plugin settings. It shows source resolution, matching rules, and the final **Read-only** or **Editable** status. See [how to test a note path](./docs/path-tester.md#test-a-note). + +## Can I use wildcards such as *, **, and ? in path rules? + +Yes, after enabling **Advanced → Matching → Use glob patterns**. Use `*` within one path segment, `**` across folders, and `?` for one non-slash character. With glob matching off, these characters are literal. See [wildcard examples](./docs/path-rules.md#glob-patterns). + +## Can I turn case-sensitive path matching on or off? + +Yes. Use **Advanced → Matching → Case sensitive**. It is on by default; turn it off to ignore case when matching include and exclude paths. See [case-sensitive matching examples](./docs/path-rules.md#case-sensitivity). + +## Can I keep daily notes editable while protecting the rest of my vault? + +Yes. In **All Markdown files**, exclude your daily-notes folder: `Daily Notes/` with glob matching off, or `Daily Notes/**` with it on. Use your actual folder path; the plugin does not identify daily notes automatically. See the [daily notes and Inbox example](./guides/make-all-notes-read-only.md#except-daily-notes). + +## Can I protect notes in a folder without protecting its subfolders? + +Yes. Select **Only matched paths**, enable **Use glob patterns**, and include `Reference/*.md`. Remove or disable broader includes if they also protect the subfolders. See the [direct notes versus subfolders example](./guides/make-folder-read-only.md#without-subfolders). + +## How do I troubleshoot a note that is protected or editable unexpectedly? + +Start with **Path tester**, then check the global Enabled toggle, selected mode, matching excludes, and enabled includes. Follow [Troubleshooting](./docs/troubleshooting.md) for each result, including what to do when disabling an include does not remove protection. diff --git a/docs-site/guides/make-all-notes-read-only.md b/docs-site/guides/make-all-notes-read-only.md new file mode 100644 index 0000000..379fc56 --- /dev/null +++ b/docs-site/guides/make-all-notes-read-only.md @@ -0,0 +1,85 @@ +--- +title: How to Keep All Obsidian Notes in Reading View +description: Make all Markdown notes in an Obsidian vault read-only using All Markdown files mode or an Include rule with **, while keeping editable exceptions. +--- +# How to Keep All Obsidian Notes in Reading View + +To keep every Markdown note in your Obsidian vault in Reading view, enable Read Only View and select **All Markdown files**. You can also use an **Include** rule with `**` when glob matching is enabled. + +Both options help prevent accidental edits in Obsidian. They do not change filesystem permissions or protect attachments and changes made by other applications. + +## How do I make my entire Obsidian vault read-only? + +1. Open **Settings → Community plugins → Browse**, search for **Read Only View**, then **Install** and **Enable** it. +2. Open **Settings → Read Only View** and keep **Enabled** on. +3. Select **All Markdown files**. This is the default for new installations. +4. Review existing **Exclude** rules: any enabled matching exclude leaves the note editable. +5. Open a Markdown note, or run **Re-apply rules now** to apply the configuration across open Markdown notes. + +No include rules are required. Saved include rules remain available but inactive in this mode. **Use glob patterns** does not need to be enabled for the all-Markdown preset; it still controls how ordinary exclude rules match. + +## Can I match all notes with an Include rule and **? + +Yes. The `**` glob matches paths at every depth, including notes directly in the vault root. + +1. Select **Only matched paths** and keep the global **Enabled** toggle on. +2. Under **Advanced → Matching**, turn on **Use glob patterns**. +3. Under **Path rules**, add an enabled **Include** with **Value** set to `**`. +4. Wait for **Saved.** and check a note with [Path tester](../docs/path-tester.md). + +| Tested path | Result with Include `**` and no matching exclude | +| --- | --- | +| `Home.md` | Read-only | +| `Reference/Handbook.md` | Read-only | +| `Archive/2025/Meeting.md` | Read-only | + +Only Markdown notes are protected even though `**` can match other path strings. With **Use glob patterns** off, `**` is literal text and does not select all notes. A single `*` cannot cross folder separators. + +::: tip Review existing rules when enabling globs +Glob matching is a shared setting for ordinary path rules. Change folder prefixes such as `Reference/` to `Reference/**` when switching to glob mode. Exact imported note rules keep their exact-file behavior. +::: + +## How do I keep some notes editable in a read-only vault? + +Add enabled **Exclude** rules. Excludes take precedence in both approaches. + +| Matching mode | Exclude value | Editable exception | +| --- | --- | --- | +| Glob matching off | `Inbox/` | Markdown notes in Inbox and its subfolders | +| Glob matching on | `Inbox/**` | Markdown notes in Inbox and its subfolders | +| Either mode | `Reference/Working notes.md` | The named note; ordinary paths remain prefixes when globs are off | + +For an exact-file exception regardless of matching mode, paste the existing note's Obsidian URL into an **Exclude** row. See [supported path sources](../docs/path-rules.md#import-a-note-or-folder). + +## How do I make my vault read-only except for daily notes? {#except-daily-notes} + +Use **All Markdown files** with an enabled **Exclude** for the folder where you keep daily notes. For example, protect reference material while keeping your journal and quick captures editable: + +1. Open **Settings → Read Only View**, keep **Enabled** on, and select **All Markdown files**. +2. With **Use glob patterns** off, add these enabled **Exclude** rows under **Path rules**: + +| Type | Value | +| --- | --- | +| Exclude | `Daily Notes/` | +| Exclude | `Inbox/` | + +3. Replace the example folder names with the actual vault-relative paths you use. Read Only View matches paths; it does not detect daily notes by date or automatically read another plugin's folder setting. +4. Wait for **Saved.** and check representative notes with [Path tester](../docs/path-tester.md). + +| Tested path | Expected result with only the rules above | +| --- | --- | +| `Daily Notes/2026-09-18.md` | Editable | +| `Daily Notes/2026/09/18.md` | Editable | +| `Inbox/Quick capture.md` | Editable | +| `Reference/Handbook.md` | Read-only | +| `Home.md` | Read-only | + +New Markdown notes created under the excluded folders also match those folder rules. A daily note saved elsewhere does not get an exception just because it is a daily note. + +If **Use glob patterns** is already on, use `Daily Notes/**` and `Inbox/**` instead. These excludes also work with **Only matched paths** and Include `**`. Review existing rules before changing the shared matching mode. + +## Can I temporarily allow editing without deleting my rules? + +Run **Disable read-only mode**, switch into editing, then run **Enable read-only mode** when finished. This pauses protection globally and does not resume automatically. + +If you use the `**` include in **Only matched paths**, you can instead uncheck that row's **Enabled** checkbox and recheck it later. Other enabled includes may still protect some notes. Disabling an include does not pause **All Markdown files** mode. See [temporarily disabling path rules](../docs/path-rules.md#temporarily-disable-rules). diff --git a/docs-site/guides/make-folder-read-only.md b/docs-site/guides/make-folder-read-only.md new file mode 100644 index 0000000..0202ae9 --- /dev/null +++ b/docs-site/guides/make-folder-read-only.md @@ -0,0 +1,84 @@ +--- +title: How to Make a Folder Read-Only in Obsidian +description: Keep Markdown notes in a reference or archive folder in Reading view, with include rules for folders and exclude rules for one editable note or a drafts subfolder. +--- +# How to Make a Folder Read-Only in Obsidian + +Add a folder path such as `Reference/` as an **Include** rule in Read Only View. With ordinary path matching, Markdown notes inside that folder and its subfolders stay in Reading view. + +## Protect a reference or archive folder + +1. [Install and enable Read Only View](./make-note-read-only.md#protect-a-reference-note). +2. Open **Settings → Read Only View**. Keep **Enabled** on and select **Only matched paths**. +3. Under **Advanced → Matching**, keep **Use glob patterns** off. +4. Under **Path rules**, add an enabled **Include** row with **Value** set to `Reference/`. +5. Wait for **Saved.** and open a Markdown note inside that folder. + +Use a vault-relative path, not the vault's name. Keep the trailing `/` to make the folder intent clear. For an archive, use `Archive/`; for a nested folder, use `Notes/Summaries/`. + +## How do I make a folder read-only but leave one note editable? {#leave-one-note-editable} + +Add an **Exclude** for that note alongside the folder's **Include**. With **Only matched paths** selected and **Use glob patterns** off, enable both rows: + +| Type | Value | +| --- | --- | +| Include | `Reference/` | +| Exclude | `Reference/Working notes.md` | + +`Reference/Handbook.md` and `Reference/Policies/Security.md` stay in Reading view, while `Reference/Working notes.md` remains editable. Excludes always win, even when an include also matches. + +Ordinary file paths use prefix matching with glob matching off. To exempt exactly one existing note, paste its Obsidian URL into the exclude row instead. With glob matching on, use `Reference/**` for the folder include and `Reference/Working notes.md` for the note exclude. + +Check both the exception and another note using [Path tester](../docs/path-tester.md). To protect the exception again without retyping its path, uncheck the exclude row's **Enabled** checkbox; recheck it when you want to edit that note again. + +## Leave drafts editable + +Add these two rules: + +| Type | Value | +| --- | --- | +| Include | `Reference/` | +| Exclude | `Reference/Drafts/` | + +The resulting behavior is: + +| Note | Result | +| --- | --- | +| `Reference/Handbook.md` | Read-only | +| `Reference/Policies/Security.md` | Read-only | +| `Reference/Drafts/New policy.md` | Editable | +| `Inbox/Capture.md` | Editable, unless another include rule matches | + +An enabled **Exclude** always wins, even if another include rule also matches. Check any note with [Path tester](../docs/path-tester.md). + +## Protect everything except a working folder + +If almost the whole vault is for reading, select **All Markdown files** and add an **Exclude** rule for `Inbox/`. Include rules are saved but inactive in this mode. + +If you enable glob matching, use `Reference/**` instead of the plain folder rule. See [Path rules](../docs/path-rules.md#glob-patterns) before changing the matching mode, because it applies to ordinary path rules throughout the configuration. + +## How do I make only the notes directly in a folder read-only, without subfolders? {#without-subfolders} + +Use the glob `Reference/*.md` in **Only matched paths** mode. A single `*` cannot cross `/`, so it selects Markdown notes directly inside `Reference/` without selecting notes in nested folders. + +1. Keep the global **Enabled** toggle on and select **Only matched paths**. +2. Under **Advanced → Matching**, turn on **Use glob patterns**. +3. Add an enabled **Include** with **Value** set to `Reference/*.md`. +4. Disable broader includes such as `Reference/**` or `**` if you want the subfolders to remain editable. +5. Wait for **Saved.** and test both a direct note and a nested note with [Path tester](../docs/path-tester.md). + +| Note | With Include `Reference/*.md` | With Include `Reference/**` | +| --- | --- | --- | +| `Reference/Handbook.md` | Read-only | Read-only | +| `Reference/Policies/Security.md` | Editable | Read-only | +| `Inbox/Capture.md` | Editable | Editable | + +This comparison assumes **Only matched paths**, glob matching on, and only the include shown in each column, with no excludes. In **All Markdown files**, nested Markdown notes remain protected unless excluded. + +Glob matching applies to all ordinary path rules. Review existing folder rules when turning it on: a prefix such as `Inbox/` needs to become `Inbox/**` to continue matching its contents. With glob matching off, `Reference/*.md` treats `*` literally and will not behave as this example describes. + +## What a folder rule does not lock + +The rule affects Markdown note views, not the directory's filesystem permissions. It does not protect PDFs, images, other attachments, or changes made by external tools. Review rules after moving or renaming notes and folders; imported paths do not automatically track renames. + +For reading on a phone or tablet, see [Reading view on mobile](./mobile-reading-view.md). diff --git a/docs-site/guides/make-note-read-only.md b/docs-site/guides/make-note-read-only.md new file mode 100644 index 0000000..0639bf1 --- /dev/null +++ b/docs-site/guides/make-note-read-only.md @@ -0,0 +1,44 @@ +--- +title: How to Make a Note Read-Only in Obsidian +description: Configure Read Only View to keep one Obsidian Markdown note in Reading view, verify its path rule, and temporarily allow editing when needed. +--- +# How to Make a Note Read-Only in Obsidian + +Use Read Only View with an **Include** rule for the note's vault path. The plugin keeps matching Markdown notes in Reading view to help prevent accidental edits. + +## Reading view and protection + +Obsidian already provides Reading view and lets you switch between reading and editing. Live Preview is still an editing mode. See [Obsidian's guide to views and editing modes](https://obsidian.md/help/edit-and-read). + +Read Only View adds automatic enforcement for selected paths: it returns matching notes to Reading view and blocks editor input in supported Markdown editors. The underlying file does not become read-only at the operating-system level. + +## Protect a reference note + +1. Open **Settings → Community plugins → Browse**, find **Read Only View**, then **Install** and **Enable** it. +2. Open **Settings → Read Only View** and keep **Enabled** on. +3. Select **Only matched paths**. A new installation defaults to **All Markdown files**, which protects all Markdown notes instead. +4. Under **Path rules**, select **Add rule**. Keep the row enabled, select **Include**, and enter `Reference/Travel checklist.md` in **Value**. +5. Under **Advanced → Matching**, keep **Use glob patterns** off for this example. Keep the path's spelling and capitalization consistent with the vault. +6. Wait for **Saved.**, then open the note. + +Paste `Reference/Travel checklist.md` into [Path tester](../docs/path-tester.md). It should report **Read-only** unless an enabled exclude rule matches. + +Ordinary paths use prefix matching. To target exactly one existing note, you can also paste its `obsidian://open` URL into the rule. See [Path rules](../docs/path-rules.md) for the distinction. + +## Can I temporarily edit this note without deleting its rule? {#temporarily-edit-the-note} + +Yes. In **Only matched paths**, uncheck **Enabled** on the note's Include row and wait for **Saved.** The path stays saved. Edit the note, then check the row again to restore protection. This works only if no other enabled include also protects the note. + +If a folder rule or `**` also matches, use a saved **Exclude** for the note: enable the exclude to allow editing, then disable it to restore protection. See [how to pause individual rules](../docs/path-rules.md#temporarily-disable-rules). + +### Pause protection for all notes + +Run **Disable read-only mode** from the Command Palette, then switch the note into editing. This disables enforcement across the vault. When finished, run **Enable read-only mode**. + +For an exception limited to this note, add an **Exclude** rule instead. Excludes always take precedence. Remove or disable the exception to protect the note again. + +## Limitations + +Only Markdown notes are affected. Other applications and plugins can still modify files, and imported note rules do not follow later renames automatically. Some preview and embedded contexts depend on Obsidian's internal view behavior; this is accidental-edit prevention, not an access-control mechanism. + +To cover several notes together, follow [Make a folder read-only](./make-folder-read-only.md). diff --git a/docs-site/guides/mobile-reading-view.md b/docs-site/guides/mobile-reading-view.md new file mode 100644 index 0000000..0f17014 --- /dev/null +++ b/docs-site/guides/mobile-reading-view.md @@ -0,0 +1,37 @@ +--- +title: Keep Obsidian Notes in Reading View on Mobile +description: Use Read Only View on phones and tablets to keep reference notes in Reading view, configure folder rules, and allow deliberate edits. +--- +# Keep Obsidian Notes in Reading View on Mobile + +Read Only View supports Obsidian on phones and tablets as well as desktop. Use it for notes you mainly consume: reference material, checklists, summaries, or an archive. + +An accidental switch into editing can open the keyboard and interrupt reading. The plugin returns matching Markdown notes to Reading view and blocks editor input in supported editors. It does not promise to suppress every keyboard appearance or control every plugin-provided view. + +## Set up a reading folder + +1. In Obsidian, open **Settings → Community plugins → Browse**. Search for **Read Only View**, then **Install** and **Enable** it. +2. Open **Settings → Read Only View**. Keep **Enabled** on and select **Only matched paths**. +3. Under **Path rules**, add an enabled **Include** rule for `Reference/`. +4. Keep **Use glob patterns** off under **Advanced → Matching**. +5. Wait for **Saved.**, then open a note in that folder. + +Use [Path tester](../docs/path-tester.md) with a specific note such as `Reference/Travel checklist.md` to check the result. On narrow screens, settings controls and rule rows use a stacked layout. + +For an entire vault used mainly for reading, keep **All Markdown files** selected and add **Exclude** rules for notes you need to edit. + +## Use portable paths + +Vault-relative paths work on desktop and mobile. Obsidian URLs must resolve to an existing Markdown note in the current vault. + +Importing a new absolute system path is desktop-only. Once imported, the rule stores its resolved vault-relative path, so that saved rule remains portable to mobile. You can enter the vault-relative path directly on your phone; no system path is needed. + +## Edit when you intend to + +Run **Disable read-only mode**, switch to editing, and make your change. Then run **Enable read-only mode**. The disable command pauses enforcement for all notes, not just the current one. + +For a permanent writing area, add an **Exclude** rule such as `Reference/Drafts/`. See [folder rules](./make-folder-read-only.md). + +## Limits and privacy + +Only Markdown notes are affected. The plugin does not change file permissions or prevent external applications from editing notes. Rule matching stays local, and the plugin makes no network requests. Installation and updates are separate from normal plugin operation. diff --git a/docs-site/guides/prevent-accidental-editing.md b/docs-site/guides/prevent-accidental-editing.md new file mode 100644 index 0000000..c2388f8 --- /dev/null +++ b/docs-site/guides/prevent-accidental-editing.md @@ -0,0 +1,36 @@ +--- +title: How to Prevent Accidental Editing in Obsidian +description: Keep reference notes in Reading view while leaving working notes editable, and deliberately pause Read Only View when you need to make changes. +--- +# How to Prevent Accidental Editing in Obsidian + +If you mostly read reference notes, configure Read Only View to keep those notes in Reading view. It helps when an unintended tap, click, or view switch takes you into editing while you are trying to read. + +## Separate reading notes from working notes + +A practical setup keeps reference material protected and daily writing editable: + +1. [Install Read Only View](./make-note-read-only.md#protect-a-reference-note) and open its settings. +2. Keep **Enabled** on and choose **Only matched paths**. +3. Keep **Use glob patterns** off under **Advanced → Matching**. +4. Add enabled **Include** rules for `Reference/` and `Archive/`. +5. If needed, add an **Exclude** rule for `Reference/Drafts/`. +6. Wait for **Saved.** and check a representative note with [Path tester](../docs/path-tester.md). + +Notes outside those includes remain editable unless another rule matches them. If you mainly read the entire vault, use **All Markdown files** with exclusions for working folders instead. + +## Make editing deliberate + +Use **Disable read-only mode** in the Command Palette before editing protected material. This pauses protection globally; it does not automatically resume. Run **Enable read-only mode** when you finish. **Re-apply rules now** enforces the current configuration across open Markdown notes. + +For a continuing exception, use an exclude rule instead of repeatedly pausing protection. + +## Phones, tablets, and preview contexts + +An unwanted switch into editing can interrupt reading and bring up the keyboard on a touch device. Keeping matching notes in Reading view helps reduce these interruptions. See the [mobile guide](./mobile-reading-view.md) for configuration details. + +The plugin also blocks editor input in supported CodeMirror-backed Markdown contexts, including some preview contexts. Coverage of every hover or embedded view is not guaranteed because it depends on Obsidian's internal behavior. + +## Protection is not access control + +Read Only View does not enforce security permissions, make files immutable, or stop another plugin or application from changing them. Its purpose is to reduce accidental edits during normal reading in Obsidian. It does not replace backups or file-access controls. diff --git a/docs-site/index.md b/docs-site/index.md new file mode 100644 index 0000000..257936c --- /dev/null +++ b/docs-site/index.md @@ -0,0 +1,65 @@ +--- +layout: home +title: Read Only View for Obsidian +description: Keep selected notes and folders in Obsidian Reading view. Prevent accidental edits on desktop, phone, and tablet with local path rules. +hero: + name: Read Only View + text: Keep selected Obsidian notes in Reading view and prevent accidental edits. + tagline: Read reference notes comfortably on desktop, phone, and tablet. Choose individual notes, whole folders, or every Markdown note in your vault. + actions: + - theme: brand + text: Install from Community Plugins + link: https://community.obsidian.md/plugins/read-only-view + - theme: alt + text: Read the guides + link: /guides/make-note-read-only + - theme: alt + text: GitHub + link: https://github.com/mrKazzila/Read-Only-View +features: + - title: Choose what stays in Reading view + details: Include notes or folders with Path rules. Exclude drafts and working notes so they remain editable. + - title: Check a rule before relying on it + details: The built-in Path tester shows the resolved path, matching rules, and whether a note is Read-only or Editable. + link: /docs/path-tester + - title: Read on mobile and tablet + details: Keep reference notes in Reading view while browsing. Matching runs locally, with no network requests from the plugin. + link: /guides/mobile-reading-view +--- + +## Get started + +In Obsidian, open **Settings → Community plugins → Browse**, search for **Read Only View**, then select **Install** and **Enable**. Requires Obsidian **1.10.3 or newer**; supports desktop and mobile. + +::: tip Choose your scope +New installations use **All Markdown files** mode. To protect selected notes or folders, open **Settings → Read Only View**, select **Only matched paths**, and add an **Include** rule under **Path rules**. +::: + +![Read Only View settings with Only matched paths selected](../docs/images/community-images/Read-Only-View-matched-paths-mode-1200x800.png) + +## Find your workflow + +- [How do I keep all Obsidian notes in Reading view?](./guides/make-all-notes-read-only.md): use **All Markdown files** or an Include glob `**`. +- [Make one note read-only](./guides/make-note-read-only.md): keep a reference note in Reading view. +- [Make a folder read-only](./guides/make-folder-read-only.md): protect `Reference/` or `Archive/` while leaving drafts editable. +- [Prevent accidental editing](./guides/prevent-accidental-editing.md): separate reading from deliberate editing. +- [Use Reading view on mobile](./guides/mobile-reading-view.md): browse notes on a phone or tablet. + +See [Path rules](./docs/path-rules.md) for matching syntax and [Path tester](./docs/path-tester.md) for diagnostics. + +## Questions about path rules + +- [How do I keep daily notes editable in a read-only vault?](./guides/make-all-notes-read-only.md#except-daily-notes) +- [How do I protect a folder without its subfolders?](./guides/make-folder-read-only.md#without-subfolders) +- [Why is my note read-only or still editable?](./docs/troubleshooting.md) + +- [Can I protect a folder but leave one note editable?](./guides/make-folder-read-only.md#leave-one-note-editable) +- [Can I use an Obsidian URL, system path, or vault path?](./docs/path-rules.md#import-a-note-or-folder) +- [Can I temporarily disable a rule without deleting its path?](./docs/path-rules.md#temporarily-disable-rules) +- [How do I check whether a note will be read-only?](./docs/path-tester.md#test-a-note) +- [Can I use wildcards in path rules?](./docs/path-rules.md#glob-patterns) +- [Can I make path matching case-sensitive?](./docs/path-rules.md#case-sensitivity) + +## What protection means + +Read Only View returns matching Markdown notes to Reading view and blocks editor input in supported Markdown editors. It changes Obsidian view behavior; it does not change filesystem permissions, rewrite your Markdown files, or prevent other applications from editing them. See the [FAQ](./faq.md) for limitations and temporary editing. diff --git a/docs-site/public/robots.txt b/docs-site/public/robots.txt new file mode 100644 index 0000000..04da39e --- /dev/null +++ b/docs-site/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: /Read-Only-View/ + +Sitemap: https://mrkazzila.github.io/Read-Only-View/sitemap.xml diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md index d0e5cba..d4ab507 100644 --- a/docs/PROJECT_STATE.md +++ b/docs/PROJECT_STATE.md @@ -416,3 +416,16 @@ When plugin behavior changes (matching logic, enforcement behavior, commands, se 1. Update this file (`docs/PROJECT_STATE.md`). 2. Update user-facing docs (`README.md`). 3. Re-run validation: `just lint && just test && just build`. + +## Public documentation website + +- `docs-site/` contains the VitePress homepage, five workflow guides, Path rules, Path tester, and FAQ. It documents the checked-in behavior rather than claiming a latest release version. +- `docs-site/.vitepress/config.ts` owns navigation, the `/Read-Only-View/` base, sitemap, canonical URLs, Open Graph metadata, and homepage SoftwareApplication JSON-LD. +- Screenshots are imported from `docs/images/community-images/`; there are no duplicated source assets. +- Root npm scripts: `docs:dev`, `docs:build`, `docs:preview`. Website dependencies are development-only and locked in `package-lock.json`. +- `.github/workflows/pages.yml` builds PRs against `master` and deploys `master` to GitHub Pages. Plugin CI, releases, and runtime behavior are unchanged. +- Setup, validation, and the project-site robots.txt limitation are documented in `CONTRIBUTING.md`. + +The public guides explicitly cover all-Markdown mode versus Include `**`, a single editable note inside a protected folder, retained disabled rules, supported path sources, Path tester, wildcards, and case sensitivity. Question-based headings and FAQ answers link to concrete setup examples. + +Additional public examples cover an all-Markdown vault with editable Daily Notes and Inbox folders, and direct-child folder matching with `Reference/*.md`. `docs-site/docs/troubleshooting.md` diagnoses unexpected read-only/editable results and links to Path tester; navigation, homepage, and FAQ expose these workflows. diff --git a/eslint.config.mts b/eslint.config.mts index f0a2689..1f1fa3f 100644 --- a/eslint.config.mts +++ b/eslint.config.mts @@ -44,6 +44,7 @@ export default tseslint.config( '.tmp', 'node_modules', 'dist', + 'docs-site/.vitepress/**', 'build-tests', 'demo-vault', 'esbuild.config.mjs', diff --git a/package-lock.json b/package-lock.json index 2ab5d50..48ba74e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "tslib": "2.4.0", "typescript": "^5.8.3", "typescript-eslint": "8.35.1", + "vitepress": "1.6.4", "webdriverio": "^9.27.2" } }, @@ -1475,9 +1476,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -13082,6 +13083,2510 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/@algolia/abtesting": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.25.0.tgz", + "integrity": "sha512-rSTin9Uta23uaewYVQEp8XI9T3iA/zrg0/1G2vhf8oFFDxFL5vybnZ5IQwsVAg4JpKxPX4/WYNKdcfWrZymk7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.59.0.tgz", + "integrity": "sha512-bm2XN0hCSMYwStSsCBT0/PUB2BDxoyR1Lnub3c392HMEy9bi8PUSW8vR6zltVEKWG2t4PQFWMD5C07bmJxGgPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.59.0.tgz", + "integrity": "sha512-XOFPOTa69WuqHR6c5tMgnUUwwqQgNSzMpxmhrgA9KmxRf8WIqEa0cokHJvohk5CYb7CZx0xeSL6Bk2IUJ7Lv7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.59.0.tgz", + "integrity": "sha512-PC8ipLOYFKRTfIUY1J3FJxS6ryzWziaXmIX9/sNMoUR8L+XhF7hX2QAeUI87YVl5zujvlYTSOb+HAIqKXDjyHQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.59.0.tgz", + "integrity": "sha512-yFNcCMM5fHiyoR0HuxMrzy+VjDcmhFUZTm2IJ2DHwGsVH3B5SEob4zTmeEZ3j/AZqNnmrJOCKl/tJnBg7+84bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.59.0.tgz", + "integrity": "sha512-GYja6HkDt2VrQhWmB2cLx3Z5fDwI9no7q+xwCWcFrTPm5CLH9QZvK0XLO9co1FcNIDxxkMaP3AXM39/XcecEOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.59.0.tgz", + "integrity": "sha512-Wofg7bMpWh8N5qDDZs0wy6whc+KMmdNsxgrIGp9Ug2s1Bka0uq7AjyckdxReKPHLA0Q1qH8X/SNh0wn2t2X2Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.59.0.tgz", + "integrity": "sha512-fHnALZfbEnODczGk14Y/1YBRApp6UEpZUTexGcMUPzY7RDc7q4HN2Y6jh0KUG8Jo9B+q+wOoQEc3ziR0ErbuFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.59.0.tgz", + "integrity": "sha512-Fa38s1mHgoaLCT117sfJ6P78rtxUt93CYxBYpq1VOIcslaF+cH+1h5uikAPsKfxLnsuEDZHiBiaI6eNPTsQMRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.59.0.tgz", + "integrity": "sha512-NyNsRSqM2tF1MX7ZGw/j4rduoEJiQ5wfvbSo/CFVdEzYCjyxbGFRPOZyS/GETJG9rk1TdHOq8NZqKqk/u1fm4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.59.0.tgz", + "integrity": "sha512-nXBK2uygWtvbCOffMWqqfjjcEtp9enDKY5/2Pw/Hhw8VVaOyK2ThbGK04bNX/Le+qoK1VHYkodWGVTKfw0Otkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.59.0.tgz", + "integrity": "sha512-yb+4afX/zja8QwX0KmV4/ae2kyYkRknsE79CRusYS2U5D8qwn2wq0cn1x12f3tm3F3+5FgmDdbuGdQTuCLSKMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.59.0.tgz", + "integrity": "sha512-Lp52TmpA1QtNmdHzs505Xwf4tgII7RAapkDSF9AAtWIBETcGaTIaXci4Rd9nS6SdaWK1BWTSqAPp5wzh6UN3Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.59.0.tgz", + "integrity": "sha512-YYHLEs5rC6oRTFwT7bJaKBR9NSFzikeVHGAT1ffATmUQzR8XqyhHXjoieAUoR7fBU6I5cfy1FVeh5GoRgriuzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.96", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.96.tgz", + "integrity": "sha512-/FmCYo/H5rIywTLV/P6OYsr0rg/31vuc8jYq0QnkOZl6m7PWIs+h5oAnSTT2cqRhOsMaKqbXcdkka6tnZ1WiUA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.3.tgz", + "integrity": "sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.3.tgz", + "integrity": "sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.3.tgz", + "integrity": "sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.3.tgz", + "integrity": "sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.3.tgz", + "integrity": "sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.3.tgz", + "integrity": "sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.3.tgz", + "integrity": "sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.3.tgz", + "integrity": "sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.3.tgz", + "integrity": "sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.3.tgz", + "integrity": "sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.3.tgz", + "integrity": "sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.3.tgz", + "integrity": "sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.3.tgz", + "integrity": "sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.3.tgz", + "integrity": "sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.3.tgz", + "integrity": "sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.3.tgz", + "integrity": "sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.3.tgz", + "integrity": "sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.3.tgz", + "integrity": "sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.3.tgz", + "integrity": "sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.3.tgz", + "integrity": "sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.3.tgz", + "integrity": "sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.3.tgz", + "integrity": "sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.3.tgz", + "integrity": "sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.3.tgz", + "integrity": "sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.3.tgz", + "integrity": "sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.43.tgz", + "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.43", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz", + "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz", + "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.43", + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-ssr": "3.5.43", + "@vue/shared": "3.5.43", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.28", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz", + "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", + "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.10" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", + "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.10", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", + "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.43.tgz", + "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.43.tgz", + "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz", + "integrity": "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.43", + "@vue/runtime-core": "3.5.43", + "@vue/shared": "3.5.43", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.43.tgz", + "integrity": "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/shared": "3.5.43" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.59.0.tgz", + "integrity": "sha512-wUXzaeI7B526W4y1gFg3lcxgDZ67XSgRJIiellYWOas/pLpO7rOtxm9Gr2E/C8aiSDXIgx1q5TdSsvK67Uakqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.25.0", + "@algolia/client-abtesting": "5.59.0", + "@algolia/client-analytics": "5.59.0", + "@algolia/client-common": "5.59.0", + "@algolia/client-insights": "5.59.0", + "@algolia/client-personalization": "5.59.0", + "@algolia/client-query-suggestions": "5.59.0", + "@algolia/client-search": "5.59.0", + "@algolia/ingestion": "1.59.0", + "@algolia/monitoring": "1.59.0", + "@algolia/recommend": "5.59.0", + "@algolia/requester-browser-xhr": "5.59.0", + "@algolia/requester-fetch": "5.59.0", + "@algolia/requester-node-http": "5.59.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.1.0.tgz", + "integrity": "sha512-ufbM3smX/Jbnpk5wcQjzd1MgBpzmqfNETUAyZNrGwU9foRlyHoGzMMBBCRzEhQLBjZfFDE1W2ufPXX2vdWkV8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "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, + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.8", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.8.tgz", + "integrity": "sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.3.tgz", + "integrity": "sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.3", + "@rollup/rollup-android-arm64": "4.63.3", + "@rollup/rollup-darwin-arm64": "4.63.3", + "@rollup/rollup-darwin-x64": "4.63.3", + "@rollup/rollup-freebsd-arm64": "4.63.3", + "@rollup/rollup-freebsd-x64": "4.63.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.3", + "@rollup/rollup-linux-arm-musleabihf": "4.63.3", + "@rollup/rollup-linux-arm64-gnu": "4.63.3", + "@rollup/rollup-linux-arm64-musl": "4.63.3", + "@rollup/rollup-linux-loong64-gnu": "4.63.3", + "@rollup/rollup-linux-loong64-musl": "4.63.3", + "@rollup/rollup-linux-ppc64-gnu": "4.63.3", + "@rollup/rollup-linux-ppc64-musl": "4.63.3", + "@rollup/rollup-linux-riscv64-gnu": "4.63.3", + "@rollup/rollup-linux-riscv64-musl": "4.63.3", + "@rollup/rollup-linux-s390x-gnu": "4.63.3", + "@rollup/rollup-linux-x64-gnu": "4.63.3", + "@rollup/rollup-linux-x64-musl": "4.63.3", + "@rollup/rollup-openbsd-x64": "4.63.3", + "@rollup/rollup-openharmony-arm64": "4.63.3", + "@rollup/rollup-win32-arm64-msvc": "4.63.3", + "@rollup/rollup-win32-ia32-msvc": "4.63.3", + "@rollup/rollup-win32-x64-gnu": "4.63.3", + "@rollup/rollup-win32-x64-msvc": "4.63.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@types/node": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.1.tgz", + "integrity": "sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/vitepress/node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/vitepress/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitepress/node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/vitepress/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.43.tgz", + "integrity": "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-sfc": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/server-renderer": "3.5.43", + "@vue/shared": "3.5.43" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 5b6462a..426d750 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,10 @@ "test": "tsc -p tsconfig.test.json && node tests/helpers/prepare-obsidian-runtime.mjs && node --test build-tests/**/*.test.js", "lint": "eslint .", "test:e2e": "npm run build && python3 scripts/create_demo_vault.py --force && wdio run wdio.conf.mjs", - "test:e2e:debug": "npm run build && python3 scripts/create_demo_vault.py --force && wdio run wdio.conf.mjs --logLevel info" + "test:e2e:debug": "npm run build && python3 scripts/create_demo_vault.py --force && wdio run wdio.conf.mjs --logLevel info", + "docs:dev": "vitepress dev docs-site", + "docs:build": "vitepress build docs-site", + "docs:preview": "vitepress preview docs-site" }, "keywords": [], "license": "0BSD", @@ -35,6 +38,7 @@ "tslib": "2.4.0", "typescript": "^5.8.3", "typescript-eslint": "8.35.1", + "vitepress": "1.6.4", "webdriverio": "^9.27.2" }, "dependencies": {