alchemy_cms 7.4.10 → 8.0.0.b

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 (425) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -5
  3. data/app/assets/builds/alchemy/admin/page-select.css +1 -1
  4. data/app/assets/builds/alchemy/admin/print.css +1 -1
  5. data/app/assets/builds/alchemy/admin.css +2 -2
  6. data/app/assets/builds/alchemy/dark-theme.css +1 -0
  7. data/app/assets/builds/alchemy/light-theme.css +1 -0
  8. data/app/assets/builds/alchemy/theme.css +1 -0
  9. data/app/assets/builds/alchemy/welcome.css +1 -1
  10. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css +1 -1
  11. data/app/assets/builds/tinymce/skins/content/alchemy-dark/content.min.css +1 -0
  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/builds/tinymce/skins/ui/alchemy-dark/content.min.css +1 -0
  15. data/app/assets/builds/tinymce/skins/ui/alchemy-dark/skin.min.css +1 -0
  16. data/app/assets/config/alchemy_manifest.js +0 -2
  17. data/app/assets/images/alchemy/element_icons/default.svg +1 -0
  18. data/app/assets/images/alchemy/icons-sprite.svg +1 -0
  19. data/app/components/alchemy/admin/element_select.rb +39 -0
  20. data/app/components/alchemy/admin/resource/applied_filter.rb +29 -0
  21. data/app/components/alchemy/admin/resource/checkbox_filter.rb +36 -0
  22. data/app/components/alchemy/admin/resource/datepicker_filter.rb +42 -0
  23. data/app/components/alchemy/admin/resource/select_filter.rb +43 -0
  24. data/app/components/alchemy/admin/toolbar_button.rb +5 -2
  25. data/app/components/alchemy/ingredients/number_view.rb +18 -0
  26. data/app/controllers/alchemy/admin/attachments_controller.rb +10 -15
  27. data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -6
  28. data/app/controllers/alchemy/admin/elements_controller.rb +3 -1
  29. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  30. data/app/controllers/alchemy/admin/pages_controller.rb +15 -15
  31. data/app/controllers/alchemy/admin/pictures_controller.rb +27 -37
  32. data/app/controllers/alchemy/admin/resources_controller.rb +16 -106
  33. data/app/controllers/alchemy/attachments_controller.rb +43 -14
  34. data/app/controllers/alchemy/messages_controller.rb +1 -1
  35. data/app/controllers/alchemy/pages_controller.rb +26 -4
  36. data/app/controllers/concerns/alchemy/admin/resource_filter.rb +93 -0
  37. data/app/decorators/alchemy/element_editor.rb +5 -48
  38. data/app/decorators/alchemy/ingredient_editor.rb +3 -53
  39. data/app/helpers/alchemy/admin/attachments_helper.rb +5 -5
  40. data/app/helpers/alchemy/admin/base_helper.rb +14 -84
  41. data/app/helpers/alchemy/admin/pages_helper.rb +1 -1
  42. data/app/helpers/alchemy/base_helper.rb +0 -30
  43. data/app/helpers/alchemy/elements_block_helper.rb +0 -14
  44. data/app/helpers/alchemy/pages_helper.rb +1 -1
  45. data/{lib → app/helpers}/alchemy/resources_helper.rb +5 -45
  46. data/app/javascript/alchemy_admin/components/action.js +2 -0
  47. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +3 -3
  48. data/app/javascript/alchemy_admin/components/auto_submit.js +20 -0
  49. data/app/javascript/alchemy_admin/components/datepicker.js +18 -7
  50. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +8 -7
  51. data/app/javascript/alchemy_admin/components/element_editor.js +25 -15
  52. data/app/javascript/alchemy_admin/components/element_select.js +43 -0
  53. data/app/javascript/alchemy_admin/components/index.js +3 -0
  54. data/app/javascript/alchemy_admin/components/link_buttons.js +6 -2
  55. data/app/javascript/alchemy_admin/components/remote_select.js +9 -2
  56. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +5 -1
  57. data/app/javascript/alchemy_admin/components/tinymce.js +93 -14
  58. data/app/javascript/alchemy_admin/components/update_check.js +42 -0
  59. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +15 -8
  60. data/app/javascript/alchemy_admin/components/uploader/progress.js +12 -6
  61. data/app/javascript/alchemy_admin/components/uploader.js +4 -2
  62. data/app/javascript/alchemy_admin/confirm_dialog.js +27 -57
  63. data/app/javascript/alchemy_admin/dialog.js +1 -1
  64. data/app/javascript/alchemy_admin/dirty.js +3 -2
  65. data/app/javascript/alchemy_admin/file_editors.js +1 -1
  66. data/app/javascript/alchemy_admin/i18n.js +15 -16
  67. data/app/javascript/alchemy_admin/image_loader.js +4 -2
  68. data/app/javascript/alchemy_admin/initializer.js +1 -49
  69. data/app/javascript/alchemy_admin/picture_editors.js +7 -4
  70. data/app/javascript/alchemy_admin/picture_selector.js +4 -4
  71. data/app/javascript/alchemy_admin/utils/ajax.js +51 -44
  72. data/app/javascript/alchemy_admin.js +3 -8
  73. data/app/jobs/alchemy/delete_picture_job.rb +12 -0
  74. data/app/models/alchemy/admin/filters/base.rb +38 -0
  75. data/app/models/alchemy/admin/filters/checkbox.rb +24 -0
  76. data/app/models/alchemy/admin/filters/datepicker.rb +53 -0
  77. data/app/models/alchemy/admin/filters/select.rb +70 -0
  78. data/app/models/alchemy/admin/resource_name.rb +27 -0
  79. data/app/models/alchemy/attachment.rb +49 -44
  80. data/app/models/alchemy/base_record.rb +2 -0
  81. data/app/models/alchemy/element/definitions.rb +1 -1
  82. data/app/models/alchemy/element/element_ingredients.rb +6 -6
  83. data/app/models/alchemy/element/presenters.rb +3 -12
  84. data/app/models/alchemy/element.rb +10 -27
  85. data/app/models/alchemy/element_definition.rb +190 -0
  86. data/app/models/alchemy/ingredient.rb +10 -43
  87. data/app/models/alchemy/ingredient_definition.rb +134 -0
  88. data/app/models/alchemy/ingredient_validator.rb +7 -3
  89. data/app/models/alchemy/ingredients/number.rb +19 -0
  90. data/app/models/alchemy/language.rb +2 -21
  91. data/app/models/alchemy/message.rb +3 -7
  92. data/app/models/alchemy/node.rb +1 -1
  93. data/app/models/alchemy/page/{page_layouts.rb → definitions.rb} +12 -19
  94. data/app/models/alchemy/page/fixed_attributes.rb +1 -1
  95. data/app/models/alchemy/page/page_elements.rb +13 -14
  96. data/app/models/alchemy/page/page_naming.rb +3 -11
  97. data/app/models/alchemy/page/page_natures.rb +20 -15
  98. data/app/models/alchemy/page/page_scopes.rb +1 -1
  99. data/app/models/alchemy/page.rb +12 -39
  100. data/app/models/alchemy/page_definition.rb +115 -0
  101. data/app/models/alchemy/picture.rb +71 -99
  102. data/app/models/alchemy/picture_variant.rb +115 -5
  103. data/{lib → app/models}/alchemy/resource.rb +4 -18
  104. data/{lib → app/models}/alchemy/searchable_resource.rb +15 -0
  105. data/app/models/alchemy/site/layout.rb +5 -5
  106. data/app/models/alchemy/site.rb +1 -21
  107. data/app/models/alchemy/storage_adapter/active_storage/attachment_url.rb +41 -0
  108. data/app/models/alchemy/storage_adapter/active_storage/picture_url.rb +55 -0
  109. data/app/models/alchemy/storage_adapter/active_storage/preprocessor.rb +40 -0
  110. data/app/models/alchemy/storage_adapter/active_storage.rb +173 -0
  111. data/app/models/alchemy/{attachment/url.rb → storage_adapter/dragonfly/attachment_url.rb} +12 -12
  112. data/app/models/alchemy/storage_adapter/dragonfly/picture_url.rb +75 -0
  113. data/app/models/alchemy/{picture → storage_adapter/dragonfly}/preprocessor.rb +4 -4
  114. data/app/models/alchemy/storage_adapter/dragonfly.rb +205 -0
  115. data/app/models/alchemy/storage_adapter.rb +74 -0
  116. data/app/models/concerns/alchemy/picture_thumbnails.rb +19 -6
  117. data/app/models/concerns/alchemy/relatable_resource.rb +28 -0
  118. data/app/serializers/alchemy/element_serializer.rb +0 -1
  119. data/app/services/alchemy/dragonfly_to_image_processing.rb +100 -0
  120. data/app/stylesheets/alchemy/_custom-properties.scss +162 -0
  121. data/app/stylesheets/alchemy/_defaults.scss +3 -0
  122. data/app/stylesheets/alchemy/_extends.scss +69 -0
  123. data/app/{assets/stylesheets → stylesheets}/alchemy/_mixins.scss +40 -68
  124. data/app/stylesheets/alchemy/_themes.scss +540 -0
  125. data/app/stylesheets/alchemy/_variables.scss +5 -0
  126. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/archive.scss +45 -42
  127. data/app/stylesheets/alchemy/admin/attachments.scss +17 -0
  128. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/base.scss +20 -15
  129. data/app/stylesheets/alchemy/admin/buttons.scss +135 -0
  130. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/clipboard.scss +2 -2
  131. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/dashboard.scss +13 -16
  132. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/dialogs.scss +33 -16
  133. data/app/stylesheets/alchemy/admin/element-select.scss +11 -0
  134. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/elements.scss +239 -133
  135. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/errors.scss +5 -5
  136. data/app/stylesheets/alchemy/admin/filters.scss +57 -0
  137. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/flatpickr.scss +54 -76
  138. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/form_fields.scss +10 -11
  139. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/forms.scss +28 -21
  140. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/frame.scss +20 -18
  141. data/app/stylesheets/alchemy/admin/hints.scss +5 -0
  142. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/icons.scss +1 -1
  143. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/image_library.scss +21 -61
  144. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/images.scss +1 -1
  145. data/app/stylesheets/alchemy/admin/labels.scss +5 -0
  146. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/lists.scss +3 -3
  147. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/navigation.scss +55 -59
  148. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/node-select.scss +1 -10
  149. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/nodes.scss +21 -18
  150. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/notices.scss +20 -19
  151. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/page-select.scss +18 -2
  152. data/app/stylesheets/alchemy/admin/pagination.scss +137 -0
  153. data/app/stylesheets/alchemy/admin/preview_window.scss +46 -0
  154. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/print.scss +1 -1
  155. data/app/stylesheets/alchemy/admin/resource_info.scss +148 -0
  156. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/search.scss +10 -7
  157. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/selects.scss +85 -46
  158. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/shoelace.scss +37 -68
  159. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/sitemap.scss +39 -34
  160. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/tables.scss +9 -7
  161. data/app/stylesheets/alchemy/admin/tags.scss +143 -0
  162. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/toolbar.scss +6 -6
  163. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/typography.scss +3 -6
  164. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/upload.scss +7 -5
  165. data/app/stylesheets/alchemy/admin.scss +44 -0
  166. data/app/stylesheets/alchemy/dark-theme.scss +5 -0
  167. data/app/stylesheets/alchemy/light-theme.scss +6 -0
  168. data/app/stylesheets/alchemy/theme.scss +13 -0
  169. data/app/stylesheets/alchemy/welcome.scss +75 -0
  170. data/app/stylesheets/tinymce/skins/content/alchemy/content.scss +69 -0
  171. data/app/{assets/stylesheets/tinymce/skins/content/alchemy → stylesheets/tinymce/skins/content/alchemy-dark}/content.scss +12 -12
  172. data/app/stylesheets/tinymce/skins/ui/alchemy/content.scss +1 -0
  173. data/app/{assets/stylesheets → stylesheets}/tinymce/skins/ui/alchemy/skin.scss +158 -176
  174. data/app/stylesheets/tinymce/skins/ui/alchemy-dark/content.scss +1 -0
  175. data/app/stylesheets/tinymce/skins/ui/alchemy-dark/skin.scss +3784 -0
  176. data/app/views/alchemy/admin/attachments/_files_list.html.erb +22 -12
  177. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  178. data/app/views/alchemy/admin/attachments/assign.js.erb +4 -3
  179. data/app/views/alchemy/admin/attachments/show.html.erb +55 -43
  180. data/app/views/alchemy/admin/{elements/_clipboard_button.html.erb → clipboard/_button.html.erb} +3 -5
  181. data/app/views/alchemy/admin/clipboard/_update_nested_element_button.turbo_stream.erb +11 -0
  182. data/app/views/alchemy/admin/clipboard/clear.turbo_stream.erb +4 -0
  183. data/app/views/alchemy/admin/clipboard/index.html.erb +15 -13
  184. data/app/views/alchemy/admin/clipboard/insert.turbo_stream.erb +18 -0
  185. data/app/views/alchemy/admin/clipboard/remove.turbo_stream.erb +9 -0
  186. data/app/views/alchemy/admin/crop.html.erb +1 -1
  187. data/app/views/alchemy/admin/dashboard/info.html.erb +17 -31
  188. data/app/views/alchemy/admin/elements/_element.html.erb +4 -8
  189. data/app/views/alchemy/admin/elements/_form.html.erb +9 -9
  190. data/app/views/alchemy/admin/elements/_header.html.erb +5 -1
  191. data/app/views/alchemy/admin/elements/_toolbar.html.erb +4 -6
  192. data/app/views/alchemy/admin/elements/create.turbo_stream.erb +2 -1
  193. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  194. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +3 -16
  195. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +0 -9
  196. data/app/views/alchemy/admin/languages/_form.html.erb +1 -1
  197. data/app/views/alchemy/admin/languages/_table.html.erb +1 -1
  198. data/app/views/alchemy/admin/languages/index.html.erb +5 -2
  199. data/app/views/alchemy/admin/layoutpages/index.html.erb +1 -12
  200. data/app/views/alchemy/admin/pages/_form.html.erb +2 -2
  201. data/app/views/alchemy/admin/pages/_page.html.erb +2 -3
  202. data/app/views/alchemy/admin/pages/_toolbar.html.erb +1 -15
  203. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  204. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -12
  205. data/app/views/alchemy/admin/partials/_search_form.html.erb +4 -9
  206. data/app/views/alchemy/admin/pictures/_archive.html.erb +16 -29
  207. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +3 -7
  208. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -1
  209. data/app/views/alchemy/admin/pictures/_form.html.erb +1 -1
  210. data/app/views/alchemy/admin/pictures/_infos.html.erb +21 -52
  211. data/app/views/alchemy/admin/pictures/_library_sidebar.html.erb +7 -0
  212. data/app/views/alchemy/admin/pictures/_picture.html.erb +14 -20
  213. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +20 -16
  214. data/app/views/alchemy/admin/pictures/_sorting_select.html.erb +13 -0
  215. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +1 -1
  216. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +1 -6
  217. data/app/views/alchemy/admin/pictures/index.html.erb +5 -19
  218. data/app/views/alchemy/admin/pictures/show.html.erb +10 -5
  219. data/app/views/alchemy/admin/resources/_applied_filters.html.erb +8 -0
  220. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +5 -25
  221. data/app/views/alchemy/admin/resources/_pagination.html.erb +6 -0
  222. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +4 -2
  223. data/app/views/alchemy/admin/resources/_resource_table.html.erb +1 -1
  224. data/app/views/alchemy/admin/resources/_resource_usage_info.html.erb +36 -0
  225. data/app/views/alchemy/admin/resources/_table_header.html.erb +1 -15
  226. data/app/views/alchemy/admin/sites/index.html.erb +5 -1
  227. data/app/views/alchemy/admin/styleguide/index.html.erb +118 -58
  228. data/app/views/alchemy/admin/tags/index.html.erb +1 -1
  229. data/app/views/alchemy/admin/tinymce/_setup.html.erb +7 -7
  230. data/app/{javascript/alchemy_admin/locales/en.js → views/alchemy/admin/translations/_en.js} +5 -2
  231. data/app/views/alchemy/admin/uploader/_button.html.erb +1 -1
  232. data/app/views/alchemy/admin/uploader/_setup.html.erb +4 -4
  233. data/app/views/alchemy/base/error_notice.html.erb +1 -1
  234. data/app/views/alchemy/ingredients/_number_editor.html.erb +24 -0
  235. data/app/views/alchemy/no_index.html.erb +31 -0
  236. data/app/views/alchemy/welcome.html.erb +12 -10
  237. data/app/views/kaminari/alchemy/_first_page.html.erb +5 -3
  238. data/app/views/kaminari/alchemy/_last_page.html.erb +5 -3
  239. data/app/views/kaminari/alchemy/_next_page.html.erb +5 -3
  240. data/app/views/kaminari/alchemy/_paginator.html.erb +18 -13
  241. data/app/views/kaminari/alchemy/_prev_page.html.erb +5 -3
  242. data/app/views/layouts/alchemy/admin.html.erb +25 -24
  243. data/config/alchemy/config.yml +3 -2
  244. data/config/initializers/dragonfly.rb +0 -1
  245. data/config/initializers/mime_types.rb +1 -0
  246. data/config/locales/alchemy.en.yml +57 -21
  247. data/config/routes.rb +0 -2
  248. data/db/migrate/20250905140323_add_created_at_index_to_pictures_and_attachments.rb +14 -0
  249. data/lib/alchemy/admin/preview_url.rb +4 -5
  250. data/lib/alchemy/cache_digests/template_tracker.rb +6 -9
  251. data/lib/alchemy/config_missing.rb +14 -0
  252. data/lib/alchemy/configuration/base_option.rb +24 -0
  253. data/lib/alchemy/configuration/boolean_option.rb +16 -0
  254. data/lib/alchemy/configuration/class_option.rb +15 -0
  255. data/lib/alchemy/configuration/class_set_option.rb +46 -0
  256. data/lib/alchemy/configuration/integer_list_option.rb +13 -0
  257. data/lib/alchemy/configuration/integer_option.rb +12 -0
  258. data/lib/alchemy/configuration/list_option.rb +22 -0
  259. data/lib/alchemy/configuration/regexp_option.rb +11 -0
  260. data/lib/alchemy/configuration/string_list_option.rb +13 -0
  261. data/lib/alchemy/configuration/string_option.rb +11 -0
  262. data/lib/alchemy/configuration.rb +115 -0
  263. data/lib/alchemy/configuration_methods.rb +3 -1
  264. data/lib/alchemy/configurations/default_language.rb +12 -0
  265. data/lib/alchemy/configurations/default_site.rb +10 -0
  266. data/lib/alchemy/configurations/format_matchers.rb +11 -0
  267. data/lib/alchemy/configurations/mailer.rb +16 -0
  268. data/lib/alchemy/configurations/main.rb +223 -0
  269. data/lib/alchemy/configurations/page_cache.rb +19 -0
  270. data/lib/alchemy/configurations/preview.rb +32 -0
  271. data/lib/alchemy/configurations/sitemap.rb +10 -0
  272. data/lib/alchemy/configurations/uploader.rb +34 -0
  273. data/lib/alchemy/engine.rb +81 -24
  274. data/lib/alchemy/hints.rb +3 -7
  275. data/lib/alchemy/install/tasks.rb +0 -12
  276. data/lib/alchemy/on_page_layout.rb +2 -2
  277. data/lib/alchemy/propshaft/tinymce_asset.rb +15 -0
  278. data/lib/alchemy/seeder.rb +2 -2
  279. data/lib/alchemy/tasks/tidy.rb +18 -0
  280. data/lib/alchemy/tasks/usage.rb +4 -4
  281. data/lib/alchemy/test_support/config_stubbing.rb +1 -7
  282. data/lib/alchemy/test_support/factories/attachment_factory.rb +13 -2
  283. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  284. data/lib/alchemy/test_support/factories/page_factory.rb +2 -3
  285. data/lib/alchemy/test_support/factories/picture_factory.rb +31 -2
  286. data/lib/alchemy/test_support/factories/site_factory.rb +2 -2
  287. data/lib/alchemy/test_support/having_crop_action_examples.rb +2 -2
  288. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +80 -26
  289. data/lib/alchemy/test_support/relatable_resource_examples.rb +58 -0
  290. data/lib/alchemy/test_support/shared_ingredient_examples.rb +5 -5
  291. data/lib/alchemy/tinymce.rb +0 -1
  292. data/lib/alchemy/upgrader/eight_zero.rb +14 -0
  293. data/lib/alchemy/upgrader.rb +33 -20
  294. data/lib/alchemy/version.rb +1 -1
  295. data/lib/alchemy.rb +185 -172
  296. data/lib/alchemy_cms.rb +1 -7
  297. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +0 -3
  298. data/lib/generators/alchemy/install/files/_article.html.erb +6 -4
  299. data/lib/generators/alchemy/install/files/alchemy.en.yml +22 -3
  300. data/lib/generators/alchemy/install/files/application.html.erb +5 -0
  301. data/lib/generators/alchemy/install/install_generator.rb +25 -23
  302. data/lib/generators/alchemy/install/templates/alchemy.rb.tt +200 -0
  303. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +0 -1
  304. data/lib/generators/alchemy/install/templates/elements.yml.tt +3 -1
  305. data/lib/generators/alchemy/install/templates/menus.yml.tt +1 -1
  306. data/lib/generators/alchemy/install/templates/page_layouts.yml.tt +2 -2
  307. data/lib/generators/alchemy/page_layouts/page_layouts_generator.rb +2 -2
  308. data/lib/tasks/alchemy/assets.rake +14 -0
  309. data/lib/tasks/alchemy/tidy.rake +6 -0
  310. data/lib/tasks/alchemy/upgrade.rake +12 -47
  311. data/vendor/assets/stylesheets/tinymce/skins/content/dark/content.min.css +1 -0
  312. data/vendor/assets/stylesheets/tinymce/skins/content/default/content.min.css +1 -0
  313. data/vendor/assets/stylesheets/tinymce/skins/ui/oxide/skin.min.css +1 -0
  314. data/vendor/assets/stylesheets/tinymce/skins/ui/oxide-dark/content.min.css +1 -0
  315. data/vendor/assets/stylesheets/tinymce/skins/ui/oxide-dark/skin.min.css +1 -0
  316. data/vendor/javascript/clipboard.min.js +1 -1
  317. data/vendor/javascript/cropperjs.min.js +1 -1
  318. data/vendor/javascript/handlebars.min.js +3 -3
  319. data/vendor/javascript/jquery.min.js +1 -1
  320. data/vendor/javascript/select2.min.js +3 -3
  321. data/vendor/javascript/shoelace.min.js +92 -76
  322. data/vendor/javascript/sortable.min.js +2 -2
  323. data/vendor/javascript/tinymce.min.js +1 -1
  324. data/vendor/javascript/ungap-custom-elements.min.js +2 -2
  325. metadata +223 -208
  326. data/CHANGELOG.md +0 -2041
  327. data/CODE_OF_CONDUCT.md +0 -13
  328. data/CONTRIBUTING.md +0 -73
  329. data/Gemfile +0 -71
  330. data/Rakefile +0 -102
  331. data/SECURITY.md +0 -13
  332. data/alchemy_cms.gemspec +0 -88
  333. data/app/assets/builds/alchemy/admin/page-select.css.map +0 -1
  334. data/app/assets/builds/alchemy/admin/print.css.map +0 -1
  335. data/app/assets/builds/alchemy/admin.css.map +0 -1
  336. data/app/assets/builds/alchemy/custom-properties.css +0 -1
  337. data/app/assets/builds/alchemy/custom-properties.css.map +0 -1
  338. data/app/assets/builds/alchemy/welcome.css.map +0 -1
  339. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css.map +0 -1
  340. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css.map +0 -1
  341. data/app/assets/javascripts/alchemy/admin.js +0 -10
  342. data/app/assets/stylesheets/alchemy/_defaults.scss +0 -3
  343. data/app/assets/stylesheets/alchemy/_deprecated_variables.scss +0 -45
  344. data/app/assets/stylesheets/alchemy/_deprecation.scss +0 -17
  345. data/app/assets/stylesheets/alchemy/_extends.scss +0 -62
  346. data/app/assets/stylesheets/alchemy/_variables.scss +0 -201
  347. data/app/assets/stylesheets/alchemy/admin/attachments.scss +0 -40
  348. data/app/assets/stylesheets/alchemy/admin/buttons.scss +0 -123
  349. data/app/assets/stylesheets/alchemy/admin/hints.scss +0 -5
  350. data/app/assets/stylesheets/alchemy/admin/labels.scss +0 -3
  351. data/app/assets/stylesheets/alchemy/admin/pagination.scss +0 -92
  352. data/app/assets/stylesheets/alchemy/admin/preview_window.scss +0 -33
  353. data/app/assets/stylesheets/alchemy/admin/resource_info.scss +0 -42
  354. data/app/assets/stylesheets/alchemy/admin/tags.scss +0 -158
  355. data/app/assets/stylesheets/alchemy/admin.scss +0 -42
  356. data/app/assets/stylesheets/alchemy/custom-properties.css +0 -98
  357. data/app/assets/stylesheets/alchemy/welcome.scss +0 -57
  358. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.css +0 -711
  359. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.css +0 -705
  360. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.min.css +0 -7
  361. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.min.css +0 -7
  362. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.css +0 -29
  363. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.min.css +0 -7
  364. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.css +0 -677
  365. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.min.css +0 -7
  366. data/app/controllers/alchemy/elements_controller.rb +0 -32
  367. data/app/helpers/alchemy/admin/elements_helper.rb +0 -25
  368. data/app/models/alchemy/element/dom_id.rb +0 -31
  369. data/app/models/alchemy/picture/calculations.rb +0 -49
  370. data/app/models/alchemy/picture/transformations.rb +0 -115
  371. data/app/models/alchemy/picture/url.rb +0 -54
  372. data/app/views/alchemy/admin/attachments/destroy.js.erb +0 -1
  373. data/app/views/alchemy/admin/clipboard/clear.js.erb +0 -3
  374. data/app/views/alchemy/admin/clipboard/insert.js.erb +0 -29
  375. data/app/views/alchemy/admin/clipboard/remove.js.erb +0 -10
  376. data/app/views/alchemy/admin/resources/_filter.html.erb +0 -12
  377. data/app/views/alchemy/admin/resources/_resource.html.erb +0 -34
  378. data/app/views/alchemy/admin/resources/_table.html.erb +0 -29
  379. data/app/views/alchemy/elements/show.html.erb +0 -1
  380. data/app/views/alchemy/elements/show.js.erb +0 -1
  381. data/app/views/alchemy/ingredients/_audio_view.html.erb +0 -1
  382. data/app/views/alchemy/ingredients/_boolean_view.html.erb +0 -1
  383. data/app/views/alchemy/ingredients/_datetime_view.html.erb +0 -3
  384. data/app/views/alchemy/ingredients/_file_view.html.erb +0 -4
  385. data/app/views/alchemy/ingredients/_headline_view.html.erb +0 -4
  386. data/app/views/alchemy/ingredients/_html_view.html.erb +0 -1
  387. data/app/views/alchemy/ingredients/_link_view.html.erb +0 -4
  388. data/app/views/alchemy/ingredients/_node_view.html.erb +0 -1
  389. data/app/views/alchemy/ingredients/_page_view.html.erb +0 -1
  390. data/app/views/alchemy/ingredients/_picture_view.html.erb +0 -4
  391. data/app/views/alchemy/ingredients/_richtext_view.html.erb +0 -3
  392. data/app/views/alchemy/ingredients/_select_view.html.erb +0 -1
  393. data/app/views/alchemy/ingredients/_text_view.html.erb +0 -4
  394. data/app/views/alchemy/ingredients/_video_view.html.erb +0 -3
  395. data/babel.config.js +0 -12
  396. data/bin/importmap +0 -4
  397. data/bin/rails +0 -9
  398. data/bin/rspec +0 -3
  399. data/bin/setup +0 -30
  400. data/bin/start +0 -17
  401. data/bun.lockb +0 -0
  402. data/bundles/shoelace.js +0 -12
  403. data/bundles/tinymce.js +0 -22
  404. data/config/initializers/assets.rb +0 -4
  405. data/eslint.config.js +0 -17
  406. data/lib/alchemy/config.rb +0 -114
  407. data/lib/alchemy/element_definition.rb +0 -73
  408. data/lib/alchemy/page_layout.rb +0 -73
  409. data/lib/alchemy/resource_filter.rb +0 -40
  410. data/lib/alchemy/upgrader/seven_point_four.rb +0 -26
  411. data/lib/alchemy/upgrader/seven_point_three.rb +0 -52
  412. data/lib/alchemy/upgrader/tasks/.keep +0 -0
  413. data/lib/generators/alchemy/ingredient/templates/view.html.erb +0 -1
  414. data/lib/generators/alchemy/install/files/alchemy_admin.js +0 -1
  415. data/lib/generators/alchemy/install/files/all.js +0 -11
  416. data/lib/generators/alchemy/install/files/article.css +0 -25
  417. data/rollup.config.mjs +0 -108
  418. data/vendor/assets/images/remixicon.symbol.svg +0 -11
  419. /data/app/{assets/stylesheets → stylesheets}/alchemy/_fonts.scss +0 -0
  420. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/attachment-select.scss +0 -0
  421. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/flash.scss +0 -0
  422. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/list_filter.scss +0 -0
  423. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/spinner.scss +0 -0
  424. /data/app/{assets/stylesheets → stylesheets}/tinymce/skins/skintool.json +0 -0
  425. /data/app/{assets/stylesheets → stylesheets}/tinymce/skins/ui/alchemy/fonts/tinymce-mobile.woff +0 -0
@@ -1,13 +1,13 @@
1
- :root {
2
- --elements-window-width: 0px;
3
- --elements-window-min-width: #{$elements-window-min-width};
4
- }
1
+ @use "base";
2
+ @use "../extends";
3
+ @use "../mixins";
4
+ @use "../variables" as vars;
5
5
 
6
6
  #alchemy_elements_window {
7
7
  --width: var(--elements-window-width, 100vw);
8
8
  position: absolute;
9
9
  right: 0;
10
- top: $top-menu-height;
10
+ top: var(--top-menu-height);
11
11
  z-index: 20;
12
12
  display: block;
13
13
  width: var(--width);
@@ -15,10 +15,13 @@
15
15
  max-width: calc(
16
16
  100vw - var(--main-menu-width) - var(--preview-window-min-width)
17
17
  );
18
- height: calc(100vh - #{$top-menu-height});
19
- border-left: $default-border;
20
- background-color: var(--color-grey_very_light);
21
- transition: $transition-duration ease-in-out;
18
+ height: calc(100vh - var(--top-menu-height));
19
+ border-left: var(--border-default);
20
+ background-color: var(
21
+ --elements-window-background-color,
22
+ var(--dialog-background-color)
23
+ );
24
+ transition: var(--transition-duration) ease-in-out;
22
25
  transform: translate3d(100%, 0, 0);
23
26
 
24
27
  .elements-window-visible & {
@@ -29,17 +32,17 @@
29
32
  .elements-window-visible {
30
33
  --elements-window-width: calc(100vw - var(--main-menu-width));
31
34
 
32
- @media screen and (min-width: $large-screen-break-point) {
35
+ @media screen and (min-width: vars.$large-screen-break-point) {
33
36
  --elements-window-width: var(--elements-window-min-width);
34
37
  }
35
38
 
36
- @media screen and (min-width: $xlarge-screen-break-point) {
39
+ @media screen and (min-width: vars.$xlarge-screen-break-point) {
37
40
  --elements-window-min-width: 475px;
38
41
  }
39
42
 
40
43
  // 1778px * 0.225 = 400px (the min width of the elements window)
41
44
  @media screen and (min-width: 1778px) {
42
- --elements-window-width: #{$elements-window-width};
45
+ --elements-window-width: 22.5vw;
43
46
  }
44
47
  }
45
48
 
@@ -51,22 +54,23 @@ alchemy-elements-window-handle {
51
54
  z-index: 1500; // tinymce .tox-fullscreen has 1200
52
55
  height: inherit;
53
56
  width: var(--width);
54
- transition-duration: $transition-duration;
55
- transition-property: background-color width left;
57
+ transition-duration: var(--transition-duration);
58
+ transition-property: background-color, width, left;
56
59
  transition-timing-function: ease-in-out;
57
60
 
58
61
  &:hover,
59
62
  &.is-dragged {
60
- background: var(--color-blue_dark);
63
+ background: var(
64
+ --elements-window-handle-dragged-background-color,
65
+ var(--color-blue_dark)
66
+ );
61
67
  cursor: ew-resize;
62
68
  }
63
69
  }
64
70
 
65
71
  .elements-window-toolbar {
66
72
  @extend %gradiated-toolbar;
67
- display: flex;
68
73
  padding: var(--spacing-2);
69
- border-bottom: $default-border;
70
74
 
71
75
  .right {
72
76
  display: inline-block;
@@ -86,16 +90,20 @@ alchemy-elements-window-handle {
86
90
 
87
91
  alchemy-tinymce {
88
92
  display: block;
93
+ border-radius: var(--border-radius_medium);
89
94
  }
90
95
 
91
96
  #main-content-elements {
92
- --scrollable-elements-offset: #{$top-menu-height + $toolbar-height};
97
+ --scrollable-elements-offset: calc(
98
+ var(--top-menu-height) + var(--toolbar-height)
99
+ );
93
100
  padding: var(--spacing-2) var(--spacing-1) 2px;
94
101
  }
95
102
 
96
103
  #fixed-elements sl-tab-panel {
97
- --scrollable-elements-offset: #{$top-menu-height + $toolbar-height +
98
- $tab-bar-height};
104
+ --scrollable-elements-offset: calc(
105
+ var(--top-menu-height) + var(--toolbar-height) + 51px
106
+ );
99
107
  }
100
108
 
101
109
  .scrollable-elements {
@@ -106,19 +114,17 @@ alchemy-tinymce {
106
114
  }
107
115
 
108
116
  .element-title {
117
+ display: inline-flex;
118
+ align-items: center;
109
119
  flex-grow: 1;
110
- overflow: hidden;
111
120
  white-space: nowrap;
112
- text-overflow: ellipsis;
113
- transition: color $transition-duration;
121
+ transition: color var(--transition-duration);
114
122
  line-height: 1;
115
123
  max-width: 85%;
116
124
 
117
- .element-hidden > & {
118
- max-width: 65%;
119
- }
120
-
121
125
  .preview_text_quote {
126
+ overflow: hidden;
127
+ text-overflow: ellipsis;
122
128
  font-size: var(--font-size_small);
123
129
  margin-left: var(--spacing-0);
124
130
  }
@@ -128,15 +134,19 @@ alchemy-tinymce {
128
134
  font-size: var(--font-size_small);
129
135
  font-weight: bold;
130
136
  line-height: 15px;
137
+ margin-right: var(--spacing-0);
131
138
  }
132
139
 
133
140
  .element-handle {
141
+ position: relative;
134
142
  display: inline-flex;
143
+ width: var(--spacing-4);
144
+ height: var(--spacing-4);
135
145
  cursor: move;
136
146
  padding-right: var(--spacing-1);
137
147
  }
138
148
 
139
- .element-toggle {
149
+ button.element-toggle {
140
150
  width: 20px;
141
151
  height: 20px;
142
152
  display: flex;
@@ -151,9 +161,8 @@ alchemy-tinymce {
151
161
  margin: 0 0 0 auto;
152
162
 
153
163
  &:hover {
154
- &:not(:focus):not(:active) {
155
- background-color: $default-border-color;
156
- border-color: transparent;
164
+ &:not(:focus) {
165
+ background-color: var(--border-color);
157
166
  cursor: pointer;
158
167
  }
159
168
  }
@@ -165,11 +174,14 @@ alchemy-tinymce {
165
174
 
166
175
  .element-editor {
167
176
  position: relative;
168
- border: 1px solid $default-border-color;
169
- border-radius: $default-border-radius;
170
- background-color: var(--color-grey_very_light);
177
+ border: 1px solid var(--element-editor-border-color, var(--border-color));
178
+ border-radius: var(--border-radius_medium);
179
+ background-color: var(
180
+ --element-editor-background-color,
181
+ --dialog-background-color
182
+ );
171
183
  margin: var(--spacing-2) 0;
172
- transition: box-shadow $transition-duration;
184
+ transition: box-shadow var(--transition-duration);
173
185
  scroll-margin: var(--spacing-2);
174
186
 
175
187
  &:first-child {
@@ -177,18 +189,28 @@ alchemy-tinymce {
177
189
  }
178
190
 
179
191
  &.element-hidden {
180
- display: block;
181
192
  border-style: dashed;
182
- opacity: 0.7;
183
- transition: opacity $transition-duration;
184
193
 
185
- &:hover {
186
- opacity: 1;
194
+ &.folded {
195
+ opacity: 0.7;
196
+ transition: opacity var(--transition-duration);
197
+
198
+ &:hover {
199
+ opacity: 1;
200
+ }
187
201
  }
188
202
 
189
203
  > .element-header {
190
204
  background-color: transparent;
191
205
 
206
+ .element-title {
207
+ max-width: 65%;
208
+ }
209
+
210
+ .element-toggle {
211
+ margin-left: var(--spacing-1);
212
+ }
213
+
192
214
  .element-hidden-icon {
193
215
  display: inline-flex;
194
216
  align-items: center;
@@ -217,27 +239,27 @@ alchemy-tinymce {
217
239
  }
218
240
 
219
241
  &.dirty {
220
- border-color: #d0c83d;
242
+ border-color: var(--element-dirty-border-color);
221
243
 
222
244
  > .element-header {
223
- background-color: #fff8df;
245
+ background-color: var(--element-dirty-header-color);
224
246
  }
225
247
  }
226
248
 
227
249
  &.deprecated {
228
- border-color: $element-deprecated-border-color;
250
+ border-color: var(--element-deprecated-border-color);
229
251
 
230
252
  > .element-header {
231
- background-color: $element-header-deprecated-bg-color;
253
+ background-color: var(--element-header-deprecated-bg-color);
232
254
  background-image: linear-gradient(
233
255
  45deg,
234
- $element-header-deprecated-bg-color 25%,
235
- $element-header-bg-color 25%,
236
- $element-header-bg-color 50%,
237
- $element-header-deprecated-bg-color 50%,
238
- $element-header-deprecated-bg-color 75%,
239
- $element-header-bg-color 75%,
240
- $element-header-bg-color 100%
256
+ var(--element-header-deprecated-bg-color) 25%,
257
+ var(--element-header-bg-color) 25%,
258
+ var(--element-header-bg-color) 50%,
259
+ var(--element-header-deprecated-bg-color) 50%,
260
+ var(--element-header-deprecated-bg-color) 75%,
261
+ var(--element-header-bg-color) 75%,
262
+ var(--element-header-bg-color) 100%
241
263
  );
242
264
  background-size: 28.28px 28.28px;
243
265
  }
@@ -246,7 +268,8 @@ alchemy-tinymce {
246
268
  &.selected:not(.is-fixed),
247
269
  &:hover:not(.is-fixed) {
248
270
  &:not(.element-hidden) {
249
- box-shadow: 0 2px 8px rgba(#9b9b9b, 0.75);
271
+ box-shadow: 0 2px 8px
272
+ var(--element-editor-hover-box-shadow-color, hsla(0, 0%, 60%, 0.75));
250
273
  }
251
274
  }
252
275
 
@@ -254,8 +277,8 @@ alchemy-tinymce {
254
277
  .deprecated
255
278
  ) {
256
279
  > .element-header {
257
- background-color: $element-header-active-bg-color;
258
- color: $element-header-active-color;
280
+ background-color: var(--element-header-active-bg-color);
281
+ color: var(--element-header-active-color);
259
282
  }
260
283
  }
261
284
 
@@ -273,16 +296,24 @@ alchemy-tinymce {
273
296
  &.expanded {
274
297
  &.not-fixed {
275
298
  .nestable-elements {
276
- box-shadow: inset 0 4px 8px -2px hsl(0deg, 0%, 79%);
277
- background-color: var(--color-grey_light);
299
+ box-shadow: inset 0 4px 8px -2px
300
+ var(--nestable-elements-box-shadow-color, hsl(0deg, 0%, 79%));
301
+ background-color: var(
302
+ --nestable-elements-background-color,
303
+ var(--color-grey_light)
304
+ );
278
305
  padding: var(--spacing-1);
279
306
  }
280
307
  }
281
308
  }
282
309
 
283
310
  &.dragged {
284
- border: 1px solid var(--color-grey_dark);
285
- background-color: var(--color-grey_light);
311
+ border: 1px solid
312
+ var(--element-editor-dragged-border-color, var(--color-grey_dark));
313
+ background-color: var(
314
+ --element-editor-dragged-background-color,
315
+ var(--color-grey_light)
316
+ );
286
317
  opacity: 0.5;
287
318
  box-shadow: none !important;
288
319
 
@@ -307,9 +338,8 @@ alchemy-tinymce {
307
338
  height: 35px;
308
339
  opacity: 0;
309
340
  z-index: 1;
310
- box-shadow: 0 1px 1px $default-border-color;
311
- background-color: var(--color-grey_very_light);
312
- transition: all $transition-duration;
341
+ box-shadow: 0 1px 1px var(--border-color);
342
+ transition: all var(--transition-duration);
313
343
 
314
344
  sl-switch::part(label) {
315
345
  display: none;
@@ -327,7 +357,7 @@ alchemy-tinymce {
327
357
  border-top: 0;
328
358
 
329
359
  .button {
330
- padding: $small-button-padding;
360
+ padding: var(--button-small-padding);
331
361
  }
332
362
  }
333
363
 
@@ -376,7 +406,7 @@ alchemy-tinymce {
376
406
  transform: scale(0);
377
407
  transform-origin: top center;
378
408
  transition:
379
- opacity $transition-duration ease-out,
409
+ opacity var(--transition-duration) ease-out,
380
410
  transform 1s ease-in;
381
411
  }
382
412
 
@@ -425,7 +455,7 @@ alchemy-tinymce {
425
455
  width: 100%;
426
456
  margin: 0 0 var(--spacing-4) 0;
427
457
  border: 0 none;
428
- border-top: 1px solid var(--color-grey_light);
458
+ border-top: 1px solid var(--border-color);
429
459
  opacity: 1;
430
460
  }
431
461
  }
@@ -435,11 +465,12 @@ alchemy-tinymce {
435
465
  gap: var(--spacing-1);
436
466
  align-items: center;
437
467
  padding: var(--spacing-2);
438
- background-color: $element-header-bg-color;
468
+ background-color: var(--element-header-bg-color);
439
469
  @extend .disable-user-select;
440
470
  cursor: pointer;
441
- border-radius: $default-border-radius;
442
- transition: background-color $transition-duration;
471
+ border-radius: var(--border-radius_medium);
472
+ transition-duration: var(--transition-duration);
473
+ transition-property: background-color, color;
443
474
 
444
475
  .expanded & {
445
476
  border-bottom-left-radius: 0;
@@ -448,7 +479,35 @@ alchemy-tinymce {
448
479
 
449
480
  .icon {
450
481
  fill: currentColor;
451
- transition: fill $transition-duration;
482
+ transition: fill var(--transition-duration);
483
+ }
484
+
485
+ > .element-handle {
486
+ alchemy-icon,
487
+ .icon {
488
+ position: absolute;
489
+ width: var(--spacing-4);
490
+ height: var(--spacing-4);
491
+ transition: opacity var(--transition-duration);
492
+ }
493
+
494
+ alchemy-icon {
495
+ opacity: 0;
496
+ }
497
+
498
+ .icon {
499
+ opacity: 1;
500
+ }
501
+ }
502
+
503
+ &:hover {
504
+ > .element-handle alchemy-icon {
505
+ opacity: 1;
506
+ }
507
+
508
+ > .element-handle .icon.element {
509
+ opacity: 0;
510
+ }
452
511
  }
453
512
  }
454
513
 
@@ -462,17 +521,18 @@ alchemy-tinymce {
462
521
  width: 100%;
463
522
  padding: var(--spacing-1);
464
523
  gap: var(--spacing-1);
465
- height: $element-toolbar-height;
466
- border-top: 1px solid var(--color-grey_light);
467
- border-bottom: 1px solid var(--color-grey_light);
524
+ height: 37px;
525
+ border-top: 1px solid var(--element-toolbar-border-color);
526
+ border-bottom: 1px solid var(--element-toolbar-border-color);
527
+ background-color: var(--element-toolbar-background-color);
468
528
 
469
529
  .is-fixed & {
470
530
  border-top-width: 0;
471
531
  }
472
532
 
473
533
  .icon_button {
474
- width: $icon-button-medium-width;
475
- height: $icon-button-medium-height;
534
+ width: var(--icon-button-medium-width);
535
+ height: var(--icon-button-medium-height);
476
536
  }
477
537
  }
478
538
 
@@ -490,7 +550,7 @@ alchemy-publish-element-button {
490
550
  }
491
551
 
492
552
  .element-footer {
493
- border-top: 1px solid var(--color-grey_light);
553
+ border-top: 1px solid var(--element-toolbar-border-color);
494
554
  padding: var(--spacing-2);
495
555
  text-align: right;
496
556
 
@@ -503,7 +563,7 @@ alchemy-publish-element-button {
503
563
  width: 100%;
504
564
  padding: var(--spacing-1) 0;
505
565
  position: relative;
506
- border-bottom: 1px solid var(--color-grey_light);
566
+ border-bottom: 1px solid var(--element-toolbar-border-color);
507
567
 
508
568
  &:last-child {
509
569
  border-bottom: none;
@@ -543,24 +603,24 @@ alchemy-publish-element-button {
543
603
 
544
604
  .icon_button {
545
605
  &:not(.linked) {
546
- background-color: var(--color-grey_light);
547
- border-color: $default-border-color;
548
- border-width: $form-field-border-width;
549
- border-style: $form-field-border-style;
606
+ background-color: var(--form-field-addon-background-color);
607
+ border-color: var(--form-field-border-color);
608
+ border-width: var(--form-field-border-width);
609
+ border-style: var(--form-field-border-style);
550
610
  box-shadow: none;
551
611
  padding: 0;
552
612
  margin: 0;
553
613
  border-radius: 0;
554
- width: $form-field-addon-width;
555
- height: $form-field-height;
614
+ width: var(--form-field-addon-width);
615
+ height: var(--form-field-height);
556
616
 
557
617
  &:hover {
558
618
  border-color: #c0c0c0;
559
619
  }
560
620
 
561
621
  &:focus {
562
- box-shadow: 0 0 0 2px $focus-color;
563
- border-color: $focus-color;
622
+ box-shadow: 0 0 0 2px var(--focus-color);
623
+ border-color: var(--focus-color);
564
624
  }
565
625
 
566
626
  &[is="alchemy-unlink-button"] {
@@ -570,7 +630,7 @@ alchemy-publish-element-button {
570
630
 
571
631
  &.disabled,
572
632
  &.disabled:hover {
573
- background-color: $form-field-disabled-bg-color;
633
+ background-color: var(--form-field-disabled-bg-color);
574
634
  }
575
635
  }
576
636
 
@@ -581,11 +641,13 @@ alchemy-publish-element-button {
581
641
  border-color: rgba(187, 162, 102, 0.5);
582
642
 
583
643
  &[is="alchemy-unlink-button"] {
584
- border-radius: 0 $default-border-radius $default-border-radius 0;
644
+ border-radius: 0 var(--border-radius_medium) var(--border-radius_medium)
645
+ 0;
585
646
  border-left-width: 0;
586
647
 
587
648
  &:focus {
588
- border-radius: 0 $default-border-radius $default-border-radius 0;
649
+ border-radius: 0 var(--border-radius_medium)
650
+ var(--border-radius_medium) 0;
589
651
  }
590
652
  }
591
653
  }
@@ -601,13 +663,13 @@ alchemy-publish-element-button {
601
663
  z-index: 0;
602
664
  width: 100%;
603
665
  padding: var(--spacing-1);
604
- background-color: #fff;
605
- border-bottom-left-radius: $default-border-radius;
606
- border-bottom-right-radius: $default-border-radius;
666
+ background-color: var(--picture-thumbnail-toolbar-bg-color, #fff);
667
+ border-bottom-left-radius: var(--border-radius_medium);
668
+ border-bottom-right-radius: var(--border-radius_medium);
607
669
 
608
670
  .icon_button {
609
- width: $icon-button-medium-width;
610
- height: $icon-button-medium-height;
671
+ width: var(--icon-button-medium-width);
672
+ height: var(--icon-button-medium-height);
611
673
  }
612
674
 
613
675
  alchemy-link-buttons {
@@ -635,7 +697,7 @@ alchemy-publish-element-button {
635
697
  margin: var(--spacing-1) 0;
636
698
  padding: 0;
637
699
  padding-bottom: 34px;
638
- box-shadow: 0 0 1px 1px $default-border-color;
700
+ box-shadow: 0 0 1px 1px var(--border-color);
639
701
 
640
702
  .picture_image {
641
703
  overflow: hidden;
@@ -653,7 +715,7 @@ alchemy-publish-element-button {
653
715
  }
654
716
 
655
717
  &.validation_failed .picture_thumbnail {
656
- border-color: $error_border_color;
718
+ border-color: var(--notice-error-border-color);
657
719
  }
658
720
 
659
721
  .thumbnail_background {
@@ -662,7 +724,7 @@ alchemy-publish-element-button {
662
724
 
663
725
  alchemy-icon {
664
726
  --icon-size: 3em;
665
- color: var(--color-grey_dark);
727
+ color: var(--icon-color);
666
728
 
667
729
  &.error {
668
730
  --icon-size: var(--icon-size-md);
@@ -697,13 +759,13 @@ alchemy-publish-element-button {
697
759
  .ingredient-editor.headline {
698
760
  &.with-level-select {
699
761
  input[type="text"] {
700
- padding-right: calc(#{$form-field-addon-width} + var(--spacing-2));
762
+ padding-right: calc(var(--form-field-addon-width) + var(--spacing-2));
701
763
  }
702
764
 
703
765
  &.with-anchor {
704
766
  input[type="text"] {
705
767
  padding-right: calc(
706
- 22px + #{$form-field-addon-width} + var(--spacing-1)
768
+ 22px + var(--form-field-addon-width) + var(--spacing-1)
707
769
  );
708
770
  }
709
771
  }
@@ -711,13 +773,13 @@ alchemy-publish-element-button {
711
773
 
712
774
  &.with-size-select {
713
775
  input[type="text"] {
714
- padding-right: calc(#{$form-field-addon-width} + var(--spacing-2));
776
+ padding-right: calc(var(--form-field-addon-width) + var(--spacing-2));
715
777
  }
716
778
 
717
779
  &.with-anchor {
718
780
  input[type="text"] {
719
781
  padding-right: calc(
720
- 22px + #{$form-field-addon-width} + var(--spacing-1)
782
+ 22px + var(--form-field-addon-width) + var(--spacing-1)
721
783
  );
722
784
  }
723
785
  }
@@ -725,7 +787,7 @@ alchemy-publish-element-button {
725
787
  &.with-level-select {
726
788
  input[type="text"] {
727
789
  padding-right: calc(
728
- 2 * (#{$form-field-addon-width} + var(--spacing-1))
790
+ 2 * (var(--form-field-addon-width) + var(--spacing-1))
729
791
  );
730
792
  }
731
793
 
@@ -733,7 +795,7 @@ alchemy-publish-element-button {
733
795
  input[type="text"] {
734
796
  padding-right: calc(
735
797
  var(--spacing-4) + 2 *
736
- (#{$form-field-addon-width} + var(--spacing-1))
798
+ (var(--form-field-addon-width) + var(--spacing-1))
737
799
  );
738
800
  }
739
801
  }
@@ -741,6 +803,31 @@ alchemy-publish-element-button {
741
803
  }
742
804
  }
743
805
 
806
+ .ingredient-editor.number {
807
+ input[type="number"] {
808
+ padding-right: var(--form-field-addon-width);
809
+ }
810
+
811
+ .input-field:has(input[type="range"]) {
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: space-between;
815
+ gap: var(--spacing-0);
816
+ }
817
+
818
+ input[type="range"] {
819
+ height: var(--form-field-height);
820
+ flex-grow: 1;
821
+ margin: 0;
822
+ margin-right: var(--spacing-2);
823
+
824
+ ~ .input-addon {
825
+ position: static;
826
+ width: auto;
827
+ }
828
+ }
829
+ }
830
+
744
831
  .ingredient-editor.audio,
745
832
  .ingredient-editor.file,
746
833
  .ingredient-editor.video {
@@ -750,14 +837,16 @@ alchemy-publish-element-button {
750
837
  gap: var(--spacing-1);
751
838
  margin: 6px 0 var(--spacing-1);
752
839
  padding: 0 var(--spacing-1) 0 var(--spacing-2);
753
- border: $default-border;
754
- background-color: var(--color-white);
755
- border-radius: $default-border-radius;
756
- height: $form-field-height;
840
+ border-style: var(--border-style);
841
+ border-width: var(--border-width_small);
842
+ border-color: var(--form-field-border-color);
843
+ background-color: var(--form-field-background-color);
844
+ border-radius: var(--border-radius_medium);
845
+ height: var(--form-field-height);
757
846
 
758
847
  .validation_failed & {
759
- color: $error_text_color;
760
- border-color: $error_border_color;
848
+ color: var(--notice-error-text-color);
849
+ border-color: var(--notice-error-border-color);
761
850
  }
762
851
  }
763
852
 
@@ -783,8 +872,7 @@ alchemy-publish-element-button {
783
872
  display: flex;
784
873
  gap: var(--spacing-1);
785
874
  align-items: center;
786
- background-color: white;
787
- border-radius: 0 $default-border-radius $default-border-radius 0;
875
+ border-radius: 0 var(--border-radius_medium) var(--border-radius_medium) 0;
788
876
 
789
877
  a {
790
878
  display: inline-flex;
@@ -828,13 +916,15 @@ select.long {
828
916
 
829
917
  &.linkable {
830
918
  input[type="text"] {
831
- padding-right: calc(2 * (#{$form-field-addon-width} + var(--spacing-1)));
919
+ padding-right: calc(
920
+ 2 * (var(--form-field-addon-width) + var(--spacing-1))
921
+ );
832
922
  }
833
923
 
834
924
  &.with-anchor {
835
925
  input[type="text"] {
836
926
  padding-right: calc(
837
- 26px + 2 * (#{$form-field-addon-width} + var(--spacing-1))
927
+ 26px + 2 * (var(--form-field-addon-width) + var(--spacing-1))
838
928
  );
839
929
  }
840
930
  }
@@ -849,7 +939,7 @@ select.long {
849
939
  &.missing {
850
940
  alchemy-message {
851
941
  margin: 0;
852
- @include clearfix;
942
+ @include mixins.clearfix;
853
943
  }
854
944
 
855
945
  p {
@@ -864,6 +954,18 @@ select.long {
864
954
  }
865
955
  }
866
956
 
957
+ &.dirty {
958
+ input,
959
+ select,
960
+ textarea,
961
+ .file,
962
+ .picture_thumbnail,
963
+ .select2-container,
964
+ .tinymce_container {
965
+ outline: 1px solid var(--element-dirty-border-color);
966
+ }
967
+ }
968
+
867
969
  &.display_inline {
868
970
  display: inline-block;
869
971
  vertical-align: middle;
@@ -878,7 +980,7 @@ select.long {
878
980
 
879
981
  &.validation_failed {
880
982
  > label {
881
- color: $error_text_color;
983
+ color: var(--notice-error-text-color);
882
984
  }
883
985
 
884
986
  input {
@@ -886,22 +988,22 @@ select.long {
886
988
  }
887
989
 
888
990
  .tinymce_container {
889
- outline: 1px solid $error_border_color;
991
+ outline: 1px solid var(--notice-error-border-color);
890
992
  }
891
993
  }
892
994
 
893
995
  &.deprecated {
894
- border-radius: $default-border-radius;
895
- background-color: $element-header-deprecated-bg-color;
996
+ border-radius: var(--border-radius_medium);
997
+ background-color: var(--element-header-deprecated-bg-color);
896
998
  background-image: linear-gradient(
897
999
  45deg,
898
- $element-header-deprecated-bg-color 25%,
899
- $element-header-bg-color 25%,
900
- $element-header-bg-color 50%,
901
- $element-header-deprecated-bg-color 50%,
902
- $element-header-deprecated-bg-color 75%,
903
- $element-header-bg-color 75%,
904
- $element-header-bg-color 100%
1000
+ var(--element-header-deprecated-bg-color) 25%,
1001
+ var(--element-header-bg-color) 25%,
1002
+ var(--element-header-bg-color) 50%,
1003
+ var(--element-header-deprecated-bg-color) 50%,
1004
+ var(--element-header-deprecated-bg-color) 75%,
1005
+ var(--element-header-bg-color) 75%,
1006
+ var(--element-header-bg-color) 100%
905
1007
  );
906
1008
  background-size: 28.28px 28.28px;
907
1009
  padding-left: 2px;
@@ -914,6 +1016,7 @@ select.long {
914
1016
  font-size: var(--font-size_small);
915
1017
  line-height: 15px;
916
1018
  text-indent: 1px;
1019
+ color: var(--form-field-label-color);
917
1020
 
918
1021
  span.warning.icon {
919
1022
  position: relative;
@@ -970,9 +1073,9 @@ textarea.has_tinymce {
970
1073
  }
971
1074
 
972
1075
  .ingredient-editor.html textarea {
973
- font-family: $mono-font-family;
1076
+ font-family: var(--font-mono);
974
1077
  resize: vertical;
975
- font-size: $form-field-font-size;
1078
+ font-size: var(--form-field-font-size);
976
1079
  }
977
1080
 
978
1081
  .text_short_float_left {
@@ -987,11 +1090,11 @@ textarea.has_tinymce {
987
1090
  gap: var(--spacing-1);
988
1091
  margin-top: var(--spacing-2);
989
1092
  margin-bottom: var(--spacing-2);
990
- background-color: $error_background_color;
1093
+ background-color: var(--notice-error-background-color);
991
1094
  padding: var(--spacing-2);
992
- border-radius: $default-border-radius;
993
- color: $error_text_color;
994
- border: 1px solid $error_border_color;
1095
+ border-radius: var(--border-radius_medium);
1096
+ color: var(--notice-error-text-color);
1097
+ border: 1px solid var(--notice-error-border-color);
995
1098
 
996
1099
  p {
997
1100
  margin: 0;
@@ -1054,7 +1157,10 @@ textarea.has_tinymce {
1054
1157
 
1055
1158
  .droppable-elements {
1056
1159
  min-height: 36px;
1057
- background-color: var(--color-yellow_light);
1160
+ background-color: var(
1161
+ --droppable-elements-background-color,
1162
+ var(--color-yellow_light)
1163
+ );
1058
1164
  }
1059
1165
 
1060
1166
  label.ingredient-date--label,
@@ -1081,19 +1187,19 @@ label.ingredient-date--label {
1081
1187
  }
1082
1188
 
1083
1189
  .linkable & {
1084
- right: calc(2 * #{$form-field-addon-width} + var(--spacing-1));
1190
+ right: calc(2 * var(--form-field-addon-width) + var(--spacing-1));
1085
1191
  }
1086
1192
 
1087
1193
  .with-size-select & {
1088
- right: calc(#{$form-field-addon-width} + var(--spacing-1));
1194
+ right: calc(var(--form-field-addon-width) + var(--spacing-1));
1089
1195
  }
1090
1196
 
1091
1197
  .with-level-select & {
1092
- right: calc(#{$form-field-addon-width} + var(--spacing-1));
1198
+ right: calc(var(--form-field-addon-width) + var(--spacing-1));
1093
1199
  }
1094
1200
 
1095
1201
  .with-level-select.with-size-select & {
1096
- right: calc(2 * #{$form-field-addon-width} + var(--spacing-1));
1202
+ right: calc(2 * var(--form-field-addon-width) + var(--spacing-1));
1097
1203
  }
1098
1204
  }
1099
1205