@jant/core 0.3.7 → 0.3.9

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 (258) hide show
  1. package/dist/app.js +11 -4
  2. package/dist/client.js +1 -0
  3. package/dist/db/schema.js +15 -1
  4. package/dist/i18n/locales/en.js +1 -1
  5. package/dist/i18n/locales/zh-Hans.js +1 -1
  6. package/dist/i18n/locales/zh-Hant.js +1 -1
  7. package/dist/lib/image.js +39 -15
  8. package/dist/lib/media-helpers.js +49 -0
  9. package/dist/lib/nav-reorder.js +27 -0
  10. package/dist/lib/navigation.js +35 -0
  11. package/dist/lib/storage.js +164 -0
  12. package/dist/lib/theme-components.js +49 -0
  13. package/dist/routes/api/posts.js +12 -7
  14. package/dist/routes/api/timeline.js +116 -0
  15. package/dist/routes/api/upload.js +35 -24
  16. package/dist/routes/dash/media.js +24 -14
  17. package/dist/routes/dash/navigation.js +274 -0
  18. package/dist/routes/dash/posts.js +4 -1
  19. package/dist/routes/feed/rss.js +3 -2
  20. package/dist/routes/pages/archive.js +14 -27
  21. package/dist/routes/pages/collection.js +10 -19
  22. package/dist/routes/pages/home.js +84 -126
  23. package/dist/routes/pages/page.js +19 -38
  24. package/dist/routes/pages/post.js +47 -56
  25. package/dist/routes/pages/search.js +13 -26
  26. package/dist/services/index.js +3 -1
  27. package/dist/services/media.js +8 -6
  28. package/dist/services/navigation.js +115 -0
  29. package/dist/services/post.js +26 -1
  30. package/dist/theme/components/PostForm.js +4 -3
  31. package/dist/theme/components/PostList.js +5 -0
  32. package/dist/theme/components/index.js +2 -0
  33. package/dist/theme/components/timeline/ArticleCard.js +50 -0
  34. package/dist/theme/components/timeline/ImageCard.js +86 -0
  35. package/dist/theme/components/timeline/LinkCard.js +62 -0
  36. package/dist/theme/components/timeline/NoteCard.js +37 -0
  37. package/dist/theme/components/timeline/QuoteCard.js +51 -0
  38. package/dist/theme/components/timeline/ThreadPreview.js +52 -0
  39. package/dist/theme/components/timeline/TimelineFeed.js +43 -0
  40. package/dist/theme/components/timeline/TimelineItem.js +25 -0
  41. package/dist/theme/components/timeline/index.js +8 -0
  42. package/dist/theme/layouts/DashLayout.js +8 -0
  43. package/dist/theme/layouts/SiteLayout.js +160 -0
  44. package/dist/theme/layouts/index.js +1 -0
  45. package/dist/types/sortablejs.d.js +5 -0
  46. package/dist/types.js +32 -0
  47. package/package.json +4 -2
  48. package/src/__tests__/helpers/app.ts +1 -0
  49. package/src/__tests__/helpers/db.ts +20 -0
  50. package/src/app.tsx +12 -7
  51. package/src/client.ts +1 -0
  52. package/src/db/migrations/0003_add_navigation_links.sql +8 -0
  53. package/src/db/migrations/0004_add_storage_provider.sql +3 -0
  54. package/src/db/migrations/meta/0003_snapshot.json +821 -0
  55. package/src/db/migrations/meta/_journal.json +21 -0
  56. package/src/db/schema.ts +15 -1
  57. package/src/i18n/locales/en.po +148 -80
  58. package/src/i18n/locales/en.ts +1 -1
  59. package/src/i18n/locales/zh-Hans.po +150 -103
  60. package/src/i18n/locales/zh-Hans.ts +1 -1
  61. package/src/i18n/locales/zh-Hant.po +150 -103
  62. package/src/i18n/locales/zh-Hant.ts +1 -1
  63. package/src/index.ts +5 -0
  64. package/src/lib/__tests__/image.test.ts +96 -0
  65. package/src/lib/__tests__/storage.test.ts +162 -0
  66. package/src/lib/__tests__/theme-components.test.ts +107 -0
  67. package/src/lib/image.ts +46 -16
  68. package/src/lib/media-helpers.ts +65 -0
  69. package/src/lib/nav-reorder.ts +26 -0
  70. package/src/lib/navigation.ts +46 -0
  71. package/src/lib/storage.ts +236 -0
  72. package/src/lib/theme-components.ts +76 -0
  73. package/src/routes/api/__tests__/posts.test.ts +8 -8
  74. package/src/routes/api/__tests__/timeline.test.ts +242 -0
  75. package/src/routes/api/posts.ts +20 -6
  76. package/src/routes/api/timeline.tsx +152 -0
  77. package/src/routes/api/upload.ts +52 -25
  78. package/src/routes/dash/media.tsx +40 -8
  79. package/src/routes/dash/navigation.tsx +306 -0
  80. package/src/routes/dash/posts.tsx +5 -0
  81. package/src/routes/feed/rss.ts +3 -2
  82. package/src/routes/pages/archive.tsx +15 -23
  83. package/src/routes/pages/collection.tsx +8 -15
  84. package/src/routes/pages/home.tsx +118 -122
  85. package/src/routes/pages/page.tsx +17 -30
  86. package/src/routes/pages/post.tsx +63 -60
  87. package/src/routes/pages/search.tsx +18 -22
  88. package/src/services/__tests__/media.test.ts +73 -28
  89. package/src/services/__tests__/navigation.test.ts +213 -0
  90. package/src/services/__tests__/post-timeline.test.ts +220 -0
  91. package/src/services/index.ts +7 -0
  92. package/src/services/media.ts +12 -8
  93. package/src/services/navigation.ts +165 -0
  94. package/src/services/post.ts +48 -1
  95. package/src/styles/components.css +59 -0
  96. package/src/theme/components/PostForm.tsx +13 -2
  97. package/src/theme/components/PostList.tsx +7 -0
  98. package/src/theme/components/index.ts +12 -0
  99. package/src/theme/components/timeline/ArticleCard.tsx +57 -0
  100. package/src/theme/components/timeline/ImageCard.tsx +80 -0
  101. package/src/theme/components/timeline/LinkCard.tsx +66 -0
  102. package/src/theme/components/timeline/NoteCard.tsx +41 -0
  103. package/src/theme/components/timeline/QuoteCard.tsx +55 -0
  104. package/src/theme/components/timeline/ThreadPreview.tsx +49 -0
  105. package/src/theme/components/timeline/TimelineFeed.tsx +52 -0
  106. package/src/theme/components/timeline/TimelineItem.tsx +39 -0
  107. package/src/theme/components/timeline/index.ts +8 -0
  108. package/src/theme/layouts/DashLayout.tsx +10 -0
  109. package/src/theme/layouts/SiteLayout.tsx +184 -0
  110. package/src/theme/layouts/index.ts +1 -0
  111. package/src/types/sortablejs.d.ts +23 -0
  112. package/src/types.ts +102 -1
  113. package/dist/app.d.ts +0 -38
  114. package/dist/app.d.ts.map +0 -1
  115. package/dist/auth.d.ts +0 -25
  116. package/dist/auth.d.ts.map +0 -1
  117. package/dist/db/index.d.ts +0 -10
  118. package/dist/db/index.d.ts.map +0 -1
  119. package/dist/db/schema.d.ts +0 -1543
  120. package/dist/db/schema.d.ts.map +0 -1
  121. package/dist/i18n/Trans.d.ts +0 -25
  122. package/dist/i18n/Trans.d.ts.map +0 -1
  123. package/dist/i18n/context.d.ts +0 -69
  124. package/dist/i18n/context.d.ts.map +0 -1
  125. package/dist/i18n/detect.d.ts +0 -20
  126. package/dist/i18n/detect.d.ts.map +0 -1
  127. package/dist/i18n/i18n.d.ts +0 -32
  128. package/dist/i18n/i18n.d.ts.map +0 -1
  129. package/dist/i18n/index.d.ts +0 -41
  130. package/dist/i18n/index.d.ts.map +0 -1
  131. package/dist/i18n/locales/en.d.ts +0 -3
  132. package/dist/i18n/locales/en.d.ts.map +0 -1
  133. package/dist/i18n/locales/zh-Hans.d.ts +0 -3
  134. package/dist/i18n/locales/zh-Hans.d.ts.map +0 -1
  135. package/dist/i18n/locales/zh-Hant.d.ts +0 -3
  136. package/dist/i18n/locales/zh-Hant.d.ts.map +0 -1
  137. package/dist/i18n/locales.d.ts +0 -11
  138. package/dist/i18n/locales.d.ts.map +0 -1
  139. package/dist/i18n/middleware.d.ts +0 -21
  140. package/dist/i18n/middleware.d.ts.map +0 -1
  141. package/dist/index.d.ts +0 -16
  142. package/dist/index.d.ts.map +0 -1
  143. package/dist/lib/config.d.ts +0 -83
  144. package/dist/lib/config.d.ts.map +0 -1
  145. package/dist/lib/constants.d.ts +0 -37
  146. package/dist/lib/constants.d.ts.map +0 -1
  147. package/dist/lib/image.d.ts +0 -73
  148. package/dist/lib/image.d.ts.map +0 -1
  149. package/dist/lib/index.d.ts +0 -9
  150. package/dist/lib/index.d.ts.map +0 -1
  151. package/dist/lib/markdown.d.ts +0 -60
  152. package/dist/lib/markdown.d.ts.map +0 -1
  153. package/dist/lib/schemas.d.ts +0 -130
  154. package/dist/lib/schemas.d.ts.map +0 -1
  155. package/dist/lib/sqid.d.ts +0 -60
  156. package/dist/lib/sqid.d.ts.map +0 -1
  157. package/dist/lib/sse.d.ts +0 -192
  158. package/dist/lib/sse.d.ts.map +0 -1
  159. package/dist/lib/theme.d.ts +0 -44
  160. package/dist/lib/theme.d.ts.map +0 -1
  161. package/dist/lib/time.d.ts +0 -90
  162. package/dist/lib/time.d.ts.map +0 -1
  163. package/dist/lib/url.d.ts +0 -82
  164. package/dist/lib/url.d.ts.map +0 -1
  165. package/dist/middleware/auth.d.ts +0 -24
  166. package/dist/middleware/auth.d.ts.map +0 -1
  167. package/dist/middleware/onboarding.d.ts +0 -26
  168. package/dist/middleware/onboarding.d.ts.map +0 -1
  169. package/dist/routes/api/posts.d.ts +0 -13
  170. package/dist/routes/api/posts.d.ts.map +0 -1
  171. package/dist/routes/api/search.d.ts +0 -13
  172. package/dist/routes/api/search.d.ts.map +0 -1
  173. package/dist/routes/api/upload.d.ts +0 -16
  174. package/dist/routes/api/upload.d.ts.map +0 -1
  175. package/dist/routes/dash/collections.d.ts +0 -13
  176. package/dist/routes/dash/collections.d.ts.map +0 -1
  177. package/dist/routes/dash/index.d.ts +0 -15
  178. package/dist/routes/dash/index.d.ts.map +0 -1
  179. package/dist/routes/dash/media.d.ts +0 -16
  180. package/dist/routes/dash/media.d.ts.map +0 -1
  181. package/dist/routes/dash/pages.d.ts +0 -15
  182. package/dist/routes/dash/pages.d.ts.map +0 -1
  183. package/dist/routes/dash/posts.d.ts +0 -13
  184. package/dist/routes/dash/posts.d.ts.map +0 -1
  185. package/dist/routes/dash/redirects.d.ts +0 -13
  186. package/dist/routes/dash/redirects.d.ts.map +0 -1
  187. package/dist/routes/dash/settings.d.ts +0 -15
  188. package/dist/routes/dash/settings.d.ts.map +0 -1
  189. package/dist/routes/feed/rss.d.ts +0 -13
  190. package/dist/routes/feed/rss.d.ts.map +0 -1
  191. package/dist/routes/feed/sitemap.d.ts +0 -13
  192. package/dist/routes/feed/sitemap.d.ts.map +0 -1
  193. package/dist/routes/pages/archive.d.ts +0 -15
  194. package/dist/routes/pages/archive.d.ts.map +0 -1
  195. package/dist/routes/pages/collection.d.ts +0 -13
  196. package/dist/routes/pages/collection.d.ts.map +0 -1
  197. package/dist/routes/pages/home.d.ts +0 -13
  198. package/dist/routes/pages/home.d.ts.map +0 -1
  199. package/dist/routes/pages/page.d.ts +0 -15
  200. package/dist/routes/pages/page.d.ts.map +0 -1
  201. package/dist/routes/pages/post.d.ts +0 -13
  202. package/dist/routes/pages/post.d.ts.map +0 -1
  203. package/dist/routes/pages/search.d.ts +0 -13
  204. package/dist/routes/pages/search.d.ts.map +0 -1
  205. package/dist/services/collection.d.ts +0 -32
  206. package/dist/services/collection.d.ts.map +0 -1
  207. package/dist/services/index.d.ts +0 -28
  208. package/dist/services/index.d.ts.map +0 -1
  209. package/dist/services/media.d.ts +0 -34
  210. package/dist/services/media.d.ts.map +0 -1
  211. package/dist/services/post.d.ts +0 -31
  212. package/dist/services/post.d.ts.map +0 -1
  213. package/dist/services/redirect.d.ts +0 -15
  214. package/dist/services/redirect.d.ts.map +0 -1
  215. package/dist/services/search.d.ts +0 -26
  216. package/dist/services/search.d.ts.map +0 -1
  217. package/dist/services/settings.d.ts +0 -18
  218. package/dist/services/settings.d.ts.map +0 -1
  219. package/dist/theme/color-themes.d.ts +0 -30
  220. package/dist/theme/color-themes.d.ts.map +0 -1
  221. package/dist/theme/components/ActionButtons.d.ts +0 -43
  222. package/dist/theme/components/ActionButtons.d.ts.map +0 -1
  223. package/dist/theme/components/CrudPageHeader.d.ts +0 -23
  224. package/dist/theme/components/CrudPageHeader.d.ts.map +0 -1
  225. package/dist/theme/components/DangerZone.d.ts +0 -36
  226. package/dist/theme/components/DangerZone.d.ts.map +0 -1
  227. package/dist/theme/components/EmptyState.d.ts +0 -27
  228. package/dist/theme/components/EmptyState.d.ts.map +0 -1
  229. package/dist/theme/components/ListItemRow.d.ts +0 -15
  230. package/dist/theme/components/ListItemRow.d.ts.map +0 -1
  231. package/dist/theme/components/MediaGallery.d.ts +0 -13
  232. package/dist/theme/components/MediaGallery.d.ts.map +0 -1
  233. package/dist/theme/components/PageForm.d.ts +0 -14
  234. package/dist/theme/components/PageForm.d.ts.map +0 -1
  235. package/dist/theme/components/Pagination.d.ts +0 -46
  236. package/dist/theme/components/Pagination.d.ts.map +0 -1
  237. package/dist/theme/components/PostForm.d.ts +0 -16
  238. package/dist/theme/components/PostForm.d.ts.map +0 -1
  239. package/dist/theme/components/PostList.d.ts +0 -10
  240. package/dist/theme/components/PostList.d.ts.map +0 -1
  241. package/dist/theme/components/ThreadView.d.ts +0 -15
  242. package/dist/theme/components/ThreadView.d.ts.map +0 -1
  243. package/dist/theme/components/TypeBadge.d.ts +0 -12
  244. package/dist/theme/components/TypeBadge.d.ts.map +0 -1
  245. package/dist/theme/components/VisibilityBadge.d.ts +0 -12
  246. package/dist/theme/components/VisibilityBadge.d.ts.map +0 -1
  247. package/dist/theme/components/index.d.ts +0 -14
  248. package/dist/theme/components/index.d.ts.map +0 -1
  249. package/dist/theme/index.d.ts +0 -21
  250. package/dist/theme/index.d.ts.map +0 -1
  251. package/dist/theme/layouts/BaseLayout.d.ts +0 -23
  252. package/dist/theme/layouts/BaseLayout.d.ts.map +0 -1
  253. package/dist/theme/layouts/DashLayout.d.ts +0 -17
  254. package/dist/theme/layouts/DashLayout.d.ts.map +0 -1
  255. package/dist/theme/layouts/index.d.ts +0 -3
  256. package/dist/theme/layouts/index.d.ts.map +0 -1
  257. package/dist/types.d.ts +0 -237
  258. package/dist/types.d.ts.map +0 -1
@@ -23,13 +23,6 @@ msgstr "{count} 条回复"
23
23
  msgid "← Back to Collections"
24
24
  msgstr "← 返回收藏夹"
25
25
 
26
- #. @context: Navigation link
27
- #. @context: Navigation link
28
- #: src/routes/pages/collection.tsx:76
29
- #: src/routes/pages/post.tsx:63
30
- msgid "← Back to home"
31
- msgstr "← 返回首页"
32
-
33
26
  #. @context: Archive post reply indicator - single
34
27
  #: src/routes/pages/archive.tsx:175
35
28
  msgid "1 reply"
@@ -51,9 +44,9 @@ msgid "Account"
51
44
  msgstr "账户"
52
45
 
53
46
  #. @context: Button to open media picker
54
- #: src/theme/components/PostForm.tsx:178
47
+ #: src/theme/components/PostForm.tsx:189
55
48
  msgid "Add Media"
56
- msgstr ""
49
+ msgstr "添加媒体"
57
50
 
58
51
  #. @context: Archive filter - all types
59
52
  #: src/routes/pages/archive.tsx:115
@@ -66,17 +59,20 @@ msgid "Appearance"
66
59
  msgstr "外观"
67
60
 
68
61
  #. @context: Archive page title
69
- #. @context: Navigation link to archive page
70
62
  #: src/routes/pages/archive.tsx:102
71
- #: src/routes/pages/home.tsx:40
72
63
  msgid "Archive"
73
64
  msgstr "档案馆"
74
65
 
66
+ #. @context: Confirmation dialog when deleting a post from the list
67
+ #: src/theme/components/PostList.tsx:56
68
+ msgid "Are you sure you want to delete this post? This cannot be undone."
69
+ msgstr ""
70
+
75
71
  #. @context: Post type badge - article
76
72
  #. @context: Post type label - article
77
73
  #. @context: Post type option
78
74
  #: src/routes/pages/archive.tsx:28
79
- #: src/theme/components/PostForm.tsx:67
75
+ #: src/theme/components/PostForm.tsx:73
80
76
  #: src/theme/components/TypeBadge.tsx:20
81
77
  msgid "Article"
82
78
  msgstr "文章"
@@ -87,34 +83,27 @@ msgid "Articles"
87
83
  msgstr "文章"
88
84
 
89
85
  #. @context: Hint for image post type media requirement
90
- #: src/theme/components/PostForm.tsx:130
86
+ #: src/theme/components/PostForm.tsx:136
91
87
  msgid "At least 1 image required for image posts."
92
- msgstr ""
88
+ msgstr "图像帖子至少需要 1 张图片。"
93
89
 
94
90
  #. @context: Button to go back to media list
95
- #: src/routes/dash/media.tsx:245
91
+ #: src/routes/dash/media.tsx:266
96
92
  msgid "Back"
97
93
  msgstr "返回"
98
94
 
99
- #. @context: Navigation link back to home page
100
- #. @context: Navigation link back to home page
101
- #. @context: Navigation link back to home page
102
- #: src/routes/pages/archive.tsx:209
103
- #: src/routes/pages/page.tsx:37
104
- #: src/routes/pages/search.tsx:144
105
- msgid "Back to home"
106
- msgstr "返回首页"
107
-
108
95
  #. @context: Button to cancel and go back
109
96
  #. @context: Button to cancel form
110
97
  #. @context: Button to cancel form
111
98
  #. @context: Button to cancel form
112
99
  #. @context: Button to cancel form
100
+ #. @context: Button to cancel form
113
101
  #: src/routes/dash/collections.tsx:176
114
102
  #: src/routes/dash/collections.tsx:345
103
+ #: src/routes/dash/navigation.tsx:182
115
104
  #: src/routes/dash/redirects.tsx:167
116
105
  #: src/theme/components/PageForm.tsx:161
117
- #: src/theme/components/PostForm.tsx:312
106
+ #: src/theme/components/PostForm.tsx:323
118
107
  msgid "Cancel"
119
108
  msgstr "取消"
120
109
 
@@ -126,7 +115,7 @@ msgid "Change Password"
126
115
  msgstr "更改密码"
127
116
 
128
117
  #. @context: Hint to click image for lightbox
129
- #: src/routes/dash/media.tsx:278
118
+ #: src/routes/dash/media.tsx:299
130
119
  msgid "Click image to view full size"
131
120
  msgstr "点击图片查看完整尺寸"
132
121
 
@@ -138,9 +127,9 @@ msgid "Collections"
138
127
  msgstr "收藏夹"
139
128
 
140
129
  #. @context: Post form field - assign to collections
141
- #: src/theme/components/PostForm.tsx:261
130
+ #: src/theme/components/PostForm.tsx:272
142
131
  msgid "Collections (optional)"
143
- msgstr ""
132
+ msgstr "集合(可选)"
144
133
 
145
134
  #. @context: Appearance settings heading
146
135
  #: src/routes/dash/settings.tsx:301
@@ -148,7 +137,7 @@ msgid "Color theme"
148
137
  msgstr "颜色主题"
149
138
 
150
139
  #. @context: Setup form submit button
151
- #: src/app.tsx:245
140
+ #: src/app.tsx:251
152
141
  msgid "Complete Setup"
153
142
  msgstr "完成设置"
154
143
 
@@ -158,21 +147,21 @@ msgid "Confirm New Password"
158
147
  msgstr "确认新密码"
159
148
 
160
149
  #. @context: Password reset form field
161
- #: src/app.tsx:487
150
+ #: src/app.tsx:493
162
151
  msgid "Confirm Password"
163
152
  msgstr "确认密码"
164
153
 
165
154
  #. @context: Page form field label - content
166
155
  #. @context: Post form field
167
156
  #: src/theme/components/PageForm.tsx:95
168
- #: src/theme/components/PostForm.tsx:103
157
+ #: src/theme/components/PostForm.tsx:109
169
158
  msgid "Content"
170
159
  msgstr "内容"
171
160
 
172
161
  #. @context: Button to copy Markdown to clipboard
173
162
  #. @context: Button to copy URL to clipboard
174
- #: src/routes/dash/media.tsx:316
175
- #: src/routes/dash/media.tsx:353
163
+ #: src/routes/dash/media.tsx:337
164
+ #: src/routes/dash/media.tsx:374
176
165
  msgid "Copy"
177
166
  msgstr "复制"
178
167
 
@@ -181,6 +170,11 @@ msgstr "复制"
181
170
  msgid "Create Collection"
182
171
  msgstr "创建集合"
183
172
 
173
+ #. @context: Button to save new navigation link
174
+ #: src/routes/dash/navigation.tsx:176
175
+ msgid "Create Link"
176
+ msgstr "创建链接"
177
+
184
178
  #. @context: Button to create new page
185
179
  #: src/theme/components/PageForm.tsx:155
186
180
  msgid "Create Page"
@@ -192,7 +186,7 @@ msgid "Create Redirect"
192
186
  msgstr "创建重定向"
193
187
 
194
188
  #. @context: Setup page description
195
- #: src/app.tsx:187
189
+ #: src/app.tsx:193
196
190
  msgid "Create your admin account."
197
191
  msgstr "创建您的管理员账户。"
198
192
 
@@ -212,7 +206,7 @@ msgid "Current Password"
212
206
  msgstr "当前密码"
213
207
 
214
208
  #. @context: Post form field
215
- #: src/theme/components/PostForm.tsx:285
209
+ #: src/theme/components/PostForm.tsx:296
216
210
  msgid "Custom Path (optional)"
217
211
  msgstr "自定义路径(可选)"
218
212
 
@@ -229,7 +223,9 @@ msgid "Dashboard"
229
223
  msgstr "仪表板"
230
224
 
231
225
  #. @context: Button to delete item
226
+ #. @context: Button to delete navigation link
232
227
  #. @context: Button to delete redirect
228
+ #: src/routes/dash/navigation.tsx:66
233
229
  #: src/routes/dash/redirects.tsx:60
234
230
  #: src/theme/components/ActionButtons.tsx:80
235
231
  msgid "Delete"
@@ -241,7 +237,7 @@ msgid "Delete Collection"
241
237
  msgstr "删除收藏夹"
242
238
 
243
239
  #. @context: Button to delete media
244
- #: src/routes/dash/media.tsx:364
240
+ #: src/routes/dash/media.tsx:385
245
241
  msgid "Delete Media"
246
242
  msgstr "删除媒体"
247
243
 
@@ -251,12 +247,12 @@ msgid "Delete Page"
251
247
  msgstr "删除页面"
252
248
 
253
249
  #. @context: Warning message before deleting media
254
- #: src/routes/dash/media.tsx:370
250
+ #: src/routes/dash/media.tsx:391
255
251
  msgid "Deleting this media will remove it permanently from storage."
256
252
  msgstr "删除此媒体将永久从存储中移除。"
257
253
 
258
254
  #. @context: Hint shown on signin page when demo credentials are pre-filled
259
- #: src/app.tsx:336
255
+ #: src/app.tsx:342
260
256
  msgid "Demo account pre-filled. Just click Sign In."
261
257
  msgstr "演示账户已预填。只需点击登录。"
262
258
 
@@ -267,16 +263,21 @@ msgstr "演示账户已预填。只需点击登录。"
267
263
  msgid "Description (optional)"
268
264
  msgstr "描述(可选)"
269
265
 
266
+ #. @context: Navigation label help text
267
+ #: src/routes/dash/navigation.tsx:139
268
+ msgid "Display text for the link"
269
+ msgstr "链接的显示文本"
270
+
270
271
  #. @context: Close media picker button
271
- #: src/theme/components/PostForm.tsx:334
272
+ #: src/theme/components/PostForm.tsx:345
272
273
  msgid "Done"
273
- msgstr ""
274
+ msgstr "完成"
274
275
 
275
276
  #. @context: Page status option - draft
276
277
  #. @context: Post visibility badge - draft
277
278
  #. @context: Post visibility option
278
279
  #: src/theme/components/PageForm.tsx:132
279
- #: src/theme/components/PostForm.tsx:249
280
+ #: src/theme/components/PostForm.tsx:260
280
281
  #: src/theme/components/VisibilityBadge.tsx:38
281
282
  msgid "Draft"
282
283
  msgstr "草稿"
@@ -287,19 +288,21 @@ msgid "Drafts"
287
288
  msgstr "草稿"
288
289
 
289
290
  #. @context: Source name placeholder
290
- #: src/theme/components/PostForm.tsx:214
291
+ #: src/theme/components/PostForm.tsx:225
291
292
  msgid "e.g. The Verge, John Doe"
292
- msgstr ""
293
+ msgstr "例如:The Verge,John Doe"
293
294
 
294
295
  #. @context: Button to edit collection
295
296
  #. @context: Button to edit collection
296
297
  #. @context: Button to edit item
298
+ #. @context: Button to edit navigation link
297
299
  #. @context: Button to edit page
298
300
  #. @context: Button to edit page
299
301
  #. @context: Button to edit post
300
302
  #. @context: Button to edit post
301
303
  #: src/routes/dash/collections.tsx:66
302
304
  #: src/routes/dash/collections.tsx:210
305
+ #: src/routes/dash/navigation.tsx:61
303
306
  #: src/routes/dash/pages.tsx:64
304
307
  #: src/routes/dash/pages.tsx:134
305
308
  #: src/routes/dash/posts.tsx:142
@@ -313,33 +316,36 @@ msgstr "编辑"
313
316
  msgid "Edit Collection"
314
317
  msgstr "编辑集合"
315
318
 
319
+ #. @context: Page heading
320
+ #: src/routes/dash/navigation.tsx:105
321
+ msgid "Edit Link"
322
+ msgstr "编辑链接"
323
+
316
324
  #. @context: Edit page main heading
317
325
  #: src/routes/dash/pages.tsx:176
318
326
  msgid "Edit Page"
319
327
  msgstr "编辑页面"
320
328
 
321
329
  #. @context: Page heading
322
- #: src/routes/dash/posts.tsx:185
330
+ #: src/routes/dash/posts.tsx:187
323
331
  msgid "Edit Post"
324
332
  msgstr "编辑帖子"
325
333
 
326
334
  #. @context: Setup/signin form field - email
327
335
  #. @context: Setup/signin form field - email
328
- #: src/app.tsx:216
329
- #: src/app.tsx:350
336
+ #: src/app.tsx:222
337
+ #: src/app.tsx:356
330
338
  msgid "Email"
331
339
  msgstr "电子邮件"
332
340
 
333
341
  #. @context: Password reset page description
334
- #: src/app.tsx:457
342
+ #: src/app.tsx:463
335
343
  msgid "Enter your new password."
336
344
  msgstr "输入您的新密码。"
337
345
 
338
- #. @context: Post visibility badge
339
346
  #. @context: Post visibility badge - featured
340
347
  #. @context: Post visibility option
341
- #: src/routes/pages/home.tsx:90
342
- #: src/theme/components/PostForm.tsx:237
348
+ #: src/theme/components/PostForm.tsx:248
343
349
  #: src/theme/components/VisibilityBadge.tsx:26
344
350
  msgid "Featured"
345
351
  msgstr "精选"
@@ -370,7 +376,7 @@ msgstr "常规"
370
376
  #. @context: Post type label - image
371
377
  #. @context: Post type option
372
378
  #: src/routes/pages/archive.tsx:37
373
- #: src/theme/components/PostForm.tsx:76
379
+ #: src/theme/components/PostForm.tsx:82
374
380
  #: src/theme/components/TypeBadge.tsx:29
375
381
  msgid "Image"
376
382
  msgstr "图像"
@@ -381,15 +387,20 @@ msgid "Images"
381
387
  msgstr "图片"
382
388
 
383
389
  #. @context: Media upload instructions - auto optimization
384
- #: src/routes/dash/media.tsx:158
390
+ #: src/routes/dash/media.tsx:171
385
391
  msgid "Images are automatically optimized: resized to max 1920px, converted to WebP, and metadata stripped."
386
392
  msgstr "图像会自动优化:调整大小至最大 1920px,转换为 WebP,并去除元数据。"
387
393
 
388
394
  #. @context: Password reset error heading
389
- #: src/app.tsx:522
395
+ #: src/app.tsx:528
390
396
  msgid "Invalid or Expired Link"
391
397
  msgstr "无效或过期的链接"
392
398
 
399
+ #. @context: Navigation link form field
400
+ #: src/routes/dash/navigation.tsx:126
401
+ msgid "Label"
402
+ msgstr "标签"
403
+
393
404
  #. @context: Settings form field
394
405
  #: src/routes/dash/settings.tsx:171
395
406
  msgid "Language"
@@ -399,7 +410,7 @@ msgstr "语言"
399
410
  #. @context: Post type label - link
400
411
  #. @context: Post type option
401
412
  #: src/routes/pages/archive.tsx:32
402
- #: src/theme/components/PostForm.tsx:70
413
+ #: src/theme/components/PostForm.tsx:76
403
414
  #: src/theme/components/TypeBadge.tsx:24
404
415
  msgid "Link"
405
416
  msgstr "链接"
@@ -409,15 +420,17 @@ msgstr "链接"
409
420
  msgid "Links"
410
421
  msgstr "链接"
411
422
 
423
+ #. @context: Button to load more posts in timeline
412
424
  #. @context: Pagination button - load more items
413
425
  #: src/theme/components/Pagination.tsx:103
426
+ #: src/theme/components/timeline/TimelineFeed.tsx:43
414
427
  msgid "Load more"
415
428
  msgstr "加载更多"
416
429
 
417
430
  #. @context: Loading state for media picker
418
- #: src/theme/components/PostForm.tsx:345
431
+ #: src/theme/components/PostForm.tsx:356
419
432
  msgid "Loading..."
420
- msgstr ""
433
+ msgstr "加载中..."
421
434
 
422
435
  #. @context: Page path validation message
423
436
  #: src/theme/components/PageForm.tsx:76
@@ -425,15 +438,15 @@ msgid "Lowercase letters, numbers, and hyphens only"
425
438
  msgstr "仅允许小写字母、数字和连字符"
426
439
 
427
440
  #. @context: Media detail section - Markdown snippet
428
- #: src/routes/dash/media.tsx:334
441
+ #: src/routes/dash/media.tsx:355
429
442
  msgid "Markdown"
430
443
  msgstr "Markdown"
431
444
 
432
445
  #. @context: Dashboard navigation - media library
433
446
  #. @context: Media main heading
434
447
  #. @context: Post form field - media attachments
435
- #: src/routes/dash/media.tsx:138
436
- #: src/theme/components/PostForm.tsx:121
448
+ #: src/routes/dash/media.tsx:151
449
+ #: src/theme/components/PostForm.tsx:127
437
450
  #: src/theme/layouts/DashLayout.tsx:105
438
451
  msgid "Media"
439
452
  msgstr "媒体"
@@ -448,6 +461,13 @@ msgstr "我的收藏"
448
461
  msgid "Name"
449
462
  msgstr "姓名"
450
463
 
464
+ #. @context: Dashboard heading
465
+ #. @context: Dashboard navigation - navigation links management
466
+ #: src/routes/dash/navigation.tsx:29
467
+ #: src/theme/layouts/DashLayout.tsx:133
468
+ msgid "Navigation"
469
+ msgstr "导航"
470
+
451
471
  #. @context: Help text with link
452
472
  #: src/routes/dash/index.tsx:78
453
473
  msgid "Need help? Visit the <0>documentation</0>"
@@ -462,6 +482,15 @@ msgstr "需要帮助吗?访问<0>文档</0>。"
462
482
  msgid "New Collection"
463
483
  msgstr "新收藏"
464
484
 
485
+ #. @context: Button to create new navigation link
486
+ #. @context: Button to create new navigation link
487
+ #. @context: Page heading
488
+ #: src/routes/dash/navigation.tsx:33
489
+ #: src/routes/dash/navigation.tsx:46
490
+ #: src/routes/dash/navigation.tsx:106
491
+ msgid "New Link"
492
+ msgstr "新链接"
493
+
465
494
  #. @context: Button to create new page
466
495
  #. @context: New page main heading
467
496
  #: src/routes/dash/pages.tsx:37
@@ -471,7 +500,7 @@ msgstr "新页面"
471
500
 
472
501
  #. @context: Password form field
473
502
  #. @context: Password reset form field
474
- #: src/app.tsx:471
503
+ #: src/app.tsx:477
475
504
  #: src/routes/dash/settings.tsx:417
476
505
  msgid "New Password"
477
506
  msgstr "新密码"
@@ -507,10 +536,15 @@ msgid "No collections yet."
507
536
  msgstr "尚未有任何收藏。"
508
537
 
509
538
  #. @context: Empty state message when no media exists
510
- #: src/routes/dash/media.tsx:173
539
+ #: src/routes/dash/media.tsx:186
511
540
  msgid "No media uploaded yet."
512
541
  msgstr "尚未上传任何媒体。"
513
542
 
543
+ #. @context: Empty state message
544
+ #: src/routes/dash/navigation.tsx:42
545
+ msgid "No navigation links configured."
546
+ msgstr "未配置导航链接。"
547
+
514
548
  #. @context: Empty state message when no pages exist
515
549
  #: src/routes/dash/pages.tsx:46
516
550
  msgid "No pages yet."
@@ -530,7 +564,7 @@ msgstr "此集合中没有帖子。"
530
564
 
531
565
  #. @context: Empty state message on home page
532
566
  #. @context: Empty state message when no posts exist
533
- #: src/routes/pages/home.tsx:54
567
+ #: src/routes/pages/home.tsx:42
534
568
  #: src/theme/components/PostList.tsx:25
535
569
  msgid "No posts yet."
536
570
  msgstr "还没有帖子。"
@@ -549,7 +583,7 @@ msgstr "未找到结果。"
549
583
  #. @context: Post type label - note
550
584
  #. @context: Post type option
551
585
  #: src/routes/pages/archive.tsx:27
552
- #: src/theme/components/PostForm.tsx:64
586
+ #: src/theme/components/PostForm.tsx:70
553
587
  #: src/theme/components/TypeBadge.tsx:19
554
588
  msgid "Note"
555
589
  msgstr "注意"
@@ -594,8 +628,8 @@ msgstr "页面"
594
628
 
595
629
  #. @context: Setup/signin form field - password
596
630
  #. @context: Setup/signin form field - password
597
- #: src/app.tsx:231
598
- #: src/app.tsx:359
631
+ #: src/app.tsx:237
632
+ #: src/app.tsx:365
599
633
  msgid "Password"
600
634
  msgstr "密码"
601
635
 
@@ -604,9 +638,14 @@ msgstr "密码"
604
638
  msgid "Path"
605
639
  msgstr "路径"
606
640
 
641
+ #. @context: Navigation URL help text
642
+ #: src/routes/dash/navigation.tsx:161
643
+ msgid "Path (e.g. /archive) or full URL (e.g. https://example.com)"
644
+ msgstr "路径(例如 /archive)或完整 URL(例如 https://example.com)"
645
+
607
646
  #. @context: Link to individual post in thread
608
647
  #. @context: Link to permanent URL of post
609
- #: src/routes/pages/post.tsx:53
648
+ #: src/routes/pages/post.tsx:56
610
649
  #: src/theme/components/ThreadView.tsx:68
611
650
  msgid "Permalink"
612
651
  msgstr "永久链接"
@@ -617,7 +656,7 @@ msgid "Post"
617
656
  msgstr "帖子"
618
657
 
619
658
  #. @context: Post title placeholder
620
- #: src/theme/components/PostForm.tsx:93
659
+ #: src/theme/components/PostForm.tsx:99
621
660
  msgid "Post title..."
622
661
  msgstr "帖子标题..."
623
662
 
@@ -634,7 +673,7 @@ msgid "Posts in Collection ({count})"
634
673
  msgstr "集合中的帖子 ({count})"
635
674
 
636
675
  #. @context: Media detail section - preview
637
- #: src/routes/dash/media.tsx:257
676
+ #: src/routes/dash/media.tsx:278
638
677
  msgid "Preview"
639
678
  msgstr "预览"
640
679
 
@@ -646,7 +685,7 @@ msgid "Previous"
646
685
  msgstr "上一页"
647
686
 
648
687
  #. @context: Upload status - processing
649
- #: src/routes/dash/media.tsx:106
688
+ #: src/routes/dash/media.tsx:119
650
689
  msgid "Processing..."
651
690
  msgstr "处理中..."
652
691
 
@@ -656,7 +695,7 @@ msgid "Profile"
656
695
  msgstr "个人资料"
657
696
 
658
697
  #. @context: Button to publish new post
659
- #: src/theme/components/PostForm.tsx:306
698
+ #: src/theme/components/PostForm.tsx:317
660
699
  msgid "Publish"
661
700
  msgstr "发布"
662
701
 
@@ -683,7 +722,7 @@ msgid "Quiet"
683
722
  msgstr "安静"
684
723
 
685
724
  #. @context: Post visibility option
686
- #: src/theme/components/PostForm.tsx:231
725
+ #: src/theme/components/PostForm.tsx:242
687
726
  msgid "Quiet (normal)"
688
727
  msgstr "安静(正常)"
689
728
 
@@ -691,7 +730,7 @@ msgstr "安静(正常)"
691
730
  #. @context: Post type label - quote
692
731
  #. @context: Post type option
693
732
  #: src/routes/pages/archive.tsx:33
694
- #: src/theme/components/PostForm.tsx:73
733
+ #: src/theme/components/PostForm.tsx:79
695
734
  #: src/theme/components/TypeBadge.tsx:25
696
735
  msgid "Quote"
697
736
  msgstr "引用"
@@ -711,17 +750,22 @@ msgstr "重定向"
711
750
  #. @context: Button to remove post from collection
712
751
  #. @context: Remove media attachment button
713
752
  #: src/routes/dash/collections.tsx:257
714
- #: src/theme/components/PostForm.tsx:161
753
+ #: src/theme/components/PostForm.tsx:172
715
754
  msgid "Remove"
716
755
  msgstr "移除"
717
756
 
718
757
  #. @context: Password reset form submit button
719
758
  #. @context: Password reset page heading
720
- #: src/app.tsx:451
721
- #: src/app.tsx:502
759
+ #: src/app.tsx:457
760
+ #: src/app.tsx:508
722
761
  msgid "Reset Password"
723
762
  msgstr "重置密码"
724
763
 
764
+ #. @context: Button to save edited navigation link
765
+ #: src/routes/dash/navigation.tsx:172
766
+ msgid "Save Changes"
767
+ msgstr "保存更改"
768
+
725
769
  #. @context: Button to save profile
726
770
  #: src/routes/dash/settings.tsx:378
727
771
  msgid "Save Profile"
@@ -745,9 +789,9 @@ msgid "Search posts..."
745
789
  msgstr "搜索帖子..."
746
790
 
747
791
  #. @context: Media picker dialog title
748
- #: src/theme/components/PostForm.tsx:324
792
+ #: src/theme/components/PostForm.tsx:335
749
793
  msgid "Select Media"
750
- msgstr ""
794
+ msgstr "选择媒体"
751
795
 
752
796
  #. @context: Dashboard heading
753
797
  #. @context: Dashboard heading
@@ -756,14 +800,20 @@ msgstr ""
756
800
  #: src/routes/dash/settings.tsx:118
757
801
  #: src/routes/dash/settings.tsx:290
758
802
  #: src/routes/dash/settings.tsx:341
759
- #: src/theme/layouts/DashLayout.tsx:133
803
+ #: src/theme/layouts/DashLayout.tsx:143
760
804
  msgid "Settings"
761
805
  msgstr "设置"
762
806
 
807
+ #. @context: Link to show remaining thread replies
808
+ #. placeholder {0}: remainingCount === 1 ? "reply" : "replies"
809
+ #: src/theme/components/timeline/ThreadPreview.tsx:38
810
+ msgid "Show {remainingCount} more {0}"
811
+ msgstr "显示 {remainingCount} 个更多 {0}"
812
+
763
813
  #. @context: Sign in form submit button
764
814
  #. @context: Sign in page heading
765
- #: src/app.tsx:327
766
- #: src/app.tsx:372
815
+ #: src/app.tsx:333
816
+ #: src/app.tsx:378
767
817
  msgid "Sign In"
768
818
  msgstr "登录"
769
819
 
@@ -790,12 +840,12 @@ msgid "Slug"
790
840
  msgstr "缩略名"
791
841
 
792
842
  #. @context: Post form field - name of the source website or author
793
- #: src/theme/components/PostForm.tsx:204
843
+ #: src/theme/components/PostForm.tsx:215
794
844
  msgid "Source Name (optional)"
795
- msgstr ""
845
+ msgstr "来源名称(可选)"
796
846
 
797
847
  #. @context: Post form field
798
- #: src/theme/components/PostForm.tsx:188
848
+ #: src/theme/components/PostForm.tsx:199
799
849
  msgid "Source URL (optional)"
800
850
  msgstr "源网址(可选)"
801
851
 
@@ -820,7 +870,7 @@ msgid "The URL path for this page. Use lowercase letters, numbers, and hyphens."
820
870
  msgstr "此页面的 URL 路径。使用小写字母、数字和连字符。"
821
871
 
822
872
  #. @context: Password reset error description
823
- #: src/app.tsx:530
873
+ #: src/app.tsx:536
824
874
  msgid "This password reset link is invalid or has expired. Please generate a new one."
825
875
  msgstr "此密码重置链接无效或已过期。请生成一个新的链接。"
826
876
 
@@ -854,7 +904,7 @@ msgid "Title"
854
904
  msgstr "标题"
855
905
 
856
906
  #. @context: Post form field
857
- #: src/theme/components/PostForm.tsx:84
907
+ #: src/theme/components/PostForm.tsx:90
858
908
  msgid "Title (optional)"
859
909
  msgstr "标题(可选)"
860
910
 
@@ -866,13 +916,13 @@ msgstr "到路径"
866
916
  #. @context: Post form field - post type
867
917
  #. @context: Redirect form field
868
918
  #: src/routes/dash/redirects.tsx:141
869
- #: src/theme/components/PostForm.tsx:57
919
+ #: src/theme/components/PostForm.tsx:63
870
920
  msgid "Type"
871
921
  msgstr "类型"
872
922
 
873
923
  #. @context: Post visibility badge - unlisted
874
924
  #. @context: Post visibility option
875
- #: src/theme/components/PostForm.tsx:243
925
+ #: src/theme/components/PostForm.tsx:254
876
926
  #: src/theme/components/VisibilityBadge.tsx:34
877
927
  msgid "Unlisted"
878
928
  msgstr "未列出"
@@ -880,12 +930,12 @@ msgstr "未列出"
880
930
  #. @context: Default title for untitled page
881
931
  #. @context: Default title for untitled post
882
932
  #: src/routes/dash/pages.tsx:91
883
- #: src/theme/components/PostList.tsx:71
933
+ #: src/theme/components/PostList.tsx:78
884
934
  msgid "Untitled"
885
935
  msgstr "无标题"
886
936
 
887
937
  #. @context: Button to update existing post
888
- #: src/theme/components/PostForm.tsx:302
938
+ #: src/theme/components/PostForm.tsx:313
889
939
  msgid "Update"
890
940
  msgstr "更新"
891
941
 
@@ -900,22 +950,24 @@ msgid "Update Page"
900
950
  msgstr "更新页面"
901
951
 
902
952
  #. @context: Button to upload media file
903
- #: src/routes/dash/media.tsx:114
953
+ #: src/routes/dash/media.tsx:127
904
954
  msgid "Upload"
905
955
  msgstr "上传"
906
956
 
907
957
  #. @context: Upload error message
908
- #: src/routes/dash/media.tsx:118
958
+ #: src/routes/dash/media.tsx:131
909
959
  msgid "Upload failed. Please try again."
910
960
  msgstr "上传失败。请再试一次。"
911
961
 
912
962
  #. @context: Upload status - uploading
913
- #: src/routes/dash/media.tsx:110
963
+ #: src/routes/dash/media.tsx:123
914
964
  msgid "Uploading..."
915
965
  msgstr "上传中..."
916
966
 
917
967
  #. @context: Media detail section - URL
918
- #: src/routes/dash/media.tsx:297
968
+ #. @context: Navigation link form field
969
+ #: src/routes/dash/media.tsx:318
970
+ #: src/routes/dash/navigation.tsx:148
919
971
  msgid "URL"
920
972
  msgstr "网址"
921
973
 
@@ -925,7 +977,7 @@ msgid "URL-safe identifier (lowercase, numbers, hyphens)"
925
977
  msgstr "URL安全标识符(小写字母、数字、连字符)"
926
978
 
927
979
  #. @context: Media URL helper text
928
- #: src/routes/dash/media.tsx:323
980
+ #: src/routes/dash/media.tsx:344
929
981
  msgid "Use this URL to embed the media in your posts."
930
982
  msgstr "使用此 URL 将媒体嵌入到您的帖子中。"
931
983
 
@@ -946,28 +998,23 @@ msgstr "使用此 URL 将媒体嵌入到您的帖子中。"
946
998
  msgid "View"
947
999
  msgstr "查看"
948
1000
 
949
- #. @context: Link to view all posts on archive page
950
- #: src/routes/pages/home.tsx:109
951
- msgid "View all posts →"
952
- msgstr "查看所有帖子 →"
953
-
954
1001
  #. @context: Dashboard header link to view the public site
955
1002
  #: src/theme/layouts/DashLayout.tsx:53
956
1003
  msgid "View Site"
957
1004
  msgstr "查看网站"
958
1005
 
959
1006
  #. @context: Post form field
960
- #: src/theme/components/PostForm.tsx:224
1007
+ #: src/theme/components/PostForm.tsx:235
961
1008
  msgid "Visibility"
962
1009
  msgstr "可见性"
963
1010
 
964
1011
  #. @context: Setup page welcome heading
965
- #: src/app.tsx:181
1012
+ #: src/app.tsx:187
966
1013
  msgid "Welcome to Jant"
967
1014
  msgstr "欢迎来到Jant"
968
1015
 
969
1016
  #. @context: Post content placeholder
970
- #: src/theme/components/PostForm.tsx:108
1017
+ #: src/theme/components/PostForm.tsx:114
971
1018
  msgid "What's on your mind?"
972
1019
  msgstr "你在想什么?"
973
1020
 
@@ -977,6 +1024,6 @@ msgid "What's this collection about?"
977
1024
  msgstr "这个系列是关于什么的?"
978
1025
 
979
1026
  #. @context: Setup form field - user name
980
- #: src/app.tsx:201
1027
+ #: src/app.tsx:207
981
1028
  msgid "Your Name"
982
1029
  msgstr "您的姓名"