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.
- checksums.yaml +4 -4
- data/app/components/maglev/content/image.rb +2 -0
- data/app/controllers/maglev/sitemap_controller.rb +31 -0
- data/app/frontend/editor/assets/remixicons/ri-palette-line.svg +1 -0
- data/app/frontend/editor/components/dynamic-form/dynamic-input.vue +1 -1
- data/app/frontend/editor/components/header-nav/publish-button.vue +1 -1
- data/app/frontend/editor/components/kit/collection-item-input.vue +1 -1
- data/app/frontend/editor/components/kit/color-input/core-input.vue +85 -0
- data/app/frontend/editor/components/kit/color-input/preset-button.vue +57 -0
- data/app/frontend/editor/components/kit/color-input/preset-dropdown.vue +46 -0
- data/app/frontend/editor/components/kit/color-input.vue +43 -0
- data/app/frontend/editor/components/kit/dropdown.vue +1 -0
- data/app/frontend/editor/components/kit/index.js +2 -2
- data/app/frontend/editor/components/kit/submit-button.vue +3 -3
- data/app/frontend/editor/components/kit/tabs.vue +2 -1
- data/app/frontend/editor/components/kit/text-input.vue +2 -2
- data/app/frontend/editor/misc/utils.js +15 -2
- data/app/frontend/editor/services/api.js +2 -2
- data/app/frontend/editor/spec/__mocks__/page.js +36 -36
- data/app/frontend/editor/spec/__mocks__/section.js +29 -29
- data/app/helpers/maglev/editor_helper.rb +1 -1
- data/app/helpers/maglev/page_preview_helper.rb +5 -1
- data/app/helpers/maglev/sitemap_helper.rb +13 -0
- data/app/models/concerns/maglev/sections_concern.rb +10 -0
- data/app/models/maglev/page/path_concern.rb +8 -1
- data/app/models/maglev/site/locales_concern.rb +8 -0
- data/app/services/concerns/maglev/get_page_sections/transform_collection_item_concern.rb +7 -0
- data/app/services/maglev/app_container.rb +2 -0
- data/app/services/maglev/persist_page.rb +23 -4
- data/app/services/maglev/setup_pages.rb +41 -5
- data/app/views/maglev/api/pages/_show.json.jbuilder +1 -2
- data/app/views/maglev/sitemap/index.xml.builder +21 -0
- data/config/routes.rb +1 -0
- data/lib/generators/maglev/install_generator.rb +3 -2
- data/lib/generators/maglev/section_generator.rb +1 -1
- data/lib/generators/maglev/templates/section/app/theme/sections/%category%/%file_name%.yml.tt +9 -9
- data/lib/maglev/engine.rb +8 -2
- data/lib/maglev/version.rb +1 -1
- data/package.json +3 -3
- data/yarn.lock +799 -565
- metadata +14 -7
- data/app/frontend/editor/components/kit/color-picker.vue +0 -81
- /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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b23017be4bbbf4d06d99cf0f94ede1136e0e0ea343e0fbbef94edb6dc4d112d4
|
4
|
+
data.tar.gz: b6e5d107a2ea7a18091ffdd084a3fed631d0726fe845e0ac0f7100f1fc3e2b60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b579c11945ca3c28bb48f59d7efc0ea70a6d1608b7275cd507c3044cf30446bf3a342163ad9c468f0f3cf690386be137401e34f6426bbc016b4306af2d701ff
|
7
|
+
data.tar.gz: d4257dfeb8ef1a210fc9147325e4cae5517c4a5f676b7c27637353573ee9c4ba315283edc4b0c97253d06b6327ba48b4fbf25199b4247f21913482b17f53777a
|
@@ -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>
|
@@ -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>
|
@@ -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
|
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-
|
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
|
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
|
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
|
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="
|
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
|
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
|
-
|
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
|
-
//
|
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',
|
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',
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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',
|
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',
|
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
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
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
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
386
|
+
byteSize: 41683,
|
387
387
|
},
|
388
388
|
},
|
389
389
|
{ id: 'button', value: { url: '#', text: 'Click here' } },
|