@lightspeed/crane 3.2.1 → 3.4.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 (27) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/UPGRADE.md +39 -0
  3. package/dist/cli.mjs +55 -48
  4. package/package.json +12 -13
  5. package/template/collections/example-collection/configuration.ts +6 -5
  6. package/template/eslint.config.js +1 -0
  7. package/template/footers/example-footer/component/MadeWith.vue +24 -8
  8. package/template/layouts/catalog/example-catalog/client.ts +6 -0
  9. package/template/layouts/catalog/example-catalog/settings/design.ts +229 -1
  10. package/template/layouts/catalog/example-catalog/settings/layout.ts +1 -0
  11. package/template/layouts/catalog/example-catalog/settings/translations.ts +285 -1
  12. package/template/layouts/category/example-category/Main.vue +2 -1
  13. package/template/layouts/category/example-category/client.ts +6 -0
  14. package/template/layouts/category/example-category/settings/design.ts +229 -1
  15. package/template/layouts/category/example-category/settings/layout.ts +1 -0
  16. package/template/layouts/category/example-category/settings/translations.ts +285 -0
  17. package/template/layouts/product/example-product/Main.vue +2 -1
  18. package/template/layouts/product/example-product/client.ts +6 -0
  19. package/template/layouts/product/example-product/settings/layout.ts +1 -0
  20. package/template/layouts/product/example-product/settings/translations.ts +1 -0
  21. package/template/package.json +1 -1
  22. package/template/preview/shared/api-routes.ts +27 -4
  23. package/template/preview/shared/mock.ts +9 -0
  24. package/template/preview/shared/preview.ts +3 -0
  25. package/template/preview/vite.config.js +4 -0
  26. package/template/reference/sections/tag-lines/TagLines.vue +6 -6
  27. package/template/eslint.config.cjs +0 -1
@@ -0,0 +1,285 @@
1
+ import { translation } from '@lightspeed/crane-api';
2
+
3
+ export default translation.init({
4
+ en: {
5
+ '$label.accordion.catalog_page_settings': 'Catalog page settings',
6
+ '$label.accordion.product_card_settings': 'Product card settings',
7
+ '$label.accordion.categories_settings': 'Categories settings',
8
+
9
+ '$label.show': 'Show',
10
+ '$label.do_not_show': 'Do not show',
11
+ '$label.show_on_mouse_hover': 'Show on mouse hover',
12
+
13
+ '$label.category_view.label': 'Category view',
14
+ '$label.category_view.description': 'Display products from root categories on respective category pages only. '
15
+ + 'This option fits catalogs with a large number of products.',
16
+ '$label.category_view.expanded': 'Expanded categories',
17
+ '$label.category_view.collapsed': 'Collapsed categories',
18
+
19
+ '$label.product_filter_placement.label': 'Product filter placement',
20
+ '$label.product_filter_placement.category_pages': 'On category pages',
21
+ '$label.product_filter_placement.all_pages': 'On catalog and category pages',
22
+
23
+ '$label.filter_panel_orientation.label': 'Filter panel orientation',
24
+ '$label.filter_panel_orientation.vertical': 'Vertical',
25
+ '$label.filter_panel_orientation.horizontal': 'Horizontal',
26
+
27
+ '$label.filter_priority.label': 'Filter priority',
28
+ '$label.filter_priority.description': 'Up to 4 filters can be displayed horizontally. The rest are grouped '
29
+ + 'under \u201COther filters\u201D. To show a certain filter horizontally, place it among the top 4 '
30
+ + 'in filter sorting in the control panel.',
31
+ '$label.filter_priority.button': 'Sort product filters',
32
+
33
+ '$label.side_to_show_filters.label': 'Side to show filters',
34
+ '$label.side_to_show_filters.right': 'Right',
35
+ '$label.side_to_show_filters.left': 'Left',
36
+
37
+ '$label.expand_filter_panel.label': 'Expand filter panel',
38
+ '$label.show_sort_by_options.label': 'Show "Sort by" options',
39
+ '$label.show_bottom_navigation_menu.label': 'Show bottom navigation menu',
40
+ '$label.show_signin_link.label': 'Show "Sign In" link',
41
+
42
+ '$label.card_grid_spacing.label': 'Card grid spacing',
43
+ '$label.card_grid_spacing.description': 'Applies to both product and category cards.',
44
+ '$label.card_grid_spacing.none': 'None',
45
+ '$label.card_grid_spacing.narrow': 'Narrow',
46
+ '$label.card_grid_spacing.medium': 'Medium',
47
+ '$label.card_grid_spacing.wide': 'Wide',
48
+
49
+ '$label.content_alignment.label': 'Content alignment',
50
+ '$label.content_alignment.left': 'Left',
51
+ '$label.content_alignment.center': 'Center',
52
+ '$label.content_alignment.right': 'Right',
53
+ '$label.content_alignment.justify': 'Justify',
54
+
55
+ '$label.image_proportions.label': 'Image proportions',
56
+ '$label.image_proportions.portrait_2_3': 'Portrait (2:3)',
57
+ '$label.image_proportions.portrait_3_4': 'Portrait (3:4)',
58
+ '$label.image_proportions.square_1_1': 'Square (1:1)',
59
+ '$label.image_proportions.landscape_4_3': 'Landscape (4:3)',
60
+ '$label.image_proportions.landscape_2_3': 'Landscape (2:3)',
61
+
62
+ '$label.card_size.label': 'Card size',
63
+ '$label.card_size.small': 'Small',
64
+ '$label.card_size.medium': 'Medium',
65
+ '$label.card_size.large': 'Large',
66
+
67
+ '$label.product_name.label': 'Product name',
68
+ '$label.product_subtitle.label': 'Product subtitle',
69
+ '$label.price.label': 'Price',
70
+
71
+ '$label.color_swatches.label': 'Color swatches',
72
+ '$label.color_swatches.description': 'You can set up the appearance of color swatches in Product Details.',
73
+
74
+ '$label.sku.label': 'SKU',
75
+ '$label.buy_now_button.label': '"Buy now" button',
76
+ '$label.product_rating.label': 'Product rating',
77
+
78
+ '$label.rating_view.label': 'Rating view',
79
+ '$label.rating_view.five_stars': 'Five stars view',
80
+ '$label.rating_view.one_star': 'One star view',
81
+
82
+ '$label.show_average_product_rating.label': 'Show average product rating',
83
+ '$label.show_total_number_of_reviews.label': 'Show total number of reviews',
84
+ '$label.show_product_card_frame.label': 'Show product card frame',
85
+ '$label.show_main_product_image.label': 'Show main product image',
86
+ '$label.show_additional_image_on_hover.label': 'Show additional image on hover',
87
+
88
+ '$label.divider': '',
89
+
90
+ '$label.name_position.label': 'Name position',
91
+ '$label.name_position.on_the_image': 'On the image',
92
+ '$label.name_position.below_the_image': 'Below the image',
93
+ '$label.name_position.on_mouse_hover': 'On mouse hover',
94
+ '$label.name_position.hide_category_names': 'Hide category names',
95
+ '$label.name_position.hide_category_images': 'Hide category images',
96
+ },
97
+
98
+ nl: {
99
+ '$label.accordion.catalog_page_settings': 'Cataloguspagina-instellingen',
100
+ '$label.accordion.product_card_settings': 'Productkaart-instellingen',
101
+ '$label.accordion.categories_settings': 'Categorie-instellingen',
102
+
103
+ '$label.show': 'Tonen',
104
+ '$label.do_not_show': 'Niet tonen',
105
+ '$label.show_on_mouse_hover': 'Tonen bij muisaanwijzer',
106
+
107
+ '$label.category_view.label': 'Categorieweergave',
108
+ '$label.category_view.description': 'Toon producten uit hoofdcategorieën alleen op de bijbehorende categoriepagina\'s. '
109
+ + 'Deze optie past bij catalogi met een groot aantal producten.',
110
+ '$label.category_view.expanded': 'Uitgevouwen categorieën',
111
+ '$label.category_view.collapsed': 'Samengevouwen categorieën',
112
+
113
+ '$label.product_filter_placement.label': 'Plaatsing productfilter',
114
+ '$label.product_filter_placement.category_pages': 'Op categoriepagina\'s',
115
+ '$label.product_filter_placement.all_pages': 'Op catalogus- en categoriepagina\'s',
116
+
117
+ '$label.filter_panel_orientation.label': 'Oriëntatie filterpaneel',
118
+ '$label.filter_panel_orientation.vertical': 'Verticaal',
119
+ '$label.filter_panel_orientation.horizontal': 'Horizontaal',
120
+
121
+ '$label.filter_priority.label': 'Filterprioriteit',
122
+ '$label.filter_priority.description': 'Er kunnen maximaal 4 filters horizontaal worden weergegeven. De rest wordt '
123
+ + 'gegroepeerd onder \u201CAndere filters\u201D. Om een bepaald filter horizontaal weer te geven, '
124
+ + 'plaatst u het bij de top 4 in de filtersortering in het configuratiescherm.',
125
+ '$label.filter_priority.button': 'Productfilters sorteren',
126
+
127
+ '$label.side_to_show_filters.label': 'Zijde om filters te tonen',
128
+ '$label.side_to_show_filters.right': 'Rechts',
129
+ '$label.side_to_show_filters.left': 'Links',
130
+
131
+ '$label.expand_filter_panel.label': 'Filterpaneel uitvouwen',
132
+ '$label.show_sort_by_options.label': 'Opties "Sorteren op" tonen',
133
+ '$label.show_bottom_navigation_menu.label': 'Onderste navigatiemenu tonen',
134
+ '$label.show_signin_link.label': 'Link "Aanmelden" tonen',
135
+
136
+ '$label.card_grid_spacing.label': 'Rasterafstand kaarten',
137
+ '$label.card_grid_spacing.description': 'Geldt voor zowel product- als categoriekaarten.',
138
+ '$label.card_grid_spacing.none': 'Geen',
139
+ '$label.card_grid_spacing.narrow': 'Smal',
140
+ '$label.card_grid_spacing.medium': 'Gemiddeld',
141
+ '$label.card_grid_spacing.wide': 'Breed',
142
+
143
+ '$label.content_alignment.label': 'Uitlijning inhoud',
144
+ '$label.content_alignment.left': 'Links',
145
+ '$label.content_alignment.center': 'Gecentreerd',
146
+ '$label.content_alignment.right': 'Rechts',
147
+ '$label.content_alignment.justify': 'Uitvullen',
148
+
149
+ '$label.image_proportions.label': 'Beeldverhoudingen',
150
+ '$label.image_proportions.portrait_2_3': 'Portret (2:3)',
151
+ '$label.image_proportions.portrait_3_4': 'Portret (3:4)',
152
+ '$label.image_proportions.square_1_1': 'Vierkant (1:1)',
153
+ '$label.image_proportions.landscape_4_3': 'Landschap (4:3)',
154
+ '$label.image_proportions.landscape_2_3': 'Landschap (2:3)',
155
+
156
+ '$label.card_size.label': 'Kaartgrootte',
157
+ '$label.card_size.small': 'Klein',
158
+ '$label.card_size.medium': 'Gemiddeld',
159
+ '$label.card_size.large': 'Groot',
160
+
161
+ '$label.product_name.label': 'Productnaam',
162
+ '$label.product_subtitle.label': 'Productondertitel',
163
+ '$label.price.label': 'Prijs',
164
+
165
+ '$label.color_swatches.label': 'Kleurstalen',
166
+ '$label.color_swatches.description': 'U kunt het uiterlijk van kleurstalen instellen in Productdetails.',
167
+
168
+ '$label.sku.label': 'SKU',
169
+ '$label.buy_now_button.label': 'Knop "Nu kopen"',
170
+ '$label.product_rating.label': 'Productbeoordeling',
171
+
172
+ '$label.rating_view.label': 'Beoordelingsweergave',
173
+ '$label.rating_view.five_stars': 'Vijf sterren weergave',
174
+ '$label.rating_view.one_star': 'Eén ster weergave',
175
+
176
+ '$label.show_average_product_rating.label': 'Gemiddelde productbeoordeling tonen',
177
+ '$label.show_total_number_of_reviews.label': 'Totaal aantal beoordelingen tonen',
178
+ '$label.show_product_card_frame.label': 'Productkaart kader tonen',
179
+ '$label.show_main_product_image.label': 'Hoofdproductafbeelding tonen',
180
+ '$label.show_additional_image_on_hover.label': 'Extra afbeelding tonen bij muisaanwijzer',
181
+
182
+ '$label.divider': '',
183
+
184
+ '$label.name_position.label': 'Naampositie',
185
+ '$label.name_position.on_the_image': 'Op de afbeelding',
186
+ '$label.name_position.below_the_image': 'Onder de afbeelding',
187
+ '$label.name_position.on_mouse_hover': 'Bij muisaanwijzer',
188
+ '$label.name_position.hide_category_names': 'Categorienamen verbergen',
189
+ '$label.name_position.hide_category_images': 'Categorieafbeeldingen verbergen',
190
+ },
191
+
192
+ fr: {
193
+ '$label.accordion.catalog_page_settings': 'Paramètres de la page catalogue',
194
+ '$label.accordion.product_card_settings': 'Paramètres de la fiche produit',
195
+ '$label.accordion.categories_settings': 'Paramètres des catégories',
196
+
197
+ '$label.show': 'Afficher',
198
+ '$label.do_not_show': 'Ne pas afficher',
199
+ '$label.show_on_mouse_hover': 'Afficher au survol de la souris',
200
+
201
+ '$label.category_view.label': 'Vue des catégories',
202
+ '$label.category_view.description': 'Affichez les produits des catégories racines uniquement sur les pages de catégories respectives. '
203
+ + 'Cette option convient aux catalogues comportant un grand nombre de produits.',
204
+ '$label.category_view.expanded': 'Catégories dépliées',
205
+ '$label.category_view.collapsed': 'Catégories repliées',
206
+
207
+ '$label.product_filter_placement.label': 'Emplacement du filtre produit',
208
+ '$label.product_filter_placement.category_pages': 'Sur les pages de catégories',
209
+ '$label.product_filter_placement.all_pages': 'Sur les pages catalogue et catégories',
210
+
211
+ '$label.filter_panel_orientation.label': 'Orientation du panneau de filtres',
212
+ '$label.filter_panel_orientation.vertical': 'Vertical',
213
+ '$label.filter_panel_orientation.horizontal': 'Horizontal',
214
+
215
+ '$label.filter_priority.label': 'Priorité des filtres',
216
+ '$label.filter_priority.description': 'Jusqu\'à 4 filtres peuvent être affichés horizontalement. Les autres sont regroupés '
217
+ + 'sous \u201CAutres filtres\u201D. Pour afficher un filtre horizontalement, placez-le parmi les 4 premiers '
218
+ + 'dans le tri des filtres du panneau de configuration.',
219
+ '$label.filter_priority.button': 'Trier les filtres produits',
220
+
221
+ '$label.side_to_show_filters.label': 'Côté pour afficher les filtres',
222
+ '$label.side_to_show_filters.right': 'Droite',
223
+ '$label.side_to_show_filters.left': 'Gauche',
224
+
225
+ '$label.expand_filter_panel.label': 'Déplier le panneau de filtres',
226
+ '$label.show_sort_by_options.label': 'Afficher les options "Trier par"',
227
+ '$label.show_bottom_navigation_menu.label': 'Afficher le menu de navigation inférieur',
228
+ '$label.show_signin_link.label': 'Afficher le lien "Se connecter"',
229
+
230
+ '$label.card_grid_spacing.label': 'Espacement de la grille de cartes',
231
+ '$label.card_grid_spacing.description': 'S\'applique aux cartes de produits et de catégories.',
232
+ '$label.card_grid_spacing.none': 'Aucun',
233
+ '$label.card_grid_spacing.narrow': 'Étroit',
234
+ '$label.card_grid_spacing.medium': 'Moyen',
235
+ '$label.card_grid_spacing.wide': 'Large',
236
+
237
+ '$label.content_alignment.label': 'Alignement du contenu',
238
+ '$label.content_alignment.left': 'Gauche',
239
+ '$label.content_alignment.center': 'Centré',
240
+ '$label.content_alignment.right': 'Droite',
241
+ '$label.content_alignment.justify': 'Justifié',
242
+
243
+ '$label.image_proportions.label': 'Proportions de l\'image',
244
+ '$label.image_proportions.portrait_2_3': 'Portrait (2:3)',
245
+ '$label.image_proportions.portrait_3_4': 'Portrait (3:4)',
246
+ '$label.image_proportions.square_1_1': 'Carré (1:1)',
247
+ '$label.image_proportions.landscape_4_3': 'Paysage (4:3)',
248
+ '$label.image_proportions.landscape_2_3': 'Paysage (2:3)',
249
+
250
+ '$label.card_size.label': 'Taille de la carte',
251
+ '$label.card_size.small': 'Petit',
252
+ '$label.card_size.medium': 'Moyen',
253
+ '$label.card_size.large': 'Grand',
254
+
255
+ '$label.product_name.label': 'Nom du produit',
256
+ '$label.product_subtitle.label': 'Sous-titre du produit',
257
+ '$label.price.label': 'Prix',
258
+
259
+ '$label.color_swatches.label': 'Échantillons de couleurs',
260
+ '$label.color_swatches.description': 'Vous pouvez configurer l\'apparence des échantillons de couleurs dans les Détails du produit.',
261
+
262
+ '$label.sku.label': 'SKU',
263
+ '$label.buy_now_button.label': 'Bouton "Acheter maintenant"',
264
+ '$label.product_rating.label': 'Évaluation du produit',
265
+
266
+ '$label.rating_view.label': 'Vue des évaluations',
267
+ '$label.rating_view.five_stars': 'Vue cinq étoiles',
268
+ '$label.rating_view.one_star': 'Vue une étoile',
269
+
270
+ '$label.show_average_product_rating.label': 'Afficher la note moyenne du produit',
271
+ '$label.show_total_number_of_reviews.label': 'Afficher le nombre total d\'avis',
272
+ '$label.show_product_card_frame.label': 'Afficher le cadre de la fiche produit',
273
+ '$label.show_main_product_image.label': 'Afficher l\'image principale du produit',
274
+ '$label.show_additional_image_on_hover.label': 'Afficher une image supplémentaire au survol',
275
+
276
+ '$label.divider': '',
277
+
278
+ '$label.name_position.label': 'Position du nom',
279
+ '$label.name_position.on_the_image': 'Sur l\'image',
280
+ '$label.name_position.below_the_image': 'Sous l\'image',
281
+ '$label.name_position.on_mouse_hover': 'Au survol de la souris',
282
+ '$label.name_position.hide_category_names': 'Masquer les noms de catégories',
283
+ '$label.name_position.hide_category_images': 'Masquer les images de catégories',
284
+ },
285
+ });
@@ -13,7 +13,8 @@
13
13
  </div>
14
14
  <slot :name="Slot.REVIEW_LIST" />
15
15
  <slot :name="Slot.RELATED_PRODUCTS" />
16
- <slot :name="Slot.BOTTOM_BAR" />
16
+ <!-- Footer navigation part of the page is hidden by default. Uncomment below slot to make it visible -->
17
+ <!-- <slot :name="Slot.BOTTOM_BAR" /> -->
17
18
  </div>
18
19
  </template>
19
20
 
@@ -0,0 +1,6 @@
1
+ import { createLayoutApp } from '@lightspeed/crane-api';
2
+
3
+ import Main from './Main.vue';
4
+ import { Content, Design } from './type.ts';
5
+
6
+ export default createLayoutApp<Content, Design>(Main);
@@ -0,0 +1 @@
1
+ export default [] as const;
@@ -0,0 +1 @@
1
+ export default {} as const;
@@ -21,7 +21,7 @@
21
21
  "node": ">=22"
22
22
  },
23
23
  "overrides": {
24
- "glob": "^11.1.0",
24
+ "glob": "^13.0.6",
25
25
  "stylus": "^0.64.0"
26
26
  }
27
27
  }
@@ -16,6 +16,9 @@ import { debugLog } from './logger';
16
16
  import { getShowcaseData, BlockType, BLOCK_TYPES } from './preview';
17
17
  import { fetchTiles, updateTilesSection, updateCustomContent, getBlockType } from './utils';
18
18
 
19
+ /** Maximum allowed nesting depth for DECK settings */
20
+ const MAX_DECK_DEPTH = 2;
21
+
19
22
  /**
20
23
  * AppBlock type definition for block-config response
21
24
  */
@@ -206,9 +209,14 @@ function processEditorExceptDeck(setting: ContentEditor, fieldName: string) {
206
209
  }
207
210
 
208
211
  /**
209
- * Process a DECK editor: transform cards.defaultCardContent.settings into editors array
212
+ * Process a DECK editor: transform cards.defaultCardContent.settings into editors array.
213
+ * Supports nested DECK up to MAX_DECK_DEPTH levels.
210
214
  */
211
- function processDeckEditor(editor: DeckContentEditor, fieldName: string): Record<string, unknown> {
215
+ function processDeckEditor(
216
+ editor: DeckContentEditor,
217
+ fieldName: string,
218
+ depth: number = 1,
219
+ ): Record<string, unknown> {
212
220
  const result: Record<string, unknown> = {
213
221
  field: fieldName,
214
222
  type: 'DECK_EDITOR',
@@ -228,8 +236,23 @@ function processDeckEditor(editor: DeckContentEditor, fieldName: string): Record
228
236
  // Create editors array from settings and add to defaultCard
229
237
  if (settings) {
230
238
  const editors: Record<string, unknown>[] = [];
231
- for (const [settingFieldName, settingEditor] of Object.entries(settings)) {
232
- const processedEditor: Record<string, unknown> = processEditorExceptDeck(settingEditor, settingFieldName);
239
+ for (const [settingFieldName, settingEditor] of Object.entries(settings) as [string, ContentEditor][]) {
240
+ let processedEditor: Record<string, unknown>;
241
+ // Recursively process nested DECK editors, enforcing MAX_DECK_DEPTH
242
+ if (settingEditor.type === 'DECK') {
243
+ if (depth >= MAX_DECK_DEPTH) {
244
+ throw new Error(
245
+ `Maximum DECK nesting depth of ${MAX_DECK_DEPTH} exceeded at field "${settingFieldName}".`,
246
+ );
247
+ }
248
+ processedEditor = processDeckEditor(
249
+ settingEditor as DeckContentEditor,
250
+ settingFieldName,
251
+ depth + 1,
252
+ );
253
+ } else {
254
+ processedEditor = processEditorExceptDeck(settingEditor, settingFieldName);
255
+ }
233
256
  editors.push(processedEditor);
234
257
  }
235
258
  defaultCard.editors = editors;
@@ -55,9 +55,18 @@ export const externalContentMock: ExternalContentMock = {
55
55
  url: 'https://www.lightspeedhq.com',
56
56
  target: '_blank',
57
57
  icon: '/assets/lightspeed-icon.png',
58
+ iconSvg: undefined,
58
59
  poweredBy: 'Powered by',
59
60
  company: 'Lightspeed',
60
61
  },
62
+ madeWithV2: {
63
+ url: 'https://www.lightspeedhq.com',
64
+ target: '_blank',
65
+ icon: undefined,
66
+ iconSvg: undefined,
67
+ poweredBy: 'Powered by Lightspeed',
68
+ company: undefined,
69
+ },
61
70
  },
62
71
 
63
72
  category: {
@@ -244,6 +244,9 @@ function parseAccordionDesign(comp: any): Record<string, any> {
244
244
  Object.entries(comp.items || {}).forEach(([itemName, item]: [string, any]) => {
245
245
  const editors: Record<string, any> = {};
246
246
  Object.entries(item.editors || {}).forEach(([editorName, editor]: [string, any]) => {
247
+ if (editor?.type === 'DIVIDER' || editor?.type === 'INFO') {
248
+ return;
249
+ }
247
250
  editors[editorName] = editor.defaults || {};
248
251
  });
249
252
  items[itemName] = { label: item.label, editors };
@@ -40,6 +40,10 @@ export default defineConfig({
40
40
  fs.writeFileSync(analyticsFile, JSON.stringify({}, null, 2), 'utf-8');
41
41
  }
42
42
 
43
+ // Exclude analytics file from Vite's file watcher to prevent
44
+ // HMR triggers when bumpSectionCount writes to it.
45
+ server.watcher.unwatch(analyticsFile);
46
+
43
47
  // helper to bump and persist counter for a given section
44
48
  function bumpSectionCount(section) {
45
49
  const raw = fs.readFileSync(analyticsFile, 'utf-8');
@@ -128,11 +128,11 @@ const {
128
128
  }
129
129
  }
130
130
 
131
- .tag-lines-section::v-deep(.tag-lines-section__highlighted-texts:has(.tag-lines-section__highlighted-text:hover)) .tag-lines-section__highlighted-text {
131
+ .tag-lines-section :deep(.tag-lines-section__highlighted-texts:has(.tag-lines-section__highlighted-text:hover)) .tag-lines-section__highlighted-text {
132
132
  opacity: 0.2;
133
133
  }
134
134
 
135
- .tag-lines-section::v-deep(.tag-lines-section__highlighted-texts:has(.tag-lines-section__highlighted-text:hover)) .tag-lines-section__highlighted-text:hover {
135
+ .tag-lines-section :deep(.tag-lines-section__highlighted-texts:has(.tag-lines-section__highlighted-text:hover)) .tag-lines-section__highlighted-text:hover {
136
136
  opacity: 1;
137
137
  }
138
138
 
@@ -140,13 +140,13 @@ const {
140
140
  transition: opacity ease-in-out 0.3s;
141
141
  }
142
142
 
143
- .tag-lines-section:has(.tag-lines-section__highlighted-text:hover)::v-deep(.section-image__element) {
143
+ .tag-lines-section:has(.tag-lines-section__highlighted-text:hover) :deep(.section-image__element) {
144
144
  opacity: 0;
145
145
  }
146
146
 
147
- .tag-lines-section:has(.tag-lines-section__highlighted-text--1:hover)::v-deep(.section-image__element--1),
148
- .tag-lines-section:has(.tag-lines-section__highlighted-text--2:hover)::v-deep(.section-image__element--2),
149
- .tag-lines-section:has(.tag-lines-section__highlighted-text--3:hover)::v-deep(.section-image__element--3) {
147
+ .tag-lines-section:has(.tag-lines-section__highlighted-text--1:hover) :deep(.section-image__element--1),
148
+ .tag-lines-section:has(.tag-lines-section__highlighted-text--2:hover) :deep(.section-image__element--2),
149
+ .tag-lines-section:has(.tag-lines-section__highlighted-text--3:hover) :deep(.section-image__element--3) {
150
150
  opacity: 1;
151
151
  }
152
152
  </style>
@@ -1 +0,0 @@
1
- module.exports = require('@lightspeed/eslint-config-crane');