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.
- checksums.yaml +4 -4
- data/README.md +16 -53
- data/Rakefile +3 -1
- data/app/assets/builds/maglev/tailwind.css +424 -84
- data/app/assets/config/maglev_manifest.js +3 -2
- data/app/assets/javascripts/maglev/client/dom-operations.js +5 -5
- data/app/assets/javascripts/maglev/client/iframe-decorator.js +24 -0
- data/app/assets/javascripts/maglev/client/incoming-messages.js +13 -3
- data/app/assets/javascripts/maglev/client/index.js +3 -2
- data/app/assets/javascripts/maglev/client/utils.js +22 -0
- data/app/assets/javascripts/maglev/editor/controllers/app/forms/section_form_controller.js +4 -3
- data/app/assets/javascripts/maglev/editor/controllers/app/forms/style_form_controller.js +2 -1
- data/app/assets/javascripts/maglev/editor/controllers/app/page_preview_controller.js +96 -5
- data/app/assets/javascripts/maglev/editor/controllers/app/preview_notification_center_controller.js +105 -23
- data/app/assets/javascripts/maglev/editor/controllers/app/setting_controller.js +3 -2
- data/app/assets/javascripts/maglev/editor/controllers/shared/copy_to_clipboard_controller.js +2 -1
- data/app/assets/javascripts/maglev/editor/controllers/utils.js +22 -0
- data/app/assets/javascripts/maglev/editor/index.js +2 -1
- data/app/assets/javascripts/maglev/editor/patches/turbo_stream_patch.js +3 -3
- data/app/assets/stylesheets/maglev/tailwind.css.erb +8 -1
- data/app/components/maglev/content/link.rb +1 -1
- data/app/components/maglev/editor/settings/link/link_component.rb +7 -1
- data/app/components/maglev/section_component.rb +11 -1
- data/app/components/maglev/uikit/app_layout/sidebar/link_component.html.erb +1 -1
- data/app/components/maglev/uikit/app_layout/sidebar/link_component.rb +35 -5
- data/app/components/maglev/uikit/app_layout/sidebar_component.html.erb +3 -4
- data/app/components/maglev/uikit/app_layout/topbar_component.html.erb +1 -1
- data/app/components/maglev/uikit/app_layout/topbar_component.rb +1 -1
- data/app/components/maglev/uikit/button_group_component/button_group_component.html.erb +5 -0
- data/app/components/maglev/uikit/button_group_component.rb +70 -0
- data/app/components/maglev/uikit/device_toggler_component.rb +10 -1
- data/app/components/maglev/uikit/dropdown_component/dropdown_component.html.erb +2 -2
- data/app/components/maglev/uikit/dropdown_component.rb +6 -1
- data/app/components/maglev/uikit/form/color_field_component.html.erb +1 -1
- data/app/components/maglev/uikit/form/combobox_component.html.erb +1 -0
- data/app/components/maglev/uikit/form/link_component.rb +5 -1
- data/app/components/maglev/uikit/form/richtext_controller.js +5 -4
- data/app/components/maglev/uikit/form/search_form_component.html.erb +1 -0
- data/app/components/maglev/uikit/icon_component.rb +3 -0
- data/app/components/maglev/uikit/image_library/uploader_controller.js +3 -2
- data/app/components/maglev/uikit/list/list_item_component.html.erb +36 -19
- data/app/components/maglev/uikit/list/list_item_component.rb +19 -5
- data/app/components/maglev/uikit/locale_switcher_component/locale_switcher_component.html.erb +6 -10
- data/app/components/maglev/uikit/menu_dropdown_component/menu_dropdown_component.html.erb +6 -2
- data/app/components/maglev/uikit/menu_dropdown_component.rb +244 -7
- data/app/components/maglev/uikit/page_actions_dropdown_component/page_actions_dropdown_component.html.erb +39 -46
- data/app/components/maglev/uikit/pagination_component/pagination_component.html.erb +9 -12
- data/app/components/maglev/uikit/pagination_component.rb +6 -1
- data/app/components/maglev/uikit/section_toolbar/bottom_component.html.erb +1 -1
- data/app/components/maglev/uikit/tabs_component/tabs_component.html.erb +7 -4
- data/app/components/maglev/uikit/tabs_component.rb +23 -4
- data/app/components/maglev/uikit/well/simple_well_component.html.erb +15 -0
- data/app/components/maglev/uikit/well/simple_well_component.rb +13 -0
- data/app/controllers/concerns/maglev/editor/preview_urls_concern.rb +32 -0
- data/app/controllers/concerns/maglev/editor/turbo_concern.rb +29 -0
- data/app/controllers/concerns/maglev/flash_i18n_concern.rb +1 -0
- data/app/controllers/maglev/application_controller.rb +1 -1
- data/app/controllers/maglev/assets/active_storage_proxy_controller.rb +2 -1
- data/app/controllers/maglev/editor/assets_controller.rb +1 -1
- data/app/controllers/maglev/editor/base_controller.rb +6 -32
- data/app/controllers/maglev/editor/pages/clone_controller.rb +22 -0
- data/app/controllers/maglev/editor/pages/discard_draft_controller.rb +17 -0
- data/app/controllers/maglev/editor/pages_controller.rb +26 -7
- data/app/controllers/maglev/editor/section_blocks_controller.rb +13 -9
- data/app/controllers/maglev/editor/sections_controller.rb +26 -7
- data/app/controllers/maglev/published_page_preview_controller.rb +4 -0
- data/app/helpers/maglev/application_helper.rb +6 -6
- data/app/helpers/maglev/editor/section_blocks_helper.rb +2 -2
- data/app/models/maglev/page/publishable_concern.rb +69 -0
- data/app/models/maglev/page.rb +2 -13
- data/app/models/maglev/section/block.rb +4 -0
- data/app/models/maglev/section/content_concern.rb +3 -1
- data/app/models/maglev/section.rb +21 -1
- data/app/models/maglev/sections_content_store.rb +1 -3
- data/app/services/concerns/maglev/content/helpers_concern.rb +5 -8
- data/app/services/maglev/app_container.rb +4 -2
- data/app/services/maglev/discard_page_draft_service.rb +45 -0
- data/app/services/maglev/fetch_section_screenshot_url.rb +12 -1
- data/app/services/maglev/has_unpublished_changes.rb +21 -0
- data/app/services/maglev/publish_service.rb +15 -2
- data/app/views/layouts/maglev/editor/_sidebar.html.erb +6 -1
- data/app/views/layouts/maglev/editor/application.html.erb +5 -0
- data/app/views/layouts/maglev/editor/topbar/_page_info.html.erb +1 -1
- data/app/views/layouts/maglev/editor/topbar/_publish_button.html.erb +32 -10
- data/app/views/maglev/editor/assets/_list.html.erb +2 -1
- data/app/views/maglev/editor/assets/index.html.erb +1 -0
- data/app/views/maglev/editor/home/index.html.erb +1 -1
- data/app/views/maglev/editor/links/edit/_email.html.erb +1 -1
- data/app/views/maglev/editor/links/edit/_url.html.erb +1 -1
- data/app/views/maglev/editor/pages/_list.html.erb +25 -21
- data/app/views/maglev/editor/pages/_preview.html.erb +6 -6
- data/app/views/maglev/editor/pages/_preview_empty_message.html.erb +13 -10
- data/app/views/maglev/editor/pages/discard_draft/create.turbo_stream.erb +16 -0
- data/app/views/maglev/editor/pages/index.html.erb +8 -1
- data/app/views/maglev/editor/section_blocks/_form.html.erb +5 -13
- data/app/views/maglev/editor/section_blocks/_form_with_tabs.html.erb +15 -0
- data/app/views/maglev/editor/section_blocks/_new.html.erb +1 -1
- data/app/views/maglev/editor/section_blocks/edit.html.erb +2 -2
- data/app/views/maglev/editor/section_blocks/index/_list.html.erb +2 -2
- data/app/views/maglev/editor/section_blocks/index/_tree.html.erb +1 -1
- data/app/views/maglev/editor/section_blocks/update.turbo_stream.erb +1 -1
- data/app/views/maglev/editor/sections/_form.html.erb +6 -20
- data/app/views/maglev/editor/sections/_form_with_tabs.html.erb +21 -0
- data/app/views/maglev/editor/sections/_list.html.erb +3 -3
- data/app/views/maglev/editor/sections/edit.html.erb +4 -4
- data/app/views/maglev/editor/sections/index.html.erb +1 -1
- data/app/views/maglev/editor/sections/new.html.erb +19 -2
- data/app/views/maglev/editor/sections/theme/_empty_list.html.erb +3 -0
- data/app/views/maglev/editor/sections/theme/_list.html.erb +35 -0
- data/app/views/maglev/editor/sections/theme/_screenshot_placeholder.html.erb +6 -0
- data/app/views/maglev/editor/sections/theme/_search.html.erb +22 -0
- data/app/views/maglev/editor/sections/update.turbo_stream.erb +1 -1
- data/app/views/maglev/editor/shared/_button_label.html.erb +4 -4
- data/app/views/maglev/editor/style/edit.html.erb +1 -0
- data/config/editor_importmap.rb +13 -13
- data/config/locales/editor.ar.yml +12 -4
- data/config/locales/editor.en.yml +31 -23
- data/config/locales/editor.es.yml +12 -4
- data/config/locales/editor.fr.yml +12 -4
- data/config/locales/editor.pt-BR.yml +12 -4
- data/config/routes/maglev/assets.rb +4 -0
- data/config/routes/maglev/editor.rb +38 -0
- data/config/routes/maglev/preview.rb +8 -0
- data/config/routes/maglev/public_preview.rb +6 -0
- data/config/routes.rb +8 -47
- data/db/migrate/20211013210954_translate_section_content.rb +1 -0
- data/db/migrate/20260114112058_add_published_payload_to_pages.rb +14 -0
- data/exe/tailwind-cli +1 -1
- data/lib/generators/maglev/install_generator.rb +9 -7
- data/lib/generators/maglev/templates/install/config/initializers/maglev.rb +10 -3
- data/lib/maglev/active_storage/serving_blob.rb +29 -0
- data/lib/maglev/active_storage.rb +2 -0
- data/lib/maglev/config.rb +22 -3
- data/lib/maglev/engine.rb +14 -10
- data/lib/maglev/version.rb +1 -1
- data/lib/maglev.rb +18 -3
- data/lib/tasks/db_test_all.rake +290 -0
- metadata +46 -19
- data/app/controllers/maglev/editor/page_clone_controller.rb +0 -20
- data/app/views/maglev/editor/sections/_theme_list.html.erb +0 -32
- /data/vendor/javascript/{@floating-ui--core.js → maglev/@floating-ui--core.js} +0 -0
- /data/vendor/javascript/{@floating-ui--dom.js → maglev/@floating-ui--dom.js} +0 -0
- /data/vendor/javascript/{@floating-ui--utils--dom.js → maglev/@floating-ui--utils--dom.js} +0 -0
- /data/vendor/javascript/{@floating-ui--utils.js → maglev/@floating-ui--utils.js} +0 -0
- /data/vendor/javascript/{@hotwired--stimulus.js → maglev/@hotwired--stimulus.js} +0 -0
- /data/vendor/javascript/{@hotwired--turbo-rails.js → maglev/@hotwired--turbo-rails.js} +0 -0
- /data/vendor/javascript/{@hotwired--turbo.js → maglev/@hotwired--turbo.js} +0 -0
- /data/vendor/javascript/{@rails--actioncable--src.js → maglev/@rails--actioncable--src.js} +0 -0
- /data/vendor/javascript/{@rails--request.js.js → maglev/@rails--request.js.js} +0 -0
- /data/vendor/javascript/{@shopify--draggable.js → maglev/@shopify--draggable.js} +0 -0
- /data/vendor/javascript/{el-transition.js → maglev/el-transition.js} +0 -0
- /data/vendor/javascript/{stimulus-use.js → maglev/stimulus-use.js} +0 -0
- /data/vendor/javascript/{tiptap.bundle.js → maglev/tiptap.bundle.js} +0 -0
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
<% page_layout.with_title_content @section.type_name %>
|
|
3
3
|
<% page_layout.with_notification_content maglev_flash_message %>
|
|
4
4
|
|
|
5
|
-
<% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.
|
|
5
|
+
<% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.breadcrumb')) %>
|
|
6
6
|
|
|
7
7
|
<%= form_with url: editor_section_path(@section, maglev_editing_route_context), method: :put, data: {
|
|
8
8
|
controller: 'editor-section-form',
|
|
9
9
|
'editor-section-form-section-id-value': @section.id,
|
|
10
|
-
'editor-section-form-section-lock-version-value':
|
|
10
|
+
'editor-section-form-section-lock-version-value': source_lock_version,
|
|
11
11
|
action: %(
|
|
12
12
|
editor-setting:change->editor-section-form#onSettingChange
|
|
13
13
|
editor-section-form:connected@window->editor-preview-notification-center#checkSectionLockVersion
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
dispatcher:section-#{@section.id}:persisted@window->editor-section-form#onPersist
|
|
19
19
|
)
|
|
20
20
|
} do
|
|
21
|
-
%>
|
|
22
|
-
<%= render 'maglev/editor/sections/
|
|
21
|
+
%>
|
|
22
|
+
<%= render 'maglev/editor/sections/form_with_tabs' %>
|
|
23
23
|
<% end %>
|
|
24
24
|
<% end %>
|
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
<%= render 'list' %>
|
|
7
7
|
|
|
8
8
|
<% page_layout.with_footer do %>
|
|
9
|
-
<%= link_to t('maglev.editor.sections.index.add_button'), new_editor_section_path(maglev_editing_route_context), class: maglev_button_classes(size: :big), data: { turbo_frame: '
|
|
9
|
+
<%= link_to t('maglev.editor.sections.index.add_button'), new_editor_section_path(maglev_editing_route_context), class: maglev_button_classes(size: :big), data: { turbo_frame: 'modal' } %>
|
|
10
10
|
<% end %>
|
|
11
11
|
<% end %>
|
|
@@ -1,8 +1,25 @@
|
|
|
1
|
+
<%= turbo_frame_tag 'modal' do %>
|
|
2
|
+
<%= render Maglev::Uikit::ModalComponent.new(id: 'new-section-modal', open: true) do |modal| %>
|
|
3
|
+
<% modal.with_title_content t('maglev.editor.sections.new.title') %>
|
|
4
|
+
<% modal.with_notification_content maglev_flash_message %>
|
|
5
|
+
|
|
6
|
+
<div class="flex h-[calc(100dvh-16rem)] min-h-0 w-[calc(100dvw-4rem)] flex-col gap-2 lg:w-3xl xl:w-5xl">
|
|
7
|
+
<%= render 'maglev/editor/sections/theme/search' %>
|
|
8
|
+
|
|
9
|
+
<% if @theme_sections.any? %>
|
|
10
|
+
<%= render 'maglev/editor/sections/theme/list' %>
|
|
11
|
+
<% else %>
|
|
12
|
+
<%= render 'maglev/editor/sections/theme/empty_list' %>
|
|
13
|
+
<% end %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
<% end %>
|
|
17
|
+
|
|
1
18
|
<%= render Maglev::Uikit::PageLayoutComponent.new(expanded: true, back_path: editor_real_root_path(maglev_editing_route_context)) do |page_layout| %>
|
|
2
19
|
<% page_layout.with_title_content t('maglev.editor.sections.new.title') %>
|
|
3
20
|
<% page_layout.with_notification_content maglev_flash_message %>
|
|
4
21
|
|
|
5
|
-
<% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.
|
|
22
|
+
<% page_layout.with_back_link(path: editor_sections_path(maglev_editing_route_context)).with_content(t('maglev.editor.sections.breadcrumb')) %>
|
|
6
23
|
|
|
7
24
|
<%= form_with url: editor_sections_path(maglev_editing_route_context), data: {
|
|
8
25
|
turbo_frame: '_top',
|
|
@@ -17,4 +34,4 @@
|
|
|
17
34
|
|
|
18
35
|
<%= render 'theme_list', f: f %>
|
|
19
36
|
<% end %>
|
|
20
|
-
<% end %>
|
|
37
|
+
<% end if false %>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<div class="relative -mx-4 -my-4 flex min-h-0 flex-1 flex-col overflow-y-auto">
|
|
2
|
+
<%= form_with url: editor_sections_path(maglev_editing_route_context), html: { class: 'flex min-h-0 w-full flex-1 flex-col' }, data: {
|
|
3
|
+
turbo_frame: '_top',
|
|
4
|
+
controller: 'auto-save dispatcher',
|
|
5
|
+
action: %(
|
|
6
|
+
turbo:submit-end->editor-preview-notification-center#addSection
|
|
7
|
+
turbo:submit-end->dispatcher#trigger
|
|
8
|
+
turbo:submit-end->uikit-modal#close:self
|
|
9
|
+
),
|
|
10
|
+
'dispatcher-event-name-value': 'page-preview:remove-empty-message'
|
|
11
|
+
} do |f| %>
|
|
12
|
+
<%= f.hidden_field :position, value: @position %>
|
|
13
|
+
|
|
14
|
+
<div class="grid w-full grid-cols-1 gap-4 px-4 py-4 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3">
|
|
15
|
+
<% @theme_sections.each do |section| %>
|
|
16
|
+
<%= render Maglev::Uikit::List::ListItemComponent.new(options: {
|
|
17
|
+
wrapper_tag: :label,
|
|
18
|
+
wrapper_classes: 'cursor-pointer transition duration-150 ease-in-out transform hover:scale-105 hover:z-10 hover:ring-2 hover:ring-inset hover:ring-editor-primary/50' }
|
|
19
|
+
) do |item| %>
|
|
20
|
+
<% item.with_big_image do %>
|
|
21
|
+
<% if screenshot_url = services.fetch_section_screenshot_url.call(section: section) %>
|
|
22
|
+
<%= image_tag screenshot_url, class: item.big_image_classes(class: 'rounded-md border border-gray-200'), data: { controller: 'broken-image' } %>
|
|
23
|
+
<% else %>
|
|
24
|
+
<%= render 'maglev/editor/sections/theme/screenshot_placeholder' %>
|
|
25
|
+
<% end %>
|
|
26
|
+
<% end %>
|
|
27
|
+
|
|
28
|
+
<% item.with_title_content(section.human_name) %>
|
|
29
|
+
|
|
30
|
+
<%= f.radio_button :section_type, section.id, class: 'sr-only peer' %>
|
|
31
|
+
<% end %>
|
|
32
|
+
<% end %>
|
|
33
|
+
</div>
|
|
34
|
+
<% end %>
|
|
35
|
+
</div>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<div class="relative bg-gray-200 rounded p-4">
|
|
2
|
+
<div class="h-12 bg-gray-300 mb-3 rounded"></div>
|
|
3
|
+
<div class="h-3 bg-gray-300 w-2/3 mb-2 rounded"></div>
|
|
4
|
+
<div class="h-3 bg-gray-300 w-1/2 mb-3 rounded"></div>
|
|
5
|
+
<div class="h-6 bg-gray-400 w-24 rounded"></div>
|
|
6
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<div class="flex items-center w-full flex-col gap-4 shrink-0">
|
|
2
|
+
<div class="w-full">
|
|
3
|
+
<%= render Maglev::Uikit::Form::SearchFormComponent.new(
|
|
4
|
+
name: 'query',
|
|
5
|
+
value: @query,
|
|
6
|
+
search_path: new_editor_section_path({ query: @query, position: @position }),
|
|
7
|
+
options: {
|
|
8
|
+
placeholder: t('maglev.editor.sections.new.search_placeholder'),
|
|
9
|
+
class_names: 'w-full',
|
|
10
|
+
}) %>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="w-full">
|
|
14
|
+
<div class="overflow-y-hidden pt-2 pb-4">
|
|
15
|
+
<%= render Maglev::Uikit::TabsComponent.new(variant: :pills, active_tab_index: -1) do |tabs| %>
|
|
16
|
+
<% maglev_theme.section_categories.each do |category| %>
|
|
17
|
+
<% tabs.with_tab(label: category.human_name, link: { url: new_editor_section_path(category_id: category.id, position: @position) }, active: category.id == @category_id) %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<%= turbo_stream.dispatch_event "section-#{@section.id}:persisted", payload: { lockVersion:
|
|
1
|
+
<%= turbo_stream.dispatch_event "section-#{@section.id}:persisted", payload: { lockVersion: source_lock_version }.to_json %>
|
|
2
2
|
|
|
3
3
|
<%= turbo_stream.update 'page-layout-notification', method: 'morph' do %>
|
|
4
4
|
<%= render Maglev::Uikit::BadgeComponent.new(color: :green, icon_name: 'checkbox_circle', disappear_after: 3.seconds).with_content(flash.now[:notice]) %>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<span class="group-[.is-pending]/form:hidden group-[.is-success]/form:hidden group-[.is-error]/form:hidden">
|
|
1
|
+
<span class="group-[.is-pending]/form:hidden group-[.is-success]/form:hidden group-[.is-error]/form:hidden truncate">
|
|
2
2
|
<%= label %>
|
|
3
3
|
</span>
|
|
4
4
|
|
|
5
|
-
<span class="hidden group-[.is-pending]/form:inline-flex gap-x-2 items-center">
|
|
5
|
+
<span class="hidden group-[.is-pending]/form:inline-flex gap-x-2 items-center truncate">
|
|
6
6
|
<%= pending_label %>
|
|
7
7
|
<%= render Maglev::Uikit::IconComponent.new(name: 'spinner', size: '1rem', class_names: 'animate-spin') %>
|
|
8
8
|
</span>
|
|
9
9
|
|
|
10
|
-
<span class="hidden group-[.is-success]/form:inline-flex gap-x-2 items-center">
|
|
10
|
+
<span class="hidden group-[.is-success]/form:inline-flex gap-x-2 items-center truncate">
|
|
11
11
|
<%= success_label %>
|
|
12
12
|
<%= render Maglev::Uikit::IconComponent.new(name: 'check', size: '1rem') %>
|
|
13
13
|
</span>
|
|
14
14
|
|
|
15
|
-
<span class="hidden group-[.is-error]/form:inline-flex gap-x-2 items-center">
|
|
15
|
+
<span class="hidden group-[.is-error]/form:inline-flex gap-x-2 items-center truncate">
|
|
16
16
|
<%= error_label %>
|
|
17
17
|
<%= render Maglev::Uikit::IconComponent.new(name: 'error_warning', size: '1rem') %>
|
|
18
18
|
</span>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<%= render Maglev::Uikit::PageLayoutComponent.new(back_path: editor_real_root_path(maglev_editing_route_context)) do |page_layout| %>
|
|
2
2
|
<% page_layout.with_title_content t('maglev.editor.style.edit.title') %>
|
|
3
|
+
<% page_layout.with_description_content t('maglev.editor.style.edit.sub_title') %>
|
|
3
4
|
<% page_layout.with_notification_content maglev_flash_message %>
|
|
4
5
|
|
|
5
6
|
<%= form_with url: editor_style_path(**maglev_editing_route_context), method: :put, id: 'editor-style-form', data: {
|
data/config/editor_importmap.rb
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
pin '@floating-ui/dom', to: '
|
|
4
|
-
pin '@floating-ui/core', to: '
|
|
5
|
-
pin '@floating-ui/utils', to: '
|
|
6
|
-
pin '@floating-ui/utils/dom', to: '
|
|
3
|
+
pin '@floating-ui/dom', to: 'maglev/@floating-ui--dom.js'
|
|
4
|
+
pin '@floating-ui/core', to: 'maglev/@floating-ui--core.js'
|
|
5
|
+
pin '@floating-ui/utils', to: 'maglev/@floating-ui--utils.js'
|
|
6
|
+
pin '@floating-ui/utils/dom', to: 'maglev/@floating-ui--utils--dom.js'
|
|
7
7
|
|
|
8
|
-
pin 'el-transition'
|
|
9
|
-
pin '@shopify/draggable', to: '
|
|
10
|
-
pin 'stimulus-use'
|
|
8
|
+
pin 'el-transition', to: 'maglev/el-transition.js'
|
|
9
|
+
pin '@shopify/draggable', to: 'maglev/@shopify--draggable.js'
|
|
10
|
+
pin 'stimulus-use', to: 'maglev/stimulus-use.js'
|
|
11
11
|
|
|
12
|
-
pin '@hotwired/turbo-rails', to: '
|
|
13
|
-
pin '@hotwired/turbo', to: '
|
|
14
|
-
pin '@rails/actioncable/src', to: '
|
|
15
|
-
pin '@hotwired/stimulus', to: '
|
|
16
|
-
pin '@rails/request.js', to: '
|
|
12
|
+
pin '@hotwired/turbo-rails', to: 'maglev/@hotwired--turbo-rails.js'
|
|
13
|
+
pin '@hotwired/turbo', to: 'maglev/@hotwired--turbo.js'
|
|
14
|
+
pin '@rails/actioncable/src', to: 'maglev/@rails--actioncable--src.js'
|
|
15
|
+
pin '@hotwired/stimulus', to: 'maglev/@hotwired--stimulus.js'
|
|
16
|
+
pin '@rails/request.js', to: 'maglev/@rails--request.js.js'
|
|
17
17
|
|
|
18
18
|
# check out scripts/tiptap-bundle/README.md for more information
|
|
19
|
-
pin 'tiptap', to: 'tiptap.bundle.js'
|
|
19
|
+
pin 'tiptap', to: 'maglev/tiptap.bundle.js'
|
|
20
20
|
|
|
21
21
|
pin_all_from File.expand_path('../app/components/maglev/uikit', __dir__), under: 'uikit-controllers', to: 'maglev/uikit'
|
|
22
22
|
pin_all_from File.expand_path('../app/assets/javascripts/maglev/editor/controllers', __dir__),
|
|
@@ -14,6 +14,9 @@ ar:
|
|
|
14
14
|
in_progress: "جاري النشر..."
|
|
15
15
|
success: "تم النشر!"
|
|
16
16
|
fail: "فشل!"
|
|
17
|
+
discard_draft: "إلغاء المسودة"
|
|
18
|
+
discard_draft_confirm: "هل أنت متأكد من أنك تريد إلغاء تغييرات المسودة؟"
|
|
19
|
+
publish_confirm: "هل أنت متأكد من أنك تريد نشر هذه الصفحة؟"
|
|
17
20
|
save_button:
|
|
18
21
|
default: "حفظ"
|
|
19
22
|
in_progress: "جاري الحفظ..."
|
|
@@ -42,6 +45,7 @@ ar:
|
|
|
42
45
|
preview: "معاينة الصفحة"
|
|
43
46
|
draft_preview: "نسخة مسودة"
|
|
44
47
|
live_preview: "نسخة مباشرة"
|
|
48
|
+
no_live_preview: "لا توجد نسخة مباشرة"
|
|
45
49
|
clone: "استنساخ الصفحة"
|
|
46
50
|
hide: "إخفاء الصفحة"
|
|
47
51
|
show: "إظهار الصفحة"
|
|
@@ -79,8 +83,10 @@ ar:
|
|
|
79
83
|
confirm_delete: "هل أنت متأكد من أنك تريد حذفه؟"
|
|
80
84
|
new:
|
|
81
85
|
title: "إضافة قسم"
|
|
82
|
-
|
|
86
|
+
search_placeholder: "البحث عن قسم"
|
|
87
|
+
empty_list: "لم يتم العثور على أقسام"
|
|
83
88
|
edit:
|
|
89
|
+
no_settings: "لا توجد إعدادات محددة في هذا القسم"
|
|
84
90
|
tabs:
|
|
85
91
|
main: "المحتوى"
|
|
86
92
|
advanced: "متقدم"
|
|
@@ -92,6 +98,7 @@ ar:
|
|
|
92
98
|
confirm_delete: "هل أنت متأكد من أنك تريد حذفه؟"
|
|
93
99
|
empty: "لا توجد عناصر."
|
|
94
100
|
edit:
|
|
101
|
+
no_settings: "لا توجد إعدادات محددة في هذه الكتلة"
|
|
95
102
|
tabs:
|
|
96
103
|
main: "المحتوى"
|
|
97
104
|
advanced: "متقدم"
|
|
@@ -101,6 +108,7 @@ ar:
|
|
|
101
108
|
style:
|
|
102
109
|
edit:
|
|
103
110
|
title: "تنسيق موقعك"
|
|
111
|
+
sub_title: "اضبط الألوان والخطوط وإعدادات السمة الأخرى المطبقة على كامل الموقع."
|
|
104
112
|
submit_button:
|
|
105
113
|
default: "تحديث النمط"
|
|
106
114
|
in_progress: "جاري التحديث..."
|
|
@@ -220,9 +228,9 @@ ar:
|
|
|
220
228
|
error: "فشل!"
|
|
221
229
|
destroy:
|
|
222
230
|
success: "تم الحذف!"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
231
|
+
clone:
|
|
232
|
+
create:
|
|
233
|
+
success: "تم الاستنساخ!"
|
|
226
234
|
sections:
|
|
227
235
|
sort:
|
|
228
236
|
success: 'تم الترتيب!'
|
|
@@ -14,6 +14,9 @@ en:
|
|
|
14
14
|
in_progress: "Publishing..."
|
|
15
15
|
success: "Published!"
|
|
16
16
|
fail: "Fail!"
|
|
17
|
+
discard_draft: "Discard draft"
|
|
18
|
+
discard_draft_confirm: "Are you sure you want to discard the draft changes?"
|
|
19
|
+
publish_confirm: "Are you sure you want to publish this page?"
|
|
17
20
|
save_button:
|
|
18
21
|
default: "Save"
|
|
19
22
|
in_progress: "Saving..."
|
|
@@ -42,6 +45,7 @@ en:
|
|
|
42
45
|
preview: "Preview page"
|
|
43
46
|
draft_preview: "Draft version"
|
|
44
47
|
live_preview: "Live version"
|
|
48
|
+
no_live_preview: "No live version"
|
|
45
49
|
clone: "Clone page"
|
|
46
50
|
hide: "Hide page"
|
|
47
51
|
show: "Show page"
|
|
@@ -63,12 +67,12 @@ en:
|
|
|
63
67
|
title: "Edit the current page"
|
|
64
68
|
submit_button:
|
|
65
69
|
default: "Update page"
|
|
66
|
-
in_progress: "Updating..."
|
|
70
|
+
in_progress: "Updating..."
|
|
67
71
|
cancel_button: "Cancel"
|
|
68
72
|
form:
|
|
69
73
|
tabs:
|
|
70
74
|
main: "Main"
|
|
71
|
-
seo: "SEO"
|
|
75
|
+
seo: "SEO"
|
|
72
76
|
sections:
|
|
73
77
|
breadcrumb: "Sections"
|
|
74
78
|
index:
|
|
@@ -76,15 +80,17 @@ en:
|
|
|
76
80
|
sub_title: "Re-order / delete the sections of the page"
|
|
77
81
|
empty: "There are no sections."
|
|
78
82
|
add_button: "Add a new section"
|
|
79
|
-
confirm_delete: "Are you sure you want to delete it?"
|
|
83
|
+
confirm_delete: "Are you sure you want to delete it?"
|
|
80
84
|
new:
|
|
81
85
|
title: "Add a section"
|
|
82
|
-
|
|
86
|
+
search_placeholder: "Search for a section"
|
|
87
|
+
empty_list: "No sections found"
|
|
83
88
|
edit:
|
|
89
|
+
no_settings: "There are no settings defined in this section"
|
|
84
90
|
tabs:
|
|
85
91
|
main: "Content"
|
|
86
92
|
advanced: "Advanced"
|
|
87
|
-
blocks: "Blocks"
|
|
93
|
+
blocks: "Blocks"
|
|
88
94
|
section_blocks:
|
|
89
95
|
breadcrumb: "Blocks"
|
|
90
96
|
index:
|
|
@@ -92,20 +98,22 @@ en:
|
|
|
92
98
|
confirm_delete: "Are you sure you want to delete it?"
|
|
93
99
|
empty: "There are no items."
|
|
94
100
|
edit:
|
|
101
|
+
no_settings: "There are no settings defined in this block"
|
|
95
102
|
tabs:
|
|
96
103
|
main: "Content"
|
|
97
|
-
advanced: "Advanced"
|
|
104
|
+
advanced: "Advanced"
|
|
98
105
|
settings:
|
|
99
106
|
collection_item:
|
|
100
107
|
placeholder: "Select a collection item"
|
|
101
108
|
style:
|
|
102
109
|
edit:
|
|
103
110
|
title: "Style your site"
|
|
111
|
+
sub_title: "Adjust colors, typography, and other theme settings that apply site-wide."
|
|
104
112
|
submit_button:
|
|
105
113
|
default: "Update style"
|
|
106
114
|
in_progress: "Updating..."
|
|
107
115
|
success: "Updated!"
|
|
108
|
-
fail: "Fail!"
|
|
116
|
+
fail: "Fail!"
|
|
109
117
|
image_library:
|
|
110
118
|
title: "List of images"
|
|
111
119
|
picker_title: "Select an image"
|
|
@@ -118,7 +126,7 @@ en:
|
|
|
118
126
|
wrong_files: "Make sure the size of each image is not greater than %{limit}."
|
|
119
127
|
upload_button:
|
|
120
128
|
default: "Upload images"
|
|
121
|
-
in_progress: "Uploading..."
|
|
129
|
+
in_progress: "Uploading..."
|
|
122
130
|
icon_input:
|
|
123
131
|
add_button: "Add icon"
|
|
124
132
|
replace_button: "Replace icon"
|
|
@@ -176,7 +184,7 @@ en:
|
|
|
176
184
|
confirmation_button:
|
|
177
185
|
text: "Are you sure to perform this action?"
|
|
178
186
|
confirm_button_label: "Yes"
|
|
179
|
-
cancel_button_label: "No"
|
|
187
|
+
cancel_button_label: "No"
|
|
180
188
|
error_modals:
|
|
181
189
|
stale_object:
|
|
182
190
|
title: "Sorry about that 🙇"
|
|
@@ -195,13 +203,13 @@ en:
|
|
|
195
203
|
support:
|
|
196
204
|
human:
|
|
197
205
|
locales:
|
|
198
|
-
fr:
|
|
199
|
-
en:
|
|
200
|
-
de:
|
|
201
|
-
it:
|
|
202
|
-
es:
|
|
203
|
-
ar:
|
|
204
|
-
pt:
|
|
206
|
+
fr: "Français"
|
|
207
|
+
en: "English"
|
|
208
|
+
de: "Deutsch"
|
|
209
|
+
it: "Italiano"
|
|
210
|
+
es: "Español"
|
|
211
|
+
ar: "Arabic"
|
|
212
|
+
pt: "Português"
|
|
205
213
|
storage_units:
|
|
206
214
|
format: "%{number} %{unit}"
|
|
207
215
|
units:
|
|
@@ -219,14 +227,14 @@ en:
|
|
|
219
227
|
success: "Saved!"
|
|
220
228
|
error: "Failed!"
|
|
221
229
|
destroy:
|
|
222
|
-
success: "Deleted!"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
230
|
+
success: "Deleted!"
|
|
231
|
+
clone:
|
|
232
|
+
create:
|
|
233
|
+
success: "Cloned!"
|
|
226
234
|
sections:
|
|
227
235
|
sort:
|
|
228
|
-
success:
|
|
229
|
-
error:
|
|
236
|
+
success: "Sorted!"
|
|
237
|
+
error: "Failed!"
|
|
230
238
|
create:
|
|
231
239
|
success: "Added!"
|
|
232
240
|
error: "Failed!"
|
|
@@ -265,4 +273,4 @@ en:
|
|
|
265
273
|
success: "%{name} deleted!"
|
|
266
274
|
placeholders:
|
|
267
275
|
pages:
|
|
268
|
-
visible_placeholder: "Show/Hide the live version of the page"
|
|
276
|
+
visible_placeholder: "Show/Hide the live version of the page"
|
|
@@ -14,6 +14,9 @@ es:
|
|
|
14
14
|
in_progress: "Publicando..."
|
|
15
15
|
success: "¡Publicado!"
|
|
16
16
|
fail: "¡Falló!"
|
|
17
|
+
discard_draft: "Descartar borrador"
|
|
18
|
+
discard_draft_confirm: "¿Estás seguro de que quieres descartar los cambios del borrador?"
|
|
19
|
+
publish_confirm: "¿Estás seguro de que quieres publicar esta página?"
|
|
17
20
|
save_button:
|
|
18
21
|
default: "Guardar"
|
|
19
22
|
in_progress: "Guardando..."
|
|
@@ -42,6 +45,7 @@ es:
|
|
|
42
45
|
preview: "Vista previa de la página"
|
|
43
46
|
draft_preview: "Versión borrador"
|
|
44
47
|
live_preview: "Versión en vivo"
|
|
48
|
+
no_live_preview: "Sin versión en vivo"
|
|
45
49
|
clone: "Clonar página"
|
|
46
50
|
hide: "Ocultar página"
|
|
47
51
|
show: "Mostrar página"
|
|
@@ -79,8 +83,10 @@ es:
|
|
|
79
83
|
confirm_delete: "¿Estás seguro de que quieres eliminarlo?"
|
|
80
84
|
new:
|
|
81
85
|
title: "Agregar una sección"
|
|
82
|
-
|
|
86
|
+
search_placeholder: "Buscar una sección"
|
|
87
|
+
empty_list: "No se encontraron secciones"
|
|
83
88
|
edit:
|
|
89
|
+
no_settings: "No hay configuraciones definidas en esta sección"
|
|
84
90
|
tabs:
|
|
85
91
|
main: "Contenido"
|
|
86
92
|
advanced: "Avanzado"
|
|
@@ -92,6 +98,7 @@ es:
|
|
|
92
98
|
confirm_delete: "¿Estás seguro de que quieres eliminarlo?"
|
|
93
99
|
empty: "No hay elementos."
|
|
94
100
|
edit:
|
|
101
|
+
no_settings: "No hay configuraciones definidas en este bloque"
|
|
95
102
|
tabs:
|
|
96
103
|
main: "Contenido"
|
|
97
104
|
advanced: "Avanzado"
|
|
@@ -101,6 +108,7 @@ es:
|
|
|
101
108
|
style:
|
|
102
109
|
edit:
|
|
103
110
|
title: "Estilizar tu sitio"
|
|
111
|
+
sub_title: "Ajusta colores, tipografía y otros ajustes del tema que se aplican a todo el sitio."
|
|
104
112
|
submit_button:
|
|
105
113
|
default: "Actualizar estilo"
|
|
106
114
|
in_progress: "Actualizando..."
|
|
@@ -220,9 +228,9 @@ es:
|
|
|
220
228
|
error: "¡Falló!"
|
|
221
229
|
destroy:
|
|
222
230
|
success: "¡Eliminada!"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
231
|
+
clone:
|
|
232
|
+
create:
|
|
233
|
+
success: "¡Clonada!"
|
|
226
234
|
sections:
|
|
227
235
|
sort:
|
|
228
236
|
success: '¡Ordenado!'
|
|
@@ -14,6 +14,9 @@ fr:
|
|
|
14
14
|
in_progress: "Publication..."
|
|
15
15
|
success: "Publié !"
|
|
16
16
|
fail: "Échec !"
|
|
17
|
+
discard_draft: "Annuler le brouillon"
|
|
18
|
+
discard_draft_confirm: "Êtes-vous sûr de vouloir annuler les modifications du brouillon ?"
|
|
19
|
+
publish_confirm: "Êtes-vous sûr de vouloir publier cette page ?"
|
|
17
20
|
save_button:
|
|
18
21
|
default: "Enregistrer"
|
|
19
22
|
in_progress: "Enregistrement..."
|
|
@@ -42,6 +45,7 @@ fr:
|
|
|
42
45
|
preview: "Aperçu de la page"
|
|
43
46
|
draft_preview: "Version brouillon"
|
|
44
47
|
live_preview: "Version en direct"
|
|
48
|
+
no_live_preview: "Aucune version en direct"
|
|
45
49
|
clone: "Cloner la page"
|
|
46
50
|
hide: "Masquer la page"
|
|
47
51
|
show: "Afficher la page"
|
|
@@ -79,8 +83,10 @@ fr:
|
|
|
79
83
|
confirm_delete: "Êtes-vous sûr de vouloir le supprimer ?"
|
|
80
84
|
new:
|
|
81
85
|
title: "Ajouter une section"
|
|
82
|
-
|
|
86
|
+
search_placeholder: "Rechercher une section"
|
|
87
|
+
empty_list: "Aucune section trouvée"
|
|
83
88
|
edit:
|
|
89
|
+
no_settings: "Aucun paramètre n'est défini dans cette section"
|
|
84
90
|
tabs:
|
|
85
91
|
main: "Contenu"
|
|
86
92
|
advanced: "Avancé"
|
|
@@ -92,6 +98,7 @@ fr:
|
|
|
92
98
|
confirm_delete: "Êtes-vous sûr de vouloir le supprimer ?"
|
|
93
99
|
empty: "Il n'y a pas d'éléments."
|
|
94
100
|
edit:
|
|
101
|
+
no_settings: "Aucun paramètre n'est défini dans ce bloc"
|
|
95
102
|
tabs:
|
|
96
103
|
main: "Contenu"
|
|
97
104
|
advanced: "Avancé"
|
|
@@ -101,6 +108,7 @@ fr:
|
|
|
101
108
|
style:
|
|
102
109
|
edit:
|
|
103
110
|
title: "Styliser votre site"
|
|
111
|
+
sub_title: "Modifiez les couleurs, la typographie et les autres réglages du thème appliqués à tout le site."
|
|
104
112
|
submit_button:
|
|
105
113
|
default: "Mettre à jour le style"
|
|
106
114
|
in_progress: "Mise à jour..."
|
|
@@ -220,9 +228,9 @@ fr:
|
|
|
220
228
|
error: "Échec !"
|
|
221
229
|
destroy:
|
|
222
230
|
success: "Supprimée !"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
231
|
+
clone:
|
|
232
|
+
create:
|
|
233
|
+
success: "Clonée !"
|
|
226
234
|
sections:
|
|
227
235
|
sort:
|
|
228
236
|
success: 'Trié !'
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
in_progress: "Publicando..."
|
|
15
15
|
success: "Publicado!"
|
|
16
16
|
fail: "Falhou!"
|
|
17
|
+
discard_draft: "Descartar rascunho"
|
|
18
|
+
discard_draft_confirm: "Tem certeza de que deseja descartar as alterações do rascunho?"
|
|
19
|
+
publish_confirm: "Tem certeza de que deseja publicar esta página?"
|
|
17
20
|
save_button:
|
|
18
21
|
default: "Salvar"
|
|
19
22
|
in_progress: "Salvando..."
|
|
@@ -42,6 +45,7 @@
|
|
|
42
45
|
preview: "Visualizar página"
|
|
43
46
|
draft_preview: "Versão rascunho"
|
|
44
47
|
live_preview: "Versão ao vivo"
|
|
48
|
+
no_live_preview: "Sem versão ao vivo"
|
|
45
49
|
clone: "Clonar página"
|
|
46
50
|
hide: "Ocultar página"
|
|
47
51
|
show: "Mostrar página"
|
|
@@ -79,8 +83,10 @@
|
|
|
79
83
|
confirm_delete: "Tem certeza de que deseja excluí-lo?"
|
|
80
84
|
new:
|
|
81
85
|
title: "Adicionar uma seção"
|
|
82
|
-
|
|
86
|
+
search_placeholder: "Pesquisar uma seção"
|
|
87
|
+
empty_list: "Nenhuma seção encontrada"
|
|
83
88
|
edit:
|
|
89
|
+
no_settings: "Não há configurações definidas nesta seção"
|
|
84
90
|
tabs:
|
|
85
91
|
main: "Conteúdo"
|
|
86
92
|
advanced: "Avançado"
|
|
@@ -92,6 +98,7 @@
|
|
|
92
98
|
confirm_delete: "Tem certeza de que deseja excluí-lo?"
|
|
93
99
|
empty: "Não há itens."
|
|
94
100
|
edit:
|
|
101
|
+
no_settings: "Não há configurações definidas neste bloco"
|
|
95
102
|
tabs:
|
|
96
103
|
main: "Conteúdo"
|
|
97
104
|
advanced: "Avançado"
|
|
@@ -101,6 +108,7 @@
|
|
|
101
108
|
style:
|
|
102
109
|
edit:
|
|
103
110
|
title: "Estilizar seu site"
|
|
111
|
+
sub_title: "Ajuste cores, tipografia e outras configurações do tema que valem para todo o site."
|
|
104
112
|
submit_button:
|
|
105
113
|
default: "Atualizar estilo"
|
|
106
114
|
in_progress: "Atualizando..."
|
|
@@ -220,9 +228,9 @@
|
|
|
220
228
|
error: "Falhou!"
|
|
221
229
|
destroy:
|
|
222
230
|
success: "Excluída!"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
231
|
+
clone:
|
|
232
|
+
create:
|
|
233
|
+
success: "Clonada!"
|
|
226
234
|
sections:
|
|
227
235
|
sort:
|
|
228
236
|
success: 'Ordenado!'
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
root to: 'home#index'
|
|
4
|
+
|
|
5
|
+
get 'leave', to: 'home#destroy', as: :leave
|
|
6
|
+
|
|
7
|
+
resources :assets, only: %i[index create destroy]
|
|
8
|
+
resources :icons, only: %i[index]
|
|
9
|
+
resource :link, only: %i[edit update]
|
|
10
|
+
|
|
11
|
+
# combobox routes
|
|
12
|
+
namespace :combobox do
|
|
13
|
+
resources :pages, only: :index
|
|
14
|
+
resources :collection_items, only: :index
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# always keep the scope of the current page and locale in the url
|
|
18
|
+
scope ':locale/:page_id' do
|
|
19
|
+
root to: 'home#index', as: :real_root
|
|
20
|
+
|
|
21
|
+
resources :pages do
|
|
22
|
+
member do
|
|
23
|
+
post :clone, controller: 'pages/clone', action: :create
|
|
24
|
+
post :discard_draft, controller: 'pages/discard_draft', action: :create
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
resources :sections do
|
|
29
|
+
put :sort, on: :collection
|
|
30
|
+
resources :blocks, controller: :section_blocks do
|
|
31
|
+
put :sort, on: :collection
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
resource :style, controller: :style, only: %i[edit update]
|
|
36
|
+
|
|
37
|
+
resource :publication, controller: :publication, only: :create
|
|
38
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
get 'preview/(*path)', to: 'page_preview#index',
|
|
4
|
+
defaults: { path: 'index', rendering_mode: :editor },
|
|
5
|
+
constraints: Maglev::PreviewConstraint.new,
|
|
6
|
+
as: :site_preview
|
|
7
|
+
|
|
8
|
+
post 'preview/(*path)', to: 'page_preview#create', defaults: { path: 'index', rendering_mode: :editor }
|