@jant/core 0.6.14 → 0.6.16

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 (350) hide show
  1. package/bin/commands/import-site.js +88 -13
  2. package/bin/commands/migrate.js +55 -0
  3. package/bin/commands/posts/rebuild-html.js +184 -0
  4. package/bin/commands/site/snapshot/import.js +14 -10
  5. package/bin/lib/d1-query.js +23 -5
  6. package/bin/lib/migration-runner.js +29 -7
  7. package/bin/lib/node-database.js +32 -0
  8. package/bin/lib/site-snapshot.js +347 -46
  9. package/bin/lib/sql-export.js +1 -1
  10. package/bin/lib/thread-collection-migration.js +326 -0
  11. package/dist/app-C75Zc8dD.js +6 -0
  12. package/dist/{app-2i7-WQHg.js → app-C7_4oab9.js} +7774 -6425
  13. package/dist/client/.vite/manifest.json +8 -8
  14. package/dist/client/_assets/chunks/{url-pLre2DM_.js → url-CU9pEbk5.js} +1 -1
  15. package/dist/client/_assets/{client-BvID5ucz.js → client-Bq0vre8Y.js} +59 -38
  16. package/dist/client/_assets/client-D3VZyG4L.css +2 -0
  17. package/dist/client/_assets/client-auth-F2rb9WfF.js +5571 -0
  18. package/dist/{env-OHRKGcMj.js → env-BPYViDJJ.js} +1 -1
  19. package/dist/{export-DWn149b7.js → export-Dl5KCiEs.js} +1348 -128
  20. package/dist/{github-api-BgSiE71w.js → github-api-BNF35Lkx.js} +1 -1
  21. package/dist/{github-app-BbklkFmU.js → github-app-DdiD-bC4.js} +1 -1
  22. package/dist/{github-sync-C0zyF6XS.js → github-sync-Bqg62IvV.js} +3 -3
  23. package/dist/{github-sync-Ckk0sJxK.js → github-sync-HdK2EgvJ.js} +3 -3
  24. package/dist/index.js +5 -5
  25. package/dist/node.js +7 -7
  26. package/dist/{url-BMYO-Zlt.js → url-CbLAtlZe.js} +517 -12
  27. package/package.json +11 -10
  28. package/src/__tests__/bin/posts-rebuild-html.test.ts +137 -0
  29. package/src/__tests__/dev-navigation-defaults.test.ts +22 -0
  30. package/src/__tests__/export-hugo-build.test.ts +63 -4
  31. package/src/__tests__/export-import-roundtrip.test.ts +6 -4
  32. package/src/__tests__/export-service.test.ts +142 -9
  33. package/src/__tests__/helpers/app.ts +3 -0
  34. package/src/__tests__/helpers/export-fixtures.ts +2 -0
  35. package/src/__tests__/import-site-command.test.ts +65 -0
  36. package/src/__tests__/mise-config.test.ts +22 -0
  37. package/src/__tests__/vite-config.test.ts +45 -0
  38. package/src/app.tsx +16 -3
  39. package/src/client/__tests__/collection-created-notice.test.ts +36 -0
  40. package/src/client/__tests__/collection-form-bridge.test.ts +10 -1
  41. package/src/client/__tests__/collection-page-actions.test.ts +71 -2
  42. package/src/client/__tests__/compose-bridge.test.ts +316 -2
  43. package/src/client/__tests__/compose-shortcuts.test.ts +20 -0
  44. package/src/client/__tests__/feed-video-player.test.ts +16 -1
  45. package/src/client/__tests__/footnote-rail.test.ts +472 -0
  46. package/src/client/__tests__/hydrate-partial.test.ts +3 -0
  47. package/src/client/__tests__/toast.test.ts +82 -1
  48. package/src/client/collection-created-notice.ts +66 -0
  49. package/src/client/collection-form-bridge.ts +17 -0
  50. package/src/client/collection-navigation.ts +44 -0
  51. package/src/client/collection-page-actions.ts +57 -1
  52. package/src/client/components/__tests__/compose-format-convert.test.ts +0 -19
  53. package/src/client/components/__tests__/jant-collection-directory.test.ts +155 -6
  54. package/src/client/components/__tests__/jant-command-palette.test.ts +51 -0
  55. package/src/client/components/__tests__/jant-compose-dialog.test.ts +2268 -206
  56. package/src/client/components/__tests__/jant-compose-editor.test.ts +147 -59
  57. package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +114 -64
  58. package/src/client/components/__tests__/jant-config-editor.test.ts +405 -0
  59. package/src/client/components/__tests__/jant-media-lightbox.test.ts +121 -0
  60. package/src/client/components/__tests__/jant-nav-manager.test.ts +538 -2
  61. package/src/client/components/__tests__/jant-post-form.test.ts +2 -2
  62. package/src/client/components/__tests__/jant-post-menu.test.ts +47 -5
  63. package/src/client/components/__tests__/jant-settings-avatar.test.ts +2 -2
  64. package/src/client/components/__tests__/jant-settings-general.test.ts +3 -3
  65. package/src/client/components/collection-manager-types.ts +9 -3
  66. package/src/client/components/compose-format-convert.ts +5 -1
  67. package/src/client/components/compose-types.ts +55 -3
  68. package/src/client/components/jant-collection-directory.ts +165 -30
  69. package/src/client/components/jant-command-palette.ts +14 -7
  70. package/src/client/components/jant-compose-dialog.ts +1542 -694
  71. package/src/client/components/jant-compose-editor.ts +237 -99
  72. package/src/client/components/jant-compose-fullscreen.ts +27 -9
  73. package/src/client/components/jant-config-editor.ts +722 -0
  74. package/src/client/components/jant-media-lightbox.ts +100 -18
  75. package/src/client/components/jant-nav-manager.ts +1283 -54
  76. package/src/client/components/jant-post-form.ts +3 -3
  77. package/src/client/components/jant-post-menu.ts +177 -95
  78. package/src/client/components/nav-manager-types.ts +51 -2
  79. package/src/client/components/post-form-types.ts +1 -1
  80. package/src/client/compose-bridge.ts +147 -123
  81. package/src/client/compose-launch.ts +13 -0
  82. package/src/client/compose-shortcuts.ts +5 -1
  83. package/src/client/feed-video-player.ts +62 -2
  84. package/src/client/footnote-rail.ts +478 -0
  85. package/src/client/hydrate-partial.ts +2 -0
  86. package/src/client/media-lightbox-events.ts +63 -0
  87. package/src/client/post-refresh.ts +135 -0
  88. package/src/client/site-header-fragment.ts +38 -0
  89. package/src/client/tiptap/__tests__/blockquote-editing.test.ts +201 -0
  90. package/src/client/tiptap/__tests__/clear-formatting.test.ts +168 -0
  91. package/src/client/tiptap/__tests__/link-input-rules.test.ts +121 -0
  92. package/src/client/tiptap/__tests__/list-editing.test.ts +447 -0
  93. package/src/client/tiptap/__tests__/markdown-clipboard.test.ts +727 -4
  94. package/src/client/tiptap/__tests__/table-controls.test.ts +263 -0
  95. package/src/client/tiptap/__tests__/table-size-picker.test.ts +179 -0
  96. package/src/client/tiptap/bubble-menu.ts +88 -10
  97. package/src/client/tiptap/continuous-lists.ts +102 -0
  98. package/src/client/tiptap/create-editor.ts +3 -0
  99. package/src/client/tiptap/extensions.ts +14 -5
  100. package/src/client/tiptap/link-input-rules.ts +4 -4
  101. package/src/client/tiptap/markdown-clipboard.ts +608 -11
  102. package/src/client/tiptap/slash-commands.ts +8 -1
  103. package/src/client/tiptap/structural-keymap.ts +211 -0
  104. package/src/client/tiptap/tab-indent.ts +8 -22
  105. package/src/client/tiptap/table-control-labels.ts +30 -0
  106. package/src/client/tiptap/table-controls.ts +537 -0
  107. package/src/client/tiptap/table-size-picker.ts +254 -0
  108. package/src/client/toast.ts +133 -39
  109. package/src/client-auth.ts +1 -0
  110. package/src/client.ts +1 -0
  111. package/src/db/__tests__/backfill-thread-activity.test.ts +234 -0
  112. package/src/db/__tests__/d1-query.test.ts +43 -1
  113. package/src/db/__tests__/migration-runner.test.ts +63 -0
  114. package/src/db/__tests__/migrations.test.ts +469 -0
  115. package/src/db/__tests__/thread-activity.test.ts +113 -0
  116. package/src/db/__tests__/thread-collection-migration.test.ts +364 -0
  117. package/src/db/backfills/0005_split_thread_activity_from_quiet_replies.sql +68 -0
  118. package/src/db/migrations/0027_old_blue_blade.sql +39 -0
  119. package/src/db/migrations/0028_superb_post.sql +2 -0
  120. package/src/db/migrations/0029_boring_magma.sql +1 -0
  121. package/src/db/migrations/0030_typical_vivisector.sql +50 -0
  122. package/src/db/migrations/0031_many_ego.sql +3 -0
  123. package/src/db/migrations/meta/0027_snapshot.json +2511 -0
  124. package/src/db/migrations/meta/0028_snapshot.json +2511 -0
  125. package/src/db/migrations/meta/0029_snapshot.json +2519 -0
  126. package/src/db/migrations/meta/0030_snapshot.json +2541 -0
  127. package/src/db/migrations/meta/0031_snapshot.json +2562 -0
  128. package/src/db/migrations/meta/_journal.json +35 -0
  129. package/src/db/migrations/pg/0025_moaning_epoch.sql +39 -0
  130. package/src/db/migrations/pg/0026_talented_killer_shrike.sql +2 -0
  131. package/src/db/migrations/pg/0027_short_cannonball.sql +1 -0
  132. package/src/db/migrations/pg/0028_perfect_sharon_carter.sql +27 -0
  133. package/src/db/migrations/pg/0029_rare_hairball.sql +3 -0
  134. package/src/db/migrations/pg/meta/0025_snapshot.json +3204 -0
  135. package/src/db/migrations/pg/meta/0026_snapshot.json +3204 -0
  136. package/src/db/migrations/pg/meta/0027_snapshot.json +3211 -0
  137. package/src/db/migrations/pg/meta/0028_snapshot.json +3248 -0
  138. package/src/db/migrations/pg/meta/0029_snapshot.json +3289 -0
  139. package/src/db/migrations/pg/meta/_journal.json +35 -0
  140. package/src/db/pg/schema.ts +46 -20
  141. package/src/db/rehearsal-fixtures/demo-current.json +39 -4
  142. package/src/db/rehearsal-fixtures/demo-current.sql +121 -6
  143. package/src/db/schema.ts +48 -20
  144. package/src/db/thread-activity.ts +101 -0
  145. package/src/i18n/__tests__/detect.test.ts +8 -2
  146. package/src/i18n/detect.ts +14 -5
  147. package/src/i18n/locales/public/en.po +222 -51
  148. package/src/i18n/locales/public/en.ts +1 -1
  149. package/src/i18n/locales/public/zh-Hans.po +216 -45
  150. package/src/i18n/locales/public/zh-Hans.ts +1 -1
  151. package/src/i18n/locales/public/zh-Hant.po +216 -45
  152. package/src/i18n/locales/public/zh-Hant.ts +1 -1
  153. package/src/i18n/locales/settings/en.po +513 -10
  154. package/src/i18n/locales/settings/en.ts +1 -1
  155. package/src/i18n/locales/settings/zh-Hans.po +515 -12
  156. package/src/i18n/locales/settings/zh-Hans.ts +1 -1
  157. package/src/i18n/locales/settings/zh-Hant.po +515 -12
  158. package/src/i18n/locales/settings/zh-Hant.ts +1 -1
  159. package/src/lib/__tests__/api-settings.test.ts +299 -0
  160. package/src/lib/__tests__/constants.test.ts +5 -0
  161. package/src/lib/__tests__/feed-policy.test.ts +25 -0
  162. package/src/lib/__tests__/feed.test.ts +168 -0
  163. package/src/lib/__tests__/footnotes-upgrade.test.ts +181 -0
  164. package/src/lib/__tests__/markdown-roundtrip-embed.test.ts +61 -0
  165. package/src/lib/__tests__/markdown-to-tiptap.test.ts +32 -4
  166. package/src/lib/__tests__/markdown.test.ts +24 -6
  167. package/src/lib/__tests__/navigation.test.ts +59 -2
  168. package/src/lib/__tests__/post-body-html.test.ts +176 -0
  169. package/src/lib/__tests__/post-display.test.ts +64 -0
  170. package/src/lib/__tests__/resolve-config.test.ts +113 -1
  171. package/src/lib/__tests__/slug.test.ts +18 -0
  172. package/src/lib/__tests__/summary.test.ts +82 -0
  173. package/src/lib/__tests__/timeline.test.ts +109 -70
  174. package/src/lib/__tests__/timezones.test.ts +31 -3
  175. package/src/lib/__tests__/tiptap-render.test.ts +268 -9
  176. package/src/lib/__tests__/tiptap-to-markdown.test.ts +6 -0
  177. package/src/lib/__tests__/translit.test.ts +87 -0
  178. package/src/lib/__tests__/url.test.ts +53 -0
  179. package/src/lib/__tests__/view.test.ts +53 -0
  180. package/src/lib/__tests__/worker-response-cache.test.ts +18 -1
  181. package/src/lib/api-settings.ts +239 -12
  182. package/src/lib/collection-sort.ts +7 -5
  183. package/src/lib/constants.ts +2 -0
  184. package/src/lib/feed-path.ts +25 -0
  185. package/src/lib/feed-policy.ts +64 -0
  186. package/src/lib/feed.ts +113 -11
  187. package/src/lib/footnotes.ts +264 -0
  188. package/src/lib/github-sync-site-config.ts +2 -0
  189. package/src/lib/hugo-markdown.ts +15 -3
  190. package/src/lib/jant-branding.ts +1 -0
  191. package/src/lib/link-preview.ts +25 -0
  192. package/src/lib/markdown-manager.ts +193 -5
  193. package/src/lib/markdown.ts +10 -3
  194. package/src/lib/navigation.ts +16 -3
  195. package/src/lib/post-body-html.ts +131 -0
  196. package/src/lib/post-display.ts +47 -8
  197. package/src/lib/render.tsx +9 -2
  198. package/src/lib/resolve-config.ts +100 -16
  199. package/src/lib/schemas.ts +133 -1
  200. package/src/lib/settings-paths.ts +5 -0
  201. package/src/lib/site-skill.ts +78 -0
  202. package/src/lib/summary.ts +16 -5
  203. package/src/lib/timeline.ts +137 -131
  204. package/src/lib/timezones.ts +54 -14
  205. package/src/lib/tiptap-render.ts +359 -83
  206. package/src/lib/translit.ts +288 -0
  207. package/src/lib/url.ts +123 -12
  208. package/src/lib/view.ts +58 -20
  209. package/src/lib/worker-response-cache.ts +11 -18
  210. package/src/middleware/__tests__/public-content-access.test.ts +91 -0
  211. package/src/middleware/config.ts +2 -2
  212. package/src/middleware/public-content-access.ts +87 -0
  213. package/src/node/__tests__/cli-export.test.ts +14 -0
  214. package/src/node/__tests__/cli-migrate.test.ts +6 -0
  215. package/src/node/__tests__/cli-site-snapshot.test.ts +205 -2
  216. package/src/node/__tests__/cli-snapshot-meta.test.ts +100 -0
  217. package/src/node/index.ts +2 -1
  218. package/src/preset.css +16 -2
  219. package/src/routes/__tests__/compose.test.ts +51 -0
  220. package/src/routes/__tests__/site-skill.test.ts +112 -0
  221. package/src/routes/api/__tests__/collections.test.ts +91 -19
  222. package/src/routes/api/__tests__/mcp.test.ts +65 -1
  223. package/src/routes/api/__tests__/nav-items.test.ts +91 -0
  224. package/src/routes/api/__tests__/palette.test.ts +44 -0
  225. package/src/routes/api/__tests__/public-access.test.ts +81 -0
  226. package/src/routes/api/__tests__/settings.test.ts +217 -0
  227. package/src/routes/api/collections.ts +22 -26
  228. package/src/routes/api/export.ts +2 -0
  229. package/src/routes/api/internal/__tests__/post-body-html.test.ts +163 -0
  230. package/src/routes/api/internal/__tests__/sites.test.ts +35 -2
  231. package/src/routes/api/internal/post-body-html.ts +43 -0
  232. package/src/routes/api/internal/sites.ts +24 -0
  233. package/src/routes/api/nav-items.ts +24 -1
  234. package/src/routes/api/posts.ts +14 -10
  235. package/src/routes/api/public/__tests__/archive.test.ts +35 -0
  236. package/src/routes/api/public/__tests__/posts.test.ts +246 -0
  237. package/src/routes/api/public/archive.ts +4 -0
  238. package/src/routes/api/public/posts.ts +48 -24
  239. package/src/routes/api/search.ts +3 -0
  240. package/src/routes/api/settings.ts +33 -0
  241. package/src/routes/auth/__tests__/setup.test.ts +7 -4
  242. package/src/routes/compose.tsx +8 -3
  243. package/src/routes/dash/settings.tsx +45 -2
  244. package/src/routes/feed/__tests__/feed.test.ts +210 -6
  245. package/src/routes/feed/__tests__/sitemap.test.ts +68 -1
  246. package/src/routes/feed/feed.ts +23 -14
  247. package/src/routes/pages/__tests__/archive-params.test.ts +384 -3
  248. package/src/routes/pages/__tests__/collection-routing.test.ts +63 -5
  249. package/src/routes/pages/__tests__/collections.test.ts +9 -9
  250. package/src/routes/pages/__tests__/featured.test.ts +6 -2
  251. package/src/routes/pages/__tests__/preview.test.ts +176 -0
  252. package/src/routes/pages/__tests__/search.test.ts +69 -0
  253. package/src/routes/pages/archive.tsx +90 -22
  254. package/src/routes/pages/collection.tsx +32 -19
  255. package/src/routes/pages/collections.tsx +6 -1
  256. package/src/routes/pages/page.tsx +86 -11
  257. package/src/routes/site-skill.ts +18 -0
  258. package/src/services/__tests__/auth.test.ts +7 -5
  259. package/src/services/__tests__/collection.test.ts +190 -44
  260. package/src/services/__tests__/navigation.test.ts +229 -21
  261. package/src/services/__tests__/post-timeline.test.ts +249 -39
  262. package/src/services/__tests__/post.test.ts +844 -5
  263. package/src/services/__tests__/search.test.ts +48 -1
  264. package/src/services/__tests__/settings.test.ts +8 -0
  265. package/src/services/__tests__/site-admin.test.ts +121 -1
  266. package/src/services/auth.ts +2 -2
  267. package/src/services/bootstrap.ts +3 -2
  268. package/src/services/collection.ts +224 -167
  269. package/src/services/export-theme/assets/client-site.css +1 -1
  270. package/src/services/export-theme/assets/client-site.js +46 -25
  271. package/src/services/export-theme/layouts/_default/list.html +18 -4
  272. package/src/services/export-theme/layouts/_default/rss.xml +8 -12
  273. package/src/services/export-theme/layouts/featured/list.html +5 -4
  274. package/src/services/export-theme/layouts/partials/featured-thread.html +56 -0
  275. package/src/services/export-theme/layouts/partials/footer.html +1 -1
  276. package/src/services/export-theme/layouts/partials/media-gallery.html +1 -0
  277. package/src/services/export-theme/styles/main.css +30 -2
  278. package/src/services/export.ts +94 -85
  279. package/src/services/mcp.ts +37 -27
  280. package/src/services/media.ts +1 -1
  281. package/src/services/navigation.ts +185 -46
  282. package/src/services/path.ts +4 -1
  283. package/src/services/post.ts +1142 -342
  284. package/src/services/search.ts +17 -2
  285. package/src/services/settings.ts +2 -10
  286. package/src/services/site-admin.ts +63 -43
  287. package/src/style-cjk-jp.css +1 -1
  288. package/src/style-cjk-kr.css +1 -1
  289. package/src/style-cjk-tc.css +1 -1
  290. package/src/style-cjk.css +1 -1
  291. package/src/styles/components.css +540 -14
  292. package/src/styles/site-media.css +111 -19
  293. package/src/styles/tokens.css +76 -10
  294. package/src/styles/ui.css +2227 -1347
  295. package/src/types/bindings.ts +3 -0
  296. package/src/types/config.ts +243 -12
  297. package/src/types/constants.ts +22 -1
  298. package/src/types/entities.ts +14 -8
  299. package/src/types/operations.ts +18 -10
  300. package/src/types/props.ts +20 -2
  301. package/src/types/raw-assets.d.ts +5 -0
  302. package/src/types/views.ts +22 -4
  303. package/src/ui/__tests__/font-themes.test.ts +42 -30
  304. package/src/ui/compose/ComposeDialog.tsx +109 -19
  305. package/src/ui/dash/appearance/NavigationContent.tsx +332 -4
  306. package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +23 -0
  307. package/src/ui/dash/settings/ConfigEditorContent.tsx +578 -0
  308. package/src/ui/dash/settings/GeneralContent.tsx +15 -5
  309. package/src/ui/dash/settings/SettingsRootContent.tsx +21 -1
  310. package/src/ui/dash/settings/__tests__/ConfigEditorContent.test.tsx +98 -0
  311. package/src/ui/dash/settings/__tests__/SettingsRootContent.test.tsx +15 -0
  312. package/src/ui/feed/CuratedThreadPreview.tsx +16 -4
  313. package/src/ui/feed/LinkCard.tsx +2 -12
  314. package/src/ui/feed/LinkPreview.tsx +2 -7
  315. package/src/ui/feed/NoteCard.tsx +10 -20
  316. package/src/ui/feed/PostStatusBadges.tsx +42 -3
  317. package/src/ui/feed/QuoteCard.tsx +2 -12
  318. package/src/ui/feed/ThreadPreview.tsx +26 -34
  319. package/src/ui/feed/TimelineFeed.tsx +2 -2
  320. package/src/ui/feed/__tests__/thread-preview.test.ts +197 -56
  321. package/src/ui/feed/__tests__/timeline-cards.test.ts +178 -3
  322. package/src/ui/feed/thread-preview-state.ts +5 -7
  323. package/src/ui/font-themes.ts +74 -26
  324. package/src/ui/layouts/BaseLayout.tsx +22 -8
  325. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +64 -1
  326. package/src/ui/pages/ArchivePage.tsx +131 -24
  327. package/src/ui/pages/CollectionPage.tsx +101 -22
  328. package/src/ui/pages/CollectionsPage.tsx +3 -1
  329. package/src/ui/pages/PostPage.tsx +39 -12
  330. package/src/ui/pages/SearchPage.tsx +6 -14
  331. package/src/ui/pages/__tests__/ArchivePage.test.tsx +70 -0
  332. package/src/ui/pages/__tests__/PostPage.test.tsx +88 -0
  333. package/src/ui/shared/CollectionDirectory.tsx +13 -9
  334. package/src/ui/shared/CollectionsManager.tsx +17 -7
  335. package/src/ui/shared/DraftPreviewBar.tsx +49 -0
  336. package/src/ui/shared/HomePageBranding.tsx +2 -2
  337. package/src/ui/shared/MediaGallery.tsx +1 -0
  338. package/src/ui/shared/PostFooter.tsx +38 -13
  339. package/src/ui/shared/__tests__/home-page-branding.test.tsx +1 -1
  340. package/src/ui/shared/__tests__/media-gallery.test.ts +1 -0
  341. package/src/ui/shared/__tests__/navigation-labels.test.ts +2 -2
  342. package/src/ui/shared/__tests__/post-footer.test.ts +15 -0
  343. package/src/ui/shared/collection-management-labels.ts +33 -2
  344. package/src/ui/shared/custom-icons.ts +5 -0
  345. package/src/ui/shared/navigation-labels.ts +2 -4
  346. package/src/ui/shared/post-article-attributes.ts +52 -0
  347. package/dist/app-DZDlmh7C.js +0 -6
  348. package/dist/client/_assets/client-Cevfpm8H.css +0 -2
  349. package/dist/client/_assets/client-auth-v3yvhbgZ.js +0 -4736
  350. package/src/client/tiptap/wrapping-input-rules.ts +0 -102
@@ -18,8 +18,14 @@ describe("detectLocaleFromHeader", () => {
18
18
  expect(detectLocaleFromHeader("fr")).toBe("en");
19
19
  });
20
20
 
21
- it("falls back to en for Chinese (not a supported UI locale)", () => {
22
- expect(detectLocaleFromHeader("zh-CN")).toBe("en");
21
+ it("maps Simplified Chinese browser locales to zh-Hans", () => {
22
+ expect(detectLocaleFromHeader("zh-CN")).toBe("zh-Hans");
23
+ expect(detectLocaleFromHeader("zh-SG")).toBe("zh-Hans");
24
+ });
25
+
26
+ it("maps Traditional Chinese browser locales to zh-Hant", () => {
27
+ expect(detectLocaleFromHeader("zh-TW")).toBe("zh-Hant");
28
+ expect(detectLocaleFromHeader("zh-HK")).toBe("zh-Hant");
23
29
  });
24
30
 
25
31
  it("returns en for undefined", () => {
@@ -43,6 +43,11 @@ function mapTagToLocale(tag: string): Locale | undefined {
43
43
  const normalized = tag.trim().toLowerCase();
44
44
  if (!normalized) return undefined;
45
45
 
46
+ const cjkProfile = getCjkFontFromLanguageTag(normalized);
47
+ if (cjkProfile === "zh-Hans" || cjkProfile === "zh-Hant") {
48
+ return cjkProfile;
49
+ }
50
+
46
51
  const primary = normalized.split("-")[0];
47
52
  if (isLocale(primary)) return primary;
48
53
 
@@ -90,7 +95,7 @@ export function detectLocaleFromHeader(header: string | undefined): Locale {
90
95
  return baseLocale;
91
96
  }
92
97
 
93
- /** Valid CJK serif font locale values */
98
+ /** Valid CJK font profile values */
94
99
  export const CJK_SERIF_FONT_VALUES = [
95
100
  "off",
96
101
  "zh-Hans",
@@ -111,12 +116,16 @@ export function isCjkSerifFont(value: unknown): value is CjkSerifFont {
111
116
  }
112
117
 
113
118
  /**
114
- * Map a BCP 47 language tag to a CJK serif font value.
119
+ * Map a BCP 47 language tag to a CJK font profile.
115
120
  *
116
121
  * @param tag - BCP 47 language tag (e.g. "zh-CN", "ja")
117
- * @returns CJK serif font value, or `undefined` if not a CJK language
122
+ * @returns CJK font profile, or `undefined` if not a CJK language
123
+ * @example
124
+ * getCjkFontFromLanguageTag("zh-TW") // "zh-Hant"
118
125
  */
119
- function mapTagToCjkFont(tag: string): CjkSerifFont | undefined {
126
+ export function getCjkFontFromLanguageTag(
127
+ tag: string,
128
+ ): Exclude<CjkSerifFont, "off"> | undefined {
120
129
  const normalized = tag.trim().toLowerCase();
121
130
  if (!normalized) return undefined;
122
131
 
@@ -177,7 +186,7 @@ export function detectCjkFontFromHeader(
177
186
  entries.sort((a, b) => b.q - a.q);
178
187
 
179
188
  for (const { tag } of entries) {
180
- const font = mapTagToCjkFont(tag);
189
+ const font = getCjkFontFromLanguageTag(tag);
181
190
  if (font) return font;
182
191
  }
183
192
 
@@ -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: 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
+ #: src/ui/compose/ComposeDialog.tsx
43
+ msgid "/…"
44
+ msgstr "/…"
45
+
41
46
  #. @context: Placeholder for the custom collections link URL
42
47
  #: src/ui/shared/collection-management-labels.ts
43
48
  msgid "/archive?format=quote or https://example.com"
@@ -163,11 +168,41 @@ msgstr "Add alt text"
163
168
  msgid "Add Collection"
164
169
  msgstr "Add Collection"
165
170
 
171
+ #. @context: Compose table action
172
+ #: src/ui/compose/ComposeDialog.tsx
173
+ msgid "Add column after"
174
+ msgstr "Add column after"
175
+
176
+ #. @context: Compose table action
177
+ #: src/ui/compose/ComposeDialog.tsx
178
+ msgid "Add column before"
179
+ msgstr "Add column before"
180
+
166
181
  #. @context: Primary action to add a custom link on collections page
167
182
  #: src/ui/shared/collection-management-labels.ts
168
183
  msgid "Add Link"
169
184
  msgstr "Add Link"
170
185
 
186
+ #. @context: Compose table action
187
+ #: src/ui/compose/ComposeDialog.tsx
188
+ msgid "Add row above"
189
+ msgstr "Add row above"
190
+
191
+ #. @context: Compose table action
192
+ #: src/ui/compose/ComposeDialog.tsx
193
+ msgid "Add row below"
194
+ msgstr "Add row below"
195
+
196
+ #. @context: Action that adds a Collection to site navigation
197
+ #: src/ui/shared/collection-management-labels.ts
198
+ msgid "Add to Navigation"
199
+ msgstr "Add to Navigation"
200
+
201
+ #. @context: Loading label while adding a Collection to site navigation
202
+ #: src/ui/shared/collection-management-labels.ts
203
+ msgid "Adding…"
204
+ msgstr "Adding…"
205
+
171
206
  #. @context: Archive filter - collection dropdown default
172
207
  #: src/ui/pages/ArchivePage.tsx
173
208
  msgid "All collections"
@@ -263,11 +298,6 @@ msgstr "Author (optional)"
263
298
  msgid "Auto"
264
299
  msgstr "Auto"
265
300
 
266
- #. @context: Compose summary shown near the submit controls when a manual custom link is cleared
267
- #: src/ui/compose/ComposeDialog.tsx
268
- msgid "Auto link"
269
- msgstr "Auto link"
270
-
271
301
  #. @context: Usage label for the circle tile asset card
272
302
  #: src/ui/pages/BrandPage.tsx
273
303
  msgid "Avatar-ready"
@@ -352,6 +382,11 @@ msgstr "Checking link..."
352
382
  msgid "Choose a new password."
353
383
  msgstr "Choose a new password."
354
384
 
385
+ #. @context: Accessible title for the table dimension picker
386
+ #: src/ui/compose/ComposeDialog.tsx
387
+ msgid "Choose table size"
388
+ msgstr "Choose table size"
389
+
355
390
  #. @context: Body copy for the logo downloads section
356
391
  #: src/ui/pages/BrandPage.tsx
357
392
  msgid "Choose the standard logo for most placements and the reverse logo when you need more contrast."
@@ -381,6 +416,11 @@ msgstr "Circle tile"
381
416
  msgid "Clear filter"
382
417
  msgstr "Clear filter"
383
418
 
419
+ #. @context: Post options row that leaves the composer; prompts to save a draft first if there is unsaved work
420
+ #: src/ui/compose/ComposeDialog.tsx
421
+ msgid "Close compose"
422
+ msgstr "Close compose"
423
+
384
424
  #. @context: Close drawer button label
385
425
  #: src/ui/layouts/SiteLayout.tsx
386
426
  msgid "Close menu"
@@ -396,7 +436,12 @@ msgstr "collection"
396
436
  msgid "Collection"
397
437
  msgstr "Collection"
398
438
 
399
- #. @context: Toast shown after creating a collection
439
+ #. @context: Confirmation after adding a Collection to site navigation
440
+ #: src/ui/shared/collection-management-labels.ts
441
+ msgid "Collection added to navigation."
442
+ msgstr "Collection added to navigation."
443
+
444
+ #. @context: Confirmation shown after creating a collection
400
445
  #: src/ui/shared/collection-management-labels.ts
401
446
  msgid "Collection created."
402
447
  msgstr "Collection created."
@@ -467,6 +512,11 @@ msgstr "Compare it against the theme controls"
467
512
  msgid "Complete Setup"
468
513
  msgstr "Complete Setup"
469
514
 
515
+ #. @context: Accessible name for the compose dialog
516
+ #: src/ui/compose/ComposeDialog.tsx
517
+ msgid "Compose"
518
+ msgstr "Compose"
519
+
470
520
  #. @context: Password reset form field
471
521
  #: src/routes/auth/reset.tsx
472
522
  msgid "Confirm Password"
@@ -477,11 +527,21 @@ msgstr "Confirm Password"
477
527
  msgid "Continue →"
478
528
  msgstr "Continue →"
479
529
 
530
+ #. @context: Tooltip on the draft badge, which opens the editor
531
+ #: src/ui/feed/PostStatusBadges.tsx
532
+ msgid "Continue writing this draft"
533
+ msgstr "Continue writing this draft"
534
+
480
535
  #. @context: Controls section heading on sample page
481
536
  #: src/ui/pages/ThemeSamplePage.tsx
482
537
  msgid "Controls"
483
538
  msgstr "Controls"
484
539
 
540
+ #. @context: Error after a Collection could not be added to site navigation
541
+ #: src/ui/shared/collection-management-labels.ts
542
+ msgid "Couldn't add this collection to navigation. Try again."
543
+ msgstr "Couldn't add this collection to navigation. Try again."
544
+
485
545
  #. @context: Error toast when account creation fails
486
546
  #. @context: Error toast when account creation fails
487
547
  #. @context: Error toast when account creation fails
@@ -570,6 +630,11 @@ msgstr "Default preview image for social shares and link unfurls."
570
630
  msgid "Delete"
571
631
  msgstr "Delete"
572
632
 
633
+ #. @context: Compose table action
634
+ #: src/ui/compose/ComposeDialog.tsx
635
+ msgid "Delete column"
636
+ msgstr "Delete column"
637
+
573
638
  #. @context: Draft item action
574
639
  #: src/ui/compose/ComposeDialog.tsx
575
640
  msgid "Delete Draft"
@@ -580,10 +645,20 @@ msgstr "Delete Draft"
580
645
  msgid "Delete image"
581
646
  msgstr "Delete image"
582
647
 
648
+ #. @context: Compose table action
649
+ #: src/ui/compose/ComposeDialog.tsx
650
+ msgid "Delete row"
651
+ msgstr "Delete row"
652
+
653
+ #. @context: Destructive compose table action
654
+ #: src/ui/compose/ComposeDialog.tsx
655
+ msgid "Delete table"
656
+ msgstr "Delete table"
657
+
583
658
  #. @context: Confirm dialog for deleting a collection
584
659
  #: src/ui/shared/collection-management-labels.ts
585
- msgid "Delete this collection permanently? Posts inside won't be removed."
586
- msgstr "Delete this collection permanently? Posts inside won't be removed."
660
+ msgid "Delete this collection permanently? Threads inside won't be removed."
661
+ msgstr "Delete this collection permanently? Threads inside won't be removed."
587
662
 
588
663
  #. @context: Hint shown on signin page when demo credentials are pre-filled
589
664
  #: src/routes/auth/signin.tsx
@@ -696,11 +771,28 @@ msgstr "Download SVG"
696
771
  msgid "Download the official Jant logo, icons, and preview files."
697
772
  msgstr "Download the official Jant logo, icons, and preview files."
698
773
 
774
+ #. @context: Post status badge for an unpublished draft, shown to the author only
775
+ #: src/ui/feed/PostStatusBadges.tsx
776
+ msgid "Draft"
777
+ msgstr "Draft"
778
+
779
+ #. @context: Accessible label for a draft item's more-actions button
780
+ #: src/ui/compose/ComposeDialog.tsx
781
+ msgid "Draft actions"
782
+ msgstr "Draft actions"
783
+
699
784
  #. @context: Toast after draft deletion
700
785
  #: src/ui/compose/ComposeDialog.tsx
701
786
  msgid "Draft deleted."
702
787
  msgstr "Draft deleted."
703
788
 
789
+ #. @context: Browser title prefix for a draft preview page
790
+ #. @context: Status label above a draft preview page
791
+ #: src/routes/pages/page.tsx
792
+ #: src/ui/shared/DraftPreviewBar.tsx
793
+ msgid "Draft preview"
794
+ msgstr "Draft preview"
795
+
704
796
  #. @context: Toast shown when a local draft is restored on compose open
705
797
  #: src/ui/compose/ComposeDialog.tsx
706
798
  msgid "Draft restored."
@@ -725,11 +817,9 @@ msgstr "Drafts"
725
817
  msgid "Drag collections, links, and dividers into the order you want."
726
818
  msgstr "Drag collections, links, and dividers into the order you want."
727
819
 
728
- #. @context: Compose dialog header title when editing a post
729
820
  #. @context: Per-collection edit action
730
821
  #. @context: Per-collection edit action
731
822
  #. @context: Per-collection edit action
732
- #: src/ui/compose/ComposeDialog.tsx
733
823
  #: src/ui/pages/CollectionEditorPage.tsx
734
824
  #: src/ui/pages/CollectionEditorPage.tsx
735
825
  #: src/ui/shared/collection-management-labels.ts
@@ -741,11 +831,21 @@ msgstr "Edit"
741
831
  msgid "Edit custom link"
742
832
  msgstr "Edit custom link"
743
833
 
834
+ #. @context: Action in the draft preview status bar that opens the editor
835
+ #: src/ui/shared/DraftPreviewBar.tsx
836
+ msgid "Edit draft"
837
+ msgstr "Edit draft"
838
+
744
839
  #. @context: Button to manually edit the collection link
745
840
  #: src/ui/shared/collection-management-labels.ts
746
841
  msgid "Edit link"
747
842
  msgstr "Edit link"
748
843
 
844
+ #. @context: Action that opens Navigation settings for a Collection already in navigation
845
+ #: src/ui/shared/collection-management-labels.ts
846
+ msgid "Edit Navigation"
847
+ msgstr "Edit Navigation"
848
+
749
849
  #. @context: Compose dialog header title in edit mode
750
850
  #: src/ui/compose/ComposeDialog.tsx
751
851
  msgid "Edit post"
@@ -756,6 +856,11 @@ msgstr "Edit post"
756
856
  msgid "Edit publish date"
757
857
  msgstr "Edit publish date"
758
858
 
859
+ #. @context: Marker above the composer when changing a post that is already published
860
+ #: src/ui/compose/ComposeDialog.tsx
861
+ msgid "Editing"
862
+ msgstr "Editing"
863
+
759
864
  #. @context: Sample link post title on the theme sample page
760
865
  #: src/ui/pages/ThemeSamplePage.tsx
761
866
  msgid "Editorial interfaces worth borrowing from"
@@ -783,20 +888,6 @@ msgstr "Enter a valid date."
783
888
  msgid "Enter a valid URL starting with http://, https://, or mailto:."
784
889
  msgstr "Enter a valid URL starting with http://, https://, or mailto:."
785
890
 
786
- #. @context: Plural entry count label
787
- #. @context: Plural entry count label
788
- #: src/ui/shared/CollectionDirectory.tsx
789
- #: src/ui/shared/CollectionsManager.tsx
790
- msgid "entries"
791
- msgstr "entries"
792
-
793
- #. @context: Singular entry count label
794
- #. @context: Singular entry count label
795
- #: src/ui/shared/CollectionDirectory.tsx
796
- #: src/ui/shared/CollectionsManager.tsx
797
- msgid "entry"
798
- msgstr "entry"
799
-
800
891
  #. @context: Usage label for the brand pack card
801
892
  #: src/ui/pages/BrandPage.tsx
802
893
  msgid "Everything in one download"
@@ -1013,6 +1104,11 @@ msgstr "Inline emphasis"
1013
1104
  msgid "Inline link"
1014
1105
  msgstr "Inline link"
1015
1106
 
1107
+ #. @context: Accessible label for a table size option. %rows% and %cols% are replaced with dimensions
1108
+ #: src/ui/compose/ComposeDialog.tsx
1109
+ msgid "Insert %rows% by %cols% table"
1110
+ msgstr "Insert %rows% by %cols% table"
1111
+
1016
1112
  #. @context: Sample note summary suffix on the theme sample page
1017
1113
  #: src/ui/pages/ThemeSamplePage.tsx
1018
1114
  msgid "instead of judging it as an isolated swatch."
@@ -1070,6 +1166,11 @@ msgstr "Label"
1070
1166
  msgid "Label (optional)"
1071
1167
  msgstr "Label (optional)"
1072
1168
 
1169
+ #. @context: Tooltip text for the timestamp on an unpublished draft
1170
+ #: src/ui/shared/PostFooter.tsx
1171
+ msgid "Last edited on {date} at {time}"
1172
+ msgstr "Last edited on {date} at {time}"
1173
+
1073
1174
  #. @context: Active browse tab label on sample page
1074
1175
  #. @context: Browser page title for the latest feed
1075
1176
  #. @context: Page heading for the latest posts feed
@@ -1128,6 +1229,11 @@ msgstr "Link added."
1128
1229
  msgid "Link removed."
1129
1230
  msgstr "Link removed."
1130
1231
 
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
+
1131
1237
  #. @context: Description for the archive system navigation toggle
1132
1238
  #: src/ui/shared/navigation-labels.ts
1133
1239
  msgid "Link to the post archive"
@@ -1138,15 +1244,10 @@ msgstr "Link to the post archive"
1138
1244
  msgid "Link to your collections page"
1139
1245
  msgstr "Link to your collections page"
1140
1246
 
1141
- #. @context: Description for the featured system navigation toggle
1142
- #: src/ui/shared/navigation-labels.ts
1143
- msgid "Link to your featured posts. If it comes before Latest, the homepage opens here."
1144
- msgstr "Link to your featured posts. If it comes before Latest, the homepage opens here."
1145
-
1146
1247
  #. @context: Description for the latest system navigation toggle
1147
1248
  #: src/ui/shared/navigation-labels.ts
1148
- msgid "Link to your latest posts. If it comes before Featured, the homepage opens here."
1149
- msgstr "Link to your latest posts. If it comes before Featured, the homepage opens here."
1249
+ msgid "Link to your latest posts. Your homepage shows this feed."
1250
+ msgstr "Link to your latest posts. Your homepage shows this feed."
1150
1251
 
1151
1252
  #. @context: Toast after saving a custom collections link
1152
1253
  #: src/ui/shared/collection-management-labels.ts
@@ -1293,10 +1394,10 @@ msgstr "New Password"
1293
1394
  msgid "New post"
1294
1395
  msgstr "New post"
1295
1396
 
1296
- #. @context: Compose dialog header title when composing a thread
1297
- #: src/ui/compose/ComposeDialog.tsx
1298
- msgid "New Thread"
1299
- msgstr "New Thread"
1397
+ #. @context: Archive page meta note explaining the active sort order
1398
+ #: src/ui/pages/ArchivePage.tsx
1399
+ msgid "newest changes first"
1400
+ msgstr "newest changes first"
1300
1401
 
1301
1402
  #. @context: Collection sort order option
1302
1403
  #. @context: Collection sort order option
@@ -1325,8 +1426,8 @@ msgstr "No collections match that search. Try a different name."
1325
1426
  #: src/ui/pages/CollectionsPage.tsx
1326
1427
  #: src/ui/shared/CollectionDirectory.tsx
1327
1428
  #: src/ui/shared/CollectionsManager.tsx
1328
- msgid "No collections yet. Start one to organize posts by topic."
1329
- msgstr "No collections yet. Start one to organize posts by topic."
1429
+ msgid "No collections yet. Start one to organize threads by topic."
1430
+ msgstr "No collections yet. Start one to organize threads by topic."
1330
1431
 
1331
1432
  #. @context: Drafts panel empty state
1332
1433
  #: src/ui/compose/ComposeDialog.tsx
@@ -1348,6 +1449,11 @@ msgstr "No results. Try different keywords."
1348
1449
  msgid "No threads match these filters. Try adjusting your selection or clear all filters."
1349
1450
  msgstr "No threads match these filters. Try adjusting your selection or clear all filters."
1350
1451
 
1452
+ #. @context: Action to dismiss the post-create Collection navigation prompt
1453
+ #: src/ui/shared/CollectionsManager.tsx
1454
+ msgid "Not now"
1455
+ msgstr "Not now"
1456
+
1351
1457
  #. @context: Compose format tab
1352
1458
  #. @context: Post format label - note
1353
1459
  #. @context: Post format label on theme sample content card
@@ -1371,14 +1477,19 @@ msgstr "Notes"
1371
1477
 
1372
1478
  #. @context: Empty state message on an aggregate collection page
1373
1479
  #: src/ui/pages/CollectionPage.tsx
1374
- msgid "Nothing here yet. Add posts to one of these collections to fill this view."
1375
- msgstr "Nothing here yet. Add posts to one of these collections to fill this view."
1480
+ msgid "Nothing here yet. Add threads to one of these collections to fill this view."
1481
+ msgstr "Nothing here yet. Add threads to one of these collections to fill this view."
1376
1482
 
1377
1483
  #. @context: Empty state message on featured page
1378
1484
  #: src/ui/pages/FeaturedPage.tsx
1379
1485
  msgid "Nothing in Featured yet. Mark a post as featured to show it here."
1380
1486
  msgstr "Nothing in Featured yet. Mark a post as featured to show it here."
1381
1487
 
1488
+ #. @context: Value shown on a post's date control when it will publish at the current time
1489
+ #: src/ui/compose/ComposeDialog.tsx
1490
+ msgid "Now"
1491
+ msgstr "Now"
1492
+
1382
1493
  #. @context: Collection sort order option
1383
1494
  #. @context: Collection sort order option
1384
1495
  #: src/ui/pages/CollectionPage.tsx
@@ -1459,6 +1570,11 @@ msgstr ""
1459
1570
  msgid "Paste a URL..."
1460
1571
  msgstr "Paste a URL..."
1461
1572
 
1573
+ #. @context: Post status badge for a pinned post
1574
+ #: src/ui/feed/PostStatusBadges.tsx
1575
+ msgid "Pinned"
1576
+ msgstr "Pinned"
1577
+
1462
1578
  #. @context: Compose button - publish post
1463
1579
  #: src/ui/compose/ComposeDialog.tsx
1464
1580
  msgid "Post"
@@ -1484,7 +1600,9 @@ msgstr "Post privately"
1484
1600
  msgid "Press N to write"
1485
1601
  msgstr "Press N to write"
1486
1602
 
1603
+ #. @context: Draft item action that opens its rendered preview
1487
1604
  #. @context: Ghost button label on sample page
1605
+ #: src/ui/compose/ComposeDialog.tsx
1488
1606
  #: src/ui/pages/ThemeSamplePage.tsx
1489
1607
  msgid "Preview"
1490
1608
  msgstr "Preview"
@@ -1520,7 +1638,9 @@ msgstr "Primary logo files"
1520
1638
 
1521
1639
  #. @context: Archive visibility filter - private posts
1522
1640
  #. @context: Compose publish settings visibility option
1641
+ #. @context: Post status badge for a private post
1523
1642
  #: src/ui/compose/ComposeDialog.tsx
1643
+ #: src/ui/feed/PostStatusBadges.tsx
1524
1644
  #: src/ui/pages/ArchivePage.tsx
1525
1645
  msgid "Private"
1526
1646
  msgstr "Private"
@@ -1539,11 +1659,6 @@ msgstr "Public"
1539
1659
  msgid "Publish"
1540
1660
  msgstr "Publish"
1541
1661
 
1542
- #. @context: Compose summary shown near the submit controls when an edited post no longer has a custom publish date
1543
- #: src/ui/compose/ComposeDialog.tsx
1544
- msgid "Publish now"
1545
- msgstr "Publish now"
1546
-
1547
1662
  #. @context: Compose publish settings panel title
1548
1663
  #: src/ui/compose/ComposeDialog.tsx
1549
1664
  msgid "Publish settings"
@@ -1674,10 +1789,8 @@ msgstr "Replies"
1674
1789
 
1675
1790
  #. @context: Archive tile label for a single thread reply
1676
1791
  #. @context: Compose button - reply to post
1677
- #. @context: Compose dialog header title when replying to a post
1678
1792
  #. @context: Reply button label in the post footer
1679
1793
  #: src/ui/compose/ComposeDialog.tsx
1680
- #: src/ui/compose/ComposeDialog.tsx
1681
1794
  #: src/ui/pages/ArchivePage.tsx
1682
1795
  #: src/ui/shared/PostFooter.tsx
1683
1796
  msgid "Reply"
@@ -1811,6 +1924,16 @@ msgstr "Settings"
1811
1924
  msgid "Shared links"
1812
1925
  msgstr "Shared links"
1813
1926
 
1927
+ #. @context: Archive view option - grid
1928
+ #: src/ui/pages/ArchivePage.tsx
1929
+ msgid "Show as a grid of tiles"
1930
+ msgstr "Show as a grid of tiles"
1931
+
1932
+ #. @context: Archive view option - list
1933
+ #: src/ui/pages/ArchivePage.tsx
1934
+ msgid "Show as a list with full posts"
1935
+ msgstr "Show as a list with full posts"
1936
+
1814
1937
  #. @context: Collapse expanded thread ancestor context in the feed
1815
1938
  #. @context: Collapse expanded thread ancestor context in the feed
1816
1939
  #. @context: Collapse reply context
@@ -1912,6 +2035,21 @@ msgstr "Something doesn't look right. Check the form and try again."
1912
2035
  msgid "Sort"
1913
2036
  msgstr "Sort"
1914
2037
 
2038
+ #. @context: Archive sort option - threads that recently gained a post first
2039
+ #: src/ui/pages/ArchivePage.tsx
2040
+ msgid "Sort by when each thread was last added to"
2041
+ msgstr "Sort by when each thread was last added to"
2042
+
2043
+ #. @context: Archive sort option - newest published first
2044
+ #: src/ui/pages/ArchivePage.tsx
2045
+ msgid "Sort by when each thread was published"
2046
+ msgstr "Sort by when each thread was published"
2047
+
2048
+ #. @context: Archive sort toggle group label
2049
+ #: src/ui/pages/ArchivePage.tsx
2050
+ msgid "Sort order"
2051
+ msgstr "Sort order"
2052
+
1915
2053
  #. @context: Collection form field
1916
2054
  #: src/ui/shared/collection-management-labels.ts
1917
2055
  msgid "Sort Order"
@@ -1982,6 +2120,16 @@ msgstr "Switch the palette and mode without opening settings or changing the act
1982
2120
  msgid "Switch to the white logo when the standard green version would lose contrast."
1983
2121
  msgstr "Switch to the white logo when the standard green version would lose contrast."
1984
2122
 
2123
+ #. @context: Accessible label for the compose table toolbar
2124
+ #: src/ui/compose/ComposeDialog.tsx
2125
+ msgid "Table controls"
2126
+ msgstr "Table controls"
2127
+
2128
+ #. @context: Compose table menu button label
2129
+ #: src/ui/compose/ComposeDialog.tsx
2130
+ msgid "Table options"
2131
+ msgstr "Table options"
2132
+
1985
2133
  #. @context: Label on failed upload overlay button, tells user tapping retries the upload
1986
2134
  #: src/ui/compose/ComposeDialog.tsx
1987
2135
  msgid "Tap to retry"
@@ -2060,8 +2208,8 @@ msgstr "This article is here to answer a specific question: does the default acc
2060
2208
 
2061
2209
  #. @context: Empty state message
2062
2210
  #: src/ui/pages/CollectionPage.tsx
2063
- msgid "This collection is empty. Add posts from the editor."
2064
- msgstr "This collection is empty. Add posts from the editor."
2211
+ msgid "This collection is empty. Add threads from the editor."
2212
+ msgstr "This collection is empty. Add threads from the editor."
2065
2213
 
2066
2214
  #. @context: Collection link help text
2067
2215
  #: src/ui/shared/collection-management-labels.ts
@@ -2094,6 +2242,11 @@ msgstr "This link is already in use. Choose something else."
2094
2242
  msgid "This link is reserved. Choose something else."
2095
2243
  msgstr "This link is reserved. Choose something else."
2096
2244
 
2245
+ #. @context: Explanation in the draft preview status bar
2246
+ #: src/ui/shared/DraftPreviewBar.tsx
2247
+ msgid "This post isn’t published."
2248
+ msgstr "This post isn’t published."
2249
+
2097
2250
  #. @context: Sample link post body prefix on the theme sample page
2098
2251
  #: src/ui/pages/ThemeSamplePage.tsx
2099
2252
  msgid "This reference is useful because it treats links and citations as part of the reading rhythm. Keep that in mind while tuning the"
@@ -2123,10 +2276,14 @@ msgstr "This uses the real single-post detail rendering with a longer article, i
2123
2276
 
2124
2277
  #. @context: Archive month header count unit for a single thread
2125
2278
  #. @context: Archive page summary unit for a single matching thread
2279
+ #. @context: Singular thread count label
2280
+ #. @context: Singular thread count label
2126
2281
  #. @context: Singular thread count label on collection detail page
2127
2282
  #: src/ui/pages/ArchivePage.tsx
2128
2283
  #: src/ui/pages/ArchivePage.tsx
2129
2284
  #: src/ui/pages/CollectionPage.tsx
2285
+ #: src/ui/shared/CollectionDirectory.tsx
2286
+ #: src/ui/shared/CollectionsManager.tsx
2130
2287
  msgid "thread"
2131
2288
  msgstr "thread"
2132
2289
 
@@ -2143,11 +2300,15 @@ msgstr "Thread accents"
2143
2300
  #. @context: Archive feed title segment for hasReplies=1 filter
2144
2301
  #. @context: Archive month header count unit for multiple threads
2145
2302
  #. @context: Archive page summary unit for multiple matching threads
2303
+ #. @context: Plural thread count label
2304
+ #. @context: Plural thread count label
2146
2305
  #. @context: Plural thread count label on collection detail page
2147
2306
  #: src/routes/pages/archive.tsx
2148
2307
  #: src/ui/pages/ArchivePage.tsx
2149
2308
  #: src/ui/pages/ArchivePage.tsx
2150
2309
  #: src/ui/pages/CollectionPage.tsx
2310
+ #: src/ui/shared/CollectionDirectory.tsx
2311
+ #: src/ui/shared/CollectionsManager.tsx
2151
2312
  msgid "threads"
2152
2313
  msgstr "threads"
2153
2314
 
@@ -2162,11 +2323,9 @@ msgid "Threads can include up to {count} posts."
2162
2323
  msgstr "Threads can include up to {count} posts."
2163
2324
 
2164
2325
  #. @context: Collection form field
2165
- #. @context: Compose note title placeholder
2166
- #. @context: Compose toolbar - title tooltip
2326
+ #. @context: Compose toolbar - show or hide the title field
2167
2327
  #. @context: Input label on sample page
2168
2328
  #: src/ui/compose/ComposeDialog.tsx
2169
- #: src/ui/compose/ComposeDialog.tsx
2170
2329
  #: src/ui/pages/ThemeSamplePage.tsx
2171
2330
  #: src/ui/shared/collection-management-labels.ts
2172
2331
  msgid "Title"
@@ -2184,6 +2343,11 @@ msgstr "Titled"
2184
2343
  msgid "to make sure both still feel like they belong to the same product."
2185
2344
  msgstr "to make sure both still feel like they belong to the same product."
2186
2345
 
2346
+ #. @context: Compose table action
2347
+ #: src/ui/compose/ComposeDialog.tsx
2348
+ msgid "Toggle header row"
2349
+ msgstr "Toggle header row"
2350
+
2187
2351
  #. @context: Usage label for the square logo PNG asset card
2188
2352
  #: src/ui/pages/BrandPage.tsx
2189
2353
  msgid "Transparent square"
@@ -2206,6 +2370,8 @@ msgstr "Type the quote..."
2206
2370
 
2207
2371
  #. @context: Archive filter - notes without a title
2208
2372
  #. @context: Archive filter - notes without a title
2373
+ #. @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.
2374
+ #: src/ui/compose/ComposeDialog.tsx
2209
2375
  #: src/ui/pages/ArchivePage.tsx
2210
2376
  #: src/ui/pages/ArchivePage.tsx
2211
2377
  msgid "Untitled"
@@ -2288,6 +2454,11 @@ msgstr "View"
2288
2454
  msgid "View earlier notes in this thread"
2289
2455
  msgstr "View earlier notes in this thread"
2290
2456
 
2457
+ #. @context: Archive grid/list toggle group label
2458
+ #: src/ui/pages/ArchivePage.tsx
2459
+ msgid "View mode"
2460
+ msgstr "View mode"
2461
+
2291
2462
  #. @context: Compose publish settings section label
2292
2463
  #: src/ui/compose/ComposeDialog.tsx
2293
2464
  msgid "Visibility"