maglevcms 1.1.7 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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' } },