@jant/core 0.6.8 → 0.6.10

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 (77) hide show
  1. package/bin/commands/uploads/cleanup.js +1 -0
  2. package/dist/{app-9P4rVCe2.js → app-CGHkOdme.js} +3450 -3121
  3. package/dist/app-D24n0DoH.js +6 -0
  4. package/dist/client/.vite/manifest.json +3 -3
  5. package/dist/client/_assets/{client-CXnEhyyv.js → client-DYrWuaIk.js} +1 -1
  6. package/dist/client/_assets/{client-auth-CSItbyU8.js → client-auth-B5Re0uCd.js} +187 -167
  7. package/dist/client/_assets/client-xWDl78yi.css +2 -0
  8. package/dist/{export-Be082J0n.js → export-DY1v5Iqu.js} +2 -2
  9. package/dist/{github-sync-D1Cw8mOY.js → github-sync-2_T7nbOv.js} +1 -1
  10. package/dist/{github-sync-_kPWM4m9.js → github-sync-LefaslGJ.js} +2 -2
  11. package/dist/index.js +3 -3
  12. package/dist/node.js +4 -4
  13. package/package.json +1 -1
  14. package/src/client/components/__tests__/jant-settings-avatar.test.ts +8 -2
  15. package/src/client/components/__tests__/jant-settings-general.test.ts +64 -12
  16. package/src/client/components/jant-compose-dialog.ts +12 -0
  17. package/src/client/components/jant-settings-general.ts +74 -21
  18. package/src/client/components/settings-types.ts +13 -0
  19. package/src/client/settings-bridge.ts +3 -0
  20. package/src/client/tiptap/__tests__/link-toolbar.test.ts +41 -0
  21. package/src/client/tiptap/__tests__/mark-exit.test.ts +99 -0
  22. package/src/client/tiptap/bubble-menu.ts +37 -4
  23. package/src/client/tiptap/link-toolbar.ts +63 -1
  24. package/src/db/migrations/0026_absent_rhodey.sql +14 -0
  25. package/src/db/migrations/meta/0026_snapshot.json +2511 -0
  26. package/src/db/migrations/meta/_journal.json +7 -0
  27. package/src/db/migrations/pg/0024_high_violations.sql +14 -0
  28. package/src/db/migrations/pg/meta/0024_snapshot.json +3204 -0
  29. package/src/db/migrations/pg/meta/_journal.json +7 -0
  30. package/src/db/pg/schema.ts +36 -0
  31. package/src/db/schema.ts +36 -0
  32. package/src/i18n/__tests__/middleware.test.ts +46 -0
  33. package/src/i18n/locales/settings/en.po +282 -27
  34. package/src/i18n/locales/settings/en.ts +1 -1
  35. package/src/i18n/locales/settings/zh-Hans.po +282 -27
  36. package/src/i18n/locales/settings/zh-Hans.ts +1 -1
  37. package/src/i18n/locales/settings/zh-Hant.po +282 -27
  38. package/src/i18n/locales/settings/zh-Hant.ts +1 -1
  39. package/src/i18n/middleware.ts +17 -8
  40. package/src/i18n/supported-locales.ts +5 -4
  41. package/src/lib/__tests__/feed.test.ts +5 -1
  42. package/src/lib/feed.ts +6 -3
  43. package/src/lib/ids.ts +1 -0
  44. package/src/lib/resolve-config.ts +1 -0
  45. package/src/lib/upload.ts +14 -0
  46. package/src/routes/api/__tests__/settings.test.ts +1 -4
  47. package/src/routes/api/__tests__/upload.test.ts +2 -0
  48. package/src/routes/api/internal/__tests__/uploads.test.ts +19 -1
  49. package/src/routes/api/settings.ts +2 -1
  50. package/src/routes/auth/__tests__/setup.test.ts +14 -0
  51. package/src/routes/dash/__tests__/settings-avatar.test.ts +35 -17
  52. package/src/routes/dash/settings.tsx +22 -4
  53. package/src/routes/feed/__tests__/feed.test.ts +58 -19
  54. package/src/routes/feed/feed.ts +37 -28
  55. package/src/routes/pages/featured.tsx +17 -0
  56. package/src/routes/pages/latest.tsx +25 -0
  57. package/src/services/__tests__/media.test.ts +191 -30
  58. package/src/services/__tests__/settings.test.ts +55 -0
  59. package/src/services/bootstrap.ts +7 -0
  60. package/src/services/export-theme/layouts/_default/baseof.html +2 -1
  61. package/src/services/media.ts +169 -42
  62. package/src/services/post.ts +1 -1
  63. package/src/services/settings.ts +49 -15
  64. package/src/services/upload-session.ts +13 -3
  65. package/src/styles/tokens.css +21 -4
  66. package/src/styles/ui.css +44 -1
  67. package/src/types/bindings.ts +1 -0
  68. package/src/types/config.ts +13 -0
  69. package/src/ui/__tests__/color-themes.test.ts +2 -2
  70. package/src/ui/color-themes.ts +32 -0
  71. package/src/ui/dash/appearance/ColorThemeContent.tsx +264 -29
  72. package/src/ui/dash/settings/GeneralContent.tsx +54 -4
  73. package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +3 -2
  74. package/src/ui/layouts/BaseLayout.tsx +3 -2
  75. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +17 -4
  76. package/dist/app-DaxS_Cz-.js +0 -6
  77. package/dist/client/_assets/client-C6peCkkD.css +0 -2
@@ -169,6 +169,13 @@
169
169
  "when": 1779059130438,
170
170
  "tag": "0023_organic_zemo",
171
171
  "breakpoints": true
172
+ },
173
+ {
174
+ "idx": 24,
175
+ "version": "7",
176
+ "when": 1781807044981,
177
+ "tag": "0024_high_violations",
178
+ "breakpoints": true
172
179
  }
173
180
  ]
174
181
  }
@@ -324,6 +324,42 @@ export const media = pgTable(
324
324
  ],
325
325
  );
326
326
 
327
+ /**
328
+ * Recycle bin for deleted media storage objects. When media is deleted we
329
+ * hard-remove the DB row and immediately delete the object from its original
330
+ * (public) key — so the original URL 404s right away — but first move the bytes
331
+ * to a `trash/` key recorded here. The cleanup sweep deletes the trash object
332
+ * once `purge_after` elapses. `original_key` records where the object lived so
333
+ * it can be restored within the window. Only used when the storage driver
334
+ * supports server-side copy; otherwise deletes are immediate with no recycle.
335
+ */
336
+ export const storagePurge = pgTable(
337
+ "storage_purge",
338
+ {
339
+ id: text("id").primaryKey(),
340
+ siteId: text("site_id")
341
+ .notNull()
342
+ .references(() => sites.id, { onDelete: "cascade" }),
343
+ provider: text("provider").notNull(),
344
+ storageKey: text("storage_key").notNull(),
345
+ originalKey: text("original_key").notNull(),
346
+ reason: text("reason"),
347
+ purgeAfter: integer("purge_after").notNull(),
348
+ createdAt: integer("created_at").notNull(),
349
+ },
350
+ (table) => [
351
+ uniqueIndex("uq_storage_purge_provider_key").on(
352
+ table.provider,
353
+ table.storageKey,
354
+ ),
355
+ index("idx_storage_purge_site_provider_due").on(
356
+ table.siteId,
357
+ table.provider,
358
+ table.purgeAfter,
359
+ ),
360
+ ],
361
+ );
362
+
327
363
  export const uploadSessions = pgTable(
328
364
  "upload_session",
329
365
  {
package/src/db/schema.ts CHANGED
@@ -304,6 +304,42 @@ export const media = sqliteTable(
304
304
  ],
305
305
  );
306
306
 
307
+ /**
308
+ * Recycle bin for deleted media storage objects. When media is deleted we
309
+ * hard-remove the DB row and immediately delete the object from its original
310
+ * (public) key — so the original URL 404s right away — but first move the bytes
311
+ * to a `trash/` key recorded here. The cleanup sweep deletes the trash object
312
+ * once `purge_after` elapses. `original_key` records where the object lived so
313
+ * it can be restored within the window. Only used when the storage driver
314
+ * supports server-side copy; otherwise deletes are immediate with no recycle.
315
+ */
316
+ export const storagePurge = sqliteTable(
317
+ "storage_purge",
318
+ {
319
+ id: text("id").primaryKey(),
320
+ siteId: text("site_id")
321
+ .notNull()
322
+ .references(() => sites.id, { onDelete: "cascade" }),
323
+ provider: text("provider").notNull(),
324
+ storageKey: text("storage_key").notNull(),
325
+ originalKey: text("original_key").notNull(),
326
+ reason: text("reason"),
327
+ purgeAfter: integer("purge_after").notNull(),
328
+ createdAt: integer("created_at").notNull(),
329
+ },
330
+ (table) => [
331
+ uniqueIndex("uq_storage_purge_provider_key").on(
332
+ table.provider,
333
+ table.storageKey,
334
+ ),
335
+ index("idx_storage_purge_site_provider_due").on(
336
+ table.siteId,
337
+ table.provider,
338
+ table.purgeAfter,
339
+ ),
340
+ ],
341
+ );
342
+
307
343
  export const uploadSessions = sqliteTable(
308
344
  "upload_session",
309
345
  {
@@ -122,4 +122,50 @@ describe("i18nMiddleware", () => {
122
122
 
123
123
  expect(await res.text()).toBe("en|en");
124
124
  });
125
+
126
+ it("DASHBOARD_LANGUAGE drives the admin catalog independently of content", async () => {
127
+ const app = createApp({
128
+ ONBOARDING_STATUS: "completed",
129
+ SITE_LANGUAGE: "fr",
130
+ DASHBOARD_LANGUAGE: "zh-Hans",
131
+ });
132
+ const res = await app.request("/settings");
133
+
134
+ // Content stays French; the dashboard renders in the explicit zh-Hans.
135
+ expect(await res.text()).toBe("fr|zh-Hans");
136
+ });
137
+
138
+ it("ignores DASHBOARD_LANGUAGE on public routes", async () => {
139
+ const app = createApp({
140
+ ONBOARDING_STATUS: "completed",
141
+ SITE_LANGUAGE: "fr",
142
+ DASHBOARD_LANGUAGE: "zh-Hans",
143
+ });
144
+ const res = await app.request("/");
145
+
146
+ expect(await res.text()).toBe("fr|en");
147
+ });
148
+
149
+ it("derives the admin catalog from content when DASHBOARD_LANGUAGE is empty", async () => {
150
+ const app = createApp({
151
+ ONBOARDING_STATUS: "completed",
152
+ SITE_LANGUAGE: "zh-TW",
153
+ DASHBOARD_LANGUAGE: "",
154
+ });
155
+ const res = await app.request("/settings");
156
+
157
+ expect(await res.text()).toBe("zh-TW|zh-Hant");
158
+ });
159
+
160
+ it("ignores a DASHBOARD_LANGUAGE that is not a translated catalog locale", async () => {
161
+ const app = createApp({
162
+ ONBOARDING_STATUS: "completed",
163
+ SITE_LANGUAGE: "zh-Hans",
164
+ DASHBOARD_LANGUAGE: "fr",
165
+ });
166
+ const res = await app.request("/settings");
167
+
168
+ // "fr" is not one of the 3 catalog locales, so we derive from content.
169
+ expect(await res.text()).toBe("zh-Hans|zh-Hans");
170
+ });
125
171
  });
@@ -33,16 +33,31 @@ msgstr "301 (Permanent)"
33
33
  msgid "302 (Temporary)"
34
34
  msgstr "302 (Temporary)"
35
35
 
36
+ #. @context: Slate color theme preview help line
37
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
38
+ msgid "A calm, cool backdrop."
39
+ msgstr "A calm, cool backdrop."
40
+
36
41
  #. @context: Help text for site description field
37
42
  #: src/ui/dash/settings/GeneralContent.tsx
38
43
  msgid "A short intro shown on your home page."
39
44
  msgstr "A short intro shown on your home page."
40
45
 
46
+ #. @context: Parchment color theme preview help line
47
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
48
+ msgid "A warmer look, like slightly aged paper."
49
+ msgstr "A warmer look, like slightly aged paper."
50
+
41
51
  #. @context: Settings form field for site description
42
52
  #: src/ui/dash/settings/GeneralContent.tsx
43
53
  msgid "About this blog"
44
54
  msgstr "About this blog"
45
55
 
56
+ #. @context: Label next to the theme accent-color swatch in a color theme preview card
57
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
58
+ msgid "Accent"
59
+ msgstr "Accent"
60
+
46
61
  #. @context: Breadcrumb label
47
62
  #. @context: GitHub sync picker — owner dropdown label
48
63
  #. @context: Page title for the account settings menu
@@ -131,6 +146,11 @@ msgstr "Always show the dark version of the theme."
131
146
  msgid "Always show the light version of the theme."
132
147
  msgstr "Always show the light version of the theme."
133
148
 
149
+ #. @context: Clay color theme preview help line
150
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
151
+ msgid "An earthier, warmer tone."
152
+ msgstr "An earthier, warmer tone."
153
+
134
154
  #. @context: Code Injection security warning body
135
155
  #: src/ui/dash/appearance/CodeInjectionContent.tsx
136
156
  msgid "Anything you paste here has full access to your visitors' browsers. Only use code from sources you trust."
@@ -167,6 +187,11 @@ msgstr "Applies to your entire site, including admin pages. Pick a palette, then
167
187
  msgid "Archive"
168
188
  msgstr "Archive"
169
189
 
190
+ #. @context: Label for the full-archive RSS feed URL
191
+ #: src/ui/dash/settings/GeneralContent.tsx
192
+ msgid "Archive feed"
193
+ msgstr "Archive feed"
194
+
170
195
  #. @context: Help text for archive custom URL query params
171
196
  #: src/routes/dash/custom-urls.tsx
172
197
  msgid "Archive filter parameters (e.g. format=note&view=list)"
@@ -226,11 +251,26 @@ msgstr "Blog Avatar"
226
251
  msgid "Bot token"
227
252
  msgstr "Bot token"
228
253
 
254
+ #. @context: Paper color theme preview title
255
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
256
+ msgid "Bright paper white"
257
+ msgstr "Bright paper white"
258
+
259
+ #. @context: Paper color theme preview body
260
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
261
+ msgid "Bright warm-white with a moss-green accent."
262
+ msgstr "Bright warm-white with a moss-green accent."
263
+
229
264
  #. @context: Section heading for built-in nav items
230
265
  #: src/ui/dash/appearance/NavigationContent.tsx
231
266
  msgid "Built-in links"
232
267
  msgstr "Built-in links"
233
268
 
269
+ #. @context: Sage color theme preview help line
270
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
271
+ msgid "Calm and natural, easy on the eyes."
272
+ msgstr "Calm and natural, easy on the eyes."
273
+
234
274
  #. @context: Button label to dismiss a dialog or action
235
275
  #. @context: Button label to dismiss a dialog or action
236
276
  #. @context: Button label to dismiss a dialog or action
@@ -294,6 +334,11 @@ msgstr "Choose the GitHub account and repository to sync with this site."
294
334
  msgid "CJK Font"
295
335
  msgstr "CJK Font"
296
336
 
337
+ #. @context: Paper color theme preview help line
338
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
339
+ msgid "Clean and high-contrast, close to white."
340
+ msgstr "Clean and high-contrast, close to white."
341
+
297
342
  #. @context: Breadcrumb label
298
343
  #. @context: Settings item — code injection settings
299
344
  #: src/routes/dash/settings.tsx
@@ -397,6 +442,21 @@ msgstr "Connecting will sync your site onto {repo}'s default branch on top of it
397
442
  msgid "Connecting…"
398
443
  msgstr "Connecting…"
399
444
 
445
+ #. @context: Settings form field for the public content language
446
+ #: src/ui/dash/settings/GeneralContent.tsx
447
+ msgid "Content language"
448
+ msgstr "Content language"
449
+
450
+ #. @context: Slate color theme preview title
451
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
452
+ msgid "Cool blue-gray"
453
+ msgstr "Cool blue-gray"
454
+
455
+ #. @context: Frost color theme preview title
456
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
457
+ msgid "Cool white"
458
+ msgstr "Cool white"
459
+
400
460
  #. @context: Feedback after copying API token
401
461
  #. @context: Feedback after copying to clipboard
402
462
  #: src/ui/dash/settings/ApiTokensContent.tsx
@@ -447,6 +507,16 @@ msgstr "Couldn't delete. Try again in a moment."
447
507
  msgid "Couldn't save. Try again in a moment."
448
508
  msgstr "Couldn't save. Try again in a moment."
449
509
 
510
+ #. @context: Ember color theme preview help line
511
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
512
+ msgid "Cozy and bold among the warm tones."
513
+ msgstr "Cozy and bold among the warm tones."
514
+
515
+ #. @context: Espresso color theme preview title
516
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
517
+ msgid "Cream and coffee brown"
518
+ msgstr "Cream and coffee brown"
519
+
450
520
  #. @context: Help text explaining where to get a Telegram bot token
451
521
  #: src/ui/dash/settings/TelegramContent.tsx
452
522
  msgid "Create a bot by messaging @BotFather on Telegram, then paste the token it gives you."
@@ -537,6 +607,11 @@ msgstr "Danger Zone"
537
607
  msgid "Dark"
538
608
  msgstr "Dark"
539
609
 
610
+ #. @context: Settings form field for the admin interface language
611
+ #: src/ui/dash/settings/GeneralContent.tsx
612
+ msgid "Dashboard language"
613
+ msgstr "Dashboard language"
614
+
540
615
  #. @context: Settings group label for data export/import
541
616
  #: src/ui/dash/settings/AccountMenuContent.tsx
542
617
  msgid "Data"
@@ -684,6 +759,16 @@ msgstr "Edit"
684
759
  msgid "Empty repository. Ready to connect."
685
760
  msgstr "Empty repository. Ready to connect."
686
761
 
762
+ #. @context: Help text under the archive feed URL, explaining it is the complete feed
763
+ #: src/ui/dash/settings/GeneralContent.tsx
764
+ msgid "Every published post, including ones hidden from Latest."
765
+ msgstr "Every published post, including ones hidden from Latest."
766
+
767
+ #. @context: Placeholder link label shown in color theme preview cards
768
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
769
+ msgid "Example link"
770
+ msgstr "Example link"
771
+
687
772
  #. @context: Confirmation text after downloading the site export in delete flow
688
773
  #: src/ui/dash/settings/DeleteAccountContent.tsx
689
774
  msgid "Export downloaded."
@@ -728,11 +813,6 @@ msgstr "Feed URL copied."
728
813
  msgid "Feeds"
729
814
  msgstr "Feeds"
730
815
 
731
- #. @context: Color theme preview card title
732
- #: src/ui/dash/appearance/ColorThemeContent.tsx
733
- msgid "Field notes on quiet design"
734
- msgstr "Field notes on quiet design"
735
-
736
816
  #. @context: Error toast when file storage is not set up
737
817
  #: src/routes/dash/settings.tsx
738
818
  msgid "File storage isn't set up. Check your server config."
@@ -808,6 +888,11 @@ msgstr "Header links, home feed, and overflow menu"
808
888
  msgid "Header RSS points to your {feed} feed (/feed). Change what /feed returns in General."
809
889
  msgstr "Header RSS points to your {feed} feed (/feed). Change what /feed returns in General."
810
890
 
891
+ #. @context: Fallback color theme preview body
892
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
893
+ msgid "Headings, body text, and links in this theme."
894
+ msgstr "Headings, body text, and links in this theme."
895
+
811
896
  #. @context: Post badge for posts hidden from Latest
812
897
  #: src/ui/dash/StatusBadge.tsx
813
898
  msgid "Hidden from Latest"
@@ -875,11 +960,6 @@ msgstr "Label and URL are required"
875
960
  msgid "Label is required"
876
961
  msgstr "Label is required"
877
962
 
878
- #. @context: Settings form field for site/admin language
879
- #: src/ui/dash/settings/GeneralContent.tsx
880
- msgid "Language"
881
- msgstr "Language"
882
-
883
963
  #. @context: Settings subsection heading for language and time zone fields
884
964
  #: src/ui/dash/settings/GeneralContent.tsx
885
965
  msgid "Language & Time"
@@ -932,6 +1012,16 @@ msgstr "lets you override any theme variable."
932
1012
  msgid "Light"
933
1013
  msgstr "Light"
934
1014
 
1015
+ #. @context: Slate color theme preview body
1016
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1017
+ msgid "Light blue-gray background, cool and even."
1018
+ msgstr "Light blue-gray background, cool and even."
1019
+
1020
+ #. @context: Sage color theme preview body
1021
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1022
+ msgid "Light sage-green with a matching green accent."
1023
+ msgstr "Light sage-green with a matching green accent."
1024
+
935
1025
  #. @context: Nav item type badge
936
1026
  #: src/ui/dash/appearance/NavigationContent.tsx
937
1027
  msgid "link"
@@ -1012,6 +1102,11 @@ msgstr "Markdown supported"
1012
1102
  msgid "Message the bot any text and it's published as a note."
1013
1103
  msgstr "Message the bot any text and it's published as a note."
1014
1104
 
1105
+ #. @context: Ink color theme preview help line
1106
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1107
+ msgid "Minimal color, low distraction."
1108
+ msgstr "Minimal color, low distraction."
1109
+
1015
1110
  #. @context: Section label for nav items hidden under More dropdown
1016
1111
  #: src/ui/dash/appearance/NavigationContent.tsx
1017
1112
  msgid "More"
@@ -1022,6 +1117,11 @@ msgstr "More"
1022
1117
  msgid "More actions"
1023
1118
  msgstr "More actions"
1024
1119
 
1120
+ #. @context: Clay color theme preview body
1121
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1122
+ msgid "Muted red-brown background, earthy and warm."
1123
+ msgstr "Muted red-brown background, earthy and warm."
1124
+
1025
1125
  #. @context: Settings item description for general
1026
1126
  #: src/ui/dash/settings/SettingsRootContent.tsx
1027
1127
  msgid "Name, metadata, language, and search defaults"
@@ -1054,11 +1154,26 @@ msgstr "Navigation placement updated."
1054
1154
  msgid "Navigation Preview"
1055
1155
  msgstr "Navigation Preview"
1056
1156
 
1157
+ #. @context: Ink color theme preview body
1158
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1159
+ msgid "Near-neutral light gray with a steel-blue accent."
1160
+ msgstr "Near-neutral light gray with a steel-blue accent."
1161
+
1162
+ #. @context: Cotton color theme preview help line
1163
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1164
+ msgid "Nearly white, with a touch of warmth."
1165
+ msgstr "Nearly white, with a touch of warmth."
1166
+
1057
1167
  #. @context: Help text for GitHub PAT input explaining required permissions
1058
1168
  #: src/ui/dash/settings/GitHubSyncContent.tsx
1059
1169
  msgid "Needs Contents (read/write) and Webhooks (read/write) on the target repository."
1060
1170
  msgstr "Needs Contents (read/write) and Webhooks (read/write) on the target repository."
1061
1171
 
1172
+ #. @context: Ink color theme preview title
1173
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1174
+ msgid "Neutral gray"
1175
+ msgstr "Neutral gray"
1176
+
1062
1177
  #. @context: Button to create new custom URL
1063
1178
  #. @context: Button to create new custom URL
1064
1179
  #. @context: Page heading
@@ -1125,6 +1240,11 @@ msgstr "Not synced yet"
1125
1240
  msgid "Note"
1126
1241
  msgstr "Note"
1127
1242
 
1243
+ #. @context: Tufte color theme preview body
1244
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1245
+ msgid "Off-white paper with a deep forest-green accent."
1246
+ msgstr "Off-white paper with a deep forest-green accent."
1247
+
1128
1248
  #. @context: Caption inside the manual Telegram binding fallback. {linkOpen}/{linkClose} wrap the bot username as a t.me link — keep them around the @username token in translations.
1129
1249
  #: src/ui/dash/settings/TelegramContent.tsx
1130
1250
  msgid "Open {linkOpen}@{botUsername}{linkClose} and send:"
@@ -1145,11 +1265,26 @@ msgstr "Open the bot and send the binding code, then anything you message it bec
1145
1265
  msgid "or"
1146
1266
  msgstr "or"
1147
1267
 
1268
+ #. @context: Ember color theme preview body
1269
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1270
+ msgid "Orange-tinted background. The warmest palette."
1271
+ msgstr "Orange-tinted background. The warmest palette."
1272
+
1148
1273
  #. @context: GitHub sync picker — placeholder text showing the expected input shape
1149
1274
  #: src/routes/dash/settings.tsx
1150
1275
  msgid "owner/repo"
1151
1276
  msgstr "owner/repo"
1152
1277
 
1278
+ #. @context: Bone color theme preview body
1279
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1280
+ msgid "Pale bone-white with a muted green accent."
1281
+ msgstr "Pale bone-white with a muted green accent."
1282
+
1283
+ #. @context: Frost color theme preview body
1284
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1285
+ msgid "Pale cool-white with deep indigo text. High contrast."
1286
+ msgstr "Pale cool-white with deep indigo text. High contrast."
1287
+
1153
1288
  #. @context: Settings item description for color theme
1154
1289
  #: src/ui/dash/settings/SettingsRootContent.tsx
1155
1290
  msgid "Palette, surface tone, and overall mood"
@@ -1202,6 +1337,11 @@ msgstr "Pick a repository"
1202
1337
  msgid "Pick an account first"
1203
1338
  msgstr "Pick an account first"
1204
1339
 
1340
+ #. @context: Fallback color theme preview help line
1341
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1342
+ msgid "Pick the one that fits your writing."
1343
+ msgstr "Pick the one that fits your writing."
1344
+
1205
1345
  #. @context: Description in collection picker section
1206
1346
  #: src/ui/dash/appearance/NavigationContent.tsx
1207
1347
  msgid "Pin a collection to your navigation bar. An asterisk (*) appears next to collections updated in the last 48 hours."
@@ -1239,6 +1379,16 @@ msgstr "Processing..."
1239
1379
  msgid "Published"
1240
1380
  msgstr "Published"
1241
1381
 
1382
+ #. @context: Snow color theme preview title
1383
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1384
+ msgid "Pure white"
1385
+ msgstr "Pure white"
1386
+
1387
+ #. @context: Snow color theme preview body
1388
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1389
+ msgid "Pure white with neutral grays. No color tint."
1390
+ msgstr "Pure white with neutral grays. No color tint."
1391
+
1242
1392
  #. @context: Description for manual push action on GitHub Sync settings
1243
1393
  #: src/ui/dash/settings/GitHubSyncContent.tsx
1244
1394
  msgid "Push all posts to GitHub right now instead of waiting for the next automatic sync."
@@ -1254,20 +1404,15 @@ msgstr "QR code linking to the Telegram bot"
1254
1404
  msgid "Query Parameters"
1255
1405
  msgstr "Query Parameters"
1256
1406
 
1257
- #. @context: Color theme preview card secondary sentence
1258
- #: src/ui/dash/appearance/ColorThemeContent.tsx
1259
- msgid "Quiet surfaces let writing lead."
1260
- msgstr "Quiet surfaces let writing lead."
1261
-
1262
1407
  #. @context: Post format badge - quote
1263
1408
  #: src/ui/dash/FormatBadge.tsx
1264
1409
  msgid "Quote"
1265
1410
  msgstr "Quote"
1266
1411
 
1267
- #. @context: Color theme preview inline link label
1268
- #: src/ui/dash/appearance/ColorThemeContent.tsx
1269
- msgid "Read why"
1270
- msgstr "Read why"
1412
+ #. @context: Lead text before a live <html lang> preview of the content language
1413
+ #: src/ui/dash/settings/GeneralContent.tsx
1414
+ msgid "Readers and search engines see"
1415
+ msgstr "Readers and search engines see"
1271
1416
 
1272
1417
  #. @context: Custom URL target type badge for a redirect
1273
1418
  #. @context: Custom URL type option
@@ -1354,6 +1499,11 @@ msgstr "Revoke this token? Any scripts using it will stop working."
1354
1499
  msgid "Safe to leave this page — syncing continues in the background."
1355
1500
  msgstr "Safe to leave this page — syncing continues in the background."
1356
1501
 
1502
+ #. @context: Dune color theme preview body
1503
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1504
+ msgid "Sandy background with a green accent."
1505
+ msgstr "Sandy background with a green accent."
1506
+
1357
1507
  #. @context: Button to save Code Injection settings
1358
1508
  #. @context: Button to save settings
1359
1509
  #. @context: Button to save settings changes
@@ -1444,11 +1594,6 @@ msgstr "Sessions"
1444
1594
  msgid "Sessions and password"
1445
1595
  msgstr "Sessions and password"
1446
1596
 
1447
- #. @context: Help text under the site language input
1448
- #: src/ui/dash/settings/GeneralContent.tsx
1449
- msgid "Sets the content language announced to readers (HTML lang, RSS) and the dashboard language. Any BCP 47 tag is accepted; tags without a dashboard translation fall back to English."
1450
- msgstr "Sets the content language announced to readers (HTML lang, RSS) and the dashboard language. Any BCP 47 tag is accepted; tags without a dashboard translation fall back to English."
1451
-
1452
1597
  #. @context: Breadcrumb label
1453
1598
  #. @context: Page title for the settings home page
1454
1599
  #: src/routes/dash/settings.tsx
@@ -1510,10 +1655,20 @@ msgstr "Site settings updated."
1510
1655
  msgid "Site-wide HTML for analytics and widgets"
1511
1656
  msgstr "Site-wide HTML for analytics and widgets"
1512
1657
 
1513
- #. @context: Color theme preview card body sentence
1658
+ #. @context: Linen color theme preview body
1659
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1660
+ msgid "Soft cream background with a muted green accent."
1661
+ msgstr "Soft cream background with a muted green accent."
1662
+
1663
+ #. @context: Sage color theme preview title
1664
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1665
+ msgid "Soft green"
1666
+ msgstr "Soft green"
1667
+
1668
+ #. @context: Cotton color theme preview title
1514
1669
  #: src/ui/dash/appearance/ColorThemeContent.tsx
1515
- msgid "Soft color should still carry a clear reading rhythm."
1516
- msgstr "Soft color should still carry a clear reading rhythm."
1670
+ msgid "Soft ivory"
1671
+ msgstr "Soft ivory"
1517
1672
 
1518
1673
  #. @context: Description for the Telegram disconnect action
1519
1674
  #: src/ui/dash/settings/TelegramContent.tsx
@@ -1566,6 +1721,31 @@ msgstr "That font theme isn't available. Pick another one."
1566
1721
  msgid "That theme isn't available. Pick another one."
1567
1722
  msgstr "That theme isn't available. Pick another one."
1568
1723
 
1724
+ #. @context: Snow color theme preview help line
1725
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1726
+ msgid "The cleanest, most neutral option."
1727
+ msgstr "The cleanest, most neutral option."
1728
+
1729
+ #. @context: Tufte color theme preview help line
1730
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1731
+ msgid "The default. Calm and easy for long reading."
1732
+ msgstr "The default. Calm and easy for long reading."
1733
+
1734
+ #. @context: Help text under the dashboard language picker
1735
+ #: src/ui/dash/settings/GeneralContent.tsx
1736
+ msgid "The language this admin dashboard shows in. Available in English, 简体中文, and 繁體中文."
1737
+ msgstr "The language this admin dashboard shows in. Available in English, 简体中文, and 繁體中文."
1738
+
1739
+ #. @context: Help text under the content language picker
1740
+ #: src/ui/dash/settings/GeneralContent.tsx
1741
+ msgid "The language your posts are written in. Announced to readers and search engines through HTML lang and your RSS feed. Any BCP 47 tag works."
1742
+ msgstr "The language your posts are written in. Announced to readers and search engines through HTML lang and your RSS feed. Any BCP 47 tag works."
1743
+
1744
+ #. @context: Linen color theme preview help line
1745
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1746
+ msgid "The original Jant palette, and a solid everyday pick."
1747
+ msgstr "The original Jant palette, and a solid everyday pick."
1748
+
1569
1749
  #. @context: Custom URL target slug help text
1570
1750
  #: src/routes/dash/custom-urls.tsx
1571
1751
  msgid "The slug of the target post or collection"
@@ -1606,6 +1786,11 @@ msgstr "This hosted site signs in through {providerLabel}. Manage password and h
1606
1786
  msgid "This is used for your favicon and apple-touch-icon. For best results, upload a square PNG with a solid background at least 512x512 pixels."
1607
1787
  msgstr "This is used for your favicon and apple-touch-icon. For best results, upload a square PNG with a solid background at least 512x512 pixels."
1608
1788
 
1789
+ #. @context: Fallback color theme preview title
1790
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1791
+ msgid "This palette"
1792
+ msgstr "This palette"
1793
+
1609
1794
  #. @context: GitHub sync picker — confirmation card heading for foreign repos
1610
1795
  #: src/routes/dash/settings.tsx
1611
1796
  msgid "This repository already has commits"
@@ -1746,6 +1931,11 @@ msgstr "Uses featured posts for /feed."
1746
1931
  msgid "Uses the latest public posts for /feed."
1747
1932
  msgstr "Uses the latest public posts for /feed."
1748
1933
 
1934
+ #. @context: Cotton color theme preview body
1935
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1936
+ msgid "Very light ivory with a faint tea-green accent."
1937
+ msgstr "Very light ivory with a faint tea-green accent."
1938
+
1749
1939
  #. @context: Button to view item on public site
1750
1940
  #: src/ui/dash/ActionButtons.tsx
1751
1941
  msgid "View"
@@ -1756,6 +1946,61 @@ msgstr "View"
1756
1946
  msgid "Want more control?"
1757
1947
  msgstr "Want more control?"
1758
1948
 
1949
+ #. @context: Dune color theme preview help line
1950
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1951
+ msgid "Warm and earthy, but still light."
1952
+ msgstr "Warm and earthy, but still light."
1953
+
1954
+ #. @context: Espresso color theme preview help line
1955
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1956
+ msgid "Warm and rich, with strong brown tones."
1957
+ msgstr "Warm and rich, with strong brown tones."
1958
+
1959
+ #. @context: Linen color theme preview title
1960
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1961
+ msgid "Warm cream"
1962
+ msgstr "Warm cream"
1963
+
1964
+ #. @context: Espresso color theme preview body
1965
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1966
+ msgid "Warm cream background with deep coffee-brown accents."
1967
+ msgstr "Warm cream background with deep coffee-brown accents."
1968
+
1969
+ #. @context: Tufte color theme preview title
1970
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1971
+ msgid "Warm ivory"
1972
+ msgstr "Warm ivory"
1973
+
1974
+ #. @context: Bone color theme preview title
1975
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1976
+ msgid "Warm off-white"
1977
+ msgstr "Warm off-white"
1978
+
1979
+ #. @context: Ember color theme preview title
1980
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1981
+ msgid "Warm orange"
1982
+ msgstr "Warm orange"
1983
+
1984
+ #. @context: Parchment color theme preview title
1985
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1986
+ msgid "Warm parchment"
1987
+ msgstr "Warm parchment"
1988
+
1989
+ #. @context: Dune color theme preview title
1990
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1991
+ msgid "Warm sand"
1992
+ msgstr "Warm sand"
1993
+
1994
+ #. @context: Clay color theme preview title
1995
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
1996
+ msgid "Warm terracotta"
1997
+ msgstr "Warm terracotta"
1998
+
1999
+ #. @context: Bone color theme preview help line
2000
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
2001
+ msgid "Warm-neutral and easy for long reading."
2002
+ msgstr "Warm-neutral and easy for long reading."
2003
+
1759
2004
  #. @context: GitHub sync picker — hint under the create-on-github entry. Placeholder {name} is the suggested repo name.
1760
2005
  #: src/routes/dash/settings.tsx
1761
2006
  msgid "We'll prefill the name {name}. The list refreshes on return."
@@ -1766,6 +2011,16 @@ msgstr "We'll prefill the name {name}. The list refreshes on return."
1766
2011
  msgid "When to use site export, database backups, and recovery drills."
1767
2012
  msgstr "When to use site export, database backups, and recovery drills."
1768
2013
 
2014
+ #. @context: Frost color theme preview help line
2015
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
2016
+ msgid "When you want a cooler, sharper look."
2017
+ msgstr "When you want a cooler, sharper look."
2018
+
2019
+ #. @context: Parchment color theme preview body
2020
+ #: src/ui/dash/appearance/ColorThemeContent.tsx
2021
+ msgid "Yellow-tinted paper with an olive-green accent."
2022
+ msgstr "Yellow-tinted paper with an olive-green accent."
2023
+
1769
2024
  #. @context: Fallback name when a connected Telegram account has no username
1770
2025
  #: src/ui/dash/settings/TelegramContent.tsx
1771
2026
  msgid "your Telegram account"