@explorer-1/vue 0.2.4 → 0.2.6

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 (67) hide show
  1. package/components.d.ts +3 -1
  2. package/dist/explorer-1-vue.js +4677 -4526
  3. package/dist/explorer-1-vue.umd.cjs +12 -12
  4. package/dist/src/components/BlockHeading/BlockHeading.vue.d.ts +25 -2
  5. package/dist/src/components/DetailHeadline/DetailHeadline.stories.d.ts +29 -1
  6. package/dist/src/components/DetailHeadline/DetailHeadline.vue.d.ts +26 -0
  7. package/dist/src/components/NavDesktop/NavDesktop.stories.d.ts +3 -0
  8. package/dist/src/components/NavDesktop/NavDesktop.vue.d.ts +1 -0
  9. package/dist/src/components/NavDesktop/NavDesktopDropdown.vue.d.ts +1 -0
  10. package/dist/src/components/NavDesktopEdu/NavDesktopEdu.stories.d.ts +1 -0
  11. package/dist/src/components/NavDropdownToggle/NavDropdownToggle.vue.d.ts +19 -6
  12. package/dist/src/components/NavJumpMenu/NavJumpMenu.stories.d.ts +31 -0
  13. package/dist/src/components/NavMobile/NavMobile.stories.d.ts +30 -3
  14. package/dist/src/components/NavMobile/NavMobile.vue.d.ts +1 -0
  15. package/dist/src/components/NavMobile/NavMobileDropdown.vue.d.ts +9 -1
  16. package/dist/src/components/NavMobile/NavMobileEdu.stories.d.ts +3 -0
  17. package/dist/src/components/NavMobile/NavMobileSecondaryDropdown.vue.d.ts +7 -0
  18. package/dist/src/components/NavSecondary/NavSecondary.stories.d.ts +8 -0
  19. package/dist/src/components/NavSecondary/NavSecondary.vue.d.ts +23 -1
  20. package/dist/src/components/NavSecondary/NavSecondaryDropdown.vue.d.ts +33 -2
  21. package/dist/src/components/NavSecondary/NavSecondaryDropdownContent.vue.d.ts +11 -1
  22. package/dist/src/components/NavSecondary/NavSecondaryLink.vue.d.ts +21 -3
  23. package/dist/src/interfaces.d.ts +7 -1
  24. package/dist/src/store/header.d.ts +2 -0
  25. package/dist/src/templates/edu/{PageEduResourceArticle/PageEduResourceArticle.stories.d.ts → PageEduExplainerArticle/PageEduExplainerArticle.stories.d.ts} +3 -2
  26. package/dist/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.stories.d.ts +1004 -6
  27. package/dist/src/utils/eventBus.d.ts +1 -0
  28. package/dist/src/utils/getHeadingId.d.ts +1 -0
  29. package/dist/src/utils/mixins.d.ts +1 -1
  30. package/dist/style.css +1 -1
  31. package/package.json +3 -2
  32. package/src/components/BaseAudio/BaseAudio.vue +3 -4
  33. package/src/components/BaseLink/BaseLink.vue +2 -0
  34. package/src/components/BaseTag/BaseTag.vue +4 -4
  35. package/src/components/BlockHeading/BlockHeading.vue +28 -0
  36. package/src/components/BlockStreamfield/BlockStreamfield.vue +5 -1
  37. package/src/components/DetailHeadline/DetailHeadline.stories.js +27 -2
  38. package/src/components/DetailHeadline/DetailHeadline.vue +76 -33
  39. package/src/components/NavDesktop/NavDesktopDropdown.vue +3 -5
  40. package/src/components/NavDesktopEdu/NavDesktopEdu.stories.js +6 -15
  41. package/src/components/NavDesktopEdu/NavDesktopEdu.vue +24 -8
  42. package/src/components/NavDropdownToggle/NavDropdownToggle.vue +8 -3
  43. package/src/components/NavHeading/NavHeading.stories.js +1 -1
  44. package/src/components/NavHeading/NavHeading.vue +1 -1
  45. package/src/components/NavJumpMenu/NavJumpMenu.stories.js +47 -0
  46. package/src/components/NavJumpMenu/NavJumpMenu.vue +141 -0
  47. package/src/components/NavJumpMenu/NavJumpMenuContent.vue +74 -0
  48. package/src/components/NavLinkList/NavLinkList.vue +1 -1
  49. package/src/components/NavMobile/NavMobile.vue +19 -5
  50. package/src/components/NavMobile/NavMobileDropdown.vue +8 -4
  51. package/src/components/NavMobile/NavMobileSecondaryDropdown.vue +4 -1
  52. package/src/components/NavSecondary/NavSecondary.stories.js +8 -3
  53. package/src/components/NavSecondary/NavSecondary.vue +26 -6
  54. package/src/components/NavSecondary/NavSecondaryDropdown.vue +52 -17
  55. package/src/components/NavSecondary/NavSecondaryDropdownContent.vue +5 -1
  56. package/src/components/NavSecondary/NavSecondaryLink.vue +38 -11
  57. package/src/components/TheFooter/TheFooter.vue +15 -1
  58. package/src/interfaces.ts +7 -1
  59. package/src/store/header.ts +6 -1
  60. package/src/templates/edu/PageEduEventDetail/PageEduEventDetail.vue +2 -2
  61. package/src/templates/edu/{PageEduResourceArticle/PageEduResourceArticle.stories.js → PageEduExplainerArticle/PageEduExplainerArticle.stories.js} +6 -6
  62. package/src/templates/edu/{PageEduResourceArticle/PageEduResourceArticle.vue → PageEduExplainerArticle/PageEduExplainerArticle.vue} +4 -2
  63. package/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.stories.js +6 -4
  64. package/src/templates/edu/PageEduNewsDetail/PageEduNewsDetail.vue +16 -2
  65. package/src/utils/eventBus.ts +3 -0
  66. package/src/utils/getHeadingId.ts +5 -0
  67. package/src/utils/mixins.ts +5 -1
@@ -1,19 +1,15 @@
1
1
  <template>
2
2
  <BaseLink
3
- :href="isExternal(item.path) ? item.path : null"
4
- :to="!isExternal(item.path) ? item.path : null"
3
+ :href="isExternal(item.path) ? item.path : undefined"
4
+ :to="!isExternal(item.path) ? item.path : undefined"
5
5
  link-class="block px-3 py-2"
6
6
  variant="none"
7
7
  class="NavSecondaryLink border-t-2 border-transparent"
8
- :class="index === 0 ? 'mr-auto text-primary font-semibold secondary-root' : 'text-gray-dark'"
8
+ :class="baseLinkClasses(index)"
9
9
  >
10
10
  <span
11
11
  class="inline-block pt-2 pb-1 mb-1 transition-colors duration-100 ease-in border-b-2 border-transparent"
12
- :class="
13
- index === 0
14
- ? 'can-hover:group-hover:border-primary'
15
- : 'can-hover:group-hover:border-gray-mid-dark can-hover:group-hover:text-gray-mid-dark '
16
- "
12
+ :class="spanClasses(index)"
17
13
  >
18
14
  {{ item.title }}
19
15
  </span>
@@ -21,7 +17,8 @@
21
17
  </template>
22
18
 
23
19
  <script lang="ts">
24
- import { defineComponent } from 'vue'
20
+ import { defineComponent, type PropType } from 'vue'
21
+ import type { BasicLinkObject } from './../../interfaces'
25
22
  import BaseLink from './../BaseLink/BaseLink.vue'
26
23
  export default defineComponent({
27
24
  name: 'NavSecondaryLink',
@@ -32,12 +29,17 @@ export default defineComponent({
32
29
  // the index from the v-for loop
33
30
  index: {
34
31
  type: Number,
35
- required: false
32
+ required: false,
33
+ default: undefined
36
34
  },
37
35
  // the nav item object that includes path and title
38
36
  item: {
39
- type: Object,
37
+ type: Object as PropType<BasicLinkObject>,
40
38
  required: true
39
+ },
40
+ invert: {
41
+ type: Boolean,
42
+ default: false
41
43
  }
42
44
  },
43
45
  methods: {
@@ -46,6 +48,23 @@ export default defineComponent({
46
48
  return true
47
49
  }
48
50
  return false
51
+ },
52
+ baseLinkClasses(index: number | undefined) {
53
+ let rootClasses = 'mr-auto font-semibold secondary-root'
54
+ rootClasses = this.invert
55
+ ? `${rootClasses} text-white -invert`
56
+ : `${rootClasses} text-primary`
57
+ const regularClasses = this.invert ? 'text-white -invert' : 'text-gray-dark'
58
+ return index === 0 ? rootClasses : regularClasses
59
+ },
60
+ spanClasses(index: number | undefined) {
61
+ const rootClasses = this.invert
62
+ ? 'can-hover:group-hover:border-white'
63
+ : 'can-hover:group-hover:border-primary'
64
+ const regularClasses = this.invert
65
+ ? 'can-hover:group-hover:border-white can-hover:group-hover:text-white'
66
+ : 'can-hover:group-hover:border-gray-mid-dark can-hover:group-hover:text-gray-mid-dark'
67
+ return index === 0 ? rootClasses : regularClasses
49
68
  }
50
69
  }
51
70
  })
@@ -58,5 +77,13 @@ export default defineComponent({
58
77
  @apply border-primary #{!important};
59
78
  }
60
79
  }
80
+ &.-invert {
81
+ .nuxt-link-exact-active {
82
+ span {
83
+ @apply font-bold text-white;
84
+ @apply border-white #{!important};
85
+ }
86
+ }
87
+ }
61
88
  }
62
89
  </style>
@@ -26,6 +26,18 @@
26
26
  {{ getLinkText(link) }}
27
27
  </BaseLink>
28
28
  </div>
29
+ <template v-if="themeStore.isEdu">
30
+ <BaseLink
31
+ variant="none"
32
+ href="https://www.nasa.gov/learning-resources/"
33
+ class="text-subtitle text-blue edu:text-white mb-3"
34
+ link-class="flex flex-wrap-none overflow-visible whitespace-nowrap items-center"
35
+ external-target-blank
36
+ >
37
+ <span class="pr-2">NASA OSTEM</span>
38
+ <IconExternal class="shrink-0 text-sm -mt-0.5" />
39
+ </BaseLink>
40
+ </template>
29
41
  </div>
30
42
  </div>
31
43
  <!-- footer extras -->
@@ -180,6 +192,7 @@ import { defineComponent } from 'vue'
180
192
  import { mapStores } from 'pinia'
181
193
  import { useThemeStore } from './../../store/theme'
182
194
  import { mixinGetRouterLink, mixinGetLinkText } from './../../utils/mixins'
195
+ import IconExternal from './../Icons/IconExternal.vue'
183
196
  import BaseLink from './../BaseLink/BaseLink.vue'
184
197
  import BaseButton from './../BaseButton/BaseButton.vue'
185
198
  import NavSocial from './../NavSocial/NavSocial.vue'
@@ -193,7 +206,8 @@ export default defineComponent({
193
206
  BaseButton,
194
207
  NavSocial,
195
208
  TheFooterSignUp,
196
- LogoCaltech
209
+ LogoCaltech,
210
+ IconExternal
197
211
  },
198
212
  props: {
199
213
  data: {
package/src/interfaces.ts CHANGED
@@ -1,12 +1,18 @@
1
1
  export interface BreadcrumbPathObject {
2
2
  path: string
3
3
  title: string
4
- children: any[]
4
+ children: BreadcrumbPathObject[]
5
+ }
6
+ export interface BasicLinkObject {
7
+ title: string
8
+ path: string
5
9
  }
6
10
 
7
11
  export interface BlockData {
8
12
  blockType: string
9
13
  field?: string
14
+ heading?: string
15
+ level?: string
10
16
  items?: any[]
11
17
  }
12
18
  export interface ImageSrcObject {
@@ -11,6 +11,7 @@ export interface State {
11
11
  highlightPrimary: boolean
12
12
  globalChildren?: any | null
13
13
  secondaryNav?: any | null
14
+ secondaryNavIsJumpMenu: boolean
14
15
  }
15
16
 
16
17
  export const useHeaderStore = defineStore('header', {
@@ -19,7 +20,8 @@ export const useHeaderStore = defineStore('header', {
19
20
  headerTransparent: false,
20
21
  highlightPrimary: true,
21
22
  globalChildren: null,
22
- secondaryNav: null
23
+ secondaryNav: null,
24
+ secondaryNavIsJumpMenu: false
23
25
  }
24
26
  },
25
27
  actions: {
@@ -35,6 +37,9 @@ export const useHeaderStore = defineStore('header', {
35
37
  },
36
38
  updateSecondary(value: any) {
37
39
  this.secondaryNav = value
40
+ },
41
+ updateSecondaryNavIsJumpMenu(value: boolean) {
42
+ this.secondaryNavIsJumpMenu = value
38
43
  }
39
44
  }
40
45
  })
@@ -32,11 +32,11 @@
32
32
  >
33
33
  <div
34
34
  v-if="data.eventType"
35
- class="flex flex-wrap items-start mb-3"
35
+ class="flex flex-wrap items-start mb-4"
36
36
  >
37
37
  <BaseTag
38
38
  variant="primary"
39
- size="md"
39
+ size="lg"
40
40
  >
41
41
  {{ data.eventType }}
42
42
  </BaseTag>
@@ -8,11 +8,11 @@ import { BlockVideoEmbedData } from './../../../components/BlockVideoEmbed/Block
8
8
  import { BlockRelatedLinksData } from './../../../components/BlockRelatedLinks/BlockRelatedLinks.stories.js'
9
9
  import { BlockLinkCardCarouselData } from './../../../components/BlockLinkCarousel/BlockLinkCarousel.stories.js'
10
10
  import { BlockStreamfieldTruncatedData } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
11
- import PageEduResourceArticle from './PageEduResourceArticle.vue'
11
+ import PageEduExplainerArticle from './PageEduExplainerArticle.vue'
12
12
 
13
13
  export default {
14
- title: 'Templates/EDU/PageEduResourceArticle',
15
- component: PageEduResourceArticle,
14
+ title: 'Templates/EDU/PageEduExplainerArticle',
15
+ component: PageEduExplainerArticle,
16
16
  decorators: [
17
17
  () => ({
18
18
  template: `<div id="storyDecorator" class="disable-nav-offset"><story/></div>`
@@ -30,9 +30,9 @@ export default {
30
30
  export const BaseStory = {
31
31
  args: {
32
32
  data: {
33
- __typename: 'EDUResourceArticlePage',
34
- pageType: 'EDUResourceArticlePage',
35
- contentType: 'edu_resources.EDUResourceArticlePage',
33
+ __typename: 'EDUExplainerArticlePage',
34
+ pageType: 'EDUExplainerArticlePage',
35
+ contentType: 'edu_resources.EDUExplainerArticlePage',
36
36
  seoTitle: 'Test Resource',
37
37
  searchDescription: '',
38
38
  slug: 'test-resource',
@@ -14,7 +14,7 @@ import BlockIframeEmbed from '../../../components/BlockIframeEmbed/BlockIframeEm
14
14
  import BlockRelatedLinks from '../../../components/BlockRelatedLinks/BlockRelatedLinks.vue'
15
15
 
16
16
  export default defineComponent({
17
- name: 'PageEduResourceArticle',
17
+ name: 'PageEduExplainerArticle',
18
18
  components: {
19
19
  HeroMedia,
20
20
  BaseImagePlaceholder,
@@ -107,8 +107,10 @@ export default defineComponent({
107
107
  :publication-date="data.publicationDate"
108
108
  :publication-time="data.publicationTime"
109
109
  :author="data.author"
110
- :label="data.displayLabel"
110
+ label="Explainer Article"
111
+ pill-color="secondary"
111
112
  schema
113
+ pill
112
114
  />
113
115
  <ShareButtonsEdu
114
116
  v-if="data?.url"
@@ -1,5 +1,5 @@
1
1
  import { HeroMediaData } from './../../../components/HeroMedia/HeroMedia.stories'
2
- import { BlockStreamfieldTruncatedData } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
2
+ import { BlockStreamfieldData } from './../../../components/BlockStreamfield/BlockStreamfield.stories'
3
3
  import PageEduNewsDetail from './PageEduNewsDetail.vue'
4
4
 
5
5
  export default {
@@ -56,7 +56,7 @@ export const BaseStory = {
56
56
  heroPosition: 'full_bleed',
57
57
  heroImage: HeroMediaData.image,
58
58
  heroImageInline: HeroMediaData.imageInline,
59
- ...BlockStreamfieldTruncatedData
59
+ ...BlockStreamfieldData
60
60
  }
61
61
  }
62
62
  }
@@ -65,7 +65,8 @@ export const InlineHero = {
65
65
  args: {
66
66
  data: {
67
67
  ...BaseStory.args.data,
68
- heroPosition: 'inline'
68
+ heroPosition: 'inline',
69
+ showJumpMenu: true
69
70
  }
70
71
  }
71
72
  }
@@ -74,7 +75,8 @@ export const NoHero = {
74
75
  args: {
75
76
  data: {
76
77
  ...BaseStory.args.data,
77
- hero: []
78
+ hero: [],
79
+ showJumpMenu: true
78
80
  }
79
81
  }
80
82
  }
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue'
2
+ import { computed, ref, defineExpose } from 'vue'
3
3
  import isEmpty from 'lodash/isEmpty.js'
4
4
  import type { StreamfieldBlockData } from './../../../components/BlockStreamfield/BlockStreamfield.vue'
5
5
  import type {
@@ -17,6 +17,7 @@ import ShareButtonsEdu from './../../../components/ShareButtonsEdu/ShareButtonsE
17
17
  import BlockImageStandard from './../../../components/BlockImage/BlockImageStandard.vue'
18
18
  import BlockText from './../../../components/BlockText/BlockText.vue'
19
19
  import BlockStreamfield from './../../../components/BlockStreamfield/BlockStreamfield.vue'
20
+ import NavJumpMenu from './../../../components/NavJumpMenu/NavJumpMenu.vue'
20
21
 
21
22
  interface PageEduNewsDetailObject extends PageResponseObject {
22
23
  readTime: string
@@ -35,6 +36,7 @@ interface PageEduNewsDetailObject extends PageResponseObject {
35
36
  topper: string
36
37
  relatedLinks: RelatedLinkObject[]
37
38
  body: StreamfieldBlockData[]
39
+ showJumpMenu: boolean
38
40
  }
39
41
 
40
42
  interface PageEduNewsDetailProps {
@@ -44,6 +46,8 @@ interface PageEduNewsDetailProps {
44
46
  // define props
45
47
  const props = defineProps<PageEduNewsDetailProps>()
46
48
 
49
+ const PageEduNewsDetailJumpMenu = ref()
50
+
47
51
  const heroEmpty = computed(() => {
48
52
  return isEmpty(props.data?.heroImage)
49
53
  })
@@ -67,6 +71,10 @@ const computedClass = computed(() => {
67
71
  const dateTimeArray = computed(() => {
68
72
  return props.data.publicationDate.split(' ')
69
73
  })
74
+
75
+ defineExpose({
76
+ PageEduNewsDetailJumpMenu
77
+ })
70
78
  </script>
71
79
  <template>
72
80
  <div
@@ -76,6 +84,13 @@ const dateTimeArray = computed(() => {
76
84
  itemscope
77
85
  itemtype="http://schema.org/Article"
78
86
  >
87
+ <NavJumpMenu
88
+ ref="PageEduNewsDetailJumpMenu"
89
+ :title="data.title"
90
+ :blocks="data.body"
91
+ :enabled="true"
92
+ />
93
+
79
94
  <!-- schema.org -->
80
95
  <meta
81
96
  v-if="data.thumbnailImage && data.thumbnailImage.original"
@@ -147,7 +162,6 @@ const dateTimeArray = computed(() => {
147
162
  {{ data.summary }}
148
163
  </p>
149
164
  </LayoutHelper>
150
-
151
165
  <!-- streamfield blocks -->
152
166
  <BlockStreamfield
153
167
  itemprop="articleBody"
@@ -0,0 +1,3 @@
1
+ import mitt from 'mitt'
2
+
3
+ export const eventBus = mitt()
@@ -0,0 +1,5 @@
1
+ import { camelCase } from 'lodash'
2
+
3
+ export const getHeadingId = (heading: string, index?: number) => {
4
+ return camelCase(heading + (index ? index : ''))
5
+ }
@@ -123,9 +123,13 @@ export const mixinUpdateGlobalChildren = (value: [BreadcrumbPathObject] | null)
123
123
  /* -- mixinUpdateSecondary --
124
124
  This mixin is used by the navigation to share secondary nav override items between components
125
125
  */
126
- export const mixinUpdateSecondary = (value: [BreadcrumbPathObject] | null) => {
126
+ export const mixinUpdateSecondary = (
127
+ value: BreadcrumbPathObject[] | undefined,
128
+ isJumpMenu: boolean = false
129
+ ) => {
127
130
  const headerStore = useHeaderStore()
128
131
  headerStore.updateSecondary(value)
132
+ headerStore.updateSecondaryNavIsJumpMenu(isJumpMenu)
129
133
  }
130
134
  /* -- mixinHighlightPrimary --
131
135
  This mixin is used to specify if active primary navigation items should be highlighted/underlined