domma-cms 0.2.1 → 0.5.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 (166) hide show
  1. package/README.md +3 -3
  2. package/admin/css/admin.css +1 -1200
  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 -242
  7. package/admin/js/app.js +9 -279
  8. package/admin/js/config/sidebar-config.js +1 -115
  9. package/admin/js/lib/card.js +1 -63
  10. package/admin/js/lib/image-editor.js +1 -869
  11. package/admin/js/lib/markdown-toolbar.js +54 -421
  12. package/admin/js/templates/action-editor.html +171 -0
  13. package/admin/js/templates/actions-list.html +19 -0
  14. package/admin/js/templates/api-reference.html +1411 -0
  15. package/admin/js/templates/block-editor.html +158 -0
  16. package/admin/js/templates/blocks.html +8 -0
  17. package/admin/js/templates/collection-editor.html +47 -0
  18. package/admin/js/templates/collection-entries.html +3 -0
  19. package/admin/js/templates/collections.html +51 -4
  20. package/admin/js/templates/documentation.html +258 -0
  21. package/admin/js/templates/form-editor.html +238 -0
  22. package/{plugins/form-builder/admin → admin/js}/templates/form-submissions.html +30 -30
  23. package/{plugins/form-builder/admin/templates/forms-list.html → admin/js/templates/forms.html} +17 -17
  24. package/admin/js/templates/layouts.html +44 -7
  25. package/admin/js/templates/login.html +29 -4
  26. package/admin/js/templates/my-profile.html +17 -0
  27. package/admin/js/templates/page-editor.html +48 -0
  28. package/admin/js/templates/pages.html +6 -1
  29. package/admin/js/templates/pro-docs.html +259 -0
  30. package/admin/js/templates/role-editor.html +59 -0
  31. package/admin/js/templates/roles.html +10 -0
  32. package/admin/js/templates/settings.html +137 -18
  33. package/admin/js/templates/tutorials.html +81 -0
  34. package/admin/js/templates/user-editor.html +7 -0
  35. package/admin/js/templates/users.html +3 -1
  36. package/admin/js/templates/view-editor.html +201 -0
  37. package/admin/js/templates/view-preview.html +51 -0
  38. package/admin/js/templates/views-list.html +19 -0
  39. package/admin/js/views/action-editor.js +1 -0
  40. package/admin/js/views/actions-list.js +1 -0
  41. package/admin/js/views/api-reference.js +1 -0
  42. package/admin/js/views/block-editor.js +8 -0
  43. package/admin/js/views/blocks.js +4 -0
  44. package/admin/js/views/collection-editor.js +3 -487
  45. package/admin/js/views/collection-entries.js +1 -484
  46. package/admin/js/views/collections.js +1 -153
  47. package/admin/js/views/dashboard.js +1 -56
  48. package/admin/js/views/documentation.js +1 -12
  49. package/admin/js/views/form-editor.js +8 -0
  50. package/admin/js/views/form-submissions.js +1 -0
  51. package/admin/js/views/forms.js +1 -0
  52. package/admin/js/views/index.js +1 -39
  53. package/admin/js/views/layouts.js +9 -42
  54. package/admin/js/views/login.js +7 -251
  55. package/admin/js/views/media.js +1 -240
  56. package/admin/js/views/my-profile.js +1 -0
  57. package/admin/js/views/navigation.js +14 -212
  58. package/admin/js/views/page-editor.js +72 -661
  59. package/admin/js/views/pages.js +5 -72
  60. package/admin/js/views/plugins.js +13 -90
  61. package/admin/js/views/pro-docs.js +1 -0
  62. package/admin/js/views/role-editor.js +1 -0
  63. package/admin/js/views/roles.js +4 -0
  64. package/admin/js/views/settings.js +3 -199
  65. package/admin/js/views/tutorials.js +1 -12
  66. package/admin/js/views/user-editor.js +1 -88
  67. package/admin/js/views/users.js +4 -76
  68. package/admin/js/views/view-editor.js +1 -0
  69. package/admin/js/views/view-preview.js +1 -0
  70. package/admin/js/views/views-list.js +1 -0
  71. package/bin/cli.js +1 -1
  72. package/config/auth.json +2 -17
  73. package/config/connections.json.bak +9 -0
  74. package/config/connections.json.example +9 -0
  75. package/config/navigation.json +15 -0
  76. package/config/plugins.json +19 -29
  77. package/config/server.json +6 -6
  78. package/config/site.json +17 -6
  79. package/package.json +24 -10
  80. package/plugins/domma-effects/public/celebrations/core/canvas.js +2 -104
  81. package/plugins/domma-effects/public/celebrations/core/particles.js +1 -144
  82. package/plugins/domma-effects/public/celebrations/core/physics.js +1 -166
  83. package/plugins/domma-effects/public/celebrations/index.js +1 -535
  84. package/plugins/domma-effects/public/celebrations/themes/christmas.js +1 -1805
  85. package/plugins/domma-effects/public/celebrations/themes/guy-fawkes.js +1 -1477
  86. package/plugins/domma-effects/public/celebrations/themes/halloween.js +1 -1837
  87. package/plugins/domma-effects/public/celebrations/themes/st-andrews.js +1 -1175
  88. package/plugins/domma-effects/public/celebrations/themes/st-davids.js +1 -1258
  89. package/plugins/domma-effects/public/celebrations/themes/st-georges.js +1 -1754
  90. package/plugins/domma-effects/public/celebrations/themes/st-patricks.js +1 -1290
  91. package/plugins/domma-effects/public/celebrations/themes/valentines.js +1 -1361
  92. package/plugins/example-analytics/stats.json +21 -12
  93. package/plugins/theme-roller/admin/templates/theme-roller.html +71 -0
  94. package/plugins/theme-roller/admin/views/theme-roller-view.js +403 -0
  95. package/plugins/theme-roller/config.js +1 -0
  96. package/plugins/theme-roller/plugin.js +233 -0
  97. package/plugins/theme-roller/plugin.json +31 -0
  98. package/plugins/theme-roller/public/active-theme.css +0 -0
  99. package/plugins/theme-roller/public/inject-head-late.html +1 -0
  100. package/public/css/forms.css +1 -0
  101. package/public/css/site.css +1 -302
  102. package/public/js/btt.js +1 -90
  103. package/public/js/cookie-consent.js +1 -61
  104. package/public/js/form-logic-engine.js +1 -0
  105. package/public/js/forms.js +1 -0
  106. package/public/js/site.js +1 -204
  107. package/scripts/build.js +194 -129
  108. package/scripts/pro.js +254 -0
  109. package/scripts/reset.js +33 -8
  110. package/scripts/seed.js +343 -78
  111. package/scripts/setup.js +5 -4
  112. package/server/middleware/auth.js +136 -97
  113. package/server/routes/api/actions.js +200 -0
  114. package/server/routes/api/auth.js +292 -116
  115. package/server/routes/api/blocks.js +84 -0
  116. package/server/routes/api/collections.js +88 -23
  117. package/{plugins/form-builder/plugin.js → server/routes/api/forms.js} +483 -505
  118. package/server/routes/api/layouts.js +49 -25
  119. package/server/routes/api/media.js +118 -93
  120. package/server/routes/api/navigation.js +40 -37
  121. package/server/routes/api/pages.js +132 -118
  122. package/server/routes/api/plugins.js +6 -3
  123. package/server/routes/api/settings.js +104 -89
  124. package/server/routes/api/users.js +27 -21
  125. package/server/routes/api/views.js +148 -0
  126. package/server/routes/public.js +124 -108
  127. package/server/server.js +269 -173
  128. package/server/services/actions.js +387 -0
  129. package/server/services/adapterRegistry.js +98 -0
  130. package/server/services/adapters/FileAdapter.js +192 -0
  131. package/server/services/adapters/MongoAdapter.js +220 -0
  132. package/server/services/blocks.js +162 -0
  133. package/server/services/collections.js +74 -86
  134. package/server/services/connectionManager.js +102 -0
  135. package/server/services/content.js +312 -307
  136. package/{plugins/form-builder → server/services}/email.js +126 -103
  137. package/server/services/forms.js +173 -0
  138. package/server/services/markdown.js +1378 -648
  139. package/server/services/permissionRegistry.js +173 -0
  140. package/server/services/presetCollections.js +251 -0
  141. package/server/services/renderer.js +75 -1
  142. package/server/services/roles.js +227 -0
  143. package/server/services/rowAccess.js +104 -0
  144. package/server/services/userProfiles.js +199 -0
  145. package/server/services/users.js +281 -212
  146. package/server/services/views.js +280 -0
  147. package/server/templates/page.html +119 -113
  148. package/plugins/form-builder/admin/templates/form-editor.html +0 -171
  149. package/plugins/form-builder/admin/templates/form-settings.html +0 -29
  150. package/plugins/form-builder/admin/views/form-editor.js +0 -1442
  151. package/plugins/form-builder/admin/views/form-settings.js +0 -38
  152. package/plugins/form-builder/admin/views/form-submissions.js +0 -295
  153. package/plugins/form-builder/admin/views/forms-list.js +0 -164
  154. package/plugins/form-builder/config.js +0 -9
  155. package/plugins/form-builder/data/forms/consent.json +0 -104
  156. package/plugins/form-builder/data/forms/contact-details.json +0 -63
  157. package/plugins/form-builder/data/forms/contacts.json +0 -66
  158. package/plugins/form-builder/data/submissions/consent.json +0 -13
  159. package/plugins/form-builder/data/submissions/contact-details.json +0 -1
  160. package/plugins/form-builder/data/submissions/contacts.json +0 -26
  161. package/plugins/form-builder/plugin.json +0 -52
  162. package/plugins/form-builder/public/form-logic-engine.js +0 -568
  163. package/plugins/form-builder/public/inject-body.html +0 -352
  164. package/plugins/form-builder/public/inject-head.html +0 -58
  165. package/plugins/form-builder/public/package.json +0 -1
  166. package/scripts/copy-domma.js +0 -48
@@ -0,0 +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="#/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>
@@ -1,11 +1,48 @@
1
1
  <div class="view-header">
2
- <h1><span data-icon="layout"></span> Layout Presets</h1>
3
- <button id="save-layouts-btn" class="btn btn-primary"><span data-icon="save"></span> Save</button>
2
+ <h1><span data-icon="layout"></span> Layouts</h1>
4
3
  </div>
5
4
 
6
- <p class="text-muted mb-4">
7
- Layout presets define which structural elements appear on pages using that layout.
8
- Assign a layout to each page via the page editor.
9
- </p>
5
+ <div class="tabs" id="layouts-tabs">
6
+ <div class="tab-list">
7
+ <button class="tab-item active" data-tab="panel-presets">Layout Presets</button>
8
+ <button class="tab-item" data-tab="panel-options">Layout Options</button>
9
+ </div>
10
+ <div class="tab-content">
10
11
 
11
- <div id="presets-grid" class="presets-grid"></div>
12
+ <div class="tab-panel active" id="panel-presets">
13
+ <div class="view-actions mb-4">
14
+ <p class="text-muted">Layout presets define which structural elements appear on pages using that layout. Assign
15
+ a layout to each page via the page editor.</p>
16
+ <button id="save-layouts-btn" class="btn btn-primary"><span data-icon="save"></span> Save Presets</button>
17
+ </div>
18
+ <div id="presets-grid" class="presets-grid"></div>
19
+ </div>
20
+
21
+ <div class="tab-panel" id="panel-options">
22
+ <div class="card mb-4">
23
+ <div class="card-header"><h3>Spacer Shortcode</h3></div>
24
+ <div class="card-body">
25
+ <p class="text-muted mb-3">
26
+ The <code>[spacer /]</code> shortcode inserts a vertical gap. Set the default height here;
27
+ individual spacers can override it with <code>size="N"</code>.
28
+ </p>
29
+ <div class="form-group">
30
+ <label class="form-label" for="spacer-size-input">Default spacer height (px)</label>
31
+ <input id="spacer-size-input" type="number" class="form-input" style="max-width:120px" min="0" max="500"
32
+ step="1" value="8">
33
+ </div>
34
+ <div class="form-group mt-3">
35
+ <label class="form-label" for="spacer-class-input">Default spacer CSS class</label>
36
+ <input id="spacer-class-input" type="text" class="form-input" style="max-width:240px"
37
+ placeholder="e.g. my-gap">
38
+ <small class="text-muted">Applied to every <code>[spacer /]</code> unless overridden per-instance with
39
+ <code>class="…"</code>.</small>
40
+ </div>
41
+ <button id="save-options-btn" class="btn btn-primary mt-3"><span data-icon="save"></span> Save Options
42
+ </button>
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ </div>
48
+ </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>
@@ -1,6 +1,9 @@
1
1
  <div class="view-header">
2
2
  <h1 id="editor-title"><span data-icon="edit"></span> Page Editor</h1>
3
3
  <div class="view-header-actions">
4
+ <a id="view-page-btn" class="btn btn-ghost" target="_blank" rel="noopener" style="display:none;">
5
+ <span data-icon="external-link"></span> View Page
6
+ </a>
4
7
  <button id="cancel-btn" class="btn btn-ghost">Cancel</button>
5
8
  <button id="save-btn" class="btn btn-primary"><span data-icon="save"></span> Save</button>
6
9
  </div>
@@ -12,6 +15,7 @@
12
15
  <button class="tab-item">Page Details</button>
13
16
  <button class="tab-item">SEO</button>
14
17
  <button class="tab-item">DConfig</button>
18
+ <button class="tab-item" id="live-preview-tab" style="display:none;">Live Preview</button>
15
19
  </div>
16
20
  <div class="tab-content">
17
21
 
@@ -87,6 +91,40 @@
87
91
  </select>
88
92
  </div>
89
93
  </div>
94
+ <div class="row mb-3">
95
+ <div class="col-6">
96
+ <label class="form-label">Theme Override</label>
97
+ <select id="field-theme" class="form-select">
98
+ <option value="">— Use site default —</option>
99
+ <option value="charcoal-dark">Charcoal Dark</option>
100
+ <option value="charcoal-light">Charcoal Light</option>
101
+ <option value="ocean-dark">Ocean Dark</option>
102
+ <option value="ocean-light">Ocean Light</option>
103
+ <option value="forest-dark">Forest Dark</option>
104
+ <option value="forest-light">Forest Light</option>
105
+ <option value="sunset-dark">Sunset Dark</option>
106
+ <option value="sunset-light">Sunset Light</option>
107
+ <option value="royal-dark">Royal Dark</option>
108
+ <option value="royal-light">Royal Light</option>
109
+ <option value="lemon-dark">Lemon Dark</option>
110
+ <option value="lemon-light">Lemon Light</option>
111
+ <option value="silver-dark">Silver Dark</option>
112
+ <option value="silver-light">Silver Light</option>
113
+ <option value="grayve-dark">Grayve Dark</option>
114
+ <option value="grayve-light">Grayve Light</option>
115
+ <option value="mint-dark">Mint Dark</option>
116
+ <option value="mint-light">Mint Light</option>
117
+ </select>
118
+ <small class="form-hint">Overrides the site-wide theme for this page only.</small>
119
+ </div>
120
+ </div>
121
+ <div class="row mb-3">
122
+ <div class="col">
123
+ <label class="form-label">Tags</label>
124
+ <div id="field-tags"></div>
125
+ <small class="form-hint">Comma-separated keywords for filtering and search.</small>
126
+ </div>
127
+ </div>
90
128
  <div class="row">
91
129
  <div class="col-auto">
92
130
  <label class="form-check-label">
@@ -98,6 +136,11 @@
98
136
  <input id="field-sidebar" type="checkbox" class="form-check"> Show Sidebar
99
137
  </label>
100
138
  </div>
139
+ <div class="col-auto">
140
+ <label class="form-check-label">
141
+ <input id="field-show-breadcrumbs" type="checkbox" class="form-check" checked> Show Breadcrumbs
142
+ </label>
143
+ </div>
101
144
  </div>
102
145
  </div>
103
146
 
@@ -126,6 +169,11 @@
126
169
  shortcodes in the content body — inline shortcodes win on selector conflict. Leave blank if unused.</small>
127
170
  </div>
128
171
 
172
+ <!-- Live Preview -->
173
+ <div class="tab-panel" id="live-preview-panel">
174
+ <iframe id="live-preview-frame" class="page-live-preview-frame" src="about:blank"></iframe>
175
+ </div>
176
+
129
177
  </div>
130
178
  </div>
131
179
 
@@ -3,16 +3,21 @@
3
3
  <a href="#/pages/new" class="btn btn-primary"><span data-icon="plus"></span> New Page</a>
4
4
  </div>
5
5
 
6
- <div class="toolbar mb-3">
6
+ <div class="toolbar mb-3" style="display:flex;gap:.5rem;align-items:center;flex-wrap:wrap;">
7
7
  <select id="status-filter" class="form-select form-select-sm" style="width:auto">
8
8
  <option value="">All statuses</option>
9
9
  <option value="published">Published</option>
10
10
  <option value="draft">Draft</option>
11
11
  </select>
12
+ <div class="btn-group" style="margin-left:auto;">
13
+ <button id="view-table-btn" class="btn btn-sm btn-primary" data-tooltip="Table view"><span data-icon="list"></span></button>
14
+ <button id="view-tree-btn" class="btn btn-sm btn-ghost" data-tooltip="Tree view"><span data-icon="tree"></span></button>
15
+ </div>
12
16
  </div>
13
17
 
14
18
  <div class="card">
15
19
  <div class="card-body">
16
20
  <div id="pages-table"></div>
21
+ <div id="pages-tree" style="display:none;"></div>
17
22
  </div>
18
23
  </div>