@geekity/cms 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +2091 -214
  2. package/admin/components/fields.njk +165 -0
  3. package/admin/layouts/base.njk +1 -1
  4. package/admin/layouts/settings-page.njk +26 -0
  5. package/admin/layouts/shell.njk +17 -3
  6. package/admin/pages/account/forgot.njk +47 -0
  7. package/admin/pages/account/login.njk +26 -0
  8. package/admin/pages/account/reset.njk +38 -0
  9. package/admin/pages/account/setup.njk +28 -0
  10. package/admin/pages/appearance/themes.njk +69 -0
  11. package/admin/pages/comments/all.njk +133 -0
  12. package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
  13. package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
  14. package/admin/pages/documents/editor.njk +196 -0
  15. package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
  16. package/admin/pages/documents/taxonomy.njk +95 -0
  17. package/admin/pages/federation/followers.njk +238 -0
  18. package/admin/pages/media/library.njk +160 -0
  19. package/admin/pages/messages/all.njk +110 -0
  20. package/admin/{layouts → pages}/placeholder.njk +5 -1
  21. package/admin/pages/settings/discussion.njk +99 -0
  22. package/admin/pages/settings/email.njk +203 -0
  23. package/admin/pages/settings/federation.njk +75 -0
  24. package/admin/pages/settings/general.njk +29 -0
  25. package/admin/pages/settings/permalinks.njk +50 -0
  26. package/admin/pages/settings/reading.njk +72 -0
  27. package/admin/pages/users/edit.njk +239 -0
  28. package/admin/pages/users/list.njk +48 -0
  29. package/admin/pages/users/new.njk +41 -0
  30. package/admin/static/admin.css +498 -3
  31. package/admin/static/copy.js +52 -0
  32. package/admin/static/editor.js +16 -16
  33. package/admin/static/slug.js +61 -0
  34. package/dist/admin/accounts.d.ts +413 -0
  35. package/dist/admin/accounts.d.ts.map +1 -0
  36. package/dist/admin/accounts.js +680 -0
  37. package/dist/admin/accounts.js.map +1 -0
  38. package/dist/admin/appearance.d.ts +80 -0
  39. package/dist/admin/appearance.d.ts.map +1 -0
  40. package/dist/admin/appearance.js +136 -0
  41. package/dist/admin/appearance.js.map +1 -0
  42. package/dist/admin/comments.d.ts +90 -0
  43. package/dist/admin/comments.d.ts.map +1 -0
  44. package/dist/admin/comments.js +244 -0
  45. package/dist/admin/comments.js.map +1 -0
  46. package/dist/admin/credentials.d.ts +26 -2
  47. package/dist/admin/credentials.d.ts.map +1 -1
  48. package/dist/admin/credentials.js +35 -2
  49. package/dist/admin/credentials.js.map +1 -1
  50. package/dist/admin/documents.d.ts +127 -10
  51. package/dist/admin/documents.d.ts.map +1 -1
  52. package/dist/admin/documents.js +360 -41
  53. package/dist/admin/documents.js.map +1 -1
  54. package/dist/admin/federation.d.ts +151 -50
  55. package/dist/admin/federation.d.ts.map +1 -1
  56. package/dist/admin/federation.js +225 -93
  57. package/dist/admin/federation.js.map +1 -1
  58. package/dist/admin/formatting.d.ts +20 -0
  59. package/dist/admin/formatting.d.ts.map +1 -0
  60. package/dist/admin/formatting.js +72 -0
  61. package/dist/admin/formatting.js.map +1 -0
  62. package/dist/admin/headers.d.ts +65 -0
  63. package/dist/admin/headers.d.ts.map +1 -0
  64. package/dist/admin/headers.js +104 -0
  65. package/dist/admin/headers.js.map +1 -0
  66. package/dist/admin/index.d.ts +38 -12
  67. package/dist/admin/index.d.ts.map +1 -1
  68. package/dist/admin/index.js +25 -7
  69. package/dist/admin/index.js.map +1 -1
  70. package/dist/admin/media.d.ts +168 -0
  71. package/dist/admin/media.d.ts.map +1 -0
  72. package/dist/admin/media.js +295 -0
  73. package/dist/admin/media.js.map +1 -0
  74. package/dist/admin/menu.d.ts +79 -0
  75. package/dist/admin/menu.d.ts.map +1 -0
  76. package/dist/admin/menu.js +126 -0
  77. package/dist/admin/menu.js.map +1 -0
  78. package/dist/admin/messages.d.ts +80 -0
  79. package/dist/admin/messages.d.ts.map +1 -0
  80. package/dist/admin/messages.js +152 -0
  81. package/dist/admin/messages.js.map +1 -0
  82. package/dist/admin/preview.d.ts.map +1 -1
  83. package/dist/admin/preview.js +31 -7
  84. package/dist/admin/preview.js.map +1 -1
  85. package/dist/admin/recovery.d.ts +92 -0
  86. package/dist/admin/recovery.d.ts.map +1 -0
  87. package/dist/admin/recovery.js +229 -0
  88. package/dist/admin/recovery.js.map +1 -0
  89. package/dist/admin/routes.d.ts +0 -20
  90. package/dist/admin/routes.d.ts.map +1 -1
  91. package/dist/admin/routes.js +155 -105
  92. package/dist/admin/routes.js.map +1 -1
  93. package/dist/admin/settings-discussion.d.ts +37 -0
  94. package/dist/admin/settings-discussion.d.ts.map +1 -0
  95. package/dist/admin/settings-discussion.js +117 -0
  96. package/dist/admin/settings-discussion.js.map +1 -0
  97. package/dist/admin/settings-email.d.ts +54 -0
  98. package/dist/admin/settings-email.d.ts.map +1 -0
  99. package/dist/admin/settings-email.js +189 -0
  100. package/dist/admin/settings-email.js.map +1 -0
  101. package/dist/admin/settings-federation.d.ts +39 -0
  102. package/dist/admin/settings-federation.d.ts.map +1 -0
  103. package/dist/admin/settings-federation.js +103 -0
  104. package/dist/admin/settings-federation.js.map +1 -0
  105. package/dist/admin/settings-general.d.ts +12 -0
  106. package/dist/admin/settings-general.d.ts.map +1 -0
  107. package/dist/admin/settings-general.js +48 -0
  108. package/dist/admin/settings-general.js.map +1 -0
  109. package/dist/admin/settings-page.d.ts +102 -0
  110. package/dist/admin/settings-page.d.ts.map +1 -0
  111. package/dist/admin/settings-page.js +126 -0
  112. package/dist/admin/settings-page.js.map +1 -0
  113. package/dist/admin/settings-pages.d.ts +19 -0
  114. package/dist/admin/settings-pages.d.ts.map +1 -0
  115. package/dist/admin/settings-pages.js +33 -0
  116. package/dist/admin/settings-pages.js.map +1 -0
  117. package/dist/admin/settings-permalinks.d.ts +16 -0
  118. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  119. package/dist/admin/settings-permalinks.js +32 -0
  120. package/dist/admin/settings-permalinks.js.map +1 -0
  121. package/dist/admin/settings-reading.d.ts +33 -0
  122. package/dist/admin/settings-reading.d.ts.map +1 -0
  123. package/dist/admin/settings-reading.js +48 -0
  124. package/dist/admin/settings-reading.js.map +1 -0
  125. package/dist/admin/settings.d.ts +325 -96
  126. package/dist/admin/settings.d.ts.map +1 -1
  127. package/dist/admin/settings.js +650 -308
  128. package/dist/admin/settings.js.map +1 -1
  129. package/dist/admin/store.d.ts +606 -152
  130. package/dist/admin/store.d.ts.map +1 -1
  131. package/dist/admin/store.js +863 -268
  132. package/dist/admin/store.js.map +1 -1
  133. package/dist/admin/taxonomy.d.ts +114 -0
  134. package/dist/admin/taxonomy.d.ts.map +1 -0
  135. package/dist/admin/taxonomy.js +289 -0
  136. package/dist/admin/taxonomy.js.map +1 -0
  137. package/dist/admin/templates.d.ts +44 -14
  138. package/dist/admin/templates.d.ts.map +1 -1
  139. package/dist/admin/templates.js +44 -14
  140. package/dist/admin/templates.js.map +1 -1
  141. package/dist/admin/throttle.d.ts +84 -0
  142. package/dist/admin/throttle.d.ts.map +1 -0
  143. package/dist/admin/throttle.js +143 -0
  144. package/dist/admin/throttle.js.map +1 -0
  145. package/dist/admin/uploads.d.ts +28 -2
  146. package/dist/admin/uploads.d.ts.map +1 -1
  147. package/dist/admin/uploads.js +43 -4
  148. package/dist/admin/uploads.js.map +1 -1
  149. package/dist/admin/users.d.ts +100 -13
  150. package/dist/admin/users.d.ts.map +1 -1
  151. package/dist/admin/users.js +412 -39
  152. package/dist/admin/users.js.map +1 -1
  153. package/dist/cache.d.ts +141 -0
  154. package/dist/cache.d.ts.map +1 -0
  155. package/dist/cache.js +207 -0
  156. package/dist/cache.js.map +1 -0
  157. package/dist/cli.d.ts +14 -2
  158. package/dist/cli.d.ts.map +1 -1
  159. package/dist/cli.js +424 -21
  160. package/dist/cli.js.map +1 -1
  161. package/dist/comments/akismet.d.ts +130 -0
  162. package/dist/comments/akismet.d.ts.map +1 -0
  163. package/dist/comments/akismet.js +274 -0
  164. package/dist/comments/akismet.js.map +1 -0
  165. package/dist/comments/conversation.d.ts +29 -0
  166. package/dist/comments/conversation.d.ts.map +1 -0
  167. package/dist/comments/conversation.js +60 -0
  168. package/dist/comments/conversation.js.map +1 -0
  169. package/dist/comments/form.d.ts +75 -0
  170. package/dist/comments/form.d.ts.map +1 -0
  171. package/dist/comments/form.js +64 -0
  172. package/dist/comments/form.js.map +1 -0
  173. package/dist/comments/index.d.ts +15 -0
  174. package/dist/comments/index.d.ts.map +1 -0
  175. package/dist/comments/index.js +9 -0
  176. package/dist/comments/index.js.map +1 -0
  177. package/dist/comments/markdown.d.ts +8 -0
  178. package/dist/comments/markdown.d.ts.map +1 -0
  179. package/dist/comments/markdown.js +85 -0
  180. package/dist/comments/markdown.js.map +1 -0
  181. package/dist/comments/moderate.d.ts +71 -0
  182. package/dist/comments/moderate.d.ts.map +1 -0
  183. package/dist/comments/moderate.js +88 -0
  184. package/dist/comments/moderate.js.map +1 -0
  185. package/dist/comments/policy.d.ts +57 -0
  186. package/dist/comments/policy.d.ts.map +1 -0
  187. package/dist/comments/policy.js +80 -0
  188. package/dist/comments/policy.js.map +1 -0
  189. package/dist/comments/records.d.ts +266 -0
  190. package/dist/comments/records.d.ts.map +1 -0
  191. package/dist/comments/records.js +487 -0
  192. package/dist/comments/records.js.map +1 -0
  193. package/dist/comments/routes.d.ts +58 -0
  194. package/dist/comments/routes.d.ts.map +1 -0
  195. package/dist/comments/routes.js +177 -0
  196. package/dist/comments/routes.js.map +1 -0
  197. package/dist/comments/submission.d.ts +263 -0
  198. package/dist/comments/submission.d.ts.map +1 -0
  199. package/dist/comments/submission.js +241 -0
  200. package/dist/comments/submission.js.map +1 -0
  201. package/dist/config.d.ts +190 -5
  202. package/dist/config.d.ts.map +1 -1
  203. package/dist/config.js +118 -6
  204. package/dist/config.js.map +1 -1
  205. package/dist/contact/delivery.d.ts +60 -0
  206. package/dist/contact/delivery.d.ts.map +1 -0
  207. package/dist/contact/delivery.js +87 -0
  208. package/dist/contact/delivery.js.map +1 -0
  209. package/dist/contact/form.d.ts +130 -0
  210. package/dist/contact/form.d.ts.map +1 -0
  211. package/dist/contact/form.js +163 -0
  212. package/dist/contact/form.js.map +1 -0
  213. package/dist/contact/index.d.ts +17 -0
  214. package/dist/contact/index.d.ts.map +1 -0
  215. package/dist/contact/index.js +13 -0
  216. package/dist/contact/index.js.map +1 -0
  217. package/dist/contact/records.d.ts +124 -0
  218. package/dist/contact/records.d.ts.map +1 -0
  219. package/dist/contact/records.js +218 -0
  220. package/dist/contact/records.js.map +1 -0
  221. package/dist/contact/routes.d.ts +17 -0
  222. package/dist/contact/routes.d.ts.map +1 -0
  223. package/dist/contact/routes.js +127 -0
  224. package/dist/contact/routes.js.map +1 -0
  225. package/dist/contact/submission.d.ts +103 -0
  226. package/dist/contact/submission.d.ts.map +1 -0
  227. package/dist/contact/submission.js +166 -0
  228. package/dist/contact/submission.js.map +1 -0
  229. package/dist/content/document.d.ts +7 -2
  230. package/dist/content/document.d.ts.map +1 -1
  231. package/dist/content/document.js +1 -0
  232. package/dist/content/document.js.map +1 -1
  233. package/dist/content/index.d.ts +7 -2
  234. package/dist/content/index.d.ts.map +1 -1
  235. package/dist/content/index.js +4 -1
  236. package/dist/content/index.js.map +1 -1
  237. package/dist/content/markdown.d.ts.map +1 -1
  238. package/dist/content/markdown.js +24 -2
  239. package/dist/content/markdown.js.map +1 -1
  240. package/dist/content/parser.d.ts.map +1 -1
  241. package/dist/content/parser.js +11 -4
  242. package/dist/content/parser.js.map +1 -1
  243. package/dist/content/save.d.ts +5 -0
  244. package/dist/content/save.d.ts.map +1 -1
  245. package/dist/content/save.js +44 -1
  246. package/dist/content/save.js.map +1 -1
  247. package/dist/content/schedule.d.ts +125 -0
  248. package/dist/content/schedule.d.ts.map +1 -0
  249. package/dist/content/schedule.js +207 -0
  250. package/dist/content/schedule.js.map +1 -0
  251. package/dist/content/search.d.ts +64 -0
  252. package/dist/content/search.d.ts.map +1 -0
  253. package/dist/content/search.js +136 -0
  254. package/dist/content/search.js.map +1 -0
  255. package/dist/content/store.d.ts +202 -7
  256. package/dist/content/store.d.ts.map +1 -1
  257. package/dist/content/store.js +374 -67
  258. package/dist/content/store.js.map +1 -1
  259. package/dist/content/sync.d.ts +7 -1
  260. package/dist/content/sync.d.ts.map +1 -1
  261. package/dist/content/sync.js +18 -10
  262. package/dist/content/sync.js.map +1 -1
  263. package/dist/content/time.d.ts +56 -0
  264. package/dist/content/time.d.ts.map +1 -0
  265. package/dist/content/time.js +141 -0
  266. package/dist/content/time.js.map +1 -0
  267. package/dist/content/writer.d.ts.map +1 -1
  268. package/dist/content/writer.js +3 -0
  269. package/dist/content/writer.js.map +1 -1
  270. package/dist/env.d.ts +58 -4
  271. package/dist/env.d.ts.map +1 -1
  272. package/dist/federation/actor.d.ts +95 -41
  273. package/dist/federation/actor.d.ts.map +1 -1
  274. package/dist/federation/actor.js +180 -53
  275. package/dist/federation/actor.js.map +1 -1
  276. package/dist/federation/article.d.ts +44 -17
  277. package/dist/federation/article.d.ts.map +1 -1
  278. package/dist/federation/article.js +98 -46
  279. package/dist/federation/article.js.map +1 -1
  280. package/dist/federation/delivery.d.ts +63 -15
  281. package/dist/federation/delivery.d.ts.map +1 -1
  282. package/dist/federation/delivery.js +154 -80
  283. package/dist/federation/delivery.js.map +1 -1
  284. package/dist/federation/federation.d.ts +22 -17
  285. package/dist/federation/federation.d.ts.map +1 -1
  286. package/dist/federation/federation.js +98 -77
  287. package/dist/federation/federation.js.map +1 -1
  288. package/dist/federation/followers.d.ts +3 -2
  289. package/dist/federation/followers.d.ts.map +1 -1
  290. package/dist/federation/followers.js +6 -5
  291. package/dist/federation/followers.js.map +1 -1
  292. package/dist/federation/import-wordpress.d.ts +128 -0
  293. package/dist/federation/import-wordpress.d.ts.map +1 -0
  294. package/dist/federation/import-wordpress.js +426 -0
  295. package/dist/federation/import-wordpress.js.map +1 -0
  296. package/dist/federation/inbox.d.ts +36 -13
  297. package/dist/federation/inbox.d.ts.map +1 -1
  298. package/dist/federation/inbox.js +120 -49
  299. package/dist/federation/inbox.js.map +1 -1
  300. package/dist/federation/index.d.ts +22 -10
  301. package/dist/federation/index.d.ts.map +1 -1
  302. package/dist/federation/index.js +13 -8
  303. package/dist/federation/index.js.map +1 -1
  304. package/dist/federation/keys.d.ts +98 -20
  305. package/dist/federation/keys.d.ts.map +1 -1
  306. package/dist/federation/keys.js +269 -39
  307. package/dist/federation/keys.js.map +1 -1
  308. package/dist/federation/mount.d.ts +42 -10
  309. package/dist/federation/mount.d.ts.map +1 -1
  310. package/dist/federation/mount.js +266 -26
  311. package/dist/federation/mount.js.map +1 -1
  312. package/dist/federation/paths.d.ts +23 -35
  313. package/dist/federation/paths.d.ts.map +1 -1
  314. package/dist/federation/paths.js +26 -39
  315. package/dist/federation/paths.js.map +1 -1
  316. package/dist/federation/records.d.ts +223 -0
  317. package/dist/federation/records.d.ts.map +1 -0
  318. package/dist/federation/records.js +506 -0
  319. package/dist/federation/records.js.map +1 -0
  320. package/dist/federation/relays.d.ts +114 -0
  321. package/dist/federation/relays.d.ts.map +1 -0
  322. package/dist/federation/relays.js +290 -0
  323. package/dist/federation/relays.js.map +1 -0
  324. package/dist/federation/replies.d.ts +80 -0
  325. package/dist/federation/replies.d.ts.map +1 -0
  326. package/dist/federation/replies.js +166 -0
  327. package/dist/federation/replies.js.map +1 -0
  328. package/dist/federation/wordpress.d.ts +131 -0
  329. package/dist/federation/wordpress.d.ts.map +1 -0
  330. package/dist/federation/wordpress.js +341 -0
  331. package/dist/federation/wordpress.js.map +1 -0
  332. package/dist/files/atomic.d.ts +103 -0
  333. package/dist/files/atomic.d.ts.map +1 -0
  334. package/dist/files/atomic.js +150 -0
  335. package/dist/files/atomic.js.map +1 -0
  336. package/dist/files/index.d.ts +3 -0
  337. package/dist/files/index.d.ts.map +1 -0
  338. package/dist/files/index.js +2 -0
  339. package/dist/files/index.js.map +1 -0
  340. package/dist/forms/protection.d.ts +85 -0
  341. package/dist/forms/protection.d.ts.map +1 -0
  342. package/dist/forms/protection.js +116 -0
  343. package/dist/forms/protection.js.map +1 -0
  344. package/dist/images/icons.d.ts +59 -0
  345. package/dist/images/icons.d.ts.map +1 -0
  346. package/dist/images/icons.js +131 -0
  347. package/dist/images/icons.js.map +1 -0
  348. package/dist/images/index.d.ts +7 -0
  349. package/dist/images/index.d.ts.map +1 -0
  350. package/dist/images/index.js +4 -0
  351. package/dist/images/index.js.map +1 -0
  352. package/dist/images/markup.d.ts +47 -0
  353. package/dist/images/markup.d.ts.map +1 -0
  354. package/dist/images/markup.js +175 -0
  355. package/dist/images/markup.js.map +1 -0
  356. package/dist/images/paths.d.ts +34 -0
  357. package/dist/images/paths.d.ts.map +1 -0
  358. package/dist/images/paths.js +41 -0
  359. package/dist/images/paths.js.map +1 -0
  360. package/dist/images/variants.d.ts +104 -0
  361. package/dist/images/variants.d.ts.map +1 -0
  362. package/dist/images/variants.js +320 -0
  363. package/dist/images/variants.js.map +1 -0
  364. package/dist/index.d.ts +123 -19
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +327 -25
  367. package/dist/index.js.map +1 -1
  368. package/dist/init.d.ts +18 -0
  369. package/dist/init.d.ts.map +1 -1
  370. package/dist/init.js +34 -3
  371. package/dist/init.js.map +1 -1
  372. package/dist/mail/brevo.d.ts +35 -0
  373. package/dist/mail/brevo.d.ts.map +1 -0
  374. package/dist/mail/brevo.js +85 -0
  375. package/dist/mail/brevo.js.map +1 -0
  376. package/dist/mail/credentials.d.ts +62 -0
  377. package/dist/mail/credentials.d.ts.map +1 -0
  378. package/dist/mail/credentials.js +86 -0
  379. package/dist/mail/credentials.js.map +1 -0
  380. package/dist/mail/index.d.ts +15 -0
  381. package/dist/mail/index.d.ts.map +1 -0
  382. package/dist/mail/index.js +8 -0
  383. package/dist/mail/index.js.map +1 -0
  384. package/dist/mail/memory.d.ts +35 -0
  385. package/dist/mail/memory.d.ts.map +1 -0
  386. package/dist/mail/memory.js +29 -0
  387. package/dist/mail/memory.js.map +1 -0
  388. package/dist/mail/provider.d.ts +80 -0
  389. package/dist/mail/provider.d.ts.map +1 -0
  390. package/dist/mail/provider.js +23 -0
  391. package/dist/mail/provider.js.map +1 -0
  392. package/dist/mail/service.d.ts +156 -0
  393. package/dist/mail/service.d.ts.map +1 -0
  394. package/dist/mail/service.js +265 -0
  395. package/dist/mail/service.js.map +1 -0
  396. package/dist/mail/smtp.d.ts +39 -0
  397. package/dist/mail/smtp.d.ts.map +1 -0
  398. package/dist/mail/smtp.js +58 -0
  399. package/dist/mail/smtp.js.map +1 -0
  400. package/dist/mail/templates.d.ts +91 -0
  401. package/dist/mail/templates.d.ts.map +1 -0
  402. package/dist/mail/templates.js +69 -0
  403. package/dist/mail/templates.js.map +1 -0
  404. package/dist/notifications/comments.d.ts +66 -0
  405. package/dist/notifications/comments.d.ts.map +1 -0
  406. package/dist/notifications/comments.js +151 -0
  407. package/dist/notifications/comments.js.map +1 -0
  408. package/dist/notifications/digest.d.ts +135 -0
  409. package/dist/notifications/digest.d.ts.map +1 -0
  410. package/dist/notifications/digest.js +287 -0
  411. package/dist/notifications/digest.js.map +1 -0
  412. package/dist/notifications/index.d.ts +13 -0
  413. package/dist/notifications/index.d.ts.map +1 -0
  414. package/dist/notifications/index.js +8 -0
  415. package/dist/notifications/index.js.map +1 -0
  416. package/dist/notifications/links.d.ts +60 -0
  417. package/dist/notifications/links.d.ts.map +1 -0
  418. package/dist/notifications/links.js +63 -0
  419. package/dist/notifications/links.js.map +1 -0
  420. package/dist/notifications/optouts.d.ts +48 -0
  421. package/dist/notifications/optouts.d.ts.map +1 -0
  422. package/dist/notifications/optouts.js +93 -0
  423. package/dist/notifications/optouts.js.map +1 -0
  424. package/dist/notifications/preferences.d.ts +158 -0
  425. package/dist/notifications/preferences.d.ts.map +1 -0
  426. package/dist/notifications/preferences.js +195 -0
  427. package/dist/notifications/preferences.js.map +1 -0
  428. package/dist/notifications/routes.d.ts +28 -0
  429. package/dist/notifications/routes.d.ts.map +1 -0
  430. package/dist/notifications/routes.js +184 -0
  431. package/dist/notifications/routes.js.map +1 -0
  432. package/dist/notifications/tokens.d.ts +60 -0
  433. package/dist/notifications/tokens.d.ts.map +1 -0
  434. package/dist/notifications/tokens.js +125 -0
  435. package/dist/notifications/tokens.js.map +1 -0
  436. package/dist/notify.d.ts +84 -0
  437. package/dist/notify.d.ts.map +1 -0
  438. package/dist/notify.js +149 -0
  439. package/dist/notify.js.map +1 -0
  440. package/dist/web/archive.d.ts +49 -0
  441. package/dist/web/archive.d.ts.map +1 -0
  442. package/dist/web/archive.js +59 -0
  443. package/dist/web/archive.js.map +1 -0
  444. package/dist/web/assets.d.ts +6 -5
  445. package/dist/web/assets.d.ts.map +1 -1
  446. package/dist/web/assets.js +5 -7
  447. package/dist/web/assets.js.map +1 -1
  448. package/dist/web/authors.d.ts +143 -0
  449. package/dist/web/authors.d.ts.map +1 -0
  450. package/dist/web/authors.js +178 -0
  451. package/dist/web/authors.js.map +1 -0
  452. package/dist/web/comments.d.ts +60 -0
  453. package/dist/web/comments.d.ts.map +1 -0
  454. package/dist/web/comments.js +207 -0
  455. package/dist/web/comments.js.map +1 -0
  456. package/dist/web/context.d.ts +162 -28
  457. package/dist/web/context.d.ts.map +1 -1
  458. package/dist/web/context.js +123 -26
  459. package/dist/web/context.js.map +1 -1
  460. package/dist/web/conversation.d.ts +209 -0
  461. package/dist/web/conversation.d.ts.map +1 -0
  462. package/dist/web/conversation.js +557 -0
  463. package/dist/web/conversation.js.map +1 -0
  464. package/dist/web/documents.d.ts +36 -6
  465. package/dist/web/documents.d.ts.map +1 -1
  466. package/dist/web/documents.js +52 -10
  467. package/dist/web/documents.js.map +1 -1
  468. package/dist/web/feed-atom.d.ts +22 -0
  469. package/dist/web/feed-atom.d.ts.map +1 -0
  470. package/dist/web/feed-atom.js +83 -0
  471. package/dist/web/feed-atom.js.map +1 -0
  472. package/dist/web/feed-item.d.ts +145 -0
  473. package/dist/web/feed-item.d.ts.map +1 -0
  474. package/dist/web/feed-item.js +120 -0
  475. package/dist/web/feed-item.js.map +1 -0
  476. package/dist/web/feed-json.d.ts +79 -0
  477. package/dist/web/feed-json.d.ts.map +1 -0
  478. package/dist/web/feed-json.js +53 -0
  479. package/dist/web/feed-json.js.map +1 -0
  480. package/dist/web/feed-rss.d.ts +26 -0
  481. package/dist/web/feed-rss.d.ts.map +1 -0
  482. package/dist/web/feed-rss.js +203 -0
  483. package/dist/web/feed-rss.js.map +1 -0
  484. package/dist/web/feed-source.d.ts +244 -0
  485. package/dist/web/feed-source.d.ts.map +1 -0
  486. package/dist/web/feed-source.js +201 -0
  487. package/dist/web/feed-source.js.map +1 -0
  488. package/dist/web/feed-xml.d.ts +63 -0
  489. package/dist/web/feed-xml.d.ts.map +1 -0
  490. package/dist/web/feed-xml.js +116 -0
  491. package/dist/web/feed-xml.js.map +1 -0
  492. package/dist/web/feeds.d.ts +31 -96
  493. package/dist/web/feeds.d.ts.map +1 -1
  494. package/dist/web/feeds.js +94 -198
  495. package/dist/web/feeds.js.map +1 -1
  496. package/dist/web/health.d.ts +31 -0
  497. package/dist/web/health.d.ts.map +1 -0
  498. package/dist/web/health.js +44 -0
  499. package/dist/web/health.js.map +1 -0
  500. package/dist/web/index.d.ts +30 -10
  501. package/dist/web/index.d.ts.map +1 -1
  502. package/dist/web/index.js +18 -7
  503. package/dist/web/index.js.map +1 -1
  504. package/dist/web/navigation.d.ts +73 -0
  505. package/dist/web/navigation.d.ts.map +1 -0
  506. package/dist/web/navigation.js +110 -0
  507. package/dist/web/navigation.js.map +1 -0
  508. package/dist/web/negotiate.d.ts +9 -0
  509. package/dist/web/negotiate.d.ts.map +1 -1
  510. package/dist/web/negotiate.js +6 -1
  511. package/dist/web/negotiate.js.map +1 -1
  512. package/dist/web/recent.d.ts +43 -0
  513. package/dist/web/recent.d.ts.map +1 -0
  514. package/dist/web/recent.js +37 -0
  515. package/dist/web/recent.js.map +1 -0
  516. package/dist/web/render.d.ts +197 -9
  517. package/dist/web/render.d.ts.map +1 -1
  518. package/dist/web/render.js +334 -17
  519. package/dist/web/render.js.map +1 -1
  520. package/dist/web/routes.d.ts +25 -8
  521. package/dist/web/routes.d.ts.map +1 -1
  522. package/dist/web/routes.js +845 -93
  523. package/dist/web/routes.js.map +1 -1
  524. package/dist/web/sanitize.d.ts +19 -0
  525. package/dist/web/sanitize.d.ts.map +1 -0
  526. package/dist/web/sanitize.js +272 -0
  527. package/dist/web/sanitize.js.map +1 -0
  528. package/dist/web/search.d.ts +79 -0
  529. package/dist/web/search.d.ts.map +1 -0
  530. package/dist/web/search.js +94 -0
  531. package/dist/web/search.js.map +1 -0
  532. package/dist/web/sitemap.d.ts +120 -0
  533. package/dist/web/sitemap.d.ts.map +1 -0
  534. package/dist/web/sitemap.js +199 -0
  535. package/dist/web/sitemap.js.map +1 -0
  536. package/dist/web/taxonomy.d.ts +152 -0
  537. package/dist/web/taxonomy.d.ts.map +1 -0
  538. package/dist/web/taxonomy.js +237 -0
  539. package/dist/web/taxonomy.js.map +1 -0
  540. package/dist/web/templates.d.ts +54 -16
  541. package/dist/web/templates.d.ts.map +1 -1
  542. package/dist/web/templates.js +109 -28
  543. package/dist/web/templates.js.map +1 -1
  544. package/dist/web/themes.d.ts +205 -0
  545. package/dist/web/themes.d.ts.map +1 -0
  546. package/dist/web/themes.js +277 -0
  547. package/dist/web/themes.js.map +1 -0
  548. package/dist/webmention/discovery.d.ts +51 -0
  549. package/dist/webmention/discovery.d.ts.map +1 -0
  550. package/dist/webmention/discovery.js +176 -0
  551. package/dist/webmention/discovery.js.map +1 -0
  552. package/dist/webmention/html.d.ts +71 -0
  553. package/dist/webmention/html.d.ts.map +1 -0
  554. package/dist/webmention/html.js +285 -0
  555. package/dist/webmention/html.js.map +1 -0
  556. package/dist/webmention/index.d.ts +12 -0
  557. package/dist/webmention/index.d.ts.map +1 -0
  558. package/dist/webmention/index.js +8 -0
  559. package/dist/webmention/index.js.map +1 -0
  560. package/dist/webmention/links.d.ts +18 -0
  561. package/dist/webmention/links.d.ts.map +1 -0
  562. package/dist/webmention/links.js +64 -0
  563. package/dist/webmention/links.js.map +1 -0
  564. package/dist/webmention/microformats.d.ts +93 -0
  565. package/dist/webmention/microformats.d.ts.map +1 -0
  566. package/dist/webmention/microformats.js +376 -0
  567. package/dist/webmention/microformats.js.map +1 -0
  568. package/dist/webmention/receive.d.ts +141 -0
  569. package/dist/webmention/receive.d.ts.map +1 -0
  570. package/dist/webmention/receive.js +264 -0
  571. package/dist/webmention/receive.js.map +1 -0
  572. package/dist/webmention/routes.d.ts +37 -0
  573. package/dist/webmention/routes.d.ts.map +1 -0
  574. package/dist/webmention/routes.js +75 -0
  575. package/dist/webmention/routes.js.map +1 -0
  576. package/dist/webmention/service.d.ts +94 -0
  577. package/dist/webmention/service.d.ts.map +1 -0
  578. package/dist/webmention/service.js +207 -0
  579. package/dist/webmention/service.js.map +1 -0
  580. package/package.json +11 -6
  581. package/templates/site/content/_data/site.json +1 -0
  582. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  583. package/templates/site/geekity.config.ts +11 -1
  584. package/templates/site/tsconfig.json +1 -1
  585. package/themes/default/README.md +1096 -50
  586. package/themes/default/layouts/404.njk +2 -3
  587. package/themes/default/layouts/author.njk +37 -0
  588. package/themes/default/layouts/base.njk +172 -31
  589. package/themes/default/layouts/category.njk +27 -0
  590. package/themes/default/layouts/front-page.njk +57 -0
  591. package/themes/default/layouts/home.njk +17 -1
  592. package/themes/default/layouts/page.njk +57 -5
  593. package/themes/default/layouts/post.njk +78 -19
  594. package/themes/default/layouts/search.njk +57 -0
  595. package/themes/default/layouts/tag.njk +3 -6
  596. package/themes/default/mail/comment-digest.html.njk +37 -0
  597. package/themes/default/mail/comment-digest.subject.njk +3 -0
  598. package/themes/default/mail/comment-digest.txt.njk +40 -0
  599. package/themes/default/mail/comment-pending.html.njk +27 -0
  600. package/themes/default/mail/comment-pending.subject.njk +2 -0
  601. package/themes/default/mail/comment-pending.txt.njk +24 -0
  602. package/themes/default/mail/comment-reply.html.njk +21 -0
  603. package/themes/default/mail/comment-reply.subject.njk +2 -0
  604. package/themes/default/mail/comment-reply.txt.njk +22 -0
  605. package/themes/default/mail/contact-message.html.njk +24 -0
  606. package/themes/default/mail/contact-message.subject.njk +5 -0
  607. package/themes/default/mail/contact-message.txt.njk +20 -0
  608. package/themes/default/mail/password-changed.html.njk +18 -0
  609. package/themes/default/mail/password-changed.subject.njk +2 -0
  610. package/themes/default/mail/password-changed.txt.njk +17 -0
  611. package/themes/default/mail/password-reset.html.njk +22 -0
  612. package/themes/default/mail/password-reset.subject.njk +2 -0
  613. package/themes/default/mail/password-reset.txt.njk +18 -0
  614. package/themes/default/mail/test.html.njk +14 -0
  615. package/themes/default/mail/test.subject.njk +2 -0
  616. package/themes/default/mail/test.txt.njk +12 -0
  617. package/themes/default/partials/archive.njk +27 -0
  618. package/themes/default/partials/bio.njk +77 -0
  619. package/themes/default/partials/comment-form.njk +109 -0
  620. package/themes/default/partials/contact-form.njk +88 -0
  621. package/themes/default/partials/conversation.njk +139 -0
  622. package/themes/default/partials/feeds.njk +26 -0
  623. package/themes/default/partials/jsonld.njk +120 -0
  624. package/themes/default/partials/pagination.njk +12 -6
  625. package/themes/default/partials/post-list.njk +51 -18
  626. package/themes/default/partials/search-form.njk +17 -0
  627. package/themes/default/partials/tags.njk +26 -5
  628. package/themes/default/static/highlight.js +4 -0
  629. package/themes/default/static/style.css +1119 -194
  630. package/themes/default/theme.json +5 -0
  631. package/admin/layouts/document-editor.njk +0 -167
  632. package/admin/layouts/federation.njk +0 -145
  633. package/admin/layouts/login.njk +0 -23
  634. package/admin/layouts/settings.njk +0 -116
  635. package/admin/layouts/setup.njk +0 -27
  636. package/admin/layouts/users.njk +0 -91
  637. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -0,0 +1,196 @@
1
+ {# The editor behind /admin/posts/{slug} and /admin/pages/{slug}, and behind
2
+ .../new. One template for both kinds: `kind` decides whether there is a date
3
+ and the taxonomy fields, and the handler decides which buttons the form
4
+ carries. #}
5
+ {% extends "layouts/shell.njk" %}
6
+
7
+ {% block title %}{{ heading }}{% endblock %}
8
+
9
+ {% block content %}
10
+ <h1>{{ heading }}</h1>
11
+
12
+ {% if error %}
13
+ <p class="admin-error">{{ error }}</p>
14
+ {% endif %}
15
+
16
+ {% if trashed %}
17
+ <p class="admin-note">This {{ kind.singular }} is in the trash. The public site is not serving it.</p>
18
+ {% endif %}
19
+
20
+ {% if scheduledFor %}
21
+ <p class="admin-note">Scheduled for {{ scheduledFor }}. The public site starts serving it then, and the followers are told then.</p>
22
+ {% endif %}
23
+
24
+ <form class="admin-editor" method="post" action="{{ saveUrl }}">
25
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
26
+ {# The hash of the file this form was filled in from. A save whose hash no
27
+ longer matches what is on disk is refused rather than overwriting
28
+ somebody else's edit (doc-1). #}
29
+ <input type="hidden" name="hash" value="{{ form.hash }}" />
30
+ {# Which layout the preview renders through. The save handler ignores it. #}
31
+ <input type="hidden" name="type" value="{{ kind.type }}" />
32
+
33
+ <div class="admin-editor-main">
34
+ <label for="editor-title">Title</label>
35
+ <input id="editor-title" name="title" type="text" value="{{ form.title }}" required autofocus />
36
+
37
+ <label for="editor-body">Body</label>
38
+ <textarea id="editor-body" name="body" rows="24">{{ form.body }}</textarea>
39
+
40
+ {# Everything the editor's own script needs, on the element it hangs off.
41
+ With JavaScript off this is one button that posts the form to the
42
+ preview in a new tab, which is a preview. With it on, editor.js takes
43
+ the button over, puts CodeMirror on the textarea above and adds the
44
+ tabs and the upload control beside it. #}
45
+ <div
46
+ class="admin-editor-tools"
47
+ id="editor-enhance"
48
+ data-preview-url="{{ previewUrl }}"
49
+ data-upload-url="{{ uploadUrl }}"
50
+ data-kind="{{ kind.type }}"
51
+ >
52
+ <button
53
+ type="submit"
54
+ id="editor-preview-fallback"
55
+ class="admin-button-quiet"
56
+ formaction="{{ previewUrl }}"
57
+ formtarget="_blank"
58
+ formnovalidate
59
+ >Preview</button>
60
+ </div>
61
+ </div>
62
+
63
+ <div class="admin-editor-side">
64
+ <label for="editor-slug">Slug</label>
65
+ <input id="editor-slug" name="slug" type="text" value="{{ form.slug }}" />
66
+
67
+ <label for="editor-permalink">Permalink</label>
68
+ <input id="editor-permalink" name="permalink" type="text" value="{{ form.permalink }}" />
69
+ <p class="admin-hint">Leave it empty to let the {{ kind.singular }} take the URL its slug implies.</p>
70
+
71
+ {% if kind.dated %}
72
+ <label for="editor-date">Date</label>
73
+ <input id="editor-date" name="date" type="text" value="{{ form.date }}" />
74
+ {# The file holds a UTC instant; this field is that instant as the
75
+ site's own clock reads it, so the zone has to be on the screen. #}
76
+ <p class="admin-hint">Wall-clock time in {{ dateZone }}. Stored as UTC.</p>
77
+ {% endif %}
78
+
79
+ {% if kind.tagged %}
80
+ <label for="editor-tags">Tags</label>
81
+ <input id="editor-tags" name="tags" type="text" value="{{ form.tags }}" />
82
+ <p class="admin-hint">Separated by commas.</p>
83
+ {% endif %}
84
+
85
+ {% if kind.categorised %}
86
+ <label for="editor-categories">Categories</label>
87
+ <input id="editor-categories" name="categories" type="text" value="{{ form.categories }}" />
88
+ <p class="admin-hint">Separated by commas.</p>
89
+ {% endif %}
90
+
91
+ <label for="editor-description">Description</label>
92
+ <input id="editor-description" name="description" type="text" value="{{ form.description }}" />
93
+
94
+ {# Who the front matter says wrote this (TASK-67). A select of the site's
95
+ users rather than a free box, because after decision-14 the value is a
96
+ person rather than a string: it decides whose archive the post is on
97
+ and, once the actors land, whose followers hear about it. A file that
98
+ still names somebody who has no account keeps an option of its own, so
99
+ opening the editor cannot silently reattribute it. #}
100
+ <label for="editor-author">Author</label>
101
+ <select id="editor-author" name="author">
102
+ {% for choice in authors %}
103
+ <option value="{{ choice.value }}"{% if choice.chosen %} selected{% endif %}>{{ choice.label }}</option>
104
+ {% endfor %}
105
+ </select>
106
+
107
+ <p class="admin-check">
108
+ <input id="editor-draft" name="draft" type="checkbox" value="1"{% if form.draft %} checked{% endif %} />
109
+ <label for="editor-draft">Draft</label>
110
+ </p>
111
+
112
+ {# What this document says about comments, if anything. Three answers
113
+ rather than two: the site's own rules, always open, always closed. #}
114
+ <label for="editor-comments">Comments</label>
115
+ <select id="editor-comments" name="comments">
116
+ <option value="{{ commentSettings.site }}"{% if form.comments == commentSettings.site %} selected{% endif %}>Follow the site settings</option>
117
+ <option value="{{ commentSettings.open }}"{% if form.comments == commentSettings.open %} selected{% endif %}>Open</option>
118
+ <option value="{{ commentSettings.closed }}"{% if form.comments == commentSettings.closed %} selected{% endif %}>Closed</option>
119
+ </select>
120
+ <p class="admin-hint">
121
+ Writes <code>comments: true</code> or <code>comments: false</code> into the front matter,
122
+ which beats the site's switch and its closing window in both directions. Fediverse replies
123
+ are shown either way.
124
+ </p>
125
+
126
+ {% if kind.excludable %}
127
+ {# doc-2's eleventyExcludeFromCollections: still published and still at
128
+ its URL, but out of every collection a template lists from. #}
129
+ <p class="admin-check">
130
+ <input id="editor-exclude" name="exclude" type="checkbox" value="1"{% if form.exclude %} checked{% endif %} />
131
+ <label for="editor-exclude">Hide from collections</label>
132
+ </p>
133
+ <p class="admin-hint">Keeps the {{ kind.singular }} out of listings that gather content, without unpublishing it.</p>
134
+ {% endif %}
135
+
136
+ {% if kind.navigable %}
137
+ {# The page puts itself in the site menu, after the items the settings
138
+ screen names. #}
139
+ <p class="admin-check">
140
+ <input id="editor-navigation" name="navigation" type="checkbox" value="1"{% if form.navigation %} checked{% endif %} />
141
+ <label for="editor-navigation">Show in navigation</label>
142
+ </p>
143
+
144
+ <label for="editor-navigation-order">Menu order</label>
145
+ <input id="editor-navigation-order" name="navigation_order" type="text" inputmode="numeric" value="{{ form.navigationOrder }}" />
146
+ <p class="admin-hint">Puts this {{ kind.singular }} in the site header, after the items on the settings screen. A lower order comes first; leave it empty and it sorts by title after the ordered ones.</p>
147
+ {% endif %}
148
+
149
+ {% if kind.contactable %}
150
+ {# The page offers a contact form under its content (TASK-56). Where a
151
+ message goes is the contact address on the Settings screen; it is
152
+ never on this page or in its HTML. #}
153
+ <p class="admin-check">
154
+ <input id="editor-contact" name="contact" type="checkbox" value="1"{% if form.contact %} checked{% endif %} />
155
+ <label for="editor-contact">Contact form</label>
156
+ </p>
157
+ <p class="admin-hint">
158
+ Writes <code>contact: true</code> into the front matter and puts a name, email, subject
159
+ and message form under this {{ kind.singular }}. Messages arrive on the Messages screen
160
+ and are emailed to the contact address on Settings.
161
+ </p>
162
+ {% endif %}
163
+
164
+ <p class="admin-editor-buttons">
165
+ {% for button in actions %}
166
+ <button type="submit" name="action" value="{{ button.value }}">{{ button.label }}</button>
167
+ {% endfor %}
168
+ {% if viewUrl %}
169
+ <a class="admin-button admin-button-quiet" href="{{ viewUrl }}">View</a>
170
+ {% endif %}
171
+ </p>
172
+ </div>
173
+ </form>
174
+
175
+ {# CodeMirror, the preview tab and the upload control. A module script is
176
+ deferred by definition, so it runs after the form is in the document.
177
+ Nothing above depends on it: with the bundle missing or JavaScript off the
178
+ textarea and the Preview button are the whole editor.
179
+
180
+ The nonce is not what lets it run — `script-src 'self'` already does, and
181
+ the admin has no inline script at all. It is here so the bundle can read
182
+ it back off this element and hand it to CodeMirror, whose themes are
183
+ injected as <style> elements at runtime and would otherwise be refused by
184
+ `style-src`. Reading it through the element's `.nonce` property rather
185
+ than a data attribute keeps it out of reach of a CSS selector. #}
186
+ <script
187
+ type="module"
188
+ id="editor-script"
189
+ src="{{ assetPrefix }}editor.js"
190
+ nonce="{{ cspNonce }}"
191
+ ></script>
192
+
193
+ {# The slug and permalink auto-fill, in a file of its own so the policy never
194
+ has to allow an inline script. #}
195
+ <script defer src="{{ assetPrefix }}slug.js"></script>
196
+ {% endblock %}
@@ -1,5 +1,14 @@
1
1
  {# The listing behind /admin/posts and /admin/pages. One template for both:
2
- `kind` says which, and whether the table has a date column and a tag one. #}
2
+ `kind` says which, and whether the table has a date column and taxonomy
3
+ ones.
4
+
5
+ There is no `pages/posts/` or `pages/categories/` for the same reason.
6
+ Posts, Pages, Categories and Tags are four menu entries over three
7
+ templates — this listing, the editor beside it and the taxonomy screen —
8
+ because a post and a page differ by a `kind`, not by a screen. A folder per
9
+ menu entry would mean either a second copy of each template or a re-export
10
+ that exists only to make the directory look like the menu, so the folder is
11
+ named after what the screens are about instead. #}
3
12
  {% extends "layouts/shell.njk" %}
4
13
 
5
14
  {% block title %}{{ kind.plural }}{% endblock %}
@@ -24,6 +33,9 @@
24
33
  {% if kind.tagged %}
25
34
  <th scope="col">Tags</th>
26
35
  {% endif %}
36
+ {% if kind.categorised %}
37
+ <th scope="col">Categories</th>
38
+ {% endif %}
27
39
  {% if kind.dated %}
28
40
  <th scope="col">Date</th>
29
41
  {% else %}
@@ -36,11 +48,14 @@
36
48
  <tbody>
37
49
  {% for document in documents %}
38
50
  <tr>
39
- <td><a href="{{ document.editUrl }}">{{ document.title }}</a></td>
51
+ <td><a href="{{ document.editUrl }}">{{ document.title }}</a>{% if document.role %} &mdash; <span class="admin-page-role">{{ document.role }}</span>{% endif %}</td>
40
52
  <td>{{ document.author }}</td>
41
53
  {% if kind.tagged %}
42
54
  <td>{{ document.tags }}</td>
43
55
  {% endif %}
56
+ {% if kind.categorised %}
57
+ <td>{{ document.categories }}</td>
58
+ {% endif %}
44
59
  {% if kind.dated %}
45
60
  <td>{{ document.date | date('html') }}</td>
46
61
  {% else %}
@@ -51,6 +66,8 @@
51
66
  <span class="admin-status admin-status-trashed">Trash</span>
52
67
  {% elif document.draft %}
53
68
  <span class="admin-status admin-status-draft">Draft</span>
69
+ {% elif document.scheduled %}
70
+ <span class="admin-status admin-status-scheduled">Scheduled</span>
54
71
  {% else %}
55
72
  <span class="admin-status">Published</span>
56
73
  {% endif %}
@@ -0,0 +1,95 @@
1
+ {# /admin/tags and /admin/categories: every term in use, what carries it, and
2
+ the three things that can be done to it — rename, merge and delete. One
3
+ template for both taxonomies; `kind` says which. #}
4
+ {% extends "layouts/shell.njk" %}
5
+
6
+ {% block title %}{{ heading }}{% endblock %}
7
+
8
+ {% block content %}
9
+ <h1>{{ heading }}</h1>
10
+
11
+ {# Above the table rather than under the field it came from: a refusal may be
12
+ about a term the table no longer has a row for. #}
13
+ {% if problems.to %}
14
+ <p class="admin-error">{{ problems.to }}</p>
15
+ {% endif %}
16
+
17
+ {% if confirm %}
18
+ <form class="admin-settings" method="post" action="{{ renameUrl }}">
19
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
20
+ <input type="hidden" name="{{ fields.term }}" value="{{ confirm.term }}" />
21
+ <input type="hidden" name="{{ fields.to }}" value="{{ confirm.to }}" />
22
+ <input type="hidden" name="{{ fields.confirm }}" value="1" />
23
+
24
+ <h2>Merge “{{ confirm.term }}” into “{{ confirm.to }}”?</h2>
25
+
26
+ <p>
27
+ There is already a {{ label }} called “{{ confirm.to }}”, on
28
+ {{ confirm.targetFiles }} {% if confirm.targetFiles == 1 %}file{% else %}files{% endif %}.
29
+ Renaming “{{ confirm.term }}” merges the
30
+ {{ confirm.files }} {% if confirm.files == 1 %}file{% else %}files{% endif %} carrying it
31
+ into that one. A file that already carries both keeps it once.
32
+ </p>
33
+
34
+ <p class="admin-settings-buttons">
35
+ <button type="submit">Merge them</button>
36
+ <a href="{{ listUrl }}">Cancel</a>
37
+ </p>
38
+ </form>
39
+ {% endif %}
40
+
41
+ {% if terms.length == 0 %}
42
+ <p>Nothing carries a {{ label }} yet.</p>
43
+ {% else %}
44
+ <table class="admin-list">
45
+ <thead>
46
+ <tr>
47
+ <th scope="col">{{ kind.singular | capitalize }}</th>
48
+ <th scope="col">Posts</th>
49
+ <th scope="col">Files</th>
50
+ <th scope="col">Rename</th>
51
+ <th scope="col">Actions</th>
52
+ </tr>
53
+ </thead>
54
+ <tbody>
55
+ {% for entry in terms %}
56
+ <tr>
57
+ <td><a href="{{ entry.archiveUrl }}">{{ entry.term }}</a></td>
58
+ <td>{{ entry.published }}</td>
59
+ <td>{{ entry.total }}</td>
60
+ <td>
61
+ <form class="admin-inline" method="post" action="{{ renameUrl }}">
62
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
63
+ <input type="hidden" name="{{ fields.term }}" value="{{ entry.term }}" />
64
+ <label class="admin-visually-hidden" for="rename-{{ loop.index }}">
65
+ Rename {{ entry.term }} to
66
+ </label>
67
+ <input
68
+ id="rename-{{ loop.index }}"
69
+ name="{{ fields.to }}"
70
+ type="text"
71
+ value="{% if form.term == entry.term %}{{ form.to }}{% endif %}"
72
+ required
73
+ />
74
+ <button type="submit">Rename</button>
75
+ </form>
76
+ </td>
77
+ <td class="admin-actions">
78
+ <form method="post" action="{{ deleteUrl }}">
79
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
80
+ <input type="hidden" name="{{ fields.term }}" value="{{ entry.term }}" />
81
+ <button type="submit">Delete</button>
82
+ </form>
83
+ </td>
84
+ </tr>
85
+ {% endfor %}
86
+ </tbody>
87
+ </table>
88
+
89
+ <p class="admin-hint">
90
+ Renaming, merging and deleting rewrite the front matter of every file carrying the
91
+ {{ label }} — drafts, scheduled posts and the trash included — and tell the feeds and the
92
+ fediverse about each published post that changed. The Files column is how many that is.
93
+ </p>
94
+ {% endif %}
95
+ {% endblock %}
@@ -0,0 +1,238 @@
1
+ {# /admin/federation: who this site's people are to the fediverse, who follows
2
+ each of them, what arrived in the inbox, and how what went out landed. #}
3
+ {% extends "layouts/shell.njk" %}
4
+
5
+ {% block title %}Federation{% endblock %}
6
+
7
+ {% block content %}
8
+ <h1>Federation</h1>
9
+
10
+ {% if actors.length %}
11
+ {% for actor in actors %}
12
+ <section class="admin-panel admin-actor">
13
+ <h2>{{ actor.handle }}</h2>
14
+ <div class="admin-actor-identity">
15
+ {% if actor.avatarUrl %}
16
+ <img class="admin-avatar admin-avatar-large" src="{{ actor.avatarUrl }}" alt="" width="96" height="96" />
17
+ {% else %}
18
+ <span class="admin-avatar admin-avatar-large admin-avatar-blank" aria-hidden="true"></span>
19
+ {% endif %}
20
+ <p class="admin-actor-handle">{{ actor.name }}</p>
21
+ </div>
22
+ <dl class="admin-actor-fields">
23
+ <div>
24
+ <dt>Summary</dt>
25
+ <dd>{% if actor.summary %}{{ actor.summary }}{% else %}<span class="admin-empty">None set.</span>{% endif %}</dd>
26
+ </div>
27
+ <div>
28
+ <dt>Actor</dt>
29
+ <dd><a href="{{ actor.actorId }}">{{ actor.actorId }}</a></dd>
30
+ </div>
31
+ <div>
32
+ <dt>Profile</dt>
33
+ <dd><a href="{{ actor.url }}">{{ actor.url }}</a></dd>
34
+ </div>
35
+ <div>
36
+ <dt>Followers</dt>
37
+ <dd>{{ actor.followerCount }}</dd>
38
+ </div>
39
+ </dl>
40
+
41
+ {% if actor.followers.length %}
42
+ <table class="admin-list">
43
+ <thead>
44
+ <tr>
45
+ <th scope="col">Follower</th>
46
+ <th scope="col">Handle</th>
47
+ <th scope="col">Followed</th>
48
+ </tr>
49
+ </thead>
50
+ <tbody>
51
+ {% for follower in actor.followers %}
52
+ <tr>
53
+ <td class="admin-follower">
54
+ {% if follower.iconUrl %}
55
+ <img class="admin-avatar" src="{{ follower.iconUrl }}" alt="" width="32" height="32" loading="lazy" />
56
+ {% else %}
57
+ <span class="admin-avatar admin-avatar-blank" aria-hidden="true"></span>
58
+ {% endif %}
59
+ <a href="{{ follower.url }}">{{ follower.name }}</a>
60
+ </td>
61
+ <td>{{ follower.handle }}</td>
62
+ <td>{{ follower.followedAt | date('html') }}</td>
63
+ </tr>
64
+ {% endfor %}
65
+ </tbody>
66
+ </table>
67
+ {% else %}
68
+ <p class="admin-empty">Nobody follows {{ actor.name }} yet.</p>
69
+ {% endif %}
70
+ </section>
71
+ {% endfor %}
72
+ {% else %}
73
+ <section class="admin-panel admin-actor">
74
+ <h2>Actors</h2>
75
+ <p class="admin-empty">The site has no users, so it has no actors.</p>
76
+ </section>
77
+ {% endif %}
78
+
79
+ <section class="admin-panel">
80
+ <h2>Relays</h2>
81
+ {% if relays.length %}
82
+ <table class="admin-list">
83
+ <thead>
84
+ <tr>
85
+ <th scope="col">Relay</th>
86
+ <th scope="col">State</th>
87
+ <th scope="col">Since</th>
88
+ <th scope="col">Last delivery</th>
89
+ <th scope="col">Actions</th>
90
+ </tr>
91
+ </thead>
92
+ <tbody>
93
+ {% for relay in relays %}
94
+ <tr>
95
+ <td>
96
+ {% if relay.actorId %}
97
+ <a href="{{ relay.actorId }}">{{ relay.inboxId }}</a>
98
+ {% else %}
99
+ {{ relay.inboxId }}
100
+ {% endif %}
101
+ {% if relay.reason %}
102
+ <p class="admin-hint">{{ relay.reason }}</p>
103
+ {% endif %}
104
+ </td>
105
+ <td>
106
+ {% if relay.state == 'rejected' %}
107
+ <span class="admin-status admin-status-failed">{{ relay.stateLabel }}</span>
108
+ {% else %}
109
+ {{ relay.stateLabel }}
110
+ {% endif %}
111
+ </td>
112
+ <td>{{ relay.updatedAt | date('html') }}</td>
113
+ <td>
114
+ {% if relay.lastDelivery %}
115
+ {{ relay.lastDelivery.activityType }} {{ relay.lastDelivery.status }}
116
+ <span class="admin-inbox-when">{{ relay.lastDelivery.attemptedAt | date('html') }}</span>
117
+ {% if relay.lastDelivery.error %}
118
+ <p class="admin-hint">{{ relay.lastDelivery.error }}</p>
119
+ {% endif %}
120
+ {% else %}
121
+ <span class="admin-empty">Nothing yet.</span>
122
+ {% endif %}
123
+ </td>
124
+ <td class="admin-actions">
125
+ {% if relay.retriable %}
126
+ <form method="post" action="{{ relayRetryUrl }}">
127
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
128
+ <input type="hidden" name="{{ fields.relay }}" value="{{ relay.inboxId }}" />
129
+ <button type="submit">Retry</button>
130
+ </form>
131
+ {% endif %}
132
+ </td>
133
+ </tr>
134
+ {% endfor %}
135
+ </tbody>
136
+ </table>
137
+ <p class="admin-hint">
138
+ A relay boosts every public post it is sent on to instances nobody here
139
+ follows. The list lives on the Settings screen; Retry sends the follow
140
+ again to one that is still waiting.
141
+ </p>
142
+ {% else %}
143
+ <p class="admin-empty">The site subscribes to no relay. Add one on the Settings screen.</p>
144
+ {% endif %}
145
+ </section>
146
+
147
+ <section class="admin-panel">
148
+ <h2>Recent activity</h2>
149
+ {% if inbox.length %}
150
+ <ul class="admin-inbox">
151
+ {% for entry in inbox %}
152
+ <li>
153
+ <span class="admin-inbox-actor"><a href="{{ entry.actorId }}">{{ entry.actorLabel }}</a></span>
154
+ {% if entry.remoteUrl %}
155
+ <a href="{{ entry.remoteUrl }}">{{ entry.action }}</a>
156
+ {% else %}
157
+ {{ entry.action }}
158
+ {% endif %}
159
+ {% if entry.post %}
160
+ <a href="{{ entry.post.editUrl }}">{{ entry.post.title }}</a>
161
+ {% else %}
162
+ <span class="admin-empty">something of ours</span>
163
+ {% endif %}
164
+ <span class="admin-inbox-when">{{ entry.receivedAt | date('html') }}</span>
165
+ </li>
166
+ {% endfor %}
167
+ </ul>
168
+ {% else %}
169
+ <p class="admin-empty">Nothing has arrived yet: no likes, boosts or replies.</p>
170
+ {% endif %}
171
+ </section>
172
+
173
+ <section class="admin-panel">
174
+ <h2>Delivery</h2>
175
+ {% if posts.length %}
176
+ <table class="admin-list">
177
+ <thead>
178
+ <tr>
179
+ <th scope="col">Post</th>
180
+ <th scope="col">Announced by</th>
181
+ <th scope="col">Last activity</th>
182
+ <th scope="col">Sent</th>
183
+ <th scope="col">Queued</th>
184
+ <th scope="col">Failed</th>
185
+ <th scope="col">Webmentions</th>
186
+ <th scope="col">Actions</th>
187
+ </tr>
188
+ </thead>
189
+ <tbody>
190
+ {% for row in posts %}
191
+ <tr>
192
+ <td>
193
+ <a href="{{ row.post.editUrl }}">{{ row.post.title }}</a>
194
+ {% if row.trashed %}<p class="admin-hint">In the trash.</p>{% endif %}
195
+ </td>
196
+ <td>{% if row.author %}@{{ row.author }}{% else %}<span class="admin-empty">—</span>{% endif %}</td>
197
+ {% if row.lastActivity %}
198
+ <td>{{ row.lastActivity.activityType }} <span class="admin-inbox-when">{{ row.lastActivity.attemptedAt | date('html') }}</span></td>
199
+ <td>{{ row.lastActivity.counts.sent }}</td>
200
+ <td>{{ row.lastActivity.counts.queued }}</td>
201
+ <td>{% if row.lastActivity.counts.failed %}<span class="admin-status admin-status-failed">{{ row.lastActivity.counts.failed }}</span>{% else %}0{% endif %}</td>
202
+ {% else %}
203
+ <td><span class="admin-empty">Nothing recorded.</span></td>
204
+ <td>—</td>
205
+ <td>—</td>
206
+ <td>—</td>
207
+ {% endif %}
208
+ <td>
209
+ {% if row.webmentions.sent or row.webmentions["none"] or row.webmentions.failed %}
210
+ {{ row.webmentions.sent }} told{% if row.webmentions["none"] %}, {{ row.webmentions["none"] }} take none{% endif %}{% if row.webmentions.failed %}, <span class="admin-status admin-status-failed">{{ row.webmentions.failed }} failed</span>{% endif %}
211
+ {% else %}
212
+ <span class="admin-empty">—</span>
213
+ {% endif %}
214
+ </td>
215
+ <td class="admin-actions">
216
+ <form method="post" action="{{ resendUrl }}">
217
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
218
+ <input type="hidden" name="{{ fields.slug }}" value="{{ row.slug }}" />
219
+ <button type="submit">Resend</button>
220
+ </form>
221
+ </td>
222
+ </tr>
223
+ {% endfor %}
224
+ </tbody>
225
+ </table>
226
+ <p class="admin-hint">
227
+ Resending builds the post again from its file and sends it to every one
228
+ of its author's followers and every accepted relay the site has now, and tells every
229
+ page the post links to at the same time: an update for a
230
+ published post, a withdrawal for one in the trash. The outcomes are a
231
+ cache, so a database deleted since leaves the posts listed with nothing
232
+ recorded against them.
233
+ </p>
234
+ {% else %}
235
+ <p class="admin-empty">No post has been announced to the fediverse yet.</p>
236
+ {% endif %}
237
+ </section>
238
+ {% endblock %}