@salesforcedevs/dx-components 0.26.1-alpha0.5 → 0.26.3

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 (324) hide show
  1. package/LICENSE +12 -0
  2. package/lwc.config.json +1 -1
  3. package/package.json +3 -8
  4. package/src/assets/icons/action-sprite/svg/symbols.svg +1 -0
  5. package/src/assets/icons/brand-sprite/svg/symbols.svg +1381 -0
  6. package/src/assets/icons/custom-sprite/svg/symbols.svg +1 -0
  7. package/src/assets/icons/doctype-sprite/svg/symbols.svg +1 -0
  8. package/src/assets/icons/general-sprite/svg/symbols.svg +3013 -0
  9. package/src/assets/icons/salesforcebrand-sprite/svg/symbols.svg +257 -0
  10. package/src/assets/icons/standard-sprite/svg/symbols.svg +1 -0
  11. package/src/assets/icons/utility-sprite/svg/symbols.svg +1 -0
  12. package/src/assets/svg/card-news-learn-moar.svg +415 -0
  13. package/src/assets/svg/cloud-1.svg +24 -0
  14. package/src/assets/svg/cloud-2.svg +18 -0
  15. package/src/assets/svg/codey.svg +93 -0
  16. package/src/assets/svg/command.svg +9 -0
  17. package/src/assets/svg/control.svg +10 -0
  18. package/src/assets/svg/docs-empty-state-small.svg +72 -0
  19. package/src/assets/svg/docs-empty-state.svg +86 -0
  20. package/src/assets/svg/dsc-home-news-bear.svg +3 -0
  21. package/src/assets/svg/dsc-home-news-community.png +0 -0
  22. package/src/assets/svg/dsc-home-news-goatbear.svg +257 -0
  23. package/src/assets/svg/dsc-home-news-samplegallery.svg +76 -0
  24. package/src/assets/svg/empty-state-assistant.svg +1 -0
  25. package/src/assets/svg/fch-blog-cloud-1.png +0 -0
  26. package/src/assets/svg/fch-blog-cloud-2.png +0 -0
  27. package/src/assets/svg/fch-blog-planet.png +0 -0
  28. package/src/assets/svg/feature-backdrop1.svg +10 -0
  29. package/src/assets/svg/feature-backdrop2.svg +10 -0
  30. package/src/assets/svg/featured-demo-art-blank.svg +76 -0
  31. package/src/assets/svg/featured-demo-art-eBikes.svg +77 -0
  32. package/src/assets/svg/footer-graphic-large.svg +207 -0
  33. package/src/assets/svg/footer-graphic-mountains-small.svg +17 -0
  34. package/src/assets/svg/footer-graphic-mountains.svg +21 -0
  35. package/src/assets/svg/footer-graphic-trees-small.svg +33 -0
  36. package/src/assets/svg/footer-graphic-trees.svg +62 -0
  37. package/src/assets/svg/lake-mountain.svg +79 -0
  38. package/src/assets/svg/podcast-subscription-clouds-small.svg +49 -0
  39. package/src/assets/svg/podcast-subscription-clouds.svg +57 -0
  40. package/src/assets/svg/podcasts-subscription-apple.svg +164 -0
  41. package/src/assets/svg/podcasts-subscription-google.svg +29 -0
  42. package/src/assets/svg/podcasts-subscription-spotify.svg +11 -0
  43. package/src/assets/svg/salesforce-cloud.svg +7 -0
  44. package/src/assets/svg/salesforce-logo-corporate.svg +21 -0
  45. package/src/assets/svg/salesforce-logo.svg +14 -0
  46. package/src/assets/svg/sidebar-loading.svg +34 -0
  47. package/src/assets/svg/slack-cta-podcast-background-left.svg +28 -0
  48. package/src/assets/svg/slack-cta-podcast-background-right.svg +38 -0
  49. package/src/assets/svg/trees.svg +42 -0
  50. package/src/modules/base-elements/archiveCard/archiveCard.ts +35 -0
  51. package/src/modules/base-elements/headerBase/headerBase.ts +204 -0
  52. package/src/modules/dx/banner/banner.css +46 -0
  53. package/src/modules/dx/banner/banner.html +13 -0
  54. package/src/modules/dx/banner/banner.ts +14 -0
  55. package/src/modules/dx/brandThemeProvider/brandCssVars.ts +10 -0
  56. package/src/modules/dx/brandThemeProvider/brandThemeProvider.html +3 -0
  57. package/src/modules/dx/brandThemeProvider/brandThemeProvider.ts +46 -0
  58. package/src/modules/dx/breadcrumbs/breadcrumbs.css +111 -0
  59. package/src/modules/dx/breadcrumbs/breadcrumbs.html +44 -0
  60. package/src/modules/dx/breadcrumbs/breadcrumbs.ts +122 -0
  61. package/src/modules/dx/button/button.css +175 -0
  62. package/src/modules/dx/button/button.html +43 -0
  63. package/src/modules/dx/button/button.ts +63 -0
  64. package/src/modules/dx/cardBlogPost/cardBlogPost.css +13 -0
  65. package/src/modules/dx/cardBlogPost/cardBlogPost.html +24 -0
  66. package/src/modules/dx/cardBlogPost/cardBlogPost.ts +23 -0
  67. package/src/modules/dx/cardBlogPostProvider/cardBlogPostProvider.css +3 -0
  68. package/src/modules/dx/cardBlogPostProvider/cardBlogPostProvider.html +16 -0
  69. package/src/modules/dx/cardBlogPostProvider/cardBlogPostProvider.ts +29 -0
  70. package/src/modules/dx/cardCallout/cardCallout.css +57 -0
  71. package/src/modules/dx/cardCallout/cardCallout.html +15 -0
  72. package/src/modules/dx/cardCallout/cardCallout.ts +37 -0
  73. package/src/modules/dx/cardContent/cardContent.css +52 -0
  74. package/src/modules/dx/cardContent/cardContent.html +59 -0
  75. package/src/modules/dx/cardContent/cardContent.ts +68 -0
  76. package/src/modules/dx/cardDemo/cardDemo.css +1 -0
  77. package/src/modules/dx/cardDemo/cardDemo.html +12 -0
  78. package/src/modules/dx/cardDemo/cardDemo.ts +11 -0
  79. package/src/modules/dx/cardDocs/cardDocs.css +50 -0
  80. package/src/modules/dx/cardDocs/cardDocs.html +20 -0
  81. package/src/modules/dx/cardDocs/cardDocs.ts +30 -0
  82. package/src/modules/dx/cardEvent/cardEvent.css +107 -0
  83. package/src/modules/dx/cardEvent/cardEvent.html +94 -0
  84. package/src/modules/dx/cardEvent/cardEvent.ts +42 -0
  85. package/src/modules/dx/cardExpanded/cardExpanded.css +49 -0
  86. package/src/modules/dx/cardExpanded/cardExpanded.html +37 -0
  87. package/src/modules/dx/cardExpanded/cardExpanded.ts +45 -0
  88. package/src/modules/dx/cardGrid/cardGrid.css +89 -0
  89. package/src/modules/dx/cardGrid/cardGrid.html +46 -0
  90. package/src/modules/dx/cardGrid/cardGrid.ts +140 -0
  91. package/src/modules/dx/cardMinimal/cardMinimal.css +31 -0
  92. package/src/modules/dx/cardMinimal/cardMinimal.html +13 -0
  93. package/src/modules/dx/cardMinimal/cardMinimal.ts +3 -0
  94. package/src/modules/dx/cardNews/cardNews.css +159 -0
  95. package/src/modules/dx/cardNews/cardNews.html +37 -0
  96. package/src/modules/dx/cardNews/cardNews.ts +62 -0
  97. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.css +19 -0
  98. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.html +36 -0
  99. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.ts +36 -0
  100. package/src/modules/dx/cardPodcastEpisodeProvider/cardPodcastEpisodeProvider.css +3 -0
  101. package/src/modules/dx/cardPodcastEpisodeProvider/cardPodcastEpisodeProvider.html +12 -0
  102. package/src/modules/dx/cardPodcastEpisodeProvider/cardPodcastEpisodeProvider.ts +29 -0
  103. package/src/modules/dx/cardSmall/cardSmall.css +32 -0
  104. package/src/modules/dx/cardSmall/cardSmall.html +42 -0
  105. package/src/modules/dx/cardSmall/cardSmall.ts +38 -0
  106. package/src/modules/dx/cardTitle/cardTitle.css +41 -0
  107. package/src/modules/dx/cardTitle/cardTitle.html +20 -0
  108. package/src/modules/dx/cardTitle/cardTitle.ts +27 -0
  109. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.css +24 -0
  110. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.html +20 -0
  111. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.ts +18 -0
  112. package/src/modules/dx/cardVideoPreview/cardVideoPreview.css +14 -0
  113. package/src/modules/dx/cardVideoPreview/cardVideoPreview.html +26 -0
  114. package/src/modules/dx/cardVideoPreview/cardVideoPreview.ts +13 -0
  115. package/src/modules/dx/checkbox/checkbox.css +168 -0
  116. package/src/modules/dx/checkbox/checkbox.html +26 -0
  117. package/src/modules/dx/checkbox/checkbox.ts +55 -0
  118. package/src/modules/dx/checkboxGroup/checkboxGroup.css +12 -0
  119. package/src/modules/dx/checkboxGroup/checkboxGroup.html +15 -0
  120. package/src/modules/dx/checkboxGroup/checkboxGroup.ts +77 -0
  121. package/src/modules/dx/codeBlock/codeBlock.css +128 -0
  122. package/src/modules/dx/codeBlock/codeBlock.html +79 -0
  123. package/src/modules/dx/codeBlock/codeBlock.ts +215 -0
  124. package/src/modules/dx/codeBlock/darkTheme.css +88 -0
  125. package/src/modules/dx/codeBlock/lightTheme.css +72 -0
  126. package/src/modules/dx/dropdown/dropdown.css +93 -0
  127. package/src/modules/dx/dropdown/dropdown.html +67 -0
  128. package/src/modules/dx/dropdown/dropdown.ts +182 -0
  129. package/src/modules/dx/dropdownOption/dropdownOption.css +61 -0
  130. package/src/modules/dx/dropdownOption/dropdownOption.html +53 -0
  131. package/src/modules/dx/dropdownOption/dropdownOption.ts +39 -0
  132. package/src/modules/dx/emptyState/emptyState.css +64 -0
  133. package/src/modules/dx/emptyState/emptyState.html +9 -0
  134. package/src/modules/dx/emptyState/emptyState.ts +20 -0
  135. package/src/modules/dx/feature/feature.css +135 -0
  136. package/src/modules/dx/feature/feature.html +33 -0
  137. package/src/modules/dx/feature/feature.ts +34 -0
  138. package/src/modules/dx/featureGrid/featureGrid.html +3 -0
  139. package/src/modules/dx/featureGrid/featureGrid.ts +15 -0
  140. package/src/modules/dx/featuredContentHeader/featuredContentHeader.css +469 -0
  141. package/src/modules/dx/featuredContentHeader/featuredContentHeader.html +96 -0
  142. package/src/modules/dx/featuredContentHeader/featuredContentHeader.ts +113 -0
  143. package/src/modules/dx/featuredContentHeader/svgs.ts +35 -0
  144. package/src/modules/dx/featuresList/featuresList.css +24 -0
  145. package/src/modules/dx/featuresList/featuresList.html +20 -0
  146. package/src/modules/dx/featuresList/featuresList.ts +21 -0
  147. package/src/modules/dx/footer/footer.css +405 -0
  148. package/src/modules/dx/footer/footer.html +145 -0
  149. package/src/modules/dx/footer/footer.ts +124 -0
  150. package/src/modules/dx/footer/links.ts +140 -0
  151. package/src/modules/dx/footerOption/footerOption.css +4 -0
  152. package/src/modules/dx/footerOption/footerOption.html +12 -0
  153. package/src/modules/dx/footerOption/footerOption.ts +19 -0
  154. package/src/modules/dx/formattedDateTime/formattedDateTime.html +1 -0
  155. package/src/modules/dx/formattedDateTime/formattedDateTime.ts +72 -0
  156. package/src/modules/dx/grid/grid.css +48 -0
  157. package/src/modules/dx/grid/grid.html +3 -0
  158. package/src/modules/dx/grid/grid.md +14 -0
  159. package/src/modules/dx/grid/grid.ts +72 -0
  160. package/src/modules/dx/groupBio/groupBio.css +49 -0
  161. package/src/modules/dx/groupBio/groupBio.html +29 -0
  162. package/src/modules/dx/groupBio/groupBio.ts +41 -0
  163. package/src/modules/dx/groupText/groupText.css +119 -0
  164. package/src/modules/dx/groupText/groupText.html +65 -0
  165. package/src/modules/dx/groupText/groupText.ts +93 -0
  166. package/src/modules/dx/headTags/headTags.html +3 -0
  167. package/src/modules/dx/headTags/headTags.ts +39 -0
  168. package/src/modules/dx/header/__benchmarks__/header.benchmark.js +45 -0
  169. package/src/modules/dx/header/header.css +109 -0
  170. package/src/modules/dx/header/header.html +129 -0
  171. package/src/modules/dx/header/header.ts +27 -0
  172. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.css +160 -0
  173. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.html +73 -0
  174. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.ts +102 -0
  175. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.css +5 -0
  176. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.html +14 -0
  177. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.ts +20 -0
  178. package/src/modules/dx/headerNav/headerNav.css +31 -0
  179. package/src/modules/dx/headerNav/headerNav.html +48 -0
  180. package/src/modules/dx/headerNav/headerNav.ts +56 -0
  181. package/src/modules/dx/headerSearch/headerSearch.css +62 -0
  182. package/src/modules/dx/headerSearch/headerSearch.html +64 -0
  183. package/src/modules/dx/headerSearch/headerSearch.ts +159 -0
  184. package/src/modules/dx/helmet/helmet.css +83 -0
  185. package/src/modules/dx/helmet/helmet.html +39 -0
  186. package/src/modules/dx/helmet/helmet.ts +27 -0
  187. package/src/modules/dx/hr/hr.css +55 -0
  188. package/src/modules/dx/hr/hr.html +23 -0
  189. package/src/modules/dx/hr/hr.ts +45 -0
  190. package/src/modules/dx/icon/icon.css +14 -0
  191. package/src/modules/dx/icon/icon.html +11 -0
  192. package/src/modules/dx/icon/icon.ts +85 -0
  193. package/src/modules/dx/iconBadge/iconBadge.css +40 -0
  194. package/src/modules/dx/iconBadge/iconBadge.html +10 -0
  195. package/src/modules/dx/iconBadge/iconBadge.ts +42 -0
  196. package/src/modules/dx/imageAndLabel/imageAndLabel.css +54 -0
  197. package/src/modules/dx/imageAndLabel/imageAndLabel.html +22 -0
  198. package/src/modules/dx/imageAndLabel/imageAndLabel.ts +16 -0
  199. package/src/modules/dx/input/input.css +165 -0
  200. package/src/modules/dx/input/input.html +58 -0
  201. package/src/modules/dx/input/input.ts +238 -0
  202. package/src/modules/dx/input/validators.ts +5 -0
  203. package/src/modules/dx/instrumentation/instrumentation.html +1 -0
  204. package/src/modules/dx/instrumentation/instrumentation.ts +116 -0
  205. package/src/modules/dx/interactiveImage/interactiveImage.css +59 -0
  206. package/src/modules/dx/interactiveImage/interactiveImage.html +32 -0
  207. package/src/modules/dx/interactiveImage/interactiveImage.ts +71 -0
  208. package/src/modules/dx/lazy/lazy.html +5 -0
  209. package/src/modules/dx/lazy/lazy.ts +163 -0
  210. package/src/modules/dx/logo/logo.css +33 -0
  211. package/src/modules/dx/logo/logo.html +6 -0
  212. package/src/modules/dx/logo/logo.ts +8 -0
  213. package/src/modules/dx/newsletterForm/newsletterForm.css +73 -0
  214. package/src/modules/dx/newsletterForm/newsletterForm.html +73 -0
  215. package/src/modules/dx/newsletterForm/newsletterForm.ts +238 -0
  216. package/src/modules/dx/pagination/pagination.css +51 -0
  217. package/src/modules/dx/pagination/pagination.html +45 -0
  218. package/src/modules/dx/pagination/pagination.ts +93 -0
  219. package/src/modules/dx/podcastHost/podcastHost.css +62 -0
  220. package/src/modules/dx/podcastHost/podcastHost.html +28 -0
  221. package/src/modules/dx/podcastHost/podcastHost.ts +13 -0
  222. package/src/modules/dx/podcastPlayer/podcastPlayer.css +10 -0
  223. package/src/modules/dx/podcastPlayer/podcastPlayer.html +3 -0
  224. package/src/modules/dx/podcastPlayer/podcastPlayer.ts +5 -0
  225. package/src/modules/dx/podcastSubscription/podcastSubscription.css +91 -0
  226. package/src/modules/dx/podcastSubscription/podcastSubscription.html +24 -0
  227. package/src/modules/dx/podcastSubscription/podcastSubscription.ts +58 -0
  228. package/src/modules/dx/popover/popover.css +63 -0
  229. package/src/modules/dx/popover/popover.html +16 -0
  230. package/src/modules/dx/popover/popover.ts +313 -0
  231. package/src/modules/dx/radioGroup/radioGroup.css +12 -0
  232. package/src/modules/dx/radioGroup/radioGroup.html +16 -0
  233. package/src/modules/dx/radioGroup/radioGroup.ts +65 -0
  234. package/src/modules/dx/relativeDateTime/relativeDateTime.html +3 -0
  235. package/src/modules/dx/relativeDateTime/relativeDateTime.ts +113 -0
  236. package/src/modules/dx/searchResults/coveo.css +18989 -0
  237. package/src/modules/dx/searchResults/searchResults.css +387 -0
  238. package/src/modules/dx/searchResults/searchResults.html +104 -0
  239. package/src/modules/dx/searchResults/searchResults.ts +186 -0
  240. package/src/modules/dx/section/section.css +130 -0
  241. package/src/modules/dx/section/section.html +66 -0
  242. package/src/modules/dx/section/section.ts +41 -0
  243. package/src/modules/dx/sectionSignup/sectionSignup.css +43 -0
  244. package/src/modules/dx/sectionSignup/sectionSignup.html +23 -0
  245. package/src/modules/dx/sectionSignup/sectionSignup.ts +44 -0
  246. package/src/modules/dx/select/select.css +44 -0
  247. package/src/modules/dx/select/select.html +60 -0
  248. package/src/modules/dx/select/select.ts +23 -0
  249. package/src/modules/dx/sidebar/sidebar.css +192 -0
  250. package/src/modules/dx/sidebar/sidebar.html +94 -0
  251. package/src/modules/dx/sidebar/sidebar.ts +255 -0
  252. package/src/modules/dx/sidebarOld/sidebarOld.css +160 -0
  253. package/src/modules/dx/sidebarOld/sidebarOld.html +70 -0
  254. package/src/modules/dx/sidebarOld/sidebarOld.ts +187 -0
  255. package/src/modules/dx/sidebarSearch/sidebarSearch.css +3 -0
  256. package/src/modules/dx/sidebarSearch/sidebarSearch.html +26 -0
  257. package/src/modules/dx/sidebarSearch/sidebarSearch.ts +437 -0
  258. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.css +36 -0
  259. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.html +14 -0
  260. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.ts +70 -0
  261. package/src/modules/dx/skipNavLink/skipNavLink.css +21 -0
  262. package/src/modules/dx/skipNavLink/skipNavLink.html +3 -0
  263. package/src/modules/dx/skipNavLink/skipNavLink.ts +3 -0
  264. package/src/modules/dx/slackCta/slackCta.css +47 -0
  265. package/src/modules/dx/slackCta/slackCta.html +17 -0
  266. package/src/modules/dx/slackCta/slackCta.ts +12 -0
  267. package/src/modules/dx/socials/socials.css +35 -0
  268. package/src/modules/dx/socials/socials.html +22 -0
  269. package/src/modules/dx/socials/socials.ts +81 -0
  270. package/src/modules/dx/spinner/spinner.css +750 -0
  271. package/src/modules/dx/spinner/spinner.html +6 -0
  272. package/src/modules/dx/spinner/spinner.ts +20 -0
  273. package/src/modules/dx/tab/tab.css +106 -0
  274. package/src/modules/dx/tab/tab.html +13 -0
  275. package/src/modules/dx/tab/tab.ts +52 -0
  276. package/src/modules/dx/toc/toc.css +94 -0
  277. package/src/modules/dx/toc/toc.html +28 -0
  278. package/src/modules/dx/toc/toc.ts +77 -0
  279. package/src/modules/dx/tooltip/microtip.css +269 -0
  280. package/src/modules/dx/tooltip/tooltip.css +36 -0
  281. package/src/modules/dx/tooltip/tooltip.html +5 -0
  282. package/src/modules/dx/tooltip/tooltip.ts +6 -0
  283. package/src/modules/dx/topics/topics.css +25 -0
  284. package/src/modules/dx/topics/topics.html +12 -0
  285. package/src/modules/dx/topics/topics.ts +25 -0
  286. package/src/modules/dx/tree/tree.css +5 -0
  287. package/src/modules/dx/tree/tree.html +11 -0
  288. package/src/modules/dx/tree/tree.ts +72 -0
  289. package/src/modules/dx/tree/treeHandler.ts +100 -0
  290. package/src/modules/dx/treeItem/treeItem.css +14 -0
  291. package/src/modules/dx/treeItem/treeItem.html +22 -0
  292. package/src/modules/dx/treeItem/treeItem.ts +110 -0
  293. package/src/modules/dx/treeTile/treeTile.css +190 -0
  294. package/src/modules/dx/treeTile/treeTile.html +27 -0
  295. package/src/modules/dx/treeTile/treeTile.ts +59 -0
  296. package/src/modules/dx/typeBadge/typeBadge.css +74 -0
  297. package/src/modules/dx/typeBadge/typeBadge.html +5 -0
  298. package/src/modules/dx/typeBadge/typeBadge.ts +65 -0
  299. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.css +12 -0
  300. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.html +11 -0
  301. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.ts +18 -0
  302. package/src/modules/helpers/animations/animations.css +15 -0
  303. package/src/modules/helpers/button/button.css +4 -0
  304. package/src/modules/helpers/card/card.css +258 -0
  305. package/src/modules/helpers/code/code.css +296 -0
  306. package/src/modules/helpers/commonHeader/commonHeader.css +130 -0
  307. package/src/modules/helpers/reset/reset.css +559 -0
  308. package/src/modules/helpers/sidebar/sidebar.css +21 -0
  309. package/src/modules/helpers/slds/slds.css +191 -0
  310. package/src/modules/helpers/table/table.css +110 -0
  311. package/src/modules/helpers/text/text.css +163 -0
  312. package/src/modules/utils/coveo/coveo.ts +70 -0
  313. package/src/modules/utils/css/css.ts +43 -0
  314. package/src/modules/utils/devices/devices.ts +1 -0
  315. package/src/modules/utils/highlight/highlight.ts +32 -0
  316. package/src/modules/utils/normalizers/normalizers.ts +91 -0
  317. package/src/modules/utils/options/options.ts +39 -0
  318. package/src/modules/utils/prismjs/prismjs.html +3 -0
  319. package/src/modules/utils/prismjs/prismjs.ts +3321 -0
  320. package/src/modules/utils/recentSearches/recentSearches.ts +57 -0
  321. package/src/modules/utils/regexps/regexps.ts +5 -0
  322. package/src/modules/utils/seo/seo.ts +4 -0
  323. package/src/modules/utils/slot/slot.ts +17 -0
  324. package/src/modules/utils/wordpress/wordpress.ts +13 -0
@@ -0,0 +1,71 @@
1
+ import { LightningElement, api } from "lwc";
2
+
3
+ // Extracts filename and extension from a file URL
4
+ const FILENAME_FROM_URL_REGEX = /(?=\w+\.\w{3,4}$).+/;
5
+ const EXTENSION_FROM_URL_REGEX = /\.([^.]*)$/;
6
+
7
+ export default class InteractiveImage extends LightningElement {
8
+ @api title!: string;
9
+ @api featuredSrc!: string;
10
+
11
+ @api
12
+ set downloadUrls(values: any) {
13
+ // Normalize input values
14
+ let urls;
15
+ if (typeof values === "string") {
16
+ if (values.startsWith("[")) {
17
+ urls = JSON.parse(values);
18
+ } else {
19
+ urls = [values];
20
+ }
21
+ } else {
22
+ urls = values;
23
+ }
24
+ // Ensure that we have some URLs
25
+ if (!urls || urls.length === 0) {
26
+ throw new Error(
27
+ `No download url found for interactive image with title "${this.title}"`
28
+ );
29
+ }
30
+ // Prepare download options with labels
31
+ this.urls = urls.map((url: string) => {
32
+ return {
33
+ label: this.getDownloadLabelFromUrl(url),
34
+ id: url
35
+ };
36
+ });
37
+ }
38
+ get downloadUrls() {
39
+ return this.urls;
40
+ }
41
+
42
+ private urls: { label: string; id: string }[] = [];
43
+
44
+ private get isSingleDownload() {
45
+ return this.urls.length === 1;
46
+ }
47
+
48
+ private get singleDownloadHref() {
49
+ return this.urls[0].id;
50
+ }
51
+
52
+ private get singleDownloadFilename() {
53
+ const pathParts = this.urls[0].id.match(FILENAME_FROM_URL_REGEX);
54
+ return pathParts ? pathParts[0] : "";
55
+ }
56
+
57
+ private get downloadButtonLabel() {
58
+ return this.isSingleDownload ? this.urls[0].label : "Download as...";
59
+ }
60
+
61
+ private handleDownloadOptionChange(event: CustomEvent) {
62
+ window.open(event.detail, "_blank");
63
+ }
64
+
65
+ private getDownloadLabelFromUrl(url: string): string {
66
+ const urlParts = url.match(EXTENSION_FROM_URL_REGEX);
67
+ return urlParts
68
+ ? `Download as ${urlParts[1].toUpperCase()}`
69
+ : "Download";
70
+ }
71
+ }
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <template if:true={renderSlot}>
3
+ <slot></slot>
4
+ </template>
5
+ </template>
@@ -0,0 +1,163 @@
1
+ import { LightningElement, api } from "lwc";
2
+
3
+ import { LazyMode } from "typings/custom";
4
+
5
+ /**
6
+ * Defines a fallback for BackgroundTasksAPI for browsers that doesn't support it.
7
+ * Currently BackgroundTasksAPI is supported by all major browsers
8
+ * except in Safari where it can be enabled in Experimental (WebKit) Features.
9
+ * See also: https://developer.mozilla.org/en-US/docs/Web/API/Background_Tasks_API
10
+ */
11
+ function defineBackgroundTasksAPI() {
12
+ // Fallback to using setTimeout
13
+ window.requestIdleCallback =
14
+ window.requestIdleCallback ||
15
+ function (handler: any) {
16
+ const startTime = Date.now();
17
+
18
+ return setTimeout(function () {
19
+ handler({
20
+ didTimeout: false,
21
+ timeRemaining: function () {
22
+ return Math.max(0, 50.0 - (Date.now() - startTime));
23
+ }
24
+ });
25
+ }, 1);
26
+ };
27
+ window.cancelIdleCallback =
28
+ window.cancelIdleCallback ||
29
+ function (id: any) {
30
+ clearTimeout(id);
31
+ };
32
+ }
33
+
34
+ export default class Lazy extends LightningElement {
35
+ @api mode: LazyMode = "idle";
36
+
37
+ // intersection mode api
38
+ @api rootId: string | undefined;
39
+ @api rootMargin: string = "0px";
40
+ @api threshold: number = 0;
41
+
42
+ @api
43
+ get placeholderSize() {
44
+ return this._placeholderSize;
45
+ }
46
+
47
+ set placeholderSize(value) {
48
+ this._placeholderSize = value;
49
+ }
50
+
51
+ /**
52
+ * 'rendered' marks the first call made to renderedCallback()
53
+ */
54
+ private rendered: boolean = false;
55
+ /**
56
+ * 'renderSlot' controls whether the dx-lazy slot contents get rendered
57
+ */
58
+ private renderSlot: boolean = false;
59
+ /**
60
+ * 'connectedCallbackCalled' marks the first call made to connectedCallback()
61
+ */
62
+ private connectedCallbackCalled: boolean = false;
63
+ /**
64
+ * The handle as returned by calling window.requestIdleCallback()
65
+ */
66
+ private idleCallbackHandle: any;
67
+ /**
68
+ * The Intersection Observer if instantiated, else undefined
69
+ */
70
+ private observer: IntersectionObserver | undefined;
71
+ /**
72
+ * The size of the placeholder for the lazy container in pixels
73
+ */
74
+ private _placeholderSize: number = 200;
75
+
76
+ constructor() {
77
+ super();
78
+ this.updateHostStyle();
79
+ }
80
+
81
+ connectedCallback() {
82
+ if (!this.connectedCallbackCalled) {
83
+ this.connectedCallbackCalled = true;
84
+ if (this.mode === "idle") {
85
+ defineBackgroundTasksAPI();
86
+ this.waitForIdle();
87
+ }
88
+ }
89
+ }
90
+
91
+ renderedCallback() {
92
+ if (!this.rendered) {
93
+ this.rendered = true;
94
+ if (this.mode === "intersection") {
95
+ this.observeIntersection();
96
+ }
97
+ }
98
+ }
99
+
100
+ disconnectedCallback() {
101
+ if (this.observer) {
102
+ this.observer.disconnect();
103
+ }
104
+ if (this.idleCallbackHandle) {
105
+ window.cancelIdleCallback(this.idleCallbackHandle);
106
+ }
107
+ }
108
+
109
+ private waitForIdle() {
110
+ this.idleCallbackHandle = window.requestIdleCallback(
111
+ this.idleCallback.bind(this),
112
+ { timeout: 1000 }
113
+ );
114
+ }
115
+
116
+ private idleCallback() {
117
+ this.doRender();
118
+ window.cancelIdleCallback(this.idleCallbackHandle);
119
+ }
120
+
121
+ private observeIntersection() {
122
+ let root = null; // root with a value of null means to use the viewport
123
+ if (this.rootId && typeof this.rootId === "string") {
124
+ root = document.querySelector(`#${this.rootId}`);
125
+ }
126
+ this.observer = new IntersectionObserver(
127
+ this.intersectionCallback.bind(this),
128
+ {
129
+ root,
130
+ rootMargin: this.rootMargin,
131
+ threshold: this.threshold
132
+ }
133
+ );
134
+ this.observer.observe(this.template.host);
135
+ }
136
+
137
+ private intersectionCallback(
138
+ entries: IntersectionObserverEntry[],
139
+ observer: IntersectionObserver
140
+ ) {
141
+ entries.forEach((entry: IntersectionObserverEntry) => {
142
+ if (entry.isIntersecting) {
143
+ this.doRender();
144
+ observer.disconnect();
145
+ }
146
+ });
147
+ }
148
+
149
+ private updateHostStyle() {
150
+ if (this.renderSlot) {
151
+ this.template.host.style.display = "";
152
+ this.template.host.style.minHeight = "";
153
+ } else {
154
+ this.template.host.style.display = "block";
155
+ this.template.host.style.minHeight = `${this._placeholderSize}px`;
156
+ }
157
+ }
158
+
159
+ private doRender() {
160
+ this.renderSlot = true;
161
+ this.updateHostStyle();
162
+ }
163
+ }
@@ -0,0 +1,33 @@
1
+ @import "helpers/reset";
2
+ @import "helpers/text";
3
+
4
+ :host {
5
+ --dx-c-logo-label-color: var(--dx-g-blue-vibrant-20);
6
+
7
+ flex-shrink: 0;
8
+ }
9
+
10
+ a {
11
+ transition: var(--dx-g-transition-hue-1x);
12
+ display: flex;
13
+ align-items: center;
14
+ }
15
+
16
+ a:hover {
17
+ color: var(--dx-g-blue-vibrant-40);
18
+ }
19
+
20
+ .logo-link {
21
+ flex-shrink: 0;
22
+ margin-right: var(--dx-g-spacing-xs);
23
+ }
24
+
25
+ .logo-link > span {
26
+ margin-top: 3px;
27
+ color: var(--dx-c-logo-label-color);
28
+ }
29
+
30
+ .logo-link > img {
31
+ margin-right: var(--dx-g-spacing-sm);
32
+ width: 28px;
33
+ }
@@ -0,0 +1,6 @@
1
+ <template>
2
+ <a href={href} class="logo-link">
3
+ <img src={imgSrc} alt={imgAlt} />
4
+ <span class="dx-text-heading-7">{label}</span>
5
+ </a>
6
+ </template>
@@ -0,0 +1,8 @@
1
+ import { LightningElement, api } from "lwc";
2
+
3
+ export default class Logo extends LightningElement {
4
+ @api href: string = "/";
5
+ @api imgSrc: string = "/assets/svg/salesforce-cloud.svg";
6
+ @api imgAlt: string = "Salesforce log";
7
+ @api label!: string;
8
+ }
@@ -0,0 +1,73 @@
1
+ @import "helpers/text";
2
+ @import "helpers/button";
3
+
4
+ :host {
5
+ --dx-g-text-base: 20px;
6
+ --dx-c-checkbox-text-line-height: 20px;
7
+ --dx-c-checkbox-align-label: flex-start;
8
+ --dx-c-checkbox-font-size: 14px;
9
+ --dx-c-checkbox-text-transform: none;
10
+ }
11
+
12
+ h4 {
13
+ font-size: 20px;
14
+ margin: 0 0 28px 0;
15
+ text-align: center;
16
+ }
17
+
18
+ dx-input,
19
+ dx-select {
20
+ display: block;
21
+ margin-top: 12px;
22
+ height: 77px;
23
+ }
24
+
25
+ dx-input {
26
+ --dx-c-input-width: 100%;
27
+ }
28
+
29
+ dx-checkbox:not(:first-child) {
30
+ margin-top: 12px;
31
+ }
32
+
33
+ dx-checkbox:last-of-type {
34
+ margin-bottom: 16px;
35
+ }
36
+
37
+ .form-submit {
38
+ background-color: var(--dx-g-blue-vibrant-50);
39
+ border: 2px solid var(--dx-g-blue-vibrant-50);
40
+ border-radius: 4px;
41
+ font-family: var(--dx-g-font-display);
42
+ font-size: 14px;
43
+ color: white;
44
+ height: 44px;
45
+ width: 100%;
46
+ margin-top: 20px;
47
+ }
48
+
49
+ .form-submit:hover {
50
+ background-color: var(--dx-g-blue-vibrant-40);
51
+ border-color: var(--dx-g-blue-vibrant-40);
52
+ cursor: pointer;
53
+ }
54
+
55
+ .legal-text {
56
+ font-size: 14px;
57
+ margin: 0 0 16px 0;
58
+ }
59
+
60
+ @media screen and (max-width: 360px) {
61
+ :host {
62
+ --dx-g-text-base: 16px;
63
+ --dx-c-checkbox-display: inline-block;
64
+ }
65
+
66
+ h4 {
67
+ font-size: 16px;
68
+ }
69
+
70
+ .form-submit {
71
+ margin-top: 0;
72
+ }
73
+ }
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <form
3
+ onsubmit={handleSubmit}
4
+ onchange={handleChange}
5
+ onkeydown={handleKeyDown}
6
+ >
7
+ <slot name="form-heading">
8
+ <h4 class="newsletter-form-heading dx-text-heading-8">
9
+ Sign up now to receive the newsletter.
10
+ </h4>
11
+ </slot>
12
+ <dx-input
13
+ name="fname"
14
+ value={firstName}
15
+ placeholder="Your first name"
16
+ label="First Name"
17
+ onchange={handleChange}
18
+ missing-error-message="Enter your first name"
19
+ validity-on-blur="true"
20
+ required="true"
21
+ ></dx-input>
22
+ <dx-input
23
+ name="lname"
24
+ value={lastName}
25
+ placeholder="Your last name"
26
+ label="Last Name"
27
+ onchange={handleChange}
28
+ missing-error-message="Enter your last name"
29
+ validity-on-blur="true"
30
+ required="true"
31
+ ></dx-input>
32
+ <dx-input
33
+ name="email"
34
+ type="email"
35
+ value={email}
36
+ placeholder="Your email address"
37
+ label="Email"
38
+ onchange={handleChange}
39
+ missing-error-message="Enter your email address"
40
+ validity-on-blur="true"
41
+ required="true"
42
+ ></dx-input>
43
+ <dx-select
44
+ name="country"
45
+ class="country-select"
46
+ label="Country"
47
+ onchange={handleChange}
48
+ placeholder="Select your Country"
49
+ message-when-value-missing="Select your country"
50
+ json-options={countries}
51
+ value={country}
52
+ required="true"
53
+ ></dx-select>
54
+ <template if:true={checkboxTextSet}>
55
+ <template if:true={showMarketingCheckbox}>
56
+ <dx-checkbox
57
+ class="marketing-checkbox"
58
+ value={marketingText}
59
+ label={marketingText}
60
+ ></dx-checkbox>
61
+ </template>
62
+ <p class="legal-text" lwc:dom="manual"></p>
63
+ <template if:true={showLegalCheckbox}>
64
+ <dx-checkbox
65
+ class="legal-checkbox"
66
+ value={legalText}
67
+ required="true"
68
+ ></dx-checkbox>
69
+ </template>
70
+ </template>
71
+ <button class="form-submit" type="submit">Subscribe Now</button>
72
+ </form>
73
+ </template>
@@ -0,0 +1,238 @@
1
+ import { LightningElement, api } from "lwc";
2
+ import { track } from "dx/instrumentation";
3
+ import { CountryOptions, CheckboxTextSet } from "typings/custom";
4
+
5
+ const ANALYTICS_INFO = {
6
+ itemTitle: "newsletter sign up submit",
7
+ formName: "newsletter",
8
+ formType: "newsletter",
9
+ method: "email",
10
+ destinationType: "internal",
11
+ clickText: "Subscribe Now",
12
+ clickUrl: "/newsletter/success",
13
+ elementType: "button",
14
+ ctaClick: true
15
+ };
16
+
17
+ export default class Form extends LightningElement {
18
+ @api checkboxTextSet: string = "";
19
+ @api countries: string = "";
20
+
21
+ private firstName: string = "";
22
+ private lastName: string = "";
23
+ private email: string = "";
24
+ private country: string = "";
25
+
26
+ private showLegalText: boolean = false;
27
+ private showLegalCheckbox: boolean = false;
28
+ private showMarketingCheckbox: boolean = false;
29
+ private legalText: string = "";
30
+ private marketingText: string | null = null;
31
+ private hasRendered: boolean = false;
32
+
33
+ renderedCallback() {
34
+ if (!this.hasRendered) {
35
+ // Focus the first input in the form
36
+ this.template.querySelector("dx-input")?.focus();
37
+
38
+ this.setInitialEmail();
39
+ this.hasRendered = true;
40
+ } else if (this.hasRendered && this.showLegalCheckbox) {
41
+ // Grab the legal checkbox and append the legal text as innerHTML (text has anchor links in it)
42
+ const legalCheckboxElement = this.template.querySelector(
43
+ "dx-checkbox.legal-checkbox"
44
+ );
45
+ const legalCheckboxSpan = document.createElement("span");
46
+ this.setInnerHtml(legalCheckboxSpan, this.legalText);
47
+
48
+ if (legalCheckboxElement) {
49
+ legalCheckboxElement.appendChild(legalCheckboxSpan);
50
+ }
51
+ }
52
+ }
53
+
54
+ handleKeyDown(e: KeyboardEvent) {
55
+ if (e.key === "Enter") {
56
+ this.handleSubmit(e);
57
+ }
58
+ }
59
+
60
+ handleChange(e: any) {
61
+ switch (e.target.name) {
62
+ case "fname":
63
+ this.firstName = e.target.value;
64
+ break;
65
+ case "lname":
66
+ this.lastName = e.target.value;
67
+ break;
68
+ case "email":
69
+ this.email = e.target.value;
70
+ break;
71
+ case "country":
72
+ this.country = e.target.value;
73
+ this.handleConsent(e.target);
74
+ break;
75
+ default:
76
+ break;
77
+ }
78
+ }
79
+
80
+ handleSubmit(e: Event) {
81
+ e.preventDefault();
82
+
83
+ const allFormElements = Array.from(
84
+ this.template.querySelectorAll("dx-input, dx-select, dx-checkbox")
85
+ );
86
+
87
+ const legalCheckboxElement = this.template.querySelector(
88
+ "dx-checkbox.legal-checkbox"
89
+ );
90
+
91
+ if (legalCheckboxElement) {
92
+ allFormElements.push(legalCheckboxElement);
93
+ }
94
+
95
+ const passed = !allFormElements
96
+ .map((formElement) => formElement.reportValidity())
97
+ .includes(false);
98
+
99
+ // All fields passed validation
100
+ if (passed) {
101
+ this.sendFormData();
102
+ }
103
+ }
104
+
105
+ setInitialEmail() {
106
+ // Set email if provided in the query param
107
+ const queryString = window.location.search;
108
+ const urlParams = new URLSearchParams(queryString);
109
+
110
+ const subscriberEmail = urlParams.get("subscriberEmail");
111
+
112
+ if (subscriberEmail) {
113
+ this.email = subscriberEmail;
114
+ }
115
+ }
116
+
117
+ getFormData() {
118
+ const marketingConsented = this.template.querySelector(
119
+ "dx-checkbox.marketing-checkbox"
120
+ )?.checked;
121
+ const date = new Date().toISOString();
122
+
123
+ return {
124
+ InfoEmail: marketingConsented ? true : false,
125
+ "First Name": this.firstName,
126
+ "Last Name": this.lastName,
127
+ Consent: marketingConsented
128
+ ? "Explicit"
129
+ : this.showMarketingCheckbox
130
+ ? ""
131
+ : "Implied",
132
+ "Email Status Update": date,
133
+ email: this.email,
134
+ Country: this.country,
135
+ "Privacy Policy": true,
136
+ referrer: "footer"
137
+ };
138
+ }
139
+
140
+ async sendFormData() {
141
+ const formData = this.getFormData();
142
+ const errorMsg = "Error while subscribing to newsletter";
143
+ const submitButtonEl = this.template.querySelector(".form-submit");
144
+
145
+ submitButtonEl.setAttribute("disabled", "true");
146
+ submitButtonEl.textContent = "...Processing request";
147
+
148
+ try {
149
+ const res = await fetch("/pages/pardot/footer_optin", {
150
+ method: "POST",
151
+ headers: {
152
+ "Content-Type": "application/json"
153
+ },
154
+ body: JSON.stringify(formData)
155
+ });
156
+
157
+ if (!res.ok) {
158
+ throw new Error(errorMsg);
159
+ }
160
+
161
+ const data = await res.json();
162
+
163
+ if (!data.success) {
164
+ throw new Error(errorMsg);
165
+ }
166
+
167
+ // GTM event
168
+ track(submitButtonEl, "custEv_formCompletion", ANALYTICS_INFO);
169
+
170
+ window.location.assign("/newsletter/success");
171
+ } catch (error) {
172
+ submitButtonEl.setAttribute("disabled", "false");
173
+ submitButtonEl.textContent = "Subscribe Now";
174
+ console.error(error);
175
+ }
176
+ }
177
+
178
+ handleConsent(countrySelectElement: any) {
179
+ if (this.checkboxTextSet) {
180
+ const countryOptions = countrySelectElement.jsonOptions.find(
181
+ (jsonOption) => jsonOption.value === countrySelectElement.value
182
+ );
183
+
184
+ this.setLegalAndMarketingData(countryOptions);
185
+ }
186
+ }
187
+
188
+ setLegalAndMarketingData(countryOptions: CountryOptions) {
189
+ // Parse the text sets for the checkbox info
190
+ const parsedCheckboxTextSet = JSON.parse(this.checkboxTextSet);
191
+
192
+ // Check for alternate text set or set to default
193
+ const checkboxTextSet = countryOptions.checkboxTextSet
194
+ ? parsedCheckboxTextSet[countryOptions.checkboxTextSet]
195
+ : parsedCheckboxTextSet.default;
196
+
197
+ // Set the checkbox text
198
+ this.setCheckboxTextSet(checkboxTextSet);
199
+
200
+ // Toggle visibility of legal/marketing data
201
+ this.toggleLegalAndMarketingVisibility(
202
+ countryOptions.showLegalText,
203
+ countryOptions.showLegalCheckbox,
204
+ countryOptions.showMarketingCheckbox
205
+ );
206
+
207
+ // Grab the legal text paragraph element and set inner html (this is due to text having html elements in the string)
208
+ const legalTextElement = this.template.querySelector(".legal-text");
209
+
210
+ if (legalTextElement && this.showLegalText) {
211
+ this.setInnerHtml(legalTextElement, this.legalText);
212
+ } else if (legalTextElement && !this.showLegalText) {
213
+ // Clear legal text
214
+ this.setInnerHtml(legalTextElement, "");
215
+ }
216
+ }
217
+
218
+ setCheckboxTextSet(checkboxTextSet: CheckboxTextSet) {
219
+ this.legalText = checkboxTextSet.legalText;
220
+ this.marketingText = checkboxTextSet.marketingText;
221
+ }
222
+
223
+ toggleLegalAndMarketingVisibility(
224
+ showLegalText: boolean,
225
+ showLegalCheckbox: boolean,
226
+ showMarketingCheckbox: boolean
227
+ ) {
228
+ this.showLegalText = showLegalText;
229
+ this.showLegalCheckbox = showLegalCheckbox;
230
+ this.showMarketingCheckbox = showMarketingCheckbox;
231
+ }
232
+
233
+ setInnerHtml(element: HTMLElement, value: string) {
234
+ // disable lwc warning because text received from json has HTML
235
+ // eslint-disable-next-line @lwc/lwc/no-inner-html
236
+ element.innerHTML = value;
237
+ }
238
+ }