@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,203 @@
1
+ {# /admin/settings/email: how the site sends mail, and where a message written
2
+ to it goes. #}
3
+ {% extends "layouts/settings-page.njk" %}
4
+ {% import "components/fields.njk" as field %}
5
+
6
+ {% block settingsFields %}
7
+ {% set providerHint %}
8
+ The key or password each one needs is a credential and is saved below,
9
+ in <code>data/mail.json</code> rather than in <code>site.json</code>.
10
+ {% endset %}
11
+ {% call field.select('settings-mail-provider', fields.mailProvider, 'Provider',
12
+ error=problems.mailProvider, hint=providerHint) %}
13
+ {% for provider in mailProviders %}
14
+ <option value="{{ provider }}"{% if form.mailProvider == provider %} selected{% endif %}>
15
+ {% if provider == 'none' %}None &mdash; this site sends no email{% elif provider == 'brevo' %}Brevo (transactional API){% else %}SMTP{% endif %}
16
+ </option>
17
+ {% endfor %}
18
+ {% endcall %}
19
+
20
+ {{ field.text('settings-mail-from-name', fields.mailFromName, 'From name', form.mailFromName,
21
+ hint='The name on the From line. Empty uses the site title.') }}
22
+
23
+ {% set fromAddressHint %}
24
+ Providers only send from an address they have verified, so this should be
25
+ one you own. Empty falls back to <code>no-reply@</code> at the site's host.
26
+ {% endset %}
27
+ {{ field.text('settings-mail-from-address', fields.mailFromAddress, 'From address',
28
+ form.mailFromAddress, error=problems.mailFromAddress, hint=fromAddressHint,
29
+ inputmode='email') }}
30
+
31
+ {{ field.text('settings-mail-reply-to', fields.mailReplyTo, 'Reply-to', form.mailReplyTo,
32
+ error=problems.mailReplyTo, inputmode='email',
33
+ hint='Where a reply goes. Empty replies to the From address.') }}
34
+
35
+ {% set contactHint %}
36
+ Where a message from a page&rsquo;s contact form is sent, with reply-to set to whoever
37
+ wrote it. Empty writes to the first admin with an email address. It is read when a
38
+ message arrives and never appears on the public site.
39
+ {% endset %}
40
+ {{ field.text('settings-contact-email', fields.contactEmail, 'Contact address',
41
+ form.contactEmail, error=problems.contactEmail, hint=contactHint, inputmode='email') }}
42
+ {% endblock %}
43
+
44
+ {% block settingsPanels %}
45
+ {# The mail credential is its own pair of forms for the reason the Akismet
46
+ key is: an API key and an SMTP password belong in data/mail.json, not in
47
+ the public site.json, and a mistyped one must not lose an edit to the
48
+ From line. #}
49
+ <section class="admin-settings admin-mail-panel">
50
+ <h2>Mail credentials</h2>
51
+
52
+ <p class="admin-mail-state admin-mail-{{ mailProvider }}">
53
+ {% if mailConfigured %}
54
+ <strong>Configured</strong> &mdash; sending through {{ mailProvider }}.
55
+ {% elif mailProvider == 'none' %}
56
+ <strong>Not sending</strong> &mdash; no provider is chosen.
57
+ {% else %}
58
+ <strong>Not configured</strong> &mdash; {{ mailProvider }} is chosen but has no credential.
59
+ {% endif %}
60
+ </p>
61
+ <p class="admin-hint">{{ mailHint }}</p>
62
+
63
+ {# One provider's boxes, never both. A site sending through Brevo has no
64
+ use for an SMTP port and a site sending through SMTP has none for an API
65
+ key, and seven boxes where one is wanted is how a screen teaches people
66
+ to stop reading it.
67
+
68
+ The provider branched on is the saved one, from `site.json`, not
69
+ whatever the select above happens to be showing: that select belongs to
70
+ the settings form and nothing it shows is true until Save settings is
71
+ pressed. Saying so is the paragraph below — without it, somebody who
72
+ picks SMTP, looks straight down for a Host box and finds an API key
73
+ would reasonably call this broken. Doing it the other way round would
74
+ take JavaScript, and no other admin screen needs any. #}
75
+ {% if mailProvider == 'none' %}
76
+ <p class="admin-hint">
77
+ No provider is <em>saved</em>, so there is no credential to give and no
78
+ box here to give it in. Choose one under <strong>Provider</strong> above
79
+ and press <strong>Save settings</strong> &mdash; picking it in the select
80
+ alone changes nothing &mdash; and the boxes it needs appear here.
81
+ </p>
82
+ {% else %}
83
+ <p class="admin-hint">
84
+ These are the boxes
85
+ <strong>{% if mailProvider == 'brevo' %}Brevo{% else %}SMTP{% endif %}</strong>
86
+ needs, and they follow the provider this site has <em>saved</em> &mdash; not
87
+ the one the select above is showing. Change <strong>Provider</strong> and
88
+ press <strong>Save settings</strong> first, and the boxes here change with it.
89
+ </p>
90
+
91
+ <form method="post" action="{{ mailUrl }}">
92
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
93
+
94
+ {% if mailProvider == 'brevo' %}
95
+ <h3>Brevo</h3>
96
+ {% if mailBrevoPresent %}
97
+ <p class="admin-hint">A key is stored, ending {{ mailBrevoKeyHint }}.</p>
98
+ {% set brevoPlaceholder = 'Leave blank to keep the stored key' %}
99
+ {% else %}
100
+ {% set brevoPlaceholder = 'Paste your key' %}
101
+ {% endif %}
102
+ {{ field.password('settings-mail-brevo-key', mailFields.brevoApiKey, 'API key',
103
+ autocomplete='off', spellcheck='false', placeholder=brevoPlaceholder) }}
104
+ {% else %}
105
+ <h3>SMTP</h3>
106
+ {{ field.text('settings-mail-smtp-host', mailFields.smtpHost, 'Host', mailSmtp.host,
107
+ autocomplete='off') }}
108
+
109
+ {{ field.text('settings-mail-smtp-port', mailFields.smtpPort, 'Port',
110
+ mailSmtp.port if mailSmtp else 587, inputmode='numeric') }}
111
+
112
+ {# Its own box with the sentence beside it, like every other switch in
113
+ the admin. It used to be a label wrapped round the tick in a class the
114
+ stylesheet has never heard of, so it was the one switch here that
115
+ rendered unstyled. #}
116
+ {{ field.checkbox('settings-mail-smtp-secure', mailFields.smtpSecure,
117
+ 'TLS from the first byte (port 465)', checked=mailSmtp.secure,
118
+ hint='Leave this off for port 587, which upgrades with STARTTLS.') }}
119
+
120
+ {{ field.text('settings-mail-smtp-user', mailFields.smtpUser, 'Username', mailSmtp.user,
121
+ autocomplete='off') }}
122
+
123
+ {% if mailSmtp.hasPassword %}
124
+ {% set smtpPlaceholder = 'Leave blank to keep the stored password' %}
125
+ {% else %}
126
+ {% set smtpPlaceholder = 'The SMTP password' %}
127
+ {% endif %}
128
+ {{ field.password('settings-mail-smtp-password', mailFields.smtpPassword, 'Password',
129
+ autocomplete='off', spellcheck='false', placeholder=smtpPlaceholder) }}
130
+ {% endif %}
131
+
132
+ <p class="admin-settings-buttons">
133
+ <button type="submit">Save credentials</button>
134
+ </p>
135
+ </form>
136
+ {% endif %}
137
+
138
+ {# A credential kept for a provider that is not the chosen one. Its boxes
139
+ are gone but the secret is still on disk, and this panel is the only
140
+ place in the admin that says so, so it is reported in words instead.
141
+ Hiding a stored API key would be the screen lying about what the site
142
+ holds. #}
143
+ {% set brevoStoredElsewhere = mailBrevoPresent and mailProvider != 'brevo' %}
144
+ {% set smtpStoredElsewhere = mailSmtpPresent and mailProvider != 'smtp' %}
145
+ {% if brevoStoredElsewhere or smtpStoredElsewhere %}
146
+ <h3>Also stored</h3>
147
+
148
+ {% if brevoStoredElsewhere %}
149
+ <p class="admin-field-static">
150
+ A <strong>Brevo</strong> API key, ending {{ mailBrevoKeyHint }}.
151
+ </p>
152
+ {% endif %}
153
+ {% if smtpStoredElsewhere %}
154
+ <p class="admin-field-static">
155
+ An <strong>SMTP</strong> server:
156
+ {% if mailSmtp.user %}{{ mailSmtp.user }} at {% endif %}{{ mailSmtp.host }}
157
+ port {{ mailSmtp.port }}{% if mailSmtp.hasPassword %}, with a password{% endif %}.
158
+ </p>
159
+ {% endif %}
160
+
161
+ <p class="admin-hint">
162
+ Kept in <code>data/mail.json</code> and used by nothing while
163
+ {% if mailProvider == 'none' %}no provider is chosen{% else %}{% if mailProvider == 'brevo' %}Brevo{% else %}SMTP{% endif %} is the chosen provider{% endif %}.
164
+ Choose that provider above to edit it, or press
165
+ <strong>Remove credentials</strong> to forget every credential this site
166
+ holds, this one included.
167
+ </p>
168
+ {% endif %}
169
+
170
+ {% if mailBrevoPresent or mailSmtpPresent %}
171
+ <form method="post" action="{{ mailUrl }}">
172
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
173
+ <input type="hidden" name="{{ mailFields.action }}" value="{{ mailRemove }}" />
174
+ <p class="admin-settings-buttons">
175
+ <button type="submit">Remove credentials</button>
176
+ </p>
177
+ </form>
178
+ {% endif %}
179
+
180
+ {# Only where there is something to send with, the way the notice switches
181
+ on a user's page are drawn only where there is both a provider and an
182
+ address (TASK-97). A Send test email button on a site with no credential
183
+ can do one thing, which is say it did nothing. #}
184
+ {% if mailConfigured %}
185
+ <form method="post" action="{{ mailTestUrl }}">
186
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
187
+ {{ field.text('settings-mail-test-to', mailTestFields.to, 'Send a test message to', '',
188
+ inputmode='email', placeholder='you@example.com') }}
189
+ <p class="admin-settings-buttons">
190
+ <button type="submit">Send test email</button>
191
+ </p>
192
+ </form>
193
+ {% endif %}
194
+
195
+ <p class="admin-hint">
196
+ Neither the API key nor the SMTP password is ever printed back into this
197
+ page. Both are kept in <code>data/mail.json</code> at mode
198
+ <code>0600</code>, beside the password hashes and the actor's private
199
+ keys, and never in <code>site.json</code>, which is public and in git.
200
+ Leaving a secret blank keeps the one already stored.
201
+ </p>
202
+ </section>
203
+ {% endblock %}
@@ -0,0 +1,29 @@
1
+ {# /admin/settings: what the site is called, where it lives, and its picture. #}
2
+ {% extends "layouts/settings-page.njk" %}
3
+ {% import "components/fields.njk" as field %}
4
+
5
+ {% block settingsFields %}
6
+ {{ field.text('settings-title', fields.title, 'Title', form.title,
7
+ error=problems.title, required=true, autofocus=true) }}
8
+
9
+ {{ field.text('settings-tagline', fields.tagline, 'Tagline', form.tagline,
10
+ hint='One line, shown under the title and used as the feed subtitle.') }}
11
+
12
+ {{ field.text('settings-author', fields.author, 'Author', form.author,
13
+ hint='The name on the feeds.') }}
14
+
15
+ {% set baseUrlHint %}In effect: <code>{{ baseUrlInEffect }}</code>. {{ baseUrlNote }}{% endset %}
16
+ {{ field.text('settings-base-url', fields.baseUrl, 'Base URL', form.baseUrl,
17
+ error=problems.baseUrl, hint=baseUrlHint, inputmode='url',
18
+ readonly=baseUrlOverridden, disabled=baseUrlOverridden) }}
19
+
20
+ {% set timezoneHint %}An IANA name, such as <code>Europe/London</code> or <code>UTC</code>.{% endset %}
21
+ {{ field.text('settings-timezone', fields.timezone, 'Time zone', form.timezone,
22
+ error=problems.timezone, hint=timezoneHint, required=true) }}
23
+
24
+ {% set languageHint %}A BCP 47 tag, such as <code>en</code> or <code>en-GB</code>. It is the page's <code>lang</code> and the feeds' language.{% endset %}
25
+ {{ field.text('settings-language', fields.language, 'Language', form.language,
26
+ error=problems.language, hint=languageHint, required=true) }}
27
+ {% endblock %}
28
+
29
+ {% block settingsPanels %}{% endblock %}
@@ -0,0 +1,50 @@
1
+ {# /admin/settings/permalinks: the URLs the archives live at, and the ones they
2
+ used to. #}
3
+ {% extends "layouts/settings-page.njk" %}
4
+ {% import "components/fields.njk" as field %}
5
+
6
+ {% block settingsFields %}
7
+ {% set tagBaseHint %}The tag archives live at <code>/{{ form.tagBase }}/{tag}/</code>. One path segment, no slashes.{% endset %}
8
+ {{ field.text('settings-tag-base', fields.tagBase, 'Tag base', form.tagBase,
9
+ error=problems.tagBase, hint=tagBaseHint, required=true, autofocus=true) }}
10
+
11
+ {% set categoryBaseHint %}The category archives live at <code>/{{ form.categoryBase }}/{name}/</code>.{% endset %}
12
+ {{ field.text('settings-category-base', fields.categoryBase, 'Category base', form.categoryBase,
13
+ error=problems.categoryBase, hint=categoryBaseHint, required=true) }}
14
+ {% endblock %}
15
+
16
+ {% block settingsPanels %}
17
+ {# The recorded renames are a record of what happened rather than a
18
+ preference: the taxonomy screens write them as a term is renamed or merged,
19
+ and this page is where the URLs they are about are decided. #}
20
+ <section class="admin-settings admin-redirects-panel">
21
+ <h2>Archive redirects</h2>
22
+
23
+ {% if taxonomyRedirects.length %}
24
+ <table class="admin-list">
25
+ <thead>
26
+ <tr><th scope="col">Taxonomy</th><th scope="col">Was</th><th scope="col">Is now</th></tr>
27
+ </thead>
28
+ <tbody>
29
+ {% for redirect in taxonomyRedirects %}
30
+ <tr>
31
+ <td>{{ redirect.label }}</td>
32
+ <td><code>{{ redirect.from }}</code></td>
33
+ <td><code>{{ redirect.to }}</code></td>
34
+ </tr>
35
+ {% endfor %}
36
+ </tbody>
37
+ </table>
38
+ <p class="admin-hint">
39
+ Every one of these answers with a permanent redirect to the archive the
40
+ term lives at now, so a link somebody published still arrives.
41
+ </p>
42
+ {% else %}
43
+ <p class="admin-hint">
44
+ Nothing has moved yet. Renaming or merging a term on the Tags or
45
+ Categories screen records the archive URL it used to have here, and the
46
+ site answers that URL with a permanent redirect from then on.
47
+ </p>
48
+ {% endif %}
49
+ </section>
50
+ {% endblock %}
@@ -0,0 +1,64 @@
1
+ {# /admin/settings/reading: what a visitor is shown, and who is told when it
2
+ changes. The site menu was here until TASK-108; it is on /admin/navigation,
3
+ with every other menu the site holds. #}
4
+ {% extends "layouts/settings-page.njk" %}
5
+ {% import "components/fields.njk" as field %}
6
+
7
+ {% block settingsFields %}
8
+ {# WordPress's "Your homepage displays": the empty option is Your latest
9
+ posts, so the choice and the page it needs are one control rather than a
10
+ radio and a select that can disagree with each other. #}
11
+ {% set homepageGone %}
12
+ {% if homepageMissing %}
13
+ <p class="admin-field-error">
14
+ The homepage was <code>{{ form.homepage }}</code>, which is no longer published,
15
+ so the site is showing its latest posts. Publish that page again to have it back,
16
+ or pick another.
17
+ </p>
18
+ {% endif %}
19
+ {% endset %}
20
+ {% set homepageHint %}
21
+ Your latest posts is the archive at <code>/</code>. A page instead is served
22
+ there, and its own URL redirects to <code>/</code> so there is one front page.
23
+ {% endset %}
24
+ {% call field.select('settings-homepage', fields.homepage, 'Your homepage displays',
25
+ error=problems.homepage, errorHtml=homepageGone, hint=homepageHint, autofocus=true) %}
26
+ <option value="">Your latest posts</option>
27
+ {% for page in pageChoices %}
28
+ <option value="{{ page.slug }}"{% if page.slug == form.homepage %} selected{% endif %}>{{ page.title }}</option>
29
+ {% endfor %}
30
+ {% endcall %}
31
+
32
+ {% set postsPageGone %}
33
+ {% if postsPageMissing %}
34
+ <p class="admin-field-error">
35
+ The posts page was <code>{{ form.postsPage }}</code>, which is no longer published,
36
+ so the listing has no page of its own.
37
+ </p>
38
+ {% endif %}
39
+ {% endset %}
40
+ {% set postsPageHint %}
41
+ Where the posts go once the homepage is a page: this page's URL carries the
42
+ listing, with its own title and words above it. It needs a homepage first.
43
+ The feeds stay at <code>/feed/</code> either way.
44
+ {% endset %}
45
+ {% call field.select('settings-posts-page', fields.postsPage, 'Posts page',
46
+ error=problems.postsPage, errorHtml=postsPageGone, hint=postsPageHint) %}
47
+ <option value="">&mdash; None &mdash;</option>
48
+ {% for page in pageChoices %}
49
+ <option value="{{ page.slug }}"{% if page.slug == form.postsPage %} selected{% endif %}>{{ page.title }}</option>
50
+ {% endfor %}
51
+ {% endcall %}
52
+
53
+ {{ field.text('settings-posts-per-page', fields.postsPerPage, 'Posts per page', form.postsPerPage,
54
+ error=problems.postsPerPage, inputmode='numeric', required=true,
55
+ hint='How many posts a listing page holds, on the home page and on every archive.') }}
56
+
57
+ {% set notifyHint %}
58
+ An rssCloud and WebSub server, told whenever a feed changes so subscribers
59
+ hear at once instead of waiting for their next poll. Every feed advertises
60
+ it. Leave it empty for none.
61
+ {% endset %}
62
+ {{ field.text('settings-notify-server', fields.notifyServer, 'Notify server', form.notifyServer,
63
+ error=problems.notifyServer, hint=notifyHint, inputmode='url') }}
64
+ {% endblock %}
@@ -0,0 +1,89 @@
1
+ {# /admin/tools: what the derived index holds, and the button that reads every
2
+ file back into it without stopping the site (TASK-95).
3
+
4
+ The counts are the point of the screen as much as the button is: an index
5
+ that disagrees with the files is not something the site complains about, so
6
+ the only way to notice is to be shown what it holds. #}
7
+ {% extends "layouts/shell.njk" %}
8
+
9
+ {% block title %}{{ heading }}{% endblock %}
10
+
11
+ {% block content %}
12
+ <h1>{{ heading }}</h1>
13
+
14
+ <p>
15
+ Everything in <code>data/geekity.db</code> is a reading of the files under
16
+ <code>{{ contentDir }}</code>, so it can always be read again. Rebuild it after
17
+ editing content outside the admin &mdash; over ssh, or with a
18
+ <code>git pull</code> while the site was down &mdash; or when what is listed here
19
+ disagrees with what is on disk.
20
+ </p>
21
+
22
+ <table class="admin-list">
23
+ <thead>
24
+ <tr>
25
+ <th scope="col">What the index holds</th>
26
+ <th scope="col">Count</th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <tr>
31
+ <th scope="row">Documents</th>
32
+ <td>{{ indexed.documents }}</td>
33
+ </tr>
34
+ <tr>
35
+ <th scope="row">Followers</th>
36
+ <td>{{ indexed.followers }}</td>
37
+ </tr>
38
+ <tr>
39
+ <th scope="row">Inbox activities</th>
40
+ <td>{{ indexed.activities }}</td>
41
+ </tr>
42
+ <tr>
43
+ <th scope="row">Comments</th>
44
+ <td>{{ indexed.comments }}</td>
45
+ </tr>
46
+ </tbody>
47
+ </table>
48
+
49
+ {% if confirm %}
50
+ {# Offered rather than done, the way a merge is on the taxonomy screens.
51
+ The window in the middle is the whole reason: for as long as the scan
52
+ runs the site answers 404 for documents whose files are perfectly fine,
53
+ and that is not a thing to discover afterwards. #}
54
+ <form class="admin-settings" method="post" action="{{ rebuildUrl }}">
55
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
56
+ <input type="hidden" name="{{ fields.confirm }}" value="1" />
57
+
58
+ <h2>Rebuild the index now?</h2>
59
+
60
+ <p>
61
+ The index is emptied and every file read again. Until the scan finishes, this
62
+ site answers <strong>404</strong> for its posts and pages &mdash; under a second
63
+ on a small site, longer on a large one &mdash; and it is serving the whole time.
64
+ Nothing is deleted and nothing is sent: you stay signed in, the delivery log and
65
+ the relays are kept, and no follower, feed or linked page is told about a post
66
+ the scan re-indexes.
67
+ </p>
68
+
69
+ <p class="admin-settings-buttons">
70
+ <button type="submit">Rebuild it</button>
71
+ <a href="{{ toolsUrl }}">Cancel</a>
72
+ </p>
73
+ </form>
74
+ {% else %}
75
+ <form class="admin-settings" method="post" action="{{ rebuildUrl }}">
76
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
77
+ <p class="admin-settings-buttons">
78
+ <button type="submit">Rebuild the index</button>
79
+ </p>
80
+ </form>
81
+ {% endif %}
82
+
83
+ <p class="admin-hint">
84
+ This runs on the site as it is: nothing is deleted, no connection is swapped and
85
+ nobody is signed out. <code>geekity rebuild</code> at the command line is the other
86
+ door, and it is for the one case this screen cannot be: a database this version
87
+ refuses to open, where there is no site running to press a button in.
88
+ </p>
89
+ {% endblock %}