@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorer-1/vue",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -10,8 +10,8 @@ const variantMap: Attributes = {
10
10
 
11
11
  const sizeMap: Attributes = {
12
12
  sm: 'text-xs uppercase border-t-2 py-1 px-2.5',
13
- md: 'text-base capitalize border-t py-2 px-3',
14
- lg: 'text-lg capitalize border-t py-2 px-3'
13
+ md: 'text-base capitalize border-t py-1 px-3',
14
+ lg: 'text-lg capitalize border-t py-1 px-3'
15
15
  }
16
16
 
17
17
  interface BaseTagProps {
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div
3
- class="shadow-jpl relative h-full"
3
+ class="shadow-jpl relative h-full bg-white"
4
4
  :class="{ 'flex items-center min-h-32': !image }"
5
5
  >
6
6
  <div
@@ -23,7 +23,7 @@
23
23
  />
24
24
  </BaseImagePlaceholder>
25
25
  </div>
26
- <div class="px-6 py-6">
26
+ <div class="px-6 py-6 ThemeVariantLight">
27
27
  <div class="text-primary text-subtitle">
28
28
  {{ type }}
29
29
  </div>
@@ -64,15 +64,18 @@ export default defineComponent({
64
64
  },
65
65
  title: {
66
66
  type: String,
67
- required: false
67
+ required: false,
68
+ default: undefined
68
69
  },
69
70
  text: {
70
71
  type: String,
71
- required: false
72
+ required: false,
73
+ default: undefined
72
74
  },
73
75
  image: {
74
76
  type: Object,
75
- required: false
77
+ required: false,
78
+ default: undefined
76
79
  }
77
80
  },
78
81
  computed: {
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div
3
3
  v-if="data"
4
- class="BlockInlineImage container mx-auto"
4
+ class="BlockInlineImage LayoutHelper container mx-auto"
5
5
  >
6
6
  <div class="lg:BaseGrid lg:px-0 px-4">
7
7
  <!-- the image -->
@@ -5,7 +5,7 @@
5
5
  :to="theItem.url ? theItem.url : undefined"
6
6
  :href="theItem.externalLink ? theItem.externalLink : undefined"
7
7
  class="BlockLinkCard group"
8
- link-class="block pb-5"
8
+ :link-class="`block ${compact ? 'pb-3' : 'pb-5'}`"
9
9
  external-target-blank
10
10
  >
11
11
  <BaseImagePlaceholder
@@ -29,7 +29,7 @@
29
29
  </BaseImagePlaceholder>
30
30
 
31
31
  <div
32
- class="transition-translate can-hover:group-hover:delay-200 duration-200 ease-in transform"
32
+ class="BlockLinkCard__CardContent transition-translate can-hover:group-hover:delay-200 duration-200 ease-in transform"
33
33
  :class="
34
34
  compact ? 'can-hover:group-hover:-translate-y-2' : 'can-hover:group-hover:-translate-y-3'
35
35
  "
@@ -71,7 +71,7 @@
71
71
  </p>
72
72
  </div>
73
73
  <div
74
- class="can-hover:block text-action can-hover:-ml-3 can-hover:group-hover:delay-200 can-hover:opacity-0 can-hover:group-hover:ml-0 can-hover:group-hover:opacity-100 hidden -mt-1 text-2xl leading-normal transition-all duration-200 ease-in"
74
+ class="BlockLinkCard__CardArrow ThemeVariantLight can-hover:block text-action can-hover:-ml-3 can-hover:group-hover:delay-200 can-hover:opacity-0 can-hover:group-hover:ml-0 can-hover:group-hover:opacity-100 hidden -mt-1 text-2xl leading-normal transition-all duration-200 ease-in"
75
75
  >
76
76
  <IconArrow />
77
77
  </div>
@@ -100,41 +100,50 @@ export default defineComponent({
100
100
  props: {
101
101
  data: {
102
102
  type: Object as PropType<Card>,
103
- required: false
103
+ required: false,
104
+ default: undefined
104
105
  },
105
106
  // override props as needed
106
107
  // so we can use this component in search results
107
108
  url: {
108
109
  type: String,
109
- required: false
110
+ required: false,
111
+ default: undefined
110
112
  },
111
113
  externalLink: {
112
114
  type: String,
113
- required: false
115
+ required: false,
116
+ default: undefined
114
117
  },
115
118
  thumbnailImage: {
116
119
  type: Object,
117
- required: false
120
+ required: false,
121
+ default: undefined
118
122
  },
119
123
  label: {
120
124
  type: String,
121
- required: false
125
+ required: false,
126
+ default: undefined
122
127
  },
123
128
  title: {
124
129
  type: String,
125
- required: false
130
+ required: false,
131
+ default: undefined
126
132
  },
127
133
  date: {
128
134
  type: String,
129
- required: false
135
+ required: false,
136
+ default: undefined
130
137
  },
131
138
  startDate: {
132
139
  type: String,
133
- required: false
140
+ required: false,
141
+ default: undefined
134
142
  },
135
143
  endDate: {
136
144
  type: String,
137
- required: false
145
+ required: false,
146
+ default: undefined
138
147
  },
139
148
  // if styling should be compact
140
149
  compact: {
@@ -144,7 +153,8 @@ export default defineComponent({
144
153
  // if a heading should be used and at what level
145
154
  headingLevel: {
146
155
  type: (String as PropType<HeadingLevel>) || null,
147
- required: false
156
+ required: false,
157
+ default: undefined
148
158
  }
149
159
  },
150
160
  computed: {
@@ -193,5 +203,15 @@ export default defineComponent({
193
203
  .text-subtitle.divide-x {
194
204
  @apply leading-none #{!important};
195
205
  }
206
+ .ThemeVariantDark & {
207
+ @apply bg-white;
208
+ .BlockLinkCard__CardContent,
209
+ .BlockLinkCard__CardArrow {
210
+ @apply px-6;
211
+ }
212
+ .BaseImagePlaceholder {
213
+ @apply bg-gray-mid-dark;
214
+ }
215
+ }
196
216
  }
197
217
  </style>
@@ -1,4 +1,3 @@
1
- \
2
1
  <template>
3
2
  <MixinCarousel
4
3
  v-if="hasContent"
@@ -3,6 +3,7 @@
3
3
  <BaseHeading
4
4
  v-if="data.heading"
5
5
  level="h2"
6
+ v-bind="$attrs"
6
7
  class="md:mb-8 mb-5"
7
8
  >
8
9
  {{ data.heading }}
@@ -43,7 +44,6 @@
43
44
  import { defineComponent } from 'vue'
44
45
  import type { PropType } from 'vue'
45
46
  import type { BlockData, RelatedLinkObject } from './../../interfaces'
46
-
47
47
  import RelatedLink from './../BlockRelatedLinks/RelatedLink.vue'
48
48
  import BaseHeading from './../BaseHeading/BaseHeading.vue'
49
49
 
@@ -63,6 +63,11 @@ export default defineComponent({
63
63
  type: Object as PropType<BlockRelatedLinksObject>,
64
64
  required: true,
65
65
  default: () => ({})
66
+ },
67
+ headingSize: {
68
+ type: String,
69
+ required: false,
70
+ default: undefined
66
71
  }
67
72
  },
68
73
  computed: {
@@ -47,6 +47,7 @@ export const BlockStreamfieldTruncatedData = {
47
47
  value:
48
48
  '<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'
49
49
  },
50
+ BlockInlineImageData.block,
50
51
  BlockIframeEmbedData
51
52
  ]
52
53
  }
@@ -316,6 +316,9 @@ export default defineComponent({
316
316
  &.-fluid {
317
317
  .LayoutHelper {
318
318
  @apply block;
319
+ &.container {
320
+ @apply px-0;
321
+ }
319
322
  }
320
323
 
321
324
  .BlockInlineImage {
@@ -15,22 +15,4 @@ export const CalendarButtonData = {
15
15
  endDatetime: '2021-11-11T23:59:59.999999-08:00'
16
16
  }
17
17
 
18
- // template
19
- const CalendarButtonTemplate = (args) => ({
20
- props: Object.keys(args),
21
- components: { CalendarButton },
22
- template: `
23
- <CalendarButton
24
- :is-all-day="isAllDay"
25
- :start-datetime="startDatetime"
26
- :end-datetime="endDatetime"
27
- :title="title"
28
- :location="location"
29
- />
30
- `
31
- })
32
-
33
- export const BaseStory = CalendarButtonTemplate.bind({})
34
- BaseStory.args = {
35
- ...CalendarButtonData
36
- }
18
+ export const BaseStory = { name: 'CalendarButton', args: CalendarButtonData }
@@ -1,12 +1,10 @@
1
1
  <template>
2
2
  <BaseButton
3
+ ref="CalendarButton"
3
4
  class="w-full"
4
5
  variant="secondary"
5
6
  compact
6
- @click="
7
- // @ts-ignore
8
- icalendar.download()
9
- "
7
+ @click="handleDownload"
10
8
  >
11
9
  Add to calendar
12
10
  </BaseButton>
@@ -15,6 +13,7 @@
15
13
  import { defineComponent } from 'vue'
16
14
  import { ICalendar } from 'datebook'
17
15
  import type { CalendarOptions } from 'datebook'
16
+ import { kebabCase } from 'lodash'
18
17
  // @ts-ignore
19
18
  import dayjs from 'dayjs'
20
19
  import BaseButton from './../BaseButton/BaseButton.vue'
@@ -27,31 +26,50 @@ export default defineComponent({
27
26
  props: {
28
27
  isAllDay: {
29
28
  type: Boolean,
30
- required: true
29
+ required: false,
30
+ default: false
31
31
  },
32
+
32
33
  startDatetime: {
33
34
  type: String,
34
35
  required: true
35
36
  },
36
37
  endDatetime: {
37
38
  type: String,
38
- required: false
39
+ required: false,
40
+ default: undefined
39
41
  },
40
42
  title: {
41
43
  type: String,
42
- required: false
44
+ required: false,
45
+ default: undefined
43
46
  },
44
47
  location: {
45
48
  type: String,
46
- required: false
49
+ required: false,
50
+ default: undefined
47
51
  },
48
52
  description: {
49
53
  type: String,
50
- required: false
54
+ required: false,
55
+ default: undefined
56
+ }
57
+ },
58
+ data(): {
59
+ icalendar: any
60
+ options: CalendarOptions | undefined
61
+ } {
62
+ return {
63
+ icalendar: undefined,
64
+ options: undefined
51
65
  }
52
66
  },
53
- computed: {
54
- icalendar(): ICalendar {
67
+
68
+ mounted() {
69
+ this.init()
70
+ },
71
+ methods: {
72
+ init() {
55
73
  let recurrence = {}
56
74
  if (this.endDatetime && this.isAllDay) {
57
75
  // Calculate how many full days
@@ -61,7 +79,7 @@ export default defineComponent({
61
79
  recurrence = { frequency: 'DAILY', interval: 1, count: difference }
62
80
  }
63
81
 
64
- const options: CalendarOptions = {
82
+ this.options = {
65
83
  title: this.title ? this.title : undefined,
66
84
  location: this.location ? this.addSlashes(this.location) : undefined,
67
85
  description: this.description ? this.description : undefined,
@@ -69,17 +87,25 @@ export default defineComponent({
69
87
  end: !this.isAllDay && this.endDatetime ? new Date(this.endDatetime) : undefined,
70
88
  recurrence
71
89
  }
72
-
73
- return new ICalendar(options)
74
- }
75
- },
76
- methods: {
90
+ this.icalendar = new ICalendar(this.options)
91
+ },
77
92
  addSlashes(string: string): string {
78
93
  // Escape special characters COMMA, SEMI-COLON and BACKSLASH
79
94
  // as temporary fix for this issue https://github.com/jshor/datebook/issues/179
80
95
  // regex based of https://stackoverflow.com/a/770533
81
96
  // eslint-disable-next-line
82
97
  return string.replace(/[,;\\]/g, '\\$&').replace(/\u0000/g, '\\0')
98
+ },
99
+ handleDownload() {
100
+ const ics = this.icalendar.render()
101
+ const blob = new Blob([ics], {
102
+ type: 'text/calendar'
103
+ })
104
+ const objectUrl = window.URL.createObjectURL(blob)
105
+ let fileLink = document.createElement('a')
106
+ fileLink.href = objectUrl
107
+ fileLink.download = kebabCase(this.title)
108
+ fileLink.click()
83
109
  }
84
110
  }
85
111
  })
@@ -1,33 +1,29 @@
1
1
  <template>
2
2
  <div
3
3
  v-if="image"
4
- class="HeroMedia mb-10 md:mb-10 lg:mb-14 -mx-4 lg:mx-0"
4
+ class="EventDetailHero mb-10 md:mb-10 lg:mb-14 -mx-4 lg:mx-0"
5
5
  >
6
- <div class="bg-gray-light">
7
- <div class="relative flex items-center mx-auto overflow-hidden vh-crop max-w-screen-3xl">
8
- <div class="hero">
9
- <BaseImage
10
- v-if="image.src"
11
- :src="image.src.url"
12
- :srcset="getSrcSet"
13
- :alt="image.alt"
14
- :width="image.src.width"
15
- :height="image.src.height"
16
- image-class="object-center w-full h-full"
17
- object-fit-class="cover"
18
- loading="lazy"
19
- />
20
- <div
21
- v-if="startDateSplit"
22
- class="ThemeVariantLight absolute top-0 left-0 z-10 px-4 py-4 text-center text-white bg-primary"
23
- >
24
- <div class="font-extrabold text-6xl leading-tight tracking-wider">
25
- {{ startDateSplit.day }}
26
- </div>
27
- <div class="text-subtitle">
28
- {{ startDateSplit.monthAndYear }}
29
- </div>
30
- </div>
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"
21
+ >
22
+ <div class="font-extrabold text-6xl leading-tight tracking-wider">
23
+ {{ startDateSplit.day }}
24
+ </div>
25
+ <div class="text-subtitle">
26
+ {{ startDateSplit.monthAndYear }}
31
27
  </div>
32
28
  </div>
33
29
  </div>
@@ -47,7 +43,8 @@ export default defineComponent({
47
43
  props: {
48
44
  data: {
49
45
  type: Object,
50
- required: false
46
+ required: false,
47
+ default: undefined
51
48
  },
52
49
  startDateSplit: {
53
50
  type: Object as PropType<EventDateObject | undefined>,
@@ -55,7 +52,8 @@ export default defineComponent({
55
52
  },
56
53
  image: {
57
54
  type: Object,
58
- required: false
55
+ required: false,
56
+ default: undefined
59
57
  }
60
58
  },
61
59
  computed: {
@@ -65,6 +63,3 @@ export default defineComponent({
65
63
  }
66
64
  })
67
65
  </script>
68
- <style lang="scss">
69
- @import '@explorer-1/common/src/scss/components/HeroMedia';
70
- </style>
@@ -17,7 +17,7 @@
17
17
  <div class="sm:flex flex-wrap items-center justify-between">
18
18
  <h2
19
19
  v-if="heading"
20
- class="font-primary text-gray-dark lg:text-6xl text-3xl font-semibold leading-normal tracking-normal uppercase"
20
+ class="MixinCarousel__Heading text-h3 defaultTheme:uppercase"
21
21
  >
22
22
  {{ heading }}
23
23
  </h2>
@@ -3,6 +3,7 @@ import ThumbnailCarousel from './ThumbnailCarousel.vue'
3
3
  export default {
4
4
  title: 'Components/Utilities/ThumbnailCarousel',
5
5
  component: ThumbnailCarousel,
6
+ tags: ['skip-test'],
6
7
  parameters: {
7
8
  docs: {
8
9
  description: {
@@ -6,6 +6,7 @@ import PageEventDetail from './PageEventDetail.vue'
6
6
  export default {
7
7
  title: 'Templates/PageEventDetail',
8
8
  component: PageEventDetail,
9
+ tags: ['!autodocs'],
9
10
  parameters: {
10
11
  html: {
11
12
  root: '#storyDecorator'
@@ -17,6 +18,7 @@ export default {
17
18
 
18
19
  // stories
19
20
  export const BaseStory = {
21
+ name: 'PageEventDetail',
20
22
  args: {
21
23
  data: {
22
24
  id: '285',
@@ -34,7 +36,7 @@ export const BaseStory = {
34
36
  label: 'Events',
35
37
  location: 'Webcast',
36
38
  registerLink: [],
37
- heroImage: {
39
+ eventImage: {
38
40
  ...EventDetailHeroData.heroImage
39
41
  },
40
42
  thumbnailImage: {
@@ -32,7 +32,7 @@
32
32
  >
33
33
  <div
34
34
  v-if="data.label"
35
- class="flex flex-wrap items-start mb-3"
35
+ class="flex flex-wrap items-start mb-4"
36
36
  >
37
37
  <nuxt-link
38
38
  class="py-3 cursor-pointer group nuxt-link-active text-subtitle text-primary can-hover:hover:text-primary-dark"
@@ -62,7 +62,7 @@
62
62
 
63
63
  <LayoutHelper indent="col-2">
64
64
  <EventDetailHero
65
- :image="data.heroImage"
65
+ :image="data.eventImage"
66
66
  :start-date-split="formattedSplitEventDates"
67
67
  />
68
68
 
@@ -73,7 +73,7 @@
73
73
  :class="data.registerLink && data.registerLink.length > 0 ? '' : 'lg:mb-10'"
74
74
  >
75
75
  <div class="PageEventDetail__Metadata text-primary">
76
- <IconCalendar class="relative mr-3" />
76
+ <IconCalendar class="relative mr-3 text-[1.2rem]" />
77
77
  <span>{{ formattedEventDates }}</span>
78
78
  </div>
79
79
  <div
@@ -6,7 +6,7 @@ export default {
6
6
  title: 'Templates/PageImageDetail',
7
7
  component: PageImageDetail,
8
8
  excludeStories: /.*Data$/,
9
- tags: ['!autodocs'],
9
+ tags: ['!autodocs', 'skip-test'],
10
10
  parameters: {
11
11
  layout: 'fullscreen'
12
12
  }
@@ -26,6 +26,7 @@ export default {
26
26
 
27
27
  // stories
28
28
  export const BaseStory = {
29
+ name: 'PageContent',
29
30
  args: {
30
31
  data: ContentPageData
31
32
  }