@explorer-1/vue 0.2.60 → 0.2.62

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorer-1/vue",
3
- "version": "0.2.60",
3
+ "version": "0.2.62",
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
  "vue3-compare-image": "^1.2.5",
32
32
  "vue3-observe-visibility": "^1.0.1",
33
- "@explorer-1/common": "1.1.15"
33
+ "@explorer-1/common": "1.1.16"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@vitejs/plugin-vue": "^5.0.4",
@@ -3,6 +3,7 @@ import { computed, reactive, ref } from 'vue'
3
3
  import type { AccordionItemObject } from './../../interfaces.ts'
4
4
  import { uniqueId } from 'lodash'
5
5
  import IconPlus from './../Icons/IconPlus.vue'
6
+ import IconMinus from './../Icons/IconMinus.vue'
6
7
 
7
8
  export interface BaseAccordionItemProps {
8
9
  headingLevel?: string
@@ -76,9 +77,9 @@ const emit = defineEmits(['accordionItemOpened', 'accordionItemClosed'])
76
77
  </slot>
77
78
  <span
78
79
  class="BaseAccordion-icon pointer-events-none text-xs text-action flex-shrink-0 transform transition-transform"
79
- :class="{ 'rotate-45': !isHidden }"
80
80
  >
81
- <IconPlus />
81
+ <IconPlus v-if="isHidden" />
82
+ <IconMinus v-else />
82
83
  </span>
83
84
  </button>
84
85
  </component>
@@ -6,7 +6,9 @@
6
6
  class="BlockHeading"
7
7
  :class="{ 'has-anchor': generateId }"
8
8
  >
9
- {{ data.heading }}
9
+ <slot>
10
+ {{ data.heading }}
11
+ </slot>
10
12
  </BaseHeading>
11
13
  </template>
12
14
 
@@ -111,7 +111,7 @@
111
111
  </nav>
112
112
  <div class="pl-8">
113
113
  <nav
114
- v-if="data.footerMoreFromJpl && data.footerMoreFromJpl.length > 0"
114
+ v-if="data.footerMoreFromJpl?.length"
115
115
  aria-label="Other JPL Sites"
116
116
  class="mt-6"
117
117
  >
@@ -133,7 +133,6 @@
133
133
  </transition>
134
134
  </template>
135
135
  <script lang="ts">
136
- // @ts-nocheck
137
136
  import { defineComponent } from 'vue'
138
137
  import { mapStores } from 'pinia'
139
138
  import { eventBus } from './../../utils/eventBus'
@@ -256,19 +255,19 @@ export default defineComponent({
256
255
  if (this.menuVisible) {
257
256
  this.menuVisible = false
258
257
  this.$emit('closeMobileMenu')
259
- document.body.classList.remove('overflow-hidden')
258
+ if (document.body) document.body.classList.remove('overflow-hidden')
260
259
  }
261
260
  },
262
261
  openMenu() {
263
262
  if (!this.menuVisible) {
264
263
  this.menuVisible = true
265
264
  this.$emit('openMobileMenu')
266
- document.body.classList.add('overflow-hidden')
265
+ if (document.body) document.body.classList.add('overflow-hidden')
267
266
  }
268
267
  },
269
268
  // safe way to retrieve url key from nav items. used with breadcrumb to determine active class.
270
269
  getUrlKey(item: LinkObject): string | null {
271
- if (item.linkPage) {
270
+ if (item?.linkPage) {
272
271
  return item.linkPage.url
273
272
  }
274
273
  return null
@@ -276,7 +275,7 @@ export default defineComponent({
276
275
  // to determine active class on menu links and 'more' menu links
277
276
  checkActive(item: LinkObject) {
278
277
  const urlKey = this.getUrlKey(item)
279
- if (urlKey && this.breadcrumb && this.breadcrumb.menu_links) {
278
+ if (urlKey && this.breadcrumb?.menu_links) {
280
279
  // key into the breadcrumbs for each section
281
280
  const objArray = this.breadcrumb.menu_links[urlKey]
282
281
  // check if any of the paths contained in the array are active
@@ -81,7 +81,8 @@
81
81
  <!-- correct for zero based index -->
82
82
  <div
83
83
  v-if="!truncateFilters || index <= checkbox.checkboxLimit - 1"
84
- class="flex my-2"
84
+ class="flex"
85
+ :class="{ 'pt-2 mt-2 mb-3': styleAsAccordion, 'my-2': !styleAsAccordion }"
85
86
  >
86
87
  <input
87
88
  :id="
@@ -102,9 +103,10 @@
102
103
  : generateId(bucket.key, groupKey)
103
104
  "
104
105
  class="form-check-label pl-2 tracking-normal align-middle"
106
+ :class="{ 'font-extrabold': styleAsAccordion }"
105
107
  >
106
108
  {{ prettyFilterNames(bucket.key_as_string ? bucket.key_as_string : bucket.key) }}
107
- <span class="text-gray-mid-dark text-sm">
109
+ <span class="text-gray-mid-dark text-sm font-normal">
108
110
  ({{ bucket.doc_count.toLocaleString() }})
109
111
  </span>
110
112
  </label>
@@ -180,6 +182,12 @@ export default {
180
182
  subFilterAggKey: {
181
183
  type: String,
182
184
  default: undefined
185
+ },
186
+ // force accordion styles and spacing even if there are no subfilters
187
+ // useful when mixing filters with and without subfilters together
188
+ styleAsAccordion: {
189
+ type: Boolean,
190
+ default: false
183
191
  }
184
192
  },
185
193
  emits: ['update:filterBy'],
@@ -2,6 +2,7 @@
2
2
  import { computed, reactive, ref } from 'vue'
3
3
  import { uniqueId } from 'lodash'
4
4
  import IconPlus from './../Icons/IconPlus.vue'
5
+ import IconMinus from './../Icons/IconMinus.vue'
5
6
 
6
7
  export interface SearchFilterGroupAccordionItemProps {
7
8
  initOpen?: boolean
@@ -57,10 +58,10 @@ const emit = defineEmits(['filterGroupAccordionItemOpened', 'filterGroupAccordio
57
58
  @click="handleClick()"
58
59
  >
59
60
  <span
60
- class="SearchFilterGroupAccordionItem-icon inline-block text-xs text-action flex-shrink-0 transform transition-transform"
61
- :class="{ '!rotate-45': !isHidden }"
61
+ class="SearchFilterGroupAccordionItem-icon inline-block text-xs text-action flex-shrink-0"
62
62
  >
63
- <IconPlus />
63
+ <IconPlus v-if="isHidden" />
64
+ <IconMinus v-else />
64
65
  </span>
65
66
  </button>
66
67
  </template>
@@ -193,9 +193,11 @@ export default defineComponent({
193
193
  page.id = page._id
194
194
  page.score = page._score
195
195
  // ensure router links
196
+ // TODO: issues with router links so disabling for now
197
+ // page.url = page._source.url
198
+ // ? page._source.url.replace(/^[^:]+:\/\/[^/?#]+/, '')
199
+ // : undefined
196
200
  page.url = page._source.url
197
- ? page._source.url.replace(/^[^:]+:\/\/[^/?#]+/, '')
198
- : undefined
199
201
  page.title = page._source.title
200
202
  page.type = pageType
201
203
  page.topic = topic
@@ -87,7 +87,7 @@ export default defineComponent({
87
87
  <template>
88
88
  <div
89
89
  v-if="data"
90
- class="ThemeVariantLight"
90
+ class="ThemeVariantLight PageEduExplainerArticle"
91
91
  :class="computedClass"
92
92
  itemscope
93
93
  itemtype="http://schema.org/Article"
@@ -226,3 +226,16 @@ export default defineComponent({
226
226
  </LayoutHelper>
227
227
  </div>
228
228
  </template>
229
+ <style lang="scss">
230
+ .PageEduExplainerArticle {
231
+ .BlockText {
232
+ ul {
233
+ li {
234
+ &::before {
235
+ @apply bg-secondary;
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ </style>
@@ -257,5 +257,14 @@ const { data } = reactive(props)
257
257
  }
258
258
  }
259
259
  }
260
+ .BlockText {
261
+ ul {
262
+ li {
263
+ &::before {
264
+ @apply bg-secondary;
265
+ }
266
+ }
267
+ }
268
+ }
260
269
  }
261
270
  </style>
@@ -240,7 +240,7 @@ const computedClass = computed((): string => {
240
240
  <template>
241
241
  <div
242
242
  v-if="data"
243
- class="ThemeVariantLight"
243
+ class="ThemeVariantLight PageEduStudentProject"
244
244
  :class="computedClass"
245
245
  >
246
246
  <!-- hero title -->
@@ -446,3 +446,17 @@ const computedClass = computed((): string => {
446
446
  </LayoutHelper>
447
447
  </div>
448
448
  </template>
449
+ <style lang="scss">
450
+ .PageEduStudentProject {
451
+ .BlockText {
452
+ ul {
453
+ li {
454
+ &::before {
455
+ // intentionally using a specific red
456
+ @apply bg-jpl-red;
457
+ }
458
+ }
459
+ }
460
+ }
461
+ }
462
+ </style>
@@ -1,16 +1,17 @@
1
1
  <script setup lang="ts">
2
2
  import { reactive } from 'vue'
3
3
  import type { ImageObject, StreamfieldBlockData } from './../../../interfaces'
4
+ import BaseHeading from './../../../components/BaseHeading/BaseHeading.vue'
4
5
  import BlockHeading, {
5
6
  type BlockHeadingObject
6
7
  } from './../../../components/BlockHeading/BlockHeading.vue'
7
8
  import type { EduStudentProjectStep } from './PageEduStudentProject.vue'
8
- import BaseHeading from './../../../components/BaseHeading/BaseHeading.vue'
9
9
  import HeroInlineMedia from './../../../components/HeroInlineMedia/HeroInlineMedia.vue'
10
- import BlockText from './../../../components/BlockText/BlockText.vue'
11
10
  import LayoutHelper from './../../../components/LayoutHelper/LayoutHelper.vue'
11
+ import BlockInlineImage from './../../../components/BlockInlineImage/BlockInlineImage.vue'
12
12
  import BlockImageStandard from './../../../components/BlockImage/BlockImageStandard.vue'
13
13
  import BlockStreamfield from './../../../components/BlockStreamfield/BlockStreamfield.vue'
14
+ import { getHeadingId } from './../../../utils/getHeadingId'
14
15
 
15
16
  export interface PageEduStudentProjectSectionProps {
16
17
  heading?: BlockHeadingObject
@@ -48,8 +49,19 @@ const { heading, blocks, image, steps, stepsNumbering, text } = reactive(props)
48
49
  />
49
50
  </LayoutHelper>
50
51
 
52
+ <!-- simple richtext -->
53
+ <BlockInlineImage
54
+ v-if="text"
55
+ :data="{
56
+ text: text,
57
+ image: image,
58
+ alignTo: 'right'
59
+ }"
60
+ class="lg:mb-18 mb-10"
61
+ />
62
+
51
63
  <LayoutHelper
52
- v-if="image"
64
+ v-else-if="image"
53
65
  indent="col-2"
54
66
  class="lg:mb-8 mb-5"
55
67
  >
@@ -71,6 +83,7 @@ const { heading, blocks, image, steps, stepsNumbering, text } = reactive(props)
71
83
  <li
72
84
  v-for="(step, index) in steps"
73
85
  :key="index"
86
+ v-bind-once="{ id: step.heading ? getHeadingId(step.heading) : undefined }"
74
87
  class="PageEduStudentProjectStep lg:mb-12 mb-10 px-4 lg:px-0"
75
88
  >
76
89
  <LayoutHelper
@@ -149,15 +162,6 @@ const { heading, blocks, image, steps, stepsNumbering, text } = reactive(props)
149
162
  </LayoutHelper>
150
163
  </li>
151
164
  </component>
152
-
153
- <!-- simple richtext -->
154
- <LayoutHelper
155
- v-else-if="text"
156
- indent="col-3"
157
- class="lg:mb-18 mb-10"
158
- >
159
- <BlockText :text="text" />
160
- </LayoutHelper>
161
165
  </section>
162
166
  </template>
163
167
  <style lang="scss">
@@ -167,6 +171,9 @@ const { heading, blocks, image, steps, stepsNumbering, text } = reactive(props)
167
171
  @return math.div($pxValue, 16) * 1rem;
168
172
  }
169
173
  .PageEduStudentProjectStep {
174
+ &:target {
175
+ @apply scroll-mt-14;
176
+ }
170
177
  .BlockStreamfield {
171
178
  div:last-child {
172
179
  @apply mb-0 #{!important};
@@ -179,7 +186,6 @@ const { heading, blocks, image, steps, stepsNumbering, text } = reactive(props)
179
186
  // intentionally overriding correction that occurs within ThemeVariantGray
180
187
  @apply text-jpl-red;
181
188
  }
182
-
183
189
  .PageEduStudentProjectStep__fullWidth {
184
190
  .LayoutHelper > div > .BlockText {
185
191
  @screen lg {