@geekity/cms 0.31.0 → 0.32.1

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 (759) hide show
  1. package/admin/components/badge.njk +4 -0
  2. package/admin/components/fields.njk +41 -24
  3. package/admin/components/job-status.njk +45 -0
  4. package/admin/components/setting-fields.njk +38 -0
  5. package/admin/layouts/settings-page.njk +16 -0
  6. package/admin/pages/comments/all.njk +1 -2
  7. package/admin/pages/documents/editor.njk +17 -15
  8. package/admin/pages/documents/syndication.njk +4 -4
  9. package/admin/pages/federation/followers.njk +56 -6
  10. package/admin/pages/federation/settings.njk +1 -1
  11. package/admin/pages/media/library.njk +52 -3
  12. package/admin/pages/navigation/menus.njk +2 -2
  13. package/admin/pages/plugins/screen.njk +5 -46
  14. package/admin/pages/settings/discussion.njk +76 -47
  15. package/admin/pages/settings/email.njk +75 -47
  16. package/admin/pages/settings/general.njk +15 -15
  17. package/admin/pages/settings/permalinks.njk +8 -8
  18. package/admin/pages/settings/privacy.njk +6 -6
  19. package/admin/pages/settings/reading.njk +36 -36
  20. package/admin/pages/tools/dev-mode.njk +29 -3
  21. package/admin/pages/tools/export.njk +89 -0
  22. package/admin/pages/tools/maintenance.njk +51 -0
  23. package/admin/pages/users/apps.njk +2 -2
  24. package/admin/pages/users/edit.njk +3 -3
  25. package/admin/pages/users/new.njk +2 -2
  26. package/admin/static/admin.css +80 -0
  27. package/dist/admin/app-activity.d.ts.map +1 -1
  28. package/dist/admin/app-activity.js +2 -3
  29. package/dist/admin/app-activity.js.map +1 -1
  30. package/dist/admin/appearance.d.ts +1 -5
  31. package/dist/admin/appearance.d.ts.map +1 -1
  32. package/dist/admin/appearance.js +9 -16
  33. package/dist/admin/appearance.js.map +1 -1
  34. package/dist/admin/comments.d.ts.map +1 -1
  35. package/dist/admin/comments.js +2 -3
  36. package/dist/admin/comments.js.map +1 -1
  37. package/dist/admin/confirm-password.d.ts +4 -0
  38. package/dist/admin/confirm-password.d.ts.map +1 -0
  39. package/dist/admin/confirm-password.js +11 -0
  40. package/dist/admin/confirm-password.js.map +1 -0
  41. package/dist/admin/connected-apps.d.ts.map +1 -1
  42. package/dist/admin/connected-apps.js +17 -22
  43. package/dist/admin/connected-apps.js.map +1 -1
  44. package/dist/admin/dev-mode.d.ts.map +1 -1
  45. package/dist/admin/dev-mode.js +35 -10
  46. package/dist/admin/dev-mode.js.map +1 -1
  47. package/dist/admin/documents.d.ts.map +1 -1
  48. package/dist/admin/documents.js +22 -10
  49. package/dist/admin/documents.js.map +1 -1
  50. package/dist/admin/editor-actions.d.ts.map +1 -1
  51. package/dist/admin/editor-actions.js +1 -2
  52. package/dist/admin/editor-actions.js.map +1 -1
  53. package/dist/admin/editor-layout.js +1 -1
  54. package/dist/admin/editor-layout.js.map +1 -1
  55. package/dist/admin/export.d.ts +10 -0
  56. package/dist/admin/export.d.ts.map +1 -0
  57. package/dist/admin/export.js +72 -0
  58. package/dist/admin/export.js.map +1 -0
  59. package/dist/admin/federation.d.ts +7 -14
  60. package/dist/admin/federation.d.ts.map +1 -1
  61. package/dist/admin/federation.js +48 -94
  62. package/dist/admin/federation.js.map +1 -1
  63. package/dist/admin/index.d.ts +2 -5
  64. package/dist/admin/index.d.ts.map +1 -1
  65. package/dist/admin/index.js +2 -4
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/indieauth-consent.d.ts.map +1 -1
  68. package/dist/admin/indieauth-consent.js +5 -7
  69. package/dist/admin/indieauth-consent.js.map +1 -1
  70. package/dist/admin/job-status.d.ts +25 -0
  71. package/dist/admin/job-status.d.ts.map +1 -0
  72. package/dist/admin/job-status.js +53 -0
  73. package/dist/admin/job-status.js.map +1 -0
  74. package/dist/admin/legacy-migrations.d.ts.map +1 -1
  75. package/dist/admin/legacy-migrations.js +7 -6
  76. package/dist/admin/legacy-migrations.js.map +1 -1
  77. package/dist/admin/maintenance.d.ts +9 -0
  78. package/dist/admin/maintenance.d.ts.map +1 -0
  79. package/dist/admin/maintenance.js +42 -0
  80. package/dist/admin/maintenance.js.map +1 -0
  81. package/dist/admin/media.d.ts +4 -1
  82. package/dist/admin/media.d.ts.map +1 -1
  83. package/dist/admin/media.js +16 -1
  84. package/dist/admin/media.js.map +1 -1
  85. package/dist/admin/menu.d.ts.map +1 -1
  86. package/dist/admin/menu.js +4 -0
  87. package/dist/admin/menu.js.map +1 -1
  88. package/dist/admin/messages.d.ts.map +1 -1
  89. package/dist/admin/messages.js +2 -3
  90. package/dist/admin/messages.js.map +1 -1
  91. package/dist/admin/navigation.d.ts.map +1 -1
  92. package/dist/admin/navigation.js +27 -23
  93. package/dist/admin/navigation.js.map +1 -1
  94. package/dist/admin/plugins.d.ts.map +1 -1
  95. package/dist/admin/plugins.js +19 -66
  96. package/dist/admin/plugins.js.map +1 -1
  97. package/dist/admin/preview.d.ts.map +1 -1
  98. package/dist/admin/preview.js +5 -6
  99. package/dist/admin/preview.js.map +1 -1
  100. package/dist/admin/recovery.js +2 -2
  101. package/dist/admin/recovery.js.map +1 -1
  102. package/dist/admin/routes.d.ts.map +1 -1
  103. package/dist/admin/routes.js +6 -3
  104. package/dist/admin/routes.js.map +1 -1
  105. package/dist/admin/setting-overrides.d.ts +4 -0
  106. package/dist/admin/setting-overrides.d.ts.map +1 -0
  107. package/dist/admin/setting-overrides.js +24 -0
  108. package/dist/admin/setting-overrides.js.map +1 -0
  109. package/dist/admin/settings-discussion.d.ts +6 -4
  110. package/dist/admin/settings-discussion.d.ts.map +1 -1
  111. package/dist/admin/settings-discussion.js +75 -45
  112. package/dist/admin/settings-discussion.js.map +1 -1
  113. package/dist/admin/settings-email.d.ts +11 -8
  114. package/dist/admin/settings-email.d.ts.map +1 -1
  115. package/dist/admin/settings-email.js +88 -77
  116. package/dist/admin/settings-email.js.map +1 -1
  117. package/dist/admin/settings-federation.d.ts +0 -7
  118. package/dist/admin/settings-federation.d.ts.map +1 -1
  119. package/dist/admin/settings-federation.js +0 -36
  120. package/dist/admin/settings-federation.js.map +1 -1
  121. package/dist/admin/settings-fields.d.ts +32 -0
  122. package/dist/admin/settings-fields.d.ts.map +1 -0
  123. package/dist/admin/settings-fields.js +368 -0
  124. package/dist/admin/settings-fields.js.map +1 -0
  125. package/dist/admin/settings-general.d.ts.map +1 -1
  126. package/dist/admin/settings-general.js +10 -19
  127. package/dist/admin/settings-general.js.map +1 -1
  128. package/dist/admin/settings-page.d.ts +3 -29
  129. package/dist/admin/settings-page.d.ts.map +1 -1
  130. package/dist/admin/settings-page.js +38 -53
  131. package/dist/admin/settings-page.js.map +1 -1
  132. package/dist/admin/settings-permalinks.js +2 -2
  133. package/dist/admin/settings-permalinks.js.map +1 -1
  134. package/dist/admin/settings-privacy.js +1 -1
  135. package/dist/admin/settings-privacy.js.map +1 -1
  136. package/dist/admin/settings-reading.js +13 -13
  137. package/dist/admin/settings-reading.js.map +1 -1
  138. package/dist/admin/settings-renderer.d.ts +32 -0
  139. package/dist/admin/settings-renderer.d.ts.map +1 -0
  140. package/dist/admin/settings-renderer.js +79 -0
  141. package/dist/admin/settings-renderer.js.map +1 -0
  142. package/dist/admin/site-setting-edit.d.ts +4 -0
  143. package/dist/admin/site-setting-edit.d.ts.map +1 -0
  144. package/dist/admin/site-setting-edit.js +20 -0
  145. package/dist/admin/site-setting-edit.js.map +1 -0
  146. package/dist/admin/taxonomy.d.ts.map +1 -1
  147. package/dist/admin/taxonomy.js +10 -19
  148. package/dist/admin/taxonomy.js.map +1 -1
  149. package/dist/admin/templates.d.ts +2 -0
  150. package/dist/admin/templates.d.ts.map +1 -1
  151. package/dist/admin/templates.js +2 -0
  152. package/dist/admin/templates.js.map +1 -1
  153. package/dist/admin/users.js +1 -1
  154. package/dist/admin/users.js.map +1 -1
  155. package/dist/avatars/avatars.d.ts +0 -2
  156. package/dist/avatars/avatars.d.ts.map +1 -1
  157. package/dist/avatars/avatars.js +9 -10
  158. package/dist/avatars/avatars.js.map +1 -1
  159. package/dist/avatars/index.d.ts +1 -1
  160. package/dist/avatars/index.d.ts.map +1 -1
  161. package/dist/avatars/index.js +1 -1
  162. package/dist/avatars/index.js.map +1 -1
  163. package/dist/cache.d.ts +0 -2
  164. package/dist/cache.d.ts.map +1 -1
  165. package/dist/cache.js +2 -4
  166. package/dist/cache.js.map +1 -1
  167. package/dist/cli.d.ts +1 -1
  168. package/dist/cli.d.ts.map +1 -1
  169. package/dist/cli.js +500 -86
  170. package/dist/cli.js.map +1 -1
  171. package/dist/cms/app.d.ts +1 -1
  172. package/dist/cms/app.d.ts.map +1 -1
  173. package/dist/cms/app.js +13 -2
  174. package/dist/cms/app.js.map +1 -1
  175. package/dist/cms/boot.d.ts +12 -0
  176. package/dist/cms/boot.d.ts.map +1 -1
  177. package/dist/cms/boot.js +43 -17
  178. package/dist/cms/boot.js.map +1 -1
  179. package/dist/cms/create.d.ts +24 -0
  180. package/dist/cms/create.d.ts.map +1 -1
  181. package/dist/cms/create.js +14 -0
  182. package/dist/cms/create.js.map +1 -1
  183. package/dist/cms/services.d.ts +3 -1
  184. package/dist/cms/services.d.ts.map +1 -1
  185. package/dist/cms/services.js +83 -26
  186. package/dist/cms/services.js.map +1 -1
  187. package/dist/cms/site-records.d.ts.map +1 -1
  188. package/dist/cms/site-records.js +0 -2
  189. package/dist/cms/site-records.js.map +1 -1
  190. package/dist/comments/akismet.d.ts +13 -46
  191. package/dist/comments/akismet.d.ts.map +1 -1
  192. package/dist/comments/akismet.js +29 -68
  193. package/dist/comments/akismet.js.map +1 -1
  194. package/dist/comments/conversation.d.ts +14 -8
  195. package/dist/comments/conversation.d.ts.map +1 -1
  196. package/dist/comments/conversation.js.map +1 -1
  197. package/dist/comments/index.d.ts +4 -4
  198. package/dist/comments/index.d.ts.map +1 -1
  199. package/dist/comments/index.js +3 -3
  200. package/dist/comments/index.js.map +1 -1
  201. package/dist/comments/policy.d.ts +23 -26
  202. package/dist/comments/policy.d.ts.map +1 -1
  203. package/dist/comments/policy.js +13 -20
  204. package/dist/comments/policy.js.map +1 -1
  205. package/dist/comments/records.d.ts +0 -2
  206. package/dist/comments/records.d.ts.map +1 -1
  207. package/dist/comments/records.js +2 -3
  208. package/dist/comments/records.js.map +1 -1
  209. package/dist/comments/reply-notices.d.ts +5 -6
  210. package/dist/comments/reply-notices.d.ts.map +1 -1
  211. package/dist/comments/reply-notices.js +27 -15
  212. package/dist/comments/reply-notices.js.map +1 -1
  213. package/dist/comments/reply-post.d.ts.map +1 -1
  214. package/dist/comments/reply-post.js +2 -3
  215. package/dist/comments/reply-post.js.map +1 -1
  216. package/dist/comments/submission.d.ts +0 -2
  217. package/dist/comments/submission.d.ts.map +1 -1
  218. package/dist/comments/submission.js +1 -3
  219. package/dist/comments/submission.js.map +1 -1
  220. package/dist/config-loader.d.ts.map +1 -1
  221. package/dist/config-loader.js +2 -1
  222. package/dist/config-loader.js.map +1 -1
  223. package/dist/config.d.ts +27 -1
  224. package/dist/config.d.ts.map +1 -1
  225. package/dist/config.js +5 -1
  226. package/dist/config.js.map +1 -1
  227. package/dist/contact/delivery.d.ts +2 -4
  228. package/dist/contact/delivery.d.ts.map +1 -1
  229. package/dist/contact/delivery.js +1 -2
  230. package/dist/contact/delivery.js.map +1 -1
  231. package/dist/contact/index.d.ts +1 -1
  232. package/dist/contact/index.d.ts.map +1 -1
  233. package/dist/contact/index.js +1 -1
  234. package/dist/contact/index.js.map +1 -1
  235. package/dist/contact/records.d.ts +0 -2
  236. package/dist/contact/records.d.ts.map +1 -1
  237. package/dist/contact/records.js +3 -5
  238. package/dist/contact/records.js.map +1 -1
  239. package/dist/content/citation.d.ts +1 -0
  240. package/dist/content/citation.d.ts.map +1 -1
  241. package/dist/content/citation.js.map +1 -1
  242. package/dist/content/document-form.d.ts +3 -1
  243. package/dist/content/document-form.d.ts.map +1 -1
  244. package/dist/content/document-form.js.map +1 -1
  245. package/dist/content/enclosure-form.d.ts.map +1 -1
  246. package/dist/content/enclosure-form.js +5 -6
  247. package/dist/content/enclosure-form.js.map +1 -1
  248. package/dist/content/excerpt.d.ts +1 -0
  249. package/dist/content/excerpt.d.ts.map +1 -1
  250. package/dist/content/excerpt.js +3 -0
  251. package/dist/content/excerpt.js.map +1 -1
  252. package/dist/content/index.d.ts +3 -3
  253. package/dist/content/index.d.ts.map +1 -1
  254. package/dist/content/index.js +2 -2
  255. package/dist/content/index.js.map +1 -1
  256. package/dist/content/kept-properties.d.ts +0 -1
  257. package/dist/content/kept-properties.d.ts.map +1 -1
  258. package/dist/content/kept-properties.js +2 -2
  259. package/dist/content/kept-properties.js.map +1 -1
  260. package/dist/content/locations.d.ts +0 -1
  261. package/dist/content/locations.d.ts.map +1 -1
  262. package/dist/content/locations.js +2 -2
  263. package/dist/content/locations.js.map +1 -1
  264. package/dist/content/media.d.ts +7 -0
  265. package/dist/content/media.d.ts.map +1 -1
  266. package/dist/content/media.js +12 -1
  267. package/dist/content/media.js.map +1 -1
  268. package/dist/content/metadata/strip-job.d.ts +16 -0
  269. package/dist/content/metadata/strip-job.d.ts.map +1 -0
  270. package/dist/content/metadata/strip-job.js +24 -0
  271. package/dist/content/metadata/strip-job.js.map +1 -0
  272. package/dist/content/metadata/sweep.d.ts +13 -1
  273. package/dist/content/metadata/sweep.d.ts.map +1 -1
  274. package/dist/content/metadata/sweep.js +47 -25
  275. package/dist/content/metadata/sweep.js.map +1 -1
  276. package/dist/content/permalink-file.d.ts +2 -1
  277. package/dist/content/permalink-file.d.ts.map +1 -1
  278. package/dist/content/permalink-file.js +3 -3
  279. package/dist/content/permalink-file.js.map +1 -1
  280. package/dist/content/photo-form.d.ts +1 -0
  281. package/dist/content/photo-form.d.ts.map +1 -1
  282. package/dist/content/photo-form.js +8 -5
  283. package/dist/content/photo-form.js.map +1 -1
  284. package/dist/content/photo.d.ts +1 -0
  285. package/dist/content/photo.d.ts.map +1 -1
  286. package/dist/content/photo.js +1 -1
  287. package/dist/content/photo.js.map +1 -1
  288. package/dist/content/post-fields.d.ts.map +1 -1
  289. package/dist/content/post-fields.js +5 -9
  290. package/dist/content/post-fields.js.map +1 -1
  291. package/dist/content/read-form.d.ts +10 -3
  292. package/dist/content/read-form.d.ts.map +1 -1
  293. package/dist/content/read-form.js +67 -9
  294. package/dist/content/read-form.js.map +1 -1
  295. package/dist/content/read.d.ts +9 -2
  296. package/dist/content/read.d.ts.map +1 -1
  297. package/dist/content/read.js +22 -3
  298. package/dist/content/read.js.map +1 -1
  299. package/dist/content/store.d.ts +0 -1
  300. package/dist/content/store.d.ts.map +1 -1
  301. package/dist/content/store.js +0 -1
  302. package/dist/content/store.js.map +1 -1
  303. package/dist/content/uploads.d.ts +1 -1
  304. package/dist/content/uploads.d.ts.map +1 -1
  305. package/dist/content/uploads.js +6 -1
  306. package/dist/content/uploads.js.map +1 -1
  307. package/dist/content/write.d.ts +1 -1
  308. package/dist/content/write.d.ts.map +1 -1
  309. package/dist/content/write.js +7 -3
  310. package/dist/content/write.js.map +1 -1
  311. package/dist/dev-mode.d.ts +4 -26
  312. package/dist/dev-mode.d.ts.map +1 -1
  313. package/dist/dev-mode.js +4 -53
  314. package/dist/dev-mode.js.map +1 -1
  315. package/dist/export/export-archives.d.ts +29 -0
  316. package/dist/export/export-archives.d.ts.map +1 -0
  317. package/dist/export/export-archives.js +88 -0
  318. package/dist/export/export-archives.js.map +1 -0
  319. package/dist/export/export-job.d.ts +21 -0
  320. package/dist/export/export-job.d.ts.map +1 -0
  321. package/dist/export/export-job.js +63 -0
  322. package/dist/export/export-job.js.map +1 -0
  323. package/dist/export/site-export.d.ts +101 -0
  324. package/dist/export/site-export.d.ts.map +1 -0
  325. package/dist/export/site-export.js +243 -0
  326. package/dist/export/site-export.js.map +1 -0
  327. package/dist/export/site-import.d.ts +75 -0
  328. package/dist/export/site-import.d.ts.map +1 -0
  329. package/dist/export/site-import.js +492 -0
  330. package/dist/export/site-import.js.map +1 -0
  331. package/dist/exports.d.ts +9 -4
  332. package/dist/exports.d.ts.map +1 -1
  333. package/dist/exports.js +3 -1
  334. package/dist/exports.js.map +1 -1
  335. package/dist/federation/article.d.ts +5 -11
  336. package/dist/federation/article.d.ts.map +1 -1
  337. package/dist/federation/article.js +67 -35
  338. package/dist/federation/article.js.map +1 -1
  339. package/dist/federation/backfill.d.ts +3 -1
  340. package/dist/federation/backfill.d.ts.map +1 -1
  341. package/dist/federation/backfill.js +5 -3
  342. package/dist/federation/backfill.js.map +1 -1
  343. package/dist/federation/cited-post.d.ts +1 -1
  344. package/dist/federation/cited-post.d.ts.map +1 -1
  345. package/dist/federation/cited-post.js +1 -1
  346. package/dist/federation/cited-post.js.map +1 -1
  347. package/dist/federation/delivery.d.ts +5 -2
  348. package/dist/federation/delivery.d.ts.map +1 -1
  349. package/dist/federation/delivery.js +30 -14
  350. package/dist/federation/delivery.js.map +1 -1
  351. package/dist/federation/federation.d.ts +7 -7
  352. package/dist/federation/federation.d.ts.map +1 -1
  353. package/dist/federation/federation.js +6 -13
  354. package/dist/federation/federation.js.map +1 -1
  355. package/dist/federation/handles.d.ts +1 -1
  356. package/dist/federation/handles.d.ts.map +1 -1
  357. package/dist/federation/handles.js +1 -1
  358. package/dist/federation/handles.js.map +1 -1
  359. package/dist/federation/inbox.d.ts.map +1 -1
  360. package/dist/federation/inbox.js +5 -8
  361. package/dist/federation/inbox.js.map +1 -1
  362. package/dist/federation/index.d.ts +1 -0
  363. package/dist/federation/index.d.ts.map +1 -1
  364. package/dist/federation/index.js +1 -0
  365. package/dist/federation/index.js.map +1 -1
  366. package/dist/federation/keys.js +3 -3
  367. package/dist/federation/keys.js.map +1 -1
  368. package/dist/federation/object-ids.d.ts +50 -0
  369. package/dist/federation/object-ids.d.ts.map +1 -0
  370. package/dist/federation/object-ids.js +134 -0
  371. package/dist/federation/object-ids.js.map +1 -0
  372. package/dist/federation/profiles.d.ts +1 -1
  373. package/dist/federation/profiles.d.ts.map +1 -1
  374. package/dist/federation/profiles.js +1 -1
  375. package/dist/federation/profiles.js.map +1 -1
  376. package/dist/federation/queue.d.ts +32 -17
  377. package/dist/federation/queue.d.ts.map +1 -1
  378. package/dist/federation/queue.js +173 -39
  379. package/dist/federation/queue.js.map +1 -1
  380. package/dist/federation/relays.d.ts +6 -2
  381. package/dist/federation/relays.d.ts.map +1 -1
  382. package/dist/federation/relays.js +43 -36
  383. package/dist/federation/relays.js.map +1 -1
  384. package/dist/federation/resend-job.d.ts +44 -0
  385. package/dist/federation/resend-job.d.ts.map +1 -0
  386. package/dist/federation/resend-job.js +59 -0
  387. package/dist/federation/resend-job.js.map +1 -0
  388. package/dist/files/atomic.d.ts +9 -0
  389. package/dist/files/atomic.d.ts.map +1 -1
  390. package/dist/files/atomic.js +1 -1
  391. package/dist/files/atomic.js.map +1 -1
  392. package/dist/files/data-files.d.ts +104 -0
  393. package/dist/files/data-files.d.ts.map +1 -0
  394. package/dist/files/data-files.js +330 -0
  395. package/dist/files/data-files.js.map +1 -0
  396. package/dist/files/export-archives.d.ts +12 -0
  397. package/dist/files/export-archives.d.ts.map +1 -0
  398. package/dist/files/export-archives.js +67 -0
  399. package/dist/files/export-archives.js.map +1 -0
  400. package/dist/files/static-files.d.ts.map +1 -1
  401. package/dist/files/static-files.js +7 -22
  402. package/dist/files/static-files.js.map +1 -1
  403. package/dist/files/tar.d.ts +29 -0
  404. package/dist/files/tar.d.ts.map +1 -0
  405. package/dist/files/tar.js +206 -0
  406. package/dist/files/tar.js.map +1 -0
  407. package/dist/files/upload-types.d.ts +81 -0
  408. package/dist/files/upload-types.d.ts.map +1 -0
  409. package/dist/files/upload-types.js +234 -0
  410. package/dist/files/upload-types.js.map +1 -0
  411. package/dist/forms/protection.d.ts +0 -8
  412. package/dist/forms/protection.d.ts.map +1 -1
  413. package/dist/forms/protection.js +2 -10
  414. package/dist/forms/protection.js.map +1 -1
  415. package/dist/images/icons.d.ts.map +1 -1
  416. package/dist/images/icons.js +2 -0
  417. package/dist/images/icons.js.map +1 -1
  418. package/dist/images/index.d.ts +1 -1
  419. package/dist/images/index.d.ts.map +1 -1
  420. package/dist/images/index.js +1 -1
  421. package/dist/images/index.js.map +1 -1
  422. package/dist/images/markup.d.ts +4 -1
  423. package/dist/images/markup.d.ts.map +1 -1
  424. package/dist/images/markup.js +10 -6
  425. package/dist/images/markup.js.map +1 -1
  426. package/dist/images/paths.d.ts +1 -4
  427. package/dist/images/paths.d.ts.map +1 -1
  428. package/dist/images/paths.js +6 -12
  429. package/dist/images/paths.js.map +1 -1
  430. package/dist/images/variants.d.ts +4 -2
  431. package/dist/images/variants.d.ts.map +1 -1
  432. package/dist/images/variants.js +21 -21
  433. package/dist/images/variants.js.map +1 -1
  434. package/dist/index.d.ts +1 -0
  435. package/dist/index.d.ts.map +1 -1
  436. package/dist/index.js +1 -0
  437. package/dist/index.js.map +1 -1
  438. package/dist/indexnow.d.ts +4 -2
  439. package/dist/indexnow.d.ts.map +1 -1
  440. package/dist/indexnow.js +32 -20
  441. package/dist/indexnow.js.map +1 -1
  442. package/dist/indieauth/tokens.d.ts +0 -2
  443. package/dist/indieauth/tokens.d.ts.map +1 -1
  444. package/dist/indieauth/tokens.js +2 -4
  445. package/dist/indieauth/tokens.js.map +1 -1
  446. package/dist/jobs/file-records.d.ts +13 -0
  447. package/dist/jobs/file-records.d.ts.map +1 -0
  448. package/dist/jobs/file-records.js +104 -0
  449. package/dist/jobs/file-records.js.map +1 -0
  450. package/dist/jobs/in-process.d.ts +10 -0
  451. package/dist/jobs/in-process.d.ts.map +1 -0
  452. package/dist/jobs/in-process.js +45 -0
  453. package/dist/jobs/in-process.js.map +1 -0
  454. package/dist/jobs/lock-file.d.ts +13 -0
  455. package/dist/jobs/lock-file.d.ts.map +1 -0
  456. package/dist/jobs/lock-file.js +107 -0
  457. package/dist/jobs/lock-file.js.map +1 -0
  458. package/dist/jobs/processes.d.ts +11 -0
  459. package/dist/jobs/processes.d.ts.map +1 -0
  460. package/dist/jobs/processes.js +50 -0
  461. package/dist/jobs/processes.js.map +1 -0
  462. package/dist/jobs/queue.d.ts +18 -0
  463. package/dist/jobs/queue.d.ts.map +1 -0
  464. package/dist/jobs/queue.js +220 -0
  465. package/dist/jobs/queue.js.map +1 -0
  466. package/dist/jobs/types.d.ts +159 -0
  467. package/dist/jobs/types.d.ts.map +1 -0
  468. package/dist/jobs/types.js +22 -0
  469. package/dist/jobs/types.js.map +1 -0
  470. package/dist/mail/index.d.ts +0 -2
  471. package/dist/mail/index.d.ts.map +1 -1
  472. package/dist/mail/index.js +0 -1
  473. package/dist/mail/index.js.map +1 -1
  474. package/dist/maintenance.d.ts +5 -42
  475. package/dist/maintenance.d.ts.map +1 -1
  476. package/dist/maintenance.js +4 -67
  477. package/dist/maintenance.js.map +1 -1
  478. package/dist/media/library.d.ts +1 -1
  479. package/dist/media/library.d.ts.map +1 -1
  480. package/dist/media/library.js +4 -1
  481. package/dist/media/library.js.map +1 -1
  482. package/dist/media/uploads.d.ts +1 -1
  483. package/dist/media/uploads.d.ts.map +1 -1
  484. package/dist/media/uploads.js +1 -1
  485. package/dist/media/uploads.js.map +1 -1
  486. package/dist/micropub/endpoint.js +10 -10
  487. package/dist/micropub/endpoint.js.map +1 -1
  488. package/dist/micropub/media.d.ts +0 -2
  489. package/dist/micropub/media.d.ts.map +1 -1
  490. package/dist/micropub/media.js +5 -7
  491. package/dist/micropub/media.js.map +1 -1
  492. package/dist/notifications/comments.d.ts +4 -2
  493. package/dist/notifications/comments.d.ts.map +1 -1
  494. package/dist/notifications/comments.js +77 -65
  495. package/dist/notifications/comments.js.map +1 -1
  496. package/dist/notifications/digest.d.ts +2 -4
  497. package/dist/notifications/digest.d.ts.map +1 -1
  498. package/dist/notifications/digest.js +9 -10
  499. package/dist/notifications/digest.js.map +1 -1
  500. package/dist/notifications/index.d.ts +3 -3
  501. package/dist/notifications/index.d.ts.map +1 -1
  502. package/dist/notifications/index.js +3 -3
  503. package/dist/notifications/index.js.map +1 -1
  504. package/dist/notifications/mail-service.d.ts +10 -8
  505. package/dist/notifications/mail-service.d.ts.map +1 -1
  506. package/dist/notifications/mail-service.js +70 -70
  507. package/dist/notifications/mail-service.js.map +1 -1
  508. package/dist/notifications/optouts.d.ts +0 -2
  509. package/dist/notifications/optouts.d.ts.map +1 -1
  510. package/dist/notifications/optouts.js +2 -4
  511. package/dist/notifications/optouts.js.map +1 -1
  512. package/dist/notifications/tokens.d.ts +0 -2
  513. package/dist/notifications/tokens.d.ts.map +1 -1
  514. package/dist/notifications/tokens.js +2 -28
  515. package/dist/notifications/tokens.js.map +1 -1
  516. package/dist/notify.d.ts +4 -2
  517. package/dist/notify.d.ts.map +1 -1
  518. package/dist/notify.js +27 -15
  519. package/dist/notify.js.map +1 -1
  520. package/dist/plugin.d.ts +36 -16
  521. package/dist/plugin.d.ts.map +1 -1
  522. package/dist/plugin.js +1 -1
  523. package/dist/plugin.js.map +1 -1
  524. package/dist/plugins/changes.d.ts +0 -1
  525. package/dist/plugins/changes.d.ts.map +1 -1
  526. package/dist/plugins/changes.js +2 -3
  527. package/dist/plugins/changes.js.map +1 -1
  528. package/dist/plugins/data.d.ts +19 -0
  529. package/dist/plugins/data.d.ts.map +1 -0
  530. package/dist/plugins/data.js +117 -0
  531. package/dist/plugins/data.js.map +1 -0
  532. package/dist/plugins/enabled.d.ts +1 -13
  533. package/dist/plugins/enabled.d.ts.map +1 -1
  534. package/dist/plugins/enabled.js +11 -23
  535. package/dist/plugins/enabled.js.map +1 -1
  536. package/dist/plugins/install.d.ts +1 -1
  537. package/dist/plugins/install.d.ts.map +1 -1
  538. package/dist/plugins/install.js +7 -42
  539. package/dist/plugins/install.js.map +1 -1
  540. package/dist/plugins/migrate-settings.d.ts +7 -0
  541. package/dist/plugins/migrate-settings.d.ts.map +1 -0
  542. package/dist/plugins/migrate-settings.js +41 -0
  543. package/dist/plugins/migrate-settings.js.map +1 -0
  544. package/dist/plugins/registry.d.ts +10 -14
  545. package/dist/plugins/registry.d.ts.map +1 -1
  546. package/dist/plugins/registry.js +56 -36
  547. package/dist/plugins/registry.js.map +1 -1
  548. package/dist/plugins/settings.d.ts +5 -57
  549. package/dist/plugins/settings.d.ts.map +1 -1
  550. package/dist/plugins/settings.js +47 -180
  551. package/dist/plugins/settings.js.map +1 -1
  552. package/dist/plugins/site.d.ts +2 -1
  553. package/dist/plugins/site.d.ts.map +1 -1
  554. package/dist/plugins/site.js +5 -5
  555. package/dist/plugins/site.js.map +1 -1
  556. package/dist/privacy/retention.d.ts +4 -0
  557. package/dist/privacy/retention.d.ts.map +1 -1
  558. package/dist/privacy/retention.js +12 -5
  559. package/dist/privacy/retention.js.map +1 -1
  560. package/dist/settings/akismet.d.ts +9 -0
  561. package/dist/settings/akismet.d.ts.map +1 -0
  562. package/dist/settings/akismet.js +46 -0
  563. package/dist/settings/akismet.js.map +1 -0
  564. package/dist/settings/declare.d.ts +15 -0
  565. package/dist/settings/declare.d.ts.map +1 -0
  566. package/dist/settings/declare.js +20 -0
  567. package/dist/settings/declare.js.map +1 -0
  568. package/dist/settings/dev-mode.d.ts +29 -0
  569. package/dist/settings/dev-mode.d.ts.map +1 -0
  570. package/dist/settings/dev-mode.js +77 -0
  571. package/dist/settings/dev-mode.js.map +1 -0
  572. package/dist/settings/kinds.d.ts +13 -0
  573. package/dist/settings/kinds.d.ts.map +1 -0
  574. package/dist/settings/kinds.js +108 -0
  575. package/dist/settings/kinds.js.map +1 -0
  576. package/dist/settings/mail.d.ts +10 -0
  577. package/dist/settings/mail.d.ts.map +1 -0
  578. package/dist/settings/mail.js +92 -0
  579. package/dist/settings/mail.js.map +1 -0
  580. package/dist/settings/maintenance.d.ts +6 -0
  581. package/dist/settings/maintenance.d.ts.map +1 -0
  582. package/dist/settings/maintenance.js +33 -0
  583. package/dist/settings/maintenance.js.map +1 -0
  584. package/dist/settings/names.d.ts +7 -0
  585. package/dist/settings/names.d.ts.map +1 -0
  586. package/dist/settings/names.js +31 -0
  587. package/dist/settings/names.js.map +1 -0
  588. package/dist/settings/presence.d.ts +2 -0
  589. package/dist/settings/presence.d.ts.map +1 -0
  590. package/dist/settings/presence.js +7 -0
  591. package/dist/settings/presence.js.map +1 -0
  592. package/dist/settings/registry.d.ts +14 -0
  593. package/dist/settings/registry.d.ts.map +1 -0
  594. package/dist/settings/registry.js +369 -0
  595. package/dist/settings/registry.js.map +1 -0
  596. package/dist/settings/types.d.ts +176 -0
  597. package/dist/settings/types.d.ts.map +1 -0
  598. package/dist/settings/types.js +2 -0
  599. package/dist/settings/types.js.map +1 -0
  600. package/dist/site/namespace.d.ts +88 -0
  601. package/dist/site/namespace.d.ts.map +1 -0
  602. package/dist/site/namespace.js +471 -0
  603. package/dist/site/namespace.js.map +1 -0
  604. package/dist/site/setting-rows.d.ts +9 -10
  605. package/dist/site/setting-rows.d.ts.map +1 -1
  606. package/dist/site/setting-rows.js +109 -228
  607. package/dist/site/setting-rows.js.map +1 -1
  608. package/dist/site/settings-form.d.ts.map +1 -1
  609. package/dist/site/settings-form.js +6 -10
  610. package/dist/site/settings-form.js.map +1 -1
  611. package/dist/site/settings.d.ts +6 -322
  612. package/dist/site/settings.d.ts.map +1 -1
  613. package/dist/site/settings.js +13 -76
  614. package/dist/site/settings.js.map +1 -1
  615. package/dist/site/site-json.d.ts +0 -31
  616. package/dist/site/site-json.d.ts.map +1 -1
  617. package/dist/site/site-json.js +5 -49
  618. package/dist/site/site-json.js.map +1 -1
  619. package/dist/site/users.d.ts +0 -9
  620. package/dist/site/users.d.ts.map +1 -1
  621. package/dist/site/users.js +2 -11
  622. package/dist/site/users.js.map +1 -1
  623. package/dist/store/deliveries.d.ts +2 -0
  624. package/dist/store/deliveries.d.ts.map +1 -1
  625. package/dist/store/deliveries.js +7 -0
  626. package/dist/store/deliveries.js.map +1 -1
  627. package/dist/store/queue-database.d.ts +11 -0
  628. package/dist/store/queue-database.d.ts.map +1 -0
  629. package/dist/store/queue-database.js +39 -0
  630. package/dist/store/queue-database.js.map +1 -0
  631. package/dist/supervisor/control.d.ts +1 -0
  632. package/dist/supervisor/control.d.ts.map +1 -1
  633. package/dist/supervisor/control.js +10 -0
  634. package/dist/supervisor/control.js.map +1 -1
  635. package/dist/supervisor/primary.d.ts.map +1 -1
  636. package/dist/supervisor/primary.js +15 -3
  637. package/dist/supervisor/primary.js.map +1 -1
  638. package/dist/testing.d.ts +1 -1
  639. package/dist/testing.d.ts.map +1 -1
  640. package/dist/testing.js +1 -1
  641. package/dist/testing.js.map +1 -1
  642. package/dist/theme/site-data.d.ts +1 -1
  643. package/dist/theme/site-data.d.ts.map +1 -1
  644. package/dist/theme/site-data.js.map +1 -1
  645. package/dist/web/asset-routes.d.ts +6 -2
  646. package/dist/web/asset-routes.d.ts.map +1 -1
  647. package/dist/web/asset-routes.js +12 -4
  648. package/dist/web/asset-routes.js.map +1 -1
  649. package/dist/web/comment-routes.d.ts.map +1 -1
  650. package/dist/web/comment-routes.js +4 -4
  651. package/dist/web/comment-routes.js.map +1 -1
  652. package/dist/web/contact-routes.js +1 -1
  653. package/dist/web/contact-routes.js.map +1 -1
  654. package/dist/web/context.d.ts +5 -0
  655. package/dist/web/context.d.ts.map +1 -1
  656. package/dist/web/context.js +9 -4
  657. package/dist/web/context.js.map +1 -1
  658. package/dist/web/conversation.d.ts +1 -1
  659. package/dist/web/conversation.d.ts.map +1 -1
  660. package/dist/web/conversation.js +59 -43
  661. package/dist/web/conversation.js.map +1 -1
  662. package/dist/web/document-page.d.ts.map +1 -1
  663. package/dist/web/document-page.js +5 -4
  664. package/dist/web/document-page.js.map +1 -1
  665. package/dist/web/document-site.d.ts +1 -1
  666. package/dist/web/document-site.d.ts.map +1 -1
  667. package/dist/web/document-site.js +2 -1
  668. package/dist/web/document-site.js.map +1 -1
  669. package/dist/web/embed.js +1 -1
  670. package/dist/web/embed.js.map +1 -1
  671. package/dist/web/env.d.ts +9 -0
  672. package/dist/web/env.d.ts.map +1 -1
  673. package/dist/web/federation-routes.d.ts.map +1 -1
  674. package/dist/web/federation-routes.js +5 -2
  675. package/dist/web/federation-routes.js.map +1 -1
  676. package/dist/web/feed-item.js +1 -1
  677. package/dist/web/feed-item.js.map +1 -1
  678. package/dist/web/feed-routes.d.ts +3 -4
  679. package/dist/web/feed-routes.d.ts.map +1 -1
  680. package/dist/web/feed-routes.js +17 -15
  681. package/dist/web/feed-routes.js.map +1 -1
  682. package/dist/web/health.js +1 -1
  683. package/dist/web/health.js.map +1 -1
  684. package/dist/web/index.d.ts +1 -1
  685. package/dist/web/index.d.ts.map +1 -1
  686. package/dist/web/index.js.map +1 -1
  687. package/dist/web/indieauth-activity-log.d.ts +0 -2
  688. package/dist/web/indieauth-activity-log.d.ts.map +1 -1
  689. package/dist/web/indieauth-activity-log.js +2 -4
  690. package/dist/web/indieauth-activity-log.js.map +1 -1
  691. package/dist/web/indieauth-bearer.js +2 -2
  692. package/dist/web/indieauth-bearer.js.map +1 -1
  693. package/dist/web/indieauth-discovery.d.ts +0 -4
  694. package/dist/web/indieauth-discovery.d.ts.map +1 -1
  695. package/dist/web/indieauth-discovery.js +3 -10
  696. package/dist/web/indieauth-discovery.js.map +1 -1
  697. package/dist/web/indieauth-token.d.ts.map +1 -1
  698. package/dist/web/indieauth-token.js +3 -3
  699. package/dist/web/indieauth-token.js.map +1 -1
  700. package/dist/web/listing-pages.d.ts.map +1 -1
  701. package/dist/web/listing-pages.js +1 -2
  702. package/dist/web/listing-pages.js.map +1 -1
  703. package/dist/web/maintenance.js +3 -3
  704. package/dist/web/maintenance.js.map +1 -1
  705. package/dist/web/page-sources.d.ts +1 -2
  706. package/dist/web/page-sources.d.ts.map +1 -1
  707. package/dist/web/page-sources.js +6 -7
  708. package/dist/web/page-sources.js.map +1 -1
  709. package/dist/web/paths.js +1 -1
  710. package/dist/web/paths.js.map +1 -1
  711. package/dist/web/pingback-routes.d.ts.map +1 -1
  712. package/dist/web/pingback-routes.js +3 -3
  713. package/dist/web/pingback-routes.js.map +1 -1
  714. package/dist/web/plugin-federation.js +50 -40
  715. package/dist/web/plugin-federation.js.map +1 -1
  716. package/dist/web/render.d.ts +12 -5
  717. package/dist/web/render.d.ts.map +1 -1
  718. package/dist/web/render.js +36 -22
  719. package/dist/web/render.js.map +1 -1
  720. package/dist/web/request.js +1 -1
  721. package/dist/web/request.js.map +1 -1
  722. package/dist/web/routes.d.ts.map +1 -1
  723. package/dist/web/routes.js +8 -9
  724. package/dist/web/routes.js.map +1 -1
  725. package/dist/web/site-index.d.ts.map +1 -1
  726. package/dist/web/site-index.js +1 -2
  727. package/dist/web/site-index.js.map +1 -1
  728. package/dist/web/site-view.d.ts +0 -2
  729. package/dist/web/site-view.d.ts.map +1 -1
  730. package/dist/web/site-view.js +0 -2
  731. package/dist/web/site-view.js.map +1 -1
  732. package/dist/web/webmention-routes.d.ts.map +1 -1
  733. package/dist/web/webmention-routes.js +2 -2
  734. package/dist/web/webmention-routes.js.map +1 -1
  735. package/dist/web/well-known.d.ts.map +1 -1
  736. package/dist/web/well-known.js +6 -7
  737. package/dist/web/well-known.js.map +1 -1
  738. package/dist/webmention/cited-picture.js +1 -1
  739. package/dist/webmention/cited-picture.js.map +1 -1
  740. package/dist/webmention/pingback.d.ts +1 -8
  741. package/dist/webmention/pingback.d.ts.map +1 -1
  742. package/dist/webmention/pingback.js +2 -11
  743. package/dist/webmention/pingback.js.map +1 -1
  744. package/dist/webmention/receive.d.ts +3 -1
  745. package/dist/webmention/receive.d.ts.map +1 -1
  746. package/dist/webmention/receive.js +5 -3
  747. package/dist/webmention/receive.js.map +1 -1
  748. package/dist/webmention/reply-contexts.d.ts +14 -3
  749. package/dist/webmention/reply-contexts.d.ts.map +1 -1
  750. package/dist/webmention/reply-contexts.js +12 -10
  751. package/dist/webmention/reply-contexts.js.map +1 -1
  752. package/dist/webmention/service.d.ts +3 -1
  753. package/dist/webmention/service.d.ts.map +1 -1
  754. package/dist/webmention/service.js +66 -53
  755. package/dist/webmention/service.js.map +1 -1
  756. package/package.json +13 -11
  757. package/themes/default/partials/post-list.njk +19 -14
  758. package/themes/default/src/style.css +12 -0
  759. package/themes/default/static/style.css +19 -0
@@ -49,7 +49,7 @@
49
49
  types you want on it.
50
50
  {% endset %}
51
51
  {{ field.textarea('menu-' + menu.name, fields.items, 'Items', menu.items,
52
- error=menu.problem, hint=itemsHint, rows='5', spellcheck='false') }}
52
+ error=menu.problem, hintHtml=itemsHint, rows='5', spellcheck='false') }}
53
53
  <div class="mt-2">{{ button('Save menu', type='submit', color='primary') }}</div>
54
54
  </form>
55
55
 
@@ -134,7 +134,7 @@
134
134
  theme that will use it.
135
135
  {% endset %}
136
136
  {{ field.text('menu-name', fields.name, 'Name', newName,
137
- error=nameProblem, hint=nameHint, spellcheck='false', required=true) }}
137
+ error=nameProblem, hintHtml=nameHint, spellcheck='false', required=true) }}
138
138
  <div class="mt-2">{{ button('Add menu', type='submit', color='primary') }}</div>
139
139
  </form>
140
140
  {% endcall %}
@@ -1,14 +1,9 @@
1
1
  {# /admin/plugins/<package name>: a plugin's own screen (decision-33). The
2
2
  plugin hands over cards of paragraphs and tables as data and this draws
3
- them, so a plugin writes no markup and everything it says is escaped.
4
-
5
- A plugin with settings gets a form here too (TASK-283). A label or hint
6
- from a plugin is escaped before the field macros, which print theirs as
7
- markup. A secret is never printed: the form says whether it is set and
8
- where, and names the environment variable that would set it. #}
3
+ them, so a plugin writes no markup and everything it says is escaped. #}
9
4
  {% extends "layouts/shell.njk" %}
10
5
  {% import "components/fields.njk" as field %}
11
- {% from "components/badge.njk" import status %}
6
+ {% from "components/setting-fields.njk" import settingFields %}
12
7
  {% from "components/button.njk" import button %}
13
8
  {% from "components/card.njk" import card, cardActions %}
14
9
  {% from "components/table.njk" import table %}
@@ -37,42 +32,7 @@
37
32
  <form method="post" action="{{ postUrl }}">
38
33
  <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
39
34
  <input type="hidden" name="{{ actionField }}" value="{{ saveAction }}" />
40
- {% for setting in settings %}
41
- {% set label = setting.label | escape %}
42
- {% set error = setting.error or setting.stored %}
43
- {% if setting.type == 'secret' %}
44
- {% set hint %}{% if setting.hint %}{{ setting.hint }} {% endif %}{% if setting.source == 'environment' %}Set by the environment variable <code>{{ setting.variable }}</code>. Change it there.{% elif setting.source == 'file' %}Set in <code>{{ secretsFile }}</code>. Leave the box blank to keep it. The environment variable <code>{{ setting.variable }}</code> would win over it.{% else %}Not set. Or set the environment variable <code>{{ setting.variable }}</code>.{% endif %}{% endset %}
45
- {% if setting.source == 'environment' %}
46
- <div class="fieldset">
47
- <p class="fieldset-legend">{{ label }} {{ status('connected', 'Set') }}</p>
48
- <p class="label block whitespace-normal">{{ hint | safe }}</p>
49
- </div>
50
- {% else %}
51
- {{ field.password(setting.id, setting.name,
52
- label ~ ' ' ~ (status('connected', 'Set') if setting.source == 'file' else status('missing', 'Not set')),
53
- hint=hint, error=setting.error, autocomplete='off', spellcheck='false',
54
- placeholder=('Leave blank to keep it' if setting.source == 'file' else '')) }}
55
- {% if setting.source == 'file' %}
56
- {{ field.checkbox(setting.id ~ '-forget', setting.forgetName, 'Forget the stored ' ~ label) }}
57
- {% endif %}
58
- {% endif %}
59
- {% else %}
60
- {% set hint %}{{ setting.hint }}{% endset %}
61
- {% if setting.type == 'checkbox' %}
62
- {{ field.checkbox(setting.id, setting.name, label, checked=setting.checked,
63
- hint=hint, error=error) }}
64
- {% elif setting.type == 'select' %}
65
- {% call field.select(setting.id, setting.name, label, hint=hint, error=error) %}
66
- {% for option in setting.options %}
67
- <option value="{{ option.value }}"{% if option.selected %} selected{% endif %}>{{ option.label }}</option>
68
- {% endfor %}
69
- {% endcall %}
70
- {% else %}
71
- {{ field.text(setting.id, setting.name, label, setting.value, hint=hint, error=error,
72
- inputmode=('url' if setting.type == 'url' else ''), spellcheck='false') }}
73
- {% endif %}
74
- {% endif %}
75
- {% endfor %}
35
+ {{ settingFields(settings, secretsFile) }}
76
36
  <div class="mt-2">{{ button('Save settings', type='submit', color='primary') }}</div>
77
37
  </form>
78
38
  {% endif %}
@@ -87,9 +47,8 @@
87
47
 
88
48
  {% if settings.length %}
89
49
  <p class="text-sm">
90
- Settings other than secrets are kept under this plugin's key in
91
- <code>content/_data/site.json</code>. Secrets are kept in
92
- <code>{{ secretsFile }}</code> at mode <code>0600</code> and are never shown here.
50
+ Settings other than secrets are kept in <code>{{ settingsFile }}</code>. Secrets are
51
+ kept in <code>{{ secretsFile }}</code> at mode <code>0600</code> and are never shown here.
93
52
  </p>
94
53
  {% endif %}
95
54
  {% endcall %}
@@ -17,32 +17,47 @@
17
17
  {% endmacro %}
18
18
 
19
19
  {% block settingsProblems %}
20
- {{ field.problem('settings-comments-close', problems.commentsCloseAfterDays) }}
21
- {{ field.problem('settings-comment-email-retention', problems.commentEmailRetentionDays) }}
22
- {{ field.problem('settings-address-hash-retention', problems.addressHashRetentionDays) }}
23
- {{ field.problem('settings-contact-message-retention', problems.contactMessageRetentionDays) }}
20
+ {{ field.problem('settings-comments-close', problems.comments_close_after_days) }}
21
+ {{ field.problem('settings-comment-email-retention', problems.comment_email_retention_days) }}
22
+ {{ field.problem('settings-address-hash-retention', problems.address_hash_retention_days) }}
23
+ {{ field.problem('settings-contact-message-retention', problems.contact_message_retention_days) }}
24
24
  {% endblock %}
25
25
 
26
26
  {% block settingsFields %}
27
27
  <h2 class="mt-2 text-lg font-semibold">Comments</h2>
28
28
 
29
29
  {% set commentsHint %}
30
- Clear this and no post shows a comment form and every submission is
31
- refused. Fediverse replies keep arriving and keep being shown either way:
30
+ Clear this and nothing shows a comment form and every submission is
31
+ refused. What was already said stays under its post or page. Fediverse replies keep arriving and keep being shown either way:
32
32
  a remote server sends those, and nothing here can stop it.
33
33
  {% endset %}
34
34
  {{ field.checkbox('settings-comments', fields.comments, 'Take comments on this site',
35
- checked=form.comments, hint=commentsHint) }}
35
+ checked=form.comments, hintHtml=commentsHint) }}
36
+
37
+ <fieldset class="fieldset">
38
+ <legend class="fieldset-legend">Take comments by default on</legend>
39
+ {{ field.checkbox('settings-comments-on-posts', fields.comments_on_posts, 'Posts',
40
+ checked=form.comments_on_posts) }}
41
+ {{ field.checkbox('settings-comments-on-pages', fields.comments_on_pages, 'Pages',
42
+ checked=form.comments_on_pages) }}
43
+ <p class="label block whitespace-normal">
44
+ What a document left on "Follow the site settings" in the editor does. A
45
+ document set to Open or Closed there, which writes
46
+ <code>comments: true</code> or <code>comments: false</code> into its
47
+ front matter, overrides this in both directions. Drafts take none, and
48
+ nothing reopens a site with comments switched off above.
49
+ </p>
50
+ </fieldset>
36
51
 
37
52
  {% set closeHint %}
38
- Days after a post's date that it stops taking comments; <code>0</code>
39
- never closes one. A post overrides this for itself with
40
- <code>comments: true</code> or <code>comments: false</code>, which the
41
- editor offers as a field. Pages are closed unless they say otherwise.
53
+ Days after a document's date that it stops taking comments, for posts and
54
+ pages alike; <code>0</code> never closes one. A document with no date,
55
+ which most pages are, never closes, and one set to Open in the editor
56
+ ignores the window.
42
57
  {% endset %}
43
- {{ field.text('settings-comments-close', fields.commentsCloseAfterDays, 'Close comments after',
44
- form.commentsCloseAfterDays, type='number', min='0', step='1',
45
- error=problems.commentsCloseAfterDays, hint=closeHint) }}
58
+ {{ field.text('settings-comments-close', fields.comments_close_after_days, 'Close comments after',
59
+ form.comments_close_after_days, type='number', min='0', step='1',
60
+ error=problems.comments_close_after_days, hintHtml=closeHint) }}
46
61
 
47
62
  <h2 class="mt-6 text-lg font-semibold">Webmentions</h2>
48
63
 
@@ -51,8 +66,8 @@
51
66
  asked whether it takes webmentions and told about the post if it does.
52
67
  The Resend button on the federation screen sends them again.
53
68
  {% endset %}
54
- {{ field.checkbox('settings-webmentions-send', fields.webmentionsSend,
55
- 'Tell the pages a post links to', checked=form.webmentionsSend, hint=sendHint) }}
69
+ {{ field.checkbox('settings-webmentions-send', fields.webmentions_send,
70
+ 'Tell the pages a post links to', checked=form.webmentions_send, hintHtml=sendHint) }}
56
71
 
57
72
  {% set receiveHint %}
58
73
  Every post advertises an endpoint, and a page that links to one and says
@@ -60,8 +75,8 @@
60
75
  is gone from the pages and answers nothing; what has already arrived
61
76
  stays where it is.
62
77
  {% endset %}
63
- {{ field.checkbox('settings-webmentions-receive', fields.webmentionsReceive,
64
- 'Accept webmentions sent here', checked=form.webmentionsReceive, hint=receiveHint) }}
78
+ {{ field.checkbox('settings-webmentions-receive', fields.webmentions_receive,
79
+ 'Accept webmentions sent here', checked=form.webmentions_receive, hintHtml=receiveHint) }}
65
80
 
66
81
  <h2 class="mt-6 text-lg font-semibold">Keeping personal data</h2>
67
82
 
@@ -76,40 +91,41 @@
76
91
  </p>
77
92
 
78
93
  {% set emailHint %}
79
- {{ retention(form.commentEmailRetentionDays) }}
94
+ {{ retention(form.comment_email_retention_days) }}
80
95
  Past this a comment loses its author's email. The comment, its place in
81
96
  the thread and its moderation status stay; the author is no longer told
82
97
  about replies, and their next comment waits for a moderator. Recommended:
83
98
  <code>180</code>.
84
99
  {% endset %}
85
- {{ field.text('settings-comment-email-retention', fields.commentEmailRetentionDays,
86
- 'Keep commenter emails for', form.commentEmailRetentionDays, type='number', min='0',
87
- step='1', error=problems.commentEmailRetentionDays, hint=emailHint) }}
100
+ {{ field.text('settings-comment-email-retention', fields.comment_email_retention_days,
101
+ 'Keep commenter emails for', form.comment_email_retention_days, type='number', min='0',
102
+ step='1', error=problems.comment_email_retention_days, hintHtml=emailHint) }}
88
103
 
89
104
  {% set hashHint %}
90
- {{ retention(form.addressHashRetentionDays) }}
105
+ {{ retention(form.address_hash_retention_days) }}
91
106
  The salted hash of the address a comment, webmention or contact message
92
107
  came from, which shows a moderator that two came from one place.
93
108
  Recommended: <code>30</code>.
94
109
  {% endset %}
95
- {{ field.text('settings-address-hash-retention', fields.addressHashRetentionDays,
96
- 'Keep address hashes for', form.addressHashRetentionDays, type='number', min='0',
97
- step='1', error=problems.addressHashRetentionDays, hint=hashHint) }}
110
+ {{ field.text('settings-address-hash-retention', fields.address_hash_retention_days,
111
+ 'Keep address hashes for', form.address_hash_retention_days, type='number', min='0',
112
+ step='1', error=problems.address_hash_retention_days, hintHtml=hashHint) }}
98
113
 
99
114
  {% set contactHint %}
100
- {{ retention(form.contactMessageRetentionDays) }}
115
+ {{ retention(form.contact_message_retention_days) }}
101
116
  Past this a contact message is deleted from the Messages screen and from
102
117
  <code>data/contact/</code>. Recommended: <code>365</code>.
103
118
  {% endset %}
104
- {{ field.text('settings-contact-message-retention', fields.contactMessageRetentionDays,
105
- 'Keep contact messages for', form.contactMessageRetentionDays, type='number', min='0',
106
- step='1', error=problems.contactMessageRetentionDays, hint=contactHint) }}
119
+ {{ field.text('settings-contact-message-retention', fields.contact_message_retention_days,
120
+ 'Keep contact messages for', form.contact_message_retention_days, type='number', min='0',
121
+ step='1', error=problems.contact_message_retention_days, hintHtml=contactHint) }}
107
122
  {% endblock %}
108
123
 
109
124
  {% block settingsPanels %}
110
125
  {# Akismet is its own pair of forms for the reason the avatar is: the key is
111
- a credential in data/akismet.json rather than a setting in site.json, and
112
- a key Akismet will not take must not lose an edit to the fields above. #}
126
+ the secret akismet.key setting in data/akismet.json rather than a setting
127
+ in site.json, and a key Akismet will not take must not lose an edit to the
128
+ fields above. #}
113
129
  {% call card(title='Spam checking') %}
114
130
  <p>
115
131
  {% if akismetState == 'valid' %}
@@ -124,30 +140,43 @@
124
140
  </p>
125
141
  <p class="text-sm">{{ akismetHint }}</p>
126
142
 
127
- <form method="post" action="{{ akismetUrl }}">
128
- <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
129
- {% if akismetPresent %}
130
- {% set akismetPlaceholder = 'Replace the stored key' %}
131
- {% else %}
132
- {% set akismetPlaceholder = 'Paste your key' %}
133
- {% endif %}
134
- {{ field.password('settings-akismet-key', akismetFields.key, 'Akismet API key',
135
- autocomplete='off', spellcheck='false', placeholder=akismetPlaceholder) }}
136
- <div class="mt-2">
137
- {{ button('Replace key' if akismetPresent else 'Save key', type='submit', color='primary') }}
138
- </div>
139
- </form>
143
+ {% if akismetSetBy %}
144
+ <p class="text-sm">The key is set by <code>{{ akismetSetBy }}</code> and cannot be changed here.</p>
145
+ {% else %}
146
+ <form method="post" action="{{ akismetUrl }}">
147
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
148
+ {% if akismetPresent %}
149
+ {% set akismetPlaceholder = 'Replace the stored key' %}
150
+ {% else %}
151
+ {% set akismetPlaceholder = 'Paste your key' %}
152
+ {% endif %}
153
+ {{ field.password('settings-akismet-key', akismetFields.key, 'Akismet API key',
154
+ autocomplete='off', spellcheck='false', placeholder=akismetPlaceholder) }}
155
+ <div class="mt-2">
156
+ {{ button('Replace key' if akismetPresent else 'Save key', type='submit', color='primary') }}
157
+ </div>
158
+ </form>
159
+ {% endif %}
160
+
161
+ {% if akismetPresent %}
162
+ <form method="post" action="{{ akismetUrl }}">
163
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
164
+ <input type="hidden" name="{{ akismetFields.action }}" value="{{ akismetVerify }}" />
165
+ <div class="mt-2">{{ button('Check key with Akismet', type='submit') }}</div>
166
+ </form>
167
+ {% endif %}
140
168
 
141
169
  <p class="text-sm">
142
170
  A key from <a class="link" href="https://akismet.com/">akismet.com</a> turns on spam
143
171
  checking for native comments and incoming webmentions. It is checked with
144
172
  Akismet when it is saved and kept in <code>data/akismet.json</code>, never
145
- in <code>site.json</code> and never on the public site. Marking something
173
+ in <code>site.json</code> and never on the public site. A deployment can
174
+ set it instead with <code>GEEKITY_AKISMET__KEY</code>. Marking something
146
175
  spam or not spam on the Comments screen tells Akismet, which is the only
147
176
  way it learns. Fediverse replies are never sent to it.
148
177
  </p>
149
178
 
150
- {% if akismetPresent %}
179
+ {% if akismetPresent and not akismetSetBy %}
151
180
  <form method="post" action="{{ akismetUrl }}">
152
181
  <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
153
182
  <input type="hidden" name="{{ akismetFields.action }}" value="{{ akismetRemove }}" />
@@ -7,13 +7,13 @@
7
7
  {% from "components/card.njk" import card, cardActions %}
8
8
 
9
9
  {% block settingsProblems %}
10
- {{ field.problem('settings-mail-provider', problems.mailProvider) }}
11
- {{ field.problem('settings-mail-from-address', problems.mailFromAddress) }}
12
- {{ field.problem('settings-mail-reply-to', problems.mailReplyTo) }}
13
- {{ field.problem('settings-contact-email', problems.contactEmail) }}
14
- {{ field.problem('settings-security-contacts', problems.securityContacts) }}
15
- {{ field.problem('settings-security-policy', problems.securityPolicy) }}
16
- {{ field.problem('settings-security-languages', problems.securityLanguages) }}
10
+ {{ field.problem('settings-mail-provider', problems.mail_provider) }}
11
+ {{ field.problem('settings-mail-from-address', problems.mail_from_address) }}
12
+ {{ field.problem('settings-mail-reply-to', problems.mail_reply_to) }}
13
+ {{ field.problem('settings-contact-email', problems.contact_email) }}
14
+ {{ field.problem('settings-security-contacts', problems.security_contacts) }}
15
+ {{ field.problem('settings-security-policy', problems.security_policy) }}
16
+ {{ field.problem('settings-security-languages', problems.security_languages) }}
17
17
  {% endblock %}
18
18
 
19
19
  {% block settingsFields %}
@@ -21,28 +21,28 @@
21
21
  The key or password each one needs is a credential and is saved below,
22
22
  in <code>data/mail.json</code> rather than in <code>site.json</code>.
23
23
  {% endset %}
24
- {% call field.select('settings-mail-provider', fields.mailProvider, 'Provider',
25
- error=problems.mailProvider, hint=providerHint) %}
24
+ {% call field.select('settings-mail-provider', fields.mail_provider, 'Provider',
25
+ error=problems.mail_provider, hintHtml=providerHint) %}
26
26
  {% for provider in mailProviders %}
27
- <option value="{{ provider }}"{% if form.mailProvider == provider %} selected{% endif %}>
27
+ <option value="{{ provider }}"{% if form.mail_provider == provider %} selected{% endif %}>
28
28
  {% if provider == 'none' %}None &mdash; this site sends no email{% elif provider == 'brevo' %}Brevo (transactional API){% else %}SMTP{% endif %}
29
29
  </option>
30
30
  {% endfor %}
31
31
  {% endcall %}
32
32
 
33
- {{ field.text('settings-mail-from-name', fields.mailFromName, 'From name', form.mailFromName,
33
+ {{ field.text('settings-mail-from-name', fields.mail_from_name, 'From name', form.mail_from_name,
34
34
  hint='The name on the From line. Empty uses the site title.') }}
35
35
 
36
36
  {% set fromAddressHint %}
37
37
  Providers only send from an address they have verified, so this should be
38
38
  one you own. Empty falls back to <code>no-reply@</code> at the site's host.
39
39
  {% endset %}
40
- {{ field.text('settings-mail-from-address', fields.mailFromAddress, 'From address',
41
- form.mailFromAddress, error=problems.mailFromAddress, hint=fromAddressHint,
40
+ {{ field.text('settings-mail-from-address', fields.mail_from_address, 'From address',
41
+ form.mail_from_address, error=problems.mail_from_address, hintHtml=fromAddressHint,
42
42
  inputmode='email') }}
43
43
 
44
- {{ field.text('settings-mail-reply-to', fields.mailReplyTo, 'Reply-to', form.mailReplyTo,
45
- error=problems.mailReplyTo, inputmode='email',
44
+ {{ field.text('settings-mail-reply-to', fields.mail_reply_to, 'Reply-to', form.mail_reply_to,
45
+ error=problems.mail_reply_to, inputmode='email',
46
46
  hint='Where a reply goes. Empty replies to the From address.') }}
47
47
 
48
48
  {% set contactHint %}
@@ -50,8 +50,8 @@
50
50
  wrote it. Empty writes to the first admin with an email address. It is read when a
51
51
  message arrives and never appears on the public site.
52
52
  {% endset %}
53
- {{ field.text('settings-contact-email', fields.contactEmail, 'Contact address',
54
- form.contactEmail, error=problems.contactEmail, hint=contactHint, inputmode='email') }}
53
+ {{ field.text('settings-contact-email', fields.contact_email, 'Contact address',
54
+ form.contact_email, error=problems.contact_email, hintHtml=contactHint, inputmode='email') }}
55
55
 
56
56
  <h2 class="mt-6 text-lg font-semibold">Security contact</h2>
57
57
 
@@ -61,24 +61,24 @@
61
61
  published at <a href="/.well-known/security.txt"><code>/.well-known/security.txt</code></a>,
62
62
  which is not served at all while this is empty.
63
63
  {% endset %}
64
- {{ field.textarea('settings-security-contacts', fields.securityContacts, 'Contacts',
65
- form.securityContacts, error=problems.securityContacts, hint=securityContactsHint,
64
+ {{ field.textarea('settings-security-contacts', fields.security_contacts, 'Contacts',
65
+ form.security_contacts, error=problems.security_contacts, hintHtml=securityContactsHint,
66
66
  rows='2', spellcheck='false') }}
67
67
 
68
- {{ field.text('settings-security-policy', fields.securityPolicy, 'Disclosure policy',
69
- form.securityPolicy, error=problems.securityPolicy, inputmode='url',
68
+ {{ field.text('settings-security-policy', fields.security_policy, 'Disclosure policy',
69
+ form.security_policy, error=problems.security_policy, inputmode='url',
70
70
  hint='Optional. An https:// URL for the page that says how reports are handled.') }}
71
71
 
72
- {{ field.text('settings-security-languages', fields.securityLanguages, 'Preferred languages',
73
- form.securityLanguages, error=problems.securityLanguages,
72
+ {{ field.text('settings-security-languages', fields.security_languages, 'Preferred languages',
73
+ form.security_languages, error=problems.security_languages,
74
74
  hint='Optional. The languages a report may be written in, such as en, fr.') }}
75
75
  {% endblock %}
76
76
 
77
77
  {% block settingsPanels %}
78
78
  {# The mail credential is its own pair of forms for the reason the Akismet
79
- key is: an API key and an SMTP password belong in data/mail.json, not in
80
- the public site.json, and a mistyped one must not lose an edit to the
81
- From line. #}
79
+ key is: an API key and an SMTP password are the mail settings, kept in
80
+ data/mail.json, not in the public site.json, and a mistyped one must not
81
+ lose an edit to the From line. #}
82
82
  {% call card(title='Mail credentials') %}
83
83
 
84
84
  <p>
@@ -125,40 +125,64 @@
125
125
 
126
126
  {% if mailProvider == 'brevo' %}
127
127
  <h3 class="font-semibold">Brevo</h3>
128
- {% if mailBrevoPresent %}
129
- <p class="text-sm">A key is stored, ending {{ mailBrevoKeyHint }}.</p>
130
- {% set brevoPlaceholder = 'Leave blank to keep the stored key' %}
128
+ {% if mailSetBy.brevo_api_key %}
129
+ <p class="text-sm">The API key is set by <code>{{ mailSetBy.brevo_api_key }}</code> and cannot be changed here.</p>
131
130
  {% else %}
132
- {% set brevoPlaceholder = 'Paste your key' %}
131
+ {% if mailBrevoPresent %}
132
+ <p class="text-sm">A key is stored, ending {{ mailBrevoKeyHint }}.</p>
133
+ {% set brevoPlaceholder = 'Leave blank to keep the stored key' %}
134
+ {% else %}
135
+ {% set brevoPlaceholder = 'Paste your key' %}
136
+ {% endif %}
137
+ {{ field.password('settings-mail-brevo-key', mailFields.brevoApiKey, 'API key',
138
+ autocomplete='off', spellcheck='false', placeholder=brevoPlaceholder) }}
133
139
  {% endif %}
134
- {{ field.password('settings-mail-brevo-key', mailFields.brevoApiKey, 'API key',
135
- autocomplete='off', spellcheck='false', placeholder=brevoPlaceholder) }}
136
140
  {% else %}
137
141
  <h3 class="font-semibold">SMTP</h3>
138
- {{ field.text('settings-mail-smtp-host', mailFields.smtpHost, 'Host', mailSmtp.host,
139
- autocomplete='off') }}
142
+ {% if mailSetBy.smtp_host %}
143
+ <p class="text-sm">Host {{ mailSmtp.host }}, set by <code>{{ mailSetBy.smtp_host }}</code>.</p>
144
+ {% else %}
145
+ {{ field.text('settings-mail-smtp-host', mailFields.smtpHost, 'Host', mailSmtp.host,
146
+ autocomplete='off') }}
147
+ {% endif %}
140
148
 
141
- {{ field.text('settings-mail-smtp-port', mailFields.smtpPort, 'Port',
142
- mailSmtp.port if mailSmtp else 587, inputmode='numeric') }}
149
+ {% if mailSetBy.smtp_port %}
150
+ <p class="text-sm">Port {{ mailSmtp.port }}, set by <code>{{ mailSetBy.smtp_port }}</code>.</p>
151
+ {% else %}
152
+ {{ field.text('settings-mail-smtp-port', mailFields.smtpPort, 'Port',
153
+ mailSmtp.port if mailSmtp else 587, inputmode='numeric') }}
154
+ {% endif %}
143
155
 
144
156
  {# Its own box with the sentence beside it, like every other switch in
145
157
  the admin. It used to be a label wrapped round the tick in a class the
146
158
  stylesheet has never heard of, so it was the one switch here that
147
159
  rendered unstyled. #}
148
- {{ field.checkbox('settings-mail-smtp-secure', mailFields.smtpSecure,
149
- 'TLS from the first byte (port 465)', checked=mailSmtp.secure,
150
- hint='Leave this off for port 587, which upgrades with STARTTLS.') }}
160
+ {% if mailSetBy.smtp_secure %}
161
+ <p class="text-sm">TLS from the first byte {{ 'on' if mailSmtp.secure else 'off' }}, set by <code>{{ mailSetBy.smtp_secure }}</code>.</p>
162
+ {% else %}
163
+ {{ field.checkbox('settings-mail-smtp-secure', mailFields.smtpSecure,
164
+ 'TLS from the first byte (port 465)', checked=mailSmtp.secure,
165
+ hint='Leave this off for port 587, which upgrades with STARTTLS.') }}
166
+ {% endif %}
151
167
 
152
- {{ field.text('settings-mail-smtp-user', mailFields.smtpUser, 'Username', mailSmtp.user,
153
- autocomplete='off') }}
168
+ {% if mailSetBy.smtp_user %}
169
+ <p class="text-sm">Username {{ mailSmtp.user }}, set by <code>{{ mailSetBy.smtp_user }}</code>.</p>
170
+ {% else %}
171
+ {{ field.text('settings-mail-smtp-user', mailFields.smtpUser, 'Username', mailSmtp.user,
172
+ autocomplete='off') }}
173
+ {% endif %}
154
174
 
155
- {% if mailSmtp.hasPassword %}
156
- {% set smtpPlaceholder = 'Leave blank to keep the stored password' %}
175
+ {% if mailSetBy.smtp_password %}
176
+ <p class="text-sm">The password is set by <code>{{ mailSetBy.smtp_password }}</code> and cannot be changed here.</p>
157
177
  {% else %}
158
- {% set smtpPlaceholder = 'The SMTP password' %}
178
+ {% if mailSmtp.hasPassword %}
179
+ {% set smtpPlaceholder = 'Leave blank to keep the stored password' %}
180
+ {% else %}
181
+ {% set smtpPlaceholder = 'The SMTP password' %}
182
+ {% endif %}
183
+ {{ field.password('settings-mail-smtp-password', mailFields.smtpPassword, 'Password',
184
+ autocomplete='off', spellcheck='false', placeholder=smtpPlaceholder) }}
159
185
  {% endif %}
160
- {{ field.password('settings-mail-smtp-password', mailFields.smtpPassword, 'Password',
161
- autocomplete='off', spellcheck='false', placeholder=smtpPlaceholder) }}
162
186
  {% endif %}
163
187
 
164
188
  <div class="mt-2">{{ button('Save credentials', type='submit', color='primary') }}</div>
@@ -225,7 +249,11 @@
225
249
  page. Both are kept in <code>data/mail.json</code> at mode
226
250
  <code>0600</code>, beside the password hashes and the actor's private
227
251
  keys, and never in <code>site.json</code>, which is public and in git.
228
- Leaving a secret blank keeps the one already stored.
252
+ Leaving a secret blank keeps the one already stored. A deployment can set
253
+ any of them instead with <code>GEEKITY_MAIL__BREVO_API_KEY</code>,
254
+ <code>GEEKITY_MAIL__SMTP_PASSWORD</code> and the other
255
+ <code>GEEKITY_MAIL__*</code> variables, and then this page shows what sets
256
+ them.
229
257
  </p>
230
258
  {% endcall %}
231
259
  {% endblock %}
@@ -4,14 +4,14 @@
4
4
 
5
5
  {% block settingsProblems %}
6
6
  {{ field.problem('settings-title', problems.title) }}
7
- {{ field.problem('settings-base-url', problems.baseUrl) }}
7
+ {{ field.problem('settings-base-url', problems.base_url) }}
8
8
  {{ field.problem('settings-timezone', problems.timezone) }}
9
9
  {{ field.problem('settings-language', problems.language) }}
10
10
  {{ field.problem('settings-locale', problems.locale) }}
11
11
  {{ field.problem('settings-icon', problems.icon) }}
12
12
  {{ field.problem('settings-license', problems.license) }}
13
- {{ field.problem('settings-license-url', problems.licenseUrl) }}
14
- {{ field.problem('settings-license-name', problems.licenseName) }}
13
+ {{ field.problem('settings-license-url', problems.license_url) }}
14
+ {{ field.problem('settings-license-name', problems.license_name) }}
15
15
  {% endblock %}
16
16
 
17
17
  {% block settingsFields %}
@@ -22,7 +22,7 @@
22
22
  hint='One line, shown under the title and used as the feed subtitle.') }}
23
23
 
24
24
  {% set authorHint %}A user makes this their blog: the homepage shows their bio and links, claims their author archive and profiles with <code>rel="me"</code>, and is their IndieAuth sign-in URL. The feeds and the footer credit them by name. Several authors credits the site title instead.{% endset %}
25
- {% call field.select('settings-author', fields.author, 'Site author', hint=authorHint) %}
25
+ {% call field.select('settings-author', fields.author, 'Site author', hintHtml=authorHint) %}
26
26
  <option value=""{% if not form.author %} selected{% endif %}>Several authors</option>
27
27
  {% for choice in authorChoices %}
28
28
  <option value="{{ choice.username }}"{% if choice.username == form.author %} selected{% endif %}>{{ choice.name }}</option>
@@ -30,25 +30,25 @@
30
30
  {% endcall %}
31
31
 
32
32
  {% set baseUrlHint %}In effect: <code>{{ baseUrlInEffect }}</code>. {{ baseUrlNote }}{% endset %}
33
- {{ field.text('settings-base-url', fields.baseUrl, 'Base URL', form.baseUrl,
34
- error=problems.baseUrl, hint=baseUrlHint, inputmode='url',
33
+ {{ field.text('settings-base-url', fields.base_url, 'Base URL', form.base_url,
34
+ error=problems.base_url, hintHtml=baseUrlHint, inputmode='url',
35
35
  readonly=baseUrlOverridden, disabled=baseUrlOverridden) }}
36
36
 
37
37
  {% set timezoneHint %}An IANA name, such as <code>Europe/London</code> or <code>UTC</code>.{% endset %}
38
38
  {{ field.text('settings-timezone', fields.timezone, 'Time zone', form.timezone,
39
- error=problems.timezone, hint=timezoneHint, required=true) }}
39
+ error=problems.timezone, hintHtml=timezoneHint, required=true) }}
40
40
 
41
41
  {% 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 %}
42
42
  {{ field.text('settings-language', fields.language, 'Language', form.language,
43
- error=problems.language, hint=languageHint, required=true) }}
43
+ error=problems.language, hintHtml=languageHint, required=true) }}
44
44
 
45
45
  {% set localeHint %}How the public site writes dates and counts, such as <code>en-US</code> for <code>September 2, 2026</code>. Leave it empty to follow the language.{% endset %}
46
46
  {{ field.text('settings-locale', fields.locale, 'Locale', form.locale,
47
- error=problems.locale, hint=localeHint) }}
47
+ error=problems.locale, hintHtml=localeHint) }}
48
48
 
49
49
  {% set iconHint %}A square image at least 512 pixels wide, uploaded on <a href="{{ adminUrl }}/media">Media</a>: a path such as <code>/uploads/2026/10/icon.png</code>. It is the favicon, the home screen icon, <code>/favicon.ico</code> and the web app manifest's icon. Anything not square is cropped to its middle.{% endset %}
50
50
  {{ field.text('settings-icon', fields.icon, 'Site icon', form.icon,
51
- error=problems.icon, hint=iconHint) }}
51
+ error=problems.icon, hintHtml=iconHint) }}
52
52
 
53
53
  <div class="flex items-center gap-4">
54
54
  {% if iconPreview %}
@@ -78,7 +78,7 @@
78
78
  </div>
79
79
 
80
80
  {% set licenseHint %}What readers may do with your posts. The footer links it, and the structured data and the feeds declare it. A post can name its own with <code>license</code> in its front matter.{% endset %}
81
- {% call field.select('settings-license', fields.license, 'License', error=problems.license, hint=licenseHint) %}
81
+ {% call field.select('settings-license', fields.license, 'License', error=problems.license, hintHtml=licenseHint) %}
82
82
  <option value=""{% if not form.license %} selected{% endif %}>No license (all rights reserved)</option>
83
83
  {% for choice in licenseChoices %}
84
84
  <option value="{{ choice.key }}"{% if choice.key == form.license %} selected{% endif %}>{{ choice.name }}</option>
@@ -86,11 +86,11 @@
86
86
  <option value="custom"{% if form.license == 'custom' %} selected{% endif %}>Custom license</option>
87
87
  {% endcall %}
88
88
 
89
- {{ field.text('settings-license-url', fields.licenseUrl, 'Custom license URL', form.licenseUrl,
90
- error=problems.licenseUrl, inputmode='url', hint='Where its terms are. Only read for a custom license.') }}
89
+ {{ field.text('settings-license-url', fields.license_url, 'Custom license URL', form.license_url,
90
+ error=problems.license_url, inputmode='url', hint='Where its terms are. Only read for a custom license.') }}
91
91
 
92
- {{ field.text('settings-license-name', fields.licenseName, 'Custom license name', form.licenseName,
93
- error=problems.licenseName, hint='What the footer calls it. Only read for a custom license.') }}
92
+ {{ field.text('settings-license-name', fields.license_name, 'Custom license name', form.license_name,
93
+ error=problems.license_name, hint='What the footer calls it. Only read for a custom license.') }}
94
94
  {% endblock %}
95
95
 
96
96
  {% block settingsPanels %}{% endblock %}
@@ -6,18 +6,18 @@
6
6
  {% from "components/table.njk" import table %}
7
7
 
8
8
  {% block settingsProblems %}
9
- {{ field.problem('settings-tag-base', problems.tagBase) }}
10
- {{ field.problem('settings-category-base', problems.categoryBase) }}
9
+ {{ field.problem('settings-tag-base', problems.tag_base) }}
10
+ {{ field.problem('settings-category-base', problems.category_base) }}
11
11
  {% endblock %}
12
12
 
13
13
  {% block settingsFields %}
14
- {% set tagBaseHint %}The tag archives live at <code>/{{ form.tagBase }}/{tag}/</code>. One path segment, no slashes.{% endset %}
15
- {{ field.text('settings-tag-base', fields.tagBase, 'Tag base', form.tagBase,
16
- error=problems.tagBase, hint=tagBaseHint, required=true, autofocus=true) }}
14
+ {% set tagBaseHint %}The tag archives live at <code>/{{ form.tag_base }}/{tag}/</code>. One path segment, no slashes.{% endset %}
15
+ {{ field.text('settings-tag-base', fields.tag_base, 'Tag base', form.tag_base,
16
+ error=problems.tag_base, hintHtml=tagBaseHint, required=true, autofocus=true) }}
17
17
 
18
- {% set categoryBaseHint %}The category archives live at <code>/{{ form.categoryBase }}/{name}/</code>.{% endset %}
19
- {{ field.text('settings-category-base', fields.categoryBase, 'Category base', form.categoryBase,
20
- error=problems.categoryBase, hint=categoryBaseHint, required=true) }}
18
+ {% set categoryBaseHint %}The category archives live at <code>/{{ form.category_base }}/{name}/</code>.{% endset %}
19
+ {{ field.text('settings-category-base', fields.category_base, 'Category base', form.category_base,
20
+ error=problems.category_base, hintHtml=categoryBaseHint, required=true) }}
21
21
  {% endblock %}
22
22
 
23
23
  {% block settingsPanels %}