maglevcms 3.0.0.beta3 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -53
  3. data/Rakefile +3 -1
  4. data/app/assets/builds/maglev/tailwind.css +424 -84
  5. data/app/assets/config/maglev_manifest.js +3 -2
  6. data/app/assets/javascripts/maglev/client/dom-operations.js +5 -5
  7. data/app/assets/javascripts/maglev/client/iframe-decorator.js +24 -0
  8. data/app/assets/javascripts/maglev/client/incoming-messages.js +13 -3
  9. data/app/assets/javascripts/maglev/client/index.js +3 -2
  10. data/app/assets/javascripts/maglev/client/utils.js +22 -0
  11. data/app/assets/javascripts/maglev/editor/controllers/app/forms/section_form_controller.js +4 -3
  12. data/app/assets/javascripts/maglev/editor/controllers/app/forms/style_form_controller.js +2 -1
  13. data/app/assets/javascripts/maglev/editor/controllers/app/page_preview_controller.js +96 -5
  14. data/app/assets/javascripts/maglev/editor/controllers/app/preview_notification_center_controller.js +105 -23
  15. data/app/assets/javascripts/maglev/editor/controllers/app/setting_controller.js +3 -2
  16. data/app/assets/javascripts/maglev/editor/controllers/shared/copy_to_clipboard_controller.js +2 -1
  17. data/app/assets/javascripts/maglev/editor/controllers/utils.js +22 -0
  18. data/app/assets/javascripts/maglev/editor/index.js +2 -1
  19. data/app/assets/javascripts/maglev/editor/patches/turbo_stream_patch.js +3 -3
  20. data/app/assets/stylesheets/maglev/tailwind.css.erb +8 -1
  21. data/app/components/maglev/content/link.rb +1 -1
  22. data/app/components/maglev/editor/settings/link/link_component.rb +7 -1
  23. data/app/components/maglev/section_component.rb +11 -1
  24. data/app/components/maglev/uikit/app_layout/sidebar/link_component.html.erb +1 -1
  25. data/app/components/maglev/uikit/app_layout/sidebar/link_component.rb +35 -5
  26. data/app/components/maglev/uikit/app_layout/sidebar_component.html.erb +3 -4
  27. data/app/components/maglev/uikit/app_layout/topbar_component.html.erb +1 -1
  28. data/app/components/maglev/uikit/app_layout/topbar_component.rb +1 -1
  29. data/app/components/maglev/uikit/button_group_component/button_group_component.html.erb +5 -0
  30. data/app/components/maglev/uikit/button_group_component.rb +70 -0
  31. data/app/components/maglev/uikit/device_toggler_component.rb +10 -1
  32. data/app/components/maglev/uikit/dropdown_component/dropdown_component.html.erb +2 -2
  33. data/app/components/maglev/uikit/dropdown_component.rb +6 -1
  34. data/app/components/maglev/uikit/form/color_field_component.html.erb +1 -1
  35. data/app/components/maglev/uikit/form/combobox_component.html.erb +1 -0
  36. data/app/components/maglev/uikit/form/link_component.rb +5 -1
  37. data/app/components/maglev/uikit/form/richtext_controller.js +5 -4
  38. data/app/components/maglev/uikit/form/search_form_component.html.erb +1 -0
  39. data/app/components/maglev/uikit/icon_component.rb +3 -0
  40. data/app/components/maglev/uikit/image_library/uploader_controller.js +3 -2
  41. data/app/components/maglev/uikit/list/list_item_component.html.erb +36 -19
  42. data/app/components/maglev/uikit/list/list_item_component.rb +19 -5
  43. data/app/components/maglev/uikit/locale_switcher_component/locale_switcher_component.html.erb +6 -10
  44. data/app/components/maglev/uikit/menu_dropdown_component/menu_dropdown_component.html.erb +6 -2
  45. data/app/components/maglev/uikit/menu_dropdown_component.rb +244 -7
  46. data/app/components/maglev/uikit/page_actions_dropdown_component/page_actions_dropdown_component.html.erb +39 -46
  47. data/app/components/maglev/uikit/pagination_component/pagination_component.html.erb +9 -12
  48. data/app/components/maglev/uikit/pagination_component.rb +6 -1
  49. data/app/components/maglev/uikit/section_toolbar/bottom_component.html.erb +1 -1
  50. data/app/components/maglev/uikit/tabs_component/tabs_component.html.erb +7 -4
  51. data/app/components/maglev/uikit/tabs_component.rb +23 -4
  52. data/app/components/maglev/uikit/well/simple_well_component.html.erb +15 -0
  53. data/app/components/maglev/uikit/well/simple_well_component.rb +13 -0
  54. data/app/controllers/concerns/maglev/editor/preview_urls_concern.rb +32 -0
  55. data/app/controllers/concerns/maglev/editor/turbo_concern.rb +29 -0
  56. data/app/controllers/concerns/maglev/flash_i18n_concern.rb +1 -0
  57. data/app/controllers/maglev/application_controller.rb +1 -1
  58. data/app/controllers/maglev/assets/active_storage_proxy_controller.rb +2 -1
  59. data/app/controllers/maglev/editor/assets_controller.rb +1 -1
  60. data/app/controllers/maglev/editor/base_controller.rb +6 -32
  61. data/app/controllers/maglev/editor/pages/clone_controller.rb +22 -0
  62. data/app/controllers/maglev/editor/pages/discard_draft_controller.rb +17 -0
  63. data/app/controllers/maglev/editor/pages_controller.rb +26 -7
  64. data/app/controllers/maglev/editor/section_blocks_controller.rb +13 -9
  65. data/app/controllers/maglev/editor/sections_controller.rb +26 -7
  66. data/app/controllers/maglev/published_page_preview_controller.rb +4 -0
  67. data/app/helpers/maglev/application_helper.rb +6 -6
  68. data/app/helpers/maglev/editor/section_blocks_helper.rb +2 -2
  69. data/app/models/maglev/page/publishable_concern.rb +69 -0
  70. data/app/models/maglev/page.rb +2 -13
  71. data/app/models/maglev/section/block.rb +4 -0
  72. data/app/models/maglev/section/content_concern.rb +3 -1
  73. data/app/models/maglev/section.rb +21 -1
  74. data/app/models/maglev/sections_content_store.rb +1 -3
  75. data/app/services/concerns/maglev/content/helpers_concern.rb +5 -8
  76. data/app/services/maglev/app_container.rb +4 -2
  77. data/app/services/maglev/discard_page_draft_service.rb +45 -0
  78. data/app/services/maglev/fetch_section_screenshot_url.rb +12 -1
  79. data/app/services/maglev/has_unpublished_changes.rb +21 -0
  80. data/app/services/maglev/publish_service.rb +15 -2
  81. data/app/views/layouts/maglev/editor/_sidebar.html.erb +6 -1
  82. data/app/views/layouts/maglev/editor/application.html.erb +5 -0
  83. data/app/views/layouts/maglev/editor/topbar/_page_info.html.erb +1 -1
  84. data/app/views/layouts/maglev/editor/topbar/_publish_button.html.erb +32 -10
  85. data/app/views/maglev/editor/assets/_list.html.erb +2 -1
  86. data/app/views/maglev/editor/assets/index.html.erb +1 -0
  87. data/app/views/maglev/editor/home/index.html.erb +1 -1
  88. data/app/views/maglev/editor/links/edit/_email.html.erb +1 -1
  89. data/app/views/maglev/editor/links/edit/_url.html.erb +1 -1
  90. data/app/views/maglev/editor/pages/_list.html.erb +25 -21
  91. data/app/views/maglev/editor/pages/_preview.html.erb +6 -6
  92. data/app/views/maglev/editor/pages/_preview_empty_message.html.erb +13 -10
  93. data/app/views/maglev/editor/pages/discard_draft/create.turbo_stream.erb +16 -0
  94. data/app/views/maglev/editor/pages/index.html.erb +8 -1
  95. data/app/views/maglev/editor/section_blocks/_form.html.erb +5 -13
  96. data/app/views/maglev/editor/section_blocks/_form_with_tabs.html.erb +15 -0
  97. data/app/views/maglev/editor/section_blocks/_new.html.erb +1 -1
  98. data/app/views/maglev/editor/section_blocks/edit.html.erb +2 -2
  99. data/app/views/maglev/editor/section_blocks/index/_list.html.erb +2 -2
  100. data/app/views/maglev/editor/section_blocks/index/_tree.html.erb +1 -1
  101. data/app/views/maglev/editor/section_blocks/update.turbo_stream.erb +1 -1
  102. data/app/views/maglev/editor/sections/_form.html.erb +6 -20
  103. data/app/views/maglev/editor/sections/_form_with_tabs.html.erb +21 -0
  104. data/app/views/maglev/editor/sections/_list.html.erb +3 -3
  105. data/app/views/maglev/editor/sections/edit.html.erb +4 -4
  106. data/app/views/maglev/editor/sections/index.html.erb +1 -1
  107. data/app/views/maglev/editor/sections/new.html.erb +19 -2
  108. data/app/views/maglev/editor/sections/theme/_empty_list.html.erb +3 -0
  109. data/app/views/maglev/editor/sections/theme/_list.html.erb +35 -0
  110. data/app/views/maglev/editor/sections/theme/_screenshot_placeholder.html.erb +6 -0
  111. data/app/views/maglev/editor/sections/theme/_search.html.erb +22 -0
  112. data/app/views/maglev/editor/sections/update.turbo_stream.erb +1 -1
  113. data/app/views/maglev/editor/shared/_button_label.html.erb +4 -4
  114. data/app/views/maglev/editor/style/edit.html.erb +1 -0
  115. data/config/editor_importmap.rb +13 -13
  116. data/config/locales/editor.ar.yml +12 -4
  117. data/config/locales/editor.en.yml +31 -23
  118. data/config/locales/editor.es.yml +12 -4
  119. data/config/locales/editor.fr.yml +12 -4
  120. data/config/locales/editor.pt-BR.yml +12 -4
  121. data/config/routes/maglev/assets.rb +4 -0
  122. data/config/routes/maglev/editor.rb +38 -0
  123. data/config/routes/maglev/preview.rb +8 -0
  124. data/config/routes/maglev/public_preview.rb +6 -0
  125. data/config/routes.rb +8 -47
  126. data/db/migrate/20211013210954_translate_section_content.rb +1 -0
  127. data/db/migrate/20260114112058_add_published_payload_to_pages.rb +14 -0
  128. data/exe/tailwind-cli +1 -1
  129. data/lib/generators/maglev/install_generator.rb +9 -7
  130. data/lib/generators/maglev/templates/install/config/initializers/maglev.rb +10 -3
  131. data/lib/maglev/active_storage/serving_blob.rb +29 -0
  132. data/lib/maglev/active_storage.rb +2 -0
  133. data/lib/maglev/config.rb +22 -3
  134. data/lib/maglev/engine.rb +14 -10
  135. data/lib/maglev/version.rb +1 -1
  136. data/lib/maglev.rb +18 -3
  137. data/lib/tasks/db_test_all.rake +290 -0
  138. metadata +46 -19
  139. data/app/controllers/maglev/editor/page_clone_controller.rb +0 -20
  140. data/app/views/maglev/editor/sections/_theme_list.html.erb +0 -32
  141. /data/vendor/javascript/{@floating-ui--core.js → maglev/@floating-ui--core.js} +0 -0
  142. /data/vendor/javascript/{@floating-ui--dom.js → maglev/@floating-ui--dom.js} +0 -0
  143. /data/vendor/javascript/{@floating-ui--utils--dom.js → maglev/@floating-ui--utils--dom.js} +0 -0
  144. /data/vendor/javascript/{@floating-ui--utils.js → maglev/@floating-ui--utils.js} +0 -0
  145. /data/vendor/javascript/{@hotwired--stimulus.js → maglev/@hotwired--stimulus.js} +0 -0
  146. /data/vendor/javascript/{@hotwired--turbo-rails.js → maglev/@hotwired--turbo-rails.js} +0 -0
  147. /data/vendor/javascript/{@hotwired--turbo.js → maglev/@hotwired--turbo.js} +0 -0
  148. /data/vendor/javascript/{@rails--actioncable--src.js → maglev/@rails--actioncable--src.js} +0 -0
  149. /data/vendor/javascript/{@rails--request.js.js → maglev/@rails--request.js.js} +0 -0
  150. /data/vendor/javascript/{@shopify--draggable.js → maglev/@shopify--draggable.js} +0 -0
  151. /data/vendor/javascript/{el-transition.js → maglev/el-transition.js} +0 -0
  152. /data/vendor/javascript/{stimulus-use.js → maglev/stimulus-use.js} +0 -0
  153. /data/vendor/javascript/{tiptap.bundle.js → maglev/tiptap.bundle.js} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3e69d444034fdab673e1f9956b6f1a731fc03ed9b9045628bc45d2359163e3f
4
- data.tar.gz: f7fc2eabaeb346afde1fae905ed9d0aba990718c814641b1a60bc5b6cab7d1f2
3
+ metadata.gz: 3061afa4c3b8ce916e981ea025e8db6b63102287b152163369813ec9ac172b5e
4
+ data.tar.gz: 484f90090316bd4a319e4223b5d86d5c673260f56808386f2f792a1b12613331
5
5
  SHA512:
6
- metadata.gz: b377ce8f675a1f050a2628e38f80d0c310381afee034984ddffe95aa76fb0babf35449716d572bb6150ed96ad79afdedf5bf8b33e03135b21db8f634cbd61987
7
- data.tar.gz: 521317e658445d03d96b41873649bc6ba817c9dfa7ec30444c20ab3663ed2409dc80f3620f709903e4870632541bdc8448b8692db8d4422ccf208b8ed94cee7d
6
+ metadata.gz: 2c2df97bdeee5ff72c3c2fb7796e3d14b23169a71c68bb91879a002aa944e678f8fe1461ada1b3512394bf5f4ba848c35636345023026549fe15c964527d28ea
7
+ data.tar.gz: 56665addc22ceb997563182a3217ebfc6fcfdefa9a619ea34ed6e1dcdbe3c7a3fc5aef6f14c041df2e081cbc78f9abb11bd7f3121ee21681c62f5b16b8309b5e
data/README.md CHANGED
@@ -1,69 +1,32 @@
1
1
  [![Build Status](https://github.com/maglevhq/maglev-core/actions/workflows/verify.yml/badge.svg)](https://github.com/maglevhq/maglev-core/actions/workflows/verify.yml)
2
2
 
3
- # MaglevCMS — Page Builder for Ruby on Rails
3
+ # MaglevCMS
4
4
 
5
- ![Screenshot of the MaglevCMS editor](https://github.com/user-attachments/assets/b3a1ad34-bbae-47d7-9661-7cec5342d027)
5
+ Visual page builder for Ruby on Rails (7.2+ and 8.x). Marketing and content people edit pages in the browser. Everything stays in your app—no separate CMS host or headless stack to run.
6
6
 
7
- **MaglevCMS** is a powerful, fully-integrated page builder for Ruby on Rails (7 & 8).
8
- It lets your non‑technical users create and edit marketing pages visually — right inside your Rails app — without compromising performance, security, or developer experience.
7
+ ![MaglevCMS editor](https://github.com/user-attachments/assets/b3a1ad34-bbae-47d7-9661-7cec5342d027)
9
8
 
10
- **Built with Hotwire, Stimulus, and ViewComponent**
11
- 🚫 **No Node.js, no React, no external build tooling**
12
- 🧩 **Rails-native sections, themes, layouts & content system**
13
- 🛠 **Works with any Rails app — from solo projects to large-scale SaaS**
9
+ The editor is built on **Hotwire**, **Stimulus**, and **ViewComponent**. Assets ship with the engine (importmap + vendored JS). You do not need Node, Webpack, or Vite to use Maglev in production.
14
10
 
15
- > Designed for developers. Loved by marketing teams.
11
+ Sections, themes, and layouts are ordinary Rails: ERB, Haml, or Slim for templates; Tailwind, Bootstrap, or your own CSS; Stimulus or plain JavaScript for behavior. Maglev does not dictate your front-end beyond what the editor needs.
16
12
 
17
- ⚠️ The Hotwire/Stimulus/ViewComponent stack is currently available in the beta version 3 of MaglevCMS.
13
+ ## Demo
18
14
 
19
- ## 🧩 Use Your Stack, Your Way
15
+ [Live demo (SaaS edition)](https://demo-pro.maglev.dev) — includes features that exist only in the commercial SaaS product, but it shows how the editor feels in a real app.
20
16
 
21
- Maglev is *unopinionated* when it comes to implement your Maglev layout/sections. You can:
17
+ ## Documentation
22
18
 
23
- - Build sections using **ERB**, **HAML**, or **Slim**
24
- - Style them with **Tailwind CSS**, **Bootstrap**, or your own design system
25
- - Add interactivity with **Stimulus**, **vanilla JS**, or even **jQuery** if you must 😉
19
+ - [Quickstart / installation](https://docs.maglev.dev/quickstart)
20
+ - [Full docs](https://docs.maglev.dev/)
26
21
 
27
- No vendor lock-in. No complex build chains. Just Rails.
22
+ ## SaaS edition
28
23
 
29
- ---
24
+ Multi-tenant setups (several sites or customers in one Rails app), deeper white-labeling, and supported deployments are covered by [Maglev SaaS](https://www.maglev.dev/saas-edition). The OSS gem is the same core; SaaS adds hosting-oriented features and support.
30
25
 
31
- ## ✨ Live Demo
26
+ ## Tests
32
27
 
33
- Try Maglev in your browser:
34
- 👉 [**SaaS Edition Demo**](https://demo-pro.maglev.dev)
28
+ If you need a Maglev site inside the test suite, call `Maglev::GenerateSite.call` from your setup (see the docs for context).
35
29
 
36
- This demo showcases the full capabilities of MaglevCMS, including advanced features available in the SaaS version.
30
+ ## License
37
31
 
38
- ---
39
-
40
- ## 📦 Getting Started
41
-
42
- - 🚀 [Quickstart: Install Maglev in your app](https://docs.maglev.dev/quickstart)
43
- - 📚 [Read the full documentation](https://docs.maglev.dev/)
44
-
45
- ---
46
-
47
- ## 💼 For Rails SaaS Founders
48
-
49
- MaglevCMS SaaS Edition is built for **multi-tenant Rails applications**.
50
- It adds support for:
51
-
52
- - Multiple sites, themes & tenants
53
- - Deep editor customization & white-labeling
54
- - Production support & custom features
55
-
56
- We work closely with SaaS teams to ensure a seamless integration.
57
- ➡️ [Learn more about the SaaS Edition](https://www.maglev.dev/saas-edition)
58
-
59
- ---
60
-
61
- ## 🧪 Testing
62
-
63
- If for some reason you want your Maglev site to exist during your tests, you can use `Maglev::GenerateSite.call` in your setup block.
64
-
65
- ---
66
-
67
- ## 📄 License
68
-
69
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
32
+ MIT — see [MIT-LICENSE](MIT-LICENSE) and [opensource.org/licenses/MIT](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -16,7 +16,9 @@ RDoc::Task.new(:rdoc) do |rdoc|
16
16
  rdoc.rdoc_files.include('lib/**/*.rb')
17
17
  end
18
18
 
19
- rakefile_path = !defined?(Rails) || Rails::VERSION::MAJOR >= 8 ? 'spec/dummy/Rakefile' : 'spec/legacy_dummy/Rakefile'
19
+ require 'rails/version'
20
+
21
+ rakefile_path = Rails::VERSION::MAJOR >= 8 ? 'spec/dummy/Rakefile' : 'spec/legacy_dummy/Rakefile'
20
22
  APP_RAKEFILE = File.expand_path(rakefile_path, __dir__)
21
23
 
22
24
  load 'rails/tasks/engine.rake'