@explorer-1/vue 0.2.5 → 0.2.7

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 (43) hide show
  1. package/dist/explorer-1-vue.js +2612 -2556
  2. package/dist/explorer-1-vue.umd.cjs +14 -12
  3. package/dist/src/components/CalendarButton/CalendarButton.vue.d.ts +3 -2
  4. package/dist/src/components/EventCard/EventCard.vue.d.ts +9 -4
  5. package/dist/src/components/EventDetailHero/EventDetailHero.vue.d.ts +11 -0
  6. package/dist/src/components/NavDesktopEdu/NavDesktopEdu.stories.d.ts +58 -11
  7. package/dist/src/templates/edu/PageEduEventDetail/PageEduEventDetail.stories.d.ts +57 -29
  8. package/dist/src/utils/mixins.d.ts +2 -0
  9. package/dist/style.css +1 -1
  10. package/package.json +2 -2
  11. package/src/components/BaseButton/BaseButton.vue +1 -1
  12. package/src/components/BaseImage/BaseImage.vue +1 -1
  13. package/src/components/BaseTag/BaseTag.vue +2 -2
  14. package/src/components/BlockIframeEmbed/BlockIframeEmbed.vue +3 -2
  15. package/src/components/BlockImage/BlockImageStandard.vue +1 -1
  16. package/src/components/BlockKeyPoints/BlockKeyPoints.vue +2 -2
  17. package/src/components/BlockLinkCard/BlockLinkCard.vue +1 -0
  18. package/src/components/BlockRelatedLinks/BlockRelatedLinks.vue +29 -27
  19. package/src/components/BlockRelatedLinks/RelatedLink.vue +3 -3
  20. package/src/components/BlockVideo/BlockVideo.vue +1 -1
  21. package/src/components/BlockVideoEmbed/BlockVideoEmbed.vue +1 -1
  22. package/src/components/CalendarButton/CalendarButton.vue +9 -10
  23. package/src/components/EventCard/EventCard.vue +22 -8
  24. package/src/components/EventDetailHero/EventDetailHero.vue +45 -21
  25. package/src/components/HeroMedia/HeroMedia.vue +2 -2
  26. package/src/components/MixinCarousel/MixinCarousel.vue +2 -2
  27. package/src/components/NavDesktop/NavDesktopDropdown.vue +1 -1
  28. package/src/components/NavDesktopEdu/NavDesktopEdu.stories.js +6 -15
  29. package/src/components/NavDesktopEdu/NavDesktopEdu.vue +35 -9
  30. package/src/components/NavHeading/NavHeading.stories.js +1 -1
  31. package/src/components/NavHeading/NavHeading.vue +1 -1
  32. package/src/components/NavLinkList/NavLinkList.vue +1 -1
  33. package/src/components/NavMobile/NavMobile.vue +36 -11
  34. package/src/components/ShareButtons/ShareButtons.vue +1 -1
  35. package/src/components/ShareButtonsEdu/ShareButtonsEdu.vue +1 -1
  36. package/src/components/TheFooter/TheFooter.vue +18 -2
  37. package/src/templates/PageEventDetail/PageEventDetail.vue +2 -1
  38. package/src/templates/PageNewsDetail/PageNewsDetail.vue +3 -1
  39. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.stories.js +146 -104
  40. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.vue +101 -50
  41. package/src/templates/edu/PageEduExplainerArticle/PageEduExplainerArticle.vue +1 -1
  42. package/src/utils/mixins.ts +18 -14
  43. package/tsconfig.json +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorer-1/vue",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -29,7 +29,7 @@
29
29
  "vue": "^3.4.21",
30
30
  "vue-observe-visibility": "^1.0.0",
31
31
  "vue3-compare-image": "^1.2.5",
32
- "@explorer-1/common": "1.1.1"
32
+ "@explorer-1/common": "1.1.3"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@vitejs/plugin-vue": "^5.0.4",
@@ -94,7 +94,7 @@ export default defineComponent({
94
94
  <template>
95
95
  <component
96
96
  :is="tag"
97
- class="BaseButton text-contrast-none"
97
+ class="BaseButton text-contrast-none print:border print:!border-gray-dark print:text-center"
98
98
  :class="variantClass"
99
99
  :aria-label="ariaLabel"
100
100
  :disabled="disabled"
@@ -103,7 +103,7 @@ export default defineComponent({
103
103
  <img
104
104
  v-if="src"
105
105
  ref="BaseImage"
106
- class="BaseImage"
106
+ class="BaseImage print:border print:border-gray-mid"
107
107
  :class="computedClass"
108
108
  :data-src="src"
109
109
  :data-srcset="srcset"
@@ -11,7 +11,7 @@ const variantMap: Attributes = {
11
11
  const sizeMap: Attributes = {
12
12
  sm: 'text-xs border-t-2 py-1 px-2.5',
13
13
  md: 'text-xs lg:text-base border-t py-1.5 px-3.5',
14
- lg: 'text-base lg:text-lg border-t py-1.5 px-5'
14
+ lg: 'text-base lg:text-lg border-t pt-1.5 pb-1 px-5'
15
15
  }
16
16
 
17
17
  interface BaseTagProps {
@@ -28,7 +28,7 @@ const props = withDefaults(defineProps<BaseTagProps>(), {
28
28
  <template>
29
29
  <p
30
30
  :class="`${variantMap[props.variant]} ${sizeMap[props.size]}`"
31
- class="ThemeVariantLight text-contrast-none inline-block text-white font-bold edu:font-extrabold rounded-full leading-tight m-0 uppercase"
31
+ class="ThemeVariantLight text-contrast-none inline-block text-white font-bold edu:font-extrabold rounded-full leading-tight m-0 uppercase print:border-none print:px-0"
32
32
  >
33
33
  <slot />
34
34
  <span class="sr-only">.</span>
@@ -5,7 +5,7 @@
5
5
  v-if="data.url"
6
6
  ref="BlockIframeEmbed"
7
7
  loading="lazy"
8
- class="w-full border-none"
8
+ class="w-full border-none print:!border print:border-gray-dark"
9
9
  :class="{ lazyload: !lazyNative }"
10
10
  :title="data.title"
11
11
  :data-src="data.url"
@@ -18,6 +18,7 @@
18
18
  <template v-else>
19
19
  <BaseImagePlaceholder
20
20
  v-if="data.url"
21
+ class="print:border print:border-gray-dark"
21
22
  aspect-ratio="16:9"
22
23
  dark-mode
23
24
  >
@@ -39,7 +40,7 @@
39
40
  </template>
40
41
  <div
41
42
  v-if="data.caption && data.caption.length > 2"
42
- class="lg:px-0 p-4 pb-0"
43
+ class="lg:px-0 p-4 pb-0 print:pl-0"
43
44
  >
44
45
  <BaseImageCaption :data="data" />
45
46
  </div>
@@ -98,7 +98,7 @@ export default defineComponent({
98
98
  </MixinFancybox>
99
99
  <div
100
100
  v-if="theData && hasCaptionArea"
101
- class="lg:px-0 p-4 pb-0"
101
+ class="lg:px-0 p-4 pb-0 print:pl-0"
102
102
  >
103
103
  <BaseImageCaption :data="theData" />
104
104
  </div>
@@ -7,11 +7,11 @@
7
7
  class="mb-5"
8
8
  :data="{ heading: data.heading }"
9
9
  />
10
- <ul>
10
+ <ul class="print:!list-disc">
11
11
  <li
12
12
  v-for="(item, index) in data.listItem"
13
13
  :key="index"
14
- class="flex"
14
+ class="flex print:!list-item print:ml-4"
15
15
  :class="index + 1 === data.listItem.length ? 'mb-0' : 'mb-4'"
16
16
  >
17
17
  <BlockText
@@ -208,6 +208,7 @@ export default defineComponent({
208
208
  .BlockLinkCard__CardContent,
209
209
  .BlockLinkCard__CardArrow {
210
210
  @apply px-6;
211
+ @apply print:px-0;
211
212
  }
212
213
  .BaseImagePlaceholder {
213
214
  @apply bg-gray-mid-dark;
@@ -8,36 +8,38 @@
8
8
  >
9
9
  {{ data.heading }}
10
10
  </BaseHeading>
11
- <div
11
+ <ul
12
12
  v-for="(link, index) in data.links"
13
13
  :key="index"
14
- class="sm:w-3/4 md:w-2/3 lg:w-3/4 xl:w-2/3 mb-2"
14
+ class="sm:w-3/4 md:w-2/3 lg:w-3/4 xl:w-2/3 mb-2 print:list-disc print:ml-4"
15
15
  >
16
- <template v-if="link.externalLink">
17
- <RelatedLink
18
- variant="external"
19
- :href="link.externalLink"
20
- >
21
- {{ link.text }}
22
- </RelatedLink>
23
- </template>
24
- <template v-else-if="link.document">
25
- <RelatedLink
26
- variant="document"
27
- :href="link.document.url"
28
- >
29
- {{ link.text }}
30
- </RelatedLink>
31
- </template>
32
- <template v-else-if="link.page">
33
- <RelatedLink
34
- variant="page"
35
- :to="link.page.url"
36
- >
37
- {{ link.text }}
38
- </RelatedLink>
39
- </template>
40
- </div>
16
+ <li>
17
+ <template v-if="link.externalLink">
18
+ <RelatedLink
19
+ variant="external"
20
+ :href="link.externalLink"
21
+ >
22
+ {{ link.text }}
23
+ </RelatedLink>
24
+ </template>
25
+ <template v-else-if="link.document">
26
+ <RelatedLink
27
+ variant="document"
28
+ :href="link.document.url"
29
+ >
30
+ {{ link.text }}
31
+ </RelatedLink>
32
+ </template>
33
+ <template v-else-if="link.page">
34
+ <RelatedLink
35
+ variant="page"
36
+ :to="link.page.url"
37
+ >
38
+ {{ link.text }}
39
+ </RelatedLink>
40
+ </template>
41
+ </li>
42
+ </ul>
41
43
  </div>
42
44
  </template>
43
45
  <script lang="ts">
@@ -3,16 +3,16 @@
3
3
  :is="tag"
4
4
  :to="to"
5
5
  :href="href"
6
- class="bg-gray-light group text-body-lg flex items-center justify-between px-4 py-4 cursor-pointer"
6
+ class="bg-gray-light group text-body-lg flex items-center justify-between px-4 py-4 cursor-pointer print:px-0 print:py-0 print:block"
7
7
  :target="target"
8
8
  rel="noopener"
9
9
  >
10
- <span class="can-hover:group-hover:underline min-w-12 block w-auto break-words">
10
+ <span class="can-hover:group-hover:underline min-w-12 block w-auto break-words print:inline">
11
11
  <slot />
12
12
  </span>
13
13
  <component
14
14
  :is="icon"
15
- class="text-action xl:mx-4 flex-none ml-4 text-2xl leading-normal"
15
+ class="text-action xl:mx-4 flex-none ml-4 text-2xl leading-normal print:inline print:text-sm print:mx-2"
16
16
  :class="variant === 'external' ? 'text-lg' : 'text-3xl'"
17
17
  />
18
18
  </component>
@@ -10,7 +10,7 @@
10
10
 
11
11
  <div
12
12
  v-if="(data.caption && data.caption.length > 2) || data.credit"
13
- class="lg:px-0 p-4 pb-0"
13
+ class="lg:px-0 p-4 pb-0 print:pl-0"
14
14
  >
15
15
  <BaseImageCaption :data="data" />
16
16
  </div>
@@ -11,7 +11,7 @@
11
11
  </BaseImagePlaceholder>
12
12
  <div
13
13
  v-if="data.caption"
14
- class="lg:px-0 p-4"
14
+ class="lg:px-0 p-4 print:pl-0"
15
15
  >
16
16
  <BaseImageCaption :data="data" />
17
17
  </div>
@@ -64,13 +64,18 @@ export default defineComponent({
64
64
  options: undefined
65
65
  }
66
66
  },
67
+ computed: {
68
+ icsDescription() {
69
+ return `${(this.description ? this.description + '\n\n' : '') + window?.location.href}`
70
+ }
71
+ },
67
72
 
68
73
  mounted() {
69
74
  this.init()
70
75
  },
71
76
  methods: {
72
77
  init() {
73
- let recurrence = {}
78
+ let recurrence = undefined
74
79
  if (this.endDatetime && this.isAllDay) {
75
80
  // Calculate how many full days
76
81
  const startDateDayjs = dayjs(this.startDatetime)
@@ -81,21 +86,15 @@ export default defineComponent({
81
86
 
82
87
  this.options = {
83
88
  title: this.title ? this.title : undefined,
84
- location: this.location ? this.addSlashes(this.location) : undefined,
85
- description: this.description ? this.description : undefined,
89
+ location: this.location ? this.location : undefined,
90
+ description: this.icsDescription,
86
91
  start: new Date(this.startDatetime),
87
92
  end: !this.isAllDay && this.endDatetime ? new Date(this.endDatetime) : undefined,
88
93
  recurrence
89
94
  }
95
+
90
96
  this.icalendar = new ICalendar(this.options)
91
97
  },
92
- addSlashes(string: string): string {
93
- // Escape special characters COMMA, SEMI-COLON and BACKSLASH
94
- // as temporary fix for this issue https://github.com/jshor/datebook/issues/179
95
- // regex based of https://stackoverflow.com/a/770533
96
- // eslint-disable-next-line
97
- return string.replace(/[,;\\]/g, '\\$&').replace(/\u0000/g, '\\0')
98
- },
99
98
  handleDownload() {
100
99
  const ics = this.icalendar.render()
101
100
  const blob = new Blob([ics], {
@@ -65,12 +65,22 @@
65
65
  v-if="splitDate"
66
66
  class="hidden md:block absolute top-0 left-0 z-10 px-4 py-4 text-center text-white bg-primary"
67
67
  >
68
- <div class="font-extrabold text-6xl leading-tight tracking-wider">
69
- {{ splitDate.day }}
70
- </div>
71
- <div class="text-subtitle">
72
- {{ splitDate.monthAndYear }}
73
- </div>
68
+ <template v-if="themeStore.isEdu">
69
+ <div class="font-extrabold text-6xl leading-tight tracking-wider">
70
+ {{ splitDate.month }}
71
+ </div>
72
+ <div class="text-subtitle">
73
+ {{ splitDate.year }}
74
+ </div>
75
+ </template>
76
+ <template v-else>
77
+ <div class="font-extrabold text-6xl leading-tight tracking-wider">
78
+ {{ splitDate.day }}
79
+ </div>
80
+ <div class="text-subtitle">
81
+ {{ splitDate.monthAndYear }}
82
+ </div>
83
+ </template>
74
84
  </div>
75
85
  </BaseImagePlaceholder>
76
86
  </div>
@@ -84,8 +94,11 @@ import { defineComponent } from 'vue'
84
94
  import {
85
95
  mixinFormatEventDates,
86
96
  mixinFormatSplitEventDates,
87
- mixinFormatEventTimeInHoursAndMinutes
97
+ mixinFormatEventTimeInHoursAndMinutes,
98
+ type EventDateObject
88
99
  } from './../../utils/mixins'
100
+ import { mapStores } from 'pinia'
101
+ import { useThemeStore } from '../../store/theme'
89
102
  import BaseLink from './../BaseLink/BaseLink.vue'
90
103
  import BaseHeading from './../BaseHeading/BaseHeading.vue'
91
104
  import BaseImage from './../BaseImage/BaseImage.vue'
@@ -145,7 +158,8 @@ export default defineComponent({
145
158
  }
146
159
  },
147
160
  computed: {
148
- splitDate(): { day: string; monthAndYear: string } | null {
161
+ ...mapStores(useThemeStore),
162
+ splitDate(): EventDateObject | null {
149
163
  if (this.startDate) {
150
164
  return mixinFormatSplitEventDates(this.startDate, this.endDate)
151
165
  }
@@ -4,41 +4,55 @@
4
4
  class="EventDetailHero mb-10 md:mb-10 lg:mb-14 -mx-4 lg:mx-0"
5
5
  >
6
6
  <div class="hero">
7
- <BaseImage
8
- v-if="image.src"
9
- :src="image.src.url"
10
- :srcset="getSrcSet"
11
- :width="image.src.width"
12
- :height="image.src.height"
13
- :alt="image.alt"
14
- image-class="w-full h-auto"
15
- object-fit-class="cover"
16
- loading="lazy"
17
- />
18
- <div
19
- v-if="startDateSplit"
20
- class="ThemeVariantLight absolute top-0 left-0 z-10 px-4 py-4 text-center text-white bg-primary"
7
+ <BaseImagePlaceholder
8
+ :aspect-ratio="constrain ? '16:9' : 'none'"
9
+ dark-mode
21
10
  >
22
- <div class="font-extrabold text-6xl leading-tight tracking-wider">
23
- {{ startDateSplit.day }}
11
+ <BaseImage
12
+ v-if="image.src"
13
+ :src="image.src.url"
14
+ :srcset="getSrcSet"
15
+ :width="image.src.width"
16
+ :height="image.src.height"
17
+ :alt="image.alt"
18
+ image-class="w-full h-auto"
19
+ object-fit-class="cover"
20
+ loading="lazy"
21
+ />
22
+ <div
23
+ v-if="startDateSplit || ongoing"
24
+ class="ThemeVariantLight absolute top-0 left-0 z-10 px-4 py-4 text-center text-white bg-primary print:hidden"
25
+ >
26
+ <template v-if="ongoing">
27
+ <div class="text-subtitle">Ongoing</div>
28
+ </template>
29
+ <template v-else>
30
+ <div class="font-extrabold text-6xl leading-tight tracking-wider uppercase">
31
+ {{ themeStore.isEdu ? startDateSplit?.month : startDateSplit?.day }}
32
+ </div>
33
+ <div class="text-subtitle">
34
+ {{ themeStore.isEdu ? startDateSplit?.year : startDateSplit?.monthAndYear }}
35
+ </div>
36
+ </template>
24
37
  </div>
25
- <div class="text-subtitle">
26
- {{ startDateSplit.monthAndYear }}
27
- </div>
28
- </div>
38
+ </BaseImagePlaceholder>
29
39
  </div>
30
40
  </div>
31
41
  </template>
32
42
  <script lang="ts">
33
43
  import { defineComponent } from 'vue'
44
+ import { mapStores } from 'pinia'
45
+ import { useThemeStore } from '../../store/theme'
34
46
  import BaseImage from '../BaseImage/BaseImage.vue'
47
+ import BaseImagePlaceholder from '../BaseImagePlaceholder/BaseImagePlaceholder.vue'
35
48
  import { mixinGetSrcSet, type EventDateObject } from './../../utils/mixins'
36
49
  import type { PropType } from 'vue'
37
50
 
38
51
  export default defineComponent({
39
52
  name: 'EventDetailHero',
40
53
  components: {
41
- BaseImage
54
+ BaseImage,
55
+ BaseImagePlaceholder
42
56
  },
43
57
  props: {
44
58
  data: {
@@ -50,13 +64,23 @@ export default defineComponent({
50
64
  type: Object as PropType<EventDateObject | undefined>,
51
65
  required: true
52
66
  },
67
+ ongoing: {
68
+ type: Boolean,
69
+ default: false
70
+ },
53
71
  image: {
54
72
  type: Object,
55
73
  required: false,
56
74
  default: undefined
75
+ },
76
+ constrain: {
77
+ type: Boolean,
78
+ required: false,
79
+ default: false
57
80
  }
58
81
  },
59
82
  computed: {
83
+ ...mapStores(useThemeStore),
60
84
  getSrcSet() {
61
85
  return this.image ? mixinGetSrcSet(this.image) : undefined
62
86
  }
@@ -25,7 +25,7 @@
25
25
  </div>
26
26
  <div
27
27
  v-if="hasCaptionArea"
28
- class="lg:hidden absolute bottom-0 left-0 w-full h-auto mx-auto"
28
+ class="lg:hidden absolute bottom-0 left-0 w-full h-auto mx-auto print:hidden"
29
29
  >
30
30
  <button
31
31
  class="bg-opacity-90 text-gray-dark flex items-center justify-center w-12 h-12 ml-auto bg-white cursor-pointer"
@@ -44,7 +44,7 @@
44
44
  <div
45
45
  v-if="hasCaptionArea"
46
46
  :class="captionVisibilityClass"
47
- class="max-w-screen-3xl ThemeVariantGray bg-gray-light bg-opacity-90 lg:bg-opacity-100 ThemeVariantGray lg:block lg:pb-4 lg:px-3 xl:px-8 lg:pt-4 items-start p-4 mx-auto"
47
+ class="max-w-screen-3xl ThemeVariantGray bg-gray-light bg-opacity-90 lg:bg-opacity-100 ThemeVariantGray lg:block lg:pb-4 lg:px-3 xl:px-8 lg:pt-4 items-start p-4 mx-auto print:block"
48
48
  >
49
49
  <BaseImageCaption :data="theImageData || customCaption" />
50
50
  </div>
@@ -12,7 +12,7 @@
12
12
  <div
13
13
  v-if="heading || link"
14
14
  :class="colStart"
15
- class="lg:pl-0 col-start-1 col-end-13 px-4 mb-1"
15
+ class="lg:pl-0 col-start-1 col-end-13 px-4 mb-1 print:px-0"
16
16
  >
17
17
  <div class="sm:flex flex-wrap items-center justify-between">
18
18
  <h2
@@ -35,7 +35,7 @@
35
35
  </div>
36
36
  <div
37
37
  :class="colStart"
38
- class="lg:pl-0 sm:col-end-11 3xl:col-end-12 col-start-1 col-end-13 pl-4 overflow-x-visible"
38
+ class="lg:pl-0 sm:col-end-11 3xl:col-end-12 col-start-1 col-end-13 pl-4 print:pl-0 overflow-x-visible"
39
39
  >
40
40
  <!-- Slider main container -->
41
41
  <div
@@ -3,7 +3,7 @@
3
3
  <NavDropdownToggle
4
4
  v-click-outside="closeDropdown"
5
5
  :aria-expanded="dropdownVisible ? true : false"
6
- class="group relative z-20 px-4 font-medium border-t-2 border-transparent"
6
+ class="group relative z-20 px-4 font-medium border-t-2 border-transparent edu:text-sm edu:xl:text-base edu:px-2 edu:xl:px-4"
7
7
  :class="{
8
8
  '-open': dropdownVisible
9
9
  }"
@@ -56,16 +56,8 @@ export const NavDesktopDropdownContentData = {
56
56
  description: 'Lorem ipsum dolor sit amet.',
57
57
  title: 'About'
58
58
  },
59
- {
60
- ...MenuLinkColumnWithHeaderData,
61
- heading: null,
62
- headingPage: null
63
- },
64
- {
65
- ...MenuLinkColumnWithHeaderData,
66
- heading: null,
67
- headingPage: null
68
- }
59
+ MenuLinkColumnWithHeaderData,
60
+ MenuLinkColumnWithHeaderData
69
61
  ]
70
62
  }
71
63
  // combined dropdown data for "more" menu
@@ -106,12 +98,11 @@ export const NavDesktopData = {
106
98
  '{"/": [{"path": "http://www.jpl.nasa.gov/", "title": "Asteroid watch"}, {"path": "http://www.jpl.nasa.gov/", "title": "Asteroid fast facts"}, {"path": "http://www.jpl.nasa.gov/", "title": "Meteor shower viewing guide"}, {"path": "http://www.jpl.nasa.gov/", "title": "Yeoman\'s top 10"}, {"path": "http://www.jpl.nasa.gov/", "title": "Glossary of space rocks"}, {"path": "/robotics-at-jpl/", "title": "Robotics"}, {"path": "http://www.jpl.nasa.gov/", "title": "Apps"}, {"path": "/jpl-life/", "title": "JPL Life"}, {"path": "/stars-and-galaxies/", "title": "Stars and Galaxies"}, {"path": "/exoplanets/", "title": "Exoplanets"}, {"path": "/solar-system/", "title": "Solar System"}, {"path": "/asteroids/", "title": "Asteroids"}, {"path": "/comets/", "title": "Comets"}, {"path": "/technology/", "title": "Technology"}, {"path": "/mars/", "title": "Mars"}, {"path": "/earth/", "title": "Earth"}, {"path": "/climate-change/", "title": "Climate Change"}, {"path": "/earthquakes/", "title": "Earthquakes"}, {"path": "/weather/", "title": "Weather"}, {"path": "/robotics/", "title": "Robotics"}], "/missions/": [{"path": "/missions/", "title": "Current"}, {"path": "/missions/", "title": "Past"}, {"path": "/missions/", "title": "Future"}, {"path": "/missions/", "title": "Proposed"}, {"path": "/missions/", "title": "All"}], "/news/": [{"path": "/news/", "title": "All news"}, {"path": "/news/", "title": "Press kits"}, {"path": "/news/", "title": "Fact sheets"}, {"path": "/news/", "title": "Media Information"}, {"path": "/news/", "title": "JPL newsletter"}]}',
107
99
  ...NavDesktopTopHatData,
108
100
  primaryNavigation: [
109
- NavDesktopDropdownContentData,
110
101
  {
111
102
  ...NavDesktopDropdownContentData,
112
103
  titleLink: {
113
104
  linkPage: {
114
- title: 'Missions',
105
+ title: 'K-12 Resources',
115
106
  url: '/missions/'
116
107
  },
117
108
  title: null
@@ -139,7 +130,7 @@ export const NavDesktopData = {
139
130
  ...NavDesktopDropdownContentData,
140
131
  titleLink: {
141
132
  linkPage: {
142
- title: 'News',
133
+ title: 'Internships',
143
134
  url: '/news/'
144
135
  },
145
136
  title: null
@@ -149,7 +140,7 @@ export const NavDesktopData = {
149
140
  ...NavDesktopDropdownContentData,
150
141
  titleLink: {
151
142
  linkPage: {
152
- title: 'Galleries',
143
+ title: 'News & Events',
153
144
  url: '/galleries/'
154
145
  },
155
146
  title: null
@@ -159,7 +150,7 @@ export const NavDesktopData = {
159
150
  ...NavDesktopDropdownContentData,
160
151
  titleLink: {
161
152
  linkPage: {
162
- title: 'Engage',
153
+ title: 'About',
163
154
  url: '/engage/'
164
155
  },
165
156
  title: null
@@ -19,14 +19,29 @@
19
19
  <NavLogoLinks class="w-[17rem] z-20 flex flex-shrink-0 my-2 -ml-1">
20
20
  <img
21
21
  :src="LogoWhite"
22
+ class="print:hidden"
23
+ alt="JPL Logo"
24
+ width="324"
25
+ height="72"
26
+ />
27
+ <img
28
+ :src="LogoColor"
29
+ class="hidden print:block"
22
30
  alt="JPL Logo"
23
31
  width="324"
24
32
  height="72"
25
33
  />
26
34
  </NavLogoLinks>
27
35
  <!-- site title -->
28
- <div class="ml-3 pl-5 border-l border-white border-opacity-30 z-20">
29
- <span class="text-white font-bold text-3xl">Education</span>
36
+ <div class="ml-2 pl-3 xl:ml-3 xl:pl-5 border-l border-white border-opacity-30 z-20">
37
+ <BaseLink
38
+ class="text-white font-bold text-2xl xl:text-3xl"
39
+ to="/edu/"
40
+ link-class="py-2"
41
+ variant="none"
42
+ >
43
+ Education
44
+ </BaseLink>
30
45
  </div>
31
46
  <!-- main nav with dropdowns -->
32
47
  <nav
@@ -51,6 +66,16 @@
51
66
  <NavDesktopDropdownContent :data="item" />
52
67
  </NavDesktopDropdown>
53
68
  </template>
69
+ <BaseLink
70
+ href="https://www.nasa.gov/learning-resources/"
71
+ variant="none"
72
+ class="NavDesktopLink group relative z-20 font-medium border-t-2 border-transparent text-sm xl:text-base px-2 xl:px-4"
73
+ link-class="inline-block py-2 transition-colors duration-100 ease-in border-b-2 border-transparent group-hover:border-white flex flex-wrap-none items-center"
74
+ external-target-blank
75
+ >
76
+ NASA OSTEM
77
+ <IconExternal class="text-sm -mt-0.5 ml-2" />
78
+ </BaseLink>
54
79
  </div>
55
80
  <!-- search -->
56
81
  <div
@@ -93,13 +118,16 @@
93
118
  import { defineComponent } from 'vue'
94
119
  import { mapStores } from 'pinia'
95
120
  import { useHeaderStore } from './../../store/header'
121
+ import BaseLink from './../BaseLink/BaseLink.vue'
96
122
  import NavDesktopDropdown from './../NavDesktop/NavDesktopDropdown.vue'
97
123
  import NavDesktopDropdownContent from './../NavDesktop/NavDesktopDropdownContent.vue'
98
124
  import NavLogoLinks from './../NavLogoLinks/NavLogoLinks.vue'
99
125
  import NavSearchForm from './../NavSearchForm/NavSearchForm.vue'
126
+ import IconExternal from './../Icons/IconExternal.vue'
100
127
  import IconSearch from './../Icons/IconSearch.vue'
101
128
  import IconClose from './../Icons/IconClose.vue'
102
129
  import type { LinkObject, BreadcrumbObject } from './../../utils/mixins'
130
+ import LogoColor from '@explorer-1/common/src/images/svg/logo-tribrand-color.svg'
103
131
  import LogoWhite from '@explorer-1/common/src/images/svg/logo-tribrand-white.svg'
104
132
  import type { BreadcrumbPathObject } from '../../interfaces'
105
133
  import {
@@ -112,12 +140,14 @@ import {
112
140
  export default defineComponent({
113
141
  name: 'NavDesktop',
114
142
  components: {
143
+ BaseLink,
115
144
  NavDesktopDropdown,
116
145
  NavDesktopDropdownContent,
117
146
  NavLogoLinks,
118
147
  NavSearchForm,
119
148
  IconSearch,
120
- IconClose
149
+ IconClose,
150
+ IconExternal
121
151
  },
122
152
  props: {
123
153
  data: {
@@ -158,7 +188,8 @@ export default defineComponent({
158
188
  // This is used in transition logic to avoid distracting animations on route changes
159
189
  // without this check, the nav would swoop in/out on a route change if it was visible before the route change occured (e.g. partially scrolled up on a page)
160
190
  scrolledCurrentPage: false,
161
- LogoWhite: LogoWhite
191
+ LogoWhite: LogoWhite,
192
+ LogoColor: LogoColor
162
193
  }
163
194
  },
164
195
  computed: {
@@ -278,11 +309,6 @@ export default defineComponent({
278
309
  .main-navigation {
279
310
  > * {
280
311
  @apply text-white;
281
-
282
- .NavDesktopDropdown > button {
283
- // mimics .text-contrast class
284
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7);
285
- }
286
312
  }
287
313
  }
288
314
  }
@@ -6,7 +6,7 @@ export default {
6
6
  component: NavHeading,
7
7
  decorators: [
8
8
  () => ({
9
- template: `<div id="storyDecorator" class="p-8 bg-jpl-blue-darker"><story/></div>`
9
+ template: `<div id="storyDecorator" class="p-8 bg-jpl-blue-darker edu:bg-primary-dark"><story/></div>`
10
10
  })
11
11
  ],
12
12
  parameters: {
@@ -7,7 +7,7 @@
7
7
  <BaseLink
8
8
  variant="none"
9
9
  class="text-subtitle text-jpl-blue-lighter edu:text-primary-lighter inline-block mb-4"
10
- link-class="p-2"
10
+ link-class="px-2 block"
11
11
  :to="data.headingPage.url"
12
12
  >
13
13
  {{ data.heading }}