diff --git a/.vscode/settings.json b/.vscode/settings.json
index 774dc4f5..f962b244 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -31,6 +31,7 @@
"unocss.root": [
"./docs",
"./packages/vitepress-plugin-enhanced-readabilities",
- "./packages/vitepress-plugin-inline-link-preview"
+ "./packages/vitepress-plugin-inline-link-preview",
+ "./packages/sidecar-annotations"
]
}
diff --git a/docs/.vitepress/plugins/markdownTransform.ts b/docs/.vitepress/plugins/markdownTransform.ts
new file mode 100644
index 00000000..67f0dca7
--- /dev/null
+++ b/docs/.vitepress/plugins/markdownTransform.ts
@@ -0,0 +1,21 @@
+import { relative, resolve } from 'node:path'
+import type { Plugin } from 'vite'
+
+const ROOT = resolve(__dirname, '../../')
+
+export function MarkdownTransform(): Plugin {
+ return {
+ name: 'docs-md-transform',
+ enforce: 'pre',
+ async transform(code, id) {
+ if (!id.endsWith('.md'))
+ return null
+
+ // 将 ID 转换为相对路径,便于进行正则匹配
+ id = relative(ROOT, id)
+ code = `${code}\n\n`
+
+ return code
+ },
+ }
+}
diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts
index cff79842..cdbdd3c2 100644
--- a/docs/.vitepress/theme/index.ts
+++ b/docs/.vitepress/theme/index.ts
@@ -14,10 +14,15 @@ import {
NolebaseInlineLinkPreviewPlugin,
} from '@nolebase/vitepress-plugin-inline-link-preview'
+import {
+ CommentAnnotation,
+} from '@nolebase/sidecar-annotations'
+
import 'virtual:uno.css'
import '@nolebase/vitepress-plugin-enhanced-readabilities/dist/style.css'
import '@nolebase/vitepress-plugin-inline-link-preview/dist/style.css'
+import '@nolebase/sidecar-annotations/dist/style.css'
import './styles/vars.css'
import './styles/main.css'
@@ -38,6 +43,7 @@ export const Theme: ThemeConfig = {
},
enhanceApp({ app }) {
app.component('IntegrationCard', IntegrationCard)
+ app.component('CommentAnnotation', CommentAnnotation)
app.use(NolebaseInlineLinkPreviewPlugin)
app.provide(NolebaseEnhancedReadabilitiesInjectionKey, {
layoutSwitch: {
diff --git a/docs/package.json b/docs/package.json
index 5725ffb8..986e49d0 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -14,6 +14,7 @@
"@iconify-json/octicon": "^1.1.49",
"@nolebase/markdown-it-bi-directional-links": "workspace:^",
"@nolebase/markdown-it-element-transform": "workspace:^",
+ "@nolebase/sidecar-annotations": "workspace:^",
"@nolebase/vitepress-plugin-enhanced-readabilities": "workspace:^",
"@nolebase/vitepress-plugin-inline-link-preview": "workspace:^",
"unocss": "^0.55.7",
diff --git a/docs/vite.config.ts b/docs/vite.config.ts
index ef13c97c..8f76b4b8 100644
--- a/docs/vite.config.ts
+++ b/docs/vite.config.ts
@@ -1,5 +1,6 @@
import { defineConfig } from 'vite'
import UnoCSS from 'unocss/vite'
+import { MarkdownTransform } from './.vitepress/plugins/markdownTransform'
export default defineConfig(async () => {
return {
@@ -9,6 +10,7 @@ export default defineConfig(async () => {
},
plugins: [
UnoCSS(),
+ MarkdownTransform(),
],
}
})
diff --git a/packages/sidecar-annotations/README.md b/packages/sidecar-annotations/README.md
new file mode 100644
index 00000000..cfdffb9a
--- /dev/null
+++ b/packages/sidecar-annotations/README.md
@@ -0,0 +1,27 @@
+# `@nolebase/vitepress-plugin-inline-link-preview`
+
+A VitePress plugin that adds a inline popup to help you preview links while reading.
+
+## Install
+
+### Npm
+
+```shell
+npm i @nolebase/vitepress-plugin-inline-link-preview
+```
+
+### Yarn
+
+```shell
+yarn add @nolebase/vitepress-plugin-inline-link-preview
+```
+
+### Pnpm
+
+```shell
+pnpm add @nolebase/vitepress-plugin-inline-link-preview
+```
+
+## Documentation
+
+Please refer to [Inline Links Previewing](https://nolebase-integrations.ayaka.io/pages/en/integrations/vitepress-plugin-inline-link-preview/) for more information.
diff --git a/packages/sidecar-annotations/package.json b/packages/sidecar-annotations/package.json
new file mode 100644
index 00000000..42f91007
--- /dev/null
+++ b/packages/sidecar-annotations/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "@nolebase/sidecar-annotations",
+ "type": "module",
+ "version": "1.1.1",
+ "description": "A VitePress plugin that adds a inline popup to help you preview links while reading.",
+ "author": {
+ "name": "Nólëbase",
+ "email": "nolebase@ayaka.moe",
+ "url": "https://github.com/nolebase"
+ },
+ "license": "MIT",
+ "homepage": "https://nolebase-integrations.ayaka.io/pages/en/integrations/vitepress-plugin-inline-link-preview/",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/nolebase/integrations.git",
+ "directory": "packages/vitepress-plugin-inline-link-preview"
+ },
+ "keywords": [
+ "vitepress",
+ "nolebase",
+ "a11y",
+ "readabilities",
+ "markdown",
+ "vitepress-plugin",
+ "nolebase-integration"
+ ],
+ "sideEffects": false,
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.js",
+ "require": "./dist/index.umd.cjs"
+ },
+ "./dist/style.css": "./dist/style.css"
+ },
+ "main": "./dist/index.umd.cjs",
+ "module": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "files": [
+ "dist",
+ "package.json",
+ "README.md"
+ ],
+ "scripts": {
+ "stub": "concurrently \"nr dev\" \"nr emit-types\"",
+ "dev": "vite build --mode development --watch",
+ "emit-types": "vue-tsc --declaration --emitDeclarationOnly",
+ "build": "vite build && vue-tsc --declaration --emitDeclarationOnly"
+ },
+ "peerDependencies": {
+ "vue": ">=3.2.0"
+ },
+ "devDependencies": {
+ "@iconify-json/tabler": "^1.1.92",
+ "@vitejs/plugin-vue": "^4.3.4",
+ "@vueuse/core": "^10.4.1",
+ "less": "^4.2.0",
+ "unocss": "^0.55.7",
+ "vite": "^4.4.9",
+ "vue": "^3.3.4",
+ "vue-tsc": "^1.8.11"
+ }
+}
diff --git a/packages/sidecar-annotations/src/components/CommentAnnotationItem.vue b/packages/sidecar-annotations/src/components/CommentAnnotationItem.vue
new file mode 100644
index 00000000..29b2b659
--- /dev/null
+++ b/packages/sidecar-annotations/src/components/CommentAnnotationItem.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/sidecar-annotations/src/components/CommentAnnotations.vue b/packages/sidecar-annotations/src/components/CommentAnnotations.vue
new file mode 100644
index 00000000..807400bf
--- /dev/null
+++ b/packages/sidecar-annotations/src/components/CommentAnnotations.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/packages/sidecar-annotations/src/components/FloatingUserAvatar.vue b/packages/sidecar-annotations/src/components/FloatingUserAvatar.vue
new file mode 100644
index 00000000..894d1812
--- /dev/null
+++ b/packages/sidecar-annotations/src/components/FloatingUserAvatar.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/packages/sidecar-annotations/src/index.ts b/packages/sidecar-annotations/src/index.ts
new file mode 100644
index 00000000..f9aa0b89
--- /dev/null
+++ b/packages/sidecar-annotations/src/index.ts
@@ -0,0 +1,7 @@
+import CommentAnnotation from './components/CommentAnnotations.vue'
+
+import 'virtual:uno.css'
+
+export {
+ CommentAnnotation,
+}
diff --git a/packages/sidecar-annotations/tsconfig.json b/packages/sidecar-annotations/tsconfig.json
new file mode 100644
index 00000000..7da3a46f
--- /dev/null
+++ b/packages/sidecar-annotations/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "extends": "../../tsconfig.json",
+ "exclude": [
+ "**/dist/**",
+ "./uno.config.ts",
+ "./vite.config.ts"
+ ],
+ "include": [
+ "**/*.ts",
+ "**/*.d.ts",
+ "**/*.vue",
+ "**/*.tsx"
+ ],
+ "compilerOptions": {
+ "declaration": false,
+ "composite": false,
+ "outDir": "./dist",
+ "noImplicitAny": false,
+ "skipLibCheck": true,
+ "types": []
+ },
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ]
+}
diff --git a/packages/sidecar-annotations/tsconfig.node.json b/packages/sidecar-annotations/tsconfig.node.json
new file mode 100644
index 00000000..775b584f
--- /dev/null
+++ b/packages/sidecar-annotations/tsconfig.node.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "target": "ESNext",
+ "moduleResolution": "Node"
+ },
+ "include": [
+ "vite.config.ts"
+ ]
+}
diff --git a/packages/sidecar-annotations/uno.config.ts b/packages/sidecar-annotations/uno.config.ts
new file mode 100644
index 00000000..a3630248
--- /dev/null
+++ b/packages/sidecar-annotations/uno.config.ts
@@ -0,0 +1,21 @@
+import { defineConfig, presetAttributify, presetIcons, presetUno } from 'unocss'
+
+export default defineConfig({
+ shortcuts: [],
+ presets: [
+ presetUno({
+ dark: 'class',
+ }),
+ presetAttributify(),
+ presetIcons({
+ prefix: 'i-',
+ scale: 1.2, // size: 1.2 rem
+ extraProperties: {
+ 'display': 'inline-block',
+ 'vertical-align': 'middle',
+ 'min-width': '1.2rem',
+ },
+ warn: true,
+ }),
+ ],
+})
diff --git a/packages/sidecar-annotations/vite.config.ts b/packages/sidecar-annotations/vite.config.ts
new file mode 100644
index 00000000..9759fdf6
--- /dev/null
+++ b/packages/sidecar-annotations/vite.config.ts
@@ -0,0 +1,33 @@
+import Vue from '@vitejs/plugin-vue'
+import { defineConfig } from 'vite'
+import Unocss from 'unocss/vite'
+
+export default defineConfig({
+ resolve: {
+ dedupe: [
+ 'vue',
+ '@vue/runtime-core',
+ ],
+ },
+ plugins: [
+ Vue(),
+ Unocss(),
+ ],
+ build: {
+ lib: {
+ entry: 'src/index.ts',
+ name: '@nolebase/sidecar-annotations',
+ fileName: 'index',
+ },
+ rollupOptions: {
+ external: [
+ 'vue',
+ ],
+ output: {
+ globals: {
+ vue: 'Vue',
+ },
+ },
+ },
+ },
+})
diff --git a/packages/vitepress-plugin-enhanced-readabilities/src/components/SpotlightHoverBlock.vue b/packages/vitepress-plugin-enhanced-readabilities/src/components/SpotlightHoverBlock.vue
index c29e2ec8..4970c7ee 100644
--- a/packages/vitepress-plugin-enhanced-readabilities/src/components/SpotlightHoverBlock.vue
+++ b/packages/vitepress-plugin-enhanced-readabilities/src/components/SpotlightHoverBlock.vue
@@ -129,7 +129,6 @@ watch(() => props.enabled, (val) => {
focusable="false"
fixed z-50
pointer-events-none
- border="1 $vp-c-brand"
class="VPNolebaseSpotlightHoverBlock"
/>
diff --git a/packages/vitepress-plugin-inline-link-preview/src/components/PopupIframe.vue b/packages/vitepress-plugin-inline-link-preview/src/components/PopupIframe.vue
index 26945e51..eaf8f11d 100644
--- a/packages/vitepress-plugin-inline-link-preview/src/components/PopupIframe.vue
+++ b/packages/vitepress-plugin-inline-link-preview/src/components/PopupIframe.vue
@@ -71,7 +71,7 @@ async function handleIframeOnLoad(e: Event) {
setTimeout(() => {
iframeNotReady.value = false
- }, 250)
+ }, 100)
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d1bc8a69..104b661e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -63,6 +63,9 @@ importers:
'@nolebase/markdown-it-element-transform':
specifier: workspace:^
version: link:../packages/markdown-it-element-transform
+ '@nolebase/sidecar-annotations':
+ specifier: workspace:^
+ version: link:../packages/sidecar-annotations
'@nolebase/vitepress-plugin-enhanced-readabilities':
specifier: workspace:^
version: link:../packages/vitepress-plugin-enhanced-readabilities
@@ -101,6 +104,33 @@ importers:
specifier: ^13.0.1
version: 13.0.1
+ packages/sidecar-annotations:
+ devDependencies:
+ '@iconify-json/tabler':
+ specifier: ^1.1.92
+ version: 1.1.92
+ '@vitejs/plugin-vue':
+ specifier: ^4.3.4
+ version: 4.3.4(vite@4.4.9)(vue@3.3.4)
+ '@vueuse/core':
+ specifier: ^10.4.1
+ version: 10.4.1(vue@3.3.4)
+ less:
+ specifier: ^4.2.0
+ version: 4.2.0
+ unocss:
+ specifier: ^0.55.7
+ version: 0.55.7(postcss@8.4.28)(rollup@3.28.1)(vite@4.4.9)
+ vite:
+ specifier: ^4.4.9
+ version: 4.4.9(@types/node@20.6.0)(less@4.2.0)
+ vue:
+ specifier: ^3.3.4
+ version: 3.3.4
+ vue-tsc:
+ specifier: ^1.8.11
+ version: 1.8.11(typescript@5.1.6)
+
packages/vitepress-plugin-enhanced-readabilities:
devDependencies:
'@iconify-json/carbon':
@@ -1192,6 +1222,12 @@ packages:
'@iconify/types': 2.0.0
dev: true
+ /@iconify-json/tabler@1.1.92:
+ resolution: {integrity: sha512-zZD5uSYz6uNZ/qh9T4l3BObTq03A7NcY+9dV4jVgYhdw9fc7JZmFFA7rJkybfHHrlDRq548hmDCmEJuR9blLdg==}
+ dependencies:
+ '@iconify/types': 2.0.0
+ dev: true
+
/@iconify/types@2.0.0:
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
dev: true