@tnotesjs/core 0.1.18 → 0.1.20

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 (114) hide show
  1. package/README.md +87 -87
  2. package/package.json +1 -1
  3. package/types/config.ts +61 -61
  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 +213 -213
  38. package/vitepress/components/CodeBlockFullscreen/styles.css +126 -126
  39. package/vitepress/components/Discussions/Discussions.module.scss +32 -32
  40. package/vitepress/components/Discussions/Discussions.vue +211 -211
  41. package/vitepress/components/EnWordList/EnWordList.module.scss +124 -124
  42. package/vitepress/components/EnWordList/EnWordList.vue +543 -543
  43. package/vitepress/components/EnWordList/RightClickMenu.module.scss +22 -22
  44. package/vitepress/components/EnWordList/RightClickMenu.vue +66 -66
  45. package/vitepress/components/Footprints/Footprints.module.scss +93 -93
  46. package/vitepress/components/Footprints/Footprints.vue +377 -377
  47. package/vitepress/components/Layout/AboutModal.module.scss +233 -233
  48. package/vitepress/components/Layout/AboutModal.vue +105 -105
  49. package/vitepress/components/Layout/AboutPanel.vue +270 -270
  50. package/vitepress/components/Layout/ContentCollapse.vue +603 -603
  51. package/vitepress/components/Layout/CustomSidebar.vue +817 -817
  52. package/vitepress/components/Layout/DocBeforeControls.vue +149 -149
  53. package/vitepress/components/Layout/DocFooter.vue +233 -233
  54. package/vitepress/components/Layout/ImagePreview.module.scss +201 -201
  55. package/vitepress/components/Layout/ImagePreview.vue +281 -281
  56. package/vitepress/components/Layout/Layout.module.scss +661 -661
  57. package/vitepress/components/Layout/Layout.vue +621 -621
  58. package/vitepress/components/Layout/NoteStatus.vue +140 -140
  59. package/vitepress/components/Layout/SidebarItems.vue +1083 -1083
  60. package/vitepress/components/Layout/SidebarNavBefore.vue +171 -171
  61. package/vitepress/components/Layout/SidebarResizeHandle.vue +319 -319
  62. package/vitepress/components/Layout/Swiper.vue +167 -167
  63. package/vitepress/components/Layout/ToggleFullContent.module.scss +11 -11
  64. package/vitepress/components/Layout/ToggleFullContent.vue +35 -35
  65. package/vitepress/components/Layout/ToggleSidebar.module.scss +11 -11
  66. package/vitepress/components/Layout/ToggleSidebar.vue +26 -26
  67. package/vitepress/components/Layout/composables/useCollapseControl.ts +88 -88
  68. package/vitepress/components/Layout/composables/useNoteConfig.ts +119 -119
  69. package/vitepress/components/Layout/composables/useNoteSave.ts +178 -178
  70. package/vitepress/components/Layout/composables/useNoteValidation.ts +85 -85
  71. package/vitepress/components/Layout/composables/useRedirect.ts +113 -113
  72. package/vitepress/components/Layout/composables/useSidebarLayout.ts +122 -122
  73. package/vitepress/components/Layout/composables/useVSCodeIntegration.ts +85 -85
  74. package/vitepress/components/Layout/homeReadme.data.ts +124 -124
  75. package/vitepress/components/MarkMap/MarkMap.module.scss +159 -159
  76. package/vitepress/components/MarkMap/MarkMap.vue +405 -405
  77. package/vitepress/components/Mermaid/Mermaid.module.scss +275 -275
  78. package/vitepress/components/Mermaid/Mermaid.vue +365 -365
  79. package/vitepress/components/NotesTable/NotesTable.module.scss +77 -77
  80. package/vitepress/components/NotesTable/NotesTable.vue +98 -98
  81. package/vitepress/components/NotesTable/README.md +67 -67
  82. package/vitepress/components/Settings/Settings.module.scss +375 -375
  83. package/vitepress/components/Settings/Settings.vue +334 -334
  84. package/vitepress/components/SidebarCard/MindMapView.vue +484 -484
  85. package/vitepress/components/SidebarCard/NotesTrendChart.vue +108 -108
  86. package/vitepress/components/SidebarCard/SidebarCard.vue +946 -946
  87. package/vitepress/components/Tooltip/Tooltip.vue +70 -70
  88. package/vitepress/components/constants.ts +109 -109
  89. package/vitepress/components/notesConfig.data.ts +73 -73
  90. package/vitepress/components/sidebar.data.ts +59 -59
  91. package/vitepress/components/tnotes-config.data.ts +21 -21
  92. package/vitepress/components/utils.ts +26 -26
  93. package/vitepress/config/index.ts +169 -169
  94. package/vitepress/configs/constants.ts +26 -26
  95. package/vitepress/configs/head.config.ts +25 -25
  96. package/vitepress/configs/index.ts +9 -9
  97. package/vitepress/configs/markdown-it.d.ts +23 -23
  98. package/vitepress/configs/markdown.config.ts +366 -366
  99. package/vitepress/configs/theme.config.ts +108 -108
  100. package/vitepress/plugins/buildProgressPlugin.ts +434 -434
  101. package/vitepress/plugins/getNoteByConfigIdPlugin.ts +107 -107
  102. package/vitepress/plugins/renameNotePlugin.ts +68 -68
  103. package/vitepress/plugins/sidebarStructurePlugin.ts +260 -260
  104. package/vitepress/plugins/updateConfigPlugin.ts +63 -63
  105. package/vitepress/theme/index.ts +137 -137
  106. package/vitepress/theme/styles/base.scss +64 -59
  107. package/vitepress/theme/styles/components/404.scss +31 -31
  108. package/vitepress/theme/styles/components/collapse.scss +172 -185
  109. package/vitepress/theme/styles/components/markmap.scss +101 -101
  110. package/vitepress/theme/styles/components/swiper.scss +255 -255
  111. package/vitepress/theme/styles/index.scss +25 -25
  112. package/vitepress/theme/styles/layout.scss +78 -78
  113. package/vitepress/theme/styles/utilities.scss +39 -39
  114. 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,11 +1,11 @@
1
- .contentToggleBtn {
2
- width: 1.5rem;
3
- height: 1.5rem;
4
- padding: 3px;
5
- cursor: pointer;
6
- transition: all 0.2s;
7
-
8
- &:hover {
9
- background: var(--vp-c-bg-alt);
10
- }
11
- }
1
+ .contentToggleBtn {
2
+ width: 1.5rem;
3
+ height: 1.5rem;
4
+ padding: 3px;
5
+ cursor: pointer;
6
+ transition: all 0.2s;
7
+
8
+ &:hover {
9
+ background: var(--vp-c-bg-alt);
10
+ }
11
+ }
@@ -1,35 +1,35 @@
1
- <template>
2
- <img @click="toggle" :class="$style.contentToggleBtn" :aria-pressed="full" :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
- <style module src="./ToggleFullContent.module.scss"></style>
1
+ <template>
2
+ <img @click="toggle" :class="$style.contentToggleBtn" :aria-pressed="full" :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
+ <style module src="./ToggleFullContent.module.scss"></style>
@@ -1,11 +1,11 @@
1
- .sidebarToggleBtn {
2
- width: 1.5rem;
3
- height: 1.5rem;
4
- padding: 3px;
5
- cursor: pointer;
6
- transition: all 0.2s;
7
-
8
- &:hover {
9
- background: var(--vp-c-bg-alt);
10
- }
11
- }
1
+ .sidebarToggleBtn {
2
+ width: 1.5rem;
3
+ height: 1.5rem;
4
+ padding: 3px;
5
+ cursor: pointer;
6
+ transition: all 0.2s;
7
+
8
+ &:hover {
9
+ background: var(--vp-c-bg-alt);
10
+ }
11
+ }
@@ -1,26 +1,26 @@
1
- <!-- .vitepress\components\Layout\ToggleSidebar.vue -->
2
- <template>
3
- <img
4
- @click="toggleSidebar"
5
- :class="$style.sidebarToggleBtn"
6
- :aria-pressed="hidden"
7
- :title="hidden ? '显示侧边栏' : '隐藏侧边栏'"
8
- :src="hidden ? icon__next : icon__prev"
9
- alt=""
10
- />
11
- </template>
12
-
13
- <script setup lang="ts">
14
- import { onMounted } from 'vue'
15
-
16
- import { useSidebarLayout } from './composables/useSidebarLayout'
17
- import { icon__next, icon__prev } from '../../assets/icons'
18
-
19
- const { hidden, initSidebarLayout, toggleSidebar } = useSidebarLayout()
20
-
21
- onMounted(() => {
22
- initSidebarLayout()
23
- })
24
- </script>
25
-
26
- <style module src="./ToggleSidebar.module.scss"></style>
1
+ <!-- .vitepress\components\Layout\ToggleSidebar.vue -->
2
+ <template>
3
+ <img
4
+ @click="toggleSidebar"
5
+ :class="$style.sidebarToggleBtn"
6
+ :aria-pressed="hidden"
7
+ :title="hidden ? '显示侧边栏' : '隐藏侧边栏'"
8
+ :src="hidden ? icon__next : icon__prev"
9
+ alt=""
10
+ />
11
+ </template>
12
+
13
+ <script setup lang="ts">
14
+ import { onMounted } from 'vue'
15
+
16
+ import { useSidebarLayout } from './composables/useSidebarLayout'
17
+ import { icon__next, icon__prev } from '../../assets/icons'
18
+
19
+ const { hidden, initSidebarLayout, toggleSidebar } = useSidebarLayout()
20
+
21
+ onMounted(() => {
22
+ initSidebarLayout()
23
+ })
24
+ </script>
25
+
26
+ <style module src="./ToggleSidebar.module.scss"></style>