@explorer-1/vue 0.2.27 → 0.2.28

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 (35) hide show
  1. package/components.d.ts +1 -0
  2. package/dist/explorer-1-vue.js +3 -3
  3. package/dist/explorer-1-vue.umd.cjs +1 -1
  4. package/dist/src/components/AboutTheAuthor/AboutTheAuthor.stories.d.ts +30 -0
  5. package/dist/src/components/BaseImage/BaseImage.stories.d.ts +1 -1
  6. package/dist/src/components/BaseImage/BaseImage.vue.d.ts +1 -1
  7. package/dist/src/components/BlockLinkCard/BlockLinkCard.vue.d.ts +3 -3
  8. package/dist/src/components/DetailHeadline/DetailHeadline.vue.d.ts +10 -7
  9. package/dist/src/components/EventCard/EventCard.vue.d.ts +1 -1
  10. package/dist/src/components/MetadataEduResource/MetadataEduResource.vue.d.ts +1 -1
  11. package/dist/src/components/MetadataEvent/MetadataEvent.vue.d.ts +1 -1
  12. package/dist/src/components/MixinAnimationCaret/MixinAnimationCaret.stories.d.ts +1 -1
  13. package/dist/src/components/MixinAnimationCaret/MixinAnimationCaret.vue.d.ts +1 -1
  14. package/dist/src/components/SearchResultCard/SearchResultCard.vue.d.ts +3 -3
  15. package/dist/src/components/TextInput/TextInput.vue.d.ts +9 -9
  16. package/dist/src/interfaces.d.ts +7 -1
  17. package/dist/src/templates/edu/PageEduCollectionsDetail/PageEduCollectionsDetail.stories.d.ts +7 -7
  18. package/dist/src/templates/edu/PageEduLesson/PageEduLesson.stories.d.ts +2 -0
  19. package/dist/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.stories.d.ts +30 -0
  20. package/dist/src/templates/edu/PageEduTeachableMoment/PageEduTeachableMoment.stories.d.ts +2 -0
  21. package/dist/style.css +1 -1
  22. package/package.json +2 -2
  23. package/src/components/AboutTheAuthor/AboutTheAuthor.stories.js +50 -0
  24. package/src/components/AboutTheAuthor/AboutTheAuthor.vue +90 -0
  25. package/src/components/BlockText/BlockText.vue +3 -3
  26. package/src/components/DetailHeadline/DetailHeadline.vue +2 -3
  27. package/src/interfaces.ts +5 -1
  28. package/src/templates/edu/PageEduExplainerArticle/PageEduExplainerArticle.stories.js +3 -1
  29. package/src/templates/edu/PageEduExplainerArticle/PageEduExplainerArticle.vue +23 -0
  30. package/src/templates/edu/PageEduLesson/PageEduLesson.stories.js +2 -0
  31. package/src/templates/edu/PageEduLesson/PageEduLesson.vue +9 -1
  32. package/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.stories.js +3 -8
  33. package/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.vue +10 -1
  34. package/src/templates/edu/PageEduTeachableMoment/PageEduTeachableMoment.stories.js +2 -0
  35. package/src/templates/edu/PageEduTeachableMoment/PageEduTeachableMoment.vue +7 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorer-1/vue",
3
- "version": "0.2.27",
3
+ "version": "0.2.28",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -30,7 +30,7 @@
30
30
  "vue-bind-once": "^0.2.1",
31
31
  "vue-observe-visibility": "^1.0.0",
32
32
  "vue3-compare-image": "^1.2.5",
33
- "@explorer-1/common": "1.1.7"
33
+ "@explorer-1/common": "1.1.8"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@vitejs/plugin-vue": "^5.0.4",
@@ -0,0 +1,50 @@
1
+ import AboutTheAuthor from './AboutTheAuthor.vue'
2
+
3
+ export default {
4
+ title: 'Components/Utilities/AboutTheAuthor',
5
+ component: AboutTheAuthor,
6
+ tags: ['!autodocs'],
7
+ excludeStories: /.*Data$/
8
+ }
9
+
10
+ export const AboutTheAuthorData = [
11
+ {
12
+ author: {
13
+ biography:
14
+ '<p data-block-key="8meb7">I&#x27;m someone that has a bio! Test <a href="http://localhost:3000/edu/news">link</a>.</p>',
15
+ image: {
16
+ src: {
17
+ url: 'https://picsum.photos/512/512',
18
+ width: 512,
19
+ height: 512
20
+ },
21
+ alt: ''
22
+ },
23
+ jobTitle: 'Job title',
24
+ name: 'Author name',
25
+ organization: 'Organization'
26
+ }
27
+ },
28
+ {
29
+ author: {
30
+ biography:
31
+ '<p data-block-key="8meb7">I&#x27;m someone that has a bio! Test <a href="http://localhost:3000/edu/news">link</a>. Lorem ipsum dolor sit amet long author bio here.</p><p>Lorem ipsum dolor site amet consectatur.</p>',
32
+ image: {
33
+ src: {
34
+ url: 'https://picsum.photos/512/512',
35
+ width: 512,
36
+ height: 512
37
+ },
38
+ alt: ''
39
+ },
40
+ jobTitle: 'Job title',
41
+ name: 'Another author',
42
+ organization: 'Organization'
43
+ }
44
+ }
45
+ ]
46
+ // stories
47
+ export const BaseStory = {
48
+ name: 'AboutTheAuthor',
49
+ args: { authors: AboutTheAuthorData }
50
+ }
@@ -0,0 +1,90 @@
1
+ <script setup lang="ts">
2
+ import { computed, reactive } from 'vue'
3
+ import type { AuthorObject } from '../../interfaces'
4
+ import BlockText from './../BlockText/BlockText.vue'
5
+ import BaseImage from './../BaseImage/BaseImage.vue'
6
+ import BaseImagePlaceholder from './../BaseImagePlaceholder/BaseImagePlaceholder.vue'
7
+
8
+ interface AboutTheAuthorProps {
9
+ authors: {
10
+ author?: AuthorObject
11
+ }[]
12
+ }
13
+
14
+ // define props
15
+ const props = withDefaults(defineProps<AboutTheAuthorProps>(), {
16
+ authors: undefined
17
+ })
18
+
19
+ const { authors } = reactive(props)
20
+
21
+ const headingString = computed(() => {
22
+ let noun = 'Author'
23
+ if (authors?.length > 1) {
24
+ noun = 'Authors'
25
+ }
26
+ return `About the ${noun}`
27
+ })
28
+ </script>
29
+ <template>
30
+ <div class="AboutTheAuthor">
31
+ <h3 class="text-h4 sm:ml-[130px] pl-10 mb-6">
32
+ {{ headingString }}
33
+ </h3>
34
+ <template
35
+ v-for="(author, index) in authors"
36
+ :key="index"
37
+ >
38
+ <div
39
+ v-if="author.author"
40
+ class="sm:flex flex-row"
41
+ :class="{ ' mb-10 sm:mb-12': index + 1 !== authors.length }"
42
+ >
43
+ <div class="sm:mr-10">
44
+ <BaseImagePlaceholder
45
+ aspect-ratio="1:1"
46
+ class="relative mb-6 sm:mb-0 overflow-hidden rounded-full w-[130px]"
47
+ transparent-mode
48
+ no-logo
49
+ >
50
+ <BaseImage
51
+ v-if="author.author.image?.src"
52
+ :src="author.author.image.src.url"
53
+ :width="author.author.image.src.width"
54
+ :height="author.author.image.src.height"
55
+ :alt="author.author.name"
56
+ object-fit-class="cover"
57
+ image-class="can-hover:group-hover:delay-200 can-hover:group-hover:scale-100 absolute top-0 left-0 w-full transition-all duration-200 ease-in transform scale-105"
58
+ loading="lazy"
59
+ />
60
+ </BaseImagePlaceholder>
61
+ </div>
62
+ <div>
63
+ <div class="mb-4">
64
+ <h3
65
+ v-if="author.author.name"
66
+ class="!font-medium !tracking-normal !text-lg mb-1"
67
+ >
68
+ {{ author.author.name }}
69
+ </h3>
70
+ <p
71
+ v-if="author.author.jobTitle || author.author.organization"
72
+ class="text-lg"
73
+ >
74
+ {{
75
+ (author.author.jobTitle ? author.author.jobTitle : '') +
76
+ (author.author.jobTitle && author.author.organization ? ', ' : '')
77
+ }}
78
+ {{ author.author.organization }}
79
+ </p>
80
+ </div>
81
+ <BlockText
82
+ v-if="author.author.biography"
83
+ :text="author.author.biography"
84
+ variant="small"
85
+ />
86
+ </div>
87
+ </div>
88
+ </template>
89
+ </div>
90
+ </template>
@@ -13,9 +13,9 @@ interface Variants {
13
13
  }
14
14
 
15
15
  export const variants: Variants = {
16
- small: 'text-body-sm',
17
- medium: 'text-body-md',
18
- large: 'text-body-lg'
16
+ small: 'text-body-sm -small',
17
+ medium: 'text-body-md -medium',
18
+ large: 'text-body-lg -large'
19
19
  }
20
20
 
21
21
  export default defineComponent({
@@ -140,7 +140,7 @@ export default defineComponent({
140
140
  default: undefined
141
141
  },
142
142
  author: {
143
- type: Object as PropType<AuthorObject | AuthorObject[]>,
143
+ type: Object as PropType<AuthorObject | { author: AuthorObject }[]>,
144
144
  required: false,
145
145
  default: undefined
146
146
  },
@@ -208,11 +208,10 @@ export default defineComponent({
208
208
  const returnDate = new Date(this.publicationDate + ' ' + currentTime)
209
209
  return returnDate.toISOString()
210
210
  },
211
- authors(): { name: string; organization: string }[] | undefined {
211
+ authors(): AuthorObject[] | undefined {
212
212
  let authors: AuthorObject[] | undefined = undefined
213
213
  if (this.author && this.author.constructor === Array) {
214
214
  authors = []
215
- // @ts-expect-error we know it's an array at this point
216
215
  this.author.forEach((author: { author: AuthorObject }) => {
217
216
  // @ts-expect-error authors array is defined above
218
217
  authors.push(author.author)
package/src/interfaces.ts CHANGED
@@ -183,7 +183,10 @@ export interface Attributes {
183
183
 
184
184
  export interface AuthorObject {
185
185
  name: string
186
- organization: string
186
+ organization?: string
187
+ image?: ImageObject
188
+ jobTitle?: string
189
+ biography?: string
187
190
  }
188
191
 
189
192
  export interface Topic {
@@ -262,6 +265,7 @@ export interface EduResourceStandardItem {
262
265
 
263
266
  export interface PageEduResourcesObject extends PageObject {
264
267
  hero?: StreamfieldBlockData[]
268
+ authors?: { author: AuthorObject }[]
265
269
  primarySubject?: EduResourcesSubject
266
270
  additionalSubjects?: EduResourcesSubject[]
267
271
  gradeLevels?: EduResourcesGradeLevel[]
@@ -4,10 +4,10 @@ import { BlockImageCarouselData } from './../../../components/BlockImageCarousel
4
4
  import { BlockImageComparisonData } from './../../../components/BlockImageComparison/BlockImageComparison.stories'
5
5
  import { BaseVideoData } from './../../../components/BaseVideo/BaseVideo.stories'
6
6
  import { BlockVideoEmbedData } from './../../../components/BlockVideoEmbed/BlockVideoEmbed.stories'
7
-
8
7
  import { BlockRelatedLinksData } from './../../../components/BlockRelatedLinks/BlockRelatedLinks.stories.js'
9
8
  import { BlockLinkCardCarouselData } from './../../../components/BlockLinkCarousel/BlockLinkCarousel.stories.js'
10
9
  import { BlockStreamfieldTruncatedData } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
10
+ import { AboutTheAuthorData } from './../../../components/AboutTheAuthor/AboutTheAuthor.stories'
11
11
  import PageEduExplainerArticle from './PageEduExplainerArticle.vue'
12
12
 
13
13
  export default {
@@ -41,6 +41,8 @@ export const BaseStory = {
41
41
  url: 'http://localhost:3000/edu/resources/test-resource',
42
42
  title: 'Test Resource',
43
43
  readTime: '6 min read',
44
+ lastPublishedAt: '2024-08-22T02:33:13.507206+00:00',
45
+ authors: AboutTheAuthorData,
44
46
  heroConstrain: true,
45
47
  heroPosition: 'full_bleed',
46
48
  hero: [
@@ -10,10 +10,12 @@ import BlockStreamfield from './../../../components/BlockStreamfield/BlockStream
10
10
  import BlockRelatedLinks from '../../../components/BlockRelatedLinks/BlockRelatedLinks.vue'
11
11
  import NavJumpMenu from './../../../components/NavJumpMenu/NavJumpMenu.vue'
12
12
  import HeroInlineMedia from './../../../components/HeroInlineMedia/HeroInlineMedia.vue'
13
+ import AboutTheAuthor from './../../../components/AboutTheAuthor/AboutTheAuthor.vue'
13
14
 
14
15
  export default defineComponent({
15
16
  name: 'PageEduExplainerArticle',
16
17
  components: {
18
+ AboutTheAuthor,
17
19
  HeroMedia,
18
20
  HeroInlineMedia,
19
21
  LayoutHelper,
@@ -170,5 +172,26 @@ export default defineComponent({
170
172
  :heading="data.relatedContentHeading"
171
173
  :items="data.relatedContent"
172
174
  />
175
+
176
+ <LayoutHelper
177
+ v-if="data.authors?.length"
178
+ indent="col-3"
179
+ >
180
+ <AboutTheAuthor :authors="data.authors" />
181
+ </LayoutHelper>
182
+
183
+ <LayoutHelper
184
+ v-if="data.lastPublishedAt"
185
+ indent="col-3"
186
+ class="lg:my-18 my-10"
187
+ >
188
+ <p class="border-t border-gray-light-mid pt-8">
189
+ <strong>Explainer Article Last Updated:</strong>
190
+ {{
191
+ // @ts-ignore
192
+ $filters.displayDate(data.lastPublishedAt)
193
+ }}
194
+ </p>
195
+ </LayoutHelper>
173
196
  </div>
174
197
  </template>
@@ -13,6 +13,7 @@ import {
13
13
  BlockStreamfieldMinimalData
14
14
  } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
15
15
  import PageEduLesson from './PageEduLesson.vue'
16
+ import { AboutTheAuthorData } from './../../../components/AboutTheAuthor/AboutTheAuthor.stories'
16
17
 
17
18
  export default {
18
19
  title: 'Templates/EDU/PageEduLesson',
@@ -50,6 +51,7 @@ export const BaseStory = {
50
51
  original: 'http://127.0.0.1:9000/media/original_images/imagessirtfsirtf-090303-16.jpg',
51
52
  alt: ''
52
53
  },
54
+ authors: AboutTheAuthorData,
53
55
  hero: [
54
56
  {
55
57
  ...HeroMediaData,
@@ -19,6 +19,7 @@ import MetaPanel from '../../../components/MetaPanel/MetaPanel.vue'
19
19
  import PageEduLessonSection, { type PageEduLessonSectionProps } from './PageEduLessonSection.vue'
20
20
  import NavJumpMenu from './../../../components/NavJumpMenu/NavJumpMenu.vue'
21
21
  import HeroInlineMedia from './../../../components/HeroInlineMedia/HeroInlineMedia.vue'
22
+ import AboutTheAuthor from './../../../components/AboutTheAuthor/AboutTheAuthor.vue'
22
23
 
23
24
  import { HeadingLevel } from '../../../components/BaseHeading/BaseHeading.vue'
24
25
 
@@ -364,10 +365,17 @@ const consolidatedSections = computed((): EduLessonSectionObject[] => {
364
365
  <BlockLinkCarousel
365
366
  item-type="cards"
366
367
  class="lg:my-24 my-12 print:px-4"
367
- :heading="data.relatedContentHeading"
368
+ :heading="data.relatedContentHeading || 'Related Lessons & Projects'"
368
369
  :items="data.relatedContent"
369
370
  />
370
371
 
372
+ <LayoutHelper
373
+ v-if="data.authors?.length"
374
+ indent="col-3"
375
+ >
376
+ <AboutTheAuthor :authors="data.authors" />
377
+ </LayoutHelper>
378
+
371
379
  <LayoutHelper
372
380
  v-if="data.lastPublishedAt"
373
381
  indent="col-3"
@@ -1,5 +1,7 @@
1
1
  import { HeroMediaData } from './../../../components/HeroMedia/HeroMedia.stories'
2
2
  import { BlockStreamfieldData } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
3
+ import { AboutTheAuthorData } from './../../../components/AboutTheAuthor/AboutTheAuthor.stories'
4
+
3
5
  import PageEduNewsDetail from './PageEduNewsDetail.vue'
4
6
 
5
7
  export default {
@@ -33,14 +35,7 @@ export const BaseStory = {
33
35
  title: "NASA's Ingenuity Mars Helicopter Recharges Its Batteries in Flight",
34
36
  publicationDate: '2024-06-20 20:36:49.657301+00:00',
35
37
  readTime: '5 min read',
36
- authors: [
37
- {
38
- author: {
39
- name: 'Author Name',
40
- organization: 'Organization Name'
41
- }
42
- }
43
- ],
38
+ authors: AboutTheAuthorData,
44
39
  getTopicsForDisplay: [
45
40
  {
46
41
  title: 'Mars',
@@ -10,6 +10,7 @@ import BlockImageStandard from './../../../components/BlockImage/BlockImageStand
10
10
  import BlockText from './../../../components/BlockText/BlockText.vue'
11
11
  import BlockStreamfield from './../../../components/BlockStreamfield/BlockStreamfield.vue'
12
12
  import NavJumpMenu from './../../../components/NavJumpMenu/NavJumpMenu.vue'
13
+ import AboutTheAuthor from './../../../components/AboutTheAuthor/AboutTheAuthor.vue'
13
14
 
14
15
  interface PageEduNewsDetailObject extends PageObject {
15
16
  readTime: string
@@ -18,7 +19,7 @@ interface PageEduNewsDetailObject extends PageObject {
18
19
  heroImageInline: ImageObject
19
20
  heroConstrain: boolean
20
21
  heroImageCaption: string
21
- authors: AuthorObject[]
22
+ authors: { author: AuthorObject }[]
22
23
  showJumpMenu: boolean
23
24
  }
24
25
 
@@ -152,6 +153,14 @@ defineExpose({
152
153
  :data="data.body"
153
154
  />
154
155
 
156
+ <LayoutHelper
157
+ v-if="data.authors?.length"
158
+ indent="col-3"
159
+ class="mb-10 lg:mb-22"
160
+ >
161
+ <AboutTheAuthor :authors="data.authors" />
162
+ </LayoutHelper>
163
+
155
164
  <div class="bg-stars bg-primary-darker">
156
165
  <div class="py-10 text-center text-white">
157
166
  <strong>Related News goes here</strong>
@@ -13,6 +13,7 @@ import {
13
13
  BlockStreamfieldMinimalData
14
14
  } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
15
15
  import PageEduTeachableMoment from './PageEduTeachableMoment.vue'
16
+ import { AboutTheAuthorData } from './../../../components/AboutTheAuthor/AboutTheAuthor.stories'
16
17
 
17
18
  export default {
18
19
  title: 'Templates/EDU/PageEduTeachableMoment',
@@ -47,6 +48,7 @@ export const BaseStory = {
47
48
  original: 'http://127.0.0.1:9000/media/original_images/imagessirtfsirtf-090303-16.jpg',
48
49
  alt: ''
49
50
  },
51
+ authors: AboutTheAuthorData,
50
52
  hero: [
51
53
  {
52
54
  ...HeroMediaData,
@@ -11,6 +11,7 @@ import BlockStreamfield from './../../../components/BlockStreamfield/BlockStream
11
11
  import BlockRelatedLinks from '../../../components/BlockRelatedLinks/BlockRelatedLinks.vue'
12
12
  import NavJumpMenu from './../../../components/NavJumpMenu/NavJumpMenu.vue'
13
13
  import HeroInlineMedia from './../../../components/HeroInlineMedia/HeroInlineMedia.vue'
14
+ import AboutTheAuthor from './../../../components/AboutTheAuthor/AboutTheAuthor.vue'
14
15
 
15
16
  interface PageEduTeachableMomentProps {
16
17
  data?: PageEduResourcesObject
@@ -142,14 +143,12 @@ const computedClass = computed((): string => {
142
143
  <BlockRelatedLinks :data="data.relatedLinks[0]" />
143
144
  </LayoutHelper>
144
145
 
145
- <!-- related content -->
146
- <BlockLinkCarousel
147
- v-if="data.relatedContent?.length"
148
- item-type="cards"
149
- class="lg:my-24 my-12 print:px-4"
150
- :heading="data.relatedContentHeading"
151
- :items="data.relatedContent"
152
- />
146
+ <LayoutHelper
147
+ v-if="data.authors?.length"
148
+ indent="col-3"
149
+ >
150
+ <AboutTheAuthor :authors="data.authors" />
151
+ </LayoutHelper>
153
152
 
154
153
  <LayoutHelper
155
154
  v-if="data.lastPublishedAt"