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