@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
@@ -27,8 +27,8 @@ msgstr "← Back to Collections"
27
27
  #. @context: Navigation link
28
28
  #: src/routes/pages/collection.tsx:76
29
29
  #: src/routes/pages/post.tsx:63
30
- msgid "← Back to home"
31
- msgstr "← Back to home"
30
+ #~ msgid "← Back to home"
31
+ #~ msgstr "← Back to home"
32
32
 
33
33
  #. @context: Archive post reply indicator - single
34
34
  #: src/routes/pages/archive.tsx:175
@@ -51,7 +51,7 @@ msgid "Account"
51
51
  msgstr "Account"
52
52
 
53
53
  #. @context: Button to open media picker
54
- #: src/theme/components/PostForm.tsx:178
54
+ #: src/theme/components/PostForm.tsx:189
55
55
  msgid "Add Media"
56
56
  msgstr "Add Media"
57
57
 
@@ -66,17 +66,20 @@ msgid "Appearance"
66
66
  msgstr "Appearance"
67
67
 
68
68
  #. @context: Archive page title
69
- #. @context: Navigation link to archive page
70
69
  #: src/routes/pages/archive.tsx:102
71
- #: src/routes/pages/home.tsx:40
72
70
  msgid "Archive"
73
71
  msgstr "Archive"
74
72
 
73
+ #. @context: Confirmation dialog when deleting a post from the list
74
+ #: src/theme/components/PostList.tsx:56
75
+ msgid "Are you sure you want to delete this post? This cannot be undone."
76
+ msgstr "Are you sure you want to delete this post? This cannot be undone."
77
+
75
78
  #. @context: Post type badge - article
76
79
  #. @context: Post type label - article
77
80
  #. @context: Post type option
78
81
  #: src/routes/pages/archive.tsx:28
79
- #: src/theme/components/PostForm.tsx:67
82
+ #: src/theme/components/PostForm.tsx:73
80
83
  #: src/theme/components/TypeBadge.tsx:20
81
84
  msgid "Article"
82
85
  msgstr "Article"
@@ -87,12 +90,12 @@ msgid "Articles"
87
90
  msgstr "Articles"
88
91
 
89
92
  #. @context: Hint for image post type media requirement
90
- #: src/theme/components/PostForm.tsx:130
93
+ #: src/theme/components/PostForm.tsx:136
91
94
  msgid "At least 1 image required for image posts."
92
95
  msgstr "At least 1 image required for image posts."
93
96
 
94
97
  #. @context: Button to go back to media list
95
- #: src/routes/dash/media.tsx:245
98
+ #: src/routes/dash/media.tsx:266
96
99
  msgid "Back"
97
100
  msgstr "Back"
98
101
 
@@ -102,19 +105,21 @@ msgstr "Back"
102
105
  #: src/routes/pages/archive.tsx:209
103
106
  #: src/routes/pages/page.tsx:37
104
107
  #: src/routes/pages/search.tsx:144
105
- msgid "Back to home"
106
- msgstr "Back to home"
108
+ #~ msgid "Back to home"
109
+ #~ msgstr "Back to home"
107
110
 
108
111
  #. @context: Button to cancel and go back
109
112
  #. @context: Button to cancel form
110
113
  #. @context: Button to cancel form
111
114
  #. @context: Button to cancel form
112
115
  #. @context: Button to cancel form
116
+ #. @context: Button to cancel form
113
117
  #: src/routes/dash/collections.tsx:176
114
118
  #: src/routes/dash/collections.tsx:345
119
+ #: src/routes/dash/navigation.tsx:182
115
120
  #: src/routes/dash/redirects.tsx:167
116
121
  #: src/theme/components/PageForm.tsx:161
117
- #: src/theme/components/PostForm.tsx:312
122
+ #: src/theme/components/PostForm.tsx:323
118
123
  msgid "Cancel"
119
124
  msgstr "Cancel"
120
125
 
@@ -126,7 +131,7 @@ msgid "Change Password"
126
131
  msgstr "Change Password"
127
132
 
128
133
  #. @context: Hint to click image for lightbox
129
- #: src/routes/dash/media.tsx:278
134
+ #: src/routes/dash/media.tsx:299
130
135
  msgid "Click image to view full size"
131
136
  msgstr "Click image to view full size"
132
137
 
@@ -138,7 +143,7 @@ msgid "Collections"
138
143
  msgstr "Collections"
139
144
 
140
145
  #. @context: Post form field - assign to collections
141
- #: src/theme/components/PostForm.tsx:261
146
+ #: src/theme/components/PostForm.tsx:272
142
147
  msgid "Collections (optional)"
143
148
  msgstr "Collections (optional)"
144
149
 
@@ -148,7 +153,7 @@ msgid "Color theme"
148
153
  msgstr "Color theme"
149
154
 
150
155
  #. @context: Setup form submit button
151
- #: src/app.tsx:245
156
+ #: src/app.tsx:251
152
157
  msgid "Complete Setup"
153
158
  msgstr "Complete Setup"
154
159
 
@@ -158,21 +163,21 @@ msgid "Confirm New Password"
158
163
  msgstr "Confirm New Password"
159
164
 
160
165
  #. @context: Password reset form field
161
- #: src/app.tsx:487
166
+ #: src/app.tsx:493
162
167
  msgid "Confirm Password"
163
168
  msgstr "Confirm Password"
164
169
 
165
170
  #. @context: Page form field label - content
166
171
  #. @context: Post form field
167
172
  #: src/theme/components/PageForm.tsx:95
168
- #: src/theme/components/PostForm.tsx:103
173
+ #: src/theme/components/PostForm.tsx:109
169
174
  msgid "Content"
170
175
  msgstr "Content"
171
176
 
172
177
  #. @context: Button to copy Markdown to clipboard
173
178
  #. @context: Button to copy URL to clipboard
174
- #: src/routes/dash/media.tsx:316
175
- #: src/routes/dash/media.tsx:353
179
+ #: src/routes/dash/media.tsx:337
180
+ #: src/routes/dash/media.tsx:374
176
181
  msgid "Copy"
177
182
  msgstr "Copy"
178
183
 
@@ -181,6 +186,11 @@ msgstr "Copy"
181
186
  msgid "Create Collection"
182
187
  msgstr "Create Collection"
183
188
 
189
+ #. @context: Button to save new navigation link
190
+ #: src/routes/dash/navigation.tsx:176
191
+ msgid "Create Link"
192
+ msgstr "Create Link"
193
+
184
194
  #. @context: Button to create new page
185
195
  #: src/theme/components/PageForm.tsx:155
186
196
  msgid "Create Page"
@@ -192,7 +202,7 @@ msgid "Create Redirect"
192
202
  msgstr "Create Redirect"
193
203
 
194
204
  #. @context: Setup page description
195
- #: src/app.tsx:187
205
+ #: src/app.tsx:193
196
206
  msgid "Create your admin account."
197
207
  msgstr "Create your admin account."
198
208
 
@@ -212,7 +222,7 @@ msgid "Current Password"
212
222
  msgstr "Current Password"
213
223
 
214
224
  #. @context: Post form field
215
- #: src/theme/components/PostForm.tsx:285
225
+ #: src/theme/components/PostForm.tsx:296
216
226
  msgid "Custom Path (optional)"
217
227
  msgstr "Custom Path (optional)"
218
228
 
@@ -229,7 +239,9 @@ msgid "Dashboard"
229
239
  msgstr "Dashboard"
230
240
 
231
241
  #. @context: Button to delete item
242
+ #. @context: Button to delete navigation link
232
243
  #. @context: Button to delete redirect
244
+ #: src/routes/dash/navigation.tsx:66
233
245
  #: src/routes/dash/redirects.tsx:60
234
246
  #: src/theme/components/ActionButtons.tsx:80
235
247
  msgid "Delete"
@@ -241,7 +253,7 @@ msgid "Delete Collection"
241
253
  msgstr "Delete Collection"
242
254
 
243
255
  #. @context: Button to delete media
244
- #: src/routes/dash/media.tsx:364
256
+ #: src/routes/dash/media.tsx:385
245
257
  msgid "Delete Media"
246
258
  msgstr "Delete Media"
247
259
 
@@ -251,12 +263,12 @@ msgid "Delete Page"
251
263
  msgstr "Delete Page"
252
264
 
253
265
  #. @context: Warning message before deleting media
254
- #: src/routes/dash/media.tsx:370
266
+ #: src/routes/dash/media.tsx:391
255
267
  msgid "Deleting this media will remove it permanently from storage."
256
268
  msgstr "Deleting this media will remove it permanently from storage."
257
269
 
258
270
  #. @context: Hint shown on signin page when demo credentials are pre-filled
259
- #: src/app.tsx:336
271
+ #: src/app.tsx:342
260
272
  msgid "Demo account pre-filled. Just click Sign In."
261
273
  msgstr "Demo account pre-filled. Just click Sign In."
262
274
 
@@ -267,8 +279,13 @@ msgstr "Demo account pre-filled. Just click Sign In."
267
279
  msgid "Description (optional)"
268
280
  msgstr "Description (optional)"
269
281
 
282
+ #. @context: Navigation label help text
283
+ #: src/routes/dash/navigation.tsx:139
284
+ msgid "Display text for the link"
285
+ msgstr "Display text for the link"
286
+
270
287
  #. @context: Close media picker button
271
- #: src/theme/components/PostForm.tsx:334
288
+ #: src/theme/components/PostForm.tsx:345
272
289
  msgid "Done"
273
290
  msgstr "Done"
274
291
 
@@ -276,7 +293,7 @@ msgstr "Done"
276
293
  #. @context: Post visibility badge - draft
277
294
  #. @context: Post visibility option
278
295
  #: src/theme/components/PageForm.tsx:132
279
- #: src/theme/components/PostForm.tsx:249
296
+ #: src/theme/components/PostForm.tsx:260
280
297
  #: src/theme/components/VisibilityBadge.tsx:38
281
298
  msgid "Draft"
282
299
  msgstr "Draft"
@@ -287,19 +304,21 @@ msgid "Drafts"
287
304
  msgstr "Drafts"
288
305
 
289
306
  #. @context: Source name placeholder
290
- #: src/theme/components/PostForm.tsx:214
307
+ #: src/theme/components/PostForm.tsx:225
291
308
  msgid "e.g. The Verge, John Doe"
292
309
  msgstr "e.g. The Verge, John Doe"
293
310
 
294
311
  #. @context: Button to edit collection
295
312
  #. @context: Button to edit collection
296
313
  #. @context: Button to edit item
314
+ #. @context: Button to edit navigation link
297
315
  #. @context: Button to edit page
298
316
  #. @context: Button to edit page
299
317
  #. @context: Button to edit post
300
318
  #. @context: Button to edit post
301
319
  #: src/routes/dash/collections.tsx:66
302
320
  #: src/routes/dash/collections.tsx:210
321
+ #: src/routes/dash/navigation.tsx:61
303
322
  #: src/routes/dash/pages.tsx:64
304
323
  #: src/routes/dash/pages.tsx:134
305
324
  #: src/routes/dash/posts.tsx:142
@@ -313,13 +332,18 @@ msgstr "Edit"
313
332
  msgid "Edit Collection"
314
333
  msgstr "Edit Collection"
315
334
 
335
+ #. @context: Page heading
336
+ #: src/routes/dash/navigation.tsx:105
337
+ msgid "Edit Link"
338
+ msgstr "Edit Link"
339
+
316
340
  #. @context: Edit page main heading
317
341
  #: src/routes/dash/pages.tsx:176
318
342
  msgid "Edit Page"
319
343
  msgstr "Edit Page"
320
344
 
321
345
  #. @context: Page heading
322
- #: src/routes/dash/posts.tsx:185
346
+ #: src/routes/dash/posts.tsx:187
323
347
  msgid "Edit Post"
324
348
  msgstr "Edit Post"
325
349
 
@@ -334,21 +358,19 @@ msgstr "Edit Post"
334
358
 
335
359
  #. @context: Setup/signin form field - email
336
360
  #. @context: Setup/signin form field - email
337
- #: src/app.tsx:216
338
- #: src/app.tsx:350
361
+ #: src/app.tsx:222
362
+ #: src/app.tsx:356
339
363
  msgid "Email"
340
364
  msgstr "Email"
341
365
 
342
366
  #. @context: Password reset page description
343
- #: src/app.tsx:457
367
+ #: src/app.tsx:463
344
368
  msgid "Enter your new password."
345
369
  msgstr "Enter your new password."
346
370
 
347
- #. @context: Post visibility badge
348
371
  #. @context: Post visibility badge - featured
349
372
  #. @context: Post visibility option
350
- #: src/routes/pages/home.tsx:90
351
- #: src/theme/components/PostForm.tsx:237
373
+ #: src/theme/components/PostForm.tsx:248
352
374
  #: src/theme/components/VisibilityBadge.tsx:26
353
375
  msgid "Featured"
354
376
  msgstr "Featured"
@@ -379,7 +401,7 @@ msgstr "General"
379
401
  #. @context: Post type label - image
380
402
  #. @context: Post type option
381
403
  #: src/routes/pages/archive.tsx:37
382
- #: src/theme/components/PostForm.tsx:76
404
+ #: src/theme/components/PostForm.tsx:82
383
405
  #: src/theme/components/TypeBadge.tsx:29
384
406
  msgid "Image"
385
407
  msgstr "Image"
@@ -390,15 +412,20 @@ msgid "Images"
390
412
  msgstr "Images"
391
413
 
392
414
  #. @context: Media upload instructions - auto optimization
393
- #: src/routes/dash/media.tsx:158
415
+ #: src/routes/dash/media.tsx:171
394
416
  msgid "Images are automatically optimized: resized to max 1920px, converted to WebP, and metadata stripped."
395
417
  msgstr "Images are automatically optimized: resized to max 1920px, converted to WebP, and metadata stripped."
396
418
 
397
419
  #. @context: Password reset error heading
398
- #: src/app.tsx:522
420
+ #: src/app.tsx:528
399
421
  msgid "Invalid or Expired Link"
400
422
  msgstr "Invalid or Expired Link"
401
423
 
424
+ #. @context: Navigation link form field
425
+ #: src/routes/dash/navigation.tsx:126
426
+ msgid "Label"
427
+ msgstr "Label"
428
+
402
429
  #. @context: Settings form field
403
430
  #: src/routes/dash/settings.tsx:171
404
431
  msgid "Language"
@@ -413,7 +440,7 @@ msgstr "Language"
413
440
  #. @context: Post type label - link
414
441
  #. @context: Post type option
415
442
  #: src/routes/pages/archive.tsx:32
416
- #: src/theme/components/PostForm.tsx:70
443
+ #: src/theme/components/PostForm.tsx:76
417
444
  #: src/theme/components/TypeBadge.tsx:24
418
445
  msgid "Link"
419
446
  msgstr "Link"
@@ -423,13 +450,15 @@ msgstr "Link"
423
450
  msgid "Links"
424
451
  msgstr "Links"
425
452
 
453
+ #. @context: Button to load more posts in timeline
426
454
  #. @context: Pagination button - load more items
427
455
  #: src/theme/components/Pagination.tsx:103
456
+ #: src/theme/components/timeline/TimelineFeed.tsx:43
428
457
  msgid "Load more"
429
458
  msgstr "Load more"
430
459
 
431
460
  #. @context: Loading state for media picker
432
- #: src/theme/components/PostForm.tsx:345
461
+ #: src/theme/components/PostForm.tsx:356
433
462
  msgid "Loading..."
434
463
  msgstr "Loading..."
435
464
 
@@ -439,15 +468,15 @@ msgid "Lowercase letters, numbers, and hyphens only"
439
468
  msgstr "Lowercase letters, numbers, and hyphens only"
440
469
 
441
470
  #. @context: Media detail section - Markdown snippet
442
- #: src/routes/dash/media.tsx:334
471
+ #: src/routes/dash/media.tsx:355
443
472
  msgid "Markdown"
444
473
  msgstr "Markdown"
445
474
 
446
475
  #. @context: Dashboard navigation - media library
447
476
  #. @context: Media main heading
448
477
  #. @context: Post form field - media attachments
449
- #: src/routes/dash/media.tsx:138
450
- #: src/theme/components/PostForm.tsx:121
478
+ #: src/routes/dash/media.tsx:151
479
+ #: src/theme/components/PostForm.tsx:127
451
480
  #: src/theme/layouts/DashLayout.tsx:105
452
481
  msgid "Media"
453
482
  msgstr "Media"
@@ -467,6 +496,13 @@ msgstr "My Collection"
467
496
  msgid "Name"
468
497
  msgstr "Name"
469
498
 
499
+ #. @context: Dashboard heading
500
+ #. @context: Dashboard navigation - navigation links management
501
+ #: src/routes/dash/navigation.tsx:29
502
+ #: src/theme/layouts/DashLayout.tsx:133
503
+ msgid "Navigation"
504
+ msgstr "Navigation"
505
+
470
506
  #. @context: Help text with link
471
507
  #: src/routes/dash/index.tsx:78
472
508
  msgid "Need help? Visit the <0>documentation</0>"
@@ -481,6 +517,15 @@ msgstr "Need help? Visit the <0>documentation</0>"
481
517
  msgid "New Collection"
482
518
  msgstr "New Collection"
483
519
 
520
+ #. @context: Button to create new navigation link
521
+ #. @context: Button to create new navigation link
522
+ #. @context: Page heading
523
+ #: src/routes/dash/navigation.tsx:33
524
+ #: src/routes/dash/navigation.tsx:46
525
+ #: src/routes/dash/navigation.tsx:106
526
+ msgid "New Link"
527
+ msgstr "New Link"
528
+
484
529
  #. @context: Button to create new page
485
530
  #. @context: New page main heading
486
531
  #: src/routes/dash/pages.tsx:37
@@ -490,7 +535,7 @@ msgstr "New Page"
490
535
 
491
536
  #. @context: Password form field
492
537
  #. @context: Password reset form field
493
- #: src/app.tsx:471
538
+ #: src/app.tsx:477
494
539
  #: src/routes/dash/settings.tsx:417
495
540
  msgid "New Password"
496
541
  msgstr "New Password"
@@ -526,10 +571,15 @@ msgid "No collections yet."
526
571
  msgstr "No collections yet."
527
572
 
528
573
  #. @context: Empty state message when no media exists
529
- #: src/routes/dash/media.tsx:173
574
+ #: src/routes/dash/media.tsx:186
530
575
  msgid "No media uploaded yet."
531
576
  msgstr "No media uploaded yet."
532
577
 
578
+ #. @context: Empty state message
579
+ #: src/routes/dash/navigation.tsx:42
580
+ msgid "No navigation links configured."
581
+ msgstr "No navigation links configured."
582
+
533
583
  #. @context: Empty state message when no pages exist
534
584
  #: src/routes/dash/pages.tsx:46
535
585
  msgid "No pages yet."
@@ -549,7 +599,7 @@ msgstr "No posts in this collection."
549
599
 
550
600
  #. @context: Empty state message on home page
551
601
  #. @context: Empty state message when no posts exist
552
- #: src/routes/pages/home.tsx:54
602
+ #: src/routes/pages/home.tsx:42
553
603
  #: src/theme/components/PostList.tsx:25
554
604
  msgid "No posts yet."
555
605
  msgstr "No posts yet."
@@ -568,7 +618,7 @@ msgstr "No results found."
568
618
  #. @context: Post type label - note
569
619
  #. @context: Post type option
570
620
  #: src/routes/pages/archive.tsx:27
571
- #: src/theme/components/PostForm.tsx:64
621
+ #: src/theme/components/PostForm.tsx:70
572
622
  #: src/theme/components/TypeBadge.tsx:19
573
623
  msgid "Note"
574
624
  msgstr "Note"
@@ -613,8 +663,8 @@ msgstr "Pages"
613
663
 
614
664
  #. @context: Setup/signin form field - password
615
665
  #. @context: Setup/signin form field - password
616
- #: src/app.tsx:231
617
- #: src/app.tsx:359
666
+ #: src/app.tsx:237
667
+ #: src/app.tsx:365
618
668
  msgid "Password"
619
669
  msgstr "Password"
620
670
 
@@ -623,9 +673,14 @@ msgstr "Password"
623
673
  msgid "Path"
624
674
  msgstr "Path"
625
675
 
676
+ #. @context: Navigation URL help text
677
+ #: src/routes/dash/navigation.tsx:161
678
+ msgid "Path (e.g. /archive) or full URL (e.g. https://example.com)"
679
+ msgstr "Path (e.g. /archive) or full URL (e.g. https://example.com)"
680
+
626
681
  #. @context: Link to individual post in thread
627
682
  #. @context: Link to permanent URL of post
628
- #: src/routes/pages/post.tsx:53
683
+ #: src/routes/pages/post.tsx:56
629
684
  #: src/theme/components/ThreadView.tsx:68
630
685
  msgid "Permalink"
631
686
  msgstr "Permalink"
@@ -636,7 +691,7 @@ msgid "Post"
636
691
  msgstr "Post"
637
692
 
638
693
  #. @context: Post title placeholder
639
- #: src/theme/components/PostForm.tsx:93
694
+ #: src/theme/components/PostForm.tsx:99
640
695
  msgid "Post title..."
641
696
  msgstr "Post title..."
642
697
 
@@ -653,7 +708,7 @@ msgid "Posts in Collection ({count})"
653
708
  msgstr "Posts in Collection ({count})"
654
709
 
655
710
  #. @context: Media detail section - preview
656
- #: src/routes/dash/media.tsx:257
711
+ #: src/routes/dash/media.tsx:278
657
712
  msgid "Preview"
658
713
  msgstr "Preview"
659
714
 
@@ -665,7 +720,7 @@ msgid "Previous"
665
720
  msgstr "Previous"
666
721
 
667
722
  #. @context: Upload status - processing
668
- #: src/routes/dash/media.tsx:106
723
+ #: src/routes/dash/media.tsx:119
669
724
  msgid "Processing..."
670
725
  msgstr "Processing..."
671
726
 
@@ -675,7 +730,7 @@ msgid "Profile"
675
730
  msgstr "Profile"
676
731
 
677
732
  #. @context: Button to publish new post
678
- #: src/theme/components/PostForm.tsx:306
733
+ #: src/theme/components/PostForm.tsx:317
679
734
  msgid "Publish"
680
735
  msgstr "Publish"
681
736
 
@@ -702,7 +757,7 @@ msgid "Quiet"
702
757
  msgstr "Quiet"
703
758
 
704
759
  #. @context: Post visibility option
705
- #: src/theme/components/PostForm.tsx:231
760
+ #: src/theme/components/PostForm.tsx:242
706
761
  msgid "Quiet (normal)"
707
762
  msgstr "Quiet (normal)"
708
763
 
@@ -710,7 +765,7 @@ msgstr "Quiet (normal)"
710
765
  #. @context: Post type label - quote
711
766
  #. @context: Post type option
712
767
  #: src/routes/pages/archive.tsx:33
713
- #: src/theme/components/PostForm.tsx:73
768
+ #: src/theme/components/PostForm.tsx:79
714
769
  #: src/theme/components/TypeBadge.tsx:25
715
770
  msgid "Quote"
716
771
  msgstr "Quote"
@@ -730,17 +785,22 @@ msgstr "Redirects"
730
785
  #. @context: Button to remove post from collection
731
786
  #. @context: Remove media attachment button
732
787
  #: src/routes/dash/collections.tsx:257
733
- #: src/theme/components/PostForm.tsx:161
788
+ #: src/theme/components/PostForm.tsx:172
734
789
  msgid "Remove"
735
790
  msgstr "Remove"
736
791
 
737
792
  #. @context: Password reset form submit button
738
793
  #. @context: Password reset page heading
739
- #: src/app.tsx:451
740
- #: src/app.tsx:502
794
+ #: src/app.tsx:457
795
+ #: src/app.tsx:508
741
796
  msgid "Reset Password"
742
797
  msgstr "Reset Password"
743
798
 
799
+ #. @context: Button to save edited navigation link
800
+ #: src/routes/dash/navigation.tsx:172
801
+ msgid "Save Changes"
802
+ msgstr "Save Changes"
803
+
744
804
  #. @context: Button to save profile
745
805
  #: src/routes/dash/settings.tsx:378
746
806
  msgid "Save Profile"
@@ -769,7 +829,7 @@ msgid "Search posts..."
769
829
  msgstr "Search posts..."
770
830
 
771
831
  #. @context: Media picker dialog title
772
- #: src/theme/components/PostForm.tsx:324
832
+ #: src/theme/components/PostForm.tsx:335
773
833
  msgid "Select Media"
774
834
  msgstr "Select Media"
775
835
 
@@ -780,7 +840,7 @@ msgstr "Select Media"
780
840
  #: src/routes/dash/settings.tsx:118
781
841
  #: src/routes/dash/settings.tsx:290
782
842
  #: src/routes/dash/settings.tsx:341
783
- #: src/theme/layouts/DashLayout.tsx:133
843
+ #: src/theme/layouts/DashLayout.tsx:143
784
844
  msgid "Settings"
785
845
  msgstr "Settings"
786
846
 
@@ -789,10 +849,16 @@ msgstr "Settings"
789
849
  #~ msgid "Setup"
790
850
  #~ msgstr "Setup"
791
851
 
852
+ #. @context: Link to show remaining thread replies
853
+ #. placeholder {0}: remainingCount === 1 ? "reply" : "replies"
854
+ #: src/theme/components/timeline/ThreadPreview.tsx:38
855
+ msgid "Show {remainingCount} more {0}"
856
+ msgstr "Show {remainingCount} more {0}"
857
+
792
858
  #. @context: Sign in form submit button
793
859
  #. @context: Sign in page heading
794
- #: src/app.tsx:327
795
- #: src/app.tsx:372
860
+ #: src/app.tsx:333
861
+ #: src/app.tsx:378
796
862
  msgid "Sign In"
797
863
  msgstr "Sign In"
798
864
 
@@ -819,12 +885,12 @@ msgid "Slug"
819
885
  msgstr "Slug"
820
886
 
821
887
  #. @context: Post form field - name of the source website or author
822
- #: src/theme/components/PostForm.tsx:204
888
+ #: src/theme/components/PostForm.tsx:215
823
889
  msgid "Source Name (optional)"
824
890
  msgstr "Source Name (optional)"
825
891
 
826
892
  #. @context: Post form field
827
- #: src/theme/components/PostForm.tsx:188
893
+ #: src/theme/components/PostForm.tsx:199
828
894
  msgid "Source URL (optional)"
829
895
  msgstr "Source URL (optional)"
830
896
 
@@ -854,7 +920,7 @@ msgid "The URL path for this page. Use lowercase letters, numbers, and hyphens."
854
920
  msgstr "The URL path for this page. Use lowercase letters, numbers, and hyphens."
855
921
 
856
922
  #. @context: Password reset error description
857
- #: src/app.tsx:530
923
+ #: src/app.tsx:536
858
924
  msgid "This password reset link is invalid or has expired. Please generate a new one."
859
925
  msgstr "This password reset link is invalid or has expired. Please generate a new one."
860
926
 
@@ -888,7 +954,7 @@ msgid "Title"
888
954
  msgstr "Title"
889
955
 
890
956
  #. @context: Post form field
891
- #: src/theme/components/PostForm.tsx:84
957
+ #: src/theme/components/PostForm.tsx:90
892
958
  msgid "Title (optional)"
893
959
  msgstr "Title (optional)"
894
960
 
@@ -900,13 +966,13 @@ msgstr "To Path"
900
966
  #. @context: Post form field - post type
901
967
  #. @context: Redirect form field
902
968
  #: src/routes/dash/redirects.tsx:141
903
- #: src/theme/components/PostForm.tsx:57
969
+ #: src/theme/components/PostForm.tsx:63
904
970
  msgid "Type"
905
971
  msgstr "Type"
906
972
 
907
973
  #. @context: Post visibility badge - unlisted
908
974
  #. @context: Post visibility option
909
- #: src/theme/components/PostForm.tsx:243
975
+ #: src/theme/components/PostForm.tsx:254
910
976
  #: src/theme/components/VisibilityBadge.tsx:34
911
977
  msgid "Unlisted"
912
978
  msgstr "Unlisted"
@@ -914,12 +980,12 @@ msgstr "Unlisted"
914
980
  #. @context: Default title for untitled page
915
981
  #. @context: Default title for untitled post
916
982
  #: src/routes/dash/pages.tsx:91
917
- #: src/theme/components/PostList.tsx:71
983
+ #: src/theme/components/PostList.tsx:78
918
984
  msgid "Untitled"
919
985
  msgstr "Untitled"
920
986
 
921
987
  #. @context: Button to update existing post
922
- #: src/theme/components/PostForm.tsx:302
988
+ #: src/theme/components/PostForm.tsx:313
923
989
  msgid "Update"
924
990
  msgstr "Update"
925
991
 
@@ -934,12 +1000,12 @@ msgid "Update Page"
934
1000
  msgstr "Update Page"
935
1001
 
936
1002
  #. @context: Button to upload media file
937
- #: src/routes/dash/media.tsx:114
1003
+ #: src/routes/dash/media.tsx:127
938
1004
  msgid "Upload"
939
1005
  msgstr "Upload"
940
1006
 
941
1007
  #. @context: Upload error message
942
- #: src/routes/dash/media.tsx:118
1008
+ #: src/routes/dash/media.tsx:131
943
1009
  msgid "Upload failed. Please try again."
944
1010
  msgstr "Upload failed. Please try again."
945
1011
 
@@ -949,12 +1015,14 @@ msgstr "Upload failed. Please try again."
949
1015
  #~ msgstr "Upload images via the API: POST /api/upload with a file form field."
950
1016
 
951
1017
  #. @context: Upload status - uploading
952
- #: src/routes/dash/media.tsx:110
1018
+ #: src/routes/dash/media.tsx:123
953
1019
  msgid "Uploading..."
954
1020
  msgstr "Uploading..."
955
1021
 
956
1022
  #. @context: Media detail section - URL
957
- #: src/routes/dash/media.tsx:297
1023
+ #. @context: Navigation link form field
1024
+ #: src/routes/dash/media.tsx:318
1025
+ #: src/routes/dash/navigation.tsx:148
958
1026
  msgid "URL"
959
1027
  msgstr "URL"
960
1028
 
@@ -964,7 +1032,7 @@ msgid "URL-safe identifier (lowercase, numbers, hyphens)"
964
1032
  msgstr "URL-safe identifier (lowercase, numbers, hyphens)"
965
1033
 
966
1034
  #. @context: Media URL helper text
967
- #: src/routes/dash/media.tsx:323
1035
+ #: src/routes/dash/media.tsx:344
968
1036
  msgid "Use this URL to embed the media in your posts."
969
1037
  msgstr "Use this URL to embed the media in your posts."
970
1038
 
@@ -987,8 +1055,8 @@ msgstr "View"
987
1055
 
988
1056
  #. @context: Link to view all posts on archive page
989
1057
  #: src/routes/pages/home.tsx:109
990
- msgid "View all posts →"
991
- msgstr "View all posts →"
1058
+ #~ msgid "View all posts →"
1059
+ #~ msgstr "View all posts →"
992
1060
 
993
1061
  #. @context: Dashboard header link to view the public site
994
1062
  #: src/theme/layouts/DashLayout.tsx:53
@@ -996,17 +1064,17 @@ msgid "View Site"
996
1064
  msgstr "View Site"
997
1065
 
998
1066
  #. @context: Post form field
999
- #: src/theme/components/PostForm.tsx:224
1067
+ #: src/theme/components/PostForm.tsx:235
1000
1068
  msgid "Visibility"
1001
1069
  msgstr "Visibility"
1002
1070
 
1003
1071
  #. @context: Setup page welcome heading
1004
- #: src/app.tsx:181
1072
+ #: src/app.tsx:187
1005
1073
  msgid "Welcome to Jant"
1006
1074
  msgstr "Welcome to Jant"
1007
1075
 
1008
1076
  #. @context: Post content placeholder
1009
- #: src/theme/components/PostForm.tsx:108
1077
+ #: src/theme/components/PostForm.tsx:114
1010
1078
  msgid "What's on your mind?"
1011
1079
  msgstr "What's on your mind?"
1012
1080
 
@@ -1016,6 +1084,6 @@ msgid "What's this collection about?"
1016
1084
  msgstr "What's this collection about?"
1017
1085
 
1018
1086
  #. @context: Setup form field - user name
1019
- #: src/app.tsx:201
1087
+ #: src/app.tsx:207
1020
1088
  msgid "Your Name"
1021
1089
  msgstr "Your Name"