@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
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <NavSecondary
3
+ v-if="enabled"
4
+ id="JumpMenuTop"
5
+ ref="NavJumpMenuRef"
6
+ class="NavJumpMenu -hide-until-threshold"
7
+ :invert="invert"
8
+ >
9
+ <template v-for="(item, index) in theBreadcrumbs">
10
+ <template v-if="item.children && item.children.length > 0">
11
+ <NavSecondaryDropdown
12
+ :key="index"
13
+ :item="item"
14
+ :index="index"
15
+ :is-last="theBreadcrumbs && index === theBreadcrumbs.length - 1"
16
+ :invert="invert"
17
+ >
18
+ <NavJumpMenuContent
19
+ :key="index"
20
+ :item="item"
21
+ />
22
+ </NavSecondaryDropdown>
23
+ </template>
24
+ <template v-else>
25
+ <NavSecondaryLink
26
+ :key="index"
27
+ :item="item"
28
+ :index="index"
29
+ :invert="invert"
30
+ />
31
+ </template>
32
+ </template>
33
+ </NavSecondary>
34
+ </template>
35
+ <script setup lang="ts">
36
+ import { computed, defineExpose, ref, onMounted, watch } from 'vue'
37
+ import { mixinUpdateSecondary } from './../../utils/mixins'
38
+ import { useRoute } from 'vue-router'
39
+ import NavSecondary from './../NavSecondary/NavSecondary.vue'
40
+ import NavSecondaryDropdown from './../NavSecondary/NavSecondaryDropdown.vue'
41
+ import NavSecondaryLink from './../NavSecondary/NavSecondaryLink.vue'
42
+ import NavJumpMenuContent from './../NavJumpMenu/NavJumpMenuContent.vue'
43
+ import type { BlockData, BreadcrumbPathObject } from './../../interfaces'
44
+ import { getHeadingId } from '../../utils/getHeadingId'
45
+
46
+ interface NavJumpMenuProps {
47
+ title?: string
48
+ jumpLinks?: BreadcrumbPathObject[]
49
+ blocks?: BlockData[]
50
+ headingLevel?: string
51
+ invert?: boolean
52
+ enabled?: boolean
53
+ }
54
+
55
+ const props = withDefaults(defineProps<NavJumpMenuProps>(), {
56
+ title: undefined,
57
+ jumpLinks: undefined,
58
+ blocks: undefined,
59
+ headingLevel: 'h2',
60
+ enabled: true,
61
+ invert: true,
62
+ hidden: false
63
+ })
64
+
65
+ const NavJumpMenuRef = ref()
66
+
67
+ const theJumpLinks = computed(() => {
68
+ if (props.jumpLinks) {
69
+ return props.jumpLinks
70
+ } else if (props.blocks) {
71
+ const indexedBlocks = props.blocks.map((b, index) => {
72
+ return {
73
+ ...b,
74
+ index: index
75
+ }
76
+ })
77
+ const filteredBlocks = indexedBlocks.filter((b) => {
78
+ return b.blockType === 'HeadingBlock' && b.level === props.headingLevel
79
+ })
80
+ // map to the correct data shape
81
+ const links: BreadcrumbPathObject[] = filteredBlocks.map((l) => {
82
+ return {
83
+ // @ts-expect-error using parameter that was added to BlockData
84
+ path: '#' + getHeadingId(l.heading, l.index),
85
+ title: l.heading
86
+ } as BreadcrumbPathObject
87
+ })
88
+ return links
89
+ }
90
+ return []
91
+ })
92
+
93
+ const theBreadcrumbs = computed(() => {
94
+ let breadcrumb = undefined
95
+ const rootItem = props.title
96
+ ? {
97
+ title: props.title,
98
+ path: '#JumpMenuTop'
99
+ }
100
+ : {
101
+ title: 'Back to top',
102
+ path: '#JumpMenuTop'
103
+ }
104
+ const jumpMenu: BreadcrumbPathObject = {
105
+ title: 'Jump to…',
106
+ path: '#',
107
+ children: theJumpLinks.value as BreadcrumbPathObject[]
108
+ }
109
+ if (theJumpLinks.value) {
110
+ breadcrumb = [rootItem, jumpMenu]
111
+ }
112
+ return breadcrumb as BreadcrumbPathObject[] | undefined
113
+ })
114
+ defineExpose({
115
+ NavJumpMenuRef
116
+ })
117
+ onMounted(() => {
118
+ mixinUpdateSecondary(theBreadcrumbs.value, true)
119
+ })
120
+ const route = useRoute()
121
+
122
+ // repopulate the store with the jump links since the store is cleared on route changes
123
+ watch(
124
+ route,
125
+ () => {
126
+ mixinUpdateSecondary(theBreadcrumbs.value, true)
127
+ }
128
+ // { flush: 'pre', immediate: true, deep: true }
129
+ )
130
+ </script>
131
+ <style lang="scss">
132
+ .NavJumpMenu {
133
+ &.-hide-until-threshold {
134
+ @apply opacity-0 h-0 transition-none overflow-visible;
135
+ &.-is-sticky,
136
+ &.-is-sticky-offset {
137
+ @apply opacity-100 transition-opacity;
138
+ }
139
+ }
140
+ }
141
+ </style>
@@ -0,0 +1,74 @@
1
+ <template>
2
+ <ul class="NavJumpMenuContent bg-white">
3
+ <li
4
+ v-for="(child, index) in item.children"
5
+ :key="index"
6
+ class="text-base border-b border-gray-light"
7
+ >
8
+ <BaseLink
9
+ :href="child.path"
10
+ variant="none"
11
+ :link-class="linkClass(child)"
12
+ >
13
+ <span>
14
+ {{ child.title }}
15
+ </span>
16
+ </BaseLink>
17
+ </li>
18
+ </ul>
19
+ </template>
20
+
21
+ <script lang="ts">
22
+ import { defineComponent } from 'vue'
23
+ import BaseLink from './../BaseLink/BaseLink.vue'
24
+
25
+ interface NavItemObject {
26
+ path: String
27
+ title: String
28
+ children: [Object]
29
+ }
30
+ export default defineComponent({
31
+ name: 'NavJumpMenuContent',
32
+ components: {
33
+ BaseLink
34
+ },
35
+ props: {
36
+ // the tertiary nav item object that includes path, title, and children
37
+ item: {
38
+ type: Object,
39
+ required: true
40
+ }
41
+ },
42
+ methods: {
43
+ linkClass(item?: NavItemObject) {
44
+ // default
45
+ let computedClass = 'py-2 lg:py-4'
46
+ if (!item) {
47
+ // if first (aka Overview)
48
+ computedClass = 'py-2 lg:pt-4 lg:pb-4'
49
+ } else if (item.children && item.children.length > 0) {
50
+ // if has children
51
+ computedClass = 'pt-2 pb-1 lg:pt-4 lg:pb-2'
52
+ }
53
+ return computedClass
54
+ }
55
+ }
56
+ })
57
+ </script>
58
+ <style lang="scss">
59
+ .NavJumpMenuContent {
60
+ a {
61
+ @apply block pl-18 pr-6 lg:pl-6 text-gray-dark;
62
+
63
+ > span {
64
+ @apply border-b border-transparent pb-2px;
65
+ }
66
+
67
+ &:hover {
68
+ > span {
69
+ @apply border-gray-dark text-gray-dark;
70
+ }
71
+ }
72
+ }
73
+ }
74
+ </style>
@@ -12,7 +12,7 @@
12
12
  >
13
13
  <BaseLink
14
14
  variant="none"
15
- class="block text-lg font-medium leading-tight text-white"
15
+ class="block text-base xl:text-lg font-medium leading-tight text-white"
16
16
  :href="item.path && !getRouterLink(item) ? item.path : undefined"
17
17
  :to="getRouterLink(item) ? getRouterLink(item) : undefined"
18
18
  link-class="can-hover:hover:underline inline-block px-2 py-3 -ml-2"
@@ -87,6 +87,18 @@
87
87
  :start-open="checkActive(item.titleLink) && !hasSecondary"
88
88
  />
89
89
  </template>
90
+ <template v-if="themeStore.isEdu">
91
+ <BaseLink
92
+ variant="none"
93
+ href="https://www.nasa.gov/learning-resources/"
94
+ class="group relative block w-full px-4 py-2 text-xl font-medium text-left"
95
+ link-class="flex flex-wrap-none overflow-visible whitespace-nowrap items-center py-0 pl-6 -ml-4 border-l-4 border-transparent"
96
+ external-target-blank
97
+ >
98
+ <span class="pr-2">NASA OSTEM</span>
99
+ <IconExternal class="shrink-0 text-sm -mt-0.5" />
100
+ </BaseLink>
101
+ </template>
90
102
  </nav>
91
103
  <div class="pl-8">
92
104
  <nav
@@ -115,12 +127,15 @@
115
127
  // @ts-nocheck
116
128
  import { defineComponent } from 'vue'
117
129
  import { mapStores } from 'pinia'
130
+ import { eventBus } from './../../utils/eventBus'
118
131
  import LogoColor from '@explorer-1/common/src/images/svg/logo-tribrand-color.svg'
119
132
  import LogoWhite from '@explorer-1/common/src/images/svg/logo-tribrand-white.svg'
120
133
  import { useHeaderStore } from './../../store/header'
121
134
  import { useThemeStore } from './../../store/theme'
122
135
  import IconMenu from './../Icons/IconMenu.vue'
123
136
  import IconClose from './../Icons/IconClose.vue'
137
+ import IconExternal from './../Icons/IconExternal.vue'
138
+ import BaseLink from './../BaseLink/BaseLink.vue'
124
139
  import NavLogoLinks from './../NavLogoLinks/NavLogoLinks.vue'
125
140
  import NavMobileDropdown from './../NavMobile/NavMobileDropdown.vue'
126
141
  import NavMobileLink from './../NavMobile/NavMobileLink.vue'
@@ -139,7 +154,9 @@ export default defineComponent({
139
154
  NavMobileDropdown,
140
155
  NavMobileLink,
141
156
  NavSocial,
142
- NavSearchForm
157
+ NavSearchForm,
158
+ BaseLink,
159
+ IconExternal
143
160
  },
144
161
  props: {
145
162
  data: {
@@ -216,10 +233,7 @@ export default defineComponent({
216
233
  }
217
234
  },
218
235
  mounted() {
219
- // // TODO: VUE3: find solution for emitting event from slot
220
- // // TODO: find a cleaner way to do this w/o using mounted or root level events
221
- // // scoped slots? https://github.com/vuejs/vue/issues/4332
222
- // this.$root?.$on('linkClicked', this.closeMenu)
236
+ eventBus.on('linkClicked', () => this.closeMenu())
223
237
  },
224
238
  methods: {
225
239
  toggleMenu() {
@@ -42,6 +42,7 @@
42
42
  </template>
43
43
  <template v-else>
44
44
  <NavMobileLink
45
+ v-if="!headerStore.secondaryNavIsJumpMenu && index !== 0"
45
46
  :key="index"
46
47
  :title="index === 0 ? 'Home' : undefined"
47
48
  :data="item"
@@ -59,7 +60,10 @@
59
60
  <script lang="ts">
60
61
  // @ts-nocheck
61
62
  import { defineComponent } from 'vue'
63
+ import { mapStores } from 'pinia'
64
+ import { useHeaderStore } from '../../store/header'
62
65
  import type { LinkObject } from '../../utils/mixins'
66
+ import { eventBus } from './../../utils/eventBus'
63
67
  import NavDropdownToggle from './../NavDropdownToggle/NavDropdownToggle.vue'
64
68
  import NavMobileLink from './../NavMobile/NavMobileLink.vue'
65
69
  import NavMobileSecondaryDropdown from './../NavMobile/NavMobileSecondaryDropdown.vue'
@@ -98,16 +102,16 @@ export default defineComponent({
98
102
  theDropdown: null
99
103
  }
100
104
  },
105
+ computed: {
106
+ ...mapStores(useHeaderStore)
107
+ },
101
108
  mounted() {
102
109
  if (this.startOpen) {
103
110
  this.dropdownVisible = true
104
111
  }
105
112
  this.theDropdown = this.$refs.NavDropdownMobile as HTMLElement
106
113
  if (!this.expandMultiple) {
107
- // TODO: VUE3: find solution for emitting event from slot
108
- // TODO: find a cleaner way to do this w/o using mounted or root level events
109
- // scoped slots? https://github.com/vuejs/vue/issues/4332
110
- // this.$root?.$on('openMobileDropdown', this.closeIfOtherOpened)
114
+ eventBus.on('openMobileDropdown', () => this.closeIfOtherOpened())
111
115
  }
112
116
  },
113
117
  methods: {
@@ -18,6 +18,7 @@
18
18
  <NavSecondaryDropdownContent
19
19
  class="relative w-full text-lg"
20
20
  :item="item"
21
+ :include-overview="!headerStore.secondaryNavIsJumpMenu"
21
22
  />
22
23
  </slot>
23
24
  </template>
@@ -27,6 +28,8 @@
27
28
  <script lang="ts">
28
29
  import { defineComponent } from 'vue'
29
30
  import { mixinIsActivePath } from '../../utils/mixins'
31
+ import { mapStores } from 'pinia'
32
+ import { useHeaderStore } from '../../store/header'
30
33
  import IconCaret from './../Icons/IconCaret.vue'
31
34
  import NavDropdownToggle from './../NavDropdownToggle/NavDropdownToggle.vue'
32
35
  import NavSecondaryDropdownContent from './../NavSecondary/NavSecondaryDropdownContent.vue'
@@ -58,6 +61,7 @@ export default defineComponent({
58
61
  }
59
62
  },
60
63
  computed: {
64
+ ...mapStores(useHeaderStore),
61
65
  startOpen(): Boolean {
62
66
  if (this.item) {
63
67
  return mixinIsActivePath(this.item.path)
@@ -79,7 +83,6 @@ export default defineComponent({
79
83
  },
80
84
  methods: {
81
85
  toggleDropdown() {
82
- console.log('dropdown toggled')
83
86
  if (this.dropdownVisible) {
84
87
  this.closeDropdown()
85
88
  } else {
@@ -1,7 +1,7 @@
1
1
  import NavSecondary from './NavSecondary.vue'
2
2
 
3
3
  export default {
4
- title: 'Navigation/Secondary Navigation/NavSecondary',
4
+ title: 'Navigation/Secondary Navigation',
5
5
  component: NavSecondary,
6
6
  excludeStories: /.*Data$/,
7
7
  parameters: {
@@ -19,6 +19,11 @@ export const NavSecondaryData = {
19
19
  }
20
20
 
21
21
  export const BaseStory = {
22
- name: 'NavSecondary',
23
- args: { breadcrumb: NavSecondaryData.breadcrumb }
22
+ name: 'Secondary Navigation',
23
+ args: {
24
+ breadcrumb: NavSecondaryData.breadcrumb
25
+ }
26
+ }
27
+ export const Inverted = {
28
+ args: { breadcrumb: NavSecondaryData.breadcrumb, invert: true }
24
29
  }
@@ -4,11 +4,17 @@
4
4
  ref="NavSecondary"
5
5
  aria-label="Secondary"
6
6
  class="NavSecondary"
7
- :class="{ 'has-intro': hasIntro }"
7
+ :class="{
8
+ 'has-intro': hasIntro,
9
+ '!bg-transparent': invert
10
+ }"
8
11
  >
9
- <div class="max-w-screen-3xl mx-auto">
12
+ <div
13
+ class="max-w-screen-3xl mx-auto"
14
+ :class="{ 'bg-gradient-to-r from-black to-primary bg-transparent to-90% text-white': invert }"
15
+ >
10
16
  <div
11
- class="nav-secondary-container lg:container lg:px-0 lg:whitespace-normal border-gray-mid text-gray-mid-dark lg:overflow-visible relative px-4 pb-0 mx-auto overflow-x-auto text-sm font-medium whitespace-nowrap border-t border-opacity-50 edu:border-0"
17
+ :class="`nav-secondary-container lg:container lg:px-0 lg:whitespace-normal lg:overflow-visible relative px-4 pb-0 mx-auto overflow-x-auto text-sm font-medium whitespace-nowrap ${invert ? 'border-0' : 'border-t border-gray-mid text-gray-mid-dark border-opacity-50'}`"
12
18
  >
13
19
  <div class="lg:ml-0 2xl:-mr-3 lg:justify-end flex -ml-3">
14
20
  <template v-for="(item, index) in theBreadcrumb">
@@ -18,6 +24,7 @@
18
24
  :item="item"
19
25
  :index="index"
20
26
  :is-last="theBreadcrumb && index === theBreadcrumb.length - 1"
27
+ :invert="invert"
21
28
  />
22
29
  </template>
23
30
  <template v-else>
@@ -25,6 +32,7 @@
25
32
  :key="index"
26
33
  :item="item"
27
34
  :index="index"
35
+ :invert="invert"
28
36
  />
29
37
  </template>
30
38
  </template>
@@ -38,6 +46,7 @@
38
46
  import { defineComponent } from 'vue'
39
47
  import { mapStores } from 'pinia'
40
48
  import { useHeaderStore } from './../../store/header'
49
+ import { useThemeStore } from './../../store/theme'
41
50
  import NavSecondaryDropdown from './NavSecondaryDropdown.vue'
42
51
  import NavSecondaryLink from './NavSecondaryLink.vue'
43
52
  import { mixinHighlightPrimary, mixinUpdateSecondary } from './../../utils/mixins'
@@ -49,19 +58,27 @@ export default defineComponent({
49
58
  ** If there is no breadcrumb override, then it will fallback to using the breadcrumbs derived form the active global nav item (store.header.globalChildren)
50
59
  ** store.header.secondaryNav reverts to null on route changes, so the breadcrumb override is re-evaluted on every page
51
60
  */
61
+ name: 'NavSecondary',
52
62
  components: {
53
63
  NavSecondaryDropdown,
54
64
  NavSecondaryLink
55
65
  },
56
66
  props: {
67
+ // breadcrumbs create a secondary navigation
57
68
  breadcrumb: {
58
69
  type: String,
59
- required: false
70
+ required: false,
71
+ default: undefined
60
72
  },
61
73
  hasIntro: {
62
74
  type: Boolean,
63
75
  required: false,
64
76
  default: false
77
+ },
78
+ invert: {
79
+ type: Boolean,
80
+ required: false,
81
+ default: false
65
82
  }
66
83
  },
67
84
  data() {
@@ -71,7 +88,8 @@ export default defineComponent({
71
88
  },
72
89
  computed: {
73
90
  ...mapStores(useHeaderStore),
74
- theBreadcrumb(): [BreadcrumbPathObject] | undefined {
91
+ ...mapStores(useThemeStore),
92
+ theBreadcrumb(): BreadcrumbPathObject[] | undefined {
75
93
  if (this.breadcrumb) {
76
94
  // we also want to update the store to override secondary nav
77
95
  mixinUpdateSecondary(JSON.parse(this.breadcrumb))
@@ -118,7 +136,9 @@ export default defineComponent({
118
136
  ([e]) => {
119
137
  e.target.classList.toggle('-is-sticky', e.intersectionRatio < 1)
120
138
  },
121
- { threshold: [1] }
139
+ {
140
+ threshold: [1]
141
+ }
122
142
  )
123
143
  const observerOffset = new IntersectionObserver(
124
144
  ([e]) => {
@@ -10,21 +10,14 @@
10
10
  :aria-expanded="dropdownVisible ? true : false"
11
11
  :path="item.path"
12
12
  class="font-medium border-t-2 border-transparent block px-3 py-2"
13
- :class="{
14
- 'mr-auto text-primary font-semibold secondary-root': index === 0,
15
- 'text-gray-dark': index !== 0,
16
- '-open': dropdownVisible
17
- }"
13
+ :class="dropdownToggleClasses(index)"
14
+ :invert="invert"
18
15
  @toggle-clicked="toggleDropdown()"
19
16
  @close-dropdown="closeDropdown()"
20
17
  >
21
18
  <span
22
19
  class="flex content-center pt-2 pb-1 mb-1 transition-colors duration-100 ease-in border-b-2 border-transparent"
23
- :class="
24
- index === 0
25
- ? 'can-hover:group-hover:border-primary'
26
- : 'can-hover:group-hover:border-gray-mid-dark can-hover:group-hover:text-gray-mid-dark '
27
- "
20
+ :class="dropdownButtonClasses(index)"
28
21
  >
29
22
  <span>{{ item.title }}</span>
30
23
  <IconCaret class="transform rotate-90 text-sm ml-2 pl-2 -mt-px" />
@@ -47,6 +40,7 @@
47
40
 
48
41
  <script lang="ts">
49
42
  import { defineComponent } from 'vue'
43
+ import { eventBus } from './../../utils/eventBus'
50
44
  import IconCaret from './../Icons/IconCaret.vue'
51
45
  import NavDropdownToggle from './../NavDropdownToggle/NavDropdownToggle.vue'
52
46
  import NavSecondaryDropdownContent from './../NavSecondary/NavSecondaryDropdownContent.vue'
@@ -62,7 +56,8 @@ export default defineComponent({
62
56
  // the index from the parent v-for loop
63
57
  index: {
64
58
  type: Number,
65
- required: false
59
+ required: false,
60
+ default: 0
66
61
  },
67
62
  isLast: {
68
63
  type: Boolean,
@@ -73,8 +68,15 @@ export default defineComponent({
73
68
  item: {
74
69
  type: Object,
75
70
  required: true
71
+ },
72
+
73
+ invert: {
74
+ type: Boolean,
75
+ required: false,
76
+ default: false
76
77
  }
77
78
  },
79
+ emits: ['closeDropdown', 'openDropdown'],
78
80
  data() {
79
81
  return {
80
82
  dropdownVisible: false
@@ -88,15 +90,10 @@ export default defineComponent({
88
90
  }
89
91
  },
90
92
  mounted() {
91
- // TODO: VUE3: find solution for emitting event from slot
92
- // https://stackoverflow.com/questions/50181858/this-root-emit-not-working-in-vue
93
- // TODO: find a cleaner way to do this w/o using mounted or root level events
94
- // scoped slots? https://github.com/vuejs/vue/issues/4332
95
- // this.$root?.$on('linkClicked', this.closeDropdown)
93
+ eventBus.on('linkClicked', () => this.closeDropdown())
96
94
  },
97
95
  methods: {
98
96
  toggleDropdown() {
99
- console.log('dropdown toggled')
100
97
  if (this.dropdownVisible) {
101
98
  this.closeDropdown()
102
99
  } else {
@@ -120,6 +117,28 @@ export default defineComponent({
120
117
  return true
121
118
  }
122
119
  return false
120
+ },
121
+ dropdownToggleClasses(index: number) {
122
+ return this.invert
123
+ ? {
124
+ 'mr-auto text-white font-semibold secondary-root': index === 0,
125
+ 'text-white': index !== 0,
126
+ '-open': this.dropdownVisible
127
+ }
128
+ : {
129
+ 'mr-auto text-primary font-semibold secondary-root': index === 0,
130
+ 'text-gray-dark': index !== 0,
131
+ '-open': this.dropdownVisible
132
+ }
133
+ },
134
+ dropdownButtonClasses(index: number) {
135
+ const titleButton = this.invert
136
+ ? 'can-hover:group-hover:border-white'
137
+ : 'can-hover:group-hover:border-primary'
138
+ const regularButton = this.invert
139
+ ? 'can-hover:group-hover:border-white can-hover:group-hover:text-white'
140
+ : 'can-hover:group-hover:border-gray-mid-dark can-hover:group-hover:text-gray-mid-dark'
141
+ return index === 0 ? titleButton : regularButton
123
142
  }
124
143
  }
125
144
  })
@@ -131,6 +150,11 @@ export default defineComponent({
131
150
  > span {
132
151
  @apply border-black text-gray-dark #{!important};
133
152
  }
153
+ &.-invert {
154
+ > span {
155
+ @apply border-white text-white #{!important};
156
+ }
157
+ }
134
158
  }
135
159
 
136
160
  &.-active {
@@ -138,12 +162,23 @@ export default defineComponent({
138
162
  @apply font-bold text-gray-dark;
139
163
  @apply border-primary #{!important};
140
164
  }
165
+ &.-invert {
166
+ > span {
167
+ @apply text-white;
168
+ @apply border-white #{!important};
169
+ }
170
+ }
141
171
  }
142
172
  &:hover {
143
173
  &.-active {
144
174
  > span {
145
175
  @apply text-gray-mid-dark;
146
176
  }
177
+ &.-invert {
178
+ > span {
179
+ @apply text-white;
180
+ }
181
+ }
147
182
  }
148
183
  }
149
184
  }
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <ul class="NavSecondaryDropdownContent">
3
- <li>
3
+ <li v-if="includeOverview">
4
4
  <BaseLink
5
5
  :to="item.path"
6
6
  variant="none"
@@ -80,6 +80,10 @@ export default defineComponent({
80
80
  item: {
81
81
  type: Object,
82
82
  required: true
83
+ },
84
+ includeOverview: {
85
+ type: Boolean,
86
+ default: true
83
87
  }
84
88
  },
85
89
  methods: {