@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
@@ -168,6 +168,20 @@
168
168
  display: block;
169
169
  max-width: 100%;
170
170
  max-height: 100%;
171
+ overflow: hidden;
172
+ background-color: black;
173
+ border-radius: 4px;
174
+ }
175
+
176
+ .media-lightbox-short-frame-contained {
177
+ width: var(--media-lightbox-short-width);
178
+ height: var(--media-lightbox-short-height);
179
+ }
180
+
181
+ .media-lightbox-short-viewport {
182
+ width: 100%;
183
+ height: 100%;
184
+ min-height: 0;
171
185
  }
172
186
 
173
187
  .media-lightbox-video-short {
@@ -177,6 +191,7 @@
177
191
  max-width: none;
178
192
  max-height: none;
179
193
  object-fit: contain;
194
+ cursor: pointer;
180
195
  }
181
196
 
182
197
  .media-lightbox-short-controls {
@@ -185,20 +200,28 @@
185
200
  right: 0;
186
201
  bottom: 0;
187
202
  z-index: 2;
188
- height: 86px;
203
+ display: flex;
204
+ align-items: center;
205
+ gap: 2px;
206
+ height: 50px;
207
+ padding: 0 6px 6px;
208
+ box-sizing: border-box;
209
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.68), rgba(0, 0, 0, 0));
189
210
  pointer-events: none;
211
+ transition:
212
+ opacity 0.18s ease,
213
+ transform 0.18s ease;
190
214
  }
191
215
 
192
216
  .media-lightbox-short-progress {
193
217
  --media-progress: 0%;
194
- position: absolute;
195
- left: 16px;
196
- right: 16px;
197
- bottom: 0;
218
+ position: relative;
198
219
  z-index: 1;
199
220
  display: block;
200
- width: auto;
201
- height: 34px;
221
+ flex: 1 1 auto;
222
+ width: 0;
223
+ min-width: 48px;
224
+ height: 44px;
202
225
  margin: 0;
203
226
  padding: 0;
204
227
  background: transparent;
@@ -265,9 +288,44 @@
265
288
  transform 0.15s ease;
266
289
  }
267
290
 
268
- .media-lightbox-short-controls-portrait .media-lightbox-short-progress {
269
- width: calc(100% - 48px);
270
- right: auto;
291
+ .media-lightbox-short-playback {
292
+ position: relative;
293
+ z-index: 2;
294
+ display: inline-flex;
295
+ flex: 0 0 44px;
296
+ align-items: center;
297
+ justify-content: center;
298
+ width: 44px;
299
+ height: 44px;
300
+ padding: 0;
301
+ border: none;
302
+ border-radius: 999px;
303
+ background-color: transparent;
304
+ color: white;
305
+ pointer-events: auto;
306
+ cursor: pointer;
307
+ transition:
308
+ background-color 0.15s ease,
309
+ transform 0.15s ease;
310
+ }
311
+
312
+ .media-lightbox-short-playback svg {
313
+ display: block;
314
+ width: 16px;
315
+ height: 16px;
316
+ }
317
+
318
+ .media-lightbox-short-playback:hover {
319
+ background-color: rgba(255, 255, 255, 0.14);
320
+ }
321
+
322
+ .media-lightbox-short-playback:active {
323
+ transform: scale(0.92);
324
+ }
325
+
326
+ .media-lightbox-short-playback:focus-visible {
327
+ outline: none;
328
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.2);
271
329
  }
272
330
 
273
331
  .media-lightbox-short-progress:hover::-webkit-slider-runnable-track,
@@ -291,18 +349,18 @@
291
349
  }
292
350
 
293
351
  .media-lightbox-short-mute {
294
- position: absolute;
295
- right: 24px;
296
- bottom: 30px;
352
+ position: relative;
297
353
  z-index: 2;
298
354
  display: inline-flex;
355
+ flex: 0 0 44px;
299
356
  align-items: center;
300
357
  justify-content: center;
301
358
  width: 44px;
302
359
  height: 44px;
360
+ padding: 0;
303
361
  border: none;
304
362
  border-radius: 999px;
305
- background-color: rgb(119, 119, 119);
363
+ background-color: transparent;
306
364
  color: white;
307
365
  pointer-events: auto;
308
366
  cursor: pointer;
@@ -319,8 +377,7 @@
319
377
  }
320
378
 
321
379
  .media-lightbox-short-mute:hover {
322
- background-color: rgb(104, 104, 104);
323
- transform: scale(1.03);
380
+ background-color: rgba(255, 255, 255, 0.14);
324
381
  }
325
382
 
326
383
  .media-lightbox-short-mute:focus-visible {
@@ -361,9 +418,44 @@
361
418
  right: 8px;
362
419
  }
363
420
 
364
- .media-lightbox-short-mute {
365
- right: 24px;
366
- bottom: 26px;
421
+ .media-lightbox-short-frame {
422
+ border-radius: 0;
423
+ }
424
+ }
425
+
426
+ @media (hover: none), (pointer: coarse) {
427
+ .media-lightbox-short-frame-contained {
428
+ display: grid;
429
+ grid-template-rows: minmax(0, 1fr) 50px;
430
+ height: calc(var(--media-lightbox-short-height) + 50px);
431
+ }
432
+
433
+ .media-lightbox-short-controls {
434
+ position: relative;
435
+ grid-row: 2;
436
+ background: black;
437
+ }
438
+ }
439
+
440
+ @media (hover: hover) and (pointer: fine) {
441
+ .media-lightbox-short-controls {
442
+ opacity: 0;
443
+ transform: translateY(4px);
444
+ }
445
+
446
+ .media-lightbox-short-controls > * {
447
+ pointer-events: none;
448
+ }
449
+
450
+ .media-lightbox-short-frame:hover .media-lightbox-short-controls,
451
+ .media-lightbox-short-frame:focus-within .media-lightbox-short-controls {
452
+ opacity: 1;
453
+ transform: translateY(0);
454
+ }
455
+
456
+ .media-lightbox-short-frame:hover .media-lightbox-short-controls > *,
457
+ .media-lightbox-short-frame:focus-within .media-lightbox-short-controls > * {
458
+ pointer-events: auto;
367
459
  }
368
460
  }
369
461
 
@@ -8,14 +8,12 @@
8
8
 
9
9
  :root {
10
10
  /* Typography — Font families */
11
- --font-cjk-serif-fallback:
12
- "Songti SC", STSong, SimSun, "Songti TC", PMingLiU, MingLiU,
13
- "Noto Serif SC", "Noto Serif CJK SC", "Noto Serif TC", "Noto Serif CJK TC";
11
+ --font-cjk-serif-fallback: "Jant Language Fallback";
12
+ --font-cjk-sans-fallback: "Jant Language Fallback";
14
13
  --font-body:
15
14
  system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
16
- "Helvetica Neue", Helvetica, Arial, "PingFang TC", "PingFang SC",
17
- "Hiragino Sans CNS", "Hiragino Sans GB", "Microsoft JhengHei",
18
- "Microsoft YaHei", "Noto Sans CJK TC", "Noto Sans CJK SC", sans-serif;
15
+ "Helvetica Neue", Helvetica, Arial, var(--font-cjk-sans-fallback),
16
+ sans-serif;
19
17
  --font-heading:
20
18
  "New York Small", "New York", "Iowan Old Style", Charter,
21
19
  "Bitstream Charter", "Source Serif 4", Cambria, "Sitka Text", Georgia,
@@ -29,9 +27,8 @@
29
27
  "Iowan Old Style", Charter, Georgia, "Times New Roman", Times, serif;
30
28
  --font-ui:
31
29
  system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
32
- "Helvetica Neue", Helvetica, Arial, "PingFang TC", "PingFang SC",
33
- "Hiragino Sans CNS", "Hiragino Sans GB", "Microsoft JhengHei",
34
- "Microsoft YaHei", "Noto Sans CJK TC", "Noto Sans CJK SC", sans-serif;
30
+ "Helvetica Neue", Helvetica, Arial, var(--font-cjk-sans-fallback),
31
+ sans-serif;
35
32
  --font-mono:
36
33
  ui-monospace, Menlo, Monaco, Consolas, "Cascadia Code", "Courier New",
37
34
  monospace;
@@ -96,6 +93,7 @@
96
93
 
97
94
  /* Semantic aliases */
98
95
  --type-body-size: var(--type-content-body);
96
+ --type-footnote-ref: calc(var(--type-body-size) * 0.75);
99
97
  --type-code: calc(var(--type-body-size) * 0.94);
100
98
  --type-code-block: calc(var(--type-body-size) * 0.9);
101
99
  --type-body-tracking: 0;
@@ -128,6 +126,7 @@
128
126
  --layout-body-max-width: 1088px;
129
127
  --layout-content-width: 55%;
130
128
  --layout-sidenote-width: 50%;
129
+ --layout-sidenote-gap: 10%;
131
130
  --layout-sidenote-margin: -60%;
132
131
  --site-padding: 1.5rem;
133
132
  --content-gap: 1rem;
@@ -204,7 +203,30 @@
204
203
  );
205
204
  --site-threadline: var(--border);
206
205
  --site-page-bg: var(--background);
206
+ /* Despite the name, this is the page colour and ~60 rules use it that way —
207
+ including three that use it as *text* on a dark button. It cannot be
208
+ lifted without repainting the whole site; `--site-raised-bg` below is the
209
+ one that actually means "above the page". Read this as
210
+ "--site-default-surface" until the call sites are triaged. */
207
211
  --site-elevated-bg: var(--background);
212
+ /* What sits *above* the page: dialogs, popovers, menus, sheets. On a light
213
+ page this is the page colour, because the separating is done by the
214
+ backdrop dim and the drop shadows — both black over white. Neither works
215
+ on a dark page: 30% black over `#110f0d` composites to `#0c0b09`, and a
216
+ black shadow on near-black is nothing at all, which left the compose
217
+ dialog at 1.03:1 against its own backdrop. So in dark mode this lifts
218
+ instead (see the dark blocks below). Elevation there is lightness, not
219
+ shadow. */
220
+ --site-raised-bg: var(--site-page-bg);
221
+ /* The edge of a raised layer. On a light page the fill already separates and
222
+ this is just a hairline; on a dark one it does most of the work, because
223
+ the fill has almost no room to lift into. Same formula as
224
+ `--compose-control-border` in light so nothing moves there. */
225
+ --site-raised-border: color-mix(
226
+ in srgb,
227
+ var(--site-column-outline) 68%,
228
+ transparent
229
+ );
208
230
  --site-nav-hover-bg: var(--accent);
209
231
  --site-text-primary: var(--foreground);
210
232
  --site-text-secondary: var(--muted-foreground);
@@ -234,6 +256,12 @@
234
256
  var(--site-text-secondary) 88%,
235
257
  var(--site-text-primary)
236
258
  );
259
+ --site-footnote-text: var(--site-reading-caption);
260
+ --site-footnote-marker: color-mix(
261
+ in oklch,
262
+ var(--site-text-secondary) 88%,
263
+ var(--site-page-bg)
264
+ );
237
265
  --site-content-link: inherit;
238
266
  --site-content-link-hover: var(--site-text-primary);
239
267
  --site-content-link-underline: color-mix(
@@ -345,7 +373,10 @@
345
373
  var(--site-accent) 16%,
346
374
  transparent
347
375
  );
348
- --compose-paper-bg: var(--site-page-bg);
376
+ /* The composer is a floating sheet in every mode but one, so its paper is
377
+ the raised surface. `.compose-page` — the full-page `/new` composer, which
378
+ *is* the page — puts this back to `--site-page-bg` locally. */
379
+ --compose-paper-bg: var(--site-raised-bg);
349
380
  --compose-control-bg: color-mix(
350
381
  in srgb,
351
382
  var(--site-nav-hover-bg) 72%,
@@ -361,6 +392,15 @@
361
392
  var(--site-column-outline) 68%,
362
393
  transparent
363
394
  );
395
+ /* The tools row sits directly under the sentence being written, so its icons
396
+ stay a step behind the body's own muted ink and only come forward when
397
+ pointed at or switched on. 72% keeps the faded state above the 3:1
398
+ non-text contrast floor. */
399
+ --compose-tool-ink: color-mix(
400
+ in srgb,
401
+ var(--site-text-secondary) 72%,
402
+ var(--compose-paper-bg)
403
+ );
364
404
  --compose-blockquote-rail: color-mix(
365
405
  in srgb,
366
406
  var(--site-accent) 24%,
@@ -466,6 +506,16 @@
466
506
  --search-mark-bg: oklch(0.45 0.1 85 / 0.5);
467
507
  --search-mark-color: oklch(0.92 0.08 90);
468
508
  --dash-bg: oklch(0.2 0.005 80);
509
+ --site-raised-bg: color-mix(
510
+ in oklab,
511
+ var(--background) 88%,
512
+ var(--foreground)
513
+ );
514
+ --site-raised-border: color-mix(
515
+ in oklab,
516
+ var(--site-raised-bg) 78%,
517
+ var(--foreground)
518
+ );
469
519
  }
470
520
  }
471
521
 
@@ -496,6 +546,22 @@
496
546
  --search-mark-bg: oklch(0.45 0.1 85 / 0.5);
497
547
  --search-mark-color: oklch(0.92 0.08 90);
498
548
  --dash-bg: oklch(0.2 0.005 80);
549
+ /* 12% of the foreground mixed into the page. The headroom here is small and
550
+ bounded: `--site-divider` sits 1.36:1 above the page, and a surface lifted
551
+ past it would swallow every hairline drawn on it. 12% lands at 1.24:1 —
552
+ most of the range that exists, with the dividers still on top of it. */
553
+ --site-raised-bg: color-mix(
554
+ in oklab,
555
+ var(--background) 88%,
556
+ var(--foreground)
557
+ );
558
+ /* Carries the separation the fill cannot: 12% of lift is most of the room
559
+ the palette has, so the edge has to say the rest. */
560
+ --site-raised-border: color-mix(
561
+ in oklab,
562
+ var(--site-raised-bg) 78%,
563
+ var(--foreground)
564
+ );
499
565
  }
500
566
 
501
567
  @media (max-width: 760px), (hover: none) and (pointer: coarse) {