@blaze-cms/react-page-builder 0.141.0-alpha.0 → 0.141.0-alpha.2

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 (227) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/lib/components/BlazeLink.js +6 -2
  3. package/lib/components/BlazeLink.js.map +1 -1
  4. package/lib/components/Card/Card.js.map +1 -1
  5. package/lib/components/ContentGroup/ContentGroupTabs.js +10 -8
  6. package/lib/components/ContentGroup/ContentGroupTabs.js.map +1 -1
  7. package/lib/components/Image/ImageRender.js +4 -2
  8. package/lib/components/Image/ImageRender.js.map +1 -1
  9. package/lib/components/List/components/Header/ListHeader.js +5 -2
  10. package/lib/components/List/components/Header/ListHeader.js.map +1 -1
  11. package/lib/components/List/components/Pagination/Classic.js +2 -2
  12. package/lib/components/List/components/Pagination/Classic.js.map +1 -1
  13. package/lib/components/List/components/Pagination/LoadMore.js +2 -1
  14. package/lib/components/List/components/Pagination/LoadMore.js.map +1 -1
  15. package/lib/components/List/helpers/build-pagination-items.js +2 -1
  16. package/lib/components/List/helpers/build-pagination-items.js.map +1 -1
  17. package/lib/components/Menu/Menu.js +4 -2
  18. package/lib/components/Menu/Menu.js.map +1 -1
  19. package/lib/components/SearchFilter/components/Select.js +1 -0
  20. package/lib/components/SearchFilter/components/Select.js.map +1 -1
  21. package/lib/components/SearchFilterSort/SearchFilterSort.js +1 -0
  22. package/lib/components/SearchFilterSort/SearchFilterSort.js.map +1 -1
  23. package/lib/components/SocialFollow/SFItem.js +4 -3
  24. package/lib/components/SocialFollow/SFItem.js.map +1 -1
  25. package/lib/components/Video/providers/Default.js +13 -7
  26. package/lib/components/Video/providers/Default.js.map +1 -1
  27. package/lib/components/Video/providers/get-provider.js +5 -0
  28. package/lib/components/Video/providers/get-provider.js.map +1 -1
  29. package/lib/hooks/helpers/getVariant.js.map +1 -1
  30. package/lib/utils/variant-handler.js +2 -1
  31. package/lib/utils/variant-handler.js.map +1 -1
  32. package/lib/variants/HeroImage/index.js +29 -0
  33. package/lib/variants/HeroImage/index.js.map +1 -0
  34. package/lib/variants/Infographic/Infographic.js +27 -0
  35. package/lib/variants/Infographic/Infographic.js.map +1 -0
  36. package/lib/variants/Infographic/index.js +41 -0
  37. package/lib/variants/Infographic/index.js.map +1 -0
  38. package/lib/variants/Infographic/useInfographic.js +43 -0
  39. package/lib/variants/Infographic/useInfographic.js.map +1 -0
  40. package/lib/variants/LongformGallery/LongformGallery.js +53 -0
  41. package/lib/variants/LongformGallery/LongformGallery.js.map +1 -0
  42. package/lib/variants/LongformGallery/LongformGalleryImage.js +71 -0
  43. package/lib/variants/LongformGallery/LongformGalleryImage.js.map +1 -0
  44. package/lib/variants/LongformGallery/constants.js +19 -0
  45. package/lib/variants/LongformGallery/constants.js.map +1 -0
  46. package/lib/variants/LongformGallery/helpers/index.js +29 -0
  47. package/lib/variants/LongformGallery/helpers/index.js.map +1 -0
  48. package/lib/variants/LongformGallery/helpers/parseImageData.js +42 -0
  49. package/lib/variants/LongformGallery/helpers/parseImageData.js.map +1 -0
  50. package/lib/variants/LongformGallery/helpers/separateImages.js +36 -0
  51. package/lib/variants/LongformGallery/helpers/separateImages.js.map +1 -0
  52. package/lib/variants/LongformGallery/helpers/shouldSkip.js +13 -0
  53. package/lib/variants/LongformGallery/helpers/shouldSkip.js.map +1 -0
  54. package/lib/variants/LongformGallery/index.js +43 -0
  55. package/lib/variants/LongformGallery/index.js.map +1 -0
  56. package/lib/variants/LongformGallery/useLongformGallery.js +58 -0
  57. package/lib/variants/LongformGallery/useLongformGallery.js.map +1 -0
  58. package/lib/variants/LongformRow/index.js +29 -0
  59. package/lib/variants/LongformRow/index.js.map +1 -0
  60. package/lib/variants/ParallaxImageTextRight/index.js +30 -0
  61. package/lib/variants/ParallaxImageTextRight/index.js.map +1 -0
  62. package/lib/variants/ThumbnailCarousel/ThumbnailCarousel.js +63 -0
  63. package/lib/variants/ThumbnailCarousel/ThumbnailCarousel.js.map +1 -0
  64. package/lib/variants/ThumbnailCarousel/ThumbnailImage/ThumbnailImage.js +37 -0
  65. package/lib/variants/ThumbnailCarousel/ThumbnailImage/ThumbnailImage.js.map +1 -0
  66. package/lib/variants/ThumbnailCarousel/ThumbnailImage/index.js +11 -0
  67. package/lib/variants/ThumbnailCarousel/ThumbnailImage/index.js.map +1 -0
  68. package/lib/variants/ThumbnailCarousel/ThumbnailImage/useThumbnailImage.js +69 -0
  69. package/lib/variants/ThumbnailCarousel/ThumbnailImage/useThumbnailImage.js.map +1 -0
  70. package/lib/variants/ThumbnailCarousel/index.js +41 -0
  71. package/lib/variants/ThumbnailCarousel/index.js.map +1 -0
  72. package/lib/variants/ThumbnailCarousel/useThumbnailCarousel.js +66 -0
  73. package/lib/variants/ThumbnailCarousel/useThumbnailCarousel.js.map +1 -0
  74. package/lib/variants/index.js +15 -1
  75. package/lib/variants/index.js.map +1 -1
  76. package/lib-es/components/BlazeLink.js +6 -2
  77. package/lib-es/components/BlazeLink.js.map +1 -1
  78. package/lib-es/components/Card/Card.js.map +1 -1
  79. package/lib-es/components/ContentGroup/ContentGroupTabs.js +10 -8
  80. package/lib-es/components/ContentGroup/ContentGroupTabs.js.map +1 -1
  81. package/lib-es/components/Image/ImageRender.js +4 -2
  82. package/lib-es/components/Image/ImageRender.js.map +1 -1
  83. package/lib-es/components/List/components/Header/ListHeader.js +5 -2
  84. package/lib-es/components/List/components/Header/ListHeader.js.map +1 -1
  85. package/lib-es/components/List/components/Pagination/Classic.js +2 -2
  86. package/lib-es/components/List/components/Pagination/Classic.js.map +1 -1
  87. package/lib-es/components/List/components/Pagination/LoadMore.js +2 -1
  88. package/lib-es/components/List/components/Pagination/LoadMore.js.map +1 -1
  89. package/lib-es/components/List/helpers/build-pagination-items.js +2 -1
  90. package/lib-es/components/List/helpers/build-pagination-items.js.map +1 -1
  91. package/lib-es/components/Menu/Menu.js +4 -2
  92. package/lib-es/components/Menu/Menu.js.map +1 -1
  93. package/lib-es/components/SearchFilter/components/Select.js +1 -0
  94. package/lib-es/components/SearchFilter/components/Select.js.map +1 -1
  95. package/lib-es/components/SearchFilterSort/SearchFilterSort.js +1 -0
  96. package/lib-es/components/SearchFilterSort/SearchFilterSort.js.map +1 -1
  97. package/lib-es/components/SocialFollow/SFItem.js +4 -3
  98. package/lib-es/components/SocialFollow/SFItem.js.map +1 -1
  99. package/lib-es/components/Video/providers/Default.js +14 -7
  100. package/lib-es/components/Video/providers/Default.js.map +1 -1
  101. package/lib-es/components/Video/providers/get-provider.js +2 -1
  102. package/lib-es/components/Video/providers/get-provider.js.map +1 -1
  103. package/lib-es/hooks/helpers/getVariant.js.map +1 -1
  104. package/lib-es/utils/variant-handler.js +2 -1
  105. package/lib-es/utils/variant-handler.js.map +1 -1
  106. package/lib-es/variants/HeroImage/index.js +10 -0
  107. package/lib-es/variants/HeroImage/index.js.map +1 -0
  108. package/lib-es/variants/Infographic/Infographic.js +20 -0
  109. package/lib-es/variants/Infographic/Infographic.js.map +1 -0
  110. package/lib-es/variants/Infographic/index.js +10 -0
  111. package/lib-es/variants/Infographic/index.js.map +1 -0
  112. package/lib-es/variants/Infographic/useInfographic.js +23 -0
  113. package/lib-es/variants/Infographic/useInfographic.js.map +1 -0
  114. package/lib-es/variants/LongformGallery/LongformGallery.js +40 -0
  115. package/lib-es/variants/LongformGallery/LongformGallery.js.map +1 -0
  116. package/lib-es/variants/LongformGallery/LongformGalleryImage.js +59 -0
  117. package/lib-es/variants/LongformGallery/LongformGalleryImage.js.map +1 -0
  118. package/lib-es/variants/LongformGallery/constants.js +18 -0
  119. package/lib-es/variants/LongformGallery/constants.js.map +1 -0
  120. package/lib-es/variants/LongformGallery/helpers/index.js +5 -0
  121. package/lib-es/variants/LongformGallery/helpers/index.js.map +1 -0
  122. package/lib-es/variants/LongformGallery/helpers/parseImageData.js +26 -0
  123. package/lib-es/variants/LongformGallery/helpers/parseImageData.js.map +1 -0
  124. package/lib-es/variants/LongformGallery/helpers/separateImages.js +25 -0
  125. package/lib-es/variants/LongformGallery/helpers/separateImages.js.map +1 -0
  126. package/lib-es/variants/LongformGallery/helpers/shouldSkip.js +3 -0
  127. package/lib-es/variants/LongformGallery/helpers/shouldSkip.js.map +1 -0
  128. package/lib-es/variants/LongformGallery/index.js +12 -0
  129. package/lib-es/variants/LongformGallery/index.js.map +1 -0
  130. package/lib-es/variants/LongformGallery/useLongformGallery.js +47 -0
  131. package/lib-es/variants/LongformGallery/useLongformGallery.js.map +1 -0
  132. package/lib-es/variants/LongformRow/index.js +10 -0
  133. package/lib-es/variants/LongformRow/index.js.map +1 -0
  134. package/lib-es/variants/ParallaxImageTextRight/index.js +11 -0
  135. package/lib-es/variants/ParallaxImageTextRight/index.js.map +1 -0
  136. package/lib-es/variants/ThumbnailCarousel/ThumbnailCarousel.js +49 -0
  137. package/lib-es/variants/ThumbnailCarousel/ThumbnailCarousel.js.map +1 -0
  138. package/lib-es/variants/ThumbnailCarousel/ThumbnailImage/ThumbnailImage.js +30 -0
  139. package/lib-es/variants/ThumbnailCarousel/ThumbnailImage/ThumbnailImage.js.map +1 -0
  140. package/lib-es/variants/ThumbnailCarousel/ThumbnailImage/index.js +3 -0
  141. package/lib-es/variants/ThumbnailCarousel/ThumbnailImage/index.js.map +1 -0
  142. package/lib-es/variants/ThumbnailCarousel/ThumbnailImage/useThumbnailImage.js +62 -0
  143. package/lib-es/variants/ThumbnailCarousel/ThumbnailImage/useThumbnailImage.js.map +1 -0
  144. package/lib-es/variants/ThumbnailCarousel/index.js +10 -0
  145. package/lib-es/variants/ThumbnailCarousel/index.js.map +1 -0
  146. package/lib-es/variants/ThumbnailCarousel/useThumbnailCarousel.js +47 -0
  147. package/lib-es/variants/ThumbnailCarousel/useThumbnailCarousel.js.map +1 -0
  148. package/lib-es/variants/index.js +14 -1
  149. package/lib-es/variants/index.js.map +1 -1
  150. package/package.json +8 -8
  151. package/src/components/BlazeLink.js +23 -4
  152. package/src/components/Card/Card.js +0 -1
  153. package/src/components/ContentGroup/ContentGroupTabs.js +11 -8
  154. package/src/components/Image/ImageRender.js +4 -2
  155. package/src/components/List/components/Header/ListHeader.js +7 -4
  156. package/src/components/List/components/Pagination/Classic.js +2 -2
  157. package/src/components/List/components/Pagination/LoadMore.js +7 -2
  158. package/src/components/List/helpers/build-pagination-items.js +2 -1
  159. package/src/components/Menu/Menu.js +4 -3
  160. package/src/components/SearchFilter/components/Select.js +1 -0
  161. package/src/components/SearchFilterSort/SearchFilterSort.js +1 -0
  162. package/src/components/SocialFollow/SFItem.js +8 -2
  163. package/src/components/Video/providers/Default.js +12 -6
  164. package/src/components/Video/providers/get-provider.js +2 -1
  165. package/src/hooks/helpers/getVariant.js +1 -0
  166. package/src/utils/variant-handler.js +2 -1
  167. package/src/variants/HeroImage/index.js +8 -0
  168. package/src/variants/Infographic/Infographic.js +14 -0
  169. package/src/variants/Infographic/index.js +12 -0
  170. package/src/variants/Infographic/useInfographic.js +18 -0
  171. package/src/variants/LongformGallery/LongformGallery.js +47 -0
  172. package/src/variants/LongformGallery/LongformGalleryImage.js +65 -0
  173. package/src/variants/LongformGallery/constants.js +21 -0
  174. package/src/variants/LongformGallery/helpers/index.js +5 -0
  175. package/src/variants/LongformGallery/helpers/parseImageData.js +25 -0
  176. package/src/variants/LongformGallery/helpers/separateImages.js +38 -0
  177. package/src/variants/LongformGallery/helpers/shouldSkip.js +3 -0
  178. package/src/variants/LongformGallery/index.js +13 -0
  179. package/src/variants/LongformGallery/useLongformGallery.js +41 -0
  180. package/src/variants/LongformRow/index.js +8 -0
  181. package/src/variants/ParallaxImageTextRight/index.js +9 -0
  182. package/src/variants/ThumbnailCarousel/ThumbnailCarousel.js +51 -0
  183. package/src/variants/ThumbnailCarousel/ThumbnailImage/ThumbnailImage.js +26 -0
  184. package/src/variants/ThumbnailCarousel/ThumbnailImage/index.js +3 -0
  185. package/src/variants/ThumbnailCarousel/ThumbnailImage/useThumbnailImage.js +61 -0
  186. package/src/variants/ThumbnailCarousel/index.js +12 -0
  187. package/src/variants/ThumbnailCarousel/useThumbnailCarousel.js +42 -0
  188. package/src/variants/index.js +15 -1
  189. package/tests/unit/src/components/Breadcrumb/__snapshots__/Breadcrumb.test.js.snap +3 -0
  190. package/tests/unit/src/components/Button.test.js +2 -2
  191. package/tests/unit/src/components/Card/__snapshots__/Card.test.js.snap +13 -0
  192. package/tests/unit/src/components/Card/__snapshots__/CardContainer.test.js.snap +8 -0
  193. package/tests/unit/src/components/ContentGroup/__snapshots__/ContentGroupTabs.test.js.snap +2 -0
  194. package/tests/unit/src/components/Image/GlobalLightbox/__snapshots__/GlobalLightbox.test.js.snap +1 -0
  195. package/tests/unit/src/components/Image/__snapshots__/Image.test.js.snap +3 -0
  196. package/tests/unit/src/components/Image/__snapshots__/ImageFactory.test.js.snap +4 -0
  197. package/tests/unit/src/components/List/components/Header/__snapshots__/ListHeader.test.js.snap +5 -0
  198. package/tests/unit/src/components/List/components/Pagination/__snapshots__/Classic.test.js.snap +8 -2
  199. package/tests/unit/src/components/List/components/Pagination/__snapshots__/ListPagination.test.js.snap +5 -1
  200. package/tests/unit/src/components/List/components/Pagination/__snapshots__/LoadMore.test.js.snap +1 -1
  201. package/tests/unit/src/components/List/helpers/__snapshots__/build-pagination-items.test.js.snap +21 -0
  202. package/tests/unit/src/components/MenuItem/__snapshots__/MenuItem.test.js.snap +1 -0
  203. package/tests/unit/src/components/SearchFilter/components/__snapshots__/Select.test.js.snap +5 -3
  204. package/tests/unit/src/components/SearchFilterSort/__snapshots__/SearchFilterSort.test.js.snap +2 -1
  205. package/tests/unit/src/components/SocialFollow/__snapshots__/SFItem.test.js.snap +2 -2
  206. package/tests/unit/src/components/SocialFollow/__snapshots__/SocialFollow.test.js.snap +2 -6
  207. package/tests/unit/src/components/TextBlock/__snapshots__/TextBlock.test.js.snap +4 -0
  208. package/tests/unit/src/components/Video/providers/__snapshots__/Default.test.js.snap +111 -108
  209. package/tests/unit/src/components/__snapshots__/BlazeLink.test.js.snap +1 -1
  210. package/tests/unit/src/components/__snapshots__/Button.test.js.snap +1 -0
  211. package/tests/unit/src/helpers/__snapshots__/parse-textBlock.test.js.snap +1 -0
  212. package/tests/unit/src/helpers/parse-textBlock.test.js +3 -1
  213. package/tests/unit/src/utils/variant-handler.test.js +9 -4
  214. package/tests/unit/src/variants/LongFormGallery/LongformGallery.test.js +42 -0
  215. package/tests/unit/src/variants/LongFormGallery/LongformGalleryImage.test.js +44 -0
  216. package/tests/unit/src/variants/LongFormGallery/__snapshots__/LongformGallery.test.js.snap +99 -0
  217. package/tests/unit/src/variants/LongFormGallery/__snapshots__/LongformGalleryImage.test.js.snap +51 -0
  218. package/tests/unit/src/variants/LongFormGallery/constants.js +37 -0
  219. package/tests/unit/src/variants/LongFormGallery/helpers/parseImageData.test.js +53 -0
  220. package/tests/unit/src/variants/LongFormGallery/helpers/separateImages.test.js +52 -0
  221. package/tests/unit/src/variants/LongFormGallery/helpers/shouldSkip.test.js +23 -0
  222. package/tests/unit/src/variants/LongFormGallery/useLongformGallery.test.js +36 -0
  223. package/tests/unit/src/variants/ThumbnailCarousel/ThumbnailCarousel.test.js +29 -0
  224. package/tests/unit/src/variants/ThumbnailCarousel/ThumbnailImage.test.js +45 -0
  225. package/tests/unit/src/variants/ThumbnailCarousel/__snapshots__/ThumbnailCarousel.test.js.snap +71 -0
  226. package/tests/unit/src/variants/ThumbnailCarousel/__snapshots__/ThumbnailImage.test.js.snap +19 -0
  227. package/tests/unit/src/variants/ThumbnailCarousel/mocks.js +64 -0
@@ -3,14 +3,31 @@ import PropTypes from 'prop-types';
3
3
  import { Link, MainContext } from '@blaze-cms/nextjs-components';
4
4
  import buildLinkExtraProps from '../helpers/build-link-extra-props';
5
5
 
6
- const BlazeLink = ({ children, className, name, href, as, shallow, scroll, gtmId, onClick }) => {
6
+ const BlazeLink = ({
7
+ children,
8
+ className,
9
+ name,
10
+ ariaLabel,
11
+ href,
12
+ as,
13
+ shallow,
14
+ scroll,
15
+ gtmId,
16
+ onClick
17
+ }) => {
7
18
  const { hasGTM } = useContext(MainContext);
8
19
  const gtmProps = hasGTM && !!gtmId ? { gtmId } : {};
9
20
  const linkExtraProps = buildLinkExtraProps({ className, name, as, ...gtmProps });
10
21
  if (!href) return children;
11
22
 
12
23
  return (
13
- <Link href={href} shallow={shallow} scroll={scroll} onClick={onClick} {...linkExtraProps}>
24
+ <Link
25
+ href={href}
26
+ ariaLabel={ariaLabel}
27
+ shallow={shallow}
28
+ scroll={scroll}
29
+ onClick={onClick}
30
+ {...linkExtraProps}>
14
31
  {children}
15
32
  </Link>
16
33
  );
@@ -26,7 +43,8 @@ BlazeLink.propTypes = {
26
43
  shallow: PropTypes.bool,
27
44
  scroll: PropTypes.bool,
28
45
  gtmId: PropTypes.string,
29
- onClick: PropTypes.func
46
+ onClick: PropTypes.func,
47
+ ariaLabel: PropTypes.string
30
48
  };
31
49
 
32
50
  BlazeLink.defaultProps = {
@@ -39,7 +57,8 @@ BlazeLink.defaultProps = {
39
57
  shallow: false,
40
58
  scroll: null,
41
59
  gtmId: '',
42
- onClick: null
60
+ onClick: null,
61
+ ariaLabel: ''
43
62
  };
44
63
 
45
64
  export default BlazeLink;
@@ -106,7 +106,6 @@ const Card = ({
106
106
  role: 'button'
107
107
  }
108
108
  : {};
109
-
110
109
  return (
111
110
  <Wrapper {...wrapperProps}>
112
111
  <div className={classNameWithModifiers} {...clickProps}>
@@ -4,7 +4,7 @@ import { useRouter } from 'next/router';
4
4
  import { getActiveTab } from './helpers';
5
5
  import { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL } from './constants';
6
6
 
7
- const ContentGroupTabs = ({ name, contentType, modifier, groupSections, sectionsData }) => {
7
+ const ContentGroupTabs = ({ name, contentType, groupSections, sectionsData, VariantComponent }) => {
8
8
  const router = useRouter();
9
9
  const [selectedTab, setSelectedTab] = useState(getActiveTab(sectionsData, ''));
10
10
  const { asPath } = router;
@@ -21,10 +21,12 @@ const ContentGroupTabs = ({ name, contentType, modifier, groupSections, sections
21
21
  [asPath, sectionsData, selectedTab]
22
22
  );
23
23
 
24
+ const WrapperComponent = VariantComponent || 'div';
25
+
24
26
  return (
25
27
  <div className={mainDivClass}>
26
28
  <ul className={contentGroupClass} role="tablist" aria-label={name}>
27
- {groupSections.map((groupSection, index) => {
29
+ {groupSections.map((_, index) => {
28
30
  const [sectionName, sectioLabel] = sectionsData[index];
29
31
  const tabId = `${TAB}-${sectionName}`;
30
32
  const panelId = `${PANEL}-${sectionName}`;
@@ -61,14 +63,15 @@ const ContentGroupTabs = ({ name, contentType, modifier, groupSections, sections
61
63
  if (selectedTab !== tabId) return null;
62
64
 
63
65
  return (
64
- <div
65
- id={sectionName}
66
+ <WrapperComponent
66
67
  key={panelId}
68
+ id={sectionName}
67
69
  className={sectionClass}
68
70
  role="tabpanel"
71
+ tabId={tabId}
69
72
  aria-labelledby={tabId}>
70
73
  {groupSection}
71
- </div>
74
+ </WrapperComponent>
72
75
  );
73
76
  })}
74
77
  </div>
@@ -78,13 +81,13 @@ const ContentGroupTabs = ({ name, contentType, modifier, groupSections, sections
78
81
  ContentGroupTabs.propTypes = {
79
82
  name: PropTypes.string.isRequired,
80
83
  contentType: PropTypes.string.isRequired,
81
- modifier: PropTypes.string,
82
84
  groupSections: PropTypes.array.isRequired,
83
- sectionsData: PropTypes.array.isRequired
85
+ sectionsData: PropTypes.array.isRequired,
86
+ VariantComponent: PropTypes.func
84
87
  };
85
88
 
86
89
  ContentGroupTabs.defaultProps = {
87
- modifier: ''
90
+ VariantComponent: null
88
91
  };
89
92
 
90
93
  export default ContentGroupTabs;
@@ -72,7 +72,8 @@ ImageRender.propTypes = {
72
72
  style: PropTypes.object,
73
73
  isHero: PropTypes.bool,
74
74
  priority: PropTypes.bool,
75
- sizeKey: PropTypes.string
75
+ sizeKey: PropTypes.string,
76
+ shouldRenderImgTag: PropTypes.bool
76
77
  };
77
78
 
78
79
  ImageRender.defaultProps = {
@@ -84,7 +85,8 @@ ImageRender.defaultProps = {
84
85
  isHero: false,
85
86
  priority: false,
86
87
  style: {},
87
- sizeKey: ''
88
+ sizeKey: '',
89
+ shouldRenderImgTag: false
88
90
  };
89
91
 
90
92
  export default ImageRender;
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { useRouter } from 'next/router';
4
4
  import { parseUrl } from 'query-string';
5
5
  import { buildAzUrl } from '../../helpers';
6
+ import BlazeLink from '../../../BlazeLink';
6
7
 
7
8
  const ListHeader = ({ name, listAggregations, azFilter }) => {
8
9
  const router = useRouter();
@@ -12,7 +13,8 @@ const ListHeader = ({ name, listAggregations, azFilter }) => {
12
13
 
13
14
  return (
14
15
  <div className="az_list_filter flex">
15
- <a
16
+ <BlazeLink
17
+ ariaLabel="Show all"
16
18
  className={`az_list_filter_option${!azFilter ? ' selected' : ''} flex-grow`}
17
19
  href={allHref}
18
20
  onClick={e => {
@@ -20,7 +22,7 @@ const ListHeader = ({ name, listAggregations, azFilter }) => {
20
22
  return router.push('/Resolver', allHref, { shallow: true });
21
23
  }}>
22
24
  ALL
23
- </a>
25
+ </BlazeLink>
24
26
  {listAggregations.map(({ key, doc_count: count }) => {
25
27
  if (!count)
26
28
  return (
@@ -34,7 +36,8 @@ const ListHeader = ({ name, listAggregations, azFilter }) => {
34
36
  const className = `az_list_filter_option${isSelected ? ' selected' : ''} flex-grow`;
35
37
 
36
38
  return (
37
- <a
39
+ <BlazeLink
40
+ ariaLabel={`Filter by ${key}`}
38
41
  key={key}
39
42
  className={className}
40
43
  href={href}
@@ -43,7 +46,7 @@ const ListHeader = ({ name, listAggregations, azFilter }) => {
43
46
  return router.push('/Resolver', href, { shallow: true });
44
47
  }}>
45
48
  {key}
46
- </a>
49
+ </BlazeLink>
47
50
  );
48
51
  })}
49
52
  </div>
@@ -22,7 +22,7 @@ const Classic = ({ name, numberOfPages, currentPage, query, url, isLastPage, onC
22
22
  onClick={onClick}
23
23
  shallow
24
24
  scroll>
25
- {PREVIOUS_STRING}
25
+ {`${PREVIOUS_STRING} page`}
26
26
  </BlazeLink>
27
27
  )}
28
28
  {pages}
@@ -33,7 +33,7 @@ const Classic = ({ name, numberOfPages, currentPage, query, url, isLastPage, onC
33
33
  onClick={onClick}
34
34
  shallow
35
35
  scroll>
36
- {NEXT_STRING}
36
+ {`${NEXT_STRING} page`}
37
37
  </BlazeLink>
38
38
  )}
39
39
  </>
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { LOAD_MORE_STRING } from '../../../../constants';
4
4
  import buildPaginationUrl from '../../helpers/build-pagination-url';
5
+ import BlazeLink from '../../../BlazeLink';
5
6
 
6
7
  const LoadMore = ({ name, currentPage, query, url, triggerInfiniteScroll, isLastPage }) => {
7
8
  if (isLastPage) return null;
@@ -15,9 +16,13 @@ const LoadMore = ({ name, currentPage, query, url, triggerInfiniteScroll, isLast
15
16
 
16
17
  return (
17
18
  <>
18
- <a className="pagination_load-more" role="button" href={nextPageLink} onClick={loadMoreItems}>
19
+ <BlazeLink
20
+ className="pagination_load-more"
21
+ role="button"
22
+ href={nextPageLink}
23
+ onClick={loadMoreItems}>
19
24
  {LOAD_MORE_STRING}
20
- </a>
25
+ </BlazeLink>
21
26
  </>
22
27
  );
23
28
  };
@@ -26,7 +26,8 @@ const buildPaginationItems = ({ name, numberOfPages, currentPage, query, url, on
26
26
  className="pagination_page-item"
27
27
  onClick={onClick}
28
28
  shallow
29
- scroll>
29
+ scroll
30
+ ariaLabel={`Page ${page}`}>
30
31
  {page}
31
32
  </BlazeLink>
32
33
  );
@@ -6,6 +6,7 @@ import { useRouter } from 'next/router';
6
6
  import { MdMenu, MdClose } from 'react-icons/md';
7
7
  import { Link } from '@blaze-cms/nextjs-components';
8
8
  import MenuContext from './MenuContext';
9
+ import BlazeLink from '../BlazeLink';
9
10
 
10
11
  const Menu = ({
11
12
  children,
@@ -76,7 +77,7 @@ const Menu = ({
76
77
  )}
77
78
  {logoOnMobile &&
78
79
  !showMobileMenu && (
79
- <Link href="/">
80
+ <Link href="/" name="mobile menu">
80
81
  <img src={logoOnMobileUrl} alt={logoOnMobileAlt} className={logoOnMobileModifier} />
81
82
  </Link>
82
83
  )}
@@ -84,13 +85,13 @@ const Menu = ({
84
85
  <div className="menu--desktop-wrapper">
85
86
  <ul className={childModifiers}>
86
87
  {logoOnDesktop && (
87
- <a href="/" className="">
88
+ <BlazeLink href="/" className="">
88
89
  <img
89
90
  src={logoOnMobileUrl}
90
91
  alt={logoOnMobileAlt}
91
92
  className={logoOnDesktopModifier}
92
93
  />
93
- </a>
94
+ </BlazeLink>
94
95
  )}
95
96
  {children}
96
97
  </ul>
@@ -41,6 +41,7 @@ const SelectFilter = ({
41
41
  label={labelToUse}
42
42
  value={filterValue}
43
43
  id={prop}
44
+ name={`filter-${prop}`}
44
45
  data-testid={`filter-${prop}`}
45
46
  options={options}
46
47
  defaultTextValue={defaultTextValue}
@@ -31,6 +31,7 @@ const SearchFilterSort = ({ filters, elementLabel, selectLabel, id, listComponen
31
31
  return (
32
32
  <div className="sort-by">
33
33
  <Select
34
+ name="sortby"
34
35
  label={elementLabel}
35
36
  defaultTextValue={defaultTextValue}
36
37
  value={selectedValue}
@@ -2,18 +2,24 @@
2
2
  import React from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import { SOCIAL_NETWORKS, BASE_CLASS_NAME_FOLLOW } from './sf.config';
5
+ import BlazeLink from '../BlazeLink';
5
6
 
6
7
  const SFItem = ({ url, id }) => {
7
8
  const { name, className, Icon, spanClassName } = SOCIAL_NETWORKS[id];
8
9
 
9
10
  return (
10
11
  <li className={BASE_CLASS_NAME_FOLLOW}>
11
- <a title={name} href={url} className={className} rel="noopener nofollow" target="_blank">
12
+ <BlazeLink
13
+ href={url}
14
+ className={className}
15
+ rel="noopener nofollow"
16
+ target="_blank"
17
+ ariaLabel={name}>
12
18
  <i>
13
19
  <Icon />
14
20
  </i>
15
21
  <span className={`social__network ${spanClassName}`}>{name}</span>
16
- </a>
22
+ </BlazeLink>
17
23
  </li>
18
24
  );
19
25
  };
@@ -1,23 +1,29 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Player } from 'video-react';
4
+ import { VIDEO_WRAPPER_CLASS_NAME } from '../../../constants';
5
+
4
6
  // import 'video-react/styles/scss/video-react.scss';
5
7
 
6
- const Default = ({ modifier, url, autoplay }) => (
7
- <Player className={modifier} preload="none" autoPlay={autoplay} muted={autoplay}>
8
- <source src={url} type="video/mp4" />
9
- </Player>
8
+ const Default = ({ modifier, url, autoplay, loop }) => (
9
+ <div className={VIDEO_WRAPPER_CLASS_NAME}>
10
+ <Player className={modifier} preload="none" autoPlay={autoplay} loop={loop} muted={autoplay}>
11
+ <source src={url} />
12
+ </Player>
13
+ </div>
10
14
  );
11
15
 
12
16
  Default.propTypes = {
13
17
  url: PropTypes.string.isRequired,
14
18
  modifier: PropTypes.string,
15
- autoplay: PropTypes.bool
19
+ autoplay: PropTypes.bool,
20
+ loop: PropTypes.bool
16
21
  };
17
22
 
18
23
  Default.defaultProps = {
19
24
  modifier: null,
20
- autoplay: false
25
+ autoplay: false,
26
+ loop: false
21
27
  };
22
28
 
23
29
  export default Default;
@@ -8,7 +8,8 @@ const SUPPORTED_PROVIDERS = {
8
8
  import(/* webpackChunkName: "blazePbVideoJWPlayer" */ './JWPlayer/JWPlayerProvider')
9
9
  ),
10
10
  vimeo: dynamic(() => import(/* webpackChunkName: "blazePbVideoVimeo" */ './Vimeo/VimeoProvider')),
11
- default: dynamic(() => import(/* webpackChunkName: "blazePbVideoDefault" */ './Default'))
11
+ default: dynamic(() => import(/* webpackChunkName: "blazePbVideoDefault" */ './Default')),
12
+ html: dynamic(() => import(/* webpackChunkName: "blazePbVideoDefault" */ './Default'))
12
13
  };
13
14
 
14
15
  function getProvider(provider) {
@@ -3,6 +3,7 @@ import { variantHandler } from '../../utils';
3
3
  export default function getVariant(settings) {
4
4
  const { variant } = settings;
5
5
  if (!variant) return [null, {}];
6
+
6
7
  const { VariantComponent, getSettings } = variantHandler.get(variant) || {};
7
8
  const variantSettings =
8
9
  !!getSettings && typeof getSettings === 'function' ? getSettings(settings) : settings;
@@ -18,7 +18,8 @@ function variantMapHandler() {
18
18
 
19
19
  function validate(key, variant) {
20
20
  if (!key || !variant) throw new BlazeError('Variant requires key and component');
21
- if (variants.has(key) && key !== 'array') throw new BlazeError(`Variant already exists`);
21
+ // eslint-disable-next-line no-console
22
+ if (variants.has(key) && key !== 'array') console.warn(`Variant already exists: ${key}`); // todo: restore error // throw new BlazeError(`Variant already exists: ${key}`);
22
23
  }
23
24
 
24
25
  return {
@@ -0,0 +1,8 @@
1
+ const HeroImage = {
2
+ getSettings: componentSettings => ({
3
+ ...componentSettings,
4
+ modifier: 'hero-image'
5
+ })
6
+ };
7
+
8
+ export default HeroImage;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import useInfographic from './useInfographic';
3
+
4
+ const Infographic = props => {
5
+ const { contentRef, id, className, tabId, children } = useInfographic(props);
6
+
7
+ return (
8
+ <div ref={contentRef} id={id} className={className} role="tabpanel" aria-labelledby={tabId}>
9
+ {children}
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default Infographic;
@@ -0,0 +1,12 @@
1
+ import dynamic from 'next/dynamic';
2
+
3
+ const Infographic = {
4
+ getSettings: componentSettings => ({
5
+ ...componentSettings
6
+ }),
7
+ VariantComponent: dynamic(() =>
8
+ import(/* webpackChunkName: "blazePbVariantInfographic" */ './Infographic')
9
+ )
10
+ };
11
+
12
+ export default Infographic;
@@ -0,0 +1,18 @@
1
+ import { useInView } from '@blaze-react/utils/lib/customHooks';
2
+
3
+ const useInfographic = ({ className: _className, ...props }) => {
4
+ const [isIntersecting, contentRef] = useInView({
5
+ once: true,
6
+ offset: '200px'
7
+ });
8
+
9
+ const className = `${_className} infographic${isIntersecting ? ' infographic__active' : ''}`;
10
+
11
+ return {
12
+ ...props,
13
+ className,
14
+ contentRef
15
+ };
16
+ };
17
+
18
+ export default useInfographic;
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import { withTitle } from '../../HOC';
3
+ import useLongformGallery from './useLongformGallery';
4
+ import LongformGalleryImage from './LongformGalleryImage';
5
+
6
+ const LongformGallery = props => {
7
+ const {
8
+ loading,
9
+ error,
10
+ groupedImages,
11
+ shouldDisplayCaption,
12
+ caption,
13
+ handleImageOnClick
14
+ } = useLongformGallery(props);
15
+
16
+ if (loading || error || !groupedImages.length) return null;
17
+
18
+ return (
19
+ <div className="longform-gallery" data-testid="longform-gallery">
20
+ {groupedImages.map((imageGroup, i) => (
21
+ // eslint-disable-next-line react/no-array-index-key
22
+ <div key={i} data-testid="grouped-images" className="longform-gallery__images">
23
+ {imageGroup.map(secondaryImage => (
24
+ <LongformGalleryImage
25
+ key={secondaryImage.id}
26
+ {...secondaryImage}
27
+ numberOfImages={imageGroup.length}
28
+ className={
29
+ imageGroup.length > 2
30
+ ? 'longform-gallery__images__image secondary-image'
31
+ : 'longform-gallery__images__image main-image'
32
+ }
33
+ handleImageOnClick={handleImageOnClick}
34
+ />
35
+ ))}
36
+ </div>
37
+ ))}
38
+ {shouldDisplayCaption && (
39
+ <div className="carousel__details" data-testid="carousel-details">
40
+ <div className="caption">{caption}</div>
41
+ </div>
42
+ )}
43
+ </div>
44
+ );
45
+ };
46
+
47
+ export default withTitle(LongformGallery);
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Head from 'next/head';
4
+ import { useInView } from '@blaze-react/utils/lib/customHooks';
5
+ import { ResponsiveImage } from '@blaze-cms/image-cdn-react';
6
+ import { IN_VIEW_CONFIG } from './constants';
7
+
8
+ const LongformGalleryImage = ({
9
+ id,
10
+ url,
11
+ caption,
12
+ altText,
13
+ priority,
14
+ className,
15
+ numberOfImages,
16
+ handleImageOnClick,
17
+ ...props
18
+ }) => {
19
+ const [isIntersecting, outerRef] = useInView(IN_VIEW_CONFIG);
20
+ const shouldRender = priority || isIntersecting;
21
+ const HeadComponent = priority ? Head : null;
22
+ const sizeKey = `carousel:longform:${numberOfImages}`;
23
+
24
+ return (
25
+ <div ref={outerRef} className={`${className}`}>
26
+ <div
27
+ role="button"
28
+ className="longform-gallery__images__image__container"
29
+ data-testid="longform-gallery__images__image__container"
30
+ onClick={() => handleImageOnClick(id)}>
31
+ {shouldRender && (
32
+ <ResponsiveImage
33
+ sizeKey={sizeKey}
34
+ role="button"
35
+ src={url}
36
+ alt={altText}
37
+ priority={priority}
38
+ HeadComponent={HeadComponent}
39
+ {...props}
40
+ />
41
+ )}
42
+ </div>
43
+ {!!caption && (
44
+ <div
45
+ className="longform-gallery__images__image__details"
46
+ data-testid="longform-gallery__images__image__details">
47
+ <div className="longform-gallery__images__image__details__caption">{caption}</div>
48
+ </div>
49
+ )}
50
+ </div>
51
+ );
52
+ };
53
+
54
+ LongformGalleryImage.propTypes = {
55
+ id: PropTypes.string.isRequired,
56
+ url: PropTypes.string.isRequired,
57
+ caption: PropTypes.string.isRequired,
58
+ numberOfImages: PropTypes.number.isRequired,
59
+ altText: PropTypes.string.isRequired,
60
+ priority: PropTypes.bool.isRequired,
61
+ className: PropTypes.string.isRequired,
62
+ handleImageOnClick: PropTypes.func.isRequired
63
+ };
64
+
65
+ export default LongformGalleryImage;
@@ -0,0 +1,21 @@
1
+ import { gql } from '@apollo/client';
2
+
3
+ const GET_IMAGES_QUERY = gql`
4
+ query getImages($where: JSON!) {
5
+ getImages: getFiles(where: $where) {
6
+ id
7
+ url
8
+ data
9
+ }
10
+ }
11
+ `;
12
+
13
+ const PROPS_TO_CHECK = ['altText', 'caption', 'hrefUrl', 'credits'];
14
+
15
+ const IN_VIEW_CONFIG = {
16
+ once: true,
17
+ offset: '200px',
18
+ bottomOffset: '-200px'
19
+ };
20
+
21
+ export { GET_IMAGES_QUERY, IN_VIEW_CONFIG, PROPS_TO_CHECK };
@@ -0,0 +1,5 @@
1
+ import parseImageData from './parseImageData';
2
+ import separateImages from './separateImages';
3
+ import shouldSkip from './shouldSkip';
4
+
5
+ export { parseImageData, separateImages, shouldSkip };
@@ -0,0 +1,25 @@
1
+ import parseHTML from 'html-react-parser';
2
+ import { PROPS_TO_CHECK } from '../constants';
3
+
4
+ const parseImageData = (image, index, priorityLimit, shouldDisplayCaption) => {
5
+ const { data = {} } = image;
6
+ const parsedData = {};
7
+
8
+ PROPS_TO_CHECK.forEach(dataKey => {
9
+ const value = data && data[dataKey];
10
+ if (dataKey === 'caption') {
11
+ parsedData[dataKey] = shouldDisplayCaption && !!value ? parseHTML(value) : '';
12
+ return;
13
+ }
14
+ parsedData[dataKey] = value || '';
15
+ });
16
+
17
+ return {
18
+ ...parsedData,
19
+ id: image.id,
20
+ url: image.url,
21
+ priority: index < priorityLimit
22
+ };
23
+ };
24
+
25
+ export default parseImageData;
@@ -0,0 +1,38 @@
1
+ import parseImageData from './parseImageData';
2
+
3
+ const buildImageGroups = (images, priorityLimit, shouldDisplayCaption) => {
4
+ const imageGroups = [];
5
+ let imageGroupIndex = 0;
6
+ const isDivisible = images.length % 3 === 0;
7
+
8
+ images.forEach((image, index) => {
9
+ if (!imageGroups[imageGroupIndex])
10
+ imageGroups[imageGroupIndex] = [
11
+ parseImageData(image, index, priorityLimit, shouldDisplayCaption)
12
+ ];
13
+ else
14
+ imageGroups[imageGroupIndex].push(
15
+ parseImageData(image, index, priorityLimit, shouldDisplayCaption)
16
+ );
17
+
18
+ if (isDivisible) {
19
+ if (imageGroups[imageGroupIndex].length >= 3) imageGroupIndex += 1;
20
+ } else {
21
+ if (imageGroupIndex === 0 && imageGroups[imageGroupIndex].length >= 2) {
22
+ imageGroupIndex += 1;
23
+ return;
24
+ }
25
+ if (imageGroups[imageGroupIndex].length >= 3) imageGroupIndex += 1;
26
+ }
27
+ });
28
+
29
+ return imageGroups;
30
+ };
31
+
32
+ const separateImages = (images, priorityLimit, shouldDisplayCaption) => {
33
+ if (!images || !images.length) return [];
34
+
35
+ return buildImageGroups(images, priorityLimit, shouldDisplayCaption);
36
+ };
37
+
38
+ export default separateImages;
@@ -0,0 +1,3 @@
1
+ const shouldSkip = ids => !ids || (Array.isArray(ids) && !ids.length);
2
+
3
+ export default shouldSkip;