@explorer-1/vue 0.2.0 → 0.2.1

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 (40) hide show
  1. package/components.d.ts +1 -0
  2. package/dist/explorer-1-vue.js +3759 -3729
  3. package/dist/explorer-1-vue.umd.cjs +12 -12
  4. package/dist/src/components/BlockCard/BlockCard.vue.d.ts +9 -0
  5. package/dist/src/components/BlockLinkCard/BlockLinkCard.vue.d.ts +30 -0
  6. package/dist/src/components/BlockRelatedLinks/BlockRelatedLinks.vue.d.ts +11 -0
  7. package/dist/src/components/BlockStreamfield/BlockStreamfield.stories.d.ts +17 -0
  8. package/dist/src/components/CalendarButton/CalendarButton.stories.d.ts +2 -62
  9. package/dist/src/components/CalendarButton/CalendarButton.vue.d.ts +26 -7
  10. package/dist/src/components/EventDetailHero/EventDetailHero.vue.d.ts +8 -1
  11. package/dist/src/templates/PageEventDetail/PageEventDetail.stories.d.ts +3 -1
  12. package/dist/src/templates/PageImageDetail/PageImageDetail.stories.d.ts +19 -27
  13. package/dist/src/templates/PageNewsDetail/PageNewsDetail.stories.d.ts +136 -0
  14. package/dist/src/templates/edu/PageContentEdu.stories.d.ts +1 -0
  15. package/dist/src/templates/edu/PageEduEventDetail/PageEduEventDetail.stories.d.ts +128 -0
  16. package/dist/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.stories.d.ts +51 -0
  17. package/dist/src/templates/edu/PageEduResourceArticle/PageEduResourceArticle.stories.d.ts +17 -0
  18. package/dist/src/templates/www/PageCuratedGallery/PageCuratedGallery.stories.d.ts +17 -0
  19. package/dist/src/templates/www/PageRoboticsDetail/PageRoboticsDetail.stories.d.ts +17 -0
  20. package/dist/style.css +1 -1
  21. package/package.json +1 -1
  22. package/src/components/BaseTag/BaseTag.vue +2 -2
  23. package/src/components/BlockCard/BlockCard.vue +8 -5
  24. package/src/components/BlockInlineImage/BlockInlineImage.vue +1 -1
  25. package/src/components/BlockLinkCard/BlockLinkCard.vue +33 -13
  26. package/src/components/BlockLinkCarousel/BlockLinkCarousel.vue +0 -1
  27. package/src/components/BlockRelatedLinks/BlockRelatedLinks.vue +6 -1
  28. package/src/components/BlockStreamfield/BlockStreamfield.stories.js +1 -0
  29. package/src/components/BlockStreamfield/BlockStreamfield.vue +3 -0
  30. package/src/components/CalendarButton/CalendarButton.stories.js +1 -19
  31. package/src/components/CalendarButton/CalendarButton.vue +43 -17
  32. package/src/components/EventDetailHero/EventDetailHero.vue +26 -31
  33. package/src/components/MixinCarousel/MixinCarousel.vue +1 -1
  34. package/src/components/ThumbnailCarousel/ThumbnailCarousel.stories.js +1 -0
  35. package/src/templates/PageEventDetail/PageEventDetail.stories.js +3 -1
  36. package/src/templates/PageEventDetail/PageEventDetail.vue +3 -3
  37. package/src/templates/PageImageDetail/PageImageDetail.stories.js +1 -1
  38. package/src/templates/edu/PageContentEdu.stories.js +1 -0
  39. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.stories.js +130 -0
  40. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.vue +419 -0
@@ -0,0 +1,130 @@
1
+ import { BlockKeyPointsData } from './../../../components/BlockKeyPoints/BlockKeyPoints.stories'
2
+ import { BlockLinkCardCarouselData } from './../../../components/BlockLinkCarousel/BlockLinkCarousel.stories.js'
3
+ import { EventDetailHeroData } from './../../../components/EventDetailHero/EventDetailHero.stories'
4
+ import { EventsBlockLinkCarouselData } from './../../../components/BlockLinkCarousel/BlockLinkCarousel.stories'
5
+ import PageEduEventDetail from './PageEduEventDetail.vue'
6
+
7
+ export default {
8
+ title: 'Templates/EDU/PageEduEventDetail',
9
+ component: PageEduEventDetail,
10
+ tags: ['!autodocs'],
11
+ parameters: {
12
+ html: {
13
+ root: '#storyDecorator'
14
+ },
15
+ layout: 'fullscreen'
16
+ },
17
+ excludeStories: /.*Data$/
18
+ }
19
+
20
+ // stories
21
+ export const BaseStory = {
22
+ name: 'PageEduEventDetail',
23
+ args: {
24
+ data: {
25
+ id: '285',
26
+ title: 'Becoming a NASA engineer',
27
+ slug: 'becoming-a-nasa-engineer',
28
+ url: '/events/becoming-a-nasa-engineer',
29
+ startDate: '2022-01-23',
30
+ startDatetime: '2022-01-23T17:00:00-08:00',
31
+ startTime: '17:00:00',
32
+ endDate: '2022-01-25',
33
+ endDatetime: '2022-01-25T23:00:00-08:00',
34
+ endTime: '23:00:00',
35
+ isAllDay: false,
36
+ timezone: 'PST',
37
+ eventType: 'Workshop',
38
+ summary:
39
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus et luctus nisi. Maecenas vel turpis sem. Nullam ultricies nulla quis nisi faucibus eleifend. In turpis ante, blandit nec dapibus tempor, posuere at erat. In justo quam, imperdiet at hendrerit eget, imperdiet ut orci. ',
40
+ locationName: 'Webcast',
41
+ registerLink: [
42
+ {
43
+ text: 'Registration Link',
44
+ document: '',
45
+ page: {
46
+ url: '/placeholder'
47
+ },
48
+ externalLink: ''
49
+ }
50
+ ],
51
+ eventImage: {
52
+ __typename: 'CustomImage',
53
+ srcSet:
54
+ 'https://picsum.photos/720/420 320w, https://picsum.photos/720/420 640w, https://picsum.photos/720/420 720w',
55
+ original: 'https://picsum.photos/720/420',
56
+ src: {
57
+ __typename: 'CustomRendition',
58
+ url: 'https://picsum.photos/720/420',
59
+ width: '720',
60
+ height: '420'
61
+ },
62
+ title: 'Marine Picks First Public Mars Global Surveyor Image',
63
+ alt: '',
64
+ caption:
65
+ '<p data-block-key="y00sz">A close-up view of part of the area imaged by Mars Global Surveyor for its public request program.</p>',
66
+ credit: 'Credit',
67
+ detailUrl: null
68
+ },
69
+ thumbnailImage: {
70
+ alt: '',
71
+ original: 'https://picsum.photos/512/288'
72
+ },
73
+ targetAudience: 'All ages',
74
+ body: [
75
+ BlockKeyPointsData,
76
+ {
77
+ blockType: 'RichTextBlock',
78
+ value:
79
+ '<p>Lorem ipsum <a href="/missions/test-mission/">dolor</a> sit amet, consectetur adipiscing elit. Quisque vitae justo quis justo malesuada molestie. Cras sed tincidunt dui.</p><p>Integer imperdiet blandit neque vitae euismod. Nulla aliquet lacus nibh, vel tincidunt urna efficitur non. In et eros vitae ex posuere maximus quis eget urna. Suspendisse fringilla posuere velit sit amet posuere. Morbi malesuada bibendum vehicula. Donec faucibus ut erat ut mattis. Suspendisse ornare, quam at placerat cursus, dolor mi lacinia nunc, eget maximus augue nulla in dolor.</p>\n'
80
+ }
81
+ ],
82
+ relatedEvents: [...EventsBlockLinkCarouselData],
83
+ speakers: [
84
+ {
85
+ host: 'host',
86
+ id: '1',
87
+ internalLink: null,
88
+ name: 'Varoujan Gorjian',
89
+ title: 'Splitzer Research Scientest, JPL'
90
+ },
91
+ {
92
+ host: 'co-host',
93
+ id: '2',
94
+ image: {
95
+ alt: '',
96
+ src: {
97
+ height: '450',
98
+ url: 'https://picsum.photos/560/560',
99
+ width: '450'
100
+ }
101
+ },
102
+ internalLink: null,
103
+ name: 'Robert Hurt',
104
+ title: 'Splitzer visualisation'
105
+ }
106
+ ],
107
+ relatedLinks: [
108
+ {
109
+ blockType: 'RelatedLinksBlock',
110
+ heading: 'Related Links',
111
+ links: [
112
+ {
113
+ document: null,
114
+ externalLink: 'http://www.google.com',
115
+ page: null,
116
+ text: 'Lorem ipsum dolor'
117
+ },
118
+ {
119
+ document: null,
120
+ externalLink: 'http://www.google.com',
121
+ page: null,
122
+ text: 'Sit amet consectatur'
123
+ }
124
+ ]
125
+ }
126
+ ],
127
+ relatedContent: BlockLinkCardCarouselData
128
+ }
129
+ }
130
+ }
@@ -0,0 +1,419 @@
1
+ <template>
2
+ <div
3
+ v-if="data"
4
+ class="PageEduEventDetail pt-5 ThemeVariantLight lg:pt-12"
5
+ itemscope
6
+ itemtype="http://schema.org/Event"
7
+ >
8
+ <!-- schema.org -->
9
+ <meta
10
+ v-if="data.thumbnailImage && data.thumbnailImage.original"
11
+ itemprop="thumbnailUrl"
12
+ :content="data.thumbnailImage.original"
13
+ />
14
+ <meta
15
+ itemprop="startDate"
16
+ :content="data.startDatetime"
17
+ />
18
+ <meta
19
+ v-if="data.endDatetime"
20
+ itemprop="endDate"
21
+ :content="data.endDatetime"
22
+ />
23
+ <meta
24
+ v-if="data.summary || data.body"
25
+ itemprop="description"
26
+ :content="data.summary || data.body"
27
+ />
28
+
29
+ <LayoutHelper
30
+ indent="col-2"
31
+ class="mb-6 lg:mb-12"
32
+ >
33
+ <div
34
+ v-if="data.eventType"
35
+ class="flex flex-wrap items-start mb-3"
36
+ >
37
+ <BaseTag
38
+ variant="primary"
39
+ size="md"
40
+ >
41
+ {{ data.eventType }}
42
+ </BaseTag>
43
+ </div>
44
+ <BaseHeading
45
+ level="h1"
46
+ itemprop="name"
47
+ >
48
+ {{ data.title }}
49
+ </BaseHeading>
50
+ <ShareButtonsEdu
51
+ class="mt-4"
52
+ :title="data.title"
53
+ :url="data.url"
54
+ />
55
+ </LayoutHelper>
56
+
57
+ <LayoutHelper indent="col-2">
58
+ <EventDetailHero
59
+ :image="data.eventImage"
60
+ :start-date-split="formattedSplitEventDates"
61
+ />
62
+
63
+ <!-- Event details -->
64
+ <div>
65
+ <div
66
+ class="py-1 mb-10 text-xl lg:mb-0 lg:flex"
67
+ :class="data.registerLink && data.registerLink.length > 0 ? '' : 'lg:mb-10'"
68
+ >
69
+ <div
70
+ v-if="formattedEventDates || data.customDate"
71
+ class="PageEduEventDetail__Metadata text-primary"
72
+ >
73
+ <IconCalendar class="relative mr-3 text-[1.2rem]" />
74
+ <span>{{ formattedEventDates || data.customDate }}</span>
75
+ </div>
76
+ <div
77
+ v-show="displayTime"
78
+ class="PageEduEventDetail__Metadata text-primary"
79
+ >
80
+ <IconTime class="relative mr-3" />
81
+ <span>{{ displayTime }}</span>
82
+ </div>
83
+ <!--Virtual location -->
84
+ <div
85
+ v-if="data.isVirtualEvent && data.locationLink"
86
+ itemprop="location"
87
+ itemscope
88
+ itemtype="https://schema.org/VirtualLocation"
89
+ class="PageEduEventDetail__Metadata text-primary"
90
+ >
91
+ <link
92
+ itemprop="url"
93
+ :href="data.locationLink"
94
+ />
95
+ <meta
96
+ itemprop="name"
97
+ :content="data.locationName"
98
+ />
99
+ <IconLocation class="relative mr-3" />
100
+ <BaseLink
101
+ variant="none"
102
+ class="text-action"
103
+ :href="data.locationLink"
104
+ external-target-blank
105
+ >
106
+ {{ data.locationName }}
107
+ </BaseLink>
108
+ </div>
109
+ <!-- Normal location -->
110
+ <div
111
+ v-else-if="data.locationName"
112
+ class="PageEduEventDetail__Metadata text-primary"
113
+ >
114
+ <meta
115
+ itemprop="location"
116
+ :content="data.locationName"
117
+ />
118
+ <IconLocation class="relative mr-3" />
119
+ <BaseLink
120
+ v-if="data.locationLink"
121
+ variant="none"
122
+ :href="data.locationLink"
123
+ external-target-blank
124
+ >
125
+ {{ data.locationName }}
126
+ </BaseLink>
127
+ <span v-else>{{ data.locationName }}</span>
128
+ </div>
129
+ <div
130
+ v-if="data.targetAudience"
131
+ class="PageEduEventDetail__Metadata text-primary"
132
+ >
133
+ <IconUser class="relative mr-3 text-[.9rem]" />
134
+ <span>{{ data.targetAudience }}</span>
135
+ </div>
136
+
137
+ <div class="PageEduEventDetail__Buttons">
138
+ <BaseButton
139
+ v-if="
140
+ data.registerLink &&
141
+ data.registerLink.length > 0 &&
142
+ ((data.registerLink[0].page && data.registerLink[0].page.url) ||
143
+ data.registerLink[0].externalLink)
144
+ "
145
+ class="w-full px-0 mb-5"
146
+ :href="data.registerLink[0].externalLink ? data.registerLink[0].externalLink : null"
147
+ :to="
148
+ data.registerLink[0].page && data.registerLink[0].page.url
149
+ ? data.registerLink[0].page.url
150
+ : null
151
+ "
152
+ :target="data.registerLink[0].externalLink ? '_blank' : '_self'"
153
+ compact
154
+ >Register for event
155
+ </BaseButton>
156
+ <!-- Todo IF VIRTUAL EVENT passes url as string to location prop -->
157
+ <!-- location= location name and link -->
158
+ <CalendarButton
159
+ v-if="data.startDatetime"
160
+ :start-datetime="data.startDatetime"
161
+ :end-datetime="data.endDatetime ? data.endDatetime : null"
162
+ :title="data.title ? data.title : null"
163
+ :location="data.locationName ? data.locationName : null"
164
+ :description="data.summary ? data.summary : null"
165
+ />
166
+ </div>
167
+ </div>
168
+
169
+ <!-- Body -->
170
+ <div
171
+ v-if="data.body || data.summary"
172
+ class="grid-cols-10 lg:grid -mx-4 lg:mx-0"
173
+ >
174
+ <div class="col-span-7">
175
+ <p
176
+ v-if="data.summary"
177
+ class="BlockText text-body-lg mb-8 px-4 lg:px-0 font-semibold"
178
+ >
179
+ {{ data.summary }}
180
+ </p>
181
+ <BlockStreamfield
182
+ v-if="data.body"
183
+ variant="fluid"
184
+ :data="data.body"
185
+ />
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </LayoutHelper>
190
+
191
+ <!-- Speakers -->
192
+ <LayoutHelper
193
+ v-if="data.speakers && data.speakers.length > 0"
194
+ indent="col-2"
195
+ class="mb-12 lg:mb-16"
196
+ >
197
+ <div class="grid-cols-10 lg:grid">
198
+ <div class="col-span-7">
199
+ <BaseHeading
200
+ level="h2"
201
+ size="h3"
202
+ class="mb-5 md:mb-8"
203
+ >Speakers</BaseHeading
204
+ >
205
+ <div class="flex flex-col flex-wrap justify-start md:flex-row md:-mx-4">
206
+ <div
207
+ v-for="(speaker, index) in data.speakers"
208
+ :key="index"
209
+ class="flex flex-1 mb-6 md:flex-none md:flex-wrap md:mx-4 md:w-56"
210
+ >
211
+ <div class="w-40 mr-6 md:mr-0 md:w-56">
212
+ <BaseImagePlaceholder
213
+ aspect-ratio="1:1"
214
+ class="relative overflow-hidden bg-gray-light-mid"
215
+ transparent-mode
216
+ >
217
+ <BaseImage
218
+ v-if="speaker.image && speaker.image.src"
219
+ :src="speaker.image.src.url"
220
+ :width="speaker.image.src.width"
221
+ :height="speaker.image.src.height"
222
+ alt=""
223
+ class="object-cover"
224
+ loading="lazy"
225
+ />
226
+ <img
227
+ v-else
228
+ :src="PlaceholderPortrait"
229
+ alt=""
230
+ />
231
+ </BaseImagePlaceholder>
232
+ </div>
233
+ <div class="flex-1 h-full">
234
+ <h3
235
+ v-if="speaker.name"
236
+ class="my-3 text-lg !font-normal !tracking-normal leading-none"
237
+ >
238
+ <BaseLink
239
+ v-if="speaker.internalLink || speaker.externalLink"
240
+ link-class="no-underline normal-case"
241
+ :to="speaker.internalLink ? speaker.internalLink.url : null"
242
+ :href="speaker.externalLink ? speaker.externalLink : null"
243
+ external-target-blank
244
+ >
245
+ {{ speaker.name }}
246
+ </BaseLink>
247
+ <template v-else>
248
+ {{ speaker.name }}
249
+ </template>
250
+ </h3>
251
+ <p
252
+ v-if="speaker.title"
253
+ class="mb-3 text-gray-mid-dark"
254
+ >
255
+ {{ speaker.title }}
256
+ </p>
257
+ <p class="text-action capitalize">
258
+ {{ speaker.host }}
259
+ </p>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ </div>
264
+ </div>
265
+ </LayoutHelper>
266
+
267
+ <!-- Webcast -->
268
+ <LayoutHelper
269
+ v-if="data.relatedLinks && data.relatedLinks.length > 0"
270
+ indent="col-2"
271
+ class="my-12 lg:my-16"
272
+ >
273
+ <BlockRelatedLinks
274
+ :data="data.relatedLinks[0]"
275
+ size="h3"
276
+ />
277
+ </LayoutHelper>
278
+
279
+ <!-- Related Events -->
280
+ <LayoutHelper
281
+ v-if="data.relatedEvents?.length"
282
+ indent="col-1"
283
+ class="my-12 lg:my-16"
284
+ >
285
+ <BlockLinkCarousel
286
+ item-type="cards"
287
+ size="h3"
288
+ heading="Related Events"
289
+ :items="data.relatedEvents"
290
+ />
291
+ </LayoutHelper>
292
+ <!-- Related Content -->
293
+ <div
294
+ v-if="data.relatedContent?.length"
295
+ class="bg-stars bg-[#15003B] lg:py-24 lg:mt-24 py-12 mt-12"
296
+ >
297
+ <BlockLinkCarousel
298
+ class="ThemeVariantDark"
299
+ item-type="cards"
300
+ heading="Explore More"
301
+ :items="data.relatedContent"
302
+ />
303
+ </div>
304
+ </div>
305
+ </template>
306
+ <script lang="ts">
307
+ import { defineComponent } from 'vue'
308
+ import {
309
+ mixinFormatEventDates,
310
+ mixinFormatEventTimeInHoursAndMinutes,
311
+ mixinFormatSplitEventDates
312
+ } from '../../../utils/mixins'
313
+ import LayoutHelper from './../../../components/LayoutHelper/LayoutHelper.vue'
314
+ import BaseHeading from './../../../components/BaseHeading/BaseHeading.vue'
315
+ import BaseTag from './../../../components/BaseTag/BaseTag.vue'
316
+ import ShareButtonsEdu from './../../../components/ShareButtonsEdu/ShareButtonsEdu.vue'
317
+ import EventDetailHero from './../../../components/EventDetailHero/EventDetailHero.vue'
318
+ import IconCalendar from './../../../components/Icons/IconCalendar.vue'
319
+ import IconLocation from './../../../components/Icons/IconLocation.vue'
320
+ import IconTime from './../../../components/Icons/IconTime.vue'
321
+ import IconUser from './../../../components/Icons/IconUser.vue'
322
+ import BaseLink from './../../../components/BaseLink/BaseLink.vue'
323
+ import BaseButton from './../../../components/BaseButton/BaseButton.vue'
324
+ import CalendarButton from './../../../components/CalendarButton/CalendarButton.vue'
325
+ import BlockStreamfield from './../../../components/BlockStreamfield/BlockStreamfield.vue'
326
+ import BaseImagePlaceholder from './../../../components/BaseImagePlaceholder/BaseImagePlaceholder.vue'
327
+ import BaseImage from './../../../components/BaseImage/BaseImage.vue'
328
+ import BlockRelatedLinks from './../../../components/BlockRelatedLinks/BlockRelatedLinks.vue'
329
+ import BlockLinkCarousel from './../../../components/BlockLinkCarousel/BlockLinkCarousel.vue'
330
+ // @ts-ignore
331
+ import PlaceholderPortrait from '@explorer-1/common/src/images/svg/placeholder-portrait.svg'
332
+
333
+ export default defineComponent({
334
+ name: 'PageEduEventDetail',
335
+ components: {
336
+ LayoutHelper,
337
+ BaseHeading,
338
+ BaseTag,
339
+ ShareButtonsEdu,
340
+ EventDetailHero,
341
+ IconCalendar,
342
+ IconLocation,
343
+ IconTime,
344
+ IconUser,
345
+ BaseLink,
346
+ BaseButton,
347
+ CalendarButton,
348
+ BlockStreamfield,
349
+ BaseImagePlaceholder,
350
+ BaseImage,
351
+ BlockRelatedLinks,
352
+ BlockLinkCarousel
353
+ },
354
+ props: {
355
+ data: {
356
+ type: Object,
357
+ required: false,
358
+ default: undefined
359
+ }
360
+ },
361
+ data() {
362
+ return {
363
+ PlaceholderPortrait: PlaceholderPortrait
364
+ }
365
+ },
366
+ computed: {
367
+ displayTime(): string {
368
+ return this.data
369
+ ? mixinFormatEventTimeInHoursAndMinutes(
370
+ this.data.startDatetime,
371
+ this.data.endDatetime,
372
+ this.data.endTime
373
+ )
374
+ : ''
375
+ },
376
+ formattedEventDates(): string {
377
+ return this.data ? mixinFormatEventDates(this.data.startDatetime, this.data.endDatetime) : ''
378
+ },
379
+ formattedSplitEventDates() {
380
+ return this.data
381
+ ? mixinFormatSplitEventDates(this.data.startDatetime, this.data.endDatetime)
382
+ : undefined
383
+ }
384
+ }
385
+ })
386
+ </script>
387
+ <style lang="scss">
388
+ .PageEduEventDetail {
389
+ .PageEduEventDetail__Metadata {
390
+ @apply flex;
391
+ @apply items-baseline;
392
+ @apply mr-12 md:mr-8 lg:mr-12;
393
+ @apply mb-5 lg:mb-7;
394
+
395
+ span {
396
+ max-width: 230px;
397
+ min-width: 110px;
398
+ @apply text-gray-dark;
399
+ }
400
+
401
+ svg {
402
+ min-width: 1.25rem;
403
+ @apply top-0.5;
404
+ }
405
+ }
406
+
407
+ .PageEduEventDetail__Buttons {
408
+ @apply text-base;
409
+ @apply lg:ml-auto;
410
+ @apply mt-10;
411
+ @apply lg:mt-0;
412
+
413
+ max-width: 260px;
414
+ }
415
+ .bg-stars .MixinCarousel__Heading {
416
+ @apply text-white;
417
+ }
418
+ }
419
+ </style>