domma-cms 0.3.0 → 0.5.2

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 (150) hide show
  1. package/README.md +3 -3
  2. package/admin/css/admin.css +1 -1
  3. package/admin/dist/domma/domma-tools.css +2313 -0
  4. package/admin/dist/domma/domma-tools.min.js +10 -0
  5. package/admin/index.html +4 -0
  6. package/admin/js/api.js +1 -1
  7. package/admin/js/app.js +8 -4
  8. package/admin/js/config/sidebar-config.js +1 -1
  9. package/admin/js/lib/markdown-toolbar.js +18 -10
  10. package/admin/js/templates/action-editor.html +171 -0
  11. package/admin/js/templates/actions-list.html +19 -0
  12. package/admin/js/templates/api-reference.html +1411 -0
  13. package/admin/js/templates/block-editor.html +158 -0
  14. package/admin/js/templates/blocks.html +8 -0
  15. package/admin/js/templates/collection-editor.html +47 -0
  16. package/admin/js/templates/collection-entries.html +3 -0
  17. package/admin/js/templates/collections.html +51 -4
  18. package/admin/js/templates/documentation.html +258 -0
  19. package/{plugins/form-builder/admin → admin/js}/templates/form-editor.html +238 -199
  20. package/{plugins/form-builder/admin → admin/js}/templates/form-submissions.html +30 -30
  21. package/{plugins/form-builder/admin/templates/forms-list.html → admin/js/templates/forms.html} +17 -17
  22. package/admin/js/templates/login.html +29 -4
  23. package/admin/js/templates/my-profile.html +17 -0
  24. package/admin/js/templates/page-editor.html +39 -0
  25. package/admin/js/templates/pages.html +6 -1
  26. package/admin/js/templates/pro-docs.html +259 -0
  27. package/admin/js/templates/role-editor.html +59 -0
  28. package/admin/js/templates/roles.html +10 -0
  29. package/admin/js/templates/settings.html +167 -23
  30. package/admin/js/templates/tutorials.html +81 -0
  31. package/admin/js/templates/user-editor.html +7 -0
  32. package/admin/js/templates/users.html +3 -26
  33. package/admin/js/templates/view-editor.html +201 -0
  34. package/admin/js/templates/view-preview.html +51 -0
  35. package/admin/js/templates/views-list.html +19 -0
  36. package/admin/js/views/action-editor.js +1 -0
  37. package/admin/js/views/actions-list.js +1 -0
  38. package/admin/js/views/api-reference.js +1 -0
  39. package/admin/js/views/block-editor.js +8 -0
  40. package/admin/js/views/blocks.js +4 -0
  41. package/admin/js/views/collection-editor.js +3 -3
  42. package/admin/js/views/collection-entries.js +1 -1
  43. package/admin/js/views/collections.js +1 -1
  44. package/admin/js/views/dashboard.js +1 -1
  45. package/admin/js/views/form-editor.js +8 -0
  46. package/admin/js/views/form-submissions.js +1 -0
  47. package/admin/js/views/forms.js +1 -0
  48. package/admin/js/views/index.js +1 -1
  49. package/admin/js/views/login.js +2 -2
  50. package/admin/js/views/media.js +1 -1
  51. package/admin/js/views/my-profile.js +1 -0
  52. package/admin/js/views/page-editor.js +34 -15
  53. package/admin/js/views/pages.js +5 -5
  54. package/admin/js/views/plugins.js +10 -10
  55. package/admin/js/views/pro-docs.js +1 -0
  56. package/admin/js/views/role-editor.js +1 -0
  57. package/admin/js/views/roles.js +4 -0
  58. package/admin/js/views/settings.js +3 -1
  59. package/admin/js/views/user-editor.js +1 -1
  60. package/admin/js/views/users.js +4 -7
  61. package/admin/js/views/view-editor.js +1 -0
  62. package/admin/js/views/view-preview.js +1 -0
  63. package/admin/js/views/views-list.js +1 -0
  64. package/bin/cli.js +1 -1
  65. package/config/auth.json +1 -0
  66. package/config/connections.json.bak +9 -0
  67. package/config/connections.json.example +9 -0
  68. package/config/navigation.json +5 -15
  69. package/config/plugins.json +19 -29
  70. package/config/server.json +6 -6
  71. package/config/site.json +16 -6
  72. package/package.json +25 -10
  73. package/plugins/example-analytics/stats.json +17 -12
  74. package/plugins/form-builder/data/forms/contacts.json +62 -62
  75. package/plugins/form-builder/data/forms/enquiries.json +103 -0
  76. package/plugins/form-builder/data/forms/feedback.json +17 -16
  77. package/plugins/form-builder/data/forms/notes.json +79 -0
  78. package/plugins/form-builder/data/forms/to-do.json +100 -0
  79. package/plugins/form-builder/data/submissions/contacts.json +1 -26
  80. package/plugins/form-builder/data/submissions/notes.json +1 -0
  81. package/plugins/form-builder/data/submissions/to-do.json +1 -0
  82. package/plugins/theme-roller/admin/templates/theme-roller.html +71 -0
  83. package/plugins/theme-roller/admin/views/theme-roller-view.js +403 -0
  84. package/plugins/theme-roller/config.js +1 -0
  85. package/plugins/theme-roller/plugin.js +233 -0
  86. package/plugins/theme-roller/plugin.json +31 -0
  87. package/plugins/theme-roller/public/active-theme.css +0 -0
  88. package/plugins/theme-roller/public/inject-head-late.html +1 -0
  89. package/public/css/forms.css +1 -0
  90. package/public/css/site.css +1 -1
  91. package/public/js/forms.js +1 -0
  92. package/public/js/site.js +1 -1
  93. package/scripts/build.js +194 -129
  94. package/scripts/pro.js +254 -0
  95. package/scripts/reset.js +33 -8
  96. package/scripts/seed.js +677 -128
  97. package/scripts/setup.js +1 -0
  98. package/server/middleware/auth.js +136 -120
  99. package/server/routes/api/actions.js +200 -0
  100. package/server/routes/api/auth.js +292 -146
  101. package/server/routes/api/blocks.js +84 -0
  102. package/server/routes/api/collections.js +79 -27
  103. package/{plugins/form-builder/plugin.js → server/routes/api/forms.js} +491 -505
  104. package/server/routes/api/layouts.js +49 -39
  105. package/server/routes/api/media.js +118 -92
  106. package/server/routes/api/navigation.js +40 -36
  107. package/server/routes/api/pages.js +132 -118
  108. package/server/routes/api/plugins.js +6 -3
  109. package/server/routes/api/settings.js +104 -88
  110. package/server/routes/api/users.js +27 -19
  111. package/server/routes/api/views.js +148 -0
  112. package/server/routes/public.js +124 -108
  113. package/server/server.js +269 -181
  114. package/server/services/actions.js +387 -0
  115. package/server/services/adapterRegistry.js +98 -0
  116. package/server/services/adapters/FileAdapter.js +192 -0
  117. package/server/services/adapters/MongoAdapter.js +220 -0
  118. package/server/services/blocks.js +162 -0
  119. package/server/services/collections.js +74 -86
  120. package/server/services/connectionManager.js +102 -0
  121. package/server/services/content.js +312 -307
  122. package/server/services/email.js +126 -0
  123. package/server/services/forms.js +173 -0
  124. package/server/services/markdown.js +1378 -747
  125. package/server/services/permissionRegistry.js +173 -0
  126. package/server/services/presetCollections.js +251 -0
  127. package/server/services/renderer.js +98 -2
  128. package/server/services/roles.js +227 -0
  129. package/server/services/rowAccess.js +104 -0
  130. package/server/services/userProfiles.js +199 -0
  131. package/server/services/users.js +281 -212
  132. package/server/services/views.js +280 -0
  133. package/server/templates/page.html +124 -113
  134. package/plugins/form-builder/admin/templates/form-settings.html +0 -29
  135. package/plugins/form-builder/admin/views/form-editor.js +0 -1444
  136. package/plugins/form-builder/admin/views/form-settings.js +0 -38
  137. package/plugins/form-builder/admin/views/form-submissions.js +0 -295
  138. package/plugins/form-builder/admin/views/forms-list.js +0 -164
  139. package/plugins/form-builder/config.js +0 -9
  140. package/plugins/form-builder/data/forms/consent.json +0 -104
  141. package/plugins/form-builder/data/forms/contact-details.json +0 -99
  142. package/plugins/form-builder/data/submissions/consent.json +0 -13
  143. package/plugins/form-builder/plugin.json +0 -52
  144. package/plugins/form-builder/public/inject-body.html +0 -352
  145. package/plugins/form-builder/public/inject-head.html +0 -58
  146. package/plugins/form-builder/public/package.json +0 -1
  147. package/scripts/copy-domma.js +0 -48
  148. package/server/services/userTypes.js +0 -167
  149. /package/plugins/form-builder/data/submissions/{contact-details.json → enquiries.json} +0 -0
  150. /package/{plugins/form-builder/public → public/js}/form-logic-engine.js +0 -0
@@ -1,199 +1,238 @@
1
- <div class="view-header">
2
- <h1 id="editor-title"><span data-icon="edit-3"></span> Form Editor</h1>
3
- <div style="display:flex;gap:.5rem;align-items:center;">
4
- <a href="#/plugins/form-builder" class="btn btn-ghost btn-sm">
5
- <span data-icon="arrow-left"></span> All Forms
6
- </a>
7
- <button id="preview-btn" class="btn btn-ghost btn-sm">
8
- <span data-icon="eye"></span> Preview
9
- </button>
10
- <button id="save-form-btn" class="btn btn-primary">
11
- <span data-icon="save"></span> Save
12
- </button>
13
- </div>
14
- </div>
15
-
16
- <div class="tabs" id="editor-tabs">
17
- <div class="tab-list">
18
- <button class="tab-item active">Fields</button>
19
- <button class="tab-item">Form Details</button>
20
- <button class="tab-item">Settings</button>
21
- <button class="tab-item">Actions</button>
22
- </div>
23
- <div class="tab-content">
24
-
25
- <!-- Tab 1: Fields -->
26
- <div class="tab-panel active">
27
- <div class="card mb-4">
28
- <div class="card-header" style="display:flex;justify-content:space-between;align-items:center;">
29
- <h2>Fields</h2>
30
- <div id="add-element-dropdown" style="position:relative;">
31
- <button id="add-element-btn" class="btn btn-ghost btn-sm" type="button">
32
- <span data-icon="plus"></span> Add <span
33
- style="font-size:.65rem;opacity:.6;margin-left:.1rem;">▾</span>
34
- </button>
35
- <div id="add-element-menu"
36
- style="display:none;position:absolute;right:0;top:calc(100% + .2rem);background:var(--card-bg,#1e1e2e);border:1px solid var(--border-color,#333);border-radius:6px;min-width:140px;z-index:100;box-shadow:0 4px 16px rgba(0,0,0,.3);overflow:hidden;">
37
- <button id="add-field-btn" type="button"
38
- style="display:block;width:100%;text-align:left;padding:.5rem .85rem;background:none;border:none;color:inherit;cursor:pointer;font-size:.875rem;border-bottom:1px solid var(--border-color,#333);">
39
- Field
40
- </button>
41
- <button id="add-spacer-btn" type="button"
42
- style="display:block;width:100%;text-align:left;padding:.5rem .85rem;background:none;border:none;color:inherit;cursor:pointer;font-size:.875rem;border-bottom:1px solid var(--border-color,#333);">
43
- Spacer
44
- </button>
45
- <button id="add-page-break-btn" type="button"
46
- style="display:block;width:100%;text-align:left;padding:.5rem .85rem;background:none;border:none;color:inherit;cursor:pointer;font-size:.875rem;">
47
- Page Break
48
- </button>
49
- </div>
50
- </div>
51
- </div>
52
- <div class="card-body" style="padding:0;">
53
- <div id="fields-list" style="padding:1rem;">
54
- <p class="text-muted" id="fields-empty-msg" style="text-align:center;padding:2rem 0;">No fields yet. Click
55
- "Add Field" to get started.</p>
56
- </div>
57
- </div>
58
- </div>
59
-
60
- <div class="card mb-4" id="preview-card" style="display:none;">
61
- <div class="card-header" style="display:flex;justify-content:space-between;align-items:center;">
62
- <h2><span data-icon="eye"></span> Preview</h2>
63
- <span id="preview-test-badge"
64
- style="display:none;font-size:.75rem;padding:.2rem .6rem;border-radius:999px;background:rgba(99,102,241,.15);color:var(--primary,#6366f1);">Test Mode — submissions are stored</span>
65
- </div>
66
- <div class="card-body">
67
- <div id="preview-container"></div>
68
- <div id="preview-test-result"
69
- style="display:none;margin-top:.75rem;padding:.6rem .9rem;border-radius:6px;font-size:.9rem;"></div>
70
- </div>
71
- </div>
72
- </div>
73
-
74
- <!-- Tab 2: Form Details -->
75
- <div class="tab-panel">
76
- <div class="card mb-4">
77
- <div class="card-header"><h2>Form Details</h2></div>
78
- <div class="card-body">
79
- <div class="row mb-3">
80
- <div class="col-7">
81
- <label class="form-label">Title</label>
82
- <input id="field-title" type="text" class="form-input" placeholder="My Form">
83
- </div>
84
- <div class="col-5">
85
- <label class="form-label">Slug</label>
86
- <input id="field-slug" type="text" class="form-input" placeholder="my-form">
87
- <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Used in embed: <code>data-form="slug"</code>
88
- </p>
89
- </div>
90
- </div>
91
- <div class="row">
92
- <div class="col">
93
- <label class="form-label">Description</label>
94
- <textarea id="field-description" class="form-input" rows="2"
95
- placeholder="Optional form description..."></textarea>
96
- </div>
97
- </div>
98
- </div>
99
- </div>
100
- </div>
101
-
102
- <!-- Tab 3: Settings -->
103
- <div class="tab-panel">
104
- <div class="card mb-4">
105
- <div class="card-header"><h2>Settings</h2></div>
106
- <div class="card-body">
107
- <div class="mb-3">
108
- <label class="form-label">Submit Button Text</label>
109
- <input id="setting-submit-text" type="text" class="form-input" placeholder="Submit" value="Submit">
110
- </div>
111
- <div class="mb-3">
112
- <label class="form-label">Success Message</label>
113
- <textarea id="setting-success-message" class="form-input" rows="3"
114
- placeholder="Thank you for your submission."></textarea>
115
- </div>
116
- <div>
117
- <label class="form-label">Layout</label>
118
- <select id="setting-layout" class="form-input">
119
- <option value="stacked">Stacked</option>
120
- <option value="inline">Inline</option>
121
- </select>
122
- </div>
123
- </div>
124
- </div>
125
- </div>
126
-
127
- <!-- Tab 4: Actions -->
128
- <div class="tab-panel">
129
- <div class="row">
130
- <div class="col-6">
131
- <div class="card mb-4">
132
- <div class="card-header"><h2>Email Action</h2></div>
133
- <div class="card-body">
134
- <div class="mb-3">
135
- <label class="form-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
136
- <input id="action-email-enabled" type="checkbox"> Send email on submit
137
- </label>
138
- </div>
139
- <div class="mb-3">
140
- <label class="form-label">Recipients</label>
141
- <input id="action-email-recipients" type="text" class="form-input" placeholder="admin@example.com">
142
- <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Comma-separated. Uses global
143
- SMTP settings.</p>
144
- </div>
145
- <div>
146
- <label class="form-label">Subject Prefix</label>
147
- <input id="action-email-subject-prefix" type="text" class="form-input" placeholder="[Form]">
148
- </div>
149
- </div>
150
- </div>
151
- </div>
152
- <div class="col-6">
153
- <div class="card mb-4">
154
- <div class="card-header"><h2>Webhook Action</h2></div>
155
- <div class="card-body">
156
- <div class="mb-3">
157
- <label class="form-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
158
- <input id="action-webhook-enabled" type="checkbox"> POST to webhook on submit
159
- </label>
160
- </div>
161
- <div class="mb-3">
162
- <label class="form-label">URL</label>
163
- <input id="action-webhook-url" type="url" class="form-input"
164
- placeholder="https://hooks.example.com/form">
165
- </div>
166
- <div>
167
- <label class="form-label">Method</label>
168
- <select id="action-webhook-method" class="form-input">
169
- <option value="POST">POST</option>
170
- <option value="PUT">PUT</option>
171
- </select>
172
- </div>
173
- </div>
174
- </div>
175
- </div>
176
- </div>
177
-
178
- <div class="card mb-4">
179
- <div class="card-header"><h2>Spam Protection</h2></div>
180
- <div class="card-body">
181
- <div class="mb-3">
182
- <label class="form-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
183
- <input id="setting-honeypot" type="checkbox" checked> Enable honeypot field
184
- </label>
185
- <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Silently discards bot submissions
186
- that fill a hidden field.</p>
187
- </div>
188
- <div>
189
- <label class="form-label">Rate Limit (per minute)</label>
190
- <input id="setting-rate-limit" type="number" class="form-input" min="1" max="60" value="3">
191
- <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Max submissions per IP per
192
- minute.</p>
193
- </div>
194
- </div>
195
- </div>
196
- </div>
197
-
198
- </div>
199
- </div>
1
+ <div class="view-header">
2
+ <h1 id="editor-title"><span data-icon="edit-3"></span> Form Editor</h1>
3
+ <div style="display:flex;gap:.5rem;align-items:center;">
4
+ <a href="#/forms" class="btn btn-ghost btn-sm">
5
+ <span data-icon="arrow-left"></span> All Forms
6
+ </a>
7
+ <button id="preview-btn" class="btn btn-ghost btn-sm">
8
+ <span data-icon="eye"></span> Preview
9
+ </button>
10
+ <button id="save-form-btn" class="btn btn-primary">
11
+ <span data-icon="save"></span> Save
12
+ </button>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="tabs" id="editor-tabs">
17
+ <div class="tab-list">
18
+ <button class="tab-item active">Fields</button>
19
+ <button class="tab-item">Form Details</button>
20
+ <button class="tab-item">Settings</button>
21
+ <button class="tab-item">Actions</button>
22
+ </div>
23
+ <div class="tab-content">
24
+
25
+ <!-- Tab 1: Fields -->
26
+ <div class="tab-panel active">
27
+ <div class="card mb-4">
28
+ <div class="card-header" style="display:flex;justify-content:space-between;align-items:center;">
29
+ <h2>Fields</h2>
30
+ <div id="add-element-dropdown" style="position:relative;">
31
+ <button id="add-element-btn" class="btn btn-ghost btn-sm" type="button">
32
+ <span data-icon="plus"></span> Add <span
33
+ style="font-size:.65rem;opacity:.6;margin-left:.1rem;">▾</span>
34
+ </button>
35
+ <div id="add-element-menu"
36
+ style="display:none;position:absolute;right:0;top:calc(100% + .2rem);background:var(--card-bg,#1e1e2e);border:1px solid var(--border-color,#333);border-radius:6px;min-width:140px;z-index:100;box-shadow:0 4px 16px rgba(0,0,0,.3);overflow:hidden;">
37
+ <button id="add-field-btn" type="button"
38
+ style="display:block;width:100%;text-align:left;padding:.5rem .85rem;background:none;border:none;color:inherit;cursor:pointer;font-size:.875rem;border-bottom:1px solid var(--border-color,#333);">
39
+ Field
40
+ </button>
41
+ <button id="add-spacer-btn" type="button"
42
+ style="display:block;width:100%;text-align:left;padding:.5rem .85rem;background:none;border:none;color:inherit;cursor:pointer;font-size:.875rem;border-bottom:1px solid var(--border-color,#333);">
43
+ Spacer
44
+ </button>
45
+ <button id="add-page-break-btn" type="button"
46
+ style="display:block;width:100%;text-align:left;padding:.5rem .85rem;background:none;border:none;color:inherit;cursor:pointer;font-size:.875rem;">
47
+ Page Break
48
+ </button>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <div class="card-body" style="padding:0;">
53
+ <div id="fields-list" style="padding:1rem;">
54
+ <p class="text-muted" id="fields-empty-msg" style="text-align:center;padding:2rem 0;">No fields yet. Click
55
+ "Add Field" to get started.</p>
56
+ </div>
57
+ </div>
58
+ </div>
59
+
60
+ <div class="card mb-4" id="preview-card" style="display:none;">
61
+ <div class="card-header" style="display:flex;justify-content:space-between;align-items:center;">
62
+ <h2><span data-icon="eye"></span> Preview</h2>
63
+ <span id="preview-test-badge"
64
+ style="display:none;font-size:.75rem;padding:.2rem .6rem;border-radius:999px;background:rgba(99,102,241,.15);color:var(--primary,#6366f1);">Test Mode — submissions are stored</span>
65
+ </div>
66
+ <div class="card-body">
67
+ <div id="preview-container"></div>
68
+ <div id="preview-test-result"
69
+ style="display:none;margin-top:.75rem;padding:.6rem .9rem;border-radius:6px;font-size:.9rem;"></div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Tab 2: Form Details -->
75
+ <div class="tab-panel">
76
+ <div class="card mb-4">
77
+ <div class="card-header"><h2>Form Details</h2></div>
78
+ <div class="card-body">
79
+ <div class="row mb-3">
80
+ <div class="col-7">
81
+ <label class="form-label">Title</label>
82
+ <input id="field-title" type="text" class="form-input" placeholder="My Form">
83
+ </div>
84
+ <div class="col-5">
85
+ <label class="form-label">Slug</label>
86
+ <input id="field-slug" type="text" class="form-input" placeholder="my-form">
87
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Used in embed: <code>data-form="slug"</code>
88
+ </p>
89
+ </div>
90
+ </div>
91
+ <div class="row">
92
+ <div class="col">
93
+ <label class="form-label">Description</label>
94
+ <textarea id="field-description" class="form-input" rows="2"
95
+ placeholder="Optional form description..."></textarea>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+
102
+ <!-- Tab 3: Settings -->
103
+ <div class="tab-panel">
104
+ <div class="card mb-4">
105
+ <div class="card-header"><h2>Settings</h2></div>
106
+ <div class="card-body">
107
+ <div class="mb-3">
108
+ <label class="form-label">Submit Button Text</label>
109
+ <input id="setting-submit-text" type="text" class="form-input" placeholder="Submit" value="Submit">
110
+ </div>
111
+ <div class="mb-3">
112
+ <label class="form-label">Success Message</label>
113
+ <textarea id="setting-success-message" class="form-input" rows="3"
114
+ placeholder="Thank you for your submission."></textarea>
115
+ </div>
116
+ <div class="mb-3">
117
+ <label class="form-label">Success Redirect URL</label>
118
+ <input id="setting-success-redirect" type="text" class="form-input"
119
+ placeholder="/thank-you">
120
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">
121
+ If set, redirects the visitor to this URL on success. Takes priority over the success message.
122
+ </p>
123
+ </div>
124
+ <div class="mb-3">
125
+ <label class="form-label">Layout</label>
126
+ <select id="setting-layout" class="form-input">
127
+ <option value="stacked">Stacked</option>
128
+ <option value="inline">Inline</option>
129
+ <option value="grid">Grid</option>
130
+ </select>
131
+ </div>
132
+ <div id="columns-group" style="display:none;">
133
+ <label class="form-label">Columns</label>
134
+ <input id="setting-columns" type="number" class="form-input" min="1" max="6" value="2">
135
+ <div class="mt-3">
136
+ <label class="form-label">Submit Button Span</label>
137
+ <select id="setting-submit-span" class="form-input">
138
+ <option value="">Auto (1 column)</option>
139
+ <option value="full">Full width</option>
140
+ </select>
141
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Controls how wide the submit
142
+ button is in grid layout.</p>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ </div>
148
+
149
+ <!-- Tab 4: Actions -->
150
+ <div class="tab-panel">
151
+ <div class="row">
152
+ <div class="col-6">
153
+ <div class="card mb-4">
154
+ <div class="card-header"><h2>Email Action</h2></div>
155
+ <div class="card-body">
156
+ <div class="mb-3">
157
+ <label class="form-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
158
+ <input id="action-email-enabled" type="checkbox"> Send email on submit
159
+ </label>
160
+ </div>
161
+ <div class="mb-3">
162
+ <label class="form-label">Recipients</label>
163
+ <input id="action-email-recipients" type="text" class="form-input" placeholder="admin@example.com">
164
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Comma-separated. Uses global
165
+ SMTP settings.</p>
166
+ </div>
167
+ <div>
168
+ <label class="form-label">Subject Prefix</label>
169
+ <input id="action-email-subject-prefix" type="text" class="form-input" placeholder="[Form]">
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ <div class="col-6">
175
+ <div class="card mb-4">
176
+ <div class="card-header"><h2>Webhook Action</h2></div>
177
+ <div class="card-body">
178
+ <div class="mb-3">
179
+ <label class="form-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
180
+ <input id="action-webhook-enabled" type="checkbox"> POST to webhook on submit
181
+ </label>
182
+ </div>
183
+ <div class="mb-3">
184
+ <label class="form-label">URL</label>
185
+ <input id="action-webhook-url" type="url" class="form-input"
186
+ placeholder="https://hooks.example.com/form">
187
+ </div>
188
+ <div>
189
+ <label class="form-label">Method</label>
190
+ <select id="action-webhook-method" class="form-input">
191
+ <option value="POST">POST</option>
192
+ <option value="PUT">PUT</option>
193
+ </select>
194
+ </div>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ <div class="col-6">
199
+ <div class="card mb-4">
200
+ <div class="card-header"><h2>CMS Action</h2></div>
201
+ <div class="card-body">
202
+ <div class="mb-3">
203
+ <label class="form-label">Action on Submit</label>
204
+ <select id="action-cms-slug" class="form-input">
205
+ <option value="">— None —</option>
206
+ </select>
207
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">
208
+ Run a CMS Action after the entry is stored. Requires Pro (MongoDB).
209
+ Failures are non-fatal — the submission is always saved first.
210
+ </p>
211
+ </div>
212
+ </div>
213
+ </div>
214
+ </div>
215
+ </div>
216
+
217
+ <div class="card mb-4">
218
+ <div class="card-header"><h2>Spam Protection</h2></div>
219
+ <div class="card-body">
220
+ <div class="mb-3">
221
+ <label class="form-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
222
+ <input id="setting-honeypot" type="checkbox" checked> Enable honeypot field
223
+ </label>
224
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Silently discards bot submissions
225
+ that fill a hidden field.</p>
226
+ </div>
227
+ <div>
228
+ <label class="form-label">Rate Limit (per minute)</label>
229
+ <input id="setting-rate-limit" type="number" class="form-input" min="1" max="60" value="3">
230
+ <p class="form-hint text-muted" style="margin-top:.3rem;font-size:.8rem;">Max submissions per IP per
231
+ minute.</p>
232
+ </div>
233
+ </div>
234
+ </div>
235
+ </div>
236
+
237
+ </div>
238
+ </div>
@@ -1,30 +1,30 @@
1
- <div class="view-header">
2
- <h1><span data-icon="inbox"></span> <span id="submissions-title">Submissions</span></h1>
3
- <div style="display:flex;gap:.5rem;align-items:center;">
4
- <a href="#/plugins/form-builder" class="btn btn-ghost btn-sm">
5
- <span data-icon="arrow-left"></span> All Forms
6
- </a>
7
- <button id="export-btn" class="btn btn-ghost btn-sm">
8
- <span data-icon="download"></span> Export
9
- </button>
10
- <button id="clear-all-btn" class="btn btn-danger btn-sm">
11
- <span data-icon="trash-2"></span> Clear All
12
- </button>
13
- </div>
14
- </div>
15
-
16
- <div class="card mb-3">
17
- <div class="card-body" style="display:flex;gap:.75rem;align-items:center;flex-wrap:wrap;">
18
- <input id="sub-search" type="text" class="form-input" placeholder="Search submissions…" style="flex:1;min-width:200px;">
19
- <input id="sub-date-from" type="date" class="form-input" style="width:auto;">
20
- <span style="color:var(--text-muted,#888);">to</span>
21
- <input id="sub-date-to" type="date" class="form-input" style="width:auto;">
22
- <span id="sub-count" class="text-muted" style="white-space:nowrap;font-size:.85rem;"></span>
23
- </div>
24
- </div>
25
-
26
- <div class="card">
27
- <div class="card-body">
28
- <div id="submissions-table"></div>
29
- </div>
30
- </div>
1
+ <div class="view-header">
2
+ <h1><span data-icon="inbox"></span> <span id="submissions-title">Submissions</span></h1>
3
+ <div style="display:flex;gap:.5rem;align-items:center;">
4
+ <a href="#/forms" class="btn btn-ghost btn-sm">
5
+ <span data-icon="arrow-left"></span> All Forms
6
+ </a>
7
+ <button id="export-btn" class="btn btn-ghost btn-sm">
8
+ <span data-icon="download"></span> Export
9
+ </button>
10
+ <button id="clear-all-btn" class="btn btn-danger btn-sm">
11
+ <span data-icon="trash-2"></span> Clear All
12
+ </button>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="card mb-3">
17
+ <div class="card-body" style="display:flex;gap:.75rem;align-items:center;flex-wrap:wrap;">
18
+ <input id="sub-search" type="text" class="form-input" placeholder="Search submissions…" style="flex:1;min-width:200px;">
19
+ <input id="sub-date-from" type="date" class="form-input" style="width:auto;">
20
+ <span style="color:var(--text-muted,#888);">to</span>
21
+ <input id="sub-date-to" type="date" class="form-input" style="width:auto;">
22
+ <span id="sub-count" class="text-muted" style="white-space:nowrap;font-size:.85rem;"></span>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="card">
27
+ <div class="card-body">
28
+ <div id="submissions-table"></div>
29
+ </div>
30
+ </div>
@@ -1,17 +1,17 @@
1
- <div class="view-header">
2
- <h1><span data-icon="layout"></span> Forms</h1>
3
- <div style="display:flex;gap:.5rem;">
4
- <a href="#/plugins/form-builder/settings" class="btn btn-ghost btn-sm">
5
- <span data-icon="settings"></span> Settings
6
- </a>
7
- <button id="create-form-btn" class="btn btn-primary">
8
- <span data-icon="plus"></span> Create Form
9
- </button>
10
- </div>
11
- </div>
12
-
13
- <div class="card">
14
- <div class="card-body">
15
- <div id="forms-table"></div>
16
- </div>
17
- </div>
1
+ <div class="view-header">
2
+ <h1><span data-icon="layout"></span> Forms</h1>
3
+ <div style="display:flex;gap:.5rem;">
4
+ <button id="test-email-btn" class="btn btn-ghost btn-sm">
5
+ <span data-icon="mail"></span> Test Email
6
+ </button>
7
+ <button id="create-form-btn" class="btn btn-primary">
8
+ <span data-icon="plus"></span> Create Form
9
+ </button>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="card">
14
+ <div class="card-body">
15
+ <div id="forms-table"></div>
16
+ </div>
17
+ </div>
@@ -17,13 +17,13 @@
17
17
  <div id="onboarding-site-panel" style="display:none">
18
18
  <h2 class="login-heading">Name your site</h2>
19
19
  <p class="text-muted mb-4">You can change these any time from Settings.</p>
20
- <div class="form-group mb-3">
20
+ <div class="mb-3">
21
21
  <label class="form-label" for="ob-title">Site title</label>
22
- <input type="text" id="ob-title" class="form-control" placeholder="My Blog">
22
+ <input type="text" id="ob-title" class="form-input" placeholder="My Blog">
23
23
  </div>
24
- <div class="form-group mb-4">
24
+ <div class="mb-4">
25
25
  <label class="form-label" for="ob-tagline">Tagline <span class="text-muted">(optional)</span></label>
26
- <input type="text" id="ob-tagline" class="form-control" placeholder="A short description of your site">
26
+ <input type="text" id="ob-tagline" class="form-input" placeholder="A short description of your site">
27
27
  </div>
28
28
  <div id="ob-site-error" class="alert alert-danger mb-3" style="display:none"></div>
29
29
  <button id="ob-site-btn" class="btn btn-primary btn-block">Continue</button>
@@ -52,6 +52,31 @@
52
52
  <div id="login-panel" style="display:none">
53
53
  <h2 class="login-heading">Sign in</h2>
54
54
  <div id="login-form-container"></div>
55
+ <a href="#" id="forgot-link" class="btn-skip">Forgot your password?</a>
56
+ </div>
57
+
58
+ <!-- ── Forgot password ── -->
59
+ <div id="forgot-panel" style="display:none">
60
+ <h2 class="login-heading">Reset your password</h2>
61
+ <p class="text-muted mb-4">Enter your email and we'll send you a reset link.</p>
62
+ <div id="forgot-form-container"></div>
63
+ <a href="#" id="forgot-back-link" class="btn-skip">Back to sign in</a>
64
+ </div>
65
+
66
+ <!-- ── Forgot success ── -->
67
+ <div id="forgot-success-panel" style="display:none">
68
+ <div class="ob-done-icon"><span data-icon="mail"></span></div>
69
+ <h2 class="login-heading">Check your email</h2>
70
+ <p class="text-muted mb-4">If an account exists for that address, we've sent a reset link. It expires in
71
+ 1 hour.</p>
72
+ <a href="#" id="forgot-success-back-link" class="btn btn-primary btn-block">Back to sign in</a>
73
+ </div>
74
+
75
+ <!-- ── Reset password ── -->
76
+ <div id="reset-panel" style="display:none">
77
+ <h2 class="login-heading">Set a new password</h2>
78
+ <p class="text-muted mb-4">Choose a strong password of at least 8 characters.</p>
79
+ <div id="reset-form-container"></div>
55
80
  </div>
56
81
  </div>
57
82
  </div>
@@ -0,0 +1,17 @@
1
+ <div class="view-header">
2
+ <h1><span data-icon="user"></span> My Profile</h1>
3
+ </div>
4
+
5
+ <div class="card">
6
+ <div class="card-header"><h2>Account</h2></div>
7
+ <div class="card-body">
8
+ <div id="account-form-container"></div>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="card mt-4" id="profile-card" style="display:none;">
13
+ <div class="card-header"><h2>Profile</h2></div>
14
+ <div class="card-body">
15
+ <div id="profile-form-container"></div>
16
+ </div>
17
+ </div>