@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
@@ -2,8 +2,7 @@
2
2
 
3
3
  {% block content %}
4
4
  <article class="not-found">
5
- <h1 class="page-title">Not found</h1>
6
- <p>There is nothing at <code>{{ url }}</code>.</p>
7
- <p><a href="{{ "/" | url }}">Back to {{ site.title }}</a></p>
5
+ <h1 class="page-title">Content not found.</h1>
6
+ <p>Go <a href="{{ "/" | url }}">home</a>, or <a href="{{ "/search/" | url }}">search the site</a>.</p>
8
7
  </article>
9
8
  {% endblock %}
@@ -0,0 +1,36 @@
1
+ {#
2
+ One person's archive, at `/author/{username}/`.
3
+
4
+ decision-14 makes this URL their ActivityPub actor as well, so a peer asking
5
+ for the actor and a reader asking for the page are at the same address; this
6
+ is the page half of it. `author` is the profile — `name`, and whatever of
7
+ `bio`, `avatar` and `links` they have written — and it is the same shape an
8
+ entry's bio is given.
9
+
10
+ The source design has no author archive, so there is nothing to port: the
11
+ heading is the CMS's own. What it does not keep is an h-card of its own.
12
+ `partials/bio.njk` is the one the theme has, and it prints the whole profile
13
+ — the note and the `rel="me"` links — wherever it is, so this page is headed
14
+ with the same card that ends each of their posts.
15
+ #}
16
+ {% extends "layouts/base.njk" %}
17
+
18
+ {% set bioAuthor = author %}
19
+ {% set bioLead = "Posts by" %}
20
+
21
+ {% block title %}{{ author.name }}{% if pagination.pageNumber > 0 %}, page {{ pagination.pageNumber + 1 }}{% endif %} &middot; {{ site.title }}{% endblock %}
22
+
23
+ {% import "partials/feeds.njk" as feeds %}
24
+ {% block alternates %}
25
+ {{ super() }}
26
+ {{ feeds.feedLinks(author.url, site.title + ": " + author.name) }}
27
+ {% endblock %}
28
+
29
+ {% block content %}
30
+ <header class="author-header">
31
+ <h1 class="page-title">{{ author.name }}</h1>
32
+ </header>
33
+ {% include "partials/bio.njk" %}
34
+ {% include "partials/post-list.njk" %}
35
+ {% include "partials/pagination.njk" %}
36
+ {% endblock %}
@@ -1,59 +1,189 @@
1
1
  {#
2
2
  The page every other layout extends.
3
3
 
4
+ The shell of the andrewshell.org design (decision-16): one wrapper at the
5
+ measure, a big site title and tagline on the front page and a small link home
6
+ everywhere else, and a footer holding the copyright, the colophon and the
7
+ site's own links. `data-is-root-path` on the wrapper is how the stylesheet
8
+ tells the front page from every other one.
9
+
10
+ One home for each kind of link (TASK-105). The header carries the site menu,
11
+ on every page. `partials/bio.njk` carries the person whose page or post it
12
+ is. The footer carries `menus.footer`, the site's own list, and nothing read
13
+ off an account. The search form is on the search page and nowhere else.
14
+
4
15
  Blocks a site can override without copying the whole file:
5
16
  title the contents of <title>
6
- head extra tags at the end of <head>
17
+ head the cards, the icons and the structured data, at the end of
18
+ <head>. Call `super()` from an override that only adds to it.
7
19
  alternates <link rel="alternate"> tags, where the feeds go
8
- header the site header
20
+ header the site header, with the site menu
9
21
  content the page body
10
22
  footer the site footer
11
23
  scripts scripts at the end of <body>
12
- #}<!doctype html>
24
+ #}{% import "partials/feeds.njk" as feeds %}
25
+ {%- import "partials/menu.njk" as nav %}
26
+ {#- Whether this is the front page, which is the one page the header and the
27
+ stylesheet treat differently. `page.url` is the URL being served rather
28
+ than the document's own permalink, so a static homepage under the Reading
29
+ settings is the root path too. -#}
30
+ {% set atRoot = (page.url or url or "/") == "/" %}
31
+ {#- What the head says this page is, in one place, because the description
32
+ tags, the Open Graph tags and the Twitter card all say the same thing.
33
+
34
+ `metaDescription` is the page's own description, else the entry's summary
35
+ — the very line the feeds publish — else the site's tagline. `metaImage` is
36
+ the picture the front matter names, else the site's avatar; with neither,
37
+ nothing is printed rather than an empty tag. `isEntry` is a rendered post
38
+ or page, which is what Open Graph calls an article: a listing has
39
+ `pagination`, and the posts page is a listing carrying a page's front
40
+ matter, so it is a website like every other listing. -#}
41
+ {% set metaDescription = description or summary or site.tagline %}
42
+ {% set metaTitle = title or site.title %}
43
+ {% set metaUrl = (page.url or "/") | absoluteUrl %}
44
+ {% set metaImage = image or site.avatar %}
45
+ {% set isEntry = (type == "post" or type == "page") and not pagination %}
46
+ <!doctype html>
13
47
  <html lang="{{ site.language | default("en") }}">
14
48
  <head>
15
49
  <meta charset="utf-8">
16
50
  <meta name="viewport" content="width=device-width, initial-scale=1">
17
51
  <title>{% block title %}{% if title %}{{ title }} &middot; {% endif %}{{ site.title }}{% endblock %}</title>
18
- {% if description %}
19
- <meta name="description" content="{{ description }}">
52
+ {% if metaDescription %}
53
+ <meta name="description" content="{{ metaDescription }}">
20
54
  {% endif %}
21
55
  <link rel="canonical" href="{{ (page.url or "/") | absoluteUrl }}">
22
56
  <link rel="stylesheet" href="{{ "/theme/style.css" | url }}">
23
57
  {% block alternates %}
24
- <link rel="alternate" type="application/atom+xml" title="{{ site.title }}" href="{{ "/feed.xml" | url }}">
25
- <link rel="alternate" type="application/feed+json" title="{{ site.title }}" href="{{ "/feed.json" | url }}">
58
+ {{ feeds.feedLinks("/", site.title) }}
59
+ {{ feeds.commentsFeedLink("/comments/feed/", site.title + " comments") }}
60
+ {% if commentsFeed %}
61
+ {{ feeds.commentsFeedLink(commentsFeed, "Comments on: " + title) }}
62
+ {% endif %}
26
63
  {% if activityStreams %}
27
64
  <link rel="alternate" type="application/activity+json" href="{{ activityStreams }}">
28
65
  {% endif %}
29
66
  {% endblock %}
30
- {% block head %}{% endblock %}
67
+ {% if webmention %}
68
+ <link rel="webmention" href="{{ webmention | url }}">
69
+ {% endif %}
70
+ {% block head %}
71
+ {#
72
+ What a link to this page looks like when somebody posts it: the same
73
+ title, description and picture to Open Graph and to a Twitter card,
74
+ which is the pair every reader of this markup understands. The card is
75
+ always `summary` — a small square picture beside the words — because the
76
+ picture is usually the site's avatar rather than a wide photograph.
77
+ #}
78
+ <meta property="og:title" content="{{ metaTitle }}">
79
+ {% if metaDescription %}
80
+ <meta property="og:description" content="{{ metaDescription }}">
81
+ {% endif %}
82
+ <meta property="og:url" content="{{ metaUrl }}">
83
+ <meta property="og:type" content="{% if isEntry %}article{% else %}website{% endif %}">
84
+ <meta property="og:site_name" content="{{ site.title }}">
85
+ {% if metaImage %}
86
+ <meta property="og:image" content="{{ metaImage | absoluteUrl }}">
87
+ {% endif %}
88
+ <meta name="twitter:card" content="summary">
89
+ <meta name="twitter:title" content="{{ metaTitle }}">
90
+ {% if metaDescription %}
91
+ <meta name="twitter:description" content="{{ metaDescription }}">
92
+ {% endif %}
93
+ {% if metaImage %}
94
+ <meta name="twitter:image" content="{{ metaImage | absoluteUrl }}">
95
+ {% endif %}
96
+ {#
97
+ The site's icons, derived from its avatar. `icons` is empty — and these
98
+ lines print nothing — until a site has one, so a site with no avatar
99
+ links no icon rather than three that answer 404.
100
+ #}
101
+ {% for icon in icons %}
102
+ <link rel="{{ icon.rel }}" type="image/png" sizes="{{ icon.sizes }}" href="{{ icon.href | url }}">
103
+ {% endfor %}
104
+ {% include "partials/jsonld.njk" %}
105
+ {% endblock %}
31
106
  </head>
32
107
  <body>
33
- <a class="skip-link" href="#main">Skip to content</a>
34
-
35
- {% block header %}
36
- <header class="site-header">
37
- <p class="site-title"><a href="{{ "/" | url }}">{{ site.title }}</a></p>
38
- {% if site.tagline %}
39
- <p class="site-tagline">{{ site.tagline }}</p>
40
- {% endif %}
41
- </header>
42
- {% endblock %}
108
+ <a class="screen-reader-text" href="#main">Skip to content</a>
109
+ <div class="global-wrapper"{% if atRoot %} data-is-root-path="true"{% endif %}>
110
+ {% block header %}
111
+ {#
112
+ The header, and the site menu inside it on every page (TASK-105): one
113
+ place a reader looks for the navigation, whatever they are reading.
43
114
 
44
- <main id="main" class="site-main">
45
- {% block content %}{% endblock %}
46
- </main>
47
-
48
- {% block footer %}
49
- <footer class="site-footer">
50
- <p>
51
- {% if site.author %}&copy; {{ site.author }}{% endif %}
52
- <span class="site-colophon">Published with Geekity.</span>
53
- </p>
54
- </footer>
55
- {% endblock %}
115
+ The header is two shapes and the menu sits differently in each. At the
116
+ root it is the site title and the tagline, and the menu is a line of
117
+ its own under them; everywhere else it is the small link home, and the
118
+ menu is beside it on that line. The stylesheet does the beside part,
119
+ off `data-is-root-path` on the wrapper.
120
+ #}
121
+ <header class="global-header">
122
+ {% if atRoot %}
123
+ <h1 class="main-heading">
124
+ <a href="{{ "/" | url }}">{{ site.title }}</a>
125
+ </h1>
126
+ {% if site.tagline %}
127
+ <p>{{ site.tagline }}</p>
128
+ {% endif %}
129
+ {% else %}
130
+ <a class="header-link-home" href="{{ "/" | url }}">{{ site.title }}</a>
131
+ {% endif %}
132
+ {{ nav.list(menus.primary, "Site") }}
133
+ </header>
134
+ {% endblock %}
135
+
136
+ <main id="main">
137
+ {% block content %}{% endblock %}
138
+ </main>
139
+
140
+ {% block footer %}
141
+ <footer>
142
+ <p>&copy; {{ "now" | date("year") }}{% if site.author %}, {{ site.author }}{% endif %} &middot; Published with Geekity</p>
143
+ {#
144
+ The footer menu: the `footer` area this theme declares in its
145
+ `theme.json`, which a site fills in on the Navigation screen, and the
146
+ whole of what the footer links (TASK-105). It is the site's own list
147
+ — the feed, a colophon, a webring, a Mastodon link it wants verified
148
+ — rather than anything read off an account: one nominated user's
149
+ profile links presented as the site's were nobody's to give, and on a
150
+ site with more than one person nobody else's appeared at all. An item
151
+ marked `me` carries `rel="me"`, which is what a site moving a
152
+ verified profile link in here needs.
153
+
154
+ Nothing is printed until a site has filled the area in: an empty
155
+ footer menu is no list rather than an empty one, and the copyright
156
+ line above stands on its own.
157
+
158
+ Webrings, badges and anything else that is markup rather than a link
159
+ go in a site theme's `footer` override.
160
+ #}
161
+ {{ nav.list(menus.footer, "Footer") }}
162
+ </footer>
163
+ {% endblock %}
164
+ </div>
56
165
 
57
- {% block scripts %}{% endblock %}
166
+ {% block scripts %}
167
+ {#
168
+ The code highlighter, and only where there is code to highlight.
169
+
170
+ The CMS renders a fenced block as `pre > code.language-x` and highlights
171
+ nothing, so that a theme picks its own highlighter and runs it on the
172
+ client (decision-16). This one is highlight.js, self-hosted in
173
+ `static/highlight.js` at a pinned version — nothing is loaded from a CDN.
174
+
175
+ The test is the rendered body: a page whose `content` holds a
176
+ `language-` class has a code block on it, and every other page — a
177
+ listing, an entry with only prose — ships no JavaScript at all. `defer`
178
+ so it waits for the markup it works on rather than blocking it.
179
+
180
+ A site theme that wants a different highlighter, or none, overrides this
181
+ block; one that wants a different set of languages rebuilds the bundle.
182
+ See the theme README.
183
+ #}
184
+ {% if content and "language-" in content %}
185
+ <script src="{{ "/theme/highlight.js" | url }}" defer></script>
186
+ {% endif %}
187
+ {% endblock %}
58
188
  </body>
59
189
  </html>
@@ -0,0 +1,27 @@
1
+ {% extends "layouts/base.njk" %}
2
+
3
+ {% block title %}Filed under &ldquo;{{ category }}&rdquo;{% if pagination.pageNumber > 0 %}, page {{ pagination.pageNumber + 1 }}{% endif %} &middot; {{ site.title }}{% endblock %}
4
+
5
+ {% import "partials/feeds.njk" as feeds %}
6
+ {% set categoryRoot = "/" + (site.categoryBase or "category") + "/" + (category | urlencode) + "/" %}
7
+ {% block alternates %}
8
+ {{ super() }}
9
+ {{ feeds.feedLinks(categoryRoot, site.title + ": " + category) }}
10
+ {% endblock %}
11
+
12
+ {% block content %}
13
+ {#
14
+ The archive's header. `categoryDescription` is what the design prints under
15
+ the name; nothing in the CMS writes one yet, so the header is the heading
16
+ alone until something does — a site whose own context carries one gets it
17
+ printed without overriding this layout.
18
+ #}
19
+ <header class="category-header">
20
+ <h1 class="page-title">Filed under &ldquo;{{ category }}&rdquo;</h1>
21
+ {% if categoryDescription %}
22
+ <div class="category-description">{{ categoryDescription }}</div>
23
+ {% endif %}
24
+ </header>
25
+ {% include "partials/post-list.njk" %}
26
+ {% include "partials/pagination.njk" %}
27
+ {% endblock %}
@@ -0,0 +1,56 @@
1
+ {#
2
+ The front page: the page the Reading setting names, read at `/`, as the
3
+ source design's `front-page.php` draws it (decision-16, TASK-85).
4
+
5
+ A site's own words, then what it has been writing. The words are the page's
6
+ rendered body and nothing else — no title, because `layouts/base.njk` heads
7
+ the root path with the site title and a second `h1` under it would be one
8
+ heading too many, and no Published line, because a front page is read as the
9
+ site rather than as a page somebody wrote on a Tuesday. Then `Recent Posts`
10
+ over the same feed a listing is made of, headed at 3 so the outline never
11
+ skips a level, then the line of links, then the bio.
12
+
13
+ A theme that wants a different front page replaces this file; a site that
14
+ wants no front page of its own sets no homepage, and `/` is the listing.
15
+ #}
16
+ {% extends "layouts/base.njk" %}
17
+
18
+ {#- Who the bio credits: the person the site's author setting names. -#}
19
+ {% set bioAuthor = siteAuthor %}
20
+
21
+ {% block content %}
22
+ <div class="page-body e-content">
23
+ {{ content | safe }}
24
+ </div>
25
+
26
+ <h2>Recent Posts</h2>
27
+ {#- The feed a listing prints, over the posts the CMS decided were recent:
28
+ this month's writing when there is enough of it and the five newest
29
+ otherwise. `feedHeading` is 3 because the `h2` above is what they sit
30
+ under. -#}
31
+ {% set posts = recentPosts %}
32
+ {% set feedHeading = 3 %}
33
+ {% include "partials/post-list.njk" %}
34
+
35
+ {#- Where to go next. The posts page is here only when the site has one — on a
36
+ site without one there is no second URL for the archive, and a link to one
37
+ would be a link to nothing. Search is always here (TASK-22). -#}
38
+ <p class="front-links">
39
+ {% if postsPage %}
40
+ <a href="{{ postsPage.url | url }}">{{ postsPage.title }}<span aria-hidden="true"> &rarr;</span></a>
41
+ {% endif %}
42
+ <a href="{{ "/search/" | url }}">Search<span aria-hidden="true"> &rarr;</span></a>
43
+ </p>
44
+
45
+ {% if bioAuthor %}
46
+ <hr>
47
+ <footer>
48
+ {% include "partials/bio.njk" %}
49
+ </footer>
50
+ {% endif %}
51
+
52
+ {# A homepage may ask for a contact form like any other page (TASK-56). #}
53
+ {% if contactForm %}
54
+ {% include "partials/contact-form.njk" %}
55
+ {% endif %}
56
+ {% endblock %}
@@ -1,9 +1,25 @@
1
1
  {% extends "layouts/base.njk" %}
2
2
 
3
- {% block title %}{% if pagination.pageNumber > 0 %}Page {{ pagination.pageNumber + 1 }} &middot; {% endif %}{{ site.title }}{% endblock %}
3
+ {% block title %}{% if pagination.pageNumber > 0 %}Page {{ pagination.pageNumber + 1 }} &middot; {% endif %}{% if title and title != site.title %}{{ title }} &middot; {% endif %}{{ site.title }}{% endblock %}
4
4
 
5
5
  {% block content %}
6
+ {# Only where the header has not already said it. `layouts/base.njk` heads the
7
+ root path with the site title, and the root listing's own title is that same
8
+ title, so printing it here would give the page two `h1` elements holding the
9
+ same words. A listing at a path of its own gets only the small link home up
10
+ there, so it heads itself — even on a site whose posts page shares the
11
+ site's name. `layouts/front-page.njk` leaves its title out for the same
12
+ reason. #}
13
+ {% if not atRoot %}
6
14
  <h1 class="page-title">{{ title }}</h1>
15
+ {% endif %}
16
+ {# A site whose listing lives on a posts page renders that page's own words
17
+ above the posts; the home listing has none, and prints nothing here. #}
18
+ {% if content %}
19
+ <div class="page-body e-content">
20
+ {{ content | safe }}
21
+ </div>
22
+ {% endif %}
7
23
  {% include "partials/post-list.njk" %}
8
24
  {% include "partials/pagination.njk" %}
9
25
  {% endblock %}
@@ -1,13 +1,65 @@
1
+ {#
2
+ One page, as the source design's `content-page.php` draws it (decision-16,
3
+ TASK-83): the same `blog-post h-entry` a post is, with the same Published
4
+ line inside the `e-content` and the same bio under a rule.
5
+
6
+ Two front matter keys add to it: `contact: true` puts the contact form under
7
+ the words, and `archive: true` puts every post the site has published under
8
+ them, month by month (TASK-85).
9
+
10
+ What a page does not have: an IndieNews link, since it is not a post
11
+ anybody syndicates; neighbours, since it is in no archive; and taxonomy,
12
+ since only posts are filed. The bio credits `siteAuthor` — a page is by
13
+ whoever the site is by, not by the person a front matter line names.
14
+ #}
1
15
  {% extends "layouts/base.njk" %}
2
16
 
17
+ {#- Who the bio credits, and what tells `layouts/base.njk` the site menu is in
18
+ the bio rather than in the page footer. -#}
19
+ {% set bioAuthor = siteAuthor %}
20
+
3
21
  {% block content %}
4
- <article class="page h-entry">
5
- <header class="page-header">
6
- <h1 class="page-title p-name">{{ title }}</h1>
22
+ {% set entryUrl = page.url or url %}
23
+ <article class="blog-post h-entry">
24
+ <header>
25
+ <h1 class="p-name">{{ title }}</h1>
7
26
  </header>
8
27
 
9
- <div class="page-body e-content">
28
+ <section class="e-content">
10
29
  {{ content | safe }}
11
- </div>
30
+ {#- Most pages carry no date at all — a colophon was not published on a
31
+ Tuesday — so this line is often empty, and empty is what it renders:
32
+ the stylesheet hides a `:empty` meta paragraph rather than the layout
33
+ deciding twice whether there is anything to say. -#}
34
+ <p class="page-meta">
35
+ {%- if date %}
36
+ <a href="{{ entryUrl | url }}" class="u-url"><time class="small dt-published" datetime="{{ date | date("iso") }}">Published {{ date | date }}</time></a>
37
+ {%- endif %}
38
+ {%- if updated and (not date or (updated | date("html")) != (date | date("html"))) %}
39
+ {% if date %}<br>{% endif %}<time class="small dt-updated" datetime="{{ updated | date("iso") }}">Updated {{ updated | date }}</time>
40
+ {%- endif -%}
41
+ </p>
42
+ </section>
43
+
44
+ {#- And the archive, on the one page whose front matter asked for it
45
+ (TASK-85). Outside the `e-content` above, because the page's words are
46
+ what it wrote and this list is what the site has published since. -#}
47
+ {% if archiveMonths %}
48
+ {% include "partials/archive.njk" %}
49
+ {% endif %}
50
+
51
+ {#- The rule and the footer are the bio's own: a site whose author setting
52
+ names nobody with an account here ends the page at its words. -#}
53
+ {% if bioAuthor %}
54
+ <hr>
55
+ <footer>
56
+ {% include "partials/bio.njk" %}
57
+ </footer>
58
+ {% endif %}
12
59
  </article>
60
+
61
+ {# Only a page whose front matter says `contact: true` has one (TASK-56). #}
62
+ {% if contactForm %}
63
+ {% include "partials/contact-form.njk" %}
64
+ {% endif %}
13
65
  {% endblock %}
@@ -1,30 +1,89 @@
1
+ {#
2
+ One post, as the source design's `content-essay.php` draws it (decision-16,
3
+ TASK-83): `article.blog-post.h-entry`, the title as its `p-name`, the body
4
+ and the Published line together in one `section.e-content`, then a rule and a
5
+ footer holding the bio. The neighbouring posts, the conversation and the
6
+ comment form follow the entry.
7
+
8
+ The Published line is inside the `e-content` on purpose. It is what the
9
+ source theme does, and it is what makes a reader who copies the words out
10
+ take the date and the permalink with them.
11
+ #}
1
12
  {% extends "layouts/base.njk" %}
2
- {% import "partials/tags.njk" as taxonomy %}
13
+ {% import "partials/tags.njk" as taxonomy with context %}
14
+
15
+ {#- Who the bio credits: the person the file names, and otherwise whoever the
16
+ site is by, which is what the source theme's bio reads. A post naming
17
+ nobody on a site whose author setting names nobody either has no bio at
18
+ all. It is set out here rather than in the block because
19
+ `layouts/base.njk` reads it too — a page with a bio carries the site menu
20
+ in it, and the page footer prints the menu only where there is none. -#}
21
+ {% set bioAuthor = author or siteAuthor %}
3
22
 
4
23
  {% block content %}
5
- <article class="post h-entry">
6
- <header class="post-header">
7
- <h1 class="post-title p-name">{{ title }}</h1>
8
- {% if date %}
9
- <p class="post-meta">
10
- Published
11
- <time class="dt-published" datetime="{{ date | date("iso") }}">{{ date | date }}</time>
12
- {% if updated %}
13
- &middot; updated
14
- <time class="dt-updated" datetime="{{ updated | date("iso") }}">{{ updated | date }}</time>
15
- {% endif %}
16
- </p>
17
- {% endif %}
24
+ {% set entryUrl = page.url or url %}
25
+ <article class="blog-post h-entry">
26
+ <header>
27
+ <h1 class="p-name">{{ title }}</h1>
18
28
  </header>
19
29
 
20
- <div class="post-body e-content">
30
+ <section class="e-content">
21
31
  {{ content | safe }}
22
- </div>
32
+ <p class="entry-meta">
33
+ {#- A post tagged `indienews` opens the line with the link that submits
34
+ it there, which is how IndieNews is told the post is for it. -#}
35
+ {%- if "indienews" in tags %}
36
+ <a class="u-category small" href="https://news.indieweb.org/en">#indienews</a>
37
+ {%- endif %}
38
+ {%- if date %}
39
+ <a href="{{ entryUrl | url }}" class="u-url"><time class="small dt-published" datetime="{{ date | date("iso") }}">Published {{ date | date }}</time></a>
40
+ {%- endif %}
41
+ {#- Updated only when it is a different day in the site's own timezone:
42
+ a typo fixed an hour after publishing is not news. -#}
43
+ {%- if updated and (not date or (updated | date("html")) != (date | date("html"))) %}
44
+ {% if date %}<br>{% endif %}<time class="small dt-updated" datetime="{{ updated | date("iso") }}">Updated {{ updated | date }}</time>
45
+ {%- endif -%}
46
+ </p>
47
+ </section>
48
+
49
+ {# What it is filed under, inside the entry so that each link is a
50
+ `p-category` of it: the categories first, then the tags. #}
51
+ {{ taxonomy.categories(categories) }}
52
+ {{ taxonomy.list(tags) }}
23
53
 
24
- {% if tags.length %}
25
- <footer class="post-footer">
26
- {{ taxonomy.list(tags) }}
54
+ {#- The rule and the footer are the bio's own: a post nobody is credited with
55
+ ends at its words rather than at an empty box. -#}
56
+ {% if bioAuthor %}
57
+ <hr>
58
+ <footer>
59
+ {% include "partials/bio.njk" %}
27
60
  </footer>
28
61
  {% endif %}
29
62
  </article>
63
+
64
+ {# The post either side of this one. Each is on the context only when there is
65
+ one, so the ends of the archive draw one arrow and a site of a single post
66
+ draws none. #}
67
+ {% if previous or next %}
68
+ <nav class="blog-post-nav">
69
+ <ul>
70
+ {% if previous %}
71
+ <li><a rel="prev" href="{{ previous.url | url }}">&larr; {{ previous.title }}</a></li>
72
+ {% endif %}
73
+ {% if next %}
74
+ <li><a rel="next" href="{{ next.url | url }}">{{ next.title }} &rarr;</a></li>
75
+ {% endif %}
76
+ </ul>
77
+ </nav>
78
+ {% endif %}
79
+
80
+ {# Only a post that has been replied to, liked or boosted has one of these. #}
81
+ {% if conversation %}
82
+ {% include "partials/conversation.njk" %}
83
+ {% endif %}
84
+
85
+ {# And only one that is still taking comments has a form (TASK-50). #}
86
+ {% if commentForm %}
87
+ {% include "partials/comment-form.njk" %}
88
+ {% endif %}
30
89
  {% endblock %}
@@ -0,0 +1,57 @@
1
+ {% extends "layouts/base.njk" %}
2
+
3
+ {#
4
+ The search page (TASK-22): the form, and then whatever it found.
5
+
6
+ Expects `query`, the words searched for, empty before a search; `posts`, the
7
+ results on this page, best match first, each a listing entry with a
8
+ `snippet` of HTML marking where the words were found; and `pagination`, as a
9
+ listing has it.
10
+
11
+ The page asks not to be indexed: a results page is a question somebody asked
12
+ rather than something the site published, and a search engine that followed
13
+ every one would be crawling the site's archive once per word in it.
14
+ #}
15
+
16
+ {% block title %}{% if query %}Search results for &ldquo;{{ query }}&rdquo;{% if pagination.pageNumber > 0 %}, page {{ pagination.pageNumber + 1 }}{% endif %}{% else %}Search{% endif %} &middot; {{ site.title }}{% endblock %}
17
+
18
+ {% block head %}
19
+ {{ super() }}
20
+ <meta name="robots" content="noindex">
21
+ {% endblock %}
22
+
23
+ {% block content %}
24
+ <h1 class="page-title">Search</h1>
25
+ {% include "partials/search-form.njk" %}
26
+ {% if query %}
27
+ <p class="search-summary" role="status">
28
+ {%- if pagination.total == 0 -%}
29
+ Nothing found for &ldquo;{{ query }}&rdquo;.
30
+ {%- elif pagination.total == 1 -%}
31
+ One result for &ldquo;{{ query }}&rdquo;.
32
+ {%- else -%}
33
+ {{ pagination.total }} results for &ldquo;{{ query }}&rdquo;.
34
+ {%- endif -%}
35
+ </p>
36
+ {% if posts.length %}
37
+ <div class="search-results">
38
+ {% for post in posts %}
39
+ <article class="search-result h-entry">
40
+ <h2 class="feed-title p-name">
41
+ <a href="{{ post.url | url }}" class="u-url">{{ post.title }}</a>
42
+ </h2>
43
+ {% if post.snippet %}
44
+ <p class="search-snippet">{{ post.snippet | safe }}</p>
45
+ {% endif %}
46
+ {% if post.date %}
47
+ <p class="feed-meta">
48
+ <time class="feed-date dt-published" datetime="{{ post.date | date("iso") }}">{{ post.date | date }}</time>
49
+ </p>
50
+ {% endif %}
51
+ </article>
52
+ {% endfor %}
53
+ </div>
54
+ {% endif %}
55
+ {% include "partials/pagination.njk" %}
56
+ {% endif %}
57
+ {% endblock %}
@@ -2,18 +2,15 @@
2
2
 
3
3
  {% block title %}Tagged &ldquo;{{ tag }}&rdquo;{% if pagination.pageNumber > 0 %}, page {{ pagination.pageNumber + 1 }}{% endif %} &middot; {{ site.title }}{% endblock %}
4
4
 
5
- {% set tagRoot = "/tags/" + (tag | urlencode) + "/" %}
5
+ {% import "partials/feeds.njk" as feeds %}
6
+ {% set tagRoot = "/" + (site.tagBase or "tag") + "/" + (tag | urlencode) + "/" %}
6
7
  {% block alternates %}
7
8
  {{ super() }}
8
- <link rel="alternate" type="application/atom+xml" title="{{ site.title }}: {{ tag }}" href="{{ (tagRoot + "feed.xml") | url }}">
9
- <link rel="alternate" type="application/feed+json" title="{{ site.title }}: {{ tag }}" href="{{ (tagRoot + "feed.json") | url }}">
9
+ {{ feeds.feedLinks(tagRoot, site.title + ": " + tag) }}
10
10
  {% endblock %}
11
11
 
12
12
  {% block content %}
13
13
  <h1 class="page-title">Tagged &ldquo;{{ tag }}&rdquo;</h1>
14
- <p class="tag-count">
15
- {{ pagination.total }} {% if pagination.total == 1 %}entry{% else %}entries{% endif %}.
16
- </p>
17
14
  {% include "partials/post-list.njk" %}
18
15
  {% include "partials/pagination.njk" %}
19
16
  {% endblock %}