domma-cms 0.9.10 → 0.12.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 (125) hide show
  1. package/CLAUDE.md +248 -159
  2. package/admin/css/admin.css +1 -1
  3. package/admin/js/api.js +1 -1
  4. package/admin/js/app.js +7 -3
  5. package/admin/js/config/sidebar-config.js +1 -1
  6. package/admin/js/http-interceptor.js +1 -0
  7. package/admin/js/lib/card-builder.js +2 -2
  8. package/admin/js/lib/markdown-toolbar.js +5 -5
  9. package/admin/js/lib/safe-html.js +1 -0
  10. package/admin/js/lib/shortcode-modal.js +1 -0
  11. package/admin/js/templates/layouts.html +5 -4
  12. package/admin/js/templates/notifications.html +14 -0
  13. package/admin/js/templates/plugin-marketplace.html +16 -0
  14. package/admin/js/templates/plugins.html +17 -5
  15. package/admin/js/views/index.js +1 -1
  16. package/admin/js/views/layouts.js +1 -16
  17. package/admin/js/views/notifications.js +1 -0
  18. package/admin/js/views/page-editor.js +37 -33
  19. package/admin/js/views/plugin-marketplace.js +1 -0
  20. package/admin/js/views/plugins.js +16 -16
  21. package/config/navigation.json +5 -72
  22. package/config/plugins.json +10 -14
  23. package/config/presets.json +50 -13
  24. package/config/site.json +11 -63
  25. package/package.json +2 -1
  26. package/plugins/_template/admin/templates/index.html +17 -0
  27. package/plugins/_template/admin/views/index.js +19 -0
  28. package/plugins/_template/config.js +8 -0
  29. package/plugins/_template/plugin.js +23 -0
  30. package/plugins/_template/plugin.json +34 -0
  31. package/plugins/analytics/plugin.json +41 -31
  32. package/plugins/blog/admin/templates/blog.html +22 -0
  33. package/plugins/blog/admin/templates/categories.html +7 -0
  34. package/plugins/blog/admin/templates/comments.html +11 -0
  35. package/plugins/blog/admin/templates/post-editor.html +97 -0
  36. package/plugins/blog/admin/templates/settings.html +11 -0
  37. package/plugins/blog/admin/views/blog.js +183 -0
  38. package/plugins/blog/admin/views/categories.js +235 -0
  39. package/plugins/blog/admin/views/comments.js +187 -0
  40. package/plugins/blog/admin/views/post-editor.js +291 -0
  41. package/plugins/blog/admin/views/settings.js +100 -0
  42. package/plugins/blog/collections/categories/schema.json +12 -0
  43. package/plugins/blog/collections/comments/schema.json +16 -0
  44. package/plugins/blog/collections/posts/schema.json +19 -0
  45. package/plugins/blog/config.js +8 -0
  46. package/plugins/blog/plugin.js +352 -0
  47. package/plugins/blog/plugin.json +96 -0
  48. package/plugins/blog/roles/blog-author.json +10 -0
  49. package/plugins/blog/roles/blog-editor.json +12 -0
  50. package/plugins/blog/templates/author.html +9 -0
  51. package/plugins/blog/templates/category.html +9 -0
  52. package/plugins/blog/templates/index.html +9 -0
  53. package/plugins/blog/templates/post.html +17 -0
  54. package/plugins/blog/templates/tag.html +9 -0
  55. package/plugins/contacts/collections/user-contact-groups/schema.json +1 -1
  56. package/plugins/contacts/collections/user-contacts/schema.json +1 -1
  57. package/plugins/contacts/plugin.js +4 -10
  58. package/plugins/contacts/plugin.json +13 -3
  59. package/plugins/notes/collections/user-notes/schema.json +1 -1
  60. package/plugins/notes/plugin.js +3 -9
  61. package/plugins/notes/plugin.json +13 -3
  62. package/plugins/site-search/plugin.json +5 -2
  63. package/plugins/theme-switcher/plugin.json +1 -1
  64. package/plugins/todo/collections/todos/schema.json +1 -1
  65. package/plugins/todo/plugin.js +3 -9
  66. package/plugins/todo/plugin.json +13 -3
  67. package/public/css/site.css +1 -1
  68. package/public/js/site.js +1 -1
  69. package/scripts/build.js +48 -0
  70. package/scripts/create-plugin.js +113 -0
  71. package/scripts/fresh.js +6 -7
  72. package/scripts/gen-instance-secret.js +46 -0
  73. package/scripts/reset.js +3 -3
  74. package/scripts/setup.js +31 -13
  75. package/server/middleware/auth.js +48 -0
  76. package/server/middleware/managerAuth.js +36 -0
  77. package/server/routes/api/actions.js +1 -1
  78. package/server/routes/api/auth.js +4 -3
  79. package/server/routes/api/layouts.js +173 -49
  80. package/server/routes/api/notifications.js +155 -0
  81. package/server/routes/api/plugin-marketplace.js +75 -0
  82. package/server/routes/api/users.js +1 -1
  83. package/server/routes/api/views.js +1 -1
  84. package/server/routes/public.js +4 -9
  85. package/server/server.js +32 -3
  86. package/server/services/actions.js +1 -1
  87. package/server/services/managerClient.js +182 -0
  88. package/server/services/markdown.js +76 -9
  89. package/server/services/permissionRegistry.js +245 -173
  90. package/server/services/pluginInstaller.js +301 -0
  91. package/server/services/plugins.js +117 -10
  92. package/server/services/presetCollections.js +66 -251
  93. package/server/services/renderer.js +99 -0
  94. package/server/services/roles.js +191 -39
  95. package/server/services/users.js +1 -1
  96. package/server/services/views.js +1 -1
  97. package/server/templates/page.html +2 -2
  98. package/plugins/docs/admin/templates/docs.html +0 -69
  99. package/plugins/docs/admin/views/docs.js +0 -276
  100. package/plugins/docs/config.js +0 -8
  101. package/plugins/docs/data/documents/57e003f0-68f2-47dc-9c36-ed4b10ed3deb.json +0 -11
  102. package/plugins/docs/data/folders.json +0 -9
  103. package/plugins/docs/data/templates.json +0 -1
  104. package/plugins/docs/data/versions/57e003f0-68f2-47dc-9c36-ed4b10ed3deb/1.json +0 -5
  105. package/plugins/docs/plugin.js +0 -375
  106. package/plugins/docs/plugin.json +0 -23
  107. package/plugins/form-builder/data/forms/contacts.json +0 -66
  108. package/plugins/form-builder/data/forms/enquiries.json +0 -103
  109. package/plugins/form-builder/data/forms/feedback.json +0 -131
  110. package/plugins/form-builder/data/forms/notes.json +0 -79
  111. package/plugins/form-builder/data/forms/to-do.json +0 -100
  112. package/plugins/form-builder/data/submissions/contacts.json +0 -1
  113. package/plugins/form-builder/data/submissions/enquiries.json +0 -1
  114. package/plugins/form-builder/data/submissions/feedback.json +0 -1
  115. package/plugins/form-builder/data/submissions/notes.json +0 -1
  116. package/plugins/form-builder/data/submissions/to-do.json +0 -1
  117. package/plugins/garage/admin/templates/garage.html +0 -111
  118. package/plugins/garage/admin/views/garage.js +0 -622
  119. package/plugins/garage/collections/garage-vehicles/schema.json +0 -101
  120. package/plugins/garage/config.js +0 -18
  121. package/plugins/garage/data/vehicles.json +0 -70
  122. package/plugins/garage/plugin.js +0 -398
  123. package/plugins/garage/plugin.json +0 -33
  124. package/scripts/seed.js +0 -1996
  125. package/server/services/userTypes.js +0 -227
@@ -1,131 +0,0 @@
1
- {
2
- "slug": "feedback",
3
- "title": "Feedback",
4
- "description": "Share your feedback with us",
5
- "fields": [
6
- {
7
- "name": "name",
8
- "type": "string",
9
- "label": "Your Name",
10
- "required": true,
11
- "placeholder": "Please enter your full name",
12
- "helper": "Please enter your full name",
13
- "validation": {
14
- "min": 2,
15
- "max": 100
16
- }
17
- },
18
- {
19
- "name": "email",
20
- "type": "email",
21
- "label": "Email Address",
22
- "required": true,
23
- "placeholder": "your@email.com",
24
- "helper": "Please enter your email address"
25
- },
26
- {
27
- "name": "rating",
28
- "type": "select",
29
- "label": "Overall Rating",
30
- "required": true,
31
- "helper": "Tell us how we are doing!",
32
- "options": [
33
- {
34
- "value": "none",
35
- "label": "Please Choose"
36
- },
37
- {
38
- "value": "excellent",
39
- "label": "Excellent"
40
- },
41
- {
42
- "value": "good",
43
- "label": "Good"
44
- },
45
- {
46
- "value": "average",
47
- "label": "Average"
48
- },
49
- {
50
- "value": "poor",
51
- "label": "Poor"
52
- }
53
- ]
54
- },
55
- {
56
- "name": "category",
57
- "type": "select",
58
- "label": "Category",
59
- "required": true,
60
- "placeholder": "Please select a category",
61
- "helper": "",
62
- "options": [
63
- {
64
- "value": "general",
65
- "label": "General"
66
- },
67
- {
68
- "value": "bug-report",
69
- "label": "Bug Report"
70
- },
71
- {
72
- "value": "feature-request",
73
- "label": "Feature Request"
74
- },
75
- {
76
- "value": "praise",
77
- "label": "Praise"
78
- }
79
- ]
80
- },
81
- {
82
- "name": "subject",
83
- "type": "string",
84
- "label": "Subject",
85
- "required": true,
86
- "placeholder": "Brief summary of your feedback",
87
- "helper": "",
88
- "validation": {
89
- "max": 200
90
- }
91
- },
92
- {
93
- "name": "message",
94
- "type": "textarea",
95
- "label": "Your Feedback",
96
- "required": true,
97
- "placeholder": "Please share your thoughts in detail…",
98
- "helper": "Please share your thoughts in detail…",
99
- "rows": 4,
100
- "validation": {
101
- "min": 10,
102
- "max": 2000
103
- }
104
- }
105
- ],
106
- "settings": {
107
- "submitText": "Submit Feedback",
108
- "successMessage": "Thank you for your feedback! We appreciate you taking the time.",
109
- "layout": "stacked",
110
- "honeypot": true,
111
- "rateLimitPerMinute": 3
112
- },
113
- "actions": {
114
- "email": {
115
- "enabled": true,
116
- "recipients": "",
117
- "subjectPrefix": "[feedback]"
118
- },
119
- "webhook": {
120
- "enabled": false,
121
- "url": "",
122
- "method": "POST"
123
- },
124
- "collection": {
125
- "enabled": true,
126
- "slug": "feedback"
127
- }
128
- },
129
- "createdAt": "2026-03-17T12:35:44.569Z",
130
- "updatedAt": "2026-03-17T12:35:44.569Z"
131
- }
@@ -1,79 +0,0 @@
1
- {
2
- "slug": "notes",
3
- "title": "Notes",
4
- "description": "Free-form notes with categories and tags.",
5
- "fields": [
6
- {
7
- "name": "title",
8
- "type": "string",
9
- "label": "Title",
10
- "required": true,
11
- "placeholder": "Note title"
12
- },
13
- {
14
- "name": "content",
15
- "type": "textarea",
16
- "label": "Content",
17
- "required": true,
18
- "placeholder": "Write your note here…",
19
- "rows": 5
20
- },
21
- {
22
- "name": "category",
23
- "type": "select",
24
- "label": "Category",
25
- "required": false,
26
- "options": [
27
- {
28
- "value": "general",
29
- "label": "General"
30
- },
31
- {
32
- "value": "idea",
33
- "label": "Idea"
34
- },
35
- {
36
- "value": "reminder",
37
- "label": "Reminder"
38
- },
39
- {
40
- "value": "reference",
41
- "label": "Reference"
42
- }
43
- ]
44
- },
45
- {
46
- "name": "tags",
47
- "type": "string",
48
- "label": "Tags",
49
- "required": false,
50
- "placeholder": "Comma-separated tags",
51
- "helper": "Separate tags with commas"
52
- }
53
- ],
54
- "settings": {
55
- "submitText": "Save Note",
56
- "successMessage": "Note saved successfully.",
57
- "layout": "stacked",
58
- "honeypot": true,
59
- "rateLimitPerMinute": 3
60
- },
61
- "actions": {
62
- "email": {
63
- "enabled": false,
64
- "recipients": "",
65
- "subjectPrefix": "[notes]"
66
- },
67
- "webhook": {
68
- "enabled": false,
69
- "url": "",
70
- "method": "POST"
71
- },
72
- "collection": {
73
- "enabled": true,
74
- "slug": "notes"
75
- }
76
- },
77
- "createdAt": "2026-03-17T12:35:44.569Z",
78
- "updatedAt": "2026-03-17T12:35:44.569Z"
79
- }
@@ -1,100 +0,0 @@
1
- {
2
- "slug": "to-do",
3
- "title": "To-Do",
4
- "description": "Task tracking with status, priority, and due dates.",
5
- "fields": [
6
- {
7
- "name": "title",
8
- "type": "string",
9
- "label": "Title",
10
- "required": true,
11
- "placeholder": "Task title"
12
- },
13
- {
14
- "name": "description",
15
- "type": "textarea",
16
- "label": "Description",
17
- "required": false,
18
- "placeholder": "Task details…",
19
- "rows": 3
20
- },
21
- {
22
- "name": "status",
23
- "type": "select",
24
- "label": "Status",
25
- "required": true,
26
- "options": [
27
- {
28
- "value": "pending",
29
- "label": "Pending"
30
- },
31
- {
32
- "value": "in-progress",
33
- "label": "In Progress"
34
- },
35
- {
36
- "value": "done",
37
- "label": "Done"
38
- }
39
- ]
40
- },
41
- {
42
- "name": "priority",
43
- "type": "select",
44
- "label": "Priority",
45
- "required": false,
46
- "options": [
47
- {
48
- "value": "low",
49
- "label": "Low"
50
- },
51
- {
52
- "value": "medium",
53
- "label": "Medium"
54
- },
55
- {
56
- "value": "high",
57
- "label": "High"
58
- }
59
- ]
60
- },
61
- {
62
- "name": "due_date",
63
- "type": "date",
64
- "label": "Due Date",
65
- "required": false
66
- },
67
- {
68
- "name": "assigned_to",
69
- "type": "string",
70
- "label": "Assigned To",
71
- "required": false,
72
- "placeholder": "Name or email"
73
- }
74
- ],
75
- "settings": {
76
- "submitText": "Add Task",
77
- "successMessage": "Task added successfully.",
78
- "layout": "stacked",
79
- "honeypot": true,
80
- "rateLimitPerMinute": 3
81
- },
82
- "actions": {
83
- "email": {
84
- "enabled": false,
85
- "recipients": "",
86
- "subjectPrefix": "[to-do]"
87
- },
88
- "webhook": {
89
- "enabled": false,
90
- "url": "",
91
- "method": "POST"
92
- },
93
- "collection": {
94
- "enabled": true,
95
- "slug": "to-do"
96
- }
97
- },
98
- "createdAt": "2026-03-17T12:35:44.569Z",
99
- "updatedAt": "2026-03-17T12:35:44.569Z"
100
- }
@@ -1,111 +0,0 @@
1
- <div class="garage-plugin">
2
-
3
- <!-- Lookup Card -->
4
- <div class="card mb-4">
5
- <div class="card-header" style="display:flex;align-items:center;gap:0.5rem;">
6
- <span data-icon="truck"></span>
7
- <strong>Vehicle Lookup</strong>
8
- </div>
9
- <div class="card-body">
10
- <div style="display:flex;gap:0.75rem;align-items:center;flex-wrap:wrap;">
11
- <input
12
- id="reg-input"
13
- type="text"
14
- class="form-input"
15
- placeholder="AB12 CDE"
16
- maxlength="8"
17
- autocomplete="off"
18
- spellcheck="false"
19
- style="width:160px;background:#FFD900;color:#000;font-family:'Arial Black',Arial,sans-serif;font-size:1.25rem;font-weight:900;text-transform:uppercase;text-align:center;letter-spacing:3px;border:3px solid #000;border-radius:6px;padding:0.4rem 0.5rem;"
20
- >
21
- <button id="lookup-btn" class="btn btn-primary">
22
- <span data-icon="search"></span> Look Up
23
- </button>
24
- <span id="rate-limit-info" style="font-size:0.8rem;color:var(--dm-text-muted,#888);"></span>
25
- </div>
26
- <div id="lookup-error" style="display:none;margin-top:0.75rem;" class="text-danger"></div>
27
- </div>
28
- </div>
29
-
30
- <!-- Tabs -->
31
- <div id="garage-tabs" class="tabs">
32
- <div class="tab-list">
33
- <button class="tab-item active">Results</button>
34
- <button class="tab-item" id="tab-btn-garage">My Garage</button>
35
- <button class="tab-item" id="tab-btn-history">History</button>
36
- <button class="tab-item" id="tab-btn-settings"><span data-icon="settings"></span> Settings</button>
37
- </div>
38
- <div class="tab-content">
39
-
40
- <!-- Results Tab -->
41
- <div class="tab-panel active" id="tab-results">
42
- <div id="vehicle-result" style="display:none;margin-top:1rem;"></div>
43
- <div id="result-empty" style="text-align:center;padding:3rem 1rem;color:var(--dm-text-muted,#888);">
44
- <span data-icon="truck"
45
- style="font-size:2.5rem;display:block;margin-bottom:0.75rem;opacity:0.4;"></span>
46
- Enter a registration number above to look up a vehicle.
47
- </div>
48
- </div>
49
-
50
- <!-- My Garage Tab -->
51
- <div class="tab-panel" id="tab-garage">
52
- <div style="display:flex;align-items:center;margin:1rem 0 0.75rem;">
53
- <span id="garage-count" style="font-size:0.8rem;color:var(--dm-text-muted,#888);"></span>
54
- </div>
55
- <div id="garage-table" style="border-radius:8px;overflow:hidden;"></div>
56
- <div id="garage-empty"
57
- style="display:none;text-align:center;padding:3rem 1rem;color:var(--dm-text-muted,#888);">
58
- <span data-icon="truck"
59
- style="font-size:2.5rem;display:block;margin-bottom:0.75rem;opacity:0.4;"></span>
60
- No saved vehicles yet. Look up a vehicle and save it to your garage.
61
- </div>
62
- </div>
63
-
64
- <!-- History Tab -->
65
- <div class="tab-panel" id="tab-history">
66
- <div style="display:flex;gap:0.5rem;align-items:center;margin:1rem 0 0.75rem;flex-wrap:wrap;">
67
- <span id="history-count" style="font-size:0.8rem;color:var(--dm-text-muted,#888);flex:1;"></span>
68
- <button id="clear-history-btn" class="btn btn-sm btn-danger">
69
- <span data-icon="trash"></span> Clear History
70
- </button>
71
- </div>
72
- <div id="history-table" style="border-radius:8px;overflow:hidden;"></div>
73
- <div id="history-empty"
74
- style="display:none;text-align:center;padding:3rem 1rem;color:var(--dm-text-muted,#888);">
75
- No lookup history yet.
76
- </div>
77
- </div>
78
-
79
- <!-- Settings Tab -->
80
- <div class="tab-panel" id="tab-settings">
81
- <div style="max-width:480px;margin-top:1rem;">
82
- <div class="card">
83
- <div class="card-header" style="display:flex;align-items:center;gap:0.5rem;">
84
- <span data-icon="key"></span>
85
- <strong>DVLA API Configuration</strong>
86
- </div>
87
- <div class="card-body">
88
- <p style="font-size:0.87rem;color:var(--dm-text-muted,#888);margin:0 0 1rem;">
89
- An API key from the DVLA Vehicle Enquiry Service is required to look up vehicle details.
90
- Obtain yours at the
91
- <a href="https://developer-portal.driver-vehicle-licensing.api.gov.uk" target="_blank"
92
- rel="noopener">DVLA developer portal</a>.
93
- </p>
94
- <div id="settings-key-status" style="margin-bottom:1rem;font-size:0.87rem;"></div>
95
- <label style="display:block;font-size:0.9rem;font-weight:500;margin-bottom:0.35rem;">API
96
- Key</label>
97
- <input id="settings-api-key" type="password" class="form-input"
98
- placeholder="Paste your DVLA API key" autocomplete="off"
99
- style="width:100%;margin-bottom:1rem;">
100
- <button id="settings-save-btn" class="btn btn-primary">
101
- <span data-icon="save"></span> Save
102
- </button>
103
- </div>
104
- </div>
105
- </div>
106
- </div>
107
-
108
- </div>
109
- </div>
110
-
111
- </div>