@tnotesjs/core 0.0.1

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 (118) hide show
  1. package/README.md +84 -0
  2. package/dist/chunk-CSSIRO3I.js +4288 -0
  3. package/dist/chunk-NASIL5FY.js +203 -0
  4. package/dist/cli/index.js +694 -0
  5. package/dist/index.js +8 -0
  6. package/dist/vitepress/config/index.js +904 -0
  7. package/package.json +77 -0
  8. package/types/config.ts +61 -0
  9. package/types/index.ts +11 -0
  10. package/types/note.ts +33 -0
  11. package/types/shims.d.ts +10 -0
  12. package/vitepress/assets/icons/icon__check.svg +3 -0
  13. package/vitepress/assets/icons/icon__clipboard.svg +8 -0
  14. package/vitepress/assets/icons/icon__close.svg +1 -0
  15. package/vitepress/assets/icons/icon__collapse.svg +1 -0
  16. package/vitepress/assets/icons/icon__confirm.svg +1 -0
  17. package/vitepress/assets/icons/icon__copy.svg +4 -0
  18. package/vitepress/assets/icons/icon__focus.svg +1 -0
  19. package/vitepress/assets/icons/icon__fold.svg +3 -0
  20. package/vitepress/assets/icons/icon__folder.svg +1 -0
  21. package/vitepress/assets/icons/icon__fullscreen.svg +1 -0
  22. package/vitepress/assets/icons/icon__fullscreen_exit.svg +1 -0
  23. package/vitepress/assets/icons/icon__github.svg +4 -0
  24. package/vitepress/assets/icons/icon__mindmap.svg +1 -0
  25. package/vitepress/assets/icons/icon__next.svg +1 -0
  26. package/vitepress/assets/icons/icon__number_gray.svg +1 -0
  27. package/vitepress/assets/icons/icon__number_purple.svg +1 -0
  28. package/vitepress/assets/icons/icon__prev.svg +1 -0
  29. package/vitepress/assets/icons/icon__restore.svg +1 -0
  30. package/vitepress/assets/icons/icon__rotate.svg +4 -0
  31. package/vitepress/assets/icons/icon__search.svg +1 -0
  32. package/vitepress/assets/icons/icon__sidebar_collapsed.svg +1 -0
  33. package/vitepress/assets/icons/icon__sidebar_opened.svg +1 -0
  34. package/vitepress/assets/icons/icon__totop.svg +6 -0
  35. package/vitepress/assets/icons/icon__vscode.svg +6 -0
  36. package/vitepress/assets/icons/icon__zoom_fit.svg +1 -0
  37. package/vitepress/assets/icons/icon__zoom_in.svg +1 -0
  38. package/vitepress/assets/icons/icon__zoom_out.svg +1 -0
  39. package/vitepress/assets/icons/icon__zoom_reset.svg +1 -0
  40. package/vitepress/assets/icons/index.ts +38 -0
  41. package/vitepress/components/BilibiliOutsidePlayer/BilibiliOutsidePlayer.vue +20 -0
  42. package/vitepress/components/CodeBlockFullscreen/CodeBlockFullscreen.vue +373 -0
  43. package/vitepress/components/CodeBlockFullscreen/index.ts +115 -0
  44. package/vitepress/components/CodeBlockFullscreen/styles.css +64 -0
  45. package/vitepress/components/Discussions/Discussions.module.scss +32 -0
  46. package/vitepress/components/Discussions/Discussions.vue +211 -0
  47. package/vitepress/components/EnWordList/EnWordList.module.scss +124 -0
  48. package/vitepress/components/EnWordList/EnWordList.vue +543 -0
  49. package/vitepress/components/EnWordList/RightClickMenu.module.scss +22 -0
  50. package/vitepress/components/EnWordList/RightClickMenu.vue +66 -0
  51. package/vitepress/components/Footprints/Footprints.module.scss +93 -0
  52. package/vitepress/components/Footprints/Footprints.vue +377 -0
  53. package/vitepress/components/Layout/AboutModal.module.scss +233 -0
  54. package/vitepress/components/Layout/AboutModal.vue +105 -0
  55. package/vitepress/components/Layout/AboutPanel.vue +266 -0
  56. package/vitepress/components/Layout/ContentCollapse.vue +603 -0
  57. package/vitepress/components/Layout/CustomSidebar.vue +605 -0
  58. package/vitepress/components/Layout/DocBeforeControls.vue +139 -0
  59. package/vitepress/components/Layout/DocFooter.vue +225 -0
  60. package/vitepress/components/Layout/ImagePreview.module.scss +201 -0
  61. package/vitepress/components/Layout/ImagePreview.vue +281 -0
  62. package/vitepress/components/Layout/Layout.module.scss +661 -0
  63. package/vitepress/components/Layout/Layout.vue +542 -0
  64. package/vitepress/components/Layout/NoteStatus.vue +140 -0
  65. package/vitepress/components/Layout/SidebarItems.vue +263 -0
  66. package/vitepress/components/Layout/SidebarNavBefore.vue +92 -0
  67. package/vitepress/components/Layout/Swiper.vue +167 -0
  68. package/vitepress/components/Layout/ToggleFullContent.module.scss +11 -0
  69. package/vitepress/components/Layout/ToggleFullContent.vue +34 -0
  70. package/vitepress/components/Layout/ToggleSidebar.module.scss +11 -0
  71. package/vitepress/components/Layout/ToggleSidebar.vue +35 -0
  72. package/vitepress/components/Layout/composables/useCollapseControl.ts +88 -0
  73. package/vitepress/components/Layout/composables/useNoteConfig.ts +121 -0
  74. package/vitepress/components/Layout/composables/useNoteSave.ts +173 -0
  75. package/vitepress/components/Layout/composables/useNoteValidation.ts +85 -0
  76. package/vitepress/components/Layout/composables/useRedirect.ts +110 -0
  77. package/vitepress/components/Layout/composables/useVSCodeIntegration.ts +85 -0
  78. package/vitepress/components/Layout/homeReadme.data.ts +124 -0
  79. package/vitepress/components/LoadingPage/LoadingPage.vue +192 -0
  80. package/vitepress/components/MarkMap/MarkMap.module.scss +159 -0
  81. package/vitepress/components/MarkMap/MarkMap.vue +404 -0
  82. package/vitepress/components/Mermaid/Mermaid.module.scss +275 -0
  83. package/vitepress/components/Mermaid/Mermaid.vue +364 -0
  84. package/vitepress/components/NotesTable/NotesTable.module.scss +77 -0
  85. package/vitepress/components/NotesTable/NotesTable.vue +98 -0
  86. package/vitepress/components/NotesTable/README.md +67 -0
  87. package/vitepress/components/Settings/Settings.module.scss +433 -0
  88. package/vitepress/components/Settings/Settings.vue +306 -0
  89. package/vitepress/components/SidebarCard/MindMapView.vue +483 -0
  90. package/vitepress/components/SidebarCard/NotesTrendChart.vue +108 -0
  91. package/vitepress/components/SidebarCard/SidebarCard.vue +948 -0
  92. package/vitepress/components/Tooltip/Tooltip.vue +70 -0
  93. package/vitepress/components/constants.ts +91 -0
  94. package/vitepress/components/notesConfig.data.ts +73 -0
  95. package/vitepress/components/sidebar.data.ts +59 -0
  96. package/vitepress/components/tnotes-config.data.ts +21 -0
  97. package/vitepress/components/utils.ts +26 -0
  98. package/vitepress/config/index.ts +141 -0
  99. package/vitepress/configs/constants.ts +26 -0
  100. package/vitepress/configs/head.config.ts +25 -0
  101. package/vitepress/configs/index.ts +9 -0
  102. package/vitepress/configs/markdown-it.d.ts +23 -0
  103. package/vitepress/configs/markdown.config.ts +366 -0
  104. package/vitepress/configs/theme.config.ts +108 -0
  105. package/vitepress/plugins/buildProgressPlugin.ts +390 -0
  106. package/vitepress/plugins/getNoteByConfigIdPlugin.ts +107 -0
  107. package/vitepress/plugins/renameNotePlugin.ts +60 -0
  108. package/vitepress/plugins/updateConfigPlugin.ts +63 -0
  109. package/vitepress/theme/index.ts +95 -0
  110. package/vitepress/theme/styles/base.scss +50 -0
  111. package/vitepress/theme/styles/components/404.scss +31 -0
  112. package/vitepress/theme/styles/components/collapse.scss +175 -0
  113. package/vitepress/theme/styles/components/markmap.scss +101 -0
  114. package/vitepress/theme/styles/components/swiper.scss +255 -0
  115. package/vitepress/theme/styles/index.scss +25 -0
  116. package/vitepress/theme/styles/layout.scss +62 -0
  117. package/vitepress/theme/styles/utilities.scss +39 -0
  118. package/vitepress/theme/styles/vitepress-override.scss +25 -0
@@ -0,0 +1,105 @@
1
+ <template>
2
+ <!-- 使用 teleport 将 modal 放到 body 之下(避免父容器样式影响) -->
3
+ <teleport to="body">
4
+ <div v-if="modelValue" :class="$style.modalBackdrop" @click.self="close">
5
+ <div
6
+ :class="$style.modal"
7
+ role="dialog"
8
+ :aria-labelledby="titleId"
9
+ aria-modal="true"
10
+ ref="modalRef"
11
+ >
12
+ <header :class="$style.modalHeader">
13
+ <h3 :id="titleId" :class="$style.modalTitle">
14
+ <!-- 标题通过 slot #title 提供,未提供则使用 prop title -->
15
+ <slot name="title">
16
+ {{ title }}
17
+ </slot>
18
+ </h3>
19
+ <button
20
+ :class="$style.closeBtn"
21
+ @click="close"
22
+ aria-label="Close"
23
+ title="Close"
24
+ type="button"
25
+ >
26
+
27
+ </button>
28
+ </header>
29
+
30
+ <section :class="$style.modalBody">
31
+ <!-- 默认插槽用于传入内容 -->
32
+ <slot>
33
+ <!-- fallback 内容(如果父组件没有传入插槽) -->
34
+ <p>No content provided.</p>
35
+ </slot>
36
+ </section>
37
+
38
+ <footer :class="$style.modalFooter" v-if="$slots.footer">
39
+ <slot name="footer"></slot>
40
+ </footer>
41
+ </div>
42
+ </div>
43
+ </teleport>
44
+ </template>
45
+
46
+ <script setup>
47
+ import { ref, watch, onMounted, onUnmounted } from 'vue'
48
+
49
+ const props = defineProps({
50
+ modelValue: { type: Boolean, required: true },
51
+ title: { type: String, default: '' },
52
+ })
53
+
54
+ const emit = defineEmits(['update:modelValue', 'close'])
55
+
56
+ const modalRef = ref(null)
57
+ const titleId = `tm-title-${Math.random().toString(36).slice(2, 8)}`
58
+
59
+ // close modal (emit update and close)
60
+ function close() {
61
+ emit('update:modelValue', false)
62
+ emit('close')
63
+ }
64
+
65
+ // handle ESC to close
66
+ function onKeyDown(e) {
67
+ if (e.key === 'Escape' || e.key === 'Esc') {
68
+ close()
69
+ }
70
+ }
71
+
72
+ // focus trap: basic - focus modal when opened
73
+ watch(
74
+ () => props.modelValue,
75
+ (open) => {
76
+ if (open) {
77
+ // small timeout to ensure element exists
78
+ setTimeout(() => {
79
+ if (modalRef.value) modalRef.value.focus && modalRef.value.focus()
80
+ }, 0)
81
+ document.addEventListener('keydown', onKeyDown)
82
+ // prevent body scroll
83
+ document.body.style.overflow = 'hidden'
84
+ } else {
85
+ document.removeEventListener('keydown', onKeyDown)
86
+ document.body.style.overflow = ''
87
+ }
88
+ },
89
+ { immediate: false },
90
+ )
91
+
92
+ onMounted(() => {
93
+ if (props.modelValue) {
94
+ document.addEventListener('keydown', onKeyDown)
95
+ document.body.style.overflow = 'hidden'
96
+ }
97
+ })
98
+
99
+ onUnmounted(() => {
100
+ document.removeEventListener('keydown', onKeyDown)
101
+ document.body.style.overflow = ''
102
+ })
103
+ </script>
104
+
105
+ <style module src="./AboutModal.module.scss"></style>
@@ -0,0 +1,266 @@
1
+ <template>
2
+ <div
3
+ :class="$style.timeModalContent"
4
+ role="group"
5
+ :aria-label="isHomeReadme ? '知识库提交信息' : '笔记提交信息'"
6
+ >
7
+ <!-- 笔记编号(仅笔记页显示) -->
8
+ <div
9
+ :class="$style.timeLine"
10
+ v-if="!isHomeReadme && currentNoteId"
11
+ title="笔记编号"
12
+ >
13
+ <div :class="$style.timeLabel">
14
+ <strong>🔢 笔记编号</strong>
15
+ </div>
16
+ <div :class="$style.timeValue">{{ currentNoteId }}</div>
17
+ </div>
18
+
19
+ <!-- 笔记标题(仅笔记页显示) -->
20
+ <div
21
+ :class="$style.timeLine"
22
+ v-if="!isHomeReadme && currentNoteId"
23
+ title="笔记标题"
24
+ >
25
+ <div :class="$style.timeLabel">
26
+ <strong>📝 笔记标题</strong>
27
+ </div>
28
+ <div :class="$style.timeValue">
29
+ <input
30
+ v-model="editableNoteTitle"
31
+ type="text"
32
+ :class="[$style.titleInput, { [$style.error]: titleError }]"
33
+ :disabled="!isDev"
34
+ @input="onTitleInput"
35
+ @blur="onTitleBlur"
36
+ placeholder="请输入笔记标题"
37
+ />
38
+ <div v-if="titleError" :class="$style.errorMessage">
39
+ {{ titleError }}
40
+ </div>
41
+ </div>
42
+ </div>
43
+
44
+ <!-- 笔记简介(仅笔记页显示) -->
45
+ <div
46
+ :class="$style.timeLine"
47
+ v-if="!isHomeReadme && currentNoteId"
48
+ title="笔记简介"
49
+ >
50
+ <div :class="$style.timeLabel">
51
+ <strong>📄 笔记简介</strong>
52
+ </div>
53
+ <div :class="$style.timeValue">
54
+ <textarea
55
+ v-model="editableDescription"
56
+ :class="$style.descriptionInput"
57
+ :disabled="!isDev"
58
+ @input="onDescriptionInput"
59
+ placeholder="请输入笔记的一句话简介(可选)"
60
+ rows="2"
61
+ />
62
+ </div>
63
+ </div>
64
+
65
+ <!-- 笔记状态(仅笔记页显示且非开发环境只读) -->
66
+ <div
67
+ :class="$style.timeLine"
68
+ v-if="!isHomeReadme && currentNoteId"
69
+ title="笔记状态"
70
+ >
71
+ <div :class="$style.timeLabel">
72
+ <strong>📝 完成状态</strong>
73
+ </div>
74
+ <div :class="$style.timeValue">
75
+ <select
76
+ v-model="editableNoteStatus"
77
+ :class="$style.statusSelect"
78
+ :disabled="!isDev"
79
+ @change="onConfigChange"
80
+ >
81
+ <option :value="true">✅ 已完成</option>
82
+ <option :value="false">⏰ 待处理</option>
83
+ </select>
84
+ </div>
85
+ </div>
86
+
87
+ <!-- 评论状态(仅笔记页显示且非开发环境只读) -->
88
+ <div
89
+ :class="$style.timeLine"
90
+ v-if="!isHomeReadme && currentNoteId"
91
+ title="评论状态"
92
+ >
93
+ <div :class="$style.timeLabel">
94
+ <strong>🫧 评论状态</strong>
95
+ </div>
96
+ <div :class="$style.timeValue">
97
+ <select
98
+ v-model="editableDiscussionsEnabled"
99
+ :class="$style.statusSelect"
100
+ :disabled="!isDev"
101
+ @change="onConfigChange"
102
+ >
103
+ <option :value="true">✅ 开启</option>
104
+ <option :value="false">❌ 关闭</option>
105
+ </select>
106
+ </div>
107
+ </div>
108
+
109
+ <!-- 首次提交时间 -->
110
+ <div :class="$style.timeLine" title="首次提交时间">
111
+ <div :class="$style.timeLabel"><strong>⌛️ 首次提交</strong></div>
112
+ <div :class="$style.timeValue">
113
+ {{ formatDate(modalCreatedAt) }}
114
+ </div>
115
+ </div>
116
+
117
+ <!-- 最近提交时间 -->
118
+ <div :class="$style.timeLine" title="最近提交时间">
119
+ <div :class="$style.timeLabel"><strong>⌛️ 最近提交</strong></div>
120
+ <div :class="$style.timeValue">
121
+ {{ formatDate(modalUpdatedAt) }}
122
+ </div>
123
+ </div>
124
+
125
+ <!-- GitHub -->
126
+ <div
127
+ :class="$style.timeLine"
128
+ v-if="modalGithubUrl"
129
+ :title="
130
+ isHomeReadme ? '在 GitHub 中打开知识库' : '在 GitHub 中打开当前笔记'
131
+ "
132
+ >
133
+ <div :class="$style.timeLabel">
134
+ <strong>🔗 GitHub</strong>
135
+ </div>
136
+ <div :class="$style.timeValue">
137
+ <a
138
+ :href="modalGithubUrl"
139
+ target="_blank"
140
+ rel="noopener"
141
+ :class="$style.githubLink"
142
+ >
143
+ {{
144
+ isHomeReadme ? '在 GitHub 中打开知识库' : '在 GitHub 中打开当前笔记'
145
+ }}
146
+ </a>
147
+ </div>
148
+ </div>
149
+
150
+ <!-- GitHub Page -->
151
+ <div
152
+ :class="$style.timeLine"
153
+ v-if="modalGithubPageUrl"
154
+ :title="
155
+ isHomeReadme
156
+ ? '在 GitHub Page 中打开知识库'
157
+ : '在 GitHub Page 中打开当前笔记'
158
+ "
159
+ >
160
+ <div :class="$style.timeLabel">
161
+ <strong>🔗 GitHub Page</strong>
162
+ </div>
163
+ <div :class="$style.timeValue">
164
+ <a
165
+ :href="modalGithubPageUrl"
166
+ target="_blank"
167
+ rel="noopener"
168
+ :class="$style.githubLink"
169
+ >
170
+ {{
171
+ isHomeReadme
172
+ ? '在 GitHub Page 中打开知识库'
173
+ : '在 GitHub Page 中打开当前笔记'
174
+ }}
175
+ </a>
176
+ </div>
177
+ </div>
178
+
179
+ <!-- 完成进度(仅首页显示) -->
180
+ <div
181
+ :class="$style.timeLine"
182
+ v-if="isHomeReadme && completionPercentage !== null"
183
+ title="笔记完成进度"
184
+ >
185
+ <div :class="$style.timeLabel">
186
+ <strong>📊 完成进度</strong>
187
+ </div>
188
+ <div :class="$style.timeValue">
189
+ {{ completionPercentage }}% ({{ doneNotesLen }} / {{ totalNotesLen }})
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </template>
194
+
195
+ <script setup lang="ts">
196
+ import { computed } from 'vue'
197
+ import { formatDate } from '../utils'
198
+
199
+ const props = defineProps<{
200
+ isHomeReadme: boolean
201
+ currentNoteId: string | null
202
+ isDev: boolean
203
+ editableNoteTitle: string
204
+ editableDescription: string
205
+ editableNoteStatus: boolean
206
+ editableDiscussionsEnabled: boolean
207
+ titleError: string
208
+ modalCreatedAt: number | undefined
209
+ modalUpdatedAt: number | undefined
210
+ modalGithubUrl: string
211
+ modalGithubPageUrl: string
212
+ completionPercentage: number | null
213
+ doneNotesLen: number
214
+ totalNotesLen: number
215
+ }>()
216
+
217
+ const emit = defineEmits<{
218
+ 'update:editableNoteTitle': [value: string]
219
+ 'update:editableDescription': [value: string]
220
+ 'update:editableNoteStatus': [value: boolean]
221
+ 'update:editableDiscussionsEnabled': [value: boolean]
222
+ 'update:titleError': [value: string]
223
+ titleInput: []
224
+ titleBlur: []
225
+ descriptionInput: []
226
+ configChange: []
227
+ }>()
228
+
229
+ const editableNoteTitle = computed({
230
+ get: () => props.editableNoteTitle,
231
+ set: (value) => emit('update:editableNoteTitle', value),
232
+ })
233
+
234
+ const editableDescription = computed({
235
+ get: () => props.editableDescription,
236
+ set: (value) => emit('update:editableDescription', value),
237
+ })
238
+
239
+ const editableNoteStatus = computed({
240
+ get: () => props.editableNoteStatus,
241
+ set: (value) => emit('update:editableNoteStatus', value),
242
+ })
243
+
244
+ const editableDiscussionsEnabled = computed({
245
+ get: () => props.editableDiscussionsEnabled,
246
+ set: (value) => emit('update:editableDiscussionsEnabled', value),
247
+ })
248
+
249
+ function onTitleInput() {
250
+ emit('titleInput')
251
+ }
252
+
253
+ function onTitleBlur() {
254
+ emit('titleBlur')
255
+ }
256
+
257
+ function onDescriptionInput() {
258
+ emit('descriptionInput')
259
+ }
260
+
261
+ function onConfigChange() {
262
+ emit('configChange')
263
+ }
264
+ </script>
265
+
266
+ <style module src="./Layout.module.scss"></style>