maglevcms 1.7.2 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.yarn/install-state.gz +0 -0
  3. data/Rakefile +2 -1
  4. data/app/components/maglev/base_component.rb +6 -0
  5. data/app/components/maglev/block_component.rb +10 -0
  6. data/app/components/maglev/content/base.rb +8 -0
  7. data/app/components/maglev/inspector.rb +18 -0
  8. data/app/components/maglev/page_component.rb +4 -0
  9. data/app/components/maglev/section_component.rb +4 -0
  10. data/app/controllers/maglev/api_controller.rb +2 -0
  11. data/app/frontend/editor/assets/remixicons/format-superscript.svg +1 -0
  12. data/app/frontend/editor/components/dynamic-form/dynamic-input.vue +1 -1
  13. data/app/frontend/editor/components/kit/rich-text-input/extensions/marks/Superscript.js +43 -0
  14. data/app/frontend/editor/components/kit/rich-text-input/format-buttons.vue +9 -1
  15. data/app/frontend/editor/components/kit/rich-text-input.vue +11 -5
  16. data/app/frontend/editor/plugins/maglev_dummy.js +2 -0
  17. data/app/frontend/editor/services/__tests__/section.spec.js +1 -0
  18. data/app/frontend/editor/services/section.js +1 -1
  19. data/app/frontend/editor/services/theme.js +1 -1
  20. data/app/frontend/editor/spec/__mocks__/services.js +1 -1
  21. data/app/frontend/editor/store/getters.js +2 -1
  22. data/app/frontend/editor/store/index.js +1 -1
  23. data/app/models/maglev/setting_types/link.rb +1 -1
  24. data/app/models/maglev/site/locales_concern.rb +1 -1
  25. data/app/services/maglev/get_page_sections.rb +19 -2
  26. data/config/routes.rb +1 -1
  27. data/lib/maglev/preview_constraint.rb +1 -1
  28. data/lib/maglev/version.rb +1 -1
  29. data/lib/tasks/maglev_tasks.rake +0 -5
  30. data/package.json +3 -3
  31. data/tailwind.config.js +1 -1
  32. data/yarn.lock +23 -12
  33. metadata +11 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5401431fff19c66c1e16efa7c35c779bd10bd023f869bfe820fffd8afb586830
4
- data.tar.gz: e59d727dd373a1a328967ee000e5ea3be1f3af479f3e55d35e9cf3fcb31d0c9e
3
+ metadata.gz: b5f367edf49a70fcab89dd3906037a4d7e1b4711c50fd9a5b255f526f78262ec
4
+ data.tar.gz: e041ca5f4be377ba43ab62b8ac86835e6c2cb4079e77274a50966b231a41098d
5
5
  SHA512:
6
- metadata.gz: e718feab604a111fd21a2037f364d6d52a814c42998ee648e004cb6f0f41c24e23ab15861054e064f5c8997076114cd4b938fc4b157295e9cd9f752d8f1a129c
7
- data.tar.gz: 13c3563774639c79b5b8da19422a4645ea47ac510080ced169582525c40e05172a41d74b2a35a18769020609924ad953cae073ab30c7289ca24089f210bb9056
6
+ metadata.gz: 12e159b397754772159e3dfa9531d3cb147b7b73d2f0006452acce3f34aec256a9f66cbbcc5d054c2518dc6bcc476af5f382965835806255a4769426bfe4d1fe
7
+ data.tar.gz: 6837950bdf76d44df4a2ede9a4c417010714631a03b7cab000edb5ff5e8c194f913c82281915361c20680ed6bc84c1ab9799fb02efb6f137a5e734980cb8264d
Binary file
data/Rakefile CHANGED
@@ -20,7 +20,8 @@ require 'vite_ruby'
20
20
  ViteRuby.install_tasks
21
21
  ViteRuby.config.root # Ensure the engine is set as the root.
22
22
 
23
- APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
23
+ rakefile_path = Rails::VERSION::MAJOR >= 8 ? 'spec/dummy/Rakefile' : 'spec/legacy_dummy/Rakefile'
24
+ APP_RAKEFILE = File.expand_path(rakefile_path, __dir__)
24
25
  load 'rails/tasks/engine.rake'
25
26
  load 'rails/tasks/statistics.rake'
26
27
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Maglev
4
4
  class BaseComponent
5
+ include ::Maglev::Inspector
6
+
5
7
  extend Forwardable
6
8
  def_delegators :view_context, :render
7
9
 
@@ -50,5 +52,9 @@ module Maglev
50
52
  rescue NoMethodError
51
53
  raise "[Maglev] We're sorry but there is no '#{setting_id}' setting in your section/block."
52
54
  end
55
+
56
+ def site_id
57
+ site.id
58
+ end
53
59
  end
54
60
  end
@@ -42,5 +42,15 @@ module Maglev
42
42
  def tag_data
43
43
  { maglev_block_id: id }
44
44
  end
45
+
46
+ private
47
+
48
+ def section_id
49
+ section.id
50
+ end
51
+
52
+ def inspect_fields
53
+ %w[id site_id section_id name type].map { |field| [field, send(field)] }
54
+ end
45
55
  end
46
56
  end
@@ -3,6 +3,8 @@
3
3
  module Maglev
4
4
  module Content
5
5
  class Base
6
+ include ::Maglev::Inspector
7
+
6
8
  extend Forwardable
7
9
  def_delegators :scope, :site, :config
8
10
 
@@ -47,6 +49,12 @@ module Maglev
47
49
  instance_exec(site, &config.asset_host)
48
50
  end
49
51
  end
52
+
53
+ private
54
+
55
+ def inspect_fields
56
+ %w[scope tag_id].map { |field| [field, send(field).inspect] }
57
+ end
50
58
  end
51
59
  end
52
60
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Maglev
4
+ module Inspector
5
+ def inspect
6
+ string = "#<#{self.class.name}:#{object_id} "
7
+ string << inspect_fields
8
+ .map { |(name, value)| "#{name}: #{value}" }
9
+ .join(', ') << '>'
10
+ end
11
+
12
+ private
13
+
14
+ def inspect_fields
15
+ []
16
+ end
17
+ end
18
+ end
@@ -42,5 +42,9 @@ module Maglev
42
42
  rendering_mode: rendering_mode
43
43
  )
44
44
  end
45
+
46
+ def inspect_fields
47
+ [['site_id', site.id], ['page_id', page.id], ['theme', theme.id]]
48
+ end
45
49
  end
46
50
  end
@@ -122,5 +122,9 @@ module Maglev
122
122
  </div>
123
123
  HTML
124
124
  end
125
+
126
+ def inspect_fields
127
+ %w[id site_id type].map { |field| [field, send(field)] }
128
+ end
125
129
  end
126
130
  end
@@ -14,6 +14,8 @@ module Maglev
14
14
  rescue_from ActiveRecord::RecordInvalid, with: :record_errors
15
15
  rescue_from ActiveRecord::RecordNotFound, with: :not_found
16
16
  rescue_from ActiveRecord::StaleObjectError, with: :stale_record
17
+ rescue_from Maglev::Errors::UnknownSection, with: :exception_message
18
+ rescue_from Maglev::Errors::UnknownSetting, with: :exception_message
17
19
  rescue_from Maglev::Errors::NotAuthorized, with: :unauthorized
18
20
 
19
21
  helper_method :maglev_site, :maglev_theme
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M5.59567 5L10.5 10.9283L15.4043 5H18L11.7978 12.4971L18 19.9943V20H15.4091L10.5 14.0659L5.59092 20H3V19.9943L9.20216 12.4971L3 5H5.59567ZM21.5507 6.5803C21.7042 6.43453 21.8 6.22845 21.8 6C21.8 5.55817 21.4418 5.2 21 5.2C20.5582 5.2 20.2 5.55817 20.2 6C20.2 6.07624 20.2107 6.14999 20.2306 6.21983L19.0765 6.54958C19.0267 6.37497 19 6.1906 19 6C19 4.89543 19.8954 4 21 4C22.1046 4 23 4.89543 23 6C23 6.57273 22.7593 7.08923 22.3735 7.45384L20.7441 9H23V10H19V9L21.5507 6.5803V6.5803Z"></path></svg>
@@ -29,7 +29,7 @@
29
29
  :isFocused="isFocused"
30
30
  :lineBreak="options.lineBreak"
31
31
  :rows="options.nbRows"
32
- :table="options.htmlTable"
32
+ :extraExtensions="options.extraExtensions"
33
33
  @blur="$emit('blur')"
34
34
  v-model="inputValue"
35
35
  v-if="setting.type == 'text' && options.html"
@@ -0,0 +1,43 @@
1
+ import { Mark } from 'tiptap'
2
+ import { toggleMark, markInputRule, markPasteRule } from 'tiptap-commands'
3
+
4
+ export default class Superscript extends Mark {
5
+
6
+ get name() {
7
+ return 'sup'
8
+ }
9
+
10
+ get schema() {
11
+ return {
12
+ parseDOM: [
13
+ {
14
+ tag: 'sup',
15
+ },
16
+ ],
17
+ toDOM: () => ['sup', 0],
18
+ }
19
+ }
20
+
21
+ keys({ type }) {
22
+ return {
23
+ 'Mod-^': toggleMark(type),
24
+ }
25
+ }
26
+
27
+ commands({ type }) {
28
+ return () => toggleMark(type)
29
+ }
30
+
31
+ // NOTE: "^^" are used as delimiters to trigger the superscript formatting
32
+ inputRules({ type }) {
33
+ return [
34
+ markInputRule(/(?:\^\^|__)([^\^*_]+)(?:\^\^|__)$/, type),
35
+ ]
36
+ }
37
+
38
+ pasteRules({ type }) {
39
+ return [
40
+ markPasteRule(/(?:\^\^|__)([^\^*_]+)(?:\^\^|__)/g, type),
41
+ ]
42
+ }
43
+ }
@@ -22,6 +22,13 @@
22
22
  :isActive="isActive.strike()"
23
23
  @click="commands.strike"
24
24
  />
25
+ <editor-menu-button
26
+ iconName="format-superscript"
27
+ class="rounded-r-sm"
28
+ :isActive="isActive.sup()"
29
+ @click="commands.sup"
30
+ v-if="extraExtensions.superscript"
31
+ />
25
32
  </div>
26
33
  </template>
27
34
 
@@ -34,6 +41,7 @@ export default {
34
41
  props: {
35
42
  commands: { type: Object, required: true },
36
43
  isActive: { type: Object, required: true },
37
- },
44
+ extraExtensions: { type: Object, default: () => ({ table: false, superscript: false }) },
45
+ }
38
46
  }
39
47
  </script>
@@ -9,7 +9,7 @@
9
9
  </div>
10
10
  <div class="mt-1">
11
11
  <editor-menu-bar :editor="editor" v-slot="{ commands, isActive }">
12
- <div class="flex sticky top-0 z-10 pb-2 bg-white space-x-1">
12
+ <div class="flex sticky top-0 z-10 pb-2 bg-white space-x-1 overflow-x-auto">
13
13
  <editor-block-button
14
14
  :commands="commands"
15
15
  :isActive="isActive"
@@ -17,7 +17,11 @@
17
17
  v-if="!lineBreak"
18
18
  />
19
19
 
20
- <editor-format-buttons :commands="commands" :isActive="isActive" />
20
+ <editor-format-buttons
21
+ :commands="commands"
22
+ :isActive="isActive"
23
+ :extraExtensions="extraExtensions"
24
+ />
21
25
 
22
26
  <editor-list-buttons
23
27
  :commands="commands"
@@ -35,7 +39,7 @@
35
39
  :commands="commands"
36
40
  :isActive="isActive"
37
41
  class="relative"
38
- v-if="!lineBreak && table"
42
+ v-if="!lineBreak && extraExtensions.table"
39
43
  />
40
44
  </div>
41
45
  </editor-menu-bar>
@@ -69,11 +73,12 @@ import {
69
73
  Table,
70
74
  TableHeader,
71
75
  TableCell,
72
- TableRow,
76
+ TableRow
73
77
  } from 'tiptap-extensions'
74
78
  import Doc from './rich-text-input/extensions/Doc'
75
79
  import LineBreak from './rich-text-input/extensions/LineBreak'
76
80
  import Link from './rich-text-input/extensions/marks/Link'
81
+ import Superscript from './rich-text-input/extensions/marks/Superscript'
77
82
  import EditorBlockButton from './rich-text-input/block-button.vue'
78
83
  import EditorFormatButtons from './rich-text-input/format-buttons.vue'
79
84
  import EditorListButtons from './rich-text-input/list-buttons.vue'
@@ -98,7 +103,7 @@ export default {
98
103
  value: { type: String },
99
104
  lineBreak: { type: Boolean, default: false },
100
105
  rows: { type: Number, default: 2 },
101
- table: { type: Boolean, default: false },
106
+ extraExtensions: { type: Object, default: () => ({ table: false, superscript: false }) },
102
107
  },
103
108
  data() {
104
109
  return { editor: null }
@@ -151,6 +156,7 @@ export default {
151
156
  new Underline(),
152
157
  new Strike(),
153
158
  new Link({ openOnClick: false, target: null }),
159
+ new Superscript(),
154
160
  new History(),
155
161
  ]
156
162
  },
@@ -0,0 +1,2 @@
1
+ import setup from 'maglev_dummy'
2
+ setup()
@@ -3,6 +3,7 @@ import {
3
3
  simpleContentSection,
4
4
  navContentSection,
5
5
  } from '@/spec/__mocks__/section'
6
+ import { theme } from '@/spec/__mocks__/theme'
6
7
 
7
8
  describe('SectionService', () => {
8
9
  describe('#normalize', () => {
@@ -181,4 +181,4 @@ export const getBlockLabel = (block, definition, index) => {
181
181
  }
182
182
  })
183
183
  return [isBlank(label) ? `${definition.name} #${index}` : label, image]
184
- }
184
+ }
@@ -5,4 +5,4 @@ export const buildCategories = (theme) => {
5
5
  .filter((section) => section.category == category.id)
6
6
  .sort((a, b) => a.name.localeCompare(b.name)),
7
7
  }))
8
- }
8
+ }
@@ -14,7 +14,7 @@ const siteService = {
14
14
  }
15
15
 
16
16
  const themeService = {
17
- buildCategories: vi.fn(),
17
+ buildCategories: vi.fn()
18
18
  }
19
19
 
20
20
  const pageService = {
@@ -33,6 +33,7 @@ export default (services) => ({
33
33
  sections,
34
34
  blocks: sectionBlocks,
35
35
  })
36
+
36
37
  const siteSections = pageContent.sections.filter(
37
38
  (sectionContent) => getSectiondefinition(sectionContent).siteScoped,
38
39
  )
@@ -58,7 +59,7 @@ export default (services) => ({
58
59
  ({ theme }) =>
59
60
  (sectionContent) => {
60
61
  return theme.sections.find(
61
- (definition) => definition['id'] === sectionContent['type'],
62
+ (definition) => definition['id'] === sectionContent['type']
62
63
  )
63
64
  },
64
65
  sectionSettings:
@@ -19,8 +19,8 @@ const store = new Vuex.Store({
19
19
 
20
20
  store.dispatch('fetchEditorSettings')
21
21
  store.dispatch('fetchSite', true)
22
- store.dispatch('setPage', window.page)
23
22
  store.dispatch('setTheme', window.theme)
23
+ store.dispatch('setPage', window.page)
24
24
  store.dispatch('setLocale', window.locale)
25
25
 
26
26
  if (store.state.editorSettings.sitePublishable)
@@ -6,7 +6,7 @@ class Maglev::SettingTypes::Link < Maglev::SettingTypes::Base
6
6
  if value.is_a?(String)
7
7
  { text: 'Link', link_type: 'url', href: value }
8
8
  else
9
- { text: 'Link', link_type: 'url', href: '#' }.merge(value)
9
+ { text: 'Link', link_type: 'url', href: '#' }.merge(value.symbolize_keys)
10
10
  end
11
11
  end
12
12
  end
@@ -6,7 +6,7 @@ module Maglev::Site::LocalesConcern
6
6
 
7
7
  included do
8
8
  ## serializers ##
9
- if Rails::VERSION::MAJOR >= 7 && Rails::VERSION::MINOR.positive?
9
+ if Rails::VERSION::MAJOR >= 8 || (Rails::VERSION::MAJOR >= 7 && Rails::VERSION::MINOR.positive?)
10
10
  serialize :locales, coder: LocalesSerializer
11
11
  else
12
12
  serialize :locales, LocalesSerializer
@@ -23,7 +23,7 @@ module Maglev
23
23
  def call
24
24
  (page_sections || page.sections || []).map do |section|
25
25
  transform_section(section.dup)
26
- end
26
+ end.compact
27
27
  end
28
28
 
29
29
  protected
@@ -39,7 +39,7 @@ module Maglev
39
39
  def transform_section(section)
40
40
  definition = theme.sections.find(section['type'])
41
41
 
42
- raise "Unknown Maglev section type (#{section['type']})" unless definition
42
+ raise_unknown_section_error(section['type']) unless definition
43
43
 
44
44
  transform_if_site_scoped(section, definition)
45
45
  transform_section_blocks(section['blocks'], definition)
@@ -76,8 +76,11 @@ module Maglev
76
76
  end
77
77
 
78
78
  def transform_section_settings(section, definition)
79
+ remove_unused_settings(section, definition)
80
+
79
81
  definition.settings.each do |setting|
80
82
  section_setting = find_section_setting(section, setting.id)
83
+
81
84
  next unless section_setting
82
85
 
83
86
  transform_content_setting(section_setting, setting)
@@ -95,9 +98,23 @@ module Maglev
95
98
  end
96
99
  end
97
100
 
101
+ def remove_unused_settings(section, definition)
102
+ section['settings'].select! do |setting|
103
+ definition.settings.any? do |definition_setting|
104
+ definition_setting.id == setting['id']
105
+ end
106
+ end
107
+ end
108
+
98
109
  def find_section_setting(section, setting_id)
99
110
  # NOTE: works for both sections and blocks
100
111
  section['settings'].find { |setting| setting['id'] == setting_id }
101
112
  end
113
+
114
+ def raise_unknown_section_error(type)
115
+ raise ::Maglev::Errors::UnknownSection, "Unknown Maglev section type (#{type})" unless Rails.env.production?
116
+
117
+ Rails.logger.warn "[#{theme.id}] unknown Maglev section type (#{type})"
118
+ end
102
119
  end
103
120
  end
data/config/routes.rb CHANGED
@@ -33,7 +33,7 @@ Maglev::Engine.routes.draw do
33
33
  # Admin
34
34
  namespace :admin do
35
35
  root to: 'dashboard#index'
36
- resource :theme, only: %i[index show]
36
+ resource :theme, only: %i[show]
37
37
  namespace :sections, path: 'sections/:id' do
38
38
  get :preview, to: 'previews#show'
39
39
  get :preview_in_frame, to: 'previews#iframe_show'
@@ -4,7 +4,7 @@ require 'uri'
4
4
 
5
5
  module Maglev
6
6
  class PreviewConstraint
7
- CRAWLER_USER_AGENTS = /Googlebot|Twitterbot|facebookexternalhit|LinkedInBot/o.freeze
7
+ CRAWLER_USER_AGENTS = /Googlebot|Twitterbot|facebookexternalhit|LinkedInBot/o
8
8
 
9
9
  attr_reader :preview_host
10
10
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Maglev
4
- VERSION = '1.7.2'
4
+ VERSION = '1.8.0'
5
5
  end
@@ -125,11 +125,6 @@ unless ENV['VITE_RUBY_SKIP_ASSETS_PRECOMPILE_EXTENSION'] == 'true'
125
125
  Rake::Task.define_task("assets:precompile": ['maglev:vite:install_dependencies', 'maglev:vite:build_all'])
126
126
  end
127
127
 
128
- Rake::Task.define_task('assets:clean', %i[keep age]) unless Rake::Task.task_defined?('assets:clean')
129
- Rake::Task['assets:clean'].enhance do |_, args|
130
- Rake::Task['maglev:vite:clean'].invoke(*args.to_h.values)
131
- end
132
-
133
128
  if Rake::Task.task_defined?('assets:clobber')
134
129
  Rake::Task['assets:clobber'].enhance do
135
130
  Rake::Task['maglev:vite:clobber'].invoke
data/package.json CHANGED
@@ -37,8 +37,8 @@
37
37
  "prettier": "^3.1.0",
38
38
  "sass": "^1.69.5",
39
39
  "tailwindcss": "^3.4.1",
40
- "vite": "^5.0.12",
41
- "vite-plugin-ruby": "^5.0.0",
40
+ "vite": "^5.4.5",
41
+ "vite-plugin-ruby": "^5.1.0",
42
42
  "vite-plugin-vue2-svg": "^0.4.0",
43
43
  "vitest": "^0.34.6",
44
44
  "vue-template-compiler": "^2.7.16"
@@ -52,7 +52,7 @@
52
52
  "minimist": "^1.2.6",
53
53
  "eventsource": "^1.1.1",
54
54
  "async": "^2.6.4",
55
- "vite": "^5.0.5"
55
+ "vite": "^5.4.5"
56
56
  },
57
57
  "packageManager": "yarn@4.4.0"
58
58
  }
data/tailwind.config.js CHANGED
@@ -6,7 +6,7 @@ try {
6
6
  console.log('No extra Maglev Pro Tailwindcss config');
7
7
  }
8
8
 
9
- module.exports = {
9
+ export default {
10
10
  content: [
11
11
  './**/*.html.erb',
12
12
  './app/helpers/**/*.rb',
data/yarn.lock CHANGED
@@ -2570,8 +2570,8 @@ __metadata:
2570
2570
  tiptap-extensions: "npm:^1.34.0"
2571
2571
  turbolinks: "npm:^5.2.0"
2572
2572
  v-tooltip: "npm:^2.1.3"
2573
- vite: "npm:^5.0.12"
2574
- vite-plugin-ruby: "npm:^5.0.0"
2573
+ vite: "npm:^5.4.5"
2574
+ vite-plugin-ruby: "npm:^5.1.0"
2575
2575
  vite-plugin-vue2-svg: "npm:^0.4.0"
2576
2576
  vitest: "npm:^0.34.6"
2577
2577
  vue: "npm:^2.7.15"
@@ -3235,7 +3235,7 @@ __metadata:
3235
3235
  languageName: node
3236
3236
  linkType: hard
3237
3237
 
3238
- "postcss@npm:^8.4.14, postcss@npm:^8.4.23, postcss@npm:^8.4.40, postcss@npm:^8.4.41":
3238
+ "postcss@npm:^8.4.14, postcss@npm:^8.4.23, postcss@npm:^8.4.40":
3239
3239
  version: 8.4.41
3240
3240
  resolution: "postcss@npm:8.4.41"
3241
3241
  dependencies:
@@ -3246,6 +3246,17 @@ __metadata:
3246
3246
  languageName: node
3247
3247
  linkType: hard
3248
3248
 
3249
+ "postcss@npm:^8.4.43":
3250
+ version: 8.4.45
3251
+ resolution: "postcss@npm:8.4.45"
3252
+ dependencies:
3253
+ nanoid: "npm:^3.3.7"
3254
+ picocolors: "npm:^1.0.1"
3255
+ source-map-js: "npm:^1.2.0"
3256
+ checksum: 10c0/ad6f8b9b1157d678560373696109745ab97a947d449f8a997acac41c7f1e4c0f3ca4b092d6df1387f430f2c9a319987b1780dbdc27e35800a88cde9b606c1e8f
3257
+ languageName: node
3258
+ linkType: hard
3259
+
3249
3260
  "prelude-ls@npm:^1.2.1":
3250
3261
  version: 1.2.1
3251
3262
  resolution: "prelude-ls@npm:1.2.1"
@@ -4320,15 +4331,15 @@ __metadata:
4320
4331
  languageName: node
4321
4332
  linkType: hard
4322
4333
 
4323
- "vite-plugin-ruby@npm:^5.0.0":
4324
- version: 5.0.0
4325
- resolution: "vite-plugin-ruby@npm:5.0.0"
4334
+ "vite-plugin-ruby@npm:^5.1.0":
4335
+ version: 5.1.0
4336
+ resolution: "vite-plugin-ruby@npm:5.1.0"
4326
4337
  dependencies:
4327
4338
  debug: "npm:^4.3.4"
4328
4339
  fast-glob: "npm:^3.3.2"
4329
4340
  peerDependencies:
4330
4341
  vite: ">=5.0.0"
4331
- checksum: 10c0/2ff117e6c39339b8954e4ba1a4b0e0a8960f646e355b9c196d2e29a3768a32ce70fa5a303065b2268929c018a38d46ac6ac7928b85e85e765dead60c9bdadcc4
4342
+ checksum: 10c0/4c4b3193ee506a5054adbf9c08d38519b04522f88603f80c7822d2073b53bf1e3f3a3ec9459b76cb613b4eafce0991baa781fdeb297ea4acb68a7c1e2eeea0de
4332
4343
  languageName: node
4333
4344
  linkType: hard
4334
4345
 
@@ -4344,13 +4355,13 @@ __metadata:
4344
4355
  languageName: node
4345
4356
  linkType: hard
4346
4357
 
4347
- "vite@npm:^5.0.5":
4348
- version: 5.4.2
4349
- resolution: "vite@npm:5.4.2"
4358
+ "vite@npm:^5.4.5":
4359
+ version: 5.4.5
4360
+ resolution: "vite@npm:5.4.5"
4350
4361
  dependencies:
4351
4362
  esbuild: "npm:^0.21.3"
4352
4363
  fsevents: "npm:~2.3.3"
4353
- postcss: "npm:^8.4.41"
4364
+ postcss: "npm:^8.4.43"
4354
4365
  rollup: "npm:^4.20.0"
4355
4366
  peerDependencies:
4356
4367
  "@types/node": ^18.0.0 || >=20.0.0
@@ -4383,7 +4394,7 @@ __metadata:
4383
4394
  optional: true
4384
4395
  bin:
4385
4396
  vite: bin/vite.js
4386
- checksum: 10c0/23e347ca8aa6f0a774227e4eb7abae228f12c6806a727b046aa75e7ee37ffc2d68cff74360e12a42c347f79adc294e2363bc723b957bf4b382b5a8fb39e4df9d
4397
+ checksum: 10c0/89c6459452fc238cdf8e99681b30996af171c9c557af476f96408a18a639fb5a0a6ee2d2257e005b21dc284edceb604595c34920cd4a007ad18f7ebafb654c76
4387
4398
  languageName: node
4388
4399
  linkType: hard
4389
4400
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maglevcms
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.2
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Didier Lafforgue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-30 00:00:00.000000000 Z
11
+ date: 2024-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jbuilder
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - "<"
60
60
  - !ruby/object:Gem::Version
61
- version: '7.3'
61
+ version: '9'
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
64
  version: '6'
@@ -68,7 +68,7 @@ dependencies:
68
68
  requirements:
69
69
  - - "<"
70
70
  - !ruby/object:Gem::Version
71
- version: '7.3'
71
+ version: '9'
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '6'
@@ -112,14 +112,14 @@ dependencies:
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: 1.5.6
115
+ version: 1.5.9
116
116
  type: :development
117
117
  prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
- version: 1.5.6
122
+ version: 1.5.9
123
123
  description: " MaglevCMS integrates a powerful website/page builder with a polished
124
124
  UX/UI into your Ruby on Rails application, backed by a flexible and robust CMS engine.\n"
125
125
  email:
@@ -150,6 +150,7 @@ files:
150
150
  - app/components/maglev/content/select.rb
151
151
  - app/components/maglev/content/text.rb
152
152
  - app/components/maglev/content/void.rb
153
+ - app/components/maglev/inspector.rb
153
154
  - app/components/maglev/page_component.rb
154
155
  - app/components/maglev/section_component.rb
155
156
  - app/components/maglev/tag_helper.rb
@@ -208,6 +209,7 @@ files:
208
209
  - app/frontend/editor/assets/remixicons/format-list-unordered.svg
209
210
  - app/frontend/editor/assets/remixicons/format-paragraph.svg
210
211
  - app/frontend/editor/assets/remixicons/format-strikethrough.svg
212
+ - app/frontend/editor/assets/remixicons/format-superscript.svg
211
213
  - app/frontend/editor/assets/remixicons/format-underline.svg
212
214
  - app/frontend/editor/assets/remixicons/home-4-line.svg
213
215
  - app/frontend/editor/assets/remixicons/image-line.svg
@@ -290,6 +292,7 @@ files:
290
292
  - app/frontend/editor/components/kit/rich-text-input/extensions/Doc.js
291
293
  - app/frontend/editor/components/kit/rich-text-input/extensions/LineBreak.js
292
294
  - app/frontend/editor/components/kit/rich-text-input/extensions/marks/Link.js
295
+ - app/frontend/editor/components/kit/rich-text-input/extensions/marks/Superscript.js
293
296
  - app/frontend/editor/components/kit/rich-text-input/format-buttons.vue
294
297
  - app/frontend/editor/components/kit/rich-text-input/link-buttons.vue
295
298
  - app/frontend/editor/components/kit/rich-text-input/list-buttons.vue
@@ -362,6 +365,7 @@ files:
362
365
  - app/frontend/editor/plugins/filters.js
363
366
  - app/frontend/editor/plugins/i18n.js
364
367
  - app/frontend/editor/plugins/index.js
368
+ - app/frontend/editor/plugins/maglev_dummy.js
365
369
  - app/frontend/editor/plugins/tooltip.js
366
370
  - app/frontend/editor/router/index.js
367
371
  - app/frontend/editor/router/routes/base.js
@@ -576,7 +580,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
576
580
  requirements:
577
581
  - - ">="
578
582
  - !ruby/object:Gem::Version
579
- version: '2.6'
583
+ version: '3.0'
580
584
  required_rubygems_version: !ruby/object:Gem::Requirement
581
585
  requirements:
582
586
  - - ">="