@explorer-1/vue 0.2.6 → 0.2.8

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 (38) 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/NavDesktopEdu/NavDesktopEdu.vue +11 -1
  28. package/src/components/NavMobile/NavMobile.vue +22 -11
  29. package/src/components/ShareButtons/ShareButtons.vue +1 -1
  30. package/src/components/ShareButtonsEdu/ShareButtonsEdu.vue +1 -1
  31. package/src/components/TheFooter/TheFooter.vue +3 -1
  32. package/src/templates/PageEventDetail/PageEventDetail.vue +2 -1
  33. package/src/templates/PageNewsDetail/PageNewsDetail.vue +3 -1
  34. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.stories.js +146 -104
  35. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.vue +101 -50
  36. package/src/templates/edu/PageEduExplainerArticle/PageEduExplainerArticle.vue +1 -1
  37. package/src/utils/mixins.ts +18 -14
  38. 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.6",
3
+ "version": "0.2.8",
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.2"
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
@@ -19,6 +19,14 @@
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"
@@ -119,6 +127,7 @@ import IconExternal from './../Icons/IconExternal.vue'
119
127
  import IconSearch from './../Icons/IconSearch.vue'
120
128
  import IconClose from './../Icons/IconClose.vue'
121
129
  import type { LinkObject, BreadcrumbObject } from './../../utils/mixins'
130
+ import LogoColor from '@explorer-1/common/src/images/svg/logo-tribrand-color.svg'
122
131
  import LogoWhite from '@explorer-1/common/src/images/svg/logo-tribrand-white.svg'
123
132
  import type { BreadcrumbPathObject } from '../../interfaces'
124
133
  import {
@@ -179,7 +188,8 @@ export default defineComponent({
179
188
  // This is used in transition logic to avoid distracting animations on route changes
180
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)
181
190
  scrolledCurrentPage: false,
182
- LogoWhite: LogoWhite
191
+ LogoWhite: LogoWhite,
192
+ LogoColor: LogoColor
183
193
  }
184
194
  },
185
195
  computed: {
@@ -2,7 +2,7 @@
2
2
  <transition name="headerMobileReveal">
3
3
  <div
4
4
  v-show="headerVisible"
5
- class="NavMobile border-gray-light-mid z-50 w-full transition-all duration-150 ease-in bg-white border-b edu:bg-gray-light edu:border-none"
5
+ class="NavMobile border-gray-light-mid z-50 w-full transition-all duration-150 ease-in bg-white border-b edu:bg-gray-light edu:border-none print:edu:!border-b print:border-black"
6
6
  :class="headerClasses"
7
7
  >
8
8
  <!-- navbar -->
@@ -13,13 +13,22 @@
13
13
  <!-- branding -->
14
14
  <div class="flex items-center">
15
15
  <NavLogoLinks class="lg:p-0 w-72 z-20 p-2 pl-0 -ml-3 edu:w-[12rem]">
16
- <img
17
- v-if="themeStore.theme === 'ThemeEdu'"
18
- :src="LogoWhite"
19
- alt="JPL Logo"
20
- width="324"
21
- height="72"
22
- />
16
+ <template v-if="themeStore.theme === 'ThemeEdu'">
17
+ <img
18
+ class="print:hidden"
19
+ :src="LogoWhite"
20
+ alt="JPL Logo"
21
+ width="324"
22
+ height="72"
23
+ />
24
+ <img
25
+ class="hidden print:block"
26
+ :src="LogoColor"
27
+ alt="JPL Logo"
28
+ width="324"
29
+ height="72"
30
+ />
31
+ </template>
23
32
  <img
24
33
  v-else
25
34
  :src="LogoColor"
@@ -30,14 +39,14 @@
30
39
  </NavLogoLinks>
31
40
  <div
32
41
  v-if="themeStore.theme === 'ThemeEdu'"
33
- class="-ml-1 pl-2 border-l border-white border-opacity-30 z-20"
42
+ class="-ml-1 pl-2 border-l border-white border-opacity-30 z-20 print:border-black"
34
43
  >
35
44
  <span class="text-white font-bold text-xl pl-px">Education</span>
36
45
  </div>
37
46
  </div>
38
47
  <button
39
48
  v-if="data"
40
- class="text-gray-dark p-4 -mr-4 cursor-pointer"
49
+ class="print:hidden text-gray-dark p-4 -mr-4 cursor-pointer"
41
50
  :aria-label="menuVisible ? 'Close menu' : 'Open menu'"
42
51
  @click="toggleMenu"
43
52
  >
@@ -286,7 +295,9 @@ export default defineComponent({
286
295
  // styles for default vs transparent header
287
296
  // underline color and logo inversion styles handled within their respective components
288
297
  &.-scrolled {
289
- @apply fixed;
298
+ @media not print {
299
+ @apply fixed;
300
+ }
290
301
  }
291
302
  }
292
303
  // vue-transition classes
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div
3
- class="ShareButtons relative flex flex-row items-start border-collapse"
3
+ class="ShareButtons relative flex flex-row items-start border-collapse print:hidden"
4
4
  :class="{ 'lg:absolute lg:top-0 lg:left-0 lg:flex-col': !inline }"
5
5
  >
6
6
  <BaseButton
@@ -89,7 +89,7 @@ const buttonClass = computed(() => {
89
89
  })
90
90
  </script>
91
91
  <template>
92
- <div class="ShareButtonsEdu relative flex flex-row items-start border-collapse">
92
+ <div class="ShareButtonsEdu relative flex flex-row items-start border-collapse print:hidden">
93
93
  <BaseButton
94
94
  variant="social"
95
95
  :class="buttonClass"
@@ -1,5 +1,7 @@
1
1
  <template>
2
- <footer class="TheFooter bg-jpl-blue-darker edu:bg-stars edu:bg-primary text-white relative z-20">
2
+ <footer
3
+ class="TheFooter bg-jpl-blue-darker edu:bg-stars edu:bg-primary text-white relative z-20 print:px-4 print:border-t print:border-black"
4
+ >
3
5
  <div class="footer-main lg:BaseGrid 3xl:px-0 lg:pt-20 container px-4 pt-10 mx-auto">
4
6
  <div class="footer-navigation lg:block lg:col-span-9 hidden col-span-12">
5
7
  <!-- footerNavigation -->
@@ -270,10 +270,11 @@
270
270
  <LayoutHelper
271
271
  v-if="data.moreEvents && data.moreEvents.length > 0"
272
272
  indent="col-1"
273
- class="my-12 lg:my-16"
273
+ class="my-12 lg:my-16 print:!px-4"
274
274
  >
275
275
  <BlockLinkCarousel
276
276
  item-type="cards"
277
+ class="print:!px-4"
277
278
  heading="MORE EVENTS"
278
279
  :items="data.moreEvents"
279
280
  />
@@ -174,6 +174,7 @@ import BlockImageStandard from './../../components/BlockImage/BlockImageStandard
174
174
  import BlockLinkCarousel from './../../components/BlockLinkCarousel/BlockLinkCarousel.vue'
175
175
  import ShareButtons from './../../components/ShareButtons/ShareButtons.vue'
176
176
  import BlockText from './../../components/BlockText/BlockText.vue'
177
+ import BlockVideo from './../../components/BlockText/BlockText.vue'
177
178
 
178
179
  export default defineComponent({
179
180
  name: 'PageNewsDetail',
@@ -190,7 +191,8 @@ export default defineComponent({
190
191
  BlockImageStandard,
191
192
  BlockLinkCarousel,
192
193
  ShareButtons,
193
- BlockText
194
+ BlockText,
195
+ BlockVideo
194
196
  },
195
197
  props: {
196
198
  data: {