@lightspeed/crane 1.1.1 → 1.1.2

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.
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <div v-if="externalContent?.account">
3
+ <a :href="externalContent.account?.url" :target="externalContent.account?.target">
4
+ <img :src="accountIcon" alt="account icon" />
5
+ </a>
6
+ </div>
7
+ </template>
8
+
9
+ <script setup lang="ts">
10
+ import { useVueBaseProps } from '@lightspeed/crane';
11
+ import { computed } from 'vue';
12
+ import { Design } from '../type.ts';
13
+ import accountIcon from '../assets/account_icon.svg';
14
+
15
+ const baseProps = useVueBaseProps<unknown, Design>();
16
+ const externalContent: ExternalContentData = computed(() => baseProps.externalContent).value as ExternalContentData;
17
+ </script>
18
+
19
+ <style lang="scss" scoped>
20
+ </style>
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <div
3
+ v-if="logoDesign.visible"
4
+ class="logo-section"
5
+ >
6
+ <div
7
+ v-if="logoContent.type === 'TEXT'"
8
+ class="logo-section__text-frame"
9
+ :style="logoFrameStyle"
10
+ >
11
+ <h1
12
+ :style="logoTextStyle"
13
+ >
14
+ {{ logoTextContent }}
15
+ </h1>
16
+ </div>
17
+ <div
18
+ v-if="logoContent.type === 'IMAGE'"
19
+ class="logo-section-image"
20
+ >
21
+ <img
22
+ v-if="logoContent.image?.lowResolutionDesktopImage !== undefined"
23
+ class="logo-section-image__content"
24
+ :src="logoContent.image?.lowResolutionDesktopImage"
25
+ >
26
+ </div>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import { useLogoElementContent, useLogoElementDesign } from '@lightspeed/crane';
32
+ import { computed } from 'vue';
33
+
34
+ function getColor(color: Color | undefined) {
35
+ if (typeof color === 'undefined') {
36
+ return '';
37
+ }
38
+ return color.hex;
39
+ }
40
+
41
+ const logoContent = useLogoElementContent();
42
+ const logoDesign = useLogoElementDesign();
43
+
44
+ const logoTextContent = computed(() => {
45
+ if (logoContent.text !== undefined) {
46
+ if (logoDesign.value.capitalization === 'all') {
47
+ return logoContent.text.toUpperCase();
48
+ }
49
+ if (logoDesign.value.capitalization === 'small') {
50
+ return logoContent.text.toLowerCase();
51
+ }
52
+ }
53
+ return logoContent.text;
54
+ });
55
+
56
+ const logoTextStyle = computed(() => ({
57
+ fontSize: `${logoDesign.value.size}px`,
58
+ fontFamily: logoDesign.value.font,
59
+ color: getColor(logoDesign.value.color),
60
+ 'font-style': logoDesign.value.italic ? 'italic' : 'normal',
61
+ 'font-weight': logoDesign.value.bold ? 'bold' : 'normal',
62
+ 'letter-spacing': `${logoDesign.value.spacing ?? 0}px`,
63
+ }));
64
+
65
+ const logoFrameStyle = computed(() => ({
66
+ 'border-style': logoDesign.value.frame?.visible ? 'solid' : 'hidden',
67
+ 'border-width': `${logoDesign.value.frame?.width ?? 1}px`,
68
+ 'border-color': getColor(logoDesign.value.frame?.color),
69
+ }));
70
+ </script>
71
+
72
+ <style lang="scss" scoped>
73
+ .logo-section {
74
+ height: 100%;
75
+ width: 300px;
76
+ text-align: center;
77
+ }
78
+
79
+ .logo-section__text-frame {
80
+ text-align: center;
81
+ border-radius: 3px;
82
+ }
83
+
84
+ .logo-section-image {
85
+ height: 100%;
86
+ width: 100%;
87
+ display:block;
88
+
89
+ &__content {
90
+ height: 100%;
91
+ width: 100%;
92
+ object-fit: contain;
93
+ }
94
+ }
95
+ </style>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <nav
3
+ v-if="navigationMenu.hasContent"
4
+ role="navigation"
5
+ >
6
+ <ul>
7
+ <li
8
+ v-for="item in navigationMenu.items"
9
+ :key="item.id"
10
+ >
11
+ <a @click="item.performAction">
12
+ {{ item.title }}
13
+ </a>
14
+ </li>
15
+ </ul>
16
+ </nav>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ import { useNavigationMenuElementContent } from '@lightspeed/crane';
21
+
22
+ const navigationMenu = useNavigationMenuElementContent();
23
+ </script>
24
+
25
+ <style lang="scss" scoped>
26
+ ul {
27
+ gap: 16px;
28
+ display: flex;
29
+ overflow-x: auto;
30
+ white-space: nowrap;
31
+ height: 48px;
32
+ }
33
+
34
+ li {
35
+ list-style: none;
36
+ display: flex;
37
+ align-items: center;
38
+ min-width: fit-content;
39
+ }
40
+
41
+ a {
42
+ cursor: pointer;
43
+ font-size: 16px;
44
+ font-weight: 500;
45
+ color: #080d12;
46
+ text-decoration: none;
47
+ transition: color 0.35s ease;
48
+
49
+ &:hover {
50
+ color: #0056b3
51
+ }
52
+ }
53
+ </style>
@@ -1 +1,9 @@
1
- export default {} as const;
1
+ export default {
2
+ menu: {
3
+ type: 'NAVIGATION_MENU',
4
+ },
5
+ logo: {
6
+ type: 'LOGO',
7
+ label: '$label.logo.label',
8
+ },
9
+ } as const;
@@ -1 +1,23 @@
1
- export default {} as const;
1
+ export default {
2
+ logo: {
3
+ type: 'LOGO',
4
+ label: '$label.logo.label',
5
+ colors: ['#FFFFFF66', '#0000004D', '#00000099', '#64C7FF66', '#F9947266', '#C794CD66', '#FFD17466'],
6
+ sizes: [18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60],
7
+ defaults: {
8
+ font: 'global.fontFamily.body',
9
+ size: 20,
10
+ bold: true,
11
+ italic: false,
12
+ color: '#313131',
13
+ visible: true,
14
+ spacing: 2,
15
+ capitalization: 'all',
16
+ frame: {
17
+ visible: true,
18
+ width: 3,
19
+ color: '#313131',
20
+ },
21
+ },
22
+ },
23
+ } as const;
@@ -1,5 +1,9 @@
1
1
  export default {
2
- en: {},
2
+ en: {
3
+ '$label.logo.label': 'Logo',
4
+ },
3
5
 
4
- nl: {},
6
+ nl: {
7
+ '$label.logo.label': 'Logo',
8
+ },
5
9
  } as const;
@@ -1,11 +1,40 @@
1
1
  export default {
2
+ showcaseId: '1',
2
3
  previewImage: {
3
4
  set: {
4
5
  ORIGINAL: {
5
- url: 'example_header_showcase_1_preview.jpg',
6
+ url: 'example_header_showcase_1_preview.png',
7
+ },
8
+ },
9
+ },
10
+ blockName: '$label.showcase_1.blockName',
11
+ content: {
12
+ logo: {
13
+ type: 'LOGO',
14
+ logoType: 'TEXT',
15
+ text: '$label.showcase_1.logo.text',
16
+ },
17
+ menu: {
18
+ type: 'NAVIGATION_MENU',
19
+ text: '$label.showcase_1.menu.text',
20
+ },
21
+ },
22
+ design: {
23
+ logo: {
24
+ type: 'LOGO',
25
+ font: 'global.fontFamily.body',
26
+ size: 20,
27
+ bold: true,
28
+ italic: true,
29
+ color: '#313131',
30
+ visible: true,
31
+ spacing: 2,
32
+ capitalization: 'none',
33
+ frame: {
34
+ visible: true,
35
+ width: 3,
36
+ color: '#313131',
6
37
  },
7
38
  },
8
39
  },
9
- content: {},
10
- design: {},
11
40
  } as const;
@@ -0,0 +1,42 @@
1
+ export default {
2
+ showcaseId: '2',
3
+ previewImage: {
4
+ set: {
5
+ ORIGINAL: {
6
+ url: 'custom_section_showcase_2_preview.png',
7
+ },
8
+ },
9
+ },
10
+ blockName: '$label.showcase_2.blockName',
11
+ content: {
12
+ menu: {
13
+ type: 'NAVIGATION_MENU',
14
+ text: '$label.showcase_2.menu.text',
15
+ },
16
+ logo: {
17
+ type: 'LOGO',
18
+ logoType: 'IMAGE',
19
+ imageData: {
20
+ set: {
21
+ LOW_RES: {
22
+ url: 'lightspeed_logo.png',
23
+ },
24
+ MOBILE_WEBP_LOW_RES: {
25
+ url: 'lightspeed_logo.png',
26
+ },
27
+ MOBILE_WEBP_HI_RES: {
28
+ url: 'lightspeed_logo.png',
29
+ },
30
+ WEBP_LOW_RES: {
31
+ url: 'lightspeed_logo.png',
32
+ },
33
+ WEBP_HI_2X_RES: {
34
+ url: 'lightspeed_logo.png',
35
+ },
36
+ },
37
+ borderInfo: {},
38
+ },
39
+ },
40
+ },
41
+ design: {},
42
+ } as const;
@@ -1,5 +1,17 @@
1
1
  export default {
2
- en: {},
2
+ en: {
3
+ '$label.showcase_1.blockName': 'Custom Header',
4
+ '$label.showcase_1.menu.text': 'Navigation Menu',
5
+ '$label.showcase_2.blockName': 'Custom Header',
6
+ '$label.showcase_2.menu.text': 'Navigation Menu',
7
+ '$label.showcase_1.logo.text': 'Example Text Logo',
8
+ },
3
9
 
4
- nl: {},
10
+ nl: {
11
+ '$label.showcase_1.blockName': 'Custom Header',
12
+ '$label.showcase_1.menu.text': 'Navigatie Menu',
13
+ '$label.showcase_2.blockName': 'Custom Header',
14
+ '$label.showcase_2.menu.text': 'Navigatie Menu',
15
+ '$label.showcase_1.logo.text': 'Voorbeeld Tekst Logo',
16
+ },
5
17
  } as const;
@@ -7,7 +7,7 @@
7
7
  "deploy": "crane build && crane deploy"
8
8
  },
9
9
  "dependencies": {
10
- "@lightspeed/crane": "1.1.1",
10
+ "@lightspeed/crane": "1.1.2",
11
11
  "@lightspeed/eslint-config-crane": "1.0.2",
12
12
  "vue": "^3.4.0",
13
13
  "@ecwid/sdk": "^0.8.0"
@@ -0,0 +1,75 @@
1
+ <template>
2
+ <client-only>
3
+ <div :key="sortedLanguages.length" class="language-selector language-selector--row">
4
+ <template v-for="language in sortedLanguages" :key="`${language.code}-${language.selected}`">
5
+ <a
6
+ tabindex="0"
7
+ role="button"
8
+ :aria-label="language.code.toUpperCase()"
9
+ :class="[
10
+ 'language-selector-link',
11
+ { 'language-selector-link--active': language.selected },
12
+ ]"
13
+ @click="navigateToTranslationPage(language)"
14
+ >
15
+ {{ language.code.toUpperCase() }}
16
+ </a>
17
+ </template>
18
+ </div>
19
+ </client-only>
20
+ </template>
21
+
22
+ <script setup lang="ts">
23
+ import { useVueBaseProps } from '@lightspeed/crane';
24
+ import { computed } from 'vue';
25
+ import { Design } from '../headers/example-header/type.ts';
26
+
27
+ const baseProps = useVueBaseProps<unknown, Design>();
28
+ const externalContent = computed(() => baseProps.externalContent?.value as ExternalContentData);
29
+ const isPreviewMode = computed(() => externalContent.value?.isPreviewMode ?? false);
30
+ const sortedLanguages = computed(() => (externalContent.value?.languages
31
+ ? [...externalContent.value.languages].sort((a, b) => {
32
+ if (a.main && !b.main) return -1;
33
+ if (!a.main && b.main) return 1;
34
+ return 0;
35
+ })
36
+ : []));
37
+
38
+ const navigateToTranslationPage = (language: Language) => {
39
+ if (language.selected || isPreviewMode.value) {
40
+ return;
41
+ }
42
+ if (language.url !== undefined) {
43
+ window.open(language.url, '_self');
44
+ }
45
+ };
46
+ </script>
47
+
48
+ <style scoped lang="scss">
49
+ .language-selector {
50
+ display: flex;
51
+ }
52
+
53
+ .language-selector-link {
54
+ padding: 8px;
55
+ color: black;
56
+ cursor: pointer;
57
+ text-decoration: none;
58
+ letter-spacing: 0.5px;
59
+ }
60
+
61
+ .language-selector-link--active {
62
+ cursor: default;
63
+ font-weight: bold;
64
+ color: black;
65
+ text-decoration: underline;
66
+ }
67
+
68
+ .language-selector-link:not(:last-child)::after {
69
+ content: " ·";
70
+ position: absolute;
71
+ width: 0;
72
+ padding-left: 5px;
73
+ font-family: unset;
74
+ }
75
+ </style>
@@ -42,75 +42,66 @@ export default {
42
42
  settings: {
43
43
  image_text: {
44
44
  type: 'TEXTAREA',
45
- text: '$label.showcase_1.image_text_1.text',
45
+ text: '$label.showcase_2.image_text_1.text',
46
46
  },
47
-
48
47
  image_content: {
49
48
  type: 'IMAGE',
50
49
  imageData: {
51
50
  set: {
52
51
  LOW_RES: {
53
- url: 'new_arrivals_mobile_low.jpeg',
52
+ url: 'new_tshirts_collection_mobile_low.jpeg',
54
53
  },
55
54
  MOBILE_WEBP_LOW_RES: {
56
- url: 'new_arrivals_mobile_low.jpeg',
55
+ url: 'new_tshirts_collection_mobile_low.jpeg',
57
56
  },
58
57
  MOBILE_WEBP_HI_RES: {
59
- url: 'new_arrivals_mobile_high.jpeg',
58
+ url: 'new_tshirts_collection_mobile_high.jpeg',
60
59
  },
61
60
  WEBP_LOW_RES: {
62
- url: 'new_arrivals_pc_low.jpeg',
61
+ url: 'new_tshirts_collection_pc_low.jpeg',
63
62
  },
64
63
  WEBP_HI_2X_RES: {
65
- url: 'new_arrivals_pc_high.jpeg',
64
+ url: 'new_tshirts_collection_pc_high.jpeg',
66
65
  },
67
66
  },
68
67
  borderInfo: {},
69
68
  },
70
69
  },
71
-
72
70
  image_link: {
73
71
  type: 'INPUTBOX',
74
- text: '$label.showcase_1.image_link_1.text',
72
+ text: '$label.showcase_2.image_link_1.text',
75
73
  },
76
74
  },
77
75
  },
78
-
79
76
  {
80
77
  settings: {
81
78
  image_text: {
82
79
  type: 'TEXTAREA',
83
- text: '$label.showcase_1.image_text_2.text',
80
+ text: '$label.showcase_2.image_text_2.text',
84
81
  },
85
-
86
82
  image_content: {
87
83
  type: 'IMAGE',
88
84
  imageData: {
89
85
  set: {
90
86
  LOW_RES: {
91
- url: 'sport_look_mobile_low.jpeg',
87
+ url: 'autumn_looks_mobile_low.jpeg',
92
88
  },
93
89
  MOBILE_WEBP_LOW_RES: {
94
- url: 'sport_look_mobile_low.jpeg',
90
+ url: 'autumn_looks_mobile_low.jpeg',
95
91
  },
96
92
  MOBILE_WEBP_HI_RES: {
97
- url: 'sport_look_mobile_high.jpeg',
93
+ url: 'autumn_looks_mobile_high.jpeg',
98
94
  },
99
95
  WEBP_LOW_RES: {
100
- url: 'sport_look_pc_low.jpeg',
96
+ url: 'autumn_looks_pc_low.jpeg',
101
97
  },
102
98
  WEBP_HI_2X_RES: {
103
- url: 'sport_look_pc_high.jpeg',
99
+ url: 'autumn_looks_pc_high.jpeg',
104
100
  },
105
101
  },
106
102
  borderInfo: {},
107
103
  },
108
104
  },
109
-
110
- image_link: {
111
- type: 'INPUTBOX',
112
- text: '$label.showcase_1.image_link_1.text',
113
- },
114
105
  },
115
106
  },
116
107
 
@@ -118,37 +109,31 @@ export default {
118
109
  settings: {
119
110
  image_text: {
120
111
  type: 'TEXTAREA',
121
- text: '$label.showcase_1.image_text_3.text',
112
+ text: '$label.showcase_2.image_text_3.text',
122
113
  },
123
-
124
114
  image_content: {
125
115
  type: 'IMAGE',
126
116
  imageData: {
127
117
  set: {
128
118
  LOW_RES: {
129
- url: 'summer_accessories_mobile_low.jpeg',
119
+ url: 'bianka_wardrobe_mobile_low.jpeg',
130
120
  },
131
121
  MOBILE_WEBP_LOW_RES: {
132
- url: 'summer_accessories_mobile_low.jpeg',
122
+ url: 'bianka_wardrobe_mobile_low.jpeg',
133
123
  },
134
124
  MOBILE_WEBP_HI_RES: {
135
- url: 'summer_accessories_mobile_high.jpeg',
125
+ url: 'bianka_wardrobe_mobile_high.jpeg',
136
126
  },
137
127
  WEBP_LOW_RES: {
138
- url: 'summer_accessories_pc_low.jpeg',
128
+ url: 'bianka_wardrobe_pc_low.jpeg',
139
129
  },
140
130
  WEBP_HI_2X_RES: {
141
- url: 'summer_accessories_pc_high.jpeg',
131
+ url: 'bianka_wardrobe_pc_high.jpeg',
142
132
  },
143
133
  },
144
134
  borderInfo: {},
145
135
  },
146
136
  },
147
-
148
- image_link: {
149
- type: 'INPUTBOX',
150
- text: '$label.showcase_1.image_link_1.text',
151
- },
152
137
  },
153
138
  },
154
139
 
@@ -156,27 +141,26 @@ export default {
156
141
  settings: {
157
142
  image_text: {
158
143
  type: 'TEXTAREA',
159
- text: '$label.showcase_1.image_text_4.text',
144
+ text: '$label.showcase_2.image_text_4.text',
160
145
  },
161
-
162
146
  image_content: {
163
147
  type: 'IMAGE',
164
148
  imageData: {
165
149
  set: {
166
150
  LOW_RES: {
167
- url: 'trending_footwear_mobile_low.jpeg',
151
+ url: 'story_of_jane_mobile_low.jpeg',
168
152
  },
169
153
  MOBILE_WEBP_LOW_RES: {
170
- url: 'trending_footwear_mobile_low.jpeg',
154
+ url: 'story_of_jane_mobile_low.jpeg',
171
155
  },
172
156
  MOBILE_WEBP_HI_RES: {
173
- url: 'trending_footwear_mobile_high.jpeg',
157
+ url: 'story_of_jane_mobile_high.jpeg',
174
158
  },
175
159
  WEBP_LOW_RES: {
176
- url: 'trending_footwear_pc_low.jpeg',
160
+ url: 'story_of_jane_pc_low.jpeg',
177
161
  },
178
162
  WEBP_HI_2X_RES: {
179
- url: 'trending_footwear_pc_high.jpeg',
163
+ url: 'story_of_jane_pc_high.jpeg',
180
164
  },
181
165
  },
182
166
  borderInfo: {},
@@ -214,7 +198,7 @@ export default {
214
198
  },
215
199
  },
216
200
  layoutId: 'Caption_Under_Image',
217
- blockName: '$label.showcase_1.blockName',
201
+ blockName: '$label.showcase_2.blockName',
218
202
  },
219
203
  },
220
204
  {