domma-cms 0.55.1 → 0.69.3

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 (305) hide show
  1. package/CLAUDE.md +194 -3
  2. package/README.md +18 -14
  3. package/admin/css/admin.css +1 -1
  4. package/admin/css/contacts.css +1 -0
  5. package/admin/dist/domma/domma-tools.css +3 -3
  6. package/admin/dist/domma/domma-tools.min.js +3 -3
  7. package/admin/index.html +1 -0
  8. package/admin/js/api.js +1 -1
  9. package/admin/js/app.js +4 -4
  10. package/admin/js/lib/analytics-shape.js +1 -0
  11. package/admin/js/lib/contacts-arrange.js +1 -0
  12. package/admin/js/lib/help-popover.js +1 -0
  13. package/admin/js/lib/notes-arrange.js +1 -0
  14. package/admin/js/lib/page-picker.js +1 -0
  15. package/admin/js/lib/plugin-accent.js +1 -0
  16. package/admin/js/lib/plugin-chrome.js +1 -0
  17. package/admin/js/lib/shortcode-context-menu.js +2 -2
  18. package/admin/js/lib/sidebar-grouping.js +1 -1
  19. package/admin/js/lib/sidebar-grouping.test.js +1 -1
  20. package/admin/js/lib/sidebar-renderer.js +4 -4
  21. package/admin/js/lib/slideover-resizable.js +1 -0
  22. package/admin/js/lib/todo-arrange.js +1 -0
  23. package/admin/js/lib/tool-kit.js +1 -0
  24. package/admin/js/templates/analytics.html +138 -0
  25. package/admin/js/templates/contacts.html +156 -0
  26. package/admin/js/templates/context-menu-editor.html +212 -0
  27. package/admin/js/templates/context-menus.html +16 -0
  28. package/admin/js/templates/notes.html +137 -0
  29. package/admin/js/templates/plugin-code.html +1 -1
  30. package/admin/js/templates/plugin-marketplace.html +17 -4
  31. package/admin/js/templates/plugins.html +13 -7
  32. package/{plugins/site-search/admin/templates/site-search.html → admin/js/templates/search.html} +50 -4
  33. package/admin/js/templates/settings.html +16 -97
  34. package/admin/js/templates/theme.html +211 -0
  35. package/admin/js/templates/todo.html +113 -0
  36. package/admin/js/views/analytics.js +62 -0
  37. package/admin/js/views/contacts.js +174 -0
  38. package/admin/js/views/context-menu-editor.js +55 -0
  39. package/admin/js/views/context-menus.js +5 -0
  40. package/admin/js/views/form-editor.js +7 -7
  41. package/admin/js/views/index.js +1 -1
  42. package/admin/js/views/notes.js +104 -0
  43. package/admin/js/views/plugin-marketplace.js +1 -1
  44. package/admin/js/views/plugins.js +28 -24
  45. package/admin/js/views/search.js +1 -0
  46. package/admin/js/views/settings.js +3 -3
  47. package/admin/js/views/theme.js +1 -0
  48. package/admin/js/views/todo.js +96 -0
  49. package/bin/cli.js +6 -10
  50. package/bin/lib/plugin-version.js +28 -0
  51. package/bin/update.js +27 -2
  52. package/config/menus/admin-sidebar.json +129 -23
  53. package/config/plugins.json +5 -5
  54. package/config/search.json +13 -0
  55. package/config/server.json +3 -1
  56. package/package.json +14 -10
  57. package/plugins/_lib/admin/mail/compose-window.js +914 -0
  58. package/plugins/_lib/admin/mail/contacts.js +301 -0
  59. package/plugins/_lib/admin/mail/diagnostics-section.js +133 -0
  60. package/plugins/_lib/admin/mail/folder-tree.js +254 -0
  61. package/plugins/_lib/admin/mail/identity.js +480 -0
  62. package/plugins/_lib/admin/mail/image-senders-section.js +131 -0
  63. package/plugins/_lib/admin/mail/keyboard.js +136 -0
  64. package/plugins/_lib/admin/mail/mail.css +1 -0
  65. package/plugins/_lib/admin/mail/mail.html +71 -0
  66. package/plugins/_lib/admin/mail/panes.js +253 -0
  67. package/plugins/_lib/admin/mail/reader-view.js +4473 -0
  68. package/plugins/_lib/admin/mail/resizable.js +26 -0
  69. package/plugins/_lib/admin/mail/rules.js +343 -0
  70. package/plugins/_lib/admin/mail/scheduling.js +203 -0
  71. package/plugins/_lib/admin/mail/section-kit.js +277 -0
  72. package/plugins/_lib/admin/mail/templates.js +238 -0
  73. package/plugins/_lib/admin/mail/threads.js +200 -0
  74. package/plugins/_lib/admin/mail/vacation.js +269 -0
  75. package/plugins/_lib/admin/ui/help.css +1 -0
  76. package/plugins/_lib/admin/ui/help.js +174 -0
  77. package/plugins/_lib/admin/ui/resizable.js +151 -0
  78. package/plugins/_lib/dataStore.js +117 -0
  79. package/plugins/_lib/mail/accounts.js +919 -0
  80. package/plugins/_lib/mail/bodyTokens.js +101 -0
  81. package/plugins/_lib/mail/compose.js +256 -0
  82. package/plugins/_lib/mail/defaults.js +57 -0
  83. package/plugins/_lib/mail/diagnostics.js +154 -0
  84. package/plugins/_lib/mail/envelope.js +161 -0
  85. package/plugins/_lib/mail/folders.js +192 -0
  86. package/plugins/_lib/mail/handoff.js +274 -0
  87. package/plugins/_lib/mail/imapPool.js +293 -0
  88. package/plugins/_lib/mail/mbox.js +74 -0
  89. package/plugins/_lib/mail/pollSchedule.js +79 -0
  90. package/plugins/_lib/mail/poller.js +135 -0
  91. package/plugins/_lib/mail/priority.js +138 -0
  92. package/plugins/_lib/mail/readRoutes.js +680 -0
  93. package/plugins/_lib/mail/render.js +291 -0
  94. package/plugins/_lib/mail/ruleRunner.js +152 -0
  95. package/plugins/_lib/mail/scheduler.js +254 -0
  96. package/plugins/_lib/mail/secretbox.js +229 -0
  97. package/plugins/_lib/mail/send.js +396 -0
  98. package/plugins/_lib/mail/store.js +1022 -0
  99. package/plugins/_lib/mail/sync.js +292 -0
  100. package/plugins/_lib/mail/syncPlan.js +126 -0
  101. package/plugins/_lib/mail/syncSelection.js +82 -0
  102. package/plugins/_lib/mail/unsubscribe.js +183 -0
  103. package/plugins/_lib/mail/vacationRunner.js +114 -0
  104. package/plugins/_lib/mail/write.js +473 -0
  105. package/plugins/_lib/schemaSync.js +83 -0
  106. package/plugins/_template/admin/css/index.css +0 -0
  107. package/plugins/_template/admin/templates/index.html +4 -4
  108. package/plugins/_template/admin/views/index.js +7 -0
  109. package/plugins/blog/CLAUDE.md +237 -0
  110. package/plugins/blog/admin/css/index.css +178 -0
  111. package/plugins/blog/admin/templates/blog.html +35 -41
  112. package/plugins/blog/admin/templates/categories.html +19 -6
  113. package/plugins/blog/admin/templates/comments.html +26 -9
  114. package/plugins/blog/admin/templates/post-editor.html +63 -40
  115. package/plugins/blog/admin/templates/settings.html +3 -9
  116. package/plugins/blog/admin/views/blog.js +288 -159
  117. package/plugins/blog/admin/views/categories.js +212 -206
  118. package/plugins/blog/admin/views/comments.js +207 -158
  119. package/plugins/blog/admin/views/kit.js +372 -0
  120. package/plugins/blog/admin/views/post-editor.js +306 -39
  121. package/plugins/blog/admin/views/settings-cog.js +56 -0
  122. package/plugins/blog/admin/views/settings.js +16 -84
  123. package/plugins/blog/blocks/blog-card-compact.css +17 -0
  124. package/plugins/blog/blocks/blog-card-compact.html +8 -0
  125. package/plugins/blog/blocks/blog-card-row.css +22 -0
  126. package/plugins/blog/blocks/blog-card-row.html +11 -0
  127. package/plugins/blog/blocks/blog-card.css +35 -0
  128. package/plugins/blog/blocks/blog-card.html +16 -0
  129. package/plugins/blog/blocks/blog-post-classic.css +15 -0
  130. package/plugins/blog/blocks/blog-post-classic.html +28 -0
  131. package/plugins/blog/blocks/blog-post-feature.css +20 -0
  132. package/plugins/blog/blocks/blog-post-feature.html +30 -0
  133. package/plugins/blog/blocks/blog-post-minimal.css +10 -0
  134. package/plugins/blog/blocks/blog-post-minimal.html +23 -0
  135. package/plugins/blog/blocks/blog-post-sidebar.css +22 -0
  136. package/plugins/blog/blocks/blog-post-sidebar.html +36 -0
  137. package/plugins/blog/collections/categories/schema.json +7 -6
  138. package/plugins/blog/collections/comments/schema.json +11 -10
  139. package/plugins/blog/collections/posts/schema.json +16 -13
  140. package/plugins/blog/config.js +6 -0
  141. package/plugins/blog/lib/layouts.js +304 -0
  142. package/plugins/blog/lib/page.js +158 -0
  143. package/plugins/blog/lib/render.js +119 -0
  144. package/plugins/blog/lib/samples.js +234 -0
  145. package/plugins/blog/plugin.js +259 -26
  146. package/plugins/blog/plugin.json +21 -73
  147. package/plugins/blog/plugin.public.js +217 -0
  148. package/plugins/blog/public/blog.css +177 -0
  149. package/plugins/blog/public/blog.js +586 -0
  150. package/plugins/blog/public/samples/aurora.svg +7 -0
  151. package/plugins/blog/public/samples/dusk.svg +7 -0
  152. package/plugins/blog/public/samples/ember.svg +7 -0
  153. package/plugins/blog/public/samples/harbour.svg +7 -0
  154. package/plugins/blog/public/samples/meadow.svg +7 -0
  155. package/plugins/blog/public/samples/rosewood.svg +7 -0
  156. package/plugins/blog/templates/index.html +9 -8
  157. package/plugins/blog/templates/post.html +4 -17
  158. package/plugins/blog/tests/layouts.test.js +97 -0
  159. package/plugins/blog/tests/public.test.js +71 -0
  160. package/plugins/free-tier.lock.json +74 -0
  161. package/plugins/mail-reader/CLAUDE.md +78 -0
  162. package/plugins/mail-reader/admin/views/mail.js +19 -0
  163. package/plugins/mail-reader/config.js +7 -0
  164. package/plugins/mail-reader/plugin.js +48 -0
  165. package/plugins/mail-reader/plugin.json +34 -0
  166. package/public/css/forms.css +1 -1
  167. package/public/css/search.css +1 -0
  168. package/public/css/site.css +1 -1
  169. package/public/css/theme-switcher.css +1 -0
  170. package/public/js/analytics.js +1 -0
  171. package/public/js/collection-context.js +2 -2
  172. package/public/js/context-menus.js +1 -0
  173. package/public/js/form-logic-engine.js +1 -1
  174. package/public/js/forms.js +2 -2
  175. package/public/js/search.js +1 -0
  176. package/public/js/site.js +1 -1
  177. package/public/js/theme-switcher.js +1 -0
  178. package/scripts/build.js +77 -4
  179. package/scripts/copy-domma.js +48 -0
  180. package/scripts/run-tests.mjs +92 -0
  181. package/scripts/seed.js +1996 -0
  182. package/{plugins/analytics/plugin.js → server/routes/api/analytics.js} +89 -41
  183. package/server/routes/api/collections.js +34 -0
  184. package/server/routes/api/contacts.js +506 -0
  185. package/server/routes/api/context-menus.js +104 -0
  186. package/server/routes/api/dashboard.js +8 -2
  187. package/server/routes/api/forms.js +42 -3
  188. package/{plugins/notes/plugin.js → server/routes/api/notes.js} +61 -17
  189. package/server/routes/api/notifications.js +69 -19
  190. package/server/routes/api/plugin-marketplace.js +78 -23
  191. package/server/routes/api/plugins.js +198 -9
  192. package/server/routes/api/search.js +43 -0
  193. package/server/routes/api/theme.js +69 -0
  194. package/server/routes/api/todo.js +178 -0
  195. package/server/routes/public.js +42 -7
  196. package/server/server.js +135 -1
  197. package/server/services/adapters/FileAdapter.js +6 -1
  198. package/server/services/collections.js +13 -3
  199. package/server/services/content.js +26 -0
  200. package/server/services/contextMenus.js +477 -0
  201. package/server/services/managerClient.js +72 -136
  202. package/server/services/markdown.js +124 -10
  203. package/server/services/permissionRegistry.js +74 -0
  204. package/server/services/pluginEntitlement.js +171 -0
  205. package/server/services/pluginEnvelope.js +242 -0
  206. package/server/services/pluginFiles.js +52 -11
  207. package/server/services/pluginInstaller.js +246 -26
  208. package/server/services/pluginScaffold.js +5 -0
  209. package/server/services/plugins.js +340 -7
  210. package/server/services/presetCollections.js +344 -0
  211. package/server/services/promoted-plugins-migration.js +254 -0
  212. package/server/services/publicCors.js +46 -0
  213. package/server/services/renderer.js +224 -22
  214. package/server/services/roles.js +1 -1
  215. package/server/services/search-migration.js +82 -0
  216. package/server/services/search.js +413 -0
  217. package/server/services/sidebar-migration.js +1 -0
  218. package/server/services/sidebarBadges.js +37 -0
  219. package/server/services/siteGitignore.js +307 -0
  220. package/server/services/themeSettings.js +580 -0
  221. package/server/services/users.js +8 -0
  222. package/server/templates/page.html +4 -2
  223. package/plugins/analytics/admin/templates/analytics.html +0 -61
  224. package/plugins/analytics/admin/views/analytics.js +0 -176
  225. package/plugins/analytics/config.js +0 -14
  226. package/plugins/analytics/plugin.json +0 -57
  227. package/plugins/analytics/public/inject-body.html +0 -60
  228. package/plugins/analytics/public/inject-head.html +0 -1
  229. package/plugins/blog/templates/author.html +0 -9
  230. package/plugins/blog/templates/category.html +0 -9
  231. package/plugins/blog/templates/tag.html +0 -9
  232. package/plugins/contacts/admin/templates/contacts.html +0 -126
  233. package/plugins/contacts/admin/views/contacts.js +0 -710
  234. package/plugins/contacts/collections/user-contact-groups/schema.json +0 -35
  235. package/plugins/contacts/collections/user-contacts/schema.json +0 -71
  236. package/plugins/contacts/config.js +0 -6
  237. package/plugins/contacts/data/contacts.json +0 -20
  238. package/plugins/contacts/plugin.js +0 -291
  239. package/plugins/contacts/plugin.json +0 -33
  240. package/plugins/demo-viewer/config.js +0 -4
  241. package/plugins/demo-viewer/plugin.js +0 -36
  242. package/plugins/demo-viewer/plugin.json +0 -9
  243. package/plugins/invoice/admin/templates/editor.html +0 -129
  244. package/plugins/invoice/admin/templates/index.html +0 -43
  245. package/plugins/invoice/admin/templates/issuers.html +0 -5
  246. package/plugins/invoice/admin/templates/receivers.html +0 -5
  247. package/plugins/invoice/admin/views/editor.js +0 -267
  248. package/plugins/invoice/admin/views/index.js +0 -155
  249. package/plugins/invoice/admin/views/issuers.js +0 -23
  250. package/plugins/invoice/admin/views/party-view.js +0 -148
  251. package/plugins/invoice/admin/views/receivers.js +0 -22
  252. package/plugins/invoice/collections/invoice-issuers/schema.json +0 -16
  253. package/plugins/invoice/collections/invoice-receivers/schema.json +0 -15
  254. package/plugins/invoice/collections/invoices/schema.json +0 -27
  255. package/plugins/invoice/config.js +0 -16
  256. package/plugins/invoice/plugin.js +0 -283
  257. package/plugins/invoice/plugin.json +0 -85
  258. package/plugins/invoice/templates/invoice-print.html +0 -213
  259. package/plugins/notes/admin/templates/notes.html +0 -83
  260. package/plugins/notes/admin/views/notes.js +0 -281
  261. package/plugins/notes/collections/user-notes/schema.json +0 -54
  262. package/plugins/notes/config.js +0 -6
  263. package/plugins/notes/data/notes.json +0 -1
  264. package/plugins/notes/plugin.json +0 -33
  265. package/plugins/site-search/admin/views/site-search.js +0 -116
  266. package/plugins/site-search/config.js +0 -15
  267. package/plugins/site-search/plugin.js +0 -188
  268. package/plugins/site-search/plugin.json +0 -40
  269. package/plugins/site-search/public/inject-body.html +0 -17
  270. package/plugins/site-search/public/inject-head.html +0 -1
  271. package/plugins/site-search/public/search.css +0 -1
  272. package/plugins/site-search/public/search.js +0 -1
  273. package/plugins/surveys/admin/templates/audience.html +0 -47
  274. package/plugins/surveys/admin/templates/results.html +0 -58
  275. package/plugins/surveys/admin/templates/survey-editor.html +0 -141
  276. package/plugins/surveys/admin/templates/surveys.html +0 -25
  277. package/plugins/surveys/admin/views/audience.js +0 -301
  278. package/plugins/surveys/admin/views/results.js +0 -172
  279. package/plugins/surveys/admin/views/survey-editor.js +0 -211
  280. package/plugins/surveys/admin/views/surveys.js +0 -161
  281. package/plugins/surveys/collections/survey-contacts/schema.json +0 -13
  282. package/plugins/surveys/collections/survey-groups/schema.json +0 -11
  283. package/plugins/surveys/collections/survey-invites/schema.json +0 -16
  284. package/plugins/surveys/collections/surveys/schema.json +0 -23
  285. package/plugins/surveys/config.js +0 -8
  286. package/plugins/surveys/plugin.js +0 -174
  287. package/plugins/surveys/plugin.json +0 -65
  288. package/plugins/surveys/public/dist-shared.mjs +0 -1
  289. package/plugins/surveys/public/survey.css +0 -1
  290. package/plugins/surveys/public/survey.mjs +0 -1
  291. package/plugins/surveys/templates/survey-page.html +0 -63
  292. package/plugins/theme-switcher/admin/templates/theme-switcher.html +0 -86
  293. package/plugins/theme-switcher/admin/views/theme-switcher.js +0 -65
  294. package/plugins/theme-switcher/config.js +0 -10
  295. package/plugins/theme-switcher/plugin.js +0 -26
  296. package/plugins/theme-switcher/plugin.json +0 -74
  297. package/plugins/theme-switcher/public/inject-body.html +0 -153
  298. package/plugins/theme-switcher/public/inject-head.html +0 -260
  299. package/plugins/todo/admin/templates/todo.html +0 -158
  300. package/plugins/todo/admin/views/todo.js +0 -343
  301. package/plugins/todo/collections/todos/schema.json +0 -60
  302. package/plugins/todo/config.js +0 -7
  303. package/plugins/todo/data/todos.json +0 -1
  304. package/plugins/todo/plugin.js +0 -102
  305. package/plugins/todo/plugin.json +0 -33
@@ -1,96 +1,119 @@
1
- <div class="view-header d-flex align-items-center justify-content-between mb-4">
2
- <h1 class="h3 mb-0" id="editor-title">New Post</h1>
3
- <div class="d-flex gap-2">
4
- <button id="btn-save-draft" class="btn btn-secondary">Save Draft</button>
5
- <button id="btn-schedule" class="btn btn-warning" style="display:none;">Schedule</button>
6
- <button id="btn-publish" class="btn btn-primary">Publish Now</button>
1
+ <div class="view-header blog-editor-bar">
2
+ <button type="button" id="btn-back" class="btn btn-sm btn-ghost" title="Back to Posts - asks first if there is anything unsaved">
3
+ <span data-icon="arrow-left" data-icon-size="14"></span> Posts
4
+ </button>
5
+ <span id="editor-title" class="blog-editor-title">New post</span>
6
+ <span id="save-state" class="blog-save-state" role="status" aria-live="polite"></span>
7
+ <div class="view-header-actions">
8
+ <span data-help-title="Saving and publishing"
9
+ data-help="Save (or Ctrl+S) stores your changes and keeps the post as it is - a draft stays a draft, a live post stays live and updates. Publish puts it on the site now; Schedule picks a date and time. Move to drafts takes a live or scheduled post off the site. You stay on this page throughout; Posts takes you back to the list."></span>
10
+ <button type="button" id="btn-drafts" class="btn btn-sm btn-ghost blog-hidden" title="Take this post off the site">Move to drafts</button>
11
+ <button type="button" id="btn-schedule" class="btn btn-secondary">Schedule</button>
12
+ <button type="button" id="btn-publish" class="btn btn-secondary">Publish</button>
13
+ <button type="button" id="btn-save" class="btn btn-primary" title="Save (Ctrl+S)">
14
+ <span data-icon="save" data-icon-size="14"></span> Save
15
+ </button>
7
16
  </div>
8
17
  </div>
9
18
 
10
- <div class="d-flex gap-4" style="align-items:flex-start;">
19
+ <div class="flex gap-4 blog-editor">
11
20
  <!-- Main content area -->
12
- <div style="flex:1; min-width:0;">
21
+ <div class="blog-editor-main">
13
22
  <div class="card mb-3">
14
23
  <div class="card-body">
15
24
  <div class="mb-3">
16
- <label class="form-label fw-bold">Title</label>
17
- <input type="text" id="post-title" class="form-control form-control-lg" placeholder="Post title…">
25
+ <label class="form-label font-bold" for="post-title">Title</label>
26
+ <input type="text" id="post-title" class="form-input form-input-lg" placeholder="Post title…">
18
27
  </div>
19
28
  <div class="mb-3">
20
- <label class="form-label">Slug</label>
21
- <div class="d-flex gap-2 align-items-center">
22
- <input type="text" id="post-slug" class="form-control font-monospace">
23
- <label class="d-flex align-items-center gap-1 text-muted small" style="white-space:nowrap;">
24
- <input type="checkbox" id="slug-auto"> Auto
29
+ <label class="form-label" for="post-slug">Slug <span data-help="The last part of the post's address, e.g. my-first-post. With Auto ticked it follows the title. Changing it on a published post breaks links to the old address."></span></label>
30
+ <div class="flex gap-2 items-center">
31
+ <input type="text" id="post-slug" class="form-input font-mono">
32
+ <label class="flex items-center gap-1 text-muted text-sm blog-nowrap" for="slug-auto">
33
+ <input type="checkbox" id="slug-auto" class="form-checkbox"> Auto
25
34
  </label>
26
35
  </div>
27
- <div id="slug-warning" class="text-warning small mt-1" style="display:none;">
36
+ <div id="slug-warning" class="text-warning text-sm mt-1 blog-hidden">
28
37
  ⚠ Changing slug breaks existing links
29
38
  </div>
30
39
  </div>
31
40
  <div class="mb-3">
32
- <label class="form-label">Excerpt</label>
33
- <textarea id="post-excerpt" class="form-control" rows="2" placeholder="Short summary…"></textarea>
41
+ <label class="form-label" for="post-excerpt">Excerpt <span data-help="A sentence or two shown in post listings and used as the search-engine description when SEO Description is empty."></span></label>
42
+ <textarea id="post-excerpt" class="form-textarea" rows="2" placeholder="Short summary…"></textarea>
34
43
  </div>
35
44
  <div class="mb-3">
36
- <label class="form-label">Content</label>
37
- <textarea id="post-content" class="form-control font-monospace" rows="20" placeholder="Write in Markdown…"></textarea>
45
+ <label class="form-label" for="post-content">Content <span data-help="Markdown. Every shortcode the site supports works here too."></span></label>
46
+ <textarea id="post-content" class="form-textarea font-mono" rows="20" placeholder="Write in Markdown…"></textarea>
38
47
  </div>
39
48
  </div>
40
49
  </div>
41
50
 
42
51
  <!-- SEO accordion -->
43
52
  <div class="card mb-3">
44
- <div class="card-header" id="seo-toggle" style="cursor:pointer;">
45
- SEO <span class="text-muted small">(click to expand)</span>
53
+ <div class="card-header blog-clickable" id="seo-toggle">
54
+ SEO <span class="text-muted text-sm">(click to expand)</span> <span data-help="Optional overrides for what search engines and link previews show. Leave empty to use the title and excerpt."></span>
46
55
  </div>
47
- <div class="card-body" id="seo-panel" style="display:none;">
56
+ <div class="card-body blog-hidden" id="seo-panel">
48
57
  <div class="mb-3">
49
- <label class="form-label">SEO Title</label>
50
- <input type="text" id="seo-title" class="form-control" placeholder="Overrides page title">
58
+ <label class="form-label" for="seo-title">SEO Title</label>
59
+ <input type="text" id="seo-title" class="form-input" placeholder="Overrides page title">
51
60
  </div>
52
61
  <div class="mb-3">
53
- <label class="form-label">SEO Description</label>
54
- <textarea id="seo-description" class="form-control" rows="2" placeholder="Overrides excerpt for meta description"></textarea>
62
+ <label class="form-label" for="seo-description">SEO Description</label>
63
+ <textarea id="seo-description" class="form-textarea" rows="2" placeholder="Overrides excerpt for meta description"></textarea>
55
64
  </div>
56
65
  </div>
57
66
  </div>
58
67
  </div>
59
68
 
60
69
  <!-- Sidebar -->
61
- <div style="width:280px; flex-shrink:0;">
70
+ <div class="blog-editor-side">
62
71
  <div class="card mb-3">
63
- <div class="card-header">Status</div>
72
+ <div class="card-header">Status <span data-help="Save Draft keeps the post private. Publish Now puts it live. Schedule publishes it at the date and time you choose."></span></div>
64
73
  <div class="card-body">
65
- <div id="schedule-picker" style="display:none;" class="mb-3">
66
- <label class="form-label">Scheduled for</label>
67
- <input type="datetime-local" id="post-scheduled-at" class="form-control">
74
+ <div id="schedule-picker" class="mb-3 blog-hidden">
75
+ <label class="form-label" for="post-scheduled-at">Scheduled for</label>
76
+ <input type="datetime-local" id="post-scheduled-at" class="form-input">
68
77
  </div>
69
- <span id="post-status-badge" class="badge bg-secondary">draft</span>
78
+ <span id="post-status-badge" class="badge badge-secondary">draft</span>
79
+ </div>
80
+ </div>
81
+
82
+ <div class="card mb-3" id="layout-card">
83
+ <div class="card-header blog-card-head">Layout
84
+ <span data-help-title="Post layout"
85
+ data-help="How this post looks on the site. Site default follows Blog settings, so changing the default there moves every post that has not chosen. Each layout is a block you can restyle under Blocks."></span>
86
+ <button type="button" class="btn btn-xs btn-ghost blog-preview-btn" id="btn-preview" title="See the post as readers will, before saving">
87
+ <span data-icon="eye" data-icon-size="13"></span> Preview
88
+ </button>
89
+ </div>
90
+ <div class="card-body">
91
+ <div class="blog-layouts" role="radiogroup" aria-label="Layout" data-each="layoutChoices.value key=id"></div>
92
+ <p class="blog-layout-desc" data-bind-text="layoutDesc.value"></p>
70
93
  </div>
71
94
  </div>
72
95
 
73
96
  <div class="card mb-3">
74
- <div class="card-header">Categories</div>
97
+ <div class="card-header">Categories <span data-help="Manage the list under Blog > Categories. A post can be in several."></span></div>
75
98
  <div class="card-body" id="categories-checklist">
76
- <p class="text-muted small">Loading…</p>
99
+ <p class="text-muted text-sm">Loading…</p>
77
100
  </div>
78
101
  </div>
79
102
 
80
103
  <div class="card mb-3">
81
- <div class="card-header">Tags</div>
104
+ <div class="card-header">Tags <span data-help="Free-form labels, comma-separated. Each tag gets its own page on the site."></span></div>
82
105
  <div class="card-body">
83
- <input type="text" id="post-tags" class="form-control" placeholder="tag1, tag2, …">
84
- <div class="text-muted small mt-1">Comma-separated</div>
106
+ <input type="text" id="post-tags" class="form-input" placeholder="tag1, tag2, …">
107
+ <div class="text-muted text-sm mt-1">Comma-separated</div>
85
108
  </div>
86
109
  </div>
87
110
 
88
111
  <div class="card mb-3">
89
- <div class="card-header">Featured Image</div>
112
+ <div class="card-header">Featured Image <span data-help="Shown at the top of the post and in listings. Pick one from the Media library."></span></div>
90
113
  <div class="card-body">
91
114
  <div id="featured-image-preview" class="mb-2"></div>
92
115
  <button id="btn-pick-image" class="btn btn-sm btn-secondary">Pick Image</button>
93
- <button id="btn-clear-image" class="btn btn-sm btn-outline-secondary" style="display:none;">Clear</button>
116
+ <button id="btn-clear-image" class="btn btn-sm btn-outline blog-hidden">Clear</button>
94
117
  </div>
95
118
  </div>
96
119
  </div>
@@ -1,11 +1,5 @@
1
- <div class="view-header mb-4">
2
- <h1 class="h3 mb-0">Blog Settings</h1>
3
- </div>
4
-
5
- <div class="alert alert-warning mb-4">
6
- Base path and posts-per-page changes require a server restart to take effect.
7
- </div>
8
-
9
- <div class="card" style="max-width:600px;">
1
+ <!-- No heading: the banner above is the title. The same panel opens from the
2
+ banner's cog on every Blog screen; this page is for links that land here. -->
3
+ <div class="card blog-settings-card">
10
4
  <div class="card-body" id="settings-form"></div>
11
5
  </div>