summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSho Sakuma <me@m1sk9.dev>2026-03-05 21:41:21 +0900
committerGitHub <noreply@github.com>2026-03-05 21:41:21 +0900
commit0b59b262974167dfb89df1b16976f2e4c5b7f163 (patch)
tree03fb8c874b3d7d951e84511cdced216185579b7c
parentdf1fe4fa8e140dfdebe359605ff95a9ce8f1c203 (diff)
parent24734063e3c9ef2f30cac5537595f79c7a65f0cf (diff)
downloadLunaticChat-0b59b262974167dfb89df1b16976f2e4c5b7f163.tar.gz
LunaticChat-0b59b262974167dfb89df1b16976f2e4c5b7f163.tar.bz2
LunaticChat-0b59b262974167dfb89df1b16976f2e4c5b7f163.zip
Merge pull request #132 from m1sk9/docs/version-system
feat(docs): add version system with @viteplus/versions
-rw-r--r--.gitattributes1
-rw-r--r--docs/.vitepress/config.mts13
-rw-r--r--docs/.vitepress/config/en.ts1
-rw-r--r--docs/.vitepress/config/ja.ts1
-rw-r--r--docs/.vitepress/theme/Layout.vue14
-rw-r--r--docs/.vitepress/theme/VersionBanner.vue72
-rw-r--r--docs/.vitepress/theme/VersionSwitcher.vue249
-rw-r--r--docs/.vitepress/theme/custom.css21
-rw-r--r--docs/.vitepress/theme/index.ts12
-rw-r--r--docs/archive/v1/index.md23
-rw-r--r--docs/biome.jsonc7
-rw-r--r--docs/bun.lock63
-rw-r--r--docs/package.json1
-rw-r--r--docs/tsconfig.json12
14 files changed, 485 insertions, 5 deletions
diff --git a/.gitattributes b/.gitattributes
index 2f2bc30..e921901 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,3 +2,4 @@
x linguist-vendored=true
gradlew linguist-vendored=true
.github/scripts/post-test-results.sh linguist-vendored=true
+docs/.vitepress/theme/*.vue linguist-vendored=true
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts
index c96f8b6..a9c733a 100644
--- a/docs/.vitepress/config.mts
+++ b/docs/.vitepress/config.mts
@@ -1,8 +1,8 @@
-import { defineConfig } from 'vitepress';
+import { defineVersionedConfig } from '@viteplus/versions';
import { en } from './config/en';
import { ja } from './config/ja';
-export default defineConfig({
+export default defineVersionedConfig({
cleanUrls: true,
description: 'Next-generation channel chat plugin for Paper/Velocity',
head: [['link', { href: '/favicon.ico', rel: 'icon' }]],
@@ -20,7 +20,6 @@ export default defineConfig({
},
},
outDir: './dist',
- srcDir: './src',
themeConfig: {
socialLinks: [
{ icon: 'github', link: 'https://github.com/m1sk9/LunaticChat' },
@@ -28,7 +27,13 @@ export default defineConfig({
},
title: 'LunaticChat Docs',
titleTemplate: 'LunaticChat',
+ versionsConfig: {
+ current: 'v0 (1.21.x) - Latest',
+ sources: 'src',
+ archive: 'archive',
+ versionSwitcher: false,
+ },
vite: {
- publicDir: '../.vitepress/public',
+ publicDir: '.vitepress/public',
},
});
diff --git a/docs/.vitepress/config/en.ts b/docs/.vitepress/config/en.ts
index 6d2068d..6b1a18c 100644
--- a/docs/.vitepress/config/en.ts
+++ b/docs/.vitepress/config/en.ts
@@ -11,6 +11,7 @@ export const en: DefaultTheme.Config = {
nav: [
{ link: '/en/player-guide/getting-started', text: 'Player Guide' },
{ link: '/en/admin-guide/getting-started', text: 'Admin Guide' },
+ { component: 'VersionSwitcher' },
],
sidebar: {
'/en/admin-guide/': [
diff --git a/docs/.vitepress/config/ja.ts b/docs/.vitepress/config/ja.ts
index ee4a03c..857c951 100644
--- a/docs/.vitepress/config/ja.ts
+++ b/docs/.vitepress/config/ja.ts
@@ -11,6 +11,7 @@ export const ja: DefaultTheme.Config = {
nav: [
{ link: '/player-guide/getting-started', text: 'プレイヤーガイド' },
{ link: '/admin-guide/getting-started', text: '管理者ガイド' },
+ { component: 'VersionSwitcher' },
],
sidebar: {
'/admin-guide/': [
diff --git a/docs/.vitepress/theme/Layout.vue b/docs/.vitepress/theme/Layout.vue
new file mode 100644
index 0000000..9a2b4ae
--- /dev/null
+++ b/docs/.vitepress/theme/Layout.vue
@@ -0,0 +1,14 @@
+<script setup lang="ts">
+import DefaultTheme from 'vitepress/theme';
+import VersionBanner from './VersionBanner.vue';
+
+const { Layout } = DefaultTheme;
+</script>
+
+<template>
+ <Layout>
+ <template #layout-top>
+ <VersionBanner />
+ </template>
+ </Layout>
+</template>
diff --git a/docs/.vitepress/theme/VersionBanner.vue b/docs/.vitepress/theme/VersionBanner.vue
new file mode 100644
index 0000000..68347d0
--- /dev/null
+++ b/docs/.vitepress/theme/VersionBanner.vue
@@ -0,0 +1,72 @@
+<script setup lang="ts">
+import { ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue';
+import { useRoute, inBrowser } from 'vitepress';
+
+const route = useRoute();
+const bannerRef = ref<HTMLElement | null>(null);
+
+const isNonDefaultVersion = computed(() => {
+ const path = route.path;
+ return /^\/(en\/)?v\d+\//.test(path) || /^\/(en\/)?v\d+$/.test(path);
+});
+
+const versionLabel = computed(() => {
+ const match = route.path.match(/\/v(\d+)/);
+ return match ? `v${match[1]}` : '';
+});
+
+const isJapanese = computed(() => {
+ return !route.path.startsWith('/en/');
+});
+
+function updateLayoutTopHeight() {
+ if (!inBrowser || !bannerRef.value) return;
+ const height = bannerRef.value.getBoundingClientRect().height;
+ if (height > 0) {
+ document.documentElement.style.setProperty('--vp-layout-top-height', `${height}px`);
+ } else {
+ document.documentElement.style.removeProperty('--vp-layout-top-height');
+ }
+}
+
+function updateBannerClass(show: boolean) {
+ if (!inBrowser) return;
+ if (show) {
+ document.documentElement.classList.add('has-version-banner');
+ nextTick(updateLayoutTopHeight);
+ } else {
+ document.documentElement.classList.remove('has-version-banner');
+ document.documentElement.style.removeProperty('--vp-layout-top-height');
+ }
+}
+
+let resizeObserver: ResizeObserver | null = null;
+
+onMounted(() => {
+ updateBannerClass(isNonDefaultVersion.value);
+ watch(isNonDefaultVersion, (val) => updateBannerClass(val));
+
+ if (bannerRef.value) {
+ resizeObserver = new ResizeObserver(updateLayoutTopHeight);
+ resizeObserver.observe(bannerRef.value);
+ }
+});
+
+onUnmounted(() => {
+ resizeObserver?.disconnect();
+ updateBannerClass(false);
+});
+</script>
+
+<template>
+ <div v-if="isNonDefaultVersion" ref="bannerRef" class="version-banner">
+ <span v-if="isJapanese">
+ このドキュメントは <strong>{{ versionLabel }}</strong>
+ 版です。最新の安定版ではありません。
+ </span>
+ <span v-else>
+ You are viewing the <strong>{{ versionLabel }}</strong> documentation.
+ This is not the latest stable version.
+ </span>
+ </div>
+</template>
diff --git a/docs/.vitepress/theme/VersionSwitcher.vue b/docs/.vitepress/theme/VersionSwitcher.vue
new file mode 100644
index 0000000..e534426
--- /dev/null
+++ b/docs/.vitepress/theme/VersionSwitcher.vue
@@ -0,0 +1,249 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+import { useData, useRouter } from 'vitepress';
+import VPFlyout from 'vitepress/dist/client/theme-default/components/VPFlyout.vue';
+import VPMenuLink from 'vitepress/dist/client/theme-default/components/VPMenuLink.vue';
+
+/**
+ * Mapping from archive folder names to display labels.
+ * Update this when adding new versions.
+ */
+const versionLabels: Record<string, string> = {
+ v1: 'v1 (26.1) - Next',
+};
+
+interface VersioningPlugin {
+ versions: Set<string>;
+ currentVersion: string;
+}
+
+interface Props {
+ versioningPlugin: VersioningPlugin;
+ screenMenu?: boolean;
+}
+
+interface VersionMenuItem {
+ text: string;
+ link: string;
+}
+
+const props = defineProps<Props>();
+const router = useRouter();
+const { site } = useData();
+const isOpen = ref(false);
+
+const versionSet = computed(() => new Set([...props.versioningPlugin.versions]));
+const hasVersions = computed(() => versionSet.value.size > 0);
+
+const currentLocale = computed(
+ () => site.value.locales[site.value.localeIndex]?.link?.replace(/\//g, '') || '',
+);
+
+const pathSegments = computed(() =>
+ router.route.path.replace(/^\/|\/$/g, '').split('/'),
+);
+
+const activeVersion = computed(() => {
+ const { currentVersion } = props.versioningPlugin;
+ const segments = pathSegments.value;
+ const locale = currentLocale.value;
+ const versionCandidate = segments[0] === locale ? segments[1] : segments[0];
+ return versionSet.value.has(versionCandidate) ? versionCandidate : currentVersion;
+});
+
+const activeVersionLabel = computed(
+ () => versionLabels[activeVersion.value] ?? activeVersion.value,
+);
+
+const availableVersions = computed(() =>
+ Array.from(props.versioningPlugin.versions).filter((v) => v !== activeVersion.value),
+);
+
+const shouldShowCurrentVersion = computed(
+ () => activeVersion.value !== props.versioningPlugin.currentVersion,
+);
+
+function isLocaleFirst(segments: string[]): boolean {
+ return segments[0] === currentLocale.value;
+}
+
+function removeVersionSegments(segments: string[]): string[] {
+ return segments.filter((seg) => !versionSet.value.has(seg));
+}
+
+function buildVersionPath(version: string): string {
+ const { currentVersion } = props.versioningPlugin;
+ const baseSegments = removeVersionSegments(pathSegments.value);
+ const hasLocale = isLocaleFirst(baseSegments);
+
+ let newSegments: string[];
+
+ if (version === currentVersion) {
+ newSegments = baseSegments;
+ } else if (hasLocale) {
+ newSegments = [baseSegments[0], version, ...baseSegments.slice(1)];
+ } else {
+ newSegments = [version, ...baseSegments];
+ }
+
+ return `/${newSegments.join('/')}`;
+}
+
+function label(version: string): string {
+ return versionLabels[version] ?? version;
+}
+
+function createVersionMenuItem(version: string): VersionMenuItem {
+ return {
+ text: label(version),
+ link: buildVersionPath(version),
+ };
+}
+
+function toggle(): void {
+ isOpen.value = !isOpen.value;
+}
+</script>
+
+<template>
+ <template v-if="hasVersions">
+ <!-- Desktop flyout -->
+ <VPFlyout
+ v-if="!screenMenu"
+ class="VPVersionSwitcher"
+ icon="vpi-versioning"
+ :button="activeVersionLabel"
+ label="Switch Version"
+ >
+ <div class="items">
+ <VPMenuLink
+ v-if="shouldShowCurrentVersion"
+ :item="createVersionMenuItem(versioningPlugin.currentVersion)"
+ />
+ <VPMenuLink
+ v-for="version in availableVersions"
+ :key="version"
+ :item="createVersionMenuItem(version)"
+ />
+ </div>
+ </VPFlyout>
+
+ <!-- Mobile dropdown -->
+ <div v-else class="VPScreenVersionSwitcher" :class="{ open: isOpen }">
+ <button
+ class="button"
+ type="button"
+ aria-controls="navbar-group-version"
+ :aria-expanded="isOpen"
+ @click="toggle"
+ >
+ <span class="button-text">
+ <span class="vpi-versioning icon" />
+ Switch Version
+ </span>
+ <span class="vpi-plus button-icon" />
+ </button>
+
+ <div id="navbar-group-version" class="items">
+ <VPMenuLink :item="createVersionMenuItem(versioningPlugin.currentVersion)" />
+ <VPMenuLink
+ v-for="version in versioningPlugin.versions"
+ :key="version"
+ :item="createVersionMenuItem(version)"
+ />
+ </div>
+ </div>
+ </template>
+</template>
+
+<style>
+.vpi-versioning.option-icon {
+ margin-right: 2px !important;
+}
+
+.vpi-versioning {
+ --icon: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZS13aWR0aD0iMi4yIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNvbG9yPSIjMDAwMDAwIj48cGF0aCBkPSJNMTcgN0MxOC4xMDQ2IDcgMTkgNi4xMDQ1NyAxOSA1QzE5IDMuODk1NDMgMTguMTA0NiAzIDE3IDNDMTUuODk1NCAzIDE1IDMuODk1NDMgMTUgNUMxNSA2LjEwNDU3IDE1Ljg5NTQgNyAxNyA3WiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+PHBhdGggZD0iTTcgN0M4LjEwNDU3IDcgOSA2LjEwNDU3IDkgNUM5IDMuODk1NDMgOC4xMDQ1NyAzIDcgM0M1Ljg5NTQzIDMgNSAzLjg5NTQzIDUgNUM1IDYuMTA0NTcgNS44OTU0MyA3IDcgN1oiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PC9wYXRoPjxwYXRoIGQ9Ik03IDIxQzguMTA0NTcgMjEgOSAyMC4xMDQ2IDkgMTlDOSAxNy44OTU0IDguMTA0NTcgMTcgNyAxN0M1Ljg5NTQzIDE3IDUgMTcuODk1NCA1IDE5QzUgMjAuMTA0NiA1Ljg5NTQzIDIxIDcgMjFaIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD48cGF0aCBkPSJNNyA3VjE3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD48cGF0aCBkPSJNMTcgN1Y4QzE3IDEwLjUgMTUgMTEgMTUgMTFMOSAxM0M5IDEzIDcgMTMuNSA3IDE2VjE3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD48L3N2Zz4=");
+}
+</style>
+
+<style scoped>
+.VPVersionSwitcher {
+ display: flex;
+ align-items: center;
+}
+
+.icon {
+ padding: 8px;
+}
+
+.title {
+ padding: 0 24px 0 12px;
+ line-height: 32px;
+ font-size: 14px;
+ font-weight: 700;
+ color: var(--vp-c-text-1);
+}
+
+.VPScreenVersionSwitcher {
+ border-bottom: 1px solid var(--vp-c-divider);
+ height: 48px;
+ overflow: hidden;
+ transition: border-color 0.5s;
+}
+
+.VPScreenVersionSwitcher .items {
+ visibility: hidden;
+}
+
+.VPScreenVersionSwitcher.open {
+ padding-bottom: 10px;
+ height: auto;
+}
+
+.VPScreenVersionSwitcher.open .items {
+ visibility: visible;
+}
+
+.VPScreenVersionSwitcher.open .button {
+ padding-bottom: 6px;
+ color: var(--vp-c-brand-1);
+}
+
+.VPScreenVersionSwitcher.open .button-icon {
+ transform: rotate(45deg);
+}
+
+.VPScreenVersionSwitcher button .icon {
+ margin-right: 8px;
+}
+
+.button {
+ 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:hover {
+ color: var(--vp-c-brand-1);
+}
+
+.button-icon {
+ transition: transform 0.25s;
+}
+
+.group:first-child {
+ padding-top: 0;
+}
+
+.group + .group,
+.group + .item {
+ padding-top: 4px;
+}
+</style>
diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css
new file mode 100644
index 0000000..a4ebd52
--- /dev/null
+++ b/docs/.vitepress/theme/custom.css
@@ -0,0 +1,21 @@
+.version-banner {
+ display: block;
+ padding: 12px 16px;
+ background-color: var(--vp-c-warning-soft);
+ color: var(--vp-c-warning-1);
+ text-align: center;
+ font-size: 14px;
+ line-height: 1.6;
+ border-bottom: 1px solid var(--vp-c-warning-2);
+}
+
+@media (min-width: 960px) {
+ .version-banner {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 30;
+ padding: 12px 24px;
+ }
+}
diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts
new file mode 100644
index 0000000..26c6640
--- /dev/null
+++ b/docs/.vitepress/theme/index.ts
@@ -0,0 +1,12 @@
+import DefaultTheme from 'vitepress/theme';
+import Layout from './Layout.vue';
+import VersionSwitcher from './VersionSwitcher.vue';
+import './custom.css';
+
+export default {
+ extends: DefaultTheme,
+ Layout,
+ enhanceApp({ app }) {
+ app.component('VersionSwitcher', VersionSwitcher);
+ },
+};
diff --git a/docs/archive/v1/index.md b/docs/archive/v1/index.md
new file mode 100644
index 0000000..51834ed
--- /dev/null
+++ b/docs/archive/v1/index.md
@@ -0,0 +1,23 @@
+---
+# https://vitepress.dev/reference/default-theme-home-page
+layout: home
+
+hero:
+ name: 'LunaticChat'
+ tagline: A next-generation chat plugin for Paper, Folia and Velocity.
+ actions:
+ - theme: alt
+ text: GitHub
+ link: https://github.com/m1sk9/LunaticChat
+ image:
+ src: /icon.png
+ alt: LunaticChat Logo
+---
+
+::: warning
+
+このドキュメントは現在編集中です.現行安定版のドキュメントではありません.
+
+現行のバージョンについては [こちら](/) をご覧ください.
+
+:::
diff --git a/docs/biome.jsonc b/docs/biome.jsonc
index 226f67b..1a8593a 100644
--- a/docs/biome.jsonc
+++ b/docs/biome.jsonc
@@ -2,7 +2,12 @@
"$schema": "https://biomejs.dev/schemas/2.4.5/schema.json",
"files": {
"ignoreUnknown": true,
- "includes": [".vitepress/config.mts", "biome.jsonc", ".vitepress/config/**"]
+ "includes": [
+ ".vitepress/config.mts",
+ "biome.jsonc",
+ ".vitepress/config/**",
+ ".vitepress/theme/*.ts"
+ ]
},
"formatter": {
"enabled": true,
diff --git a/docs/bun.lock b/docs/bun.lock
index 063c7b9..66259ee 100644
--- a/docs/bun.lock
+++ b/docs/bun.lock
@@ -4,6 +4,7 @@
"workspaces": {
"": {
"dependencies": {
+ "@viteplus/versions": "^2.0.6",
"wrangler": "^4.69.0",
},
"devDependencies": {
@@ -98,6 +99,8 @@
"@docsearch/react": ["@docsearch/react@3.8.2", "", { "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" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="],
+ "@docsearch/sidepanel-js": ["@docsearch/sidepanel-js@4.6.0", "", {}, "sha512-lFT5KLwlzUmpoGArCScNoK41l9a22JYsEPwBzMrz+/ILVR5Ax87UphCuiyDFQWEvEmbwzn/kJx5W/O5BUlN1Rw=="],
+
"@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],
@@ -218,6 +221,10 @@
"@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="],
+ "@remotex-labs/xansi": ["@remotex-labs/xansi@1.3.3", "", {}, "sha512-P5qKSYLA5508Wt/lh4gUsGW7VO30hL6alswS713WnrYzo5xGknG2O5OddD1Ae/dRzP8e0H1rBJuf1v1ztu3IFQ=="],
+
+ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.2", "", {}, "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw=="],
+
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="],
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="],
@@ -308,6 +315,8 @@
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="],
+ "@viteplus/versions": ["@viteplus/versions@2.0.6", "", { "dependencies": { "@remotex-labs/xansi": "^1.3.3", "vitepress": "^2.0.0-alpha.12" } }, "sha512-13XNud+sCGTOs1L6Z0Ru7TxwkYmTknGSm/KU7/5wXR7vwMPqaPByC/A4H6R2R3aF8uK4Y1Y9bXyBQYJyYc3/Cw=="],
+
"@vue/compiler-core": ["@vue/compiler-core@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw=="],
"@vue/compiler-dom": ["@vue/compiler-dom@3.5.29", "", { "dependencies": { "@vue/compiler-core": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg=="],
@@ -376,6 +385,8 @@
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
"focus-trap": ["focus-trap@7.8.0", "", { "dependencies": { "tabbable": "^6.4.0" } }, "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
@@ -418,6 +429,8 @@
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+ "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
+
"oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="],
"path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
@@ -428,6 +441,8 @@
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
"preact": ["preact@10.28.4", "", {}, "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ=="],
@@ -466,6 +481,8 @@
"tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="],
+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
@@ -506,8 +523,32 @@
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+ "@viteplus/versions/vitepress": ["vitepress@2.0.0-alpha.16", "", { "dependencies": { "@docsearch/css": "^4.5.3", "@docsearch/js": "^4.5.3", "@docsearch/sidepanel-js": "^4.5.3", "@iconify-json/simple-icons": "^1.2.68", "@shikijs/core": "^3.21.0", "@shikijs/transformers": "^3.21.0", "@shikijs/types": "^3.21.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^6.0.3", "@vue/devtools-api": "^8.0.5", "@vue/shared": "^3.5.27", "@vueuse/core": "^14.1.0", "@vueuse/integrations": "^14.1.0", "focus-trap": "^7.8.0", "mark.js": "8.11.1", "minisearch": "^7.2.0", "shiki": "^3.21.0", "vite": "^7.3.1", "vue": "^3.5.27" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "oxc-minify": "*", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "oxc-minify", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-w1nwsefDVIsje7BZr2tsKxkZutDGjG0YoQ2yxO7+a9tvYVqfljYbwj5LMYkPy8Tb7YbPwa22HtIhk62jbrvuEQ=="],
+
"vite/esbuild": ["esbuild@0.21.5", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
+ "@viteplus/versions/vitepress/@docsearch/css": ["@docsearch/css@4.6.0", "", {}, "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ=="],
+
+ "@viteplus/versions/vitepress/@docsearch/js": ["@docsearch/js@4.6.0", "", {}, "sha512-9/rbgkm/BgTq46cwxIohvSAz3koOFjnPpg0mwkJItAfzKbQIj+310PvwtgUY1YITDuGCag6yOL50GW2DBkaaBw=="],
+
+ "@viteplus/versions/vitepress/@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="],
+
+ "@viteplus/versions/vitepress/@shikijs/transformers": ["@shikijs/transformers@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/types": "3.23.0" } }, "sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ=="],
+
+ "@viteplus/versions/vitepress/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="],
+
+ "@viteplus/versions/vitepress/@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.4", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.2" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "vue": "^3.2.25" } }, "sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ=="],
+
+ "@viteplus/versions/vitepress/@vue/devtools-api": ["@vue/devtools-api@8.0.7", "", { "dependencies": { "@vue/devtools-kit": "^8.0.7" } }, "sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA=="],
+
+ "@viteplus/versions/vitepress/@vueuse/core": ["@vueuse/core@14.2.1", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "14.2.1", "@vueuse/shared": "14.2.1" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ=="],
+
+ "@viteplus/versions/vitepress/@vueuse/integrations": ["@vueuse/integrations@14.2.1", "", { "dependencies": { "@vueuse/core": "14.2.1", "@vueuse/shared": "14.2.1" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7 || ^8", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7 || ^8", "vue": "^3.5.0" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA=="],
+
+ "@viteplus/versions/vitepress/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="],
+
+ "@viteplus/versions/vitepress/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="],
+
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
@@ -553,5 +594,27 @@
"vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="],
"vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
+
+ "@viteplus/versions/vitepress/@vue/devtools-api/@vue/devtools-kit": ["@vue/devtools-kit@8.0.7", "", { "dependencies": { "@vue/devtools-shared": "^8.0.7", "birpc": "^2.6.1", "hookable": "^5.5.3", "perfect-debounce": "^2.0.0" } }, "sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw=="],
+
+ "@viteplus/versions/vitepress/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@14.2.1", "", {}, "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw=="],
+
+ "@viteplus/versions/vitepress/@vueuse/core/@vueuse/shared": ["@vueuse/shared@14.2.1", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw=="],
+
+ "@viteplus/versions/vitepress/@vueuse/integrations/@vueuse/shared": ["@vueuse/shared@14.2.1", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw=="],
+
+ "@viteplus/versions/vitepress/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="],
+
+ "@viteplus/versions/vitepress/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="],
+
+ "@viteplus/versions/vitepress/shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="],
+
+ "@viteplus/versions/vitepress/shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="],
+
+ "@viteplus/versions/vitepress/@vue/devtools-api/@vue/devtools-kit/@vue/devtools-shared": ["@vue/devtools-shared@8.0.7", "", {}, "sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA=="],
+
+ "@viteplus/versions/vitepress/@vue/devtools-api/@vue/devtools-kit/perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="],
+
+ "@viteplus/versions/vitepress/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
}
}
diff --git a/docs/package.json b/docs/package.json
index 783a0fe..422955d 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -16,6 +16,7 @@
"vitepress": "^1.6.4"
},
"dependencies": {
+ "@viteplus/versions": "^2.0.6",
"wrangler": "^4.69.0"
}
}
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
new file mode 100644
index 0000000..5f61eef
--- /dev/null
+++ b/docs/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "lib": ["ESNext", "DOM", "DOM.Iterable"],
+ "strict": true,
+ "jsx": "preserve",
+ "skipLibCheck": true
+ },
+ "include": [".vitepress/**/*.ts", ".vitepress/**/*.mts", ".vitepress/**/*.vue"]
+}