alchemy_cms 7.4.5 → 8.0.0.a

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.

Potentially problematic release.


This version of alchemy_cms might be problematic. Click here for more details.

Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +92 -0
  3. data/Gemfile +13 -6
  4. data/README.md +13 -5
  5. data/alchemy_cms.gemspec +14 -5
  6. data/app/assets/builds/alchemy/admin/page-select.css +1 -1
  7. data/app/assets/builds/alchemy/admin/print.css +1 -1
  8. data/app/assets/builds/alchemy/admin.css +2 -2
  9. data/app/assets/builds/alchemy/custom-properties.css +1 -1
  10. data/app/assets/builds/alchemy/welcome.css +1 -1
  11. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css +1 -1
  12. data/app/assets/builds/tinymce/skins/ui/alchemy/content.min.css +1 -0
  13. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css +1 -1
  14. data/app/assets/config/alchemy_manifest.js +0 -2
  15. data/app/assets/images/alchemy/icons-sprite.svg +1 -0
  16. data/app/components/alchemy/admin/resource/applied_filter.rb +29 -0
  17. data/app/components/alchemy/admin/resource/checkbox_filter.rb +36 -0
  18. data/app/components/alchemy/admin/resource/datepicker_filter.rb +42 -0
  19. data/app/components/alchemy/admin/resource/select_filter.rb +43 -0
  20. data/app/components/alchemy/admin/toolbar_button.rb +5 -2
  21. data/app/components/alchemy/ingredients/number_view.rb +18 -0
  22. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -15
  23. data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -6
  24. data/app/controllers/alchemy/admin/elements_controller.rb +1 -1
  25. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  26. data/app/controllers/alchemy/admin/pages_controller.rb +15 -15
  27. data/app/controllers/alchemy/admin/picture_descriptions_controller.rb +5 -1
  28. data/app/controllers/alchemy/admin/pictures_controller.rb +10 -5
  29. data/app/controllers/alchemy/admin/resources_controller.rb +16 -106
  30. data/app/controllers/alchemy/attachments_controller.rb +43 -14
  31. data/app/controllers/alchemy/messages_controller.rb +1 -1
  32. data/app/controllers/alchemy/pages_controller.rb +7 -2
  33. data/app/controllers/concerns/alchemy/admin/picture_descriptions_form_helper.rb +16 -0
  34. data/app/controllers/concerns/alchemy/admin/resource_filter.rb +92 -0
  35. data/app/decorators/alchemy/element_editor.rb +5 -48
  36. data/app/decorators/alchemy/ingredient_editor.rb +3 -53
  37. data/app/helpers/alchemy/admin/base_helper.rb +14 -84
  38. data/app/helpers/alchemy/admin/elements_helper.rb +4 -4
  39. data/app/helpers/alchemy/admin/pages_helper.rb +1 -1
  40. data/app/helpers/alchemy/base_helper.rb +0 -30
  41. data/app/helpers/alchemy/elements_block_helper.rb +0 -14
  42. data/app/helpers/alchemy/pages_helper.rb +1 -1
  43. data/{lib → app/helpers}/alchemy/resources_helper.rb +5 -45
  44. data/app/javascript/alchemy_admin/components/action.js +4 -0
  45. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +3 -3
  46. data/app/javascript/alchemy_admin/components/datepicker.js +10 -2
  47. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +7 -7
  48. data/app/javascript/alchemy_admin/components/element_editor.js +1 -1
  49. data/app/javascript/alchemy_admin/components/growl.js +1 -0
  50. data/app/javascript/alchemy_admin/components/index.js +1 -0
  51. data/app/javascript/alchemy_admin/components/remote_select.js +4 -1
  52. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +5 -1
  53. data/app/javascript/alchemy_admin/components/tinymce.js +4 -2
  54. data/app/javascript/alchemy_admin/components/update_check.js +42 -0
  55. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +15 -8
  56. data/app/javascript/alchemy_admin/components/uploader/progress.js +12 -6
  57. data/app/javascript/alchemy_admin/components/uploader.js +4 -2
  58. data/app/javascript/alchemy_admin/confirm_dialog.js +27 -57
  59. data/app/javascript/alchemy_admin/dirty.js +3 -2
  60. data/app/javascript/alchemy_admin/i18n.js +15 -16
  61. data/app/javascript/alchemy_admin/initializer.js +1 -49
  62. data/app/javascript/alchemy_admin/utils/ajax.js +51 -44
  63. data/app/javascript/alchemy_admin.js +3 -8
  64. data/app/models/alchemy/admin/filters/base.rb +38 -0
  65. data/app/models/alchemy/admin/filters/checkbox.rb +24 -0
  66. data/app/models/alchemy/admin/filters/datepicker.rb +53 -0
  67. data/app/models/alchemy/admin/filters/select.rb +70 -0
  68. data/app/models/alchemy/admin/resource_name.rb +27 -0
  69. data/app/models/alchemy/attachment.rb +51 -34
  70. data/app/models/alchemy/base_record.rb +2 -0
  71. data/app/models/alchemy/element/definitions.rb +1 -1
  72. data/app/models/alchemy/element/element_ingredients.rb +6 -6
  73. data/app/models/alchemy/element/presenters.rb +3 -12
  74. data/app/models/alchemy/element.rb +9 -27
  75. data/app/models/alchemy/element_definition.rb +160 -0
  76. data/app/models/alchemy/ingredient.rb +10 -43
  77. data/app/models/alchemy/ingredient_definition.rb +134 -0
  78. data/app/models/alchemy/ingredient_validator.rb +7 -3
  79. data/app/models/alchemy/ingredients/number.rb +19 -0
  80. data/app/models/alchemy/language.rb +0 -14
  81. data/app/models/alchemy/message.rb +3 -7
  82. data/app/models/alchemy/node.rb +1 -1
  83. data/app/models/alchemy/page/{page_layouts.rb → definitions.rb} +12 -19
  84. data/app/models/alchemy/page/fixed_attributes.rb +1 -1
  85. data/app/models/alchemy/page/page_elements.rb +13 -14
  86. data/app/models/alchemy/page/page_natures.rb +7 -7
  87. data/app/models/alchemy/page/page_scopes.rb +1 -1
  88. data/app/models/alchemy/page.rb +11 -33
  89. data/app/models/alchemy/page_definition.rb +115 -0
  90. data/app/models/alchemy/picture.rb +69 -79
  91. data/app/models/alchemy/picture_variant.rb +115 -5
  92. data/{lib → app/models}/alchemy/resource.rb +4 -18
  93. data/{lib → app/models}/alchemy/searchable_resource.rb +15 -0
  94. data/app/models/alchemy/site/layout.rb +5 -5
  95. data/app/models/alchemy/site.rb +0 -15
  96. data/app/models/alchemy/storage_adapter/active_storage/attachment_url.rb +41 -0
  97. data/app/models/alchemy/storage_adapter/active_storage/picture_url.rb +55 -0
  98. data/app/models/alchemy/storage_adapter/active_storage/preprocessor.rb +40 -0
  99. data/app/models/alchemy/storage_adapter/active_storage.rb +173 -0
  100. data/app/models/alchemy/{attachment/url.rb → storage_adapter/dragonfly/attachment_url.rb} +12 -12
  101. data/app/models/alchemy/{picture/url.rb → storage_adapter/dragonfly/picture_url.rb} +28 -12
  102. data/app/models/alchemy/{picture → storage_adapter/dragonfly}/preprocessor.rb +4 -4
  103. data/app/models/alchemy/storage_adapter/dragonfly.rb +183 -0
  104. data/app/models/alchemy/storage_adapter.rb +74 -0
  105. data/app/models/concerns/alchemy/picture_thumbnails.rb +19 -6
  106. data/app/serializers/alchemy/element_serializer.rb +0 -1
  107. data/app/services/alchemy/dragonfly_to_image_processing.rb +100 -0
  108. data/app/stylesheets/alchemy/_defaults.scss +3 -0
  109. data/app/stylesheets/alchemy/_extends.scss +69 -0
  110. data/app/{assets/stylesheets → stylesheets}/alchemy/_mixins.scss +36 -49
  111. data/app/stylesheets/alchemy/_variables.scss +5 -0
  112. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/archive.scss +20 -37
  113. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/base.scss +16 -14
  114. data/app/stylesheets/alchemy/admin/buttons.scss +160 -0
  115. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/clipboard.scss +2 -2
  116. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/dashboard.scss +13 -16
  117. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/dialogs.scss +23 -16
  118. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/elements.scss +150 -105
  119. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/errors.scss +5 -5
  120. data/app/stylesheets/alchemy/admin/filters.scss +58 -0
  121. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/flatpickr.scss +53 -60
  122. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/form_fields.scss +21 -7
  123. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/forms.scss +31 -19
  124. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/frame.scss +20 -16
  125. data/app/stylesheets/alchemy/admin/hints.scss +5 -0
  126. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/icons.scss +10 -1
  127. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/image_library.scss +10 -8
  128. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/images.scss +1 -1
  129. data/app/stylesheets/alchemy/admin/labels.scss +5 -0
  130. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/lists.scss +3 -3
  131. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/navigation.scss +61 -55
  132. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/nodes.scss +21 -18
  133. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/notices.scss +18 -18
  134. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/page-select.scss +2 -2
  135. data/app/stylesheets/alchemy/admin/pagination.scss +144 -0
  136. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/preview_window.scss +8 -6
  137. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/print.scss +1 -1
  138. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/resource_info.scss +8 -5
  139. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/search.scss +9 -6
  140. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/selects.scss +49 -37
  141. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/shoelace.scss +5 -6
  142. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/sitemap.scss +38 -33
  143. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/tables.scss +6 -4
  144. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/tags.scss +6 -4
  145. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/toolbar.scss +12 -6
  146. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/typography.scss +2 -2
  147. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/upload.scss +7 -5
  148. data/app/stylesheets/alchemy/admin.scss +44 -0
  149. data/app/stylesheets/alchemy/custom-properties.css +244 -0
  150. data/app/stylesheets/alchemy/welcome.scss +75 -0
  151. data/app/{assets/stylesheets → stylesheets}/tinymce/skins/content/alchemy/content.scss +8 -9
  152. data/app/stylesheets/tinymce/skins/ui/alchemy/content.scss +1 -0
  153. data/app/{assets/stylesheets → stylesheets}/tinymce/skins/ui/alchemy/skin.scss +133 -136
  154. data/app/views/alchemy/admin/attachments/_files_list.html.erb +2 -2
  155. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  156. data/app/views/alchemy/admin/{elements/_clipboard_button.html.erb → clipboard/_button.html.erb} +3 -5
  157. data/app/views/alchemy/admin/clipboard/_update_nested_element_button.turbo_stream.erb +11 -0
  158. data/app/views/alchemy/admin/clipboard/clear.turbo_stream.erb +4 -0
  159. data/app/views/alchemy/admin/clipboard/index.html.erb +15 -13
  160. data/app/views/alchemy/admin/clipboard/insert.turbo_stream.erb +18 -0
  161. data/app/views/alchemy/admin/clipboard/remove.turbo_stream.erb +9 -0
  162. data/app/views/alchemy/admin/dashboard/info.html.erb +17 -31
  163. data/app/views/alchemy/admin/elements/_element.html.erb +4 -8
  164. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  165. data/app/views/alchemy/admin/elements/_header.html.erb +1 -0
  166. data/app/views/alchemy/admin/elements/_toolbar.html.erb +4 -6
  167. data/app/views/alchemy/admin/elements/create.turbo_stream.erb +2 -1
  168. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  169. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +3 -16
  170. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +0 -9
  171. data/app/views/alchemy/admin/languages/_form.html.erb +1 -1
  172. data/app/views/alchemy/admin/languages/_table.html.erb +1 -1
  173. data/app/views/alchemy/admin/languages/index.html.erb +5 -2
  174. data/app/views/alchemy/admin/layoutpages/index.html.erb +1 -12
  175. data/app/views/alchemy/admin/pages/_form.html.erb +2 -2
  176. data/app/views/alchemy/admin/pages/_page.html.erb +2 -3
  177. data/app/views/alchemy/admin/pages/_toolbar.html.erb +1 -15
  178. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  179. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -12
  180. data/app/views/alchemy/admin/partials/_search_form.html.erb +4 -9
  181. data/app/views/alchemy/admin/picture_descriptions/_form.html.erb +5 -7
  182. data/app/views/alchemy/admin/picture_descriptions/edit.html.erb +2 -2
  183. data/app/views/alchemy/admin/pictures/_archive.html.erb +4 -7
  184. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +2 -1
  185. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -1
  186. data/app/views/alchemy/admin/pictures/_form.html.erb +2 -2
  187. data/app/views/alchemy/admin/pictures/_picture_description_field.html.erb +21 -13
  188. data/app/views/alchemy/admin/pictures/index.html.erb +2 -7
  189. data/app/views/alchemy/admin/resources/_applied_filters.html.erb +8 -0
  190. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +11 -21
  191. data/app/views/alchemy/admin/resources/_pagination.html.erb +6 -0
  192. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +4 -2
  193. data/app/views/alchemy/admin/resources/_resource_table.html.erb +1 -1
  194. data/app/views/alchemy/admin/resources/_table_header.html.erb +1 -15
  195. data/app/views/alchemy/admin/sites/index.html.erb +5 -1
  196. data/app/views/alchemy/admin/styleguide/index.html.erb +8 -0
  197. data/app/views/alchemy/admin/tags/index.html.erb +1 -1
  198. data/app/views/alchemy/admin/tinymce/_setup.html.erb +7 -7
  199. data/app/{javascript/alchemy_admin/locales/en.js → views/alchemy/admin/translations/_en.js} +5 -2
  200. data/app/views/alchemy/admin/uploader/_button.html.erb +1 -1
  201. data/app/views/alchemy/admin/uploader/_setup.html.erb +4 -4
  202. data/app/views/alchemy/base/500.turbo_stream.erb +3 -0
  203. data/app/views/alchemy/base/redirect.js.erb +1 -1
  204. data/app/views/alchemy/ingredients/_number_editor.html.erb +24 -0
  205. data/app/views/alchemy/no_index.html.erb +31 -0
  206. data/app/views/alchemy/welcome.html.erb +12 -10
  207. data/app/views/kaminari/alchemy/_first_page.html.erb +5 -3
  208. data/app/views/kaminari/alchemy/_last_page.html.erb +5 -3
  209. data/app/views/kaminari/alchemy/_next_page.html.erb +5 -3
  210. data/app/views/kaminari/alchemy/_paginator.html.erb +18 -13
  211. data/app/views/kaminari/alchemy/_prev_page.html.erb +5 -3
  212. data/app/views/layouts/alchemy/admin.html.erb +5 -9
  213. data/bun.lockb +0 -0
  214. data/bundles/remixicon.mjs +153 -0
  215. data/config/alchemy/config.yml +3 -2
  216. data/config/initializers/dragonfly.rb +0 -1
  217. data/config/initializers/mime_types.rb +1 -0
  218. data/config/locales/alchemy.en.yml +32 -14
  219. data/config/routes.rb +0 -2
  220. data/db/migrate/20250626160259_add_unique_index_to_picture_descriptions.rb +7 -0
  221. data/eslint.config.js +2 -1
  222. data/lib/alchemy/admin/preview_url.rb +4 -5
  223. data/lib/alchemy/cache_digests/template_tracker.rb +6 -9
  224. data/lib/alchemy/config_missing.rb +14 -0
  225. data/lib/alchemy/configuration/base_option.rb +24 -0
  226. data/lib/alchemy/configuration/boolean_option.rb +16 -0
  227. data/lib/alchemy/configuration/class_option.rb +15 -0
  228. data/lib/alchemy/configuration/class_set_option.rb +46 -0
  229. data/lib/alchemy/configuration/integer_list_option.rb +13 -0
  230. data/lib/alchemy/configuration/integer_option.rb +12 -0
  231. data/lib/alchemy/configuration/list_option.rb +22 -0
  232. data/lib/alchemy/configuration/regexp_option.rb +11 -0
  233. data/lib/alchemy/configuration/string_list_option.rb +13 -0
  234. data/lib/alchemy/configuration/string_option.rb +11 -0
  235. data/lib/alchemy/configuration.rb +115 -0
  236. data/lib/alchemy/configuration_methods.rb +3 -1
  237. data/lib/alchemy/configurations/default_language.rb +12 -0
  238. data/lib/alchemy/configurations/default_site.rb +10 -0
  239. data/lib/alchemy/configurations/format_matchers.rb +11 -0
  240. data/lib/alchemy/configurations/mailer.rb +16 -0
  241. data/lib/alchemy/configurations/main.rb +216 -0
  242. data/lib/alchemy/configurations/preview.rb +32 -0
  243. data/lib/alchemy/configurations/sitemap.rb +10 -0
  244. data/lib/alchemy/configurations/uploader.rb +34 -0
  245. data/lib/alchemy/engine.rb +65 -17
  246. data/lib/alchemy/hints.rb +3 -7
  247. data/lib/alchemy/on_page_layout.rb +2 -2
  248. data/lib/alchemy/propshaft/tinymce_asset.rb +15 -0
  249. data/lib/alchemy/seeder.rb +2 -2
  250. data/lib/alchemy/tasks/usage.rb +4 -4
  251. data/lib/alchemy/test_support/config_stubbing.rb +1 -7
  252. data/lib/alchemy/test_support/factories/attachment_factory.rb +13 -2
  253. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  254. data/lib/alchemy/test_support/factories/page_factory.rb +2 -3
  255. data/lib/alchemy/test_support/factories/picture_factory.rb +30 -2
  256. data/lib/alchemy/test_support/factories/site_factory.rb +2 -2
  257. data/lib/alchemy/test_support/having_crop_action_examples.rb +2 -2
  258. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +80 -26
  259. data/lib/alchemy/test_support/shared_ingredient_examples.rb +5 -5
  260. data/lib/alchemy/upgrader/.keep +0 -0
  261. data/lib/alchemy/upgrader/eight_zero.rb +14 -0
  262. data/lib/alchemy/upgrader.rb +33 -20
  263. data/lib/alchemy/version.rb +1 -1
  264. data/lib/alchemy.rb +192 -170
  265. data/lib/alchemy_cms.rb +1 -7
  266. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +0 -3
  267. data/lib/generators/alchemy/install/files/_article.html.erb +6 -4
  268. data/lib/generators/alchemy/install/files/alchemy.en.yml +22 -3
  269. data/lib/generators/alchemy/install/files/application.html.erb +5 -0
  270. data/lib/generators/alchemy/install/install_generator.rb +5 -14
  271. data/lib/generators/alchemy/install/templates/alchemy.rb.tt +196 -0
  272. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +0 -1
  273. data/lib/generators/alchemy/install/templates/elements.yml.tt +3 -1
  274. data/lib/generators/alchemy/install/templates/menus.yml.tt +1 -1
  275. data/lib/generators/alchemy/install/templates/page_layouts.yml.tt +2 -2
  276. data/lib/generators/alchemy/page_layouts/page_layouts_generator.rb +2 -2
  277. data/lib/tasks/alchemy/assets.rake +14 -0
  278. data/lib/tasks/alchemy/upgrade.rake +12 -47
  279. data/vendor/javascript/tinymce.min.js +1 -1
  280. data/vitest.config.js +21 -0
  281. metadata +184 -180
  282. data/app/assets/builds/alchemy/admin/page-select.css.map +0 -1
  283. data/app/assets/builds/alchemy/admin/print.css.map +0 -1
  284. data/app/assets/builds/alchemy/admin.css.map +0 -1
  285. data/app/assets/builds/alchemy/custom-properties.css.map +0 -1
  286. data/app/assets/builds/alchemy/welcome.css.map +0 -1
  287. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css.map +0 -1
  288. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css.map +0 -1
  289. data/app/assets/javascripts/alchemy/admin.js +0 -10
  290. data/app/assets/stylesheets/alchemy/_defaults.scss +0 -3
  291. data/app/assets/stylesheets/alchemy/_deprecated_variables.scss +0 -45
  292. data/app/assets/stylesheets/alchemy/_deprecation.scss +0 -17
  293. data/app/assets/stylesheets/alchemy/_extends.scss +0 -62
  294. data/app/assets/stylesheets/alchemy/_variables.scss +0 -201
  295. data/app/assets/stylesheets/alchemy/admin/buttons.scss +0 -124
  296. data/app/assets/stylesheets/alchemy/admin/hints.scss +0 -5
  297. data/app/assets/stylesheets/alchemy/admin/labels.scss +0 -3
  298. data/app/assets/stylesheets/alchemy/admin/pagination.scss +0 -92
  299. data/app/assets/stylesheets/alchemy/admin.scss +0 -42
  300. data/app/assets/stylesheets/alchemy/custom-properties.css +0 -98
  301. data/app/assets/stylesheets/alchemy/welcome.scss +0 -57
  302. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.css +0 -711
  303. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.css +0 -705
  304. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.min.css +0 -7
  305. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.min.css +0 -7
  306. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.css +0 -29
  307. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.min.css +0 -7
  308. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.css +0 -677
  309. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.min.css +0 -7
  310. data/app/controllers/alchemy/elements_controller.rb +0 -32
  311. data/app/models/alchemy/element/dom_id.rb +0 -31
  312. data/app/models/alchemy/picture/calculations.rb +0 -49
  313. data/app/models/alchemy/picture/transformations.rb +0 -115
  314. data/app/views/alchemy/admin/attachments/destroy.js.erb +0 -1
  315. data/app/views/alchemy/admin/clipboard/clear.js.erb +0 -3
  316. data/app/views/alchemy/admin/clipboard/insert.js.erb +0 -29
  317. data/app/views/alchemy/admin/clipboard/remove.js.erb +0 -10
  318. data/app/views/alchemy/admin/resources/_filter.html.erb +0 -12
  319. data/app/views/alchemy/admin/resources/_resource.html.erb +0 -34
  320. data/app/views/alchemy/admin/resources/_table.html.erb +0 -29
  321. data/app/views/alchemy/elements/show.html.erb +0 -1
  322. data/app/views/alchemy/elements/show.js.erb +0 -1
  323. data/app/views/alchemy/ingredients/_audio_view.html.erb +0 -1
  324. data/app/views/alchemy/ingredients/_boolean_view.html.erb +0 -1
  325. data/app/views/alchemy/ingredients/_datetime_view.html.erb +0 -3
  326. data/app/views/alchemy/ingredients/_file_view.html.erb +0 -4
  327. data/app/views/alchemy/ingredients/_headline_view.html.erb +0 -4
  328. data/app/views/alchemy/ingredients/_html_view.html.erb +0 -1
  329. data/app/views/alchemy/ingredients/_link_view.html.erb +0 -4
  330. data/app/views/alchemy/ingredients/_node_view.html.erb +0 -1
  331. data/app/views/alchemy/ingredients/_page_view.html.erb +0 -1
  332. data/app/views/alchemy/ingredients/_picture_view.html.erb +0 -4
  333. data/app/views/alchemy/ingredients/_richtext_view.html.erb +0 -3
  334. data/app/views/alchemy/ingredients/_select_view.html.erb +0 -1
  335. data/app/views/alchemy/ingredients/_text_view.html.erb +0 -4
  336. data/app/views/alchemy/ingredients/_video_view.html.erb +0 -3
  337. data/babel.config.js +0 -12
  338. data/config/initializers/assets.rb +0 -4
  339. data/lib/alchemy/config.rb +0 -114
  340. data/lib/alchemy/element_definition.rb +0 -73
  341. data/lib/alchemy/page_layout.rb +0 -73
  342. data/lib/alchemy/resource_filter.rb +0 -40
  343. data/lib/alchemy/upgrader/seven_point_four.rb +0 -26
  344. data/lib/alchemy/upgrader/seven_point_three.rb +0 -52
  345. data/lib/generators/alchemy/ingredient/templates/view.html.erb +0 -1
  346. data/lib/generators/alchemy/install/files/alchemy_admin.js +0 -1
  347. data/lib/generators/alchemy/install/files/all.js +0 -11
  348. data/lib/generators/alchemy/install/files/article.css +0 -25
  349. data/vendor/assets/images/remixicon.symbol.svg +0 -11
  350. /data/app/{assets/stylesheets → stylesheets}/alchemy/_fonts.scss +0 -0
  351. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/attachment-select.scss +0 -0
  352. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/attachments.scss +0 -0
  353. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/flash.scss +0 -0
  354. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/list_filter.scss +0 -0
  355. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/node-select.scss +0 -0
  356. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/spinner.scss +0 -0
  357. /data/app/{assets/stylesheets → stylesheets}/tinymce/skins/skintool.json +0 -0
  358. /data/app/{assets/stylesheets → stylesheets}/tinymce/skins/ui/alchemy/fonts/tinymce-mobile.woff +0 -0
data/lib/alchemy.rb CHANGED
@@ -2,190 +2,212 @@
2
2
 
3
3
  require "alchemy/admin/preview_url"
4
4
  require "importmap-rails"
5
+ require "alchemy/configurations/main"
6
+ require "alchemy/config_missing"
5
7
 
6
8
  module Alchemy
9
+ include Alchemy::ConfigMissing
10
+ extend Alchemy::ConfigMissing
11
+
7
12
  YAML_PERMITTED_CLASSES = %w[Symbol Date Regexp]
8
13
 
9
- # Define page preview sources
10
- #
11
- # A preview source is a Ruby class returning an URL
12
- # that is used as source for the preview frame in the
13
- # admin UI.
14
- #
15
- # == Example
16
- #
17
- # # lib/acme/preview_source.rb
18
- # class Acme::PreviewSource < Alchemy::Admin::PreviewUrl
19
- # def url_for(page)
20
- # if page.site.name == "Next"
21
- # "https://user:#{ENV['PREVIEW_HTTP_PASS']}@next.acme.com"
22
- # else
23
- # "https://www.acme.com"
24
- # end
25
- # end
26
- # end
27
- #
28
- # # config/initializers/alchemy.rb
29
- # require "acme/preview_source"
30
- # Alchemy.preview_sources << Acme::PreviewSource
31
- #
32
- # # config/locales/de.yml
33
- # de:
34
- # activemodel:
35
- # models:
36
- # acme/preview_source: Acme Vorschau
37
- #
38
- def self.preview_sources
39
- @_preview_sources ||= Set.new << Alchemy::Admin::PreviewUrl
40
- end
14
+ # JS Importmap instance
15
+ singleton_class.attr_accessor :importmap
16
+ self.importmap = Importmap::Map.new
41
17
 
42
- def self.preview_sources=(sources)
43
- @_preview_sources = Array(sources)
44
- end
18
+ class << self
19
+ def config
20
+ @_config ||= Alchemy::Configurations::Main.new
21
+ end
45
22
 
46
- # Additional JS modules to be imported in the Alchemy admin UI
47
- #
48
- # Be sure to also pin the modules with +Alchemy.importmap+.
49
- #
50
- # == Example
51
- #
52
- # Alchemy.importmap.pin "flatpickr/de",
53
- # to: "https://ga.jspm.io/npm:flatpickr@4.6.13/dist/l10n/de.js"
54
- #
55
- # Alchemy.admin_js_imports << "flatpickr/de"
56
- #
57
- def self.admin_js_imports
58
- @_admin_js_imports ||= Set.new
59
- end
23
+ def configure(&blk)
24
+ yield config
25
+ end
60
26
 
61
- def self.admin_js_imports=(sources)
62
- @_admin_js_imports = Set[sources]
63
- end
27
+ enable_searchable_deprecation_msg = "Use `Alchemy.config.show_page_searchable_checkbox` instead."
28
+ def enable_searchable = config.show_page_searchable_checkbox
29
+ deprecate :enable_searchable= => enable_searchable_deprecation_msg, :deprecator => Alchemy::Deprecation
64
30
 
65
- # Additional importmaps to be included in the Alchemy admin UI
66
- #
67
- # Be sure to also pin modules with +Alchemy.importmap+.
68
- #
69
- # == Example
70
- #
71
- # # config/alchemy/importmap.rb
72
- # Alchemy.importmap.pin "alchemy_solidus", to: "alchemy_solidus.js", preload: true
73
- # Alchemy.importmap.pin_all_from Alchemy::Solidus::Engine.root.join("app/javascript/alchemy_solidus"),
74
- # under: "alchemy_solidus",
75
- # preload: true
76
- #
77
- # # lib/alchemy/solidus/engine.rb
78
- # initializer "alchemy_solidus.assets", before: "alchemy.importmap" do |app|
79
- # Alchemy.admin_importmaps.add({
80
- # importmap_path: root.join("config/importmap.rb"),
81
- # source_paths: [
82
- # root.join("app/javascript")
83
- # ],
84
- # name: "alchemy_solidus"
85
- # })
86
- # app.config.assets.precompile << "alchemy_solidus/manifest.js"
87
- # end
88
- #
89
- # @return [Set<Hash>]
90
- def self.admin_importmaps
91
- @_admin_importmaps ||= Set.new([{
92
- importmap_path: Engine.root.join("config/importmap.rb"),
93
- source_paths: [
94
- Engine.root.join("app/javascript"),
95
- Engine.root.join("vendor/javascript")
96
- ],
97
- name: "alchemy_admin"
98
- }])
99
- end
31
+ def enable_searchable=(other)
32
+ config.show_page_searchable_checkbox = other
33
+ end
34
+ deprecate enable_searchable: enable_searchable_deprecation_msg, deprecator: Alchemy::Deprecation
100
35
 
101
- # Additional stylesheets to be included in the Alchemy admin UI
102
- #
103
- # == Example
104
- #
105
- # # lib/alchemy/devise/engine.rb
106
- # initializer "alchemy.devise.stylesheets", before: "alchemy.admin_stylesheets" do
107
- # Alchemy.admin_stylesheets << "alchemy/devise/admin.css"
108
- # end
109
- #
110
- # @return [Set<String>]
111
- def self.admin_stylesheets
112
- @_admin_stylesheets ||= Set.new(["alchemy/admin/custom.css"])
113
- end
36
+ # Define page preview sources
37
+ #
38
+ # A preview source is a Ruby class returning an URL
39
+ # that is used as source for the preview frame in the
40
+ # admin UI.
41
+ #
42
+ # == Example
43
+ #
44
+ # # lib/acme/preview_source.rb
45
+ # class Acme::PreviewSource < Alchemy::Admin::PreviewUrl
46
+ # def url_for(page)
47
+ # if page.site.name == "Next"
48
+ # "https://user:#{ENV['PREVIEW_HTTP_PASS']}@next.acme.com"
49
+ # else
50
+ # "https://www.acme.com"
51
+ # end
52
+ # end
53
+ # end
54
+ #
55
+ # # config/initializers/alchemy.rb
56
+ # require "acme/preview_source"
57
+ # Alchemy.preview_sources << Acme::PreviewSource
58
+ #
59
+ # # config/locales/de.yml
60
+ # de:
61
+ # activemodel:
62
+ # models:
63
+ # acme/preview_source: Acme Vorschau
64
+ #
65
+ def preview_sources
66
+ @_preview_sources ||= Set.new << Alchemy::Admin::PreviewUrl
67
+ end
114
68
 
115
- # Define page publish targets
116
- #
117
- # A publish target is a ActiveJob that gets performed
118
- # whenever a user clicks the publish page button.
119
- #
120
- # Use this to trigger deployment hooks of external
121
- # services in an asychronous way.
122
- #
123
- # == Example
124
- #
125
- # # app/jobs/publish_job.rb
126
- # class PublishJob < ApplicationJob
127
- # def perform(page)
128
- # RestClient.post(ENV['BUILD_HOOK_URL'])
129
- # end
130
- # end
131
- #
132
- # # config/initializers/alchemy.rb
133
- # Alchemy.publish_targets << PublishJob
134
- #
135
- def self.publish_targets
136
- @_publish_targets ||= Set.new
137
- end
69
+ def preview_sources=(sources)
70
+ @_preview_sources = Array(sources)
71
+ end
138
72
 
139
- # Enable full text search configuration
140
- #
141
- # It enables a searchable checkbox in the page form to toggle
142
- # the searchable field. These information can used in a search
143
- # plugin (e.g. https://github.com/AlchemyCMS/alchemy-pg_search).
144
- #
145
- # == Example
146
- #
147
- # # config/initializers/alchemy.rb
148
- # Alchemy.enable_searchable = true
149
- #
150
- mattr_accessor :enable_searchable, default: false
73
+ # Additional JS modules to be imported in the Alchemy admin UI
74
+ #
75
+ # Be sure to also pin the modules with +Alchemy.importmap+.
76
+ #
77
+ # == Example
78
+ #
79
+ # Alchemy.importmap.pin "flatpickr/de",
80
+ # to: "https://ga.jspm.io/npm:flatpickr@4.6.13/dist/l10n/de.js"
81
+ #
82
+ # Alchemy.admin_js_imports << "flatpickr/de"
83
+ #
84
+ def admin_js_imports
85
+ @_admin_js_imports ||= Set.new
86
+ end
151
87
 
152
- # JS Importmap instance
153
- singleton_class.attr_accessor :importmap
154
- self.importmap = Importmap::Map.new
88
+ def admin_js_imports=(sources)
89
+ @_admin_js_imports = Set[sources]
90
+ end
155
91
 
156
- # Configure tabs in the link dialog
157
- #
158
- # With this configuration that tabs in the link dialog can be extended
159
- # without overwriting or defacing the Admin Interface.
160
- #
161
- # == Example
162
- #
163
- # # components/acme/link_tab.rb
164
- # module Acme
165
- # class LinkTab < ::Alchemy::Admin::LinkDialog::BaseTab
166
- # def title
167
- # "Awesome Tab Title"
168
- # end
169
- #
170
- # def name
171
- # :unique_name
172
- # end
173
- #
174
- # def fields
175
- # [ title_input, target_select ]
176
- # end
177
- # end
178
- # end
92
+ # Additional importmaps to be included in the Alchemy admin UI
93
+ #
94
+ # Be sure to also pin modules with +Alchemy.importmap+.
95
+ #
96
+ # == Example
97
+ #
98
+ # # config/alchemy/importmap.rb
99
+ # Alchemy.importmap.pin "alchemy_solidus", to: "alchemy_solidus.js", preload: true
100
+ # Alchemy.importmap.pin_all_from Alchemy::Solidus::Engine.root.join("app/javascript/alchemy_solidus"),
101
+ # under: "alchemy_solidus",
102
+ # preload: true
103
+ #
104
+ # # lib/alchemy/solidus/engine.rb
105
+ # initializer "alchemy_solidus.assets", before: "alchemy.importmap" do |app|
106
+ # Alchemy.admin_importmaps.add({
107
+ # importmap_path: root.join("config/importmap.rb"),
108
+ # source_paths: [
109
+ # root.join("app/javascript")
110
+ # ],
111
+ # name: "alchemy_solidus"
112
+ # })
113
+ # app.config.assets.precompile << "alchemy_solidus/manifest.js"
114
+ # end
115
+ #
116
+ # @return [Set<Hash>]
117
+ def admin_importmaps
118
+ @_admin_importmaps ||= Set.new([{
119
+ importmap_path: Engine.root.join("config/importmap.rb"),
120
+ source_paths: [
121
+ Engine.root.join("app/javascript"),
122
+ Engine.root.join("vendor/javascript")
123
+ ],
124
+ name: "alchemy_admin"
125
+ }])
126
+ end
127
+
128
+ # Additional stylesheets to be included in the Alchemy admin UI
129
+ #
130
+ # == Example
131
+ #
132
+ # # lib/alchemy/devise/engine.rb
133
+ # initializer "alchemy.devise.stylesheets", before: "alchemy.admin_stylesheets" do
134
+ # Alchemy.admin_stylesheets << "alchemy/devise/admin.css"
135
+ # end
136
+ #
137
+ # @return [Set<String>]
138
+ def admin_stylesheets
139
+ @_admin_stylesheets ||= Set.new(["alchemy/admin/custom.css"])
140
+ end
141
+
142
+ # Define page publish targets
143
+ #
144
+ # A publish target is a ActiveJob that gets performed
145
+ # whenever a user clicks the publish page button.
146
+ #
147
+ # Use this to trigger deployment hooks of external
148
+ # services in an asychronous way.
149
+ #
150
+ # == Example
151
+ #
152
+ # # app/jobs/publish_job.rb
153
+ # class PublishJob < ApplicationJob
154
+ # def perform(page)
155
+ # RestClient.post(ENV['BUILD_HOOK_URL'])
156
+ # end
157
+ # end
158
+ #
159
+ # # config/initializers/alchemy.rb
160
+ # Alchemy.publish_targets << PublishJob
161
+ #
162
+ def publish_targets
163
+ @_publish_targets ||= Set.new
164
+ end
165
+
166
+ # Configure tabs in the link dialog
167
+ #
168
+ # With this configuration that tabs in the link dialog can be extended
169
+ # without overwriting or defacing the Admin Interface.
170
+ #
171
+ # == Example
172
+ #
173
+ # # components/acme/link_tab.rb
174
+ # module Acme
175
+ # class LinkTab < ::Alchemy::Admin::LinkDialog::BaseTab
176
+ # def title
177
+ # "Awesome Tab Title"
178
+ # end
179
+ #
180
+ # def name
181
+ # :unique_name
182
+ # end
183
+ #
184
+ # def fields
185
+ # [ title_input, target_select ]
186
+ # end
187
+ # end
188
+ # end
189
+ #
190
+ # # config/initializers/alchemy.rb
191
+ # Alchemy.link_dialog_tabs << Acme::LinkTab
192
+ #
193
+ def link_dialog_tabs
194
+ @_link_dialog_tabs ||= Set.new([
195
+ Alchemy::Admin::LinkDialog::InternalTab,
196
+ Alchemy::Admin::LinkDialog::AnchorTab,
197
+ Alchemy::Admin::LinkDialog::ExternalTab,
198
+ Alchemy::Admin::LinkDialog::FileTab
199
+ ])
200
+ end
201
+ end
202
+
203
+ # The storage adapter for Pictures and Attachments
179
204
  #
180
- # # config/initializers/alchemy.rb
181
- # Alchemy.link_dialog_tabs << Acme::LinkTab
205
+ # Chose between 'active_storage' (default) or 'dragonfly' (legacy)
182
206
  #
183
- def self.link_dialog_tabs
184
- @_link_dialog_tabs ||= Set.new([
185
- Alchemy::Admin::LinkDialog::InternalTab,
186
- Alchemy::Admin::LinkDialog::AnchorTab,
187
- Alchemy::Admin::LinkDialog::ExternalTab,
188
- Alchemy::Admin::LinkDialog::FileTab
189
- ])
207
+ # Can be set via 'ALCHEMY_STORAGE_ADAPTER' env var.
208
+ def self.storage_adapter
209
+ @_storage_adapter ||= Alchemy::StorageAdapter.new(
210
+ ENV.fetch("ALCHEMY_STORAGE_ADAPTER", Alchemy.config.storage_adapter)
211
+ )
190
212
  end
191
213
  end
data/lib/alchemy_cms.rb CHANGED
@@ -7,16 +7,15 @@ require "alchemy"
7
7
  require "acts_as_list"
8
8
  require "action_view/dependency_tracker"
9
9
  require "active_model_serializers"
10
+ require "active_storage/engine"
10
11
  require "awesome_nested_set"
11
12
  require "cancan"
12
13
  require "dragonfly"
13
14
  require "gutentag"
14
15
  require "importmap-rails"
15
16
  require "kaminari"
16
- require "non_stupid_digest_assets"
17
17
  require "ransack"
18
18
  require "simple_form"
19
- require "sprockets/rails"
20
19
  require "turbo-rails"
21
20
  require "userstamp"
22
21
  require "view_component"
@@ -27,11 +26,9 @@ require_relative "alchemy/admin/locale"
27
26
  require_relative "alchemy/admin/preview_url"
28
27
  require_relative "alchemy/auth_accessors"
29
28
  require_relative "alchemy/cache_digests/template_tracker"
30
- require_relative "alchemy/config"
31
29
  require_relative "alchemy/configuration_methods"
32
30
  require_relative "alchemy/controller_actions"
33
31
  require_relative "alchemy/deprecation"
34
- require_relative "alchemy/element_definition"
35
32
  require_relative "alchemy/elements_finder"
36
33
  require_relative "alchemy/error_tracking"
37
34
  require_relative "alchemy/errors"
@@ -44,11 +41,8 @@ require_relative "alchemy/modules"
44
41
  require_relative "alchemy/name_conversions"
45
42
  require_relative "alchemy/on_page_layout"
46
43
  require_relative "alchemy/on_page_layout/callbacks_runner"
47
- require_relative "alchemy/page_layout"
48
44
  require_relative "alchemy/paths"
49
45
  require_relative "alchemy/permissions"
50
- require_relative "alchemy/resource"
51
- require_relative "alchemy/searchable_resource"
52
46
  require_relative "alchemy/tinymce"
53
47
  require_relative "alchemy/taggable"
54
48
  require_relative "alchemy/version"
@@ -24,9 +24,6 @@ module Alchemy
24
24
 
25
25
  def copy_templates
26
26
  @ingredient_editor_local = "#{file_name}_editor"
27
- @ingredient_view_local = "#{file_name}_view"
28
- @ingredient_view_component_class = "#{@class_name}View"
29
- template "view.html.erb", "#{@ingredients_view_path}/_#{file_name}_view.html.erb"
30
27
  template "editor.html.erb", "#{@ingredients_view_path}/_#{file_name}_editor.html.erb"
31
28
  end
32
29
 
@@ -1,7 +1,9 @@
1
1
  <%- cache(article) do -%>
2
- <%= element_view_for(article, tag: 'article') do |el| -%>
3
- <h2><%= el.render :headline %></h2>
4
- <%= el.render :picture, size: '1200x600' %>
5
- <%= el.render :text %>
2
+ <%= element_view_for(article, tag: "article", class: "w-full max-w-xl mx-auto bg-slate-100 shadow my-8 px-8 py-4 rounded") do |el| -%>
3
+ <%= el.render :headline, {}, class: "text-2xl font-bold my-4" %>
4
+ <%= el.render :picture %>
5
+ <div class="[&>p]:my-2 [&>h2]:font-bold [&>h2]:text-xl [&>h2]:my-4 [&>h3]:font-bold [&>h3]:my-2 [&>ul]:list-disc [&>ul]:ml-4 [&>p>a]:underline [&>p>code]:text-sm [&>p>code]:bg-gray-50 [&>p>code]:p-1 [&>p>code]:whitespace-nowrap">
6
+ <%= el.render :text %>
7
+ </div>
6
8
  <%- end -%>
7
9
  <%- end -%>
@@ -17,14 +17,33 @@ en:
17
17
  # Default texts for new ingredients created
18
18
  default_ingredient_texts:
19
19
  article_headline: "Welcome to your first Alchemy CMS page"
20
- article_text: '<p><strong>How to get started.</strong></p><p>First of all you should read about Alchemy and its architecture in the <a class="external" href="http://guides.alchemy-cms.com/alchemy_approach.html" target="_blank" data-link-target="blank">guidelines</a>.</p><p>The most important things to know about Alchemy are elements and page layouts.</p><p><span style="text-decoration: underline;"><strong>Elements:</strong></span></p><p>With Alchemy you can split pages into content parts, elements. These elements can be defined out of several base content types: ingredients. The ingredients are:</p><ul><li>Text - <em>A single line of text</em></li><li>Richtext - <em>A TinyMCE powered formatted text block</em></li><li>Picture - <em>A reference to an image</em></li><li>Html - <em>HTML embed code</em></li><li>Select - <em>A selection of values</em></li><li>Boolean - <em>A checkbox</em></li></ul><p>Elements get defined in a YAML file <strong>config/alchemy/elements.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/elements.html" target="_blank" data-link-target="blank">Read more about elements and how to define them in the guidelines.</a></p><p><span style="text-decoration: underline;"><strong>Page types:</strong></span></p><p>You can define several types of pages, called page layouts. You can assign elements to page layouts and control how elements and the page of a certain layout behave.</p><p>Page layouts get defined in a YAML file <strong>config/alchemy/page_layouts.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/page_layouts.html" target="_blank" data-link-target="blank">Read more about defining page layouts in the guidelines.</a></p>'
20
+ article_text: |
21
+ <h2>How to get started.</h2>
22
+ <p>First of all you should read about Alchemy and it's architecture <a class="external" href="https://guides.alchemy-cms.com/alchemy_approach.html" target="_blank" rel="noopener" data-link-target="blank">in the guidelines</a>.</p>
23
+ <p>The most important things to know about Alchemy are elements and page layouts.</p>
24
+ <h3>Elements:</h3>
25
+ <p>With Alchemy you can split pages into content parts, elements. These elements can be defined out of several base content types: ingredients. The ingredients are:</p>
26
+ <ul>
27
+ <li>Text - <em>A single line of text</em></li>
28
+ <li>Richtext - <em>A TinyMCE powered formatted text block</em></li>
29
+ <li>Picture - <em>A reference to an image</em></li>
30
+ <li>Html - <em>HTML embed code</em></li>
31
+ <li>Select - <em>A selection of values</em></li>
32
+ <li>Boolean - <em>A checkbox</em></li>
33
+ </ul>
34
+ <p>Elements get defined in <code>config/alchemy/elements.yml</code>.</p>
35
+ <p>Read more about elements and how to define them <a class="external" href="https://guides.alchemy-cms.com/elements.html" target="_blank" rel="noopener" data-link-target="blank">in the guidelines</a>.</p>
36
+ <h3>Page types:</h3>
37
+ <p>You can define several types of pages, called page layouts. You can assign elements to page layouts and control how elements and the page of a certain layout behave.</p>
38
+ <p>Page layouts get defined in <code>config/alchemy/page_layouts.yml</code>.</p>
39
+ <p>Read more about defining page layouts <a class="external" href="https://guides.alchemy-cms.com/page_layouts.html" target="_blank" rel="noopener" data-link-target="blank">in the guidelines</a>.</p>
21
40
 
22
41
  # Hint texts for elements
23
42
  element_hints:
24
- article: "This is a hint text for the article element. You can change this text in `config/locales/alchemy.en.yml`. Feel free to change it as you like, it's yours."
43
+ article: "This is a hint text for the article element. You can change this text in <code>config/locales/alchemy.en.yml</code>. Feel free to change it as you like, it's yours."
25
44
 
26
45
  # Hint texts for ingredients
27
46
  ingredient_hints:
28
47
  headline: "This is a single line of unformatable Text"
29
48
  picture: "Pictures are stored in the library. You can assign a picture multiple times throughout your site. Alchemy has an image cropper build right in."
30
- text: "This is a rich text block powered by TinyMCE editor. You can change the configuration of the editor. See http://guides.alchemy-cms.com/customize_tinymce.html"
49
+ text: "This is a rich text block powered by TinyMCE editor. You can change the configuration of the editor. See https://guides.alchemy-cms.com/customize_tinymce.html"
@@ -7,6 +7,11 @@
7
7
 
8
8
  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbo-track': 'reload' %>
9
9
  <%= javascript_include_tag 'application', 'data-turbo-track': 'reload' %>
10
+ <!--
11
+ Inserted by Alchemy demo file installer.
12
+ You probably want to remove this and use your custom css.
13
+ -->
14
+ <script src="https://cdn.tailwindcss.com"></script>
10
15
  </head>
11
16
 
12
17
  <body>
@@ -53,18 +53,18 @@ module Alchemy
53
53
  install_tasks.inject_routes(options[:auto_accept])
54
54
  end
55
55
 
56
- def copy_config
57
- copy_file "#{gem_config_path}/config.yml", app_config_path.join("alchemy", "config.yml")
58
- end
59
-
60
56
  def copy_yml_files
61
57
  %w[elements page_layouts menus].each do |file|
62
58
  template "#{__dir__}/templates/#{file}.yml.tt", app_config_path.join("alchemy", "#{file}.yml")
63
59
  end
64
60
  end
65
61
 
62
+ def copy_config_rb
63
+ @default_config = Alchemy::Configurations::Main.new
64
+ template "#{__dir__}/templates/alchemy.rb.tt", app_config_path.join("initializers", "alchemy.rb")
65
+ end
66
+
66
67
  def install_assets
67
- copy_file "all.js", app_vendor_assets_path.join("javascripts", "alchemy", "admin", "all.js")
68
68
  copy_file "custom.css", app_assets_path.join("stylesheets/alchemy/admin/custom.css")
69
69
  end
70
70
 
@@ -72,15 +72,6 @@ module Alchemy
72
72
  return if options[:skip_demo_files]
73
73
 
74
74
  copy_file "application.html.erb", app_views_path.join("layouts", "application.html.erb")
75
- copy_file "article.css", app_assets_path.join("stylesheets", "alchemy", "elements", "_article.css")
76
-
77
- stylesheet_require = %(@import "alchemy/elements/article";\n)
78
- if File.exist?(app_assets_path.join("stylesheets", "application.css"))
79
- prepend_file app_assets_path.join("stylesheets", "application.css"), stylesheet_require
80
- else
81
- create_file app_assets_path.join("stylesheets", "application.css"), stylesheet_require
82
- end
83
-
84
75
  copy_file "_article.html.erb", app_views_path.join("alchemy", "elements", "_article.html.erb")
85
76
  copy_file "_standard.html.erb", app_views_path.join("alchemy", "page_layouts", "_standard.html.erb")
86
77
  copy_file "alchemy.en.yml", app_config_path.join("locales", "alchemy.en.yml")