@explorer-1/vue 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/components.d.ts +215 -0
  4. package/index.html +18 -0
  5. package/lib/main.ts +78 -0
  6. package/package.json +54 -0
  7. package/postcss.config.js +7 -0
  8. package/public/edu/.gitkeep +0 -0
  9. package/public/edu/explorer-1/bg-stars-edu.png +0 -0
  10. package/public/edu/explorer-1/bg-stars.jpg +0 -0
  11. package/public/explorer-1/bg-stars-edu.png +0 -0
  12. package/public/explorer-1/bg-stars.jpg +0 -0
  13. package/src/App.vue +30 -0
  14. package/src/assets/fonts/README.md +12 -0
  15. package/src/assets/fonts/archivo-narrow/ArchivoNarrow-Bold.woff2 +0 -0
  16. package/src/assets/fonts/archivo-narrow/ArchivoNarrow-BoldItalic.woff2 +0 -0
  17. package/src/assets/fonts/archivo-narrow/ArchivoNarrow-SemiBold.woff2 +0 -0
  18. package/src/assets/fonts/archivo-narrow/ArchivoNarrow-SemiBoldItalic.woff2 +0 -0
  19. package/src/assets/fonts/metropolis/Metropolis-Bold.woff2 +0 -0
  20. package/src/assets/fonts/metropolis/Metropolis-BoldItalic.woff2 +0 -0
  21. package/src/assets/fonts/metropolis/Metropolis-ExtraBold.woff2 +0 -0
  22. package/src/assets/fonts/metropolis/Metropolis-Medium.woff2 +0 -0
  23. package/src/assets/fonts/metropolis/Metropolis-MediumItalic.woff2 +0 -0
  24. package/src/assets/fonts/metropolis/Metropolis-Regular.woff2 +0 -0
  25. package/src/assets/fonts/metropolis/Metropolis-RegularItalic.woff2 +0 -0
  26. package/src/assets/fonts/metropolis/Metropolis-SemiBold.woff2 +0 -0
  27. package/src/assets/fonts/metropolis/Metropolis-SemiBoldItalic.woff2 +0 -0
  28. package/src/assets/scss/styles.scss +1 -0
  29. package/src/components/AsteroidWatchWidget/AsteroidWatchWidget.stories.js +156 -0
  30. package/src/components/AsteroidWatchWidget/AsteroidWatchWidget.vue +156 -0
  31. package/src/components/BackToTop/BackToTop.stories.js +24 -0
  32. package/src/components/BackToTop/BackToTop.vue +76 -0
  33. package/src/components/BaseAudio/BaseAudio.stories.js +29 -0
  34. package/src/components/BaseAudio/BaseAudio.vue +359 -0
  35. package/src/components/BaseButton/BaseButton.stories.ts +65 -0
  36. package/src/components/BaseButton/BaseButton.vue +114 -0
  37. package/src/components/BaseCheckboxGroup/BaseCheckboxGroup.stories.mdx +68 -0
  38. package/src/components/BaseCheckboxGroup/BaseCheckboxGroup.vue +101 -0
  39. package/src/components/BaseHeading/BaseHeading.stories.js +75 -0
  40. package/src/components/BaseHeading/BaseHeading.vue +58 -0
  41. package/src/components/BaseImage/BaseImage.stories.ts +52 -0
  42. package/src/components/BaseImage/BaseImage.vue +120 -0
  43. package/src/components/BaseImageCaption/BaseImageCaption.stories.js +27 -0
  44. package/src/components/BaseImageCaption/BaseImageCaption.vue +51 -0
  45. package/src/components/BaseImagePlaceholder/BaseImagePlaceholder.stories.js +73 -0
  46. package/src/components/BaseImagePlaceholder/BaseImagePlaceholder.vue +90 -0
  47. package/src/components/BaseLightboxCloseButton/BaseLightboxCloseButton.vue +45 -0
  48. package/src/components/BaseLightboxOpenButton/BaseLightboxOpenButton.vue +46 -0
  49. package/src/components/BaseLink/BaseLink.stories.js +47 -0
  50. package/src/components/BaseLink/BaseLink.vue +227 -0
  51. package/src/components/BaseModal/BaseModal.stories.js +90 -0
  52. package/src/components/BaseModal/BaseModal.vue +54 -0
  53. package/src/components/BaseModal/BaseModalDialog.vue +59 -0
  54. package/src/components/BasePlaceholder/BasePlaceholder.stories.js +29 -0
  55. package/src/components/BasePlaceholder/BasePlaceholder.vue +30 -0
  56. package/src/components/BaseRadioGroup/BaseRadioGroup.stories.mdx +68 -0
  57. package/src/components/BaseRadioGroup/BaseRadioGroup.vue +102 -0
  58. package/src/components/BaseSwimlane/BaseSwimlane.stories.mdx +64 -0
  59. package/src/components/BaseSwimlane/BaseSwimlane.vue +204 -0
  60. package/src/components/BaseTag/BaseTag.stories.js +34 -0
  61. package/src/components/BaseTag/BaseTag.vue +36 -0
  62. package/src/components/BaseTimer/BaseTimer.stories.js +78 -0
  63. package/src/components/BaseTimer/BaseTimer.test.js +15 -0
  64. package/src/components/BaseTimer/BaseTimer.vue +270 -0
  65. package/src/components/BaseUnitToggle/BaseUnitToggle.stories.js +86 -0
  66. package/src/components/BaseUnitToggle/BaseUnitToggle.test.js +26 -0
  67. package/src/components/BaseUnitToggle/BaseUnitToggle.vue +255 -0
  68. package/src/components/BaseVideo/BaseVideo.stories.js +31 -0
  69. package/src/components/BaseVideo/BaseVideo.vue +73 -0
  70. package/src/components/BlockAnchor/BlockAnchor.vue +38 -0
  71. package/src/components/BlockAudio/BlockAudio.stories.js +29 -0
  72. package/src/components/BlockAudio/BlockAudio.vue +78 -0
  73. package/src/components/BlockCard/BlockCard.stories.js +24 -0
  74. package/src/components/BlockCard/BlockCard.vue +88 -0
  75. package/src/components/BlockCardGroup/BlockCardGroup.stories.js +71 -0
  76. package/src/components/BlockCardGroup/BlockCardGroup.vue +61 -0
  77. package/src/components/BlockCircleImageCard/BlockCircleImageCard.stories.js +55 -0
  78. package/src/components/BlockCircleImageCard/BlockCircleImageCard.vue +120 -0
  79. package/src/components/BlockCta/BlockCta.stories.js +35 -0
  80. package/src/components/BlockCta/BlockCta.vue +55 -0
  81. package/src/components/BlockHeading/BlockHeading.stories.js +22 -0
  82. package/src/components/BlockHeading/BlockHeading.vue +27 -0
  83. package/src/components/BlockIframeEmbed/BlockIframeEmbed.stories.js +40 -0
  84. package/src/components/BlockIframeEmbed/BlockIframeEmbed.vue +84 -0
  85. package/src/components/BlockImage/BlockImage.stories.js +137 -0
  86. package/src/components/BlockImage/BlockImage.vue +48 -0
  87. package/src/components/BlockImage/BlockImageFullBleed.vue +119 -0
  88. package/src/components/BlockImage/BlockImageStandard.vue +106 -0
  89. package/src/components/BlockImageCarousel/BlockImageCarousel.stories.js +108 -0
  90. package/src/components/BlockImageCarousel/BlockImageCarousel.vue +201 -0
  91. package/src/components/BlockImageCarouselItem/BlockImageCarouselItem.stories.js +63 -0
  92. package/src/components/BlockImageCarouselItem/BlockImageCarouselItem.vue +120 -0
  93. package/src/components/BlockImageComparison/BlockImageComparison.stories.js +46 -0
  94. package/src/components/BlockImageComparison/BlockImageComparison.vue +59 -0
  95. package/src/components/BlockImageGallery/BlockImageGallery.stories.js +55 -0
  96. package/src/components/BlockImageGallery/BlockImageGallery.vue +128 -0
  97. package/src/components/BlockInlineImage/BlockInlineImage.stories.js +68 -0
  98. package/src/components/BlockInlineImage/BlockInlineImage.vue +124 -0
  99. package/src/components/BlockKeyPoints/BlockKeyPoints.stories.js +28 -0
  100. package/src/components/BlockKeyPoints/BlockKeyPoints.vue +48 -0
  101. package/src/components/BlockLinkCard/BlockLinkCard.stories.js +102 -0
  102. package/src/components/BlockLinkCard/BlockLinkCard.vue +197 -0
  103. package/src/components/BlockLinkCarousel/BlockLinkCarousel.stories.js +217 -0
  104. package/src/components/BlockLinkCarousel/BlockLinkCarousel.vue +68 -0
  105. package/src/components/BlockLinkTile/BlockLinkTile.stories.js +72 -0
  106. package/src/components/BlockLinkTile/BlockLinkTile.vue +193 -0
  107. package/src/components/BlockListCards/BlockListCards.stories.js +69 -0
  108. package/src/components/BlockListCards/BlockListCards.vue +129 -0
  109. package/src/components/BlockQuote/BlockQuote.stories.js +84 -0
  110. package/src/components/BlockQuote/BlockQuote.vue +87 -0
  111. package/src/components/BlockRelatedLinks/BlockRelatedLinks.stories.js +60 -0
  112. package/src/components/BlockRelatedLinks/BlockRelatedLinks.vue +77 -0
  113. package/src/components/BlockRelatedLinks/RelatedLink.vue +85 -0
  114. package/src/components/BlockStreamfield/BlockStreamfield.stories.js +88 -0
  115. package/src/components/BlockStreamfield/BlockStreamfield.vue +333 -0
  116. package/src/components/BlockTable/BlockTable.stories.js +20 -0
  117. package/src/components/BlockTable/BlockTable.vue +73 -0
  118. package/src/components/BlockTeaser/BlockTeaser.stories.js +74 -0
  119. package/src/components/BlockTeaser/BlockTeaser.test.js +12 -0
  120. package/src/components/BlockTeaser/BlockTeaser.vue +174 -0
  121. package/src/components/BlockText/BlockText.stories.js +21 -0
  122. package/src/components/BlockText/BlockText.vue +44 -0
  123. package/src/components/BlockTwitterEmbed/BlockTwitterEmbed.stories.js +19 -0
  124. package/src/components/BlockTwitterEmbed/BlockTwitterEmbed.vue +61 -0
  125. package/src/components/BlockVideo/BlockVideo.stories.js +23 -0
  126. package/src/components/BlockVideo/BlockVideo.vue +41 -0
  127. package/src/components/BlockVideoEmbed/BlockVideoEmbed.stories.js +20 -0
  128. package/src/components/BlockVideoEmbed/BlockVideoEmbed.vue +71 -0
  129. package/src/components/CalendarButton/CalendarButton.stories.js +36 -0
  130. package/src/components/CalendarButton/CalendarButton.vue +86 -0
  131. package/src/components/DetailHeadline/DetailHeadline.stories.js +48 -0
  132. package/src/components/DetailHeadline/DetailHeadline.vue +143 -0
  133. package/src/components/DsnWidget/DsnWidget.stories.js +29 -0
  134. package/src/components/DsnWidget/DsnWidget.vue +96 -0
  135. package/src/components/EventCard/EventCard.vue +188 -0
  136. package/src/components/EventDetailHero/EventDetailHero.stories.js +53 -0
  137. package/src/components/EventDetailHero/EventDetailHero.vue +64 -0
  138. package/src/components/FormContact/FormContact.stories.js +16 -0
  139. package/src/components/FormContact/FormContact.vue +202 -0
  140. package/src/components/FormNewsletterSignup/FormNewsletterSignup.stories.js +16 -0
  141. package/src/components/FormNewsletterSignup/FormNewsletterSignup.vue +355 -0
  142. package/src/components/HeroLarge/HeroLarge.stories.js +46 -0
  143. package/src/components/HeroLarge/HeroLarge.vue +93 -0
  144. package/src/components/HeroListingIndex/HeroListingIndex.stories.js +156 -0
  145. package/src/components/HeroListingIndex/HeroListingIndex.vue +80 -0
  146. package/src/components/HeroMedia/HeroMedia.stories.js +135 -0
  147. package/src/components/HeroMedia/HeroMedia.vue +174 -0
  148. package/src/components/HeroMedium/HeroMedium.stories.js +73 -0
  149. package/src/components/HeroMedium/HeroMedium.vue +166 -0
  150. package/src/components/HomepageCarousel/HomepageCarousel.stories.js +112 -0
  151. package/src/components/HomepageCarousel/HomepageCarousel.vue +382 -0
  152. package/src/components/HomepageCarouselItem/HomepageCarouselItem.stories.js +60 -0
  153. package/src/components/HomepageCarouselItem/HomepageCarouselItem.vue +168 -0
  154. package/src/components/HomepageEmbedBlock/HomepageEmbedBlock.stories.js +35 -0
  155. package/src/components/HomepageEmbedBlock/HomepageEmbedBlock.vue +39 -0
  156. package/src/components/HomepageFeaturedRobot/HomepageFeaturedRobot.stories.js +93 -0
  157. package/src/components/HomepageFeaturedRobot/HomepageFeaturedRobot.vue +129 -0
  158. package/src/components/HomepageMissionsCarousel/HomepageMissionsCarousel.stories.js +153 -0
  159. package/src/components/HomepageMissionsCarousel/HomepageMissionsCarousel.vue +282 -0
  160. package/src/components/HomepageMissionsCarousel/HomepageMissionsCarouselItem.vue +143 -0
  161. package/src/components/HomepageStats/HomepageStats.stories.js +155 -0
  162. package/src/components/HomepageStats/HomepageStats.vue +362 -0
  163. package/src/components/HomepageTeaserBlock/HomepageTeaserBlock.stories.js +90 -0
  164. package/src/components/HomepageTeaserBlock/HomepageTeaserBlock.vue +156 -0
  165. package/src/components/HomepageTeaserBlock/HomepageTeaserBlockCardImage.vue +58 -0
  166. package/src/components/Icons/Icon360.vue +29 -0
  167. package/src/components/Icons/IconArrow.vue +26 -0
  168. package/src/components/Icons/IconArrows.vue +43 -0
  169. package/src/components/Icons/IconAudio.vue +27 -0
  170. package/src/components/Icons/IconBook.vue +21 -0
  171. package/src/components/Icons/IconBookUser.vue +21 -0
  172. package/src/components/Icons/IconBriefcase.vue +21 -0
  173. package/src/components/Icons/IconCalendar.vue +25 -0
  174. package/src/components/Icons/IconCaret.vue +26 -0
  175. package/src/components/Icons/IconCheckbox.vue +26 -0
  176. package/src/components/Icons/IconCheckboxSelected.vue +35 -0
  177. package/src/components/Icons/IconClose.vue +27 -0
  178. package/src/components/Icons/IconCloseLightbox.vue +25 -0
  179. package/src/components/Icons/IconDownload.vue +31 -0
  180. package/src/components/Icons/IconDropdown.vue +25 -0
  181. package/src/components/Icons/IconEnvelope.vue +21 -0
  182. package/src/components/Icons/IconExpand.vue +28 -0
  183. package/src/components/Icons/IconExternal.vue +25 -0
  184. package/src/components/Icons/IconFilter.vue +25 -0
  185. package/src/components/Icons/IconForwardTen.vue +38 -0
  186. package/src/components/Icons/IconGrid.vue +25 -0
  187. package/src/components/Icons/IconHand.vue +21 -0
  188. package/src/components/Icons/IconInfo.vue +26 -0
  189. package/src/components/Icons/IconLink.vue +27 -0
  190. package/src/components/Icons/IconList.vue +25 -0
  191. package/src/components/Icons/IconLocation.vue +37 -0
  192. package/src/components/Icons/IconMagnifyingGlass.vue +21 -0
  193. package/src/components/Icons/IconMedal.vue +21 -0
  194. package/src/components/Icons/IconMenu.vue +27 -0
  195. package/src/components/Icons/IconMinus.vue +26 -0
  196. package/src/components/Icons/IconMute.vue +27 -0
  197. package/src/components/Icons/IconNext.vue +25 -0
  198. package/src/components/Icons/IconPause.vue +28 -0
  199. package/src/components/Icons/IconPlay.vue +28 -0
  200. package/src/components/Icons/IconPlus.vue +25 -0
  201. package/src/components/Icons/IconPrev.vue +25 -0
  202. package/src/components/Icons/IconRewindTen.vue +42 -0
  203. package/src/components/Icons/IconSearch.vue +25 -0
  204. package/src/components/Icons/IconShare.vue +30 -0
  205. package/src/components/Icons/IconSlideshow.vue +30 -0
  206. package/src/components/Icons/IconSocialEmail.vue +26 -0
  207. package/src/components/Icons/IconSocialFacebook.vue +26 -0
  208. package/src/components/Icons/IconSocialGoogleClassroom.vue +26 -0
  209. package/src/components/Icons/IconSocialInstagram.vue +35 -0
  210. package/src/components/Icons/IconSocialPinterest.vue +26 -0
  211. package/src/components/Icons/IconSocialReddit.vue +25 -0
  212. package/src/components/Icons/IconSocialTwitter.vue +25 -0
  213. package/src/components/Icons/IconSocialYoutube.vue +35 -0
  214. package/src/components/Icons/IconStop.vue +27 -0
  215. package/src/components/Icons/IconTime.vue +25 -0
  216. package/src/components/Icons/IconUniversity.vue +21 -0
  217. package/src/components/Icons/IconUser.vue +26 -0
  218. package/src/components/Icons/IconVolume.vue +27 -0
  219. package/src/components/Icons/Icons.stories.ts +440 -0
  220. package/src/components/ImageDetailContextImage/ImageDetailContextImage.vue +125 -0
  221. package/src/components/LayoutHelper/LayoutHelper.vue +38 -0
  222. package/src/components/LoadingTransition/LoadingTransition.vue +48 -0
  223. package/src/components/LogoCaltech/LogoCaltech.stories.js +39 -0
  224. package/src/components/LogoCaltech/LogoCaltech.vue +29 -0
  225. package/src/components/LogoTribrand/LogoTribrand.stories.js +76 -0
  226. package/src/components/LogoTribrand/LogoTribrand.vue +93 -0
  227. package/src/components/MissionDetailAbout/MissionDetailAbout.stories.js +70 -0
  228. package/src/components/MissionDetailAbout/MissionDetailAbout.vue +204 -0
  229. package/src/components/MissionDetailHero/MissionDetailHero.stories.js +303 -0
  230. package/src/components/MissionDetailHero/MissionDetailHero.vue +292 -0
  231. package/src/components/MissionDetailHighlights/MissionDetailHighlights.stories.js +278 -0
  232. package/src/components/MissionDetailHighlights/MissionDetailHighlights.vue +332 -0
  233. package/src/components/MissionDetailHighlights/MissionDetailHighlightsCarousel.vue +160 -0
  234. package/src/components/MissionDetailHighlights/MissionDetailHighlightsCarouselItem.vue +123 -0
  235. package/src/components/MissionDetailInlineImage/MissionDetailInlineImage.stories.js +43 -0
  236. package/src/components/MissionDetailInlineImage/MissionDetailInlineImage.vue +97 -0
  237. package/src/components/MissionDetailStats/DistanceStats.test.js +133 -0
  238. package/src/components/MissionDetailStats/DistanceStats.vue +250 -0
  239. package/src/components/MissionDetailStats/MissionDetailStats.stories.js +95 -0
  240. package/src/components/MissionDetailStats/MissionDetailStats.test.js +23 -0
  241. package/src/components/MissionDetailStats/MissionDetailStats.vue +187 -0
  242. package/src/components/MissionDetailStats/MissionDetailStatsMicro.vue +52 -0
  243. package/src/components/MissionDetailStats/MissionDetailStatsMini.vue +109 -0
  244. package/src/components/MissionDetailStreamfield/MissionDetailStreamfield.stories.js +55 -0
  245. package/src/components/MissionDetailStreamfield/MissionDetailStreamfield.vue +95 -0
  246. package/src/components/MixinAnimationCaret/MixinAnimationCaret.stories.ts +24 -0
  247. package/src/components/MixinAnimationCaret/MixinAnimationCaret.vue +81 -0
  248. package/src/components/MixinCarousel/MixinCarousel.docs.mdx +33 -0
  249. package/src/components/MixinCarousel/MixinCarousel.stories.js +53 -0
  250. package/src/components/MixinCarousel/MixinCarousel.vue +236 -0
  251. package/src/components/MixinDropdownToggle/MixinDropdownToggle.vue +53 -0
  252. package/src/components/MixinFancybox/MixinFancybox.vue +405 -0
  253. package/src/components/MixinFancybox/MixinFancyboxOpenButton.vue +35 -0
  254. package/src/components/MixinVideoBg/MixinVideoBg.stories.js +23 -0
  255. package/src/components/MixinVideoBg/MixinVideoBg.vue +39 -0
  256. package/src/components/NavDesktop/NavDesktop.stories.js +254 -0
  257. package/src/components/NavDesktop/NavDesktop.vue +355 -0
  258. package/src/components/NavDesktop/NavDesktopDropdown.vue +201 -0
  259. package/src/components/NavDesktop/NavDesktopDropdownContent.vue +87 -0
  260. package/src/components/NavDesktop/NavDesktopDropdownMore.vue +112 -0
  261. package/src/components/NavDesktop/NavDesktopTopHat.vue +56 -0
  262. package/src/components/NavHeading/NavHeading.stories.js +23 -0
  263. package/src/components/NavHeading/NavHeading.vue +40 -0
  264. package/src/components/NavHighlight/NavHighlight.stories.js +42 -0
  265. package/src/components/NavHighlight/NavHighlight.vue +67 -0
  266. package/src/components/NavLinkList/NavLinkList.stories.js +46 -0
  267. package/src/components/NavLinkList/NavLinkList.vue +66 -0
  268. package/src/components/NavLogoLinks/NavLogoLinks.stories.js +22 -0
  269. package/src/components/NavLogoLinks/NavLogoLinks.vue +57 -0
  270. package/src/components/NavMobile/NavMobile.stories.js +231 -0
  271. package/src/components/NavMobile/NavMobile.vue +280 -0
  272. package/src/components/NavMobile/NavMobileDropdown.vue +175 -0
  273. package/src/components/NavMobile/NavMobileLink.vue +69 -0
  274. package/src/components/NavMobile/NavMobileSecondaryDropdown.vue +124 -0
  275. package/src/components/NavSearchForm/NavSearchForm.stories.js +13 -0
  276. package/src/components/NavSearchForm/NavSearchForm.vue +102 -0
  277. package/src/components/NavSecondary/NavSecondary.stories.js +24 -0
  278. package/src/components/NavSecondary/NavSecondary.vue +191 -0
  279. package/src/components/NavSecondary/NavSecondaryDropdown.vue +181 -0
  280. package/src/components/NavSecondary/NavSecondaryDropdownContent.vue +140 -0
  281. package/src/components/NavSecondary/NavSecondaryLink.vue +62 -0
  282. package/src/components/NavSocial/NavSocial.stories.js +20 -0
  283. package/src/components/NavSocial/NavSocial.vue +97 -0
  284. package/src/components/NewsDetailMediaContact/NewsDetailMediaContact.stories.js +60 -0
  285. package/src/components/NewsDetailMediaContact/NewsDetailMediaContact.test.js +30 -0
  286. package/src/components/NewsDetailMediaContact/NewsDetailMediaContact.vue +73 -0
  287. package/src/components/ParallaxContainer/ParallaxContainer.stories.js +47 -0
  288. package/src/components/ParallaxContainer/ParallaxContainer.vue +76 -0
  289. package/src/components/ParallaxElement/ParallaxElement.vue +25 -0
  290. package/src/components/PastEventsCarousel/PastEventsCarousel.vue +86 -0
  291. package/src/components/PodcastEpisodeCard/PodcastEpisodeCard.vue +251 -0
  292. package/src/components/PodcastSeriesCarousel/PodcastSeriesCarousel.stories.js +235 -0
  293. package/src/components/PodcastSeriesCarousel/PodcastSeriesCarousel.vue +171 -0
  294. package/src/components/ProfileDetailSectionGroup/ProfileDetailSectionGroup.vue +84 -0
  295. package/src/components/RoboticsDetailStats/RoboticsDetailStats.stories.js +97 -0
  296. package/src/components/RoboticsDetailStats/RoboticsDetailStats.test.js +21 -0
  297. package/src/components/RoboticsDetailStats/RoboticsDetailStats.vue +217 -0
  298. package/src/components/RoboticsDetailStats/RoboticsDetailStatsMini.vue +182 -0
  299. package/src/components/SearchFilterGroup/SearchFilterGroup.stories.js +59 -0
  300. package/src/components/SearchFilterGroup/SearchFilterGroup.vue +221 -0
  301. package/src/components/SearchInput/SearchInput.stories.js +35 -0
  302. package/src/components/SearchInput/SearchInput.vue +93 -0
  303. package/src/components/SearchPagination/SearchPagination.stories.js +55 -0
  304. package/src/components/SearchPagination/SearchPagination.vue +173 -0
  305. package/src/components/SearchResultCard/SearchResultCard.stories.js +57 -0
  306. package/src/components/SearchResultCard/SearchResultCard.vue +282 -0
  307. package/src/components/SearchResultGridItem/SearchResultGridItem.stories.js +70 -0
  308. package/src/components/SearchResultGridItem/SearchResultGridItem.vue +140 -0
  309. package/src/components/SearchResultsList/SearchResultsList.vue +183 -0
  310. package/src/components/SearchSelectMenu/SearchSelectMenu.stories.js +25 -0
  311. package/src/components/SearchSelectMenu/SearchSelectMenu.vue +86 -0
  312. package/src/components/ShareButtons/ShareButtons.stories.js +16 -0
  313. package/src/components/ShareButtons/ShareButtons.vue +132 -0
  314. package/src/components/ShareButtonsEdu/ShareButtonsEdu.stories.js +14 -0
  315. package/src/components/ShareButtonsEdu/ShareButtonsEdu.vue +215 -0
  316. package/src/components/SkipLink/SkipLink.stories.js +9 -0
  317. package/src/components/SkipLink/SkipLink.vue +53 -0
  318. package/src/components/SwimlaneCTA/SwimlaneCTA.stories.mdx +77 -0
  319. package/src/components/SwimlaneCTA/SwimlaneCTA.vue +281 -0
  320. package/src/components/TheFooter/TheFooter.stories.js +602 -0
  321. package/src/components/TheFooter/TheFooter.vue +228 -0
  322. package/src/components/TheFooter/TheFooterSignUp.vue +61 -0
  323. package/src/components/ThumbnailCarousel/ThumbnailCarousel.stories.js +106 -0
  324. package/src/components/ThumbnailCarousel/ThumbnailCarousel.vue +76 -0
  325. package/src/components/TopicDetailMissionCarousel/TopicDetailMissionCarousel.stories.js +93 -0
  326. package/src/components/TopicDetailMissionCarousel/TopicDetailMissionCarousel.vue +68 -0
  327. package/src/components/TopicDetailMissionCarouselItem/TopicDetailMissionCarouselItem.stories.js +38 -0
  328. package/src/components/TopicDetailMissionCarouselItem/TopicDetailMissionCarouselItem.vue +104 -0
  329. package/src/components/TopicDetailMissionSpotlight/TopicDetailMissionSpotlight.stories.js +84 -0
  330. package/src/components/TopicDetailMissionSpotlight/TopicDetailMissionSpotlight.vue +112 -0
  331. package/src/components/TopicDetailMore/TopicDetailMore.stories.js +221 -0
  332. package/src/components/TopicDetailMore/TopicDetailMore.vue +124 -0
  333. package/src/components/TopicDetailMore/TopicDetailMoreVisibility.vue +51 -0
  334. package/src/components/TopicDetailMoreItem/TopicDetailMoreItem.stories.js +116 -0
  335. package/src/components/TopicDetailMoreItem/TopicDetailMoreItem.vue +130 -0
  336. package/src/components/TopicDetailStreamfield/TopicDetailStreamfield.stories.js +34 -0
  337. package/src/components/TopicDetailStreamfield/TopicDetailStreamfield.vue +98 -0
  338. package/src/components/YearTicker/YearTicker.stories.js +37 -0
  339. package/src/components/YearTicker/YearTicker.vue +132 -0
  340. package/src/docs/foundation/DynamicTokens.vue +106 -0
  341. package/src/docs/foundation/FontVariants.vue +80 -0
  342. package/src/docs/foundation/color.docs.mdx +112 -0
  343. package/src/docs/foundation/grid.docs.mdx +189 -0
  344. package/src/docs/foundation/grid.stories.js +263 -0
  345. package/src/docs/foundation/grid_layouthelpers.docs.mdx +78 -0
  346. package/src/docs/foundation/grid_layouthelpers.stories.js +53 -0
  347. package/src/docs/foundation/themes.docs.mdx +71 -0
  348. package/src/docs/foundation/themes.stories.js +63 -0
  349. package/src/docs/foundation/typography.docs.mdx +50 -0
  350. package/src/docs/foundation/typography.stories.js +119 -0
  351. package/src/interfaces.ts +129 -0
  352. package/src/main.ts +34 -0
  353. package/src/store/header.ts +40 -0
  354. package/src/store/theme.ts +27 -0
  355. package/src/templates/PageContent/PageContent.stories.js +92 -0
  356. package/src/templates/PageContent/PageContent.vue +140 -0
  357. package/src/templates/PageEventDetail/PageEventDetail.stories.js +104 -0
  358. package/src/templates/PageEventDetail/PageEventDetail.vue +358 -0
  359. package/src/templates/PageNewsDetail/PageNewsDetail.stories.js +158 -0
  360. package/src/templates/PageNewsDetail/PageNewsDetail.vue +242 -0
  361. package/src/templates/edu/PageEduNewsDetail.stories.js +64 -0
  362. package/src/templates/edu/PageEduNewsDetail.vue +155 -0
  363. package/src/templates/www/HomePage/HomePage.vue +30 -0
  364. package/src/utils/dayjs.js +32 -0
  365. package/src/utils/filters.js +33 -0
  366. package/src/utils/mixins.ts +353 -0
  367. package/src/vite-env.d.ts +1 -0
  368. package/tailwind.config.js +24 -0
  369. package/tsconfig.json +29 -0
  370. package/tsconfig.node.json +11 -0
  371. package/vite.config.ts +55 -0
@@ -0,0 +1,187 @@
1
+ <template>
2
+ <div
3
+ class="MissionDetailStats MixedBleedGrid lg:relative lg:z-20 lg:-mt-20 lg:pl-0 lg:mb-20 pl-4 mb-12"
4
+ >
5
+ <h2 class="sr-only">Mission Statistics</h2>
6
+ <div
7
+ class="theme col-start-indent-col-2 col-end-container lg:py-12 lg:px-0 text-body-lg px-8 py-10 pr-0"
8
+ >
9
+ <div
10
+ class="gap-y-10 grid grid-cols-10"
11
+ :class="{ 'adaptive-stats-grid 2xl:grid-cols-11': showClock }"
12
+ >
13
+ <div class="lg:block hidden col-span-1 row-span-2"></div>
14
+ <div
15
+ v-if="showClock && startDateTime"
16
+ class="lg:col-span-6 col-span-10"
17
+ >
18
+ <p class="label text-subtitle">{{ clockTypeLabel }}</p>
19
+ <BaseTimer
20
+ :target-date-time="startDateTime"
21
+ :selected-units="['years', 'months', 'days', 'hours', 'minutes', 'seconds']"
22
+ :countdown="clockType === 'countdown'"
23
+ />
24
+ </div>
25
+
26
+ <DistanceStats
27
+ v-if="showDistance"
28
+ class="lg:col-span-3 col-span-10"
29
+ :distance-type="distanceType"
30
+ :value="distanceValue"
31
+ value-system="imperial"
32
+ :distance-api-urls="distanceApiUrls"
33
+ >
34
+ <template #label="slotProps">
35
+ <p class="label text-subtitle">{{ slotProps.label }}</p>
36
+ </template>
37
+ <template #value="slotProps">
38
+ <span class="text-stats-xl">{{ slotProps.formattedValue }}</span>
39
+ </template>
40
+ </DistanceStats>
41
+ <div
42
+ v-if="displayDate"
43
+ class="lg:col-span-2 col-span-5"
44
+ >
45
+ <p class="label text-subtitle">Launch Date</p>
46
+ <p>{{ displayDate }}</p>
47
+ </div>
48
+ <div
49
+ v-if="missionTypes.length > 0"
50
+ class="lg:col-span-2 col-span-5"
51
+ >
52
+ <p class="label text-subtitle">Type</p>
53
+ {{ missionTypes.map((t) => t.missionType).join(', ') }}
54
+ </div>
55
+ <div
56
+ v-if="missionTargets.length > 0"
57
+ class="lg:col-span-2 col-span-5"
58
+ >
59
+ <p class="label text-subtitle">Target</p>
60
+ {{ missionTargets.map((t) => t.target).join(', ') }}
61
+ </div>
62
+ <div
63
+ v-if="status !== 'draft'"
64
+ class="lg:col-span-2 col-span-5"
65
+ >
66
+ <p class="label text-subtitle">Status</p>
67
+ {{ statusLabel }}
68
+ </div>
69
+ </div>
70
+ </div>
71
+ <div class="theme col-start-container-end col-end-bleed"></div>
72
+ </div>
73
+ </template>
74
+ <script lang="ts">
75
+ // @ts-nocheck
76
+ import type { PropType } from 'vue'
77
+ import { defineComponent } from 'vue'
78
+ import DistanceStats from './DistanceStats.vue'
79
+ import type { DistanceType } from './DistanceStats.vue'
80
+ import BaseTimer from './../BaseTimer/BaseTimer.vue'
81
+
82
+ // https://github.com/nasa-jpl/www-backend/blame/develop/cms/missions/choices.py
83
+ export const statuses = {
84
+ draft: 'Select status',
85
+ current: 'Current',
86
+ future: 'Future',
87
+ proposed: 'Proposed',
88
+ past: 'Past'
89
+ } as const
90
+ type Status = keyof typeof statuses
91
+ type StatusLabel = (typeof statuses)[Status]
92
+
93
+ export const clockTypes = {
94
+ countdown: 'Countdown',
95
+ time_in_orbit: 'Time in Orbit',
96
+ time_on_mars: 'Time on Mars',
97
+ time_to_mars: 'Time to Mars',
98
+ time_to_dest: 'Time to Destination'
99
+ } as const
100
+ export type ClockType = keyof typeof clockTypes
101
+
102
+ /**
103
+ * Displays mission-related metrics or metadata. All fields optional.
104
+ */
105
+ export default defineComponent({
106
+ name: 'MissionDetailStats',
107
+ components: {
108
+ BaseTimer,
109
+ DistanceStats
110
+ },
111
+ props: {
112
+ showClock: Boolean,
113
+ clockType: {
114
+ type: String as PropType<ClockType>,
115
+ required: true,
116
+ validator: (val: ClockType): boolean => Boolean(clockTypes[val])
117
+ },
118
+ startDateTime: String,
119
+ displayDate: {
120
+ type: String || null,
121
+ required: false
122
+ },
123
+ missionTypes: {
124
+ type: Array as PropType<{ missionType: string }[]>,
125
+ required: true,
126
+ default: () => []
127
+ },
128
+ missionTargets: {
129
+ type: Array as PropType<{ target: string }[]>,
130
+ required: true,
131
+ default: () => []
132
+ },
133
+ status: {
134
+ type: String as PropType<Status>,
135
+ required: true,
136
+ validator: (val: Status): boolean => Boolean(statuses[val])
137
+ },
138
+ showDistance: Boolean,
139
+ distanceType: {
140
+ type: String as PropType<DistanceType | ''>,
141
+ required: false,
142
+ default: ''
143
+ },
144
+ distanceValue: Number,
145
+ distanceApiUrls: String
146
+ },
147
+ computed: {
148
+ clockTypeLabel(): string {
149
+ return clockTypes[this.clockType as ClockType] || this.clockType
150
+ },
151
+ statusLabel(): StatusLabel | Status {
152
+ return statuses[this.status as Status] || this.status
153
+ }
154
+ }
155
+ })
156
+ </script>
157
+ <style lang="scss">
158
+ .MissionDetailStats {
159
+ .adaptive-stats-grid div:nth-child(3) {
160
+ @apply col-span-3;
161
+ }
162
+
163
+ .theme {
164
+ @apply bg-gray-light text-gray-dark;
165
+ }
166
+
167
+ .ThemeVariantDark & .theme {
168
+ @apply bg-dark-blue bg-opacity-75 text-white;
169
+ }
170
+
171
+ .label {
172
+ @apply font-semibold mb-3 text-jpl-red-dark;
173
+ }
174
+
175
+ .ThemeVariantDark & .label {
176
+ @apply text-jpl-aqua;
177
+ }
178
+
179
+ .legend {
180
+ @apply text-gray-mid-dark;
181
+ }
182
+
183
+ .ThemeVariantDark & .legend {
184
+ @apply text-white;
185
+ }
186
+ }
187
+ </style>
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <div class="MissionDetailStatsMicro bg-dark-blue sm:py-0 p-3 py-1 text-white">
3
+ <div v-if="showClock && startDateTime">
4
+ <BaseTimer
5
+ :target-date-time="startDateTime"
6
+ inline
7
+ :countdown="clockType === 'countdown'"
8
+ />
9
+ </div>
10
+ </div>
11
+ </template>
12
+ <script lang="ts">
13
+ import type { PropType } from 'vue'
14
+ import { defineComponent } from 'vue'
15
+ import { clockTypes } from './MissionDetailStats.vue'
16
+ import type { ClockType } from './MissionDetailStats.vue'
17
+ import BaseTimer from './../BaseTimer/BaseTimer.vue'
18
+
19
+ export default defineComponent({
20
+ name: 'MissionDetailStatsMicro',
21
+ components: {
22
+ BaseTimer
23
+ },
24
+ props: {
25
+ showClock: Boolean,
26
+ startDateTime: String,
27
+ clockType: {
28
+ type: String as PropType<ClockType>,
29
+ required: true,
30
+ validator: (val: ClockType): boolean => Boolean(clockTypes[val])
31
+ }
32
+ }
33
+ })
34
+ </script>
35
+ <style lang="scss">
36
+ .MissionDetailStatsMicro {
37
+ .text-stats-xl {
38
+ @apply text-base leading-none;
39
+
40
+ @screen sm {
41
+ @apply text-4xl;
42
+ }
43
+ }
44
+
45
+ .legend {
46
+ @apply text-sm;
47
+ @screen sm {
48
+ @apply text-base;
49
+ }
50
+ }
51
+ }
52
+ </style>
@@ -0,0 +1,109 @@
1
+ <template>
2
+ <div class="MissionDetailStatsMini MixedBleedGrid">
3
+ <div class="theme col-start-bleed col-end-container-start"></div>
4
+ <div class="col-start-container col-end-container text-body-lg">
5
+ <div class="grid grid-cols-12">
6
+ <div
7
+ v-if="showClock && startDateTime"
8
+ class="theme-inner lg:col-span-4 xl:col-span-4 2xl:col-span-3 sm:col-span-7 col-span-11"
9
+ >
10
+ <p class="text-jpl-aqua text-subtitle mb-3">
11
+ {{ clockTypeLabel }}
12
+ </p>
13
+ <BaseTimer
14
+ :target-date-time="startDateTime"
15
+ :countdown="clockType === 'countdown'"
16
+ />
17
+ </div>
18
+
19
+ <DistanceStats
20
+ v-if="showDistance"
21
+ class="theme-inner lg:col-span-4 xl:col-span-4 2xl:col-span-3 sm:col-span-7 col-span-11"
22
+ :distance-type="distanceType as DistanceType"
23
+ :value="distanceValue"
24
+ value-system="imperial"
25
+ :distance-api-urls="distanceApiUrls"
26
+ >
27
+ <template #label="slotProps">
28
+ <p class="text-jpl-aqua text-subtitle mb-3">
29
+ {{ slotProps.label }}
30
+ </p>
31
+ </template>
32
+ <template #value="slotProps">
33
+ <span class="text-stats-xl">{{ slotProps.formattedValue }}</span>
34
+ </template>
35
+ </DistanceStats>
36
+ <div class="lg:block hidden col-span-1"></div>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </template>
41
+ <script lang="ts">
42
+ import type { PropType } from 'vue'
43
+ import { defineComponent } from 'vue'
44
+ import DistanceStats from './DistanceStats.vue'
45
+ import { clockTypes } from './MissionDetailStats.vue'
46
+ import type { DistanceType } from './DistanceStats.vue'
47
+ import type { ClockType } from './MissionDetailStats.vue'
48
+ import BaseTimer from './../BaseTimer/BaseTimer.vue'
49
+
50
+ /**
51
+ * Displays mission-related metrics or metadata. All fields optional.
52
+ */
53
+ export default defineComponent({
54
+ name: 'MissionDetailStatsMini',
55
+ components: {
56
+ BaseTimer,
57
+ DistanceStats
58
+ },
59
+ props: {
60
+ showClock: Boolean,
61
+ clockType: {
62
+ type: String as PropType<ClockType>,
63
+ required: true,
64
+ validator: (val: ClockType): boolean => Boolean(clockTypes[val])
65
+ },
66
+ startDateTime: String,
67
+ showDistance: Boolean,
68
+ distanceType: {
69
+ type: String as PropType<DistanceType | ''>
70
+ },
71
+ distanceValue: Number,
72
+ distanceApiUrls: String
73
+ },
74
+ computed: {
75
+ clockTypeLabel(): string {
76
+ return clockTypes[this.clockType as ClockType] || this.clockType
77
+ }
78
+ }
79
+ })
80
+ </script>
81
+ <style lang="scss">
82
+ .MissionDetailStatsMini {
83
+ .theme,
84
+ .theme-inner {
85
+ @apply bg-dark-blue bg-opacity-75 text-white;
86
+ }
87
+ // different padding left for first child, which is dynamic
88
+ .theme-inner {
89
+ @apply pl-10 pb-10;
90
+ @screen lg {
91
+ @apply py-10 pl-0;
92
+ }
93
+
94
+ &:first-child {
95
+ @apply pt-10;
96
+ @screen lg {
97
+ @apply pl-10;
98
+ }
99
+ @screen 2xl {
100
+ @apply pl-0;
101
+ }
102
+ }
103
+ }
104
+
105
+ .legend {
106
+ @apply text-white;
107
+ }
108
+ }
109
+ </style>
@@ -0,0 +1,55 @@
1
+ import { BaseImageCaptionData } from './../BaseImageCaption/BaseImageCaption.stories.js'
2
+ import { BlockIframeEmbedData } from './../BlockIframeEmbed/BlockIframeEmbed.stories.js'
3
+ import MissionDetailStreamfield from './MissionDetailStreamfield.vue'
4
+
5
+ export default {
6
+ title: 'WWW/MissionDetail/MissionDetailStreamfield',
7
+ component: MissionDetailStreamfield,
8
+ excludeStories: /.*Data$/
9
+ }
10
+
11
+ export const MissionDetailStreamfieldData = {
12
+ feature: [
13
+ {
14
+ blockType: 'HeadingBlock',
15
+ heading: 'GRACE-FO Data'
16
+ },
17
+ {
18
+ alignTo: 'right',
19
+ blockType: 'InlineImageBlock',
20
+ image: {
21
+ ...BaseImageCaptionData,
22
+ src: {
23
+ height: 700,
24
+ url: 'https://picsum.photos/700/700',
25
+ width: 700
26
+ },
27
+ screenXs: {
28
+ url: 'https://picsum.photos/320/320',
29
+ width: 320
30
+ },
31
+ screenLg: {
32
+ url: 'https://picsum.photos/1024/1024',
33
+ width: 1024
34
+ },
35
+ alt: ''
36
+ },
37
+ text: '<p>Global surface mass anomalies observed by the GRACE-FO satellites. GRACE-FO provides regular (at least monthly) updates of surface mass anomalies.<br/></p><p>For more information and data access, please visit <a href="https://grace.jpl.nasa.gov">grace.jpl.nasa.gov</a>.</p>'
38
+ },
39
+ {
40
+ blockType: 'QuoteBlock',
41
+ attribution: 'Felix Landerer, Project Scientist',
42
+ quote:
43
+ 'As an oceanographer myself, it never ceases to amaze me that we can map month-to-month pressure differences as small as 10 mm at the bottom of the oceans from space.”',
44
+ quoteLink: [
45
+ {
46
+ externalLink: 'http://google.com',
47
+ page: null
48
+ }
49
+ ]
50
+ },
51
+ { ...BlockIframeEmbedData }
52
+ ]
53
+ }
54
+
55
+ export const Streamfield = { args: { data: MissionDetailStreamfieldData.feature } }
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <div
3
+ v-if="data"
4
+ class="MissionDetailStreamfield"
5
+ >
6
+ <template v-for="(block, index) in data">
7
+ <LayoutHelper
8
+ v-if="block.blockType == 'HeadingBlock'"
9
+ :key="index"
10
+ indent="col-2"
11
+ >
12
+ <BaseHeading
13
+ :level="block.level"
14
+ class="MissionDetailStreamfield-heading md:mb-8 mb-5"
15
+ >
16
+ {{ block.heading }}
17
+ </BaseHeading>
18
+ </LayoutHelper>
19
+ <MissionDetailInlineImage
20
+ v-else-if="block.blockType == 'InlineImageBlock'"
21
+ :key="`InlineImageBlock${index}`"
22
+ :alignment="block.alignTo"
23
+ :text="block.text"
24
+ :image="block.image"
25
+ class="lg:mb-18 mb-10"
26
+ />
27
+ <LayoutHelper
28
+ v-else-if="block.blockType == 'QuoteBlock'"
29
+ :key="`QuoteBlock${index}`"
30
+ indent="col-3"
31
+ class="lg:mb-18 mb-10"
32
+ >
33
+ <BlockQuote :data="block" />
34
+ </LayoutHelper>
35
+ <LayoutHelper
36
+ v-else-if="block.blockType == 'IframeEmbedBlock'"
37
+ :key="`IframeEmbedBlock${index}`"
38
+ indent="col-2"
39
+ class="lg:mb-18 mb-10"
40
+ >
41
+ <BlockIframeEmbed :data="block" />
42
+ </LayoutHelper>
43
+ </template>
44
+ </div>
45
+ </template>
46
+
47
+ <script lang="ts">
48
+ // @ts-nocheck
49
+ import MissionDetailInlineImage from './../MissionDetailInlineImage/MissionDetailInlineImage.vue'
50
+ import BaseHeading from './../BaseHeading/BaseHeading.vue'
51
+ import BlockQuote from './../BlockQuote/BlockQuote.vue'
52
+ import LayoutHelper from './../LayoutHelper/LayoutHelper.vue'
53
+ import BlockIframeEmbed from './../BlockIframeEmbed/BlockIframeEmbed.vue'
54
+
55
+ export default {
56
+ name: 'MissionDetailStreamfield',
57
+ components: {
58
+ MissionDetailInlineImage,
59
+ BaseHeading,
60
+ BlockQuote,
61
+ LayoutHelper,
62
+ BlockIframeEmbed
63
+ },
64
+ props: {
65
+ data: {
66
+ type: Array,
67
+ required: false
68
+ }
69
+ }
70
+ }
71
+ </script>
72
+ <style lang="scss" scoped>
73
+ .ThemeVariantDark {
74
+ .MissionDetailStreamfield-heading,
75
+ .BlockText {
76
+ @apply text-white;
77
+ }
78
+ }
79
+
80
+ .MissionDetailStreamfield {
81
+ .MissionDetailInlineImage {
82
+ .featured-image {
83
+ max-width: 700px;
84
+ width: auto;
85
+ position: relative;
86
+ display: block;
87
+ }
88
+ @media screen and (min-width: 1024px) {
89
+ .BlockText p {
90
+ max-width: 30ch;
91
+ }
92
+ }
93
+ }
94
+ }
95
+ </style>
@@ -0,0 +1,24 @@
1
+ import MixinAnimationCaret from './MixinAnimationCaret.vue'
2
+
3
+ export default {
4
+ title: 'Mixins/MixinAnimationCaret',
5
+ component: MixinAnimationCaret,
6
+ parameters: {
7
+ slots: {
8
+ default: 'Default slot content'
9
+ },
10
+ viewMode: 'docs',
11
+ docs: {
12
+ description: {
13
+ component:
14
+ 'This mixin appends an animated caret to a line of text or to more complex HTML markup. When implemented, it must be wrapped by a link element with CSS class `group` to ensure that the animation is triggered by hovering over the link. See the `BaseLink` primary variant for an implementation example.'
15
+ }
16
+ }
17
+ }
18
+ }
19
+
20
+ export const Default = {
21
+ args: {
22
+ default: 'Text with caret'
23
+ }
24
+ }
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ import { defineComponent } from 'vue'
3
+ import IconCaret from './../Icons/IconCaret.vue'
4
+
5
+ export default defineComponent({
6
+ name: 'MixinAnimationCaret',
7
+ components: {
8
+ IconCaret
9
+ },
10
+ props: {
11
+ // when wrapped in a parent component i.e. BaseLink and grandparent component needs to pass a class
12
+ // appended to classes applied to .MixinAnimationCaret
13
+ passedWrapperClass: {
14
+ type: String || null,
15
+ required: false,
16
+ default: ''
17
+ },
18
+ // to modify spacing around the caret itself
19
+ arrowClass: {
20
+ type: String,
21
+ required: false,
22
+ default: ''
23
+ },
24
+ // default color class
25
+ color: {
26
+ type: String,
27
+ required: false,
28
+ default: 'text-primary'
29
+ },
30
+ // default margin left class
31
+ marginLeft: {
32
+ type: String,
33
+ default: 'ml-1',
34
+ required: false
35
+ },
36
+ // appends .caret-inline .MixinAnimationCaret
37
+ inline: {
38
+ type: Boolean,
39
+ default: false,
40
+ required: false
41
+ }
42
+ },
43
+ computed: {
44
+ computedClass(): string {
45
+ let classes = ''
46
+ if (this.passedWrapperClass) {
47
+ classes = classes + ' ' + this.passedWrapperClass
48
+ }
49
+ if (this.inline) {
50
+ classes = classes + ' caret-inline'
51
+ }
52
+ return classes
53
+ }
54
+ }
55
+ })
56
+ </script>
57
+ <template>
58
+ <span
59
+ class="MixinAnimationCaret"
60
+ :class="computedClass"
61
+ >
62
+ <span>
63
+ <slot></slot>
64
+ </span>
65
+ <span
66
+ class="arrow-wrapper"
67
+ :class="[arrowClass, color, marginLeft]"
68
+ aria-hidden="true"
69
+ >
70
+ <span class="arrow">
71
+ <IconCaret />
72
+ </span>
73
+ <span class="arrow-fixed">
74
+ <IconCaret />
75
+ </span>
76
+ </span>
77
+ </span>
78
+ </template>
79
+ <style lang="scss">
80
+ @import '@explorer-1/common/src/scss/components/MixinAnimationCaret';
81
+ </style>
@@ -0,0 +1,33 @@
1
+ import { Meta, Story, Canvas } from '@storybook/addon-docs'
2
+ import * as Stories from './MixinCarousel.stories'
3
+
4
+ <Meta of={Stories} />
5
+
6
+ # MixinCarousel
7
+
8
+ This is a `swiper.js` wrapper for the carousels that consist of multiple cards in view that also bleed to full width.
9
+
10
+ <Canvas of={Stories.Default} />
11
+
12
+ ### Variants
13
+
14
+ There are currently two variants that can be applied via the `variant` prop. These are used to to apply a class to the main wrapper that dictates subtle changes to the layout. For the most part, these have to do with the vertical placement of the navigation arrows.
15
+
16
+ | Variant | Description |
17
+ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
18
+ | `cards` | This is the default variant and accommodates cards that have text below the image. This places the navigation arrows in the vertical center of an image with a 16:9 aspect ratio. |
19
+ | `tiles` | This places the navigation arrows in the vertical center of the entire slide |
20
+
21
+ ## Basic Usage
22
+
23
+ The default slot should be your slides, and each slide must have the `.swiper-slide` class.
24
+
25
+ ### Option with a link in the top right
26
+
27
+ And with a link using the `link` and `linkTitle` props:
28
+
29
+ <Canvas of={Stories.BaseCarouselWLink} />
30
+
31
+ ## Used in the following components
32
+
33
+ See [all usage in the repository](https://github.com/nasa-jpl/www-frontend/search?q=MixinCarousel&type=code).
@@ -0,0 +1,53 @@
1
+ import MixinCarousel, { variants } from './MixinCarousel.vue'
2
+
3
+ export default {
4
+ title: 'Mixins/MixinCarousel',
5
+ component: MixinCarousel,
6
+ tags: ['!autodocs'],
7
+ argTypes: {
8
+ variant: {
9
+ control: { type: 'select' },
10
+ options: Object.keys(variants)
11
+ }
12
+ }
13
+ }
14
+
15
+ export const Default = {
16
+ name: 'BaseCarousel',
17
+ args: {
18
+ heading: 'Heading',
19
+ variant: 'tiles'
20
+ },
21
+ render: (args) => ({
22
+ components: { MixinCarousel },
23
+ setup() {
24
+ return { args }
25
+ },
26
+ template: `<MixinCarousel v-bind="args">
27
+ <div v-for="(item, index) in [1, 2, 3, 4, 5, 6, 7]" :key="index" class="swiper-slide">
28
+ <img src="https://picsum.photos/550/483" width="550" height="483" alt="test slide">
29
+ </div>
30
+ </MixinCarousel>`
31
+ })
32
+ }
33
+
34
+ export const BaseCarouselWLink = {
35
+ name: 'BaseCarousel w/ Link',
36
+ args: {
37
+ heading: 'Heading',
38
+ variant: 'tiles',
39
+ link: '/placeholder',
40
+ linkTitle: 'See more'
41
+ },
42
+ render: (args) => ({
43
+ components: { MixinCarousel },
44
+ setup() {
45
+ return { args }
46
+ },
47
+ template: `<MixinCarousel v-bind="args">
48
+ <div v-for="(item, index) in [1, 2, 3, 4, 5, 6, 7]" :key="index" class="swiper-slide">
49
+ <img src="https://picsum.photos/550/483" width="550" height="483" alt="test slide">
50
+ </div>
51
+ </MixinCarousel>`
52
+ })
53
+ }