@lightspeed/crane 1.1.2 → 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 (134) hide show
  1. package/bin/crane.js +0 -1
  2. package/dist/app.d.mts +20 -2
  3. package/dist/app.d.ts +20 -2
  4. package/dist/app.mjs +1 -1
  5. package/dist/cli.mjs +10 -23
  6. package/package.json +10 -5
  7. package/template/footers/example-footer/ExampleFooter.vue +6 -1
  8. package/template/footers/example-footer/assets/cart.svg +19 -0
  9. package/template/footers/example-footer/component/LegalLinks.vue +2 -2
  10. package/template/footers/example-footer/component/MadeWith.vue +23 -0
  11. package/template/footers/example-footer/component/ReportAbuse.vue +4 -3
  12. package/template/footers/example-footer/showcases/1.ts +1 -1
  13. package/template/headers/example-header/ExampleHeader.vue +17 -2
  14. package/template/headers/example-header/component/Account.vue +4 -4
  15. package/template/headers/example-header/component/Cart.vue +14 -33
  16. package/template/headers/example-header/settings/content.ts +1 -9
  17. package/template/headers/example-header/settings/design.ts +1 -23
  18. package/template/package.json +1 -1
  19. package/template/reference/sections/about-us/AboutUs.vue +73 -0
  20. package/template/reference/sections/about-us/assets/our_company_in_numbers.jpg +0 -0
  21. package/template/reference/sections/about-us/assets/our_company_in_numbers_preview.jpg +0 -0
  22. package/template/reference/sections/about-us/assets/our_team.jpg +0 -0
  23. package/template/reference/sections/about-us/assets/our_team_preview.jpg +0 -0
  24. package/template/reference/sections/about-us/client.ts +6 -0
  25. package/template/reference/sections/about-us/component/Image.vue +94 -0
  26. package/template/reference/sections/about-us/component/Stats.vue +155 -0
  27. package/template/reference/sections/about-us/component/Title.vue +32 -0
  28. package/template/reference/sections/about-us/server.ts +6 -0
  29. package/template/reference/sections/about-us/settings/content.ts +64 -0
  30. package/template/reference/sections/about-us/settings/design.ts +74 -0
  31. package/template/reference/sections/about-us/settings/layout.ts +12 -0
  32. package/template/reference/sections/about-us/settings/translations.ts +151 -0
  33. package/template/reference/sections/about-us/showcases/1.ts +155 -0
  34. package/template/reference/sections/about-us/showcases/2.ts +143 -0
  35. package/template/reference/sections/about-us/showcases/translations.ts +259 -0
  36. package/template/reference/sections/about-us/type.ts +5 -0
  37. package/template/reference/sections/about-us/util/visibility-provider.ts +27 -0
  38. package/template/reference/sections/intro-slider/IntroSlider.vue +77 -0
  39. package/template/reference/sections/intro-slider/assets/bike_1.jpg +0 -0
  40. package/template/reference/sections/intro-slider/assets/bike_1@2x.jpg +0 -0
  41. package/template/reference/sections/intro-slider/assets/bike_2.jpg +0 -0
  42. package/template/reference/sections/intro-slider/assets/bike_2@2x.jpg +0 -0
  43. package/template/reference/sections/intro-slider/assets/bike_3.jpg +0 -0
  44. package/template/reference/sections/intro-slider/assets/bike_3@2x.jpg +0 -0
  45. package/template/reference/sections/intro-slider/assets/bike_4.jpg +0 -0
  46. package/template/reference/sections/intro-slider/assets/bike_4@2x.jpg +0 -0
  47. package/template/reference/sections/intro-slider/assets/bike_5.jpg +0 -0
  48. package/template/reference/sections/intro-slider/assets/bike_5@2x.jpg +0 -0
  49. package/template/reference/sections/intro-slider/assets/bike_6.jpg +0 -0
  50. package/template/reference/sections/intro-slider/assets/bike_6@2x.jpg +0 -0
  51. package/template/reference/sections/intro-slider/assets/category_1.jpg +0 -0
  52. package/template/reference/sections/intro-slider/assets/category_1@2x.jpg +0 -0
  53. package/template/reference/sections/intro-slider/assets/category_2.jpg +0 -0
  54. package/template/reference/sections/intro-slider/assets/category_2@2x.jpg +0 -0
  55. package/template/reference/sections/intro-slider/assets/category_3.jpg +0 -0
  56. package/template/reference/sections/intro-slider/assets/category_3@2x.jpg +0 -0
  57. package/template/reference/sections/intro-slider/assets/category_5.jpg +0 -0
  58. package/template/reference/sections/intro-slider/assets/category_5@2x.jpg +0 -0
  59. package/template/reference/sections/intro-slider/assets/category_6.jpg +0 -0
  60. package/template/reference/sections/intro-slider/assets/category_6@2x.jpg +0 -0
  61. package/template/reference/sections/intro-slider/assets/custom_section_showcase_1_preview.png +0 -0
  62. package/template/reference/sections/intro-slider/assets/custom_section_showcase_2_preview.png +0 -0
  63. package/template/reference/sections/intro-slider/client.ts +5 -0
  64. package/template/reference/sections/intro-slider/component/Slider.vue +235 -0
  65. package/template/reference/sections/intro-slider/component/Title.vue +106 -0
  66. package/template/reference/sections/intro-slider/entity/color.ts +4 -0
  67. package/template/reference/sections/intro-slider/server.ts +5 -0
  68. package/template/reference/sections/intro-slider/settings/content.ts +43 -0
  69. package/template/reference/sections/intro-slider/settings/design.ts +88 -0
  70. package/template/reference/sections/intro-slider/settings/layout.ts +12 -0
  71. package/template/reference/sections/intro-slider/settings/translations.ts +53 -0
  72. package/template/reference/sections/intro-slider/showcases/1.ts +275 -0
  73. package/template/reference/sections/intro-slider/showcases/2.ts +271 -0
  74. package/template/reference/sections/intro-slider/showcases/translations.ts +88 -0
  75. package/template/reference/sections/intro-slider/type.ts +5 -0
  76. package/template/reference/sections/tag-lines/TagLines.vue +158 -0
  77. package/template/reference/sections/tag-lines/assets/explore_our_holiday_gift_guide.jpg +0 -0
  78. package/template/reference/sections/tag-lines/assets/fall_is_here.jpg +0 -0
  79. package/template/reference/sections/tag-lines/assets/fall_is_here_preview.jpg +0 -0
  80. package/template/reference/sections/tag-lines/assets/folding_bikes.jpg +0 -0
  81. package/template/reference/sections/tag-lines/assets/hybrid_bikes.jpg +0 -0
  82. package/template/reference/sections/tag-lines/assets/mountain_and_road_bikes.jpg +0 -0
  83. package/template/reference/sections/tag-lines/assets/shop_chelsea_boots.jpg +0 -0
  84. package/template/reference/sections/tag-lines/assets/sweater_weather.jpg +0 -0
  85. package/template/reference/sections/tag-lines/assets/what_we_sell.jpg +0 -0
  86. package/template/reference/sections/tag-lines/assets/what_we_sell_preview.jpg +0 -0
  87. package/template/reference/sections/tag-lines/client.ts +5 -0
  88. package/template/reference/sections/tag-lines/component/HighlightedText.vue +50 -0
  89. package/template/reference/sections/tag-lines/component/SectionImage.vue +78 -0
  90. package/template/reference/sections/tag-lines/component/Title.vue +51 -0
  91. package/template/reference/sections/tag-lines/composables/highlighted-text-image-list.ts +34 -0
  92. package/template/reference/sections/tag-lines/server.ts +5 -0
  93. package/template/reference/sections/tag-lines/settings/content.ts +37 -0
  94. package/template/reference/sections/tag-lines/settings/design.ts +81 -0
  95. package/template/reference/sections/tag-lines/settings/layout.ts +12 -0
  96. package/template/reference/sections/tag-lines/settings/translations.ts +61 -0
  97. package/template/reference/sections/tag-lines/showcases/1.ts +190 -0
  98. package/template/reference/sections/tag-lines/showcases/2.ts +190 -0
  99. package/template/reference/sections/tag-lines/showcases/translations.ts +49 -0
  100. package/template/reference/sections/tag-lines/type.ts +5 -0
  101. package/template/reference/shared/components/Button.vue +151 -0
  102. package/template/reference/shared/components/SectionWrapper.vue +26 -0
  103. package/template/reference/shared/components/Tagline.vue +45 -0
  104. package/template/reference/shared/utils/color.ts +16 -0
  105. package/template/reference/shared/utils/styles.ts +12 -0
  106. package/template/reference/templates/assets/reference_template_apparel_cover_image.jpg +0 -0
  107. package/template/reference/templates/assets/reference_template_bike_cover_image.jpg +0 -0
  108. package/template/reference/templates/reference-template-apparel.ts +44 -0
  109. package/template/reference/templates/reference-template-bike.ts +44 -0
  110. package/template/sections/example-section/ExampleSection.vue +21 -24
  111. package/template/sections/example-section/assets/arrow.svg +3 -0
  112. package/template/sections/example-section/assets/bike_accessories_high.jpg +0 -0
  113. package/template/sections/example-section/assets/bike_accessories_low.jpg +0 -0
  114. package/template/sections/example-section/assets/bike_new_arrivals_high.jpg +0 -0
  115. package/template/sections/example-section/assets/bike_new_arrivals_low.jpg +0 -0
  116. package/template/sections/example-section/assets/custom_section_showcase_3_preview.jpg +0 -0
  117. package/template/sections/example-section/assets/fixed_gears_high.jpg +0 -0
  118. package/template/sections/example-section/assets/fixed_gears_low.jpg +0 -0
  119. package/template/sections/example-section/assets/repair_service_high.jpg +0 -0
  120. package/template/sections/example-section/assets/repair_service_low.jpg +0 -0
  121. package/template/sections/example-section/component/button/Button.vue +87 -0
  122. package/template/sections/example-section/component/selectbox/Selectbox.vue +45 -0
  123. package/template/sections/example-section/component/toggle/Toggle.vue +110 -0
  124. package/template/sections/example-section/settings/content.ts +45 -0
  125. package/template/sections/example-section/settings/translations.ts +87 -7
  126. package/template/sections/example-section/showcases/1.ts +43 -0
  127. package/template/sections/example-section/showcases/2.ts +43 -0
  128. package/template/sections/example-section/showcases/3.ts +241 -0
  129. package/template/sections/example-section/showcases/translations.ts +205 -1
  130. package/template/shared/{LanguageSelector.vue → components/LanguageSelector.vue} +5 -5
  131. package/template/shared/components/SectionWrapper.vue +26 -0
  132. package/template/shared/utils.ts +28 -0
  133. package/template/templates/template.ts +2 -1
  134. package/types.d.ts +96 -70
@@ -0,0 +1,271 @@
1
+ export default {
2
+ showcaseId: '2',
3
+ layoutId: 'Wide_Title_And_Images_Without_Border_Radius',
4
+ previewImage: {
5
+ set: {
6
+ ORIGINAL: {
7
+ url: 'custom_section_showcase_2_preview.png',
8
+ },
9
+ },
10
+ },
11
+ blockName: '$label.showcase_2.blockName',
12
+ content: {
13
+ section_title: {
14
+ type: 'TEXTAREA',
15
+ text: '$label.showcase_2.section_title.text',
16
+ },
17
+ section_tagline: {
18
+ type: 'INPUTBOX',
19
+ text: '$label.showcase_2.section_tagline.text',
20
+ },
21
+ section_button: {
22
+ type: 'BUTTON',
23
+ title: '$label.showcase_2.section_button.title',
24
+ buttonType: 'HYPER_LINK',
25
+ },
26
+ slider: {
27
+ type: 'DECK',
28
+ cards: [
29
+ {
30
+ settings: {
31
+ image_text: {
32
+ type: 'INPUTBOX',
33
+ text: '$label.showcase_2.slide_text_1.text',
34
+ },
35
+ image_content: {
36
+ type: 'IMAGE',
37
+ imageData: {
38
+ set: {
39
+ LOW_RES: {
40
+ url: 'bike_1.jpg',
41
+ },
42
+ MOBILE_WEBP_LOW_RES: {
43
+ url: 'bike_1.jpg',
44
+ },
45
+ MOBILE_WEBP_HI_RES: {
46
+ url: 'bike_1@2x.jpg',
47
+ },
48
+ WEBP_LOW_RES: {
49
+ url: 'bike_1@2x.jpg',
50
+ },
51
+ WEBP_HI_2X_RES: {
52
+ url: 'bike_1@2x.jpg',
53
+ },
54
+ },
55
+ borderInfo: {},
56
+ },
57
+ },
58
+ },
59
+ },
60
+ {
61
+ settings: {
62
+ image_text: {
63
+ type: 'INPUTBOX',
64
+ text: '$label.showcase_2.slide_text_2.text',
65
+ },
66
+ image_content: {
67
+ type: 'IMAGE',
68
+ imageData: {
69
+ set: {
70
+ LOW_RES: {
71
+ url: 'bike_2.jpg',
72
+ },
73
+ MOBILE_WEBP_LOW_RES: {
74
+ url: 'bike_2.jpg',
75
+ },
76
+ MOBILE_WEBP_HI_RES: {
77
+ url: 'bike_2@2x.jpg',
78
+ },
79
+ WEBP_LOW_RES: {
80
+ url: 'bike_2@2x.jpg',
81
+ },
82
+ WEBP_HI_2X_RES: {
83
+ url: 'bike_2@2x.jpg',
84
+ },
85
+ },
86
+ borderInfo: {},
87
+ },
88
+ },
89
+ },
90
+ },
91
+ {
92
+ settings: {
93
+ image_text: {
94
+ type: 'INPUTBOX',
95
+ text: '$label.showcase_2.slide_text_3.text',
96
+ },
97
+ image_content: {
98
+ type: 'IMAGE',
99
+ imageData: {
100
+ set: {
101
+ LOW_RES: {
102
+ url: 'bike_3.jpg',
103
+ },
104
+ MOBILE_WEBP_LOW_RES: {
105
+ url: 'bike_3.jpg',
106
+ },
107
+ MOBILE_WEBP_HI_RES: {
108
+ url: 'bike_3@2x.jpg',
109
+ },
110
+ WEBP_LOW_RES: {
111
+ url: 'bike_3@2x.jpg',
112
+ },
113
+ WEBP_HI_2X_RES: {
114
+ url: 'bike_3@2x.jpg',
115
+ },
116
+ },
117
+ borderInfo: {},
118
+ },
119
+ },
120
+ },
121
+ },
122
+ {
123
+ settings: {
124
+ image_text: {
125
+ type: 'INPUTBOX',
126
+ text: '$label.showcase_2.slide_text_4.text',
127
+ },
128
+ image_content: {
129
+ type: 'IMAGE',
130
+ imageData: {
131
+ set: {
132
+ LOW_RES: {
133
+ url: 'bike_4.jpg',
134
+ },
135
+ MOBILE_WEBP_LOW_RES: {
136
+ url: 'bike_4.jpg',
137
+ },
138
+ MOBILE_WEBP_HI_RES: {
139
+ url: 'bike_4@2x.jpg',
140
+ },
141
+ WEBP_LOW_RES: {
142
+ url: 'bike_4@2x.jpg',
143
+ },
144
+ WEBP_HI_2X_RES: {
145
+ url: 'bike_4@2x.jpg',
146
+ },
147
+ },
148
+ borderInfo: {},
149
+ },
150
+ },
151
+ },
152
+ },
153
+ {
154
+
155
+ settings: {
156
+ image_text: {
157
+ type: 'INPUTBOX',
158
+ text: '$label.showcase_2.slide_text_5.text',
159
+ },
160
+ image_content: {
161
+ type: 'IMAGE',
162
+ imageData: {
163
+ set: {
164
+ LOW_RES: {
165
+ url: 'bike_5.jpg',
166
+ },
167
+ MOBILE_WEBP_LOW_RES: {
168
+ url: 'bike_5.jpg',
169
+ },
170
+ MOBILE_WEBP_HI_RES: {
171
+ url: 'bike_5@2x.jpg',
172
+ },
173
+ WEBP_LOW_RES: {
174
+ url: 'bike_5@2x.jpg',
175
+ },
176
+ WEBP_HI_2X_RES: {
177
+ url: 'bike_5@2x.jpg',
178
+ },
179
+ },
180
+ borderInfo: {},
181
+ },
182
+ },
183
+ },
184
+ },
185
+ {
186
+ settings: {
187
+ image_text: {
188
+ type: 'INPUTBOX',
189
+ text: '$label.showcase_2.slide_text_6.text',
190
+ },
191
+ image_content: {
192
+ type: 'IMAGE',
193
+ imageData: {
194
+ set: {
195
+ LOW_RES: {
196
+ url: 'bike_6.jpg',
197
+ },
198
+ MOBILE_WEBP_LOW_RES: {
199
+ url: 'bike_6.jpg',
200
+ },
201
+ MOBILE_WEBP_HI_RES: {
202
+ url: 'bike_6@2x.jpg',
203
+ },
204
+ WEBP_LOW_RES: {
205
+ url: 'bike_6@2x.jpg',
206
+ },
207
+ WEBP_HI_2X_RES: {
208
+ url: 'bike_6@2x.jpg',
209
+ },
210
+ },
211
+ borderInfo: {},
212
+ },
213
+ },
214
+ },
215
+ },
216
+ ],
217
+ },
218
+ },
219
+ design: {
220
+ section_title: {
221
+ type: 'TEXT',
222
+ font: 'pt_mono',
223
+ size: 48,
224
+ bold: true,
225
+ italic: false,
226
+ color: '#FFFFFF',
227
+ },
228
+ section_description: {
229
+ type: 'TEXT',
230
+ font: 'inter',
231
+ size: 16,
232
+ bold: true,
233
+ italic: false,
234
+ color: '#FFFFFF',
235
+ },
236
+ section_tagline: {
237
+ type: 'TEXT',
238
+ font: 'pt_mono',
239
+ size: 16,
240
+ bold: false,
241
+ italic: false,
242
+ color: '#FFB92E',
243
+ },
244
+ section_button: {
245
+ type: 'BUTTON',
246
+ font: 'inter',
247
+ appearance: 'SOLID',
248
+ size: 'LARGE',
249
+ shape: 'RECTANGLE',
250
+ color: '#FFFFFF',
251
+ },
252
+ background: {
253
+ type: 'BACKGROUND',
254
+ style: 'COLOR',
255
+ color: '#000000',
256
+ },
257
+ image_text: {
258
+ type: 'TEXT',
259
+ font: 'pt_mono',
260
+ size: 24,
261
+ bold: true,
262
+ italic: false,
263
+ color: '#FFFFFF',
264
+ },
265
+ image_content: {
266
+ type: 'IMAGE',
267
+ overlay: 'GRADIENT',
268
+ color: ['#000000', '#000000'],
269
+ },
270
+ },
271
+ } as const;
@@ -0,0 +1,88 @@
1
+ export default {
2
+ en: {
3
+ '$label.showcase_1.blockName': 'Reference Section — Slider',
4
+
5
+ '$label.showcase_1.section_title.text': 'Discover the new items\nin our collection',
6
+ '$label.showcase_1.section_description.text': 'Find something for every occasion',
7
+ '$label.showcase_1.section_tagline.text': 'New collection',
8
+ '$label.showcase_1.section_button.title': 'Shop now',
9
+
10
+ '$label.showcase_1.slide_text_1.text': 'Cosmetics',
11
+ '$label.showcase_1.slide_text_2.text': 'Hats & Caps',
12
+ '$label.showcase_1.slide_text_3.text': 'Bags',
13
+ '$label.showcase_1.slide_text_4.text': 'Glasses',
14
+ '$label.showcase_1.slide_text_5.text': 'Dresses',
15
+ '$label.showcase_1.slide_text_6.text': 'Classic shoes',
16
+
17
+ '$label.showcase_2.blockName': 'Reference Section — Slider',
18
+
19
+ '$label.showcase_2.section_title.text': 'Get inspired by our clients bikes.',
20
+ '$label.showcase_2.section_tagline.text': 'Over 9000 bikes has been sold',
21
+ '$label.showcase_2.section_button.title': 'Explore our Instagram',
22
+
23
+ '$label.showcase_2.slide_text_1.text': 'Bike name 1',
24
+ '$label.showcase_2.slide_text_2.text': 'Bike name 2',
25
+ '$label.showcase_2.slide_text_3.text': 'Bike name 3',
26
+ '$label.showcase_2.slide_text_4.text': 'Bike name 4',
27
+ '$label.showcase_2.slide_text_5.text': 'Bike name 5',
28
+ '$label.showcase_2.slide_text_6.text': 'Bike name 6',
29
+ },
30
+
31
+ nl: {
32
+ '$label.showcase_1.blockName': 'Referentie Sectie — Slider',
33
+
34
+ '$label.showcase_1.section_title.text': 'Ontdek de nieuwe items\nin onze collectie',
35
+ '$label.showcase_1.section_description.text': 'Vind iets voor elke gelegenheid',
36
+ '$label.showcase_1.section_tagline.text': 'Nieuwe collectie',
37
+ '$label.showcase_1.section_button.title': 'Shop nu',
38
+
39
+ '$label.showcase_1.slide_text_1.text': 'Cosmetica',
40
+ '$label.showcase_1.slide_text_2.text': 'Hoeden & Petten',
41
+ '$label.showcase_1.slide_text_3.text': 'Tassen',
42
+ '$label.showcase_1.slide_text_4.text': 'Brillen',
43
+ '$label.showcase_1.slide_text_5.text': 'Jurken',
44
+ '$label.showcase_1.slide_text_6.text': 'Klassieke schoenen',
45
+
46
+ '$label.showcase_2.blockName': 'Referentie Sectie — Slider',
47
+
48
+ '$label.showcase_2.section_title.text': 'Laat je inspireren door de fietsen van onze klanten.',
49
+ '$label.showcase_2.section_tagline.text': 'Meer dan 900 fietsen zijn verkocht',
50
+ '$label.showcase_2.section_button.title': 'Ontdek onze Instagram',
51
+
52
+ '$label.showcase_2.slide_text_1.text': 'Fiets naam 1',
53
+ '$label.showcase_2.slide_text_2.text': 'Fiets naam 2',
54
+ '$label.showcase_2.slide_text_3.text': 'Fiets naam 3',
55
+ '$label.showcase_2.slide_text_4.text': 'Fiets naam 4',
56
+ '$label.showcase_2.slide_text_5.text': 'Fiets naam 5',
57
+ '$label.showcase_2.slide_text_6.text': 'Fiets naam 6',
58
+ },
59
+
60
+ fr: {
61
+ '$label.showcase_1.blockName': 'Section de Référence — Slider',
62
+
63
+ '$label.showcase_1.section_title.text': 'Découvrez les nouveaux articles\nde notre collection',
64
+ '$label.showcase_1.section_description.text': 'Trouvez quelque chose pour chaque occasion',
65
+ '$label.showcase_1.section_tagline.text': 'Nouvelle collection',
66
+ '$label.showcase_1.section_button.title': 'Achetez maintenant',
67
+
68
+ '$label.showcase_1.slide_text_1.text': 'Cosmétiques',
69
+ '$label.showcase_1.slide_text_2.text': 'Chapeaux & Casquettes',
70
+ '$label.showcase_1.slide_text_3.text': 'Sacs',
71
+ '$label.showcase_1.slide_text_4.text': 'Lunettes',
72
+ '$label.showcase_1.slide_text_5.text': 'Robes',
73
+ '$label.showcase_1.slide_text_6.text': 'Chaussures classiques',
74
+
75
+ '$label.showcase_2.blockName': 'Section de Référence — Slider',
76
+
77
+ '$label.showcase_2.section_title.text': 'Inspirez-vous des vélos de nos clients.',
78
+ '$label.showcase_2.section_tagline.text': 'Plus de 9000 vélos ont été vendus',
79
+ '$label.showcase_2.section_button.title': 'Explorez notre Instagram',
80
+
81
+ '$label.showcase_2.slide_text_1.text': 'Nom du vélo 1',
82
+ '$label.showcase_2.slide_text_2.text': 'Nom du vélo 2',
83
+ '$label.showcase_2.slide_text_3.text': 'Nom du vélo 3',
84
+ '$label.showcase_2.slide_text_4.text': 'Nom du vélo 4',
85
+ '$label.showcase_2.slide_text_5.text': 'Nom du vélo 5',
86
+ '$label.showcase_2.slide_text_6.text': 'Nom du vélo 6',
87
+ },
88
+ } as const;
@@ -0,0 +1,5 @@
1
+ import ContentSettings from './settings/content.ts';
2
+ import DesignSettings from './settings/design.ts';
3
+
4
+ export type Content = InferContentType<typeof ContentSettings>;
5
+ export type Design = InferDesignType<typeof DesignSettings>;
@@ -0,0 +1,158 @@
1
+ <template>
2
+ <SectionWrapper
3
+ class="tag-lines-section"
4
+ :style="backgroundStyle"
5
+ >
6
+ <div class="tag-lines-section__wrapper">
7
+ <div class="tag-lines-section__info">
8
+ <Tagline
9
+ v-if="isTaglineVisible"
10
+ class="tag-lines-section__tagline"
11
+ :design="taglineDesign"
12
+ >
13
+ {{ taglineContent.value }}
14
+ </Tagline>
15
+
16
+ <Title
17
+ v-if="isTitleVisible"
18
+ class="tag-lines-section__title"
19
+ />
20
+
21
+ <div class="tag-lines-section__highlighted-texts">
22
+ <template
23
+ v-for="(element, index) in highlightedTextElements"
24
+ >
25
+ <HighlightedText
26
+ v-if="element.design.visible"
27
+ :key="`${element.text?.value}__${index}`"
28
+ :class="[
29
+ 'tag-lines-section__highlighted-text',
30
+ `tag-lines-section__highlighted-text--${index + 1}`,
31
+ ]"
32
+ :design="element.design"
33
+ >
34
+ {{ element.text?.value }}
35
+ </HighlightedText>
36
+ </template>
37
+ </div>
38
+ </div>
39
+
40
+ <SectionImage
41
+ class="tag-lines-section__image"
42
+ :highlights="highlightedTextElements"
43
+ :section-image="sectionImageContent"
44
+ />
45
+ </div>
46
+ </SectionWrapper>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import {
51
+ useBackgroundElementDesign,
52
+ useImageElementContent,
53
+ useTextElementDesign,
54
+ useInputboxElementContent,
55
+ } from '@lightspeed/crane';
56
+ import { computed } from 'vue';
57
+ import { Content, Design } from './type.ts';
58
+ import Tagline from '../../shared/components/Tagline.vue';
59
+ import Title from './component/Title.vue';
60
+ import SectionImage from './component/SectionImage.vue';
61
+ import HighlightedText from './component/HighlightedText.vue';
62
+ import { useHighlightedTextElementList } from './composables/highlighted-text-image-list.ts';
63
+ import SectionWrapper from '../../shared/components/SectionWrapper.vue';
64
+
65
+ const backgroundDesign = useBackgroundElementDesign<Design>('background');
66
+ const background = computed(() => ({
67
+ type: backgroundDesign.background?.type,
68
+ solidColor: backgroundDesign.background?.solid?.color as Color,
69
+ fromColor: backgroundDesign.background?.gradient?.fromColor as Color,
70
+ toColor: backgroundDesign.background?.gradient?.toColor as Color,
71
+ }));
72
+
73
+ const backgroundStyle = computed(() => {
74
+ if (background.value.type === 'gradient') {
75
+ return { 'background-image': `linear-gradient(to right, ${background.value.fromColor.hex}, ${background.value.toColor.hex})` };
76
+ }
77
+
78
+ return { 'background-color': background.value.solidColor.hex };
79
+ });
80
+
81
+ const taglineContent = useInputboxElementContent<Content>('section_tagline');
82
+ const taglineDesign = useTextElementDesign<Design>('section_tagline') as TextDesignData;
83
+ const isTaglineVisible = computed<boolean>(() => !!taglineDesign.visible && taglineContent.hasContent);
84
+
85
+ const titleContent = useInputboxElementContent<Content>('section_title');
86
+ const titleDesign = useTextElementDesign<Design>('section_title');
87
+ const isTitleVisible = computed<boolean>(() => !!titleDesign.visible && titleContent.hasContent);
88
+
89
+ const sectionImageContent = useImageElementContent<Content>('section_image');
90
+
91
+ const {
92
+ highlightedTextElements,
93
+ } = useHighlightedTextElementList();
94
+
95
+ </script>
96
+
97
+ <style lang="scss" scoped>
98
+ .tag-lines-section {
99
+ &__wrapper {
100
+ display: flex;
101
+ flex-direction: column;
102
+ align-items: center;
103
+ gap: 24px;
104
+
105
+ @media screen and (min-width: 900px) {
106
+ flex-direction: row;
107
+ justify-content: space-between;
108
+ }
109
+ }
110
+
111
+ &__info {
112
+ width: 100%;
113
+
114
+ @media screen and (min-width: 900px) {
115
+ width: unset;
116
+ max-width: 530px;
117
+ }
118
+ }
119
+
120
+ &__tagline {
121
+ margin-bottom: 24px;
122
+ }
123
+
124
+ &__image {
125
+ width: 100%;
126
+
127
+ @media screen and (min-width: 900px) {
128
+ max-width: 479px;
129
+ }
130
+ }
131
+
132
+ &::v-deep(.tag-lines-section__highlighted-texts:has(.tag-lines-section__highlighted-text:hover)) {
133
+ & .tag-lines-section__highlighted-text {
134
+ opacity: 0.2;
135
+
136
+ &:hover {
137
+ opacity: 1;
138
+ }
139
+ }
140
+ }
141
+
142
+ &__highlighted-text {
143
+ transition: opacity ease-in-out 0.3s;
144
+ }
145
+
146
+ &:has(.tag-lines-section__highlighted-text:hover) {
147
+ &::v-deep(.section-image__element) {
148
+ opacity: 0;
149
+ }
150
+ }
151
+
152
+ &:has(.tag-lines-section__highlighted-text--1:hover)::v-deep(.section-image__element--1),
153
+ &:has(.tag-lines-section__highlighted-text--2:hover)::v-deep(.section-image__element--2),
154
+ &:has(.tag-lines-section__highlighted-text--3:hover)::v-deep(.section-image__element--3) {
155
+ opacity: 1;
156
+ }
157
+ }
158
+ </style>
@@ -0,0 +1,5 @@
1
+ import { createVueClientApp } from '@lightspeed/crane';
2
+ import ExampleSection from './TagLines.vue';
3
+ import { Content, Design } from './type.ts';
4
+
5
+ export default createVueClientApp<Content, Design>(ExampleSection);
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <div class="highlighted-text">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { computed, CSSProperties } from 'vue';
9
+
10
+ const props = defineProps<{
11
+ design: TextDesignData
12
+ }>();
13
+
14
+ const textStyle = computed<CSSProperties>(() => ({
15
+ fontSize: props.design.size ? `${props.design.size}px` : undefined,
16
+ fontFamily: props.design.font,
17
+ color: props.design.color ? (props.design.color as Color).hex : undefined,
18
+ fontStyle: props.design.italic ? 'italic' : 'normal',
19
+ fontWeight: props.design.bold ? 'bold' : 'normal',
20
+ }));
21
+ </script>
22
+
23
+ <style lang="scss" scoped>
24
+ .highlighted-text {
25
+ --font-size: v-bind(textStyle.fontSize);
26
+ --font-family: v-bind(textStyle.fontFamily);
27
+ --color: v-bind(textStyle.color);
28
+ --font-style: v-bind(textStyle.fontStyle);
29
+ --font-weight: v-bind(textStyle.fontWeight);
30
+
31
+ --font-size-multiplier: calc(2/3);
32
+
33
+ font-size: calc(var(--font-size) * var(--font-size-multiplier));
34
+ font-family: var(--font-family);
35
+ color: var(--color);
36
+ font-style: var(--font-style);
37
+ font-weight: var(--font-weight);
38
+ line-height: 1.5;
39
+ cursor: pointer;
40
+ text-decoration: underline;
41
+
42
+ @media screen and (min-width: 700px) {
43
+ --font-size-multiplier: 0.75;
44
+ }
45
+
46
+ @media screen and (min-width: 1200px) {
47
+ --font-size-multiplier: 1;
48
+ }
49
+ }
50
+ </style>
@@ -0,0 +1,78 @@
1
+ <template>
2
+ <div :class="imageClass">
3
+ <img
4
+ v-if="sectionImage?.hasContent"
5
+ class="section-image__element"
6
+ :src="sectionImage.highResolutionDesktopImage"
7
+ loading="lazy"
8
+ alt=""
9
+ />
10
+
11
+ <template v-for="(element, index) in highlights" :key="`${element.text?.value}__${index}`">
12
+ <img
13
+ v-if="element.design.visible"
14
+ :class="[
15
+ 'section-image__element',
16
+ 'section-image__element--highlighted',
17
+ `section-image__element--${index + 1}`,
18
+ ]"
19
+ :src="element.image?.highResolutionDesktopImage"
20
+ loading="lazy"
21
+ alt=""
22
+ />
23
+ </template>
24
+ </div>
25
+ </template>
26
+
27
+ <script setup lang="ts">
28
+ import {
29
+ ImageContent,
30
+ useLayoutElementDesign,
31
+ } from '@lightspeed/crane';
32
+ import { computed } from 'vue';
33
+ import { Highlight } from '../composables/highlighted-text-image-list.ts';
34
+
35
+ defineProps<{
36
+ sectionImage: ImageContent;
37
+ highlights: Highlight[];
38
+ }>();
39
+
40
+ const layoutDesign = useLayoutElementDesign();
41
+
42
+ const imageClass = computed(() => [
43
+ 'section-image',
44
+ {
45
+ 'section-image--with-border-radius': layoutDesign.layout === 'Image_With_Border_Radius',
46
+ },
47
+ ]);
48
+ </script>
49
+
50
+ <style lang="scss" scoped>
51
+ .section-image {
52
+ position: relative;
53
+ overflow: hidden;
54
+ aspect-ratio: 0.785;
55
+
56
+ &--with-border-radius {
57
+ border-radius: 24px;
58
+
59
+ @media screen and (min-width: 1200px) {
60
+ border-radius: 32px;
61
+ }
62
+ }
63
+
64
+ &__element {
65
+ position: absolute;
66
+ top: 0;
67
+ left: 0;
68
+ width: 100%;
69
+ height: 100%;
70
+ object-fit: cover;
71
+ transition: opacity 0.3s ease-in-out;
72
+
73
+ &--highlighted {
74
+ opacity: 0;
75
+ }
76
+ }
77
+ }
78
+ </style>