domma-cms 0.9.6 → 0.10.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.
@@ -5,18 +5,21 @@
5
5
  <div class="row">
6
6
  <div class="col-12">
7
7
 
8
- <!-- Writing a Plugin -->
9
- <div class="card card-collapsible mb-4">
10
- <div class="card-header" role="button" tabindex="0">
11
- <div class="card-header-content"><h2><span data-icon="package"></span> Writing a Plugin</h2></div>
12
- <span class="card-collapse-icon" data-icon="chevron-down"></span>
8
+ <div class="tabs" id="tutorials-tabs">
9
+ <div class="tab-list" style="flex-wrap: wrap;">
10
+ <button class="tab-item active">Writing a Plugin</button>
11
+ <button class="tab-item">Form Follow-Up</button>
13
12
  </div>
14
- <div class="card-body docs-body">
15
- <p>Plugins live in the <code>plugins/</code> directory. Each plugin is a self-contained folder with three
16
- required files and optional <code>admin/</code> and <code>public/</code> subdirectories.</p>
13
+ <div class="tab-content">
17
14
 
18
- <h3>Directory structure</h3>
19
- <pre class="code-block"><code>plugins/
15
+ <!-- Writing a Plugin -->
16
+ <div class="tab-panel active docs-body">
17
+ <p>Plugins live in the <code>plugins/</code> directory. Each plugin is a self-contained folder with
18
+ three
19
+ required files and optional <code>admin/</code> and <code>public/</code> subdirectories.</p>
20
+
21
+ <h3>Directory structure</h3>
22
+ <pre class="code-block"><code>plugins/
20
23
  my-plugin/
21
24
  plugin.json ← manifest (required)
22
25
  plugin.js ← Fastify plugin (required)
@@ -31,12 +34,13 @@
31
34
  inject-body.html ← injected before &lt;/body&gt; on every page (optional)
32
35
  data/ ← plugin data store (optional, not publicly served)</code></pre>
33
36
 
34
- <hr>
37
+ <hr>
35
38
 
36
- <h3>1. plugin.json — the manifest</h3>
37
- <p>All fields below are <strong>required</strong>. Missing any will cause the plugin to be skipped on startup
38
- with a warning in the server log.</p>
39
- <pre class="code-block"><code>{
39
+ <h3>1. plugin.json — the manifest</h3>
40
+ <p>All fields below are <strong>required</strong>. Missing any will cause the plugin to be skipped on
41
+ startup
42
+ with a warning in the server log.</p>
43
+ <pre class="code-block"><code>{
40
44
  "name": "my-plugin",
41
45
  "displayName": "My Plugin",
42
46
  "version": "1.0.0",
@@ -46,53 +50,56 @@
46
50
  "icon": "star"
47
51
  }</code></pre>
48
52
 
49
- <p>Optional fields:</p>
50
- <table class="table table-sm">
51
- <thead>
52
- <tr>
53
- <th>Field</th>
54
- <th>Type</th>
55
- <th>Description</th>
56
- </tr>
57
- </thead>
58
- <tbody>
59
- <tr>
60
- <td><code>inject.head</code></td>
61
- <td>string</td>
62
- <td>Path (relative to plugin root) to an HTML snippet injected into <code>&lt;head&gt;</code>.</td>
63
- </tr>
64
- <tr>
65
- <td><code>inject.bodyEnd</code></td>
66
- <td>string</td>
67
- <td>Path to an HTML snippet injected before <code>&lt;/body&gt;</code>.</td>
68
- </tr>
69
- <tr>
70
- <td><code>admin.sidebar</code></td>
71
- <td>array</td>
72
- <td>Sidebar items to add to the admin panel.</td>
73
- </tr>
74
- <tr>
75
- <td><code>admin.routes</code></td>
76
- <td>array</td>
77
- <td>SPA routes to register in the admin router.</td>
78
- </tr>
79
- <tr>
80
- <td><code>admin.views</code></td>
81
- <td>object</td>
82
- <td>View modules to dynamically import into the admin SPA.</td>
83
- </tr>
84
- </tbody>
85
- </table>
86
-
87
- <hr>
88
-
89
- <h3>2. plugin.js — the Fastify plugin</h3>
90
- <p>This is the server-side entry point. It must export a default <strong>async function</strong> that Fastify
91
- will call with <code>(fastify, options)</code>.</p>
92
- <p>The CMS injects auth middleware through <code>options.auth</code> — always destructure from there rather than
93
- importing directly.</p>
94
-
95
- <pre class="code-block"><code>import { getPluginSettings, savePluginState } from '../../server/services/plugins.js';
53
+ <p>Optional fields:</p>
54
+ <table class="table table-sm">
55
+ <thead>
56
+ <tr>
57
+ <th>Field</th>
58
+ <th>Type</th>
59
+ <th>Description</th>
60
+ </tr>
61
+ </thead>
62
+ <tbody>
63
+ <tr>
64
+ <td><code>inject.head</code></td>
65
+ <td>string</td>
66
+ <td>Path (relative to plugin root) to an HTML snippet injected into <code>&lt;head&gt;</code>.
67
+ </td>
68
+ </tr>
69
+ <tr>
70
+ <td><code>inject.bodyEnd</code></td>
71
+ <td>string</td>
72
+ <td>Path to an HTML snippet injected before <code>&lt;/body&gt;</code>.</td>
73
+ </tr>
74
+ <tr>
75
+ <td><code>admin.sidebar</code></td>
76
+ <td>array</td>
77
+ <td>Sidebar items to add to the admin panel.</td>
78
+ </tr>
79
+ <tr>
80
+ <td><code>admin.routes</code></td>
81
+ <td>array</td>
82
+ <td>SPA routes to register in the admin router.</td>
83
+ </tr>
84
+ <tr>
85
+ <td><code>admin.views</code></td>
86
+ <td>object</td>
87
+ <td>View modules to dynamically import into the admin SPA.</td>
88
+ </tr>
89
+ </tbody>
90
+ </table>
91
+
92
+ <hr>
93
+
94
+ <h3>2. plugin.js the Fastify plugin</h3>
95
+ <p>This is the server-side entry point. It must export a default <strong>async function</strong> that
96
+ Fastify
97
+ will call with <code>(fastify, options)</code>.</p>
98
+ <p>The CMS injects auth middleware through <code>options.auth</code> — always destructure from there
99
+ rather than
100
+ importing directly.</p>
101
+
102
+ <pre class="code-block"><code>import { getPluginSettings, savePluginState } from '../../server/services/plugins.js';
96
103
 
97
104
  export default async function myPlugin(fastify, options) {
98
105
  const { authenticate, requireAdmin } = options.auth;
@@ -113,30 +120,33 @@ export default async function myPlugin(fastify, options) {
113
120
  });
114
121
  }</code></pre>
115
122
 
116
- <p>Routes are registered under the prefix <code>/api/plugins/{name}</code> automatically. You do not set the
117
- prefix yourself — it is always locked to your plugin's directory name.</p>
123
+ <p>Routes are registered under the prefix <code>/api/plugins/{name}</code> automatically. You do not
124
+ set the
125
+ prefix yourself — it is always locked to your plugin's directory name.</p>
118
126
 
119
- <hr>
127
+ <hr>
120
128
 
121
- <h3>3. config.js — settings defaults</h3>
122
- <p>Export a plain object of default settings. These are merged with any user overrides stored in <code>config/plugins.json</code>
123
- when <code>getPluginSettings()</code> is called.</p>
129
+ <h3>3. config.js — settings defaults</h3>
130
+ <p>Export a plain object of default settings. These are merged with any user overrides stored in
131
+ <code>config/plugins.json</code>
132
+ when <code>getPluginSettings()</code> is called.</p>
124
133
 
125
- <pre class="code-block"><code>export default {
134
+ <pre class="code-block"><code>export default {
126
135
  greeting: 'Hello, world!',
127
136
  enableFeature: true,
128
137
  maxItems: 10
129
138
  };</code></pre>
130
139
 
131
- <p><code>config.js</code> is only loaded for <strong>enabled</strong> plugins. Side-effect code here will not
132
- run for disabled plugins.</p>
140
+ <p><code>config.js</code> is only loaded for <strong>enabled</strong> plugins. Side-effect code here
141
+ will not
142
+ run for disabled plugins.</p>
133
143
 
134
- <hr>
144
+ <hr>
135
145
 
136
- <h3>4. Admin views (optional)</h3>
137
- <p>To add a page to the admin panel, declare the route and view in <code>plugin.json</code>:</p>
146
+ <h3>4. Admin views (optional)</h3>
147
+ <p>To add a page to the admin panel, declare the route and view in <code>plugin.json</code>:</p>
138
148
 
139
- <pre class="code-block"><code>"admin": {
149
+ <pre class="code-block"><code>"admin": {
140
150
  "sidebar": [
141
151
  {
142
152
  "id": "my-plugin",
@@ -161,10 +171,10 @@ export default async function myPlugin(fastify, options) {
161
171
  }
162
172
  }</code></pre>
163
173
 
164
- <p>The view file follows the standard Domma view pattern — a <code>templateUrl</code> and an <code>onMount($container)</code>
165
- function:</p>
174
+ <p>The view file follows the standard Domma view pattern — a <code>templateUrl</code> and an <code>onMount($container)</code>
175
+ function:</p>
166
176
 
167
- <pre class="code-block"><code>// admin/views/my-view.js
177
+ <pre class="code-block"><code>// admin/views/my-view.js
168
178
  export const myPluginView = {
169
179
  templateUrl: '/plugins/my-plugin/admin/templates/my-view.html',
170
180
 
@@ -179,10 +189,11 @@ export const myPluginView = {
179
189
  }
180
190
  };</code></pre>
181
191
 
182
- <p>The template is a plain HTML fragment (no <code>&lt;html&gt;</code> wrapper). Use the same card and form
183
- patterns as the rest of the admin panel:</p>
192
+ <p>The template is a plain HTML fragment (no <code>&lt;html&gt;</code> wrapper). Use the same card and
193
+ form
194
+ patterns as the rest of the admin panel:</p>
184
195
 
185
- <pre class="code-block"><code>&lt;!-- admin/templates/my-view.html --&gt;
196
+ <pre class="code-block"><code>&lt;!-- admin/templates/my-view.html --&gt;
186
197
  &lt;div class="view-header"&gt;
187
198
  &lt;h1&gt;&lt;span data-icon="star"&gt;&lt;/span&gt; My Plugin&lt;/h1&gt;
188
199
  &lt;/div&gt;
@@ -193,14 +204,16 @@ export const myPluginView = {
193
204
  &lt;/div&gt;
194
205
  &lt;/div&gt;</code></pre>
195
206
 
196
- <hr>
207
+ <hr>
197
208
 
198
- <h3>5. Injection snippets (optional)</h3>
199
- <p>HTML snippets declared in <code>inject.head</code> and <code>inject.bodyEnd</code> are read from the plugin's
200
- <code>public/</code> directory and inserted into every public page. Use this for analytics scripts,
201
- stylesheets, or widgets.</p>
209
+ <h3>5. Injection snippets (optional)</h3>
210
+ <p>HTML snippets declared in <code>inject.head</code> and <code>inject.bodyEnd</code> are read from
211
+ the plugin's
212
+ <code>public/</code> directory and inserted into every public page. Use this for analytics
213
+ scripts,
214
+ stylesheets, or widgets.</p>
202
215
 
203
- <pre class="code-block"><code>&lt;!-- public/inject-body.html --&gt;
216
+ <pre class="code-block"><code>&lt;!-- public/inject-body.html --&gt;
204
217
  &lt;script&gt;
205
218
  (function () {
206
219
  // This runs on every public page
@@ -210,55 +223,55 @@ export const myPluginView = {
210
223
  })();
211
224
  &lt;/script&gt;</code></pre>
212
225
 
213
- <p>Snippet paths are validated — they must stay within the plugin's own directory. Paths containing
214
- <code>..</code> are blocked.</p>
215
-
216
- <hr>
217
-
218
- <h3>6. Registering and testing</h3>
219
- <ol>
220
- <li>Create the <code>plugins/my-plugin/</code> directory with all three required files.</li>
221
- <li>Restart the server — you should see <code>[plugins] Loaded N plugins: …, my-plugin</code> in the log.</li>
222
- <li>Go to the <a href="#/plugins">Plugins page</a> and enable your plugin.</li>
223
- <li>Restart the server again to register the routes.</li>
224
- <li>Verify your endpoint: <code>GET /api/plugins/my-plugin/hello</code></li>
225
- </ol>
226
-
227
- <p class="text-muted" style="font-size:.9rem">Tip: use <code>npm run dev</code> during development — the server
228
- restarts automatically on file changes.</p>
229
- </div>
230
- </div>
231
-
232
- <!-- Tutorial: Form Follow-Up -->
233
- <div class="card card-collapsible mb-4">
234
- <div class="card-header">
235
- <h2>Form Follow-Up: Notifications &amp; Actions</h2>
236
- </div>
237
- <div class="card-body">
238
-
239
- <p>Every form in Domma CMS can trigger up to four things after a submission is stored:</p>
240
- <ol>
241
- <li>Send an <strong>email notification</strong> to one or more recipients</li>
242
- <li>POST to a <strong>webhook URL</strong></li>
243
- <li>Execute a <strong>CMS Action</strong> (Pro)</li>
244
- <li>Redirect the visitor to a <strong>success page</strong> (or show an inline message)</li>
245
- </ol>
246
- <p>These are configured per-form in the admin. Open any form in <a href="#/forms">Forms</a> and go to the
247
- <strong>Settings</strong> and <strong>Actions</strong> tabs.</p>
248
-
249
- <hr>
250
-
251
- <h3>1. Email notification</h3>
252
- <p>Go to the <strong>Actions</strong> tab of your form and enable <em>Send email on submit</em>. Enter one or
253
- more comma-separated recipient addresses. This uses the SMTP settings configured in
254
- <a href="#/settings">Site Settings → Email / SMTP</a>.</p>
255
-
256
- <pre class="code-block"><code>Recipients: admin@example.com, team@example.com
226
+ <p>Snippet paths are validated — they must stay within the plugin's own directory. Paths containing
227
+ <code>..</code> are blocked.</p>
228
+
229
+ <hr>
230
+
231
+ <h3>6. Registering and testing</h3>
232
+ <ol>
233
+ <li>Create the <code>plugins/my-plugin/</code> directory with all three required files.</li>
234
+ <li>Restart the server — you should see <code>[plugins] Loaded N plugins: …, my-plugin</code> in
235
+ the log.
236
+ </li>
237
+ <li>Go to the <a href="#/plugins">Plugins page</a> and enable your plugin.</li>
238
+ <li>Restart the server again to register the routes.</li>
239
+ <li>Verify your endpoint: <code>GET /api/plugins/my-plugin/hello</code></li>
240
+ </ol>
241
+
242
+ <p class="text-muted" style="font-size:.9rem">Tip: use <code>npm run dev</code> during development —
243
+ the server
244
+ restarts automatically on file changes.</p>
245
+ </div>
246
+
247
+ <!-- Form Follow-Up -->
248
+ <div class="tab-panel docs-body">
249
+ <p>Every form in Domma CMS can trigger up to four things after a submission is stored:</p>
250
+ <ol>
251
+ <li>Send an <strong>email notification</strong> to one or more recipients</li>
252
+ <li>POST to a <strong>webhook URL</strong></li>
253
+ <li>Execute a <strong>CMS Action</strong> (Pro)</li>
254
+ <li>Redirect the visitor to a <strong>success page</strong> (or show an inline message)</li>
255
+ </ol>
256
+ <p>These are configured per-form in the admin. Open any form in <a href="#/forms">Forms</a> and go to
257
+ the
258
+ <strong>Settings</strong> and <strong>Actions</strong> tabs.</p>
259
+
260
+ <hr>
261
+
262
+ <h3>1. Email notification</h3>
263
+ <p>Go to the <strong>Actions</strong> tab of your form and enable <em>Send email on submit</em>. Enter
264
+ one or
265
+ more comma-separated recipient addresses. This uses the SMTP settings configured in
266
+ <a href="#/settings">Site Settings Email / SMTP</a>.</p>
267
+
268
+ <pre class="code-block"><code>Recipients: admin@example.com, team@example.com
257
269
  Subject Prefix: [Contact Form]</code></pre>
258
270
 
259
- <h3>2. Webhook</h3>
260
- <p>Enable <em>POST to webhook on submit</em> and enter a URL. Domma will POST the following JSON body:</p>
261
- <pre class="code-block"><code>{
271
+ <h3>2. Webhook</h3>
272
+ <p>Enable <em>POST to webhook on submit</em> and enter a URL. Domma will POST the following JSON body:
273
+ </p>
274
+ <pre class="code-block"><code>{
262
275
  "form": "enquiries",
263
276
  "data": {
264
277
  "full_name": "Jane Smith",
@@ -266,49 +279,61 @@ Subject Prefix: [Contact Form]</code></pre>
266
279
  "message": "Hello!"
267
280
  }
268
281
  }</code></pre>
269
- <p>Use this to integrate with Zapier, Make, Slack, or any HTTP endpoint.</p>
270
-
271
- <h3>3. CMS Action (Pro)</h3>
272
- <p>Actions are reusable workflow steps defined in <a href="#/actions">Actions</a>. A single action can chain
273
- multiple steps: update a field, move an entry to another collection, send an email, call a webhook, or
274
- delete an entry.</p>
275
- <p>To wire an Action to a form:</p>
276
- <ol>
277
- <li>Create an Action in <a href="#/actions">Actions</a> targeting the same collection as your form.</li>
278
- <li>Open the form in <a href="#/forms">Forms</a> → <strong>Actions</strong> tab → <strong>CMS Action</strong>
279
- card.</li>
280
- <li>Select the Action from the dropdown and save.</li>
281
- </ol>
282
- <p>The Action runs server-side, after the entry is saved. If it fails (e.g. MongoDB is not configured),
283
- the submission is still stored — the action failure is non-fatal and logged as a warning.</p>
284
-
285
- <h3>4. Success message vs. redirect</h3>
286
- <p>After a successful submission the visitor sees one of two things:</p>
287
- <ul>
288
- <li><strong>Inline success message</strong> the form is replaced by the text set in
289
- <em>Settings → Success Message</em>. Good for simple acknowledgements.</li>
290
- <li><strong>Page redirect</strong> — the visitor is sent to the URL set in
291
- <em>Settings → Success Redirect URL</em>. Good for registration flows, checkouts, or when you want
292
- a full thank-you page with additional content. <strong>Takes priority</strong> if both are set.</li>
293
- </ul>
294
- <p>Example: set <em>Success Redirect URL</em> to <code>/thank-you</code> and create a <code>thank-you.md</code>
295
- page in the CMS with any content you like.</p>
296
-
297
- <h3>Execution order</h3>
298
- <p>On every submission, the pipeline runs in this fixed order:</p>
299
- <ol>
300
- <li>Validate fields + honeypot + rate limit</li>
301
- <li>Store entry to collection</li>
302
- <li>Send email (if enabled)</li>
303
- <li>Call webhook (if enabled)</li>
304
- <li>Execute CMS Action (if set)</li>
305
- <li>Return success response client redirects or shows message</li>
306
- </ol>
307
- <p>Steps 3–5 are non-fatal: a failure in any of them is logged as a warning but does not prevent the
308
- submission from being stored or the success response from being returned.</p>
309
-
310
- </div>
311
- </div>
282
+ <p>Use this to integrate with Zapier, Make, Slack, or any HTTP endpoint.</p>
283
+
284
+ <h3>3. CMS Action (Pro)</h3>
285
+ <p>Actions are reusable workflow steps defined in <a href="#/actions">Actions</a>. A single action can
286
+ chain
287
+ multiple steps: update a field, move an entry to another collection, send an email, call a
288
+ webhook, or
289
+ delete an entry.</p>
290
+ <p>To wire an Action to a form:</p>
291
+ <ol>
292
+ <li>Create an Action in <a href="#/actions">Actions</a> targeting the same collection as your
293
+ form.
294
+ </li>
295
+ <li>Open the form in <a href="#/forms">Forms</a> <strong>Actions</strong> tab <strong>CMS
296
+ Action</strong>
297
+ card.
298
+ </li>
299
+ <li>Select the Action from the dropdown and save.</li>
300
+ </ol>
301
+ <p>The Action runs server-side, after the entry is saved. If it fails (e.g. MongoDB is not
302
+ configured),
303
+ the submission is still stored — the action failure is non-fatal and logged as a warning.</p>
304
+
305
+ <h3>4. Success message vs. redirect</h3>
306
+ <p>After a successful submission the visitor sees one of two things:</p>
307
+ <ul>
308
+ <li><strong>Inline success message</strong> — the form is replaced by the text set in
309
+ <em>Settings → Success Message</em>. Good for simple acknowledgements.
310
+ </li>
311
+ <li><strong>Page redirect</strong> the visitor is sent to the URL set in
312
+ <em>Settings → Success Redirect URL</em>. Good for registration flows, checkouts, or when you
313
+ want
314
+ a full thank-you page with additional content. <strong>Takes priority</strong> if both are
315
+ set.
316
+ </li>
317
+ </ul>
318
+ <p>Example: set <em>Success Redirect URL</em> to <code>/thank-you</code> and create a <code>thank-you.md</code>
319
+ page in the CMS with any content you like.</p>
320
+
321
+ <h3>Execution order</h3>
322
+ <p>On every submission, the pipeline runs in this fixed order:</p>
323
+ <ol>
324
+ <li>Validate fields + honeypot + rate limit</li>
325
+ <li>Store entry to collection</li>
326
+ <li>Send email (if enabled)</li>
327
+ <li>Call webhook (if enabled)</li>
328
+ <li>Execute CMS Action (if set)</li>
329
+ <li>Return success response → client redirects or shows message</li>
330
+ </ol>
331
+ <p>Steps 3–5 are non-fatal: a failure in any of them is logged as a warning but does not prevent the
332
+ submission from being stored or the success response from being returned.</p>
333
+ </div>
334
+
335
+ </div>
336
+ </div>
312
337
 
313
338
  </div>
314
339
  </div>
@@ -1 +1 @@
1
- export const apiReferenceView={templateUrl:"/admin/js/templates/api-reference.html",async onMount(e){Domma.icons.scan(),Domma.syntax.scan()}};
1
+ export const apiReferenceView={templateUrl:"/admin/js/templates/api-reference.html",async onMount(e){E.tabs(e.find("#api-tabs").get(0)),Domma.icons.scan(),Domma.syntax.scan()}};
@@ -1 +1 @@
1
- export const documentationView={templateUrl:"/admin/js/templates/documentation.html",async onMount(t){Domma.elements.collapsible(t.get(0)),Domma.icons.scan(),Domma.syntax.scan()}};
1
+ export const documentationView={templateUrl:"/admin/js/templates/documentation.html",async onMount(t){E.tabs(t.find("#docs-tabs").get(0)),Domma.icons.scan(),Domma.syntax.scan()}};
@@ -1 +1 @@
1
- import{dashboardView as o}from"./dashboard.js";import{pagesView as i}from"./pages.js";import{pageEditorView as r}from"./page-editor.js";import{settingsView as e}from"./settings.js";import{navigationView as t}from"./navigation.js";import{layoutsView as m}from"./layouts.js";import{mediaView as s}from"./media.js";import{loginView as f}from"./login.js";import{usersView as p}from"./users.js";import{userEditorView as w}from"./user-editor.js";import{pluginsView as V}from"./plugins.js";import{documentationView as n}from"./documentation.js";import{tutorialsView as l}from"./tutorials.js";import{apiReferenceView as c}from"./api-reference.js";import{collectionsView as a}from"./collections.js";import{collectionEditorView as d}from"./collection-editor.js";import{collectionEntriesView as E}from"./collection-entries.js";import{formsView as u}from"./forms.js";import{formEditorView as g}from"./form-editor.js";import{formSubmissionsView as v}from"./form-submissions.js";import{viewsListView as b}from"./views-list.js";import{viewEditorView as k}from"./view-editor.js";import{viewPreviewView as y}from"./view-preview.js";import{actionsListView as L}from"./actions-list.js";import{actionEditorView as P}from"./action-editor.js";import{proDocsView as h}from"./pro-docs.js";import{blocksView as D}from"./blocks.js";import{blockEditorView as R}from"./block-editor.js";import{myProfileView as S}from"./my-profile.js";import{rolesView as x}from"./roles.js";import{roleEditorView as j}from"./role-editor.js";import{effectsView as q}from"./effects.js";export const views={dashboard:o,pages:i,pageEditor:r,settings:e,navigation:t,layouts:m,media:s,login:f,users:p,userEditor:w,plugins:V,documentation:n,tutorials:l,apiReference:c,collections:a,collectionEditor:d,collectionEntries:E,forms:u,formEditor:g,formSubmissions:v,viewsList:b,viewEditor:k,viewPreview:y,actionsList:L,actionEditor:P,proDocs:h,blocks:D,blockEditor:R,myProfile:S,roles:x,roleEditor:j,effects:q};
1
+ import{dashboardView as o}from"./dashboard.js";import{pagesView as i}from"./pages.js";import{pageEditorView as r}from"./page-editor.js?v=4";import{settingsView as e}from"./settings.js";import{navigationView as t}from"./navigation.js";import{layoutsView as m}from"./layouts.js";import{mediaView as s}from"./media.js";import{loginView as f}from"./login.js";import{usersView as p}from"./users.js";import{userEditorView as w}from"./user-editor.js";import{pluginsView as V}from"./plugins.js";import{documentationView as n}from"./documentation.js";import{tutorialsView as l}from"./tutorials.js";import{apiReferenceView as c}from"./api-reference.js";import{collectionsView as a}from"./collections.js";import{collectionEditorView as d}from"./collection-editor.js";import{collectionEntriesView as E}from"./collection-entries.js";import{formsView as u}from"./forms.js";import{formEditorView as g}from"./form-editor.js";import{formSubmissionsView as v}from"./form-submissions.js";import{viewsListView as b}from"./views-list.js";import{viewEditorView as k}from"./view-editor.js";import{viewPreviewView as y}from"./view-preview.js";import{actionsListView as L}from"./actions-list.js";import{actionEditorView as P}from"./action-editor.js";import{proDocsView as h}from"./pro-docs.js";import{blocksView as D}from"./blocks.js";import{blockEditorView as R}from"./block-editor.js";import{myProfileView as S}from"./my-profile.js";import{rolesView as x}from"./roles.js";import{roleEditorView as j}from"./role-editor.js";import{effectsView as q}from"./effects.js";export const views={dashboard:o,pages:i,pageEditor:r,settings:e,navigation:t,layouts:m,media:s,login:f,users:p,userEditor:w,plugins:V,documentation:n,tutorials:l,apiReference:c,collections:a,collectionEditor:d,collectionEntries:E,forms:u,formEditor:g,formSubmissions:v,viewsList:b,viewEditor:k,viewPreview:y,actionsList:L,actionEditor:P,proDocs:h,blocks:D,blockEditor:R,myProfile:S,roles:x,roleEditor:j,effects:q};