@tnotesjs/core 0.1.22 → 0.1.24

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 +368 -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 +79 -78
  100. package/vitepress/theme/styles/utilities.scss +39 -39
  101. package/vitepress/theme/styles/vitepress-override.scss +25 -25
@@ -1,331 +1,331 @@
1
- <template>
2
- <!-- 使用 teleport 将 modal 放到 body 之下(避免父容器样式影响) -->
3
- <teleport to="body">
4
- <div v-if="modelValue" class="modalBackdrop" @click.self="close">
5
- <div class="modal" ref="modalRef">
6
- <header class="modalHeader">
7
- <h3 class="modalTitle">
8
- <!-- 标题通过 slot #title 提供,未提供则使用 prop title -->
9
- <slot name="title">
10
- {{ title }}
11
- </slot>
12
- </h3>
13
- <button
14
- class="closeBtn"
15
- @click="close"
16
- title="Close"
17
- type="button"
18
- >
19
-
20
- </button>
21
- </header>
22
-
23
- <section class="modalBody">
24
- <!-- 默认插槽用于传入内容 -->
25
- <slot>
26
- <!-- fallback 内容(如果父组件没有传入插槽) -->
27
- <p>No content provided.</p>
28
- </slot>
29
- </section>
30
-
31
- <footer class="modalFooter" v-if="$slots.footer">
32
- <slot name="footer"></slot>
33
- </footer>
34
- </div>
35
- </div>
36
- </teleport>
37
- </template>
38
-
39
- <script setup>
40
- import { ref, watch, onMounted, onUnmounted } from 'vue'
41
-
42
- const props = defineProps({
43
- modelValue: { type: Boolean, required: true },
44
- title: { type: String, default: '' },
45
- })
46
-
47
- const emit = defineEmits(['update:modelValue', 'close'])
48
-
49
- const modalRef = ref(null)
50
-
51
- // close modal (emit update and close)
52
- function close() {
53
- emit('update:modelValue', false)
54
- emit('close')
55
- }
56
-
57
- // handle ESC to close
58
- function onKeyDown(e) {
59
- if (e.key === 'Escape' || e.key === 'Esc') {
60
- close()
61
- }
62
- }
63
-
64
- // focus trap: basic - focus modal when opened
65
- watch(
66
- () => props.modelValue,
67
- (open) => {
68
- if (open) {
69
- // small timeout to ensure element exists
70
- setTimeout(() => {
71
- modalRef.value?.focus?.()
72
- }, 0)
73
- document.addEventListener('keydown', onKeyDown)
74
- // prevent body scroll
75
- document.body.style.overflow = 'hidden'
76
- } else {
77
- document.removeEventListener('keydown', onKeyDown)
78
- document.body.style.overflow = ''
79
- }
80
- },
81
- { immediate: false },
82
- )
83
-
84
- onMounted(() => {
85
- if (props.modelValue) {
86
- document.addEventListener('keydown', onKeyDown)
87
- document.body.style.overflow = 'hidden'
88
- }
89
- })
90
-
91
- onUnmounted(() => {
92
- document.removeEventListener('keydown', onKeyDown)
93
- document.body.style.overflow = ''
94
- })
95
- </script>
96
-
1
+ <template>
2
+ <!-- 使用 teleport 将 modal 放到 body 之下(避免父容器样式影响) -->
3
+ <teleport to="body">
4
+ <div v-if="modelValue" class="modalBackdrop" @click.self="close">
5
+ <div class="modal" ref="modalRef">
6
+ <header class="modalHeader">
7
+ <h3 class="modalTitle">
8
+ <!-- 标题通过 slot #title 提供,未提供则使用 prop title -->
9
+ <slot name="title">
10
+ {{ title }}
11
+ </slot>
12
+ </h3>
13
+ <button
14
+ class="closeBtn"
15
+ @click="close"
16
+ title="Close"
17
+ type="button"
18
+ >
19
+
20
+ </button>
21
+ </header>
22
+
23
+ <section class="modalBody">
24
+ <!-- 默认插槽用于传入内容 -->
25
+ <slot>
26
+ <!-- fallback 内容(如果父组件没有传入插槽) -->
27
+ <p>No content provided.</p>
28
+ </slot>
29
+ </section>
30
+
31
+ <footer class="modalFooter" v-if="$slots.footer">
32
+ <slot name="footer"></slot>
33
+ </footer>
34
+ </div>
35
+ </div>
36
+ </teleport>
37
+ </template>
38
+
39
+ <script setup>
40
+ import { ref, watch, onMounted, onUnmounted } from 'vue'
41
+
42
+ const props = defineProps({
43
+ modelValue: { type: Boolean, required: true },
44
+ title: { type: String, default: '' },
45
+ })
46
+
47
+ const emit = defineEmits(['update:modelValue', 'close'])
48
+
49
+ const modalRef = ref(null)
50
+
51
+ // close modal (emit update and close)
52
+ function close() {
53
+ emit('update:modelValue', false)
54
+ emit('close')
55
+ }
56
+
57
+ // handle ESC to close
58
+ function onKeyDown(e) {
59
+ if (e.key === 'Escape' || e.key === 'Esc') {
60
+ close()
61
+ }
62
+ }
63
+
64
+ // focus trap: basic - focus modal when opened
65
+ watch(
66
+ () => props.modelValue,
67
+ (open) => {
68
+ if (open) {
69
+ // small timeout to ensure element exists
70
+ setTimeout(() => {
71
+ modalRef.value?.focus?.()
72
+ }, 0)
73
+ document.addEventListener('keydown', onKeyDown)
74
+ // prevent body scroll
75
+ document.body.style.overflow = 'hidden'
76
+ } else {
77
+ document.removeEventListener('keydown', onKeyDown)
78
+ document.body.style.overflow = ''
79
+ }
80
+ },
81
+ { immediate: false },
82
+ )
83
+
84
+ onMounted(() => {
85
+ if (props.modelValue) {
86
+ document.addEventListener('keydown', onKeyDown)
87
+ document.body.style.overflow = 'hidden'
88
+ }
89
+ })
90
+
91
+ onUnmounted(() => {
92
+ document.removeEventListener('keydown', onKeyDown)
93
+ document.body.style.overflow = ''
94
+ })
95
+ </script>
96
+
97
97
  <style scoped lang="scss">
98
- // AboutModal 组件样式
99
-
100
- // 模态框背景遮罩
101
- .modalBackdrop {
102
- position: fixed;
103
- inset: 0;
104
- background: rgba(0, 0, 0, 0.75);
105
- backdrop-filter: blur(4px);
106
- display: flex;
107
- align-items: center;
108
- justify-content: center;
109
- z-index: 1200;
110
- padding: 1rem;
111
- animation: fadeIn 0.2s ease-out;
112
- }
113
-
114
- @keyframes fadeIn {
115
- from {
116
- opacity: 0;
117
- }
118
- to {
119
- opacity: 1;
120
- }
121
- }
122
-
123
- @keyframes slideUp {
124
- from {
125
- opacity: 0;
126
- transform: translateY(20px);
127
- }
128
- to {
129
- opacity: 1;
130
- transform: translateY(0);
131
- }
132
- }
133
-
134
- // 模态框主体
135
- .modal {
136
- background: var(--vp-c-bg);
137
- color: var(--vp-c-text-1);
138
- border-radius: 16px;
139
- max-width: 580px;
140
- width: 100%;
141
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4),
142
- 0 0 0 1px rgba(255, 255, 255, 0.05);
143
- overflow: hidden;
144
- outline: none;
145
- animation: slideUp 0.3s ease-out;
146
-
147
- // 暗色模式优化
148
- :global(.dark) & {
149
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6),
150
- 0 0 0 1px rgba(255, 255, 255, 0.08);
151
- }
152
- }
153
-
154
- // 模态框头部
155
- .modalHeader {
156
- display: flex;
157
- align-items: center;
158
- justify-content: space-between;
159
- padding: 1.25rem 1.5rem;
160
- border-bottom: 1px solid var(--vp-c-divider);
161
- background: linear-gradient(
162
- 180deg,
163
- var(--vp-c-bg-soft) 0%,
164
- var(--vp-c-bg) 100%
165
- );
166
- position: relative;
167
-
168
- // 添加顶部装饰条
169
- &::before {
170
- content: '';
171
- position: absolute;
172
- top: 0;
173
- left: 0;
174
- right: 0;
175
- height: 3px;
176
- background: linear-gradient(
177
- 90deg,
178
- var(--vp-c-brand-1),
179
- var(--vp-c-brand-2)
180
- );
181
- }
182
- }
183
-
184
- // 模态框标题
185
- .modalTitle {
186
- margin: 0;
187
- font-size: 1.125rem;
188
- font-weight: 600;
189
- color: var(--vp-c-text-1);
190
- letter-spacing: -0.01em;
191
- display: flex;
192
- align-items: center;
193
- gap: 0.5rem;
194
-
195
- // 添加图标装饰(可选,如果标题前有 emoji)
196
- &::before {
197
- content: '📝';
198
- font-size: 1.25rem;
199
- }
200
- }
201
-
202
- // 关闭按钮
203
- .closeBtn {
204
- background: transparent;
205
- border: none;
206
- cursor: pointer;
207
- font-size: 1.25rem;
208
- line-height: 1;
209
- padding: 0.5rem;
210
- border-radius: 8px;
211
- color: var(--vp-c-text-2);
212
- transition: all 0.2s ease;
213
- display: flex;
214
- align-items: center;
215
- justify-content: center;
216
- width: 32px;
217
- height: 32px;
218
-
219
- &:hover {
220
- background: var(--vp-c-bg-soft);
221
- color: var(--vp-c-text-1);
222
- transform: rotate(90deg);
223
- }
224
-
225
- &:active {
226
- transform: rotate(90deg) scale(0.95);
227
- }
228
- }
229
-
230
- // 模态框主体内容
231
- .modalBody {
232
- padding: 1.5rem;
233
- font-size: 0.95rem;
234
- color: var(--vp-c-text-2);
235
- line-height: 1.7;
236
- max-height: 60vh;
237
- overflow-y: auto;
238
-
239
- // 美化滚动条
240
- &::-webkit-scrollbar {
241
- width: 6px;
242
- }
243
-
244
- &::-webkit-scrollbar-track {
245
- background: transparent;
246
- }
247
-
248
- &::-webkit-scrollbar-thumb {
249
- background: var(--vp-c-divider);
250
- border-radius: 3px;
251
-
252
- &:hover {
253
- background: var(--vp-c-text-3);
254
- }
255
- }
256
-
257
- // 优化内容样式
258
- p {
259
- margin: 0.75rem 0;
260
-
261
- &:first-child {
262
- margin-top: 0;
263
- }
264
-
265
- &:last-child {
266
- margin-bottom: 0;
267
- }
268
- }
269
-
270
- // 如果内容中有图标,增加间距
271
- :deep(span) {
272
- margin-right: 0.25rem;
273
- }
274
-
275
- // 强调文本
276
- strong {
277
- color: var(--vp-c-text-1);
278
- font-weight: 600;
279
- }
280
-
281
- // 链接样式
282
- a {
283
- color: var(--vp-c-brand-1);
284
- text-decoration: none;
285
- transition: color 0.2s;
286
-
287
- &:hover {
288
- color: var(--vp-c-brand-2);
289
- text-decoration: underline;
290
- }
291
- }
292
- }
293
-
294
- // 模态框底部(可选)
295
- .modalFooter {
296
- padding: 1rem 1.5rem;
297
- border-top: 1px solid var(--vp-c-divider);
298
- background: var(--vp-c-bg-soft);
299
- text-align: right;
300
- display: flex;
301
- gap: 0.75rem;
302
- justify-content: flex-end;
303
- align-items: center;
304
- }
305
-
306
- // 响应式优化
307
- @media (max-width: 640px) {
308
- .modal {
309
- max-width: 100%;
310
- margin: 1rem;
311
- border-radius: 12px;
312
- }
313
-
314
- .modalHeader {
315
- padding: 1rem 1.25rem;
316
- }
317
-
318
- .modalTitle {
319
- font-size: 1rem;
320
- }
321
-
322
- .modalBody {
323
- padding: 1.25rem;
324
- max-height: 50vh;
325
- }
326
-
327
- .modalFooter {
328
- padding: 0.875rem 1.25rem;
329
- }
98
+ // AboutModal 组件样式
99
+
100
+ // 模态框背景遮罩
101
+ .modalBackdrop {
102
+ position: fixed;
103
+ inset: 0;
104
+ background: rgba(0, 0, 0, 0.75);
105
+ backdrop-filter: blur(4px);
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ z-index: 1200;
110
+ padding: 1rem;
111
+ animation: fadeIn 0.2s ease-out;
112
+ }
113
+
114
+ @keyframes fadeIn {
115
+ from {
116
+ opacity: 0;
117
+ }
118
+ to {
119
+ opacity: 1;
120
+ }
121
+ }
122
+
123
+ @keyframes slideUp {
124
+ from {
125
+ opacity: 0;
126
+ transform: translateY(20px);
127
+ }
128
+ to {
129
+ opacity: 1;
130
+ transform: translateY(0);
131
+ }
132
+ }
133
+
134
+ // 模态框主体
135
+ .modal {
136
+ background: var(--vp-c-bg);
137
+ color: var(--vp-c-text-1);
138
+ border-radius: 16px;
139
+ max-width: 580px;
140
+ width: 100%;
141
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4),
142
+ 0 0 0 1px rgba(255, 255, 255, 0.05);
143
+ overflow: hidden;
144
+ outline: none;
145
+ animation: slideUp 0.3s ease-out;
146
+
147
+ // 暗色模式优化
148
+ :global(.dark) & {
149
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6),
150
+ 0 0 0 1px rgba(255, 255, 255, 0.08);
151
+ }
152
+ }
153
+
154
+ // 模态框头部
155
+ .modalHeader {
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: space-between;
159
+ padding: 1.25rem 1.5rem;
160
+ border-bottom: 1px solid var(--vp-c-divider);
161
+ background: linear-gradient(
162
+ 180deg,
163
+ var(--vp-c-bg-soft) 0%,
164
+ var(--vp-c-bg) 100%
165
+ );
166
+ position: relative;
167
+
168
+ // 添加顶部装饰条
169
+ &::before {
170
+ content: '';
171
+ position: absolute;
172
+ top: 0;
173
+ left: 0;
174
+ right: 0;
175
+ height: 3px;
176
+ background: linear-gradient(
177
+ 90deg,
178
+ var(--vp-c-brand-1),
179
+ var(--vp-c-brand-2)
180
+ );
181
+ }
182
+ }
183
+
184
+ // 模态框标题
185
+ .modalTitle {
186
+ margin: 0;
187
+ font-size: 1.125rem;
188
+ font-weight: 600;
189
+ color: var(--vp-c-text-1);
190
+ letter-spacing: -0.01em;
191
+ display: flex;
192
+ align-items: center;
193
+ gap: 0.5rem;
194
+
195
+ // 添加图标装饰(可选,如果标题前有 emoji)
196
+ &::before {
197
+ content: '📝';
198
+ font-size: 1.25rem;
199
+ }
200
+ }
201
+
202
+ // 关闭按钮
203
+ .closeBtn {
204
+ background: transparent;
205
+ border: none;
206
+ cursor: pointer;
207
+ font-size: 1.25rem;
208
+ line-height: 1;
209
+ padding: 0.5rem;
210
+ border-radius: 8px;
211
+ color: var(--vp-c-text-2);
212
+ transition: all 0.2s ease;
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ width: 32px;
217
+ height: 32px;
218
+
219
+ &:hover {
220
+ background: var(--vp-c-bg-soft);
221
+ color: var(--vp-c-text-1);
222
+ transform: rotate(90deg);
223
+ }
224
+
225
+ &:active {
226
+ transform: rotate(90deg) scale(0.95);
227
+ }
228
+ }
229
+
230
+ // 模态框主体内容
231
+ .modalBody {
232
+ padding: 1.5rem;
233
+ font-size: 0.95rem;
234
+ color: var(--vp-c-text-2);
235
+ line-height: 1.7;
236
+ max-height: 60vh;
237
+ overflow-y: auto;
238
+
239
+ // 美化滚动条
240
+ &::-webkit-scrollbar {
241
+ width: 6px;
242
+ }
243
+
244
+ &::-webkit-scrollbar-track {
245
+ background: transparent;
246
+ }
247
+
248
+ &::-webkit-scrollbar-thumb {
249
+ background: var(--vp-c-divider);
250
+ border-radius: 3px;
251
+
252
+ &:hover {
253
+ background: var(--vp-c-text-3);
254
+ }
255
+ }
256
+
257
+ // 优化内容样式
258
+ p {
259
+ margin: 0.75rem 0;
260
+
261
+ &:first-child {
262
+ margin-top: 0;
263
+ }
264
+
265
+ &:last-child {
266
+ margin-bottom: 0;
267
+ }
268
+ }
269
+
270
+ // 如果内容中有图标,增加间距
271
+ :deep(span) {
272
+ margin-right: 0.25rem;
273
+ }
274
+
275
+ // 强调文本
276
+ strong {
277
+ color: var(--vp-c-text-1);
278
+ font-weight: 600;
279
+ }
280
+
281
+ // 链接样式
282
+ a {
283
+ color: var(--vp-c-brand-1);
284
+ text-decoration: none;
285
+ transition: color 0.2s;
286
+
287
+ &:hover {
288
+ color: var(--vp-c-brand-2);
289
+ text-decoration: underline;
290
+ }
291
+ }
292
+ }
293
+
294
+ // 模态框底部(可选)
295
+ .modalFooter {
296
+ padding: 1rem 1.5rem;
297
+ border-top: 1px solid var(--vp-c-divider);
298
+ background: var(--vp-c-bg-soft);
299
+ text-align: right;
300
+ display: flex;
301
+ gap: 0.75rem;
302
+ justify-content: flex-end;
303
+ align-items: center;
304
+ }
305
+
306
+ // 响应式优化
307
+ @media (max-width: 640px) {
308
+ .modal {
309
+ max-width: 100%;
310
+ margin: 1rem;
311
+ border-radius: 12px;
312
+ }
313
+
314
+ .modalHeader {
315
+ padding: 1rem 1.25rem;
316
+ }
317
+
318
+ .modalTitle {
319
+ font-size: 1rem;
320
+ }
321
+
322
+ .modalBody {
323
+ padding: 1.25rem;
324
+ max-height: 50vh;
325
+ }
326
+
327
+ .modalFooter {
328
+ padding: 0.875rem 1.25rem;
329
+ }
330
330
  }
331
- </style>
331
+ </style>