domma-cms 0.92.1 → 0.94.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 (177) hide show
  1. package/CLAUDE.md +5 -3
  2. package/admin/css/admin.css +1 -1
  3. package/admin/js/app.js +2 -2
  4. package/admin/js/lib/action-editor-arrange.js +1 -1
  5. package/admin/js/lib/api-tokens-arrange.js +2 -2
  6. package/admin/js/lib/block-editor-arrange.js +1 -1
  7. package/admin/js/lib/blocks-arrange.js +1 -1
  8. package/admin/js/lib/collection-entries-arrange.js +1 -1
  9. package/admin/js/lib/components-arrange.js +1 -1
  10. package/admin/js/lib/dashboard-arrange.js +1 -1
  11. package/admin/js/lib/dates.js +1 -0
  12. package/admin/js/lib/forms-arrange.js +1 -1
  13. package/admin/js/lib/media-arrange.js +1 -1
  14. package/admin/js/lib/notifications-arrange.js +1 -1
  15. package/admin/js/lib/pages-arrange.js +1 -1
  16. package/admin/js/lib/related.js +1 -1
  17. package/admin/js/lib/timeline-builder.js +2 -2
  18. package/admin/js/templates/action-editor.html +6 -5
  19. package/admin/js/templates/actions-list.html +1 -1
  20. package/admin/js/templates/contacts.html +1 -1
  21. package/admin/js/templates/docs/api-actions.html +86 -60
  22. package/admin/js/templates/docs/api-authentication.html +159 -123
  23. package/admin/js/templates/docs/api-builder.html +197 -0
  24. package/admin/js/templates/docs/api-collections.html +199 -259
  25. package/admin/js/templates/docs/api-external.html +225 -0
  26. package/admin/js/templates/docs/api-forms.html +268 -0
  27. package/admin/js/templates/docs/api-layouts.html +70 -45
  28. package/admin/js/templates/docs/api-media.html +57 -80
  29. package/admin/js/templates/docs/api-navigation.html +66 -22
  30. package/admin/js/templates/docs/api-pages.html +109 -129
  31. package/admin/js/templates/docs/api-plugins.html +123 -61
  32. package/admin/js/templates/docs/api-scaffold.html +185 -0
  33. package/admin/js/templates/docs/api-settings.html +72 -64
  34. package/admin/js/templates/docs/api-users.html +74 -107
  35. package/admin/js/templates/docs/api-views.html +68 -54
  36. package/admin/js/templates/docs/components-howto.html +20 -17
  37. package/admin/js/templates/docs/components-reference.html +13 -16
  38. package/admin/js/templates/docs/components-rules.html +7 -6
  39. package/admin/js/templates/docs/components-walkthrough.html +19 -19
  40. package/admin/js/templates/docs/tutorial-crud.html +71 -40
  41. package/admin/js/templates/docs/tutorial-forms.html +51 -35
  42. package/admin/js/templates/docs/tutorial-plugin.html +132 -56
  43. package/admin/js/templates/docs/usage-actions.html +61 -15
  44. package/admin/js/templates/docs/usage-collections.html +108 -0
  45. package/admin/js/templates/docs/usage-cta-shortcode.html +14 -3
  46. package/admin/js/templates/docs/usage-dconfig.html +0 -3
  47. package/admin/js/templates/docs/usage-editions.html +213 -0
  48. package/admin/js/templates/docs/usage-media.html +22 -6
  49. package/admin/js/templates/docs/usage-navigation.html +74 -18
  50. package/admin/js/templates/docs/usage-pages.html +60 -20
  51. package/admin/js/templates/docs/usage-plugins.html +89 -17
  52. package/admin/js/templates/docs/usage-shortcodes.html +123 -70
  53. package/admin/js/templates/docs/usage-site-settings.html +50 -18
  54. package/admin/js/templates/docs/usage-tools.html +73 -0
  55. package/admin/js/templates/docs/usage-users-roles.html +99 -20
  56. package/admin/js/templates/docs/usage-views.html +36 -19
  57. package/admin/js/templates/documentation.html +153 -32
  58. package/admin/js/templates/page-editor.html +0 -5
  59. package/admin/js/templates/plugin-guide.html +15 -0
  60. package/admin/js/templates/plugin-guides.html +21 -0
  61. package/admin/js/templates/pro-docs.html +53 -234
  62. package/admin/js/templates/tutorials.html +5 -4
  63. package/admin/js/views/actions-list.js +3 -3
  64. package/admin/js/views/analytics.js +5 -5
  65. package/admin/js/views/api-endpoint-editor.js +2 -2
  66. package/admin/js/views/block-editor.js +4 -4
  67. package/admin/js/views/blocks.js +4 -4
  68. package/admin/js/views/collection-editor.js +4 -4
  69. package/admin/js/views/collection-entries.js +7 -7
  70. package/admin/js/views/component-editor.js +2 -2
  71. package/admin/js/views/contacts.js +22 -20
  72. package/admin/js/views/context-menu-editor.js +5 -5
  73. package/admin/js/views/doc-pages.js +1 -1
  74. package/admin/js/views/form-editor.js +4 -4
  75. package/admin/js/views/form-submissions.js +2 -2
  76. package/admin/js/views/index.js +1 -1
  77. package/admin/js/views/media.js +3 -3
  78. package/admin/js/views/menu-editor.js +13 -13
  79. package/admin/js/views/menu-locations.js +2 -2
  80. package/admin/js/views/my-profile.js +1 -1
  81. package/admin/js/views/page-editor.js +8 -8
  82. package/admin/js/views/plugin-guides.js +5 -0
  83. package/admin/js/views/project-detail.js +2 -2
  84. package/admin/js/views/project-settings.js +1 -1
  85. package/admin/js/views/role-editor.js +4 -4
  86. package/admin/js/views/search.js +2 -2
  87. package/admin/js/views/seo.js +17 -17
  88. package/admin/js/views/settings.js +3 -3
  89. package/admin/js/views/theme.js +3 -3
  90. package/admin/js/views/user-editor.js +1 -1
  91. package/admin/js/views/users.js +2 -2
  92. package/admin/js/views/view-editor.js +1 -1
  93. package/bin/cli.js +13 -13
  94. package/bin/lib/node-version.js +29 -0
  95. package/package.json +1 -1
  96. package/plugins/_lib/admin/mail/compose-window.js +3 -2
  97. package/plugins/_lib/admin/mail/reader-view.js +7 -6
  98. package/plugins/_lib/admin/mail/scheduling.js +4 -2
  99. package/plugins/_lib/admin/mail/templates.js +4 -4
  100. package/plugins/_lib/admin/ui/dates.js +85 -0
  101. package/plugins/blog/CLAUDE.md +31 -22
  102. package/plugins/blog/admin/views/blog.js +3 -2
  103. package/plugins/blog/admin/views/comments.js +2 -1
  104. package/plugins/blog/admin/views/post-editor.js +4 -4
  105. package/plugins/blog/blocks/blog-card-row.html +1 -1
  106. package/plugins/blog/blocks/blog-card.html +2 -2
  107. package/plugins/blog/blocks/blog-post-classic.html +2 -2
  108. package/plugins/blog/blocks/blog-post-essay.html +2 -2
  109. package/plugins/blog/blocks/blog-post-feature.html +2 -2
  110. package/plugins/blog/blocks/blog-post-minimal.html +2 -2
  111. package/plugins/blog/blocks/blog-post-sidebar.html +2 -2
  112. package/plugins/blog/blocks/blog-post-split.html +2 -2
  113. package/plugins/blog/docs/guide.md +205 -0
  114. package/plugins/blog/lib/layouts.js +3 -3
  115. package/plugins/blog/lib/page.js +2 -1
  116. package/plugins/blog/plugin.js +3 -3
  117. package/plugins/blog/plugin.json +4 -4
  118. package/plugins/blog/tests/layouts.test.js +6 -0
  119. package/plugins/feedback/CLAUDE.md +22 -3
  120. package/plugins/feedback/admin/lib/kit.js +6 -7
  121. package/plugins/feedback/admin/views/feedback.js +79 -10
  122. package/plugins/feedback/admin/views/send.js +28 -6
  123. package/plugins/feedback/docs/guide.md +95 -0
  124. package/plugins/feedback/lib/receiver.js +9 -2
  125. package/plugins/feedback/lib/sender.js +3 -2
  126. package/plugins/feedback/plugin.js +54 -6
  127. package/plugins/feedback/plugin.json +4 -4
  128. package/plugins/feedback/tests/api.test.js +74 -2
  129. package/plugins/free-tier.lock.json +49 -44
  130. package/plugins/mail-reader/CLAUDE.md +33 -18
  131. package/plugins/mail-reader/docs/guide.md +147 -0
  132. package/plugins/mail-reader/plugin.json +1 -1
  133. package/plugins/security/CLAUDE.md +4 -1
  134. package/plugins/security/admin/views/security.js +5 -5
  135. package/plugins/security/docs/guide.md +170 -0
  136. package/plugins/security/plugin.js +2 -1
  137. package/plugins/security/plugin.json +2 -1
  138. package/plugins/shopping-cart/CLAUDE.md +7 -1
  139. package/plugins/shopping-cart/admin/lib/kit.js +5 -2
  140. package/plugins/shopping-cart/admin/views/orders.js +4 -4
  141. package/plugins/shopping-cart/admin/views/overview.js +2 -2
  142. package/plugins/shopping-cart/docs/guide.md +191 -0
  143. package/plugins/shopping-cart/lib/render.js +2 -1
  144. package/plugins/shopping-cart/plugin.json +3 -3
  145. package/public/js/collection-browser.js +2 -2
  146. package/public/js/site.js +1 -1
  147. package/scripts/gen-instance-secret.js +3 -1
  148. package/scripts/setup.js +3 -1
  149. package/server/middleware/auth.js +2 -1
  150. package/server/routes/api/actions.js +47 -27
  151. package/server/routes/api/blocks.js +2 -1
  152. package/server/routes/api/collections.js +16 -52
  153. package/server/routes/api/contacts.js +66 -3
  154. package/server/routes/api/documentation.js +42 -0
  155. package/server/routes/api/notifications.js +3 -2
  156. package/server/routes/api/users.js +10 -6
  157. package/server/server.js +16 -1
  158. package/server/services/actions.js +110 -34
  159. package/server/services/adapterRegistry.js +169 -16
  160. package/server/services/adapters/FileAdapter.js +25 -0
  161. package/server/services/adapters/MongoAdapter.js +23 -0
  162. package/server/services/collections.js +104 -1
  163. package/server/services/connectionManager.js +12 -0
  164. package/server/services/dates.js +81 -0
  165. package/server/services/docs.js +13 -2
  166. package/server/services/markdown.js +75 -26
  167. package/server/services/notification-sources.js +6 -5
  168. package/server/services/passwordReset.js +2 -1
  169. package/server/services/permissionRegistry.js +3 -2
  170. package/server/services/pluginGuides.js +255 -0
  171. package/server/services/pluginInstaller.js +54 -13
  172. package/server/services/plugins.js +29 -1
  173. package/server/services/presetCollections.js +31 -5
  174. package/server/services/renderer.js +2 -2
  175. package/server/services/sidebarBadges.js +3 -1
  176. package/server/services/tools.js +4 -2
  177. package/server/templates/page.html +2 -2
@@ -0,0 +1,213 @@
1
+ <div class="view-header">
2
+ <h1><span data-icon="book"></span> Editions &amp; Licences</h1>
3
+ <a href="#/documentation" class="btn btn-ghost btn-sm"><span data-icon="arrow-left"></span> All usage topics</a>
4
+ </div>
5
+
6
+ <div class="row">
7
+ <div class="col-12">
8
+ <div class="docs-body">
9
+
10
+ <p>What you get free with Domma CMS, what is paid, what "Pro" means, and how plugin licences work.
11
+ Prices: TBC.</p>
12
+
13
+ <h3>In short</h3>
14
+ <ul>
15
+ <li>The CMS itself is free. Every core feature works without a licence.</li>
16
+ <li>Some plugins are free and ship with the CMS. Others are paid and need a licence.</li>
17
+ <li>A "Pro" plugin adds to, or replaces, a free Tool or plugin. If its licence lapses, the free one comes back.</li>
18
+ <li>A licence is either a <strong>rental</strong> (a site the Domma Manager runs for you) or
19
+ <strong>perpetual</strong> (bought outright).</li>
20
+ <li>A rental stops when its term and grace period end. A perpetual licence never stops; only support and
21
+ updates end.</li>
22
+ <li>A few features need MongoDB. One plugin, MongoDB Adapter, is only for sites run by the Domma Manager.</li>
23
+ </ul>
24
+
25
+ <h3>What the free CMS includes</h3>
26
+ <p>Everything in the core CMS is free:</p>
27
+ <ul>
28
+ <li><strong>Content</strong> - pages with a visual editor, version history, drafts and share links,
29
+ shortcodes, blocks, components and a media library.</li>
30
+ <li><strong>Design</strong> - built-in themes, menus, right-click menus and a visitor theme switcher.</li>
31
+ <li><strong>Data</strong> - collections on file storage, saved views, a form builder, and public collection
32
+ displays.</li>
33
+ <li><strong>API</strong> - the <code>/api/v1</code> collection API, API tokens and API Builder endpoints.</li>
34
+ <li><strong>Admin</strong> - dashboard, notifications, in-admin docs, projects, roles and permissions.</li>
35
+ <li><strong>Built-in Tools</strong> - Notes, Todo, Analytics, Contacts and SEO. Each can be switched off in
36
+ the <a href="#/plugins">Marketplace</a> under "Built-in Tools".</li>
37
+ <li><strong>Marketplace</strong> - installing, updating and switching plugins.</li>
38
+ </ul>
39
+
40
+ <h3>Core features that need MongoDB</h3>
41
+ <p>These are marked "Pro" in the CMS. They are not licensed. They switch on when the site has a MongoDB
42
+ connection in <code>config/connections.json</code>:</p>
43
+ <ul>
44
+ <li><strong>MongoDB storage</strong> - keep any collection in MongoDB instead of files. Set it per collection
45
+ on the collection's Storage tab.</li>
46
+ <li><strong>Actions</strong> - workflows that run steps against a collection entry. Without MongoDB the
47
+ Actions screen says they need MongoDB.</li>
48
+ </ul>
49
+ <p>Add a connection under <strong>Data &gt; Collections &gt; Database connections</strong> (admins only), or
50
+ with <code>npm run pro enable</code>. On a site run by the Domma Manager, the MongoDB Adapter plugin sets the
51
+ connection up for you (see below).</p>
52
+ <p>The optional Redis cache driver is also described as a Pro feature. It needs Redis, not a licence.</p>
53
+
54
+ <h3>Free plugins</h3>
55
+ <p>These are marked <code>free</code> in their manifests and ship in the CMS <code>plugins/</code> folder.
56
+ Switch them on in the Marketplace.</p>
57
+ <ul>
58
+ <li><strong>Blog</strong> - posts, categories and comments.</li>
59
+ <li><strong>Feedback</strong> - tell Domma what is broken, missing or good, from your admin.</li>
60
+ <li><strong>Mail Reader</strong> - a read-only IMAP mailbox reader.</li>
61
+ <li><strong>Security</strong> - a health check, sign-in lockout, password rules and a sign-in log.</li>
62
+ <li><strong>Shopping Cart</strong> - products, a storefront, a cart and checkout.</li>
63
+ </ul>
64
+
65
+ <h3>Paid plugins</h3>
66
+ <p>Every other plugin in the Marketplace is paid. A paid plugin is marked closed source. It needs a valid
67
+ licence on the site, or it does not start. Paid plugins cannot be viewed or exported from the Marketplace.</p>
68
+ <p>A plugin you write yourself is never asked for a licence.</p>
69
+
70
+ <h3>What "Pro" means</h3>
71
+ <p>A Pro plugin builds on a free Tool or plugin. It does this in one of two ways:</p>
72
+ <ul>
73
+ <li><strong>It replaces it</strong> (<code>supersedes</code> in its manifest). The free one stops loading
74
+ while the Pro one runs, so you see one screen, not two. For a built-in Tool, the Pro plugin hides the
75
+ Tool's sidebar entry and takes over its screen. The Tool's data and API stay in place.</li>
76
+ <li><strong>It adds to it</strong> (<code>requires</code> in its manifest). Both run. If the free one is
77
+ switched off, the Pro one does not start.</li>
78
+ </ul>
79
+ <table class="table table-sm">
80
+ <thead>
81
+ <tr>
82
+ <th>Pro plugin</th>
83
+ <th>Relationship</th>
84
+ </tr>
85
+ </thead>
86
+ <tbody>
87
+ <tr><td>Blog Pro</td><td>Replaces Blog</td></tr>
88
+ <tr><td>Contacts Pro</td><td>Requires and replaces the built-in Contacts Tool</td></tr>
89
+ <tr><td>Email (email-pro)</td><td>Replaces Mail Reader</td></tr>
90
+ <tr><td>Security Pro</td><td>Replaces Security</td></tr>
91
+ <tr><td>SEO Pro</td><td>Requires the built-in SEO Tool</td></tr>
92
+ <tr><td>Shopping Cart Pro</td><td>Requires Shopping Cart</td></tr>
93
+ <tr><td>Analytics Pro</td><td>Separate from the built-in Analytics Tool; neither replaces the other</td></tr>
94
+ <tr><td>Social Media Pro</td><td>No free edition</td></tr>
95
+ <tr><td>Waypoint Pro</td><td>No free edition</td></tr>
96
+ </tbody>
97
+ </table>
98
+
99
+ <h3>When a Pro licence lapses</h3>
100
+ <p>The replacement is worked out each time the site starts. Nothing is written to your settings. So when a
101
+ Pro plugin stops running because its licence has lapsed:</p>
102
+ <ul>
103
+ <li>the free plugin it replaced loads again on the next start, and</li>
104
+ <li>a built-in Tool it took over comes back.</li>
105
+ </ul>
106
+ <p>You are never left with less than a site that never bought the Pro plugin.</p>
107
+
108
+ <h3>Where the licence lives</h3>
109
+ <p>A licence is a signed file called an entitlement. The CMS looks for it in two places, in this order:</p>
110
+ <ol>
111
+ <li><code>plugins/&lt;plugin&gt;/.entitlement.json</code> - one plugin, one licence. A
112
+ <code>.dcmsplugin</code> file carries it in.</li>
113
+ <li><code>config/entitlements/*.json</code> - site-wide licences.</li>
114
+ </ol>
115
+ <p>The file must be signed by the Domma Marketplace key. A missing, edited or wrongly signed file counts as
116
+ unlicensed, and the plugin does not start.</p>
117
+ <p>The licence is checked each time the site starts. A plugin that is refused is not switched off in your
118
+ settings, so renewing brings it straight back on the next start.</p>
119
+
120
+ <h3>Rental licences</h3>
121
+ <p>For a site run for you by the Domma Manager. The plugin is rented monthly alongside the hosting.</p>
122
+ <ul>
123
+ <li>The plugin banner shows <strong>Expires</strong> and the date.</li>
124
+ <li>After the end date there is a grace period. The plugin keeps running and the banner shows
125
+ <strong>Expired (date) (grace)</strong>. The Marketplace marks it <strong>Renew</strong>. The grace period
126
+ is set on the licence; the Manager issues 7 days unless told otherwise.</li>
127
+ <li>After the grace period the plugin does not start. The Marketplace marks it <strong>Expired</strong>. Its
128
+ data is kept.</li>
129
+ <li>A notice appears 14 days before the end date, during the grace period, and once it has stopped.</li>
130
+ </ul>
131
+
132
+ <h3>Perpetual licences</h3>
133
+ <p>For a site the Domma Manager does not run. You buy the plugin once, with a period of support.</p>
134
+ <ul>
135
+ <li>The plugin banner shows <strong>Support to</strong> and the date.</li>
136
+ <li>When support ends, the banner shows <strong>Support ended</strong>. The plugin keeps running for good.</li>
137
+ <li>What ends is support and updates. Renewing support extends it.</li>
138
+ <li>A notice tells you when support and updates have ended.</li>
139
+ </ul>
140
+
141
+ <h3>Managed-only plugins</h3>
142
+ <p><strong>MongoDB Adapter</strong> is only offered for sites run by the Domma Manager. The Manager creates a
143
+ database and a user for the site, and writes the site's connection file. On a site the Manager does not run,
144
+ the plugin would have nothing to do.</p>
145
+ <p>When the Manager removes it, the site's connection file and database user are removed. The database itself
146
+ is kept.</p>
147
+
148
+ <h3>Plugins that need MongoDB</h3>
149
+ <ul>
150
+ <li><strong>MongoDB Adapter</strong> - provides MongoDB to a managed site.</li>
151
+ <li><strong>Email (email-pro)</strong> - search, threads, rules, scheduled sends, snooze and vacation replies
152
+ need MongoDB. Without it, reading, filing and sending still work.</li>
153
+ <li><strong>Data Transfer</strong> - needs MongoDB only to move collections to or from MongoDB. Backups,
154
+ restores and clones work on file storage.</li>
155
+ <li><strong>Surveys</strong> - uses MongoDB when there is a connection, and falls back to file storage when
156
+ there is not.</li>
157
+ </ul>
158
+ <p>Garage and Messages work on either storage. The rest do not use MongoDB.</p>
159
+
160
+ <h3>All Marketplace plugins</h3>
161
+ <table class="table table-sm">
162
+ <thead>
163
+ <tr>
164
+ <th>Plugin</th>
165
+ <th>Tier</th>
166
+ <th>Needs MongoDB</th>
167
+ <th>Managed-only</th>
168
+ <th>Notes</th>
169
+ </tr>
170
+ </thead>
171
+ <tbody>
172
+ <tr><td>Analytics Pro</td><td>paid</td><td>No</td><td>No</td><td>Separate from the built-in Analytics Tool</td></tr>
173
+ <tr><td>Blog</td><td>free</td><td>No</td><td>No</td><td>Ships with the CMS</td></tr>
174
+ <tr><td>Blog Pro</td><td>paid</td><td>No</td><td>No</td><td>Replaces Blog</td></tr>
175
+ <tr><td>Calendar</td><td>paid</td><td>No</td><td>No</td><td>Uses Contacts, Notes and Todo when they are on</td></tr>
176
+ <tr><td>Contacts Pro</td><td>paid</td><td>No</td><td>No</td><td>Requires and replaces the built-in Contacts Tool</td></tr>
177
+ <tr><td>Data Transfer</td><td>paid</td><td>Only to move to or from MongoDB</td><td>No</td><td>Backups and restores work on file storage</td></tr>
178
+ <tr><td>Docs</td><td>paid</td><td>No</td><td>No</td><td></td></tr>
179
+ <tr><td>Email (email-pro)</td><td>paid</td><td>Partly</td><td>No</td><td>Replaces Mail Reader; some features need MongoDB</td></tr>
180
+ <tr><td>Feedback</td><td>free</td><td>No</td><td>No</td><td>Ships with the CMS</td></tr>
181
+ <tr><td>Garage</td><td>paid</td><td>No</td><td>No</td><td>Works on file or MongoDB storage</td></tr>
182
+ <tr><td>Invoices</td><td>paid</td><td>No</td><td>No</td><td>Uses Contacts</td></tr>
183
+ <tr><td>Job Board</td><td>paid</td><td>No</td><td>No</td><td></td></tr>
184
+ <tr><td>Mail Reader</td><td>free</td><td>No</td><td>No</td><td>Ships with the CMS</td></tr>
185
+ <tr><td>Messages</td><td>paid</td><td>No</td><td>No</td><td>File storage unless moved to MongoDB</td></tr>
186
+ <tr><td>MongoDB Adapter</td><td>paid</td><td>Provides it</td><td>Yes</td><td>Set up by the Domma Manager</td></tr>
187
+ <tr><td>Security</td><td>free</td><td>No</td><td>No</td><td>Ships with the CMS</td></tr>
188
+ <tr><td>Security Pro</td><td>paid</td><td>No</td><td>No</td><td>Replaces Security</td></tr>
189
+ <tr><td>SEO Pro</td><td>paid</td><td>No</td><td>No</td><td>Requires the built-in SEO Tool</td></tr>
190
+ <tr><td>Shopping Cart</td><td>free</td><td>No</td><td>No</td><td>Ships with the CMS</td></tr>
191
+ <tr><td>Shopping Cart Pro</td><td>paid</td><td>No</td><td>No</td><td>Requires Shopping Cart</td></tr>
192
+ <tr><td>Social Media Pro</td><td>paid</td><td>No</td><td>No</td><td>Uses SEO, Calendar and Blog when they are on</td></tr>
193
+ <tr><td>Surveys</td><td>paid</td><td>Optional</td><td>No</td><td>Falls back to file storage</td></tr>
194
+ <tr><td>Theme Roller</td><td>paid</td><td>No</td><td>No</td><td></td></tr>
195
+ <tr><td>Waypoint Pro</td><td>paid</td><td>No</td><td>No</td><td></td></tr>
196
+ </tbody>
197
+ </table>
198
+
199
+ <h3>Getting a licence</h3>
200
+ <p>Prices: TBC.</p>
201
+ <ul>
202
+ <li><strong>A site run by the Domma Manager</strong> - open <a href="#/plugins">Marketplace</a> &gt;
203
+ Browse. It lists what your Manager offers. Install brings a plugin in already licensed. A plugin not
204
+ licensed yet is still listed; ask for it to be added.</li>
205
+ <li><strong>Any other site</strong> - buy the plugin and you receive a single <code>.dcmsplugin</code> file.
206
+ Use <strong>Install from file</strong> in the Marketplace banner. The same button installs later
207
+ updates.</li>
208
+ </ul>
209
+ <p>To buy a plugin or renew a licence, contact Domma CMS.</p>
210
+
211
+ </div>
212
+ </div>
213
+ </div>
@@ -7,18 +7,34 @@
7
7
  <div class="col-12">
8
8
  <div class="docs-body">
9
9
 
10
- <p>Media files are stored in <code>content/media/</code> and served publicly at <code>/media/{filename}</code>.
11
- </p>
10
+ <p>Media files are managed at <strong>Content &gt; Media</strong>, stored in <code>content/media/</code>
11
+ and served publicly at <code>/media/{filename}</code>. Anything uploaded there can be opened by
12
+ anyone who has its address - do not upload private documents.</p>
13
+
14
+ <h3>Uploading</h3>
15
+ <p>Use the upload button in the banner, or drop files onto the screen. Uploading a file with the
16
+ same name as one already there replaces it; you are asked first. Accepted types are images
17
+ (JPEG, PNG, GIF, WebP, SVG, ICO, BMP, TIFF), PDF, text and CSV, Word and Excel documents, MP4,
18
+ WebM and Ogg video, and MP3, Ogg, WAV and WebM audio.</p>
19
+
20
+ <h3>Working with a file</h3>
21
+ <p>Click a file for its details: its address, a snippet to paste into a page, a rename box, and -
22
+ for pictures - the image editor (crop, resize, rotate, flip, colour presets, adjustments,
23
+ watermark, border, and saving as JPEG, PNG or WebP, as a copy or over the original).
24
+ Right-click a file (or use its row menu) for the same actions without opening it.</p>
25
+ <p>Wherever the admin asks for a picture (SEO share images, a logo, some plugin settings) the
26
+ <strong>Choose...</strong> button opens the Media Picker, where you can also upload.</p>
12
27
 
13
28
  <h3>Using media in pages</h3>
14
- <p>Reference uploaded files by their public URL in Markdown:</p>
29
+ <p>Reference uploaded files by their public URL in Markdown or HTML:</p>
15
30
  <pre class="code-block"><code>![Alt text](/media/my-image.jpg)
16
-
17
31
  &lt;img src="/media/my-image.jpg" alt="Alt text"&gt;</code></pre>
32
+ <p>Always give pictures alt text - SEO's audit checks for it.</p>
18
33
 
19
34
  <h3>Upload limits</h3>
20
- <p>The maximum file size is configured in <code>config/server.json</code> under <code>uploads.maxFileSize</code>
21
- (bytes). Default is 10 MB.</p>
35
+ <p>The largest file is set in <code>config/server.json</code> under
36
+ <code>uploads.maxFileSize</code> (bytes). The default is 10 MB. File names are limited to 200
37
+ characters and cleaned of unsafe characters.</p>
22
38
 
23
39
  </div>
24
40
  </div>
@@ -7,24 +7,80 @@
7
7
  <div class="col-12">
8
8
  <div class="docs-body">
9
9
 
10
- <p>The navigation tree is stored in <code>config/navigation.json</code> and injected into every public
11
- page as
12
- <code>window.__CMS_NAV__</code>.</p>
13
-
14
- <h3>Dropdowns</h3>
15
- <p>Nest items under a parent using the drag-and-drop tree in the Navigation editor. Child items are
16
- stored under
17
- the <code>items</code> key - the public navbar renders them as a dropdown.</p>
18
-
19
- <h3>External links</h3>
20
- <p>Set the URL to a full <code>https://</code> address to link outside the site. Leave blank for
21
- section
22
- headings.</p>
23
-
24
- <h3>Icons</h3>
25
- <p>Set the <code>icon</code> field to any registered icon name. Icons appear in the navbar link
26
- alongside the
27
- label.</p>
10
+ <p>The site's navigation is made of <strong>menus</strong>, edited at <strong>Content &gt;
11
+ Menus</strong>. A menu is a list of links; a <strong>location</strong> (a slot) is where one is
12
+ shown. Each menu is a file in <code>config/menus/</code>, and the slot map is
13
+ <code>config/menu-locations.json</code>. Pages have no "show in navigation" switch - a page
14
+ appears in the navbar when a menu links to it.</p>
15
+
16
+ <h3>Locations</h3>
17
+ <table class="table table-sm">
18
+ <thead>
19
+ <tr>
20
+ <th>Slot</th>
21
+ <th>Where it shows</th>
22
+ </tr>
23
+ </thead>
24
+ <tbody>
25
+ <tr>
26
+ <td><code>navbar</code></td>
27
+ <td>The public site's top bar (or side rail, when the menu is vertical).</td>
28
+ </tr>
29
+ <tr>
30
+ <td><code>footer-primary</code>, <code>footer-legal</code></td>
31
+ <td>The two footer link rows.</td>
32
+ </tr>
33
+ <tr>
34
+ <td><code>overlay</code></td>
35
+ <td>Floating panels pinned to a corner or edge of the page. Several menus can share it.</td>
36
+ </tr>
37
+ <tr>
38
+ <td><code>admin-sidebar</code></td>
39
+ <td>This admin's own sidebar.</td>
40
+ </tr>
41
+ </tbody>
42
+ </table>
43
+ <p>Plugins can add slots of their own. Pick the menu for each slot under <strong>Menu
44
+ locations</strong>. A menu that a location uses cannot be deleted until it is taken out.</p>
45
+
46
+ <h3>Editing a menu</h3>
47
+ <ul>
48
+ <li><strong>Items</strong> - click an item to edit its label, link, icon, badge, look and who
49
+ sees it. Drag the grip to move an item, or drop it onto another to nest it (the navbar
50
+ shows nested items as a dropdown). Right-click an item for add, move, indent, duplicate,
51
+ hide and remove. Separators and spacers are items too.</li>
52
+ <li><strong>Behaviour</strong> - colour scheme, sticky, fixed, static or floating, horizontal
53
+ or vertical, alignment, and the hover and current-page highlight. A single item can
54
+ override the highlight in its own editor.</li>
55
+ <li><strong>Binding</strong> - let this menu take a slot over on some pages only (a project's
56
+ pages, or pages matching a pattern such as <code>/shop/*</code>) while the menu mapped
57
+ under Menu locations shows everywhere else. The most specific match wins.</li>
58
+ <li><strong>Meta</strong> - the menu's id, which is its file name and what
59
+ <code>[menu slug="..."]</code> names.</li>
60
+ </ul>
61
+
62
+ <h3>Links</h3>
63
+ <p>Use a site path (<code>/about</code>) for your own pages or a full <code>https://</code> address
64
+ for another site. An item with no link and sub-items is a heading. When you rename a page in
65
+ the page editor, every menu link to it follows it to the new address.</p>
66
+
67
+ <h3>Who sees an item</h3>
68
+ <p>Each item can be limited to roles, using the same ladder as page visibility: "Member and above",
69
+ or "Member only" (<code>=member</code>). Items a visitor may not see are left out of the page
70
+ on the server. See <a href="#/docs/usage/users-roles">Users &amp; Roles</a>.</p>
71
+
72
+ <h3>Menus inside pages</h3>
73
+ <p>Place any menu in a page with <code>[menu slug="legal" /]</code>, or show whatever a slot holds
74
+ with <code>[menu location="footer-primary" /]</code>. See
75
+ <a href="#/docs/usage/shortcodes">Shortcodes</a>.</p>
76
+
77
+ <h3>The admin sidebar</h3>
78
+ <p>The <code>admin-sidebar</code> menu is this sidebar. In the Menus editor you can move Tools
79
+ between folders, rename them, hide them or add links of your own. Dashboard, Menus, Users and
80
+ My Profile can be moved but never hidden, so you can always get back from a bad edit.</p>
81
+
82
+ <p>Right-click menus on public pages are a separate feature: <strong>Content &gt; Context
83
+ Menus</strong>.</p>
28
84
 
29
85
  </div>
30
86
  </div>
@@ -8,8 +8,8 @@
8
8
  <div class="docs-body">
9
9
 
10
10
  <p>Pages are stored as Markdown files in <code>content/pages/</code>. Each file has a YAML frontmatter
11
- block at
12
- the top followed by the page body in Markdown.</p>
11
+ block at the top followed by the page body in Markdown, with shortcodes anywhere in the body.
12
+ Edit them at <strong>Content &gt; Pages</strong>.</p>
13
13
 
14
14
  <h3>URL mapping</h3>
15
15
  <table class="table table-sm">
@@ -29,39 +29,79 @@
29
29
  <td><code>/about</code></td>
30
30
  </tr>
31
31
  <tr>
32
- <td><code>content/pages/blog/index.md</code></td>
33
- <td><code>/blog</code></td>
32
+ <td><code>content/pages/services/index.md</code></td>
33
+ <td><code>/services</code></td>
34
34
  </tr>
35
35
  <tr>
36
- <td><code>content/pages/blog/hello-world.md</code></td>
37
- <td><code>/blog/hello-world</code></td>
36
+ <td><code>content/pages/services/design.md</code></td>
37
+ <td><code>/services/design</code></td>
38
+ </tr>
39
+ <tr>
40
+ <td><code>content/pages/404.md</code></td>
41
+ <td>Shown for any missing page, once published</td>
38
42
  </tr>
39
43
  </tbody>
40
44
  </table>
45
+ <p>Changing a page's URL Path in the editor moves the file. Menu links to the page follow it,
46
+ and SEO (when switched on) adds a redirect from the old address.</p>
41
47
 
42
48
  <h3>Frontmatter reference</h3>
43
49
  <pre class="code-block"><code>---
44
50
  title: My Page
45
- description: A short description for SEO meta tags.
46
- status: published # published | draft (draft pages return 404)
47
- layout: default # layout name from config/presets.json
48
- tags: [one, two] # optional taxonomy
49
- updatedAt: 2026-03-01 # auto-set on save
51
+ description: A short description for search results.
52
+ status: published # published | draft
53
+ layout: default # a layout from config/presets.json
54
+ visibility: public # public | private | a role | =a role | a list
55
+ project: core # blank = inherit from the URL
56
+ tags: [one, two] # editorial tags - weighted in site search
57
+ sortOrder: 99
58
+ category: Guides
59
+ theme: ocean-light # optional per-page theme
50
60
  ---
51
-
52
61
  # Page heading
53
-
54
62
  Your Markdown content goes here.</code></pre>
63
+ <p>The editor's <strong>Page Details</strong> tab sets all of these, and the
64
+ <strong>SEO</strong> tab sets the page's search title and description.</p>
55
65
 
56
- <h3>Drafts</h3>
57
- <p>Pages with <code>status: draft</code> are never served on the public site - they return a 404.
58
- Toggle status
59
- in the Page Editor to publish.</p>
66
+ <h3>Drafts and previews</h3>
67
+ <p>A page with <code>status: draft</code> answers 404 to visitors. Signed in with permission to
68
+ view pages, you see the real page at its real address with a draft banner and a Publish
69
+ button. New pages start as drafts.</p>
70
+ <ul>
71
+ <li><strong>Live Preview</strong> in the editor shows the unsaved page as it will look, at
72
+ desktop, tablet or phone width.</li>
73
+ <li><strong>Share link</strong> (in Live Preview) makes an expiring link that shows one
74
+ unpublished page to someone with no account. You can withdraw it at any time.</li>
75
+ </ul>
76
+
77
+ <h3>Who can see a page</h3>
78
+ <p><code>visibility</code> takes <code>public</code> (the default), <code>private</code> (the
79
+ level-0 role only), a role name ("that role and above"), <code>=role</code> ("that role
80
+ only"), or a list of these. A visitor who may not see a page gets a 403. A page in a disabled
81
+ project answers 404 to everyone. See <a href="#/docs/usage/users-roles">Users &amp;
82
+ Roles</a> for how the role ladder works.</p>
83
+
84
+ <h3>Navigation</h3>
85
+ <p>A page is added to the navbar or footer in <strong>Content &gt; Menus</strong>, not in the page
86
+ editor. See <a href="#/docs/usage/navigation">Navigation</a>.</p>
60
87
 
61
88
  <h3>Layouts</h3>
62
- <p>Layouts are defined in <code>config/presets.json</code> and apply CSS class wrappers around page
63
- content.
64
- Select a layout per-page in the editor, or change the default in Site Settings.</p>
89
+ <p>Layouts are defined in <code>config/presets.json</code>: <code>default</code>,
90
+ <code>with-sidebar</code>, <code>minimal</code>, <code>blank</code>, <code>landing</code>,
91
+ <code>article</code>, <code>product</code>, <code>dashboard</code> and <code>wide</code>. Pick
92
+ one per page in the editor; new pages use <code>default</code>
93
+ (<code>pageDefaults</code> in <code>config/content.json</code>). Manage them at
94
+ <strong>System &gt; Layouts</strong>.</p>
95
+
96
+ <h3>History</h3>
97
+ <p>Every save keeps a version. The editor's <strong>History</strong> tab lists them with their
98
+ date and time (dd/mm/yyyy HH:mm) and lets you compare it with the editor, restore or delete it, or save a named version. Restoring saves a snapshot of the current page first. Unsaved
99
+ work is kept as a draft in your browser and offered back if you return.</p>
100
+
101
+ <h3>Custom CSS</h3>
102
+ <p>The editor's CSS pane edits <code>content/custom.css</code>, which applies to the whole site,
103
+ not just the page you are on. It is also under <strong>System &gt; Site Settings &gt; Custom
104
+ CSS</strong>.</p>
65
105
 
66
106
  </div>
67
107
  </div>
@@ -7,29 +7,101 @@
7
7
  <div class="col-12">
8
8
  <div class="docs-body">
9
9
 
10
- <p>Plugins extend the CMS with new server routes, admin views, and public-site injection snippets.
11
- Each plugin
12
- is a directory under <code>plugins/</code>.</p>
10
+ <p>Plugins add features to the CMS: new admin screens, server routes, shortcodes and public-site
11
+ scripts. You get them from the <strong>Marketplace</strong> - <strong>System &gt;
12
+ Plugins</strong> in the sidebar (<code>#/plugins</code>). Once switched on, a plugin is a Tool
13
+ and has its own place in the sidebar. Each plugin lives in a folder under
14
+ <code>plugins/</code>.</p>
13
15
 
14
- <h3>Enabling and disabling</h3>
15
- <p>Use the Plugins page in the admin to toggle plugins on or off. State is saved to
16
- <code>config/plugins.json</code>. <strong>A server restart is required for changes to take
17
- effect.</strong>
18
- </p>
16
+ <h3>The Marketplace screen</h3>
17
+ <ul>
18
+ <li><strong>Installed</strong> lists what is on this site. The built-in Tools come first, then
19
+ your plugins, with filters for All, On, Off and Needs attention (a plugin that is on but
20
+ not licensed, or waiting for something it needs).</li>
21
+ <li>Click a plugin for its details and settings. Right-click it (or use the row menu, or
22
+ Shift+F10) to switch it on or off, configure, update, view its source, export it as a
23
+ <code>.dcmsplugin</code> file or uninstall it. Licensed plugins cannot be viewed or
24
+ exported.</li>
25
+ <li><strong>Browse</strong> lists what this site can get from its manager, with an Update
26
+ button where a newer version is available. A site that is not managed installs from a
27
+ file instead: <strong>Install from file</strong> in the banner.</li>
28
+ </ul>
29
+
30
+ <h3>Installing and updating</h3>
31
+ <ul>
32
+ <li>A new plugin arrives <strong>switched off</strong>. Switch it on when you are ready.</li>
33
+ <li>A paid plugin installed from Browse arrives licensed to this site. A plugin that is on
34
+ but has no valid licence does not run, and the Marketplace says so.</li>
35
+ <li>An update keeps the plugin's data. If it fails, the version you had is put back.</li>
36
+ <li>A plugin that needs a newer Domma CMS (its <code>minCmsVersion</code>) is refused, naming
37
+ both versions - update the CMS first. An update refused this way leaves the installed
38
+ version in place.</li>
39
+ <li>Installing an unsigned file, replacing a newer version with an older one, or updating
40
+ one already installed each asks you first. A site with
41
+ <code>requireSignedPlugins</code> set in <code>config/server.json</code> refuses unsigned
42
+ files outright.</li>
43
+ <li>Uninstalling removes the plugin's files and its <code>data/</code> folder, and any roles
44
+ it added (their users move to <code>user</code>). Switch a plugin off instead if you may
45
+ want it back.</li>
46
+ <li>Some plugins rely on extra npm packages (listed as <code>npmDependencies</code> in the
47
+ catalogue). The CMS does not install these for you - if a plugin says a package is
48
+ missing, ask whoever runs your server.</li>
49
+ </ul>
50
+
51
+ <h3>When a restart is needed</h3>
52
+ <p>A plugin's routes and screens are read when the server starts, so:</p>
53
+ <ul>
54
+ <li><strong>Switching a plugin on or off</strong> restarts the server for you when something
55
+ will bring it back (pm2 or the Domma manager). The screen waits and tells you when the
56
+ site is live again. Several switches in a row cost one restart. Set
57
+ <code>restartOnPluginToggle: false</code> in <code>config/server.json</code> to restart by
58
+ hand instead.</li>
59
+ <li><strong>Installing, updating or uninstalling</strong> takes effect after the next
60
+ restart - the screen tells you when one is due.</li>
61
+ <li><strong>Saving a plugin's settings</strong> never restarts anything.</li>
62
+ </ul>
63
+
64
+ <h3>Built-in Tools and switches</h3>
65
+ <p>Contacts, Notes, Todo, Analytics and SEO are part of the CMS and on unless you switch them off
66
+ at the top of the Installed tab. A Tool that is off disappears from the sidebar and its
67
+ screens and API stop answering, but nothing is deleted: switch it back on and everything is
68
+ where it was. A switch marked <strong>Locked</strong> is held by your site's manager and can
69
+ only be changed there.</p>
70
+
71
+ <h3>What plugins depend on</h3>
72
+ <ul>
73
+ <li><strong>Requires</strong> - a plugin that cannot work without a Tool or another plugin
74
+ goes off with it. Switching it on switches on what it needs.</li>
75
+ <li><strong>Uses</strong> - a plugin that only uses something (Calendar invites contact
76
+ groups) stays on, and you are told which feature it loses.</li>
77
+ <li>You are shown what a switch will change, and asked, before anything moves. A plugin whose
78
+ requirement is off is not started.</li>
79
+ <li><strong>Supersedes</strong> - a Pro edition replaces the free one it supersedes (Blog Pro
80
+ and Blog): while the Pro plugin runs, the free one registers nothing. A Pro plugin can
81
+ also take over a built-in Tool's screen (Contacts Pro and Contacts). Nothing is written
82
+ down, so if a licence lapses the free plugin or built-in Tool is simply back after the
83
+ next restart, with its data.</li>
84
+ </ul>
19
85
 
20
86
  <h3>Plugin settings</h3>
21
- <p>Plugins that expose a settings page will appear as a link in the sidebar under the Plugins section.
22
- Settings
23
- are merged with the plugin's defaults from <code>config.js</code> and saved to
24
- <code>config/plugins.json</code>.</p>
87
+ <p>Open a plugin and choose Configure. Settings are merged with the plugin's defaults and saved to
88
+ <code>config/plugins.json</code>. Many plugins also have a settings cog in their own screen's
89
+ banner.</p>
25
90
 
26
91
  <h3>Security</h3>
27
- <p>Only files inside a plugin's <code>admin/</code> and <code>public/</code> subdirectories are served
28
- statically. Server files (<code>plugin.js</code>, <code>config.js</code>, <code>data/</code>) are
29
- blocked and
30
- return 404.</p>
92
+ <p>Only files inside a plugin's <code>admin/</code> and <code>public/</code> folders are served to
93
+ browsers. Server files (<code>plugin.js</code>, <code>config.js</code>, <code>data/</code>)
94
+ are never served. A plugin's code runs on your server with full access, which is why unsigned
95
+ files ask before installing.</p>
31
96
 
32
- <p>See the <a href="#/tutorials">Tutorials</a> section for a guide to writing your own plugin.</p>
97
+ <h3>See also</h3>
98
+ <ul>
99
+ <li><a href="#/docs/plugins">Plugin guides</a> - one page per installed Marketplace plugin:
100
+ what it does, its screens, settings and permissions.</li>
101
+ <li><a href="#/docs/usage/editions">Editions &amp; Licences</a> - free and Pro, rental and
102
+ perpetual licences, and what happens when one ends.</li>
103
+ <li><a href="#/tutorials/plugin">Writing a Plugin</a> - build your own.</li>
104
+ </ul>
33
105
 
34
106
  </div>
35
107
  </div>