domma-cms 0.43.1 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/CLAUDE.md +53 -53
  2. package/README.md +27 -27
  3. package/admin/css/admin.css +1 -1
  4. package/admin/dist/domma/domma-tools.css +3 -3
  5. package/admin/dist/domma/domma-tools.min.js +3 -3
  6. package/admin/index.html +2 -2
  7. package/admin/js/app.js +1 -1
  8. package/admin/js/lib/card-builder.js +2 -2
  9. package/admin/js/lib/crud-tutorial.js +1 -1
  10. package/admin/js/lib/effect-defs.js +1 -1
  11. package/admin/js/lib/effects-builder.js +1 -1
  12. package/admin/js/lib/image-editor.js +1 -1
  13. package/admin/js/lib/markdown-toolbar.js +2 -2
  14. package/admin/js/lib/project-context.js +1 -1
  15. package/admin/js/lib/project-quick-create.js +1 -1
  16. package/admin/js/lib/scribe-composer.js +1 -1
  17. package/admin/js/lib/server-restart.js +1 -1
  18. package/admin/js/lib/shortcode-context-menu.js +2 -2
  19. package/admin/js/lib/simple-editor.js +1 -1
  20. package/admin/js/lib/themes.js +1 -1
  21. package/admin/js/lib/timeline-builder.js +1 -1
  22. package/admin/js/templates/action-editor.html +8 -8
  23. package/admin/js/templates/api-endpoint-editor.html +7 -7
  24. package/admin/js/templates/api-endpoints.html +1 -1
  25. package/admin/js/templates/api-reference.html +1 -1
  26. package/admin/js/templates/block-editor.html +6 -6
  27. package/admin/js/templates/collection-editor.html +1 -1
  28. package/admin/js/templates/component-editor.html +2 -2
  29. package/admin/js/templates/dashboard/cache.html +3 -3
  30. package/admin/js/templates/dashboard/journeys.html +3 -3
  31. package/admin/js/templates/dashboard/kpi-strip.html +3 -3
  32. package/admin/js/templates/dashboard/top-pages.html +1 -1
  33. package/admin/js/templates/dashboard/traffic-chart.html +1 -1
  34. package/admin/js/templates/docs/api-actions.html +1 -1
  35. package/admin/js/templates/docs/api-collections.html +4 -4
  36. package/admin/js/templates/docs/api-pages.html +2 -2
  37. package/admin/js/templates/docs/api-plugins.html +1 -1
  38. package/admin/js/templates/docs/api-settings.html +2 -2
  39. package/admin/js/templates/docs/api-users.html +1 -1
  40. package/admin/js/templates/docs/components-howto.html +4 -4
  41. package/admin/js/templates/docs/components-reference.html +21 -21
  42. package/admin/js/templates/docs/components-rules.html +14 -14
  43. package/admin/js/templates/docs/components-walkthrough.html +13 -13
  44. package/admin/js/templates/docs/tutorial-crud.html +49 -49
  45. package/admin/js/templates/docs/tutorial-forms.html +4 -4
  46. package/admin/js/templates/docs/tutorial-plugin.html +10 -10
  47. package/admin/js/templates/docs/usage-actions.html +6 -6
  48. package/admin/js/templates/docs/usage-cta-shortcode.html +9 -9
  49. package/admin/js/templates/docs/usage-dconfig.html +4 -4
  50. package/admin/js/templates/docs/usage-navigation.html +1 -1
  51. package/admin/js/templates/docs/usage-pages.html +1 -1
  52. package/admin/js/templates/docs/usage-shortcodes.html +24 -24
  53. package/admin/js/templates/docs/usage-users-roles.html +3 -3
  54. package/admin/js/templates/docs/usage-views.html +4 -4
  55. package/admin/js/templates/documentation.html +1 -1
  56. package/admin/js/templates/effects.html +25 -25
  57. package/admin/js/templates/form-editor.html +5 -5
  58. package/admin/js/templates/login.html +5 -5
  59. package/admin/js/templates/menu-editor.html +10 -10
  60. package/admin/js/templates/navigation.html +11 -11
  61. package/admin/js/templates/notifications.html +1 -1
  62. package/admin/js/templates/page-editor.html +4 -4
  63. package/admin/js/templates/pro-docs.html +14 -14
  64. package/admin/js/templates/role-editor.html +1 -1
  65. package/admin/js/templates/settings.html +10 -10
  66. package/admin/js/templates/tutorials.html +3 -3
  67. package/admin/js/templates/view-editor.html +15 -15
  68. package/admin/js/views/action-editor.js +1 -1
  69. package/admin/js/views/actions-list.js +1 -1
  70. package/admin/js/views/api-endpoint-editor.js +2 -2
  71. package/admin/js/views/api-endpoints.js +2 -2
  72. package/admin/js/views/api-tokens.js +3 -3
  73. package/admin/js/views/blocks.js +2 -2
  74. package/admin/js/views/collection-editor.js +1 -1
  75. package/admin/js/views/collection-entries.js +1 -1
  76. package/admin/js/views/collections.js +1 -1
  77. package/admin/js/views/component-editor.js +1 -1
  78. package/admin/js/views/components.js +4 -4
  79. package/admin/js/views/dashboard/widgets/cache.js +1 -1
  80. package/admin/js/views/dashboard/widgets/journeys.js +1 -1
  81. package/admin/js/views/dashboard/widgets/kpi-strip.js +1 -1
  82. package/admin/js/views/form-editor.js +7 -7
  83. package/admin/js/views/form-submissions.js +1 -1
  84. package/admin/js/views/forms.js +1 -1
  85. package/admin/js/views/layouts.js +1 -1
  86. package/admin/js/views/login.js +2 -2
  87. package/admin/js/views/menu-editor.js +3 -3
  88. package/admin/js/views/menu-locations.js +1 -1
  89. package/admin/js/views/menus.js +3 -3
  90. package/admin/js/views/navigation.js +8 -8
  91. package/admin/js/views/page-editor.js +40 -40
  92. package/admin/js/views/pages.js +3 -3
  93. package/admin/js/views/plugin-code.js +2 -2
  94. package/admin/js/views/plugins.js +1 -1
  95. package/admin/js/views/project-settings.js +1 -1
  96. package/admin/js/views/projects.js +1 -1
  97. package/admin/js/views/roles.js +1 -1
  98. package/admin/js/views/user-editor.js +1 -1
  99. package/admin/js/views/users.js +3 -3
  100. package/admin/js/views/view-editor.js +1 -1
  101. package/admin/js/views/view-preview.js +1 -1
  102. package/admin/js/views/views-list.js +1 -1
  103. package/bin/cli.js +8 -8
  104. package/bin/lib/config-merge.js +5 -5
  105. package/bin/update.js +16 -16
  106. package/config/site.json +86 -86
  107. package/package.json +2 -2
  108. package/plugins/_template/admin/views/index.js +1 -1
  109. package/plugins/_template/config.js +1 -1
  110. package/plugins/_template/plugin.js +1 -1
  111. package/plugins/analytics/admin/templates/analytics.html +3 -3
  112. package/plugins/analytics/admin/views/analytics.js +1 -1
  113. package/plugins/analytics/config.js +1 -1
  114. package/plugins/analytics/plugin.js +4 -4
  115. package/plugins/analytics/plugin.json +1 -1
  116. package/plugins/analytics/public/inject-body.html +2 -2
  117. package/plugins/analytics/public/inject-head.html +1 -1
  118. package/plugins/blog/admin/templates/blog.html +4 -4
  119. package/plugins/blog/admin/views/blog.js +3 -3
  120. package/plugins/blog/admin/views/categories.js +2 -2
  121. package/plugins/blog/admin/views/comments.js +4 -4
  122. package/plugins/blog/admin/views/post-editor.js +1 -1
  123. package/plugins/blog/plugin.js +2 -2
  124. package/plugins/blog/plugin.json +4 -4
  125. package/plugins/contacts/admin/views/contacts.js +8 -8
  126. package/plugins/contacts/plugin.js +4 -4
  127. package/plugins/contacts/plugin.json +1 -1
  128. package/plugins/invoice/admin/templates/editor.html +6 -6
  129. package/plugins/invoice/admin/templates/index.html +4 -4
  130. package/plugins/invoice/admin/views/editor.js +3 -3
  131. package/plugins/invoice/admin/views/index.js +4 -4
  132. package/plugins/invoice/admin/views/issuers.js +1 -1
  133. package/plugins/invoice/admin/views/party-view.js +3 -3
  134. package/plugins/invoice/admin/views/receivers.js +1 -1
  135. package/plugins/invoice/config.js +1 -1
  136. package/plugins/invoice/plugin.js +1 -1
  137. package/plugins/invoice/plugin.json +4 -4
  138. package/plugins/notes/admin/views/notes.js +4 -4
  139. package/plugins/notes/plugin.js +1 -1
  140. package/plugins/notes/plugin.json +1 -1
  141. package/plugins/site-search/admin/templates/site-search.html +3 -3
  142. package/plugins/site-search/admin/views/site-search.js +1 -1
  143. package/plugins/site-search/config.js +1 -1
  144. package/plugins/site-search/plugin.js +4 -4
  145. package/plugins/site-search/plugin.json +1 -1
  146. package/plugins/surveys/admin/templates/results.html +1 -1
  147. package/plugins/surveys/admin/templates/survey-editor.html +4 -4
  148. package/plugins/surveys/admin/views/audience.js +6 -6
  149. package/plugins/surveys/admin/views/results.js +3 -3
  150. package/plugins/surveys/admin/views/survey-editor.js +1 -1
  151. package/plugins/surveys/admin/views/surveys.js +2 -2
  152. package/plugins/surveys/plugin.js +1 -1
  153. package/plugins/surveys/plugin.json +4 -4
  154. package/plugins/theme-switcher/admin/views/theme-switcher.js +1 -1
  155. package/plugins/theme-switcher/plugin.json +3 -3
  156. package/plugins/theme-switcher/public/inject-body.html +28 -28
  157. package/plugins/theme-switcher/public/inject-head.html +1 -1
  158. package/plugins/todo/plugin.js +1 -1
  159. package/public/css/forms.css +1 -1
  160. package/public/js/collection-browser.js +1 -1
  161. package/public/js/collection-context.js +1 -1
  162. package/public/js/form-logic-engine.js +1 -1
  163. package/public/js/forms.js +2 -1
  164. package/public/js/site.js +1 -1
  165. package/scripts/build.js +100 -6
  166. package/scripts/create-plugin.js +2 -2
  167. package/scripts/fresh.js +2 -2
  168. package/scripts/gen-instance-secret.js +1 -1
  169. package/scripts/pro.js +12 -12
  170. package/scripts/reset.js +2 -2
  171. package/scripts/setup.js +15 -15
  172. package/scripts/users.js +5 -5
  173. package/scripts/verify-assets.mjs +6 -6
  174. package/server/config.js +1 -1
  175. package/server/middleware/auth.js +11 -11
  176. package/server/middleware/managerAuth.js +3 -3
  177. package/server/routes/api/actions.js +4 -4
  178. package/server/routes/api/api-endpoints.js +7 -7
  179. package/server/routes/api/api-tokens.js +5 -5
  180. package/server/routes/api/auth.js +10 -10
  181. package/server/routes/api/blocks.js +3 -3
  182. package/server/routes/api/collections.js +18 -18
  183. package/server/routes/api/dashboard.js +5 -5
  184. package/server/routes/api/effects.js +2 -2
  185. package/server/routes/api/endpoints-public.js +5 -5
  186. package/server/routes/api/forms.js +47 -47
  187. package/server/routes/api/menu-locations.js +3 -3
  188. package/server/routes/api/menus.js +7 -7
  189. package/server/routes/api/notifications.js +2 -2
  190. package/server/routes/api/pages.js +14 -2
  191. package/server/routes/api/plugin-marketplace.js +3 -3
  192. package/server/routes/api/plugins.js +6 -6
  193. package/server/routes/api/projects.js +9 -9
  194. package/server/routes/api/scaffold.js +7 -7
  195. package/server/routes/api/settings.js +6 -6
  196. package/server/routes/api/sidebar.js +1 -1
  197. package/server/routes/api/users.js +5 -5
  198. package/server/routes/api/versions.js +1 -1
  199. package/server/routes/api/views.js +1 -1
  200. package/server/routes/docs-public.js +3 -3
  201. package/server/routes/public.js +14 -14
  202. package/server/server.js +34 -16
  203. package/server/services/actions.js +19 -19
  204. package/server/services/adapters/FileAdapter.js +2 -2
  205. package/server/services/adapters/MongoAdapter.js +5 -5
  206. package/server/services/apiEndpoints.js +15 -15
  207. package/server/services/apiTokens.js +7 -7
  208. package/server/services/blocks.js +13 -13
  209. package/server/services/cache/drivers/MemoryDriver.js +3 -3
  210. package/server/services/cache/drivers/NoneDriver.js +1 -1
  211. package/server/services/cache/index.js +5 -5
  212. package/server/services/collections.js +14 -14
  213. package/server/services/components.js +9 -9
  214. package/server/services/connectionManager.js +4 -4
  215. package/server/services/content.js +25 -2
  216. package/server/services/docs.js +14 -14
  217. package/server/services/email.js +1 -1
  218. package/server/services/filterEngine.js +6 -6
  219. package/server/services/forms.js +18 -10
  220. package/server/services/health.js +1 -1
  221. package/server/services/hooks.js +7 -7
  222. package/server/services/images.js +4 -4
  223. package/server/services/managerClient.js +1 -1
  224. package/server/services/markdown.js +79 -79
  225. package/server/services/menuRender.js +5 -5
  226. package/server/services/menus-migration.js +3 -3
  227. package/server/services/menus.js +31 -31
  228. package/server/services/permissionRegistry.js +1 -1
  229. package/server/services/pluginFiles.js +5 -5
  230. package/server/services/pluginInstaller.js +17 -17
  231. package/server/services/pluginScaffold.js +1 -1
  232. package/server/services/plugins.js +17 -17
  233. package/server/services/presetCollections.js +2 -2
  234. package/server/services/projects.js +35 -26
  235. package/server/services/recipes/contact-list.json +1 -1
  236. package/server/services/recipes/onboarding.json +8 -8
  237. package/server/services/references.js +8 -8
  238. package/server/services/renderer.js +9 -9
  239. package/server/services/roles.js +9 -9
  240. package/server/services/rowAccess.js +10 -10
  241. package/server/services/scaffolder.js +30 -30
  242. package/server/services/sidebar-migration.js +10 -10
  243. package/server/services/sitemap.js +1 -1
  244. package/server/services/userProfiles.js +4 -4
  245. package/server/services/userRoles.js +7 -7
  246. package/server/services/users.js +5 -5
  247. package/server/services/versions.js +3 -3
  248. package/server/services/viewPipeline.js +6 -6
  249. package/server/services/views.js +11 -11
  250. package/server/templates/page.html +5 -5
  251. package/config/navigation.json.bak +0 -31
@@ -14,14 +14,14 @@
14
14
  <h3>Creating an Action</h3>
15
15
  <ol>
16
16
  <li>Navigate to <strong>Data → Actions</strong> and click <strong>New Action</strong>.</li>
17
- <li><strong>General tab</strong> — enter a title and select the target collection.</li>
18
- <li><strong>Trigger tab</strong> — configure the button label, icon, and optional confirmation
17
+ <li><strong>General tab</strong> - enter a title and select the target collection.</li>
18
+ <li><strong>Trigger tab</strong> - configure the button label, icon, and optional confirmation
19
19
  message.
20
20
  </li>
21
- <li><strong>Steps tab</strong> — add steps in order. Each step runs sequentially; if one fails the
21
+ <li><strong>Steps tab</strong> - add steps in order. Each step runs sequentially; if one fails the
22
22
  action stops.
23
23
  </li>
24
- <li><strong>Access tab</strong> — select which roles can trigger this action.</li>
24
+ <li><strong>Access tab</strong> - select which roles can trigger this action.</li>
25
25
  <li>Click <strong>Save Action</strong>. The button will appear on the collection's entry list.
26
26
  </li>
27
27
  </ol>
@@ -100,7 +100,7 @@
100
100
  </tr>
101
101
  </tbody>
102
102
  </table>
103
- <p><strong>Example</strong> — approve an application and notify by email:</p>
103
+ <p><strong>Example</strong> - approve an application and notify by email:</p>
104
104
  <pre class="code-block"><code>Step 1: updateField field=status value=approved
105
105
  Step 2: updateField field=approvedAt value={{now}}
106
106
  Step 3: email to={{entry.data.email}}
@@ -110,7 +110,7 @@ Step 3: email to={{entry.data.email}}
110
110
  <h3>Partial Execution</h3>
111
111
  <p>Actions are <strong>not transactional</strong>. If a step fails, the action stops and returns the
112
112
  number of steps completed so far (<code>stepsCompleted</code>). Steps that already ran are
113
- <strong>not rolled back</strong>. Design step order with this in mind — put irreversible steps
113
+ <strong>not rolled back</strong>. Design step order with this in mind - put irreversible steps
114
114
  (delete, email) last.</p>
115
115
 
116
116
  <h3>After a deleteEntry step</h3>
@@ -30,13 +30,13 @@
30
30
  <tr>
31
31
  <td><code>action</code></td>
32
32
  <td>Yes</td>
33
- <td>—</td>
33
+ <td>-</td>
34
34
  <td>Action slug</td>
35
35
  </tr>
36
36
  <tr>
37
37
  <td><code>entry</code></td>
38
38
  <td>Yes</td>
39
- <td>—</td>
39
+ <td>-</td>
40
40
  <td>Entry UUID to act on</td>
41
41
  </tr>
42
42
  <tr>
@@ -54,19 +54,19 @@
54
54
  <tr>
55
55
  <td><code>icon</code></td>
56
56
  <td>No</td>
57
- <td>—</td>
57
+ <td>-</td>
58
58
  <td>Domma icon name</td>
59
59
  </tr>
60
60
  <tr>
61
61
  <td><code>size</code></td>
62
62
  <td>No</td>
63
- <td>—</td>
63
+ <td>-</td>
64
64
  <td>sm · md · lg</td>
65
65
  </tr>
66
66
  <tr>
67
67
  <td><code>confirm</code></td>
68
68
  <td>No</td>
69
- <td>—</td>
69
+ <td>-</td>
70
70
  <td>Confirmation prompt before executing</td>
71
71
  </tr>
72
72
  </tbody>
@@ -91,8 +91,8 @@
91
91
  <tbody>
92
92
  <tr>
93
93
  <td><code>cta</code></td>
94
- <td>—</td>
95
- <td>Action slug — enables per-entry buttons</td>
94
+ <td>-</td>
95
+ <td>Action slug - enables per-entry buttons</td>
96
96
  </tr>
97
97
  <tr>
98
98
  <td><code>cta-label</code></td>
@@ -101,7 +101,7 @@
101
101
  </tr>
102
102
  <tr>
103
103
  <td><code>cta-icon</code></td>
104
- <td>—</td>
104
+ <td>-</td>
105
105
  <td>Domma icon name</td>
106
106
  </tr>
107
107
  <tr>
@@ -111,7 +111,7 @@
111
111
  </tr>
112
112
  <tr>
113
113
  <td><code>cta-confirm</code></td>
114
- <td>—</td>
114
+ <td>-</td>
115
115
  <td>Confirmation prompt</td>
116
116
  </tr>
117
117
  </tbody>
@@ -7,18 +7,18 @@
7
7
  <div class="col-12">
8
8
  <div class="docs-body">
9
9
 
10
- <p>DConfig lets you wire up declarative behaviour on any public page — no JavaScript required. Define
10
+ <p>DConfig lets you wire up declarative behaviour on any public page - no JavaScript required. Define
11
11
  event
12
12
  handlers and class toggles in JSON; the page runtime applies them automatically on load.</p>
13
13
 
14
14
  <p>DConfig can be set in two ways, and both are merged at runtime (inline shortcode wins on selector
15
15
  conflict):</p>
16
16
  <ul>
17
- <li><strong>Page editor</strong> — the <em>DConfig</em> collapsible section accepts a JSON blob
17
+ <li><strong>Page editor</strong> - the <em>DConfig</em> collapsible section accepts a JSON blob
18
18
  stored in page
19
19
  frontmatter and injected as <code>window.__CMS_DCONFIG__</code>.
20
20
  </li>
21
- <li><strong>Inline shortcode</strong> — place one or more <code>[dconfig]…[/dconfig]</code> blocks
21
+ <li><strong>Inline shortcode</strong> - place one or more <code>[dconfig]…[/dconfig]</code> blocks
22
22
  directly in
23
23
  the page body Markdown.
24
24
  </li>
@@ -116,7 +116,7 @@ Content goes here.
116
116
 
117
117
  <h3>Multiple selectors</h3>
118
118
  <p>Any number of selectors can appear in one block. Selectors are matched with
119
- <code>document.querySelector</code> — use IDs, classes, or attribute selectors.</p>
119
+ <code>document.querySelector</code> - use IDs, classes, or attribute selectors.</p>
120
120
  <pre class="code-block"><code>[dconfig]
121
121
  {
122
122
  "#show-btn": {
@@ -14,7 +14,7 @@
14
14
  <h3>Dropdowns</h3>
15
15
  <p>Nest items under a parent using the drag-and-drop tree in the Navigation editor. Child items are
16
16
  stored under
17
- the <code>items</code> key — the public navbar renders them as a dropdown.</p>
17
+ the <code>items</code> key - the public navbar renders them as a dropdown.</p>
18
18
 
19
19
  <h3>External links</h3>
20
20
  <p>Set the URL to a full <code>https://</code> address to link outside the site. Leave blank for
@@ -54,7 +54,7 @@ updatedAt: 2026-03-01 # auto-set on save
54
54
  Your Markdown content goes here.</code></pre>
55
55
 
56
56
  <h3>Drafts</h3>
57
- <p>Pages with <code>status: draft</code> are never served on the public site — they return a 404.
57
+ <p>Pages with <code>status: draft</code> are never served on the public site - they return a 404.
58
58
  Toggle status
59
59
  in the Page Editor to publish.</p>
60
60
 
@@ -23,11 +23,11 @@
23
23
  <tbody>
24
24
  <tr>
25
25
  <td><code>[grid cols="N" gap="N"]...[/grid]</code></td>
26
- <td>CSS Grid container — N columns (1–12), optional gap (1–6)</td>
26
+ <td>CSS Grid container - N columns (1-12), optional gap (1-6)</td>
27
27
  </tr>
28
28
  <tr>
29
29
  <td><code>[row gap="N"]...[/row]</code></td>
30
- <td>Flexbox row — columns share width equally</td>
30
+ <td>Flexbox row - columns share width equally</td>
31
31
  </tr>
32
32
  <tr>
33
33
  <td><code>[col span="N"]...[/col]</code></td>
@@ -47,7 +47,7 @@
47
47
  <tbody>
48
48
  <tr>
49
49
  <td><code>[card title="..."]...[/card]</code></td>
50
- <td>Styled card. Supports 6 variants, ~44 gradients and 33 layouts — see the
50
+ <td>Styled card. Supports 6 variants, ~44 gradients and 33 layouts - see the
51
51
  <strong>Cards</strong> subsection below.
52
52
  </td>
53
53
  </tr>
@@ -88,11 +88,11 @@
88
88
  </tbody>
89
89
  </table>
90
90
 
91
- <h3>Cards &mdash; variants, gradients &amp; layouts</h3>
91
+ <h3>Cards - variants, gradients &amp; layouts</h3>
92
92
  <p>The <code>[card]</code> shortcode is the most configurable component in the system. It has three
93
93
  layers you can mix freely: <strong>variant</strong> (the overall visual style), <strong>gradient</strong>
94
94
  (colour palette, used with <code>variant="gradient"</code> or any layout that accepts a gradient),
95
- and <strong>layout</strong> (the internal structure — header/body/footer, image position, sub-tags,
95
+ and <strong>layout</strong> (the internal structure - header/body/footer, image position, sub-tags,
96
96
  etc.). Every layout accepts every variant, gradient and universal attribute listed below.</p>
97
97
  <pre><code>[card variant="gradient" gradient="ocean" layout="icon-top" icon="star" title="Fast"]
98
98
  Body content in **Markdown** is supported.
@@ -109,7 +109,7 @@ Body content in **Markdown** is supported.
109
109
  <tbody>
110
110
  <tr>
111
111
  <td><code>clean</code></td>
112
- <td>Flat, minimal chrome &mdash; no border, subtle background</td>
112
+ <td>Flat, minimal chrome - no border, subtle background</td>
113
113
  </tr>
114
114
  <tr>
115
115
  <td><code>gradient</code></td>
@@ -126,7 +126,7 @@ Body content in **Markdown** is supported.
126
126
  </tr>
127
127
  <tr>
128
128
  <td><code>dark</code></td>
129
- <td>Dark background with inverted text &mdash; good on light pages</td>
129
+ <td>Dark background with inverted text - good on light pages</td>
130
130
  </tr>
131
131
  <tr>
132
132
  <td><code>glow</code></td>
@@ -134,13 +134,13 @@ Body content in **Markdown** is supported.
134
134
  </tr>
135
135
  <tr>
136
136
  <td><code>primary</code></td>
137
- <td>Legacy alias &mdash; adds <code>card-primary</code> class for backwards compatibility</td>
137
+ <td>Legacy alias - adds <code>card-primary</code> class for backwards compatibility</td>
138
138
  </tr>
139
139
  </tbody>
140
140
  </table>
141
141
 
142
142
  <h4>Built-in gradients</h4>
143
- <p>Shipped in <code>public/css/</code> &mdash; available on every install. Default when
143
+ <p>Shipped in <code>public/css/</code> - available on every install. Default when
144
144
  <code>gradient</code> is omitted: <code>indigo</code>.</p>
145
145
  <p><code>arctic</code>, <code>aurora</code>, <code>dusk</code>, <code>fire</code>, <code>forest</code>,
146
146
  <code>gold</code>, <code>indigo</code>, <code>lagoon</code>, <code>lime</code>,
@@ -148,7 +148,7 @@ Body content in **Markdown** is supported.
148
148
  <code>sunset</code></p>
149
149
 
150
150
  <h4>Project-specific gradients</h4>
151
- <p>Defined in <code>content/custom.css</code> on this site only &mdash; fresh installs will not have
151
+ <p>Defined in <code>content/custom.css</code> on this site only - fresh installs will not have
152
152
  these unless the CSS is copied over.</p>
153
153
  <p><strong>Single-tone:</strong> <code>purple</code>, <code>blue</code>, <code>green</code>,
154
154
  <code>night</code></p>
@@ -162,7 +162,7 @@ Body content in **Markdown** is supported.
162
162
  <code>silver-dark</code>, <code>charcoal-dark</code>, <code>christmas-dark</code>,
163
163
  <code>unicorn-dark</code>, <code>dreamy-dark</code>, <code>grayve-dark</code>,
164
164
  <code>mint-dark</code>, <code>wedding-dark</code></p>
165
- <p class="text-muted"><small>Gradient names are not validated &mdash; a typo falls through to the
165
+ <p class="text-muted"><small>Gradient names are not validated - a typo falls through to the
166
166
  default background with no warning. Use <code>/test-card-gradients</code> to preview every
167
167
  palette.</small></p>
168
168
 
@@ -311,7 +311,7 @@ Body content in **Markdown** is supported.
311
311
  <tr>
312
312
  <td><code>icon-top</code></td>
313
313
  <td><code>icon</code>, <code>title</code>, <code>subtitle</code></td>
314
- <td>Large centred icon above title &mdash; good for feature grids</td>
314
+ <td>Large centred icon above title - good for feature grids</td>
315
315
  </tr>
316
316
  <tr>
317
317
  <td><code>icon-inline</code></td>
@@ -387,7 +387,7 @@ Body content in **Markdown** is supported.
387
387
  <tr>
388
388
  <td><code>location-map</code></td>
389
389
  <td><code>address</code>, <code>title</code></td>
390
- <td>Placeholder map panel + address block (static &mdash; no live map)</td>
390
+ <td>Placeholder map panel + address block (static - no live map)</td>
391
391
  </tr>
392
392
  </tbody>
393
393
  </table>
@@ -407,7 +407,7 @@ Body content in **Markdown** is supported.
407
407
  <td><code>icon</code>, <code>title</code>, <code>subtitle</code>,
408
408
  <code>tags</code> (comma-separated)
409
409
  </td>
410
- <td>Circular avatar + name + role + pill tags &mdash; team / author cards</td>
410
+ <td>Circular avatar + name + role + pill tags - team / author cards</td>
411
411
  </tr>
412
412
  <tr>
413
413
  <td><code>quote-testimonial</code></td>
@@ -416,7 +416,7 @@ Body content in **Markdown** is supported.
416
416
  </tr>
417
417
  <tr>
418
418
  <td><code>rating-review</code></td>
419
- <td><code>rating</code> (0&ndash;5), <code>title</code>, <code>subtitle</code>,
419
+ <td><code>rating</code> (0-5), <code>title</code>, <code>subtitle</code>,
420
420
  <code>verified</code> (flag)
421
421
  </td>
422
422
  <td>Star rating + review body + reviewer attribution</td>
@@ -437,7 +437,7 @@ Body content in **Markdown** is supported.
437
437
  <tr>
438
438
  <td><code>stat-metric</code></td>
439
439
  <td><code>title</code> (label), <code>value</code>, <code>delta</code>,
440
- <code>progress</code> (0&ndash;100)
440
+ <code>progress</code> (0-100)
441
441
  </td>
442
442
  <td>Big-number KPI tile with delta arrow and optional progress bar</td>
443
443
  </tr>
@@ -493,12 +493,12 @@ Body content in **Markdown** is supported.
493
493
  <tr>
494
494
  <td><code>tag-cloud</code></td>
495
495
  <td><code>title</code>, <code>tags</code> (comma-separated)</td>
496
- <td>Coloured pill list &mdash; topic tags, skills, categories</td>
496
+ <td>Coloured pill list - topic tags, skills, categories</td>
497
497
  </tr>
498
498
  <tr>
499
499
  <td><code>timeline-entry</code></td>
500
500
  <td><code>title</code>, <code>subtitle</code> (date), <code>badge</code> (tag)</td>
501
- <td>Single dot-on-line timeline entry &mdash; stack several for a history list</td>
501
+ <td>Single dot-on-line timeline entry - stack several for a history list</td>
502
502
  </tr>
503
503
  </tbody>
504
504
  </table>
@@ -572,7 +572,7 @@ Body content in **Markdown** is supported.
572
572
  </table>
573
573
 
574
574
  <h4>Sub-tag reference</h4>
575
- <p>These are child tags accepted by specific layouts &mdash; they are not shortcodes in their own right
575
+ <p>These are child tags accepted by specific layouts - they are not shortcodes in their own right
576
576
  and only render inside a matching parent card.</p>
577
577
  <table class="table table-sm">
578
578
  <thead>
@@ -586,7 +586,7 @@ Body content in **Markdown** is supported.
586
586
  <tr>
587
587
  <td><code>[feature]text[/feature]</code></td>
588
588
  <td><code>pricing</code>, <code>feature-comparison</code></td>
589
- <td><code>excluded</code> (flag, comparison only) &mdash; renders as a cross instead of a tick
589
+ <td><code>excluded</code> (flag, comparison only) - renders as a cross instead of a tick
590
590
  </td>
591
591
  </tr>
592
592
  <tr>
@@ -607,7 +607,7 @@ Body content in **Markdown** is supported.
607
607
  <tr>
608
608
  <td><code>[milestone done]text[/milestone]</code></td>
609
609
  <td><code>progress-goal</code></td>
610
- <td><code>done</code> (flag) &mdash; filled dot if present, hollow otherwise</td>
610
+ <td><code>done</code> (flag) - filled dot if present, hollow otherwise</td>
611
611
  </tr>
612
612
  </tbody>
613
613
  </table>
@@ -681,7 +681,7 @@ Body content in **Markdown** is supported.
681
681
  <td><code>field=value</code> or<br><code>f1=v1,f2=v2</code></td>
682
682
  <td>Row filter (simple equality only, AND'd across comma-separated predicates). Example:
683
683
  <code>where="tab=developers"</code> or
684
- <code>where="tier=free,featured=true"</code>. No OR, no comparison operators &mdash;
684
+ <code>where="tier=free,featured=true"</code>. No OR, no comparison operators -
685
685
  use a saved View for anything more complex.
686
686
  </td>
687
687
  </tr>
@@ -703,7 +703,7 @@ Body content in **Markdown** is supported.
703
703
  <tr>
704
704
  <td><code>fields</code></td>
705
705
  <td>comma-separated field names</td>
706
- <td>Column filter &mdash; only these fields are shown (table/cards/list displays only).
706
+ <td>Column filter - only these fields are shown (table/cards/list displays only).
707
707
  </td>
708
708
  </tr>
709
709
  <tr>
@@ -776,7 +776,7 @@ Body content in **Markdown** is supported.
776
776
  </tr>
777
777
  <tr>
778
778
  <td><code>[dconfig]{...}[/dconfig]</code></td>
779
- <td>Declarative click handlers and class toggles — no JavaScript needed</td>
779
+ <td>Declarative click handlers and class toggles - no JavaScript needed</td>
780
780
  </tr>
781
781
  </tbody>
782
782
  </table>
@@ -22,7 +22,7 @@
22
22
  <tbody>
23
23
  <tr>
24
24
  <td><strong>Admin</strong></td>
25
- <td>Full access — users, plugins, settings, all content.</td>
25
+ <td>Full access - users, plugins, settings, all content.</td>
26
26
  </tr>
27
27
  <tr>
28
28
  <td><strong>Manager</strong></td>
@@ -42,11 +42,11 @@
42
42
  <h3>Authentication</h3>
43
43
  <p>The admin panel uses JWT Bearer tokens. Tokens are stored in the browser and automatically
44
44
  refreshed.
45
- Sessions expire according to <code>config/auth.json</code> — default is 24 hours.</p>
45
+ Sessions expire according to <code>config/auth.json</code> - default is 24 hours.</p>
46
46
 
47
47
  <h3>Views &amp; Actions</h3>
48
48
  <p>Views and Actions are pro-only features that require a MongoDB connection.
49
- Both roles — Admin and Manager — can create, edit, and run Views and Actions.</p>
49
+ Both roles - Admin and Manager - can create, edit, and run Views and Actions.</p>
50
50
  <table class="table table-sm">
51
51
  <thead>
52
52
  <tr>
@@ -14,16 +14,16 @@
14
14
  <h3>Creating a View</h3>
15
15
  <ol>
16
16
  <li>Navigate to <strong>Data → Views</strong> and click <strong>New View</strong>.</li>
17
- <li><strong>Source tab</strong> — enter a title, choose the primary source collection, and select
17
+ <li><strong>Source tab</strong> - enter a title, choose the primary source collection, and select
18
18
  the MongoDB connection.
19
19
  </li>
20
- <li><strong>Pipeline tab</strong> — add aggregation stages in order. Each stage has a type and a
20
+ <li><strong>Pipeline tab</strong> - add aggregation stages in order. Each stage has a type and a
21
21
  JSON config object.
22
22
  </li>
23
- <li><strong>Display tab</strong> — choose table or list mode, set page size, and optionally define
23
+ <li><strong>Display tab</strong> - choose table or list mode, set page size, and optionally define
24
24
  column definitions.
25
25
  </li>
26
- <li><strong>Access tab</strong> — select which roles can access this view and whether it is
26
+ <li><strong>Access tab</strong> - select which roles can access this view and whether it is
27
27
  publicly accessible.
28
28
  </li>
29
29
  <li>Click <strong>Save View</strong>, then use <strong>Preview</strong> to execute and inspect the
@@ -7,7 +7,7 @@
7
7
  <div class="docs-body">
8
8
 
9
9
  <p class="lead">
10
- Task-by-task reference for running a Domma CMS site. Pick a topic below — each opens as its own
10
+ Task-by-task reference for running a Domma CMS site. Pick a topic below - each opens as its own
11
11
  page, and every topic is also listed under <strong>Documentation → Usage</strong> in the sidebar.
12
12
  </p>
13
13
 
@@ -52,7 +52,7 @@
52
52
  <input id="field-default-threshold" type="number" class="form-input" min="0" max="1"
53
53
  step="0.05"
54
54
  placeholder="0.1">
55
- <span class="form-hint">Fraction of element visible before reveal fires (0.0–1.0).</span>
55
+ <span class="form-hint">Fraction of element visible before reveal fires (0.0-1.0).</span>
56
56
  </div>
57
57
  </div>
58
58
  </div>
@@ -112,7 +112,7 @@ Markdown **works** inside.
112
112
  <tr>
113
113
  <td><code>threshold</code></td>
114
114
  <td>0.1</td>
115
- <td>Fraction visible before triggering (0–1)</td>
115
+ <td>Fraction visible before triggering (0-1)</td>
116
116
  </tr>
117
117
  <tr>
118
118
  <td><code>once</code></td>
@@ -147,8 +147,8 @@ Markdown **works** inside.
147
147
  <tbody>
148
148
  <tr>
149
149
  <td><code>reveal</code></td>
150
- <td>—</td>
151
- <td>Flag — enables scroll-triggered reveal on child columns</td>
150
+ <td>-</td>
151
+ <td>Flag - enables scroll-triggered reveal on child columns</td>
152
152
  </tr>
153
153
  <tr>
154
154
  <td><code>reveal-animation</code></td>
@@ -200,14 +200,14 @@ Markdown **works** inside.
200
200
  <!-- Animation tab -->
201
201
  <div id="tab-animation" class="effects-tab-panel">
202
202
  <h3 class="mb-2">Breathe</h3>
203
- <p class="text-muted mb-2">Continuous gentle scaling — makes elements feel alive. Ideal for hero images or
203
+ <p class="text-muted mb-2">Continuous gentle scaling - makes elements feel alive. Ideal for hero images or
204
204
  call-to-action buttons.</p>
205
205
  <pre class="code-block mb-3">[breathe amplitude="8" duration="3000"]
206
206
  Content that breathes.
207
207
  [/breathe]</pre>
208
208
 
209
209
  <h3 class="mb-2">Pulse</h3>
210
- <p class="text-muted mb-2">A repeating scale pulse — stronger than breathe, good for alerts or badges.</p>
210
+ <p class="text-muted mb-2">A repeating scale pulse - stronger than breathe, good for alerts or badges.</p>
211
211
  <pre class="code-block mb-3">[pulse scale="1.05" duration="1000"]
212
212
  Pulsing content.
213
213
  [/pulse]</pre>
@@ -220,7 +220,7 @@ This will shake.
220
220
  [/shake]</pre>
221
221
 
222
222
  <h3 class="mb-2">CSS Animate</h3>
223
- <p class="text-muted mb-2">Applies Domma CSS animation utility classes — no JavaScript required.</p>
223
+ <p class="text-muted mb-2">Applies Domma CSS animation utility classes - no JavaScript required.</p>
224
224
  <pre class="code-block mb-2">[animate type="fade-in-up" duration="normal" delay="200" repeat="once"]
225
225
  Content here.
226
226
  [/animate]</pre>
@@ -266,7 +266,7 @@ Content here.
266
266
  Your text appears letter by letter.
267
267
  [/scribe]</pre>
268
268
 
269
- <h4 class="mb-1" style="font-size:.9rem;">Script mode — action shortcodes</h4>
269
+ <h4 class="mb-1" style="font-size:.9rem;">Script mode - action shortcodes</h4>
270
270
  <pre class="code-block mb-2">[scribe loop="true" loop-delay="2000"]
271
271
  [render effect="fade"]Hello, world![/render]
272
272
  [wait]1500[/wait]
@@ -333,7 +333,7 @@ Your text appears letter by letter.
333
333
  </tr>
334
334
  <tr>
335
335
  <td><code>cursor-type</code></td>
336
- <td>—</td>
336
+ <td>-</td>
337
337
  <td>Cursor style (block, underline, beam)</td>
338
338
  </tr>
339
339
  <tr>
@@ -392,12 +392,12 @@ Scrambled reveal text.
392
392
  </tr>
393
393
  <tr>
394
394
  <td><code>prefix</code></td>
395
- <td>—</td>
395
+ <td>-</td>
396
396
  <td>Text before the number (e.g. $)</td>
397
397
  </tr>
398
398
  <tr>
399
399
  <td><code>suffix</code></td>
400
- <td>—</td>
400
+ <td>-</td>
401
401
  <td>Text after the number (e.g. +)</td>
402
402
  </tr>
403
403
  <tr>
@@ -407,13 +407,13 @@ Scrambled reveal text.
407
407
  </tr>
408
408
  <tr>
409
409
  <td><code>separator</code></td>
410
- <td>—</td>
410
+ <td>-</td>
411
411
  <td>Thousands separator (e.g. ,)</td>
412
412
  </tr>
413
413
  </tbody>
414
414
  </table>
415
- <p class="text-muted" style="font-size:.85rem;"><strong>Tip:</strong> Counters work great in a grid — place
416
- 3–4
415
+ <p class="text-muted" style="font-size:.85rem;"><strong>Tip:</strong> Counters work great in a grid - place
416
+ 3-4
417
417
  counter spans in a <code>[grid cols="4"]</code> for a stats section.</p>
418
418
  </div>
419
419
 
@@ -434,7 +434,7 @@ Content beneath the particles.
434
434
  [/twinkle]</pre>
435
435
 
436
436
  <h3 class="mb-2">Ambient Background</h3>
437
- <p class="text-muted mb-2">Applies animated CSS background classes — no JavaScript needed.</p>
437
+ <p class="text-muted mb-2">Applies animated CSS background classes - no JavaScript needed.</p>
438
438
  <pre class="code-block mb-2">[ambient type="float-blobs" speed="slow" intensity="subtle"]
439
439
  Content on animated background.
440
440
  [/ambient]</pre>
@@ -532,7 +532,7 @@ A compelling subheading that draws users in.
532
532
  <!-- Celebrations tab -->
533
533
  <div id="tab-celebrations" class="effects-tab-panel">
534
534
  <h3 class="mb-2">Firework <span class="badge badge-info">CSS only</span></h3>
535
- <p class="text-muted mb-2">Pure CSS particle effect — no JavaScript required. Works even without the plugin
535
+ <p class="text-muted mb-2">Pure CSS particle effect - no JavaScript required. Works even without the plugin
536
536
  enabled. Use self-closing for standalone particles, or wrapping to apply the firework classes to
537
537
  content.</p>
538
538
  <pre class="code-block mb-2">[firework type="burst" colour="rainbow" size="lg" continuous="true" /]</pre>
@@ -604,35 +604,35 @@ Click me for a burst!
604
604
  </tr>
605
605
  <tr>
606
606
  <td><code>christmas</code></td>
607
- <td>1 Dec – 1 Jan (snowflakes)</td>
607
+ <td>1 Dec - 1 Jan (snowflakes)</td>
608
608
  </tr>
609
609
  <tr>
610
610
  <td><code>halloween</code></td>
611
- <td>26 Oct – 31 Oct (bats &amp; pumpkins)</td>
611
+ <td>26 Oct - 31 Oct (bats &amp; pumpkins)</td>
612
612
  </tr>
613
613
  <tr>
614
614
  <td><code>valentines</code></td>
615
- <td>9 Feb – 14 Feb (hearts)</td>
615
+ <td>9 Feb - 14 Feb (hearts)</td>
616
616
  </tr>
617
617
  <tr>
618
618
  <td><code>guy-fawkes</code></td>
619
- <td>1 Nov – 5 Nov (fireworks)</td>
619
+ <td>1 Nov - 5 Nov (fireworks)</td>
620
620
  </tr>
621
621
  <tr>
622
622
  <td><code>st-patricks</code></td>
623
- <td>12 Mar – 17 Mar (shamrocks)</td>
623
+ <td>12 Mar - 17 Mar (shamrocks)</td>
624
624
  </tr>
625
625
  <tr>
626
626
  <td><code>st-davids</code></td>
627
- <td>24 Feb – 1 Mar (daffodils)</td>
627
+ <td>24 Feb - 1 Mar (daffodils)</td>
628
628
  </tr>
629
629
  <tr>
630
630
  <td><code>st-georges</code></td>
631
- <td>18 Apr – 23 Apr (roses)</td>
631
+ <td>18 Apr - 23 Apr (roses)</td>
632
632
  </tr>
633
633
  <tr>
634
634
  <td><code>st-andrews</code></td>
635
- <td>25 Nov – 30 Nov (thistles)</td>
635
+ <td>25 Nov - 30 Nov (thistles)</td>
636
636
  </tr>
637
637
  </tbody>
638
638
  </table>
@@ -724,7 +724,7 @@ The strips rain down inside this block only.
724
724
  <tr>
725
725
  <td><code>fade-start</code></td>
726
726
  <td>0.55</td>
727
- <td>Fraction of fall (0&ndash;1) before strips begin to fade</td>
727
+ <td>Fraction of fall (0-1) before strips begin to fade</td>
728
728
  </tr>
729
729
  <tr>
730
730
  <td><code>burst</code></td>
@@ -60,7 +60,7 @@
60
60
  <div class="card-header" style="display:flex;justify-content:space-between;align-items:center;">
61
61
  <h2><span data-icon="eye"></span> Preview</h2>
62
62
  <span id="preview-test-badge"
63
- style="display:none;font-size:.75rem;padding:.2rem .6rem;border-radius:999px;background:color-mix(in srgb, var(--dm-primary) 15%, transparent);color:var(--dm-primary,#6366f1);">Test Mode — submissions are stored</span>
63
+ style="display:none;font-size:.75rem;padding:.2rem .6rem;border-radius:999px;background:color-mix(in srgb, var(--dm-primary) 15%, transparent);color:var(--dm-primary,#6366f1);">Test Mode - submissions are stored</span>
64
64
  </div>
65
65
  <div class="card-body">
66
66
  <div id="preview-container"></div>
@@ -100,7 +100,7 @@
100
100
  <div class="col-6">
101
101
  <label class="form-label">Project</label>
102
102
  <select id="field-project" class="form-input">
103
- <option value="">— none —</option>
103
+ <option value="">- none -</option>
104
104
  </select>
105
105
  <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Tag this form to a project for grouping.</p>
106
106
  </div>
@@ -141,9 +141,9 @@
141
141
  <div class="mb-3">
142
142
  <label class="form-label">Layout</label>
143
143
  <select id="setting-layout" class="form-select">
144
+ <option value="grid">Grid</option>
144
145
  <option value="stacked">Stacked</option>
145
146
  <option value="inline">Inline</option>
146
- <option value="grid">Grid</option>
147
147
  </select>
148
148
  </div>
149
149
  <div id="columns-group" style="display:none;">
@@ -219,11 +219,11 @@
219
219
  <div class="mb-3">
220
220
  <label class="form-label">Action on Submit</label>
221
221
  <select id="action-cms-slug" class="form-select">
222
- <option value="">— None —</option>
222
+ <option value="">- None -</option>
223
223
  </select>
224
224
  <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">
225
225
  Run a CMS Action after the entry is stored. Requires Pro (MongoDB).
226
- Failures are non-fatal — the submission is always saved first.
226
+ Failures are non-fatal - the submission is always saved first.
227
227
  </p>
228
228
  </div>
229
229
  </div>