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 @@ - - - - - - voidraft - Changelog - - - - - - - - -
- -
-
-

voidraft Changelog

-
- - -
-
- -
- - - - -
-
-

Loading releases...

-
- - -
- -
- - - -
- - - -
-
- - - - - \ No newline at end of file diff --git a/docs/css/changelog.css b/docs/css/changelog.css deleted file mode 100644 index b29cc50..0000000 --- a/docs/css/changelog.css +++ /dev/null @@ -1,347 +0,0 @@ -/* 更新日志页面样式 */ -.nav-links { - margin-bottom: 30px; - display: flex; - gap: 15px; -} - -.loading-container { - text-align: center; - padding: 40px 0; - background-color: transparent; -} - -.loading-spinner { - border: 4px solid rgba(0, 0, 0, 0.1); - border-left-color: var(--primary-color); - border-radius: 50%; - width: 40px; - height: 40px; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -.theme-dark .loading-spinner { - border-color: rgba(255, 255, 255, 0.1); - border-left-color: var(--primary-color); -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.error-container { - text-align: center; - color: var(--error-color); - padding: 20px; - border: 2px dashed var(--error-color); - margin: 20px 0; - border-radius: 4px; - background-color: rgba(var(--card-bg-rgb), 0.7); -} - -.error-container i { - font-size: 24px; - margin-bottom: 10px; -} - -/* 更新日志容器 */ -.changelog-container { - display: none; - position: relative; - z-index: 1; -} - -.release { - margin-bottom: 40px; - border-left: 4px solid var(--primary-color); - padding-left: 20px; - background-color: rgba(var(--card-bg-rgb), 0.5); - padding: 15px 20px; - border-radius: 4px; -} - -.release-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 15px; -} - -.release-version { - font-size: 24px; - font-weight: bold; - color: var(--primary-color); -} - -.release-date { - color: var(--text-color); - opacity: 0.7; - font-size: 14px; -} - -.release-badge { - display: inline-block; - padding: 3px 8px; - border-radius: 12px; - font-size: 12px; - margin-left: 10px; - background-color: var(--primary-color); - color: #000; -} - -.release-badge.pre-release { - background-color: var(--warning-color); -} - -.release-description { - margin-bottom: 20px; - line-height: 1.6; -} - -.release-assets { - background-color: rgba(var(--light-bg-rgb), 0.7); - padding: 15px; - border-radius: 4px; - margin-top: 15px; -} - -.release-assets-title { - font-size: 16px; - margin-bottom: 10px; -} - -.asset-list { - list-style-type: none; - padding: 0; - margin: 0; -} - -.asset-item { - display: flex; - align-items: center; - padding: 8px 0; - border-bottom: 1px solid rgba(128, 128, 128, 0.2); -} - -.asset-item:last-child { - border-bottom: none; -} - -.asset-icon { - margin-right: 10px; - color: var(--accent-color); -} - -.asset-name { - flex-grow: 1; -} - -.asset-size { - font-size: 12px; - color: var(--text-color); - opacity: 0.7; -} - -/* 资源下载按钮 */ -.download-btn { - margin-left: 10px; - padding: 3px 10px; - background-color: var(--primary-color); - color: white; - border: none; - border-radius: 4px; - text-decoration: none; - font-size: 12px; - transition: all 0.2s ease; - display: inline-block; - text-align: center; -} - -.download-btn:hover { - background-color: var(--secondary-color); -} - -.markdown-content { - line-height: 1.8; - overflow-wrap: break-word; - background-color: transparent; -} - -.markdown-content h1, -.markdown-content h2, -.markdown-content h3 { - margin-top: 20px; - margin-bottom: 10px; -} - -.markdown-content ul, -.markdown-content ol { - padding-left: 20px; - margin: 10px 0; -} - -.markdown-content li { - margin-bottom: 8px; -} - -.markdown-content li:last-child { - margin-bottom: 0; -} - -.markdown-content hr { - border: none; - border-top: 2px dashed var(--border-color); - margin: 20px 0; -} - -.markdown-content br { - display: block; - content: ""; - margin-top: 10px; -} - -.markdown-content code { - font-family: 'IBM Plex Mono', monospace; - background-color: rgba(128, 128, 128, 0.1); - padding: 2px 4px; - border-radius: 3px; - font-size: 90%; -} - -.markdown-content pre { - background-color: rgba(128, 128, 128, 0.1); - padding: 15px; - border-radius: 4px; - overflow-x: auto; - margin: 15px 0; -} - -.markdown-content pre code { - background-color: transparent; - padding: 0; -} - -.markdown-content a { - color: var(--primary-color); - text-decoration: none; -} - -.markdown-content a:hover { - text-decoration: underline; -} - -.data-source { - padding: 10px 15px; - margin-bottom: 20px; - background-color: rgba(var(--light-bg-rgb), 0.7); - border-radius: 4px; - font-size: 14px; - text-align: right; - opacity: 0.7; -} - -.data-source a { - color: var(--primary-color); - text-decoration: none; - font-weight: bold; -} - -.data-source a:hover { - text-decoration: underline; -} - -/* Markdown内容样式增强 */ -.markdown-content blockquote { - border-left: 4px solid var(--primary-color); - padding: 10px 15px; - margin: 15px 0; - background-color: rgba(var(--light-bg-rgb), 0.5); - border-radius: 0 4px 4px 0; -} - -.markdown-content ul, -.markdown-content ol { - padding-left: 20px; - margin: 10px 0; -} - -/* 移动设备响应式优化 */ -@media (max-width: 768px) { - .release-header { - flex-direction: column; - align-items: flex-start; - gap: 8px; - } - - .release-assets { - padding: 12px 8px; - } - - .asset-item { - flex-wrap: wrap; - padding: 12px 0; - position: relative; - } - - .asset-name { - width: 100%; - margin-bottom: 8px; - word-break: break-all; - } - - .asset-size { - margin-left: 25px; - } - - .download-btn { - margin-left: 10px; - padding: 5px 12px; - } -} - -@media (max-width: 480px) { - .release { - padding-left: 12px; - } - - .asset-item { - flex-direction: column; - align-items: flex-start; - } - - .asset-icon { - margin-bottom: 5px; - } - - .asset-size { - margin-left: 0; - margin-top: 5px; - } - - .download-btn { - margin-left: 0; - margin-top: 10px; - width: 100%; - text-align: center; - padding: 8px; - } - - .markdown-content pre { - padding: 10px; - margin: 10px 0; - } -} - -/* 确保日志页面页脚样式一致 */ -.footer { - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; -} - -.footer-text { - margin: 0 0 15px 0; -} \ No newline at end of file diff --git a/docs/css/ibm-plex-mono-font.css b/docs/css/ibm-plex-mono-font.css deleted file mode 100644 index 4292894..0000000 --- a/docs/css/ibm-plex-mono-font.css +++ /dev/null @@ -1,45 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'IBM Plex Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iIq129k.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'IBM Plex Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1isq129k.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* vietnamese */ -@font-face { - font-family: 'IBM Plex Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iAq129k.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'IBM Plex Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iEq129k.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'IBM Plex Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1i8q1w.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} \ No newline at end of file diff --git a/docs/css/space-mono-font.css b/docs/css/space-mono-font.css deleted file mode 100644 index 75288f5..0000000 --- a/docs/css/space-mono-font.css +++ /dev/null @@ -1,27 +0,0 @@ -/* vietnamese */ -@font-face { - font-family: 'Space Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/space-mono/i7dPIFZifjKcF5UAWdDRYE58RWq7.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Space Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/space-mono/i7dPIFZifjKcF5UAWdDRYE98RWq7.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Space Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../font/space-mono/i7dPIFZifjKcF5UAWdDRYEF8RQ.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} \ No newline at end of file diff --git a/docs/css/styles.css b/docs/css/styles.css deleted file mode 100644 index b664393..0000000 --- a/docs/css/styles.css +++ /dev/null @@ -1,717 +0,0 @@ -@import url('./space-mono-font.css'); -@import url('./ibm-plex-mono-font.css'); - -/* 浅色主题 */ -:root { - --bg-color: #fefefe; - --text-color: #000000; - --primary-color: #F08080; - --primary-color-rgb: 240, 128, 128; - --secondary-color: #ff006e; - --accent-color: #073B4C; - --card-bg: #ffffff; - --card-bg-rgb: 255, 255, 255; - --border-color: #000000; - --light-bg: #f0f0f0; - --light-bg-rgb: 240, 240, 240; - --shadow-color: rgba(240, 128, 128, 0.5); - --success-color: #27c93f; - --warning-color: #FFD166; - --error-color: #ff006e; - --info-color: #118ab2; - --code-bg: #ffffff; - --code-bg-rgb: 255, 255, 255; - --preview-header-bg: #f0f0f0; - --preview-header-bg-rgb: 240, 240, 240; - --grid-color-1: rgba(0, 0, 0, 0.08); - --grid-color-2: rgba(0, 0, 0, 0.05); - --header-title-color: #000000; -} - -/* 暗色主题变量 */ -.theme-dark { - --bg-color: #121212; - --text-color: #ffffff; - --primary-color: #F08080; - --primary-color-rgb: 240, 128, 128; - --secondary-color: #ff006e; - --accent-color: #118ab2; - --card-bg: #1e1e1e; - --card-bg-rgb: 30, 30, 30; - --border-color: #ffffff; - --light-bg: #2a2a2a; - --light-bg-rgb: 42, 42, 42; - --shadow-color: rgba(240, 128, 128, 0.5); - --success-color: #27c93f; - --warning-color: #FFD166; - --error-color: #ff006e; - --info-color: #118ab2; - --code-bg: #1e1e1e; - --code-bg-rgb: 30, 30, 30; - --preview-header-bg: #252526; - --preview-header-bg-rgb: 37, 37, 38; - --grid-color-1: rgba(255, 255, 255, 0.08); - --grid-color-2: rgba(255, 255, 255, 0.05); - --header-title-color: #000000; -} - -/* 主题切换和语言切换的过渡效果 */ -.theme-transition, -.theme-transition *, -.lang-transition, -.lang-transition * { - transition: all 0.3s ease !important; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -@keyframes gridMove { - 0% { - background-position: 0px 0px, 0px 0px, 0px 0px, 0px 0px; - } - 100% { - background-position: 80px 80px, 80px 80px, 20px 20px, 20px 20px; - } -} - -body { - background-color: var(--bg-color); - background-image: - linear-gradient(var(--grid-color-1) 1px, transparent 1px), - linear-gradient(90deg, var(--grid-color-1) 1px, transparent 1px), - linear-gradient(var(--grid-color-2) 0.5px, transparent 0.5px), - linear-gradient(90deg, var(--grid-color-2) 0.5px, transparent 0.5px); - background-size: 80px 80px, 80px 80px, 20px 20px, 20px 20px; - background-position: center; - animation: gridMove 40s linear infinite; - font-family: 'Space Mono', monospace; - color: var(--text-color); - line-height: 1.6; - padding: 20px; - transition: background-color 0.3s ease, color 0.3s ease; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 卡片容器 */ -.card { - background-color: var(--card-bg); - background-image: - linear-gradient(var(--grid-color-1) 1px, transparent 1px), - linear-gradient(90deg, var(--grid-color-1) 1px, transparent 1px), - linear-gradient(var(--grid-color-2) 0.5px, transparent 0.5px), - linear-gradient(90deg, var(--grid-color-2) 0.5px, transparent 0.5px); - background-size: 80px 80px, 80px 80px, 20px 20px, 20px 20px; - background-position: center; - border: 4px solid var(--border-color); - box-shadow: 12px 12px 0 var(--shadow-color); - margin-bottom: 40px; - overflow: hidden; - transition: transform 0.3s ease, box-shadow 0.3s ease; - position: relative; - z-index: 10; -} - -.card:hover { - transform: translateY(-5px); - box-shadow: 16px 16px 0 var(--shadow-color); -} - -/* 卡片头部 */ -.card-header { - background-color: rgba(var(--primary-color-rgb), 0.9); - border-bottom: 4px solid var(--border-color); - padding: 20px; - display: flex; - justify-content: space-between; - align-items: center; - position: relative; - z-index: 1; -} - -.card-title { - font-size: 24px; - font-weight: bold; - margin: 0; - color: var(--header-title-color); -} - -.card-controls { - display: flex; - gap: 10px; -} - -.btn { - display: inline-block; - padding: 10px 20px; - background: var(--secondary-color); - color: #fff; - text-decoration: none; - font-weight: bold; - border: 3px solid var(--border-color); - box-shadow: 4px 4px 0 var(--shadow-color); - transition: all 0.2s ease; - cursor: pointer; - font-family: 'Space Mono', monospace; - font-size: 14px; -} - -.btn:hover { - background: var(--card-bg); - color: var(--primary-color); - border: 3px solid var(--primary-color); - box-shadow: none; -} - -.btn-secondary { - background: var(--light-bg); - color: var(--text-color); -} - -.btn-secondary:hover { - background: var(--card-bg); - color: var(--primary-color); - border: 3px solid var(--primary-color); -} - -/* 卡片内容 */ -.card-content { - padding: 30px; - position: relative; - z-index: 1; - background-color: rgba(var(--card-bg-rgb), 0.5); -} - -/* Logo区域 */ -.logo-container { - text-align: center; - margin-bottom: 40px; -} - -.logo-frame { - width: 150px; - height: 150px; - background: var(--card-bg); - border: 4px solid var(--border-color); - margin: 0 auto; - display: flex; - justify-content: center; - align-items: center; - margin-bottom: 20px; -} - -.logo-image { - width: 130px; - height: 130px; - object-fit: contain; - border: 2px solid var(--border-color); -} - -.logo-text { - font-size: 32px; - font-weight: bold; - margin: 0; -} - -.tagline { - font-size: 16px; - margin: 10px 0 0; - color: var(--accent-color); -} - -/* 介绍区域 */ -.intro-box { - border: 2px dashed var(--border-color); - padding: 20px; - background-color: rgba(var(--light-bg-rgb), 0.7); - margin-bottom: 30px; - text-align: center; -} - -.intro-text { - font-size: 16px; - margin-bottom: 0; -} - -/* 按钮组 */ -.button-group { - display: flex; - justify-content: center; - gap: 20px; - margin: 30px 0; -} - -/* 特性网格 */ -.features-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 30px; - margin: 40px 0; -} - -/* 特性卡片 */ -.feature-card { - background-color: rgba(var(--card-bg-rgb), 0.8); - border: 3px solid var(--border-color); - box-shadow: 5px 5px 0 var(--shadow-color); - padding: 20px; - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.feature-card:hover { - transform: translateY(-3px); - box-shadow: 7px 7px 0 var(--shadow-color); -} - -.feature-icon { - font-size: 24px; - margin-bottom: 15px; - color: var(--secondary-color); -} - -.feature-title { - font-size: 18px; - font-weight: bold; - margin-bottom: 10px; -} - -.feature-desc { - font-size: 14px; -} - -/* 预览区域 */ -.preview-container { - display: flex; - flex-wrap: wrap; - gap: 20px; - margin: 30px 0; -} - -@media (max-width: 768px) { - .preview-container { - grid-template-columns: 1fr; - } -} - -/* 预览窗口 */ -.preview-window { - border: 3px solid var(--border-color); - border-radius: 8px; - overflow: hidden; - margin: 10px; - flex: 1; - min-width: 300px; - background-color: rgba(var(--card-bg-rgb), 0.7); - display: flex; - flex-direction: column; - box-shadow: 5px 5px 0 var(--shadow-color); -} - -/* 预览头部 */ -.preview-header { - background-color: rgba(var(--preview-header-bg-rgb), 0.9); - padding: 10px; - display: flex; - align-items: center; - border-bottom: 2px solid var(--border-color); -} - -.preview-controls { - display: flex; - gap: 6px; - margin-right: 15px; -} - -.preview-btn { - width: 12px; - height: 12px; - border-radius: 50%; - border: 0.5px solid rgba(0, 0, 0, 0.1); -} - -.preview-btn:nth-child(1) { - background-color: #ff5f56; -} - -.preview-btn:nth-child(2) { - background-color: #ffbd2e; -} - -.preview-btn:nth-child(3) { - background-color: #27c93f; -} - -.preview-title { - font-size: 13px; - opacity: 0.8; - color: var(--text-color); - font-weight: normal; -} - -/* 预览内容 */ -.preview-content { - padding: 15px; - flex-grow: 1; - overflow: auto; - background-color: rgba(var(--code-bg-rgb), 0.5); -} - -/* 代码块容器 */ -.code-block-wrapper { - background-color: rgba(var(--code-bg-rgb), 0.8); - border: 2px solid var(--border-color); - border-radius: 4px; - overflow: hidden; - margin-bottom: 8px; -} - -/* 块头部 */ -.block-header { - background-color: rgba(var(--light-bg-rgb), 0.8); - padding: 8px 12px; - border-bottom: 2px solid var(--border-color); - display: flex; - justify-content: space-between; - align-items: center; -} - -.block-language { - color: rgba(128, 128, 128, 0.8); - font-family: 'IBM Plex Mono', monospace; - display: flex; - align-items: center; -} - -.block-language::before { - content: ''; - display: inline-block; - width: 12px; - height: 12px; - margin-right: 5px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23888'%3E%3Cpath d='M9.7,16.7L5.3,12.3C4.9,11.9 4.9,11.1 5.3,10.7C5.7,10.3 6.3,10.3 6.7,10.7L10.5,14.5L17.3,7.7C17.7,7.3 18.3,7.3 18.7,7.7C19.1,8.1 19.1,8.7 18.7,9.1L11.3,16.7C10.9,17.1 10.1,17.1 9.7,16.7Z'/%3E%3C/svg%3E"); - background-size: contain; - background-repeat: no-repeat; -} - -.code-block { - font-family: 'IBM Plex Mono', monospace; - font-size: 13px; - line-height: 1.6; - margin: 0; - white-space: pre; - tab-size: 4; - -moz-tab-size: 4; - padding: 10px; -} - -.theme-dark .code-block-wrapper { - border-color: rgba(255, 255, 255, 0.15); -} - -.theme-dark .block-header { - background-color: rgba(255, 255, 255, 0.05); - border-color: rgba(255, 255, 255, 0.15); -} - -.theme-dark .block-language { - color: rgba(255, 255, 255, 0.6); -} - -.theme-dark .block-language::before { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23aaa'%3E%3Cpath d='M9.7,16.7L5.3,12.3C4.9,11.9 4.9,11.1 5.3,10.7C5.7,10.3 6.3,10.3 6.7,10.7L10.5,14.5L17.3,7.7C17.7,7.3 18.3,7.3 18.7,7.7C19.1,8.1 19.1,8.7 18.7,9.1L11.3,16.7C10.9,17.1 10.1,17.1 9.7,16.7Z'/%3E%3C/svg%3E"); -} - -.theme-dark .code-block { - color: #d4d4d4; -} - -/* 代码高亮 */ -.theme-dark .keyword { color: #c586c0; } -.theme-dark .function { color: #dcdcaa; } -.theme-dark .variable { color: #9cdcfe; } -.theme-dark .string { color: #ce9178; } -.theme-dark .comment { color: #6a9955; } -.theme-dark .class { color: #4ec9b0; } -.theme-dark .parameter { color: #9cdcfe; } -.theme-dark .built-in { color: #4ec9b0; } - -/* 浅色主题代码高亮 */ -.keyword { color: #af00db; } -.function { color: #795e26; } -.variable { color: #001080; } -.string { color: #a31515; } -.comment { color: #008000; } -.class { color: #267f99; } -.parameter { color: #001080; } -.built-in { color: #267f99; } - -.preview-image { - width: 100%; - height: 100%; - object-fit: cover; - display: block; - border: none; - transition: opacity 0.3s ease; -} - -.theme-dark .light-theme-img { - display: none !important; -} - -.theme-dark .dark-theme-img { - display: block; -} - -body:not(.theme-dark) .dark-theme-img { - display: none !important; -} - -body:not(.theme-dark) .light-theme-img { - display: block !important; -} - -/* 技术栈列表 */ -.tech-list { - list-style: none; - padding: 0; - margin: 0; -} - -/* 技术栈列表 */ -.tech-item { - padding: 15px; - margin-bottom: 15px; - border: 2px solid var(--border-color); - background-color: rgba(var(--light-bg-rgb), 0.7); - display: flex; - align-items: center; -} - -.tech-icon { - margin-right: 15px; - color: var(--secondary-color); - font-size: 20px; - width: 30px; - text-align: center; -} - -.tech-name { - font-weight: bold; - margin-right: 10px; -} - -.tech-desc { - font-size: 14px; - color: var(--accent-color); -} - -/* 页脚 */ -.footer { - border-top: 2px solid var(--border-color); - padding: 20px 0; - margin-top: 40px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; - background-color: transparent; - position: relative; - z-index: 1; -} - -.footer-text { - margin: 0 0 15px 0; - font-size: 14px; - opacity: 0.7; -} - -.footer-links { - display: flex; - gap: 15px; - justify-content: center; -} - -.footer-link { - color: var(--secondary-color); - text-decoration: none; - font-size: 14px; - transition: color 0.3s; -} - -.footer-link:hover { - color: var(--primary-color); - text-decoration: underline; -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .button-group { - flex-direction: column; - align-items: center; - } - - .btn { - width: 100%; - text-align: center; - } - - .features-grid { - grid-template-columns: 1fr; - } -} - -@media (max-width: 480px) { - .card-header { - flex-direction: column; - gap: 15px; - } - - .card-controls { - width: 100%; - } - - .logo-frame { - width: 120px; - height: 120px; - } - - .logo-image { - width: 100px; - height: 100px; - } -} - -/* 针对移动设备的响应式优化 */ -@media (max-width: 768px) { - body { - padding: 10px; - } - - .container { - padding: 10px; - } - - .card { - margin-bottom: 30px; - } - - .card-header { - flex-direction: column; - gap: 15px; - text-align: center; - } - - .card-controls { - width: 100%; - justify-content: center; - } - - .button-group { - flex-wrap: wrap; - gap: 15px; - } - - /* 预览区域优化 */ - .preview-content { - max-width: 100%; - overflow-x: auto; - } - - .code-block { - white-space: pre-wrap; - word-break: break-word; - font-size: 13px; - line-height: 1.4; - } - - .block-header { - padding: 6px 10px; - } - - /* 日志界面导航链接优化 */ - .nav-links { - flex-direction: column; - gap: 10px; - align-items: stretch; - } - - .nav-links .btn { - width: 100%; - text-align: center; - } -} - -@media (max-width: 480px) { - /* 特性卡片优化 */ - .features-grid { - grid-template-columns: 1fr; - gap: 20px; - } - - /* 预览窗口优化 */ - .preview-container { - flex-direction: column; - } - - .preview-window { - margin-bottom: 20px; - width: 100%; - } - - /* 技术栈列表小屏幕优化 */ - .tech-item { - flex-wrap: wrap; - } - - .tech-desc { - width: 100%; - padding-left: 40px; /* 图标宽度+右边距 */ - margin-top: 5px; - } - - /* 日志界面资源列表项优化 */ - .asset-item { - flex-wrap: wrap; - padding: 15px 0; - } - - .asset-name { - width: 100%; - word-break: break-all; - margin-bottom: 10px; - } - - .asset-size { - order: 2; - margin-top: 10px; - } - - .download-btn { - order: 3; - margin-left: 0; - margin-top: 10px; - width: 100%; - text-align: center; - padding: 8px; - } - - /* 页脚链接优化 */ - .footer { - flex-direction: column; - text-align: center; - } - - .footer-links { - margin-top: 15px; - justify-content: center; - } -} \ No newline at end of file diff --git a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1i8q1w.woff2 b/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1i8q1w.woff2 deleted file mode 100644 index a6c77d6..0000000 Binary files a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1i8q1w.woff2 and /dev/null differ diff --git a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iAq129k.woff2 b/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iAq129k.woff2 deleted file mode 100644 index 1bb5b4d..0000000 Binary files a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iAq129k.woff2 and /dev/null differ diff --git a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iEq129k.woff2 b/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iEq129k.woff2 deleted file mode 100644 index 53fb6e5..0000000 Binary files a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iEq129k.woff2 and /dev/null differ diff --git a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iIq129k.woff2 b/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iIq129k.woff2 deleted file mode 100644 index 8000213..0000000 Binary files a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1iIq129k.woff2 and /dev/null differ diff --git a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1isq129k.woff2 b/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1isq129k.woff2 deleted file mode 100644 index ab7e904..0000000 Binary files a/docs/font/ibm-plex-mono/-F63fjptAgt5VM-kVkqdyU8n1isq129k.woff2 and /dev/null differ diff --git a/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYE58RWq7.woff2 b/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYE58RWq7.woff2 deleted file mode 100644 index f4c014c..0000000 Binary files a/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYE58RWq7.woff2 and /dev/null differ diff --git a/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYE98RWq7.woff2 b/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYE98RWq7.woff2 deleted file mode 100644 index 171ca1a..0000000 Binary files a/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYE98RWq7.woff2 and /dev/null differ diff --git a/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYEF8RQ.woff2 b/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYEF8RQ.woff2 deleted file mode 100644 index 2752f60..0000000 Binary files a/docs/font/space-mono/i7dPIFZifjKcF5UAWdDRYEF8RQ.woff2 and /dev/null differ diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico deleted file mode 100644 index 613d223..0000000 Binary files a/docs/img/favicon.ico and /dev/null differ diff --git a/docs/img/screenshot-dark.png b/docs/img/screenshot-dark.png deleted file mode 100644 index dee08b5..0000000 Binary files a/docs/img/screenshot-dark.png and /dev/null differ diff --git a/docs/img/screenshot-light.png b/docs/img/screenshot-light.png deleted file mode 100644 index 54612a5..0000000 Binary files a/docs/img/screenshot-light.png and /dev/null differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index e7f1e8f..0000000 --- a/docs/index.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - voidraft - An elegant text snippet recording tool designed for developers. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
-

voidraft

-
- - -
-
- -
- -
-
- voidraft Logo -
-

voidraft

-

An elegant text snippet recording tool

-
- -
-

Designed for developers to record, organize, and manage various text snippets anytime, anywhere.

-
- - - - -

Core Features

- -
-
-
- -
-

Developer-Friendly

-

Multi-language code blocks with syntax highlighting for 30+ programming languages

-
- -
-
- -
-

Code Formatting

-

Built-in Prettier support for one-click code beautification

-
- -
-
- -
-

Custom Themes

-

Dark/Light themes with full customization options

-
- -
-
- -
-

Multi-Window

-

Edit multiple documents simultaneously

-
- -
-
- -
-

Block Editing

-

Split content into independent code blocks with different language settings

-
- -
-
- -
-

Extensions

-

Rainbow brackets, VSCode-style search, color picker, translation tool, and more

-
-
- - -

Preview

- -
-
-
-
- - - -
-
voidraft
-
-
-
-
-
javascript
-
-
-function createDocument() {
-  const doc = new Document();
-  
-  doc.addCodeBlock('javascript', `
-  function greeting(name) {
-    return `Hello, ${name}!`;
-  }
-  
-  console.log(greeting('World'));
-  `);
-  
-  return doc;
-}
-
- -
-
-
text
-
-
-// voidraft - An elegant text snippet recording tool
-// Multi-language support | Code formatting | Custom themes
-// A modern text editor designed for developers
-
-
-
-
- voidraft 界面预览 - -
-
- - -

Technical Stack

- -
    -
  • -
    - Wails3 - Cross-platform desktop application framework -
  • -
  • -
    - Go 1.21+ - Fast and efficient backend language -
  • -
  • -
    - Vue 3 + TypeScript - Modern frontend framework -
  • -
  • -
    - CodeMirror 6 - Modern code editor with extension support -
  • -
  • -
    - SQLite - Lightweight database for document storage -
  • -
-
- - - -
-
- - - - \ No newline at end of file diff --git a/docs/js/changelog.js b/docs/js/changelog.js deleted file mode 100644 index ee55549..0000000 --- a/docs/js/changelog.js +++ /dev/null @@ -1,705 +0,0 @@ -/** - * voidraft - Changelog Script - * 从GitHub API获取发布信息,支持Gitea备用源 - */ - -/** - * 仓库配置类 - */ -class RepositoryConfig { - constructor() { - this.repos = { - github: { - owner: 'landaiqing', - name: 'voidraft', - apiUrl: 'https://api.github.com/repos/landaiqing/voidraft/releases', - releasesUrl: 'https://github.com/landaiqing/voidraft/releases' - }, - gitea: { - owner: 'landaiqing', - name: 'voidraft', - domain: 'git.landaiqing.cn', - apiUrl: 'https://git.landaiqing.cn/api/v1/repos/landaiqing/voidraft/releases', - releasesUrl: 'https://git.landaiqing.cn/landaiqing/voidraft/releases' - } - }; - } - - /** - * 获取仓库配置 - * @param {string} source - 'github' 或 'gitea' - */ - getRepo(source) { - return this.repos[source]; - } - - /** - * 获取所有仓库配置 - */ - getAllRepos() { - return this.repos; - } -} - -/** - * 国际化消息管理类 - */ -class I18nMessages { - constructor() { - this.messages = { - loading: { - en: 'Loading releases...', - zh: '正在加载版本信息...' - }, - noReleases: { - en: 'No release information found', - zh: '没有找到版本发布信息' - }, - fetchError: { - en: 'Failed to load release information. Please try again later.', - zh: '无法获取版本信息,请稍后再试' - }, - githubApiError: { - en: 'GitHub API returned an error status: ', - zh: 'GitHub API返回错误状态: ' - }, - giteaApiError: { - en: 'Gitea API returned an error status: ', - zh: 'Gitea API返回错误状态: ' - }, - dataSource: { - en: 'Data source: ', - zh: '数据来源: ' - }, - downloads: { - en: 'Downloads', - zh: '下载资源' - }, - download: { - en: 'Download', - zh: '下载' - }, - preRelease: { - en: 'Pre-release', - zh: '预发布' - } - }; - } - - /** - * 获取消息 - * @param {string} key - 消息键 - * @param {string} lang - 语言代码 - */ - getMessage(key, lang = 'en') { - return this.messages[key] && this.messages[key][lang] || this.messages[key]['en'] || ''; - } - - /** - * 获取当前语言 - */ - getCurrentLang() { - return window.currentLang || 'en'; - } -} - -/** - * API客户端类 - */ -class APIClient { - constructor(repositoryConfig, i18nMessages) { - this.repositoryConfig = repositoryConfig; - this.i18nMessages = i18nMessages; - } - - /** - * 从指定源获取发布信息 - * @param {string} source - 'github' 或 'gitea' - */ - async fetchReleases(source) { - const repo = this.repositoryConfig.getRepo(source); - const errorMessageKey = source === 'github' ? 'githubApiError' : 'giteaApiError'; - - const options = { - headers: { 'Accept': 'application/json' } - }; - - if (source === 'github') { - return this.fetchFromGitHub(repo, options, errorMessageKey); - } else { - return this.fetchFromGitea(repo, options, errorMessageKey); - } - } - - /** - * 从GitHub获取数据 - * @param {Object} repo - 仓库配置 - * @param {Object} options - 请求选项 - * @param {string} errorMessageKey - 错误消息键 - */ - async fetchFromGitHub(repo, options, errorMessageKey) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); - - options.signal = controller.signal; - options.headers['Accept'] = 'application/vnd.github.v3+json'; - - try { - const response = await fetch(repo.apiUrl, options); - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`${this.i18nMessages.getMessage(errorMessageKey, this.i18nMessages.getCurrentLang())}${response.status}`); - } - - const releases = await response.json(); - - if (!releases || releases.length === 0) { - throw new Error(this.i18nMessages.getMessage('noReleases', this.i18nMessages.getCurrentLang())); - } - - return releases; - } catch (error) { - clearTimeout(timeoutId); - throw error; - } - } - - /** - * 从Gitea获取数据 - * @param {Object} repo - 仓库配置 - * @param {Object} options - 请求选项 - * @param {string} errorMessageKey - 错误消息键 - */ - async fetchFromGitea(repo, options, errorMessageKey) { - const response = await fetch(repo.apiUrl, options); - - if (!response.ok) { - throw new Error(`${this.i18nMessages.getMessage(errorMessageKey, this.i18nMessages.getCurrentLang())}${response.status}`); - } - - const releases = await response.json(); - - if (!releases || releases.length === 0) { - throw new Error(this.i18nMessages.getMessage('noReleases', this.i18nMessages.getCurrentLang())); - } - - return releases; - } -} - -/** - * UI管理类 - */ -class UIManager { - constructor(i18nMessages) { - this.i18nMessages = i18nMessages; - this.elements = { - loading: document.getElementById('loading'), - changelog: document.getElementById('changelog'), - error: document.getElementById('error-message') - }; - } - - /** - * 显示加载状态 - */ - showLoading() { - this.elements.loading.style.display = 'block'; - this.elements.error.style.display = 'none'; - this.elements.changelog.innerHTML = ''; - } - - /** - * 隐藏加载状态 - */ - hideLoading() { - this.elements.loading.style.display = 'none'; - } - - /** - * 显示错误消息 - * @param {string} message - 错误消息 - */ - showError(message) { - const errorMessageElement = this.elements.error.querySelector('p'); - if (errorMessageElement) { - errorMessageElement.textContent = message; - } else { - this.elements.error.textContent = message; - } - this.elements.error.style.display = 'block'; - this.hideLoading(); - } - - /** - * 显示发布信息 - * @param {Array} releases - 发布信息数组 - * @param {string} source - 数据源 - */ - displayReleases(releases, source) { - this.hideLoading(); - - // 清除现有内容 - this.elements.changelog.innerHTML = ''; - - // 创建数据源元素 - const sourceElement = this.createSourceElement(source); - this.elements.changelog.appendChild(sourceElement); - - // 创建发布信息元素 - releases.forEach(release => { - const releaseElement = this.createReleaseElement(release, source); - this.elements.changelog.appendChild(releaseElement); - }); - - this.elements.changelog.style.display = 'block'; - } - - /** - * 创建数据源元素 - * @param {string} source - 数据源 - */ - createSourceElement(source) { - const sourceElement = document.createElement('div'); - sourceElement.className = 'data-source'; - - // 创建带有国际化支持的源标签 - const sourceLabel = document.createElement('span'); - sourceLabel.setAttribute('data-en', this.i18nMessages.getMessage('dataSource', 'en')); - sourceLabel.setAttribute('data-zh', this.i18nMessages.getMessage('dataSource', 'zh')); - sourceLabel.textContent = this.i18nMessages.getMessage('dataSource', this.i18nMessages.getCurrentLang()); - - // 创建链接 - const sourceLink = document.createElement('a'); - const repositoryConfig = new RepositoryConfig(); - sourceLink.href = repositoryConfig.getRepo(source).releasesUrl; - sourceLink.textContent = source === 'github' ? 'GitHub' : 'Gitea'; - sourceLink.target = '_blank'; - - // 组装元素 - sourceElement.appendChild(sourceLabel); - sourceElement.appendChild(sourceLink); - - return sourceElement; - } - - /** - * 创建发布信息元素 - * @param {Object} release - 发布信息对象 - * @param {string} source - 数据源 - */ - createReleaseElement(release, source) { - const releaseElement = document.createElement('div'); - releaseElement.className = 'release'; - - // 格式化发布日期 - const releaseDate = new Date(release.published_at || release.created_at); - const formattedDate = DateFormatter.formatDate(releaseDate); - - // 创建头部 - const headerElement = this.createReleaseHeader(release, formattedDate); - releaseElement.appendChild(headerElement); - - // 添加发布说明 - if (release.body) { - const descriptionElement = document.createElement('div'); - descriptionElement.className = 'release-description markdown-content'; - descriptionElement.innerHTML = MarkdownParser.parseMarkdown(release.body); - releaseElement.appendChild(descriptionElement); - } - - // 添加下载资源 - const assets = AssetManager.getAssetsFromRelease(release, source); - if (assets && assets.length > 0) { - const assetsElement = this.createAssetsElement(assets); - releaseElement.appendChild(assetsElement); - } - - return releaseElement; - } - - /** - * 创建发布信息头部 - */ - createReleaseHeader(release, formattedDate) { - const headerElement = document.createElement('div'); - headerElement.className = 'release-header'; - - // 版本元素 - const versionElement = document.createElement('div'); - versionElement.className = 'release-version'; - - // 版本文本 - const versionText = document.createElement('span'); - versionText.textContent = release.name || release.tag_name; - versionElement.appendChild(versionText); - - // 预发布标记 - if (release.prerelease) { - const preReleaseTag = document.createElement('span'); - preReleaseTag.className = 'release-badge pre-release'; - preReleaseTag.setAttribute('data-en', this.i18nMessages.getMessage('preRelease', 'en')); - preReleaseTag.setAttribute('data-zh', this.i18nMessages.getMessage('preRelease', 'zh')); - preReleaseTag.textContent = this.i18nMessages.getMessage('preRelease', this.i18nMessages.getCurrentLang()); - versionElement.appendChild(preReleaseTag); - } - - // 日期元素 - const dateElement = document.createElement('div'); - dateElement.className = 'release-date'; - dateElement.textContent = formattedDate; - - headerElement.appendChild(versionElement); - headerElement.appendChild(dateElement); - - return headerElement; - } - - /** - * 创建资源文件元素 - * @param {Array} assets - 资源文件数组 - */ - createAssetsElement(assets) { - const assetsElement = document.createElement('div'); - assetsElement.className = 'release-assets'; - - // 资源标题 - const assetsTitle = document.createElement('div'); - assetsTitle.className = 'release-assets-title'; - assetsTitle.setAttribute('data-en', this.i18nMessages.getMessage('downloads', 'en')); - assetsTitle.setAttribute('data-zh', this.i18nMessages.getMessage('downloads', 'zh')); - assetsTitle.textContent = this.i18nMessages.getMessage('downloads', this.i18nMessages.getCurrentLang()); - - // 资源列表 - const assetList = document.createElement('ul'); - assetList.className = 'asset-list'; - - // 添加每个资源 - assets.forEach(asset => { - const assetItem = this.createAssetItem(asset); - assetList.appendChild(assetItem); - }); - - assetsElement.appendChild(assetsTitle); - assetsElement.appendChild(assetList); - - return assetsElement; - } - - /** - * 创建资源文件项 - * @param {Object} asset - 资源文件对象 - */ - createAssetItem(asset) { - const assetItem = document.createElement('li'); - assetItem.className = 'asset-item'; - - // 文件图标 - const iconElement = document.createElement('i'); - iconElement.className = `asset-icon fas fa-${FileIconHelper.getFileIcon(asset.name)}`; - - // 文件名 - const nameElement = document.createElement('span'); - nameElement.className = 'asset-name'; - nameElement.textContent = asset.name; - - // 文件大小 - const sizeElement = document.createElement('span'); - sizeElement.className = 'asset-size'; - sizeElement.textContent = FileSizeFormatter.formatFileSize(asset.size); - - // 下载链接 - const downloadLink = document.createElement('a'); - downloadLink.className = 'download-btn'; - downloadLink.href = asset.browser_download_url; - downloadLink.target = '_blank'; - downloadLink.setAttribute('data-en', this.i18nMessages.getMessage('download', 'en')); - downloadLink.setAttribute('data-zh', this.i18nMessages.getMessage('download', 'zh')); - downloadLink.textContent = this.i18nMessages.getMessage('download', this.i18nMessages.getCurrentLang()); - - // 组装资源项 - assetItem.appendChild(iconElement); - assetItem.appendChild(nameElement); - assetItem.appendChild(sizeElement); - assetItem.appendChild(downloadLink); - - return assetItem; - } -} - -/** - * 资源管理器类 - */ -class AssetManager { - /** - * 从发布信息中获取资源文件 - * @param {Object} release - 发布信息对象 - * @param {string} source - 数据源 - */ - static getAssetsFromRelease(release, source) { - let assets = []; - - if (source === 'github') { - assets = release.assets || []; - } else { // Gitea - assets = release.assets || []; - // 检查Gitea特定的资源结构 - if (!assets.length && release.attachments) { - assets = release.attachments.map(attachment => ({ - name: attachment.name, - size: attachment.size, - browser_download_url: attachment.browser_download_url - })); - } - } - - return assets; - } -} - -/** - * 文件图标助手类 - */ -class FileIconHelper { - /** - * 根据文件扩展名获取图标 - * @param {string} filename - 文件名 - */ - static getFileIcon(filename) { - const extension = filename.split('.').pop().toLowerCase(); - - const iconMap = { - 'exe': 'download', - 'msi': 'download', - 'dmg': 'download', - 'pkg': 'download', - 'deb': 'download', - 'rpm': 'download', - 'tar': 'file-archive', - 'gz': 'file-archive', - 'zip': 'file-archive', - '7z': 'file-archive', - 'rar': 'file-archive', - 'pdf': 'file-pdf', - 'txt': 'file-alt', - 'md': 'file-alt', - 'json': 'file-code', - 'xml': 'file-code', - 'yml': 'file-code', - 'yaml': 'file-code' - }; - - return iconMap[extension] || 'file'; - } -} - -/** - * 文件大小格式化器类 - */ -class FileSizeFormatter { - /** - * 格式化文件大小 - * @param {number} bytes - 字节数 - */ - static formatFileSize(bytes) { - if (!bytes) return ''; - - const sizes = ['B', 'KB', 'MB', 'GB']; - const i = Math.floor(Math.log(bytes) / Math.log(1024)); - - return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i]; - } -} - -/** - * 日期格式化器类 - */ -class DateFormatter { - /** - * 格式化日期 - * @param {Date} date - 日期对象 - */ - static formatDate(date) { - const options = { - year: 'numeric', - month: 'long', - day: 'numeric' - }; - - const lang = window.currentLang || 'en'; - const locale = lang === 'zh' ? 'zh-CN' : 'en-US'; - - return date.toLocaleDateString(locale, options); - } -} - -/** - * Markdown解析器类 - */ -class MarkdownParser { - /** - * 简单的Markdown解析 - * @param {string} markdown - Markdown文本 - */ - static parseMarkdown(markdown) { - if (!markdown) return ''; - - // 预处理:保留原始换行符,用特殊标记替换 - const preservedLineBreaks = '___LINE_BREAK___'; - markdown = markdown.replace(/\n/g, preservedLineBreaks); - - // 引用块 - > text - markdown = markdown.replace(/>\s*(.*?)(?=>|$)/g, '
$1
'); - markdown = markdown.replace(/>\s*(.*?)(?=>|$)/g, '
$1
'); - - // 链接 - [text](url) - markdown = markdown.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1'); - - // 标题 - # Heading - markdown = markdown.replace(/^### (.*?)(?=___LINE_BREAK___|$)/gm, '

$1

'); - markdown = markdown.replace(/^## (.*?)(?=___LINE_BREAK___|$)/gm, '

$1

'); - markdown = markdown.replace(/^# (.*?)(?=___LINE_BREAK___|$)/gm, '

$1

'); - - // 粗体 - **text** - markdown = markdown.replace(/\*\*(.*?)\*\*/g, '$1'); - - // 斜体 - *text* - markdown = markdown.replace(/\*(.*?)\*/g, '$1'); - - // 代码块 - ```code``` - markdown = markdown.replace(/```([\s\S]*?)```/g, '
$1
'); - - // 行内代码 - `code` - markdown = markdown.replace(/`([^`]+)`/g, '$1'); - - // 处理列表项 - // 先将每个列表项转换为HTML - markdown = markdown.replace(/- (.*?)(?=___LINE_BREAK___- |___LINE_BREAK___$|$)/g, '
  • $1
  • '); - markdown = markdown.replace(/\* (.*?)(?=___LINE_BREAK___\* |___LINE_BREAK___$|$)/g, '
  • $1
  • '); - markdown = markdown.replace(/\d+\. (.*?)(?=___LINE_BREAK___\d+\. |___LINE_BREAK___$|$)/g, '
  • $1
  • '); - - // 然后将连续的列表项包装在ul或ol中 - const listItemRegex = /
  • .*?<\/li>/g; - const listItems = markdown.match(listItemRegex) || []; - - if (listItems.length > 0) { - // 将连续的列表项组合在一起 - let lastIndex = 0; - let result = ''; - let inList = false; - - listItems.forEach(item => { - const itemIndex = markdown.indexOf(item, lastIndex); - - // 添加列表项之前的内容 - if (itemIndex > lastIndex) { - result += markdown.substring(lastIndex, itemIndex); - } - - // 如果不在列表中,开始一个新列表 - if (!inList) { - result += ''; - inList = false; - } - }); - - // 添加剩余内容 - if (lastIndex < markdown.length) { - result += markdown.substring(lastIndex); - } - - markdown = result; - } - - // 处理水平分隔线 - markdown = markdown.replace(/---/g, '
    '); - - // 恢复换行符 - markdown = markdown.replace(/___LINE_BREAK___/g, '
    '); - - // 处理段落 - markdown = markdown.replace(/

    /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