@salesforcedevs/dx-components 0.26.1-alpha0.4 → 0.26.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 (533) hide show
  1. package/LICENSE +12 -0
  2. package/package.json +4 -5
  3. package/src/assets/icons/action-sprite/svg/symbols.svg +1 -0
  4. package/src/assets/icons/brand-sprite/svg/symbols.svg +1381 -0
  5. package/src/assets/icons/custom-sprite/svg/symbols.svg +1 -0
  6. package/src/assets/icons/doctype-sprite/svg/symbols.svg +1 -0
  7. package/src/assets/icons/general-sprite/svg/symbols.svg +3013 -0
  8. package/src/assets/icons/salesforcebrand-sprite/svg/symbols.svg +257 -0
  9. package/src/assets/icons/standard-sprite/svg/symbols.svg +1 -0
  10. package/src/assets/icons/utility-sprite/svg/symbols.svg +1 -0
  11. package/src/assets/svg/card-news-learn-moar.svg +415 -0
  12. package/src/assets/svg/cloud-1.svg +24 -0
  13. package/src/assets/svg/cloud-2.svg +18 -0
  14. package/src/assets/svg/codey.svg +93 -0
  15. package/src/assets/svg/command.svg +9 -0
  16. package/src/assets/svg/control.svg +10 -0
  17. package/src/assets/svg/docs-empty-state-small.svg +72 -0
  18. package/src/assets/svg/docs-empty-state.svg +86 -0
  19. package/src/assets/svg/dsc-home-news-bear.svg +3 -0
  20. package/src/assets/svg/dsc-home-news-community.png +0 -0
  21. package/src/assets/svg/dsc-home-news-goatbear.svg +257 -0
  22. package/src/assets/svg/dsc-home-news-samplegallery.svg +76 -0
  23. package/src/assets/svg/empty-state-assistant.svg +1 -0
  24. package/src/assets/svg/fch-blog-cloud-1.png +0 -0
  25. package/src/assets/svg/fch-blog-cloud-2.png +0 -0
  26. package/src/assets/svg/fch-blog-planet.png +0 -0
  27. package/src/assets/svg/feature-backdrop1.svg +10 -0
  28. package/src/assets/svg/feature-backdrop2.svg +10 -0
  29. package/src/assets/svg/featured-demo-art-blank.svg +76 -0
  30. package/src/assets/svg/featured-demo-art-eBikes.svg +77 -0
  31. package/src/assets/svg/footer-graphic-large.svg +207 -0
  32. package/src/assets/svg/footer-graphic-mountains-small.svg +17 -0
  33. package/src/assets/svg/footer-graphic-mountains.svg +21 -0
  34. package/src/assets/svg/footer-graphic-trees-small.svg +33 -0
  35. package/src/assets/svg/footer-graphic-trees.svg +62 -0
  36. package/src/assets/svg/lake-mountain.svg +79 -0
  37. package/src/assets/svg/podcast-subscription-clouds-small.svg +49 -0
  38. package/src/assets/svg/podcast-subscription-clouds.svg +57 -0
  39. package/src/assets/svg/podcasts-subscription-apple.svg +164 -0
  40. package/src/assets/svg/podcasts-subscription-google.svg +29 -0
  41. package/src/assets/svg/podcasts-subscription-spotify.svg +11 -0
  42. package/src/assets/svg/salesforce-cloud.svg +7 -0
  43. package/src/assets/svg/salesforce-logo-corporate.svg +21 -0
  44. package/src/assets/svg/salesforce-logo.svg +14 -0
  45. package/src/assets/svg/sidebar-loading.svg +34 -0
  46. package/src/assets/svg/slack-cta-podcast-background-left.svg +28 -0
  47. package/src/assets/svg/slack-cta-podcast-background-right.svg +38 -0
  48. package/src/assets/svg/trees.svg +42 -0
  49. package/src/modules/dx/banner/__tests__/banner.test.ts +33 -0
  50. package/src/modules/dx/banner/banner.css +46 -0
  51. package/src/modules/dx/banner/banner.html +13 -0
  52. package/src/modules/dx/banner/banner.ts +14 -0
  53. package/src/modules/dx/brandThemeProvider/__tests__/brandThemeProvider.test.ts +49 -0
  54. package/src/modules/dx/brandThemeProvider/brandCssVars.ts +10 -0
  55. package/src/modules/dx/brandThemeProvider/brandThemeProvider.html +3 -0
  56. package/src/modules/dx/brandThemeProvider/brandThemeProvider.stories.ts +321 -0
  57. package/src/modules/dx/brandThemeProvider/brandThemeProvider.ts +46 -0
  58. package/src/modules/dx/breadcrumbs/__tests__/breadcrumbs.test.ts +140 -0
  59. package/src/modules/dx/breadcrumbs/__tests__/mockProps.ts +28 -0
  60. package/src/modules/dx/breadcrumbs/breadcrumbs.css +111 -0
  61. package/src/modules/dx/breadcrumbs/breadcrumbs.html +44 -0
  62. package/src/modules/dx/breadcrumbs/breadcrumbs.stories.ts +39 -0
  63. package/src/modules/dx/breadcrumbs/breadcrumbs.ts +122 -0
  64. package/src/modules/dx/button/__tests__/button.test.ts +107 -0
  65. package/src/modules/dx/button/button.css +175 -0
  66. package/src/modules/dx/button/button.html +43 -0
  67. package/src/modules/dx/button/button.stories.ts +150 -0
  68. package/src/modules/dx/button/button.ts +63 -0
  69. package/src/modules/dx/cardBlogPost/__tests__/cardBlogPost.test.ts +26 -0
  70. package/src/modules/dx/cardBlogPost/__tests__/mockProps.ts +12 -0
  71. package/src/modules/dx/cardBlogPost/cardBlogPost.css +13 -0
  72. package/src/modules/dx/cardBlogPost/cardBlogPost.html +24 -0
  73. package/src/modules/dx/cardBlogPost/cardBlogPost.stories.ts +164 -0
  74. package/src/modules/dx/cardBlogPost/cardBlogPost.ts +23 -0
  75. package/src/modules/dx/cardBlogPostProvider/__tests__/cardBlogPostProvider.test.ts +34 -0
  76. package/src/modules/dx/cardBlogPostProvider/__tests__/mockWordpressPosts.ts +44 -0
  77. package/src/modules/dx/cardBlogPostProvider/cardBlogPostProvider.css +3 -0
  78. package/src/modules/dx/cardBlogPostProvider/cardBlogPostProvider.html +16 -0
  79. package/src/modules/dx/cardBlogPostProvider/cardBlogPostProvider.ts +29 -0
  80. package/src/modules/dx/cardCallout/__tests__/cardCallout.test.ts +20 -0
  81. package/src/modules/dx/cardCallout/__tests__/mockProps.ts +7 -0
  82. package/src/modules/dx/cardCallout/cardCallout.css +57 -0
  83. package/src/modules/dx/cardCallout/cardCallout.html +15 -0
  84. package/src/modules/dx/cardCallout/cardCallout.stories.ts +33 -0
  85. package/src/modules/dx/cardCallout/cardCallout.ts +37 -0
  86. package/src/modules/dx/cardContent/__tests__/cardContent.test.ts +100 -0
  87. package/src/modules/dx/cardContent/__tests__/mockProps.ts +13 -0
  88. package/src/modules/dx/cardContent/cardContent.css +52 -0
  89. package/src/modules/dx/cardContent/cardContent.html +59 -0
  90. package/src/modules/dx/cardContent/cardContent.stories.ts +127 -0
  91. package/src/modules/dx/cardContent/cardContent.ts +68 -0
  92. package/src/modules/dx/cardDemo/cardDemo.css +1 -0
  93. package/src/modules/dx/cardDemo/cardDemo.html +12 -0
  94. package/src/modules/dx/cardDemo/cardDemo.stories.ts +115 -0
  95. package/src/modules/dx/cardDemo/cardDemo.ts +11 -0
  96. package/src/modules/dx/cardDocs/__tests__/cardDocs.test.ts +48 -0
  97. package/src/modules/dx/cardDocs/__tests__/mockProps.ts +9 -0
  98. package/src/modules/dx/cardDocs/cardDocs.css +50 -0
  99. package/src/modules/dx/cardDocs/cardDocs.html +20 -0
  100. package/src/modules/dx/cardDocs/cardDocs.stories.ts +299 -0
  101. package/src/modules/dx/cardDocs/cardDocs.ts +30 -0
  102. package/src/modules/dx/cardEvent/__tests__/cardEvent.test.ts +95 -0
  103. package/src/modules/dx/cardEvent/__tests__/mockProps.ts +10 -0
  104. package/src/modules/dx/cardEvent/cardEvent.css +107 -0
  105. package/src/modules/dx/cardEvent/cardEvent.html +94 -0
  106. package/src/modules/dx/cardEvent/cardEvent.stories.ts +153 -0
  107. package/src/modules/dx/cardEvent/cardEvent.ts +42 -0
  108. package/src/modules/dx/cardExpanded/__tests__/cardExpanded.test.ts +193 -0
  109. package/src/modules/dx/cardExpanded/__tests__/mockProps.ts +21 -0
  110. package/src/modules/dx/cardExpanded/cardExpanded.css +49 -0
  111. package/src/modules/dx/cardExpanded/cardExpanded.html +37 -0
  112. package/src/modules/dx/cardExpanded/cardExpanded.stories.ts +59 -0
  113. package/src/modules/dx/cardExpanded/cardExpanded.ts +45 -0
  114. package/src/modules/dx/cardGrid/__tests__/cardMockProps.ts +431 -0
  115. package/src/modules/dx/cardGrid/__tests__/mockProps.ts +15 -0
  116. package/src/modules/dx/cardGrid/cardGrid.css +89 -0
  117. package/src/modules/dx/cardGrid/cardGrid.html +46 -0
  118. package/src/modules/dx/cardGrid/cardGrid.stories.ts +111 -0
  119. package/src/modules/dx/cardGrid/cardGrid.ts +140 -0
  120. package/src/modules/dx/cardMinimal/__tests__/cardMinimal.test.ts +87 -0
  121. package/src/modules/dx/cardMinimal/__tests__/mockProps.ts +10 -0
  122. package/src/modules/dx/cardMinimal/cardMinimal.css +31 -0
  123. package/src/modules/dx/cardMinimal/cardMinimal.html +13 -0
  124. package/src/modules/dx/cardMinimal/cardMinimal.stories.ts +32 -0
  125. package/src/modules/dx/cardMinimal/cardMinimal.ts +3 -0
  126. package/src/modules/dx/cardNews/__tests__/cardNews.test.ts +58 -0
  127. package/src/modules/dx/cardNews/__tests__/mockProps.ts +7 -0
  128. package/src/modules/dx/cardNews/cardNews.css +159 -0
  129. package/src/modules/dx/cardNews/cardNews.html +37 -0
  130. package/src/modules/dx/cardNews/cardNews.stories.ts +115 -0
  131. package/src/modules/dx/cardNews/cardNews.ts +62 -0
  132. package/src/modules/dx/cardPodcastEpisode/__tests__/cardPodcastEpisode.test.ts +68 -0
  133. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.css +19 -0
  134. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.html +36 -0
  135. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.stories.ts +31 -0
  136. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.ts +36 -0
  137. package/src/modules/dx/cardPodcastEpisodeProvider/__tests__/cardPodcastEpisodeProvider.test.ts +36 -0
  138. package/src/modules/dx/cardPodcastEpisodeProvider/__tests__/mockWordpressEpisodes.ts +50 -0
  139. package/src/modules/dx/cardPodcastEpisodeProvider/cardPodcastEpisodeProvider.css +3 -0
  140. package/src/modules/dx/cardPodcastEpisodeProvider/cardPodcastEpisodeProvider.html +12 -0
  141. package/src/modules/dx/cardPodcastEpisodeProvider/cardPodcastEpisodeProvider.ts +29 -0
  142. package/src/modules/dx/cardSmall/__tests__/cardSmall.test.ts +66 -0
  143. package/src/modules/dx/cardSmall/__tests__/mockProps.ts +8 -0
  144. package/src/modules/dx/cardSmall/cardSmall.css +32 -0
  145. package/src/modules/dx/cardSmall/cardSmall.html +42 -0
  146. package/src/modules/dx/cardSmall/cardSmall.stories.ts +166 -0
  147. package/src/modules/dx/cardSmall/cardSmall.ts +38 -0
  148. package/src/modules/dx/cardTitle/__tests__/cardTitle.test.ts +46 -0
  149. package/src/modules/dx/cardTitle/cardTitle.css +41 -0
  150. package/src/modules/dx/cardTitle/cardTitle.html +20 -0
  151. package/src/modules/dx/cardTitle/cardTitle.ts +27 -0
  152. package/src/modules/dx/cardTrailheadModule/__tests__/cardTrailheadModule.test.ts +18 -0
  153. package/src/modules/dx/cardTrailheadModule/__tests__/mockProps.ts +11 -0
  154. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.css +24 -0
  155. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.html +20 -0
  156. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.stories.ts +122 -0
  157. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.ts +18 -0
  158. package/src/modules/dx/cardVideoPreview/__tests__/cardVideoPreview.test.ts +22 -0
  159. package/src/modules/dx/cardVideoPreview/__tests__/mockProps.ts +11 -0
  160. package/src/modules/dx/cardVideoPreview/cardVideoPreview.css +14 -0
  161. package/src/modules/dx/cardVideoPreview/cardVideoPreview.html +26 -0
  162. package/src/modules/dx/cardVideoPreview/cardVideoPreview.stories.ts +147 -0
  163. package/src/modules/dx/cardVideoPreview/cardVideoPreview.ts +13 -0
  164. package/src/modules/dx/checkbox/__tests__/checkbox.test.ts +85 -0
  165. package/src/modules/dx/checkbox/__tests__/mockProps.ts +5 -0
  166. package/src/modules/dx/checkbox/checkbox.css +168 -0
  167. package/src/modules/dx/checkbox/checkbox.html +26 -0
  168. package/src/modules/dx/checkbox/checkbox.stories.ts +38 -0
  169. package/src/modules/dx/checkbox/checkbox.ts +55 -0
  170. package/src/modules/dx/checkboxGroup/__tests__/checkboxGroup.test.ts +80 -0
  171. package/src/modules/dx/checkboxGroup/__tests__/mockProps.ts +14 -0
  172. package/src/modules/dx/checkboxGroup/checkboxGroup.css +12 -0
  173. package/src/modules/dx/checkboxGroup/checkboxGroup.html +15 -0
  174. package/src/modules/dx/checkboxGroup/checkboxGroup.stories.ts +33 -0
  175. package/src/modules/dx/checkboxGroup/checkboxGroup.ts +77 -0
  176. package/src/modules/dx/codeBlock/__tests__/codeBlock.test.ts +238 -0
  177. package/src/modules/dx/codeBlock/__tests__/mockProps.ts +160 -0
  178. package/src/modules/dx/codeBlock/codeBlock.css +128 -0
  179. package/src/modules/dx/codeBlock/codeBlock.html +79 -0
  180. package/src/modules/dx/codeBlock/codeBlock.stories.ts +143 -0
  181. package/src/modules/dx/codeBlock/codeBlock.ts +215 -0
  182. package/src/modules/dx/codeBlock/darkTheme.css +88 -0
  183. package/src/modules/dx/codeBlock/lightTheme.css +72 -0
  184. package/src/modules/dx/dropdown/__tests__/dropdown.test.ts +165 -0
  185. package/src/modules/dx/dropdown/__tests__/mockNestedOptions.ts +96 -0
  186. package/src/modules/dx/dropdown/__tests__/mockOptions.ts +10 -0
  187. package/src/modules/dx/dropdown/__tests__/mockProps.ts +6 -0
  188. package/src/modules/dx/dropdown/dropdown.css +93 -0
  189. package/src/modules/dx/dropdown/dropdown.html +67 -0
  190. package/src/modules/dx/dropdown/dropdown.stories.ts +89 -0
  191. package/src/modules/dx/dropdown/dropdown.ts +182 -0
  192. package/src/modules/dx/dropdownOption/__tests__/dropdownOption.test.ts +112 -0
  193. package/src/modules/dx/dropdownOption/__tests__/mockProps.ts +20 -0
  194. package/src/modules/dx/dropdownOption/dropdownOption.css +61 -0
  195. package/src/modules/dx/dropdownOption/dropdownOption.html +53 -0
  196. package/src/modules/dx/dropdownOption/dropdownOption.ts +39 -0
  197. package/src/modules/dx/emptyState/__tests__/emptyState.test.ts +52 -0
  198. package/src/modules/dx/emptyState/__tests__/mockProps.ts +4 -0
  199. package/src/modules/dx/emptyState/emptyState.css +64 -0
  200. package/src/modules/dx/emptyState/emptyState.html +9 -0
  201. package/src/modules/dx/emptyState/emptyState.stories.ts +45 -0
  202. package/src/modules/dx/emptyState/emptyState.ts +20 -0
  203. package/src/modules/dx/feature/__tests__/feature.test.ts +51 -0
  204. package/src/modules/dx/feature/__tests__/mockProps.ts +8 -0
  205. package/src/modules/dx/feature/feature.css +135 -0
  206. package/src/modules/dx/feature/feature.html +33 -0
  207. package/src/modules/dx/feature/feature.ts +34 -0
  208. package/src/modules/dx/featureGrid/__tests__/featureGrid.test.ts +21 -0
  209. package/src/modules/dx/featureGrid/featureGrid.html +3 -0
  210. package/src/modules/dx/featureGrid/featureGrid.stories.ts +120 -0
  211. package/src/modules/dx/featureGrid/featureGrid.ts +15 -0
  212. package/src/modules/dx/featuredContentHeader/__tests__/featuredContentHeader.test.ts +178 -0
  213. package/src/modules/dx/featuredContentHeader/__tests__/mockProps.ts +73 -0
  214. package/src/modules/dx/featuredContentHeader/featuredContentHeader.css +469 -0
  215. package/src/modules/dx/featuredContentHeader/featuredContentHeader.html +96 -0
  216. package/src/modules/dx/featuredContentHeader/featuredContentHeader.stories.ts +153 -0
  217. package/src/modules/dx/featuredContentHeader/featuredContentHeader.ts +113 -0
  218. package/src/modules/dx/featuredContentHeader/svgs.ts +35 -0
  219. package/src/modules/dx/featuresList/__tests__/featuresList.test.ts +43 -0
  220. package/src/modules/dx/featuresList/__tests__/mockProps.ts +17 -0
  221. package/src/modules/dx/featuresList/featuresList.css +24 -0
  222. package/src/modules/dx/featuresList/featuresList.html +20 -0
  223. package/src/modules/dx/featuresList/featuresList.stories.ts +30 -0
  224. package/src/modules/dx/featuresList/featuresList.ts +21 -0
  225. package/src/modules/dx/footer/__tests__/footer.test.ts +147 -0
  226. package/src/modules/dx/footer/__tests__/mockLocales.ts +7 -0
  227. package/src/modules/dx/footer/footer.css +405 -0
  228. package/src/modules/dx/footer/footer.html +145 -0
  229. package/src/modules/dx/footer/footer.stories.ts +88 -0
  230. package/src/modules/dx/footer/footer.ts +124 -0
  231. package/src/modules/dx/footer/links.ts +140 -0
  232. package/src/modules/dx/footerOption/__tests__/footerOption.test.ts +34 -0
  233. package/src/modules/dx/footerOption/__tests__/mockProps.ts +7 -0
  234. package/src/modules/dx/footerOption/footerOption.css +4 -0
  235. package/src/modules/dx/footerOption/footerOption.html +12 -0
  236. package/src/modules/dx/footerOption/footerOption.ts +19 -0
  237. package/src/modules/dx/formattedDateTime/__tests__/formattedDateTime.test.ts +25 -0
  238. package/src/modules/dx/formattedDateTime/__tests__/mockProps.ts +13 -0
  239. package/src/modules/dx/formattedDateTime/formattedDateTime.html +1 -0
  240. package/src/modules/dx/formattedDateTime/formattedDateTime.stories.ts +103 -0
  241. package/src/modules/dx/formattedDateTime/formattedDateTime.ts +72 -0
  242. package/src/modules/dx/grid/__tests__/grid.test.ts +32 -0
  243. package/src/modules/dx/grid/grid.css +48 -0
  244. package/src/modules/dx/grid/grid.html +3 -0
  245. package/src/modules/dx/grid/grid.md +14 -0
  246. package/src/modules/dx/grid/grid.stories.ts +134 -0
  247. package/src/modules/dx/grid/grid.ts +72 -0
  248. package/src/modules/dx/groupBio/__tests__/groupBio.test.ts +82 -0
  249. package/src/modules/dx/groupBio/__tests__/mockProps.ts +15 -0
  250. package/src/modules/dx/groupBio/groupBio.css +49 -0
  251. package/src/modules/dx/groupBio/groupBio.html +29 -0
  252. package/src/modules/dx/groupBio/groupBio.stories.ts +66 -0
  253. package/src/modules/dx/groupBio/groupBio.ts +41 -0
  254. package/src/modules/dx/groupText/__tests__/groupText.test.ts +69 -0
  255. package/src/modules/dx/groupText/__tests__/mockProps.ts +35 -0
  256. package/src/modules/dx/groupText/groupText.css +119 -0
  257. package/src/modules/dx/groupText/groupText.html +65 -0
  258. package/src/modules/dx/groupText/groupText.stories.ts +81 -0
  259. package/src/modules/dx/groupText/groupText.ts +93 -0
  260. package/src/modules/dx/headTags/headTags.html +3 -0
  261. package/src/modules/dx/headTags/headTags.ts +39 -0
  262. package/src/modules/dx/header/__benchmarks__/header.benchmark.js +45 -0
  263. package/src/modules/dx/header/__tests__/header.test.ts +236 -0
  264. package/src/modules/dx/header/__tests__/mockNavArchitects.ts +169 -0
  265. package/src/modules/dx/header/__tests__/mockNavDevelopers.ts +419 -0
  266. package/src/modules/dx/header/__tests__/mockNavs.ts +115 -0
  267. package/src/modules/dx/header/__tests__/mockProps.ts +164 -0
  268. package/src/modules/dx/header/header.css +109 -0
  269. package/src/modules/dx/header/header.html +129 -0
  270. package/src/modules/dx/header/header.stories.ts +172 -0
  271. package/src/modules/dx/header/header.ts +27 -0
  272. package/src/modules/dx/headerMobileNavMenu/__tests__/headerMobileNavMenu.test.ts +123 -0
  273. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.css +160 -0
  274. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.html +73 -0
  275. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.ts +102 -0
  276. package/src/modules/dx/headerMobileNavMenuOption/__tests__/headerMobileNavMenuOption.test.ts +38 -0
  277. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.css +5 -0
  278. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.html +14 -0
  279. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.ts +20 -0
  280. package/src/modules/dx/headerNav/__tests__/headerNav.test.ts +49 -0
  281. package/src/modules/dx/headerNav/headerNav.css +31 -0
  282. package/src/modules/dx/headerNav/headerNav.html +48 -0
  283. package/src/modules/dx/headerNav/headerNav.ts +56 -0
  284. package/src/modules/dx/headerSearch/__tests__/headerSearch.test.ts +182 -0
  285. package/src/modules/dx/headerSearch/__tests__/mockData.ts +11 -0
  286. package/src/modules/dx/headerSearch/__tests__/mockProps.ts +6 -0
  287. package/src/modules/dx/headerSearch/headerSearch.css +62 -0
  288. package/src/modules/dx/headerSearch/headerSearch.html +64 -0
  289. package/src/modules/dx/headerSearch/headerSearch.ts +159 -0
  290. package/src/modules/dx/helmet/__tests__/helmet.test.ts +52 -0
  291. package/src/modules/dx/helmet/helmet.css +83 -0
  292. package/src/modules/dx/helmet/helmet.html +39 -0
  293. package/src/modules/dx/helmet/helmet.stories.ts +53 -0
  294. package/src/modules/dx/helmet/helmet.ts +27 -0
  295. package/src/modules/dx/hr/__tests__/hr.test.ts +53 -0
  296. package/src/modules/dx/hr/__tests__/mockProps.ts +16 -0
  297. package/src/modules/dx/hr/hr.css +55 -0
  298. package/src/modules/dx/hr/hr.html +23 -0
  299. package/src/modules/dx/hr/hr.stories.ts +50 -0
  300. package/src/modules/dx/hr/hr.ts +45 -0
  301. package/src/modules/dx/icon/__tests__/icon.test.ts +54 -0
  302. package/src/modules/dx/icon/icon.css +14 -0
  303. package/src/modules/dx/icon/icon.html +11 -0
  304. package/src/modules/dx/icon/icon.stories.ts +100 -0
  305. package/src/modules/dx/icon/icon.ts +85 -0
  306. package/src/modules/dx/iconBadge/__tests__/iconBadge.test.ts +17 -0
  307. package/src/modules/dx/iconBadge/iconBadge.css +40 -0
  308. package/src/modules/dx/iconBadge/iconBadge.html +10 -0
  309. package/src/modules/dx/iconBadge/iconBadge.stories.ts +32 -0
  310. package/src/modules/dx/iconBadge/iconBadge.ts +42 -0
  311. package/src/modules/dx/imageAndLabel/__tests__/imageAndLabel.test.ts +39 -0
  312. package/src/modules/dx/imageAndLabel/__tests__/mockProps.ts +6 -0
  313. package/src/modules/dx/imageAndLabel/imageAndLabel.css +54 -0
  314. package/src/modules/dx/imageAndLabel/imageAndLabel.html +22 -0
  315. package/src/modules/dx/imageAndLabel/imageAndLabel.stories.ts +48 -0
  316. package/src/modules/dx/imageAndLabel/imageAndLabel.ts +16 -0
  317. package/src/modules/dx/input/__tests__/input.test.ts +357 -0
  318. package/src/modules/dx/input/input.css +165 -0
  319. package/src/modules/dx/input/input.html +58 -0
  320. package/src/modules/dx/input/input.stories.ts +102 -0
  321. package/src/modules/dx/input/input.ts +238 -0
  322. package/src/modules/dx/input/validators.ts +5 -0
  323. package/src/modules/dx/instrumentation/__tests__/instrumentation.test.ts +86 -0
  324. package/src/modules/dx/instrumentation/instrumentation.html +1 -0
  325. package/src/modules/dx/instrumentation/instrumentation.ts +116 -0
  326. package/src/modules/dx/interactiveImage/__tests__/interactiveImage.test.ts +83 -0
  327. package/src/modules/dx/interactiveImage/__tests__/mockProps.ts +39 -0
  328. package/src/modules/dx/interactiveImage/interactiveImage.css +59 -0
  329. package/src/modules/dx/interactiveImage/interactiveImage.html +32 -0
  330. package/src/modules/dx/interactiveImage/interactiveImage.stories.ts +31 -0
  331. package/src/modules/dx/interactiveImage/interactiveImage.ts +71 -0
  332. package/src/modules/dx/lazy/__tests__/lazy.test.ts +43 -0
  333. package/src/modules/dx/lazy/lazy.html +5 -0
  334. package/src/modules/dx/lazy/lazy.stories.ts +132 -0
  335. package/src/modules/dx/lazy/lazy.ts +163 -0
  336. package/src/modules/dx/logo/logo.css +33 -0
  337. package/src/modules/dx/logo/logo.html +6 -0
  338. package/src/modules/dx/logo/logo.ts +8 -0
  339. package/src/modules/dx/newsletterForm/newsletterForm.css +73 -0
  340. package/src/modules/dx/newsletterForm/newsletterForm.html +73 -0
  341. package/src/modules/dx/newsletterForm/newsletterForm.ts +238 -0
  342. package/src/modules/dx/pagination/__tests__/pagination.test.ts +121 -0
  343. package/src/modules/dx/pagination/pagination.css +51 -0
  344. package/src/modules/dx/pagination/pagination.html +45 -0
  345. package/src/modules/dx/pagination/pagination.stories.ts +88 -0
  346. package/src/modules/dx/pagination/pagination.ts +93 -0
  347. package/src/modules/dx/podcastHost/__tests__/mockProps.ts +8 -0
  348. package/src/modules/dx/podcastHost/__tests__/podcastHost.test.ts +21 -0
  349. package/src/modules/dx/podcastHost/podcastHost.css +62 -0
  350. package/src/modules/dx/podcastHost/podcastHost.html +28 -0
  351. package/src/modules/dx/podcastHost/podcastHost.stories.ts +17 -0
  352. package/src/modules/dx/podcastHost/podcastHost.ts +13 -0
  353. package/src/modules/dx/podcastPlayer/__tests__/podcastPlayer.test.ts +20 -0
  354. package/src/modules/dx/podcastPlayer/podcastPlayer.css +10 -0
  355. package/src/modules/dx/podcastPlayer/podcastPlayer.html +3 -0
  356. package/src/modules/dx/podcastPlayer/podcastPlayer.stories.ts +13 -0
  357. package/src/modules/dx/podcastPlayer/podcastPlayer.ts +5 -0
  358. package/src/modules/dx/podcastSubscription/__tests__/podcastSubscription.test.ts +16 -0
  359. package/src/modules/dx/podcastSubscription/podcastSubscription.css +91 -0
  360. package/src/modules/dx/podcastSubscription/podcastSubscription.html +24 -0
  361. package/src/modules/dx/podcastSubscription/podcastSubscription.stories.ts +23 -0
  362. package/src/modules/dx/podcastSubscription/podcastSubscription.ts +58 -0
  363. package/src/modules/dx/popover/__tests__/mockProps.ts +8 -0
  364. package/src/modules/dx/popover/__tests__/popover.test.ts +313 -0
  365. package/src/modules/dx/popover/popover.css +63 -0
  366. package/src/modules/dx/popover/popover.html +16 -0
  367. package/src/modules/dx/popover/popover.stories.ts +82 -0
  368. package/src/modules/dx/popover/popover.ts +313 -0
  369. package/src/modules/dx/radioGroup/__tests__/mockProps.ts +12 -0
  370. package/src/modules/dx/radioGroup/__tests__/radioGroup.test.ts +42 -0
  371. package/src/modules/dx/radioGroup/radioGroup.css +12 -0
  372. package/src/modules/dx/radioGroup/radioGroup.html +16 -0
  373. package/src/modules/dx/radioGroup/radioGroup.stories.ts +25 -0
  374. package/src/modules/dx/radioGroup/radioGroup.ts +65 -0
  375. package/src/modules/dx/relativeDateTime/__tests__/mockProps.ts +55 -0
  376. package/src/modules/dx/relativeDateTime/__tests__/relativeDateTime.test.ts +52 -0
  377. package/src/modules/dx/relativeDateTime/relativeDateTime.html +3 -0
  378. package/src/modules/dx/relativeDateTime/relativeDateTime.stories.ts +83 -0
  379. package/src/modules/dx/relativeDateTime/relativeDateTime.ts +113 -0
  380. package/src/modules/dx/searchResults/coveo.css +18989 -0
  381. package/src/modules/dx/searchResults/searchResults.css +387 -0
  382. package/src/modules/dx/searchResults/searchResults.html +104 -0
  383. package/src/modules/dx/searchResults/searchResults.stories.ts +36 -0
  384. package/src/modules/dx/searchResults/searchResults.ts +186 -0
  385. package/src/modules/dx/section/__tests__/section.test.ts +17 -0
  386. package/src/modules/dx/section/section.css +130 -0
  387. package/src/modules/dx/section/section.html +66 -0
  388. package/src/modules/dx/section/section.stories.ts +381 -0
  389. package/src/modules/dx/section/section.ts +41 -0
  390. package/src/modules/dx/sectionSignup/__tests__/sectionSignup.test.ts +66 -0
  391. package/src/modules/dx/sectionSignup/sectionSignup.css +43 -0
  392. package/src/modules/dx/sectionSignup/sectionSignup.html +23 -0
  393. package/src/modules/dx/sectionSignup/sectionSignup.stories.ts +49 -0
  394. package/src/modules/dx/sectionSignup/sectionSignup.ts +44 -0
  395. package/src/modules/dx/select/select.css +44 -0
  396. package/src/modules/dx/select/select.html +60 -0
  397. package/src/modules/dx/select/select.stories.ts +59 -0
  398. package/src/modules/dx/select/select.ts +23 -0
  399. package/src/modules/dx/sidebar/__tests__/mockProps.ts +181 -0
  400. package/src/modules/dx/sidebar/__tests__/mockSearchChangeEmptyEvent.ts +6 -0
  401. package/src/modules/dx/sidebar/__tests__/mockSearchChangeEvent.ts +527 -0
  402. package/src/modules/dx/sidebar/__tests__/sidebar.test.ts +568 -0
  403. package/src/modules/dx/sidebar/sidebar.css +192 -0
  404. package/src/modules/dx/sidebar/sidebar.html +94 -0
  405. package/src/modules/dx/sidebar/sidebar.stories.ts +188 -0
  406. package/src/modules/dx/sidebar/sidebar.ts +255 -0
  407. package/src/modules/dx/sidebarOld/__tests__/mockProps.ts +178 -0
  408. package/src/modules/dx/sidebarOld/__tests__/sidebarOld.test.ts +570 -0
  409. package/src/modules/dx/sidebarOld/sidebarOld.css +160 -0
  410. package/src/modules/dx/sidebarOld/sidebarOld.html +70 -0
  411. package/src/modules/dx/sidebarOld/sidebarOld.stories.ts +139 -0
  412. package/src/modules/dx/sidebarOld/sidebarOld.ts +187 -0
  413. package/src/modules/dx/sidebarSearch/__tests__/mockPreloadedState.ts +1686 -0
  414. package/src/modules/dx/sidebarSearch/__tests__/sidebarSearch.test.ts +175 -0
  415. package/src/modules/dx/sidebarSearch/sidebarSearch.css +3 -0
  416. package/src/modules/dx/sidebarSearch/sidebarSearch.html +26 -0
  417. package/src/modules/dx/sidebarSearch/sidebarSearch.ts +440 -0
  418. package/src/modules/dx/sidebarSearchResult/__tests__/sidebarSearchResult.test.ts +96 -0
  419. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.css +36 -0
  420. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.html +14 -0
  421. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.ts +70 -0
  422. package/src/modules/dx/skipNavLink/skipNavLink.css +21 -0
  423. package/src/modules/dx/skipNavLink/skipNavLink.html +3 -0
  424. package/src/modules/dx/skipNavLink/skipNavLink.ts +3 -0
  425. package/src/modules/dx/slackCta/__tests__/slackCta.test.ts +36 -0
  426. package/src/modules/dx/slackCta/slackCta.css +47 -0
  427. package/src/modules/dx/slackCta/slackCta.html +17 -0
  428. package/src/modules/dx/slackCta/slackCta.stories.ts +25 -0
  429. package/src/modules/dx/slackCta/slackCta.ts +12 -0
  430. package/src/modules/dx/socials/__tests__/socials.test.ts +114 -0
  431. package/src/modules/dx/socials/socials.css +35 -0
  432. package/src/modules/dx/socials/socials.html +22 -0
  433. package/src/modules/dx/socials/socials.stories.ts +24 -0
  434. package/src/modules/dx/socials/socials.ts +81 -0
  435. package/src/modules/dx/spinner/__tests__/spinner.test.ts +37 -0
  436. package/src/modules/dx/spinner/spinner.css +750 -0
  437. package/src/modules/dx/spinner/spinner.html +6 -0
  438. package/src/modules/dx/spinner/spinner.stories.ts +69 -0
  439. package/src/modules/dx/spinner/spinner.ts +20 -0
  440. package/src/modules/dx/tab/__tests__/tab.test.ts +129 -0
  441. package/src/modules/dx/tab/tab.css +106 -0
  442. package/src/modules/dx/tab/tab.html +13 -0
  443. package/src/modules/dx/tab/tab.stories.ts +57 -0
  444. package/src/modules/dx/tab/tab.ts +52 -0
  445. package/src/modules/dx/toc/__tests__/mockProps.ts +28 -0
  446. package/src/modules/dx/toc/__tests__/toc.test.ts +109 -0
  447. package/src/modules/dx/toc/toc.css +94 -0
  448. package/src/modules/dx/toc/toc.html +28 -0
  449. package/src/modules/dx/toc/toc.stories.ts +26 -0
  450. package/src/modules/dx/toc/toc.ts +77 -0
  451. package/src/modules/dx/tooltip/__tests__/tooltip.test.ts +22 -0
  452. package/src/modules/dx/tooltip/microtip.css +269 -0
  453. package/src/modules/dx/tooltip/tooltip.css +36 -0
  454. package/src/modules/dx/tooltip/tooltip.html +5 -0
  455. package/src/modules/dx/tooltip/tooltip.stories.ts +46 -0
  456. package/src/modules/dx/tooltip/tooltip.ts +6 -0
  457. package/src/modules/dx/topics/__tests__/mockProps.ts +3 -0
  458. package/src/modules/dx/topics/__tests__/topics.test.ts +31 -0
  459. package/src/modules/dx/topics/topics.css +25 -0
  460. package/src/modules/dx/topics/topics.html +12 -0
  461. package/src/modules/dx/topics/topics.ts +25 -0
  462. package/src/modules/dx/tree/__tests__/mockProps.ts +215 -0
  463. package/src/modules/dx/tree/__tests__/tree.test.ts +346 -0
  464. package/src/modules/dx/tree/__tests__/treeHandler.test.ts +194 -0
  465. package/src/modules/dx/tree/tree.css +5 -0
  466. package/src/modules/dx/tree/tree.html +11 -0
  467. package/src/modules/dx/tree/tree.stories.ts +65 -0
  468. package/src/modules/dx/tree/tree.ts +72 -0
  469. package/src/modules/dx/tree/treeHandler.ts +100 -0
  470. package/src/modules/dx/treeItem/__tests__/mockProps.ts +46 -0
  471. package/src/modules/dx/treeItem/__tests__/treeItem.test.ts +377 -0
  472. package/src/modules/dx/treeItem/treeItem.css +14 -0
  473. package/src/modules/dx/treeItem/treeItem.html +22 -0
  474. package/src/modules/dx/treeItem/treeItem.ts +110 -0
  475. package/src/modules/dx/treeTile/__tests__/mockProps.ts +16 -0
  476. package/src/modules/dx/treeTile/__tests__/treeTile.test.ts +168 -0
  477. package/src/modules/dx/treeTile/treeTile.css +190 -0
  478. package/src/modules/dx/treeTile/treeTile.html +27 -0
  479. package/src/modules/dx/treeTile/treeTile.ts +59 -0
  480. package/src/modules/dx/typeBadge/__tests__/typeBadge.test.ts +77 -0
  481. package/src/modules/dx/typeBadge/typeBadge.css +74 -0
  482. package/src/modules/dx/typeBadge/typeBadge.html +5 -0
  483. package/src/modules/dx/typeBadge/typeBadge.stories.ts +114 -0
  484. package/src/modules/dx/typeBadge/typeBadge.ts +65 -0
  485. package/src/modules/dx/typeBadgeGroup/__tests__/mockProps.ts +11 -0
  486. package/src/modules/dx/typeBadgeGroup/__tests__/typeBadgeGroup.test.ts +72 -0
  487. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.css +12 -0
  488. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.html +11 -0
  489. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.stories.ts +19 -0
  490. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.ts +18 -0
  491. package/src/modules/helpers/animations/animations.css +15 -0
  492. package/src/modules/helpers/button/button.css +4 -0
  493. package/src/modules/helpers/card/card.css +258 -0
  494. package/src/modules/helpers/code/code.css +296 -0
  495. package/src/modules/helpers/commonHeader/commonHeader.css +130 -0
  496. package/src/modules/helpers/reset/reset.css +559 -0
  497. package/src/modules/helpers/sidebar/sidebar.css +21 -0
  498. package/src/modules/helpers/slds/slds.css +191 -0
  499. package/src/modules/helpers/table/table.css +110 -0
  500. package/src/modules/helpers/text/text.css +163 -0
  501. package/src/modules/test-components/buttonTest/buttonTest.html +3 -0
  502. package/src/modules/test-components/buttonTest/buttonTest.ts +3 -0
  503. package/src/modules/test-components/codeBlockTest/codeBlockTest.js +4 -0
  504. package/src/modules/test-components/featureGridTest/featureGridTest.html +7 -0
  505. package/src/modules/test-components/featureGridTest/featureGridTest.ts +5 -0
  506. package/src/modules/test-components/instrumentationTest/instrumentationTest.html +4 -0
  507. package/src/modules/test-components/instrumentationTest/instrumentationTest.ts +8 -0
  508. package/src/modules/test-components/popoverTest/popoverTest.html +6 -0
  509. package/src/modules/test-components/popoverTest/popoverTest.ts +5 -0
  510. package/src/modules/test-components/slackCtaTest/slackCtaTest.html +3 -0
  511. package/src/modules/test-components/slackCtaTest/slackCtaTest.ts +3 -0
  512. package/src/modules/utils/highlight/__tests__/highlight.test.ts +108 -0
  513. package/src/modules/utils/highlight/__tests__/mockProps.ts +45 -0
  514. package/src/modules/utils/highlight/highlight.ts +32 -0
  515. package/src/modules/utils/normalizers/normalizers.ts +91 -0
  516. package/src/modules/utils-internal/archiveCard/archiveCard.ts +35 -0
  517. package/src/modules/utils-internal/coveo/coveo.ts +70 -0
  518. package/src/modules/utils-internal/css/css.ts +43 -0
  519. package/src/modules/utils-internal/devices/devices.ts +1 -0
  520. package/src/modules/utils-internal/headerBase/headerBase.ts +204 -0
  521. package/src/modules/utils-internal/jest/jest.ts +58 -0
  522. package/src/modules/utils-internal/options/options.ts +39 -0
  523. package/src/modules/utils-internal/prismjs/prismjs.html +3 -0
  524. package/src/modules/utils-internal/prismjs/prismjs.ts +3321 -0
  525. package/src/modules/utils-internal/recentSearches/__tests__/recentSearches.test.ts +83 -0
  526. package/src/modules/utils-internal/recentSearches/recentSearches.ts +57 -0
  527. package/src/modules/utils-internal/regexps/regexps.ts +5 -0
  528. package/src/modules/utils-internal/seo/seo.ts +4 -0
  529. package/src/modules/utils-internal/slot/slot.ts +17 -0
  530. package/src/modules/utils-internal/storybook/storybook.ts +32 -0
  531. package/src/modules/utils-internal/tests/tests.ts +38 -0
  532. package/src/modules/utils-internal/wordpress/__tests__/wordpress.test.ts +15 -0
  533. package/src/modules/utils-internal/wordpress/wordpress.ts +13 -0
@@ -0,0 +1,27 @@
1
+ import { api } from "lwc";
2
+ import { HeaderBase } from "utils-internal/headerBase";
3
+ import { toJson } from "utils/normalizers";
4
+ import type { Option } from "typings/custom";
5
+
6
+ export default class Header extends HeaderBase {
7
+ private _breadcrumbs!: Option[];
8
+
9
+ @api
10
+ get breadcrumbs() {
11
+ return this._breadcrumbs;
12
+ }
13
+
14
+ set breadcrumbs(value) {
15
+ this._breadcrumbs = toJson(value);
16
+ }
17
+
18
+ private get showSignup(): boolean {
19
+ return this.signupLink
20
+ ? (this.mobile && !this.isSearchOpen) || !this.mobile
21
+ : false;
22
+ }
23
+
24
+ protected mobileBreakpoint(): string {
25
+ return "768px";
26
+ }
27
+ }
@@ -0,0 +1,123 @@
1
+ import HeaderMobileNavMenu from "dx/headerMobileNavMenu";
2
+ import { createRenderComponent } from "utils-internal/tests";
3
+ import { getOptionsCount } from "utils-internal/options";
4
+ import navItems from "../../header/__tests__/mockNavDevelopers";
5
+
6
+ const TAG = "dx-header-mobile-nav-menu";
7
+ const render = createRenderComponent(TAG, HeaderMobileNavMenu);
8
+
9
+ const navItemsCount = getOptionsCount(navItems);
10
+
11
+ describe(TAG, () => {
12
+ it("renders defaulted to closed", () => {
13
+ const element = render({ navItems });
14
+
15
+ const el = element.shadowRoot.querySelector("nav");
16
+
17
+ expect(el).not.toBeNull();
18
+ expect(el.className).toContain("state-closed");
19
+
20
+ return expect(element).toBeAccessible();
21
+ });
22
+
23
+ it("removes closed class when open and has no menu items open by default", () => {
24
+ const element = render({ navItems, open: true });
25
+
26
+ const el = element.shadowRoot.querySelector("nav");
27
+ const menuItemEl = element.shadowRoot.querySelector(
28
+ "nav-menu_item.state-open"
29
+ );
30
+
31
+ expect(el.className).not.toContain("state-closed");
32
+ expect(menuItemEl).toBeNull();
33
+
34
+ return expect(element).toBeAccessible();
35
+ });
36
+
37
+ it("renders the corect number of li", () => {
38
+ const element = render({ navItems, open: true });
39
+ const lis = element.shadowRoot.querySelectorAll("li");
40
+ expect(lis.length).toEqual(navItems.length);
41
+ return expect(element).toBeAccessible();
42
+ });
43
+
44
+ it("renders the corect number of links", () => {
45
+ const element = render({ navItems, open: true });
46
+ const links = element.shadowRoot.querySelectorAll(
47
+ "a, dx-header-mobile-nav-menu-option"
48
+ );
49
+ expect(links.length).toEqual(navItemsCount);
50
+ return expect(element).toBeAccessible();
51
+ });
52
+
53
+ it("applies active class to option href that matches the current pathname", () => {
54
+ const element = render({
55
+ navItems,
56
+ open: true,
57
+ pathname: "/developers"
58
+ });
59
+ const links = element.shadowRoot.querySelectorAll(
60
+ ".nav-menu_item_cta.state-active"
61
+ );
62
+ expect(links.length).toEqual(1);
63
+ expect(links[0].textContent).toEqual(navItems[0].label);
64
+ return expect(element).toBeAccessible();
65
+ });
66
+
67
+ it("applies state-open class to a menu item with options based off of the incoming value", () => {
68
+ const value = "discover";
69
+ const element = render({ navItems, open: true, value });
70
+
71
+ const menuItem = element.shadowRoot.querySelector(
72
+ `li[data-id="${value}"]`
73
+ );
74
+
75
+ expect(menuItem.className).toContain("state-open");
76
+ return expect(element).toBeAccessible();
77
+ });
78
+
79
+ it("fires change with the correct value on click of menuitem with options", () => {
80
+ const id = "discover";
81
+ const onChangeMock = jest.fn();
82
+ const element = render({
83
+ navItems,
84
+ open: true,
85
+ onchange: onChangeMock
86
+ });
87
+
88
+ const menuItem = element.shadowRoot.querySelector(
89
+ `button[data-id="${id}"]`
90
+ );
91
+
92
+ menuItem.click();
93
+
94
+ expect(onChangeMock).toHaveBeenCalledTimes(1);
95
+ expect(onChangeMock.mock.calls[0][0].detail).toEqual(id);
96
+ return expect(element).toBeAccessible();
97
+ });
98
+
99
+ it("renders the backdrop div when open and closes nav when clicked", () => {
100
+ const element = render({
101
+ navItems,
102
+ open: true
103
+ });
104
+ const backdropEl = element.shadowRoot.querySelector(`.backdrop`);
105
+
106
+ const onCloseMock = jest.fn();
107
+ element.addEventListener("requestclose", onCloseMock);
108
+
109
+ expect(backdropEl).not.toBeNull();
110
+
111
+ backdropEl.click();
112
+ expect(onCloseMock).toHaveBeenCalledTimes(1);
113
+
114
+ return expect(element).toBeAccessible();
115
+ });
116
+
117
+ it("does not render the backdrop div when closed", () => {
118
+ const element = render({ navItems, open: false });
119
+ const backdropEl = element.shadowRoot.querySelector(`.backdrop`);
120
+ expect(backdropEl).toBeNull();
121
+ return expect(element).toBeAccessible();
122
+ });
123
+ });
@@ -0,0 +1,160 @@
1
+ @import "helpers/reset";
2
+
3
+ :host {
4
+ --dx-c-color-background: var(--dx-g-brand-default-color-background);
5
+ --dx-c-button-color-background-inactive: var(
6
+ --dx-g-brand-default-button-color-background-inactive
7
+ );
8
+ --dx-c-button-color-background-active: var(
9
+ --dx-g-brand-default-button-color-background-active
10
+ );
11
+ --dx-c-color: var(--dx-g-brand-default-color);
12
+ --dx-c-color-border: var(--dx-g-brand-default-color-border);
13
+ --dx-c-color-background-2: var(--dx-g-brand-default-color-background-2);
14
+ --dx-c-button-color-background-inactive-hover: var(
15
+ --dx-g-brand-default-button-color-background-inactive-hover
16
+ );
17
+ --dx-c-color-border-2: var(--dx-g-brand-default-color-border-2);
18
+ }
19
+
20
+ .nav-menu {
21
+ position: absolute;
22
+ top: 100%;
23
+ left: 0;
24
+ width: 100%;
25
+ max-height: 56vh;
26
+ overflow-y: auto;
27
+ padding: 0 var(--dx-g-spacing-sm) var(--dx-g-spacing-sm)
28
+ var(--dx-g-spacing-sm);
29
+ background: var(--dx-c-color-background);
30
+ box-shadow: 0 20px 28px 0 rgba(0, 20, 45, 0.08);
31
+ transform: translateY(0);
32
+ border-top: 1px solid transparent;
33
+ transition: var(--dx-g-transition-transform-2x),
34
+ var(--dx-g-transition-hue-1x);
35
+ z-index: 1000;
36
+ }
37
+
38
+ .nav-menu.has-scrollshadow {
39
+ border-color: var(--dx-c-color-border-2);
40
+ }
41
+
42
+ .nav-menu.state-closed {
43
+ opacity: 0;
44
+ transform: translateY(-16px);
45
+ pointer-events: none;
46
+ }
47
+
48
+ .nav-menu ul {
49
+ display: flex;
50
+ flex-direction: column;
51
+ width: 100%;
52
+ }
53
+
54
+ .nav-menu_item {
55
+ display: flex;
56
+ flex-direction: column;
57
+ }
58
+
59
+ .nav-menu_item,
60
+ .nav-menu_item_cta-main {
61
+ transition: var(--dx-g-transition-hue-1x);
62
+ border-radius: var(--dx-g-spacing-xs);
63
+ }
64
+
65
+ .nav-menu_item_cta-main {
66
+ justify-content: space-between;
67
+ font-family: var(--dx-g-font-display);
68
+ font-size: var(--dx-g-text-base);
69
+ color: var(--dx-g-blue-vibrant-20);
70
+ line-height: 20px;
71
+ padding: var(--dx-g-spacing-sm) var(--dx-g-spacing-md);
72
+ width: 100%;
73
+ display: flex;
74
+ align-items: center;
75
+ }
76
+
77
+ .nav-menu ul > .nav-menu_item:not(:last-of-type) {
78
+ margin-bottom: var(--dx-g-spacing-xs);
79
+ }
80
+
81
+ .nav-menu_item.state-open {
82
+ background: var(--dx-c-button-color-background-inactive);
83
+ }
84
+
85
+ .nav-menu_item_cta-main:not(.state-active):hover {
86
+ background: var(--dx-c-button-color-background-inactive);
87
+ }
88
+
89
+ .nav-menu_item.state-open .nav-menu_item_cta-main:hover {
90
+ background: var(--dx-c-button-color-background-inactive-hover);
91
+ }
92
+
93
+ .nav-menu_item.state-open .chevrondown {
94
+ transform: rotateX(180deg);
95
+ }
96
+
97
+ .nav-menu_item_cta-options {
98
+ position: relative;
99
+ display: none;
100
+ flex-direction: column;
101
+ width: 100%;
102
+ }
103
+
104
+ .nav-menu_item.state-open > .nav-menu_item_cta-options {
105
+ display: flex;
106
+ }
107
+
108
+ .nav-menu_item_cta {
109
+ height: var(--dx-g-spacing-3xl);
110
+ }
111
+
112
+ .nav-menu_item_cta-main.state-active {
113
+ background: var(--dx-c-button-color-background-active);
114
+ color: var(--dx-c-color);
115
+ }
116
+
117
+ .nav-menu_item_cta-main > span {
118
+ transform: translateY(3px); /* ghost padding */
119
+ }
120
+
121
+ .nav-menu_item_cta-sub {
122
+ --dx-c-button-secondary-color-hover: var(
123
+ --dx-c-button-color-background-inactive-hover
124
+ );
125
+
126
+ font-size: var(--dx-g-text-sm);
127
+ width: 100%;
128
+ }
129
+
130
+ .nav-menu_item_cta-sub::part(container) {
131
+ justify-content: flex-start;
132
+ }
133
+
134
+ .nav-menu_item_cta-sub.state-active {
135
+ text-decoration: underline;
136
+ }
137
+
138
+ .nav-menu_item > .nav-menu_item_cta-options:not(:first-of-type) {
139
+ padding-top: var(--dx-g-spacing-xs);
140
+ margin-top: var(--dx-g-spacing-xs);
141
+ }
142
+
143
+ .nav-menu_item > .nav-menu_item_cta-options:not(:first-of-type)::after {
144
+ content: "";
145
+ position: absolute;
146
+ top: 0;
147
+ left: var(--dx-g-spacing-md);
148
+ width: calc(100% - var(--dx-g-spacing-xl));
149
+ height: 1px;
150
+ background: var(--dx-c-color-border-2);
151
+ }
152
+
153
+ .backdrop {
154
+ position: fixed;
155
+ top: 0;
156
+ left: 0;
157
+ height: 100vh;
158
+ width: 100vw;
159
+ z-index: -1;
160
+ }
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <nav
3
+ aria-label="Navigation Menu"
4
+ class={className}
5
+ role="navigation"
6
+ onscroll={onScroll}
7
+ >
8
+ <ul>
9
+ <template for:each={navItems} for:item="navItem">
10
+ <li
11
+ class={navItem.liClassName}
12
+ key={navItem.id}
13
+ aria-expanded={navItem.open}
14
+ data-id={navItem.id}
15
+ >
16
+ <!-- NAV ITEM [WITHOUT OPTIONS] -->
17
+ <a
18
+ class={navItem.className}
19
+ href={navItem.link.href}
20
+ if:false={navItem.options}
21
+ onclick={onClickLink}
22
+ >
23
+ <span>{navItem.label}</span>
24
+ </a>
25
+
26
+ <!-- NAV ITEM [WITH OPTIONS] -->
27
+ <button
28
+ aria-label="Toggle accordian open"
29
+ class="nav-menu_item_cta nav-menu_item_cta-main"
30
+ data-id={navItem.id}
31
+ if:true={navItem.options}
32
+ onclick={onChange}
33
+ >
34
+ <span>{navItem.label}</span>
35
+ <dx-icon
36
+ class="chevrondown"
37
+ symbol="chevrondown"
38
+ size="medium"
39
+ ></dx-icon>
40
+ </button>
41
+ <template if:true={navItem.options}>
42
+ <template for:each={navItem.options} for:item="options">
43
+ <div
44
+ class="nav-menu_item_cta-options"
45
+ key={options.id}
46
+ >
47
+ <template if:true={options.options}>
48
+ <template
49
+ for:each={options.options}
50
+ for:item="navSubItem"
51
+ >
52
+ <dx-header-mobile-nav-menu-option
53
+ key={navSubItem.id}
54
+ href={navSubItem.link.href}
55
+ class-name={navSubItem.className}
56
+ icon-symbol={navSubItem.iconSymbol}
57
+ menu-label={navItem.label}
58
+ item-label={navSubItem.label}
59
+ onclick={onClickLink}
60
+ target={navSubItem.link.target}
61
+ ></dx-header-mobile-nav-menu-option>
62
+ </template>
63
+ </template>
64
+ </div>
65
+ </template>
66
+ </template>
67
+ </li>
68
+ </template>
69
+ </ul>
70
+ <slot></slot>
71
+ </nav>
72
+ <div class="backdrop" if:true={open} onclick={onClickBackground}></div>
73
+ </template>
@@ -0,0 +1,102 @@
1
+ import { LightningElement, api } from "lwc";
2
+ import cx from "classnames";
3
+ import { Option } from "typings/custom";
4
+ import { deepmapOptions } from "utils-internal/options";
5
+
6
+ export default class HeaderMobileNavMenu extends LightningElement {
7
+ @api open: boolean = false;
8
+ @api value: string | null = null;
9
+ @api pathname: string | null = null;
10
+
11
+ @api
12
+ set navItems(_navItems: Option[]) {
13
+ this._navItems = _navItems;
14
+ }
15
+ get navItems() {
16
+ // first we assign container classnames to the topmost layer of options groupings
17
+ // (deepmapper only affects actual root options, not groups of options made for the purposes of labeling)
18
+ const navItems = this._navItems?.map((app) => {
19
+ const open = app.options ? app.id === this.value : null;
20
+ const liClassName = cx("nav-menu_item", open && "state-open");
21
+ return { ...app, open, liClassName };
22
+ });
23
+
24
+ // then we use deepmapper to affect the actual root options (actual links)
25
+ return deepmapOptions(
26
+ navItems,
27
+ (app: Option, index: number, level: number) => {
28
+ const active = app.link
29
+ ? app.link.href === this.pathname
30
+ : false;
31
+ const className = cx(
32
+ "nav-menu_item_cta",
33
+ active && "state-active",
34
+ level > 1
35
+ ? "nav-menu_item_cta-sub"
36
+ : "nav-menu_item_cta-main"
37
+ );
38
+ const iconSymbol =
39
+ app.link && app.link.target ? "new_window" : null;
40
+
41
+ return {
42
+ ...app,
43
+ className,
44
+ iconSymbol
45
+ };
46
+ }
47
+ );
48
+ }
49
+
50
+ private _navItems: Option[] = [];
51
+ private navElement: HTMLElement | null = null;
52
+ private wasOpen: boolean = false;
53
+ private showScrollShadow: boolean = false;
54
+
55
+ private get className() {
56
+ return cx(
57
+ "nav-menu",
58
+ !this.open && "state-closed",
59
+ this.showScrollShadow && "has-scrollshadow"
60
+ );
61
+ }
62
+
63
+ renderedCallback() {
64
+ if (!this.navElement) {
65
+ this.navElement = this.template.querySelector("nav");
66
+ }
67
+ if (this.open && !this.wasOpen && this.value) {
68
+ this.scrollToAccordianSection();
69
+ }
70
+ if (this.open !== this.wasOpen) {
71
+ this.wasOpen = this.open;
72
+ }
73
+ }
74
+
75
+ private scrollToAccordianSection() {
76
+ const element = this.template.querySelector(
77
+ `li[data-id="${this.value}"]`
78
+ );
79
+ const container = this.template.querySelector(".nav-menu");
80
+ if (element && container) {
81
+ container.scrollTop = element.offsetTop - 8;
82
+ }
83
+ }
84
+
85
+ private onScroll(e: Event) {
86
+ this.showScrollShadow = (<HTMLElement>e.currentTarget).scrollTop > 4;
87
+ }
88
+
89
+ private onChange(e: PointerEvent) {
90
+ const id = (<HTMLButtonElement>e.currentTarget).getAttribute("data-id");
91
+ const detail = id === this.value ? null : id; // toggles accordian open/closed
92
+ this.dispatchEvent(new CustomEvent("change", { detail }));
93
+ }
94
+
95
+ private onClickLink() {
96
+ this.dispatchEvent(new CustomEvent("requestclose"));
97
+ }
98
+
99
+ private onClickBackground() {
100
+ this.dispatchEvent(new CustomEvent("requestclose"));
101
+ }
102
+ }
@@ -0,0 +1,38 @@
1
+ import HeaderMobileNavMenuOption from "dx/headerMobileNavMenuOption";
2
+ import { createRenderComponent } from "utils-internal/tests";
3
+
4
+ const TAG = "dx-header-mobile-nav-menu-option";
5
+ const render = createRenderComponent(TAG, HeaderMobileNavMenuOption);
6
+
7
+ const PROPS = {
8
+ menuLabel: "build",
9
+ itemLabel: "documentation"
10
+ };
11
+
12
+ describe(TAG, () => {
13
+ it("renders a single dx-button component", () => {
14
+ const element = render(PROPS);
15
+
16
+ const button = element.shadowRoot.querySelectorAll("dx-button");
17
+
18
+ expect(button.length).toEqual(1);
19
+
20
+ return expect(element).toBeAccessible();
21
+ });
22
+
23
+ it("fires sendGtm function when button is clicked", () => {
24
+ const sendGtmMock = jest.fn();
25
+ const element = render({
26
+ ...PROPS,
27
+ onclick: sendGtmMock
28
+ });
29
+
30
+ const button = element.shadowRoot.querySelector("dx-button");
31
+
32
+ button.click();
33
+
34
+ expect(sendGtmMock).toHaveBeenCalled();
35
+
36
+ return expect(element).toBeAccessible();
37
+ });
38
+ });
@@ -0,0 +1,5 @@
1
+ dx-button {
2
+ --dx-c-button-justify-content: flex-start;
3
+
4
+ width: 100%;
5
+ }
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <dx-button
3
+ class={className}
4
+ href={href}
5
+ icon-symbol={iconSymbol}
6
+ target={target}
7
+ size="large"
8
+ font="sans"
9
+ variant="tertiary"
10
+ onclick={sendGtm}
11
+ >
12
+ {itemLabel}
13
+ </dx-button>
14
+ </template>
@@ -0,0 +1,20 @@
1
+ import { LightningElement, api } from "lwc";
2
+ import { track } from "dx/instrumentation";
3
+
4
+ export default class HeaderMobileNavMenuOption extends LightningElement {
5
+ @api href: string | null = null;
6
+ @api className: string | null = null;
7
+ @api iconSymbol: string | null = null;
8
+ @api target: string | null = null;
9
+ @api menuLabel: string | null = null;
10
+ @api itemLabel: string | null = null;
11
+
12
+ private sendGtm(e: PointerEvent) {
13
+ track(e.currentTarget, "custEv_topNavLinkClick", {
14
+ navHeading: this.menuLabel || undefined,
15
+ navSubHeading: this.itemLabel || undefined,
16
+ clickText: this.href || undefined,
17
+ pageLocation: window.location.pathname || undefined
18
+ });
19
+ }
20
+ }
@@ -0,0 +1,49 @@
1
+ import HeaderNav from "dx/headerNav";
2
+ import { createRenderComponent } from "utils-internal/tests";
3
+ import navItems from "../../header/__tests__/mockNavArchitects";
4
+ const TAG = "dx-header-nav";
5
+
6
+ const render = createRenderComponent(TAG, HeaderNav);
7
+
8
+ describe(TAG, () => {
9
+ describe("render", () => {
10
+ it("renders the correct number of nav-list-items", () => {
11
+ const element = render({ navItems });
12
+
13
+ const items = element.shadowRoot.querySelectorAll(".nav-list-item");
14
+ const dropdownItems = element.shadowRoot.querySelectorAll("dx-tab");
15
+
16
+ // items with more options render something different on mobile and desktop whose display is toggled by `display: none;`
17
+ const expectedItemLength =
18
+ navItems.length +
19
+ navItems.filter((app) => !!app.options).length;
20
+
21
+ expect(items.length + dropdownItems.length).toBe(
22
+ expectedItemLength
23
+ );
24
+
25
+ return expect(element).toBeAccessible();
26
+ });
27
+ });
28
+
29
+ describe("interactions", () => {
30
+ it("fires requestopennavmenu event when mobile button is clicked", () => {
31
+ const element = render({ navItems });
32
+ const mockOpenNav = jest.fn();
33
+ element.addEventListener("requestopennavmenu", mockOpenNav);
34
+ const navOption: HTMLElement = element.shadowRoot.querySelector(
35
+ "dx-tab.nav-list-item-nav-menu"
36
+ );
37
+ expect(navOption).not.toBeNull();
38
+ navOption.click();
39
+
40
+ expect(mockOpenNav).toBeCalledTimes(1);
41
+ const singleCall = mockOpenNav.mock.calls[0][0];
42
+ expect(singleCall.detail).toBe(
43
+ navItems.find(({ options }) => options)!.id
44
+ );
45
+
46
+ return expect(element).toBeAccessible();
47
+ });
48
+ });
49
+ });
@@ -0,0 +1,31 @@
1
+ @import "helpers/reset";
2
+
3
+ a {
4
+ text-decoration: none;
5
+ }
6
+
7
+ nav {
8
+ padding: 0;
9
+ }
10
+
11
+ .nav-list {
12
+ display: flex;
13
+ }
14
+
15
+ .nav-list li {
16
+ position: relative;
17
+ }
18
+
19
+ .nav-list-item-nav-menu {
20
+ display: none;
21
+ }
22
+
23
+ @media (max-width: 768px) {
24
+ .nav-list-item-nav-menu {
25
+ display: flex;
26
+ }
27
+
28
+ dx-dropdown {
29
+ display: none;
30
+ }
31
+ }