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
package/scripts/seed.js CHANGED
@@ -121,7 +121,7 @@ Have a question, a project in mind, or just want to say hello? Fill in the form
121
121
 
122
122
  ## Send a message
123
123
 
124
- <div data-form="contact"></div>
124
+ <div data-form="enquiries"></div>
125
125
 
126
126
  [/col]
127
127
  [col]
@@ -656,7 +656,7 @@ Paste this HTML anywhere in your Markdown to embed a form:
656
656
  Replace \`your-form-slug\` with the slug from the Form Builder. Example:
657
657
 
658
658
  \`\`\`html
659
- <div data-form="contact"></div>
659
+ <div data-form="enquiries"></div>
660
660
  \`\`\`
661
661
 
662
662
  ---
@@ -927,46 +927,120 @@ const COLLECTIONS = [
927
927
  schema: {
928
928
  slug: 'contacts',
929
929
  title: 'Contacts',
930
- description: 'Submissions from the contact form',
930
+ description: 'People and their contact information.',
931
931
  fields: [
932
- {name: 'full_name', type: 'string', label: 'Full Name', required: false},
933
- {name: 'email_address', type: 'string', label: 'Email Address', required: false},
934
- {name: 'phone_number', type: 'tel', label: 'Phone Number', required: false},
935
- {name: 'subject', type: 'string', label: 'Subject', required: false},
936
- {name: 'message', type: 'textarea', label: 'Message', required: false}
932
+ {name: 'full_name', label: 'Full Name', type: 'text', required: true},
933
+ {name: 'email_address', label: 'Email', type: 'text', required: true},
934
+ {name: 'phone_number', label: 'Phone', type: 'text'}
935
+ ],
936
+ api: {
937
+ create: {enabled: true, access: 'public'},
938
+ read: {enabled: true, access: 'admin'},
939
+ update: {enabled: false, access: 'admin'},
940
+ delete: {enabled: false, access: 'admin'}
941
+ }
942
+ }
943
+ },
944
+ {
945
+ slug: 'enquiries',
946
+ schema: {
947
+ slug: 'enquiries',
948
+ title: 'Enquiries',
949
+ description: 'Messages and enquiries from website visitors.',
950
+ fields: [
951
+ {name: 'full_name', label: 'Full Name', type: 'text', required: true},
952
+ {name: 'email', label: 'Email', type: 'text', required: true},
953
+ {name: 'phone', label: 'Phone', type: 'text'},
954
+ {
955
+ name: 'subject',
956
+ label: 'Subject',
957
+ type: 'select',
958
+ options: ['General Enquiry', 'Support', 'Sales', 'Partnership', 'Other'],
959
+ required: true
960
+ },
961
+ {name: 'message', label: 'Message', type: 'text', required: true}
962
+ ],
963
+ api: {
964
+ create: {enabled: true, access: 'public'},
965
+ read: {enabled: true, access: 'admin'},
966
+ update: {enabled: false, access: 'admin'},
967
+ delete: {enabled: false, access: 'admin'}
968
+ }
969
+ }
970
+ },
971
+ {
972
+ slug: 'feedback',
973
+ schema: {
974
+ slug: 'feedback',
975
+ title: 'Feedback',
976
+ description: 'User feedback and ratings.',
977
+ fields: [
978
+ {name: 'name', label: 'Name', type: 'text', required: true},
979
+ {name: 'email', label: 'Email', type: 'text', required: true},
980
+ {
981
+ name: 'rating',
982
+ label: 'Rating',
983
+ type: 'select',
984
+ options: ['Excellent', 'Good', 'Average', 'Poor'],
985
+ required: true
986
+ },
987
+ {
988
+ name: 'category',
989
+ label: 'Category',
990
+ type: 'select',
991
+ options: ['General', 'Bug Report', 'Feature Request', 'Praise']
992
+ },
993
+ {name: 'subject', label: 'Subject', type: 'text'},
994
+ {name: 'message', label: 'Message', type: 'text', required: true}
995
+ ],
996
+ api: {
997
+ create: {enabled: true, access: 'public'},
998
+ read: {enabled: true, access: 'admin'},
999
+ update: {enabled: false, access: 'admin'},
1000
+ delete: {enabled: false, access: 'admin'}
1001
+ }
1002
+ }
1003
+ },
1004
+ {
1005
+ slug: 'to-do',
1006
+ schema: {
1007
+ slug: 'to-do',
1008
+ title: 'To-Do',
1009
+ description: 'Task tracking with priorities and due dates.',
1010
+ fields: [
1011
+ {name: 'title', label: 'Title', type: 'text', required: true},
1012
+ {name: 'description', label: 'Description', type: 'text'},
1013
+ {name: 'status', label: 'Status', type: 'select', options: ['Pending', 'In Progress', 'Done'], required: true},
1014
+ {name: 'priority', label: 'Priority', type: 'select', options: ['Low', 'Medium', 'High']},
1015
+ {name: 'due_date', label: 'Due Date', type: 'text'},
1016
+ {name: 'assigned_to', label: 'Assigned To', type: 'text'}
937
1017
  ],
938
1018
  api: {
939
1019
  create: {enabled: false, access: 'admin'},
940
- read: {enabled: true, access: 'public'},
1020
+ read: {enabled: false, access: 'admin'},
941
1021
  update: {enabled: false, access: 'admin'},
942
1022
  delete: {enabled: false, access: 'admin'}
943
- },
944
- createdAt: now,
945
- updatedAt: now
1023
+ }
946
1024
  }
947
1025
  },
948
1026
  {
949
- slug: 'bookings',
1027
+ slug: 'notes',
950
1028
  schema: {
951
- slug: 'bookings',
952
- title: 'Bookings',
953
- description: 'Booking requests startedAt, endedAt, and createdAt (auto) captured per entry',
1029
+ slug: 'notes',
1030
+ title: 'Notes',
1031
+ description: 'Free-form notes with categories and tags.',
954
1032
  fields: [
955
- {name: 'full_name', type: 'string', label: 'Full Name', required: true},
956
- {name: 'email', type: 'string', label: 'Email', required: true},
957
- {name: 'phone', type: 'tel', label: 'Phone Number', required: false},
958
- {name: 'started_at', type: 'date', label: 'Start Date', required: true},
959
- {name: 'ended_at', type: 'date', label: 'End Date', required: true},
960
- {name: 'notes', type: 'textarea', label: 'Notes', required: false}
1033
+ {name: 'title', label: 'Title', type: 'text', required: true},
1034
+ {name: 'content', label: 'Content', type: 'text', required: true},
1035
+ {name: 'category', label: 'Category', type: 'select', options: ['General', 'Idea', 'Reminder', 'Reference']},
1036
+ {name: 'tags', label: 'Tags', type: 'text'}
961
1037
  ],
962
1038
  api: {
963
1039
  create: {enabled: false, access: 'admin'},
964
- read: {enabled: true, access: 'public'},
1040
+ read: {enabled: false, access: 'admin'},
965
1041
  update: {enabled: false, access: 'admin'},
966
1042
  delete: {enabled: false, access: 'admin'}
967
- },
968
- createdAt: now,
969
- updatedAt: now
1043
+ }
970
1044
  }
971
1045
  }
972
1046
  ];
@@ -977,123 +1051,313 @@ const COLLECTIONS = [
977
1051
 
978
1052
  const FORMS = [
979
1053
  {
980
- slug: 'booking',
1054
+ slug: 'contacts',
1055
+ data: {
1056
+ slug: 'contacts',
1057
+ title: 'Contacts',
1058
+ description: 'Contact Information',
1059
+ fields: [
1060
+ {
1061
+ name: 'full_name',
1062
+ type: 'string',
1063
+ label: 'Full Name',
1064
+ required: false,
1065
+ placeholder: 'Full Name',
1066
+ helper: 'Full Name',
1067
+ minLength: 8,
1068
+ maxLength: 255
1069
+ },
1070
+ {type: 'spacer'},
1071
+ {
1072
+ name: 'phone_number',
1073
+ type: 'tel',
1074
+ label: 'Phone Number',
1075
+ required: false,
1076
+ placeholder: 'Phone Number',
1077
+ helper: 'Primary Phone Number'
1078
+ },
1079
+ {type: 'spacer'},
1080
+ {
1081
+ name: 'email_address',
1082
+ type: 'string',
1083
+ label: 'Email Address',
1084
+ required: false,
1085
+ placeholder: 'Email Address',
1086
+ helper: 'Email Address',
1087
+ minLength: 8,
1088
+ maxLength: 255
1089
+ }
1090
+ ],
1091
+ settings: {
1092
+ submitText: 'Submit',
1093
+ successMessage: 'Thank you for your submission.',
1094
+ layout: 'stacked',
1095
+ honeypot: true,
1096
+ rateLimitPerMinute: 3
1097
+ },
1098
+ actions: {
1099
+ email: {enabled: false, recipients: '', subjectPrefix: '[Contacts]'},
1100
+ webhook: {enabled: false, url: '', method: 'POST'},
1101
+ collection: {enabled: true, slug: 'contacts'}
1102
+ },
1103
+ createdAt: now,
1104
+ updatedAt: now
1105
+ }
1106
+ },
1107
+ {
1108
+ slug: 'enquiries',
981
1109
  data: {
982
- slug: 'booking',
983
- title: 'Booking',
984
- description: 'Request a booking — captures name, contact details, start date, end date, and notes. Entries stored in the Bookings collection with an automatic createdAt timestamp.',
1110
+ slug: 'enquiries',
1111
+ title: 'Enquiries',
1112
+ description: 'Get in touch with us',
985
1113
  fields: [
986
1114
  {
987
1115
  name: 'full_name',
988
1116
  type: 'string',
989
1117
  label: 'Full Name',
990
1118
  required: true,
991
- placeholder: 'Your full name'
1119
+ placeholder: 'Your full name',
1120
+ helper: '',
1121
+ validation: {min: 2, max: 100}
992
1122
  },
993
1123
  {
994
1124
  name: 'email',
995
- type: 'string',
1125
+ type: 'email',
996
1126
  label: 'Email Address',
997
1127
  required: true,
998
- placeholder: 'you@example.com'
1128
+ placeholder: 'your@email.com',
1129
+ helper: ''
999
1130
  },
1000
1131
  {
1001
1132
  name: 'phone',
1002
1133
  type: 'tel',
1003
1134
  label: 'Phone Number',
1004
1135
  required: false,
1005
- placeholder: '+44 7700 000000'
1136
+ placeholder: '+44 7700 000000',
1137
+ helper: 'Optional'
1006
1138
  },
1007
1139
  {
1008
- name: 'started_at',
1009
- type: 'date',
1010
- label: 'Start Date',
1011
- required: true
1012
- },
1013
- {
1014
- name: 'ended_at',
1015
- type: 'date',
1016
- label: 'End Date',
1017
- required: true
1140
+ name: 'subject',
1141
+ type: 'select',
1142
+ label: 'Subject',
1143
+ required: true,
1144
+ placeholder: 'Please select a subject',
1145
+ helper: '',
1146
+ options: [
1147
+ {value: 'general', label: 'General Enquiry'},
1148
+ {value: 'support', label: 'Support'},
1149
+ {value: 'sales', label: 'Sales'},
1150
+ {value: 'partnership', label: 'Partnership'},
1151
+ {value: 'other', label: 'Other'}
1152
+ ]
1018
1153
  },
1019
1154
  {
1020
- name: 'notes',
1155
+ name: 'message',
1021
1156
  type: 'textarea',
1022
- label: 'Notes',
1023
- required: false,
1024
- placeholder: 'Any additional details…'
1157
+ label: 'Message',
1158
+ required: true,
1159
+ placeholder: 'How can we help you?',
1160
+ helper: '',
1161
+ rows: 4,
1162
+ validation: {min: 10, max: 2000}
1025
1163
  }
1026
1164
  ],
1027
1165
  settings: {
1028
- submitText: 'Request Booking',
1029
- successMessage: 'Thank you your booking request has been received. We\'ll be in touch to confirm.',
1166
+ submitText: 'Send Message',
1167
+ successMessage: 'Thanks for reaching out! We\'ll get back to you shortly.',
1030
1168
  layout: 'stacked',
1031
1169
  honeypot: true,
1032
1170
  rateLimitPerMinute: 3
1033
1171
  },
1034
1172
  actions: {
1035
- email: {enabled: false, recipients: '', subjectPrefix: '[Booking]'},
1173
+ email: {enabled: false, recipients: '', subjectPrefix: '[enquiries]'},
1036
1174
  webhook: {enabled: false, url: '', method: 'POST'},
1037
- collection: {enabled: true, slug: 'bookings'}
1175
+ collection: {enabled: true, slug: 'enquiries'}
1038
1176
  },
1039
1177
  createdAt: now,
1040
1178
  updatedAt: now
1041
1179
  }
1042
1180
  },
1043
1181
  {
1044
- slug: 'contact',
1182
+ slug: 'feedback',
1045
1183
  data: {
1046
- slug: 'contact',
1047
- title: 'Contact',
1048
- description: 'Get in touch with us.',
1184
+ slug: 'feedback',
1185
+ title: 'Feedback',
1186
+ description: 'Share your feedback with us',
1049
1187
  fields: [
1050
1188
  {
1051
- name: 'full_name',
1189
+ name: 'name',
1052
1190
  type: 'string',
1053
- label: 'Full Name',
1191
+ label: 'Your Name',
1054
1192
  required: true,
1055
- placeholder: 'Your full name'
1193
+ placeholder: 'Please enter your full name',
1194
+ helper: 'Please enter your full name',
1195
+ validation: {min: 2, max: 100}
1056
1196
  },
1057
1197
  {
1058
- name: 'email_address',
1059
- type: 'string',
1198
+ name: 'email',
1199
+ type: 'email',
1060
1200
  label: 'Email Address',
1061
1201
  required: true,
1062
- placeholder: 'you@example.com'
1202
+ placeholder: 'your@email.com',
1203
+ helper: 'Please enter your email address'
1063
1204
  },
1064
1205
  {
1065
- name: 'phone_number',
1066
- type: 'tel',
1067
- label: 'Phone Number',
1068
- required: false,
1069
- placeholder: '+44 7700 000000'
1206
+ name: 'rating', type: 'select', label: 'Overall Rating', required: true, helper: 'Tell us how we are doing!',
1207
+ options: [
1208
+ {value: 'none', label: 'Please Choose'},
1209
+ {value: 'excellent', label: 'Excellent'},
1210
+ {value: 'good', label: 'Good'},
1211
+ {value: 'average', label: 'Average'},
1212
+ {value: 'poor', label: 'Poor'}
1213
+ ]
1214
+ },
1215
+ {
1216
+ name: 'category',
1217
+ type: 'select',
1218
+ label: 'Category',
1219
+ required: true,
1220
+ placeholder: 'Please select a category',
1221
+ helper: '',
1222
+ options: [
1223
+ {value: 'general', label: 'General'},
1224
+ {value: 'bug-report', label: 'Bug Report'},
1225
+ {value: 'feature-request', label: 'Feature Request'},
1226
+ {value: 'praise', label: 'Praise'}
1227
+ ]
1070
1228
  },
1071
1229
  {
1072
1230
  name: 'subject',
1073
1231
  type: 'string',
1074
1232
  label: 'Subject',
1075
- required: false,
1076
- placeholder: 'What is this regarding?'
1233
+ required: true,
1234
+ placeholder: 'Brief summary of your feedback',
1235
+ helper: '',
1236
+ validation: {max: 200}
1077
1237
  },
1078
1238
  {
1079
1239
  name: 'message',
1080
1240
  type: 'textarea',
1081
- label: 'Message',
1241
+ label: 'Your Feedback',
1082
1242
  required: true,
1083
- placeholder: 'Your message…'
1243
+ placeholder: 'Please share your thoughts in detail…',
1244
+ helper: 'Please share your thoughts in detail…',
1245
+ rows: 4,
1246
+ validation: {min: 10, max: 2000}
1084
1247
  }
1085
1248
  ],
1086
1249
  settings: {
1087
- submitText: 'Send Message',
1088
- successMessage: 'Thank you for your message. We\'ll be in touch shortly.',
1250
+ submitText: 'Submit Feedback',
1251
+ successMessage: 'Thank you for your feedback! We appreciate you taking the time.',
1089
1252
  layout: 'stacked',
1090
1253
  honeypot: true,
1091
1254
  rateLimitPerMinute: 3
1092
1255
  },
1093
1256
  actions: {
1094
- email: {enabled: false, recipients: '', subjectPrefix: '[Contact]'},
1257
+ email: {enabled: true, recipients: '', subjectPrefix: '[feedback]'},
1095
1258
  webhook: {enabled: false, url: '', method: 'POST'},
1096
- collection: {enabled: true, slug: 'contacts'}
1259
+ collection: {enabled: true, slug: 'feedback'}
1260
+ },
1261
+ createdAt: now,
1262
+ updatedAt: now
1263
+ }
1264
+ },
1265
+ {
1266
+ slug: 'to-do',
1267
+ data: {
1268
+ slug: 'to-do',
1269
+ title: 'To-Do',
1270
+ description: 'Task tracking with status, priority, and due dates.',
1271
+ fields: [
1272
+ {name: 'title', type: 'string', label: 'Title', required: true, placeholder: 'Task title'},
1273
+ {
1274
+ name: 'description',
1275
+ type: 'textarea',
1276
+ label: 'Description',
1277
+ required: false,
1278
+ placeholder: 'Task details…',
1279
+ rows: 3
1280
+ },
1281
+ {
1282
+ name: 'status', type: 'select', label: 'Status', required: true,
1283
+ options: [
1284
+ {value: 'pending', label: 'Pending'},
1285
+ {value: 'in-progress', label: 'In Progress'},
1286
+ {value: 'done', label: 'Done'}
1287
+ ]
1288
+ },
1289
+ {
1290
+ name: 'priority', type: 'select', label: 'Priority', required: false,
1291
+ options: [
1292
+ {value: 'low', label: 'Low'},
1293
+ {value: 'medium', label: 'Medium'},
1294
+ {value: 'high', label: 'High'}
1295
+ ]
1296
+ },
1297
+ {name: 'due_date', type: 'date', label: 'Due Date', required: false},
1298
+ {name: 'assigned_to', type: 'string', label: 'Assigned To', required: false, placeholder: 'Name or email'}
1299
+ ],
1300
+ settings: {
1301
+ submitText: 'Add Task',
1302
+ successMessage: 'Task added successfully.',
1303
+ layout: 'stacked',
1304
+ honeypot: true,
1305
+ rateLimitPerMinute: 3
1306
+ },
1307
+ actions: {
1308
+ email: {enabled: false, recipients: '', subjectPrefix: '[to-do]'},
1309
+ webhook: {enabled: false, url: '', method: 'POST'},
1310
+ collection: {enabled: true, slug: 'to-do'}
1311
+ },
1312
+ createdAt: now,
1313
+ updatedAt: now
1314
+ }
1315
+ },
1316
+ {
1317
+ slug: 'notes',
1318
+ data: {
1319
+ slug: 'notes',
1320
+ title: 'Notes',
1321
+ description: 'Free-form notes with categories and tags.',
1322
+ fields: [
1323
+ {name: 'title', type: 'string', label: 'Title', required: true, placeholder: 'Note title'},
1324
+ {
1325
+ name: 'content',
1326
+ type: 'textarea',
1327
+ label: 'Content',
1328
+ required: true,
1329
+ placeholder: 'Write your note here…',
1330
+ rows: 5
1331
+ },
1332
+ {
1333
+ name: 'category', type: 'select', label: 'Category', required: false,
1334
+ options: [
1335
+ {value: 'general', label: 'General'},
1336
+ {value: 'idea', label: 'Idea'},
1337
+ {value: 'reminder', label: 'Reminder'},
1338
+ {value: 'reference', label: 'Reference'}
1339
+ ]
1340
+ },
1341
+ {
1342
+ name: 'tags',
1343
+ type: 'string',
1344
+ label: 'Tags',
1345
+ required: false,
1346
+ placeholder: 'Comma-separated tags',
1347
+ helper: 'Separate tags with commas'
1348
+ }
1349
+ ],
1350
+ settings: {
1351
+ submitText: 'Save Note',
1352
+ successMessage: 'Note saved successfully.',
1353
+ layout: 'stacked',
1354
+ honeypot: true,
1355
+ rateLimitPerMinute: 3
1356
+ },
1357
+ actions: {
1358
+ email: {enabled: false, recipients: '', subjectPrefix: '[notes]'},
1359
+ webhook: {enabled: false, url: '', method: 'POST'},
1360
+ collection: {enabled: true, slug: 'notes'}
1097
1361
  },
1098
1362
  createdAt: now,
1099
1363
  updatedAt: now
@@ -1166,11 +1430,12 @@ for (const form of FORMS) {
1166
1430
  await writeFile(subsFile, '[]\n', {encoding: 'utf8', flag: 'wx'});
1167
1431
  } catch { /* already exists */
1168
1432
  }
1169
- console.log(` ✓ form: ${form.slug} → collection: ${form.data.actions.collection.slug}`);
1433
+ const colSlug = form.data.actions?.collection?.slug ?? '—';
1434
+ console.log(` ✓ form: ${form.slug} → collection: ${colSlug}`);
1170
1435
  }
1171
1436
 
1172
1437
  console.log('');
1173
1438
  console.log(` ✓ Seed complete — ${PAGES.length} pages, ${COLLECTIONS.length} collection(s), ${FORMS.length} form(s).`);
1174
- console.log(' Visit your site at http://localhost:3050/');
1175
- console.log(' Resources section available at http://localhost:3050/resources');
1439
+ console.log(' Visit your site at http://localhost:4096/');
1440
+ console.log(' Resources section available at http://localhost:4096/resources');
1176
1441
  console.log('');
package/scripts/setup.js CHANGED
@@ -38,10 +38,11 @@ const THEMES = [
38
38
  'royal-dark', 'royal-light',
39
39
  'lemon-dark', 'lemon-light',
40
40
  'silver-dark', 'silver-light',
41
- 'grayve-dark', 'grayve-light',
42
- 'christmas-dark', 'christmas-light',
43
- 'unicorn-dark', 'unicorn-light',
44
- 'dreamy-dark', 'dreamy-light',
41
+ 'grayve-dark', 'grayve-light',
42
+ 'mint-dark', 'mint-light',
43
+ 'christmas-dark', 'christmas-light',
44
+ 'unicorn-dark', 'unicorn-light',
45
+ 'dreamy-dark', 'dreamy-light',
45
46
  ];
46
47
 
47
48
  // ---------------------------------------------------------------------------