@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
@@ -0,0 +1,160 @@
1
+ {# /admin/media: everything under content/uploads, what links to it, and the
2
+ two things that can be done to it. The directory is walked on every request,
3
+ so a file copied in by hand is here without a restart.
4
+
5
+ Everything works with JavaScript switched off. The URL and the Markdown are
6
+ readonly fields, which select and copy like any other text; copy.js adds a
7
+ button beside each of them and nothing else. #}
8
+ {% extends "layouts/shell.njk" %}
9
+
10
+ {% block title %}{{ heading }}{% endblock %}
11
+
12
+ {% block content %}
13
+ <h1>{{ heading }}</h1>
14
+
15
+ {% if confirm %}
16
+ <form class="admin-settings" method="post" action="{{ deleteUrl }}">
17
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
18
+ <input type="hidden" name="{{ fields.path }}" value="{{ confirm.path }}" />
19
+ <input type="hidden" name="{{ fields.confirm }}" value="1" />
20
+
21
+ <h2>Delete {{ confirm.url }}?</h2>
22
+
23
+ <p>
24
+ {{ confirm.references.length }}
25
+ {% if confirm.references.length == 1 %}document still points{% else %}documents still point{% endif %}
26
+ at it. Deleting the file does not change them, so they will point at nothing.
27
+ </p>
28
+
29
+ <ul class="admin-references">
30
+ {% for reference in confirm.references %}
31
+ <li>
32
+ <a href="{{ reference.editUrl }}">{{ reference.title }}</a>
33
+ {% if reference.trashed %}<span class="admin-status admin-status-trashed">Trash</span>{% endif %}
34
+ <code>{{ reference.path }}</code>
35
+ </li>
36
+ {% endfor %}
37
+ </ul>
38
+
39
+ <p class="admin-settings-buttons">
40
+ <button type="submit">Delete it anyway</button>
41
+ <a href="{{ listUrl }}">Cancel</a>
42
+ </p>
43
+ </form>
44
+ {% endif %}
45
+
46
+ <form class="admin-settings admin-media-upload" method="post" action="{{ uploadUrl }}" enctype="multipart/form-data">
47
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
48
+ <label for="media-file">Add a file</label>
49
+ <input id="media-file" name="{{ fields.file }}" type="file" accept="{{ accepts }}" required />
50
+ <p class="admin-hint">
51
+ This site accepts {{ accepts | replace(',', ', ') }}, up to {{ maxBytes }} bytes. The same
52
+ rules the editor’s upload control enforces.
53
+ </p>
54
+ <p class="admin-settings-buttons">
55
+ <button type="submit">Upload</button>
56
+ </p>
57
+ </form>
58
+
59
+ {% if total == 0 %}
60
+ <p class="admin-empty">Nothing has been uploaded yet.</p>
61
+ {% else %}
62
+ <table class="admin-list admin-media">
63
+ <thead>
64
+ <tr>
65
+ <th scope="col">File</th>
66
+ <th scope="col">Uploaded</th>
67
+ <th scope="col">Size</th>
68
+ <th scope="col">Link</th>
69
+ <th scope="col">Used by</th>
70
+ <th scope="col">Actions</th>
71
+ </tr>
72
+ </thead>
73
+ <tbody>
74
+ {% for file in files %}
75
+ <tr>
76
+ <td class="admin-media-file">
77
+ {% if file.image %}
78
+ <a href="{{ file.url }}">
79
+ <img class="admin-media-thumbnail" src="{{ file.url }}" alt="" width="60" height="60" />
80
+ </a>
81
+ {% else %}
82
+ <span class="admin-media-icon" aria-hidden="true">{{ file.extension | replace('.', '') | upper }}</span>
83
+ {% endif %}
84
+ <a href="{{ file.url }}">{{ file.path }}</a>
85
+ </td>
86
+ <td>{{ file.modified | date('html') }}</td>
87
+ <td>{{ file.bytes }}</td>
88
+ <td class="admin-media-links">
89
+ <label class="admin-visually-hidden" for="media-url-{{ loop.index }}">
90
+ URL of {{ file.name }}
91
+ </label>
92
+ <span class="admin-copy">
93
+ <input id="media-url-{{ loop.index }}" type="text" value="{{ file.url }}" readonly />
94
+ <button type="button" class="admin-copy-button" data-copy="media-url-{{ loop.index }}" hidden>
95
+ Copy
96
+ </button>
97
+ </span>
98
+
99
+ <label class="admin-visually-hidden" for="media-markdown-{{ loop.index }}">
100
+ Markdown for {{ file.name }}
101
+ </label>
102
+ <span class="admin-copy">
103
+ <input id="media-markdown-{{ loop.index }}" type="text" value="{{ file.markdown }}" readonly />
104
+ <button type="button" class="admin-copy-button" data-copy="media-markdown-{{ loop.index }}" hidden>
105
+ Copy
106
+ </button>
107
+ </span>
108
+ </td>
109
+ <td>
110
+ {% if file.references.length %}
111
+ <ul class="admin-references">
112
+ {% for reference in file.references %}
113
+ <li>
114
+ <a href="{{ reference.editUrl }}">{{ reference.title }}</a>
115
+ {% if reference.trashed %}
116
+ <span class="admin-status admin-status-trashed">Trash</span>
117
+ {% endif %}
118
+ </li>
119
+ {% endfor %}
120
+ </ul>
121
+ {% else %}
122
+ <span class="admin-status">Nothing</span>
123
+ {% endif %}
124
+ </td>
125
+ <td class="admin-actions">
126
+ <form method="post" action="{{ deleteUrl }}">
127
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
128
+ <input type="hidden" name="{{ fields.path }}" value="{{ file.path }}" />
129
+ <button type="submit">Delete</button>
130
+ </form>
131
+ </td>
132
+ </tr>
133
+ {% endfor %}
134
+ </tbody>
135
+ </table>
136
+
137
+ {% if previousUrl or nextUrl %}
138
+ <nav class="admin-pagination" aria-label="Pages">
139
+ {% if previousUrl %}
140
+ <a rel="prev" href="{{ previousUrl }}">Newer</a>
141
+ {% endif %}
142
+ <span>Page {{ page }} of {{ pages }}</span>
143
+ {% if nextUrl %}
144
+ <a rel="next" href="{{ nextUrl }}">Older</a>
145
+ {% endif %}
146
+ </nav>
147
+ {% endif %}
148
+
149
+ <p class="admin-hint">
150
+ The list is the <code>content/uploads</code> directory itself, read afresh on every request,
151
+ so a file copied in by hand is here without a restart. Deleting one removes the file and
152
+ whatever was derived from it; it does not touch the documents that link to it, which is why
153
+ a file something still points at asks first.
154
+ </p>
155
+ {% endif %}
156
+
157
+ {# The one enhancement on this screen. The fields above are readonly inputs
158
+ and already copy by hand; this adds a button beside each of them. #}
159
+ <script defer src="{{ assetPrefix }}copy.js"></script>
160
+ {% endblock %}
@@ -0,0 +1,110 @@
1
+ {# /admin/messages: what the contact form left behind (TASK-56).
2
+
3
+ A message is a file under data/contact/ and nothing else, so the two buttons
4
+ here are a rewrite and an unlink. Every button is a form of its own, so the
5
+ whole screen works with JavaScript switched off. #}
6
+ {% extends "layouts/shell.njk" %}
7
+
8
+ {% block title %}{{ heading }}{% endblock %}
9
+
10
+ {% block content %}
11
+ <h1>{{ heading }}</h1>
12
+
13
+ <nav class="admin-filters" aria-label="Message status">
14
+ <ul>
15
+ {% for tab in tabs %}
16
+ <li>
17
+ <a href="{{ tab.url }}"{% if tab.current %} aria-current="page"{% endif %}>
18
+ {{ tab.label }} ({{ tab.count }})
19
+ </a>
20
+ </li>
21
+ {% endfor %}
22
+ </ul>
23
+ </nav>
24
+
25
+ {% if rows.length == 0 %}
26
+ <p class="admin-empty">Nothing here.</p>
27
+ {% else %}
28
+ <ul class="admin-comments">
29
+ {% for row in rows %}
30
+ <li class="admin-comment{% if not row.read %} admin-comment-unread{% endif %}">
31
+ <div class="admin-comment-meta">
32
+ <span class="admin-comment-author">{{ row.author }}</span>
33
+ <a class="admin-comment-email" href="mailto:{{ row.email }}">{{ row.email }}</a>
34
+ {% if not row.read %}
35
+ <span class="admin-status admin-status-pending">unread</span>
36
+ {% endif %}
37
+ {% if row.status == 'spam' %}
38
+ <span class="admin-status admin-status-spam">spam</span>
39
+ {% endif %}
40
+ </div>
41
+
42
+ <p class="admin-comment-where">
43
+ <time>{{ row.received }}</time>
44
+ from
45
+ {% if row.pageUrl %}
46
+ <a href="{{ row.pageUrl }}">{{ row.page }}</a>
47
+ {% else %}
48
+ {{ row.page }}
49
+ {% endif %}
50
+ {% if row.address %}
51
+ &middot; <code title="A salted hash of the address it came from">{{ row.address }}</code>
52
+ {% endif %}
53
+ </p>
54
+
55
+ {% if row.subject %}
56
+ <p class="admin-message-subject"><strong>{{ row.subject }}</strong></p>
57
+ {% endif %}
58
+
59
+ {# Printed, never rendered: a contact message is plain text, and
60
+ nothing a stranger typed is turned into markup here. #}
61
+ <div class="admin-comment-body admin-message-body">{{ row.message }}</div>
62
+
63
+ <div class="admin-actions">
64
+ <a class="admin-button admin-button-quiet" href="{{ row.replyUrl }}">Reply</a>
65
+
66
+ <form method="post" action="{{ readUrl }}">
67
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
68
+ <input type="hidden" name="{{ fields.id }}" value="{{ row.id }}" />
69
+ <input type="hidden" name="{{ fields.status }}" value="{{ status }}" />
70
+ {% if row.read %}
71
+ <button type="submit" name="{{ fields.read }}" value="">Mark unread</button>
72
+ {% else %}
73
+ <button type="submit" name="{{ fields.read }}" value="1">Mark read</button>
74
+ {% endif %}
75
+ </form>
76
+
77
+ <form method="post" action="{{ deleteUrl }}">
78
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
79
+ <input type="hidden" name="{{ fields.id }}" value="{{ row.id }}" />
80
+ <input type="hidden" name="{{ fields.status }}" value="{{ status }}" />
81
+ <button type="submit">Delete</button>
82
+ </form>
83
+ </div>
84
+ </li>
85
+ {% endfor %}
86
+ </ul>
87
+
88
+ {% if previousUrl or nextUrl %}
89
+ <nav class="admin-pagination" aria-label="Pages">
90
+ {% if previousUrl %}
91
+ <a rel="prev" href="{{ previousUrl }}">Newer</a>
92
+ {% endif %}
93
+ <span>Page {{ page }} of {{ pages }}</span>
94
+ {% if nextUrl %}
95
+ <a rel="next" href="{{ nextUrl }}">Older</a>
96
+ {% endif %}
97
+ </nav>
98
+ {% endif %}
99
+ {% endif %}
100
+
101
+ <p class="admin-hint">
102
+ A page carrying <code>contact: true</code> in its front matter offers a contact form, and every
103
+ message it takes is one JSON file under <code>data/contact/</code> &mdash; written before
104
+ anything is emailed, so a message survives a mail outage and a site with no mail configured
105
+ still collects them. They are under <code>data/</code> rather than <code>content/</code>
106
+ because they carry somebody&rsquo;s address and were never meant to be published. Where a
107
+ message is sent is the contact address on the Settings screen; deleting one here deletes its
108
+ file.
109
+ </p>
110
+ {% endblock %}
@@ -0,0 +1,129 @@
1
+ {# /admin/navigation: every menu this site holds, and what renders it.
2
+
3
+ Two lists, and a menu is in exactly one of them. First the areas the active
4
+ theme declares, in the theme's own order and under the theme's own labels,
5
+ each a box to type links into — an area the site has never filled in is an
6
+ empty box rather than a missing one. Then every other menu the site stores,
7
+ under a heading that says this theme renders them nowhere, each with a
8
+ Delete, which is the only way a menu is removed. #}
9
+ {% extends "layouts/shell.njk" %}
10
+ {% import "components/fields.njk" as field %}
11
+
12
+ {% block title %}{{ heading }}{% endblock %}
13
+
14
+ {# One menu: its heading, the box its items are typed into, and the button
15
+ that saves it. `extra` is whatever else belongs under the box — the Delete
16
+ form, on a menu nothing renders. #}
17
+ {% macro box(menu, fields, url, csrfToken, extra='') %}
18
+ <li class="admin-menu-box">
19
+ <h3>{{ menu.label }}</h3>
20
+
21
+ <p class="admin-menu-name">
22
+ <code>menus.{{ menu.name }}</code>
23
+ {% if menu.stored %}
24
+ <span class="admin-status">{{ menu.count }} item{% if menu.count != 1 %}s{% endif %}</span>
25
+ {% else %}
26
+ <span class="admin-status">empty — nothing has been typed here yet</span>
27
+ {% endif %}
28
+ </p>
29
+
30
+ <form method="post" action="{{ url }}">
31
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
32
+ <input type="hidden" name="{{ fields.menu }}" value="{{ menu.name }}" />
33
+ {% set itemsHint %}
34
+ One item per line, written <code>Label | URL</code> &mdash; for example
35
+ <code>About | /about/</code> or
36
+ <code>Mastodon | https://example.social/@me</code>. They are the whole of
37
+ this menu, in this order: nothing else puts a link in it. A page serving
38
+ as the front page goes in as <code>Home | /</code>, where a reader lands.
39
+ End a line <code>| me</code> to mark the link
40
+ <strong>a profile that is you</strong>: it is given
41
+ <code>rel="me"</code>, which is how Mastodon and the rest of the
42
+ IndieWeb verify that the site and the profile it links are the same
43
+ person.
44
+ {% endset %}
45
+ {{ field.textarea('menu-' + menu.name, fields.items, 'Items', menu.items,
46
+ error=menu.problem, hint=itemsHint, rows='5', spellcheck='false') }}
47
+ <p class="admin-menu-buttons">
48
+ <button type="submit">Save menu</button>
49
+ </p>
50
+ </form>
51
+
52
+ {{ extra | safe }}
53
+ </li>
54
+ {% endmacro %}
55
+
56
+ {% block content %}
57
+ <h1>{{ heading }}</h1>
58
+
59
+ {% if hasProblems %}
60
+ <p class="admin-field-error">Nothing was saved. See below.</p>
61
+ {% endif %}
62
+
63
+ <h2>Where {{ themeName }} puts a menu</h2>
64
+
65
+ {% if areas.length %}
66
+ <p class="admin-hint">
67
+ These are the areas the active theme declares in its <code>theme.json</code>, in the order it
68
+ declares them. A theme renders a menu by asking for it by name, and an area with nothing in it
69
+ renders nothing at all.
70
+ </p>
71
+
72
+ <ul class="admin-menu-boxes">
73
+ {% for menu in areas %}
74
+ {{ box(menu, fields, navigationUrl, csrfToken) }}
75
+ {% endfor %}
76
+ </ul>
77
+ {% else %}
78
+ <p class="admin-hint">
79
+ {{ themeName }} declares no areas, so it asks for no menu by name. A theme declares them as an
80
+ <code>areas</code> list in its <code>theme.json</code>, each entry a <code>name</code> &mdash;
81
+ the name the template loops over as <code>menus.&lt;name&gt;</code> &mdash; and a
82
+ <code>label</code> to head the box here. A menu added below is still stored, ready for the
83
+ theme that asks for it.
84
+ </p>
85
+ {% endif %}
86
+
87
+ {% if others.length %}
88
+ <h2>Kept, rendered nowhere</h2>
89
+
90
+ <p class="admin-hint">
91
+ This site stores these menus and {{ themeName }} renders none of them: no template loops over
92
+ those names, so nothing on the public site shows them. They are kept, because that is how the
93
+ menu a theme will use gets written before the site switches to it. Delete is the only way one
94
+ is removed.
95
+ </p>
96
+
97
+ <ul class="admin-menu-boxes">
98
+ {% for menu in others %}
99
+ {% set remove %}
100
+ <form class="admin-menu-delete" method="post" action="{{ deleteUrl }}">
101
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
102
+ <input type="hidden" name="{{ fields.menu }}" value="{{ menu.name }}" />
103
+ <button type="submit">Delete this menu</button>
104
+ </form>
105
+ {% endset %}
106
+ {{ box(menu, fields, navigationUrl, csrfToken, remove) }}
107
+ {% endfor %}
108
+ </ul>
109
+ {% endif %}
110
+
111
+ <h2>Add a menu</h2>
112
+
113
+ <form class="admin-menu-add" method="post" action="{{ addUrl }}">
114
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
115
+ {% set nameHint %}
116
+ The name a theme asks for the menu by: lower-case letters, digits and
117
+ underscores, starting with a letter. It is written after the dot &mdash;
118
+ <code>{% raw %}{% for item in menus.footer %}{% endraw %}</code> &mdash; which is why a dash
119
+ is not allowed in one. A name this theme declares puts the menu in its place above; any other
120
+ name is a menu kept and rendered nowhere, which is how you fill one in before switching to the
121
+ theme that will use it.
122
+ {% endset %}
123
+ {{ field.text('menu-name', fields.name, 'Name', newName,
124
+ error=nameProblem, hint=nameHint, spellcheck='false', required=true) }}
125
+ <p class="admin-menu-buttons">
126
+ <button type="submit">Add menu</button>
127
+ </p>
128
+ </form>
129
+ {% endblock %}
@@ -4,7 +4,11 @@
4
4
 
5
5
  {% block content %}
6
6
  {# A screen a later task builds. It exists so the navigation goes somewhere
7
- and the guard covers it from the start. #}
7
+ and the guard covers it from the start.
8
+
9
+ It sits at the top of `pages/` rather than inside one of the section
10
+ folders because it is not any one section's screen: it stands in for
11
+ whichever section has nothing built yet, and the route heads it. #}
8
12
  <h1>{{ heading }}{% if slug %}: {{ slug }}{% endif %}</h1>
9
13
  <p class="admin-note">This screen is not built yet.</p>
10
14
  {% endblock %}
@@ -0,0 +1,99 @@
1
+ {# /admin/settings/discussion: comments, webmentions, and what checks them. #}
2
+ {% extends "layouts/settings-page.njk" %}
3
+ {% import "components/fields.njk" as field %}
4
+
5
+ {% block settingsFields %}
6
+ <h2>Comments</h2>
7
+
8
+ {% set commentsHint %}
9
+ Clear this and no post shows a comment form and every submission is
10
+ refused. Fediverse replies keep arriving and keep being shown either way:
11
+ a remote server sends those, and nothing here can stop it.
12
+ {% endset %}
13
+ {{ field.checkbox('settings-comments', fields.comments, 'Take comments on this site',
14
+ checked=form.comments, hint=commentsHint) }}
15
+
16
+ {% set closeHint %}
17
+ Days after a post's date that it stops taking comments; <code>0</code>
18
+ never closes one. A post overrides this for itself with
19
+ <code>comments: true</code> or <code>comments: false</code>, which the
20
+ editor offers as a field. Pages are closed unless they say otherwise.
21
+ {% endset %}
22
+ {{ field.text('settings-comments-close', fields.commentsCloseAfterDays, 'Close comments after',
23
+ form.commentsCloseAfterDays, type='number', min='0', step='1',
24
+ error=problems.commentsCloseAfterDays, hint=closeHint) }}
25
+
26
+ <h2>Webmentions</h2>
27
+
28
+ {% set sendHint %}
29
+ When a post is published or edited, every external page it links to is
30
+ asked whether it takes webmentions and told about the post if it does.
31
+ The Resend button on the federation screen sends them again.
32
+ {% endset %}
33
+ {{ field.checkbox('settings-webmentions-send', fields.webmentionsSend,
34
+ 'Tell the pages a post links to', checked=form.webmentionsSend, hint=sendHint) }}
35
+
36
+ {% set receiveHint %}
37
+ Every post advertises an endpoint, and a page that links to one and says
38
+ so lands in the comment queue like a comment. Clear this and the endpoint
39
+ is gone from the pages and answers nothing; what has already arrived
40
+ stays where it is.
41
+ {% endset %}
42
+ {{ field.checkbox('settings-webmentions-receive', fields.webmentionsReceive,
43
+ 'Accept webmentions sent here', checked=form.webmentionsReceive, hint=receiveHint) }}
44
+ {% endblock %}
45
+
46
+ {% block settingsPanels %}
47
+ {# Akismet is its own pair of forms for the reason the avatar is: the key is
48
+ a credential in data/akismet.json rather than a setting in site.json, and
49
+ a key Akismet will not take must not lose an edit to the fields above. #}
50
+ <section class="admin-settings admin-akismet-panel">
51
+ <h2>Spam checking</h2>
52
+
53
+ <p class="admin-akismet-state admin-akismet-{{ akismetState }}">
54
+ {% if akismetState == 'valid' %}
55
+ <strong>Connected</strong> &mdash; key {{ akismetKeyHint }}, checked {{ akismetCheckedAt }}.
56
+ {% elif akismetState == 'invalid' %}
57
+ <strong>Akismet does not recognise this key</strong> &mdash; key {{ akismetKeyHint }}, checked {{ akismetCheckedAt }}.
58
+ {% elif akismetState == 'unchecked' %}
59
+ <strong>Akismet could not be reached</strong> to check key {{ akismetKeyHint }}.
60
+ {% else %}
61
+ <strong>Not connected</strong> &mdash; this site has no key.
62
+ {% endif %}
63
+ </p>
64
+ <p class="admin-hint">{{ akismetHint }}</p>
65
+
66
+ <form method="post" action="{{ akismetUrl }}">
67
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
68
+ {% if akismetPresent %}
69
+ {% set akismetPlaceholder = 'Replace the stored key' %}
70
+ {% else %}
71
+ {% set akismetPlaceholder = 'Paste your key' %}
72
+ {% endif %}
73
+ {{ field.password('settings-akismet-key', akismetFields.key, 'Akismet API key',
74
+ autocomplete='off', spellcheck='false', placeholder=akismetPlaceholder) }}
75
+ <p class="admin-settings-buttons">
76
+ <button type="submit">{% if akismetPresent %}Replace key{% else %}Save key{% endif %}</button>
77
+ </p>
78
+ </form>
79
+
80
+ {% if akismetPresent %}
81
+ <form method="post" action="{{ akismetUrl }}">
82
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
83
+ <input type="hidden" name="{{ akismetFields.action }}" value="{{ akismetRemove }}" />
84
+ <p class="admin-settings-buttons">
85
+ <button type="submit">Remove key</button>
86
+ </p>
87
+ </form>
88
+ {% endif %}
89
+
90
+ <p class="admin-hint">
91
+ A key from <a href="https://akismet.com/">akismet.com</a> turns on spam
92
+ checking for native comments and incoming webmentions. It is checked with
93
+ Akismet when it is saved and kept in <code>data/akismet.json</code>, never
94
+ in <code>site.json</code> and never on the public site. Marking something
95
+ spam or not spam on the Comments screen tells Akismet, which is the only
96
+ way it learns. Fediverse replies are never sent to it.
97
+ </p>
98
+ </section>
99
+ {% endblock %}