@jant/core 0.6.16 → 0.7.0

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 (508) hide show
  1. package/README.md +11 -11
  2. package/bin/commands/assets/upload.js +192 -15
  3. package/bin/commands/import-site.js +60 -4
  4. package/bin/commands/reset-password.js +21 -8
  5. package/bin/commands/site/snapshot/export.js +1 -1
  6. package/bin/commands/site/snapshot/import.js +1 -1
  7. package/bin/lib/d1-query.js +5 -16
  8. package/bin/lib/node-env.js +40 -4
  9. package/bin/lib/site-selection.js +85 -29
  10. package/bin/lib/wrangler-cli.js +28 -2
  11. package/bin/lib/wrangler-json.js +35 -0
  12. package/dist/{app-C7_4oab9.js → app-K_Aa1MMn.js} +52476 -13330
  13. package/dist/client/.vite/manifest.json +255 -90
  14. package/dist/client/_assets/chunks/confirm-D7GrwsCN.js +45 -0
  15. package/dist/client/_assets/chunks/create-editor-CD3FhrOB.js +257 -0
  16. package/dist/client/_assets/chunks/{native-DpcrFAPh.js → emoji-mart-C4RpRKcU.js} +716 -1
  17. package/dist/client/_assets/chunks/footnote-rail-CmeoVtnU.js +1 -0
  18. package/dist/client/_assets/chunks/heic-to-CuP2Qlsw.js +1 -0
  19. package/dist/client/_assets/chunks/jant-locale-picker-DL6mIOT5.js +69 -0
  20. package/dist/client/_assets/chunks/lit-DW8VmJAT.js +2 -0
  21. package/dist/client/_assets/chunks/mediabunny-DRaCQ1r-.js +31 -0
  22. package/dist/client/_assets/chunks/rolldown-runtime-hePW80VL.js +1 -0
  23. package/dist/client/_assets/chunks/settings-paths-BcdySNx6.js +84 -0
  24. package/dist/client/_assets/chunks/site-header-nav-DzXsFk05.js +1 -0
  25. package/dist/client/_assets/chunks/slug-format-CRXO1AL5.js +1 -0
  26. package/dist/client/_assets/chunks/slugify-373citbs.js +1 -0
  27. package/dist/client/_assets/chunks/sortable-list-CgaL2jCs.js +2 -0
  28. package/dist/client/_assets/chunks/types-D5iF3H1a.js +1 -0
  29. package/dist/client/_assets/chunks/unsafe-html-B5ZEXaxg.js +1 -0
  30. package/dist/client/_assets/chunks/unsafe-svg-0QCkP0vZ.js +2 -0
  31. package/dist/client/_assets/client-GiYENVw8.css +2 -0
  32. package/dist/client/_assets/client-VnFxJN7G.js +295 -0
  33. package/dist/client/_assets/client-auth-k8gJ6QJj.js +828 -0
  34. package/dist/client/_assets/client-author-DQ8R-8KR.css +2 -0
  35. package/dist/client/_assets/client-compose-B_kDtWkW.js +2004 -0
  36. package/dist/client/_assets/client-manage-M90aSTOk.js +2170 -0
  37. package/dist/client/_assets/client-settings-DfYs9n1F.js +1112 -0
  38. package/dist/{export-Dl5KCiEs.js → github-sync-BPAvT999.js} +2254 -107
  39. package/dist/index.js +2 -5
  40. package/dist/node.js +5 -7
  41. package/package.json +3 -3
  42. package/src/__tests__/auth-session-freshness.test.ts +57 -0
  43. package/src/__tests__/basecoat-variants.test.ts +121 -0
  44. package/src/__tests__/bin/assets-upload.test.ts +68 -0
  45. package/src/__tests__/export-hugo-build.test.ts +260 -0
  46. package/src/__tests__/export-service.test.ts +231 -0
  47. package/src/__tests__/helpers/component-css.ts +91 -0
  48. package/src/__tests__/helpers/db.ts +33 -0
  49. package/src/__tests__/helpers/export-fixtures.ts +3 -0
  50. package/src/__tests__/stylesheet-audience.test.ts +159 -0
  51. package/src/__tests__/stylesheet-breakpoints.test.ts +183 -0
  52. package/src/app.tsx +71 -16
  53. package/src/auth.ts +18 -1
  54. package/src/client/__tests__/collection-page-actions.test.ts +51 -2
  55. package/src/client/__tests__/compose-bridge-image-upload.test.ts +196 -0
  56. package/src/client/__tests__/compose-bridge-video-poster.test.ts +159 -0
  57. package/src/client/__tests__/compose-bridge.test.ts +272 -0
  58. package/src/client/__tests__/compose-launch.test.ts +62 -1
  59. package/src/client/__tests__/compose-shortcuts.test.ts +38 -9
  60. package/src/client/__tests__/compose-triggers.test.ts +90 -0
  61. package/src/client/__tests__/copy-field.test.ts +162 -0
  62. package/src/client/__tests__/custom-url-menu.test.ts +127 -6
  63. package/src/client/__tests__/image-processor.test.ts +324 -2
  64. package/src/client/__tests__/lazy-entries.test.ts +92 -0
  65. package/src/client/__tests__/media-scroll-hint.test.ts +155 -0
  66. package/src/client/__tests__/runtime-paths.test.ts +84 -0
  67. package/src/client/__tests__/smart-collection-page-actions.test.ts +158 -0
  68. package/src/client/__tests__/toast.test.ts +23 -0
  69. package/src/client/__tests__/video-processor-probe.test.ts +175 -0
  70. package/src/client/__tests__/video-processor.test.ts +181 -0
  71. package/src/client/audio-processor.ts +24 -15
  72. package/src/client/audio-waveform.ts +49 -0
  73. package/src/client/collection-dialog-host.ts +72 -0
  74. package/src/client/collection-navigation.ts +51 -16
  75. package/src/client/collection-page-actions.ts +26 -0
  76. package/src/client/components/__tests__/jant-collection-dialog.test.ts +329 -0
  77. package/src/client/components/__tests__/jant-collection-directory.test.ts +274 -10
  78. package/src/client/components/__tests__/jant-collection-form.test.ts +59 -178
  79. package/src/client/components/__tests__/jant-command-palette.test.ts +28 -0
  80. package/src/client/components/__tests__/jant-compose-dialog-draft-storage.test.ts +340 -0
  81. package/src/client/components/__tests__/jant-compose-dialog.test.ts +1250 -53
  82. package/src/client/components/__tests__/jant-compose-editor.test.ts +544 -40
  83. package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +0 -1
  84. package/src/client/components/__tests__/jant-locale-picker.test.ts +207 -0
  85. package/src/client/components/__tests__/jant-nav-manager.test.ts +234 -15
  86. package/src/client/components/__tests__/jant-post-menu.test.ts +413 -2
  87. package/src/client/components/__tests__/jant-post-picker.test.ts +197 -0
  88. package/src/client/components/__tests__/jant-settings-avatar.test.ts +15 -12
  89. package/src/client/components/__tests__/jant-settings-general.test.ts +541 -172
  90. package/src/client/components/__tests__/jant-settings-language.test.ts +851 -0
  91. package/src/client/components/__tests__/jant-smart-collection-dialog.test.ts +665 -0
  92. package/src/client/components/collection-dialog-types.ts +49 -0
  93. package/src/client/components/collection-manager-types.ts +32 -1
  94. package/src/client/components/collection-types.ts +1 -15
  95. package/src/client/components/compose-types.ts +75 -1
  96. package/src/client/components/jant-collection-dialog.ts +722 -0
  97. package/src/client/components/jant-collection-directory.ts +567 -182
  98. package/src/client/components/jant-collection-form.ts +53 -232
  99. package/src/client/components/jant-command-palette.ts +100 -49
  100. package/src/client/components/jant-compose-dialog.ts +1486 -707
  101. package/src/client/components/jant-compose-editor.ts +673 -336
  102. package/src/client/components/jant-compose-fullscreen.ts +51 -43
  103. package/src/client/components/jant-config-editor.ts +65 -53
  104. package/src/client/components/jant-confirm-dialog.ts +13 -11
  105. package/src/client/components/jant-locale-picker.ts +418 -0
  106. package/src/client/components/jant-media-lightbox.ts +146 -136
  107. package/src/client/components/jant-nav-manager.ts +690 -366
  108. package/src/client/components/jant-post-menu.ts +1086 -282
  109. package/src/client/components/jant-post-picker.ts +324 -0
  110. package/src/client/components/jant-repo-picker.ts +138 -106
  111. package/src/client/components/jant-settings-avatar.ts +31 -27
  112. package/src/client/components/jant-settings-general.ts +617 -543
  113. package/src/client/components/jant-settings-language.ts +1087 -0
  114. package/src/client/components/jant-smart-collection-dialog.ts +1021 -0
  115. package/src/client/components/jant-text-preview.ts +94 -86
  116. package/src/client/components/nav-manager-types.ts +62 -1
  117. package/src/client/components/settings-types.ts +14 -29
  118. package/src/client/components/smart-collection-conditions.ts +285 -0
  119. package/src/client/components/smart-collection-dialog-types.ts +68 -0
  120. package/src/client/compose-bridge.ts +214 -141
  121. package/src/client/compose-launch.ts +76 -2
  122. package/src/client/compose-shortcuts.ts +6 -8
  123. package/src/client/compose-triggers.ts +50 -0
  124. package/src/client/copy-field.ts +108 -0
  125. package/src/client/custom-url-menu.ts +60 -4
  126. package/src/client/icons.ts +14 -0
  127. package/src/client/image-plan.ts +165 -0
  128. package/src/client/image-processor.ts +195 -117
  129. package/src/client/image-worker-client.ts +45 -0
  130. package/src/client/image-worker.ts +135 -0
  131. package/src/client/lazy-entries.ts +95 -0
  132. package/src/client/lazy-slugify.ts +2 -2
  133. package/src/client/media-scroll-hint.ts +43 -2
  134. package/src/client/mediabunny.ts +29 -0
  135. package/src/client/post-picker.ts +41 -0
  136. package/src/client/runtime-paths.ts +74 -1
  137. package/src/client/settings-bridge.ts +4 -10
  138. package/src/client/site-header-nav.js +18 -6
  139. package/src/client/smart-collection-dialog-host.ts +116 -0
  140. package/src/client/smart-collection-page-actions.ts +208 -0
  141. package/src/client/tiptap/__tests__/bubble-menu.test.ts +110 -0
  142. package/src/client/tiptap/__tests__/floating-position.test.ts +136 -1
  143. package/src/client/tiptap/__tests__/inline-image-upload.test.ts +37 -0
  144. package/src/client/tiptap/bubble-menu.ts +47 -16
  145. package/src/client/tiptap/floating-position.ts +216 -2
  146. package/src/client/tiptap/inline-image-upload.ts +7 -3
  147. package/src/client/tiptap/link-toolbar.ts +22 -9
  148. package/src/client/toast.ts +13 -0
  149. package/src/client/types/vite-worker.d.ts +12 -0
  150. package/src/client/upload-with-metadata.ts +3 -13
  151. package/src/client/video-processor.ts +351 -107
  152. package/src/client-auth.ts +14 -31
  153. package/src/client-compose.ts +19 -0
  154. package/src/client-manage.ts +13 -0
  155. package/src/client-settings.ts +14 -0
  156. package/src/client-site.ts +10 -3
  157. package/src/client.ts +4 -0
  158. package/src/db/__tests__/backfill-nav-label-mirrors.test.ts +149 -0
  159. package/src/db/__tests__/schema-enum-sources.test.ts +33 -0
  160. package/src/db/__tests__/smart-collection-placement.test.ts +402 -0
  161. package/src/db/backfills/0006_clear_mirrored_page_nav_labels.sql +31 -0
  162. package/src/db/migrations/0032_married_tomas.sql +3 -0
  163. package/src/db/migrations/0033_busy_johnny_storm.sql +198 -0
  164. package/src/db/migrations/0034_cheerful_rumiko_fujikawa.sql +35 -0
  165. package/src/db/migrations/meta/0032_snapshot.json +2582 -0
  166. package/src/db/migrations/meta/0033_snapshot.json +2816 -0
  167. package/src/db/migrations/meta/0034_snapshot.json +2816 -0
  168. package/src/db/migrations/meta/_journal.json +21 -0
  169. package/src/db/migrations/pg/0030_abandoned_nighthawk.sql +3 -0
  170. package/src/db/migrations/pg/0031_strong_ultimatum.sql +128 -0
  171. package/src/db/migrations/pg/0032_furry_multiple_man.sql +6 -0
  172. package/src/db/migrations/pg/meta/0030_snapshot.json +3329 -0
  173. package/src/db/migrations/pg/meta/0031_snapshot.json +3660 -0
  174. package/src/db/migrations/pg/meta/0032_snapshot.json +3660 -0
  175. package/src/db/migrations/pg/meta/_journal.json +21 -0
  176. package/src/db/pg/schema.ts +195 -27
  177. package/src/db/post-visibility.ts +117 -0
  178. package/src/db/schema.ts +222 -27
  179. package/src/i18n/__tests__/detect.test.ts +26 -81
  180. package/src/i18n/__tests__/supported-locales.test.ts +83 -0
  181. package/src/i18n/context.tsx +12 -2
  182. package/src/i18n/detect.ts +7 -66
  183. package/src/i18n/locales/glossary.zh-Hans.yml +44 -4
  184. package/src/i18n/locales/glossary.zh-Hant.yml +44 -4
  185. package/src/i18n/locales/public/en.po +490 -158
  186. package/src/i18n/locales/public/en.ts +1 -1
  187. package/src/i18n/locales/public/zh-Hans.po +487 -155
  188. package/src/i18n/locales/public/zh-Hans.ts +1 -1
  189. package/src/i18n/locales/public/zh-Hant.po +487 -155
  190. package/src/i18n/locales/public/zh-Hant.ts +1 -1
  191. package/src/i18n/locales/settings/en.po +551 -69
  192. package/src/i18n/locales/settings/en.ts +1 -1
  193. package/src/i18n/locales/settings/zh-Hans.po +597 -115
  194. package/src/i18n/locales/settings/zh-Hans.ts +1 -1
  195. package/src/i18n/locales/settings/zh-Hant.po +610 -128
  196. package/src/i18n/locales/settings/zh-Hant.ts +1 -1
  197. package/src/i18n/locales.ts +94 -0
  198. package/src/i18n/middleware.ts +12 -2
  199. package/src/i18n/supported-locales.ts +80 -0
  200. package/src/lib/__tests__/api-settings.test.ts +11 -2
  201. package/src/lib/__tests__/asset-path.test.ts +92 -0
  202. package/src/lib/__tests__/deferred.test.ts +90 -0
  203. package/src/lib/__tests__/discover-ping.test.ts +89 -0
  204. package/src/lib/__tests__/discover.test.ts +410 -0
  205. package/src/lib/__tests__/feed-policy.test.ts +26 -0
  206. package/src/lib/__tests__/feed.test.ts +1526 -15
  207. package/src/lib/__tests__/filter-dimensions.test.ts +341 -0
  208. package/src/lib/__tests__/hosted-signin.test.ts +1 -1
  209. package/src/lib/__tests__/http-cache.test.ts +162 -0
  210. package/src/lib/__tests__/jant-docs-dev.test.ts +21 -0
  211. package/src/lib/__tests__/jant-docs.test.ts +23 -0
  212. package/src/lib/__tests__/lang-detect.test.ts +231 -0
  213. package/src/lib/__tests__/media-helpers.test.ts +81 -0
  214. package/src/lib/__tests__/navigation.test.ts +135 -1
  215. package/src/lib/__tests__/resolve-config.test.ts +64 -3
  216. package/src/lib/__tests__/schemas.test.ts +42 -4
  217. package/src/lib/__tests__/site-unavailable-page.test.ts +25 -0
  218. package/src/lib/__tests__/slug.test.ts +70 -0
  219. package/src/lib/__tests__/slugify.test.ts +85 -0
  220. package/src/lib/__tests__/storage.test.ts +32 -0
  221. package/src/lib/__tests__/thread-fold.test.ts +113 -0
  222. package/src/lib/__tests__/upload-sideload.test.ts +14 -0
  223. package/src/lib/__tests__/url-fetch.test.ts +1 -2
  224. package/src/lib/__tests__/url.test.ts +78 -72
  225. package/src/lib/__tests__/view-language.test.ts +413 -0
  226. package/src/lib/__tests__/worker-response-cache.test.ts +90 -0
  227. package/src/lib/address.ts +57 -0
  228. package/src/lib/api-posts.ts +12 -0
  229. package/src/lib/asset-path.ts +98 -1
  230. package/src/lib/build-env.ts +16 -0
  231. package/src/lib/collection-groups.ts +5 -1
  232. package/src/lib/collection-paths.ts +3 -10
  233. package/src/lib/constants.ts +28 -3
  234. package/src/lib/copy-field.ts +36 -0
  235. package/src/lib/crypto.ts +40 -0
  236. package/src/lib/csp-builder.ts +2 -1
  237. package/src/lib/deferred.ts +79 -0
  238. package/src/lib/discover-ping.ts +141 -0
  239. package/src/lib/discover.ts +437 -0
  240. package/src/lib/env.ts +134 -0
  241. package/src/lib/errors.ts +33 -0
  242. package/src/lib/feed-policy.ts +236 -2
  243. package/src/lib/feed.ts +926 -73
  244. package/src/lib/filter-dimensions.ts +1349 -0
  245. package/src/lib/github-sync-site-config.ts +3 -0
  246. package/src/lib/hosted-signin.ts +1 -1
  247. package/src/lib/http-cache.ts +148 -0
  248. package/src/lib/hugo-markdown.ts +16 -0
  249. package/src/lib/icons.ts +9 -2
  250. package/src/lib/ids.ts +3 -0
  251. package/src/lib/jant-docs.ts +42 -0
  252. package/src/lib/lang-detect.ts +308 -0
  253. package/src/lib/media-helpers.ts +13 -1
  254. package/src/lib/navigation.ts +78 -11
  255. package/src/lib/pagination.ts +28 -24
  256. package/src/lib/per-language-surfaces.ts +67 -0
  257. package/src/lib/post-meta.ts +19 -0
  258. package/src/lib/render.tsx +55 -7
  259. package/src/lib/resolve-config.ts +53 -5
  260. package/src/lib/schemas.ts +201 -10
  261. package/src/lib/site-header-fragment.tsx +2 -1
  262. package/src/lib/site-unavailable-page.ts +47 -0
  263. package/src/lib/slug.ts +51 -7
  264. package/src/lib/slugify.ts +113 -0
  265. package/src/lib/startup-config.ts +4 -6
  266. package/src/lib/storage.ts +7 -0
  267. package/src/lib/summary.ts +50 -0
  268. package/src/lib/thread-fold.ts +161 -0
  269. package/src/lib/time.ts +32 -0
  270. package/src/lib/timeline.ts +42 -1
  271. package/src/lib/tiptap-render.ts +1 -2
  272. package/src/lib/upload.ts +16 -13
  273. package/src/lib/url.ts +139 -86
  274. package/src/lib/version.ts +10 -8
  275. package/src/lib/view-language.ts +436 -0
  276. package/src/lib/view.ts +51 -23
  277. package/src/lib/viewer-context.ts +62 -0
  278. package/src/middleware/__tests__/auth.test.ts +70 -2
  279. package/src/middleware/__tests__/cache-control.test.ts +71 -3
  280. package/src/middleware/__tests__/onboarding.test.ts +76 -5
  281. package/src/middleware/__tests__/secure-headers.test.ts +1 -1
  282. package/src/middleware/__tests__/session.test.ts +181 -33
  283. package/src/middleware/auth.ts +50 -31
  284. package/src/middleware/cache-control.ts +75 -10
  285. package/src/middleware/config.ts +6 -6
  286. package/src/middleware/error-handler.ts +12 -0
  287. package/src/middleware/onboarding.ts +32 -10
  288. package/src/middleware/secure-headers.ts +1 -1
  289. package/src/middleware/session.ts +96 -8
  290. package/src/node/__tests__/cli-migrate.test.ts +21 -19
  291. package/src/node/__tests__/cli-reset-password.test.ts +81 -8
  292. package/src/node/__tests__/cli-runtime-target.test.ts +48 -1
  293. package/src/node/__tests__/cli-site-selection.test.ts +128 -38
  294. package/src/node/__tests__/runtime.test.ts +37 -0
  295. package/src/node/index.ts +1 -0
  296. package/src/preset.css +76 -22
  297. package/src/routes/__tests__/feed-validator.test.ts +156 -0
  298. package/src/routes/api/__tests__/collections.test.ts +114 -0
  299. package/src/routes/api/__tests__/discover.test.ts +222 -0
  300. package/src/routes/api/__tests__/nav-items.test.ts +212 -2
  301. package/src/routes/api/__tests__/post-translations.test.ts +829 -0
  302. package/src/routes/api/__tests__/settings.test.ts +24 -3
  303. package/src/routes/api/__tests__/telegram.test.ts +6 -5
  304. package/src/routes/api/collections.ts +49 -6
  305. package/src/routes/api/custom-urls.ts +0 -1
  306. package/src/routes/api/discover.ts +95 -0
  307. package/src/routes/api/export.ts +3 -0
  308. package/src/routes/api/internal/__tests__/sites.test.ts +42 -2
  309. package/src/routes/api/nav-items.ts +55 -8
  310. package/src/routes/api/posts.ts +159 -0
  311. package/src/routes/api/public/__tests__/archive.test.ts +111 -0
  312. package/src/routes/api/public/archive.ts +77 -81
  313. package/src/routes/api/public/posts.ts +23 -6
  314. package/src/routes/api/smart-collections.ts +132 -0
  315. package/src/routes/api/telegram.ts +2 -40
  316. package/src/routes/api/uploads.ts +1 -2
  317. package/src/routes/auth/__tests__/setup-auth.test.ts +137 -0
  318. package/src/routes/auth/__tests__/setup-discover.test.ts +204 -0
  319. package/src/routes/auth/__tests__/setup-flow.test.ts +270 -0
  320. package/src/routes/auth/__tests__/setup-page.test.tsx +329 -0
  321. package/src/routes/auth/__tests__/setup-steps.test.ts +310 -0
  322. package/src/routes/auth/__tests__/setup.test.ts +278 -26
  323. package/src/routes/auth/__tests__/signin.test.ts +135 -0
  324. package/src/routes/auth/setup.tsx +934 -186
  325. package/src/routes/auth/signin.tsx +10 -8
  326. package/src/routes/compose.tsx +5 -0
  327. package/src/routes/dash/__tests__/custom-urls-archive.test.ts +44 -0
  328. package/src/routes/dash/__tests__/custom-urls-page.test.ts +49 -0
  329. package/src/routes/dash/__tests__/delete-account.test.ts +106 -0
  330. package/src/routes/dash/__tests__/settings-discover.test.ts +213 -0
  331. package/src/routes/dash/custom-urls.tsx +1 -37
  332. package/src/routes/dash/settings.tsx +502 -41
  333. package/src/routes/discover-announce.ts +96 -0
  334. package/src/routes/feed/__tests__/feed.test.ts +165 -2
  335. package/src/routes/feed/feed.ts +69 -40
  336. package/src/routes/feed/sitemap.ts +95 -11
  337. package/src/routes/pages/__tests__/archive-indexing.test.ts +200 -0
  338. package/src/routes/pages/__tests__/archive-params.test.ts +370 -6
  339. package/src/routes/pages/__tests__/collection-routing.test.ts +16 -0
  340. package/src/routes/pages/__tests__/collections-feed-links.test.ts +72 -0
  341. package/src/routes/pages/__tests__/collections.test.ts +9 -3
  342. package/src/routes/pages/__tests__/custom-archive-url.test.ts +119 -0
  343. package/src/routes/pages/__tests__/feed-autodiscovery.test.ts +148 -0
  344. package/src/routes/pages/__tests__/language-routing.test.ts +679 -0
  345. package/src/routes/pages/__tests__/post-preview-partial.test.ts +96 -0
  346. package/src/routes/pages/__tests__/smart-collection.test.ts +298 -0
  347. package/src/routes/pages/__tests__/subscribe.test.ts +248 -0
  348. package/src/routes/pages/archive.tsx +471 -369
  349. package/src/routes/pages/collection.tsx +94 -96
  350. package/src/routes/pages/collections.tsx +38 -50
  351. package/src/routes/pages/featured.tsx +32 -13
  352. package/src/routes/pages/home.tsx +25 -6
  353. package/src/routes/pages/language.tsx +113 -0
  354. package/src/routes/pages/latest.tsx +26 -16
  355. package/src/routes/pages/new.tsx +3 -0
  356. package/src/routes/pages/page.tsx +178 -17
  357. package/src/routes/pages/partials.tsx +41 -0
  358. package/src/routes/pages/search.tsx +18 -3
  359. package/src/routes/pages/smart-collection.tsx +340 -0
  360. package/src/routes/pages/subscribe.tsx +182 -0
  361. package/src/runtime/__tests__/index.test.ts +19 -0
  362. package/src/runtime/__tests__/node.test.ts +129 -4
  363. package/src/runtime/cloudflare.ts +21 -2
  364. package/src/runtime/index.ts +27 -1
  365. package/src/runtime/node.ts +18 -1
  366. package/src/runtime/site.ts +95 -24
  367. package/src/services/__tests__/auth.test.ts +116 -7
  368. package/src/services/__tests__/collection.test.ts +108 -4
  369. package/src/services/__tests__/language.test.ts +495 -0
  370. package/src/services/__tests__/navigation.test.ts +213 -10
  371. package/src/services/__tests__/path.test.ts +180 -0
  372. package/src/services/__tests__/post-language.test.ts +830 -0
  373. package/src/services/__tests__/post.test.ts +46 -9
  374. package/src/services/__tests__/settings.test.ts +228 -17
  375. package/src/services/__tests__/site-admin.test.ts +5 -5
  376. package/src/services/__tests__/smart-collection.test.ts +651 -0
  377. package/src/services/about-page.ts +22 -1
  378. package/src/services/auth.ts +51 -49
  379. package/src/services/bootstrap.ts +188 -38
  380. package/src/services/collection-directory-position.ts +76 -0
  381. package/src/services/collection.ts +331 -46
  382. package/src/services/custom-url.ts +27 -22
  383. package/src/services/export-theme/assets/client-site.css +1 -1
  384. package/src/services/export-theme/assets/client-site.js +123 -123
  385. package/src/services/export-theme/layouts/_default/rss.xml +77 -1
  386. package/src/services/export-theme/layouts/partials/feed-post-content.xml +105 -2
  387. package/src/services/export-theme/layouts/partials/media-gallery.html +35 -21
  388. package/src/services/export-theme/layouts/partials/pagination.html +14 -13
  389. package/src/services/export-theme/layouts/partials/post-card.html +8 -4
  390. package/src/services/export-theme/layouts/partials/reply.html +2 -1
  391. package/src/services/export-theme/layouts/partials/thread-preview.html +40 -30
  392. package/src/services/export-theme/styles/main.css +13 -1
  393. package/src/services/export.ts +278 -19
  394. package/src/services/index.ts +34 -3
  395. package/src/services/language.ts +412 -0
  396. package/src/services/mcp.ts +3 -1
  397. package/src/services/media.ts +14 -6
  398. package/src/services/navigation.ts +429 -67
  399. package/src/services/path.ts +221 -6
  400. package/src/services/post.ts +1021 -152
  401. package/src/services/search.ts +39 -2
  402. package/src/services/settings.ts +238 -43
  403. package/src/services/site-admin.ts +24 -7
  404. package/src/services/site.ts +77 -1
  405. package/src/services/smart-collection.ts +636 -0
  406. package/src/services/telegram.ts +20 -22
  407. package/src/services/upload-session.ts +1 -3
  408. package/src/style-author.css +27 -0
  409. package/src/styles/components-author.css +1622 -0
  410. package/src/styles/components.css +24 -1571
  411. package/src/styles/site-media.css +16 -2
  412. package/src/styles/tokens.css +82 -12
  413. package/src/styles/ui-author.css +7602 -0
  414. package/src/styles/ui.css +1087 -7219
  415. package/src/types/app-context.ts +7 -0
  416. package/src/types/bindings.ts +3 -0
  417. package/src/types/config.ts +94 -15
  418. package/src/types/constants.ts +188 -16
  419. package/src/types/entities.ts +87 -1
  420. package/src/types/operations.ts +64 -2
  421. package/src/types/props.ts +157 -31
  422. package/src/types/views.ts +55 -1
  423. package/src/ui/__tests__/font-themes.test.ts +52 -12
  424. package/src/ui/compose/ComposeDialog.tsx +201 -7
  425. package/src/ui/compose/ComposePrompt.tsx +1 -5
  426. package/src/ui/compose/__tests__/ComposeDialog.test.tsx +125 -0
  427. package/src/ui/dash/appearance/AdvancedContent.tsx +2 -2
  428. package/src/ui/dash/appearance/CodeInjectionContent.tsx +12 -16
  429. package/src/ui/dash/appearance/NavigationContent.tsx +117 -16
  430. package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +33 -11
  431. package/src/ui/dash/appearance/__tests__/system-nav-descriptions.test.ts +44 -0
  432. package/src/ui/dash/appearance/system-nav-descriptions.ts +75 -0
  433. package/src/ui/dash/settings/AccountMenuContent.tsx +2 -2
  434. package/src/ui/dash/settings/ApiTokensContent.tsx +2 -1
  435. package/src/ui/dash/settings/ConfigEditorContent.tsx +35 -16
  436. package/src/ui/dash/settings/GeneralContent.tsx +275 -113
  437. package/src/ui/dash/settings/LanguageContent.tsx +409 -0
  438. package/src/ui/dash/settings/SettingsRootContent.tsx +19 -1
  439. package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +324 -4
  440. package/src/ui/dash/settings/__tests__/LanguageContent.test.tsx +144 -0
  441. package/src/ui/dash/settings/__tests__/discover-copy.test.ts +66 -0
  442. package/src/ui/dash/settings/discover-copy.ts +116 -0
  443. package/src/ui/feed/LinkCard.tsx +55 -45
  444. package/src/ui/feed/NoteCard.tsx +9 -4
  445. package/src/ui/feed/PostStatusBadges.tsx +90 -43
  446. package/src/ui/feed/QuoteCard.tsx +55 -30
  447. package/src/ui/feed/ThreadPreview.tsx +6 -2
  448. package/src/ui/feed/__tests__/thread-preview.test.ts +13 -16
  449. package/src/ui/feed/__tests__/timeline-cards.test.ts +314 -49
  450. package/src/ui/feed/thread-preview-state.ts +20 -6
  451. package/src/ui/font-themes.ts +39 -29
  452. package/src/ui/layouts/BaseLayout.tsx +155 -10
  453. package/src/ui/layouts/SiteLayout.tsx +192 -34
  454. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +196 -17
  455. package/src/ui/layouts/__tests__/SiteLayout.test.tsx +109 -85
  456. package/src/ui/pages/ArchivePage.tsx +282 -289
  457. package/src/ui/pages/CollectionPage.tsx +86 -76
  458. package/src/ui/pages/CollectionsPage.tsx +5 -0
  459. package/src/ui/pages/ComposePage.tsx +8 -0
  460. package/src/ui/pages/PostPage.tsx +47 -0
  461. package/src/ui/pages/SearchPage.tsx +3 -3
  462. package/src/ui/pages/SmartCollectionPage.tsx +434 -0
  463. package/src/ui/pages/SubscribePage.tsx +236 -0
  464. package/src/ui/pages/__tests__/ArchivePage.test.tsx +65 -9
  465. package/src/ui/pages/__tests__/collections-directory-rows.test.tsx +92 -0
  466. package/src/ui/pages/__tests__/collections-view-links.test.tsx +81 -0
  467. package/src/ui/shared/CollectionDirectory.tsx +178 -3
  468. package/src/ui/shared/CollectionsManager.tsx +70 -17
  469. package/src/ui/shared/CopyField.tsx +127 -0
  470. package/src/ui/shared/EmptyPostContent.tsx +23 -0
  471. package/src/ui/shared/MediaGallery.tsx +125 -46
  472. package/src/ui/shared/Pagination.tsx +20 -5
  473. package/src/ui/shared/PostFooter.tsx +20 -11
  474. package/src/ui/shared/__tests__/archive-labels.test.ts +100 -0
  475. package/src/ui/shared/__tests__/media-gallery.test.ts +210 -2
  476. package/src/ui/shared/__tests__/navigation-labels.test.ts +16 -22
  477. package/src/ui/shared/__tests__/pagination.test.ts +38 -24
  478. package/src/ui/shared/__tests__/post-footer.test.ts +32 -0
  479. package/src/ui/shared/archive-labels.ts +98 -0
  480. package/src/ui/shared/collection-management-labels.ts +94 -16
  481. package/src/ui/shared/navigation-labels.ts +45 -71
  482. package/src/ui/shared/post-article-attributes.ts +2 -0
  483. package/src/ui/shared/smart-collection-labels.ts +343 -0
  484. package/dist/app-C75Zc8dD.js +0 -6
  485. package/dist/client/_assets/chunks/heic-to-DUUaO23q.js +0 -1
  486. package/dist/client/_assets/chunks/module-DcsAZQZ_.js +0 -716
  487. package/dist/client/_assets/chunks/url-CU9pEbk5.js +0 -1
  488. package/dist/client/_assets/client-Bq0vre8Y.js +0 -296
  489. package/dist/client/_assets/client-D3VZyG4L.css +0 -2
  490. package/dist/client/_assets/client-auth-F2rb9WfF.js +0 -5571
  491. package/dist/env-BPYViDJJ.js +0 -281
  492. package/dist/github-api-BNF35Lkx.js +0 -176
  493. package/dist/github-app-DdiD-bC4.js +0 -275
  494. package/dist/github-sync-Bqg62IvV.js +0 -4
  495. package/dist/github-sync-HdK2EgvJ.js +0 -431
  496. package/dist/url-CbLAtlZe.js +0 -900
  497. package/src/client/__tests__/collection-created-notice.test.ts +0 -36
  498. package/src/client/__tests__/collection-form-bridge.test.ts +0 -216
  499. package/src/client/__tests__/post-form-bridge.test.ts +0 -82
  500. package/src/client/collection-created-notice.ts +0 -66
  501. package/src/client/collection-form-bridge.ts +0 -191
  502. package/src/client/components/__tests__/jant-post-form.test.ts +0 -193
  503. package/src/client/components/jant-post-form.ts +0 -422
  504. package/src/client/components/post-form-template.ts +0 -352
  505. package/src/client/components/post-form-types.ts +0 -96
  506. package/src/client/media-metadata.ts +0 -247
  507. package/src/client/post-form-bridge.ts +0 -193
  508. package/src/ui/pages/CollectionEditorPage.tsx +0 -175
@@ -38,6 +38,11 @@ msgstr "{count, plural, one {Found # result} other {Found # results}}"
38
38
  msgid "{count} images couldn't be saved to your library — their original links were kept."
39
39
  msgstr "{count} images couldn't be saved to your library — their original links were kept."
40
40
 
41
+ #. @context: Smart collection dialog live count — how many threads the conditions gather out of the site total
42
+ #: src/ui/shared/smart-collection-labels.ts
43
+ msgid "{count} of {total} threads"
44
+ msgstr "{count} of {total} threads"
45
+
41
46
  #. @context: Value shown on a post's permalink control when the link is generated automatically — a stand-in for the path the server will assign. Sits next to real permalinks rendered as /my-post, so keep the leading slash
42
47
  #: src/ui/compose/ComposeDialog.tsx
43
48
  msgid "/…"
@@ -70,6 +75,16 @@ msgstr "A calmer accent makes"
70
75
  msgid "A calmer, warmer accent makes the default theme feel quieter and more intentional."
71
76
  msgstr "A calmer, warmer accent makes the default theme feel quieter and more intentional."
72
77
 
78
+ #. @context: Collection dialog validation message
79
+ #: src/ui/shared/collection-management-labels.ts
80
+ msgid "A collection needs a title and a link."
81
+ msgstr "A collection needs a title and a link."
82
+
83
+ #. @context: Subscribe page explanation of what a feed reader is and where it runs
84
+ #: src/ui/pages/SubscribePage.tsx
85
+ msgid "A feed reader checks these addresses for new posts and collects them in one place. Most are an app on your phone or computer; some are a website you sign in to."
86
+ msgstr "A feed reader checks these addresses for new posts and collects them in one place. Most are an app on your phone or computer; some are a website you sign in to."
87
+
73
88
  #. @context: Section title for the usage guidance section on the brand asset page
74
89
  #: src/ui/pages/BrandPage.tsx
75
90
  msgid "A few simple rules."
@@ -89,6 +104,11 @@ msgstr "A good default accent in Jant should feel like editorial structure, not
89
104
  msgid "A long-form article sample for checking the default palette in a true reading context."
90
105
  msgstr "A long-form article sample for checking the default palette in a true reading context."
91
106
 
107
+ #. @context: Subscribe page link to the independent aboutfeeds.com explainer. The whole sentence is the link text.
108
+ #: src/ui/pages/SubscribePage.tsx
109
+ msgid "A longer introduction to feeds and readers, at aboutfeeds.com"
110
+ msgstr "A longer introduction to feeds and readers, at aboutfeeds.com"
111
+
92
112
  #. @context: Subheading in the sample detail article
93
113
  #: src/ui/pages/ThemeSamplePage.tsx
94
114
  msgid "A practical checklist"
@@ -118,6 +138,11 @@ msgstr "A reference link for checking whether the accent feels editorial instead
118
138
  msgid "A single ZIP with the main logo, reverse logo, square PNG, rounded, square, and circle tiles, plus favicon, Apple touch icon, and social preview image."
119
139
  msgstr "A single ZIP with the main logo, reverse logo, square PNG, rounded, square, and circle tiles, plus favicon, Apple touch icon, and social preview image."
120
140
 
141
+ #. @context: Smart collection dialog validation message
142
+ #: src/ui/shared/smart-collection-labels.ts
143
+ msgid "A smart collection needs a title and a link."
144
+ msgstr "A smart collection needs a title and a link."
145
+
121
146
  #. @context: Main sample article title
122
147
  #: src/ui/pages/ThemeSamplePage.tsx
123
148
  msgid "A softer blue feels more like ink than product chrome."
@@ -143,11 +168,6 @@ msgstr "Add a custom shortcut to any page or site."
143
168
  msgid "Add a label and URL."
144
169
  msgstr "Add a label and URL."
145
170
 
146
- #. @context: Description for the RSS system navigation toggle
147
- #: src/ui/shared/navigation-labels.ts
148
- msgid "Add a link to your main RSS feed. Change what /feed returns in General."
149
- msgstr "Add a link to your main RSS feed. Change what /feed returns in General."
150
-
151
171
  #. @context: Compose link title required error
152
172
  #: src/ui/compose/ComposeDialog.tsx
153
173
  msgid "Add a title before posting this link."
@@ -178,6 +198,11 @@ msgstr "Add column after"
178
198
  msgid "Add column before"
179
199
  msgstr "Add column before"
180
200
 
201
+ #. @context: Smart collection dialog button
202
+ #: src/ui/shared/smart-collection-labels.ts
203
+ msgid "Add condition"
204
+ msgstr "Add condition"
205
+
181
206
  #. @context: Primary action to add a custom link on collections page
182
207
  #: src/ui/shared/collection-management-labels.ts
183
208
  msgid "Add Link"
@@ -203,6 +228,17 @@ msgstr "Add to Navigation"
203
228
  msgid "Adding…"
204
229
  msgstr "Adding…"
205
230
 
231
+ #. @context: Subscribe page name for the full archive feed. Matches the Archive page's own nav label.
232
+ #: src/routes/pages/subscribe.tsx
233
+ msgid "All"
234
+ msgstr "All"
235
+
236
+ #. @context: Built-in navigation label for the archive page. Reads as the widest of Featured / Latest / All rather than 'old posts' — the page is the complete index, and its URL stays /archive.
237
+ #: src/ui/shared/navigation-labels.ts
238
+ msgctxt "nav"
239
+ msgid "All"
240
+ msgstr "All"
241
+
206
242
  #. @context: Archive filter - collection dropdown default
207
243
  #: src/ui/pages/ArchivePage.tsx
208
244
  msgid "All collections"
@@ -213,8 +249,10 @@ msgstr "All collections"
213
249
  msgid "All formats"
214
250
  msgstr "All formats"
215
251
 
252
+ #. @context: Archive page heading and document title when no filter is active. Names the surface, not the current selection — the nav calls the same destination 'All'.
216
253
  #. @context: Archive thread filter - threads and single posts
217
254
  #: src/ui/pages/ArchivePage.tsx
255
+ #: src/ui/shared/archive-labels.ts
218
256
  msgid "All posts"
219
257
  msgstr "All posts"
220
258
 
@@ -228,6 +266,11 @@ msgstr "All visibility"
228
266
  msgid "All years"
229
267
  msgstr "All years"
230
268
 
269
+ #. @context: Label before links to this post's translations
270
+ #: src/ui/pages/PostPage.tsx
271
+ msgid "Also available in"
272
+ msgstr "Also available in"
273
+
231
274
  #. @context: Alt text for the sample detail article image
232
275
  #: src/ui/pages/ThemeSamplePage.tsx
233
276
  msgid "An abstract editorial layout in warm paper colors"
@@ -254,35 +297,22 @@ msgid "Apple touch icon"
254
297
  msgstr "Apple touch icon"
255
298
 
256
299
  #. @context: Archive feed title prefix
257
- #. @context: Archive page title
258
300
  #. @context: Inactive nav link label on sample page
259
301
  #: src/routes/pages/archive.tsx
260
- #: src/ui/pages/ArchivePage.tsx
261
302
  #: src/ui/pages/ThemeSamplePage.tsx
262
303
  msgid "Archive"
263
304
  msgstr "Archive"
264
305
 
265
- #. @context: Built-in navigation label for the archive page
266
- #: src/ui/shared/navigation-labels.ts
267
- msgctxt "nav"
268
- msgid "Archive"
269
- msgstr "Archive"
270
-
271
306
  #. @context: Section heading for the detail article sample on the theme sample page
272
307
  #: src/ui/pages/ThemeSamplePage.tsx
273
308
  msgid "Article detail page"
274
309
  msgstr "Article detail page"
275
310
 
276
311
  #. @context: Archive media filter - audio
277
- #: src/ui/pages/ArchivePage.tsx
312
+ #: src/lib/filter-dimensions.ts
278
313
  msgid "Audio"
279
314
  msgstr "Audio"
280
315
 
281
- #. @context: Error toast when authentication secret is missing from server config
282
- #: src/routes/auth/setup.tsx
283
- msgid "Auth secret is missing. Check your environment variables."
284
- msgstr "Auth secret is missing. Check your environment variables."
285
-
286
316
  #. @context: Error toast when authentication system is unavailable
287
317
  #: src/routes/auth/signin.tsx
288
318
  msgid "Authentication isn't set up. Check your server config."
@@ -298,6 +328,16 @@ msgstr "Author (optional)"
298
328
  msgid "Auto"
299
329
  msgstr "Auto"
300
330
 
331
+ #. @context: Smart collection page — what it gathers, when no condition narrows it
332
+ #: src/ui/shared/smart-collection-labels.ts
333
+ msgid "Automatically collects every post."
334
+ msgstr "Automatically collects every post."
335
+
336
+ #. @context: Smart collection page — what it gathers. {conditions} is the list of conditions, already joined. A label and a list, not a sentence: the conditions are named in the archive's own words, which are noun fragments like "Titled" or "With media".
337
+ #: src/ui/shared/smart-collection-labels.ts
338
+ msgid "Automatically collects: {conditions}"
339
+ msgstr "Automatically collects: {conditions}"
340
+
301
341
  #. @context: Usage label for the circle tile asset card
302
342
  #: src/ui/pages/BrandPage.tsx
303
343
  msgid "Avatar-ready"
@@ -334,13 +374,6 @@ msgstr "Brand pack"
334
374
  msgid "Brand tile"
335
375
  msgstr "Brand tile"
336
376
 
337
- #. @context: Breadcrumb label on collection detail page
338
- #. @context: Breadcrumb label on collection editor page
339
- #: src/ui/pages/CollectionEditorPage.tsx
340
- #: src/ui/pages/CollectionPage.tsx
341
- msgid "Breadcrumb"
342
- msgstr "Breadcrumb"
343
-
344
377
  #. @context: Secondary hero button label to jump to the file list
345
378
  #: src/ui/pages/BrandPage.tsx
346
379
  msgid "Browse files"
@@ -361,17 +394,20 @@ msgstr "Built-in background"
361
394
  msgid "Buttons can stay steady, but links, thread markers, and subtle emphasis should feel closer to ink on paper than dashboard chrome."
362
395
  msgstr "Buttons can stay steady, but links, thread markers, and subtle emphasis should feel closer to ink on paper than dashboard chrome."
363
396
 
397
+ #. @context: Back out of the attached-text sub-editor, paired with Done. Leaving the composer itself says Close instead — it may keep the work as a draft, so nothing is being cancelled.
364
398
  #. @context: Button label to dismiss a dialog or action
365
399
  #. @context: Button to cancel form
366
- #. @context: Close compose dialog
367
- #. @context: Confirm close action sheet - cancel and return to editor
368
- #: src/ui/compose/ComposeDialog.tsx
369
400
  #: src/ui/compose/ComposeDialog.tsx
370
401
  #: src/ui/shared/collection-management-labels.ts
371
402
  #: src/ui/shared/collection-management-labels.ts
372
403
  msgid "Cancel"
373
404
  msgstr "Cancel"
374
405
 
406
+ #. @context: Collection editing dialog warning shown when editing moves an existing collection link
407
+ #: src/ui/shared/collection-management-labels.ts
408
+ msgid "Changing the link breaks the old one immediately."
409
+ msgstr "Changing the link breaks the old one immediately."
410
+
375
411
  #. @context: Compose custom slug helper while checking whether a manual slug is available
376
412
  #: src/ui/compose/ComposeDialog.tsx
377
413
  msgid "Checking link..."
@@ -416,10 +452,10 @@ msgstr "Circle tile"
416
452
  msgid "Clear filter"
417
453
  msgstr "Clear filter"
418
454
 
419
- #. @context: Post options row that leaves the composer; prompts to save a draft first if there is unsaved work
455
+ #. @context: Leaves the composer — the × on a single post, and the button in a thread. Prompts to save a draft first if there is unsaved work.
420
456
  #: src/ui/compose/ComposeDialog.tsx
421
- msgid "Close compose"
422
- msgstr "Close compose"
457
+ msgid "Close"
458
+ msgstr "Close"
423
459
 
424
460
  #. @context: Close drawer button label
425
461
  #: src/ui/layouts/SiteLayout.tsx
@@ -432,6 +468,8 @@ msgid "collection"
432
468
  msgstr "collection"
433
469
 
434
470
  #. @context: Compose collection selector trigger label
471
+ #. @context: Post filter dimension name - collection membership
472
+ #: src/lib/filter-dimensions.ts
435
473
  #: src/ui/compose/ComposeDialog.tsx
436
474
  msgid "Collection"
437
475
  msgstr "Collection"
@@ -471,14 +509,14 @@ msgstr "Collection saved."
471
509
  msgid "collections"
472
510
  msgstr "collections"
473
511
 
474
- #. @context: Breadcrumb link to collections page
475
- #. @context: Breadcrumb link to collections page
476
512
  #. @context: Collections page heading
477
513
  #. @context: Collections page heading
478
514
  #. @context: Inactive nav link label on sample page
479
- #: src/ui/pages/CollectionEditorPage.tsx
515
+ #. @context: Link back to the collections directory from a collection page
516
+ #. @context: Link back to the collections directory from a collection page
480
517
  #: src/ui/pages/CollectionPage.tsx
481
518
  #: src/ui/pages/CollectionsPage.tsx
519
+ #: src/ui/pages/SmartCollectionPage.tsx
482
520
  #: src/ui/pages/ThemeSamplePage.tsx
483
521
  #: src/ui/shared/CollectionsManager.tsx
484
522
  msgid "Collections"
@@ -490,6 +528,11 @@ msgctxt "nav"
490
528
  msgid "Collections"
491
529
  msgstr "Collections"
492
530
 
531
+ #. @context: Subscribe page closing note, next to a small feed icon standing in for the ones on collection and archive pages
532
+ #: src/ui/pages/SubscribePage.tsx
533
+ msgid "Collections and filtered archive views have their own feeds. Look for this icon on those pages."
534
+ msgstr "Collections and filtered archive views have their own feeds. Look for this icon on those pages."
535
+
493
536
  #. @context: Alert title on theme sample page
494
537
  #: src/ui/pages/ThemeSamplePage.tsx
495
538
  msgid "Color check"
@@ -507,16 +550,21 @@ msgstr "Combined Collections"
507
550
  msgid "Compare it against the theme controls"
508
551
  msgstr "Compare it against the theme controls"
509
552
 
510
- #. @context: Setup form submit button
511
- #: src/routes/auth/setup.tsx
512
- msgid "Complete Setup"
513
- msgstr "Complete Setup"
514
-
515
553
  #. @context: Accessible name for the compose dialog
516
554
  #: src/ui/compose/ComposeDialog.tsx
517
555
  msgid "Compose"
518
556
  msgstr "Compose"
519
557
 
558
+ #. @context: Smart collection dialog section heading
559
+ #: src/ui/shared/smart-collection-labels.ts
560
+ msgid "Conditions"
561
+ msgstr "Conditions"
562
+
563
+ #. @context: One line under the New Smart Collection heading, saying how it differs from an ordinary collection
564
+ #: src/ui/shared/smart-collection-labels.ts
565
+ msgid "Conditions choose what belongs here, not you. Posts you write later join on their own."
566
+ msgstr "Conditions choose what belongs here, not you. Posts you write later join on their own."
567
+
520
568
  #. @context: Password reset form field
521
569
  #: src/routes/auth/reset.tsx
522
570
  msgid "Confirm Password"
@@ -537,20 +585,36 @@ msgstr "Continue writing this draft"
537
585
  msgid "Controls"
538
586
  msgstr "Controls"
539
587
 
588
+ #. @context: Button that copies a feed address to the clipboard
589
+ #: src/ui/pages/SubscribePage.tsx
590
+ msgid "Copy"
591
+ msgstr "Copy"
592
+
593
+ #. @context: Toast when the clipboard is unavailable, pointing at selecting the address by hand
594
+ #: src/ui/pages/SubscribePage.tsx
595
+ msgid "Could not copy. Select the address and copy it."
596
+ msgstr "Could not copy. Select the address and copy it."
597
+
598
+ #. @context: Collection dialog load failure
599
+ #: src/ui/shared/collection-management-labels.ts
600
+ msgid "Could not open this collection. Try again."
601
+ msgstr "Could not open this collection. Try again."
602
+
603
+ #. @context: Smart collection dialog load failure
604
+ #: src/ui/shared/smart-collection-labels.ts
605
+ msgid "Could not open this smart collection. Try again."
606
+ msgstr "Could not open this smart collection. Try again."
607
+
608
+ #. @context: Smart collection dialog save failure
609
+ #: src/ui/shared/smart-collection-labels.ts
610
+ msgid "Could not save. Try again."
611
+ msgstr "Could not save. Try again."
612
+
540
613
  #. @context: Error after a Collection could not be added to site navigation
541
614
  #: src/ui/shared/collection-management-labels.ts
542
615
  msgid "Couldn't add this collection to navigation. Try again."
543
616
  msgstr "Couldn't add this collection to navigation. Try again."
544
617
 
545
- #. @context: Error toast when account creation fails
546
- #. @context: Error toast when account creation fails
547
- #. @context: Error toast when account creation fails
548
- #: src/routes/auth/setup.tsx
549
- #: src/routes/auth/setup.tsx
550
- #: src/routes/auth/setup.tsx
551
- msgid "Couldn't create your account. Check the details and try again."
552
- msgstr "Couldn't create your account. Check the details and try again."
553
-
554
618
  #. @context: Toast shown when edit mode fails to load a post
555
619
  #: src/ui/compose/ComposeDialog.tsx
556
620
  msgid "Couldn't load this post. Try again."
@@ -561,21 +625,31 @@ msgstr "Couldn't load this post. Try again."
561
625
  msgid "Couldn't publish. Saved as draft."
562
626
  msgstr "Couldn't publish. Saved as draft."
563
627
 
628
+ #. @context: Toast when publish fails and the server gave no reason
629
+ #: src/ui/compose/ComposeDialog.tsx
630
+ msgid "Couldn't publish. Try again."
631
+ msgstr "Couldn't publish. Try again."
632
+
633
+ #. @context: Toast when a publish request never reached the server
634
+ #: src/ui/compose/ComposeDialog.tsx
635
+ msgid "Couldn't reach the server. Try again."
636
+ msgstr "Couldn't reach the server. Try again."
637
+
564
638
  #. @context: Toast when save fails
565
639
  #: src/ui/shared/collection-management-labels.ts
566
640
  msgid "Couldn't save. Try again in a moment."
567
641
  msgstr "Couldn't save. Try again in a moment."
568
642
 
643
+ #. @context: Smart collection dialog while the count is loading
644
+ #: src/ui/shared/smart-collection-labels.ts
645
+ msgid "Counting…"
646
+ msgstr "Counting…"
647
+
569
648
  #. @context: Compose collection combobox empty state when no collections exist
570
649
  #: src/ui/compose/ComposeDialog.tsx
571
650
  msgid "Create a collection to get started."
572
651
  msgstr "Create a collection to get started."
573
652
 
574
- #. @context: Setup page description
575
- #: src/routes/auth/setup.tsx
576
- msgid "Create your admin account."
577
- msgstr "Create your admin account."
578
-
579
653
  #. @context: Thread item label on sample page
580
654
  #: src/ui/pages/ThemeSamplePage.tsx
581
655
  msgid "Current post"
@@ -626,7 +700,9 @@ msgid "Default preview image for social shares and link unfurls."
626
700
  msgstr "Default preview image for social shares and link unfurls."
627
701
 
628
702
  #. @context: Delete collection action
703
+ #. @context: Destructive menu item on a smart collection's row and page. The row says which one; the confirmation names what is lost.
629
704
  #: src/ui/shared/collection-management-labels.ts
705
+ #: src/ui/shared/smart-collection-labels.ts
630
706
  msgid "Delete"
631
707
  msgstr "Delete"
632
708
 
@@ -660,6 +736,11 @@ msgstr "Delete table"
660
736
  msgid "Delete this collection permanently? Threads inside won't be removed."
661
737
  msgstr "Delete this collection permanently? Threads inside won't be removed."
662
738
 
739
+ #. @context: Confirmation before deleting a smart collection, naming what is lost
740
+ #: src/ui/shared/smart-collection-labels.ts
741
+ msgid "Delete this smart collection? Its link stops working."
742
+ msgstr "Delete this smart collection? Its link stops working."
743
+
663
744
  #. @context: Hint shown on signin page when demo credentials are pre-filled
664
745
  #: src/routes/auth/signin.tsx
665
746
  msgid "Demo credentials are pre-filled — hit Sign In to continue."
@@ -670,6 +751,11 @@ msgstr "Demo credentials are pre-filled — hit Sign In to continue."
670
751
  msgid "Describe this for people with visual impairments..."
671
752
  msgstr "Describe this for people with visual impairments..."
672
753
 
754
+ #. @context: Smart collection dialog field
755
+ #: src/ui/shared/smart-collection-labels.ts
756
+ msgid "Description"
757
+ msgstr "Description"
758
+
673
759
  #. @context: Collection form field
674
760
  #. @context: Field label for a custom collections link description
675
761
  #: src/ui/shared/collection-management-labels.ts
@@ -691,6 +777,11 @@ msgstr "Design"
691
777
  msgid "Designing a calmer default accent for Jant"
692
778
  msgstr "Designing a calmer default accent for Jant"
693
779
 
780
+ #. @context: Compose language option that leaves detection to Jant
781
+ #: src/ui/compose/ComposeDialog.tsx
782
+ msgid "Detect"
783
+ msgstr "Detect"
784
+
694
785
  #. @context: Confirm close action sheet - discard changes button for editing published post
695
786
  #. @context: More menu - discard post
696
787
  #: src/ui/compose/ComposeDialog.tsx
@@ -703,6 +794,11 @@ msgstr "Discard"
703
794
  msgid "Discard changes?"
704
795
  msgstr "Discard changes?"
705
796
 
797
+ #. @context: Smart collection dialog section heading
798
+ #: src/ui/shared/smart-collection-labels.ts
799
+ msgid "Display"
800
+ msgstr "Display"
801
+
706
802
  #. @context: Label for a divider item while organizing collections
707
803
  #: src/ui/shared/CollectionsManager.tsx
708
804
  msgid "Divider"
@@ -818,14 +914,15 @@ msgid "Drag collections, links, and dividers into the order you want."
818
914
  msgstr "Drag collections, links, and dividers into the order you want."
819
915
 
820
916
  #. @context: Per-collection edit action
821
- #. @context: Per-collection edit action
822
- #. @context: Per-collection edit action
823
- #: src/ui/pages/CollectionEditorPage.tsx
824
- #: src/ui/pages/CollectionEditorPage.tsx
825
917
  #: src/ui/shared/collection-management-labels.ts
826
918
  msgid "Edit"
827
919
  msgstr "Edit"
828
920
 
921
+ #. @context: Title of the dialog that edits an existing collection
922
+ #: src/ui/shared/collection-management-labels.ts
923
+ msgid "Edit Collection"
924
+ msgstr "Edit Collection"
925
+
829
926
  #. @context: Compose action to reopen the custom link field from the action row summary
830
927
  #: src/ui/compose/ComposeDialog.tsx
831
928
  msgid "Edit custom link"
@@ -856,6 +953,11 @@ msgstr "Edit post"
856
953
  msgid "Edit publish date"
857
954
  msgstr "Edit publish date"
858
955
 
956
+ #. @context: Dialog title when editing an existing smart collection
957
+ #: src/ui/shared/smart-collection-labels.ts
958
+ msgid "Edit Smart Collection"
959
+ msgstr "Edit Smart Collection"
960
+
859
961
  #. @context: Marker above the composer when changing a post that is already published
860
962
  #: src/ui/compose/ComposeDialog.tsx
861
963
  msgid "Editing"
@@ -867,8 +969,6 @@ msgid "Editorial interfaces worth borrowing from"
867
969
  msgstr "Editorial interfaces worth borrowing from"
868
970
 
869
971
  #. @context: Setup/signin form field - email
870
- #. @context: Setup/signin form field - email
871
- #: src/routes/auth/setup.tsx
872
972
  #: src/routes/auth/signin.tsx
873
973
  msgid "Email"
874
974
  msgstr "Email"
@@ -888,6 +988,11 @@ msgstr "Enter a valid date."
888
988
  msgid "Enter a valid URL starting with http://, https://, or mailto:."
889
989
  msgstr "Enter a valid URL starting with http://, https://, or mailto:."
890
990
 
991
+ #. @context: Subscribe page description of the full archive feed. Says what it adds over the other two rather than sounding like the default pick.
992
+ #: src/routes/pages/subscribe.tsx
993
+ msgid "Every published post, including those kept off the home page."
994
+ msgstr "Every published post, including those kept off the home page."
995
+
891
996
  #. @context: Usage label for the brand pack card
892
997
  #: src/ui/pages/BrandPage.tsx
893
998
  msgid "Everything in one download"
@@ -917,9 +1022,11 @@ msgstr "Favicon"
917
1022
  #. @context: Browser page title for the featured feed
918
1023
  #. @context: Inactive browse tab label on sample page
919
1024
  #. @context: Page heading for the featured posts feed
1025
+ #. @context: Subscribe page name for the featured posts feed
920
1026
  #. @context: Tooltip and screen reader label for the featured-post icon in the post footer when no featured date is available
1027
+ #: src/lib/filter-dimensions.ts
921
1028
  #: src/routes/pages/featured.tsx
922
- #: src/ui/pages/ArchivePage.tsx
1029
+ #: src/routes/pages/subscribe.tsx
923
1030
  #: src/ui/pages/FeaturedPage.tsx
924
1031
  #: src/ui/pages/ThemeSamplePage.tsx
925
1032
  #: src/ui/shared/PostFooter.tsx
@@ -944,11 +1051,10 @@ msgstr "Featured on {date} at {time}"
944
1051
  msgid "Featured posts"
945
1052
  msgstr "Featured posts"
946
1053
 
947
- #. @context: Built-in navigation label for feed
948
- #: src/ui/shared/navigation-labels.ts
949
- msgctxt "nav"
950
- msgid "Feed"
951
- msgstr "Feed"
1054
+ #. @context: Toast after copying a feed URL to the clipboard
1055
+ #: src/ui/pages/SubscribePage.tsx
1056
+ msgid "Feed URL copied."
1057
+ msgstr "Feed URL copied."
952
1058
 
953
1059
  #. @context: Search snippet suffix on sample page
954
1060
  #: src/ui/pages/ThemeSamplePage.tsx
@@ -981,15 +1087,25 @@ msgid "File uploaded."
981
1087
  msgstr "File uploaded."
982
1088
 
983
1089
  #. @context: Archive media filter - files/documents
984
- #: src/ui/pages/ArchivePage.tsx
1090
+ #: src/lib/filter-dimensions.ts
985
1091
  msgid "Files"
986
1092
  msgstr "Files"
987
1093
 
1094
+ #. @context: Smart collection layout option — use the site's configured archive layout
1095
+ #: src/ui/shared/smart-collection-labels.ts
1096
+ msgid "Follow site default"
1097
+ msgstr "Follow site default"
1098
+
988
1099
  #. @context: Paragraph mentioning code on the sample detail article
989
1100
  #: src/ui/pages/ThemeSamplePage.tsx
990
1101
  msgid "For the same reason, inline code should stay neutral. Something like theme.siteAccent = soften(green, 12%) should not suddenly become the loudest thing on the page."
991
1102
  msgstr "For the same reason, inline code should stay neutral. Something like theme.siteAccent = soften(green, 12%) should not suddenly become the loudest thing on the page."
992
1103
 
1104
+ #. @context: Post filter dimension name - note, link, or quote
1105
+ #: src/lib/filter-dimensions.ts
1106
+ msgid "Format"
1107
+ msgstr "Format"
1108
+
993
1109
  #. @context: Compose dialog - open fullscreen editor
994
1110
  #: src/ui/compose/ComposeDialog.tsx
995
1111
  msgid "Fullscreen"
@@ -1010,6 +1126,11 @@ msgstr "Generating a link..."
1010
1126
  msgid "Give it a title..."
1011
1127
  msgstr "Give it a title..."
1012
1128
 
1129
+ #. @context: Smart collection layout option
1130
+ #: src/ui/shared/smart-collection-labels.ts
1131
+ msgid "Grid"
1132
+ msgstr "Grid"
1133
+
1013
1134
  #. @context: Table cell in the sample detail article
1014
1135
  #: src/ui/pages/ThemeSamplePage.tsx
1015
1136
  msgid "Guide the eye without taking over the layout."
@@ -1037,19 +1158,31 @@ msgstr "Helps screen readers describe the image"
1037
1158
 
1038
1159
  #. @context: Archive visibility filter for posts hidden from Latest
1039
1160
  #. @context: Compose publish settings visibility option
1161
+ #: src/lib/filter-dimensions.ts
1040
1162
  #: src/ui/compose/ComposeDialog.tsx
1041
- #: src/ui/pages/ArchivePage.tsx
1042
1163
  msgid "Hidden from Latest"
1043
1164
  msgstr "Hidden from Latest"
1044
1165
 
1166
+ #. @context: Button that folds away the original while writing its translation. Sits right after the words “Translating into …”, which is what makes it clear what gets hidden — the accessible name spells it out
1167
+ #: src/ui/compose/ComposeDialog.tsx
1168
+ msgid "Hide"
1169
+ msgstr "Hide"
1170
+
1045
1171
  #. @context: Compose dropdown option for hiding a post from the Latest view
1046
1172
  #: src/ui/compose/ComposeDialog.tsx
1047
1173
  msgid "Hide from Latest"
1048
1174
  msgstr "Hide from Latest"
1049
1175
 
1176
+ #. @context: Accessible name of the button that folds away the post being translated
1177
+ #: src/ui/compose/ComposeDialog.tsx
1178
+ msgid "Hide the original"
1179
+ msgstr "Hide the original"
1180
+
1181
+ #. @context: Collection sort order option
1050
1182
  #. @context: Collection sort order option
1051
1183
  #. @context: Collection sort order option
1052
1184
  #: src/ui/pages/CollectionPage.tsx
1185
+ #: src/ui/pages/SmartCollectionPage.tsx
1053
1186
  #: src/ui/shared/collection-management-labels.ts
1054
1187
  msgid "Highest rated"
1055
1188
  msgstr "Highest rated"
@@ -1080,7 +1213,7 @@ msgid "Image unavailable"
1080
1213
  msgstr "Image unavailable"
1081
1214
 
1082
1215
  #. @context: Archive media filter - images
1083
- #: src/ui/pages/ArchivePage.tsx
1216
+ #: src/lib/filter-dimensions.ts
1084
1217
  msgid "Images"
1085
1218
  msgstr "Images"
1086
1219
 
@@ -1146,6 +1279,11 @@ msgstr "Jant looks best when the accent feels editorial. Buttons can stay sturdy
1146
1279
  msgid "Journal"
1147
1280
  msgstr "Journal"
1148
1281
 
1282
+ #. @context: Confirm close action sheet - dismiss the sheet and return to the editor. Says what it does rather than 'Cancel', which the composer already spends on leaving.
1283
+ #: src/ui/compose/ComposeDialog.tsx
1284
+ msgid "Keep editing"
1285
+ msgstr "Keep editing"
1286
+
1149
1287
  #. @context: Guidance title on the brand asset page
1150
1288
  #: src/ui/pages/BrandPage.tsx
1151
1289
  msgid "Keep the artwork unchanged."
@@ -1166,6 +1304,20 @@ msgstr "Label"
1166
1304
  msgid "Label (optional)"
1167
1305
  msgstr "Label (optional)"
1168
1306
 
1307
+ #. @context: Accessible label for the site language switcher
1308
+ #. @context: Compose field for the post's content language
1309
+ #: src/ui/compose/ComposeDialog.tsx
1310
+ #: src/ui/layouts/SiteLayout.tsx
1311
+ msgid "Language"
1312
+ msgstr "Language"
1313
+
1314
+ #. @context: Accessible label for the site language switcher when it names the language on screen
1315
+ #. @context: Accessible name of the composer's language button, which sits beside Post and names the language this post would publish in
1316
+ #: src/ui/compose/ComposeDialog.tsx
1317
+ #: src/ui/layouts/SiteLayout.tsx
1318
+ msgid "Language: {language}"
1319
+ msgstr "Language: {language}"
1320
+
1169
1321
  #. @context: Tooltip text for the timestamp on an unpublished draft
1170
1322
  #: src/ui/shared/PostFooter.tsx
1171
1323
  msgid "Last edited on {date} at {time}"
@@ -1174,7 +1326,9 @@ msgstr "Last edited on {date} at {time}"
1174
1326
  #. @context: Active browse tab label on sample page
1175
1327
  #. @context: Browser page title for the latest feed
1176
1328
  #. @context: Page heading for the latest posts feed
1329
+ #. @context: Subscribe page name for the latest public posts feed
1177
1330
  #: src/routes/pages/home.tsx
1331
+ #: src/routes/pages/subscribe.tsx
1178
1332
  #: src/ui/pages/HomePage.tsx
1179
1333
  #: src/ui/pages/ThemeSamplePage.tsx
1180
1334
  msgid "Latest"
@@ -1193,6 +1347,13 @@ msgstr "Latest"
1193
1347
  msgid "Latest posts"
1194
1348
  msgstr "Latest posts"
1195
1349
 
1350
+ #. @context: Archive grid/list toggle group label
1351
+ #. @context: Smart collection dialog field
1352
+ #: src/ui/pages/ArchivePage.tsx
1353
+ #: src/ui/shared/smart-collection-labels.ts
1354
+ msgid "Layout"
1355
+ msgstr "Layout"
1356
+
1196
1357
  #. @context: Compose publish settings slug help text
1197
1358
  #: src/ui/compose/ComposeDialog.tsx
1198
1359
  msgid "Leave blank to generate one automatically."
@@ -1229,35 +1390,13 @@ msgstr "Link added."
1229
1390
  msgid "Link removed."
1230
1391
  msgstr "Link removed."
1231
1392
 
1232
- #. @context: Description for the featured system navigation toggle
1233
- #: src/ui/shared/navigation-labels.ts
1234
- msgid "Link to posts you've marked as featured."
1235
- msgstr "Link to posts you've marked as featured."
1236
-
1237
- #. @context: Description for the archive system navigation toggle
1238
- #: src/ui/shared/navigation-labels.ts
1239
- msgid "Link to the post archive"
1240
- msgstr "Link to the post archive"
1241
-
1242
- #. @context: Description for the collections system navigation toggle
1243
- #: src/ui/shared/navigation-labels.ts
1244
- msgid "Link to your collections page"
1245
- msgstr "Link to your collections page"
1246
-
1247
- #. @context: Description for the latest system navigation toggle
1248
- #: src/ui/shared/navigation-labels.ts
1249
- msgid "Link to your latest posts. Your homepage shows this feed."
1250
- msgstr "Link to your latest posts. Your homepage shows this feed."
1251
-
1252
1393
  #. @context: Toast after saving a custom collections link
1253
1394
  #: src/ui/shared/collection-management-labels.ts
1254
1395
  msgid "Link updated."
1255
1396
  msgstr "Link updated."
1256
1397
 
1257
- #. @context: Archive feed title segment for link format filter
1258
1398
  #. @context: Post format label plural - links
1259
- #: src/routes/pages/archive.tsx
1260
- #: src/ui/pages/ArchivePage.tsx
1399
+ #: src/lib/filter-dimensions.ts
1261
1400
  msgid "Links"
1262
1401
  msgstr "Links"
1263
1402
 
@@ -1266,6 +1405,11 @@ msgstr "Links"
1266
1405
  msgid "Links should read clearly without glowing against the page."
1267
1406
  msgstr "Links should read clearly without glowing against the page."
1268
1407
 
1408
+ #. @context: Smart collection layout option
1409
+ #: src/ui/shared/smart-collection-labels.ts
1410
+ msgid "List"
1411
+ msgstr "List"
1412
+
1269
1413
  #. @context: Inline link label in the sample note post body
1270
1414
  #. @context: Inline link label in the sample note summary
1271
1415
  #: src/ui/pages/ThemeSamplePage.tsx
@@ -1305,6 +1449,8 @@ msgid "Look at the footer metadata last, to make sure the accent is not fighting
1305
1449
  msgstr "Look at the footer metadata last, to make sure the accent is not fighting the typography."
1306
1450
 
1307
1451
  #. @context: Feed autodiscovery title for the site's main feed
1452
+ #. @context: Subscribe page name for the site's main feed
1453
+ #: src/routes/pages/subscribe.tsx
1308
1454
  #: src/ui/layouts/BaseLayout.tsx
1309
1455
  msgid "Main feed"
1310
1456
  msgstr "Main feed"
@@ -1315,6 +1461,8 @@ msgid "March 15"
1315
1461
  msgstr "March 15"
1316
1462
 
1317
1463
  #. @context: Compose toolbar - media tooltip
1464
+ #. @context: Post filter dimension name - attached media
1465
+ #: src/lib/filter-dimensions.ts
1318
1466
  #: src/ui/compose/ComposeDialog.tsx
1319
1467
  msgid "Media"
1320
1468
  msgstr "Media"
@@ -1342,6 +1490,16 @@ msgstr "More actions"
1342
1490
  msgid "More options are available after you create it."
1343
1491
  msgstr "More options are available after you create it."
1344
1492
 
1493
+ #. @context: Button that moves an attachment one place toward the start in compose
1494
+ #: src/ui/compose/ComposeDialog.tsx
1495
+ msgid "Move attachment earlier"
1496
+ msgstr "Move attachment earlier"
1497
+
1498
+ #. @context: Button that moves an attachment one place toward the end in compose
1499
+ #: src/ui/compose/ComposeDialog.tsx
1500
+ msgid "Move attachment later"
1501
+ msgstr "Move attachment later"
1502
+
1345
1503
  #. @context: Secondary badge label on sample page
1346
1504
  #. @context: Token label on sample page
1347
1505
  #: src/ui/pages/ThemeSamplePage.tsx
@@ -1360,10 +1518,8 @@ msgid "Navigation and reading states"
1360
1518
  msgstr "Navigation and reading states"
1361
1519
 
1362
1520
  #. @context: Button to create a collection from collections page
1363
- #. @context: Page title for new collection
1364
- #. @context: Page title for new collection
1365
- #: src/ui/pages/CollectionEditorPage.tsx
1366
- #: src/ui/pages/CollectionEditorPage.tsx
1521
+ #. @context: Title of the dialog that creates a collection
1522
+ #: src/ui/shared/collection-management-labels.ts
1367
1523
  #: src/ui/shared/CollectionsManager.tsx
1368
1524
  msgid "New Collection"
1369
1525
  msgstr "New Collection"
@@ -1394,14 +1550,21 @@ msgstr "New Password"
1394
1550
  msgid "New post"
1395
1551
  msgstr "New post"
1396
1552
 
1553
+ #. @context: Menu item on the collections page that opens the smart collection dialog
1554
+ #: src/ui/shared/smart-collection-labels.ts
1555
+ msgid "New Smart Collection"
1556
+ msgstr "New Smart Collection"
1557
+
1397
1558
  #. @context: Archive page meta note explaining the active sort order
1398
1559
  #: src/ui/pages/ArchivePage.tsx
1399
1560
  msgid "newest changes first"
1400
1561
  msgstr "newest changes first"
1401
1562
 
1563
+ #. @context: Collection sort order option
1402
1564
  #. @context: Collection sort order option
1403
1565
  #. @context: Collection sort order option
1404
1566
  #: src/ui/pages/CollectionPage.tsx
1567
+ #: src/ui/pages/SmartCollectionPage.tsx
1405
1568
  #: src/ui/shared/collection-management-labels.ts
1406
1569
  msgid "Newest first"
1407
1570
  msgstr "Newest first"
@@ -1429,6 +1592,11 @@ msgstr "No collections match that search. Try a different name."
1429
1592
  msgid "No collections yet. Start one to organize threads by topic."
1430
1593
  msgstr "No collections yet. Start one to organize threads by topic."
1431
1594
 
1595
+ #. @context: Smart collection dialog with no conditions set
1596
+ #: src/ui/shared/smart-collection-labels.ts
1597
+ msgid "No conditions yet. Add one to choose what lands here."
1598
+ msgstr "No conditions yet. Add one to choose what lands here."
1599
+
1432
1600
  #. @context: Drafts panel empty state
1433
1601
  #: src/ui/compose/ComposeDialog.tsx
1434
1602
  msgid "No drafts yet. Save a draft to find it here."
@@ -1449,6 +1617,11 @@ msgstr "No results. Try different keywords."
1449
1617
  msgid "No threads match these filters. Try adjusting your selection or clear all filters."
1450
1618
  msgstr "No threads match these filters. Try adjusting your selection or clear all filters."
1451
1619
 
1620
+ #. @context: Help text under the compose language field before there is enough writing to read a language out of; {language} is the one it would publish in meanwhile, which is the language of the page the composer was opened from
1621
+ #: src/ui/compose/ComposeDialog.tsx
1622
+ msgid "Not enough text to tell yet — publishes in {language}"
1623
+ msgstr "Not enough text to tell yet — publishes in {language}"
1624
+
1452
1625
  #. @context: Action to dismiss the post-create Collection navigation prompt
1453
1626
  #: src/ui/shared/CollectionsManager.tsx
1454
1627
  msgid "Not now"
@@ -1468,10 +1641,8 @@ msgstr "Note"
1468
1641
  msgid "note treatment"
1469
1642
  msgstr "note treatment"
1470
1643
 
1471
- #. @context: Archive feed title segment for note format filter
1472
1644
  #. @context: Post format label plural - notes
1473
- #: src/routes/pages/archive.tsx
1474
- #: src/ui/pages/ArchivePage.tsx
1645
+ #: src/lib/filter-dimensions.ts
1475
1646
  msgid "Notes"
1476
1647
  msgstr "Notes"
1477
1648
 
@@ -1480,23 +1651,45 @@ msgstr "Notes"
1480
1651
  msgid "Nothing here yet. Add threads to one of these collections to fill this view."
1481
1652
  msgstr "Nothing here yet. Add threads to one of these collections to fill this view."
1482
1653
 
1654
+ #. @context: Empty state when a collection has no posts in the language being browsed
1655
+ #: src/ui/pages/CollectionPage.tsx
1656
+ msgid "Nothing in {language} here yet."
1657
+ msgstr "Nothing in {language} here yet."
1658
+
1483
1659
  #. @context: Empty state message on featured page
1484
1660
  #: src/ui/pages/FeaturedPage.tsx
1485
1661
  msgid "Nothing in Featured yet. Mark a post as featured to show it here."
1486
1662
  msgstr "Nothing in Featured yet. Mark a post as featured to show it here."
1487
1663
 
1664
+ #. @context: Smart collection page when no post matches
1665
+ #: src/ui/shared/smart-collection-labels.ts
1666
+ msgid "Nothing matches these conditions yet."
1667
+ msgstr "Nothing matches these conditions yet."
1668
+
1488
1669
  #. @context: Value shown on a post's date control when it will publish at the current time
1489
1670
  #: src/ui/compose/ComposeDialog.tsx
1490
1671
  msgid "Now"
1491
1672
  msgstr "Now"
1492
1673
 
1674
+ #. @context: Archive page count when a filter narrows the view, following the matching count — reads as '42 of 1,240 threads'
1675
+ #: src/ui/pages/ArchivePage.tsx
1676
+ msgid "of {total} {unit}"
1677
+ msgstr "of {total} {unit}"
1678
+
1679
+ #. @context: Collection sort order option
1493
1680
  #. @context: Collection sort order option
1494
1681
  #. @context: Collection sort order option
1495
1682
  #: src/ui/pages/CollectionPage.tsx
1683
+ #: src/ui/pages/SmartCollectionPage.tsx
1496
1684
  #: src/ui/shared/collection-management-labels.ts
1497
1685
  msgid "Oldest first"
1498
1686
  msgstr "Oldest first"
1499
1687
 
1688
+ #. @context: Subscribe page description of the featured posts feed
1689
+ #: src/routes/pages/subscribe.tsx
1690
+ msgid "Only the posts marked as featured."
1691
+ msgstr "Only the posts marked as featured."
1692
+
1500
1693
  #. @context: Compose publish settings help text for private visibility
1501
1694
  #: src/ui/compose/ComposeDialog.tsx
1502
1695
  msgid "Only visible when signed in."
@@ -1532,6 +1725,21 @@ msgstr "Open raw PNG"
1532
1725
  msgid "Open raw SVG"
1533
1726
  msgstr "Open raw SVG"
1534
1727
 
1728
+ #. @context: Tooltip on the source post link above the compose editor while writing a translation
1729
+ #: src/ui/compose/ComposeDialog.tsx
1730
+ msgid "Open the original in a new tab"
1731
+ msgstr "Open the original in a new tab"
1732
+
1733
+ #. @context: Tooltip on the subscribe page feed names, which link to the page whose posts that feed carries
1734
+ #: src/ui/pages/SubscribePage.tsx
1735
+ msgid "Open the page this feed carries"
1736
+ msgstr "Open the page this feed carries"
1737
+
1738
+ #. @context: Collection editing dialog field
1739
+ #: src/ui/shared/collection-management-labels.ts
1740
+ msgid "Order by"
1741
+ msgstr "Order by"
1742
+
1535
1743
  #. @context: Menu action to organize collections
1536
1744
  #: src/ui/shared/CollectionsManager.tsx
1537
1745
  msgid "Organize"
@@ -1543,8 +1751,6 @@ msgid "Outline"
1543
1751
  msgstr "Outline"
1544
1752
 
1545
1753
  #. @context: Setup/signin form field - password
1546
- #. @context: Setup/signin form field - password
1547
- #: src/routes/auth/setup.tsx
1548
1754
  #: src/routes/auth/signin.tsx
1549
1755
  msgid "Password"
1550
1756
  msgstr "Password"
@@ -1595,6 +1801,11 @@ msgstr "Post hidden"
1595
1801
  msgid "Post privately"
1596
1802
  msgstr "Post privately"
1597
1803
 
1804
+ #. @context: Smart collection dialog — conditions are combined with AND
1805
+ #: src/ui/shared/smart-collection-labels.ts
1806
+ msgid "Posts matching all of these"
1807
+ msgstr "Posts matching all of these"
1808
+
1598
1809
  #. @context: Hover hint for the homepage compose shortcut
1599
1810
  #: src/ui/compose/ComposePrompt.tsx
1600
1811
  msgid "Press N to write"
@@ -1639,16 +1850,16 @@ msgstr "Primary logo files"
1639
1850
  #. @context: Archive visibility filter - private posts
1640
1851
  #. @context: Compose publish settings visibility option
1641
1852
  #. @context: Post status badge for a private post
1853
+ #: src/lib/filter-dimensions.ts
1642
1854
  #: src/ui/compose/ComposeDialog.tsx
1643
1855
  #: src/ui/feed/PostStatusBadges.tsx
1644
- #: src/ui/pages/ArchivePage.tsx
1645
1856
  msgid "Private"
1646
1857
  msgstr "Private"
1647
1858
 
1648
1859
  #. @context: Archive visibility filter - public posts
1649
1860
  #. @context: Compose publish settings visibility option
1861
+ #: src/lib/filter-dimensions.ts
1650
1862
  #: src/ui/compose/ComposeDialog.tsx
1651
- #: src/ui/pages/ArchivePage.tsx
1652
1863
  msgid "Public"
1653
1864
  msgstr "Public"
1654
1865
 
@@ -1681,6 +1892,11 @@ msgstr "Published on {date} at {time}"
1681
1892
  msgid "Published!"
1682
1893
  msgstr "Published!"
1683
1894
 
1895
+ #. @context: Toast shown while a post is being published
1896
+ #: src/ui/compose/ComposeDialog.tsx
1897
+ msgid "Publishing..."
1898
+ msgstr "Publishing..."
1899
+
1684
1900
  #. @context: Search highlight text on sample page
1685
1901
  #: src/ui/pages/ThemeSamplePage.tsx
1686
1902
  msgid "quiet design"
@@ -1708,11 +1924,9 @@ msgstr "Quote"
1708
1924
  msgid "Quoted or highlighted passages should feel like annotations, not warnings."
1709
1925
  msgstr "Quoted or highlighted passages should feel like annotations, not warnings."
1710
1926
 
1711
- #. @context: Archive feed title segment for quote format filter
1712
1927
  #. @context: Placeholder for the custom collections link label
1713
1928
  #. @context: Post format label plural - quotes
1714
- #: src/routes/pages/archive.tsx
1715
- #: src/ui/pages/ArchivePage.tsx
1929
+ #: src/lib/filter-dimensions.ts
1716
1930
  #: src/ui/shared/collection-management-labels.ts
1717
1931
  msgid "Quotes"
1718
1932
  msgstr "Quotes"
@@ -1722,6 +1936,21 @@ msgstr "Quotes"
1722
1936
  msgid "Rate"
1723
1937
  msgstr "Rate"
1724
1938
 
1939
+ #. @context: Help text under the compose language field
1940
+ #: src/ui/compose/ComposeDialog.tsx
1941
+ msgid "Read from what you write"
1942
+ msgstr "Read from what you write"
1943
+
1944
+ #. @context: Help text under the compose language field once a language has been detected
1945
+ #: src/ui/compose/ComposeDialog.tsx
1946
+ msgid "Read from what you write — looks like {language}"
1947
+ msgstr "Read from what you write — looks like {language}"
1948
+
1949
+ #. @context: Link out of an empty language view of a collection
1950
+ #: src/ui/pages/CollectionPage.tsx
1951
+ msgid "Read it in {language}"
1952
+ msgstr "Read it in {language}"
1953
+
1725
1954
  #. @context: Collapse an expanded untitled note back to its preview in the feed
1726
1955
  #: src/ui/feed/NoteCard.tsx
1727
1956
  msgid "Read less"
@@ -1762,6 +1991,11 @@ msgstr "References"
1762
1991
  msgid "Remove attachment"
1763
1992
  msgstr "Remove attachment"
1764
1993
 
1994
+ #. @context: Smart collection dialog condition row button
1995
+ #: src/ui/shared/smart-collection-labels.ts
1996
+ msgid "Remove condition"
1997
+ msgstr "Remove condition"
1998
+
1765
1999
  #. @context: Tooltip for divider delete button
1766
2000
  #: src/ui/shared/CollectionsManager.tsx
1767
2001
  msgid "Remove Divider"
@@ -1783,6 +2017,8 @@ msgid "Replace image"
1783
2017
  msgstr "Replace image"
1784
2018
 
1785
2019
  #. @context: Archive tile label for multiple thread replies
2020
+ #. @context: Post filter dimension name - whether a thread has replies
2021
+ #: src/lib/filter-dimensions.ts
1786
2022
  #: src/ui/pages/ArchivePage.tsx
1787
2023
  msgid "Replies"
1788
2024
  msgstr "Replies"
@@ -1826,8 +2062,18 @@ msgstr "Reset Password"
1826
2062
  msgid "Reverse logo"
1827
2063
  msgstr "Reverse logo"
1828
2064
 
2065
+ #. @context: Built-in navigation label for the feed. Keep the acronym in every locale — it is what readers scan for. The document /feed serves is Atom, but RSS is the category name readers and feed apps use, and it matches the vocabulary the rest of the product already speaks (systemKey `rss`, `mainRssFeed`). 'Feed' would collide with Featured/Latest/All, which are feeds too.
2066
+ #: src/ui/shared/navigation-labels.ts
2067
+ msgctxt "nav"
2068
+ msgid "RSS"
2069
+ msgstr "RSS"
2070
+
2071
+ #. @context: Tooltip for the RSS feed icon beside a collection in the collections directory
2072
+ #. @context: Tooltip for the RSS feed link on a collection page
1829
2073
  #. @context: Tooltip for the RSS feed link on a collection page
1830
2074
  #: src/ui/pages/CollectionPage.tsx
2075
+ #: src/ui/pages/SmartCollectionPage.tsx
2076
+ #: src/ui/shared/CollectionDirectory.tsx
1831
2077
  msgid "RSS feed"
1832
2078
  msgstr "RSS feed"
1833
2079
 
@@ -1885,6 +2131,11 @@ msgstr "Save to drafts to edit and post at a later time."
1885
2131
  msgid "Save to drafts?"
1886
2132
  msgstr "Save to drafts?"
1887
2133
 
2134
+ #. @context: Toast shown while a draft or an edited post is being saved
2135
+ #: src/ui/compose/ComposeDialog.tsx
2136
+ msgid "Saving..."
2137
+ msgstr "Saving..."
2138
+
1888
2139
  #. @context: Search page title
1889
2140
  #. @context: Search submit button
1890
2141
  #: src/ui/pages/SearchPage.tsx
@@ -1924,6 +2175,11 @@ msgstr "Settings"
1924
2175
  msgid "Shared links"
1925
2176
  msgstr "Shared links"
1926
2177
 
2178
+ #. @context: Button that brings back the folded-away original while writing its translation
2179
+ #: src/ui/compose/ComposeDialog.tsx
2180
+ msgid "Show"
2181
+ msgstr "Show"
2182
+
1927
2183
  #. @context: Archive view option - grid
1928
2184
  #: src/ui/pages/ArchivePage.tsx
1929
2185
  msgid "Show as a grid of tiles"
@@ -1952,10 +2208,10 @@ msgstr "Show less"
1952
2208
  msgid "Show more"
1953
2209
  msgstr "Show more"
1954
2210
 
1955
- #. @context: Description for the settings system navigation toggle
1956
- #: src/ui/shared/navigation-labels.ts
1957
- msgid "Shows 'Settings' when logged in, 'Sign in' when logged out"
1958
- msgstr "Shows 'Settings' when logged in, 'Sign in' when logged out"
2211
+ #. @context: Accessible name of the button that brings back the folded-away post being translated
2212
+ #: src/ui/compose/ComposeDialog.tsx
2213
+ msgid "Show the original"
2214
+ msgstr "Show the original"
1959
2215
 
1960
2216
  #. @context: Built-in navigation label shown when auth is required
1961
2217
  #: src/ui/shared/navigation-labels.ts
@@ -1977,12 +2233,9 @@ msgstr "Sign In"
1977
2233
  msgid "Sign in to start writing."
1978
2234
  msgstr "Sign in to start writing."
1979
2235
 
1980
- #. @context: Archive feed title segment for hasReplies=0 filter
1981
- #: src/routes/pages/archive.tsx
1982
- msgid "single posts"
1983
- msgstr "single posts"
1984
-
1985
2236
  #. @context: Archive thread filter - posts without replies
2237
+ #. @context: Archive thread filter - posts without replies
2238
+ #: src/lib/filter-dimensions.ts
1986
2239
  #: src/ui/pages/ArchivePage.tsx
1987
2240
  msgid "Single posts"
1988
2241
  msgstr "Single posts"
@@ -1992,16 +2245,28 @@ msgstr "Single posts"
1992
2245
  msgid "Site accent"
1993
2246
  msgstr "Site accent"
1994
2247
 
1995
- #. @context: Setup form field - site name
1996
- #: src/routes/auth/setup.tsx
1997
- msgid "Site Name"
1998
- msgstr "Site Name"
1999
-
2000
2248
  #. @context: Description for the favicon asset card
2001
2249
  #: src/ui/pages/BrandPage.tsx
2002
2250
  msgid "Small browser icon used in tabs and bookmarks."
2003
2251
  msgstr "Small browser icon used in tabs and bookmarks."
2004
2252
 
2253
+ #. @context: Name of a collection whose members come from conditions
2254
+ #: src/ui/shared/smart-collection-labels.ts
2255
+ msgid "Smart Collection"
2256
+ msgstr "Smart Collection"
2257
+
2258
+ #. @context: Confirmation after deleting a smart collection
2259
+ #. @context: Confirmation after deleting a smart collection
2260
+ #: src/ui/pages/SmartCollectionPage.tsx
2261
+ #: src/ui/shared/CollectionsManager.tsx
2262
+ msgid "Smart collection deleted."
2263
+ msgstr "Smart collection deleted."
2264
+
2265
+ #. @context: Confirmation after saving a smart collection
2266
+ #: src/ui/shared/smart-collection-labels.ts
2267
+ msgid "Smart collection saved."
2268
+ msgstr "Smart collection saved."
2269
+
2005
2270
  #. @context: Asset keyword on the public brand asset page
2006
2271
  #: src/ui/pages/BrandPage.tsx
2007
2272
  msgid "Social preview"
@@ -2019,19 +2284,19 @@ msgstr "Some uploads failed. Saved as draft."
2019
2284
 
2020
2285
  #. @context: Fallback validation error for compose form
2021
2286
  #. @context: Fallback validation error for password reset form
2022
- #. @context: Fallback validation error for setup form
2023
2287
  #. @context: Fallback validation error for sign-in form
2024
2288
  #. @context: Fallback validation error for thread compose form
2025
2289
  #: src/routes/auth/reset.tsx
2026
- #: src/routes/auth/setup.tsx
2027
2290
  #: src/routes/auth/signin.tsx
2028
2291
  #: src/routes/compose.tsx
2029
2292
  #: src/routes/compose.tsx
2030
2293
  msgid "Something doesn't look right. Check the form and try again."
2031
2294
  msgstr "Something doesn't look right. Check the form and try again."
2032
2295
 
2296
+ #. @context: Sort menu label on collection detail page
2033
2297
  #. @context: Sort menu label on collection detail page
2034
2298
  #: src/ui/pages/CollectionPage.tsx
2299
+ #: src/ui/pages/SmartCollectionPage.tsx
2035
2300
  msgid "Sort"
2036
2301
  msgstr "Sort"
2037
2302
 
@@ -2050,11 +2315,6 @@ msgstr "Sort by when each thread was published"
2050
2315
  msgid "Sort order"
2051
2316
  msgstr "Sort order"
2052
2317
 
2053
- #. @context: Collection form field
2054
- #: src/ui/shared/collection-management-labels.ts
2055
- msgid "Sort Order"
2056
- msgstr "Sort Order"
2057
-
2058
2318
  #. @context: Compose quote source link placeholder
2059
2319
  #: src/ui/compose/ComposeDialog.tsx
2060
2320
  msgid "Source link (optional)"
@@ -2090,6 +2350,24 @@ msgstr "Start here"
2090
2350
  msgid "Stay sturdy and readable."
2091
2351
  msgstr "Stay sturdy and readable."
2092
2352
 
2353
+ #. @context: Browser page title for the subscribe page
2354
+ #. @context: Page title for the feed subscription page
2355
+ #: src/routes/pages/subscribe.tsx
2356
+ #: src/ui/pages/SubscribePage.tsx
2357
+ msgid "Subscribe"
2358
+ msgstr "Subscribe"
2359
+
2360
+ #. @context: Built-in navigation label for the page that explains the site's feeds. Names what the reader wants to do, unlike the sibling RSS entry which names the format and links at the Atom document itself.
2361
+ #: src/ui/shared/navigation-labels.ts
2362
+ msgctxt "nav"
2363
+ msgid "Subscribe"
2364
+ msgstr "Subscribe"
2365
+
2366
+ #. @context: Subscribe page note that subscribing is one-sided and how to undo it
2367
+ #: src/ui/pages/SubscribePage.tsx
2368
+ msgid "Subscribing creates no account here. To stop, delete the address from your reader."
2369
+ msgstr "Subscribing creates no account here. To stop, delete the address from your reader."
2370
+
2093
2371
  #. @context: Compose custom slug helper label for the suggested slug
2094
2372
  #: src/ui/compose/ComposeDialog.tsx
2095
2373
  msgid "Suggested link"
@@ -2144,8 +2422,8 @@ msgstr "Text"
2144
2422
 
2145
2423
  #. @context: Archive media filter - text file attachments
2146
2424
  #. @context: Attached text panel title
2425
+ #: src/lib/filter-dimensions.ts
2147
2426
  #: src/ui/compose/ComposeDialog.tsx
2148
- #: src/ui/pages/ArchivePage.tsx
2149
2427
  msgid "Text attachment"
2150
2428
  msgstr "Text attachment"
2151
2429
 
@@ -2179,11 +2457,21 @@ msgstr "The default accent works best when it reads like a fountain-pen underlin
2179
2457
  msgid "The image should sit quietly inside the article instead of feeling like a card preview."
2180
2458
  msgstr "The image should sit quietly inside the article instead of feeling like a card preview."
2181
2459
 
2460
+ #. @context: Accessible name of the scrollable panel holding the post being translated
2461
+ #: src/ui/compose/ComposeDialog.tsx
2462
+ msgid "The original"
2463
+ msgstr "The original"
2464
+
2182
2465
  #. @context: Blockquote on the theme sample page
2183
2466
  #: src/ui/pages/ThemeSamplePage.tsx
2184
2467
  msgid "The right accent should disappear into the writing until you need it."
2185
2468
  msgstr "The right accent should disappear into the writing until you need it."
2186
2469
 
2470
+ #. @context: Subscribe page description of the latest posts feed. The home page and this feed run the same query, so they carry the same posts.
2471
+ #: src/routes/pages/subscribe.tsx
2472
+ msgid "The same posts as the home page."
2473
+ msgstr "The same posts as the home page."
2474
+
2187
2475
  #. @context: Section heading for theme picker pills
2188
2476
  #: src/ui/pages/ThemeSamplePage.tsx
2189
2477
  msgid "Theme"
@@ -2206,6 +2494,11 @@ msgstr "These are actual feed components with real footers, summaries, and inlin
2206
2494
  msgid "This article is here to answer a specific question: does the default accent still feel calm once it has to carry a full reading experience?"
2207
2495
  msgstr "This article is here to answer a specific question: does the default accent still feel calm once it has to carry a full reading experience?"
2208
2496
 
2497
+ #. @context: Toast shown when the composer cannot write its local draft to browser storage
2498
+ #: src/ui/compose/ComposeDialog.tsx
2499
+ msgid "This browser can't keep a local copy. Save as a draft."
2500
+ msgstr "This browser can't keep a local copy. Save as a draft."
2501
+
2209
2502
  #. @context: Empty state message
2210
2503
  #: src/ui/pages/CollectionPage.tsx
2211
2504
  msgid "This collection is empty. Add threads from the editor."
@@ -2242,6 +2535,11 @@ msgstr "This link is already in use. Choose something else."
2242
2535
  msgid "This link is reserved. Choose something else."
2243
2536
  msgstr "This link is reserved. Choose something else."
2244
2537
 
2538
+ #. @context: Collection editing dialog — the typed collection link is already in use
2539
+ #: src/ui/shared/collection-management-labels.ts
2540
+ msgid "This link is taken. Choose another."
2541
+ msgstr "This link is taken. Choose another."
2542
+
2245
2543
  #. @context: Explanation in the draft preview status bar
2246
2544
  #: src/ui/shared/DraftPreviewBar.tsx
2247
2545
  msgid "This post isn’t published."
@@ -2262,6 +2560,11 @@ msgstr "This reset link is no longer valid. Request a new one to continue."
2262
2560
  msgid "This sign-in link has expired. Return to "
2263
2561
  msgstr "This sign-in link has expired. Return to "
2264
2562
 
2563
+ #. @context: Subscribe page introduction, above the feed addresses. States the format the site serves, then the one action to take.
2564
+ #: src/ui/pages/SubscribePage.tsx
2565
+ msgid "This site publishes Atom feeds. Copy one of these addresses into a feed reader."
2566
+ msgstr "This site publishes Atom feeds. Copy one of these addresses into a feed reader."
2567
+
2265
2568
  #. @context: Error shown when a hosted upload would exceed the shared account media limit
2266
2569
  #. @context: Error shown when a hosted upload would exceed the shared account media limit
2267
2570
  #: src/routes/api/upload-multipart.ts
@@ -2278,10 +2581,14 @@ msgstr "This uses the real single-post detail rendering with a longer article, i
2278
2581
  #. @context: Archive page summary unit for a single matching thread
2279
2582
  #. @context: Singular thread count label
2280
2583
  #. @context: Singular thread count label
2584
+ #. @context: Singular thread count label
2585
+ #. @context: Singular thread count label on collection detail page
2281
2586
  #. @context: Singular thread count label on collection detail page
2282
2587
  #: src/ui/pages/ArchivePage.tsx
2283
2588
  #: src/ui/pages/ArchivePage.tsx
2284
2589
  #: src/ui/pages/CollectionPage.tsx
2590
+ #: src/ui/pages/SmartCollectionPage.tsx
2591
+ #: src/ui/shared/CollectionDirectory.tsx
2285
2592
  #: src/ui/shared/CollectionDirectory.tsx
2286
2593
  #: src/ui/shared/CollectionsManager.tsx
2287
2594
  msgid "thread"
@@ -2297,22 +2604,26 @@ msgstr "Thread accent"
2297
2604
  msgid "Thread accents"
2298
2605
  msgstr "Thread accents"
2299
2606
 
2300
- #. @context: Archive feed title segment for hasReplies=1 filter
2301
2607
  #. @context: Archive month header count unit for multiple threads
2302
2608
  #. @context: Archive page summary unit for multiple matching threads
2303
2609
  #. @context: Plural thread count label
2304
2610
  #. @context: Plural thread count label
2611
+ #. @context: Plural thread count label
2612
+ #. @context: Plural thread count label on collection detail page
2305
2613
  #. @context: Plural thread count label on collection detail page
2306
- #: src/routes/pages/archive.tsx
2307
2614
  #: src/ui/pages/ArchivePage.tsx
2308
2615
  #: src/ui/pages/ArchivePage.tsx
2309
2616
  #: src/ui/pages/CollectionPage.tsx
2617
+ #: src/ui/pages/SmartCollectionPage.tsx
2618
+ #: src/ui/shared/CollectionDirectory.tsx
2310
2619
  #: src/ui/shared/CollectionDirectory.tsx
2311
2620
  #: src/ui/shared/CollectionsManager.tsx
2312
2621
  msgid "threads"
2313
2622
  msgstr "threads"
2314
2623
 
2315
2624
  #. @context: Archive thread filter - thread roots with replies
2625
+ #. @context: Archive thread filter - thread roots with replies
2626
+ #: src/lib/filter-dimensions.ts
2316
2627
  #: src/ui/pages/ArchivePage.tsx
2317
2628
  msgid "Threads"
2318
2629
  msgstr "Threads"
@@ -2325,14 +2636,20 @@ msgstr "Threads can include up to {count} posts."
2325
2636
  #. @context: Collection form field
2326
2637
  #. @context: Compose toolbar - show or hide the title field
2327
2638
  #. @context: Input label on sample page
2639
+ #. @context: Post filter dimension name - whether a post is titled
2640
+ #. @context: Smart collection dialog field
2641
+ #: src/lib/filter-dimensions.ts
2328
2642
  #: src/ui/compose/ComposeDialog.tsx
2329
2643
  #: src/ui/pages/ThemeSamplePage.tsx
2330
2644
  #: src/ui/shared/collection-management-labels.ts
2645
+ #: src/ui/shared/smart-collection-labels.ts
2331
2646
  msgid "Title"
2332
2647
  msgstr "Title"
2333
2648
 
2334
2649
  #. @context: Archive filter - notes that have a title
2335
2650
  #. @context: Archive filter - notes that have a title
2651
+ #. @context: Archive filter - notes that have a title
2652
+ #: src/lib/filter-dimensions.ts
2336
2653
  #: src/ui/pages/ArchivePage.tsx
2337
2654
  #: src/ui/pages/ArchivePage.tsx
2338
2655
  msgid "Titled"
@@ -2348,6 +2665,21 @@ msgstr "to make sure both still feel like they belong to the same product."
2348
2665
  msgid "Toggle header row"
2349
2666
  msgstr "Toggle header row"
2350
2667
 
2668
+ #. @context: Divider between the original post and the editor writing its translation, when the target language is not known yet
2669
+ #: src/ui/compose/ComposeDialog.tsx
2670
+ msgid "Translating"
2671
+ msgstr "Translating"
2672
+
2673
+ #. @context: Divider between the original post above and the editor below, naming the language being written
2674
+ #: src/ui/compose/ComposeDialog.tsx
2675
+ msgid "Translating into {language}"
2676
+ msgstr "Translating into {language}"
2677
+
2678
+ #. @context: Compose banner shown while writing a translation of an existing post
2679
+ #: src/ui/compose/ComposeDialog.tsx
2680
+ msgid "Translation of “{title}”"
2681
+ msgstr "Translation of “{title}”"
2682
+
2351
2683
  #. @context: Usage label for the square logo PNG asset card
2352
2684
  #: src/ui/pages/BrandPage.tsx
2353
2685
  msgid "Transparent square"
@@ -2368,9 +2700,11 @@ msgstr "Type / for commands"
2368
2700
  msgid "Type the quote..."
2369
2701
  msgstr "Type the quote..."
2370
2702
 
2703
+ #. @context: Archive filter - notes without a title
2371
2704
  #. @context: Archive filter - notes without a title
2372
2705
  #. @context: Archive filter - notes without a title
2373
2706
  #. @context: Compose note title placeholder. States what the note is while the field is empty rather than asking for a title — untitled notes are a normal kind of note here, and Archive files them under this same word.
2707
+ #: src/lib/filter-dimensions.ts
2374
2708
  #: src/ui/compose/ComposeDialog.tsx
2375
2709
  #: src/ui/pages/ArchivePage.tsx
2376
2710
  #: src/ui/pages/ArchivePage.tsx
@@ -2440,7 +2774,7 @@ msgid "Use this page to judge buttons, links, cards, forms, thread accents, and
2440
2774
  msgstr "Use this page to judge buttons, links, cards, forms, thread accents, and quiet surfaces before changing a theme globally."
2441
2775
 
2442
2776
  #. @context: Archive media filter - video
2443
- #: src/ui/pages/ArchivePage.tsx
2777
+ #: src/lib/filter-dimensions.ts
2444
2778
  msgid "Video"
2445
2779
  msgstr "Video"
2446
2780
 
@@ -2454,20 +2788,17 @@ msgstr "View"
2454
2788
  msgid "View earlier notes in this thread"
2455
2789
  msgstr "View earlier notes in this thread"
2456
2790
 
2457
- #. @context: Archive grid/list toggle group label
2458
- #: src/ui/pages/ArchivePage.tsx
2459
- msgid "View mode"
2460
- msgstr "View mode"
2461
-
2462
2791
  #. @context: Compose publish settings section label
2792
+ #. @context: Post filter dimension name - who can see a post
2793
+ #: src/lib/filter-dimensions.ts
2463
2794
  #: src/ui/compose/ComposeDialog.tsx
2464
2795
  msgid "Visibility"
2465
2796
  msgstr "Visibility"
2466
2797
 
2467
- #. @context: Setup page welcome heading
2468
- #: src/routes/auth/setup.tsx
2469
- msgid "Welcome to Jant"
2470
- msgstr "Welcome to Jant"
2798
+ #. @context: Subscribe page heading over the explanation of feed readers, for readers who have not used one
2799
+ #: src/ui/pages/SubscribePage.tsx
2800
+ msgid "What a feed reader does"
2801
+ msgstr "What a feed reader does"
2471
2802
 
2472
2803
  #. @context: Table header in the sample detail article
2473
2804
  #: src/ui/pages/ThemeSamplePage.tsx
@@ -2524,25 +2855,21 @@ msgstr "White logo on the Jant green square tile for platforms and layouts that
2524
2855
  msgid "Why the default accent should feel written, not branded"
2525
2856
  msgstr "Why the default accent should feel written, not branded"
2526
2857
 
2527
- #. @context: Archive feed title segment for hasMedia=1 filter
2528
- #: src/routes/pages/archive.tsx
2529
- msgid "with media"
2530
- msgstr "with media"
2531
-
2532
- #. @context: Archive feed title segment for hasTitle=1 filter
2533
- #: src/routes/pages/archive.tsx
2534
- msgid "with title"
2535
- msgstr "with title"
2536
-
2537
- #. @context: Archive feed title segment for hasMedia=0 filter
2538
- #: src/routes/pages/archive.tsx
2539
- msgid "without media"
2540
- msgstr "without media"
2858
+ #. @context: Archive filter - posts carrying any media attachment
2859
+ #. @context: Archive filter - posts carrying any media attachment
2860
+ #. @context: Archive filter - posts carrying any media attachment
2861
+ #: src/lib/filter-dimensions.ts
2862
+ #: src/ui/pages/ArchivePage.tsx
2863
+ #: src/ui/shared/smart-collection-labels.ts
2864
+ msgid "With media"
2865
+ msgstr "With media"
2541
2866
 
2542
- #. @context: Archive feed title segment for hasTitle=0 filter
2543
- #: src/routes/pages/archive.tsx
2544
- msgid "without title"
2545
- msgstr "without title"
2867
+ #. @context: Archive filter - posts with no media attachment
2868
+ #. @context: Archive filter - posts with no media attachment
2869
+ #: src/lib/filter-dimensions.ts
2870
+ #: src/ui/shared/smart-collection-labels.ts
2871
+ msgid "Without media"
2872
+ msgstr "Without media"
2546
2873
 
2547
2874
  #. @context: Compose publish settings hint for quiet reply switch
2548
2875
  #: src/ui/compose/ComposeDialog.tsx
@@ -2559,6 +2886,11 @@ msgstr "Write your first post to get started."
2559
2886
  msgid "Wrong email or password. Check your credentials and try again."
2560
2887
  msgstr "Wrong email or password. Check your credentials and try again."
2561
2888
 
2889
+ #. @context: Post filter dimension name - year of publication
2890
+ #: src/lib/filter-dimensions.ts
2891
+ msgid "Year"
2892
+ msgstr "Year"
2893
+
2562
2894
  #. @context: Confirm close action sheet title when editing a published post
2563
2895
  #: src/ui/compose/ComposeDialog.tsx
2564
2896
  msgid "You have unsaved changes"