gatsby-matrix-theme 2.0.5 → 2.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 (96) hide show
  1. package/.storybook/main.js +1 -0
  2. package/CHANGELOG.md +102 -0
  3. package/jest.config.js +1 -0
  4. package/package.json +2 -2
  5. package/src/components/atoms/cards/article-card/index.js +9 -6
  6. package/src/components/atoms/cards/author-card/index.js +6 -1
  7. package/src/components/atoms/cards/base-card/index.js +1 -1
  8. package/src/components/atoms/cards/game-card/index.js +9 -6
  9. package/src/components/atoms/cards/operator-card/index.js +14 -8
  10. package/src/components/atoms/cards/payment-method-card/index.js +11 -9
  11. package/src/components/atoms/cards/popup-card/index.js +5 -5
  12. package/src/components/atoms/cards/popup-card/popup-card.module.scss +6 -7
  13. package/src/components/atoms/cards/popup-card/popup-card.stories.js +0 -10
  14. package/src/components/atoms/cards/software-provider-card/index.js +10 -9
  15. package/src/components/atoms/link-menu/index.js +1 -1
  16. package/src/components/atoms/modal/modal.module.scss +44 -41
  17. package/src/components/atoms/newsletter/success/index.js +18 -13
  18. package/src/components/atoms/operator-bonuses/index.js +10 -7
  19. package/src/components/atoms/search/autocomplete/article.js +1 -1
  20. package/src/components/atoms/search/autocomplete/game.js +1 -1
  21. package/src/components/atoms/search/autocomplete/operator.js +1 -1
  22. package/src/components/atoms/search/autocomplete/payment_methods.js +1 -1
  23. package/src/components/atoms/search/autocomplete/software_provider.js +1 -1
  24. package/src/components/atoms/table/banking/index.js +24 -20
  25. package/src/components/atoms/table/column/index.js +2 -5
  26. package/src/components/atoms/table/staticColumn/index.js +28 -33
  27. package/src/components/molecules/faq/faq.module.scss +14 -10
  28. package/src/components/molecules/faq/index.js +1 -1
  29. package/src/components/molecules/game-iframe/index.js +6 -1
  30. package/src/components/molecules/game-score-gauge/game-score-gauge.stories.js +7 -12
  31. package/src/components/molecules/game-score-gauge/index.js +4 -2
  32. package/src/components/molecules/info-grid/index.js +1 -0
  33. package/src/components/molecules/newsletter/index.js +1 -0
  34. package/src/components/molecules/newsletter/newsletter.stories.js +106 -112
  35. package/src/components/molecules/newsletter-optin/index.js +7 -7
  36. package/src/components/molecules/newsletter-optin/newsletter-optin.stories.js +79 -80
  37. package/src/components/molecules/operator-summary/index.js +8 -2
  38. package/src/components/molecules/small-welcome-bonus/index.js +19 -6
  39. package/src/components/molecules/small-welcome-bonus/small-welcome-bonus.stories.js +49 -53
  40. package/src/components/molecules/toplist/row/variant-one.js +26 -10
  41. package/src/components/organisms/footer-navigation/index.js +9 -1
  42. package/src/components/organisms/popup/index.js +9 -6
  43. package/src/components/organisms/popup/popup.stories.js +0 -10
  44. package/src/components/organisms/toplist/comparison-table/index.js +11 -13
  45. package/src/components/organisms/toplist/index.js +2 -4
  46. package/src/components/organisms/toplist/list/index.js +11 -7
  47. package/src/components/organisms/toplist/list/list.module.scss +7 -0
  48. package/src/gatsby-core-theme/components/atoms/bonus/bonus.module.scss +15 -0
  49. package/src/gatsby-core-theme/components/atoms/bonus/index.js +4 -3
  50. package/src/gatsby-core-theme/components/atoms/module-title/index.js +7 -9
  51. package/src/gatsby-core-theme/components/atoms/not-found/index.js +24 -0
  52. package/src/gatsby-core-theme/components/atoms/not-found/not-found.module.scss +17 -0
  53. package/src/gatsby-core-theme/components/atoms/spotlights/index.js +25 -8
  54. package/src/gatsby-core-theme/components/molecules/content/content.module.scss +73 -16
  55. package/src/gatsby-core-theme/components/molecules/content/index.js +2 -0
  56. package/src/gatsby-core-theme/components/molecules/footer/index.js +5 -1
  57. package/src/gatsby-core-theme/components/molecules/main/index.js +6 -1
  58. package/src/gatsby-core-theme/components/molecules/module/index.js +1 -3
  59. package/src/gatsby-core-theme/components/molecules/search/index.js +28 -4
  60. package/src/gatsby-core-theme/components/organisms/anchor/anchor.module.scss +5 -1
  61. package/src/gatsby-core-theme/components/organisms/anchor/index.js +11 -2
  62. package/src/gatsby-core-theme/components/organisms/carousel/index.js +17 -6
  63. package/src/gatsby-core-theme/components/organisms/navigation/index.js +2 -2
  64. package/src/gatsby-core-theme/components/organisms/search/index.js +2 -1
  65. package/src/gatsby-core-theme/components/pages/body/index.js +14 -9
  66. package/src/gatsby-core-theme/components/pages/search/index.js +79 -74
  67. package/src/hooks/tabs/index.js +6 -4
  68. package/src/hooks/tabs/tab/tab-list.js +4 -1
  69. package/src/hooks/tabs/tab/tab.js +37 -28
  70. package/storybook/public/{0.50c23d5b.iframe.bundle.js → 0.a5c4cf9f.iframe.bundle.js} +1 -1
  71. package/storybook/public/{1.eef04bc1.iframe.bundle.js → 1.b2b72c50.iframe.bundle.js} +1 -1
  72. package/storybook/public/{10.454cae2f.iframe.bundle.js → 10.502b5ac2.iframe.bundle.js} +1 -1
  73. package/storybook/public/{11.6ec11208.iframe.bundle.js → 11.30535586.iframe.bundle.js} +1 -1
  74. package/storybook/public/{5.5635a723.iframe.bundle.js → 5.66b5b921.iframe.bundle.js} +3 -3
  75. package/storybook/public/{5.5635a723.iframe.bundle.js.LICENSE.txt → 5.66b5b921.iframe.bundle.js.LICENSE.txt} +0 -0
  76. package/storybook/public/5.66b5b921.iframe.bundle.js.map +1 -0
  77. package/storybook/public/{6.a0f625e4.iframe.bundle.js → 6.89431426.iframe.bundle.js} +1 -1
  78. package/storybook/public/{7.4b9a5033.iframe.bundle.js → 7.a53e817b.iframe.bundle.js} +1 -1
  79. package/storybook/public/8.e043e6dc.iframe.bundle.js +3 -0
  80. package/storybook/public/{8.4148b63e.iframe.bundle.js.LICENSE.txt → 8.e043e6dc.iframe.bundle.js.LICENSE.txt} +0 -0
  81. package/storybook/public/8.e043e6dc.iframe.bundle.js.map +1 -0
  82. package/storybook/public/{9.08fee7fe.iframe.bundle.js → 9.eba0e7c0.iframe.bundle.js} +1 -1
  83. package/storybook/public/iframe.html +1 -1
  84. package/storybook/public/main.c07025f4.iframe.bundle.js +1 -0
  85. package/storybook/public/{runtime~main.d64660ee.iframe.bundle.js → runtime~main.c4f3a4d6.iframe.bundle.js} +1 -1
  86. package/storybook/public/vendors~main.8050786b.iframe.bundle.js +7 -0
  87. package/storybook/public/{vendors~main.aac219e4.iframe.bundle.js.LICENSE.txt → vendors~main.8050786b.iframe.bundle.js.LICENSE.txt} +0 -0
  88. package/storybook/public/vendors~main.8050786b.iframe.bundle.js.map +1 -0
  89. package/src/components/atoms/newsletter/success/success.module.scss +0 -28
  90. package/src/gatsby-core-theme/pages/404/index.js +0 -66
  91. package/storybook/public/5.5635a723.iframe.bundle.js.map +0 -1
  92. package/storybook/public/8.4148b63e.iframe.bundle.js +0 -3
  93. package/storybook/public/8.4148b63e.iframe.bundle.js.map +0 -1
  94. package/storybook/public/main.e82d53bf.iframe.bundle.js +0 -1
  95. package/storybook/public/vendors~main.aac219e4.iframe.bundle.js +0 -7
  96. package/storybook/public/vendors~main.aac219e4.iframe.bundle.js.map +0 -1
@@ -1,16 +1,10 @@
1
1
  .content {
2
2
  width: 100%;
3
- table{
4
- @include min(tablet){
5
- thead, tbody{
6
- display: table;
7
- width: 100%;
8
- table-layout: fixed;
9
- }
10
- }
3
+ div {
4
+ display: flow-root;
11
5
  }
12
- p{
13
- margin-bottom: 24px;
6
+ p:not(:last-of-type) {
7
+ margin-bottom: 2.4rem;
14
8
  }
15
9
  table {
16
10
  width: 100% !important;
@@ -20,7 +14,14 @@
20
14
  font-weight: 400;
21
15
  table-layout: auto;
22
16
  @include link-color(var(--color-6));
23
-
17
+ @include min(tablet) {
18
+ thead,
19
+ tbody {
20
+ display: table;
21
+ width: 100%;
22
+ table-layout: fixed;
23
+ }
24
+ }
24
25
  thead {
25
26
  tr {
26
27
  th {
@@ -54,6 +55,11 @@
54
55
  padding: 1rem;
55
56
  vertical-align: top;
56
57
  padding-left: 1.4rem;
58
+ a {
59
+ img {
60
+ width: 15rem;
61
+ }
62
+ }
57
63
  }
58
64
  }
59
65
 
@@ -102,17 +108,65 @@
102
108
  }
103
109
  }
104
110
 
111
+ .stackTable {
112
+ @include max(mobile) {
113
+ table {
114
+ border-collapse: inherit;
115
+ box-shadow: 0 2px 16px #17182f14;
116
+
117
+ thead {
118
+ display: none;
119
+ }
120
+
121
+ tbody {
122
+ tr {
123
+ &:first-child {
124
+ td {
125
+ color: var(--table-head-text);
126
+ background: var(--table-head-background);
127
+
128
+ border-radius: 0;
129
+
130
+ &:first-child {
131
+ border-top-left-radius: var(--table-border-radius);
132
+ border-top-right-radius: var(--table-border-radius);
133
+ }
134
+ }
135
+ }
136
+
137
+ td {
138
+ display: block;
139
+ text-align: left;
140
+ border-bottom: 1px solid #bfd3e5;
141
+ width: 100% !important;
142
+ }
143
+
144
+ &:last-child {
145
+ td {
146
+ border-radius: 0;
147
+ &:last-child {
148
+ border-bottom-right-radius: var(--table-border-radius);
149
+ border-bottom-left-radius: var(--table-border-radius);
150
+ border-bottom: none;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+
105
160
  .tableResponsive,
106
161
  .tableResponsive > div {
107
162
  box-sizing: content-box;
108
163
  width: 100%;
109
- table{
164
+ table {
110
165
  display: block;
111
166
  width: 100%;
112
167
  @include overflow(overflow-x, auto, touch);
113
- @include scrollbar(0.8rem, 0.8rem, var(--color-33));
114
-
115
168
  }
169
+ @include scrollbar(0.8rem, 0.8rem, var(--color-33));
116
170
 
117
171
  * {
118
172
  box-sizing: content-box;
@@ -121,7 +175,10 @@
121
175
  td,
122
176
  th {
123
177
  @include max(tablet) {
124
- min-width: 25rem;
178
+ min-width: 15rem;
179
+ }
180
+ img {
181
+ max-width: none;
125
182
  }
126
183
  }
127
184
  }
@@ -131,7 +188,7 @@
131
188
  color: var(--color-6);
132
189
  font-size: 1.6rem;
133
190
  list-style-position: inside;
134
- padding: 1.6rem;
191
+ padding: 0 1.6rem 1.6rem;
135
192
 
136
193
  li {
137
194
  margin: 0.35rem 0;
@@ -50,6 +50,8 @@ const Content = ({ module }) => {
50
50
  return `${styles.tableResponsive} ${styles.firstTable}`;
51
51
  case 'table_2':
52
52
  return `${styles.tableResponsive} ${styles.secondTable}`;
53
+ case 'stack_table':
54
+ return styles.stackTable;
53
55
  case 'default_table':
54
56
  return `${styles.tableResponsive}`;
55
57
  case 'content_frame_style':
@@ -25,7 +25,10 @@ const Footer = ({
25
25
  <div className={styles.topPart}>
26
26
  <div className={styles.links}>
27
27
  {footerMenu && showLinks && (
28
- <LinkList lists={getExtraField(section?.extra_fields, footerMenu)} />
28
+ <LinkList
29
+ lists={getExtraField(section?.extra_fields, footerMenu)}
30
+ gtmClass="mobile-menu-gtm"
31
+ />
29
32
  )}
30
33
  </div>
31
34
 
@@ -54,6 +57,7 @@ const Footer = ({
54
57
  imageOnly
55
58
  singleList
56
59
  lists={getExtraField(section?.extra_fields, footerLogos)}
60
+ gtmClass="mobile-menu-gtm logo-cta"
57
61
  />
58
62
  )}
59
63
  </div>
@@ -19,8 +19,13 @@ const Main = ({ section = {}, page = {}, pageContext = {}, showNewsletter = fals
19
19
  typeof window !== 'undefined' && Boolean(getURLParam('subscribed'))
20
20
  ? loadable(() => import(`../../../../components/atoms/newsletter/success`))
21
21
  : null;
22
+ const NotFound = page.path.includes('404')
23
+ ? loadable(() => import(`gatsby-core-theme/src/components/atoms/not-found`))
24
+ : null;
25
+
22
26
  return (
23
27
  <main className={styles.modulePage}>
28
+ {NotFound && <NotFound imagePath="404" />}
24
29
  {section.modules &&
25
30
  section.modules.map((module) => (
26
31
  <Module key={keygen()} module={module} page={page} pageContext={pageContext} />
@@ -28,7 +33,7 @@ const Main = ({ section = {}, page = {}, pageContext = {}, showNewsletter = fals
28
33
  {SearchPage && <SearchPage page={page} />}
29
34
  {showNewsletter && <Newsletter page={page} />}
30
35
  {NewsletterSuccess && showNewsletter && <NewsletterSuccess />}
31
- {page.author && <AuthorBox author={page.author} translations={page.translations} />}
36
+ {page.author && <AuthorBox author={page.author} />}
32
37
  </main>
33
38
  );
34
39
  };
@@ -109,9 +109,7 @@ const Modules = ({ module, page, pageContext }) => {
109
109
  module.name
110
110
  } ${styles.module} ${module?.style && styles[module.style]} module`}
111
111
  >
112
- {module.name !== 'top_list' && (
113
- <ModuleTitle module={module} translations={page?.translations} />
114
- )}
112
+ {module.name !== 'top_list' && <ModuleTitle module={module} />}
115
113
  <ModuleComponent module={module} page={page} pageContext={pageContext} {...extraProps} />
116
114
  </div>
117
115
  )
@@ -6,6 +6,10 @@ import { FaSearch } from 'react-icons/fa';
6
6
  // eslint-disable-next-line import/no-extraneous-dependencies
7
7
  import Tabs from 'gatsby-matrix-theme/src/hooks/tabs';
8
8
  import styles from 'gatsby-core-theme/src/components/molecules/search/search.module.scss';
9
+ import Link from 'gatsby-core-theme/src/hooks/link';
10
+ import { translate } from 'gatsby-core-theme/src/helpers/getters';
11
+ import { Context } from 'gatsby-core-theme/src/context/TranslationsProvider';
12
+
9
13
  import LazyImage from '~hooks/lazy-image';
10
14
  import ConditionalWrapper from '~atoms/conditional-wrapper';
11
15
  import { getURLParam } from '~helpers/getters';
@@ -46,11 +50,14 @@ const Search = ({
46
50
  const [sortQuery, setSortQuery] = useState({});
47
51
  const [searchQuery, setSearchQuery] = useState(searchQueryInit);
48
52
  const [searchBoxQuery, setSearchBoxQuery] = useState('');
53
+ const noResultsText = noResults.replace('[keyword]', searchQuery);
49
54
 
50
55
  const loadingRef = useRef(React.createRef());
51
56
  const searchInputRef = useRef(React.createRef());
52
57
  const formBoxInputRef = useRef(React.createRef());
53
58
 
59
+ const { translations } = useContext(Context) || {};
60
+
54
61
  // Store search results, in case of page search with tabs it's a multidimensal array grouped by types
55
62
  const searchResultsRef = useRef([]);
56
63
  // Store the search function object
@@ -245,7 +252,7 @@ const Search = ({
245
252
  // Use a default or given close button
246
253
  if (formSearchOptionsCopy !== null && formSearchOptionsCopy.searchButtonComponent === undefined) {
247
254
  formSearchOptionsCopy.searchButtonComponent = (
248
- <button aria-label="Search" type="submit">
255
+ <button aria-label="Search" type="submit" className="search-gtm btn-cta">
249
256
  {searchIcon === null ? <FaSearch /> : <img alt="search" src={searchIcon} />}
250
257
  </button>
251
258
  );
@@ -269,6 +276,16 @@ const Search = ({
269
276
  {formSearchOptionsCopy.autoComplete && searchResultsRef.current.length > 0 && (
270
277
  <div className={styles.autocomplete}>
271
278
  {searchResultsRef.current.map((item) => getChildType(item, item.type))}
279
+ {formSearchOptionsCopy.showViewResultsText && (
280
+ <div className={styles.viewAllResults}>
281
+ <Link
282
+ to={`/${searchURLPageName}?${searchUrlParam}=${searchQuery}`}
283
+ className="search-gtm"
284
+ >
285
+ <h1>{translate(translations, 'view_all', 'View All Results')}</h1>
286
+ </Link>
287
+ </div>
288
+ )}
272
289
  </div>
273
290
  )}
274
291
  </form>
@@ -292,14 +309,14 @@ const Search = ({
292
309
  maxLength="60"
293
310
  />
294
311
  <div className={styles.searchButton}>
295
- <button aria-label="Search" type="submit">
312
+ <button aria-label="Search" type="submit" className="search-gtm btn-cta">
296
313
  {searchIcon === null ? <FaSearch /> : <img alt="search" src={searchIcon} />}
297
314
  </button>
298
315
  </div>
299
316
  </form>
300
317
  {searchResultsRef.current.length === 0 && formSearchOptionsCopy === null ? (
301
318
  <div>
302
- <span className={styles.noResults}>{noResults}</span>
319
+ <span className={styles.noResults}>{noResultsText}</span>
303
320
  </div>
304
321
  ) : null}
305
322
  {searchResultsRef.current.length !== 0 && (
@@ -310,6 +327,7 @@ const Search = ({
310
327
  {...pageSearchOptionsCopy.tabsOptions}
311
328
  activeTabClass="searchActive"
312
329
  headerClass="searchHeader"
330
+ gtmClass="search-tabs-menu-gtm"
313
331
  >
314
332
  {items}
315
333
  </Tabs>
@@ -332,6 +350,7 @@ const Search = ({
332
350
  items,
333
351
  model_type: type,
334
352
  title: titleObj ? titleObj.title : '',
353
+ pagination_type: 'load_more',
335
354
  ...pageSearchOptionsCopy.archiveOptions.includeOptions,
336
355
  };
337
356
  }
@@ -353,7 +372,12 @@ const Search = ({
353
372
  module_title_tag: 'h2',
354
373
  }}
355
374
  />
356
- <Archive module={items} loadMore={loadMore} page={page} />
375
+ <Archive
376
+ module={items}
377
+ loadMore={loadMore}
378
+ page={page}
379
+ gtmClass="archive-gtm"
380
+ />
357
381
  </>
358
382
  )}
359
383
  </div>
@@ -2,12 +2,16 @@
2
2
  .link {
3
3
  word-break: inherit;
4
4
  white-space: nowrap;
5
-
6
5
  background-color: var(--color-7);
7
6
  padding: 1rem 2.5rem;
8
7
  border-radius: 0.6rem;
9
8
  color: #000;
10
9
  font-weight: 400;
10
+ @include flex-align(center, center);
11
+
12
+ svg {
13
+ margin-left: 1rem;
14
+ }
11
15
 
12
16
  &:hover {
13
17
  background-color: var(--secondary-color);
@@ -5,7 +5,13 @@ import keygen from '~helpers/keygen';
5
5
  import { anchorLink } from '~helpers/strings';
6
6
  import styles from './anchor.module.scss';
7
7
 
8
- function Anchor({ module: { items }, headerOffset = 80, sliderGap = 0, isFixed = false }) {
8
+ function Anchor({
9
+ module: { items },
10
+ headerOffset = 80,
11
+ sliderGap = 0,
12
+ isFixed = false,
13
+ icon = null,
14
+ }) {
9
15
  const [isFixedMenu, setIsFixedMenu] = useState(false);
10
16
  if (isFixed && typeof window !== 'undefined') {
11
17
  window.addEventListener('scroll', () => {
@@ -47,15 +53,17 @@ function Anchor({ module: { items }, headerOffset = 80, sliderGap = 0, isFixed =
47
53
  usePagination={false}
48
54
  settings={{ numberOfSlides: 0, sliderGap }}
49
55
  className={styles.sliderWrapper}
56
+ gtmClass="anchor-carousel-gtm"
50
57
  >
51
58
  {items?.map((anchor) => (
52
59
  <a
53
- className={styles.link}
60
+ className={`${styles.link} anchor-carousel-gtm anchor-menu-gtm`}
54
61
  key={keygen()}
55
62
  onClick={handleClick}
56
63
  href={`#${anchor.label && anchorLink(anchor?.label?.toLowerCase().trim())}`}
57
64
  >
58
65
  {anchor.label}
66
+ {icon}
59
67
  </a>
60
68
  ))}
61
69
  </Slider>
@@ -76,6 +84,7 @@ Anchor.propTypes = {
76
84
  sliderGap: PropTypes.number,
77
85
  styles: PropTypes.shape({}),
78
86
  isFixed: PropTypes.bool,
87
+ icon: PropTypes.element,
79
88
  };
80
89
 
81
90
  export default Anchor;
@@ -9,7 +9,7 @@ import Slide from '../../../../components/molecules/carousel/screenshot-slide';
9
9
 
10
10
  import styles from './carousel.module.scss';
11
11
 
12
- const Carousel = ({ module = {}, settings = {} }) => {
12
+ const Carousel = ({ module = {}, settings = {}, gtmClass = '' }) => {
13
13
  const [width] = useWindowSize();
14
14
  // render one item per slide
15
15
  const renderOne = (items) => {
@@ -17,7 +17,7 @@ const Carousel = ({ module = {}, settings = {} }) => {
17
17
  for (let i = 0; i < items.length; i += 1) {
18
18
  arr.push(
19
19
  <div key={keygen()} className={styles.carouselItem}>
20
- <Slide item={items[i]} />
20
+ <Slide item={items[i]} gtmClass={gtmClass} />
21
21
  </div>
22
22
  );
23
23
  }
@@ -30,11 +30,11 @@ const Carousel = ({ module = {}, settings = {} }) => {
30
30
  arr.push(
31
31
  <div className={styles.slide} key={keygen()}>
32
32
  <div key={keygen()} className={styles.carouselItem}>
33
- <Slide item={items[i]} />
33
+ <Slide item={items[i]} gtmClass={gtmClass} />
34
34
  </div>
35
35
  {items[i + 1] && (
36
36
  <div key={keygen()} className={styles.carouselItem}>
37
- <Slide item={items[i + 1]} />
37
+ <Slide item={items[i + 1]} gtmClass={gtmClass} />
38
38
  </div>
39
39
  )}
40
40
  </div>
@@ -46,12 +46,22 @@ const Carousel = ({ module = {}, settings = {} }) => {
46
46
  return (
47
47
  <div className={styles.carouselContainer}>
48
48
  {width >= 991 && (
49
- <Slider {...settings} className={styles.screenshotCarousel} useArrows={false}>
49
+ <Slider
50
+ {...settings}
51
+ className={styles.screenshotCarousel}
52
+ useArrows={false}
53
+ gtmClass={gtmClass}
54
+ >
50
55
  {renderTwo(module.items)}
51
56
  </Slider>
52
57
  )}
53
58
  {width < 991 && width > 0 && (
54
- <Slider {...settings} className={styles.screenshotCarousel} useArrows={false}>
59
+ <Slider
60
+ {...settings}
61
+ className={styles.screenshotCarousel}
62
+ useArrows={false}
63
+ gtmClass={gtmClass}
64
+ >
55
65
  {renderOne(module.items)}
56
66
  </Slider>
57
67
  )}
@@ -72,6 +82,7 @@ Carousel.propTypes = {
72
82
  }),
73
83
  settings: PropTypes.shape(PropTypes.object),
74
84
  styles: PropTypes.object,
85
+ gtmClass: PropTypes.string,
75
86
  };
76
87
 
77
88
  export default Carousel;
@@ -60,12 +60,12 @@ const Navigation = ({
60
60
  >
61
61
  <nav className={styles.nav} style={{ justifyContent: logoPosition }} ref={navRef}>
62
62
  <NavigationProvider>
63
- <Link className={styles.logo} to="/" onClick={onClickHandler}>
63
+ <Link className={`${styles.logo} main-menu-gtm logo-cta`} to="/" onClick={onClickHandler}>
64
64
  <img alt={getSiteName()} src={logo} width={logoWidth} height={logoHeight} />
65
65
  </Link>
66
66
  {showMenu && (
67
67
  <>
68
- <Menu section={section} menu={menu} options={options} />
68
+ <Menu section={section} menu={menu} options={options} gtmClass="main-menu-gtm" />
69
69
  {hasSearch && <SearchForm className={styles.search} searchIcon={searchIcon} />}
70
70
  </>
71
71
  )}
@@ -68,7 +68,7 @@ const SearchForm = ({ className, searchIcon, iconWidth = 24, iconHeight = 24 })
68
68
  type="button"
69
69
  aria-label="Search"
70
70
  onClick={handleOnSearchIconClick}
71
- className={`${styles.searchButton} ${showSearch && styles.active}`}
71
+ className={`${styles.searchButton} ${showSearch && styles.active} search-gtm btn-cta`}
72
72
  >
73
73
  {searchIcon === null ? (
74
74
  <FaSearch />
@@ -92,6 +92,7 @@ const SearchForm = ({ className, searchIcon, iconWidth = 24, iconHeight = 24 })
92
92
  autoComplete: true,
93
93
  sort: true,
94
94
  limit: 3,
95
+ showViewResultsText: false,
95
96
  }}
96
97
  >
97
98
  {(item) => (
@@ -24,6 +24,8 @@ function Body({ pageContext }) {
24
24
  const footerNavigationData = pageContext?.marketSections?.footer_navigation || null;
25
25
  const isHomePage = pageContext?.page && pageContext?.page.path === '/';
26
26
  const pageType = pageContext.page.type;
27
+ const is404 = pageContext.page.path.includes('404');
28
+
27
29
  const Popup = pageContext?.marketSections?.popup
28
30
  ? loadable(() => import(`../../../../components/organisms/popup`))
29
31
  : null;
@@ -42,12 +44,13 @@ function Body({ pageContext }) {
42
44
  const status = pageContext.page.relation?.status;
43
45
 
44
46
  const hideBanner = status === 'inactive' || status === 'coming_soon';
45
- const { template, translations } = pageContext.page;
47
+ const { template } = pageContext.page;
46
48
 
47
49
  const popupData = pageContext?.marketSections?.popup?.modules?.find((m) => m.name === 'top_list');
48
- const FooterNavigation = footerNavigationData
49
- ? loadable(() => import(`../../../../components/organisms/footer-navigation`))
50
- : null;
50
+ const FooterNavigation =
51
+ footerNavigationData && pageType !== 'operator'
52
+ ? loadable(() => import(`../../../../components/organisms/footer-navigation`))
53
+ : null;
51
54
 
52
55
  return (
53
56
  <>
@@ -55,7 +58,6 @@ function Body({ pageContext }) {
55
58
  <Navigation
56
59
  template={template}
57
60
  section={navigation}
58
- translations={translations}
59
61
  searchIcon="../../../../../../images/search.svg"
60
62
  menu="main_menu"
61
63
  options={{
@@ -76,7 +78,7 @@ function Body({ pageContext }) {
76
78
  <ContactUs page={pageContext} />
77
79
  ) : (
78
80
  <>
79
- {!isSearch && <Header section={pageContext} />}
81
+ {!isSearch && !is404 && <Header section={pageContext} />}
80
82
  {main && <Main section={main} page={pageContext.page} />}
81
83
  {pageType === 'operator' && !hideBanner && (
82
84
  <OperatorBanner
@@ -114,10 +116,14 @@ function Body({ pageContext }) {
114
116
  <p>
115
117
  We use cookies in order to optimise our site and improve your experience with us. By using
116
118
  the site you consent to our
117
- <a href="/cookies"> &nbsp; Cookie Policy</a>.
119
+ <a href="/cookies" className="cookie-consent-gtm">
120
+ {' '}
121
+ &nbsp; Cookie Policy
122
+ </a>
123
+ .
118
124
  </p>
119
125
  </CookieConsent>
120
- {Popup && popupData && <Popup module={popupData} translations={translations} />}
126
+ {Popup && popupData && <Popup module={popupData} />}
121
127
  </>
122
128
  );
123
129
  }
@@ -130,7 +136,6 @@ Body.propTypes = {
130
136
  type: PropTypes.string,
131
137
  path: PropTypes.string,
132
138
  template: PropTypes.string,
133
- translations: PropTypes.shape({}),
134
139
  relation: PropTypes.shape({
135
140
  status: PropTypes.string,
136
141
  logo_url: PropTypes.string,