@comicrelief/component-library 8.54.1 → 8.55.1

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 (72) hide show
  1. package/dist/components/Atoms/Logo/Logo.js +0 -5
  2. package/dist/components/Atoms/Logo/Logo.test.js +1 -1
  3. package/dist/components/Atoms/LogoNav2026/LogoNav2026.test.js +94 -0
  4. package/dist/components/Atoms/LogoNav2026/_LogoNav2026.js +63 -0
  5. package/dist/components/Atoms/LogoNav2026/assets/cr-logo-mob.svg +14 -0
  6. package/dist/components/Atoms/LogoNav2026/assets/cr-logo.svg +14 -0
  7. package/dist/components/Molecules/HeroBanner/HeroBanner.style.js +68 -62
  8. package/dist/components/Molecules/HeroBanner/__snapshots__/HeroBanner.test.js.snap +7 -4
  9. package/dist/components/Molecules/LogoLinked/LogoLinked.md +6 -1
  10. package/dist/components/Organisms/Header/HeaderNav/HeaderNav.style.js +3 -3
  11. package/dist/components/Organisms/Header2025/Header2025.md +1 -1
  12. package/dist/components/Organisms/Header2025/HeaderNav2025/HeaderNav2025.js +1 -1
  13. package/dist/components/Organisms/Header2025/HeaderNav2025/HeaderNav2025.style.js +3 -3
  14. package/dist/components/Organisms/Header2026/Burger/BurgerMenu.js +25 -0
  15. package/dist/components/Organisms/Header2026/Burger/BurgerMenu.style.js +58 -0
  16. package/dist/components/Organisms/Header2026/Header2026.js +148 -0
  17. package/dist/components/Organisms/Header2026/Header2026.md +14 -0
  18. package/dist/components/Organisms/Header2026/Header2026.style.js +129 -0
  19. package/dist/components/Organisms/Header2026/Navs/Navs.js +209 -0
  20. package/dist/components/Organisms/Header2026/Navs/Navs.style.js +104 -0
  21. package/dist/components/Organisms/Header2026/Navs/PrimaryNavItem.js +227 -0
  22. package/dist/components/Organisms/Header2026/Navs/PrimaryNavItem.style.js +401 -0
  23. package/dist/components/Organisms/Header2026/Navs/arrow-right.png +0 -0
  24. package/dist/components/Organisms/Header2026/Navs/arrow.svg +6 -0
  25. package/dist/components/Organisms/Header2026/Navs/chevron-down.svg +3 -0
  26. package/dist/components/Organisms/Header2026/assets/arrow-icon.svg +3 -0
  27. package/dist/components/Organisms/Header2026/assets/chevron-icon.svg +3 -0
  28. package/dist/components/Organisms/Header2026/assets/search-icon.svg +10 -0
  29. package/dist/components/Organisms/Header2026/header2026.test.js +24 -0
  30. package/dist/components/Organisms/Header2026/mockData/mockData.json +569 -0
  31. package/dist/components/Organisms/Header2026/mockData/query.graphql +64 -0
  32. package/dist/theme/shared/animations.js +15 -1
  33. package/dist/utils/navHelper.js +75 -3
  34. package/dist/utils/remove-extra-styles-in-preview.css +14 -0
  35. package/dist/utils/urlHelper.js +30 -0
  36. package/package.json +1 -1
  37. package/src/components/Atoms/Logo/Logo.js +0 -4
  38. package/src/components/Atoms/Logo/Logo.test.js +5 -5
  39. package/src/components/Atoms/LogoNav2026/LogoNav2026.test.js +91 -0
  40. package/src/components/Atoms/LogoNav2026/_LogoNav2026.js +75 -0
  41. package/src/components/Atoms/LogoNav2026/assets/cr-logo-mob.svg +14 -0
  42. package/src/components/Atoms/LogoNav2026/assets/cr-logo.svg +14 -0
  43. package/src/components/Molecules/HeroBanner/HeroBanner.style.js +4 -3
  44. package/src/components/Molecules/HeroBanner/__snapshots__/HeroBanner.test.js.snap +7 -4
  45. package/src/components/Molecules/LogoLinked/LogoLinked.md +6 -1
  46. package/src/components/Organisms/Header/HeaderNav/HeaderNav.style.js +2 -2
  47. package/src/components/Organisms/Header2025/Header2025.md +1 -1
  48. package/src/components/Organisms/Header2025/HeaderNav2025/HeaderNav2025.js +1 -1
  49. package/src/components/Organisms/Header2025/HeaderNav2025/HeaderNav2025.style.js +2 -2
  50. package/src/components/Organisms/Header2026/Burger/BurgerMenu.js +26 -0
  51. package/src/components/Organisms/Header2026/Burger/BurgerMenu.style.js +104 -0
  52. package/src/components/Organisms/Header2026/Header2026.js +215 -0
  53. package/src/components/Organisms/Header2026/Header2026.md +14 -0
  54. package/src/components/Organisms/Header2026/Header2026.style.js +195 -0
  55. package/src/components/Organisms/Header2026/Navs/Navs.js +251 -0
  56. package/src/components/Organisms/Header2026/Navs/Navs.style.js +168 -0
  57. package/src/components/Organisms/Header2026/Navs/PrimaryNavItem.js +354 -0
  58. package/src/components/Organisms/Header2026/Navs/PrimaryNavItem.style.js +658 -0
  59. package/src/components/Organisms/Header2026/Navs/arrow-right.png +0 -0
  60. package/src/components/Organisms/Header2026/Navs/arrow.svg +6 -0
  61. package/src/components/Organisms/Header2026/Navs/chevron-down.svg +3 -0
  62. package/src/components/Organisms/Header2026/assets/arrow-icon.svg +3 -0
  63. package/src/components/Organisms/Header2026/assets/chevron-icon.svg +3 -0
  64. package/src/components/Organisms/Header2026/assets/search-icon.svg +10 -0
  65. package/src/components/Organisms/Header2026/header2026.test.js +22 -0
  66. package/src/components/Organisms/Header2026/mockData/mockData.json +569 -0
  67. package/src/components/Organisms/Header2026/mockData/query.graphql +64 -0
  68. package/src/theme/crTheme/theme.js +0 -1
  69. package/src/theme/shared/animations.js +67 -3
  70. package/src/utils/navHelper.js +82 -2
  71. package/src/utils/remove-extra-styles-in-preview.css +14 -0
  72. package/src/utils/urlHelper.js +27 -0
@@ -1,4 +1,43 @@
1
- import { css } from 'styled-components';
1
+ import { keyframes, css } from 'styled-components';
2
+
3
+ const pulseIn = keyframes`
4
+ from {
5
+ transform: scale3d(1, 1, 1);
6
+ }
7
+ 30% {
8
+ transform: scale3d(1.04, 1.04, 1.04);
9
+ }
10
+ 60% {
11
+ transform: scale3d(1.03, 1.03, 1.03);
12
+ }
13
+ to {
14
+ transform: scale3d(1.04, 1.04, 1.04);
15
+ }
16
+ `;
17
+
18
+ const pulseOut = keyframes`
19
+ from {
20
+ transform: scale3d(1.03, 1.03, 1.03);
21
+ }
22
+ 30% {
23
+ transform: scale3d(0.99, 0.99, 0.99);
24
+ }
25
+ 60% {
26
+ transform: scale3d(1.01, 1.01, 1.01);
27
+ }
28
+ to {
29
+ transform: scale3d(1, 1, 1);
30
+ }
31
+ `;
32
+
33
+ const pulseInAnimation = css`
34
+ animation: ${pulseIn} 0.4s ease-in-out forwards;
35
+ `;
36
+
37
+ const pulseOutAnimation = css`
38
+ ${pulseInAnimation}
39
+ animation-name: ${pulseOut};
40
+ `;
2
41
 
3
42
  /**
4
43
  * Logo rotation animation on hover
@@ -84,9 +123,14 @@ const formFieldInputAnimation = (shiftPx = 4) => css`
84
123
  * @param {boolean} animateScale - Whether to enable the scale animation
85
124
  * @param {number} pixelMovement - Amount of movement to apply on hover
86
125
  * @param {number} bounceIntensity - Intensity of the springy bounce effect (0-3, default: 1)
126
+ * @param {boolean} targetChild - Where to apply the transform
127
+
87
128
  * @returns {css} template literal for the animation
88
129
  */
89
- const bounceUpAnimation = (animateScale, pixelMovement = 10, bounceIntensity = 1) => {
130
+ const bounceUpAnimation = (animateScale,
131
+ pixelMovement = 10,
132
+ bounceIntensity = 1,
133
+ targetChild = false) => {
90
134
  if (!animateScale) {
91
135
  return css``;
92
136
  }
@@ -95,6 +139,24 @@ const bounceUpAnimation = (animateScale, pixelMovement = 10, bounceIntensity = 1
95
139
  const overshoot = 1.55 + (bounceIntensity * 0.4);
96
140
  const duration = 0.2 + (bounceIntensity * 0.1);
97
141
 
142
+ // The Hero Banner requires us to apply the transform inside
143
+ // the anchor, in order to address the 'infinity bounce' bug
144
+ if (targetChild) {
145
+ return css`
146
+ > div {
147
+ transition: transform ${duration}s cubic-bezier(0.68, ${pullBack}, 0.265, ${overshoot});
148
+ transform-origin: center;
149
+ }
150
+
151
+ &:hover,
152
+ &:focus {
153
+ > div {
154
+ transform: translateY(-${pixelMovement}px);
155
+ }
156
+ }
157
+ `;
158
+ }
159
+
98
160
  return css`
99
161
  transition: transform ${duration}s cubic-bezier(0.68, ${pullBack}, 0.265, ${overshoot});
100
162
  transform-origin: center;
@@ -110,5 +172,7 @@ export {
110
172
  logoRotateAnimation,
111
173
  springScaleAnimation,
112
174
  formFieldInputAnimation,
113
- bounceUpAnimation
175
+ bounceUpAnimation,
176
+ pulseInAnimation,
177
+ pulseOutAnimation
114
178
  };
@@ -1,9 +1,11 @@
1
1
  /* Determine where to grab the URL, depending on the component type and values supplied */
2
2
  const NavHelper = navItem => {
3
+ if (!navItem) return '';
4
+
3
5
  /* Default url path location for 'Pages' */
4
6
  let thisUrl = navItem.path;
5
7
 
6
- if (navItem.internal.type === 'ContentfulComponentLink') {
8
+ if (navItem.internal && navItem.internal.type === 'ContentfulComponentLink') {
7
9
  thisUrl = navItem.reference && navItem.reference.path
8
10
  ? navItem.reference.path
9
11
  : navItem.url;
@@ -12,6 +14,40 @@ const NavHelper = navItem => {
12
14
  return thisUrl;
13
15
  };
14
16
 
17
+ /* NavHelper for new Contentful data structure (headerPageGroups format) */
18
+ const NavHelperNew = pageLink => {
19
+ if (!pageLink) return '';
20
+
21
+ // pageSelector path takes priority
22
+ if (pageLink.pageSelector && pageLink.pageSelector.path) {
23
+ return `/${pageLink.pageSelector.path}`;
24
+ }
25
+
26
+ // Otherwise use external URL
27
+ if (pageLink.pageUrlIfExternal) {
28
+ return pageLink.pageUrlIfExternal;
29
+ }
30
+
31
+ return '';
32
+ };
33
+
34
+ /* Get URL for primary page in new data structure */
35
+ const NavHelperPrimary = group => {
36
+ if (!group) return '';
37
+
38
+ // primaryPageSelector path takes priority
39
+ if (group.primaryPageSelector && group.primaryPageSelector.path) {
40
+ return `/${group.primaryPageSelector.path}`;
41
+ }
42
+
43
+ // Otherwise use external URL
44
+ if (group.primaryPageUrlIfExternal) {
45
+ return group.primaryPageUrlIfExternal;
46
+ }
47
+
48
+ return '';
49
+ };
50
+
15
51
  const MoreNavPreProcess = (menuGroups, characterLimit) => {
16
52
  let characterCount = 0;
17
53
  const overLimit = false;
@@ -35,4 +71,48 @@ const MoreNavPreProcess = (menuGroups, characterLimit) => {
35
71
  return { standardGroups, moreNavGroups };
36
72
  };
37
73
 
38
- export { NavHelper, MoreNavPreProcess };
74
+ /* MoreNavPreProcess for new Contentful data structure */
75
+ const MoreNavPreProcessNew = (headerPageGroups, characterLimit) => {
76
+ let characterCount = 0;
77
+ const overLimit = false;
78
+ const standardGroups = [];
79
+ const moreNavGroups = [];
80
+
81
+ headerPageGroups.map(group => {
82
+ // Use primaryPageName for character count
83
+ characterCount += group.primaryPageName.length;
84
+
85
+ // Assign groups to the relevant array if we're over the limit
86
+ return characterCount > characterLimit !== overLimit
87
+ ? moreNavGroups.push(group)
88
+ : standardGroups.push(group);
89
+ });
90
+
91
+ return { standardGroups, moreNavGroups };
92
+ };
93
+
94
+ /* Combine all column links into a single array for submenu rendering */
95
+ const getColumnLinks = group => {
96
+ const links = [];
97
+
98
+ if (group.column1PageLinks) {
99
+ links.push(...group.column1PageLinks);
100
+ }
101
+ if (group.column2PageLinks) {
102
+ links.push(...group.column2PageLinks);
103
+ }
104
+ if (group.column3PageLinks) {
105
+ links.push(...group.column3PageLinks);
106
+ }
107
+
108
+ return links;
109
+ };
110
+
111
+ export {
112
+ NavHelper,
113
+ NavHelperNew,
114
+ NavHelperPrimary,
115
+ MoreNavPreProcess,
116
+ MoreNavPreProcessNew,
117
+ getColumnLinks
118
+ };
@@ -0,0 +1,14 @@
1
+ /* Overiding the extra Styleguidest / preview styles */
2
+ .rsg--preview-35 {
3
+ padding: 0 !important;
4
+ border: none !important;
5
+ }
6
+
7
+ .rsg--content-3 {
8
+ padding: 0 !important;
9
+ }
10
+
11
+ .rsg--header-11,
12
+ .rsg--tabs-12 {
13
+ display: none !important;;
14
+ }
@@ -0,0 +1,27 @@
1
+ const BASE_URL = 'https://www.comicrelief.com';
2
+
3
+ /**
4
+ * Prepends base URL to relative paths when in dev mode
5
+ * @param {string} path - The path to process into url
6
+ * @param {boolean} devMode - for adding real world urls when dev in CL
7
+ * @returns {string} The processed path / url
8
+ */
9
+ const prependBaseUrl = (path, devMode) => {
10
+ // Return the url as-is if not in dev mode
11
+ if (!devMode) return path;
12
+
13
+ // Don't prepend if it's already an absolute URL
14
+ if (path.startsWith('http://')
15
+ || path.startsWith('https://')
16
+ || path.startsWith('//')) {
17
+ return path;
18
+ }
19
+
20
+ // Don't prepend to anchor-only links
21
+ if (path === '#') return path;
22
+
23
+ // Prepend base URL
24
+ return `${BASE_URL}${path.startsWith('/') ? '' : '/'}${path}`;
25
+ };
26
+
27
+ export default prependBaseUrl;