@treely/strapi-slices 2.0.0 → 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 (246) hide show
  1. package/package.json +1 -2
  2. package/src/components/SEOTags/SEOTags.tsx +53 -0
  3. package/src/components/SEOTags/index.ts +1 -0
  4. package/src/constants/metadata.ts +3 -0
  5. package/src/constants/sectionsConfig.ts +20 -0
  6. package/src/index.tsx +119 -0
  7. package/src/models/HeaderType.ts +6 -0
  8. package/src/models/Image.ts +6 -0
  9. package/src/models/PageMetadata.ts +11 -0
  10. package/src/models/PageProps.ts +32 -0
  11. package/src/models/strapi/StrapiBlogPostProps.ts +7 -0
  12. package/src/models/strapi/StrapiCustomerStoryProps.ts +9 -0
  13. package/src/models/strapi/StrapiPageProps.ts +7 -0
  14. package/src/models/strapi/StrapiProjectProps.ts +7 -0
  15. package/src/test/mocks/getStaticPropsContext.ts +9 -0
  16. package/src/utils/mergeGlobalAndStrapiBlogPostData.test.ts +154 -0
  17. package/src/utils/mergeGlobalAndStrapiBlogPostData.ts +68 -0
  18. package/src/utils/mergeGlobalAndStrapiCustomerStoryData.test.ts +149 -0
  19. package/src/utils/mergeGlobalAndStrapiCustomerStoryData.ts +68 -0
  20. package/src/utils/mergeGlobalAndStrapiPageData.test.ts +254 -0
  21. package/src/utils/mergeGlobalAndStrapiPageData.ts +81 -0
  22. package/src/utils/mergeGlobalAndStrapiProjectData.test.ts +243 -0
  23. package/src/utils/mergeGlobalAndStrapiProjectData.ts +79 -0
  24. package/dist/components/ContextProvider/ContextProvider.d.ts +0 -8
  25. package/dist/components/ContextProvider/index.d.ts +0 -1
  26. package/dist/components/CreditsAvailableBadge/CreditsAvailableBadge.d.ts +0 -8
  27. package/dist/components/CreditsAvailableBadge/index.d.ts +0 -2
  28. package/dist/components/CreditsAvailableBadge/messages.de.d.ts +0 -7
  29. package/dist/components/CreditsAvailableBadge/messages.en.d.ts +0 -7
  30. package/dist/components/FullScreenImage/FullScreenImage.d.ts +0 -9
  31. package/dist/components/FullScreenImage/ZoomableImage.d.ts +0 -8
  32. package/dist/components/FullScreenImage/index.d.ts +0 -2
  33. package/dist/components/MinimalProviders/MinimalProviders.d.ts +0 -7
  34. package/dist/components/MinimalProviders/index.d.ts +0 -2
  35. package/dist/components/SliceRenderer/SliceRenderer.d.ts +0 -19
  36. package/dist/components/SliceRenderer/index.d.ts +0 -1
  37. package/dist/components/StrapiLinkButton/StrapiLinkButton.d.ts +0 -18
  38. package/dist/components/StrapiLinkButton/index.d.ts +0 -2
  39. package/dist/components/StrapiLinkButtonWithIcon/StrapiLinkButtonWithIcon.d.ts +0 -7
  40. package/dist/components/StrapiLinkButtonWithIcon/index.d.ts +0 -2
  41. package/dist/components/portfolio/Contact/Contact.d.ts +0 -10
  42. package/dist/components/portfolio/Contact/index.d.ts +0 -2
  43. package/dist/components/portfolio/DocumentsDownloadList/DocumentsDownloadList.d.ts +0 -6
  44. package/dist/components/portfolio/DocumentsDownloadList/index.d.ts +0 -2
  45. package/dist/components/portfolio/DocumentsDownloadList/messages.de.d.ts +0 -5
  46. package/dist/components/portfolio/DocumentsDownloadList/messages.en.d.ts +0 -5
  47. package/dist/components/portfolio/ProjectInfo/ProjectInfo.d.ts +0 -18
  48. package/dist/components/portfolio/ProjectInfo/index.d.ts +0 -2
  49. package/dist/components/portfolio/ProjectInfo/messages.de.d.ts +0 -15
  50. package/dist/components/portfolio/ProjectInfo/messages.en.d.ts +0 -15
  51. package/dist/components/portfolio/SmallCheckout/SmallCheckout.d.ts +0 -14
  52. package/dist/components/portfolio/SmallCheckout/index.d.ts +0 -2
  53. package/dist/components/portfolio/SmallCheckout/messages.de.d.ts +0 -16
  54. package/dist/components/portfolio/SmallCheckout/messages.en.d.ts +0 -16
  55. package/dist/constants/animations.d.ts +0 -1
  56. package/dist/constants/api.d.ts +0 -3
  57. package/dist/constants/breakpoints.d.ts +0 -8
  58. package/dist/constants/domain.d.ts +0 -2
  59. package/dist/constants/fontCustomizations.d.ts +0 -6
  60. package/dist/constants/formatter.d.ts +0 -6
  61. package/dist/constants/globalStyle.d.ts +0 -1
  62. package/dist/constants/mapbox.d.ts +0 -17
  63. package/dist/constants/strapi.d.ts +0 -1
  64. package/dist/icons/LinkedInIcon.d.ts +0 -3
  65. package/dist/index.d.ts +0 -1
  66. package/dist/index.js +0 -8
  67. package/dist/models/BBox.d.ts +0 -2
  68. package/dist/models/CreditsAvailableState.d.ts +0 -7
  69. package/dist/models/Locale.d.ts +0 -2
  70. package/dist/models/PortfolioProject.d.ts +0 -7
  71. package/dist/models/forms/CheckoutForm.d.ts +0 -4
  72. package/dist/models/fpm/FPMProject.d.ts +0 -37
  73. package/dist/models/fpm/Issuer.d.ts +0 -6
  74. package/dist/models/strapi/IStrapi.d.ts +0 -4
  75. package/dist/models/strapi/IStrapiData.d.ts +0 -5
  76. package/dist/models/strapi/IStrapiResponse.d.ts +0 -13
  77. package/dist/models/strapi/StrapiAuthor.d.ts +0 -10
  78. package/dist/models/strapi/StrapiAvatarWithName.d.ts +0 -8
  79. package/dist/models/strapi/StrapiBanner.d.ts +0 -9
  80. package/dist/models/strapi/StrapiBlogPost.d.ts +0 -25
  81. package/dist/models/strapi/StrapiButtonWithVariant.d.ts +0 -6
  82. package/dist/models/strapi/StrapiCategory.d.ts +0 -8
  83. package/dist/models/strapi/StrapiContactArea.d.ts +0 -10
  84. package/dist/models/strapi/StrapiCustomerStory.d.ts +0 -21
  85. package/dist/models/strapi/StrapiDefaultHeader.d.ts +0 -6
  86. package/dist/models/strapi/StrapiGlobal.d.ts +0 -26
  87. package/dist/models/strapi/StrapiGlossaryItem.d.ts +0 -6
  88. package/dist/models/strapi/StrapiHeroCard.d.ts +0 -13
  89. package/dist/models/strapi/StrapiImage.d.ts +0 -10
  90. package/dist/models/strapi/StrapiImageFormat.d.ts +0 -12
  91. package/dist/models/strapi/StrapiImageWithLink.d.ts +0 -6
  92. package/dist/models/strapi/StrapiLink.d.ts +0 -11
  93. package/dist/models/strapi/StrapiLinkList.d.ts +0 -7
  94. package/dist/models/strapi/StrapiLinkPage.d.ts +0 -10
  95. package/dist/models/strapi/StrapiLinkWithIcon.d.ts +0 -7
  96. package/dist/models/strapi/StrapiLocalization.d.ts +0 -7
  97. package/dist/models/strapi/StrapiMedia.d.ts +0 -27
  98. package/dist/models/strapi/StrapiMetadata.d.ts +0 -13
  99. package/dist/models/strapi/StrapiNavMenu.d.ts +0 -13
  100. package/dist/models/strapi/StrapiPage.d.ts +0 -17
  101. package/dist/models/strapi/StrapiPortfolio.d.ts +0 -10
  102. package/dist/models/strapi/StrapiPortfolioCard.d.ts +0 -15
  103. package/dist/models/strapi/StrapiProject.d.ts +0 -23
  104. package/dist/models/strapi/StrapiProjectCard.d.ts +0 -18
  105. package/dist/models/strapi/StrapiQuoteCard.d.ts +0 -7
  106. package/dist/models/strapi/StrapiShapesCard.d.ts +0 -11
  107. package/dist/models/strapi/StrapiTextCardWithIcons.d.ts +0 -8
  108. package/dist/models/strapi/StrapiTopBanner.d.ts +0 -7
  109. package/dist/rootMessages.de.d.ts +0 -58
  110. package/dist/rootMessages.en.d.ts +0 -58
  111. package/dist/slices/Blog/Blog.d.ts +0 -10
  112. package/dist/slices/Blog/index.d.ts +0 -2
  113. package/dist/slices/Blog/styles.d.ts +0 -7
  114. package/dist/slices/BlogCards/BlogCards.d.ts +0 -18
  115. package/dist/slices/BlogCards/index.d.ts +0 -2
  116. package/dist/slices/Comparison/Comparison.d.ts +0 -33
  117. package/dist/slices/Comparison/Icon.d.ts +0 -7
  118. package/dist/slices/Comparison/index.d.ts +0 -2
  119. package/dist/slices/Comparison/messages.de.d.ts +0 -4
  120. package/dist/slices/Comparison/messages.en.d.ts +0 -4
  121. package/dist/slices/Cta/Cta.d.ts +0 -26
  122. package/dist/slices/Cta/index.d.ts +0 -2
  123. package/dist/slices/Cta/messages.de.d.ts +0 -5
  124. package/dist/slices/Cta/messages.en.d.ts +0 -5
  125. package/dist/slices/CtaOnly/CtaOnly.d.ts +0 -8
  126. package/dist/slices/CtaOnly/index.d.ts +0 -2
  127. package/dist/slices/CustomerStories/CustomerStories.d.ts +0 -10
  128. package/dist/slices/CustomerStories/index.d.ts +0 -2
  129. package/dist/slices/CustomerStories/messages.de.d.ts +0 -4
  130. package/dist/slices/CustomerStories/messages.en.d.ts +0 -4
  131. package/dist/slices/Facts/Facts.d.ts +0 -16
  132. package/dist/slices/Facts/index.d.ts +0 -2
  133. package/dist/slices/FullWidthHighlightQuote/FullWidthHighlightQuote.d.ts +0 -10
  134. package/dist/slices/FullWidthHighlightQuote/index.d.ts +0 -2
  135. package/dist/slices/FullWidthImage/FullWidthImage.d.ts +0 -11
  136. package/dist/slices/FullWidthImage/index.d.ts +0 -2
  137. package/dist/slices/FullWidthImageSlider/FullWidthImageSlider.d.ts +0 -12
  138. package/dist/slices/FullWidthImageSlider/index.d.ts +0 -2
  139. package/dist/slices/FullWidthImageSlider/styles.d.ts +0 -290
  140. package/dist/slices/FullWidthImageSlider/utils.d.ts +0 -1
  141. package/dist/slices/FullWidthImageSlider/utils.test.d.ts +0 -1
  142. package/dist/slices/Glossary/Glossary.d.ts +0 -9
  143. package/dist/slices/Glossary/index.d.ts +0 -2
  144. package/dist/slices/Glossary/messages.de.d.ts +0 -6
  145. package/dist/slices/Glossary/messages.en.d.ts +0 -6
  146. package/dist/slices/Hero/Hero.d.ts +0 -17
  147. package/dist/slices/Hero/index.d.ts +0 -2
  148. package/dist/slices/IconGrid/IconGrid.d.ts +0 -18
  149. package/dist/slices/IconGrid/index.d.ts +0 -2
  150. package/dist/slices/ImageGrid/ImageGrid.d.ts +0 -18
  151. package/dist/slices/ImageGrid/index.d.ts +0 -2
  152. package/dist/slices/ImageTextSequence/ImageTextSequence.d.ts +0 -19
  153. package/dist/slices/ImageTextSequence/index.d.ts +0 -2
  154. package/dist/slices/LeftTextRightCard/LeftTextRightCard.d.ts +0 -17
  155. package/dist/slices/LeftTextRightCard/index.d.ts +0 -2
  156. package/dist/slices/LinkCardsGrid/LinkCardsGrid.d.ts +0 -18
  157. package/dist/slices/LinkCardsGrid/index.d.ts +0 -2
  158. package/dist/slices/LogoGridWithText/LogoGridWithText.d.ts +0 -12
  159. package/dist/slices/LogoGridWithText/index.d.ts +0 -2
  160. package/dist/slices/MapHero/MapHero.d.ts +0 -15
  161. package/dist/slices/MapHero/index.d.ts +0 -2
  162. package/dist/slices/MapHero/styles.d.ts +0 -16
  163. package/dist/slices/ProjectFacts/ProjectFacts.d.ts +0 -34
  164. package/dist/slices/ProjectFacts/index.d.ts +0 -2
  165. package/dist/slices/ProjectFacts/messages.de.d.ts +0 -5
  166. package/dist/slices/ProjectFacts/messages.en.d.ts +0 -5
  167. package/dist/slices/ProjectsGrid/ProjectsGrid.d.ts +0 -8
  168. package/dist/slices/ProjectsGrid/index.d.ts +0 -2
  169. package/dist/slices/ProjectsMap/MapMarker.d.ts +0 -11
  170. package/dist/slices/ProjectsMap/ProjectsMap.d.ts +0 -16
  171. package/dist/slices/ProjectsMap/index.d.ts +0 -2
  172. package/dist/slices/ProjectsMap/mapboxStyle.d.ts +0 -2
  173. package/dist/slices/ProjectsMap/messages.de.d.ts +0 -4
  174. package/dist/slices/ProjectsMap/messages.en.d.ts +0 -4
  175. package/dist/slices/QAndA/QAndA.d.ts +0 -43
  176. package/dist/slices/QAndA/index.d.ts +0 -2
  177. package/dist/slices/QuoteCards/QuoteCards.d.ts +0 -15
  178. package/dist/slices/QuoteCards/index.d.ts +0 -2
  179. package/dist/slices/RichTextSection/RichTextSection.d.ts +0 -7
  180. package/dist/slices/RichTextSection/index.d.ts +0 -2
  181. package/dist/slices/ShopCheckout/ShopCheckout.d.ts +0 -16
  182. package/dist/slices/ShopCheckout/index.d.ts +0 -2
  183. package/dist/slices/ShopCheckout/messages.de.d.ts +0 -15
  184. package/dist/slices/ShopCheckout/messages.en.d.ts +0 -15
  185. package/dist/slices/SideBySideImages/SideBySideImages.d.ts +0 -12
  186. package/dist/slices/SideBySideImages/index.d.ts +0 -2
  187. package/dist/slices/SmallHero/SmallHero.d.ts +0 -20
  188. package/dist/slices/SmallHero/index.d.ts +0 -2
  189. package/dist/slices/Steps/Steps.d.ts +0 -19
  190. package/dist/slices/Steps/index.d.ts +0 -2
  191. package/dist/slices/TextCardGrid/TextCardGrid.d.ts +0 -20
  192. package/dist/slices/TextCardGrid/index.d.ts +0 -2
  193. package/dist/slices/TextCarousel/TextCarousel.d.ts +0 -13
  194. package/dist/slices/TextCarousel/index.d.ts +0 -2
  195. package/dist/slices/TextCarousel/styles.d.ts +0 -281
  196. package/dist/slices/TextWithCard/TextWithCard.d.ts +0 -20
  197. package/dist/slices/TextWithCard/index.d.ts +0 -2
  198. package/dist/slices/TextWithTextCards/TextWithTextCards.d.ts +0 -15
  199. package/dist/slices/TextWithTextCards/index.d.ts +0 -2
  200. package/dist/slices/Video/Video.d.ts +0 -10
  201. package/dist/slices/Video/index.d.ts +0 -2
  202. package/dist/strapi-slices.cjs.development.js +0 -4653
  203. package/dist/strapi-slices.cjs.development.js.map +0 -1
  204. package/dist/strapi-slices.cjs.production.min.js +0 -2
  205. package/dist/strapi-slices.cjs.production.min.js.map +0 -1
  206. package/dist/strapi-slices.esm.js +0 -4640
  207. package/dist/strapi-slices.esm.js.map +0 -1
  208. package/dist/test/defaultMocks/next.d.ts +0 -2
  209. package/dist/test/integrationMocks/fpmProjectMock.d.ts +0 -3
  210. package/dist/test/mocks/portfolioProjectMock.d.ts +0 -3
  211. package/dist/test/setupTests.d.ts +0 -1
  212. package/dist/test/storybookMocks/storybookMedia.d.ts +0 -1
  213. package/dist/test/storybookMocks/storybookStrapiMedia.d.ts +0 -8
  214. package/dist/test/strapiMocks/minimalGlobalData.d.ts +0 -4
  215. package/dist/test/strapiMocks/strapiAvatarWithName.d.ts +0 -12
  216. package/dist/test/strapiMocks/strapiBlogPost.d.ts +0 -3
  217. package/dist/test/strapiMocks/strapiContact.d.ts +0 -2
  218. package/dist/test/strapiMocks/strapiCustomerStory.d.ts +0 -3
  219. package/dist/test/strapiMocks/strapiHeroCard.d.ts +0 -2
  220. package/dist/test/strapiMocks/strapiLinkPage.d.ts +0 -3
  221. package/dist/test/strapiMocks/strapiMedia.d.ts +0 -3
  222. package/dist/test/strapiMocks/strapiMetadata.d.ts +0 -2
  223. package/dist/test/strapiMocks/strapiPage.d.ts +0 -3
  224. package/dist/test/strapiMocks/strapiPortfolioCard.d.ts +0 -2
  225. package/dist/test/strapiMocks/strapiPortfolioMock.d.ts +0 -3
  226. package/dist/test/strapiMocks/strapiProject.d.ts +0 -3
  227. package/dist/test/strapiMocks/strapiProjectCard.d.ts +0 -2
  228. package/dist/test/strapiMocks/strapiQuoteCard.d.ts +0 -2
  229. package/dist/test/testUtils.d.ts +0 -6
  230. package/dist/unit.messages.de.d.ts +0 -5
  231. package/dist/unit.messages.en.d.ts +0 -5
  232. package/dist/utils/convertAreaM2ToHa.d.ts +0 -2
  233. package/dist/utils/convertAreaM2ToHa.test.d.ts +0 -1
  234. package/dist/utils/convertCo2AmountKgToTons.d.ts +0 -2
  235. package/dist/utils/convertToKebabCase.d.ts +0 -2
  236. package/dist/utils/convertToKebabCase.test.d.ts +0 -1
  237. package/dist/utils/getTimeSpanInYears.d.ts +0 -2
  238. package/dist/utils/getTimeSpanInYears.test.d.ts +0 -1
  239. package/dist/utils/mergeBoundingBoxes.d.ts +0 -3
  240. package/dist/utils/mergeBoundingBoxes.test.d.ts +0 -1
  241. package/dist/utils/mergeDeep.d.ts +0 -12
  242. package/dist/utils/openHubSpotChat.d.ts +0 -2
  243. package/dist/utils/strapiLinkUrl.d.ts +0 -3
  244. package/dist/utils/strapiLinkUrl.test.d.ts +0 -1
  245. package/dist/utils/strapiMediaUrl.d.ts +0 -5
  246. package/dist/utils/strapiMediaUrl.test.d.ts +0 -1
@@ -0,0 +1,243 @@
1
+ import getStaticPropsContextMock from '../test/mocks/getStaticPropsContext';
2
+ import minimalGlobalData from '../test/strapiMocks/minimalGlobalData';
3
+ import { strapiMetadataMock } from '../test/strapiMocks/strapiMetadata';
4
+ import { strapiProjectMock } from '../test/strapiMocks/strapiProject';
5
+ import mergeGlobalAndStrapiProjectData from './mergeGlobalAndStrapiProjectData';
6
+
7
+ describe('The mergeGlobalAndStrapiProjectData util', () => {
8
+ it('returns the global metadata if there is no page metadata', () => {
9
+ const pageDataWithoutMetadata = {
10
+ ...strapiProjectMock,
11
+ attributes: {
12
+ ...strapiProjectMock.attributes,
13
+ metadata: null,
14
+ },
15
+ };
16
+
17
+ const result = mergeGlobalAndStrapiProjectData(
18
+ getStaticPropsContextMock,
19
+ minimalGlobalData,
20
+ pageDataWithoutMetadata,
21
+ [],
22
+ []
23
+ );
24
+
25
+ expect(result.attributes.metadata).toBe(
26
+ minimalGlobalData.attributes.metadata
27
+ );
28
+ expect(result.metadata.title).toBe(
29
+ minimalGlobalData.attributes.metadata.title
30
+ );
31
+ expect(result.metadata.description).toBe(
32
+ minimalGlobalData.attributes.metadata.description
33
+ );
34
+ });
35
+
36
+ it('returns the pages metadata if the page data includes metadata', () => {
37
+ const pageDataWithMetadata = {
38
+ ...strapiProjectMock,
39
+ attributes: {
40
+ ...strapiProjectMock.attributes,
41
+ metadata: strapiMetadataMock,
42
+ },
43
+ };
44
+
45
+ const result = mergeGlobalAndStrapiProjectData(
46
+ getStaticPropsContextMock,
47
+ minimalGlobalData,
48
+ pageDataWithMetadata,
49
+ [],
50
+ []
51
+ );
52
+
53
+ expect(result.attributes.metadata?.title).toBe(strapiMetadataMock.title);
54
+ expect(result.metadata?.title).toBe(strapiMetadataMock.title);
55
+ });
56
+
57
+ it('returns the navbar links if there are links in the global data', () => {
58
+ const result = mergeGlobalAndStrapiProjectData(
59
+ getStaticPropsContextMock,
60
+ {
61
+ ...minimalGlobalData,
62
+ attributes: {
63
+ ...minimalGlobalData.attributes,
64
+ navbar: {
65
+ ...minimalGlobalData.attributes.navbar,
66
+ navMenus: [
67
+ {
68
+ link: { id: Infinity, text: 'Text', url: '/' },
69
+ title: 'Title',
70
+ items: [],
71
+ },
72
+ ],
73
+ },
74
+ },
75
+ },
76
+ strapiProjectMock,
77
+ [],
78
+ []
79
+ );
80
+
81
+ expect(result.headerNavMenus).toStrictEqual([
82
+ {
83
+ title: 'Title',
84
+ items: [],
85
+ link: { id: Infinity, text: 'Text', url: '/' },
86
+ },
87
+ ]);
88
+ });
89
+
90
+ it('returns the navbar buttons if there are buttons in the global data', () => {
91
+ const result = mergeGlobalAndStrapiProjectData(
92
+ getStaticPropsContextMock,
93
+ {
94
+ ...minimalGlobalData,
95
+ attributes: {
96
+ ...minimalGlobalData.attributes,
97
+ navbar: {
98
+ ...minimalGlobalData.attributes.navbar,
99
+ buttons: [{ id: Infinity, text: 'Header button', url: '/' }],
100
+ },
101
+ },
102
+ },
103
+ strapiProjectMock,
104
+ [],
105
+ []
106
+ );
107
+
108
+ expect(result.headerButtons).toStrictEqual([
109
+ { id: Infinity, text: 'Header button', url: '/' },
110
+ ]);
111
+ });
112
+
113
+ it('returns the footer links if there are links in the global data', () => {
114
+ const result = mergeGlobalAndStrapiProjectData(
115
+ getStaticPropsContextMock,
116
+ {
117
+ ...minimalGlobalData,
118
+ attributes: {
119
+ ...minimalGlobalData.attributes,
120
+ footer: {
121
+ ...minimalGlobalData.attributes.footer,
122
+ links: [{ id: Infinity, title: 'Title', links: [] }],
123
+ },
124
+ },
125
+ },
126
+ strapiProjectMock,
127
+ [],
128
+ []
129
+ );
130
+
131
+ expect(result.footerLinks).toStrictEqual([
132
+ { id: Infinity, title: 'Title', links: [] },
133
+ ]);
134
+ });
135
+
136
+ it('returns a light theme header type if the first slice of the page is not a hero', () => {
137
+ const result = mergeGlobalAndStrapiProjectData(
138
+ getStaticPropsContextMock,
139
+ minimalGlobalData,
140
+ {
141
+ ...strapiProjectMock,
142
+ attributes: {
143
+ ...strapiProjectMock.attributes,
144
+ slices: [{ __component: 'no.hero.section' }],
145
+ },
146
+ },
147
+ [],
148
+ []
149
+ );
150
+
151
+ expect(result.headerType?.theme).toBe('light');
152
+ });
153
+
154
+ it('returns a light theme header type if the slices array is empty', () => {
155
+ const result = mergeGlobalAndStrapiProjectData(
156
+ getStaticPropsContextMock,
157
+ minimalGlobalData,
158
+ {
159
+ ...strapiProjectMock,
160
+ attributes: {
161
+ ...strapiProjectMock.attributes,
162
+ slices: [],
163
+ },
164
+ },
165
+ [],
166
+ []
167
+ );
168
+
169
+ expect(result.headerType?.theme).toBe('light');
170
+ });
171
+
172
+ it('returns a dark theme header type if the first slice of the page is a hero', () => {
173
+ const result = mergeGlobalAndStrapiProjectData(
174
+ getStaticPropsContextMock,
175
+ minimalGlobalData,
176
+ {
177
+ ...strapiProjectMock,
178
+ attributes: {
179
+ ...strapiProjectMock.attributes,
180
+ slices: [{ __component: 'sections.hero' }],
181
+ },
182
+ },
183
+ [],
184
+ []
185
+ );
186
+
187
+ expect(result.headerType?.theme).toBe('dark');
188
+ });
189
+
190
+ it('returns a not extendable header type if the first slice of the page is not a hero', () => {
191
+ const result = mergeGlobalAndStrapiProjectData(
192
+ getStaticPropsContextMock,
193
+ minimalGlobalData,
194
+ {
195
+ ...strapiProjectMock,
196
+ attributes: {
197
+ ...strapiProjectMock.attributes,
198
+ slices: [{ __component: 'no.hero.section' }],
199
+ },
200
+ },
201
+ [],
202
+ []
203
+ );
204
+
205
+ expect(result.headerType?.extendable).toBe(false);
206
+ });
207
+
208
+ it('returns a not extendable header type if the slices array is empty', () => {
209
+ const result = mergeGlobalAndStrapiProjectData(
210
+ getStaticPropsContextMock,
211
+ minimalGlobalData,
212
+ {
213
+ ...strapiProjectMock,
214
+ attributes: {
215
+ ...strapiProjectMock.attributes,
216
+ slices: [],
217
+ },
218
+ },
219
+ [],
220
+ []
221
+ );
222
+
223
+ expect(result.headerType?.extendable).toBe(false);
224
+ });
225
+
226
+ it('returns an extendable header type if the first slice of the page is a hero', () => {
227
+ const result = mergeGlobalAndStrapiProjectData(
228
+ getStaticPropsContextMock,
229
+ minimalGlobalData,
230
+ {
231
+ ...strapiProjectMock,
232
+ attributes: {
233
+ ...strapiProjectMock.attributes,
234
+ slices: [{ __component: 'sections.hero' }],
235
+ },
236
+ },
237
+ [],
238
+ []
239
+ );
240
+
241
+ expect(result.headerType?.extendable).toBe(true);
242
+ });
243
+ });
@@ -0,0 +1,79 @@
1
+ import { GetStaticPropsContext } from 'next';
2
+ import strapiMediaUrl from './strapiMediaUrl';
3
+ import {
4
+ IStrapiData,
5
+ StrapiBlogPost,
6
+ StrapiGlobal,
7
+ StrapiProject,
8
+ StrapiProjectProps,
9
+ } from '..';
10
+ import PortfolioProject from '../models/PortfolioProject';
11
+ import {
12
+ DARK_THEME_HEADER_SECTIONS,
13
+ EXTENDABLE_HEADER_SECTIONS,
14
+ } from '../constants/sectionsConfig';
15
+ import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
16
+
17
+ const mergeGlobalAndStrapiProject = (
18
+ context: GetStaticPropsContext,
19
+ global: IStrapiData<StrapiGlobal>,
20
+ project: IStrapiData<StrapiProject>,
21
+ blogPosts: IStrapiData<StrapiBlogPost>[],
22
+ projects: PortfolioProject[]
23
+ ): StrapiProjectProps => {
24
+ const metaShareImageUrl = project.attributes.metadata?.shareImage
25
+ ? strapiMediaUrl(
26
+ project.attributes.metadata?.shareImage.media ??
27
+ global.attributes.metadata.shareImage?.media,
28
+ 'large'
29
+ )
30
+ : DEFAULT_SHARE_IMAGE;
31
+
32
+ return {
33
+ ...project,
34
+ // Portfolio Projects
35
+ projects,
36
+ // StrapiProject
37
+ attributes: {
38
+ ...project.attributes,
39
+ metadata: project?.attributes?.metadata || global.attributes.metadata,
40
+ },
41
+ headerType: {
42
+ extendable: EXTENDABLE_HEADER_SECTIONS.includes(
43
+ project.attributes.slices[0]?.__component
44
+ ),
45
+ theme: DARK_THEME_HEADER_SECTIONS.includes(
46
+ project.attributes.slices[0]?.__component
47
+ )
48
+ ? 'dark'
49
+ : 'light',
50
+ },
51
+ // PageProps
52
+ headerNavMenus: global.attributes.navbar.navMenus || [],
53
+ headerButtons: global.attributes.navbar.buttons || [],
54
+ footerLinks: global.attributes.footer.links || [],
55
+ metadata: {
56
+ title:
57
+ project.attributes.metadata?.title ?? global.attributes.metadata.title,
58
+ description:
59
+ project.attributes.metadata?.description ??
60
+ global.attributes.metadata.description,
61
+ shareImage: {
62
+ url: metaShareImageUrl,
63
+ alt:
64
+ project.attributes.metadata?.shareImage?.alt ??
65
+ global.attributes.metadata.shareImage?.alt ??
66
+ DEFAULT_SHARE_ALT,
67
+ },
68
+ metaTitleSuffix: global.attributes.metaTitleSuffix,
69
+ favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),
70
+ },
71
+ slices: project.attributes.slices,
72
+ blogPosts,
73
+ banner: global.attributes.banner,
74
+ topBanner: project?.attributes.topBanner || global.attributes.topBanner,
75
+ customerStories: [],
76
+ };
77
+ };
78
+
79
+ export default mergeGlobalAndStrapiProject;
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import Locale from '../../models/Locale';
3
- export declare const IntlContext: React.Context<import("react-intl").IntlShape>;
4
- export interface ContextProviderProps {
5
- children: React.ReactNode;
6
- locale: Locale;
7
- }
8
- export declare const ContextProvider: React.FC<ContextProviderProps>;
@@ -1 +0,0 @@
1
- export { ContextProvider, IntlContext } from './ContextProvider';
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import CreditsAvailableState from '../../models/CreditsAvailableState';
3
- export interface CreditsAvailableBadgeProps {
4
- status: CreditsAvailableState;
5
- href?: string;
6
- }
7
- declare const CreditsAvailableBadge: ({ status, href, }: CreditsAvailableBadgeProps) => React.JSX.Element;
8
- export default CreditsAvailableBadge;
@@ -1,2 +0,0 @@
1
- import CreditsAvailableBadge from './CreditsAvailableBadge';
2
- export default CreditsAvailableBadge;
@@ -1,7 +0,0 @@
1
- declare const _default: {
2
- 'components.creditsAvailableBadge.text.yes': string;
3
- 'components.creditsAvailableBadge.text.some': string;
4
- 'components.creditsAvailableBadge.text.no': string;
5
- 'components.creditsAvailableBadge.text.notYet': string;
6
- };
7
- export default _default;
@@ -1,7 +0,0 @@
1
- declare const _default: {
2
- 'components.creditsAvailableBadge.text.yes': string;
3
- 'components.creditsAvailableBadge.text.some': string;
4
- 'components.creditsAvailableBadge.text.no': string;
5
- 'components.creditsAvailableBadge.text.notYet': string;
6
- };
7
- export default _default;
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import StrapiImage from '../../models/strapi/StrapiImage';
3
- export interface FullScreenImageProps {
4
- images: StrapiImage[];
5
- isOpen: boolean;
6
- onClose: () => void;
7
- openIndex?: number;
8
- }
9
- export declare const FullScreenImage: ({ images, isOpen, onClose, openIndex, }: FullScreenImageProps) => React.JSX.Element;
@@ -1,8 +0,0 @@
1
- import StrapiImage from '../../models/strapi/StrapiImage';
2
- import React from 'react';
3
- interface ZoomableImageProps {
4
- image: StrapiImage;
5
- zoom?: number;
6
- }
7
- declare const ZoomableImage: ({ image, zoom }: ZoomableImageProps) => React.JSX.Element;
8
- export default ZoomableImage;
@@ -1,2 +0,0 @@
1
- import { FullScreenImage } from './FullScreenImage';
2
- export default FullScreenImage;
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- interface MinimalProvidersProps {
3
- locale: string;
4
- children: JSX.Element | JSX.Element[];
5
- }
6
- declare const MinimalProviders: ({ children, locale }: MinimalProvidersProps) => React.JSX.Element;
7
- export default MinimalProviders;
@@ -1,2 +0,0 @@
1
- import MinimalProviders from './MinimalProviders';
2
- export default MinimalProviders;
@@ -1,19 +0,0 @@
1
- /// <reference types="react" />
2
- import StrapiBlogPost from '../../models/strapi/StrapiBlogPost';
3
- import IStrapiData from '../../models/strapi/IStrapiData';
4
- import PortfolioProject from '../../models/PortfolioProject';
5
- import StrapiCustomerStory from '../../models/strapi/StrapiCustomerStory';
6
- import Locale from '../../models/Locale';
7
- export interface CustomSliceProps {
8
- slice: any;
9
- id: string;
10
- }
11
- export interface SliceRendererProps {
12
- slices: any;
13
- blogPosts: IStrapiData<StrapiBlogPost>[];
14
- projects: PortfolioProject[];
15
- customerStories: IStrapiData<StrapiCustomerStory>[];
16
- locale?: Locale;
17
- CustomSlice?: ({ slice, id }: CustomSliceProps) => JSX.Element;
18
- }
19
- export declare const SliceRenderer: ({ slices, blogPosts, projects, customerStories, locale, CustomSlice, }: SliceRendererProps) => JSX.Element;
@@ -1 +0,0 @@
1
- export { SliceRenderer } from './SliceRenderer';
@@ -1,18 +0,0 @@
1
- import React from 'react';
2
- import StrapiLink from '../../models/strapi/StrapiLink';
3
- export interface StrapiLinkButtonProps {
4
- link: StrapiLink;
5
- size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
6
- variant?: 'solid' | 'outline' | 'outlineWhite' | 'link' | 'ghost';
7
- colorScheme?: 'primary' | 'gray' | 'orange' | 'green' | 'white';
8
- rightIcon?: JSX.Element;
9
- leftIcon?: JSX.Element;
10
- mt?: any;
11
- mr?: any;
12
- mb?: any;
13
- ml?: any;
14
- mx?: any;
15
- my?: any;
16
- background?: string;
17
- }
18
- export declare const StrapiLinkButton: React.FC<StrapiLinkButtonProps>;
@@ -1,2 +0,0 @@
1
- import { StrapiLinkButton } from './StrapiLinkButton';
2
- export default StrapiLinkButton;
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import StrapiLinkWithIcon from '../../models/strapi/StrapiLinkWithIcon';
3
- import { StrapiLinkButtonProps } from '../StrapiLinkButton/StrapiLinkButton';
4
- export interface StrapiLinkButtonWithIconProps extends Omit<StrapiLinkButtonProps, 'link'> {
5
- link: StrapiLinkWithIcon;
6
- }
7
- export declare const StrapiLinkButtonWithIcon: React.FC<StrapiLinkButtonWithIconProps>;
@@ -1,2 +0,0 @@
1
- import { StrapiLinkButtonWithIcon } from './StrapiLinkButtonWithIcon';
2
- export default StrapiLinkButtonWithIcon;
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- import StrapiImage from '../../../models/strapi/StrapiImage';
3
- import StrapiLink from '../../../models/strapi/StrapiLink';
4
- export interface ContactProps {
5
- avatar?: StrapiImage;
6
- title?: string;
7
- text?: string;
8
- button?: StrapiLink;
9
- }
10
- export declare const Contact: React.FC<ContactProps>;
@@ -1,2 +0,0 @@
1
- import { Contact } from './Contact';
2
- export default Contact;
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import StrapiLink from '../../../models/strapi/StrapiLink';
3
- export interface DocumentsDownloadListProps {
4
- documentUrls: StrapiLink[];
5
- }
6
- export declare const DocumentsDownloadList: React.FC<DocumentsDownloadListProps>;
@@ -1,2 +0,0 @@
1
- import { DocumentsDownloadList } from './DocumentsDownloadList';
2
- export default DocumentsDownloadList;
@@ -1,5 +0,0 @@
1
- declare const _default: {
2
- 'features.portfolio.documentsDownloadList.projectDocuments': string;
3
- 'features.portfolio.documentsDownloadList.downloadDocument': string;
4
- };
5
- export default _default;
@@ -1,5 +0,0 @@
1
- declare const _default: {
2
- 'features.portfolio.documentsDownloadList.projectDocuments': string;
3
- 'features.portfolio.documentsDownloadList.downloadDocument': string;
4
- };
5
- export default _default;
@@ -1,18 +0,0 @@
1
- import React from 'react';
2
- import PortfolioProject from '../../../models/PortfolioProject';
3
- export interface ProjectInfoProps {
4
- project: PortfolioProject;
5
- subtitles: {
6
- areaSubtitle?: string;
7
- locationSubtitle?: string;
8
- startSubtitle?: string;
9
- timeSpanSubtitle?: string;
10
- projectTypeSubtitle?: string;
11
- projectDeveloperSubtitle?: string;
12
- verificationStandardSubtitle?: string;
13
- forecastedAmountSubtitle?: string;
14
- riskBufferSubtitle?: string;
15
- buyCreditsSubtitle?: string;
16
- };
17
- }
18
- export declare const ProjectInfo: React.FC<ProjectInfoProps>;
@@ -1,2 +0,0 @@
1
- import { ProjectInfo } from './ProjectInfo';
2
- export default ProjectInfo;
@@ -1,15 +0,0 @@
1
- declare const _default: {
2
- 'features.projectInfo.projectInfo.value': string;
3
- 'features.projectInfo.properties.area': string;
4
- 'features.projectInfo.properties.location': string;
5
- 'features.projectInfo.properties.start': string;
6
- 'features.projectInfo.properties.timeSpan': string;
7
- 'features.projectInfo.properties.projectType': string;
8
- 'features.projectInfo.properties.projectDeveloper': string;
9
- 'features.projectInfo.properties.verificationStandard.label': string;
10
- 'features.projectInfo.properties.verificationStandard.value.SilvaconsultFCSISO14': string;
11
- 'features.projectInfo.properties.forecastedAmountYear.label': string;
12
- 'features.projectInfo.properties.riskBuffer': string;
13
- 'features.projectInfo.properties.year': string;
14
- };
15
- export default _default;
@@ -1,15 +0,0 @@
1
- declare const _default: {
2
- 'features.projectInfo.projectInfo.value': string;
3
- 'features.projectInfo.properties.area': string;
4
- 'features.projectInfo.properties.location': string;
5
- 'features.projectInfo.properties.start': string;
6
- 'features.projectInfo.properties.timeSpan': string;
7
- 'features.projectInfo.properties.projectType': string;
8
- 'features.projectInfo.properties.projectDeveloper': string;
9
- 'features.projectInfo.properties.verificationStandard.label': string;
10
- 'features.projectInfo.properties.verificationStandard.value.SilvaconsultFCSISO14': string;
11
- 'features.projectInfo.properties.forecastedAmountYear.label': string;
12
- 'features.projectInfo.properties.riskBuffer': string;
13
- 'features.projectInfo.properties.year': string;
14
- };
15
- export default _default;
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
- import StrapiLink from '../../../models/strapi/StrapiLink';
3
- export interface SmallCheckoutProps {
4
- batchId: string;
5
- pricePerKg: number;
6
- initialContributionValue: number;
7
- checkoutText?: string;
8
- currency: 'EUR' | 'CHF';
9
- title?: string;
10
- subtitle?: string;
11
- button?: StrapiLink;
12
- }
13
- declare const SmallCheckout: ({ pricePerKg, currency, batchId, initialContributionValue, checkoutText, title, subtitle, button, }: SmallCheckoutProps) => React.JSX.Element;
14
- export default SmallCheckout;
@@ -1,2 +0,0 @@
1
- import SmallCheckout from './SmallCheckout';
2
- export default SmallCheckout;
@@ -1,16 +0,0 @@
1
- declare const _default: {
2
- 'portfolio.smallCheckout.contributionValueCurrency.label.CHF': string;
3
- 'portfolio.smallCheckout.contributionValueCurrency.label.EUR': string;
4
- 'portfolio.smallCheckout.contributionValueCurrency.unit.EUR': string;
5
- 'portfolio.smallCheckout.contributionValueCurrency.unit.CHF': string;
6
- 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.CHF': string;
7
- 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.EUR': string;
8
- 'portfolio.smallCheckout.contributionValueCurrency.validation.empty': string;
9
- 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh': string;
10
- 'portfolio.smallCheckout.contributionValueKgs.label': string;
11
- 'portfolio.smallCheckout.submitButton': string;
12
- 'portfolio.smallCheckout.cta.title': string;
13
- 'portfolio.smallCheckout.cta.subTitle': string;
14
- 'portfolio.smallCheckout.cta.button': string;
15
- };
16
- export default _default;
@@ -1,16 +0,0 @@
1
- declare const _default: {
2
- 'portfolio.smallCheckout.contributionValueCurrency.label.CHF': string;
3
- 'portfolio.smallCheckout.contributionValueCurrency.label.EUR': string;
4
- 'portfolio.smallCheckout.contributionValueCurrency.unit.EUR': string;
5
- 'portfolio.smallCheckout.contributionValueCurrency.unit.CHF': string;
6
- 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.CHF': string;
7
- 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.EUR': string;
8
- 'portfolio.smallCheckout.contributionValueCurrency.validation.empty': string;
9
- 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh': string;
10
- 'portfolio.smallCheckout.contributionValueKgs.label': string;
11
- 'portfolio.smallCheckout.submitButton': string;
12
- 'portfolio.smallCheckout.cta.title': string;
13
- 'portfolio.smallCheckout.cta.subTitle': string;
14
- 'portfolio.smallCheckout.cta.button': string;
15
- };
16
- export default _default;
@@ -1 +0,0 @@
1
- export declare const MEDIUM_TRANSITION_DURATION = 0.2;
@@ -1,3 +0,0 @@
1
- export declare const API_URI: string;
2
- export declare const FPM_API_URI: string;
3
- export declare const CDN_URI = "https://cdn.tree.ly";
@@ -1,8 +0,0 @@
1
- export declare const BREAKPOINT_SM = "320px";
2
- export declare const BREAKPOINT_MD = "768px";
3
- export declare const BREAKPOINT_LG = "960px";
4
- export declare const BREAKPOINT_XL = "1200px";
5
- export declare const BREAKPOINT_SM_QUERY = "(max-width: 320px)";
6
- export declare const BREAKPOINT_MD_QUERY = "(max-width: 768px)";
7
- export declare const BREAKPOINT_LG_QUERY = "(max-width: 960px)";
8
- export declare const BREAKPOINT_XL_QUERY = "(max-width: 1200px)";
@@ -1,2 +0,0 @@
1
- export declare const MINIMUM_CONTRIBUTION_VALUE_IN_MONEY = 10;
2
- export declare const MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY = 60000;
@@ -1,6 +0,0 @@
1
- export declare const FONT_CUSTOMIZATIONS: {
2
- body: string;
3
- heading: string;
4
- display: string;
5
- mono: string;
6
- };
@@ -1,6 +0,0 @@
1
- import { FormatNumberOptions } from 'react-intl';
2
- export declare const FORMAT_AS_EUR_CONFIG: FormatNumberOptions;
3
- export declare const FORMAT_AS_METER_CONFIG: FormatNumberOptions;
4
- export declare const FORMAT_AS_HECTARE_CONFIG: FormatNumberOptions;
5
- export declare const FORMAT_AS_CUBIC_METERS_PER_HECTARE_CONFIG: FormatNumberOptions;
6
- export declare const FORMAT_AS_PERCENT_CONFIG: FormatNumberOptions;
@@ -1 +0,0 @@
1
- export declare const GLOBAL_STYLE: import("@emotion/utils").SerializedStyles;