gatsby-core-theme 32.0.6 → 33.0.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 (37) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/package.json +1 -1
  3. package/src/components/atoms/author-box/description/author-description.test.js +65 -0
  4. package/src/components/atoms/author-box/description/index.js +1 -0
  5. package/src/components/atoms/image/index.js +6 -4
  6. package/src/components/atoms/search/autocomplete/operator.js +9 -2
  7. package/src/components/molecules/bonus/template-one/index.js +10 -1
  8. package/src/components/molecules/bonus/template-two/index.js +7 -3
  9. package/src/components/molecules/content/index.js +3 -1
  10. package/src/components/molecules/newsletter/index.js +1 -1
  11. package/src/components/molecules/spotlights_v2/icon/template-one/index.js +9 -2
  12. package/src/components/molecules/spotlights_v2/image/template-one/index.js +9 -2
  13. package/src/components/molecules/spotlights_v2/image/template-two/index.js +6 -2
  14. package/src/components/molecules/spotlights_v2/image-text/template-one/index.js +9 -1
  15. package/src/components/molecules/spotlights_v2/image-text/template-three/index.js +6 -0
  16. package/src/components/molecules/spotlights_v2/image-text/template-three/item/index.js +11 -1
  17. package/src/components/molecules/spotlights_v2/image-text/template-two/index.js +9 -1
  18. package/src/components/molecules/toplist/default-row/index.js +7 -3
  19. package/src/components/organisms/accordion/variants/template-two/index.js +8 -6
  20. package/src/components/pages/tracker/index-ssr.js +3 -1
  21. package/src/components/pages/tracker/index.js +3 -1
  22. package/src/components/pages/tracker-geo/index-ssr.js +3 -1
  23. package/src/components/pages/tracker-geo/index.js +3 -1
  24. package/src/helpers/getters.test.js +21 -0
  25. package/src/helpers/processor/index.mjs +5 -4
  26. package/src/helpers/processor/modules.mjs +8 -0
  27. package/src/helpers/replaceMedia.js +12 -6
  28. package/src/helpers/replaceMedia.test.js +1 -1
  29. package/src/helpers/strings.js +3 -2
  30. package/src/images/icons/check.js +10 -1
  31. package/src/images/logo.svg +2 -2
  32. package/src/images/security.svg +2 -2
  33. package/src/images/verify.svg +2 -2
  34. package/static/images/bell.svg +2 -2
  35. package/static/images/logo.svg +2 -2
  36. package/static/images/notification-bubble.svg +4 -4
  37. package/static/images/security.svg +2 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ # [33.0.0](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/compare/v32.0.6...v33.0.0) (2024-06-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * conflicts ([39c9bb4](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/39c9bb43b9a203276edebbdd0c2e259d32419e8f))
7
+ * content modules not bigger than module ([d3317d3](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/d3317d3b73bdc1d0f22183c7b2b5ff3c76666b37))
8
+ * fix bug for prefilled module ([2d58502](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/2d58502ed2010d7421d81d3037cafa2b8896971d))
9
+ * fix logic ([2d6dfe5](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/2d6dfe5e634952af1d9c391dcc30acc9ccf90d5e))
10
+ * image size ([cb20c7e](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/cb20c7e453599d6baaa58c8eee1e6cfaedde6398))
11
+ * prefilled module ([dc631f8](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/dc631f8fccb81ffe4b1e0bcdb398184b5a4abaae))
12
+ * resolve conflicts ([41d401a](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/41d401a3a4f770a2ba79ab0f872de3c2a852928c))
13
+ * test ([a882a09](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/a882a092ac1f3206320940134ad6c7b378f3d7c1))
14
+ * width and height proptype ([fd0db97](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/fd0db977f6a2048f092c866a88e541e9329b1ed4))
15
+
16
+
17
+ ### Code Refactoring
18
+
19
+ * add aria labels for svg titles ([01f477a](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/01f477ac723f6c4f4f1c5c3905166a6fa225210c))
20
+ * changes to statistics ([65c38ec](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/65c38ec64a032b1780f763bef559e09673be195f))
21
+ * correction to typo ([2b75024](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/2b750243d384a27ff856c3c94aa73702974d3953))
22
+ * move stats to modules ([1d64d84](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/1d64d8466c64bae6bff1fa3a5ef085fa1c18fd9a))
23
+
24
+
25
+ * Merge branch 'tm-4416-aria-labels' into 'master' ([088f5a0](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/088f5a04465d376fd19444e4a9f079b84460c208))
26
+ * Merge branch 'tm-4419-prefilled-module' into 'master' ([bce297c](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/bce297c4cb1b17074c5f948c3cb19efa32753f5c))
27
+ * Merge branch 'tm-4327-stats' into 'master' ([17d410d](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/17d410df307c91c3600c20f4d431947f9ae57ef9))
28
+ * Merge branch 'master' into tm-4327-stats ([2bb17ee](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/2bb17eee58f18f5fbe2f7f44e70a7f5ce9d9182a))
29
+ * Merge branch 'tm-4358-images-size' into 'master' ([8281773](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/8281773a9a79feba674c3ca7753ea5995ab97892))
30
+
31
+
32
+ ### Tests
33
+
34
+ * fix test ([6a3fd25](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/commit/6a3fd25b6b20764b11192c6475a6a2c3f4657d0e))
35
+
1
36
  ## [32.0.6](https://git.ilcd.rocks/team-floyd/themes/gatsby-themes/compare/v32.0.5...v32.0.6) (2024-06-04)
2
37
 
3
38
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gatsby-core-theme",
3
- "version": "32.0.6",
3
+ "version": "33.0.0",
4
4
  "description": "Gatsby Theme NPM Package",
5
5
  "author": "",
6
6
  "license": "ISC",
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+ import { render, cleanup, fireEvent } from '@testing-library/react';
3
+ import '@testing-library/jest-dom/extend-expect';
4
+
5
+ import { authorObject } from '~tests/factories/modules/author-box.factory';
6
+ import AuthorDescription from '.';
7
+
8
+ describe('author box component', () => {
9
+ test('render', () => {
10
+ const author = authorObject;
11
+ author.biography =
12
+ "The purpose of lorem ipsum is to create a natural looking block of text (sentence, paragraph, page, etc.) that doesn't distract from the layout";
13
+ const { container, getByText } = render(<AuthorDescription author={author} />);
14
+ expect(container).toBeTruthy();
15
+ expect(container.querySelector('.description')).toBeTruthy();
16
+ expect(container.querySelector('.biography')).toBeTruthy();
17
+ expect(getByText(author.biography)).toBeTruthy();
18
+ });
19
+ test('render different templates', () => {
20
+ const author = authorObject;
21
+ const { container } = render(<AuthorDescription author={author} template="templateOne" />);
22
+ expect(container).toBeTruthy();
23
+ expect(container.querySelector('.templateOne')).toBeTruthy();
24
+ });
25
+ test('render with read more ', async () => {
26
+ const author = authorObject;
27
+
28
+ author.biography =
29
+ "The purpose of lorem ipsum is to create a natural looking block of text (sentence, paragraph, page, etc.) that doesn't distract from the layout";
30
+
31
+ const { container, getByText } = render(
32
+ <AuthorDescription author={author} readMore maximumLength={2} />
33
+ );
34
+
35
+ expect(container).toBeTruthy();
36
+ expect(getByText('The purpose')).toBeTruthy();
37
+ expect(container.querySelector('.showReadMore')).toBeTruthy();
38
+ expect(container.querySelector('.contReadText')).toBeTruthy();
39
+ expect(getByText('...continue reading')).toBeTruthy();
40
+ });
41
+ test('click read more ', async () => {
42
+ const author = authorObject;
43
+
44
+ author.biography =
45
+ "The purpose of lorem ipsum is to create a natural looking block of text (sentence, paragraph, page, etc.) that doesn't distract from the layout";
46
+
47
+ const { container, getByText } = render(
48
+ <AuthorDescription author={author} readMore maximumLength={2} />
49
+ );
50
+
51
+ expect(container).toBeTruthy();
52
+ expect(getByText('The purpose')).toBeTruthy();
53
+ expect(container.querySelector('.showReadMore')).toBeTruthy();
54
+ expect(container.querySelector('.contReadText')).toBeTruthy();
55
+ expect(getByText('...continue reading')).toBeTruthy();
56
+
57
+ const button = container.querySelector('.showReadMore');
58
+ fireEvent.click(button);
59
+ expect(getByText(author.biography)).toBeTruthy();
60
+ expect(container.querySelector('.open')).toBeTruthy();
61
+ });
62
+ });
63
+ afterEach(() => {
64
+ cleanup();
65
+ });
@@ -33,6 +33,7 @@ export default function AuthorDescription({
33
33
  tabIndex={0}
34
34
  onClick={toggleReadMore}
35
35
  onKeyDown={toggleReadMore}
36
+ // eslint-disable-next-line react/no-danger
36
37
  dangerouslySetInnerHTML={{
37
38
  __html:
38
39
  author?.biography?.split(' ').length > maximumLength && isReadMore
@@ -5,17 +5,17 @@ import LazyImage from '~hooks/lazy-image';
5
5
  import { imagePrettyUrl } from '~helpers/getters';
6
6
  import styles from './image.module.scss';
7
7
 
8
- const Image = ({ module = {} }) => {
8
+ const Image = ({ module = {}, width = '912', height = '333' }) => {
9
9
  const { title, value, alt = 'missing alt', alignment } = module;
10
10
 
11
11
  if (!value) return <></>;
12
12
 
13
13
  return (
14
14
  <LazyImage
15
- src={imagePrettyUrl(value, 912, 333)}
15
+ src={imagePrettyUrl(value, width, height)}
16
16
  alt={alt || 'missing alt'}
17
- width={912}
18
- height={333}
17
+ width={width}
18
+ height={height}
19
19
  title={title && title}
20
20
  className={`${styles.imageModule || ''} ${styles[alignment] || ''}`}
21
21
  />
@@ -29,6 +29,8 @@ Image.propTypes = {
29
29
  alt: PropTypes.string,
30
30
  alignment: PropTypes.string,
31
31
  }),
32
+ width: PropTypes.string,
33
+ height: PropTypes.string,
32
34
  };
33
35
 
34
36
  export default Image;
@@ -6,13 +6,18 @@ import { imagePrettyUrl } from '~helpers/getters';
6
6
  import OperatorCta from '~atoms/button/operator-cta';
7
7
  import styles from './operator.module.scss';
8
8
 
9
- const Operator = ({ item = {} }) => {
9
+ const Operator = ({ item = {}, width = '56', height = '56' }) => {
10
10
  const { relation } = item;
11
11
  const img = relation?.standardised_logo_url_object?.filename || relation.logo_url;
12
12
 
13
13
  return (
14
14
  <div className={styles.row || ''}>
15
- <LazyImage width={56} height={56} src={imagePrettyUrl(img, 56, 56)} alt={item.title} />
15
+ <LazyImage
16
+ width={width}
17
+ height={height}
18
+ src={imagePrettyUrl(img, width, height)}
19
+ alt={item.title}
20
+ />
16
21
  <h3>{item.title}</h3>
17
22
  <OperatorCta module="search" operator={relation} gtmClass="toplist-operator-cta-gtm" />
18
23
  </div>
@@ -26,6 +31,8 @@ Operator.propTypes = {
26
31
  logo_url: PropTypes.string,
27
32
  }),
28
33
  }).isRequired,
34
+ width: PropTypes.string,
35
+ height: PropTypes.string,
29
36
  };
30
37
 
31
38
  export default Operator;
@@ -19,6 +19,8 @@ export default function Bonus({
19
19
  },
20
20
  tncEnable = true,
21
21
  tncFixed = false,
22
+ width = '100',
23
+ height = '120',
22
24
  showRoundedRating = false,
23
25
  }) {
24
26
  const { standardised_logo_url, logo_url, bonus, name } = operator || {};
@@ -42,7 +44,12 @@ export default function Bonus({
42
44
  clickedElement="oneliner"
43
45
  className={`${styles.logo || ''} operator-banner-gtm logo-cta`}
44
46
  >
45
- <LazyImage alt={operator?.name} src={imagePrettyUrl(logo)} height={120} width={100} />
47
+ <LazyImage
48
+ alt={operator?.name}
49
+ src={imagePrettyUrl(logo, width, height)}
50
+ height={height}
51
+ width={width}
52
+ />
46
53
  <div className={styles.details}>
47
54
  {name && <span>{name}</span>}
48
55
  {(operator?.rating || bonus?.rating) && (
@@ -97,5 +104,7 @@ Bonus.propTypes = {
97
104
  type: PropTypes.string,
98
105
  name: PropTypes.string,
99
106
  }),
107
+ width: PropTypes.string,
108
+ height: PropTypes.string,
100
109
  showRoundedRating: PropTypes.bool,
101
110
  };
@@ -27,6 +27,8 @@ export default function TemplateOne({
27
27
  closedBanner,
28
28
  setClosedBanner,
29
29
  showRoundedRating = false,
30
+ width = '120',
31
+ height = '120',
30
32
  }) {
31
33
  const { translations } = useContext(Context) || {};
32
34
  const { standardised_logo_url, logo_url, bonus, name } = operator || {};
@@ -64,10 +66,10 @@ export default function TemplateOne({
64
66
  >
65
67
  <LazyImage
66
68
  alt={operator?.name}
67
- src={imagePrettyUrl(logo, 120, 120)}
69
+ src={imagePrettyUrl(logo, width, height)}
68
70
  loading="eager"
69
- height={120}
70
- width={100}
71
+ height={height}
72
+ width={width}
71
73
  />
72
74
  <div className={styles.details}>
73
75
  {name && <span>{name}</span>}
@@ -142,5 +144,7 @@ TemplateOne.propTypes = {
142
144
  type: PropTypes.string,
143
145
  name: PropTypes.string,
144
146
  }),
147
+ width: PropTypes.string,
148
+ height: PropTypes.string,
145
149
  showRoundedRating: PropTypes.bool,
146
150
  };
@@ -19,6 +19,7 @@ const Content = ({
19
19
  page,
20
20
  isContentCollapsible = false,
21
21
  icon = <IoIosArrowDown />,
22
+ moduleWidth = 960,
22
23
  }) => {
23
24
  const { show_more_label, show_more_enabled } = module || {};
24
25
 
@@ -65,7 +66,7 @@ const Content = ({
65
66
  `}
66
67
  >
67
68
  {parse(content, {
68
- replace: (node) => replaceMedia(node, page, translations),
69
+ replace: (node) => replaceMedia(node, page, translations, moduleWidth),
69
70
  })}
70
71
  </div>
71
72
  );
@@ -110,6 +111,7 @@ Content.propTypes = {
110
111
  isModuleIntroduction: PropTypes.string,
111
112
  isContentCollapsible: PropTypes.bool,
112
113
  icon: PropTypes.node,
114
+ moduleWidth: PropTypes.node,
113
115
  };
114
116
 
115
117
  export default Content;
@@ -12,7 +12,7 @@ const Newsletter = ({
12
12
  openBtnText = 'Unlock Bonuses',
13
13
  isSticky = false,
14
14
  showLabels = true,
15
- titleType = 'p',
15
+ titleType = 'h2',
16
16
  }) => {
17
17
  const [toggleNewsetter, setToggleNewsletter] = useState(false);
18
18
  const [isClicked, setIsClicked] = useState(false);
@@ -6,14 +6,19 @@ import Link from '../../../../../hooks/link';
6
6
  import { imagePrettyUrl, translate } from '../../../../../helpers/getters.mjs';
7
7
  import styles from './template-one.module.scss';
8
8
 
9
- export default function TemplateOne({ module }) {
9
+ export default function TemplateOne({ module, width = 106, height = 106 }) {
10
10
  const { items } = module;
11
11
  const { translations } = useContext(Context) || {};
12
12
 
13
13
  const content = (res) => (
14
14
  <>
15
15
  {res?.icon && (
16
- <LazyImage height={106} width={106} src={imagePrettyUrl(res?.icon)} alt={res?.link_text} />
16
+ <LazyImage
17
+ height={height}
18
+ width={width}
19
+ src={imagePrettyUrl(res?.icon, width, height)}
20
+ alt={res?.link_text}
21
+ />
17
22
  )}
18
23
  <p>{res?.link_text || translate(translations, 'read_more', 'Read more')}</p>
19
24
  {res.subtitle && <span>{res.subtitle}</span>}
@@ -43,4 +48,6 @@ TemplateOne.propTypes = {
43
48
  module: PropTypes.shape({
44
49
  items: PropTypes.shape({}),
45
50
  }).isRequired,
51
+ width: PropTypes.string,
52
+ height: PropTypes.string,
46
53
  };
@@ -6,14 +6,19 @@ import Link from '../../../../../hooks/link';
6
6
  import { imagePrettyUrl, translate } from '../../../../../helpers/getters.mjs';
7
7
  import styles from './template-one.module.scss';
8
8
 
9
- export default function TemplateOne({ module }) {
9
+ export default function TemplateOne({ module, width = '295', height = '260' }) {
10
10
  const { items } = module;
11
11
  const { translations } = useContext(Context) || {};
12
12
 
13
13
  const content = (res) => (
14
14
  <>
15
15
  {res?.image && (
16
- <LazyImage width={295} height={260} src={imagePrettyUrl(res?.image)} alt={res?.link_text} />
16
+ <LazyImage
17
+ width={width}
18
+ height={height}
19
+ src={imagePrettyUrl(res?.image, width, height)}
20
+ alt={res?.link_text}
21
+ />
17
22
  )}
18
23
  {/* Need to talk to add this field on hercules */}
19
24
  <p>
@@ -43,4 +48,6 @@ TemplateOne.propTypes = {
43
48
  module: PropTypes.shape({
44
49
  items: PropTypes.shape({}),
45
50
  }).isRequired,
51
+ width: PropTypes.string,
52
+ height: PropTypes.string,
46
53
  };
@@ -7,13 +7,15 @@ import Link from '../../../../../hooks/link';
7
7
  import { imagePrettyUrl, translate } from '../../../../../helpers/getters.mjs';
8
8
  import styles from './template-two.module.scss';
9
9
 
10
- export default function TemplateOne({ module }) {
10
+ export default function TemplateOne({ module, width = '340', height = '268' }) {
11
11
  const { items } = module;
12
12
  const { translations } = useContext(Context) || {};
13
13
 
14
14
  const content = (res) => (
15
15
  <>
16
- {res?.image && <LazyImage src={imagePrettyUrl(res?.image)} />}
16
+ {res?.image && (
17
+ <LazyImage src={imagePrettyUrl(res?.image, width, height)} width={width} height={height} />
18
+ )}
17
19
  <p>
18
20
  {res?.link_text || translate(translations, 'link_text_spotlights', 'Top Online Casinos')}{' '}
19
21
  {res.link?.value && <FaArrowRight size={20} color="#fff" />}
@@ -44,4 +46,6 @@ TemplateOne.propTypes = {
44
46
  module: PropTypes.shape({
45
47
  items: PropTypes.shape({}),
46
48
  }).isRequired,
49
+ width: PropTypes.string,
50
+ height: PropTypes.string,
47
51
  };
@@ -12,6 +12,8 @@ export default function TemplateOne({
12
12
  scrollableContent = false,
13
13
  buttonType = 'secondary',
14
14
  buttonSize = 'm',
15
+ width = '300',
16
+ height = '176',
15
17
  }) {
16
18
  const { items } = module;
17
19
  const { translations } = useContext(Context) || {};
@@ -26,7 +28,11 @@ export default function TemplateOne({
26
28
  <div className={`${styles.item} ${scrollableContent && styles.scrollContent}`}>
27
29
  <div className={styles.topSection}>
28
30
  {res?.image && (
29
- <LazyImage width={300} height={176} src={imagePrettyUrl(res?.image)} />
31
+ <LazyImage
32
+ width={width}
33
+ height={height}
34
+ src={imagePrettyUrl(res?.image, width, height)}
35
+ />
30
36
  )}
31
37
  {res?.label && <TitleTag>{res.label}</TitleTag>}
32
38
  {res.subtitle && <span>{res.subtitle}</span>}
@@ -67,4 +73,6 @@ TemplateOne.propTypes = {
67
73
  scrollableContent: PropTypes.bool,
68
74
  buttonType: PropTypes.string,
69
75
  buttonSize: PropTypes.string,
76
+ width: PropTypes.string,
77
+ height: PropTypes.string,
70
78
  };
@@ -10,6 +10,8 @@ export default function TemplateOne({
10
10
  characterMaxReadMore = 600,
11
11
  buttonType = 'secondary',
12
12
  buttonSize = 'm',
13
+ width = '104',
14
+ height = '104',
13
15
  }) {
14
16
  const { items } = module;
15
17
  return (
@@ -26,6 +28,8 @@ export default function TemplateOne({
26
28
  scrollableContent={scrollableContent}
27
29
  buttonType={buttonType}
28
30
  buttonSize={buttonSize}
31
+ width={width}
32
+ height={height}
29
33
  />
30
34
  );
31
35
  })
@@ -43,4 +47,6 @@ TemplateOne.propTypes = {
43
47
  characterMaxReadMore: PropTypes.number,
44
48
  buttonType: PropTypes.string,
45
49
  buttonSize: PropTypes.string,
50
+ width: PropTypes.string,
51
+ height: PropTypes.string,
46
52
  };
@@ -17,6 +17,8 @@ export default function TemplateOne({
17
17
  scrollableContent = false,
18
18
  buttonType = 'secondary',
19
19
  buttonSize = 'm',
20
+ width = '104',
21
+ height = '104',
20
22
  }) {
21
23
  const { translations } = useContext(Context) || {};
22
24
  const [showMore, setShowMore] = useState(false);
@@ -25,7 +27,13 @@ export default function TemplateOne({
25
27
  return (
26
28
  <div className={styles.item}>
27
29
  <div className={styles.topSection}>
28
- {item?.image && <LazyImage width={104} height={104} src={imagePrettyUrl(item?.image)} />}
30
+ {item?.image && (
31
+ <LazyImage
32
+ width={width}
33
+ height={height}
34
+ src={imagePrettyUrl(item?.image, width, height)}
35
+ />
36
+ )}
29
37
  {item?.label && <TitleTag>{item?.label}</TitleTag>}
30
38
  {item?.text && (
31
39
  <div
@@ -85,4 +93,6 @@ TemplateOne.propTypes = {
85
93
  scrollableContent: PropTypes.bool,
86
94
  buttonType: PropTypes.string,
87
95
  buttonSize: PropTypes.string,
96
+ width: PropTypes.string,
97
+ height: PropTypes.string,
88
98
  };
@@ -13,6 +13,8 @@ export default function TemplateOne({
13
13
  buttonType = 'secondary',
14
14
  buttonSize = 'm',
15
15
  titleType = 'label',
16
+ width = '104',
17
+ height = '104',
16
18
  }) {
17
19
  const { items } = module;
18
20
  const { translations } = useContext(Context) || {};
@@ -27,7 +29,11 @@ export default function TemplateOne({
27
29
  <div className={`${styles.item} ${scrollableContent && styles.scrollContent}`}>
28
30
  <div className={styles.topSection}>
29
31
  {res?.image && (
30
- <LazyImage width={104} height={104} src={imagePrettyUrl(res?.image)} />
32
+ <LazyImage
33
+ width={width}
34
+ height={height}
35
+ src={imagePrettyUrl(res?.image, width, height)}
36
+ />
31
37
  )}
32
38
  {res?.label && <TitleTag className={styles.titleTag || ''}>{res.label}</TitleTag>}
33
39
  {res.subtitle && <span>{res.subtitle}</span>}
@@ -68,4 +74,6 @@ TemplateOne.propTypes = {
68
74
  buttonType: PropTypes.string,
69
75
  buttonSize: PropTypes.string,
70
76
  titleType: PropTypes.string,
77
+ width: PropTypes.string,
78
+ height: PropTypes.string,
71
79
  };
@@ -23,6 +23,8 @@ const Row = ({
23
23
  className,
24
24
  nofollow = false,
25
25
  module,
26
+ width = '100',
27
+ height = '100',
26
28
  }) => {
27
29
  const reviewPath = item.review_link ? `/${item.review_link}` : item.path || null;
28
30
  const imageObject = item?.standardised_logo_url_object || item?.logo_url_object;
@@ -51,9 +53,9 @@ const Row = ({
51
53
  >
52
54
  <LazyImage
53
55
  alt={getAltText(imageObject, item.name)}
54
- src={imagePrettyUrl(imageObject?.filename || item?.logo_url, 100, 100)}
55
- width={100}
56
- height={100}
56
+ src={imagePrettyUrl(imageObject?.filename || item?.logo_url, width, height)}
57
+ width={width}
58
+ height={height}
57
59
  />
58
60
  </PrettyLink>
59
61
  <Bonus module="bonus" item={item} tracker={oneliner} />
@@ -104,6 +106,8 @@ Row.propTypes = {
104
106
  bonus: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),
105
107
  }).isRequired,
106
108
  pageTemplate: PropTypes.string,
109
+ width: PropTypes.string,
110
+ height: PropTypes.string,
107
111
  };
108
112
 
109
113
  export default Row;
@@ -8,7 +8,7 @@ import Link from '~hooks/link';
8
8
  import LazyImage from '~hooks/lazy-image';
9
9
  import { imagePrettyUrl } from '~helpers/getters';
10
10
 
11
- const TemplateTwo = ({ module, author }) => {
11
+ const TemplateTwo = ({ module, author, width = '36', height = '36' }) => {
12
12
  const { items } = module;
13
13
  const usernames = [
14
14
  'mindbrew94',
@@ -85,8 +85,8 @@ const TemplateTwo = ({ module, author }) => {
85
85
  className={styles.userAvatar}
86
86
  alt="user-avatar"
87
87
  filename="user_avatar"
88
- width={36}
89
- height={36}
88
+ width={width}
89
+ height={height}
90
90
  />
91
91
  </div>
92
92
  </div>
@@ -99,9 +99,9 @@ const TemplateTwo = ({ module, author }) => {
99
99
  <LazyImage
100
100
  alt={author.name}
101
101
  loading="eager"
102
- width={36}
103
- height={36}
104
- src={imagePrettyUrl(author.image, 36, 36)}
102
+ width={width}
103
+ height={height}
104
+ src={imagePrettyUrl(author.image, width, height)}
105
105
  />
106
106
  </Link>
107
107
  </div>
@@ -131,6 +131,8 @@ TemplateTwo.propTypes = {
131
131
  profile_page_path: PropTypes.string,
132
132
  name: PropTypes.string,
133
133
  }),
134
+ width: PropTypes.string,
135
+ height: PropTypes.string,
134
136
  };
135
137
 
136
138
  export default TemplateTwo;
@@ -24,6 +24,8 @@ const Tracker = ({
24
24
  operatorLogo = false,
25
25
  operatorLogoWidth = 80,
26
26
  operatorLogoHeight = 80,
27
+ siteLogoWidth = '100',
28
+ siteLogoHeight = '100',
27
29
  serverData,
28
30
  }) => {
29
31
  const { operator, page, translations } = pageContext;
@@ -84,7 +86,7 @@ const Tracker = ({
84
86
  <div className={styles.container || ''}>
85
87
  {background}
86
88
  <div className={styles.content || ''}>
87
- <LazyImage alt="Site logo" src={logo} />
89
+ <LazyImage alt="Site logo" src={logo} width={siteLogoWidth} height={siteLogoHeight} />
88
90
  <p
89
91
  className={`${styles.mainText || ''} ${
90
92
  operatorLogo && (styles.mainTextWithlogo || '')
@@ -24,6 +24,8 @@ const Tracker = ({
24
24
  operatorLogo = false,
25
25
  operatorLogoWidth = 80,
26
26
  operatorLogoHeight = 80,
27
+ siteLogoWidth = '185',
28
+ siteLogoHeight = '45',
27
29
  }) => {
28
30
  const { operator, page, translations } = pageContext;
29
31
 
@@ -78,7 +80,7 @@ const Tracker = ({
78
80
  <div className={styles.container || ''}>
79
81
  {background}
80
82
  <div className={styles.content || ''}>
81
- <LazyImage alt="Site logo" src={logo} />
83
+ <LazyImage alt="Site logo" src={logo} width={siteLogoWidth} height={siteLogoHeight} />
82
84
  <p
83
85
  className={`${styles.mainText || ''} ${
84
86
  operatorLogo && (styles.mainTextWithlogo || '')
@@ -22,6 +22,8 @@ export default function TrackerGeo({
22
22
  operatorLogo = false,
23
23
  operatorLogoWidth = 80,
24
24
  operatorLogoHeight = 80,
25
+ siteLogoWidth = '100',
26
+ siteLogoHeight = '100',
25
27
  }) {
26
28
  const { page, operatorsByMarket } = pageContext;
27
29
  const operator = operatorsByMarket[Object.keys(operatorsByMarket)[0]][0];
@@ -106,7 +108,7 @@ export default function TrackerGeo({
106
108
  <div className={styles.container}>
107
109
  {background}
108
110
  <div className={styles.content}>
109
- <LazyImage alt="Site logo" src={logo} />
111
+ <LazyImage alt="Site logo" src={logo} width={siteLogoWidth} height={siteLogoHeight} />
110
112
  <p
111
113
  className={`${styles.mainText} ${operatorLogo && styles.mainTextWithlogo}`}
112
114
  >{`${mainText.replace(
@@ -22,6 +22,8 @@ export default function TrackerGeo({
22
22
  operatorLogo = false,
23
23
  operatorLogoWidth = 80,
24
24
  operatorLogoHeight = 80,
25
+ siteLogoWidth = '100',
26
+ siteLogoHeight = '100',
25
27
  }) {
26
28
  const { page, operatorsByMarket } = pageContext;
27
29
  const operator = operatorsByMarket[Object.keys(operatorsByMarket)[0]][0];
@@ -121,7 +123,7 @@ export default function TrackerGeo({
121
123
  <div className={styles.container}>
122
124
  {background}
123
125
  <div className={styles.content}>
124
- <LazyImage alt="Site logo" src={logo} />
126
+ <LazyImage alt="Site logo" src={logo} width={siteLogoWidth} height={siteLogoHeight} />
125
127
  <p
126
128
  className={`${styles.mainText} ${operatorLogo && styles.mainTextWithlogo}`}
127
129
  >{`${mainText.replace(
@@ -71,6 +71,12 @@ describe('Getters Helper', () => {
71
71
  expect(Getters.textWordsLimit(text, 2)).toEqual('Lorem Ipsum...');
72
72
  expect(Getters.textWordsLimit(1, 2)).toEqual(null);
73
73
  });
74
+ test('textWordsLimit() for texts with markup', () => {
75
+ const text = `<a class="abc">Lorem Ipsum is simply dummy text of the printing and typesetting industry. </>`;
76
+ expect(Getters.textWordsLimit(text, 100)).toEqual(
77
+ 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. '
78
+ );
79
+ });
74
80
 
75
81
  test('filterImgSrc()', () => {
76
82
  expect(Getters.filterImgSrc('/wp-content/photo.jpg')).toEqual(
@@ -95,6 +101,13 @@ describe('Getters Helper', () => {
95
101
  });
96
102
 
97
103
  test('getPageImage()', () => {
104
+ expect(
105
+ Getters.getPageImage({
106
+ relation_type: 'operator',
107
+ featured_image: 'foo.jpg',
108
+ relation: { default_logo_url: 'foo.jpg' },
109
+ })
110
+ ).toEqual(Getters.imagePrettyUrl('foo.jpg'));
98
111
  expect(
99
112
  Getters.getPageImage({ relation_type: 'operator', relation: { default_logo_url: 'foo.jpg' } })
100
113
  ).toEqual(Getters.imagePrettyUrl('foo.jpg'));
@@ -260,6 +273,14 @@ describe('Getters Helper', () => {
260
273
  expect(module).toEqual({ name: 'menu', children: 'hello' });
261
274
  });
262
275
 
276
+ test('getFirstModuleByName() if no modules', () => {
277
+ const object = {
278
+ modules: null,
279
+ };
280
+ const module = Getters.getFirstModuleByName(object, 'menu');
281
+ expect(typeof module).toEqual('object');
282
+ });
283
+
263
284
  test('translate()', () => {
264
285
  const object = { hello: 'world' };
265
286
  expect(Getters.translate(object, 'hello')).toEqual('world');
@@ -115,12 +115,12 @@ export function processSections(sections, skipPost = false, page, translations,
115
115
  }
116
116
  if (sections[sectionKey] && sections[sectionKey].modules) {
117
117
  sections[sectionKey].modules.forEach((module, key) => {
118
- if (shouldSavePrefilled(module, siteName) && savedModules[module.value_id]) {
119
- Object.assign(module, savedModules[module.value_id]);
118
+ if (shouldSavePrefilled(module, siteName) && savedModules[module.module_value_id]) {
119
+ Object.assign(module, savedModules[module.module_value_id]);
120
120
  } else {
121
121
  if (module.value_type === ModuleValue.VALUE_TYPE_PREFILLED_MODULE_MARKET) {
122
122
  module = {
123
- ...cloneDeep(prefilledMarketModules[module.value_id]),
123
+ ...cloneDeep(prefilledMarketModules[module.module_value_id] || prefilledMarketModules[module.value_id]),
124
124
  value_type: ModuleValue.VALUE_TYPE_PREFILLED_MODULE_MARKET,
125
125
  };
126
126
  }
@@ -142,8 +142,9 @@ export function processSections(sections, skipPost = false, page, translations,
142
142
  sections[sectionKey].modules[key] = module;
143
143
 
144
144
  if (shouldSavePrefilled(module, siteName)) {
145
- savedModules[module.value_id] = module;
145
+ savedModules[module.module_value_id] = module;
146
146
  }
147
+
147
148
  }
148
149
  });
149
150
  }
@@ -376,5 +376,13 @@ export function processModule(
376
376
  processTopListModule(module, relations, pages, markets);
377
377
  } else if (module.name === 'menu' && menus && menus[module.menu_id]) {
378
378
  module = Object.assign(module, menus[module.menu_id]);
379
+ } else if (module.name === 'statistics_counter') {
380
+ const pagesByTemplate = Object.values(pages)
381
+ .flatMap(category => Object.values(category))
382
+ .reduce((makeCount, page) => {
383
+ makeCount[page.template] = (makeCount[page.template] || 0) + 1;
384
+ return makeCount;
385
+ }, {});
386
+ module.stats = pagesByTemplate;
379
387
  }
380
388
  }
@@ -8,7 +8,7 @@ import { parseCss } from 'gatsby-core-theme/src/helpers/css-parser';
8
8
  import { generatePlaceholderString } from './generators.mjs';
9
9
  import styles from '../components/molecules/content/content.module.scss';
10
10
 
11
- export default (node, page, translations) => {
11
+ export default (node, page, translations, moduleWidth = 960) => {
12
12
  if (node.name === 'iframe') {
13
13
  return <Iframe src={node.attribs.src} />;
14
14
  }
@@ -27,12 +27,18 @@ export default (node, page, translations) => {
27
27
  } else if (classes?.includes('content-image--align-right')) {
28
28
  stylesClass = 'alignRight';
29
29
  }
30
+
31
+ const imgWidth =
32
+ node.attribs.width &&
33
+ (node.attribs.width > moduleWidth ? moduleWidth : node.attribs.width.replace('px', ''));
34
+ const imgHeight =
35
+ node.attribs.height &&
36
+ (node.attribs.height === 'auto' ? '298' : node.attribs.height.replace('px', ''));
37
+
30
38
  const lazyProps = {
31
- src: parseContentImageUrl(node.attribs.src),
32
- width: node.attribs.width && node.attribs.width.replace('px', ''),
33
- height:
34
- node.attribs.height &&
35
- (node.attribs.height === 'auto' ? '298' : node.attribs.height.replace('px', '')),
39
+ src: parseContentImageUrl(node.attribs.src, imgWidth, imgHeight),
40
+ width: imgWidth,
41
+ height: imgHeight,
36
42
  style: node.attribs.style ? parseCss(node.attribs.style) : null,
37
43
  alt: node.attribs.alt ? node.attribs.alt : '',
38
44
  className: styles[stylesClass],
@@ -21,7 +21,7 @@ describe('replaceMedia function', () => {
21
21
  };
22
22
  const transformedNode = transformNode(node, {}, {});
23
23
  expect(transformedNode.type.name).toBe('LazyImage');
24
- expect(transformedNode.props.src).toBe('https://cdn.images.com/image.jpg');
24
+ expect(transformedNode.props.src).toBe('https://cdn.images.com/fit-in/300x200/image.jpg');
25
25
  expect(transformedNode.props.width).toBe('300');
26
26
  expect(transformedNode.props.height).toBe('200');
27
27
  expect(transformedNode.props.alt).toBe('Alt text');
@@ -59,12 +59,13 @@ export function cleanHTML(string) {
59
59
  return string && string.replace(/(<([^>]+)>)/gi, '');
60
60
  }
61
61
 
62
- export function parseContentImageUrl(src) {
62
+ export function parseContentImageUrl(src, width = null, height = null) {
63
63
  const srcArr = src && src.split('//');
64
+
64
65
  if (srcArr && srcArr.length === 2) {
65
66
  const refUrl = srcArr[1].substring(srcArr[1].indexOf('/'));
66
67
 
67
- return imagePrettyUrl(refUrl.substring(1));
68
+ return imagePrettyUrl(refUrl.substring(1), width, height);
68
69
  }
69
70
 
70
71
  return src;
@@ -2,7 +2,16 @@ import React from 'react';
2
2
 
3
3
  export default function check() {
4
4
  return (
5
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
5
+ <svg
6
+ role="img"
7
+ aria-labelledby="checkIcon"
8
+ width="16"
9
+ height="16"
10
+ viewBox="0 0 16 16"
11
+ fill="none"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ >
14
+ <title id="checkIcon">check icon</title>
6
15
  <path
7
16
  d="M12.4663 4.8C12.1997 4.53333 11.7997 4.53333 11.533 4.8L6.53301 9.8L4.46634 7.73333C4.19967 7.46667 3.79967 7.46667 3.53301 7.73333C3.26634 8 3.26634 8.4 3.53301 8.66667L6.06634 11.2C6.19967 11.3333 6.33301 11.4 6.53301 11.4C6.73301 11.4 6.86634 11.3333 6.99967 11.2L12.4663 5.73333C12.733 5.46667 12.733 5.06667 12.4663 4.8Z"
8
17
  fill="#3C3C40"
@@ -1,5 +1,5 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 106 28" focusable="false">
2
- <title>
1
+ <svg role="img" aria-labelledby="logoIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 106 28" focusable="false">
2
+ <title id="logoIcon">
3
3
  Logo Icon
4
4
  </title>
5
5
  <path d="M62.9 12h2.8v10h-2.8v-1.3c-1 1.5-2.3 1.6-3.1 1.6-3.1 0-5.1-2.4-5.1-5.3 0-3 2-5.3 4.9-5.3.8 0 2.3.1 3.2 1.6V12zm-5.2 5c0 1.6 1.1 2.8 2.8 2.8 1.6 0 2.8-1.2 2.8-2.8 0-1.6-1.1-2.8-2.8-2.8-1.6 0-2.8 1.2-2.8 2.8zm13.5-2.6V22h-2.8v-7.6h-1.1V12h1.1V8.6h2.8V12h1.9v2.4h-1.9zm8.5 0c-.7-.6-1.3-.7-1.6-.7-.7 0-1.1.3-1.1.8 0 .3.1.6.9.9l.7.2c.8.3 2 .6 2.5 1.4.3.4.5 1 .5 1.7 0 .9-.3 1.8-1.1 2.5s-1.8 1.1-3 1.1c-2.1 0-3.2-1-3.9-1.7l1.5-1.7c.6.6 1.4 1.2 2.2 1.2.8 0 1.4-.4 1.4-1.1 0-.6-.5-.9-.9-1l-.6-.2c-.7-.3-1.5-.6-2.1-1.2-.5-.5-.8-1.1-.8-1.9 0-1 .5-1.8 1-2.3.8-.6 1.8-.7 2.6-.7.7 0 1.9.1 3.2 1.1l-1.4 1.6zm6.1-1.1c1-1.4 2.4-1.6 3.2-1.6 2.9 0 4.9 2.3 4.9 5.3s-2 5.3-5 5.3c-.6 0-2.1-.1-3.2-1.6V22H83V5.2h2.8v8.1zm-.3 3.7c0 1.6 1.1 2.8 2.8 2.8 1.6 0 2.8-1.2 2.8-2.8 0-1.6-1.1-2.8-2.8-2.8-1.7 0-2.8 1.2-2.8 2.8zm13 3.5L93.7 12H97l3.1 5.7 2.8-5.7h3.2l-8 15.3h-3.2l3.6-6.8zM54 13.7h-7v2.8h3.7c-.6 1.9-2 3.2-4.6 3.2-2.9 0-5-2.4-5-5.3S43.1 9 46 9c1.6 0 3.2.8 4.2 2.1l2.3-1.5C51 7.5 48.6 6.3 46 6.3c-4.4 0-8 3.6-8 8.1s3.4 8.1 8 8.1 8-3.6 8-8.1c.1-.3 0-.5 0-.7z"/>
@@ -1,5 +1,5 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="20" fill="none" xmlns:v="https://vecta.io/nano">
2
- <title>
1
+ <svg role="img" aria-labelledby="securityIcon" xmlns="http://www.w3.org/2000/svg" width="16" height="20" fill="none" xmlns:v="https://vecta.io/nano">
2
+ <title id="securityIcon">
3
3
  Security Icon
4
4
  </title>
5
5
  <path d="M15.63 1.65a1 1 0 0 0-.84-.2A8 8 0 0 1 8.57.18a1 1 0 0 0-1.14 0 8 8 0 0 1-6.22 1.27 1 1 0 0 0-.84.2 1 1 0 0 0-.274.348A1 1 0 0 0 0 2.43v7.45a9 9 0 0 0 3.77 7.33l3.65 2.6a1 1 0 0 0 1.16 0l3.65-2.6A9 9 0 0 0 16 9.88V2.43a1 1 0 0 0-.37-.78zM14 9.88a7 7 0 0 1-2.93 5.7L8 17.77l-3.07-2.2A7 7 0 0 1 2 9.88v-6.3a10 10 0 0 0 6-1.39 10 10 0 0 0 6 1.39v6.3zM9.54 7.6l-2.7 2.7-.9-.9c-.188-.188-.444-.294-.7-.294s-.522.106-.7.294-.294.444-.294.7.106.522.294.7l1.6 1.6a1 1 0 0 0 .71.296 1 1 0 0 0 .71-.296L11 9c.188-.188.294-.444.294-.7s-.106-.522-.294-.7-.444-.294-.7-.294-.522.106-.7.294l-.04.01z" fill="#1C1A28"/><defs><linearGradient id="A" x1="15.945" y1="3.36" x2="2.181" y2="3.36" gradientUnits="userSpaceOnUse"><stop stop-color="#17d6cc"/><stop offset="1" stop-color="#17d68a"/></linearGradient></defs></svg>
@@ -1,5 +1,5 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <title>
1
+ <svg role="img" aria-labelledby="verifyIcon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <title id="verifyIcon">
3
3
  Verify Icon
4
4
  </title>
5
5
  <g clip-path="url(#clip0_1978_1963)">
@@ -1,5 +1,5 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <title>
1
+ <svg role="img" aria-labelledby="bellIcon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <title id="bellIcon">
3
3
  Bell Icon
4
4
  </title>
5
5
  <path d="M18 13.18V10C17.9986 8.58312 17.4958 7.21247 16.5806 6.13077C15.6655 5.04908 14.3971 4.32615 13 4.09V3C13 2.73478 12.8946 2.48043 12.7071 2.29289C12.5196 2.10536 12.2652 2 12 2C11.7348 2 11.4804 2.10536 11.2929 2.29289C11.1054 2.48043 11 2.73478 11 3V4.09C9.60294 4.32615 8.33452 5.04908 7.41939 6.13077C6.50425 7.21247 6.00144 8.58312 6 10V13.18C5.41645 13.3863 4.911 13.7681 4.55294 14.2729C4.19488 14.7778 4.00174 15.3811 4 16V18C4 18.2652 4.10536 18.5196 4.29289 18.7071C4.48043 18.8946 4.73478 19 5 19H8.14C8.37028 19.8474 8.873 20.5954 9.5706 21.1287C10.2682 21.6621 11.1219 21.951 12 21.951C12.8781 21.951 13.7318 21.6621 14.4294 21.1287C15.127 20.5954 15.6297 19.8474 15.86 19H19C19.2652 19 19.5196 18.8946 19.7071 18.7071C19.8946 18.5196 20 18.2652 20 18V16C19.9983 15.3811 19.8051 14.7778 19.4471 14.2729C19.089 13.7681 18.5835 13.3863 18 13.18ZM8 10C8 8.93913 8.42143 7.92172 9.17157 7.17157C9.92172 6.42143 10.9391 6 12 6C13.0609 6 14.0783 6.42143 14.8284 7.17157C15.5786 7.92172 16 8.93913 16 10V13H8V10ZM12 20C11.651 19.9979 11.3086 19.9045 11.0068 19.7291C10.7051 19.5536 10.4545 19.3023 10.28 19H13.72C13.5455 19.3023 13.2949 19.5536 12.9932 19.7291C12.6914 19.9045 12.349 19.9979 12 20ZM18 17H6V16C6 15.7348 6.10536 15.4804 6.29289 15.2929C6.48043 15.1054 6.73478 15 7 15H17C17.2652 15 17.5196 15.1054 17.7071 15.2929C17.8946 15.4804 18 15.7348 18 16V17Z" fill="#1C1A28"/>
@@ -1,5 +1,5 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 106 28" focusable="false">
2
- <title>
1
+ <svg role="img" aria-labelledby="logoIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 106 28" focusable="false">
2
+ <title id="logoIcon">
3
3
  Logo Icon
4
4
  </title>
5
5
  <path d="M62.9 12h2.8v10h-2.8v-1.3c-1 1.5-2.3 1.6-3.1 1.6-3.1 0-5.1-2.4-5.1-5.3 0-3 2-5.3 4.9-5.3.8 0 2.3.1 3.2 1.6V12zm-5.2 5c0 1.6 1.1 2.8 2.8 2.8 1.6 0 2.8-1.2 2.8-2.8 0-1.6-1.1-2.8-2.8-2.8-1.6 0-2.8 1.2-2.8 2.8zm13.5-2.6V22h-2.8v-7.6h-1.1V12h1.1V8.6h2.8V12h1.9v2.4h-1.9zm8.5 0c-.7-.6-1.3-.7-1.6-.7-.7 0-1.1.3-1.1.8 0 .3.1.6.9.9l.7.2c.8.3 2 .6 2.5 1.4.3.4.5 1 .5 1.7 0 .9-.3 1.8-1.1 2.5s-1.8 1.1-3 1.1c-2.1 0-3.2-1-3.9-1.7l1.5-1.7c.6.6 1.4 1.2 2.2 1.2.8 0 1.4-.4 1.4-1.1 0-.6-.5-.9-.9-1l-.6-.2c-.7-.3-1.5-.6-2.1-1.2-.5-.5-.8-1.1-.8-1.9 0-1 .5-1.8 1-2.3.8-.6 1.8-.7 2.6-.7.7 0 1.9.1 3.2 1.1l-1.4 1.6zm6.1-1.1c1-1.4 2.4-1.6 3.2-1.6 2.9 0 4.9 2.3 4.9 5.3s-2 5.3-5 5.3c-.6 0-2.1-.1-3.2-1.6V22H83V5.2h2.8v8.1zm-.3 3.7c0 1.6 1.1 2.8 2.8 2.8 1.6 0 2.8-1.2 2.8-2.8 0-1.6-1.1-2.8-2.8-2.8-1.7 0-2.8 1.2-2.8 2.8zm13 3.5L93.7 12H97l3.1 5.7 2.8-5.7h3.2l-8 15.3h-3.2l3.6-6.8zM54 13.7h-7v2.8h3.7c-.6 1.9-2 3.2-4.6 3.2-2.9 0-5-2.4-5-5.3S43.1 9 46 9c1.6 0 3.2.8 4.2 2.1l2.3-1.5C51 7.5 48.6 6.3 46 6.3c-4.4 0-8 3.6-8 8.1s3.4 8.1 8 8.1 8-3.6 8-8.1c.1-.3 0-.5 0-.7z"/>
@@ -1,5 +1,5 @@
1
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <title>Notification Bubble Icon</title>
3
- <rect width="16" height="16" rx="8" fill="#F2281D"/>
4
- <path d="M7.51465 11.5H8.93066V4.30762H8.28125L5.74707 5.25V6.45605L7.51465 5.75781V11.5Z" fill="white"/>
1
+ <svg role="img" aria-labelledby="notificationBubbleIcon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <title id="notificationBubbleIcon">Notification Bubble Icon</title>
3
+ <rect width="16" height="16" rx="8" fill="#F2281D"/>
4
+ <path d="M7.51465 11.5H8.93066V4.30762H8.28125L5.74707 5.25V6.45605L7.51465 5.75781V11.5Z" fill="white"/>
5
5
  </svg>
@@ -1,5 +1,5 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="20" fill="none" xmlns:v="https://vecta.io/nano">
2
- <title>
1
+ <svg role="img" aria-labelledby="securityIcon" xmlns="http://www.w3.org/2000/svg" width="16" height="20" fill="none" xmlns:v="https://vecta.io/nano">
2
+ <title id="securityIcon">
3
3
  Security Icon
4
4
  </title>
5
5
  <path d="M15.63 1.65a1 1 0 0 0-.84-.2A8 8 0 0 1 8.57.18a1 1 0 0 0-1.14 0 8 8 0 0 1-6.22 1.27 1 1 0 0 0-.84.2 1 1 0 0 0-.274.348A1 1 0 0 0 0 2.43v7.45a9 9 0 0 0 3.77 7.33l3.65 2.6a1 1 0 0 0 1.16 0l3.65-2.6A9 9 0 0 0 16 9.88V2.43a1 1 0 0 0-.37-.78zM14 9.88a7 7 0 0 1-2.93 5.7L8 17.77l-3.07-2.2A7 7 0 0 1 2 9.88v-6.3a10 10 0 0 0 6-1.39 10 10 0 0 0 6 1.39v6.3zM9.54 7.6l-2.7 2.7-.9-.9c-.188-.188-.444-.294-.7-.294s-.522.106-.7.294-.294.444-.294.7.106.522.294.7l1.6 1.6a1 1 0 0 0 .71.296 1 1 0 0 0 .71-.296L11 9c.188-.188.294-.444.294-.7s-.106-.522-.294-.7-.444-.294-.7-.294-.522.106-.7.294l-.04.01z" fill="#1C1A28"/><defs><linearGradient id="A" x1="15.945" y1="3.36" x2="2.181" y2="3.36" gradientUnits="userSpaceOnUse"><stop stop-color="#17d6cc"/><stop offset="1" stop-color="#17d68a"/></linearGradient></defs></svg>