@tnotesjs/core 0.1.22 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +87 -87
  2. package/package.json +1 -1
  3. package/types/config.ts +60 -60
  4. package/types/index.ts +11 -11
  5. package/types/note.ts +33 -33
  6. package/vitepress/assets/icons/icon__check.svg +3 -3
  7. package/vitepress/assets/icons/icon__clipboard.svg +7 -7
  8. package/vitepress/assets/icons/icon__close.svg +1 -1
  9. package/vitepress/assets/icons/icon__collapse.svg +1 -1
  10. package/vitepress/assets/icons/icon__confirm.svg +1 -1
  11. package/vitepress/assets/icons/icon__copy.svg +4 -4
  12. package/vitepress/assets/icons/icon__focus.svg +1 -1
  13. package/vitepress/assets/icons/icon__fold.svg +3 -3
  14. package/vitepress/assets/icons/icon__folder.svg +1 -1
  15. package/vitepress/assets/icons/icon__fullscreen.svg +1 -1
  16. package/vitepress/assets/icons/icon__fullscreen_exit.svg +1 -1
  17. package/vitepress/assets/icons/icon__github.svg +3 -3
  18. package/vitepress/assets/icons/icon__mindmap.svg +1 -1
  19. package/vitepress/assets/icons/icon__next.svg +1 -1
  20. package/vitepress/assets/icons/icon__number_gray.svg +1 -1
  21. package/vitepress/assets/icons/icon__number_purple.svg +1 -1
  22. package/vitepress/assets/icons/icon__prev.svg +1 -1
  23. package/vitepress/assets/icons/icon__restore.svg +1 -1
  24. package/vitepress/assets/icons/icon__rotate.svg +4 -4
  25. package/vitepress/assets/icons/icon__search.svg +1 -1
  26. package/vitepress/assets/icons/icon__sidebar_collapsed.svg +1 -1
  27. package/vitepress/assets/icons/icon__sidebar_opened.svg +1 -1
  28. package/vitepress/assets/icons/icon__totop.svg +5 -5
  29. package/vitepress/assets/icons/icon__vscode.svg +5 -5
  30. package/vitepress/assets/icons/icon__zoom_fit.svg +1 -1
  31. package/vitepress/assets/icons/icon__zoom_in.svg +1 -1
  32. package/vitepress/assets/icons/icon__zoom_out.svg +1 -1
  33. package/vitepress/assets/icons/icon__zoom_reset.svg +1 -1
  34. package/vitepress/assets/icons/index.ts +39 -39
  35. package/vitepress/components/BilibiliOutsidePlayer/BilibiliOutsidePlayer.vue +20 -20
  36. package/vitepress/components/CodeBlockFullscreen/CodeBlockFullscreen.vue +369 -369
  37. package/vitepress/components/CodeBlockFullscreen/index.ts +209 -209
  38. package/vitepress/components/CodeBlockFullscreen/styles.css +126 -126
  39. package/vitepress/components/Discussions/Discussions.vue +242 -242
  40. package/vitepress/components/EnWordList/EnWordList.vue +664 -664
  41. package/vitepress/components/EnWordList/RightClickMenu.vue +87 -87
  42. package/vitepress/components/Footprints/Footprints.vue +472 -472
  43. package/vitepress/components/Layout/AboutModal.vue +329 -329
  44. package/vitepress/components/Layout/AboutPanel.vue +485 -485
  45. package/vitepress/components/Layout/ContentCollapse.vue +591 -591
  46. package/vitepress/components/Layout/CustomSidebar.vue +817 -817
  47. package/vitepress/components/Layout/DocBeforeControls.vue +145 -145
  48. package/vitepress/components/Layout/DocFooter.vue +233 -233
  49. package/vitepress/components/Layout/ImagePreview.vue +485 -485
  50. package/vitepress/components/Layout/Layout.vue +744 -744
  51. package/vitepress/components/Layout/NoteStatus.vue +140 -140
  52. package/vitepress/components/Layout/SidebarItems.vue +1083 -1083
  53. package/vitepress/components/Layout/SidebarNavBefore.vue +170 -170
  54. package/vitepress/components/Layout/SidebarResizeHandle.vue +311 -311
  55. package/vitepress/components/Layout/Swiper.vue +167 -167
  56. package/vitepress/components/Layout/ToggleFullContent.vue +45 -45
  57. package/vitepress/components/Layout/ToggleSidebar.vue +35 -35
  58. package/vitepress/components/Layout/composables/useCollapseControl.ts +88 -88
  59. package/vitepress/components/Layout/composables/useNoteConfig.ts +119 -119
  60. package/vitepress/components/Layout/composables/useNoteSave.ts +178 -178
  61. package/vitepress/components/Layout/composables/useNoteValidation.ts +85 -85
  62. package/vitepress/components/Layout/composables/useRedirect.ts +113 -113
  63. package/vitepress/components/Layout/composables/useSidebarLayout.ts +122 -122
  64. package/vitepress/components/Layout/composables/useVSCodeIntegration.ts +85 -85
  65. package/vitepress/components/Layout/homeReadme.data.ts +124 -124
  66. package/vitepress/components/MarkMap/MarkMap.vue +562 -562
  67. package/vitepress/components/Mermaid/Mermaid.vue +644 -644
  68. package/vitepress/components/NotesTable/NotesTable.vue +175 -175
  69. package/vitepress/components/NotesTable/README.md +67 -67
  70. package/vitepress/components/Settings/Settings.vue +711 -711
  71. package/vitepress/components/SidebarCard/MindMapView.vue +484 -484
  72. package/vitepress/components/SidebarCard/NotesTrendChart.vue +108 -108
  73. package/vitepress/components/SidebarCard/SidebarCard.vue +945 -945
  74. package/vitepress/components/Tooltip/Tooltip.vue +70 -70
  75. package/vitepress/components/constants.ts +109 -109
  76. package/vitepress/components/notesConfig.data.ts +73 -73
  77. package/vitepress/components/sidebar.data.ts +59 -59
  78. package/vitepress/components/tnotes-config.data.ts +21 -21
  79. package/vitepress/components/utils.ts +26 -26
  80. package/vitepress/config/index.ts +169 -169
  81. package/vitepress/configs/constants.ts +26 -26
  82. package/vitepress/configs/head.config.ts +25 -25
  83. package/vitepress/configs/index.ts +9 -9
  84. package/vitepress/configs/markdown-it.d.ts +23 -23
  85. package/vitepress/configs/markdown.config.ts +368 -368
  86. package/vitepress/configs/theme.config.ts +108 -108
  87. package/vitepress/plugins/buildProgressPlugin.ts +434 -434
  88. package/vitepress/plugins/getNoteByConfigIdPlugin.ts +107 -107
  89. package/vitepress/plugins/renameNotePlugin.ts +68 -68
  90. package/vitepress/plugins/sidebarStructurePlugin.ts +260 -260
  91. package/vitepress/plugins/updateConfigPlugin.ts +63 -63
  92. package/vitepress/theme/index.ts +137 -137
  93. package/vitepress/theme/styles/base.scss +66 -64
  94. package/vitepress/theme/styles/components/404.scss +31 -31
  95. package/vitepress/theme/styles/components/collapse.scss +172 -172
  96. package/vitepress/theme/styles/components/markmap.scss +101 -101
  97. package/vitepress/theme/styles/components/swiper.scss +255 -255
  98. package/vitepress/theme/styles/index.scss +25 -25
  99. package/vitepress/theme/styles/layout.scss +78 -78
  100. package/vitepress/theme/styles/utilities.scss +39 -39
  101. package/vitepress/theme/styles/vitepress-override.scss +25 -25
@@ -1,167 +1,167 @@
1
- <template></template>
2
-
3
- <script setup>
4
- import { useData, onContentUpdated } from 'vitepress'
5
- import { ref, onMounted, onBeforeUnmount } from 'vue'
6
-
7
- import 'swiper/css'
8
-
9
- const vpData = useData()
10
-
11
- const swiperInstances = ref([])
12
-
13
- const initSwiper = () => {
14
- // 先清理旧实例
15
- destroySwiper()
16
-
17
- // 只在客户端动态加载
18
- import('swiper').then(({ default: Swiper }) => {
19
- import('swiper/modules').then(({ Navigation, Pagination }) => {
20
- const wrappers = document.querySelectorAll('.tn-swiper')
21
- wrappers.forEach((wrap) => {
22
- const container = wrap.querySelector('.swiper-container')
23
- const tabsEl = wrap.querySelector('.tn-swiper-tabs')
24
- if (!container || !tabsEl) return
25
-
26
- const instance = new Swiper(container, {
27
- // loop: false,
28
- // TODO 可配置
29
- // effect: 'fade',
30
- speed: 0, // 禁用动画
31
- on: {
32
- slideChange: () => {
33
- updateActiveTab(wrap, instance.activeIndex)
34
- updateContainerHeight(container, instance.activeIndex)
35
- },
36
- // 在初始化时也设置一次高度
37
- afterInit: () => {
38
- setTimeout(() => {
39
- updateContainerHeight(container, instance.activeIndex)
40
- }, 0)
41
- },
42
- },
43
- })
44
-
45
- // 生成 tabs(文案来自 data-title;为空则为 'img')
46
- const slides = wrap.querySelectorAll('.swiper-slide')
47
- const isTnTabNavVisible = slides.length >= 2
48
- tabsEl.innerHTML = ''
49
-
50
- // 微调 tabs 容器样式
51
- if (isTnTabNavVisible) {
52
- tabsEl.style.padding = '0 0.8rem 0 3rem'
53
- } else {
54
- tabsEl.style.padding = '0 0.8rem'
55
- }
56
-
57
- // 左按钮 - 上一页
58
- if (isTnTabNavVisible) {
59
- const prevBtn = document.createElement('button')
60
- prevBtn.type = 'button'
61
- prevBtn.className = 'tn-tab-nav tn-tab-prev'
62
- prevBtn.textContent = '<'
63
- prevBtn.title = '上一页'
64
- prevBtn.addEventListener('click', () => {
65
- if (instance.activeIndex === 0) {
66
- // 到头 -> 跳到最后一张
67
- instance.slideTo(slides.length - 1)
68
- } else {
69
- instance.slidePrev()
70
- }
71
- setTimeout(() => {
72
- updateContainerHeight(container, instance.activeIndex)
73
- }, 0)
74
- })
75
- tabsEl.appendChild(prevBtn)
76
-
77
- const line = document.createElement('span')
78
- line.className = 'tn-tab-nav tab-tab-line'
79
- line.textContent = '/'
80
- tabsEl.appendChild(line)
81
- }
82
-
83
- slides.forEach((slide, i) => {
84
- const label = slide.getAttribute('data-title') || 'img'
85
- const btn = document.createElement('button')
86
- btn.type = 'button'
87
- btn.className = 'tn-tab' + (i === 0 ? ' active' : '')
88
- btn.textContent = label
89
- btn.addEventListener('click', () => {
90
- instance.slideTo(i)
91
- // 点击tab时更新高度
92
- setTimeout(() => {
93
- updateContainerHeight(container, i)
94
- }, 0)
95
- })
96
- tabsEl.appendChild(btn)
97
- })
98
-
99
- // 右按钮 - 下一页
100
- if (isTnTabNavVisible) {
101
- const nextBtn = document.createElement('button')
102
- nextBtn.type = 'button'
103
- nextBtn.className = 'tn-tab-nav tn-tab-next'
104
- nextBtn.textContent = '>'
105
- nextBtn.title = '下一页'
106
- nextBtn.addEventListener('click', () => {
107
- if (instance.activeIndex === slides.length - 1) {
108
- // 到头 -> 跳到第一张
109
- instance.slideTo(0)
110
- } else {
111
- instance.slideNext()
112
- }
113
- setTimeout(() => {
114
- updateContainerHeight(container, instance.activeIndex)
115
- }, 0)
116
- })
117
- tabsEl.appendChild(nextBtn)
118
- }
119
-
120
- swiperInstances.value.push(instance)
121
- })
122
- })
123
- })
124
- }
125
-
126
- function updateActiveTab(wrap, activeIndex) {
127
- const btns = wrap.querySelectorAll('.tn-swiper-tabs .tn-tab')
128
- btns.forEach((b, i) => b.classList.toggle('active', i === activeIndex))
129
- }
130
-
131
- // 新增函数:根据当前slide中的图片高度更新容器高度
132
- function updateContainerHeight(container, activeIndex) {
133
- const slides = container.querySelectorAll('.swiper-slide')
134
- if (slides[activeIndex]) {
135
- const img = slides[activeIndex].querySelector('img')
136
- if (img && img.complete) {
137
- // 如果图片已加载完成,直接设置高度
138
- container.style.height = img.offsetHeight + 'px'
139
- } else if (img) {
140
- // 如果图片未加载完成,等待加载完成后设置高度
141
- img.onload = () => {
142
- container.style.height = img.offsetHeight + 'px'
143
- }
144
- }
145
- }
146
- }
147
-
148
- function destroySwiper() {
149
- swiperInstances.value.forEach((inst) => {
150
- try {
151
- inst.destroy(true, true)
152
- } catch {}
153
- })
154
- swiperInstances.value = []
155
- }
156
-
157
- onBeforeUnmount(destroySwiper)
158
-
159
- onMounted(() => {
160
- initSwiper()
161
- })
162
-
163
- // 监听内容更新(包括 HMR 和路由变化)
164
- onContentUpdated(() => {
165
- initSwiper()
166
- })
167
- </script>
1
+ <template></template>
2
+
3
+ <script setup>
4
+ import { useData, onContentUpdated } from 'vitepress'
5
+ import { ref, onMounted, onBeforeUnmount } from 'vue'
6
+
7
+ import 'swiper/css'
8
+
9
+ const vpData = useData()
10
+
11
+ const swiperInstances = ref([])
12
+
13
+ const initSwiper = () => {
14
+ // 先清理旧实例
15
+ destroySwiper()
16
+
17
+ // 只在客户端动态加载
18
+ import('swiper').then(({ default: Swiper }) => {
19
+ import('swiper/modules').then(({ Navigation, Pagination }) => {
20
+ const wrappers = document.querySelectorAll('.tn-swiper')
21
+ wrappers.forEach((wrap) => {
22
+ const container = wrap.querySelector('.swiper-container')
23
+ const tabsEl = wrap.querySelector('.tn-swiper-tabs')
24
+ if (!container || !tabsEl) return
25
+
26
+ const instance = new Swiper(container, {
27
+ // loop: false,
28
+ // TODO 可配置
29
+ // effect: 'fade',
30
+ speed: 0, // 禁用动画
31
+ on: {
32
+ slideChange: () => {
33
+ updateActiveTab(wrap, instance.activeIndex)
34
+ updateContainerHeight(container, instance.activeIndex)
35
+ },
36
+ // 在初始化时也设置一次高度
37
+ afterInit: () => {
38
+ setTimeout(() => {
39
+ updateContainerHeight(container, instance.activeIndex)
40
+ }, 0)
41
+ },
42
+ },
43
+ })
44
+
45
+ // 生成 tabs(文案来自 data-title;为空则为 'img')
46
+ const slides = wrap.querySelectorAll('.swiper-slide')
47
+ const isTnTabNavVisible = slides.length >= 2
48
+ tabsEl.innerHTML = ''
49
+
50
+ // 微调 tabs 容器样式
51
+ if (isTnTabNavVisible) {
52
+ tabsEl.style.padding = '0 0.8rem 0 3rem'
53
+ } else {
54
+ tabsEl.style.padding = '0 0.8rem'
55
+ }
56
+
57
+ // 左按钮 - 上一页
58
+ if (isTnTabNavVisible) {
59
+ const prevBtn = document.createElement('button')
60
+ prevBtn.type = 'button'
61
+ prevBtn.className = 'tn-tab-nav tn-tab-prev'
62
+ prevBtn.textContent = '<'
63
+ prevBtn.title = '上一页'
64
+ prevBtn.addEventListener('click', () => {
65
+ if (instance.activeIndex === 0) {
66
+ // 到头 -> 跳到最后一张
67
+ instance.slideTo(slides.length - 1)
68
+ } else {
69
+ instance.slidePrev()
70
+ }
71
+ setTimeout(() => {
72
+ updateContainerHeight(container, instance.activeIndex)
73
+ }, 0)
74
+ })
75
+ tabsEl.appendChild(prevBtn)
76
+
77
+ const line = document.createElement('span')
78
+ line.className = 'tn-tab-nav tab-tab-line'
79
+ line.textContent = '/'
80
+ tabsEl.appendChild(line)
81
+ }
82
+
83
+ slides.forEach((slide, i) => {
84
+ const label = slide.getAttribute('data-title') || 'img'
85
+ const btn = document.createElement('button')
86
+ btn.type = 'button'
87
+ btn.className = 'tn-tab' + (i === 0 ? ' active' : '')
88
+ btn.textContent = label
89
+ btn.addEventListener('click', () => {
90
+ instance.slideTo(i)
91
+ // 点击tab时更新高度
92
+ setTimeout(() => {
93
+ updateContainerHeight(container, i)
94
+ }, 0)
95
+ })
96
+ tabsEl.appendChild(btn)
97
+ })
98
+
99
+ // 右按钮 - 下一页
100
+ if (isTnTabNavVisible) {
101
+ const nextBtn = document.createElement('button')
102
+ nextBtn.type = 'button'
103
+ nextBtn.className = 'tn-tab-nav tn-tab-next'
104
+ nextBtn.textContent = '>'
105
+ nextBtn.title = '下一页'
106
+ nextBtn.addEventListener('click', () => {
107
+ if (instance.activeIndex === slides.length - 1) {
108
+ // 到头 -> 跳到第一张
109
+ instance.slideTo(0)
110
+ } else {
111
+ instance.slideNext()
112
+ }
113
+ setTimeout(() => {
114
+ updateContainerHeight(container, instance.activeIndex)
115
+ }, 0)
116
+ })
117
+ tabsEl.appendChild(nextBtn)
118
+ }
119
+
120
+ swiperInstances.value.push(instance)
121
+ })
122
+ })
123
+ })
124
+ }
125
+
126
+ function updateActiveTab(wrap, activeIndex) {
127
+ const btns = wrap.querySelectorAll('.tn-swiper-tabs .tn-tab')
128
+ btns.forEach((b, i) => b.classList.toggle('active', i === activeIndex))
129
+ }
130
+
131
+ // 新增函数:根据当前slide中的图片高度更新容器高度
132
+ function updateContainerHeight(container, activeIndex) {
133
+ const slides = container.querySelectorAll('.swiper-slide')
134
+ if (slides[activeIndex]) {
135
+ const img = slides[activeIndex].querySelector('img')
136
+ if (img && img.complete) {
137
+ // 如果图片已加载完成,直接设置高度
138
+ container.style.height = img.offsetHeight + 'px'
139
+ } else if (img) {
140
+ // 如果图片未加载完成,等待加载完成后设置高度
141
+ img.onload = () => {
142
+ container.style.height = img.offsetHeight + 'px'
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ function destroySwiper() {
149
+ swiperInstances.value.forEach((inst) => {
150
+ try {
151
+ inst.destroy(true, true)
152
+ } catch {}
153
+ })
154
+ swiperInstances.value = []
155
+ }
156
+
157
+ onBeforeUnmount(destroySwiper)
158
+
159
+ onMounted(() => {
160
+ initSwiper()
161
+ })
162
+
163
+ // 监听内容更新(包括 HMR 和路由变化)
164
+ onContentUpdated(() => {
165
+ initSwiper()
166
+ })
167
+ </script>
@@ -1,47 +1,47 @@
1
- <template>
2
- <img @click="toggle" class="contentToggleBtn" :title="full ? '退出全屏内容区' : '全屏显示内容区'" :src="full ? icon__fullscreen_exit : icon__fullscreen" alt="" />
3
- </template>
4
-
5
- <script setup lang="ts">
6
- import { onMounted, ref } from 'vue'
7
-
8
- import { icon__fullscreen, icon__fullscreen_exit } from '../../assets/icons'
9
-
10
- const KEY = 'vp:content:fullscreen'
11
- const full = ref(false)
12
-
13
- onMounted(() => {
14
- try {
15
- full.value = localStorage.getItem(KEY) === '1'
16
- } catch {}
17
- apply(full.value)
18
- })
19
-
20
- function apply(val: boolean) {
21
- const root = document.documentElement
22
- if (val) root.classList.add('content-fullscreen')
23
- else root.classList.remove('content-fullscreen')
24
- }
25
-
26
- function toggle() {
27
- full.value = !full.value
28
- apply(full.value)
29
- try {
30
- localStorage.setItem(KEY, full.value ? '1' : '0')
31
- } catch {}
32
- }
33
- </script>
34
-
1
+ <template>
2
+ <img @click="toggle" class="contentToggleBtn" :title="full ? '退出全屏内容区' : '全屏显示内容区'" :src="full ? icon__fullscreen_exit : icon__fullscreen" alt="" />
3
+ </template>
4
+
5
+ <script setup lang="ts">
6
+ import { onMounted, ref } from 'vue'
7
+
8
+ import { icon__fullscreen, icon__fullscreen_exit } from '../../assets/icons'
9
+
10
+ const KEY = 'vp:content:fullscreen'
11
+ const full = ref(false)
12
+
13
+ onMounted(() => {
14
+ try {
15
+ full.value = localStorage.getItem(KEY) === '1'
16
+ } catch {}
17
+ apply(full.value)
18
+ })
19
+
20
+ function apply(val: boolean) {
21
+ const root = document.documentElement
22
+ if (val) root.classList.add('content-fullscreen')
23
+ else root.classList.remove('content-fullscreen')
24
+ }
25
+
26
+ function toggle() {
27
+ full.value = !full.value
28
+ apply(full.value)
29
+ try {
30
+ localStorage.setItem(KEY, full.value ? '1' : '0')
31
+ } catch {}
32
+ }
33
+ </script>
34
+
35
35
  <style scoped lang="scss">
36
- .contentToggleBtn {
37
- width: 1.5rem;
38
- height: 1.5rem;
39
- padding: 3px;
40
- cursor: pointer;
41
- transition: all 0.2s;
42
-
43
- &:hover {
44
- background: var(--vp-c-bg-alt);
45
- }
36
+ .contentToggleBtn {
37
+ width: 1.5rem;
38
+ height: 1.5rem;
39
+ padding: 3px;
40
+ cursor: pointer;
41
+ transition: all 0.2s;
42
+
43
+ &:hover {
44
+ background: var(--vp-c-bg-alt);
45
+ }
46
46
  }
47
- </style>
47
+ </style>
@@ -1,37 +1,37 @@
1
- <!-- .vitepress\components\Layout\ToggleSidebar.vue -->
2
- <template>
3
- <img
4
- @click="toggleSidebar"
5
- class="sidebarToggleBtn"
6
- :title="hidden ? '显示侧边栏' : '隐藏侧边栏'"
7
- :src="hidden ? icon__next : icon__prev"
8
- alt=""
9
- />
10
- </template>
11
-
12
- <script setup lang="ts">
13
- import { onMounted } from 'vue'
14
-
15
- import { useSidebarLayout } from './composables/useSidebarLayout'
16
- import { icon__next, icon__prev } from '../../assets/icons'
17
-
18
- const { hidden, initSidebarLayout, toggleSidebar } = useSidebarLayout()
19
-
20
- onMounted(() => {
21
- initSidebarLayout()
22
- })
23
- </script>
24
-
1
+ <!-- .vitepress\components\Layout\ToggleSidebar.vue -->
2
+ <template>
3
+ <img
4
+ @click="toggleSidebar"
5
+ class="sidebarToggleBtn"
6
+ :title="hidden ? '显示侧边栏' : '隐藏侧边栏'"
7
+ :src="hidden ? icon__next : icon__prev"
8
+ alt=""
9
+ />
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { onMounted } from 'vue'
14
+
15
+ import { useSidebarLayout } from './composables/useSidebarLayout'
16
+ import { icon__next, icon__prev } from '../../assets/icons'
17
+
18
+ const { hidden, initSidebarLayout, toggleSidebar } = useSidebarLayout()
19
+
20
+ onMounted(() => {
21
+ initSidebarLayout()
22
+ })
23
+ </script>
24
+
25
25
  <style scoped lang="scss">
26
- .sidebarToggleBtn {
27
- width: 1.5rem;
28
- height: 1.5rem;
29
- padding: 3px;
30
- cursor: pointer;
31
- transition: all 0.2s;
32
-
33
- &:hover {
34
- background: var(--vp-c-bg-alt);
35
- }
26
+ .sidebarToggleBtn {
27
+ width: 1.5rem;
28
+ height: 1.5rem;
29
+ padding: 3px;
30
+ cursor: pointer;
31
+ transition: all 0.2s;
32
+
33
+ &:hover {
34
+ background: var(--vp-c-bg-alt);
35
+ }
36
36
  }
37
- </style>
37
+ </style>