@geekity/cms 0.3.0 → 0.4.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 (637) hide show
  1. package/README.md +2091 -214
  2. package/admin/components/fields.njk +165 -0
  3. package/admin/layouts/base.njk +1 -1
  4. package/admin/layouts/settings-page.njk +26 -0
  5. package/admin/layouts/shell.njk +17 -3
  6. package/admin/pages/account/forgot.njk +47 -0
  7. package/admin/pages/account/login.njk +26 -0
  8. package/admin/pages/account/reset.njk +38 -0
  9. package/admin/pages/account/setup.njk +28 -0
  10. package/admin/pages/appearance/themes.njk +69 -0
  11. package/admin/pages/comments/all.njk +133 -0
  12. package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
  13. package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
  14. package/admin/pages/documents/editor.njk +196 -0
  15. package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
  16. package/admin/pages/documents/taxonomy.njk +95 -0
  17. package/admin/pages/federation/followers.njk +238 -0
  18. package/admin/pages/media/library.njk +160 -0
  19. package/admin/pages/messages/all.njk +110 -0
  20. package/admin/{layouts → pages}/placeholder.njk +5 -1
  21. package/admin/pages/settings/discussion.njk +99 -0
  22. package/admin/pages/settings/email.njk +203 -0
  23. package/admin/pages/settings/federation.njk +75 -0
  24. package/admin/pages/settings/general.njk +29 -0
  25. package/admin/pages/settings/permalinks.njk +50 -0
  26. package/admin/pages/settings/reading.njk +72 -0
  27. package/admin/pages/users/edit.njk +239 -0
  28. package/admin/pages/users/list.njk +48 -0
  29. package/admin/pages/users/new.njk +41 -0
  30. package/admin/static/admin.css +498 -3
  31. package/admin/static/copy.js +52 -0
  32. package/admin/static/editor.js +16 -16
  33. package/admin/static/slug.js +61 -0
  34. package/dist/admin/accounts.d.ts +413 -0
  35. package/dist/admin/accounts.d.ts.map +1 -0
  36. package/dist/admin/accounts.js +680 -0
  37. package/dist/admin/accounts.js.map +1 -0
  38. package/dist/admin/appearance.d.ts +80 -0
  39. package/dist/admin/appearance.d.ts.map +1 -0
  40. package/dist/admin/appearance.js +136 -0
  41. package/dist/admin/appearance.js.map +1 -0
  42. package/dist/admin/comments.d.ts +90 -0
  43. package/dist/admin/comments.d.ts.map +1 -0
  44. package/dist/admin/comments.js +244 -0
  45. package/dist/admin/comments.js.map +1 -0
  46. package/dist/admin/credentials.d.ts +26 -2
  47. package/dist/admin/credentials.d.ts.map +1 -1
  48. package/dist/admin/credentials.js +35 -2
  49. package/dist/admin/credentials.js.map +1 -1
  50. package/dist/admin/documents.d.ts +127 -10
  51. package/dist/admin/documents.d.ts.map +1 -1
  52. package/dist/admin/documents.js +360 -41
  53. package/dist/admin/documents.js.map +1 -1
  54. package/dist/admin/federation.d.ts +151 -50
  55. package/dist/admin/federation.d.ts.map +1 -1
  56. package/dist/admin/federation.js +225 -93
  57. package/dist/admin/federation.js.map +1 -1
  58. package/dist/admin/formatting.d.ts +20 -0
  59. package/dist/admin/formatting.d.ts.map +1 -0
  60. package/dist/admin/formatting.js +72 -0
  61. package/dist/admin/formatting.js.map +1 -0
  62. package/dist/admin/headers.d.ts +65 -0
  63. package/dist/admin/headers.d.ts.map +1 -0
  64. package/dist/admin/headers.js +104 -0
  65. package/dist/admin/headers.js.map +1 -0
  66. package/dist/admin/index.d.ts +38 -12
  67. package/dist/admin/index.d.ts.map +1 -1
  68. package/dist/admin/index.js +25 -7
  69. package/dist/admin/index.js.map +1 -1
  70. package/dist/admin/media.d.ts +168 -0
  71. package/dist/admin/media.d.ts.map +1 -0
  72. package/dist/admin/media.js +295 -0
  73. package/dist/admin/media.js.map +1 -0
  74. package/dist/admin/menu.d.ts +79 -0
  75. package/dist/admin/menu.d.ts.map +1 -0
  76. package/dist/admin/menu.js +126 -0
  77. package/dist/admin/menu.js.map +1 -0
  78. package/dist/admin/messages.d.ts +80 -0
  79. package/dist/admin/messages.d.ts.map +1 -0
  80. package/dist/admin/messages.js +152 -0
  81. package/dist/admin/messages.js.map +1 -0
  82. package/dist/admin/preview.d.ts.map +1 -1
  83. package/dist/admin/preview.js +31 -7
  84. package/dist/admin/preview.js.map +1 -1
  85. package/dist/admin/recovery.d.ts +92 -0
  86. package/dist/admin/recovery.d.ts.map +1 -0
  87. package/dist/admin/recovery.js +229 -0
  88. package/dist/admin/recovery.js.map +1 -0
  89. package/dist/admin/routes.d.ts +0 -20
  90. package/dist/admin/routes.d.ts.map +1 -1
  91. package/dist/admin/routes.js +155 -105
  92. package/dist/admin/routes.js.map +1 -1
  93. package/dist/admin/settings-discussion.d.ts +37 -0
  94. package/dist/admin/settings-discussion.d.ts.map +1 -0
  95. package/dist/admin/settings-discussion.js +117 -0
  96. package/dist/admin/settings-discussion.js.map +1 -0
  97. package/dist/admin/settings-email.d.ts +54 -0
  98. package/dist/admin/settings-email.d.ts.map +1 -0
  99. package/dist/admin/settings-email.js +189 -0
  100. package/dist/admin/settings-email.js.map +1 -0
  101. package/dist/admin/settings-federation.d.ts +39 -0
  102. package/dist/admin/settings-federation.d.ts.map +1 -0
  103. package/dist/admin/settings-federation.js +103 -0
  104. package/dist/admin/settings-federation.js.map +1 -0
  105. package/dist/admin/settings-general.d.ts +12 -0
  106. package/dist/admin/settings-general.d.ts.map +1 -0
  107. package/dist/admin/settings-general.js +48 -0
  108. package/dist/admin/settings-general.js.map +1 -0
  109. package/dist/admin/settings-page.d.ts +102 -0
  110. package/dist/admin/settings-page.d.ts.map +1 -0
  111. package/dist/admin/settings-page.js +126 -0
  112. package/dist/admin/settings-page.js.map +1 -0
  113. package/dist/admin/settings-pages.d.ts +19 -0
  114. package/dist/admin/settings-pages.d.ts.map +1 -0
  115. package/dist/admin/settings-pages.js +33 -0
  116. package/dist/admin/settings-pages.js.map +1 -0
  117. package/dist/admin/settings-permalinks.d.ts +16 -0
  118. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  119. package/dist/admin/settings-permalinks.js +32 -0
  120. package/dist/admin/settings-permalinks.js.map +1 -0
  121. package/dist/admin/settings-reading.d.ts +33 -0
  122. package/dist/admin/settings-reading.d.ts.map +1 -0
  123. package/dist/admin/settings-reading.js +48 -0
  124. package/dist/admin/settings-reading.js.map +1 -0
  125. package/dist/admin/settings.d.ts +325 -96
  126. package/dist/admin/settings.d.ts.map +1 -1
  127. package/dist/admin/settings.js +650 -308
  128. package/dist/admin/settings.js.map +1 -1
  129. package/dist/admin/store.d.ts +606 -152
  130. package/dist/admin/store.d.ts.map +1 -1
  131. package/dist/admin/store.js +863 -268
  132. package/dist/admin/store.js.map +1 -1
  133. package/dist/admin/taxonomy.d.ts +114 -0
  134. package/dist/admin/taxonomy.d.ts.map +1 -0
  135. package/dist/admin/taxonomy.js +289 -0
  136. package/dist/admin/taxonomy.js.map +1 -0
  137. package/dist/admin/templates.d.ts +44 -14
  138. package/dist/admin/templates.d.ts.map +1 -1
  139. package/dist/admin/templates.js +44 -14
  140. package/dist/admin/templates.js.map +1 -1
  141. package/dist/admin/throttle.d.ts +84 -0
  142. package/dist/admin/throttle.d.ts.map +1 -0
  143. package/dist/admin/throttle.js +143 -0
  144. package/dist/admin/throttle.js.map +1 -0
  145. package/dist/admin/uploads.d.ts +28 -2
  146. package/dist/admin/uploads.d.ts.map +1 -1
  147. package/dist/admin/uploads.js +43 -4
  148. package/dist/admin/uploads.js.map +1 -1
  149. package/dist/admin/users.d.ts +100 -13
  150. package/dist/admin/users.d.ts.map +1 -1
  151. package/dist/admin/users.js +412 -39
  152. package/dist/admin/users.js.map +1 -1
  153. package/dist/cache.d.ts +141 -0
  154. package/dist/cache.d.ts.map +1 -0
  155. package/dist/cache.js +207 -0
  156. package/dist/cache.js.map +1 -0
  157. package/dist/cli.d.ts +14 -2
  158. package/dist/cli.d.ts.map +1 -1
  159. package/dist/cli.js +424 -21
  160. package/dist/cli.js.map +1 -1
  161. package/dist/comments/akismet.d.ts +130 -0
  162. package/dist/comments/akismet.d.ts.map +1 -0
  163. package/dist/comments/akismet.js +274 -0
  164. package/dist/comments/akismet.js.map +1 -0
  165. package/dist/comments/conversation.d.ts +29 -0
  166. package/dist/comments/conversation.d.ts.map +1 -0
  167. package/dist/comments/conversation.js +60 -0
  168. package/dist/comments/conversation.js.map +1 -0
  169. package/dist/comments/form.d.ts +75 -0
  170. package/dist/comments/form.d.ts.map +1 -0
  171. package/dist/comments/form.js +64 -0
  172. package/dist/comments/form.js.map +1 -0
  173. package/dist/comments/index.d.ts +15 -0
  174. package/dist/comments/index.d.ts.map +1 -0
  175. package/dist/comments/index.js +9 -0
  176. package/dist/comments/index.js.map +1 -0
  177. package/dist/comments/markdown.d.ts +8 -0
  178. package/dist/comments/markdown.d.ts.map +1 -0
  179. package/dist/comments/markdown.js +85 -0
  180. package/dist/comments/markdown.js.map +1 -0
  181. package/dist/comments/moderate.d.ts +71 -0
  182. package/dist/comments/moderate.d.ts.map +1 -0
  183. package/dist/comments/moderate.js +88 -0
  184. package/dist/comments/moderate.js.map +1 -0
  185. package/dist/comments/policy.d.ts +57 -0
  186. package/dist/comments/policy.d.ts.map +1 -0
  187. package/dist/comments/policy.js +80 -0
  188. package/dist/comments/policy.js.map +1 -0
  189. package/dist/comments/records.d.ts +266 -0
  190. package/dist/comments/records.d.ts.map +1 -0
  191. package/dist/comments/records.js +487 -0
  192. package/dist/comments/records.js.map +1 -0
  193. package/dist/comments/routes.d.ts +58 -0
  194. package/dist/comments/routes.d.ts.map +1 -0
  195. package/dist/comments/routes.js +177 -0
  196. package/dist/comments/routes.js.map +1 -0
  197. package/dist/comments/submission.d.ts +263 -0
  198. package/dist/comments/submission.d.ts.map +1 -0
  199. package/dist/comments/submission.js +241 -0
  200. package/dist/comments/submission.js.map +1 -0
  201. package/dist/config.d.ts +190 -5
  202. package/dist/config.d.ts.map +1 -1
  203. package/dist/config.js +118 -6
  204. package/dist/config.js.map +1 -1
  205. package/dist/contact/delivery.d.ts +60 -0
  206. package/dist/contact/delivery.d.ts.map +1 -0
  207. package/dist/contact/delivery.js +87 -0
  208. package/dist/contact/delivery.js.map +1 -0
  209. package/dist/contact/form.d.ts +130 -0
  210. package/dist/contact/form.d.ts.map +1 -0
  211. package/dist/contact/form.js +163 -0
  212. package/dist/contact/form.js.map +1 -0
  213. package/dist/contact/index.d.ts +17 -0
  214. package/dist/contact/index.d.ts.map +1 -0
  215. package/dist/contact/index.js +13 -0
  216. package/dist/contact/index.js.map +1 -0
  217. package/dist/contact/records.d.ts +124 -0
  218. package/dist/contact/records.d.ts.map +1 -0
  219. package/dist/contact/records.js +218 -0
  220. package/dist/contact/records.js.map +1 -0
  221. package/dist/contact/routes.d.ts +17 -0
  222. package/dist/contact/routes.d.ts.map +1 -0
  223. package/dist/contact/routes.js +127 -0
  224. package/dist/contact/routes.js.map +1 -0
  225. package/dist/contact/submission.d.ts +103 -0
  226. package/dist/contact/submission.d.ts.map +1 -0
  227. package/dist/contact/submission.js +166 -0
  228. package/dist/contact/submission.js.map +1 -0
  229. package/dist/content/document.d.ts +7 -2
  230. package/dist/content/document.d.ts.map +1 -1
  231. package/dist/content/document.js +1 -0
  232. package/dist/content/document.js.map +1 -1
  233. package/dist/content/index.d.ts +7 -2
  234. package/dist/content/index.d.ts.map +1 -1
  235. package/dist/content/index.js +4 -1
  236. package/dist/content/index.js.map +1 -1
  237. package/dist/content/markdown.d.ts.map +1 -1
  238. package/dist/content/markdown.js +24 -2
  239. package/dist/content/markdown.js.map +1 -1
  240. package/dist/content/parser.d.ts.map +1 -1
  241. package/dist/content/parser.js +11 -4
  242. package/dist/content/parser.js.map +1 -1
  243. package/dist/content/save.d.ts +5 -0
  244. package/dist/content/save.d.ts.map +1 -1
  245. package/dist/content/save.js +44 -1
  246. package/dist/content/save.js.map +1 -1
  247. package/dist/content/schedule.d.ts +125 -0
  248. package/dist/content/schedule.d.ts.map +1 -0
  249. package/dist/content/schedule.js +207 -0
  250. package/dist/content/schedule.js.map +1 -0
  251. package/dist/content/search.d.ts +64 -0
  252. package/dist/content/search.d.ts.map +1 -0
  253. package/dist/content/search.js +136 -0
  254. package/dist/content/search.js.map +1 -0
  255. package/dist/content/store.d.ts +202 -7
  256. package/dist/content/store.d.ts.map +1 -1
  257. package/dist/content/store.js +374 -67
  258. package/dist/content/store.js.map +1 -1
  259. package/dist/content/sync.d.ts +7 -1
  260. package/dist/content/sync.d.ts.map +1 -1
  261. package/dist/content/sync.js +18 -10
  262. package/dist/content/sync.js.map +1 -1
  263. package/dist/content/time.d.ts +56 -0
  264. package/dist/content/time.d.ts.map +1 -0
  265. package/dist/content/time.js +141 -0
  266. package/dist/content/time.js.map +1 -0
  267. package/dist/content/writer.d.ts.map +1 -1
  268. package/dist/content/writer.js +3 -0
  269. package/dist/content/writer.js.map +1 -1
  270. package/dist/env.d.ts +58 -4
  271. package/dist/env.d.ts.map +1 -1
  272. package/dist/federation/actor.d.ts +95 -41
  273. package/dist/federation/actor.d.ts.map +1 -1
  274. package/dist/federation/actor.js +180 -53
  275. package/dist/federation/actor.js.map +1 -1
  276. package/dist/federation/article.d.ts +44 -17
  277. package/dist/federation/article.d.ts.map +1 -1
  278. package/dist/federation/article.js +98 -46
  279. package/dist/federation/article.js.map +1 -1
  280. package/dist/federation/delivery.d.ts +63 -15
  281. package/dist/federation/delivery.d.ts.map +1 -1
  282. package/dist/federation/delivery.js +154 -80
  283. package/dist/federation/delivery.js.map +1 -1
  284. package/dist/federation/federation.d.ts +22 -17
  285. package/dist/federation/federation.d.ts.map +1 -1
  286. package/dist/federation/federation.js +98 -77
  287. package/dist/federation/federation.js.map +1 -1
  288. package/dist/federation/followers.d.ts +3 -2
  289. package/dist/federation/followers.d.ts.map +1 -1
  290. package/dist/federation/followers.js +6 -5
  291. package/dist/federation/followers.js.map +1 -1
  292. package/dist/federation/import-wordpress.d.ts +128 -0
  293. package/dist/federation/import-wordpress.d.ts.map +1 -0
  294. package/dist/federation/import-wordpress.js +426 -0
  295. package/dist/federation/import-wordpress.js.map +1 -0
  296. package/dist/federation/inbox.d.ts +36 -13
  297. package/dist/federation/inbox.d.ts.map +1 -1
  298. package/dist/federation/inbox.js +120 -49
  299. package/dist/federation/inbox.js.map +1 -1
  300. package/dist/federation/index.d.ts +22 -10
  301. package/dist/federation/index.d.ts.map +1 -1
  302. package/dist/federation/index.js +13 -8
  303. package/dist/federation/index.js.map +1 -1
  304. package/dist/federation/keys.d.ts +98 -20
  305. package/dist/federation/keys.d.ts.map +1 -1
  306. package/dist/federation/keys.js +269 -39
  307. package/dist/federation/keys.js.map +1 -1
  308. package/dist/federation/mount.d.ts +42 -10
  309. package/dist/federation/mount.d.ts.map +1 -1
  310. package/dist/federation/mount.js +266 -26
  311. package/dist/federation/mount.js.map +1 -1
  312. package/dist/federation/paths.d.ts +23 -35
  313. package/dist/federation/paths.d.ts.map +1 -1
  314. package/dist/federation/paths.js +26 -39
  315. package/dist/federation/paths.js.map +1 -1
  316. package/dist/federation/records.d.ts +223 -0
  317. package/dist/federation/records.d.ts.map +1 -0
  318. package/dist/federation/records.js +506 -0
  319. package/dist/federation/records.js.map +1 -0
  320. package/dist/federation/relays.d.ts +114 -0
  321. package/dist/federation/relays.d.ts.map +1 -0
  322. package/dist/federation/relays.js +290 -0
  323. package/dist/federation/relays.js.map +1 -0
  324. package/dist/federation/replies.d.ts +80 -0
  325. package/dist/federation/replies.d.ts.map +1 -0
  326. package/dist/federation/replies.js +166 -0
  327. package/dist/federation/replies.js.map +1 -0
  328. package/dist/federation/wordpress.d.ts +131 -0
  329. package/dist/federation/wordpress.d.ts.map +1 -0
  330. package/dist/federation/wordpress.js +341 -0
  331. package/dist/federation/wordpress.js.map +1 -0
  332. package/dist/files/atomic.d.ts +103 -0
  333. package/dist/files/atomic.d.ts.map +1 -0
  334. package/dist/files/atomic.js +150 -0
  335. package/dist/files/atomic.js.map +1 -0
  336. package/dist/files/index.d.ts +3 -0
  337. package/dist/files/index.d.ts.map +1 -0
  338. package/dist/files/index.js +2 -0
  339. package/dist/files/index.js.map +1 -0
  340. package/dist/forms/protection.d.ts +85 -0
  341. package/dist/forms/protection.d.ts.map +1 -0
  342. package/dist/forms/protection.js +116 -0
  343. package/dist/forms/protection.js.map +1 -0
  344. package/dist/images/icons.d.ts +59 -0
  345. package/dist/images/icons.d.ts.map +1 -0
  346. package/dist/images/icons.js +131 -0
  347. package/dist/images/icons.js.map +1 -0
  348. package/dist/images/index.d.ts +7 -0
  349. package/dist/images/index.d.ts.map +1 -0
  350. package/dist/images/index.js +4 -0
  351. package/dist/images/index.js.map +1 -0
  352. package/dist/images/markup.d.ts +47 -0
  353. package/dist/images/markup.d.ts.map +1 -0
  354. package/dist/images/markup.js +175 -0
  355. package/dist/images/markup.js.map +1 -0
  356. package/dist/images/paths.d.ts +34 -0
  357. package/dist/images/paths.d.ts.map +1 -0
  358. package/dist/images/paths.js +41 -0
  359. package/dist/images/paths.js.map +1 -0
  360. package/dist/images/variants.d.ts +104 -0
  361. package/dist/images/variants.d.ts.map +1 -0
  362. package/dist/images/variants.js +320 -0
  363. package/dist/images/variants.js.map +1 -0
  364. package/dist/index.d.ts +123 -19
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +327 -25
  367. package/dist/index.js.map +1 -1
  368. package/dist/init.d.ts +18 -0
  369. package/dist/init.d.ts.map +1 -1
  370. package/dist/init.js +34 -3
  371. package/dist/init.js.map +1 -1
  372. package/dist/mail/brevo.d.ts +35 -0
  373. package/dist/mail/brevo.d.ts.map +1 -0
  374. package/dist/mail/brevo.js +85 -0
  375. package/dist/mail/brevo.js.map +1 -0
  376. package/dist/mail/credentials.d.ts +62 -0
  377. package/dist/mail/credentials.d.ts.map +1 -0
  378. package/dist/mail/credentials.js +86 -0
  379. package/dist/mail/credentials.js.map +1 -0
  380. package/dist/mail/index.d.ts +15 -0
  381. package/dist/mail/index.d.ts.map +1 -0
  382. package/dist/mail/index.js +8 -0
  383. package/dist/mail/index.js.map +1 -0
  384. package/dist/mail/memory.d.ts +35 -0
  385. package/dist/mail/memory.d.ts.map +1 -0
  386. package/dist/mail/memory.js +29 -0
  387. package/dist/mail/memory.js.map +1 -0
  388. package/dist/mail/provider.d.ts +80 -0
  389. package/dist/mail/provider.d.ts.map +1 -0
  390. package/dist/mail/provider.js +23 -0
  391. package/dist/mail/provider.js.map +1 -0
  392. package/dist/mail/service.d.ts +156 -0
  393. package/dist/mail/service.d.ts.map +1 -0
  394. package/dist/mail/service.js +265 -0
  395. package/dist/mail/service.js.map +1 -0
  396. package/dist/mail/smtp.d.ts +39 -0
  397. package/dist/mail/smtp.d.ts.map +1 -0
  398. package/dist/mail/smtp.js +58 -0
  399. package/dist/mail/smtp.js.map +1 -0
  400. package/dist/mail/templates.d.ts +91 -0
  401. package/dist/mail/templates.d.ts.map +1 -0
  402. package/dist/mail/templates.js +69 -0
  403. package/dist/mail/templates.js.map +1 -0
  404. package/dist/notifications/comments.d.ts +66 -0
  405. package/dist/notifications/comments.d.ts.map +1 -0
  406. package/dist/notifications/comments.js +151 -0
  407. package/dist/notifications/comments.js.map +1 -0
  408. package/dist/notifications/digest.d.ts +135 -0
  409. package/dist/notifications/digest.d.ts.map +1 -0
  410. package/dist/notifications/digest.js +287 -0
  411. package/dist/notifications/digest.js.map +1 -0
  412. package/dist/notifications/index.d.ts +13 -0
  413. package/dist/notifications/index.d.ts.map +1 -0
  414. package/dist/notifications/index.js +8 -0
  415. package/dist/notifications/index.js.map +1 -0
  416. package/dist/notifications/links.d.ts +60 -0
  417. package/dist/notifications/links.d.ts.map +1 -0
  418. package/dist/notifications/links.js +63 -0
  419. package/dist/notifications/links.js.map +1 -0
  420. package/dist/notifications/optouts.d.ts +48 -0
  421. package/dist/notifications/optouts.d.ts.map +1 -0
  422. package/dist/notifications/optouts.js +93 -0
  423. package/dist/notifications/optouts.js.map +1 -0
  424. package/dist/notifications/preferences.d.ts +158 -0
  425. package/dist/notifications/preferences.d.ts.map +1 -0
  426. package/dist/notifications/preferences.js +195 -0
  427. package/dist/notifications/preferences.js.map +1 -0
  428. package/dist/notifications/routes.d.ts +28 -0
  429. package/dist/notifications/routes.d.ts.map +1 -0
  430. package/dist/notifications/routes.js +184 -0
  431. package/dist/notifications/routes.js.map +1 -0
  432. package/dist/notifications/tokens.d.ts +60 -0
  433. package/dist/notifications/tokens.d.ts.map +1 -0
  434. package/dist/notifications/tokens.js +125 -0
  435. package/dist/notifications/tokens.js.map +1 -0
  436. package/dist/notify.d.ts +84 -0
  437. package/dist/notify.d.ts.map +1 -0
  438. package/dist/notify.js +149 -0
  439. package/dist/notify.js.map +1 -0
  440. package/dist/web/archive.d.ts +49 -0
  441. package/dist/web/archive.d.ts.map +1 -0
  442. package/dist/web/archive.js +59 -0
  443. package/dist/web/archive.js.map +1 -0
  444. package/dist/web/assets.d.ts +6 -5
  445. package/dist/web/assets.d.ts.map +1 -1
  446. package/dist/web/assets.js +5 -7
  447. package/dist/web/assets.js.map +1 -1
  448. package/dist/web/authors.d.ts +143 -0
  449. package/dist/web/authors.d.ts.map +1 -0
  450. package/dist/web/authors.js +178 -0
  451. package/dist/web/authors.js.map +1 -0
  452. package/dist/web/comments.d.ts +60 -0
  453. package/dist/web/comments.d.ts.map +1 -0
  454. package/dist/web/comments.js +207 -0
  455. package/dist/web/comments.js.map +1 -0
  456. package/dist/web/context.d.ts +162 -28
  457. package/dist/web/context.d.ts.map +1 -1
  458. package/dist/web/context.js +123 -26
  459. package/dist/web/context.js.map +1 -1
  460. package/dist/web/conversation.d.ts +209 -0
  461. package/dist/web/conversation.d.ts.map +1 -0
  462. package/dist/web/conversation.js +557 -0
  463. package/dist/web/conversation.js.map +1 -0
  464. package/dist/web/documents.d.ts +36 -6
  465. package/dist/web/documents.d.ts.map +1 -1
  466. package/dist/web/documents.js +52 -10
  467. package/dist/web/documents.js.map +1 -1
  468. package/dist/web/feed-atom.d.ts +22 -0
  469. package/dist/web/feed-atom.d.ts.map +1 -0
  470. package/dist/web/feed-atom.js +83 -0
  471. package/dist/web/feed-atom.js.map +1 -0
  472. package/dist/web/feed-item.d.ts +145 -0
  473. package/dist/web/feed-item.d.ts.map +1 -0
  474. package/dist/web/feed-item.js +120 -0
  475. package/dist/web/feed-item.js.map +1 -0
  476. package/dist/web/feed-json.d.ts +79 -0
  477. package/dist/web/feed-json.d.ts.map +1 -0
  478. package/dist/web/feed-json.js +53 -0
  479. package/dist/web/feed-json.js.map +1 -0
  480. package/dist/web/feed-rss.d.ts +26 -0
  481. package/dist/web/feed-rss.d.ts.map +1 -0
  482. package/dist/web/feed-rss.js +203 -0
  483. package/dist/web/feed-rss.js.map +1 -0
  484. package/dist/web/feed-source.d.ts +244 -0
  485. package/dist/web/feed-source.d.ts.map +1 -0
  486. package/dist/web/feed-source.js +201 -0
  487. package/dist/web/feed-source.js.map +1 -0
  488. package/dist/web/feed-xml.d.ts +63 -0
  489. package/dist/web/feed-xml.d.ts.map +1 -0
  490. package/dist/web/feed-xml.js +116 -0
  491. package/dist/web/feed-xml.js.map +1 -0
  492. package/dist/web/feeds.d.ts +31 -96
  493. package/dist/web/feeds.d.ts.map +1 -1
  494. package/dist/web/feeds.js +94 -198
  495. package/dist/web/feeds.js.map +1 -1
  496. package/dist/web/health.d.ts +31 -0
  497. package/dist/web/health.d.ts.map +1 -0
  498. package/dist/web/health.js +44 -0
  499. package/dist/web/health.js.map +1 -0
  500. package/dist/web/index.d.ts +30 -10
  501. package/dist/web/index.d.ts.map +1 -1
  502. package/dist/web/index.js +18 -7
  503. package/dist/web/index.js.map +1 -1
  504. package/dist/web/navigation.d.ts +73 -0
  505. package/dist/web/navigation.d.ts.map +1 -0
  506. package/dist/web/navigation.js +110 -0
  507. package/dist/web/navigation.js.map +1 -0
  508. package/dist/web/negotiate.d.ts +9 -0
  509. package/dist/web/negotiate.d.ts.map +1 -1
  510. package/dist/web/negotiate.js +6 -1
  511. package/dist/web/negotiate.js.map +1 -1
  512. package/dist/web/recent.d.ts +43 -0
  513. package/dist/web/recent.d.ts.map +1 -0
  514. package/dist/web/recent.js +37 -0
  515. package/dist/web/recent.js.map +1 -0
  516. package/dist/web/render.d.ts +197 -9
  517. package/dist/web/render.d.ts.map +1 -1
  518. package/dist/web/render.js +334 -17
  519. package/dist/web/render.js.map +1 -1
  520. package/dist/web/routes.d.ts +25 -8
  521. package/dist/web/routes.d.ts.map +1 -1
  522. package/dist/web/routes.js +845 -93
  523. package/dist/web/routes.js.map +1 -1
  524. package/dist/web/sanitize.d.ts +19 -0
  525. package/dist/web/sanitize.d.ts.map +1 -0
  526. package/dist/web/sanitize.js +272 -0
  527. package/dist/web/sanitize.js.map +1 -0
  528. package/dist/web/search.d.ts +79 -0
  529. package/dist/web/search.d.ts.map +1 -0
  530. package/dist/web/search.js +94 -0
  531. package/dist/web/search.js.map +1 -0
  532. package/dist/web/sitemap.d.ts +120 -0
  533. package/dist/web/sitemap.d.ts.map +1 -0
  534. package/dist/web/sitemap.js +199 -0
  535. package/dist/web/sitemap.js.map +1 -0
  536. package/dist/web/taxonomy.d.ts +152 -0
  537. package/dist/web/taxonomy.d.ts.map +1 -0
  538. package/dist/web/taxonomy.js +237 -0
  539. package/dist/web/taxonomy.js.map +1 -0
  540. package/dist/web/templates.d.ts +54 -16
  541. package/dist/web/templates.d.ts.map +1 -1
  542. package/dist/web/templates.js +109 -28
  543. package/dist/web/templates.js.map +1 -1
  544. package/dist/web/themes.d.ts +205 -0
  545. package/dist/web/themes.d.ts.map +1 -0
  546. package/dist/web/themes.js +277 -0
  547. package/dist/web/themes.js.map +1 -0
  548. package/dist/webmention/discovery.d.ts +51 -0
  549. package/dist/webmention/discovery.d.ts.map +1 -0
  550. package/dist/webmention/discovery.js +176 -0
  551. package/dist/webmention/discovery.js.map +1 -0
  552. package/dist/webmention/html.d.ts +71 -0
  553. package/dist/webmention/html.d.ts.map +1 -0
  554. package/dist/webmention/html.js +285 -0
  555. package/dist/webmention/html.js.map +1 -0
  556. package/dist/webmention/index.d.ts +12 -0
  557. package/dist/webmention/index.d.ts.map +1 -0
  558. package/dist/webmention/index.js +8 -0
  559. package/dist/webmention/index.js.map +1 -0
  560. package/dist/webmention/links.d.ts +18 -0
  561. package/dist/webmention/links.d.ts.map +1 -0
  562. package/dist/webmention/links.js +64 -0
  563. package/dist/webmention/links.js.map +1 -0
  564. package/dist/webmention/microformats.d.ts +93 -0
  565. package/dist/webmention/microformats.d.ts.map +1 -0
  566. package/dist/webmention/microformats.js +376 -0
  567. package/dist/webmention/microformats.js.map +1 -0
  568. package/dist/webmention/receive.d.ts +141 -0
  569. package/dist/webmention/receive.d.ts.map +1 -0
  570. package/dist/webmention/receive.js +264 -0
  571. package/dist/webmention/receive.js.map +1 -0
  572. package/dist/webmention/routes.d.ts +37 -0
  573. package/dist/webmention/routes.d.ts.map +1 -0
  574. package/dist/webmention/routes.js +75 -0
  575. package/dist/webmention/routes.js.map +1 -0
  576. package/dist/webmention/service.d.ts +94 -0
  577. package/dist/webmention/service.d.ts.map +1 -0
  578. package/dist/webmention/service.js +207 -0
  579. package/dist/webmention/service.js.map +1 -0
  580. package/package.json +11 -6
  581. package/templates/site/content/_data/site.json +1 -0
  582. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  583. package/templates/site/geekity.config.ts +11 -1
  584. package/templates/site/tsconfig.json +1 -1
  585. package/themes/default/README.md +1096 -50
  586. package/themes/default/layouts/404.njk +2 -3
  587. package/themes/default/layouts/author.njk +37 -0
  588. package/themes/default/layouts/base.njk +172 -31
  589. package/themes/default/layouts/category.njk +27 -0
  590. package/themes/default/layouts/front-page.njk +57 -0
  591. package/themes/default/layouts/home.njk +17 -1
  592. package/themes/default/layouts/page.njk +57 -5
  593. package/themes/default/layouts/post.njk +78 -19
  594. package/themes/default/layouts/search.njk +57 -0
  595. package/themes/default/layouts/tag.njk +3 -6
  596. package/themes/default/mail/comment-digest.html.njk +37 -0
  597. package/themes/default/mail/comment-digest.subject.njk +3 -0
  598. package/themes/default/mail/comment-digest.txt.njk +40 -0
  599. package/themes/default/mail/comment-pending.html.njk +27 -0
  600. package/themes/default/mail/comment-pending.subject.njk +2 -0
  601. package/themes/default/mail/comment-pending.txt.njk +24 -0
  602. package/themes/default/mail/comment-reply.html.njk +21 -0
  603. package/themes/default/mail/comment-reply.subject.njk +2 -0
  604. package/themes/default/mail/comment-reply.txt.njk +22 -0
  605. package/themes/default/mail/contact-message.html.njk +24 -0
  606. package/themes/default/mail/contact-message.subject.njk +5 -0
  607. package/themes/default/mail/contact-message.txt.njk +20 -0
  608. package/themes/default/mail/password-changed.html.njk +18 -0
  609. package/themes/default/mail/password-changed.subject.njk +2 -0
  610. package/themes/default/mail/password-changed.txt.njk +17 -0
  611. package/themes/default/mail/password-reset.html.njk +22 -0
  612. package/themes/default/mail/password-reset.subject.njk +2 -0
  613. package/themes/default/mail/password-reset.txt.njk +18 -0
  614. package/themes/default/mail/test.html.njk +14 -0
  615. package/themes/default/mail/test.subject.njk +2 -0
  616. package/themes/default/mail/test.txt.njk +12 -0
  617. package/themes/default/partials/archive.njk +27 -0
  618. package/themes/default/partials/bio.njk +77 -0
  619. package/themes/default/partials/comment-form.njk +109 -0
  620. package/themes/default/partials/contact-form.njk +88 -0
  621. package/themes/default/partials/conversation.njk +139 -0
  622. package/themes/default/partials/feeds.njk +26 -0
  623. package/themes/default/partials/jsonld.njk +120 -0
  624. package/themes/default/partials/pagination.njk +12 -6
  625. package/themes/default/partials/post-list.njk +51 -18
  626. package/themes/default/partials/search-form.njk +17 -0
  627. package/themes/default/partials/tags.njk +26 -5
  628. package/themes/default/static/highlight.js +4 -0
  629. package/themes/default/static/style.css +1119 -194
  630. package/themes/default/theme.json +5 -0
  631. package/admin/layouts/document-editor.njk +0 -167
  632. package/admin/layouts/federation.njk +0 -145
  633. package/admin/layouts/login.njk +0 -23
  634. package/admin/layouts/settings.njk +0 -116
  635. package/admin/layouts/setup.njk +0 -27
  636. package/admin/layouts/users.njk +0 -91
  637. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -1,228 +1,767 @@
1
1
  /*
2
2
  * The default theme's only stylesheet. Plain CSS, no build step, no
3
- * dependencies: a site that wants something else drops its own
4
- * `theme/static/style.css` in and this file is never read again.
3
+ * dependencies: a site that wants something else puts its own
4
+ * `static/style.css` in the theme it wears and this file is never read again.
5
+ *
6
+ * The design is the andrewshell.org one (decision-16): a serif body and sans
7
+ * headings at an 18px root on a 1.2 minor-third scale, warm paper, near-black
8
+ * text, a rust primary and a blue secondary, one column at 42rem, links that
9
+ * invert on hover and a rule in the primary colour.
10
+ *
11
+ * The source is light only. The dark scheme below is the same design on dark
12
+ * paper, with the rust and the blue lifted until every text and background pair
13
+ * meets WCAG 2.2 AA — 4.5:1 for body text, 3:1 for large text, rules and focus
14
+ * outlines — in both schemes. `src/web/theme-colors.test.ts` reads the custom
15
+ * properties out of this file and computes the ratios, so a colour changed here
16
+ * that breaks one fails the build rather than a reader.
5
17
  */
6
18
 
7
19
  :root {
20
+ /* Light and dark are both drawn below, so a browser may paint its own form
21
+ controls, scrollbars and spellcheck marks to match. */
8
22
  color-scheme: light dark;
9
23
 
10
- --measure: 38rem;
11
- --gutter: 1.25rem;
24
+ --maxWidth-xs: 20rem;
25
+ --maxWidth-sm: 24rem;
26
+ --maxWidth-md: 28rem;
27
+ --maxWidth-lg: 32rem;
28
+ --maxWidth-xl: 36rem;
29
+ --maxWidth-2xl: 42rem;
30
+ --maxWidth-3xl: 48rem;
31
+ --maxWidth-4xl: 56rem;
32
+ --maxWidth-wrapper: var(--maxWidth-2xl);
12
33
 
13
- --ink: #17181c;
14
- --ink-muted: #5b6070;
15
- --paper: #fdfdfc;
16
- --paper-sunk: #f2f2ef;
17
- --rule: #dcdcd6;
18
- --accent: #1c4fd8;
19
- --accent-visited: #6b3fb8;
34
+ --spacing-0: 0;
35
+ --spacing-1: 0.25rem;
36
+ --spacing-2: 0.5rem;
37
+ --spacing-3: 0.75rem;
38
+ --spacing-4: 1rem;
39
+ --spacing-5: 1.25rem;
40
+ --spacing-6: 1.5rem;
41
+ --spacing-8: 2rem;
42
+ --spacing-10: 2.5rem;
43
+ --spacing-12: 3rem;
44
+ --spacing-16: 4rem;
45
+ --spacing-20: 5rem;
46
+ --spacing-24: 6rem;
47
+ --spacing-32: 8rem;
48
+
49
+ --fontFamily-sans: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
50
+ --fontFamily-serif: 'Iowan Old Style', 'Palatino Linotype', 'URW Palladio L', P052, serif;
51
+ --fontFamily-mono:
52
+ ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
53
+ --font-body: var(--fontFamily-serif);
54
+ --font-heading: var(--fontFamily-sans);
55
+
56
+ --fontWeight-normal: 400;
57
+ --fontWeight-medium: 500;
58
+ --fontWeight-semibold: 600;
59
+ --fontWeight-bold: 700;
60
+ --fontWeight-extrabold: 800;
61
+ --fontWeight-black: 900;
62
+
63
+ --fontSize-root: 18px;
64
+ --lineHeight-none: 1;
65
+ --lineHeight-tight: 1.1;
66
+ --lineHeight-normal: 1.5;
67
+ --lineHeight-relaxed: 1.625;
68
+
69
+ /* 1.200 minor third type scale */
70
+ --fontSize-0: 0.833rem;
71
+ --fontSize-1: 1rem;
72
+ --fontSize-2: 1.15rem;
73
+ --fontSize-3: 1.31rem;
74
+ --fontSize-4: 1.5rem;
75
+ --fontSize-5: 1.72rem;
76
+ --fontSize-6: 1.97rem;
77
+ --fontSize-7: 2.25rem;
78
+
79
+ --content-letter-spacing: -0.01em;
80
+
81
+ /* Colours. `body` is the paper and `text` the ink; `base`, `base-2` and
82
+ `base-3` are the surfaces that sit on the paper, warm, cool and raised.
83
+ `code-background` and `code-text` are a block of code, named rather than
84
+ folded into `base` so a highlighting theme has something to be measured
85
+ against (TASK-86). */
86
+ --color-body: #fdfcfb;
87
+ --color-text: #240b00;
88
+ --color-primary: #b33900;
89
+ --color-secondary: #007ab3;
90
+ --color-base: rgb(245 243 243);
91
+ --color-base-2: rgb(247 248 249);
92
+ --color-base-3: rgb(255 255 255);
93
+ --color-code-background: #f6f3f1;
94
+ --color-code-text: #240b00;
95
+ --color-error: #b3261e;
96
+
97
+ /* Syntax highlighting: the Tomorrow palette, light member (TASK-86). The
98
+ names are what each colour marks up, and the base16 slot they come from is
99
+ in the comment; the highlighter is highlight.js, whose base16 Tomorrow
100
+ theme is the mapping these follow.
101
+
102
+ Five of them are not the stock colour. Tomorrow was drawn for an editor,
103
+ where a faint comment is a feature; on this paper the stock greys, orange,
104
+ yellow, green and teal read at 1.7:1 to 3.5:1, so each was darkened along
105
+ its own hue until it made 4.5:1 and no further. `src/web/theme-colors.test.ts`
106
+ is what keeps that true. */
107
+ --color-code-comment: #6c6d6a; /* base03, stock #8e908c */
108
+ --color-code-tag: #6b6d6b; /* base04, stock #969896 */
109
+ --color-code-name: #c82829; /* base08 */
110
+ --color-code-literal: #a95608; /* base09, stock #f5871f */
111
+ --color-code-class: #846700; /* base0A, stock #eab700 */
112
+ --color-code-string: #5e7500; /* base0B, stock #718c00 */
113
+ --color-code-support: #30767a; /* base0C, stock #3e999f */
114
+ --color-code-function: #4271ae; /* base0D */
115
+ --color-code-keyword: #8959a8; /* base0E */
116
+ --color-code-meta: #945f52; /* base0F, stock #a3685a */
117
+ --color-code-added-background: #dff0d8;
118
+ --color-code-removed-background: #f8dcdc;
20
119
  }
21
120
 
22
121
  @media (prefers-color-scheme: dark) {
23
122
  :root {
24
- --ink: #e8e8ea;
25
- --ink-muted: #a0a4b2;
26
- --paper: #16171a;
27
- --paper-sunk: #1e2024;
28
- --rule: #32343a;
29
- --accent: #86aaff;
30
- --accent-visited: #c3a8f5;
123
+ --color-body: #191110;
124
+ --color-text: #f4ece7;
125
+ --color-primary: #ef7a48;
126
+ --color-secondary: #3ea0d8;
127
+ --color-base: rgb(38 30 28);
128
+ --color-base-2: rgb(34 33 36);
129
+ --color-base-3: rgb(45 36 33);
130
+ --color-code-background: rgb(30 24 22);
131
+ --color-code-text: #f4ece7;
132
+ --color-error: #ff8093;
133
+
134
+ /* The other member of the family, Tomorrow Night — the palette both source
135
+ sites highlighted with, and the one highlight.js ships under that name.
136
+ Only base0F needed lifting off this darker paper. */
137
+ --color-code-comment: #999999; /* base03 */
138
+ --color-code-tag: #b4b7b4; /* base04 */
139
+ --color-code-name: #f2777a; /* base08 */
140
+ --color-code-literal: #f99157; /* base09 */
141
+ --color-code-class: #ffcc66; /* base0A */
142
+ --color-code-string: #99cc99; /* base0B */
143
+ --color-code-support: #66cccc; /* base0C */
144
+ --color-code-function: #6699cc; /* base0D */
145
+ --color-code-keyword: #cc99cc; /* base0E */
146
+ --color-code-meta: #ae786b; /* base0F, stock #a3685a */
147
+ --color-code-added-background: rgb(32 54 34);
148
+ --color-code-removed-background: rgb(64 30 30);
31
149
  }
32
150
  }
33
151
 
152
+ /* Reset. The source theme leans on a normalize file; the handful of rules it
153
+ actually depends on are folded in here instead, so the theme is one file. */
154
+
34
155
  *,
35
156
  *::before,
36
157
  *::after {
37
158
  box-sizing: border-box;
38
159
  }
39
160
 
161
+ body,
162
+ h1,
163
+ h2,
164
+ h3,
165
+ h4,
166
+ h5,
167
+ h6,
168
+ p,
169
+ figure,
170
+ blockquote,
171
+ dl,
172
+ dd {
173
+ margin: 0;
174
+ }
175
+
176
+ /* HTML elements */
177
+
40
178
  html {
179
+ font-size: var(--fontSize-root);
180
+ line-height: var(--lineHeight-relaxed);
41
181
  -webkit-text-size-adjust: 100%;
182
+ -webkit-font-smoothing: antialiased;
183
+ -moz-osx-font-smoothing: grayscale;
42
184
  }
43
185
 
44
186
  body {
45
- margin: 0;
46
- padding: 0 var(--gutter);
47
- background: var(--paper);
48
- color: var(--ink);
49
- font:
50
- 1rem/1.6 system-ui,
51
- -apple-system,
52
- 'Segoe UI',
53
- Roboto,
54
- sans-serif;
55
- text-rendering: optimizeLegibility;
56
- }
57
-
58
- a {
59
- color: var(--accent);
60
- text-decoration-thickness: 1px;
61
- text-underline-offset: 0.15em;
187
+ background-color: var(--color-body);
188
+ color: var(--color-text);
189
+ font-family: var(--font-body);
190
+ font-size: var(--fontSize-1);
191
+ text-rendering: optimizeSpeed;
62
192
  }
63
193
 
64
- a:visited {
65
- color: var(--accent-visited);
194
+ footer {
195
+ padding: var(--spacing-6) var(--spacing-0);
196
+ font-family: var(--fontFamily-sans);
66
197
  }
67
198
 
68
- .skip-link {
69
- position: absolute;
70
- left: -9999px;
199
+ nav,
200
+ .bio {
201
+ font-family: var(--fontFamily-sans);
71
202
  }
72
203
 
73
- .skip-link:focus {
74
- position: static;
75
- display: inline-block;
76
- padding: 0.5rem;
204
+ hr {
205
+ height: 1px;
206
+ border: 0;
207
+ background: var(--color-primary);
208
+ }
209
+
210
+ img {
211
+ max-width: 100%;
212
+ height: auto;
77
213
  }
78
214
 
79
- /* Header and footer */
215
+ figure {
216
+ margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
217
+ }
80
218
 
81
- .site-header,
82
- .site-footer,
83
- .site-main {
84
- max-width: var(--measure);
85
- margin-inline: auto;
219
+ figcaption {
220
+ font-size: var(--fontSize-0);
221
+ text-align: center;
86
222
  }
87
223
 
88
- .site-header {
89
- padding: 2.5rem 0 1.5rem;
90
- border-bottom: 1px solid var(--rule);
224
+ time {
225
+ white-space: nowrap;
91
226
  }
92
227
 
93
- .site-title {
94
- margin: 0;
95
- font-size: 1.35rem;
96
- font-weight: 700;
97
- letter-spacing: -0.01em;
228
+ small,
229
+ .small {
230
+ font-size: var(--fontSize-0);
231
+ }
232
+
233
+ /* Headings */
234
+
235
+ h1,
236
+ h2,
237
+ h3,
238
+ h4,
239
+ h5,
240
+ h6 {
241
+ margin-top: var(--spacing-12);
242
+ margin-bottom: var(--spacing-6);
243
+ color: var(--color-text);
244
+ font-family: var(--font-heading);
245
+ font-weight: var(--fontWeight-bold);
246
+ line-height: var(--lineHeight-tight);
247
+ letter-spacing: -0.025em;
248
+ }
249
+
250
+ h1 {
251
+ font-size: var(--fontSize-6);
252
+ font-weight: var(--fontWeight-black);
253
+ }
254
+
255
+ h2 {
256
+ font-size: var(--fontSize-5);
257
+ }
258
+
259
+ h3 {
260
+ font-size: var(--fontSize-3);
261
+ }
262
+
263
+ h4,
264
+ h5,
265
+ h6 {
266
+ font-size: var(--fontSize-1);
98
267
  }
99
268
 
100
- .site-title a {
269
+ h2 > a,
270
+ h3 > a,
271
+ h4 > a,
272
+ h5 > a,
273
+ h6 > a {
101
274
  color: inherit;
102
275
  text-decoration: none;
103
276
  }
104
277
 
105
- .site-tagline {
106
- margin: 0.35rem 0 0;
107
- color: var(--ink-muted);
278
+ /* Links. A link inverts on hover: the primary colour behind it and the paper
279
+ colour on top, which is the source design's one flourish. `:focus-visible`
280
+ draws an outline instead, so a keyboard reader sees where they are without
281
+ the colour swapping under them. */
282
+
283
+ a,
284
+ a:visited {
285
+ color: var(--color-primary);
108
286
  }
109
287
 
110
- .site-main {
111
- padding: 2rem 0 3rem;
288
+ a:hover,
289
+ a:focus {
290
+ background-color: var(--color-primary);
291
+ color: var(--color-body);
292
+ text-decoration: none;
112
293
  }
113
294
 
114
- .site-footer {
115
- padding: 1.5rem 0 3rem;
116
- border-top: 1px solid var(--rule);
117
- color: var(--ink-muted);
118
- font-size: 0.9rem;
295
+ a:focus-visible {
296
+ outline: 2px solid var(--color-primary);
297
+ outline-offset: 2px;
298
+ background-color: transparent;
299
+ color: var(--color-primary);
119
300
  }
120
301
 
121
- .site-colophon {
122
- display: inline-block;
302
+ header a,
303
+ header a:visited {
304
+ color: var(--color-text);
305
+ text-decoration: none;
306
+ }
307
+
308
+ header a:hover,
309
+ header a:focus {
310
+ background-color: var(--color-primary);
311
+ color: var(--color-body);
312
+ text-decoration: none;
123
313
  }
124
314
 
125
- /* Titles */
315
+ /* Prose */
126
316
 
127
- .page-title,
128
- .post-title {
129
- margin: 0 0 0.35rem;
130
- font-size: 1.9rem;
131
- line-height: 1.2;
132
- letter-spacing: -0.02em;
317
+ p {
318
+ margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
319
+ padding: var(--spacing-0);
320
+ line-height: var(--lineHeight-relaxed);
133
321
  }
134
322
 
135
- .post-meta {
136
- margin: 0 0 1.75rem;
137
- color: var(--ink-muted);
138
- font-size: 0.9rem;
323
+ ul,
324
+ ol {
325
+ margin-top: var(--spacing-0);
326
+ margin-right: var(--spacing-0);
327
+ margin-bottom: var(--spacing-8);
328
+ margin-left: var(--spacing-4);
329
+ padding: var(--spacing-0);
330
+ list-style-position: inside;
331
+ list-style-image: none;
139
332
  }
140
333
 
141
- /* Listings */
334
+ ul li,
335
+ ol li {
336
+ margin-bottom: var(--spacing-0);
337
+ padding-left: var(--spacing-0);
338
+ }
339
+
340
+ li > p {
341
+ display: inline;
342
+ }
343
+
344
+ li *:last-child {
345
+ margin-bottom: var(--spacing-0);
346
+ }
347
+
348
+ details {
349
+ margin-left: var(--spacing-4);
350
+ }
351
+
352
+ details summary {
353
+ cursor: pointer;
354
+ }
355
+
356
+ .list-none {
357
+ list-style-type: none;
358
+ }
142
359
 
143
- .post-list {
360
+ .hlist {
361
+ display: flex;
362
+ flex-wrap: wrap;
363
+ margin: 0;
364
+ }
365
+
366
+ .hlist li {
144
367
  margin: 0;
368
+ padding: 0 0.5em 0 0;
369
+ list-style-type: none;
370
+ }
371
+
372
+ blockquote {
373
+ margin: var(--spacing-8) var(--spacing-8) var(--spacing-8) var(--spacing-0);
374
+ padding: var(--spacing-0) var(--spacing-0) var(--spacing-0) var(--spacing-6);
375
+ border-left: var(--spacing-1) solid var(--color-secondary);
376
+ color: var(--color-secondary);
377
+ font-size: var(--fontSize-2);
378
+ font-style: italic;
379
+ }
380
+
381
+ blockquote > :last-child {
382
+ margin-bottom: var(--spacing-0);
383
+ }
384
+
385
+ blockquote > ul,
386
+ blockquote > ol {
387
+ list-style-position: inside;
388
+ }
389
+
390
+ table {
391
+ width: 100%;
392
+ margin-bottom: var(--spacing-8);
393
+ border-collapse: collapse;
394
+ border-spacing: 0.25rem;
395
+ }
396
+
397
+ table thead tr th {
398
+ border-bottom: 1px solid var(--color-primary);
399
+ }
400
+
401
+ pre,
402
+ code,
403
+ kbd,
404
+ samp {
405
+ font-family: var(--fontFamily-mono);
406
+ }
407
+
408
+ code {
409
+ padding: 0.1em 0.3em;
410
+ border-radius: 4px;
411
+ background-color: var(--color-code-background);
412
+ color: var(--color-code-text);
413
+ font-size: 0.9em;
414
+ /* A file path or an identifier is one long word, and a narrow screen would
415
+ otherwise carry it off the side of the page. A block of code scrolls
416
+ instead — see `pre` below. */
417
+ overflow-wrap: break-word;
418
+ }
419
+
420
+ pre {
421
+ overflow-x: auto;
422
+ margin-bottom: var(--spacing-8);
423
+ padding: var(--spacing-3) var(--spacing-4);
424
+ border-radius: 6px;
425
+ background-color: var(--color-code-background);
426
+ color: var(--color-code-text);
427
+ font-size: var(--fontSize-0);
428
+ line-height: var(--lineHeight-normal);
429
+ }
430
+
431
+ pre code {
145
432
  padding: 0;
146
- list-style: none;
433
+ border-radius: 0;
434
+ background: none;
435
+ font-size: inherit;
147
436
  }
148
437
 
149
- .post-list-item + .post-list-item {
150
- margin-top: 2.25rem;
151
- padding-top: 2.25rem;
152
- border-top: 1px solid var(--rule);
438
+ /* Syntax highlighting (TASK-86).
439
+ *
440
+ * The CMS renders a fenced block as `pre > code.language-x` and highlights
441
+ * nothing; `static/highlight.js` marks the tokens up on the client, and these
442
+ * are its colours. The scopes and the slots they map to are highlight.js's own
443
+ * base16 Tomorrow theme, so a token it invents later lands somewhere sensible
444
+ * rather than nowhere.
445
+ *
446
+ * Every colour is a custom property, so a site that wants another palette
447
+ * redefines a dozen tokens instead of writing a syntax theme. Delimiters,
448
+ * operators and substitutions are deliberately the block's own ink: they are
449
+ * most of the characters on screen and a colour there is noise.
450
+ */
451
+
452
+ .hljs-comment {
453
+ color: var(--color-code-comment);
153
454
  }
154
455
 
155
- .post-summary-title {
156
- margin: 0 0 0.3rem;
157
- font-size: 1.3rem;
158
- line-height: 1.3;
456
+ .hljs-tag {
457
+ color: var(--color-code-tag);
159
458
  }
160
459
 
161
- .post-summary-title a {
162
- color: inherit;
460
+ .hljs-subst,
461
+ .hljs-punctuation,
462
+ .hljs-operator {
463
+ color: var(--color-code-text);
464
+ }
465
+
466
+ .hljs-bullet,
467
+ .hljs-variable,
468
+ .hljs-template-variable,
469
+ .hljs-selector-tag,
470
+ .hljs-name {
471
+ color: var(--color-code-name);
472
+ }
473
+
474
+ .hljs-symbol,
475
+ .hljs-number,
476
+ .hljs-link,
477
+ .hljs-attr,
478
+ .hljs-variable.constant_,
479
+ .hljs-literal {
480
+ color: var(--color-code-literal);
481
+ }
482
+
483
+ .hljs-title,
484
+ .hljs-class .hljs-title,
485
+ .hljs-title.class_ {
486
+ color: var(--color-code-class);
487
+ }
488
+
489
+ .hljs-strong {
490
+ color: var(--color-code-class);
491
+ font-weight: var(--fontWeight-bold);
492
+ }
493
+
494
+ .hljs-code,
495
+ .hljs-string,
496
+ .hljs-title.class_.inherited__ {
497
+ color: var(--color-code-string);
498
+ }
499
+
500
+ .hljs-built_in,
501
+ .hljs-doctag,
502
+ .hljs-quote,
503
+ .hljs-regexp,
504
+ .hljs-keyword.hljs-atrule {
505
+ color: var(--color-code-support);
506
+ }
507
+
508
+ .hljs-attribute,
509
+ .hljs-function .hljs-title,
510
+ .hljs-section,
511
+ .hljs-title.function_ {
512
+ color: var(--color-code-function);
513
+ }
514
+
515
+ .hljs-keyword,
516
+ .hljs-template-tag,
517
+ .hljs-type {
518
+ color: var(--color-code-keyword);
519
+ }
520
+
521
+ .hljs-emphasis {
522
+ color: var(--color-code-keyword);
523
+ font-style: italic;
524
+ }
525
+
526
+ .hljs-meta,
527
+ .hljs-meta .hljs-keyword,
528
+ .hljs-meta .hljs-string {
529
+ color: var(--color-code-meta);
530
+ }
531
+
532
+ /* A diff reads by the line, not by the token, which is what prism-diff.css did
533
+ * on the site this design comes from: the whole line takes a tint out to the
534
+ * edges of the block — the negative margin cancels the `pre` padding and the
535
+ * padding puts it back — and keeps the block's own ink, which is the pair the
536
+ * contrast test checks. The `+` and the `-` stay in the text, so the meaning
537
+ * does not rest on the colour alone.
538
+ */
539
+
540
+ .hljs-addition,
541
+ .hljs-deletion {
542
+ display: block;
543
+ margin-right: calc(-1 * var(--spacing-4));
544
+ margin-left: calc(-1 * var(--spacing-4));
545
+ padding-right: var(--spacing-4);
546
+ padding-left: var(--spacing-4);
547
+ color: var(--color-code-text);
163
548
  text-decoration: none;
164
549
  }
165
550
 
166
- .post-summary-title a:hover,
167
- .post-summary-title a:focus {
168
- text-decoration: underline;
551
+ .hljs-addition {
552
+ background-color: var(--color-code-added-background);
553
+ }
554
+
555
+ .hljs-deletion {
556
+ background-color: var(--color-code-removed-background);
557
+ }
558
+
559
+ /* Screen reader text. The skip link is this until it is focused, and then it
560
+ is a box at the top left of the page. */
561
+
562
+ .screen-reader-text {
563
+ position: absolute;
564
+ width: 1px;
565
+ height: 1px;
566
+ margin: -1px;
567
+ padding: 0;
568
+ overflow: hidden;
569
+ border: 0;
570
+ clip-path: inset(50%);
571
+ word-wrap: normal !important;
572
+ }
573
+
574
+ .screen-reader-text:focus {
575
+ display: block;
576
+ width: auto;
577
+ height: auto;
578
+ top: var(--spacing-2);
579
+ left: var(--spacing-2);
580
+ padding: var(--spacing-4);
581
+ clip-path: none;
582
+ background-color: var(--color-base-3);
583
+ color: var(--color-text);
584
+ font-size: var(--fontSize-1);
585
+ font-weight: var(--fontWeight-bold);
586
+ line-height: normal;
587
+ text-decoration: none;
588
+ z-index: 100000;
589
+ }
590
+
591
+ /* The page shell */
592
+
593
+ .global-wrapper {
594
+ max-width: var(--maxWidth-wrapper);
595
+ margin: var(--spacing-0) auto;
596
+ padding: var(--spacing-10) var(--spacing-5);
169
597
  }
170
598
 
171
- .post-summary .post-meta {
172
- margin-bottom: 0.5rem;
599
+ .global-wrapper[data-is-root-path='true'] .bio {
600
+ margin-bottom: var(--spacing-20);
173
601
  }
174
602
 
175
- .post-summary-description {
176
- margin: 0 0 0.5rem;
603
+ .global-header {
604
+ margin-bottom: var(--spacing-12);
177
605
  }
178
606
 
179
- .empty,
180
- .tag-count {
181
- color: var(--ink-muted);
607
+ .main-heading {
608
+ margin: 0;
609
+ font-size: var(--fontSize-7);
610
+ }
611
+
612
+ .header-link-home {
613
+ font-family: var(--font-heading);
614
+ font-size: var(--fontSize-2);
615
+ font-weight: var(--fontWeight-bold);
616
+ text-decoration: none;
617
+ }
618
+
619
+ /* An entry: a post or a page (TASK-83). The source design's own rules — the
620
+ title tight against the words under it, a subtitle in the heading font —
621
+ plus the small line the `e-content` ends on, which carries the permalink,
622
+ the published date and, when it is a different day, the updated one. */
623
+
624
+ .blog-post header h1 {
625
+ margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
626
+ }
627
+
628
+ .blog-post header p {
629
+ font-family: var(--font-heading);
630
+ font-size: var(--fontSize-2);
631
+ }
632
+
633
+ .entry-meta,
634
+ .page-meta {
635
+ margin-top: var(--spacing-8);
636
+ }
637
+
638
+ /* A page usually carries no date, and then this line has nothing in it. The
639
+ layout prints it anyway, so a site has one hook wherever it is; here is
640
+ where it disappears. */
641
+ .entry-meta:empty,
642
+ .page-meta:empty {
643
+ display: none;
644
+ }
645
+
646
+ /* The bio, which the entry footer prints and an author archive heads with
647
+ (TASK-83). */
648
+
649
+ .bio {
650
+ display: flex;
651
+ align-items: center;
652
+ margin-bottom: var(--spacing-16);
653
+ }
654
+
655
+ .bio p {
656
+ margin-bottom: var(--spacing-0);
657
+ }
658
+
659
+ /* The name reads as the heading of the card; the source theme printed a
660
+ <strong> around it, which is styling in the markup. */
661
+ .bio .p-name {
662
+ font-weight: var(--fontWeight-bold);
663
+ }
664
+
665
+ .bio-note {
666
+ margin-top: var(--spacing-2);
667
+ font-style: italic;
668
+ }
669
+
670
+ /* The site menu, and an author archive's `rel="me"` links: both horizontal
671
+ lists under the credit, small, in the heading font like every other piece
672
+ of navigation. */
673
+ .bio .site-nav,
674
+ .bio-links {
675
+ margin-top: var(--spacing-2);
676
+ font-size: var(--fontSize-0);
677
+ }
678
+
679
+ .bio-avatar {
680
+ display: inline-block;
681
+ min-width: 55px;
682
+ margin-right: var(--spacing-4);
683
+ margin-bottom: var(--spacing-0);
684
+ border: 3px solid var(--color-base-3);
685
+ border-radius: 50%;
686
+ }
687
+
688
+ .bio-avatar img {
689
+ display: block;
690
+ width: 50px;
691
+ height: 50px;
692
+ border-radius: 50%;
693
+ }
694
+
695
+ .circle {
696
+ border-radius: 50%;
182
697
  }
183
698
 
184
- /* Tags */
699
+ /* A listing: the feed of entries, and what heads one (TASK-82). The source
700
+ design's own rules, on the tokens above. The feed itself takes no styling —
701
+ it is a stack of articles at the measure — and what makes it read as a list
702
+ is the rule between two of them and the small meta line under each. */
185
703
 
186
- .tag-list {
704
+ .feed-title {
705
+ margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
706
+ padding: var(--spacing-0);
707
+ font-size: var(--fontSize-3);
708
+ }
709
+
710
+ .feed-separator {
711
+ margin: var(--spacing-2) var(--spacing-0) var(--spacing-4) var(--spacing-0);
712
+ }
713
+
714
+ .feed-meta {
187
715
  display: flex;
188
716
  flex-wrap: wrap;
189
- gap: 0.4rem;
190
- margin: 0.75rem 0 0;
191
- padding: 0;
192
- list-style: none;
717
+ gap: var(--spacing-2);
718
+ align-items: baseline;
719
+ font-size: 70%;
720
+ }
721
+
722
+ .feed-meta p {
723
+ margin: var(--spacing-0);
724
+ }
725
+
726
+ .post-categories {
727
+ margin-top: var(--spacing-2);
728
+ margin-bottom: var(--spacing-0);
729
+ font-size: 70%;
193
730
  }
194
731
 
195
- .tag {
732
+ .post-categories a {
196
733
  display: inline-block;
197
- padding: 0.1rem 0.5rem;
198
- border: 1px solid var(--rule);
199
- border-radius: 999px;
200
- background: var(--paper-sunk);
201
- color: var(--ink-muted);
202
- font-size: 0.8rem;
203
- text-decoration: none;
734
+ margin-right: var(--spacing-2);
735
+ }
736
+
737
+ /* The categories are already small; inside the meta line they would be small
738
+ twice over, so there they are the size of the line they sit on. */
739
+ .feed-meta .post-categories {
740
+ font-size: 100%;
204
741
  }
205
742
 
206
- .tag:hover,
207
- .tag:focus {
208
- color: var(--ink);
743
+ .category-header {
744
+ margin-bottom: var(--spacing-8);
209
745
  }
210
746
 
211
- /* Pagination */
747
+ .category-description {
748
+ margin-top: var(--spacing-2);
749
+ font-style: italic;
750
+ }
751
+
752
+ /* Pagination: two arrows under a listing, the previous one at the left edge
753
+ and the next at the right however few there are. */
212
754
 
213
755
  .pagination {
214
756
  display: flex;
215
- gap: 1rem;
757
+ gap: var(--spacing-4);
216
758
  align-items: baseline;
217
759
  justify-content: space-between;
218
- margin-top: 3rem;
219
- padding-top: 1.25rem;
220
- border-top: 1px solid var(--rule);
221
- font-size: 0.9rem;
222
- }
223
-
224
- .pagination-position {
225
- color: var(--ink-muted);
760
+ margin-top: var(--spacing-12);
761
+ padding-top: var(--spacing-5);
762
+ border-top: 1px solid var(--color-base);
763
+ font-family: var(--font-heading);
764
+ font-size: var(--fontSize-0);
226
765
  }
227
766
 
228
767
  .pagination-previous {
@@ -233,95 +772,481 @@ a:visited {
233
772
  margin-inline-start: auto;
234
773
  }
235
774
 
236
- /* Body copy */
775
+ /* Where a post links its neighbours, which the entry layout prints (TASK-83). */
237
776
 
238
- .post-body,
239
- .page-body {
240
- overflow-wrap: break-word;
777
+ .blog-post-nav {
778
+ font-family: var(--font-heading);
779
+ font-size: var(--fontSize-0);
241
780
  }
242
781
 
243
- .post-body > :first-child,
244
- .page-body > :first-child {
245
- margin-top: 0;
782
+ .blog-post-nav ul {
783
+ display: flex;
784
+ flex-wrap: wrap;
785
+ justify-content: space-between;
786
+ margin: var(--spacing-0);
787
+ padding: 0;
788
+ list-style: none;
246
789
  }
247
790
 
248
- .post-body h2,
249
- .page-body h2 {
250
- margin-top: 2.25rem;
251
- font-size: 1.35rem;
252
- line-height: 1.3;
791
+ /* Titles: what heads a listing, a 404 and an author archive. The source theme
792
+ prints none of these — it has no archive heading at all — so they are the
793
+ theme's own, sized off the same scale. An entry's own title is
794
+ `.blog-post header h1` above. */
795
+
796
+ .page-title {
797
+ margin: 0 0 var(--spacing-2);
798
+ font-size: var(--fontSize-6);
253
799
  }
254
800
 
255
- .post-body h3,
256
- .page-body h3 {
257
- margin-top: 1.75rem;
258
- font-size: 1.1rem;
801
+ .empty {
802
+ font-family: var(--font-heading);
803
+ font-size: var(--fontSize-0);
259
804
  }
260
805
 
261
- .post-body img,
262
- .page-body img {
263
- max-width: 100%;
264
- height: auto;
806
+ /* The search box (TASK-22): a field and a button on one line, in the footer
807
+ of every page and at the top of the search page. The field is drawn the way
808
+ the comment form's are, so the site has one look for a place to type. */
809
+
810
+ .search-form {
811
+ display: flex;
812
+ gap: var(--spacing-2);
813
+ margin: 0 0 var(--spacing-4);
814
+ font-family: var(--font-heading);
265
815
  }
266
816
 
267
- .post-body blockquote,
268
- .page-body blockquote {
269
- margin-inline: 0;
270
- padding-inline-start: 1rem;
271
- border-inline-start: 3px solid var(--rule);
272
- color: var(--ink-muted);
817
+ .search-form label {
818
+ flex: 1;
819
+ min-width: 0;
273
820
  }
274
821
 
275
- .post-body pre,
276
- .page-body pre {
277
- overflow-x: auto;
278
- padding: 0.9rem 1rem;
279
- border-radius: 6px;
280
- background: var(--paper-sunk);
281
- font-size: 0.875rem;
282
- line-height: 1.5;
822
+ .search-form input[type='search'] {
823
+ width: 100%;
824
+ padding: var(--spacing-2);
825
+ border: 1px solid var(--color-base);
826
+ background-color: var(--color-base-3);
827
+ color: var(--color-text);
828
+ font-family: var(--font-body);
829
+ font-size: var(--fontSize-1);
283
830
  }
284
831
 
285
- .post-body code,
286
- .page-body code {
287
- padding: 0.1em 0.3em;
288
- border-radius: 4px;
289
- background: var(--paper-sunk);
290
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
291
- font-size: 0.9em;
832
+ .search-form input[type='search']:focus-visible {
833
+ outline: 2px solid var(--color-primary);
834
+ outline-offset: -1px;
835
+ border-color: var(--color-primary);
292
836
  }
293
837
 
294
- .post-body pre code,
295
- .page-body pre code {
296
- padding: 0;
297
- background: none;
298
- font-size: inherit;
838
+ .search-form button {
839
+ padding: var(--spacing-2) var(--spacing-4);
840
+ border: none;
841
+ background-color: var(--color-primary);
842
+ color: var(--color-body);
843
+ font-family: var(--font-heading);
844
+ font-size: var(--fontSize-1);
845
+ cursor: pointer;
846
+ }
847
+
848
+ .search-form button:hover,
849
+ .search-form button:focus-visible {
850
+ opacity: 0.85;
851
+ }
852
+
853
+ .search-summary {
854
+ font-family: var(--font-heading);
855
+ font-size: var(--fontSize-0);
856
+ }
857
+
858
+ .search-result {
859
+ margin: 0 0 var(--spacing-8);
860
+ }
861
+
862
+ .search-result .feed-title {
863
+ margin-bottom: var(--spacing-2);
864
+ }
865
+
866
+ /* A matched word is marked by weight and an underline in the primary colour
867
+ rather than by a highlighter background, so it adds no colour pair the
868
+ contrast test would have to prove in both schemes. */
869
+
870
+ .search-snippet mark {
871
+ background-color: transparent;
872
+ color: inherit;
873
+ font-weight: var(--fontWeight-bold);
874
+ text-decoration: underline var(--color-primary);
875
+ text-underline-offset: 0.15em;
876
+ }
877
+
878
+ /* An author archive (TASK-67): the person above their posts. The same URL is
879
+ their ActivityPub actor, so this is the page a follower sees when they click
880
+ through from somewhere else on the fediverse. The person themselves is the
881
+ bio above; this is only what is left, the heading over it. */
882
+
883
+ .author-header {
884
+ margin-bottom: var(--spacing-4);
885
+ }
886
+
887
+ /* The front page (TASK-85): the site's own words, then Recent Posts, then
888
+ where to go next. Almost nothing is needed — the words are `.e-content`
889
+ below, the posts are the feed above, and the heading over them is an
890
+ ordinary `h2` — so this is only the line of links, which follows a feed
891
+ rather than a paragraph and needs the air a paragraph would already have. */
892
+
893
+ .front-links {
894
+ margin-top: var(--spacing-8);
895
+ }
896
+
897
+ /* An archive page: every post there has ever been, under a heading per month.
898
+ The source design's essays page is plain headings over `ol.list-none` and
899
+ nothing else, so the prose rules draw it; what is here only closes the gap
900
+ between a month and its own posts, which at the prose spacing reads as two
901
+ things rather than as one. */
902
+
903
+ .archive h2 {
904
+ margin-bottom: var(--spacing-2);
905
+ }
906
+
907
+ /* Body copy: whatever a document's words render into, which is the entry's
908
+ `section.e-content` and the `div.page-body.e-content` a posts page prints
909
+ its own words in. */
910
+
911
+ .e-content {
912
+ overflow-wrap: break-word;
913
+ }
914
+
915
+ .e-content > :first-child {
916
+ margin-top: 0;
299
917
  }
300
918
 
301
- .post-body table,
302
- .page-body table {
919
+ .e-content table {
303
920
  display: block;
304
921
  overflow-x: auto;
305
- border-collapse: collapse;
306
922
  }
307
923
 
308
- .post-body th,
309
- .post-body td,
310
- .page-body th,
311
- .page-body td {
312
- padding: 0.4rem 0.75rem;
313
- border: 1px solid var(--rule);
924
+ .e-content th,
925
+ .e-content td {
926
+ padding: var(--spacing-1) var(--spacing-3);
314
927
  text-align: start;
315
928
  }
316
929
 
317
930
  .footnotes {
318
- margin-top: 2.5rem;
319
- padding-top: 1rem;
320
- border-top: 1px solid var(--rule);
321
- color: var(--ink-muted);
322
- font-size: 0.9rem;
931
+ margin-top: var(--spacing-10);
932
+ padding-top: var(--spacing-4);
933
+ border-top: 1px solid var(--color-base);
934
+ font-size: var(--fontSize-0);
935
+ }
936
+
937
+ .footnote-item p {
938
+ display: inline;
939
+ }
940
+
941
+ /* Reactions: the likes, the boosts and the pages that mentioned a post,
942
+ grouped by kind as facepiles of small round avatars (TASK-84). */
943
+
944
+ .reactions-section {
945
+ margin-top: var(--spacing-12);
946
+ }
947
+
948
+ .reaction-group {
949
+ display: flex;
950
+ align-items: center;
951
+ gap: var(--spacing-3);
952
+ margin-bottom: var(--spacing-3);
953
+ }
954
+
955
+ .reaction-title {
956
+ margin: 0;
957
+ font-family: var(--font-heading);
958
+ font-size: var(--fontSize-1);
959
+ white-space: nowrap;
960
+ }
961
+
962
+ .facepile {
963
+ display: flex;
964
+ flex-wrap: wrap;
965
+ gap: var(--spacing-1);
966
+ }
967
+
968
+ .facepile a,
969
+ .facepile span {
970
+ display: inline-block;
971
+ line-height: 0;
972
+ text-decoration: none;
973
+ }
974
+
975
+ /* A face is a picture of somebody: the block of colour a link takes on hover
976
+ everywhere else would sit behind it as a frame, so it is taken back off. */
977
+
978
+ .facepile a:hover,
979
+ .facepile a:focus {
980
+ background-color: transparent;
981
+ color: var(--color-primary);
982
+ text-decoration: underline;
983
+ }
984
+
985
+ .facepile img {
986
+ display: block;
987
+ border-radius: 50%;
323
988
  }
324
989
 
325
- .post-footer {
326
- margin-top: 2.5rem;
990
+ /* A reaction with no avatar has nothing to recognise anybody by, so the emoji
991
+ badge of its kind stands in and the name is printed beside it — which needs
992
+ the line box the faces above do without. */
993
+
994
+ .facepile a:has(.reaction-name),
995
+ .facepile span:has(.reaction-name) {
996
+ display: inline-flex;
997
+ align-items: center;
998
+ gap: var(--spacing-1);
999
+ font-family: var(--font-heading);
1000
+ font-size: var(--fontSize-0);
1001
+ line-height: normal;
1002
+ }
1003
+
1004
+ .reaction-icon {
1005
+ display: inline-block;
1006
+ width: 2rem;
1007
+ height: 2rem;
1008
+ border-radius: 50%;
1009
+ background-color: var(--color-base);
1010
+ line-height: 2rem;
1011
+ text-align: center;
1012
+ }
1013
+
1014
+ /* The thread under a post: the replies from every door, each one an h-entry
1015
+ with its author, its time and its words, and answers nested inside it. */
1016
+
1017
+ .comments-area {
1018
+ margin-top: var(--spacing-12);
1019
+ }
1020
+
1021
+ .comments-title {
1022
+ margin: 0 0 var(--spacing-8);
1023
+ font-size: var(--fontSize-4);
1024
+ }
1025
+
1026
+ .comment-list,
1027
+ .comment-list .children {
1028
+ margin: 0;
1029
+ padding: 0;
1030
+ list-style: none;
1031
+ }
1032
+
1033
+ .comment-list .children {
1034
+ margin-left: var(--spacing-8);
1035
+ }
1036
+
1037
+ .comment-body {
1038
+ padding: var(--spacing-4) 0;
1039
+ border-bottom: 1px solid var(--color-base);
1040
+ }
1041
+
1042
+ .comment-author {
1043
+ display: flex;
1044
+ align-items: center;
1045
+ gap: var(--spacing-2);
1046
+ font-family: var(--font-heading);
1047
+ }
1048
+
1049
+ .comment-author .avatar {
1050
+ border-radius: 50%;
1051
+ }
1052
+
1053
+ .comment-metadata {
1054
+ margin-bottom: var(--spacing-2);
1055
+ font-family: var(--font-heading);
1056
+ font-size: var(--fontSize-0);
1057
+ }
1058
+
1059
+ /* The permalink is the whole date line, so it is the ink of the page rather
1060
+ than a link's colour until somebody points at it. */
1061
+
1062
+ .comment-metadata a {
1063
+ color: var(--color-text);
1064
+ text-decoration: none;
1065
+ }
1066
+
1067
+ .comment-metadata a:hover,
1068
+ .comment-metadata a:focus {
1069
+ background-color: transparent;
1070
+ color: var(--color-primary);
1071
+ }
1072
+
1073
+ .comment-content {
1074
+ margin-top: var(--spacing-2);
1075
+ }
1076
+
1077
+ .comment-content > :last-child {
1078
+ margin-bottom: 0;
1079
+ }
1080
+
1081
+ .reply {
1082
+ margin-top: var(--spacing-2);
1083
+ font-family: var(--font-heading);
1084
+ font-size: var(--fontSize-0);
1085
+ }
1086
+
1087
+ .no-comments {
1088
+ font-family: var(--font-heading);
1089
+ font-style: italic;
1090
+ }
1091
+
1092
+ /* The comment form under an open post, and the contact form on a page that
1093
+ asked for one. One set of rules rather than two: they are the same kind of
1094
+ form, the contact form wears `comment-respond` to say so, and a site
1095
+ restyling one cannot leave the other behind. */
1096
+
1097
+ .comment-respond {
1098
+ margin-top: var(--spacing-8);
1099
+ }
1100
+
1101
+ .comment-respond .comment-reply-title,
1102
+ .comment-respond .contact-form-title {
1103
+ margin: 0 0 var(--spacing-4);
1104
+ font-size: var(--fontSize-4);
1105
+ }
1106
+
1107
+ .comment-respond label {
1108
+ display: block;
1109
+ margin-bottom: var(--spacing-1);
1110
+ font-family: var(--font-heading);
1111
+ font-size: var(--fontSize-0);
1112
+ }
1113
+
1114
+ .comment-field,
1115
+ .contact-field,
1116
+ .comment-check {
1117
+ margin: 0 0 var(--spacing-4);
1118
+ }
1119
+
1120
+ /* The one label that belongs beside its field rather than over it. */
1121
+
1122
+ .comment-check label {
1123
+ display: inline;
1124
+ }
1125
+
1126
+ .comment-respond input[type='text'],
1127
+ .comment-respond input[type='email'],
1128
+ .comment-respond input[type='url'],
1129
+ .comment-respond textarea {
1130
+ width: 100%;
1131
+ padding: var(--spacing-2);
1132
+ border: 1px solid var(--color-base);
1133
+ background-color: var(--color-base-3);
1134
+ color: var(--color-text);
1135
+ font-family: var(--font-body);
1136
+ font-size: var(--fontSize-1);
1137
+ }
1138
+
1139
+ .comment-respond input[type='text']:focus-visible,
1140
+ .comment-respond input[type='email']:focus-visible,
1141
+ .comment-respond input[type='url']:focus-visible,
1142
+ .comment-respond textarea:focus-visible {
1143
+ outline: 2px solid var(--color-primary);
1144
+ outline-offset: -1px;
1145
+ border-color: var(--color-primary);
1146
+ }
1147
+
1148
+ .comment-respond textarea {
1149
+ min-height: 8rem;
1150
+ resize: vertical;
1151
+ }
1152
+
1153
+ .comment-respond .form-submit button,
1154
+ .comment-respond .form-submit input[type='submit'] {
1155
+ padding: var(--spacing-2) var(--spacing-6);
1156
+ border: none;
1157
+ background-color: var(--color-primary);
1158
+ color: var(--color-body);
1159
+ font-family: var(--font-heading);
1160
+ font-size: var(--fontSize-1);
1161
+ cursor: pointer;
1162
+ }
1163
+
1164
+ .comment-respond .form-submit button:hover,
1165
+ .comment-respond .form-submit button:focus-visible,
1166
+ .comment-respond .form-submit input[type='submit']:hover,
1167
+ .comment-respond .form-submit input[type='submit']:focus-visible {
1168
+ opacity: 0.85;
1169
+ }
1170
+
1171
+ /* What a form says back: the thank-you after a submission, the message about
1172
+ one that was refused, and what a reader is answering. */
1173
+
1174
+ .comment-notice,
1175
+ .comment-error,
1176
+ .contact-notice,
1177
+ .contact-error {
1178
+ margin: 0 0 var(--spacing-4);
1179
+ padding: var(--spacing-2) var(--spacing-3);
1180
+ border-inline-start: var(--spacing-1) solid var(--color-secondary);
1181
+ }
1182
+
1183
+ .comment-error,
1184
+ .contact-error {
1185
+ border-inline-start-color: var(--color-error);
1186
+ }
1187
+
1188
+ .comment-replying-to {
1189
+ margin: 0 0 var(--spacing-4);
1190
+ font-family: var(--font-heading);
1191
+ font-size: var(--fontSize-0);
1192
+ }
1193
+
1194
+ .comment-optional,
1195
+ .contact-optional {
1196
+ font-size: var(--fontSize-0);
1197
+ }
1198
+
1199
+ .comment-hint,
1200
+ .contact-hint,
1201
+ .comment-field-error,
1202
+ .contact-field-error {
1203
+ display: block;
1204
+ margin-top: var(--spacing-1);
1205
+ font-size: var(--fontSize-0);
1206
+ }
1207
+
1208
+ .comment-field-error,
1209
+ .contact-field-error {
1210
+ color: var(--color-error);
1211
+ }
1212
+
1213
+ /*
1214
+ The honeypot. Taken out of the flow rather than `display: none`, because some
1215
+ form fillers skip fields a browser would not paint at all and this one is
1216
+ meant to be filled in.
1217
+ */
1218
+ .comment-trap,
1219
+ .contact-trap {
1220
+ position: absolute;
1221
+ left: -10000px;
1222
+ width: 1px;
1223
+ height: 1px;
1224
+ overflow: hidden;
1225
+ }
1226
+
1227
+ /* Media queries */
1228
+
1229
+ @media (max-width: 42rem) {
1230
+ .bio {
1231
+ flex-direction: column;
1232
+ }
1233
+
1234
+ .bio-avatar {
1235
+ margin-right: var(--spacing-0);
1236
+ margin-bottom: var(--spacing-4);
1237
+ }
1238
+
1239
+ blockquote {
1240
+ margin-left: var(--spacing-0);
1241
+ padding: var(--spacing-0) var(--spacing-0) var(--spacing-0) var(--spacing-4);
1242
+ }
1243
+
1244
+ ul,
1245
+ ol {
1246
+ list-style-position: inside;
1247
+ }
1248
+
1249
+ .comment-list .children {
1250
+ margin-left: var(--spacing-4);
1251
+ }
327
1252
  }