alchemy_cms 7.4.10 → 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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -28
  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/datetime_view.rb +2 -4
  22. data/app/components/alchemy/ingredients/number_view.rb +18 -0
  23. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -15
  24. data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -6
  25. data/app/controllers/alchemy/admin/elements_controller.rb +1 -1
  26. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  27. data/app/controllers/alchemy/admin/pages_controller.rb +15 -17
  28. data/app/controllers/alchemy/admin/pictures_controller.rb +9 -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/resource_filter.rb +92 -0
  34. data/app/decorators/alchemy/element_editor.rb +5 -48
  35. data/app/decorators/alchemy/ingredient_editor.rb +3 -53
  36. data/app/helpers/alchemy/admin/base_helper.rb +14 -84
  37. data/app/helpers/alchemy/admin/elements_helper.rb +4 -4
  38. data/app/helpers/alchemy/admin/pages_helper.rb +1 -1
  39. data/app/helpers/alchemy/base_helper.rb +0 -30
  40. data/app/helpers/alchemy/elements_block_helper.rb +0 -14
  41. data/app/helpers/alchemy/pages_helper.rb +2 -2
  42. data/{lib → app/helpers}/alchemy/resources_helper.rb +5 -45
  43. data/app/javascript/alchemy_admin/components/action.js +2 -0
  44. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +3 -3
  45. data/app/javascript/alchemy_admin/components/datepicker.js +10 -2
  46. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +7 -7
  47. data/app/javascript/alchemy_admin/components/element_editor.js +1 -1
  48. data/app/javascript/alchemy_admin/components/index.js +1 -3
  49. data/app/javascript/alchemy_admin/components/remote_select.js +4 -1
  50. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +5 -1
  51. data/app/javascript/alchemy_admin/components/tinymce.js +4 -2
  52. data/app/javascript/alchemy_admin/components/update_check.js +42 -0
  53. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +15 -8
  54. data/app/javascript/alchemy_admin/components/uploader/progress.js +12 -6
  55. data/app/javascript/alchemy_admin/components/uploader.js +4 -2
  56. data/app/javascript/alchemy_admin/confirm_dialog.js +27 -57
  57. data/app/javascript/alchemy_admin/dirty.js +3 -2
  58. data/app/javascript/alchemy_admin/i18n.js +15 -16
  59. data/app/javascript/alchemy_admin/initializer.js +1 -49
  60. data/app/javascript/alchemy_admin/utils/ajax.js +51 -44
  61. data/app/javascript/alchemy_admin.js +3 -8
  62. data/app/models/alchemy/admin/filters/base.rb +38 -0
  63. data/app/models/alchemy/admin/filters/checkbox.rb +24 -0
  64. data/app/models/alchemy/admin/filters/datepicker.rb +53 -0
  65. data/app/models/alchemy/admin/filters/select.rb +70 -0
  66. data/app/models/alchemy/admin/resource_name.rb +27 -0
  67. data/app/models/alchemy/attachment.rb +49 -37
  68. data/app/models/alchemy/base_record.rb +2 -0
  69. data/app/models/alchemy/element/definitions.rb +1 -1
  70. data/app/models/alchemy/element/element_ingredients.rb +6 -6
  71. data/app/models/alchemy/element/presenters.rb +3 -12
  72. data/app/models/alchemy/element.rb +9 -27
  73. data/app/models/alchemy/element_definition.rb +160 -0
  74. data/app/models/alchemy/ingredient.rb +11 -44
  75. data/app/models/alchemy/ingredient_definition.rb +134 -0
  76. data/app/models/alchemy/ingredient_validator.rb +7 -3
  77. data/app/models/alchemy/ingredients/number.rb +19 -0
  78. data/app/models/alchemy/language.rb +0 -14
  79. data/app/models/alchemy/message.rb +3 -7
  80. data/app/models/alchemy/node.rb +1 -1
  81. data/app/models/alchemy/page/{page_layouts.rb → definitions.rb} +12 -19
  82. data/app/models/alchemy/page/fixed_attributes.rb +1 -1
  83. data/app/models/alchemy/page/page_elements.rb +13 -14
  84. data/app/models/alchemy/page/page_naming.rb +0 -1
  85. data/app/models/alchemy/page/page_natures.rb +7 -7
  86. data/app/models/alchemy/page/page_scopes.rb +1 -1
  87. data/app/models/alchemy/page.rb +11 -33
  88. data/app/models/alchemy/page_definition.rb +115 -0
  89. data/app/models/alchemy/picture.rb +71 -88
  90. data/app/models/alchemy/picture_variant.rb +115 -5
  91. data/{lib → app/models}/alchemy/resource.rb +4 -18
  92. data/{lib → app/models}/alchemy/searchable_resource.rb +15 -0
  93. data/app/models/alchemy/site/layout.rb +5 -6
  94. data/app/models/alchemy/site.rb +0 -15
  95. data/app/models/alchemy/storage_adapter/active_storage/attachment_url.rb +41 -0
  96. data/app/models/alchemy/storage_adapter/active_storage/picture_url.rb +55 -0
  97. data/app/models/alchemy/storage_adapter/active_storage/preprocessor.rb +40 -0
  98. data/app/models/alchemy/storage_adapter/active_storage.rb +173 -0
  99. data/app/models/alchemy/{attachment/url.rb → storage_adapter/dragonfly/attachment_url.rb} +12 -12
  100. data/app/models/alchemy/{picture/url.rb → storage_adapter/dragonfly/picture_url.rb} +28 -12
  101. data/app/models/alchemy/{picture → storage_adapter/dragonfly}/preprocessor.rb +4 -4
  102. data/app/models/alchemy/storage_adapter/dragonfly.rb +183 -0
  103. data/app/models/alchemy/storage_adapter.rb +74 -0
  104. data/app/models/concerns/alchemy/picture_thumbnails.rb +19 -6
  105. data/app/serializers/alchemy/element_serializer.rb +0 -1
  106. data/app/services/alchemy/dragonfly_to_image_processing.rb +100 -0
  107. data/app/stylesheets/alchemy/_defaults.scss +3 -0
  108. data/app/stylesheets/alchemy/_extends.scss +69 -0
  109. data/app/{assets/stylesheets → stylesheets}/alchemy/_mixins.scss +33 -49
  110. data/app/stylesheets/alchemy/_variables.scss +5 -0
  111. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/archive.scss +20 -37
  112. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/base.scss +16 -14
  113. data/app/stylesheets/alchemy/admin/buttons.scss +160 -0
  114. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/clipboard.scss +2 -2
  115. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/dashboard.scss +13 -16
  116. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/dialogs.scss +23 -16
  117. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/elements.scss +150 -105
  118. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/errors.scss +5 -5
  119. data/app/stylesheets/alchemy/admin/filters.scss +58 -0
  120. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/flatpickr.scss +53 -60
  121. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/form_fields.scss +21 -7
  122. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/forms.scss +31 -19
  123. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/frame.scss +20 -16
  124. data/app/stylesheets/alchemy/admin/hints.scss +5 -0
  125. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/icons.scss +10 -1
  126. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/image_library.scss +10 -8
  127. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/images.scss +1 -1
  128. data/app/stylesheets/alchemy/admin/labels.scss +5 -0
  129. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/lists.scss +3 -3
  130. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/navigation.scss +61 -55
  131. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/nodes.scss +21 -18
  132. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/notices.scss +18 -18
  133. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/page-select.scss +2 -2
  134. data/app/stylesheets/alchemy/admin/pagination.scss +144 -0
  135. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/preview_window.scss +8 -6
  136. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/print.scss +1 -1
  137. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/resource_info.scss +8 -5
  138. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/search.scss +9 -6
  139. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/selects.scss +49 -37
  140. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/shoelace.scss +5 -6
  141. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/sitemap.scss +38 -33
  142. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/tables.scss +6 -4
  143. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/tags.scss +6 -4
  144. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/toolbar.scss +12 -6
  145. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/typography.scss +2 -2
  146. data/app/{assets/stylesheets → stylesheets}/alchemy/admin/upload.scss +7 -5
  147. data/app/stylesheets/alchemy/admin.scss +44 -0
  148. data/app/stylesheets/alchemy/custom-properties.css +244 -0
  149. data/app/stylesheets/alchemy/welcome.scss +75 -0
  150. data/app/{assets/stylesheets → stylesheets}/tinymce/skins/content/alchemy/content.scss +8 -9
  151. data/app/stylesheets/tinymce/skins/ui/alchemy/content.scss +1 -0
  152. data/app/{assets/stylesheets → stylesheets}/tinymce/skins/ui/alchemy/skin.scss +133 -136
  153. data/app/views/alchemy/admin/attachments/_files_list.html.erb +2 -2
  154. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  155. data/app/views/alchemy/admin/{elements/_clipboard_button.html.erb → clipboard/_button.html.erb} +3 -5
  156. data/app/views/alchemy/admin/clipboard/_update_nested_element_button.turbo_stream.erb +11 -0
  157. data/app/views/alchemy/admin/clipboard/clear.turbo_stream.erb +4 -0
  158. data/app/views/alchemy/admin/clipboard/index.html.erb +15 -13
  159. data/app/views/alchemy/admin/clipboard/insert.turbo_stream.erb +18 -0
  160. data/app/views/alchemy/admin/clipboard/remove.turbo_stream.erb +9 -0
  161. data/app/views/alchemy/admin/dashboard/info.html.erb +17 -31
  162. data/app/views/alchemy/admin/elements/_element.html.erb +4 -8
  163. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  164. data/app/views/alchemy/admin/elements/_header.html.erb +1 -0
  165. data/app/views/alchemy/admin/elements/_toolbar.html.erb +4 -6
  166. data/app/views/alchemy/admin/elements/create.turbo_stream.erb +2 -1
  167. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  168. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +3 -16
  169. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +1 -10
  170. data/app/views/alchemy/admin/languages/_form.html.erb +1 -1
  171. data/app/views/alchemy/admin/languages/_table.html.erb +1 -1
  172. data/app/views/alchemy/admin/languages/index.html.erb +5 -2
  173. data/app/views/alchemy/admin/layoutpages/index.html.erb +1 -12
  174. data/app/views/alchemy/admin/pages/_form.html.erb +2 -2
  175. data/app/views/alchemy/admin/pages/_page.html.erb +2 -3
  176. data/app/views/alchemy/admin/pages/_toolbar.html.erb +1 -15
  177. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  178. data/app/views/alchemy/admin/pages/info.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 -10
  181. data/app/views/alchemy/admin/pictures/_archive.html.erb +4 -7
  182. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +2 -1
  183. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -1
  184. data/app/views/alchemy/admin/pictures/index.html.erb +2 -7
  185. data/app/views/alchemy/admin/resources/_applied_filters.html.erb +8 -0
  186. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +11 -21
  187. data/app/views/alchemy/admin/resources/_pagination.html.erb +6 -0
  188. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +4 -2
  189. data/app/views/alchemy/admin/resources/_resource_table.html.erb +1 -1
  190. data/app/views/alchemy/admin/resources/_table_header.html.erb +1 -15
  191. data/app/views/alchemy/admin/sites/index.html.erb +5 -1
  192. data/app/views/alchemy/admin/styleguide/index.html.erb +8 -0
  193. data/app/views/alchemy/admin/tags/index.html.erb +1 -1
  194. data/app/views/alchemy/admin/tinymce/_setup.html.erb +7 -7
  195. data/app/{javascript/alchemy_admin/locales/en.js → views/alchemy/admin/translations/_en.js} +5 -2
  196. data/app/views/alchemy/admin/uploader/_button.html.erb +1 -1
  197. data/app/views/alchemy/admin/uploader/_setup.html.erb +4 -4
  198. data/app/views/alchemy/ingredients/_number_editor.html.erb +24 -0
  199. data/app/views/alchemy/ingredients/_page_editor.html.erb +1 -0
  200. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +1 -0
  201. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -1
  202. data/app/views/alchemy/no_index.html.erb +31 -0
  203. data/app/views/alchemy/welcome.html.erb +12 -10
  204. data/app/views/kaminari/alchemy/_first_page.html.erb +5 -3
  205. data/app/views/kaminari/alchemy/_last_page.html.erb +5 -3
  206. data/app/views/kaminari/alchemy/_next_page.html.erb +5 -3
  207. data/app/views/kaminari/alchemy/_paginator.html.erb +18 -13
  208. data/app/views/kaminari/alchemy/_prev_page.html.erb +5 -3
  209. data/app/views/layouts/alchemy/admin.html.erb +5 -9
  210. data/bun.lockb +0 -0
  211. data/bundles/remixicon.mjs +153 -0
  212. data/config/alchemy/config.yml +3 -2
  213. data/config/initializers/dragonfly.rb +0 -1
  214. data/config/initializers/mime_types.rb +1 -0
  215. data/config/locales/alchemy.en.yml +32 -14
  216. data/config/routes.rb +0 -2
  217. data/eslint.config.js +2 -1
  218. data/lib/alchemy/admin/preview_url.rb +4 -5
  219. data/lib/alchemy/cache_digests/template_tracker.rb +6 -9
  220. data/lib/alchemy/config_missing.rb +14 -0
  221. data/lib/alchemy/configuration/base_option.rb +24 -0
  222. data/lib/alchemy/configuration/boolean_option.rb +16 -0
  223. data/lib/alchemy/configuration/class_option.rb +15 -0
  224. data/lib/alchemy/configuration/class_set_option.rb +46 -0
  225. data/lib/alchemy/configuration/integer_list_option.rb +13 -0
  226. data/lib/alchemy/configuration/integer_option.rb +12 -0
  227. data/lib/alchemy/configuration/list_option.rb +22 -0
  228. data/lib/alchemy/configuration/regexp_option.rb +11 -0
  229. data/lib/alchemy/configuration/string_list_option.rb +13 -0
  230. data/lib/alchemy/configuration/string_option.rb +11 -0
  231. data/lib/alchemy/configuration.rb +115 -0
  232. data/lib/alchemy/configuration_methods.rb +3 -1
  233. data/lib/alchemy/configurations/default_language.rb +12 -0
  234. data/lib/alchemy/configurations/default_site.rb +10 -0
  235. data/lib/alchemy/configurations/format_matchers.rb +11 -0
  236. data/lib/alchemy/configurations/mailer.rb +16 -0
  237. data/lib/alchemy/configurations/main.rb +216 -0
  238. data/lib/alchemy/configurations/preview.rb +32 -0
  239. data/lib/alchemy/configurations/sitemap.rb +10 -0
  240. data/lib/alchemy/configurations/uploader.rb +34 -0
  241. data/lib/alchemy/engine.rb +65 -17
  242. data/lib/alchemy/hints.rb +3 -7
  243. data/lib/alchemy/name_conversions.rb +0 -6
  244. data/lib/alchemy/on_page_layout.rb +2 -2
  245. data/lib/alchemy/propshaft/tinymce_asset.rb +15 -0
  246. data/lib/alchemy/seeder.rb +2 -2
  247. data/lib/alchemy/tasks/usage.rb +4 -4
  248. data/lib/alchemy/test_support/config_stubbing.rb +1 -7
  249. data/lib/alchemy/test_support/factories/attachment_factory.rb +13 -2
  250. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  251. data/lib/alchemy/test_support/factories/page_factory.rb +2 -3
  252. data/lib/alchemy/test_support/factories/picture_factory.rb +30 -2
  253. data/lib/alchemy/test_support/factories/site_factory.rb +2 -2
  254. data/lib/alchemy/test_support/having_crop_action_examples.rb +2 -2
  255. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +80 -26
  256. data/lib/alchemy/test_support/shared_ingredient_examples.rb +5 -5
  257. data/lib/alchemy/upgrader/.keep +0 -0
  258. data/lib/alchemy/upgrader/eight_zero.rb +14 -0
  259. data/lib/alchemy/upgrader.rb +33 -20
  260. data/lib/alchemy/version.rb +1 -1
  261. data/lib/alchemy.rb +192 -170
  262. data/lib/alchemy_cms.rb +1 -7
  263. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +0 -3
  264. data/lib/generators/alchemy/install/files/_article.html.erb +6 -4
  265. data/lib/generators/alchemy/install/files/alchemy.en.yml +22 -3
  266. data/lib/generators/alchemy/install/files/application.html.erb +5 -0
  267. data/lib/generators/alchemy/install/install_generator.rb +5 -14
  268. data/lib/generators/alchemy/install/templates/alchemy.rb.tt +196 -0
  269. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +0 -1
  270. data/lib/generators/alchemy/install/templates/elements.yml.tt +3 -1
  271. data/lib/generators/alchemy/install/templates/menus.yml.tt +1 -1
  272. data/lib/generators/alchemy/install/templates/page_layouts.yml.tt +2 -2
  273. data/lib/generators/alchemy/page_layouts/page_layouts_generator.rb +2 -2
  274. data/lib/tasks/alchemy/assets.rake +14 -0
  275. data/lib/tasks/alchemy/upgrade.rake +12 -47
  276. data/lib/tasks/alchemy/usage.rake +0 -2
  277. data/vendor/javascript/tinymce.min.js +1 -1
  278. data/vitest.config.js +21 -0
  279. metadata +184 -183
  280. data/app/assets/builds/alchemy/admin/page-select.css.map +0 -1
  281. data/app/assets/builds/alchemy/admin/print.css.map +0 -1
  282. data/app/assets/builds/alchemy/admin.css.map +0 -1
  283. data/app/assets/builds/alchemy/custom-properties.css.map +0 -1
  284. data/app/assets/builds/alchemy/welcome.css.map +0 -1
  285. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css.map +0 -1
  286. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css.map +0 -1
  287. data/app/assets/javascripts/alchemy/admin.js +0 -10
  288. data/app/assets/stylesheets/alchemy/_defaults.scss +0 -3
  289. data/app/assets/stylesheets/alchemy/_deprecated_variables.scss +0 -45
  290. data/app/assets/stylesheets/alchemy/_deprecation.scss +0 -17
  291. data/app/assets/stylesheets/alchemy/_extends.scss +0 -62
  292. data/app/assets/stylesheets/alchemy/_variables.scss +0 -201
  293. data/app/assets/stylesheets/alchemy/admin/buttons.scss +0 -123
  294. data/app/assets/stylesheets/alchemy/admin/hints.scss +0 -5
  295. data/app/assets/stylesheets/alchemy/admin/labels.scss +0 -3
  296. data/app/assets/stylesheets/alchemy/admin/pagination.scss +0 -92
  297. data/app/assets/stylesheets/alchemy/admin.scss +0 -42
  298. data/app/assets/stylesheets/alchemy/custom-properties.css +0 -98
  299. data/app/assets/stylesheets/alchemy/welcome.scss +0 -57
  300. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.css +0 -711
  301. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.css +0 -705
  302. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.min.css +0 -7
  303. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.min.css +0 -7
  304. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.css +0 -29
  305. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.min.css +0 -7
  306. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.css +0 -677
  307. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.min.css +0 -7
  308. data/app/controllers/alchemy/elements_controller.rb +0 -32
  309. data/app/models/alchemy/element/dom_id.rb +0 -31
  310. data/app/models/alchemy/picture/calculations.rb +0 -49
  311. data/app/models/alchemy/picture/transformations.rb +0 -115
  312. data/app/views/alchemy/admin/attachments/destroy.js.erb +0 -1
  313. data/app/views/alchemy/admin/clipboard/clear.js.erb +0 -3
  314. data/app/views/alchemy/admin/clipboard/insert.js.erb +0 -29
  315. data/app/views/alchemy/admin/clipboard/remove.js.erb +0 -10
  316. data/app/views/alchemy/admin/resources/_filter.html.erb +0 -12
  317. data/app/views/alchemy/admin/resources/_resource.html.erb +0 -34
  318. data/app/views/alchemy/admin/resources/_table.html.erb +0 -29
  319. data/app/views/alchemy/elements/show.html.erb +0 -1
  320. data/app/views/alchemy/elements/show.js.erb +0 -1
  321. data/app/views/alchemy/ingredients/_audio_view.html.erb +0 -1
  322. data/app/views/alchemy/ingredients/_boolean_view.html.erb +0 -1
  323. data/app/views/alchemy/ingredients/_datetime_view.html.erb +0 -3
  324. data/app/views/alchemy/ingredients/_file_view.html.erb +0 -4
  325. data/app/views/alchemy/ingredients/_headline_view.html.erb +0 -4
  326. data/app/views/alchemy/ingredients/_html_view.html.erb +0 -1
  327. data/app/views/alchemy/ingredients/_link_view.html.erb +0 -4
  328. data/app/views/alchemy/ingredients/_node_view.html.erb +0 -1
  329. data/app/views/alchemy/ingredients/_page_view.html.erb +0 -1
  330. data/app/views/alchemy/ingredients/_picture_view.html.erb +0 -4
  331. data/app/views/alchemy/ingredients/_richtext_view.html.erb +0 -3
  332. data/app/views/alchemy/ingredients/_select_view.html.erb +0 -1
  333. data/app/views/alchemy/ingredients/_text_view.html.erb +0 -4
  334. data/app/views/alchemy/ingredients/_video_view.html.erb +0 -3
  335. data/babel.config.js +0 -12
  336. data/config/initializers/assets.rb +0 -4
  337. data/lib/alchemy/config.rb +0 -114
  338. data/lib/alchemy/element_definition.rb +0 -73
  339. data/lib/alchemy/page_layout.rb +0 -73
  340. data/lib/alchemy/resource_filter.rb +0 -40
  341. data/lib/alchemy/upgrader/seven_point_four.rb +0 -26
  342. data/lib/alchemy/upgrader/seven_point_three.rb +0 -52
  343. data/lib/generators/alchemy/ingredient/templates/view.html.erb +0 -1
  344. data/lib/generators/alchemy/install/files/alchemy_admin.js +0 -1
  345. data/lib/generators/alchemy/install/files/all.js +0 -11
  346. data/lib/generators/alchemy/install/files/article.css +0 -25
  347. data/vendor/assets/images/remixicon.symbol.svg +0 -11
  348. /data/app/{assets/stylesheets → stylesheets}/alchemy/_fonts.scss +0 -0
  349. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/attachment-select.scss +0 -0
  350. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/attachments.scss +0 -0
  351. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/flash.scss +0 -0
  352. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/list_filter.scss +0 -0
  353. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/node-select.scss +0 -0
  354. /data/app/{assets/stylesheets → stylesheets}/alchemy/admin/spinner.scss +0 -0
  355. /data/app/{assets/stylesheets → stylesheets}/tinymce/skins/skintool.json +0 -0
  356. /data/app/{assets/stylesheets → stylesheets}/tinymce/skins/ui/alchemy/fonts/tinymce-mobile.woff +0 -0
@@ -0,0 +1,183 @@
1
+ module Alchemy
2
+ class StorageAdapter
3
+ module Dragonfly
4
+ module PictureClassMethods
5
+ def self.included(base)
6
+ base.class_eval do
7
+ dragonfly_accessor :image_file, app: :alchemy_pictures do
8
+ # Preprocess after uploading the picture
9
+ after_assign do |image|
10
+ if has_convertible_format?
11
+ Alchemy.storage_adapter.preprocessor_class.new(image).call
12
+ end
13
+ end
14
+ end
15
+
16
+ has_many :thumbs, class_name: "Alchemy::PictureThumb", dependent: :destroy
17
+
18
+ # Create important thumbnails upfront
19
+ after_create -> { PictureThumb.generate_thumbs!(self) },
20
+ if: :has_convertible_format?
21
+ end
22
+ end
23
+ end
24
+
25
+ module AttachmentClassMethods
26
+ def self.included(base)
27
+ base.class_eval do
28
+ dragonfly_accessor :file, app: :alchemy_attachments do
29
+ after_assign { |file|
30
+ write_attribute(:file_mime_type, file.mime_type)
31
+ }
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ extend self
38
+
39
+ CONVERTIBLE_FILE_FORMATS = %w[gif jpg jpeg png webp].freeze
40
+
41
+ def attachment_url_class
42
+ AttachmentUrl
43
+ end
44
+
45
+ def preprocessor_class
46
+ Preprocessor
47
+ end
48
+
49
+ def picture_url_class
50
+ PictureUrl
51
+ end
52
+
53
+ def file_formats(class_name, scope:)
54
+ mime_type_column = case class_name
55
+ when "Alchemy::Attachment" then :file_mime_type
56
+ when "Alchemy::Picture" then :image_file_format
57
+ end
58
+
59
+ scope.reorder(mime_type_column).distinct.pluck(mime_type_column).compact.presence || []
60
+ end
61
+
62
+ # @param [String]
63
+ # @return [Array<String>]
64
+ def searchable_alchemy_resource_attributes(class_name)
65
+ case class_name
66
+ when "Alchemy::Attachment"
67
+ %w[name file_name]
68
+ when "Alchemy::Picture"
69
+ %w[name image_file_name]
70
+ end
71
+ end
72
+ alias_method :ransackable_attributes, :searchable_alchemy_resource_attributes
73
+
74
+ # @param [String]
75
+ # @return [Array<String>]
76
+ def ransackable_associations(_class_name)
77
+ %w[]
78
+ end
79
+
80
+ def rescuable_errors
81
+ ::Dragonfly::Job::Fetch::NotFound
82
+ end
83
+
84
+ # @param [String]
85
+ # @return [Alchemy::Picture::ActiveRecord_Relation]
86
+ def by_file_format_scope(file_format)
87
+ Picture.where(image_file_format: file_format)
88
+ end
89
+
90
+ # @param [String]
91
+ # @return [Alchemy::Attachment::ActiveRecord_Relation]
92
+ def by_file_type_scope(file_type)
93
+ Attachment.where(file_mime_type: file_type)
94
+ end
95
+
96
+ # @param [Alchemy::Attachment]
97
+ # @return [String]
98
+ def file_name(attachment)
99
+ attachment.read_attribute(:file_name)
100
+ end
101
+
102
+ # @param [Alchemy::Attachment]
103
+ # @return [Integer]
104
+ def file_size(attachment)
105
+ attachment.read_attribute(:file_size)
106
+ end
107
+
108
+ # @param [Alchemy::Attachment]
109
+ # @return [String]
110
+ def file_mime_type(attachment)
111
+ attachment.read_attribute(:file_mime_type)
112
+ end
113
+
114
+ # @param [Alchemy::Attachment]
115
+ # @return [String]
116
+ def file_extension(attachment)
117
+ content_type = file_mime_type(attachment)
118
+ Marcel::Magic.new(content_type).extensions.first if content_type
119
+ end
120
+
121
+ # @param [Alchemy::Picture]
122
+ # @return [TrueClass, FalseClass]
123
+ def has_convertible_format?(picture)
124
+ image_file_extension(picture).in?(CONVERTIBLE_FILE_FORMATS)
125
+ end
126
+
127
+ # @param [Alchemy::Picture]
128
+ # @return [String]
129
+ def image_file_name(picture)
130
+ picture.read_attribute(:image_file_name)
131
+ end
132
+
133
+ # @param [Alchemy::Picture]
134
+ # @return [String]
135
+ def image_file_format(picture)
136
+ ext = picture.read_attribute(:image_file_format)
137
+ Marcel::MimeType.for(extension: ext) if ext
138
+ end
139
+
140
+ # @param [Alchemy::Picture]
141
+ # @return [Integer]
142
+ def image_file_size(picture)
143
+ picture.read_attribute(:image_file_size)
144
+ end
145
+
146
+ # @param [Alchemy::Picture]
147
+ # @return [Integer]
148
+ def image_file_width(picture)
149
+ picture.read_attribute(:image_file_width)
150
+ end
151
+
152
+ # @param [Alchemy::Picture]
153
+ # @return [Integer]
154
+ def image_file_height(picture)
155
+ picture.read_attribute(:image_file_height)
156
+ end
157
+
158
+ # @param [Alchemy::Picture]
159
+ # @return [String]
160
+ def image_file_extension(picture)
161
+ picture.read_attribute(:image_file_format)
162
+ end
163
+
164
+ # @param [Alchemy::Picture]
165
+ # @return [TrueClass, FalseClass]
166
+ def image_file_present?(picture)
167
+ !!picture.image_file
168
+ end
169
+
170
+ # @param Alchemy::Picture::ActiveRecord_Relation
171
+ # @return Alchemy::Picture::ActiveRecord_Relation
172
+ def preloaded_pictures(pictures)
173
+ pictures.includes(:thumbs)
174
+ end
175
+
176
+ # @param [Alchemy::Attachment]
177
+ # @return [TrueClass, FalseClass]
178
+ def set_attachment_name?(attachment)
179
+ attachment.file_name_changed?
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,74 @@
1
+ module Alchemy
2
+ class StorageAdapter
3
+ class UnknownAdapterError < StandardError; end
4
+
5
+ attr_reader :name, :adapter
6
+
7
+ delegate(
8
+ :attachment_url_class,
9
+ :by_file_format_scope,
10
+ :by_file_type_scope,
11
+ :file_extension,
12
+ :file_formats,
13
+ :file_mime_type,
14
+ :file_name,
15
+ :file_size,
16
+ :has_convertible_format?,
17
+ :image_file_extension,
18
+ :image_file_format,
19
+ :image_file_height,
20
+ :image_file_name,
21
+ :image_file_present?,
22
+ :image_file_size,
23
+ :image_file_width,
24
+ :picture_url_class,
25
+ :preloaded_pictures,
26
+ :preprocessor_class,
27
+ :ransackable_associations,
28
+ :ransackable_attributes,
29
+ :rescuable_errors,
30
+ :searchable_alchemy_resource_attributes,
31
+ :set_attachment_name?,
32
+ to: :adapter
33
+ )
34
+
35
+ def initialize(name)
36
+ @name = name.to_sym
37
+ @adapter = adapter_class
38
+ end
39
+
40
+ def ==(other)
41
+ name == other.to_sym
42
+ end
43
+
44
+ def active_storage?
45
+ name == :active_storage
46
+ end
47
+
48
+ def dragonfly?
49
+ name == :dragonfly
50
+ end
51
+
52
+ def picture_class_methods
53
+ adapter::PictureClassMethods
54
+ end
55
+
56
+ def attachment_class_methods
57
+ adapter::AttachmentClassMethods
58
+ end
59
+
60
+ private
61
+
62
+ def adapter_class
63
+ case name
64
+ when :active_storage
65
+ ActiveStorage
66
+ when :dragonfly
67
+ Dragonfly
68
+ else
69
+ raise UnknownAdapterError,
70
+ "Unknown storage adapter: #{name}. Please use either 'active_storage' or 'dragonfly'."
71
+ end
72
+ end
73
+ end
74
+ end
@@ -28,7 +28,7 @@ module Alchemy
28
28
  #
29
29
  # @option options format [String]
30
30
  # The format the picture should be rendered in.
31
- # Defaults to the +image_output_format+ from the +Alchemy::Config+.
31
+ # Defaults to the +image_output_format+ from the +Alchemy.config+.
32
32
  #
33
33
  # @option options crop [Boolean]
34
34
  # If set to true the picture will be cropped to fit the size value.
@@ -84,7 +84,7 @@ module Alchemy
84
84
  crop_from: crop && crop_from.presence || default_crop_from&.join("x"),
85
85
  crop_size: crop && crop_size.presence || default_crop_size&.join("x"),
86
86
  flatten: true,
87
- format: picture&.image_file_format || "jpg"
87
+ format: picture&.image_file_extension || "jpg"
88
88
  }
89
89
  end
90
90
 
@@ -102,14 +102,27 @@ module Alchemy
102
102
 
103
103
  # Show image cropping link for ingredient
104
104
  def allow_image_cropping?
105
- settings[:crop] && picture&.can_be_cropped_to?(
106
- settings[:size],
107
- settings[:upsample]
108
- ) && !!picture.image_file
105
+ settings[:crop] && picture &&
106
+ Alchemy.storage_adapter.image_file_present?(picture) &&
107
+ can_be_cropped_to?
109
108
  end
110
109
 
111
110
  private
112
111
 
112
+ # An Image smaller than dimensions
113
+ # can not be cropped to given size - unless upsample is true.
114
+ #
115
+ def can_be_cropped_to?
116
+ return true if settings[:upsample]
117
+
118
+ dimensions = inferred_dimensions_from_string(settings[:size])
119
+ if dimensions
120
+ picture.image_file_width > dimensions[0] && picture.image_file_height > dimensions[1]
121
+ else
122
+ false
123
+ end
124
+ end
125
+
113
126
  def default_crop_size
114
127
  return nil unless settings[:crop] && settings[:size]
115
128
 
@@ -10,7 +10,6 @@ module Alchemy
10
10
  :tag_list,
11
11
  :created_at,
12
12
  :updated_at,
13
- :dom_id,
14
13
  :display_name
15
14
 
16
15
  has_many :nested_elements
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Alchemy
4
+ module DragonflyToImageProcessing
5
+ RESIZE_TO_LIMIT = />$/
6
+ RESIZE_TO_FILL = /\#$/
7
+ RESIZE_TO_FIT = /\^$/
8
+ NOSHARPEN = {sharpen: false}.freeze
9
+
10
+ class << self
11
+ def call(options = {})
12
+ opts = crop_options(options).presence || resize_options(options)
13
+ opts.merge!(format_options(options))
14
+ opts.merge!(quality_options(options))
15
+ opts
16
+ end
17
+
18
+ private
19
+
20
+ def crop_options(options)
21
+ return {} unless options[:crop] && options[:crop_from] && options[:crop_size] && options[:size]
22
+
23
+ crop_from = options[:crop_from].split("x", 2).map(&:to_i)
24
+ crop_size = options[:crop_size].split("x", 2).map(&:to_i)
25
+ {
26
+ crop: crop_from + crop_size
27
+ }.merge(resize_options(options.except(:crop)))
28
+ end
29
+
30
+ def resize_options(options)
31
+ return {} unless options[:size]
32
+
33
+ size_string = image_magick_string(options)
34
+ width, height = size_string.split("x", 2).map(&:to_i)
35
+ case size_string
36
+ when RESIZE_TO_FIT
37
+ resize_to_fit_options(width, height)
38
+ when RESIZE_TO_FILL
39
+ resize_to_fill_options(width, height)
40
+ else
41
+ resize_to_limit_options(width, height)
42
+ end.transform_values! do |value|
43
+ value.push(sharpen_option(options))
44
+ end
45
+ end
46
+
47
+ def quality_options(options)
48
+ quality = options[:quality] || Alchemy.config.get(:output_image_quality)
49
+ {saver: {quality: quality}}
50
+ end
51
+
52
+ def format_options(options)
53
+ format = options[:format] || default_output_format
54
+ return {} if format.nil?
55
+
56
+ {format: format}
57
+ end
58
+
59
+ def image_magick_string(options)
60
+ if options[:crop] == true
61
+ "#{options[:size]}#"
62
+ else
63
+ options[:size]
64
+ end
65
+ end
66
+
67
+ def resize_to_fit_options(width, height)
68
+ {
69
+ resize_to_fit: [width, height]
70
+ }
71
+ end
72
+
73
+ def resize_to_fill_options(width, height)
74
+ {
75
+ resize_to_fill: [width, height]
76
+ }
77
+ end
78
+
79
+ def resize_to_limit_options(width, height)
80
+ {
81
+ resize_to_limit: [width, height]
82
+ }
83
+ end
84
+
85
+ def sharpen_option(options)
86
+ sharpen_value(options) ? {} : NOSHARPEN
87
+ end
88
+
89
+ def sharpen_value(options)
90
+ options.key?(:sharpen) ? options[:sharpen] : Alchemy.config.get(:sharpen_images)
91
+ end
92
+
93
+ def default_output_format
94
+ return nil if Alchemy.config.image_output_format == "original"
95
+
96
+ Alchemy.config.image_output_format
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,3 @@
1
+ @use "variables";
2
+ @use "mixins";
3
+ @use "extends";
@@ -0,0 +1,69 @@
1
+ @use "sass:color";
2
+ @use "mixins";
3
+
4
+ %text-overflow {
5
+ white-space: nowrap;
6
+ overflow: hidden;
7
+ text-overflow: ellipsis;
8
+ -o-text-overflow: ellipsis;
9
+ -ms-text-overflow: ellipsis;
10
+ -moz-text-overflow: ellipsis;
11
+ }
12
+
13
+ %field-with-error {
14
+ border-color: var(--notice-error-border-color);
15
+ color: var(--notice-error-text-color);
16
+ background-color: var(--form-field-error-bg-color);
17
+ box-shadow: var(--form-field-error-box-shadow);
18
+ }
19
+
20
+ %default-input-style {
21
+ border-radius: var(--border-radius_medium);
22
+ box-shadow: var(--form-field-box-shadow);
23
+ font: var(--font-default);
24
+ color: var(--form-field-text-color);
25
+ padding: var(--form-field-padding);
26
+ margin: var(--form-field-margin);
27
+ background: var(--form-field-background-color);
28
+ border-width: var(--form-field-border-width);
29
+ border-style: var(--form-field-border-style);
30
+ border-color: var(--form-field-border-color);
31
+ height: var(--form-field-height);
32
+ width: 100%;
33
+ font-size: var(--form-field-font-size);
34
+ line-height: var(--form-field-line-height);
35
+ transition: var(--transition-duration);
36
+
37
+ &:focus:not(.readonly) {
38
+ @include mixins.default-focus-style(
39
+ $box-shadow: 0 0 0 1px var(--focus-color)
40
+ );
41
+ }
42
+
43
+ &[disabled],
44
+ &.disabled,
45
+ &:not(.flatpickr-input)[readonly],
46
+ &:not(.flatpickr-input).readonly {
47
+ color: var(--form-field-disabled-text-color);
48
+ background-color: var(--form-field-disabled-bg-color);
49
+ cursor: default;
50
+ }
51
+
52
+ &[disabled],
53
+ &.disabled {
54
+ cursor: not-allowed;
55
+ }
56
+
57
+ &:not(.flatpickr-input)[readonly],
58
+ &:not(.flatpickr-input).readonly {
59
+ pointer-events: none;
60
+ }
61
+ }
62
+
63
+ %gradiated-toolbar {
64
+ display: flex;
65
+ background: var(--toolbar-bg-color);
66
+ padding: var(--toolbar-padding);
67
+ height: var(--toolbar-height);
68
+ border-bottom: var(--toolbar-border-bottom);
69
+ }
@@ -1,7 +1,7 @@
1
1
  @mixin default-focus-style(
2
- $border-color: $focus-color,
3
- $box-shadow: 0 0 0 2px $focus-color,
4
- $border-radius: $default-border-radius
2
+ $border-color: var(--focus-color),
3
+ $box-shadow: 0 0 0 2px var(--focus-color),
4
+ $border-radius: var(--border-radius_medium)
5
5
  ) {
6
6
  border-color: $border-color;
7
7
  border-radius: $border-radius;
@@ -15,26 +15,26 @@
15
15
  }
16
16
 
17
17
  @mixin button-defaults(
18
- $background-color: $button-bg-color,
19
- $hover-color: $button-hover-bg-color,
20
- $hover-border-color: $button-hover-border-color,
21
- $border-radius: $button-border-radius,
22
- $border: $button-border-width solid $button-border-color,
23
- $box-shadow: $button-box-shadow,
24
- $padding: $button-padding,
25
- $margin: $button-margin,
26
- $color: $button-text-color,
27
- $line-height: $form-field-line-height,
28
- $focus-border-color: $button-focus-border-color,
29
- $focus-box-shadow: $button-focus-box-shadow
18
+ $background-color: var(--button-bg-color),
19
+ $hover-color: var(--button-hover-bg-color),
20
+ $hover-border-color: var(--button-hover-border-color),
21
+ $border-radius: var(--button-border-radius),
22
+ $border: var(--button-border),
23
+ $box-shadow: var(--button-box-shadow),
24
+ $padding: var(--button-padding),
25
+ $margin: var(--button-margin),
26
+ $color: var(--button-text-color),
27
+ $line-height: var(--button-line-height),
28
+ $focus-border-color: var(--button-focus-border-color),
29
+ $focus-box-shadow: var(--button-focus-box-shadow)
30
30
  ) {
31
31
  display: inline-flex;
32
32
  align-items: center;
33
33
  justify-content: center;
34
- font-family: $default-font-family;
35
- font-size: $default-font-size;
36
- font-weight: $button-font-weight;
37
- height: 30px;
34
+ font-family: var(--font-sans);
35
+ font-size: var(--button-font-size);
36
+ font-weight: var(--button-font-weight);
37
+ height: var(--button-height);
38
38
  padding: $padding;
39
39
  cursor: pointer;
40
40
  border-radius: $border-radius;
@@ -44,7 +44,7 @@
44
44
  color: $color;
45
45
  margin: $margin;
46
46
  -webkit-appearance: none;
47
- transition: all $transition-duration;
47
+ transition: all var(--transition-duration);
48
48
  @include antialiased-font-smoothing;
49
49
 
50
50
  &:hover {
@@ -55,7 +55,7 @@
55
55
 
56
56
  &:active,
57
57
  &.active {
58
- box-shadow: inset $button-box-shadow;
58
+ box-shadow: inset var(--button-box-shadow);
59
59
  }
60
60
 
61
61
  &:focus {
@@ -86,7 +86,7 @@
86
86
  }
87
87
 
88
88
  @mixin form-label {
89
- width: $form-left-width;
89
+ width: var(--form-left-column-width);
90
90
  padding-right: var(--spacing-2);
91
91
  padding-top: 0.6em;
92
92
  margin-top: var(--spacing-1);
@@ -94,18 +94,18 @@
94
94
  word-break: normal;
95
95
  float: left;
96
96
  text-align: right;
97
- font-size: $default-font-size;
97
+ font-size: var(--font-size_medium);
98
98
  }
99
99
 
100
100
  @mixin form-value-display {
101
101
  float: right;
102
- width: $form-right-width;
103
- margin: $form-field-margin;
102
+ width: var(--form-right-column-width);
103
+ margin: var(--form-field-margin);
104
104
  padding: var(--spacing-1) var(--spacing-2);
105
105
  line-height: 21px;
106
- min-height: $form-field-height;
106
+ min-height: var(--form-field-height);
107
107
  background: white;
108
- border-radius: $default-border-radius;
108
+ border-radius: var(--border-radius_medium);
109
109
  }
110
110
 
111
111
  @mixin form-hint(
@@ -119,7 +119,7 @@
119
119
  border: 1px solid $border-color;
120
120
  display: block;
121
121
  clear: both;
122
- border-radius: $default-border-radius;
122
+ border-radius: var(--border-radius_medium);
123
123
  }
124
124
 
125
125
  @mixin animate-left {
@@ -162,8 +162,8 @@
162
162
  background-color: var(--color-grey_light);
163
163
  overflow: hidden;
164
164
  position: relative;
165
- border-radius: $default-border-radius;
166
- color: var(--color-text);
165
+ border-radius: var(--border-radius_medium);
166
+ color: var(--text-color);
167
167
  }
168
168
 
169
169
  @mixin tag-base($margin: var(--spacing-2) 0, $padding: var(--spacing-2)) {
@@ -182,28 +182,12 @@
182
182
  }
183
183
 
184
184
  &:focus {
185
- @include default-focus-style($box-shadow: inset 0 0 0 2px $focus-color);
185
+ @include default-focus-style(
186
+ $box-shadow: inset 0 0 0 2px var(--focus-color)
187
+ );
186
188
  }
187
189
  }
188
190
 
189
- @mixin linked-button(
190
- $border-radius: $default-border-radius,
191
- $line-height: $form-field-line-height,
192
- $padding: 3px
193
- ) {
194
- @include button-defaults(
195
- $line-height: $line-height,
196
- $background-color: $linked-button-color,
197
- $hover-color: darken($linked-button-color, 10%),
198
- $border: 1px solid $linked-border-color,
199
- $hover-border-color: darken($linked-border-color, 10%),
200
- $border-radius: $border-radius,
201
- $box-shadow: none,
202
- $padding: $padding,
203
- $margin: 0
204
- );
205
- }
206
-
207
191
  @mixin zoom-in {
208
192
  cursor: pointer;
209
193
  cursor: -webkit-zoom-in;
@@ -0,0 +1,5 @@
1
+ $small-screen-break-point: 500px;
2
+ $medium-screen-break-point: 700px;
3
+ $large-screen-break-point: 1000px;
4
+ $xlarge-screen-break-point: 1440px;
5
+ $xxlarge-screen-break-point: 1680px;