@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,165 @@
1
+ {# One labelled box, written once.
2
+
3
+ Every admin form used to spell out its own `<label for>`, control, hint and
4
+ error, roughly seventy-five times across sixteen templates, against a class
5
+ vocabulary each template had to remember. That is how /admin/users drifted
6
+ into hidden labels nobody else used (TASK-97): a field written by hand can
7
+ forget the error line, leave a label unbound, or invent a class the
8
+ stylesheet has never heard of, and nothing says it is wrong.
9
+
10
+ Each macro here emits the same four things in the same order:
11
+
12
+ 1. the `<label for>`, bound to the control by its id,
13
+ 2. the control,
14
+ 3. the field error, where the form has something to say about this box,
15
+ 4. the hint, where the field needs explaining.
16
+
17
+ Error before hint, because that is the order every screen already used: the
18
+ sentence about what went wrong belongs next to the box it is about, and the
19
+ standing explanation sits under both.
20
+
21
+ This file is under the packaged admin directory, which is the admin
22
+ environment's only search root (`src/admin/templates.ts`). A site's theme
23
+ can override any public template and cannot reach in here, so no theme can
24
+ shadow or break a field on the login form.
25
+
26
+ `label` and `hint` are written into the page as markup, because the admin's
27
+ labels and hints carry `<code>`, `<em>` and links. They are template
28
+ literals, never anything a visitor typed; a hint that interpolates a value
29
+ should be captured with `{% set … %}…{% endset %}`, which escapes what it
30
+ interpolates before this ever sees it. `error` is a message from the server
31
+ and is escaped. #}
32
+
33
+ {# The field error, then the hint: the two paragraphs every macro below ends
34
+ with. `errorHtml` is the rare second thing a field has to say — the Reading
35
+ page's "that page is no longer published" — already written as its own
36
+ paragraph. #}
37
+ {% macro _below(hint, error, errorHtml) %}
38
+ {% if error %}
39
+ <p class="admin-field-error">{{ error }}</p>
40
+ {% endif %}
41
+ {% if errorHtml %}
42
+ {{ errorHtml | safe }}
43
+ {% endif %}
44
+ {% if hint %}
45
+ <p class="admin-hint">{{ hint | safe }}</p>
46
+ {% endif %}
47
+ {% endmacro %}
48
+
49
+ {# A box somebody types into: text, email, number, or whatever `type` says.
50
+
51
+ `value` is always written, even empty, so the control's state is on the page
52
+ rather than implied by its absence. #}
53
+ {% macro text(
54
+ id,
55
+ name,
56
+ label,
57
+ value='',
58
+ type='text',
59
+ hint='',
60
+ error='',
61
+ errorHtml='',
62
+ min='',
63
+ step='',
64
+ inputmode='',
65
+ autocomplete='',
66
+ placeholder='',
67
+ spellcheck='',
68
+ required=false,
69
+ autofocus=false,
70
+ readonly=false,
71
+ disabled=false
72
+ ) %}
73
+ <label for="{{ id }}">{{ label | safe }}</label>
74
+ <input id="{{ id }}" name="{{ name }}" type="{{ type }}"{% if min %} min="{{ min }}"{% endif %}{% if step %} step="{{ step }}"{% endif %}{% if inputmode %} inputmode="{{ inputmode }}"{% endif %}{% if autocomplete %} autocomplete="{{ autocomplete }}"{% endif %} value="{{ value }}"{% if placeholder %} placeholder="{{ placeholder }}"{% endif %}{% if spellcheck %} spellcheck="{{ spellcheck }}"{% endif %}{% if required %} required{% endif %}{% if autofocus %} autofocus{% endif %}{% if readonly %} readonly{% endif %}{% if disabled %} disabled{% endif %} />
75
+ {{ _below(hint, error, errorHtml) }}
76
+ {%- endmacro %}
77
+
78
+ {# A password box. It carries `value=""` and no way to set one: nothing typed
79
+ into a password field is ever printed back into the page, and a stored
80
+ secret is never printed at all — the placeholder says whether there is one.
81
+ #}
82
+ {% macro password(
83
+ id,
84
+ name,
85
+ label,
86
+ hint='',
87
+ error='',
88
+ errorHtml='',
89
+ autocomplete='',
90
+ placeholder='',
91
+ spellcheck='',
92
+ required=false,
93
+ autofocus=false
94
+ ) %}
95
+ <label for="{{ id }}">{{ label | safe }}</label>
96
+ <input id="{{ id }}" name="{{ name }}" type="password" value=""{% if autocomplete %} autocomplete="{{ autocomplete }}"{% endif %}{% if spellcheck %} spellcheck="{{ spellcheck }}"{% endif %}{% if placeholder %} placeholder="{{ placeholder }}"{% endif %}{% if required %} required{% endif %}{% if autofocus %} autofocus{% endif %} />
97
+ {{ _below(hint, error, errorHtml) }}
98
+ {%- endmacro %}
99
+
100
+ {# A box of several lines. #}
101
+ {% macro textarea(
102
+ id,
103
+ name,
104
+ label,
105
+ value='',
106
+ hint='',
107
+ error='',
108
+ errorHtml='',
109
+ rows='',
110
+ spellcheck='',
111
+ required=false,
112
+ autofocus=false,
113
+ readonly=false,
114
+ disabled=false
115
+ ) %}
116
+ <label for="{{ id }}">{{ label | safe }}</label>
117
+ <textarea id="{{ id }}" name="{{ name }}"{% if rows %} rows="{{ rows }}"{% endif %}{% if spellcheck %} spellcheck="{{ spellcheck }}"{% endif %}{% if required %} required{% endif %}{% if autofocus %} autofocus{% endif %}{% if readonly %} readonly{% endif %}{% if disabled %} disabled{% endif %}>{{ value }}</textarea>
118
+ {{ _below(hint, error, errorHtml) }}
119
+ {%- endmacro %}
120
+
121
+ {# A list to pick from. The options are the call's body, because which of them
122
+ is `selected` is the caller's business and an option's label is markup as
123
+ often as it is a word:
124
+
125
+ {% call field.select('settings-homepage', fields.homepage, 'Homepage') %}
126
+ <option value="">Your latest posts</option>
127
+ {% endcall %} #}
128
+ {% macro select(
129
+ id,
130
+ name,
131
+ label,
132
+ hint='',
133
+ error='',
134
+ errorHtml='',
135
+ required=false,
136
+ autofocus=false,
137
+ disabled=false
138
+ ) %}
139
+ <label for="{{ id }}">{{ label | safe }}</label>
140
+ <select id="{{ id }}" name="{{ name }}"{% if required %} required{% endif %}{% if autofocus %} autofocus{% endif %}{% if disabled %} disabled{% endif %}>
141
+ {{ caller() }}
142
+ </select>
143
+ {{ _below(hint, error, errorHtml) }}
144
+ {%- endmacro %}
145
+
146
+ {# A switch. The label follows the box rather than heading it, which is what a
147
+ tick beside a sentence reads as, and `admin-check` is the class the
148
+ stylesheet lays that pair out with. #}
149
+ {% macro checkbox(
150
+ id,
151
+ name,
152
+ label,
153
+ checked=false,
154
+ value='1',
155
+ hint='',
156
+ error='',
157
+ errorHtml='',
158
+ disabled=false
159
+ ) %}
160
+ <p class="admin-check">
161
+ <input id="{{ id }}" name="{{ name }}" type="checkbox" value="{{ value }}"{% if checked %} checked{% endif %}{% if disabled %} disabled{% endif %} />
162
+ <label for="{{ id }}">{{ label | safe }}</label>
163
+ </p>
164
+ {{ _below(hint, error, errorHtml) }}
165
+ {%- endmacro %}
@@ -19,7 +19,7 @@
19
19
  {% block chrome %}{% endblock %}
20
20
  {% block main %}
21
21
  <main class="admin-plain">
22
- {% include "layouts/_flash.njk" %}
22
+ {% include "components/flash.njk" %}
23
23
  {% block content %}{% endblock %}
24
24
  </main>
25
25
  {% endblock %}
@@ -0,0 +1,26 @@
1
+ {# What every settings page is: a heading, one form that saves the fields that
2
+ page carries, and whatever panels sit under it. A page fills in the two
3
+ blocks; nothing about the chrome is written six times. #}
4
+ {% extends "layouts/shell.njk" %}
5
+
6
+ {% block title %}{{ settingsLabel }} settings{% endblock %}
7
+
8
+ {% block content %}
9
+ <h1>{{ settingsLabel }}</h1>
10
+
11
+ {% if hasProblems %}
12
+ <p class="admin-error">Nothing was saved. Fix the fields marked below and try again.</p>
13
+ {% endif %}
14
+
15
+ <form class="admin-settings" method="post" action="{{ settingsUrl }}">
16
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
17
+
18
+ {% block settingsFields %}{% endblock %}
19
+
20
+ <p class="admin-settings-buttons">
21
+ <button type="submit">Save settings</button>
22
+ </p>
23
+ </form>
24
+
25
+ {% block settingsPanels %}{% endblock %}
26
+ {% endblock %}
@@ -19,18 +19,32 @@
19
19
 
20
20
  {% block main %}
21
21
  <div class="admin-shell">
22
+ {# WordPress classic: a section is a heading over its screens. The heading
23
+ goes to the first of them, the open section shows the rest, and the one
24
+ you are on carries aria-current. Nothing here is scripted — the server
25
+ already knows which section is open, so expanding one is a page the
26
+ browser asks for rather than a class JavaScript toggles. #}
22
27
  <nav class="admin-nav" aria-label="Sections">
23
28
  <ul>
24
29
  {% for item in navigation %}
25
- <li>
26
- <a href="{{ item.url }}"{% if item.section == section %} aria-current="page"{% endif %}>{{ item.label }}</a>
30
+ <li class="admin-nav-section{% if item.open %} admin-nav-open{% endif %}">
31
+ <a class="admin-nav-heading" href="{{ item.url }}">{{ item.label }}</a>
32
+ {% if item.open %}
33
+ <ul class="admin-nav-children">
34
+ {% for entry in item.children %}
35
+ <li>
36
+ <a href="{{ entry.url }}"{% if entry.current %} aria-current="page"{% endif %}>{{ entry.label }}</a>
37
+ </li>
38
+ {% endfor %}
39
+ </ul>
40
+ {% endif %}
27
41
  </li>
28
42
  {% endfor %}
29
43
  </ul>
30
44
  </nav>
31
45
 
32
46
  <main class="admin-main">
33
- {% include "layouts/_flash.njk" %}
47
+ {% include "components/flash.njk" %}
34
48
  {% block content %}{% endblock %}
35
49
  </main>
36
50
  </div>
@@ -0,0 +1,47 @@
1
+ {# /admin/forgot: ask for a link to set a new password.
2
+
3
+ The page has three states and one rule. The rule is that a request never
4
+ says whether the name matched: the answer below is the same sentence
5
+ whoever asked and whatever was found, so this form cannot be used to find
6
+ out which accounts a site has. #}
7
+ {% extends "layouts/base.njk" %}
8
+ {% import "components/fields.njk" as field %}
9
+
10
+ {% block title %}Forgotten password{% endblock %}
11
+
12
+ {% block content %}
13
+ <h1>Forgotten password</h1>
14
+
15
+ {% if not configured %}
16
+ {# No provider and no credential, so there is nothing to send a link with.
17
+ Saying so beats a form that quietly does nothing. #}
18
+ <p>This site cannot send email, so a password cannot be reset from here.</p>
19
+ <p>
20
+ Whoever runs the server can add an account from a shell with
21
+ <code>geekity user add &lt;username&gt;</code>, and sign in with that to
22
+ change anything else. Turning on a mail provider under
23
+ <strong>Settings &rarr; Email</strong> makes this page work.
24
+ </p>
25
+ <p><a href="{{ loginUrl }}">Back to the login form</a></p>
26
+ {% elif sent %}
27
+ <p>{{ answer }}</p>
28
+ <p><a href="{{ loginUrl }}">Back to the login form</a></p>
29
+ {% else %}
30
+ <p>Type your username or your email address, and a link to set a new password is sent to the address on your account.</p>
31
+
32
+ {% if error %}
33
+ <p class="error">{{ error }}</p>
34
+ {% endif %}
35
+
36
+ <form method="post" action="{{ forgotUrl }}">
37
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
38
+
39
+ {{ field.text('identifier', fields.identifier, 'Username or email address',
40
+ autocomplete='username', required=true, autofocus=true) }}
41
+
42
+ <button type="submit">Send a reset link</button>
43
+ </form>
44
+
45
+ <p class="admin-hint"><a href="{{ loginUrl }}">Back to the login form</a></p>
46
+ {% endif %}
47
+ {% endblock %}
@@ -0,0 +1,26 @@
1
+ {% extends "layouts/base.njk" %}
2
+ {% import "components/fields.njk" as field %}
3
+
4
+ {% block title %}Log in{% endblock %}
5
+
6
+ {% block content %}
7
+ <h1>Log in</h1>
8
+
9
+ {% if error %}
10
+ <p class="error">{{ error }}</p>
11
+ {% endif %}
12
+
13
+ <form method="post" action="{{ loginUrl }}">
14
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
15
+
16
+ {{ field.text('username', 'username', 'Username', username,
17
+ autocomplete='username', required=true, autofocus=true) }}
18
+
19
+ {{ field.password('password', 'password', 'Password',
20
+ autocomplete='current-password', required=true) }}
21
+
22
+ <button type="submit">Log in</button>
23
+ </form>
24
+
25
+ <p class="admin-hint"><a href="{{ forgotUrl }}">Forgotten your password?</a></p>
26
+ {% endblock %}
@@ -0,0 +1,38 @@
1
+ {# /admin/reset: set a new password, for somebody holding a link.
2
+
3
+ The token travels from the link's query string into a hidden field, so the
4
+ form posts to a plain URL and the token stays out of the browser's history
5
+ for the POST. Nothing typed here is ever echoed back: both fields are
6
+ passwords. #}
7
+ {% extends "layouts/base.njk" %}
8
+ {% import "components/fields.njk" as field %}
9
+
10
+ {% block title %}Set a new password{% endblock %}
11
+
12
+ {% block content %}
13
+ <h1>Set a new password</h1>
14
+
15
+ {% if invalid %}
16
+ <p class="error">That link is no longer valid. A reset link lasts an hour and works once, and asking for a new password again invalidates the old one.</p>
17
+ <p><a href="{{ forgotUrl }}">Ask for another one</a></p>
18
+ {% else %}
19
+ {% if problem %}
20
+ <p class="error">{{ problem }}</p>
21
+ {% endif %}
22
+
23
+ <form method="post" action="{{ resetUrl }}">
24
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
25
+ <input type="hidden" name="{{ fields.token }}" value="{{ token }}" />
26
+
27
+ {{ field.password('password', fields.password, 'New password',
28
+ autocomplete='new-password', required=true, autofocus=true) }}
29
+
30
+ {{ field.password('password_confirmation', fields.passwordConfirmation,
31
+ 'Repeat the password', autocomplete='new-password', required=true) }}
32
+
33
+ <p class="admin-hint">Every browser signed in as you is signed out, and this link stops working.</p>
34
+
35
+ <button type="submit">Set the password</button>
36
+ </form>
37
+ {% endif %}
38
+ {% endblock %}
@@ -0,0 +1,28 @@
1
+ {% extends "layouts/base.njk" %}
2
+ {% import "components/fields.njk" as field %}
3
+
4
+ {% block title %}Set up{% endblock %}
5
+
6
+ {% block content %}
7
+ <h1>Create the first admin</h1>
8
+ <p>Nobody can sign in to this site yet. Pick a username and a password.</p>
9
+
10
+ {% if error %}
11
+ <p class="error">{{ error }}</p>
12
+ {% endif %}
13
+
14
+ <form method="post" action="{{ setupUrl }}">
15
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
16
+
17
+ {{ field.text('username', 'username', 'Username', username,
18
+ autocomplete='username', required=true, autofocus=true) }}
19
+
20
+ {{ field.password('password', 'password', 'Password',
21
+ autocomplete='new-password', required=true) }}
22
+
23
+ {{ field.password('password_confirmation', 'password_confirmation', 'Repeat the password',
24
+ autocomplete='new-password', required=true) }}
25
+
26
+ <button type="submit">Create admin</button>
27
+ </form>
28
+ {% endblock %}
@@ -0,0 +1,69 @@
1
+ {# /admin/appearance/themes: the theme the site is wearing, everything else on
2
+ disk, and the one button that changes it (decision-15).
3
+
4
+ The packaged theme comes first because it is the floor the others are laid
5
+ over rather than a peer in the list: a site theme ships what it changes and
6
+ inherits the rest. The themes directory is read on every request, so a theme
7
+ copied in over ssh or pulled down by git is here without a restart. #}
8
+ {% extends "layouts/shell.njk" %}
9
+
10
+ {% block title %}{{ heading }}{% endblock %}
11
+
12
+ {% block content %}
13
+ <h1>{{ heading }}</h1>
14
+
15
+ <ul class="admin-themes">
16
+ {% for theme in themes %}
17
+ <li class="admin-theme{% if theme.active %} admin-theme-current{% endif %}">
18
+ <h2>{{ theme.name }}</h2>
19
+
20
+ {% if theme.active %}
21
+ <p class="admin-status admin-status-active">Active</p>
22
+ {% endif %}
23
+
24
+ {% if theme.description %}
25
+ <p class="admin-theme-description">{{ theme.description }}</p>
26
+ {% endif %}
27
+
28
+ <p class="admin-theme-id">
29
+ <code>{{ theme.id }}</code>
30
+ {% if theme.packaged %}
31
+ <span class="admin-status">the theme this package ships</span>
32
+ {% endif %}
33
+ </p>
34
+
35
+ {% if not theme.active %}
36
+ <form method="post" action="{{ themesUrl }}">
37
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
38
+ <input type="hidden" name="{{ fields.theme }}" value="{{ theme.value }}" />
39
+ <button type="submit">Activate</button>
40
+ </form>
41
+ {% endif %}
42
+ </li>
43
+ {% endfor %}
44
+ </ul>
45
+
46
+ {% if unreadable.length %}
47
+ <h2>Not themes</h2>
48
+
49
+ <p class="admin-hint">
50
+ These are directories in <code>{{ themesDir }}</code> that were meant to be themes and are
51
+ not. They are listed rather than skipped, so a typo in a <code>theme.json</code> is something
52
+ you can see rather than a theme that quietly stopped appearing. None of them can be
53
+ activated.
54
+ </p>
55
+
56
+ <ul class="admin-broken-themes">
57
+ {% for entry in unreadable %}
58
+ <li class="admin-broken-theme"><code>{{ entry.id }}</code> — {{ entry.reason }}</li>
59
+ {% endfor %}
60
+ </ul>
61
+ {% endif %}
62
+
63
+ <p class="admin-hint">
64
+ A theme is a directory in <code>{{ themesDir }}</code> with a <code>theme.json</code> in it,
65
+ named by that directory. It is laid over the theme this package ships, one file at a time, so
66
+ it need only carry what it changes. Activating one writes the directory name into
67
+ <code>content/_data/site.json</code>; the next request is already wearing it.
68
+ </p>
69
+ {% endblock %}
@@ -0,0 +1,133 @@
1
+ {# /admin/comments: the moderation queue. There is no email in this milestone,
2
+ so this screen is the notification — which is why the dashboard carries the
3
+ pending count and why this list opens on Pending.
4
+
5
+ Every button is a form of its own, so the whole screen works with
6
+ JavaScript switched off. #}
7
+ {% extends "layouts/shell.njk" %}
8
+
9
+ {% block title %}{{ heading }}{% endblock %}
10
+
11
+ {% block content %}
12
+ <h1>{{ heading }}</h1>
13
+
14
+ <nav class="admin-filters" aria-label="Comment status">
15
+ <ul>
16
+ {% for tab in tabs %}
17
+ <li>
18
+ <a href="{{ tab.url }}"{% if tab.current %} aria-current="page"{% endif %}>
19
+ {{ tab.label }} ({{ tab.count }})
20
+ </a>
21
+ </li>
22
+ {% endfor %}
23
+ </ul>
24
+ </nav>
25
+
26
+ {% if rows.length == 0 %}
27
+ <p class="admin-empty">Nothing here.</p>
28
+ {% else %}
29
+ <ul class="admin-comments">
30
+ {% for row in rows %}
31
+ <li class="admin-comment">
32
+ <div class="admin-comment-meta">
33
+ <span class="admin-comment-author">{{ row.author }}</span>
34
+ {% if row.url %}
35
+ <a class="admin-comment-site" href="{{ row.url }}" rel="nofollow ugc noopener noreferrer">{{ row.url }}</a>
36
+ {% endif %}
37
+ {% if row.email %}
38
+ <span class="admin-comment-email">{{ row.email }}</span>
39
+ {% endif %}
40
+ <span class="admin-status admin-status-{{ row.status }}">{{ row.status }}</span>
41
+ {% if row.source != 'comment' %}
42
+ <span class="admin-status">{{ row.source }}</span>
43
+ {% endif %}
44
+ </div>
45
+
46
+ <p class="admin-comment-where">
47
+ <time>{{ row.submitted }}</time>
48
+ on
49
+ {% if row.editUrl %}
50
+ <a href="{{ row.editUrl }}">{{ row.post }}</a>
51
+ {% else %}
52
+ {{ row.post }}
53
+ {% endif %}
54
+ {% if row.postUrl %}
55
+ &middot; <a href="{{ row.postUrl }}#comment-{{ row.id }}">View</a>
56
+ {% endif %}
57
+ {% if row.inReplyTo %}
58
+ &middot; a reply to another comment
59
+ {% endif %}
60
+ {% if row.address %}
61
+ &middot; <code title="A salted hash of the address it came from">{{ row.address }}</code>
62
+ {% endif %}
63
+ </p>
64
+
65
+ <div class="admin-comment-body">{{ row.html | safe }}</div>
66
+
67
+ <div class="admin-actions">
68
+ {% if row.status != 'approved' %}
69
+ <form method="post" action="{{ moderateUrl }}">
70
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
71
+ <input type="hidden" name="{{ fields.id }}" value="{{ row.id }}" />
72
+ <input type="hidden" name="{{ fields.status }}" value="{{ status }}" />
73
+ <button type="submit" name="{{ fields.action }}" value="approve">Approve</button>
74
+ </form>
75
+ {% endif %}
76
+
77
+ {% if row.status != 'spam' %}
78
+ <form method="post" action="{{ moderateUrl }}">
79
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
80
+ <input type="hidden" name="{{ fields.id }}" value="{{ row.id }}" />
81
+ <input type="hidden" name="{{ fields.status }}" value="{{ status }}" />
82
+ <button type="submit" name="{{ fields.action }}" value="spam">Spam</button>
83
+ </form>
84
+ {% endif %}
85
+
86
+ <form method="post" action="{{ moderateUrl }}">
87
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
88
+ <input type="hidden" name="{{ fields.id }}" value="{{ row.id }}" />
89
+ <input type="hidden" name="{{ fields.status }}" value="{{ status }}" />
90
+ <button type="submit" name="{{ fields.action }}" value="delete">Delete</button>
91
+ </form>
92
+ </div>
93
+
94
+ <details class="admin-comment-reply">
95
+ <summary>Reply</summary>
96
+ <form method="post" action="{{ replyUrl }}">
97
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
98
+ <input type="hidden" name="{{ fields.id }}" value="{{ row.id }}" />
99
+ <input type="hidden" name="{{ fields.status }}" value="{{ status }}" />
100
+ <label class="admin-visually-hidden" for="reply-{{ loop.index }}">
101
+ Reply to {{ row.author }}
102
+ </label>
103
+ <textarea id="reply-{{ loop.index }}" name="{{ fields.body }}" rows="4" required></textarea>
104
+ <p class="admin-hint">Markdown, rendered the same way a visitor’s comment is. It is posted approved, under this one.</p>
105
+ <p class="admin-settings-buttons">
106
+ <button type="submit">Post reply</button>
107
+ </p>
108
+ </form>
109
+ </details>
110
+ </li>
111
+ {% endfor %}
112
+ </ul>
113
+
114
+ {% if previousUrl or nextUrl %}
115
+ <nav class="admin-pagination" aria-label="Pages">
116
+ {% if previousUrl %}
117
+ <a rel="prev" href="{{ previousUrl }}">Newer</a>
118
+ {% endif %}
119
+ <span>Page {{ page }} of {{ pages }}</span>
120
+ {% if nextUrl %}
121
+ <a rel="next" href="{{ nextUrl }}">Older</a>
122
+ {% endif %}
123
+ </nav>
124
+ {% endif %}
125
+ {% endif %}
126
+
127
+ <p class="admin-hint">
128
+ Comments live as one JSON file per post under <code>content/_data/comments/</code>, so they
129
+ are in git beside the posts and an Eleventy build of the same directory shows them. Everything
130
+ here rewrites that file; the database is only an index of it. Spam is kept rather than deleted,
131
+ so a mistake can be undone — and so a spam checker can be told when it was wrong.
132
+ </p>
133
+ {% endblock %}
@@ -25,6 +25,14 @@
25
25
  <dt>Followers</dt>
26
26
  <dd><a href="{{ federationUrl }}">{{ followers }}</a></dd>
27
27
  </div>
28
+ <div>
29
+ <dt>Comments waiting</dt>
30
+ <dd><a href="{{ commentsUrl }}?status=pending">{{ pendingComments }}</a></dd>
31
+ </div>
32
+ <div>
33
+ <dt>Messages unread</dt>
34
+ <dd><a href="{{ messagesUrl }}">{{ unreadMessages }}</a></dd>
35
+ </div>
28
36
  </dl>
29
37
  </section>
30
38
 
@@ -59,20 +67,5 @@
59
67
  <p class="admin-empty">Nothing written yet.</p>
60
68
  {% endif %}
61
69
  </section>
62
-
63
- <section class="admin-panel">
64
- <h2>Quick draft</h2>
65
- <form method="post" action="{{ quickDraftUrl }}">
66
- <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
67
-
68
- <label for="quick-draft-title">Title</label>
69
- <input id="quick-draft-title" name="title" type="text" required />
70
-
71
- <label for="quick-draft-body">Body</label>
72
- <textarea id="quick-draft-body" name="body" rows="6"></textarea>
73
-
74
- <button type="submit">Save draft</button>
75
- </form>
76
- </section>
77
70
  </div>
78
71
  {% endblock %}
@@ -39,6 +39,7 @@
39
39
  <input type="hidden" name="permalink" value="{{ form.permalink }}" />
40
40
  <input type="hidden" name="date" value="{{ form.date }}" />
41
41
  <input type="hidden" name="tags" value="{{ form.tags }}" />
42
+ <input type="hidden" name="categories" value="{{ form.categories }}" />
42
43
  <input type="hidden" name="description" value="{{ form.description }}" />
43
44
  {% if form.draft %}
44
45
  <input type="hidden" name="draft" value="1" />