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
@@ -101,7 +101,6 @@
101
101
  <pre><code>[box]
102
102
  Any content - text, a button, a [grid] or a [card].
103
103
  [/box]
104
-
105
104
  [box shadow="md" rounded="lg" padding="spacious"]
106
105
  Lifted off the page, with rounder corners.
107
106
  [/box]</code></pre>
@@ -675,24 +674,79 @@ Body content in **Markdown** is supported.
675
674
  <tr>
676
675
  <td><code>[hero variant="dark" size="sm"]...[/hero]</code></td>
677
676
  <td>Full-width hero section; supports <code>twinkle</code>, <code>blobs</code>,
678
- <code>image</code>, <code>overlay</code></td>
677
+ <code>image</code>, <code>overlay</code>, <code>color</code>, <code>min-height</code></td>
678
+ </tr>
679
+ <tr>
680
+ <td><code>[banner type="warning" title="..." icon="..." dismissible]...[/banner]</code></td>
681
+ <td>An alert strip: <code>info</code>, <code>success</code>, <code>warning</code>,
682
+ <code>danger</code> or <code>neutral</code></td>
683
+ </tr>
684
+ <tr>
685
+ <td><code>[listgroup variant="flush"][item]...[/item][/listgroup]</code></td>
686
+ <td>A list group; <code>variant</code> flush, numbered or horizontal</td>
679
687
  </tr>
680
688
  <tr>
681
689
  <td><code>[table striped="true"]...[/table]</code></td>
682
690
  <td>Wraps a GFM Markdown table with Domma table CSS classes</td>
683
691
  </tr>
692
+ <tr>
693
+ <td><code>[text size="xl" bold color="primary"]...[/text]</code></td>
694
+ <td>Styled inline text</td>
695
+ </tr>
696
+ <tr>
697
+ <td><code>[button href="/contact" variant="primary"]...[/button]</code></td>
698
+ <td>A link styled as a button</td>
699
+ </tr>
700
+ <tr>
701
+ <td><code>[link href="/about" icon="arrow-right"]...[/link]</code></td>
702
+ <td>A link with an icon or target</td>
703
+ </tr>
704
+ <tr>
705
+ <td><code>[center]...[/center]</code></td>
706
+ <td>Centres its content</td>
707
+ </tr>
708
+ <tr>
709
+ <td><code>[embed url="https://youtu.be/..." /]</code></td>
710
+ <td>YouTube, Vimeo, an uploaded video, or a page from a host allowed in
711
+ <code>config/embeds.json</code></td>
712
+ </tr>
684
713
  <tr>
685
714
  <td><code>[form name="slug" /]</code></td>
686
- <td>Embeds a Form Builder form by slug</td>
715
+ <td>Embeds a form from <strong>Data &gt; Forms</strong></td>
716
+ </tr>
717
+ <tr>
718
+ <td><code>[menu slug="legal" /]</code></td>
719
+ <td>Places a menu, or <code>location="..."</code> whatever a slot holds</td>
720
+ </tr>
721
+ <tr>
722
+ <td><code>[block template="post-card" title="..." /]</code></td>
723
+ <td>Renders one block template from <strong>Data &gt; Blocks</strong> with the values given.
724
+ A block can also be written as its own tag, <code>[post-card title="..." /]</code></td>
725
+ </tr>
726
+ <tr>
727
+ <td><code>[component name="counter" /]</code></td>
728
+ <td>Mounts a component from <strong>Data &gt; Components</strong> (same as
729
+ <code>&lt;dm-counter&gt;</code>)</td>
730
+ </tr>
731
+ <tr>
732
+ <td><code>[demo src="elements/accordion" /]</code></td>
733
+ <td>Embeds a demo page from this site in a frame</td>
734
+ </tr>
735
+ <tr>
736
+ <td><code>[collection slug="..." /]</code></td>
737
+ <td>Shows a collection's entries - see below</td>
687
738
  </tr>
688
739
  <tr>
689
- <td><code>[collection slug="..." display="table" /]</code></td>
690
- <td>Renders collection entries inline (table, cards, list, accordion, or block)</td>
740
+ <td><code>[view slug="..." /]</code></td>
741
+ <td>Shows a saved View's results - see <a href="#/docs/usage/views">Views</a></td>
691
742
  </tr>
692
743
  </tbody>
693
744
  </table>
694
745
 
695
- <h4>Collection attributes</h4>
746
+ <h3>Collections on a page</h3>
747
+ <pre class="code-block"><code>[collection slug="team" display="cards" columns="3" title-field="name" /]
748
+ [collection slug="jobs" display="cards" searchable filterable="location,type" sortable page-size="9" where_status="open" /]
749
+ [collection slug="applications" scope="mine" display="cards" title-field="jobTitle" paginate transitions /]</code></pre>
696
750
  <table class="table table-sm">
697
751
  <thead>
698
752
  <tr>
@@ -705,75 +759,78 @@ Body content in **Markdown** is supported.
705
759
  <tr>
706
760
  <td><code>slug</code></td>
707
761
  <td>collection slug</td>
708
- <td>Required. Which collection to render.</td>
762
+ <td>Required. Which collection to show.</td>
709
763
  </tr>
710
764
  <tr>
711
765
  <td><code>display</code></td>
712
766
  <td><code>table</code> &middot; <code>cards</code> &middot; <code>list</code> &middot;
713
- <code>accordion</code> &middot; <code>block</code></td>
714
- <td>How to render each entry. Default <code>table</code>.</td>
767
+ <code>accordion</code> &middot; <code>timeline</code> &middot; <code>carousel</code>
768
+ &middot; <code>listgroup</code> &middot; <code>block</code></td>
769
+ <td>How each entry is shown. Default <code>table</code>.</td>
715
770
  </tr>
716
771
  <tr>
717
772
  <td><code>block</code></td>
718
773
  <td>block template name</td>
719
- <td>Required when <code>display="block"</code>. Names a template in
720
- <code>content/blocks/&lt;name&gt;.html</code> whose
721
- <code>{{field}}</code> placeholders get substituted per entry.
722
- </td>
774
+ <td>Required with <code>display="block"</code>; also works with carousel and listgroup.
775
+ The template's <code>&#123;&#123;field&#125;&#125;</code> placeholders are filled per entry.</td>
723
776
  </tr>
724
777
  <tr>
725
- <td><code>cols</code></td>
726
- <td><code>2</code> &middot; <code>3</code> &middot; <code>4</code> &middot; <code>5</code>
727
- &middot; <code>6</code></td>
728
- <td>Grid column count when <code>display="block"</code>.</td>
778
+ <td><code>fields</code>, <code>title-field</code>, <code>columns</code></td>
779
+ <td>field names, 2-4</td>
780
+ <td>Which fields show, which one is the title, and card columns.</td>
729
781
  </tr>
730
782
  <tr>
731
- <td><code>where</code></td>
732
- <td><code>field=value</code> or<br><code>f1=v1,f2=v2</code></td>
733
- <td>Row filter (simple equality only, AND'd across comma-separated predicates). Example:
734
- <code>where="tab=developers"</code> or
735
- <code>where="tier=free,featured=true"</code>. No OR, no comparison operators -
736
- use a saved View for anything more complex.
737
- </td>
783
+ <td><code>sort</code>, <code>order</code>, <code>limit</code></td>
784
+ <td>field, <code>asc</code>/<code>desc</code>, number</td>
785
+ <td>Default newest first (<code>createdAt</code>, <code>desc</code>), no limit.</td>
738
786
  </tr>
739
787
  <tr>
740
- <td><code>sort</code></td>
741
- <td>field name or <code>createdAt</code></td>
742
- <td>Sort field. Default <code>createdAt</code>.</td>
788
+ <td><code>where_&lt;field&gt;</code></td>
789
+ <td>value</td>
790
+ <td>Filter: <code>where_location="London"</code>, or add an operator -
791
+ <code>_ne</code>, <code>_gt</code>, <code>_gte</code>, <code>_lt</code>, <code>_lte</code>,
792
+ <code>_in</code>, <code>_nin</code>, <code>_contains</code>, <code>_starts</code>,
793
+ <code>_ends</code>, <code>_exists</code>. Filters combine with AND. The older
794
+ <code>where="field=value"</code> still works.</td>
743
795
  </tr>
744
796
  <tr>
745
- <td><code>order</code></td>
746
- <td><code>asc</code> &middot; <code>desc</code></td>
747
- <td>Sort direction. Default <code>desc</code>.</td>
797
+ <td><code>scope</code></td>
798
+ <td><code>mine</code></td>
799
+ <td>Only the signed-in visitor's own entries; anonymous visitors are asked to sign in.</td>
748
800
  </tr>
749
801
  <tr>
750
- <td><code>limit</code></td>
751
- <td>integer</td>
752
- <td>Maximum number of entries to render. 0 or omitted = all.</td>
802
+ <td><code>searchable</code>, <code>sortable</code>, <code>filterable</code>,
803
+ <code>paginate</code></td>
804
+ <td>flags; <code>filterable="a,b"</code></td>
805
+ <td>Any of these turns the block into the interactive <strong>Collection Browser</strong>:
806
+ search box, sort, a filter rail built from the fields, and pages
807
+ (<code>page-size</code>, default 12). <code>exportable</code> adds a CSV button.</td>
753
808
  </tr>
754
809
  <tr>
755
- <td><code>fields</code></td>
756
- <td>comma-separated field names</td>
757
- <td>Column filter - only these fields are shown (table/cards/list displays only).
758
- </td>
810
+ <td><code>transitions</code></td>
811
+ <td>flag</td>
812
+ <td>On an interactive block, each row gets buttons for the workflow actions that apply to
813
+ it now. Works with <code>scope="mine"</code>. See
814
+ <a href="#/docs/usage/actions">Actions</a>.</td>
759
815
  </tr>
760
816
  <tr>
761
- <td><code>title-field</code></td>
762
- <td>field name</td>
763
- <td>Which field to use as the entry title (cards/accordion displays).</td>
817
+ <td><code>cta</code></td>
818
+ <td>action slug</td>
819
+ <td>A button per entry that runs a CMS Action. See
820
+ <a href="#/docs/usage/cta-shortcode">CTA Shortcode</a>.</td>
764
821
  </tr>
765
822
  <tr>
766
823
  <td><code>empty</code></td>
767
- <td>string</td>
768
- <td>Message shown when the filter matches no entries.</td>
769
- </tr>
770
- <tr>
771
- <td><code>cta</code></td>
772
- <td>action slug</td>
773
- <td>Attach a CMS Action button to each rendered entry. See CTA attributes below.</td>
824
+ <td>text</td>
825
+ <td>Shown when nothing matches.</td>
774
826
  </tr>
775
827
  </tbody>
776
828
  </table>
829
+ <p>Timelines take <code>date-field</code>, <code>status-field</code>, <code>body-field</code>;
830
+ carousels take <code>image-field</code> and <code>body-field</code>. Visitors can right-click
831
+ any collection display to filter, sort, group, copy, print or export it (export follows the
832
+ collection's export setting), and the state is kept in the address so it can be shared.
833
+ Dates in collection displays read dd/mm/yyyy.</p>
777
834
 
778
835
  <h3>Form follow-up</h3>
779
836
  <p>Two optional settings control what happens after a submission is stored:</p>
@@ -803,7 +860,7 @@ Body content in **Markdown** is supported.
803
860
  <tr>
804
861
  <td><code>actionSlug</code></td>
805
862
  <td>Actions tab → CMS Action</td>
806
- <td>Slug of a CMS Action to execute after the entry is stored. Requires Pro (MongoDB).
863
+ <td>Slug of a CMS Action to execute after the entry is stored. Actions need MongoDB (Pro).
807
864
  Non-fatal on failure.
808
865
  </td>
809
866
  </tr>
@@ -832,29 +889,25 @@ Body content in **Markdown** is supported.
832
889
  </tbody>
833
890
  </table>
834
891
 
835
- <h3>Pro shortcodes</h3>
836
- <table class="table table-sm">
837
- <thead>
838
- <tr>
839
- <th>Shortcode</th>
840
- <th>Description</th>
841
- </tr>
842
- </thead>
843
- <tbody>
844
- <tr>
845
- <td><code>[view slug="..." display="table" /]</code></td>
846
- <td>Executes a saved View and renders results. Requires MongoDB.</td>
847
- </tr>
848
- <tr>
849
- <td><code>[cta action="..." entry="..."]Label[/cta]</code></td>
850
- <td>Action-trigger button. Requires the visitor to be logged in.</td>
851
- </tr>
852
- </tbody>
853
- </table>
892
+ <h3>Effects</h3>
893
+ <p>Effects wrap content or run on the whole page: <code>[reveal]</code>, <code>[breathe]</code>,
894
+ <code>[pulse]</code>, <code>[shake]</code>, <code>[scribe]</code>, <code>[scramble]</code>,
895
+ <code>[counter]</code>, <code>[ripple]</code>, <code>[twinkle]</code>,
896
+ <code>[ticker-tape]</code>, <code>[butterflies]</code>, <code>[strobe]</code>,
897
+ <code>[animate]</code>, <code>[ambient]</code>, <code>[firework]</code>,
898
+ <code>[fireworks]</code> and <code>[celebrate]</code> (with shorthands such as
899
+ <code>[christmas /]</code>). Many can also be added to a card, box, hero, banner, column or
900
+ button as attributes: <code>[card reveal reveal-animation="zoom"]</code>. Settings are at
901
+ <strong>System &gt; Effects</strong>.</p>
902
+
903
+ <h3>Actions on pages</h3>
904
+ <p><code>[cta action="..." entry="..."]Label[/cta]</code> places a button that runs a CMS Action
905
+ for a signed-in visitor. Actions need a MongoDB connection (Pro); collections, views and
906
+ everything else on this page work without one.</p>
854
907
 
855
- <p>Full attribute reference and live demos: <a href="/resources/shortcodes" target="_blank">Shortcode
856
- Reference</a> · <a href="/resources/components" target="_blank">Components</a> · <a
857
- href="/resources/effects" target="_blank">Effects</a></p>
908
+ <p>The page editor's Editor Reference lists every shortcode with its attributes, and its Insert
909
+ menu adds them for you. Plugins can add shortcodes of their own - see
910
+ <a href="#/docs/plugins">Plugin guides</a>.</p>
858
911
 
859
912
  </div>
860
913
  </div>
@@ -7,45 +7,77 @@
7
7
  <div class="col-12">
8
8
  <div class="docs-body">
9
9
 
10
- <p>Site Settings are stored in <code>config/site.json</code> and editable from the Settings page in
11
- the admin
12
- panel.</p>
10
+ <p>Site Settings are at <strong>System &gt; Site Settings</strong> and are stored in
11
+ <code>config/site.json</code>. Themes and fonts have their own screen, <strong>Content &gt;
12
+ Theme</strong>.</p>
13
13
 
14
14
  <table class="table table-sm">
15
15
  <thead>
16
16
  <tr>
17
- <th>Field</th>
18
- <th>Description</th>
17
+ <th>Tab</th>
18
+ <th>What it holds</th>
19
19
  </tr>
20
20
  </thead>
21
21
  <tbody>
22
22
  <tr>
23
- <td><code>siteName</code></td>
24
- <td>Site title used in the public navbar and browser tab.</td>
23
+ <td>General</td>
24
+ <td>Site title and tagline; <strong>Site URL</strong> (the site's real address, used for
25
+ password reset links, canonical links and the sitemap - set it); <strong>Admin
26
+ home</strong> (the screen the admin opens on); the default spacer size.</td>
25
27
  </tr>
26
28
  <tr>
27
- <td><code>tagline</code></td>
28
- <td>Subtitle shown in the public site footer.</td>
29
+ <td>SEO</td>
30
+ <td>Default page title, title separator and default description. The full SEO Tool is
31
+ <strong>SEO</strong> in the sidebar.</td>
29
32
  </tr>
30
33
  <tr>
31
- <td><code>adminTheme</code></td>
32
- <td>Admin panel colour theme (e.g. <code>charcoal-dark</code>, <code>ocean-light</code>).</td>
34
+ <td>Footer</td>
35
+ <td>Copyright text, social links, and whether visitors get a "Reduce motion" switch.
36
+ Footer links are menus - see <a href="#/docs/usage/navigation">Navigation</a>.</td>
33
37
  </tr>
34
38
  <tr>
35
- <td><code>publicTheme</code></td>
36
- <td>Public site theme applied to <code>&lt;html data-theme&gt;</code>.</td>
39
+ <td>Email</td>
40
+ <td>The SMTP server the site sends mail through (form notifications, password resets,
41
+ action emails). Without it, "Forgot your password?" cannot send a link.</td>
37
42
  </tr>
38
43
  <tr>
39
- <td><code>defaultLayout</code></td>
40
- <td>Fallback layout for pages that don't specify one.</td>
44
+ <td>Back to top, Cookie consent, Breadcrumbs</td>
45
+ <td>Switch each on or off and set its wording and position.</td>
46
+ </tr>
47
+ <tr>
48
+ <td>Custom CSS</td>
49
+ <td><code>content/custom.css</code>, applied to every public page after the theme.</td>
50
+ </tr>
51
+ <tr>
52
+ <td>Cache</td>
53
+ <td>The public page cache: switch it on or off, clear it, and see what it holds. Saving a page clears what it affects automatically.</td>
41
54
  </tr>
42
55
  </tbody>
43
56
  </table>
44
57
 
58
+ <h3>Theme</h3>
59
+ <p><strong>Content &gt; Theme</strong> (stored in <code>config/theme.json</code>) sets the public
60
+ theme, the admin theme, fonts, the visitor theme switcher, automatic day and night themes (at
61
+ the clock times you choose) and per-element overrides. A page can override the theme in its
62
+ Page Details.</p>
63
+
64
+ <h3>Dates and times</h3>
65
+ <p>The admin shows dates as dd/mm/yyyy and times on a 24-hour clock (dd/mm/yyyy HH:mm), whatever
66
+ the browser's language. Recent items may read "3 days ago" or "tomorrow at 09:00". Stored
67
+ values, API responses, date pickers, feeds and CSV exports keep their own formats. In a block
68
+ template, <code>&#123;&#123;field:FORMAT&#125;&#125;</code> formats a date field on the public site.</p>
69
+
45
70
  <h3>Server configuration</h3>
46
- <p>Low-level settings (port, CORS, upload size) live in <code>config/server.json</code> and require a
47
- server
48
- restart to take effect. These are not editable from the admin panel.</p>
71
+ <p>Low-level settings live in <code>config/server.json</code> and need a server restart to take
72
+ effect. They are not editable from the admin:</p>
73
+ <ul>
74
+ <li><code>port</code>, <code>host</code>, <code>cors</code></li>
75
+ <li><code>uploads.maxFileSize</code> - the largest upload, in bytes (10 MB by default)</li>
76
+ <li><code>restartOnPluginToggle</code> - restart automatically when a plugin is switched on
77
+ or off (on by default)</li>
78
+ <li><code>requireSignedPlugins</code> - refuse unsigned plugin files</li>
79
+ </ul>
80
+ <p>Sign-in token lifetimes and password reset link expiry are in <code>config/auth.json</code>.</p>
49
81
 
50
82
  </div>
51
83
  </div>
@@ -0,0 +1,73 @@
1
+ <div class="view-header">
2
+ <h1><span data-icon="book"></span> Built-in Tools</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>Contacts, Notes, Todo, Analytics and SEO are part of the CMS. They sit in the sidebar's Tools folder
11
+ and are on unless you switch them off at the top of the Marketplace (<strong>System &gt;
12
+ Plugins</strong>). Switching a Tool off hides it and stops its screens and API; nothing is
13
+ deleted. Who may use each is a permission under <strong>System &gt; Roles</strong> (Tools
14
+ group): only the level-0 role has them all to begin with, and Admin has SEO.</p>
15
+
16
+ <h3>Contacts</h3>
17
+ <p>An address book for each user. <strong>Your contacts are private</strong>: nobody else sees
18
+ them, admins included. Star favourites, search as you type, and right-click a contact to edit,
19
+ email, call, copy, file it in a group, duplicate or delete it.</p>
20
+ <p><strong>Groups are shared.</strong> Everyone who uses Contacts has the same list of groups, and
21
+ anyone can file their own contacts in any group. Because renaming or deleting a group changes
22
+ it for everyone, only the person who created it, or someone holding <strong>Contacts &gt;
23
+ Manage groups</strong> (<code>contacts.manageGroups</code>), may do it. The level-0 role holds
24
+ it and Admin is given it once. Groups made before 0.93.0 have no recorded creator, so only
25
+ holders of the permission can change them. In Manage groups, Rename and Delete are greyed out
26
+ where you may not, with a note saying why.</p>
27
+
28
+ <h3>Notes</h3>
29
+ <p>Private notes for each user, with categories and search.</p>
30
+
31
+ <h3>Todo</h3>
32
+ <p>To-do lists with priorities and due dates. Each morning, anyone with overdue tasks gets one
33
+ notification listing them, and one for what is due today. Switch that off under
34
+ Notifications &gt; Sources ("To-dos overdue or due today").</p>
35
+
36
+ <h3>Where Notes, Todo and Contacts are stored</h3>
37
+ <p>On files, unless the site has a working MongoDB connection (Pro): Notes and Todo then use
38
+ MongoDB, as their collections declare; Contacts stay on files. A site is never switched to
39
+ an empty store - while the files still hold notes or to-dos they stay on files, and the
40
+ server log says so. To settle it, use the collection's <strong>Storage</strong> move, which
41
+ keeps every id (see <a href="#/docs/usage/collections">Collections &amp; Forms</a>).</p>
42
+
43
+ <h3>Analytics</h3>
44
+ <p>Page views and visitors, counted on your own server - no third-party script. Admin pages, the
45
+ API and browsers that ask not to be tracked are never counted. Analytics Pro, in the
46
+ Marketplace, adds deeper reports.</p>
47
+
48
+ <h3>SEO</h3>
49
+ <p>How the site looks to search engines: an audit of every page with a score, each page's search
50
+ result and share card as they will look, titles and descriptions used twice, redirects (added
51
+ for you when a page is renamed), the sitemap and robots.txt, and who runs the site. SEO Pro
52
+ adds a not-found log, a link monitor and SEO history.</p>
53
+
54
+ <h3>Notifications</h3>
55
+ <p>The bell in the admin, and <strong>System &gt; Notifications</strong>. Opening the screen marks
56
+ everything read. Its settings choose which <strong>sources</strong> notify which roles, and
57
+ whether your browser shows desktop notifications. A notice with no audience goes to admins
58
+ and above.</p>
59
+
60
+ <h3>Site search</h3>
61
+ <p><strong>System &gt; Search</strong> sets up the search box visitors open from the navbar (or
62
+ with Ctrl+K). It searches pages only. Results follow the visitor's roles: a page they may not
63
+ open never appears, nor do drafts, <code>noindex</code> pages or pages in a disabled
64
+ project.</p>
65
+
66
+ <h3>Plugins</h3>
67
+ <p>Tools from the Marketplace (Calendar, Blog, Feedback, Mail Reader and others) join the same
68
+ folder when switched on. See <a href="#/docs/plugins">Plugin guides</a> for each one you have
69
+ installed, and <a href="#/docs/usage/plugins">Plugins</a> for installing and switching.</p>
70
+
71
+ </div>
72
+ </div>
73
+ </div>
@@ -8,12 +8,12 @@
8
8
  <div class="docs-body">
9
9
 
10
10
  <p>Users are stored as individual JSON files in <code>content/users/</code>. Passwords are hashed with
11
- bcrypt and never returned by the API. Manage them at <strong>System &gt; Users</strong>.</p>
11
+ bcrypt and never returned by the API. Manage accounts at <strong>System &gt; Users</strong> and
12
+ roles at <strong>System &gt; Roles</strong>.</p>
12
13
 
13
14
  <h3>Roles</h3>
14
- <p>Roles are data, stored in the <code>roles</code> preset collection and managed at
15
- <strong>System &gt; Roles</strong>. Every site starts with three base roles, which cannot be
16
- deleted:</p>
15
+ <p>Roles are data, stored in the <code>roles</code> preset collection. Every site starts with three
16
+ base roles, which cannot be deleted:</p>
17
17
  <table class="table table-sm">
18
18
  <thead>
19
19
  <tr>
@@ -26,13 +26,15 @@
26
26
  <tr>
27
27
  <td><strong>Super Admin</strong> (<code>super-admin</code>)</td>
28
28
  <td>0</td>
29
- <td>Everything, including permissions added by plugins.</td>
29
+ <td>Everything. The level-0 role holds every permission, including the ones plugins and
30
+ built-in Tools add, whatever its permission list says.</td>
30
31
  </tr>
31
32
  <tr>
32
33
  <td><strong>Admin</strong> (<code>admin</code>)</td>
33
34
  <td>1</td>
34
35
  <td>Content, structure, collections, views, actions, users, settings, theme, plugins,
35
- API tokens and endpoints, notifications.</td>
36
+ API tokens and endpoints, notifications, SEO, and renaming or deleting any contact
37
+ group. Plugins usually grant their own permissions to Admin when first switched on.</td>
36
38
  </tr>
37
39
  <tr>
38
40
  <td><strong>User</strong> (<code>user</code>)</td>
@@ -41,23 +43,100 @@
41
43
  </tr>
42
44
  </tbody>
43
45
  </table>
44
- <p>You can add your own roles (New role on the Roles screen) and plugins can add theirs. Each role has
45
- a level (lower = more senior) and a set of permissions, ticked in a matrix of resources and
46
- actions (view, create, edit, delete). A user has one primary role plus optional additional
47
- roles; a permission check passes if any of their roles grants it. You can only manage users
48
- whose role is less senior than your own.</p>
46
+ <p>The built-in Tools (Contacts, Notes, Todo, Analytics) are not given to Admin or User by
47
+ default - tick them for the roles that should have them.</p>
49
48
 
50
- <h3>Authentication</h3>
51
- <p>The admin panel uses JWT Bearer tokens, stored in the browser and refreshed automatically. By
52
- default an access token lasts 15 minutes and a refresh token 7 days (<code>config/auth.json</code>).
53
- Each sign-in is a session kept on disk, so signing out holds even across a restart; changing a
54
- password signs out that account's other sessions.</p>
49
+ <h3>Your own roles</h3>
50
+ <p>Add roles with <strong>New role</strong> on the Roles screen. Each role has a
51
+ <strong>level</strong> (lower is more senior) and a set of permissions, ticked in a matrix of
52
+ resources and actions (View, Create, Edit, Delete, and extras such as Contacts &gt; Manage
53
+ groups). Permissions are grouped: Content, Structure, Data, Configuration, Tools, then Plugins.</p>
54
+ <ul>
55
+ <li><strong>Additional roles.</strong> A user has one primary role and can hold more. A
56
+ permission check passes if any role they hold grants it.</li>
57
+ <li><strong>Grants only add.</strong> A plugin that grants its permission to a role does it
58
+ once. If you untick it afterwards it stays unticked.</li>
59
+ <li><strong>Plugin roles.</strong> Some plugins bring roles of their own (the Blog's Blog Author
60
+ and Blog Editor, for example). They appear on the Roles screen
61
+ like any other and you can edit them; the plugin never overwrites your changes.
62
+ Switching the plugin off keeps its roles; uninstalling it removes them and moves their users to <code>user</code>.</li>
63
+ </ul>
64
+
65
+ <h3>Confining a role to some screens</h3>
66
+ <p>A role can be confined to a list of admin screens, with one of them as its home - useful for
67
+ people who sign themselves up on the public site. A confined user sees only those screens
68
+ in the sidebar, and the server refuses their calls to any plugin API whose screens they
69
+ cannot open. A user is confined only when every role they hold is confined: one unconfined
70
+ role lifts it. The level-0 role is never confined.</p>
71
+
72
+ <h3>Who can see what: the role ladder</h3>
73
+ <p>Pages, menu items, views and actions name the roles they are for. Two forms exist, and the
74
+ page and menu editors offer both for every role:</p>
75
+ <table class="table table-sm">
76
+ <thead>
77
+ <tr>
78
+ <th>You choose</th>
79
+ <th>Stored as</th>
80
+ <th>Who gets in</th>
81
+ </tr>
82
+ </thead>
83
+ <tbody>
84
+ <tr>
85
+ <td>Candidate and above</td>
86
+ <td><code>candidate</code></td>
87
+ <td>Holders of that role and everyone on the same or a more senior level.</td>
88
+ </tr>
89
+ <tr>
90
+ <td>Candidate only</td>
91
+ <td><code>=candidate</code></td>
92
+ <td>Holders of that role only (primary or additional), plus the level-0 role. An ordinary
93
+ admin does not pass - give them the role as an additional role if they need it.</td>
94
+ </tr>
95
+ <tr>
96
+ <td>Several roles</td>
97
+ <td><code>[candidate, employer]</code></td>
98
+ <td>Anyone who passes any one of them. Exact and ladder forms mix.</td>
99
+ </tr>
100
+ <tr>
101
+ <td>Private</td>
102
+ <td><code>private</code></td>
103
+ <td>The level-0 role only.</td>
104
+ </tr>
105
+ </tbody>
106
+ </table>
107
+ <p>A role name the site does not have (a role since deleted, or a typo) admits only the level-0
108
+ role - never everyone. The collection and action editors flag such a role so you can fix it. A
109
+ page a visitor may not see answers 403; a draft answers 404.</p>
110
+
111
+ <h3>Managing users</h3>
112
+ <p>You can only create, edit, delete or reset the password of a user whose role is less senior
113
+ than yours (a higher level number) - an admin cannot manage another admin. You cannot give
114
+ anyone a role more senior than your own.</p>
115
+ <p>Right-click a user (or use the row menu) to <strong>Send password reset email</strong>,
116
+ <strong>Copy a reset link</strong> (for a site without email) or <strong>Withdraw the reset
117
+ link</strong>. The account holder is emailed whenever their password changes.</p>
118
+
119
+ <h3>Passwords and sign-in</h3>
120
+ <p>The core rule is at least 8 characters. The free Security plugin, when switched on, adds stricter
121
+ password rules, sign-in lockout and a log of every sign-in; Security Pro adds two-factor
122
+ sign-in and a list of every signed-in session.
123
+ "Forgot your password?" works only when the site can send email (Site Settings &gt; Email);
124
+ without it the sign-in screen tells the person to ask an administrator.</p>
125
+ <p>The admin panel uses JWT Bearer tokens, refreshed automatically. By default an access token
126
+ lasts 15 minutes and a refresh token 7 days (<code>config/auth.json</code>). Each sign-in is a
127
+ session kept on disk, so signing out holds even across a restart; changing a password signs
128
+ out that account's other sessions.</p>
55
129
 
56
130
  <h3>Views &amp; Actions</h3>
57
- <p>Access to Views and Actions is controlled by the <code>views</code> and <code>actions</code>
58
- permissions. Super Admin and Admin hold both by default; the User role holds neither. Grant
59
- them to a custom role in the role editor. Views work on every storage adapter; Actions need a
60
- MongoDB connection.</p>
131
+ <p>Building Views and Actions is controlled by the <code>views</code> and <code>actions</code>
132
+ permissions. Super Admin and Admin hold both by default; the User role holds neither. Who may
133
+ read a view or run an action is set on the view or action itself (its Access tab), using the
134
+ role ladder above - any listed role is enough. Views work on every storage adapter; Actions
135
+ need a MongoDB connection.</p>
136
+
137
+ <p>See also: <a href="#/docs/usage/editions">Editions &amp; Licences</a> for what the free and
138
+ Pro editions include, and <a href="#/docs/plugins">Plugin guides</a> for the roles and
139
+ permissions each installed plugin adds.</p>
61
140
 
62
141
  </div>
63
142
  </div>