maglevcms 1.1.7 → 1.2.0

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/app/components/maglev/content/image.rb +2 -0
  3. data/app/controllers/maglev/sitemap_controller.rb +31 -0
  4. data/app/frontend/editor/assets/remixicons/ri-palette-line.svg +1 -0
  5. data/app/frontend/editor/components/dynamic-form/dynamic-input.vue +1 -1
  6. data/app/frontend/editor/components/header-nav/publish-button.vue +1 -1
  7. data/app/frontend/editor/components/kit/collection-item-input.vue +1 -1
  8. data/app/frontend/editor/components/kit/color-input/core-input.vue +85 -0
  9. data/app/frontend/editor/components/kit/color-input/preset-button.vue +57 -0
  10. data/app/frontend/editor/components/kit/color-input/preset-dropdown.vue +46 -0
  11. data/app/frontend/editor/components/kit/color-input.vue +43 -0
  12. data/app/frontend/editor/components/kit/dropdown.vue +1 -0
  13. data/app/frontend/editor/components/kit/index.js +2 -2
  14. data/app/frontend/editor/components/kit/submit-button.vue +3 -3
  15. data/app/frontend/editor/components/kit/tabs.vue +2 -1
  16. data/app/frontend/editor/components/kit/text-input.vue +2 -2
  17. data/app/frontend/editor/misc/utils.js +15 -2
  18. data/app/frontend/editor/services/api.js +2 -2
  19. data/app/frontend/editor/spec/__mocks__/page.js +36 -36
  20. data/app/frontend/editor/spec/__mocks__/section.js +29 -29
  21. data/app/helpers/maglev/editor_helper.rb +1 -1
  22. data/app/helpers/maglev/page_preview_helper.rb +5 -1
  23. data/app/helpers/maglev/sitemap_helper.rb +13 -0
  24. data/app/models/concerns/maglev/sections_concern.rb +10 -0
  25. data/app/models/maglev/page/path_concern.rb +8 -1
  26. data/app/models/maglev/site/locales_concern.rb +8 -0
  27. data/app/services/concerns/maglev/get_page_sections/transform_collection_item_concern.rb +7 -0
  28. data/app/services/maglev/app_container.rb +2 -0
  29. data/app/services/maglev/persist_page.rb +23 -4
  30. data/app/services/maglev/setup_pages.rb +41 -5
  31. data/app/views/maglev/api/pages/_show.json.jbuilder +1 -2
  32. data/app/views/maglev/sitemap/index.xml.builder +21 -0
  33. data/config/routes.rb +1 -0
  34. data/lib/generators/maglev/install_generator.rb +3 -2
  35. data/lib/generators/maglev/section_generator.rb +1 -1
  36. data/lib/generators/maglev/templates/section/app/theme/sections/%category%/%file_name%.yml.tt +9 -9
  37. data/lib/maglev/engine.rb +8 -2
  38. data/lib/maglev/version.rb +1 -1
  39. data/package.json +3 -3
  40. data/yarn.lock +799 -565
  41. metadata +14 -7
  42. data/app/frontend/editor/components/kit/color-picker.vue +0 -81
  43. /data/app/frontend/editor/assets/remixicons/{check-line.svg → ri-check-line.svg} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6ebce98e16aca2b48cc0029e9c9168602b29f8bcd320261904c634b4d97132d
4
- data.tar.gz: 463986303bb445fdc237f1089186055284ff29cb62773a878a7f4ae1d90ab7a6
3
+ metadata.gz: b23017be4bbbf4d06d99cf0f94ede1136e0e0ea343e0fbbef94edb6dc4d112d4
4
+ data.tar.gz: b6e5d107a2ea7a18091ffdd084a3fed631d0726fe845e0ac0f7100f1fc3e2b60
5
5
  SHA512:
6
- metadata.gz: c6d853c3d35076069a0ba22053b8828a8e837eabaf3c715e4ac9955ac2f38663cd6cad9d86b55f759b310633e564b19c8373d2fd06df8c3b6a05b2bb8eeaf026
7
- data.tar.gz: f3e2b09342501025517ef5a11ce16f8e2f213fd1b99fb760312edf99b321220cf2e65ea73c3feabf12c6706f27b5dede2482adb0686d160537558334daa76cd7
6
+ metadata.gz: 1b579c11945ca3c28bb48f59d7efc0ea70a6d1608b7275cd507c3044cf30446bf3a342163ad9c468f0f3cf690386be137401e34f6426bbc016b4306af2d701ff
7
+ data.tar.gz: d4257dfeb8ef1a210fc9147325e4cae5517c4a5f676b7c27637353573ee9c4ba315283edc4b0c97253d06b6327ba48b4fbf25199b4247f21913482b17f53777a
@@ -3,6 +3,8 @@
3
3
  module Maglev
4
4
  module Content
5
5
  class Image < Base
6
+ def_delegators :url, :present?
7
+
6
8
  def url
7
9
  return image[:url] if asset_host.nil? || !hosted_on_platform?
8
10
 
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Maglev
4
+ class SitemapController < ApplicationController
5
+ include Maglev::FetchersConcern
6
+ include Maglev::ServicesConcern
7
+ include Maglev::ContentLocaleConcern
8
+
9
+ before_action :verify_request_format!
10
+ before_action :fetch_maglev_site
11
+
12
+ def index
13
+ @host = request.protocol + fetch_host
14
+ @pages = fetch_pages
15
+ end
16
+
17
+ protected
18
+
19
+ def fetch_host
20
+ request.headers['HTTP_X_MAGLEV_HOST'] || request.host
21
+ end
22
+
23
+ def fetch_pages
24
+ Maglev::Page.all.visible
25
+ end
26
+
27
+ def verify_request_format!
28
+ raise ActionController::UnknownFormat, 'Sitemap is only rendered as XML' if request.format != 'xml'
29
+ end
30
+ end
31
+ end
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C17.5222 2 22 5.97778 22 10.8889C22 13.9556 19.5111 16.4444 16.4444 16.4444H14.4778C13.5556 16.4444 12.8111 17.1889 12.8111 18.1111C12.8111 18.5333 12.9778 18.9222 13.2333 19.2111C13.5 19.5111 13.6667 19.9 13.6667 20.3333C13.6667 21.2556 12.9 22 12 22C6.47778 22 2 17.5222 2 12C2 6.47778 6.47778 2 12 2ZM10.8111 18.1111C10.8111 16.0843 12.451 14.4444 14.4778 14.4444H16.4444C18.4065 14.4444 20 12.851 20 10.8889C20 7.1392 16.4677 4 12 4C7.58235 4 4 7.58235 4 12C4 16.19 7.2226 19.6285 11.324 19.9718C10.9948 19.4168 10.8111 18.7761 10.8111 18.1111ZM7.5 12C6.67157 12 6 11.3284 6 10.5C6 9.67157 6.67157 9 7.5 9C8.32843 9 9 9.67157 9 10.5C9 11.3284 8.32843 12 7.5 12ZM16.5 12C15.6716 12 15 11.3284 15 10.5C15 9.67157 15.6716 9 16.5 9C17.3284 9 18 9.67157 18 10.5C18 11.3284 17.3284 12 16.5 12ZM12 9C11.1716 9 10.5 8.32843 10.5 7.5C10.5 6.67157 11.1716 6 12 6C12.8284 6 13.5 6.67157 13.5 7.5C13.5 8.32843 12.8284 9 12 9Z"></path></svg>
@@ -62,7 +62,7 @@
62
62
  v-model="inputValue"
63
63
  v-if="setting.type == 'link'"
64
64
  />
65
- <color-picker
65
+ <color-input
66
66
  :label="setting.label"
67
67
  :name="setting.id"
68
68
  v-model="inputValue"
@@ -28,7 +28,7 @@
28
28
  spin
29
29
  v-if="isInProgress"
30
30
  />
31
- <icon name="check-line" v-if="isSuccess" />
31
+ <icon name="ri-check-line" v-if="isSuccess" />
32
32
  <icon name="ri-alert-line" v-if="isFail" />
33
33
  <span>{{ label }}</span>
34
34
  </span>
@@ -56,7 +56,7 @@ export default {
56
56
  computed: {
57
57
  selectedCollectionItem: {
58
58
  get() {
59
- return camelizeKeys(this.value)
59
+ return this.value === 'any' ? null : camelizeKeys(this.value)
60
60
  },
61
61
  set(collectionItem) {
62
62
  this.$emit('input', collectionItem ? { ...collectionItem } : null)
@@ -0,0 +1,85 @@
1
+ <template>
2
+ <div class="relative">
3
+ <div
4
+ class="absolute left-3 top-2 w-6 h-6 rounded-sm border border-gray-200"
5
+ :class="{ 'bg-checkerboard': isTransparent }"
6
+ :style="{ 'background-color': styleRgbaColor }"></div>
7
+
8
+ <span class="absolute left-11 top-1.5 font-bold text-gray-900 text-lg">#</span>
9
+
10
+ <input
11
+ type="text"
12
+ :value="inputColor"
13
+ @input="updateInput"
14
+ class="py-2 pl-14 rounded bg-gray-100 text-gray-800 focus:outline-none focus:ring placeholder-gray-500 font-normal"
15
+ :class="{
16
+ 'pr-8': hasPresets,
17
+ 'pr-2': !hasPresets
18
+ }"
19
+ autocomplete="off"
20
+ minlength="4"
21
+ maxlength="8"
22
+ size="7"
23
+ />
24
+
25
+ <preset-dropdown
26
+ v-model="updatableValue"
27
+ :presets="presets"
28
+ v-if="hasPresets"
29
+ />
30
+ </div>
31
+ </template>
32
+
33
+ <script>
34
+ import PresetDropdown from './preset-dropdown.vue'
35
+
36
+ import { colorVariableToHex, colorVariableToRgb } from '@/misc/utils'
37
+
38
+ export default {
39
+ name: 'CoreInput',
40
+ components: { PresetDropdown },
41
+ props: {
42
+ value: { type: String },
43
+ presets: {
44
+ type: Array,
45
+ default: () => [],
46
+ },
47
+ },
48
+ computed: {
49
+ inputColor() {
50
+ return this.hexColor?.replaceAll('#', '')
51
+ },
52
+ hexColor() {
53
+ return colorVariableToHex(this.value)
54
+ },
55
+ rgbColor() {
56
+ return colorVariableToRgb(this.value)
57
+ },
58
+ styleRgbaColor() {
59
+ const color = this.isTransparent ? { r: 255, g: 255, b: 255 } : (this.rgbColor || { r: 0, g: 0, b: 0 })
60
+ return `rgba(${color.r}, ${color.g}, ${color.b}, 1)`
61
+ },
62
+ isTransparent() {
63
+ return this.value === ''
64
+ },
65
+ hasPresets() {
66
+ return this.presets && this.presets.length > 0
67
+ },
68
+ updatableValue: {
69
+ get() {
70
+ return this.value
71
+ },
72
+ set(color) {
73
+ this.$emit('input', color)
74
+ },
75
+ },
76
+ },
77
+ methods: {
78
+ updateInput(event) {
79
+ var value = event.target.value
80
+ if (value.length > 0) value = `#${value}`
81
+ this.$emit('input', value)
82
+ }
83
+ }
84
+ }
85
+ </script>
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div
3
+ class="self-center cursor-pointer p-0.5 rounded-sm"
4
+ @click="selectPreset"
5
+ >
6
+ <div
7
+ class="flex items-center justify-center w-6 h-6 rounded-sm transition transform duration-200 ease-in-out hover:scale-110 select-none text-white"
8
+ :class="{
9
+ 'border border-gray-300 text-gray-800': isWhite,
10
+ 'bg-checkerboard': isTransparent,
11
+ }"
12
+ :style="{ 'background-color': hexColor }"
13
+ >
14
+ <icon name="ri-check-line" size="1rem" v-if="selected" />
15
+ </div>
16
+ </div>
17
+ </template>
18
+
19
+ <script>
20
+ import { hexToRgb, colorVariableToHex, colorVariableToRgb } from '@/misc/utils'
21
+
22
+ export default {
23
+ name: 'PresetButton',
24
+ props: {
25
+ preset: { type: String },
26
+ value: { type: String },
27
+ },
28
+ computed: {
29
+ selected() {
30
+ return !!this.value && this.value.trim().toLowerCase() === this.hexColor
31
+ },
32
+ hexColor() {
33
+ return colorVariableToHex(this.preset)
34
+ },
35
+ rgbColor() {
36
+ return colorVariableToRgb(this.preset)
37
+ },
38
+ isWhite() {
39
+ if (!this.rgbColor) return true
40
+ return this.rgbColor.r === 255 && this.rgbColor.g === 255 && this.rgbColor.b === 255
41
+ },
42
+ isTransparent() {
43
+ return this.hexColor === ''
44
+ },
45
+ borderColor() {
46
+ if (!this.selected) return 'transparent'
47
+ let color = this.isWhite ? { r: 0, g: 0, b: 0 } : this.rgbColor
48
+ return `rgba(${color.r}, ${color.g}, ${color.b}, 0.40)`
49
+ }
50
+ },
51
+ methods: {
52
+ selectPreset() {
53
+ this.$emit('input', this.hexColor)
54
+ }
55
+ }
56
+ }
57
+ </script>
@@ -0,0 +1,46 @@
1
+ <template>
2
+ <dropdown v-on="$listeners" class="absolute top-1.5 right-1">
3
+ <template v-slot:button>
4
+ <button
5
+ class="px-1 py-1 hover:text-gray-900 focus:outline-none transition-colors duration-200"
6
+ >
7
+ <icon name="ri-palette-line" size="1.25rem" />
8
+ </button>
9
+ </template>
10
+ <template v-slot:content>
11
+ <div class="flex flex-wrap gap-1">
12
+ <preset-button
13
+ v-for="preset in presets"
14
+ v-model="updatableValue"
15
+ :preset="preset"
16
+ :key="preset" />
17
+ </div>
18
+ </template>
19
+ </dropdown>
20
+ </template>
21
+
22
+ <script>
23
+ import PresetButton from './preset-button.vue'
24
+
25
+ export default {
26
+ name: 'PresetDropdown',
27
+ components: { PresetButton },
28
+ props: {
29
+ value: { type: String },
30
+ presets: {
31
+ type: Array,
32
+ default: () => [],
33
+ },
34
+ },
35
+ computed: {
36
+ updatableValue: {
37
+ get() {
38
+ return this.value
39
+ },
40
+ set(color) {
41
+ this.$emit('input', color)
42
+ },
43
+ },
44
+ }
45
+ }
46
+ </script>
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <div class="pt-1">
3
+ <label
4
+ class="flex items-center justify-between font-semibold text-gray-800"
5
+ :for="name"
6
+ v-if="showLabel"
7
+ >
8
+ <span>{{ label }}</span>
9
+ <core-input :presets="presets" v-model="updatableValue" />
10
+ </label>
11
+ </div>
12
+ </template>
13
+
14
+ <script>
15
+ import { hexToRgb } from '@/misc/utils'
16
+
17
+ import CoreInput from '@/components/kit/color-input/core-input.vue'
18
+
19
+ export default {
20
+ name: 'ColorInput',
21
+ components: { CoreInput },
22
+ props: {
23
+ label: { type: String, default: 'Label' },
24
+ name: { type: String, default: 'color' },
25
+ presets: {
26
+ type: Array,
27
+ default: () => [],
28
+ },
29
+ value: { type: String },
30
+ showLabel: { type: Boolean, default: true }
31
+ },
32
+ computed: {
33
+ updatableValue: {
34
+ get() {
35
+ return this.value
36
+ },
37
+ set(color) {
38
+ this.$emit('input', color)
39
+ },
40
+ },
41
+ },
42
+ }
43
+ </script>
@@ -5,6 +5,7 @@
5
5
  :open="open"
6
6
  :placement="placement"
7
7
  class="flex"
8
+ v-on:auto-hide="close"
8
9
  >
9
10
  <div
10
11
  class="z-10 relative flex items-center focus:outline-none select-none cursor-pointer w-full"
@@ -19,7 +19,7 @@ import CheckboxInput from './checkbox-input.vue'
19
19
  import SearchInput from './search-input.vue'
20
20
  import Pagination from './pagination/index.vue'
21
21
  import PageIcon from './page-icon.vue'
22
- import ColorPicker from './color-picker.vue'
22
+ import ColorInput from './color-input.vue'
23
23
  import SimpleSelect from './simple-select.vue'
24
24
  import CollectionItemInput from './collection-item-input.vue'
25
25
  import ListItemButton from './list-item-button.vue'
@@ -44,7 +44,7 @@ Vue.component('checkbox-input', CheckboxInput)
44
44
  Vue.component('search-input', SearchInput)
45
45
  Vue.component('pagination', Pagination)
46
46
  Vue.component('page-icon', PageIcon)
47
- Vue.component('color-picker', ColorPicker)
47
+ Vue.component('color-input', ColorInput)
48
48
  Vue.component('simple-select', SimpleSelect)
49
49
  Vue.component('collection-item-input', CollectionItemInput)
50
50
  Vue.component('list-item-button', ListItemButton)
@@ -8,17 +8,17 @@
8
8
  <span v-if="isDefaultState" data-button-label>{{ defaultLabel }}</span>
9
9
 
10
10
  <span v-if="isInProgressState" class="flex items-center justify-center">
11
- <icon icon="circle-notch" name="ri-loader-4-line" spin color="#fff" />
11
+ <icon name="ri-loader-4-line" spin color="#fff" key="progress" />
12
12
  <span class="ml-2" data-button-label>{{ inProgressLabel }}</span>
13
13
  </span>
14
14
 
15
15
  <span v-if="isSuccessState" class="flex items-center justify-center">
16
- <icon icon="circle-notch" name="check-line" color="#fff" />
16
+ <icon name="ri-check-line" color="#fff" key="success" />
17
17
  <span class="ml-2" data-button-label>{{ successLabel }}</span>
18
18
  </span>
19
19
 
20
20
  <span v-if="isFailState" class="flex items-center justify-center">
21
- <icon icon="circle-notch" name="ri-alert-line" color="#fff" />
21
+ <icon name="ri-alert-line" color="#fff" key="fail" />
22
22
  <span class="ml-2" data-button-label>{{ failLabel }}</span>
23
23
  </span>
24
24
  </button>
@@ -8,8 +8,9 @@
8
8
  v-for="(tab, index) in tabs"
9
9
  :key="`tab-${index}`"
10
10
  type="button"
11
- class="text-gray-500 py-1 pb-0 px-4 block hover:text-editor-primary focus:outline-none border-b-2 border-transparent z-10"
11
+ class=" py-1 pb-0 px-4 block hover:text-editor-primary focus:outline-none border-b-2 z-10"
12
12
  :class="{
13
+ 'text-gray-500 border-transparent': index !== currentIndex,
13
14
  'text-editor-primary font-medium border-editor-primary':
14
15
  index === currentIndex,
15
16
  }"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div>
2
+ <div class="space-y-1">
3
3
  <label
4
4
  class="block font-semibold text-gray-800"
5
5
  :for="name"
@@ -20,7 +20,7 @@
20
20
  :placeholder="placeholder"
21
21
  @blur="blur()"
22
22
  @input="updateInput"
23
- class="block w-full mt-1 py-2 px-3 rounded bg-gray-100 text-gray-800 focus:outline-none focus:ring placeholder-gray-500"
23
+ class="block w-full py-2 px-3 rounded bg-gray-100 text-gray-800 focus:outline-none focus:ring placeholder-gray-500"
24
24
  autocomplete="off"
25
25
  ref="input"
26
26
  />
@@ -111,16 +111,29 @@ export const omitEmpty = (obj) =>
111
111
  Object.keys(obj).forEach((key) => obj[key] === undefined && delete obj[key])
112
112
 
113
113
  export const hexToRgb = (hex) => {
114
- var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex.trim())
114
+ if (!hex) return null
115
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(hex.trim())
115
116
  return result
116
117
  ? {
117
118
  r: parseInt(result[1], 16),
118
119
  g: parseInt(result[2], 16),
119
- b: parseInt(result[3], 16),
120
+ b: result[3] ? parseInt(result[3], 16) : 0,
120
121
  }
121
122
  : null
122
123
  }
123
124
 
125
+ export const colorVariableToHex = (variable) => {
126
+ if (!variable) return null
127
+ const color = (variable.startsWith('--')
128
+ ? getComputedStyle(document.body).getPropertyValue(variable)
129
+ : variable).trim().toLowerCase()
130
+ return color === 'transparent' ? '' : color
131
+ }
132
+
133
+ export const colorVariableToRgb = (variable) => {
134
+ return hexToRgb(colorVariableToHex(variable))
135
+ }
136
+
124
137
  // Static pages have absolute path ("/something") but regular pages have no leading slash
125
138
  export const formatPath = (path) => {
126
139
  return path[0] === '/' ? path : `/${path}`
@@ -18,10 +18,10 @@ const api = axios.create({
18
18
  Accept: 'application/json',
19
19
  },
20
20
  transformResponse(data) {
21
- // camelcase in JS
21
+ // for "security" (even if the Rails API already camelcases the JSON),
22
+ // we also camelcase the response in the Editor.
22
23
  // console.log('[DEBUG] API response', data)
23
24
  return data ? camelcaseObjectDeep(JSON.parse(data)) : {}
24
- // return data ? JSON.parse(data) : {} // LEGACY
25
25
  },
26
26
  })
27
27
 
@@ -9,7 +9,7 @@ export const pageSections = [
9
9
  settings: [
10
10
  {
11
11
  id: 'link',
12
- value: { href: '#', text: 'Home', link_type: 'url' },
12
+ value: { href: '#', text: 'Home', linkType: 'url' },
13
13
  },
14
14
  ],
15
15
  },
@@ -19,7 +19,7 @@ export const pageSections = [
19
19
  settings: [
20
20
  {
21
21
  id: 'link',
22
- value: { href: '#', text: 'About us', link_type: 'url' },
22
+ value: { href: '#', text: 'About us', linkType: 'url' },
23
23
  },
24
24
  ],
25
25
  },
@@ -33,11 +33,11 @@ export const pageSections = [
33
33
  href: '//contact',
34
34
  text: 'Contact',
35
35
  email: null,
36
- link_id: 9,
37
- link_type: 'page',
38
- link_label: 'Contact us',
39
- section_id: null,
40
- open_new_window: false,
36
+ linkId: 9,
37
+ linkType: 'page',
38
+ linkLabel: 'Contact us',
39
+ sectionId: null,
40
+ openNewWindow: false,
41
41
  },
42
42
  },
43
43
  ],
@@ -52,11 +52,11 @@ export const pageSections = [
52
52
  href: '/products',
53
53
  text: 'Products #1',
54
54
  email: null,
55
- link_id: 'd870133f9a075477a96a58e7639d40c5',
56
- link_type: 'page',
57
- link_label: 'Products',
58
- section_id: null,
59
- open_new_window: true,
55
+ linkId: 'd870133f9a075477a96a58e7639d40c5',
56
+ linkType: 'page',
57
+ linkLabel: 'Products',
58
+ sectionId: null,
59
+ openNewWindow: true,
60
60
  },
61
61
  },
62
62
  ],
@@ -71,7 +71,7 @@ export const pageSections = [
71
71
  width: 572,
72
72
  height: 290,
73
73
  filename: 'Screen Shot 2021-06-30 at 3.44.04 PM.png',
74
- byte_size: 35070,
74
+ byteSize: 35070,
75
75
  },
76
76
  },
77
77
  ],
@@ -96,7 +96,7 @@ export const pageSections = [
96
96
  width: 516,
97
97
  height: 320,
98
98
  filename: 'img-91-3.jpg',
99
- byte_size: 41683,
99
+ byteSize: 41683,
100
100
  },
101
101
  },
102
102
  { id: 'button', value: { url: '#', text: 'Click here' } },
@@ -119,7 +119,7 @@ export const pageSections = [
119
119
  width: 1920,
120
120
  height: 1200,
121
121
  filename: 'img-97.jpg',
122
- byte_size: 458107,
122
+ byteSize: 458107,
123
123
  },
124
124
  },
125
125
  ],
@@ -137,7 +137,7 @@ export const pageSections = [
137
137
  width: 516,
138
138
  height: 400,
139
139
  filename: 'inner-74-2.jpg',
140
- byte_size: 63881,
140
+ byteSize: 63881,
141
141
  },
142
142
  },
143
143
  ],
@@ -155,7 +155,7 @@ export const pageSections = [
155
155
  width: 516,
156
156
  height: 320,
157
157
  filename: 'img-91-4.jpg',
158
- byte_size: 21808,
158
+ byteSize: 21808,
159
159
  },
160
160
  },
161
161
  ],
@@ -173,7 +173,7 @@ export const pageSections = [
173
173
  width: 1920,
174
174
  height: 1200,
175
175
  filename: 'img-91.jpg',
176
- byte_size: 180178,
176
+ byteSize: 180178,
177
177
  },
178
178
  },
179
179
  ],
@@ -220,7 +220,7 @@ export const normalizedPage = {
220
220
  id: 'RiEo8C3f',
221
221
  type: 'navbar_item',
222
222
  settings: [
223
- { id: 'link', value: { href: '#', text: 'Home', link_type: 'url' } },
223
+ { id: 'link', value: { href: '#', text: 'Home', linkType: 'url' } },
224
224
  ],
225
225
  },
226
226
  P1fGieWs: {
@@ -229,7 +229,7 @@ export const normalizedPage = {
229
229
  settings: [
230
230
  {
231
231
  id: 'link',
232
- value: { href: '#', text: 'About us', link_type: 'url' },
232
+ value: { href: '#', text: 'About us', linkType: 'url' },
233
233
  },
234
234
  ],
235
235
  },
@@ -243,11 +243,11 @@ export const normalizedPage = {
243
243
  href: '//contact',
244
244
  text: 'Contact',
245
245
  email: null,
246
- link_id: 9,
247
- link_type: 'page',
248
- link_label: 'Contact us',
249
- section_id: null,
250
- open_new_window: false,
246
+ linkId: 9,
247
+ linkType: 'page',
248
+ linkLabel: 'Contact us',
249
+ sectionId: null,
250
+ openNewWindow: false,
251
251
  },
252
252
  },
253
253
  ],
@@ -262,11 +262,11 @@ export const normalizedPage = {
262
262
  href: '/products',
263
263
  text: 'Products #1',
264
264
  email: null,
265
- link_id: 'd870133f9a075477a96a58e7639d40c5',
266
- link_type: 'page',
267
- link_label: 'Products',
268
- section_id: null,
269
- open_new_window: true,
265
+ linkId: 'd870133f9a075477a96a58e7639d40c5',
266
+ linkType: 'page',
267
+ linkLabel: 'Products',
268
+ sectionId: null,
269
+ openNewWindow: true,
270
270
  },
271
271
  },
272
272
  ],
@@ -284,7 +284,7 @@ export const normalizedPage = {
284
284
  width: 1920,
285
285
  height: 1200,
286
286
  filename: 'img-97.jpg',
287
- byte_size: 458107,
287
+ byteSize: 458107,
288
288
  },
289
289
  },
290
290
  ],
@@ -302,7 +302,7 @@ export const normalizedPage = {
302
302
  width: 516,
303
303
  height: 400,
304
304
  filename: 'inner-74-2.jpg',
305
- byte_size: 63881,
305
+ byteSize: 63881,
306
306
  },
307
307
  },
308
308
  ],
@@ -320,7 +320,7 @@ export const normalizedPage = {
320
320
  width: 516,
321
321
  height: 320,
322
322
  filename: 'img-91-4.jpg',
323
- byte_size: 21808,
323
+ byteSize: 21808,
324
324
  },
325
325
  },
326
326
  ],
@@ -338,7 +338,7 @@ export const normalizedPage = {
338
338
  width: 1920,
339
339
  height: 1200,
340
340
  filename: 'img-91.jpg',
341
- byte_size: 180178,
341
+ byteSize: 180178,
342
342
  },
343
343
  },
344
344
  ],
@@ -358,7 +358,7 @@ export const normalizedPage = {
358
358
  width: 572,
359
359
  height: 290,
360
360
  filename: 'Screen Shot 2021-06-30 at 3.44.04 PM.png',
361
- byte_size: 35070,
361
+ byteSize: 35070,
362
362
  },
363
363
  },
364
364
  ],
@@ -383,7 +383,7 @@ export const normalizedPage = {
383
383
  width: 516,
384
384
  height: 320,
385
385
  filename: 'img-91-3.jpg',
386
- byte_size: 41683,
386
+ byteSize: 41683,
387
387
  },
388
388
  },
389
389
  { id: 'button', value: { url: '#', text: 'Click here' } },