@jant/core 0.2.2 → 0.2.4

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 (92) hide show
  1. package/dist/client.d.ts +4 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +6 -2
  4. package/dist/lib/assets.d.ts +4 -3
  5. package/dist/lib/assets.d.ts.map +1 -1
  6. package/dist/lib/assets.js +1 -3
  7. package/dist/theme/layouts/BaseLayout.js +0 -5
  8. package/package.json +4 -5
  9. package/src/app.tsx +377 -0
  10. package/src/auth.ts +38 -0
  11. package/src/client.ts +7 -2
  12. package/src/db/index.ts +14 -0
  13. package/src/db/migrations/0000_solid_moon_knight.sql +118 -0
  14. package/src/db/migrations/0001_add_search_fts.sql +40 -0
  15. package/src/db/migrations/0002_collection_path.sql +2 -0
  16. package/src/db/migrations/0003_collection_path_nullable.sql +21 -0
  17. package/src/db/migrations/0004_media_uuid.sql +35 -0
  18. package/src/db/migrations/meta/0000_snapshot.json +784 -0
  19. package/src/db/migrations/meta/_journal.json +41 -0
  20. package/src/db/schema.ts +159 -0
  21. package/src/i18n/EXAMPLES.md +235 -0
  22. package/src/i18n/README.md +296 -0
  23. package/src/i18n/Trans.tsx +31 -0
  24. package/src/i18n/context.tsx +101 -0
  25. package/src/i18n/detect.ts +100 -0
  26. package/src/i18n/i18n.ts +62 -0
  27. package/src/i18n/index.ts +65 -0
  28. package/src/i18n/locales/en.po +875 -0
  29. package/src/i18n/locales/en.ts +1 -0
  30. package/src/i18n/locales/zh-Hans.po +875 -0
  31. package/src/i18n/locales/zh-Hans.ts +1 -0
  32. package/src/i18n/locales/zh-Hant.po +875 -0
  33. package/src/i18n/locales/zh-Hant.ts +1 -0
  34. package/src/i18n/locales.ts +14 -0
  35. package/src/i18n/middleware.ts +59 -0
  36. package/src/index.ts +42 -0
  37. package/src/lib/assets.ts +49 -0
  38. package/src/lib/constants.ts +67 -0
  39. package/src/lib/image.ts +107 -0
  40. package/src/lib/index.ts +9 -0
  41. package/src/lib/markdown.ts +93 -0
  42. package/src/lib/schemas.ts +92 -0
  43. package/src/lib/sqid.ts +79 -0
  44. package/src/lib/sse.ts +152 -0
  45. package/src/lib/time.ts +117 -0
  46. package/src/lib/url.ts +107 -0
  47. package/src/middleware/auth.ts +59 -0
  48. package/src/preset.css +2 -11
  49. package/src/routes/api/posts.ts +127 -0
  50. package/src/routes/api/search.ts +53 -0
  51. package/src/routes/api/upload.ts +240 -0
  52. package/src/routes/dash/collections.tsx +341 -0
  53. package/src/routes/dash/index.tsx +89 -0
  54. package/src/routes/dash/media.tsx +551 -0
  55. package/src/routes/dash/pages.tsx +245 -0
  56. package/src/routes/dash/posts.tsx +202 -0
  57. package/src/routes/dash/redirects.tsx +155 -0
  58. package/src/routes/dash/settings.tsx +93 -0
  59. package/src/routes/feed/rss.ts +119 -0
  60. package/src/routes/feed/sitemap.ts +75 -0
  61. package/src/routes/pages/archive.tsx +223 -0
  62. package/src/routes/pages/collection.tsx +79 -0
  63. package/src/routes/pages/home.tsx +93 -0
  64. package/src/routes/pages/page.tsx +64 -0
  65. package/src/routes/pages/post.tsx +81 -0
  66. package/src/routes/pages/search.tsx +162 -0
  67. package/src/services/collection.ts +180 -0
  68. package/src/services/index.ts +40 -0
  69. package/src/services/media.ts +97 -0
  70. package/src/services/post.ts +279 -0
  71. package/src/services/redirect.ts +74 -0
  72. package/src/services/search.ts +117 -0
  73. package/src/services/settings.ts +76 -0
  74. package/src/theme/components/ActionButtons.tsx +98 -0
  75. package/src/theme/components/CrudPageHeader.tsx +48 -0
  76. package/src/theme/components/DangerZone.tsx +77 -0
  77. package/src/theme/components/EmptyState.tsx +56 -0
  78. package/src/theme/components/ListItemRow.tsx +24 -0
  79. package/src/theme/components/PageForm.tsx +114 -0
  80. package/src/theme/components/Pagination.tsx +196 -0
  81. package/src/theme/components/PostForm.tsx +122 -0
  82. package/src/theme/components/PostList.tsx +68 -0
  83. package/src/theme/components/ThreadView.tsx +118 -0
  84. package/src/theme/components/TypeBadge.tsx +28 -0
  85. package/src/theme/components/VisibilityBadge.tsx +33 -0
  86. package/src/theme/components/index.ts +12 -0
  87. package/src/theme/index.ts +24 -0
  88. package/src/theme/layouts/BaseLayout.tsx +50 -0
  89. package/src/theme/layouts/DashLayout.tsx +108 -0
  90. package/src/theme/layouts/index.ts +2 -0
  91. package/src/types.ts +222 -0
  92. package/static/assets/datastar.min.js +0 -7
@@ -0,0 +1,875 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "POT-Creation-Date: 2026-02-01 08:44:08+0000\n"
4
+ "MIME-Version: 1.0\n"
5
+ "Content-Type: text/plain; charset=utf-8\n"
6
+ "Content-Transfer-Encoding: 8bit\n"
7
+ "X-Generator: jant-extract\n"
8
+ "Language: en\n"
9
+ "Project-Id-Version: \n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "PO-Revision-Date: \n"
12
+ "Last-Translator: \n"
13
+ "Language-Team: \n"
14
+ "Plural-Forms: \n"
15
+
16
+ #. @context: Archive post reply indicator - plural
17
+ #: src/routes/pages/archive.tsx:135
18
+ msgid "{count} replies"
19
+ msgstr "{count} replies"
20
+
21
+ #. @context: Navigation link
22
+ #: src/routes/dash/collections.tsx:196
23
+ msgid "← Back to Collections"
24
+ msgstr "← Back to Collections"
25
+
26
+ #. @context: Navigation link
27
+ #. @context: Navigation link
28
+ #: src/routes/pages/collection.tsx:67
29
+ #: src/routes/pages/post.tsx:69
30
+ msgid "← Back to home"
31
+ msgstr "← Back to home"
32
+
33
+ #. @context: Archive post reply indicator - single
34
+ #: src/routes/pages/archive.tsx:134
35
+ msgid "1 reply"
36
+ msgstr "1 reply"
37
+
38
+ #. @context: Redirect type option
39
+ #: src/routes/dash/redirects.tsx:95
40
+ msgid "301 (Permanent)"
41
+ msgstr "301 (Permanent)"
42
+
43
+ #. @context: Redirect type option
44
+ #: src/routes/dash/redirects.tsx:96
45
+ msgid "302 (Temporary)"
46
+ msgstr "302 (Temporary)"
47
+
48
+ #. @context: Archive filter - all types
49
+ #: src/routes/pages/archive.tsx:85
50
+ msgid "All"
51
+ msgstr "All"
52
+
53
+ #. @context: Archive page title
54
+ #. @context: Navigation link to archive page
55
+ #: src/routes/pages/archive.tsx:71
56
+ #: src/routes/pages/home.tsx:39
57
+ msgid "Archive"
58
+ msgstr "Archive"
59
+
60
+ #. @context: Post type badge - article
61
+ #. @context: Post type label - article
62
+ #. @context: Post type option
63
+ #: src/routes/pages/archive.tsx:169
64
+ #: src/theme/components/PostForm.tsx:32
65
+ #: src/theme/components/PostList.tsx:41
66
+ msgid "Article"
67
+ msgstr "Article"
68
+
69
+ #. @context: Post type label plural - articles
70
+ #: src/routes/pages/archive.tsx:181
71
+ msgid "Articles"
72
+ msgstr "Articles"
73
+
74
+ #. @context: Button to go back to media list
75
+ #: src/routes/dash/media.tsx:140
76
+ msgid "Back"
77
+ msgstr "Back"
78
+
79
+ #. @context: Navigation link back to home page
80
+ #. @context: Navigation link back to home page
81
+ #. @context: Navigation link back to home page
82
+ #: src/routes/pages/archive.tsx:158
83
+ #: src/routes/pages/page.tsx:52
84
+ #: src/routes/pages/search.tsx:138
85
+ msgid "Back to home"
86
+ msgstr "Back to home"
87
+
88
+ #. @context: Button to cancel and go back
89
+ #. @context: Button to cancel form
90
+ #. @context: Button to cancel form
91
+ #. @context: Button to cancel form
92
+ #. @context: Button to cancel form
93
+ #: src/routes/dash/collections.tsx:103
94
+ #: src/routes/dash/collections.tsx:249
95
+ #: src/routes/dash/redirects.tsx:105
96
+ #: src/theme/components/PageForm.tsx:113
97
+ #: src/theme/components/PostForm.tsx:120
98
+ msgid "Cancel"
99
+ msgstr "Cancel"
100
+
101
+ #. @context: Dashboard heading
102
+ #. @context: Dashboard navigation - collections management
103
+ #. @context: Dashboard page title
104
+ #: src/routes/dash/collections.tsx:24
105
+ #: src/routes/dash/collections.tsx:26
106
+ #: src/theme/layouts/DashLayout.tsx:31
107
+ msgid "Collections"
108
+ msgstr "Collections"
109
+
110
+ #. @context: Setup form submit button
111
+ #: src/app.tsx:151
112
+ msgid "Complete Setup"
113
+ msgstr "Complete Setup"
114
+
115
+ #. @context: Page form field label - content
116
+ #. @context: Post form field
117
+ #: src/theme/components/PageForm.tsx:75
118
+ #: src/theme/components/PostForm.tsx:60
119
+ msgid "Content"
120
+ msgstr "Content"
121
+
122
+ #. @context: Button to copy Markdown to clipboard
123
+ #. @context: Button to copy URL to clipboard
124
+ #: src/routes/dash/media.tsx:184
125
+ #: src/routes/dash/media.tsx:210
126
+ msgid "Copy"
127
+ msgstr "Copy"
128
+
129
+ #. @context: Button to save new collection
130
+ #: src/routes/dash/collections.tsx:100
131
+ msgid "Create Collection"
132
+ msgstr "Create Collection"
133
+
134
+ #. @context: Button to create new page
135
+ #: src/theme/components/PageForm.tsx:110
136
+ msgid "Create Page"
137
+ msgstr "Create Page"
138
+
139
+ #. @context: Button to save new redirect
140
+ #: src/routes/dash/redirects.tsx:102
141
+ msgid "Create Redirect"
142
+ msgstr "Create Redirect"
143
+
144
+ #. @context: Button in empty state to create first page
145
+ #: src/routes/dash/pages.tsx:46
146
+ msgid "Create your first page"
147
+ msgstr "Create your first page"
148
+
149
+ #. @context: Button in empty state to create first post
150
+ #: src/theme/components/PostList.tsx:57
151
+ msgid "Create your first post"
152
+ msgstr "Create your first post"
153
+
154
+ #. @context: Post form field
155
+ #: src/theme/components/PostForm.tsx:104
156
+ msgid "Custom Path (optional)"
157
+ msgstr "Custom Path (optional)"
158
+
159
+ #. @context: Heading for destructive actions section
160
+ #. @context: Section heading for dangerous/destructive actions
161
+ #. @context: Section heading for dangerous/destructive actions
162
+ #: src/routes/dash/collections.tsx:255
163
+ #: src/routes/dash/media.tsx:220
164
+ #: src/routes/dash/pages.tsx:176
165
+ msgid "Danger Zone"
166
+ msgstr "Danger Zone"
167
+
168
+ #. @context: Dashboard main heading
169
+ #. @context: Dashboard navigation - main dashboard page
170
+ #. @context: Dashboard page title
171
+ #: src/routes/dash/index.tsx:26
172
+ #: src/routes/dash/index.tsx:28
173
+ #: src/theme/layouts/DashLayout.tsx:27
174
+ msgid "Dashboard"
175
+ msgstr "Dashboard"
176
+
177
+ #. @context: Button to delete redirect
178
+ #: src/routes/dash/redirects.tsx:47
179
+ msgid "Delete"
180
+ msgstr "Delete"
181
+
182
+ #. @context: Button to delete collection
183
+ #: src/routes/dash/collections.tsx:258
184
+ msgid "Delete Collection"
185
+ msgstr "Delete Collection"
186
+
187
+ #. @context: Button to delete media
188
+ #: src/routes/dash/media.tsx:233
189
+ msgid "Delete Media"
190
+ msgstr "Delete Media"
191
+
192
+ #. @context: Button to delete page
193
+ #: src/routes/dash/pages.tsx:184
194
+ msgid "Delete Page"
195
+ msgstr "Delete Page"
196
+
197
+ #. @context: Warning message before deleting media
198
+ #: src/routes/dash/media.tsx:225
199
+ msgid "Deleting this media will remove it permanently from storage."
200
+ msgstr "Deleting this media will remove it permanently from storage."
201
+
202
+ #. @context: Collection form field
203
+ #. @context: Collection form field
204
+ #: src/routes/dash/collections.tsx:94
205
+ #: src/routes/dash/collections.tsx:238
206
+ msgid "Description (optional)"
207
+ msgstr "Description (optional)"
208
+
209
+ #. @context: Page status badge - draft
210
+ #. @context: Page status option - draft
211
+ #. @context: Post visibility badge - draft
212
+ #. @context: Post visibility option
213
+ #: src/routes/dash/pages.tsx:61
214
+ #: src/theme/components/PageForm.tsx:97
215
+ #: src/theme/components/PostForm.tsx:97
216
+ #: src/theme/components/PostList.tsx:31
217
+ msgid "Draft"
218
+ msgstr "Draft"
219
+
220
+ #. @context: Dashboard stat card - draft posts count
221
+ #: src/routes/dash/index.tsx:43
222
+ msgid "Drafts"
223
+ msgstr "Drafts"
224
+
225
+ #. @context: Button to edit collection
226
+ #. @context: Button to edit collection
227
+ #. @context: Button to edit page
228
+ #. @context: Button to edit page
229
+ #. @context: Button to edit post
230
+ #. @context: Button to edit post
231
+ #: src/routes/dash/collections.tsx:49
232
+ #: src/routes/dash/collections.tsx:150
233
+ #: src/routes/dash/pages.tsx:83
234
+ #: src/routes/dash/pages.tsx:157
235
+ #: src/routes/dash/posts.tsx:94
236
+ #: src/theme/components/PostList.tsx:92
237
+ msgid "Edit"
238
+ msgstr "Edit"
239
+
240
+ #. @context: Page heading
241
+ #: src/routes/dash/collections.tsx:217
242
+ msgid "Edit Collection"
243
+ msgstr "Edit Collection"
244
+
245
+ #. @context: Edit page main heading
246
+ #: src/routes/dash/pages.tsx:208
247
+ msgid "Edit Page"
248
+ msgstr "Edit Page"
249
+
250
+ #. @context: Page heading
251
+ #: src/routes/dash/posts.tsx:126
252
+ msgid "Edit Post"
253
+ msgstr "Edit Post"
254
+
255
+ #. @context: Edit page page title
256
+ #. @context: Page title for editing collection
257
+ #. @context: Page title for editing post
258
+ #: src/routes/dash/collections.tsx:213
259
+ #: src/routes/dash/pages.tsx:203
260
+ #: src/routes/dash/posts.tsx:122
261
+ msgid "Edit: {title}"
262
+ msgstr "Edit: {title}"
263
+
264
+ #. @context: Setup/signin form field - email
265
+ #. @context: Setup/signin form field - email
266
+ #: src/app.tsx:144
267
+ #: src/app.tsx:221
268
+ msgid "Email"
269
+ msgstr "Email"
270
+
271
+ #. @context: Post visibility badge
272
+ #. @context: Post visibility badge - featured
273
+ #. @context: Post visibility option
274
+ #: src/routes/pages/home.tsx:69
275
+ #: src/theme/components/PostForm.tsx:91
276
+ #: src/theme/components/PostList.tsx:28
277
+ msgid "Featured"
278
+ msgstr "Featured"
279
+
280
+ #. @context: Search results count - multiple
281
+ #: src/routes/pages/search.tsx:92
282
+ msgid "Found {count} results"
283
+ msgstr "Found {count} results"
284
+
285
+ #. @context: Search results count - single
286
+ #: src/routes/pages/search.tsx:91
287
+ msgid "Found 1 result"
288
+ msgstr "Found 1 result"
289
+
290
+ #. @context: Redirect form field
291
+ #: src/routes/dash/redirects.tsx:69
292
+ msgid "From Path"
293
+ msgstr "From Path"
294
+
295
+ #. @context: Settings section heading
296
+ #: src/routes/dash/settings.tsx:30
297
+ msgid "General"
298
+ msgstr "General"
299
+
300
+ #. @context: Post type badge - image
301
+ #. @context: Post type label - image
302
+ #. @context: Post type option
303
+ #: src/routes/pages/archive.tsx:172
304
+ #: src/theme/components/PostForm.tsx:41
305
+ #: src/theme/components/PostList.tsx:44
306
+ msgid "Image"
307
+ msgstr "Image"
308
+
309
+ #. @context: Post type label plural - images
310
+ #: src/routes/pages/archive.tsx:184
311
+ msgid "Images"
312
+ msgstr "Images"
313
+
314
+ #. @context: Settings form field
315
+ #: src/routes/dash/settings.tsx:46
316
+ msgid "Language"
317
+ msgstr "Language"
318
+
319
+ #. @context: Setup page description
320
+ #: src/app.tsx:130
321
+ msgid "Let's set up your site."
322
+ msgstr "Let's set up your site."
323
+
324
+ #. @context: Post type badge - link
325
+ #. @context: Post type label - link
326
+ #. @context: Post type option
327
+ #: src/routes/pages/archive.tsx:170
328
+ #: src/theme/components/PostForm.tsx:35
329
+ #: src/theme/components/PostList.tsx:42
330
+ msgid "Link"
331
+ msgstr "Link"
332
+
333
+ #. @context: Post type label plural - links
334
+ #: src/routes/pages/archive.tsx:182
335
+ msgid "Links"
336
+ msgstr "Links"
337
+
338
+ #. @context: Pagination button - load more items
339
+ #: src/theme/components/Pagination.tsx:111
340
+ msgid "Load more"
341
+ msgstr "Load more"
342
+
343
+ #. @context: Page path validation message
344
+ #: src/theme/components/PageForm.tsx:63
345
+ msgid "Lowercase letters, numbers, and hyphens only"
346
+ msgstr "Lowercase letters, numbers, and hyphens only"
347
+
348
+ #. @context: Media detail section - Markdown snippet
349
+ #: src/routes/dash/media.tsx:195
350
+ msgid "Markdown"
351
+ msgstr "Markdown"
352
+
353
+ #. @context: Dashboard navigation - media library
354
+ #. @context: Media main heading
355
+ #. @context: Media page title
356
+ #: src/routes/dash/media.tsx:44
357
+ #: src/routes/dash/media.tsx:47
358
+ #: src/theme/layouts/DashLayout.tsx:30
359
+ msgid "Media"
360
+ msgstr "Media"
361
+
362
+ #. @context: Setup site name placeholder
363
+ #: src/app.tsx:137
364
+ msgid "My Blog"
365
+ msgstr "My Blog"
366
+
367
+ #. @context: Collection title placeholder
368
+ #: src/routes/dash/collections.tsx:75
369
+ msgid "My Collection"
370
+ msgstr "My Collection"
371
+
372
+ #. @context: Button to create new collection
373
+ #. @context: Page heading
374
+ #. @context: Page title
375
+ #: src/routes/dash/collections.tsx:28
376
+ #: src/routes/dash/collections.tsx:69
377
+ #: src/routes/dash/collections.tsx:70
378
+ msgid "New Collection"
379
+ msgstr "New Collection"
380
+
381
+ #. @context: Button to create new page
382
+ #. @context: New page main heading
383
+ #. @context: New page page title
384
+ #: src/routes/dash/pages.tsx:38
385
+ #: src/routes/dash/pages.tsx:105
386
+ #: src/routes/dash/pages.tsx:107
387
+ msgid "New Page"
388
+ msgstr "New Page"
389
+
390
+ #. @context: Button to create new post
391
+ #. @context: Dashboard quick action button to create new post
392
+ #. @context: Page heading
393
+ #. @context: Page title
394
+ #: src/routes/dash/index.tsx:56
395
+ #: src/routes/dash/posts.tsx:31
396
+ #: src/routes/dash/posts.tsx:45
397
+ #: src/routes/dash/posts.tsx:46
398
+ msgid "New Post"
399
+ msgstr "New Post"
400
+
401
+ #. @context: Button to create new redirect
402
+ #. @context: Page heading
403
+ #. @context: Page title
404
+ #: src/routes/dash/redirects.tsx:27
405
+ #: src/routes/dash/redirects.tsx:64
406
+ #: src/routes/dash/redirects.tsx:65
407
+ msgid "New Redirect"
408
+ msgstr "New Redirect"
409
+
410
+ #. @context: Pagination button - next page
411
+ #. @context: Pagination button - next page
412
+ #: src/theme/components/Pagination.tsx:50
413
+ #: src/theme/components/Pagination.tsx:164
414
+ msgid "Next"
415
+ msgstr "Next"
416
+
417
+ #. @context: Empty state message
418
+ #: src/routes/dash/collections.tsx:33
419
+ msgid "No collections yet."
420
+ msgstr "No collections yet."
421
+
422
+ #. @context: Empty state message when no media exists
423
+ #: src/routes/dash/media.tsx:74
424
+ msgid "No media uploaded yet."
425
+ msgstr "No media uploaded yet."
426
+
427
+ #. @context: Empty state message when no pages exist
428
+ #: src/routes/dash/pages.tsx:44
429
+ msgid "No pages yet."
430
+ msgstr "No pages yet."
431
+
432
+ #. @context: Archive empty state
433
+ #: src/routes/pages/archive.tsx:102
434
+ msgid "No posts found."
435
+ msgstr "No posts found."
436
+
437
+ #. @context: Empty state message
438
+ #. @context: Empty state message
439
+ #: src/routes/dash/collections.tsx:168
440
+ #: src/routes/pages/collection.tsx:40
441
+ msgid "No posts in this collection."
442
+ msgstr "No posts in this collection."
443
+
444
+ #. @context: Empty state message on home page
445
+ #. @context: Empty state message when no posts exist
446
+ #: src/routes/pages/home.tsx:49
447
+ #: src/theme/components/PostList.tsx:55
448
+ msgid "No posts yet."
449
+ msgstr "No posts yet."
450
+
451
+ #. @context: Empty state message
452
+ #: src/routes/dash/redirects.tsx:32
453
+ msgid "No redirects configured."
454
+ msgstr "No redirects configured."
455
+
456
+ #. @context: Search empty results
457
+ #: src/routes/pages/search.tsx:89
458
+ msgid "No results found."
459
+ msgstr "No results found."
460
+
461
+ #. @context: Post type badge - note
462
+ #. @context: Post type label - note
463
+ #. @context: Post type option
464
+ #: src/routes/pages/archive.tsx:168
465
+ #: src/theme/components/PostForm.tsx:29
466
+ #: src/theme/components/PostList.tsx:40
467
+ msgid "Note"
468
+ msgstr "Note"
469
+
470
+ #. @context: Post type label plural - notes
471
+ #: src/routes/pages/archive.tsx:180
472
+ msgid "Notes"
473
+ msgstr "Notes"
474
+
475
+ #. @context: Default page heading when untitled
476
+ #. @context: Default page title when untitled
477
+ #. @context: Default page title when untitled
478
+ #. @context: Post type badge - page
479
+ #. @context: Post type label - page
480
+ #: src/routes/dash/pages.tsx:147
481
+ #: src/routes/dash/pages.tsx:150
482
+ #: src/routes/dash/pages.tsx:202
483
+ #: src/routes/pages/archive.tsx:173
484
+ #: src/theme/components/PostList.tsx:45
485
+ msgid "Page"
486
+ msgstr "Page"
487
+
488
+ #. @context: Pagination - current page indicator
489
+ #: src/theme/components/Pagination.tsx:165
490
+ msgid "Page {page}"
491
+ msgstr "Page {page}"
492
+
493
+ #. @context: Page content placeholder
494
+ #: src/theme/components/PageForm.tsx:80
495
+ msgid "Page content (Markdown supported)..."
496
+ msgstr "Page content (Markdown supported)..."
497
+
498
+ #. @context: Page title placeholder
499
+ #: src/theme/components/PageForm.tsx:43
500
+ msgid "Page title..."
501
+ msgstr "Page title..."
502
+
503
+ #. @context: Dashboard navigation - pages management
504
+ #. @context: Pages main heading
505
+ #. @context: Pages page title
506
+ #. @context: Post type label plural - pages
507
+ #: src/routes/dash/pages.tsx:32
508
+ #: src/routes/dash/pages.tsx:35
509
+ #: src/routes/pages/archive.tsx:185
510
+ #: src/theme/layouts/DashLayout.tsx:29
511
+ msgid "Pages"
512
+ msgstr "Pages"
513
+
514
+ #. @context: Setup/signin form field - password
515
+ #. @context: Setup/signin form field - password
516
+ #: src/app.tsx:148
517
+ #: src/app.tsx:225
518
+ msgid "Password"
519
+ msgstr "Password"
520
+
521
+ #. @context: Page form field label - URL path
522
+ #: src/theme/components/PageForm.tsx:52
523
+ msgid "Path"
524
+ msgstr "Path"
525
+
526
+ #. @context: Link to individual post in thread
527
+ #. @context: Link to permanent URL of post
528
+ #: src/routes/pages/post.tsx:62
529
+ #: src/theme/components/ThreadView.tsx:66
530
+ msgid "Permalink"
531
+ msgstr "Permalink"
532
+
533
+ #. @context: Default post title
534
+ #. @context: Default post title
535
+ #: src/routes/dash/posts.tsx:85
536
+ #: src/routes/dash/posts.tsx:121
537
+ msgid "Post"
538
+ msgstr "Post"
539
+
540
+ #. @context: Post title placeholder
541
+ #: src/theme/components/PostForm.tsx:53
542
+ msgid "Post title..."
543
+ msgstr "Post title..."
544
+
545
+ #. @context: Dashboard heading
546
+ #. @context: Dashboard navigation - posts management
547
+ #. @context: Dashboard page title
548
+ #: src/routes/dash/posts.tsx:27
549
+ #: src/routes/dash/posts.tsx:29
550
+ #: src/theme/layouts/DashLayout.tsx:28
551
+ msgid "Posts"
552
+ msgstr "Posts"
553
+
554
+ #. @context: Collection posts section heading
555
+ #: src/routes/dash/collections.tsx:139
556
+ msgid "Posts in Collection ({count})"
557
+ msgstr "Posts in Collection ({count})"
558
+
559
+ #. @context: Media detail section - preview
560
+ #: src/routes/dash/media.tsx:148
561
+ msgid "Preview"
562
+ msgstr "Preview"
563
+
564
+ #. @context: Pagination button - previous page
565
+ #. @context: Pagination button - previous page
566
+ #: src/theme/components/Pagination.tsx:49
567
+ #: src/theme/components/Pagination.tsx:163
568
+ msgid "Previous"
569
+ msgstr "Previous"
570
+
571
+ #. @context: Button to publish new post
572
+ #: src/theme/components/PostForm.tsx:117
573
+ msgid "Publish"
574
+ msgstr "Publish"
575
+
576
+ #. @context: Dashboard stat card - published posts count
577
+ #. @context: Page status badge - published
578
+ #. @context: Page status option - published
579
+ #: src/routes/dash/index.tsx:34
580
+ #: src/routes/dash/pages.tsx:62
581
+ #: src/theme/components/PageForm.tsx:94
582
+ msgid "Published"
583
+ msgstr "Published"
584
+
585
+ #. @context: Page status helper text
586
+ #: src/theme/components/PageForm.tsx:101
587
+ msgid "Published pages are accessible via their path. Drafts are not visible."
588
+ msgstr "Published pages are accessible via their path. Drafts are not visible."
589
+
590
+ #. @context: Dashboard stat card - quick actions section
591
+ #: src/routes/dash/index.tsx:52
592
+ msgid "Quick Actions"
593
+ msgstr "Quick Actions"
594
+
595
+ #. @context: Post visibility badge - normal
596
+ #: src/theme/components/PostList.tsx:29
597
+ msgid "Quiet"
598
+ msgstr "Quiet"
599
+
600
+ #. @context: Post visibility option
601
+ #: src/theme/components/PostForm.tsx:88
602
+ msgid "Quiet (normal)"
603
+ msgstr "Quiet (normal)"
604
+
605
+ #. @context: Post type badge - quote
606
+ #. @context: Post type label - quote
607
+ #. @context: Post type option
608
+ #: src/routes/pages/archive.tsx:171
609
+ #: src/theme/components/PostForm.tsx:38
610
+ #: src/theme/components/PostList.tsx:43
611
+ msgid "Quote"
612
+ msgstr "Quote"
613
+
614
+ #. @context: Post type label plural - quotes
615
+ #: src/routes/pages/archive.tsx:183
616
+ msgid "Quotes"
617
+ msgstr "Quotes"
618
+
619
+ #. @context: Dashboard heading
620
+ #. @context: Dashboard navigation - URL redirects
621
+ #. @context: Dashboard page title
622
+ #: src/routes/dash/redirects.tsx:23
623
+ #: src/routes/dash/redirects.tsx:25
624
+ #: src/theme/layouts/DashLayout.tsx:32
625
+ msgid "Redirects"
626
+ msgstr "Redirects"
627
+
628
+ #. @context: Button to remove post from collection
629
+ #: src/routes/dash/collections.tsx:184
630
+ msgid "Remove"
631
+ msgstr "Remove"
632
+
633
+ #. @context: Button to save settings
634
+ #: src/routes/dash/settings.tsx:63
635
+ msgid "Save Settings"
636
+ msgstr "Save Settings"
637
+
638
+ #. @context: Search page title
639
+ #. @context: Search submit button
640
+ #: src/routes/pages/search.tsx:53
641
+ #: src/routes/pages/search.tsx:72
642
+ msgid "Search"
643
+ msgstr "Search"
644
+
645
+ #. @context: Search error message
646
+ #: src/routes/pages/search.tsx:49
647
+ msgid "Search failed. Please try again."
648
+ msgstr "Search failed. Please try again."
649
+
650
+ #. @context: Search input placeholder
651
+ #: src/routes/pages/search.tsx:67
652
+ msgid "Search posts..."
653
+ msgstr "Search posts..."
654
+
655
+ #. @context: Dashboard heading
656
+ #. @context: Dashboard navigation - site settings
657
+ #. @context: Dashboard page title
658
+ #: src/routes/dash/settings.tsx:24
659
+ #: src/routes/dash/settings.tsx:25
660
+ #: src/theme/layouts/DashLayout.tsx:33
661
+ msgid "Settings"
662
+ msgstr "Settings"
663
+
664
+ #. @context: Setup page title
665
+ #: src/app.tsx:125
666
+ msgid "Setup"
667
+ msgstr "Setup"
668
+
669
+ #. @context: Sign in form submit button
670
+ #. @context: Sign in page heading
671
+ #. @context: Sign in page title
672
+ #: src/app.tsx:211
673
+ #: src/app.tsx:215
674
+ #: src/app.tsx:228
675
+ msgid "Sign In"
676
+ msgstr "Sign In"
677
+
678
+ #. @context: Dashboard header link to sign out
679
+ #: src/theme/layouts/DashLayout.tsx:64
680
+ msgid "Sign Out"
681
+ msgstr "Sign Out"
682
+
683
+ #. @context: Settings form field
684
+ #: src/routes/dash/settings.tsx:39
685
+ msgid "Site Description"
686
+ msgstr "Site Description"
687
+
688
+ #. @context: Settings form field
689
+ #. @context: Setup form field - site name
690
+ #: src/app.tsx:136
691
+ #: src/routes/dash/settings.tsx:34
692
+ msgid "Site Name"
693
+ msgstr "Site Name"
694
+
695
+ #. @context: Collection form field
696
+ #. @context: Collection form field
697
+ #: src/routes/dash/collections.tsx:79
698
+ #: src/routes/dash/collections.tsx:226
699
+ msgid "Slug"
700
+ msgstr "Slug"
701
+
702
+ #. @context: Post form field
703
+ #: src/theme/components/PostForm.tsx:73
704
+ msgid "Source URL (optional)"
705
+ msgstr "Source URL (optional)"
706
+
707
+ #. @context: Page form field label - publish status
708
+ #: src/theme/components/PageForm.tsx:90
709
+ msgid "Status"
710
+ msgstr "Status"
711
+
712
+ #. @context: Media upload instructions - supported formats
713
+ #: src/routes/dash/media.tsx:67
714
+ msgid "Supported formats: JPEG, PNG, GIF, WebP, SVG. Max size: 10MB."
715
+ msgstr "Supported formats: JPEG, PNG, GIF, WebP, SVG. Max size: 10MB."
716
+
717
+ #. @context: Redirect to path help text
718
+ #: src/routes/dash/redirects.tsx:89
719
+ msgid "The destination path or URL"
720
+ msgstr "The destination path or URL"
721
+
722
+ #. @context: Redirect from path help text
723
+ #: src/routes/dash/redirects.tsx:77
724
+ msgid "The path to redirect from"
725
+ msgstr "The path to redirect from"
726
+
727
+ #. @context: Page path helper text
728
+ #: src/theme/components/PageForm.tsx:68
729
+ msgid "The URL path for this page. Use lowercase letters, numbers, and hyphens."
730
+ msgstr "The URL path for this page. Use lowercase letters, numbers, and hyphens."
731
+
732
+ #. @context: Thread view indicator - first post in thread
733
+ #: src/theme/components/ThreadView.tsx:58
734
+ msgid "Thread start"
735
+ msgstr "Thread start"
736
+
737
+ #. @context: Thread view header - multiple posts
738
+ #: src/theme/components/ThreadView.tsx:92
739
+ msgid "Thread with {count} posts"
740
+ msgstr "Thread with {count} posts"
741
+
742
+ #. @context: Thread view header - single post
743
+ #: src/theme/components/ThreadView.tsx:91
744
+ msgid "Thread with 1 post"
745
+ msgstr "Thread with 1 post"
746
+
747
+ #. @context: Collection form field
748
+ #. @context: Collection form field
749
+ #. @context: Page form field label - title
750
+ #: src/routes/dash/collections.tsx:74
751
+ #: src/routes/dash/collections.tsx:221
752
+ #: src/theme/components/PageForm.tsx:37
753
+ msgid "Title"
754
+ msgstr "Title"
755
+
756
+ #. @context: Post form field
757
+ #: src/theme/components/PostForm.tsx:48
758
+ msgid "Title (optional)"
759
+ msgstr "Title (optional)"
760
+
761
+ #. @context: Redirect form field
762
+ #: src/routes/dash/redirects.tsx:81
763
+ msgid "To Path"
764
+ msgstr "To Path"
765
+
766
+ #. @context: Post form field - post type
767
+ #. @context: Redirect form field
768
+ #: src/routes/dash/redirects.tsx:93
769
+ #: src/theme/components/PostForm.tsx:26
770
+ msgid "Type"
771
+ msgstr "Type"
772
+
773
+ #. @context: Post visibility badge - unlisted
774
+ #. @context: Post visibility option
775
+ #: src/theme/components/PostForm.tsx:94
776
+ #: src/theme/components/PostList.tsx:30
777
+ msgid "Unlisted"
778
+ msgstr "Unlisted"
779
+
780
+ #. @context: Default title for untitled page
781
+ #. @context: Default title for untitled post
782
+ #: src/routes/dash/pages.tsx:72
783
+ #: src/theme/components/PostList.tsx:79
784
+ msgid "Untitled"
785
+ msgstr "Untitled"
786
+
787
+ #. @context: Button to update existing post
788
+ #: src/theme/components/PostForm.tsx:117
789
+ msgid "Update"
790
+ msgstr "Update"
791
+
792
+ #. @context: Button to save collection changes
793
+ #: src/routes/dash/collections.tsx:246
794
+ msgid "Update Collection"
795
+ msgstr "Update Collection"
796
+
797
+ #. @context: Button to update existing page
798
+ #: src/theme/components/PageForm.tsx:109
799
+ msgid "Update Page"
800
+ msgstr "Update Page"
801
+
802
+ #. @context: Button to upload media file
803
+ #: src/routes/dash/media.tsx:50
804
+ msgid "Upload"
805
+ msgstr "Upload"
806
+
807
+ #. @context: Media upload instructions - API usage
808
+ #: src/routes/dash/media.tsx:64
809
+ msgid "Upload images via the API: POST /api/upload with a file form field."
810
+ msgstr "Upload images via the API: POST /api/upload with a file form field."
811
+
812
+ #. @context: Media detail section - URL
813
+ #: src/routes/dash/media.tsx:169
814
+ msgid "URL"
815
+ msgstr "URL"
816
+
817
+ #. @context: Collection path help text
818
+ #: src/routes/dash/collections.tsx:89
819
+ msgid "URL-safe identifier (lowercase, numbers, hyphens)"
820
+ msgstr "URL-safe identifier (lowercase, numbers, hyphens)"
821
+
822
+ #. @context: Media URL helper text
823
+ #: src/routes/dash/media.tsx:188
824
+ msgid "Use this URL to embed the media in your posts."
825
+ msgstr "Use this URL to embed the media in your posts."
826
+
827
+ #. @context: Button to view collection
828
+ #. @context: Button to view collection
829
+ #. @context: Button to view page on public site
830
+ #. @context: Button to view page on public site
831
+ #. @context: Button to view post
832
+ #. @context: Button to view post on public site
833
+ #: src/routes/dash/collections.tsx:52
834
+ #: src/routes/dash/collections.tsx:153
835
+ #: src/routes/dash/pages.tsx:87
836
+ #: src/routes/dash/pages.tsx:161
837
+ #: src/routes/dash/posts.tsx:97
838
+ #: src/theme/components/PostList.tsx:95
839
+ msgid "View"
840
+ msgstr "View"
841
+
842
+ #. @context: Link to view all posts on archive page
843
+ #: src/routes/pages/home.tsx:80
844
+ msgid "View all posts →"
845
+ msgstr "View all posts →"
846
+
847
+ #. @context: Dashboard header link to view the public site
848
+ #: src/theme/layouts/DashLayout.tsx:61
849
+ msgid "View Site"
850
+ msgstr "View Site"
851
+
852
+ #. @context: Post form field
853
+ #: src/theme/components/PostForm.tsx:85
854
+ msgid "Visibility"
855
+ msgstr "Visibility"
856
+
857
+ #. @context: Setup page welcome heading
858
+ #: src/app.tsx:129
859
+ msgid "Welcome to Jant"
860
+ msgstr "Welcome to Jant"
861
+
862
+ #. @context: Post content placeholder
863
+ #: src/theme/components/PostForm.tsx:64
864
+ msgid "What's on your mind?"
865
+ msgstr "What's on your mind?"
866
+
867
+ #. @context: Collection description placeholder
868
+ #: src/routes/dash/collections.tsx:95
869
+ msgid "What's this collection about?"
870
+ msgstr "What's this collection about?"
871
+
872
+ #. @context: Setup form field - user name
873
+ #: src/app.tsx:140
874
+ msgid "Your Name"
875
+ msgstr "Your Name"