diff --git a/.gitignore b/.gitignore index 3c252d2..c048d6b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ frontend/dist frontend/node_modules build/linux/appimage/build build/windows/nsis/MicrosoftEdgeWebview2Setup.exe -.idea \ No newline at end of file +.idea +frontend/docs/.vitepress/cache +frontend/docs/.vuepress/dist \ No newline at end of file diff --git a/build/darwin/icons.icns b/build/darwin/icons.icns index b6e669a..e69de29 100644 Binary files a/build/darwin/icons.icns and b/build/darwin/icons.icns differ diff --git a/build/linux/appimage/appicon.png b/build/linux/appimage/appicon.png index 613d223..e69de29 100644 Binary files a/build/linux/appimage/appicon.png and b/build/linux/appimage/appicon.png differ diff --git a/build/windows/Taskfile.yml b/build/windows/Taskfile.yml index d694f4f..c9f96e0 100644 --- a/build/windows/Taskfile.yml +++ b/build/windows/Taskfile.yml @@ -39,7 +39,7 @@ tasks: summary: Generates Windows `.syso` file dir: build cmds: - - wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso + - wails3 generate syso -arch {{.ARCH}} -icon windows/favicon_256x256.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso vars: ARCH: '{{.ARCH | default ARCH}}' diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 184f1a3..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -voidraft.landaiqing.cn \ No newline at end of file diff --git a/docs/changelog.html b/docs/changelog.html deleted file mode 100644 index 1fecec5..0000000 --- a/docs/changelog.html +++ /dev/null @@ -1,75 +0,0 @@ - - -
- - -Loading releases...
-
- An elegant text snippet recording tool
-Designed for developers to record, organize, and manage various text snippets anytime, anywhere.
-Multi-language code blocks with syntax highlighting for 30+ programming languages
-Built-in Prettier support for one-click code beautification
-Dark/Light themes with full customization options
-Edit multiple documents simultaneously
-Split content into independent code blocks with different language settings
-Rainbow brackets, VSCode-style search, color picker, translation tool, and more
--function createDocument() { - const doc = new Document(); - - doc.addCodeBlock('javascript', ` - function greeting(name) { - return `Hello, ${name}!`; - } - - console.log(greeting('World')); - `); - - return doc; -}-
-// voidraft - An elegant text snippet recording tool -// Multi-language support | Code formatting | Custom themes -// A modern text editor designed for developers-
-
- $1'); - markdown = markdown.replace(/>\s*(.*?)(?=>|$)/g, '
$1'); - - // 链接 - [text](url) - markdown = markdown.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1'); - - // 标题 - # Heading - markdown = markdown.replace(/^### (.*?)(?=___LINE_BREAK___|$)/gm, '
$1');
-
- // 行内代码 - `code`
- markdown = markdown.replace(/`([^`]+)`/g, '$1');
-
- // 处理列表项
- // 先将每个列表项转换为HTML
- markdown = markdown.replace(/- (.*?)(?=___LINE_BREAK___- |___LINE_BREAK___$|$)/g, ''); - - // 包装在段落标签中 - if (!markdown.startsWith('
')) { - markdown = `
${markdown}
`; - } - - return markdown; - } -} - -/** - * 更新日志主应用类 - */ -class ChangelogApp { - constructor() { - this.repositoryConfig = new RepositoryConfig(); - this.i18nMessages = new I18nMessages(); - this.apiClient = new APIClient(this.repositoryConfig, this.i18nMessages); - this.uiManager = new UIManager(this.i18nMessages); - - this.init(); - } - - /** - * 初始化应用 - */ - init() { - this.uiManager.showLoading(); - - // 首先尝试GitHub API - this.apiClient.fetchReleases('github') - .then(releases => { - this.uiManager.displayReleases(releases, 'github'); - }) - .catch(() => { - // GitHub失败时尝试Gitea - return this.apiClient.fetchReleases('gitea') - .then(releases => { - this.uiManager.displayReleases(releases, 'gitea'); - }); - }) - .catch(error => { - console.error('获取发布信息失败:', error); - this.uiManager.showError(this.i18nMessages.getMessage('fetchError', this.i18nMessages.getCurrentLang())); - }); - - // 监听语言变化事件 - document.addEventListener('languageChanged', () => this.updateUI()); - } - - /** - * 更新UI元素(当语言变化时) - */ - updateUI() { - const elementsToUpdate = document.querySelectorAll('[data-en][data-zh]'); - const currentLang = this.i18nMessages.getCurrentLang(); - - elementsToUpdate.forEach(element => { - const text = element.getAttribute(`data-${currentLang}`); - if (text) { - element.textContent = text; - } - }); - } -} - -// 当DOM加载完成时初始化应用 -document.addEventListener('DOMContentLoaded', () => { - new ChangelogApp(); -}); \ No newline at end of file diff --git a/docs/js/script.js b/docs/js/script.js deleted file mode 100644 index 47b792f..0000000 --- a/docs/js/script.js +++ /dev/null @@ -1,443 +0,0 @@ -/** - * voidraft - Website Script - */ - -/** - * 主题管理类 - */ -class ThemeManager { - constructor() { - this.themeToggle = document.getElementById('theme-toggle'); - this.currentTheme = this.getInitialTheme(); - this.init(); - } - - /** - * 获取初始主题 - */ - getInitialTheme() { - const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)'); - const savedTheme = localStorage.getItem('theme'); - return savedTheme || (prefersDarkScheme.matches ? 'dark' : 'light'); - } - - /** - * 初始化主题管理器 - */ - init() { - if (!this.themeToggle) return; - - this.setTheme(this.currentTheme); - this.bindEvents(); - } - - /** - * 绑定事件 - */ - bindEvents() { - this.themeToggle.addEventListener('click', () => { - this.toggleTheme(); - }); - } - - /** - * 切换主题 - */ - toggleTheme() { - document.body.classList.add('theme-transition'); - - const newTheme = this.currentTheme === 'dark' ? 'light' : 'dark'; - this.setTheme(newTheme); - this.saveTheme(newTheme); - - setTimeout(() => document.body.classList.remove('theme-transition'), 300); - } - - /** - * 设置主题 - * @param {string} theme - 'dark' 或 'light' - */ - setTheme(theme) { - this.currentTheme = theme; - const isDark = theme === 'dark'; - - document.body.classList.toggle('theme-dark', isDark); - document.body.classList.toggle('theme-light', !isDark); - - this.updateToggleIcon(isDark); - } - - /** - * 更新切换按钮图标 - * @param {boolean} isDark - 是否为暗色主题 - */ - updateToggleIcon(isDark) { - if (this.themeToggle) { - const icon = this.themeToggle.querySelector('i'); - if (icon) { - icon.className = isDark ? 'fas fa-sun' : 'fas fa-moon'; - } - } - } - - /** - * 保存主题到本地存储 - * @param {string} theme - 主题名称 - */ - saveTheme(theme) { - localStorage.setItem('theme', theme); - } -} - -/** - * 语言管理类 - */ -class LanguageManager { - constructor() { - this.langToggle = document.getElementById('lang-toggle'); - this.currentLang = this.getInitialLanguage(); - this.init(); - } - - /** - * 获取初始语言 - */ - getInitialLanguage() { - const urlParams = new URLSearchParams(window.location.search); - const urlLang = urlParams.get('lang'); - const savedLang = localStorage.getItem('lang'); - const browserLang = navigator.language.startsWith('zh') ? 'zh' : 'en'; - return urlLang || savedLang || browserLang; - } - - /** - * 初始化语言管理器 - */ - init() { - if (!this.langToggle) return; - - window.currentLang = this.currentLang; - this.setLanguage(this.currentLang); - this.bindEvents(); - } - - /** - * 绑定事件 - */ - bindEvents() { - this.langToggle.addEventListener('click', () => { - this.toggleLanguage(); - }); - } - - /** - * 切换语言 - */ - toggleLanguage() { - document.body.classList.add('lang-transition'); - - const newLang = this.currentLang === 'zh' ? 'en' : 'zh'; - this.setLanguage(newLang); - this.saveLanguage(newLang); - this.updateURL(newLang); - this.notifyLanguageChange(newLang); - - setTimeout(() => document.body.classList.remove('lang-transition'), 300); - } - - /** - * 设置页面语言 - * @param {string} lang - 'zh' 或 'en' - */ - setLanguage(lang) { - this.currentLang = lang; - window.currentLang = lang; - - this.updatePageElements(lang); - this.updateHTMLLang(lang); - this.updateToggleButton(lang); - } - - /** - * 更新页面元素文本 - * @param {string} lang - 语言代码 - */ - updatePageElements(lang) { - document.querySelectorAll('[data-zh][data-en]').forEach(el => { - el.textContent = el.getAttribute(`data-${lang}`); - }); - } - - /** - * 更新HTML语言属性 - * @param {string} lang - 语言代码 - */ - updateHTMLLang(lang) { - document.documentElement.lang = lang === 'zh' ? 'zh-CN' : 'en'; - } - - /** - * 更新切换按钮文本 - * @param {string} lang - 语言代码 - */ - updateToggleButton(lang) { - if (this.langToggle) { - const text = lang === 'zh' ? 'EN/中' : '中/EN'; - this.langToggle.innerHTML = ` ${text}`; - } - } - - /** - * 保存语言到本地存储 - * @param {string} lang - 语言代码 - */ - saveLanguage(lang) { - localStorage.setItem('lang', lang); - } - - /** - * 更新URL参数 - * @param {string} lang - 语言代码 - */ - updateURL(lang) { - const newUrl = new URL(window.location); - if (lang === 'zh') { - newUrl.searchParams.set('lang', 'zh'); - } else { - newUrl.searchParams.delete('lang'); - } - window.history.replaceState({}, '', newUrl); - } - - /** - * 通知语言变更 - * @param {string} lang - 语言代码 - */ - notifyLanguageChange(lang) { - window.dispatchEvent(new CustomEvent('languageChanged', { detail: { lang } })); - } - - /** - * 获取当前语言 - */ - getCurrentLanguage() { - return this.currentLang; - } -} - -/** - * SEO管理类 - */ -class SEOManager { - constructor(languageManager) { - this.languageManager = languageManager; - this.metaTexts = { - en: { - description: 'voidraft is an elegant text snippet recording tool designed for developers. Features multi-language code blocks, syntax highlighting, code formatting, custom themes, and more.', - title: 'voidraft - An elegant text snippet recording tool designed for developers.', - ogTitle: 'voidraft - An elegant text snippet recording tool designed for developers' - }, - zh: { - description: 'voidraft 是专为开发者打造的优雅文本片段记录工具。支持多语言代码块、语法高亮、代码格式化、自定义主题等功能。', - title: 'voidraft - 专为开发者打造的优雅文本片段记录工具', - ogTitle: 'voidraft - 专为开发者打造的优雅文本片段记录工具' - } - }; - this.init(); - } - - /** - * 初始化SEO管理器 - */ - init() { - this.bindEvents(); - this.updateMetaTags(this.languageManager.getCurrentLanguage()); - } - - /** - * 绑定事件 - */ - bindEvents() { - window.addEventListener('languageChanged', (event) => { - this.updateMetaTags(event.detail.lang); - }); - } - - /** - * 更新SEO元标签 - * @param {string} lang - 当前语言 - */ - updateMetaTags(lang) { - const texts = this.metaTexts[lang]; - - this.updateMetaDescription(texts.description); - this.updateOpenGraphTags(texts.ogTitle, texts.description); - this.updateTwitterCardTags(texts.ogTitle, texts.description); - this.updatePageTitle(texts.title); - } - - /** - * 更新meta描述 - * @param {string} description - 描述文本 - */ - updateMetaDescription(description) { - const metaDesc = document.querySelector('meta[name="description"]'); - if (metaDesc) { - metaDesc.content = description; - } - } - - /** - * 更新Open Graph标签 - * @param {string} title - 标题 - * @param {string} description - 描述 - */ - updateOpenGraphTags(title, description) { - const ogTitle = document.querySelector('meta[property="og:title"]'); - const ogDesc = document.querySelector('meta[property="og:description"]'); - - if (ogTitle) ogTitle.content = title; - if (ogDesc) ogDesc.content = description; - } - - /** - * 更新Twitter Card标签 - * @param {string} title - 标题 - * @param {string} description - 描述 - */ - updateTwitterCardTags(title, description) { - const twitterTitle = document.querySelector('meta[property="twitter:title"]'); - const twitterDesc = document.querySelector('meta[property="twitter:description"]'); - - if (twitterTitle) twitterTitle.content = title; - if (twitterDesc) twitterDesc.content = description; - } - - /** - * 更新页面标题 - * @param {string} title - 标题 - */ - updatePageTitle(title) { - document.title = title; - } -} - -/** - * UI效果管理类 - */ -class UIEffects { - constructor() { - this.init(); - } - - /** - * 初始化UI效果 - */ - init() { - this.initCardEffects(); - } - - /** - * 初始化卡片悬停效果 - */ - initCardEffects() { - const cards = document.querySelectorAll('.feature-card'); - - cards.forEach(card => { - card.addEventListener('mouseenter', () => { - this.animateCardHover(card, true); - }); - - card.addEventListener('mouseleave', () => { - this.animateCardHover(card, false); - }); - }); - } - - /** - * 卡片悬停动画 - * @param {Element} card - 卡片元素 - * @param {boolean} isHover - 是否悬停 - */ - animateCardHover(card, isHover) { - if (isHover) { - card.style.transform = 'translateY(-8px)'; - card.style.boxShadow = '7px 7px 0 var(--shadow-color)'; - } else { - card.style.transform = 'translateY(0)'; - card.style.boxShadow = '5px 5px 0 var(--shadow-color)'; - } - } -} - -/** - * voidraft主应用类 - */ -class voidraftApp { - constructor() { - this.themeManager = null; - this.languageManager = null; - this.seoManager = null; - this.uiEffects = null; - this.init(); - } - - /** - * 初始化应用 - */ - init() { - this.initializeManagers(); - this.showConsoleBranding(); - } - - /** - * 初始化各个管理器 - */ - initializeManagers() { - this.themeManager = new ThemeManager(); - this.languageManager = new LanguageManager(); - this.seoManager = new SEOManager(this.languageManager); - this.uiEffects = new UIEffects(); - } - - /** - * 显示控制台品牌信息 - */ - showConsoleBranding() { - console.log('%c voidraft', 'color: #ff006e; font-size: 20px; font-family: "Space Mono", monospace;'); - console.log('%c An elegant text snippet recording tool designed for developers.', 'color: #073B4C; font-family: "Space Mono", monospace;'); - } - - /** - * 获取主题管理器 - */ - getThemeManager() { - return this.themeManager; - } - - /** - * 获取语言管理器 - */ - getLanguageManager() { - return this.languageManager; - } - - /** - * 获取SEO管理器 - */ - getSEOManager() { - return this.seoManager; - } - - /** - * 获取UI效果管理器 - */ - getUIEffects() { - return this.uiEffects; - } -} - -// 当DOM加载完成时初始化应用 -document.addEventListener('DOMContentLoaded', () => { - window.voidRaftApp = new voidraftApp(); -}); \ No newline at end of file diff --git a/frontend/docs/.vitepress/config.ts b/frontend/docs/.vitepress/config.ts new file mode 100644 index 0000000..cc0a314 --- /dev/null +++ b/frontend/docs/.vitepress/config.ts @@ -0,0 +1,86 @@ +import {defineConfig} from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "voidraft", + description: "An elegant text snippet recording tool designed for developers.", + lang: 'zh-CN', + srcDir: 'src', + assetsDir: 'assets', + cacheDir: './.vitepress/cache', + outDir: './.vitepress/dist', + srcExclude: [], + ignoreDeadLinks: false, + head: [ + [ + "link", + { + rel: "icon", + type: "image/png", + href: "/static/icon/favicon-96x96.png", + sizes: "96x96", + }, + ], + [ + "link", + { + rel: "icon", + type: "image/svg+xml", + href: "/static/icon/favicon.svg", + }, + ], + [ + "link", + { + rel: "shortcut icon", + href: "/static/icon/favicon.ico", + }, + ], + [ + "link", + { + rel: "apple-touch-icon", + sizes: "180x180", + href: "/static/icon/apple-touch-icon.png", + }, + ], + [ + "meta", + { + name: "apple-mobile-web-app-title", + content: "voidraft", + }, + ], + [ + "link", + { + rel: "manifest", + href: "/static/icon/site.webmanifest", + }, + ], + ['meta', {name: 'viewport', content: 'width=device-width,initial-scale=1'}] + ], + themeConfig: { + logo: '/static/icon/logo.png', + siteTitle: 'voidraft', + // https://vitepress.dev/reference/default-theme-config + nav: [ + {text: 'Home', link: '/'}, + {text: 'Examples', link: '/markdown-examples'} + ], + + sidebar: [ + { + text: 'Examples', + items: [ + {text: 'Markdown Examples', link: '/markdown-examples'}, + {text: 'Runtime API Examples', link: '/api-examples'} + ] + } + ], + + socialLinks: [ + {icon: 'github', link: 'https://github.com/landaiqing/voidraft'} + ] + } +}) diff --git a/frontend/docs/.vitepress/theme/index.ts b/frontend/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..def4cfc --- /dev/null +++ b/frontend/docs/.vitepress/theme/index.ts @@ -0,0 +1,17 @@ +// https://vitepress.dev/guide/custom-theme +import { h } from 'vue' +import type { Theme } from 'vitepress' +import DefaultTheme from 'vitepress/theme' +import './style.css' + +export default { + extends: DefaultTheme, + Layout: () => { + return h(DefaultTheme.Layout, null, { + // https://vitepress.dev/guide/extending-default-theme#layout-slots + }) + }, + enhanceApp({ app, router, siteData }) { + // ... + } +} satisfies Theme diff --git a/frontend/docs/.vitepress/theme/style.css b/frontend/docs/.vitepress/theme/style.css new file mode 100644 index 0000000..7fff2ba --- /dev/null +++ b/frontend/docs/.vitepress/theme/style.css @@ -0,0 +1,139 @@ +/** + * Customize default theme styling by overriding CSS variables: + * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + */ + +/** + * Colors + * + * 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 an accent, such as when having inline code block inside + * custom containers. + * + * - `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. + * -------------------------------------------------------------------------- */ + +: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); + + --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-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); +} + +/** + * 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); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient( + 120deg, + #bd34fe 30%, + #41d1ff + ); + + --vp-home-hero-image-background-image: linear-gradient( + -45deg, + #bd34fe 50%, + #47caff 50% + ); + --vp-home-hero-image-filter: blur(44px); +} + +@media (min-width: 640px) { + :root { + --vp-home-hero-image-filter: blur(56px); + } +} + +@media (min-width: 960px) { + :root { + --vp-home-hero-image-filter: blur(68px); + } +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +} + +/** + * Component: Algolia + * -------------------------------------------------------------------------- */ + +.DocSearch { + --docsearch-primary-color: var(--vp-c-brand-1) !important; +} + diff --git a/frontend/docs/src/api-examples.md b/frontend/docs/src/api-examples.md new file mode 100644 index 0000000..6bd8bb5 --- /dev/null +++ b/frontend/docs/src/api-examples.md @@ -0,0 +1,49 @@ +--- +outline: deep +--- + +# Runtime API Examples + +This page demonstrates usage of some of the runtime APIs provided by VitePress. + +The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files: + +```md + + +## Results + +### Theme Data +{{ theme }}
+
+### Page Data
+{{ page }}
+
+### Page Frontmatter
+{{ frontmatter }}
+```
+
+
+
+## Results
+
+### Theme Data
+{{ theme }}
+
+### Page Data
+{{ page }}
+
+### Page Frontmatter
+{{ frontmatter }}
+
+## More
+
+Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata).
diff --git a/frontend/docs/src/index.md b/frontend/docs/src/index.md
new file mode 100644
index 0000000..1504cc0
--- /dev/null
+++ b/frontend/docs/src/index.md
@@ -0,0 +1,28 @@
+---
+# https://vitepress.dev/reference/default-theme-home-page
+layout: home
+
+hero:
+ name: "voidraft"
+ text: "An elegant text snippet recording tool designed for developers."
+ tagline: My great project tagline
+ image:
+ src: /static/img/hero.png
+ alt: "voidraft"
+ actions:
+ - theme: brand
+ text: Markdown Examples
+ link: /markdown-examples
+ - theme: alt
+ text: API Examples
+ link: /api-examples
+
+features:
+ - title: Feature A
+ details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
+ - title: Feature B
+ details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
+ - title: Feature C
+ details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
+---
+
diff --git a/frontend/docs/src/markdown-examples.md b/frontend/docs/src/markdown-examples.md
new file mode 100644
index 0000000..f9258a5
--- /dev/null
+++ b/frontend/docs/src/markdown-examples.md
@@ -0,0 +1,85 @@
+# Markdown Extension Examples
+
+This page demonstrates some of the built-in markdown extensions provided by VitePress.
+
+## Syntax Highlighting
+
+VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting:
+
+**Input**
+
+````md
+```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
+```
+````
+
+**Output**
+
+```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
+```
+
+## Custom Containers
+
+**Input**
+
+```md
+::: info
+This is an info box.
+:::
+
+::: tip
+This is a tip.
+:::
+
+::: warning
+This is a warning.
+:::
+
+::: danger
+This is a dangerous warning.
+:::
+
+::: details
+This is a details block.
+:::
+```
+
+**Output**
+
+::: info
+This is an info box.
+:::
+
+::: tip
+This is a tip.
+:::
+
+::: warning
+This is a warning.
+:::
+
+::: danger
+This is a dangerous warning.
+:::
+
+::: details
+This is a details block.
+:::
+
+## More
+
+Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).
diff --git a/frontend/docs/src/static/icon/apple-touch-icon.png b/frontend/docs/src/static/icon/apple-touch-icon.png
new file mode 100644
index 0000000..1c810f3
Binary files /dev/null and b/frontend/docs/src/static/icon/apple-touch-icon.png differ
diff --git a/frontend/docs/src/static/icon/favicon-96x96.png b/frontend/docs/src/static/icon/favicon-96x96.png
new file mode 100644
index 0000000..d97aaa0
Binary files /dev/null and b/frontend/docs/src/static/icon/favicon-96x96.png differ
diff --git a/frontend/docs/src/static/icon/favicon.ico b/frontend/docs/src/static/icon/favicon.ico
new file mode 100644
index 0000000..ae0a2e0
Binary files /dev/null and b/frontend/docs/src/static/icon/favicon.ico differ
diff --git a/frontend/docs/src/static/icon/favicon.svg b/frontend/docs/src/static/icon/favicon.svg
new file mode 100644
index 0000000..842c8c3
--- /dev/null
+++ b/frontend/docs/src/static/icon/favicon.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/docs/img/logo.png b/frontend/docs/src/static/icon/logo.png
similarity index 100%
rename from docs/img/logo.png
rename to frontend/docs/src/static/icon/logo.png
diff --git a/frontend/docs/src/static/icon/site.webmanifest b/frontend/docs/src/static/icon/site.webmanifest
new file mode 100644
index 0000000..b4196aa
--- /dev/null
+++ b/frontend/docs/src/static/icon/site.webmanifest
@@ -0,0 +1,21 @@
+{
+ "name": "voidraft",
+ "short_name": "voidraft",
+ "icons": [
+ {
+ "src": "/static/img/web-app-manifest-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "/static/img/web-app-manifest-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
\ No newline at end of file
diff --git a/frontend/docs/src/static/icon/web-app-manifest-192x192.png b/frontend/docs/src/static/icon/web-app-manifest-192x192.png
new file mode 100644
index 0000000..604d21e
Binary files /dev/null and b/frontend/docs/src/static/icon/web-app-manifest-192x192.png differ
diff --git a/frontend/docs/src/static/icon/web-app-manifest-512x512.png b/frontend/docs/src/static/icon/web-app-manifest-512x512.png
new file mode 100644
index 0000000..337627d
Binary files /dev/null and b/frontend/docs/src/static/icon/web-app-manifest-512x512.png differ
diff --git a/frontend/docs/src/static/img/hero.png b/frontend/docs/src/static/img/hero.png
new file mode 100644
index 0000000..420d7bb
Binary files /dev/null and b/frontend/docs/src/static/img/hero.png differ
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 116e3b5..8defccd 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -80,6 +80,7 @@
"unplugin-vue-components": "^30.0.0",
"vite": "^7.1.12",
"vite-plugin-node-polyfills": "^0.24.0",
+ "vitepress": "^2.0.0-alpha.12",
"vitest": "^4.0.6",
"vue-eslint-parser": "^10.2.0",
"vue-tsc": "^3.1.2"
@@ -586,6 +587,20 @@
"integrity": "sha512-5ZgNOdiiIHbcBLvJhonCGoHFfuLlfsA+CjohiZGVuyD2XMVi35YFr7vZ6eSHeWjFAUsKRFbcOqtoXsV1Wk7zXA==",
"license": "MIT"
},
+ "node_modules/@docsearch/css": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/@docsearch/css/-/css-4.2.0.tgz",
+ "integrity": "sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/@docsearch/js/-/js-4.2.0.tgz",
+ "integrity": "sha512-KBHVPO29QiGUFJYeAqxW0oXtGf/aghNmRrIRPT4/28JAefqoCkNn/ZM/jeQ7fHjl0KNM6C+KlLVYjwyz6lNZnA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@epic-web/invariant": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@epic-web/invariant/-/invariant-1.0.0.tgz",
@@ -1241,6 +1256,23 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.56",
+ "resolved": "https://registry.npmmirror.com/@iconify-json/simple-icons/-/simple-icons-1.2.56.tgz",
+ "integrity": "sha512-oAvxOzgSjfvdj/Jsi3S7HDUCxO8/n2j8e1w1e/FktHUAXiWjNX00n3Tu3AP+n1ayKrypcUDXCzxn+0ENMl6ouw==",
+ "dev": true,
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@intlify/core-base": {
"version": "11.1.12",
"resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-11.1.12.tgz",
@@ -2308,6 +2340,91 @@
"win32"
]
},
+ "node_modules/@shikijs/core": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-3.14.0.tgz",
+ "integrity": "sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.14.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-3.14.0.tgz",
+ "integrity": "sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.14.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.3"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.14.0.tgz",
+ "integrity": "sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.14.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/langs/-/langs-3.14.0.tgz",
+ "integrity": "sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.14.0"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/themes/-/themes-3.14.0.tgz",
+ "integrity": "sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.14.0"
+ }
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-3.14.0.tgz",
+ "integrity": "sha512-i67zQnY9wLMMnKasonVW1L9fKneSLZDj1ePsA4o0AZWU4uUobmJY9baRDa36z+a9/g0aG76/2tybQvm4hrwxIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.14.0",
+ "@shikijs/types": "3.14.0"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/@shikijs/types/-/types-3.14.0.tgz",
+ "integrity": "sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==",
+ "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.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@standard-schema/spec": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.0.0.tgz",
@@ -2359,6 +2476,16 @@
"devOptional": true,
"license": "MIT"
},
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -2366,6 +2493,41 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/@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.1.2",
+ "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
"version": "24.9.2",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-24.9.2.tgz",
@@ -2383,6 +2545,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.46.2",
"resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz",
@@ -2641,6 +2817,13 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/@vitejs/plugin-vue": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz",
@@ -2978,6 +3161,114 @@
"integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==",
"license": "MIT"
},
+ "node_modules/@vueuse/core": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-13.9.0.tgz",
+ "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "13.9.0",
+ "@vueuse/shared": "13.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-13.9.0.tgz",
+ "integrity": "sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vueuse/core": "13.9.0",
+ "@vueuse/shared": "13.9.0"
+ },
+ "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 || ^8",
+ "vue": "^3.5.0"
+ },
+ "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": "13.9.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-13.9.0.tgz",
+ "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-13.9.0.tgz",
+ "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
"node_modules/@wailsio/runtime": {
"version": "3.0.0-alpha.66",
"resolved": "https://registry.npmmirror.com/@wailsio/runtime/-/runtime-3.0.0-alpha.66.tgz",
@@ -3170,9 +3461,9 @@
"license": "MIT"
},
"node_modules/birpc": {
- "version": "2.3.0",
- "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.3.0.tgz",
- "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.6.1.tgz",
+ "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
@@ -3496,6 +3787,17 @@
"node": ">=6"
}
},
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/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/chai": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/chai/-/chai-6.2.0.tgz",
@@ -3523,6 +3825,28 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/chevrotain": {
"version": "11.0.3",
"resolved": "https://registry.npmmirror.com/chevrotain/-/chevrotain-11.0.3.tgz",
@@ -3657,6 +3981,17 @@
"url": "https://jaywcjlove.github.io/#/sponsor"
}
},
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/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/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
@@ -3923,6 +4258,16 @@
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/des.js": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz",
@@ -3955,6 +4300,20 @@
"node": ">=0.10"
}
},
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/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/diffie-hellman": {
"version": "5.0.3",
"resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@@ -4508,6 +4867,16 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/focus-trap": {
+ "version": "7.6.6",
+ "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.6.6.tgz",
+ "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.3.0"
+ }
+ },
"node_modules/for-each": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz",
@@ -4749,6 +5118,44 @@
"node": ">= 0.4"
}
},
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -4779,6 +5186,17 @@
"url": "https://jaywcjlove.github.io/#/sponsor"
}
},
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/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/https-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz",
@@ -5236,6 +5654,13 @@
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmmirror.com/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -5258,6 +5683,28 @@
"safe-buffer": "^5.1.2"
}
},
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "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/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
@@ -5268,6 +5715,100 @@
"node": ">= 8"
}
},
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
@@ -5330,6 +5871,13 @@
"node": "*"
}
},
+ "node_modules/minisearch": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/minisearch/-/minisearch-7.2.0.tgz",
+ "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
@@ -5571,6 +6119,25 @@
"optional": true,
"peer": true
},
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmmirror.com/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
+ "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz",
+ "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.1",
+ "regex": "^6.0.1",
+ "regex-recursion": "^6.0.2"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
@@ -5955,6 +6522,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/public-encrypt": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz",
@@ -6111,6 +6689,33 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/regex/-/regex-6.0.1.tgz",
+ "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/regexp-to-ast": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
@@ -6414,6 +7019,23 @@
"node": ">=8"
}
},
+ "node_modules/shiki": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmmirror.com/shiki/-/shiki-3.14.0.tgz",
+ "integrity": "sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.14.0",
+ "@shikijs/engine-javascript": "3.14.0",
+ "@shikijs/engine-oniguruma": "3.14.0",
+ "@shikijs/langs": "3.14.0",
+ "@shikijs/themes": "3.14.0",
+ "@shikijs/types": "3.14.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
@@ -6506,6 +7128,17 @@
"node": ">=0.10.0"
}
},
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
@@ -6569,6 +7202,21 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmmirror.com/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/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -6640,6 +7288,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/tabbable": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.3.0.tgz",
+ "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/timers-browserify": {
"version": "2.0.12",
"resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz",
@@ -6753,6 +7408,17 @@
"node": ">=8.0"
}
},
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/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/ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -6950,6 +7616,79 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.0.0",
+ "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "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.npmmirror.com/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/unplugin": {
"version": "2.3.10",
"resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.10.tgz",
@@ -7147,6 +7886,36 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/vite": {
"version": "7.1.12",
"resolved": "https://registry.npmmirror.com/vite/-/vite-7.1.12.tgz",
@@ -7270,6 +8039,95 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/vitepress": {
+ "version": "2.0.0-alpha.12",
+ "resolved": "https://registry.npmmirror.com/vitepress/-/vitepress-2.0.0-alpha.12.tgz",
+ "integrity": "sha512-yZwCwRRepcpN5QeAhwSnEJxS3I6zJcVixqL1dnm6km4cnriLpQyy2sXQDsE5Ti3pxGPbhU51nTMwI+XC1KNnJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/css": "^4.0.0-beta.7",
+ "@docsearch/js": "^4.0.0-beta.7",
+ "@iconify-json/simple-icons": "^1.2.47",
+ "@shikijs/core": "^3.9.2",
+ "@shikijs/transformers": "^3.9.2",
+ "@shikijs/types": "^3.9.2",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^6.0.1",
+ "@vue/devtools-api": "^8.0.0",
+ "@vue/shared": "^3.5.18",
+ "@vueuse/core": "^13.6.0",
+ "@vueuse/integrations": "^13.6.0",
+ "focus-trap": "^7.6.5",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.1.2",
+ "shiki": "^3.9.2",
+ "vite": "^7.1.2",
+ "vue": "^3.5.18"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "oxc-minify": "^0.82.1",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "oxc-minify": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress/node_modules/@vue/devtools-api": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-8.0.3.tgz",
+ "integrity": "sha512-YxZE7xNvvfq5XmjJh1ml+CzVNrRjuZYCuT5Xjj0u9RlXU7za/MRuZDUXcKfp0j7IvYkDut49vlKqbiQ1xhXP2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^8.0.3"
+ }
+ },
+ "node_modules/vitepress/node_modules/@vue/devtools-kit": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.0.3.tgz",
+ "integrity": "sha512-UF4YUOVGdfzXLCv5pMg2DxocB8dvXz278fpgEE+nJ/DRALQGAva7sj9ton0VWZ9hmXw+SV8yKMrxP2MpMhq9Wg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^8.0.3",
+ "birpc": "^2.6.1",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^2.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.2"
+ }
+ },
+ "node_modules/vitepress/node_modules/@vue/devtools-shared": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.0.3.tgz",
+ "integrity": "sha512-s/QNll7TlpbADFZrPVsaUNPCOF8NvQgtgmmB7Tip6pLf/HcOvBTly0lfLQ0Eylu9FQ4OqBhFpLyBgwykiSf8zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/vitepress/node_modules/perfect-debounce": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.0.0.tgz",
+ "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/vitest": {
"version": "4.0.6",
"resolved": "https://registry.npmmirror.com/vitest/-/vitest-4.0.6.tgz",
@@ -7608,6 +8466,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/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"
+ }
+ },
"src/common/prettier/plugins/scala/prettier-plugin-scala": {
"name": "@simochee/prettier-plugin-scala",
"version": "0.1.0",
diff --git a/frontend/package.json b/frontend/package.json
index f529e3f..868e783 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -11,7 +11,10 @@
"lint": "eslint",
"lint:fix": "eslint --fix",
"build:lang-parser": "node src/views/editor/extensions/codeblock/lang-parser/build-parser.js",
- "test": "vitest"
+ "test": "vitest",
+ "docs:dev": "vitepress dev docs",
+ "docs:build": "vitepress build docs",
+ "docs:preview": "vitepress preview docs"
},
"dependencies": {
"@codemirror/autocomplete": "^6.19.1",
@@ -86,8 +89,9 @@
"unplugin-vue-components": "^30.0.0",
"vite": "^7.1.12",
"vite-plugin-node-polyfills": "^0.24.0",
+ "vitepress": "^2.0.0-alpha.12",
"vitest": "^4.0.6",
"vue-eslint-parser": "^10.2.0",
"vue-tsc": "^3.1.2"
}
-}
+}
\ No newline at end of file