Skip to content

Commit

Permalink
Merge pull request #346 from spencerwahl/chart-arrows
Browse files Browse the repository at this point in the history
Fix arrow and pagination placement on slideshows
  • Loading branch information
yileifeng authored May 18, 2023
2 parents ec1ceb5 + c908dab commit 503b506
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 136 deletions.
57 changes: 37 additions & 20 deletions src/components/panels/chart-panel.vue
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
<template>
<div class="carousel self-start px-10 my-8 bg-gray-200_" :style="{ width: `${width}px` }">
<hooper
ref="carousel"
v-if="width !== -1 && config.charts.length > 1"
class="h-full"
:infiniteScroll="config.loop"
>
<slide
v-for="(chartConfig, index) in config.charts"
:key="`chart-${index}`"
:index="index"
class="self-center"
<div class="flex">
<div class="carousel self-center px-10 my-8 mx-auto bg-gray-200_" :style="{ width: `${width}px` }">
<hooper
ref="carousel"
v-if="width !== -1 && config.charts.length > 1"
class="h-full"
:infiniteScroll="config.loop"
>
<dqv-chart :config="chartConfig" />
</slide>
<slide
v-for="(chartConfig, index) in config.charts"
:key="`chart-${index}`"
:index="index"
class="self-center"
>
<dqv-chart :config="chartConfig" />
</slide>

<hooper-navigation slot="hooper-addons"></hooper-navigation>
<hooper-pagination slot="hooper-addons"></hooper-pagination>
</hooper>
<hooper-navigation slot="hooper-addons"></hooper-navigation>
<hooper-pagination slot="hooper-addons"></hooper-pagination>
</hooper>

<div v-else-if="width !== -1">
<dqv-chart :config="config.charts[0]" />
<div v-else-if="width !== -1">
<dqv-chart :config="config.charts[0]" />
</div>
</div>
</div>
</template>
Expand Down Expand Up @@ -49,7 +51,7 @@ export default class ChartPanelV extends Vue {
mounted(): void {
setTimeout(() => {
this.width = this.$el.clientWidth;
this.width = this.$el.clientWidth - 64;
}, 100);
}
}
Expand All @@ -61,6 +63,21 @@ export default class ChartPanelV extends Vue {
::v-deep .hooper-navigation svg {
overflow: visible;
padding-left: initial !important;
border-radius: 100%;
background: radial-gradient(white, transparent 75%);
}
::v-deep .hooper-next {
right: calc(-32px - 2em);
}
::v-deep .hooper-prev {
left: calc(-32px - 2em);
}
::v-deep .hooper-pagination {
transform: translate(50%, 100%);
}
::v-deep .hooper-indicator {
Expand Down
254 changes: 138 additions & 116 deletions src/components/panels/slideshow-panel.vue
Original file line number Diff line number Diff line change
@@ -1,116 +1,138 @@
<template>
<div ref="images" class="carousel self-start px-10 my-8 bg-gray-200_ h-28_" :style="{ width: `${width}px` }">
<full-screen :expandable="config.fullscreen" :type="config.type">
<hooper ref="carousel" v-if="width !== -1" class="h-full bg-white" :infiniteScroll="config.loop">
<slide v-for="(image, index) in config.images" :key="index" :index="index" class="self-center">
<img
:data-src="image.src"
:src="slideIdx > 2 ? '' : image.src"
:alt="image.altText || ''"
:style="{ width: `${image.width}px`, height: `${image.height}px` }"
class="m-auto story-graphic carousel-image"
/>
<div v-if="image.caption" class="text-center my-8 text-sm" v-html="md.render(image.caption)"></div>
</slide>

<hooper-navigation slot="hooper-addons"></hooper-navigation>
<hooper-pagination slot="hooper-addons"></hooper-pagination>
</hooper>
</full-screen>

<div v-if="config.caption" class="text-center mt-5 text-sm" v-html="md.render(config.caption)"></div>
</div>
</template>

<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
import { Hooper, Slide, Navigation as HooperNavigation, Pagination as HooperPagination } from 'hooper';
import 'hooper/dist/hooper.css';
import MarkdownIt from 'markdown-it';
import { SlideshowPanel } from '@/definitions';
import FullscreenV from '@/components/panels/helpers/fullscreen.vue';
@Component({
components: {
Hooper,
Slide,
'full-screen': FullscreenV,
HooperNavigation,
HooperPagination
}
})
export default class SlideshowPanelV extends Vue {
@Prop() config!: SlideshowPanel;
@Prop() slideIdx!: number;
width = -1;
md = new MarkdownIt({ html: true });
observer =
this.slideIdx > 2
? new IntersectionObserver(([image]) => {
// lazy load images
if (image.isIntersecting) {
(this.$refs.images as Element).querySelectorAll('.carousel-image').forEach((img) => {
img.setAttribute('src', img.getAttribute('data-src')!);
});
this.$forceUpdate();
this.observer!.disconnect();
}
})
: undefined;
mounted(): void {
setTimeout(() => {
this.width = this.$el.clientWidth;
}, 100);
this.observer?.observe(this.$refs.images as Element);
}
}
</script>

<style lang="scss" scoped>
.hooper {
height: auto;
::v-deep .hooper-navigation svg {
overflow: visible;
padding-left: initial !important;
border-radius: 100%;
background: radial-gradient(white, transparent 75%);
}
::v-deep .hooper-indicator {
border: 1px solid #878787;
width: 24px;
height: 6px;
border-radius: 0px;
&.is-active {
border: none;
background-color: var(--sr-accent-colour);
}
&:hover {
background-color: white;
// background-color: lighten(#00d2d3, 20%);
border-color: var(--sr-accent-colour);
}
}
}
@media screen and (max-width: 640px) {
.carousel {
max-width: 100vw;
background-color: white;
}
.carousel-image {
max-height: 48vh;
}
}
</style>
<template>
<div class="flex">
<div
ref="images"
class="carousel self-center px-10 my-8 mx-auto bg-gray-200_ h-28_"
:style="{ width: `${width}px` }"
>
<full-screen :expandable="config.fullscreen" :type="config.type">
<hooper ref="carousel" v-if="width !== -1" class="h-full bg-white" :infiniteScroll="config.loop">
<slide v-for="(image, index) in config.images" :key="index" :index="index" class="self-center">
<img
:data-src="image.src"
:src="slideIdx > 2 ? '' : image.src"
:alt="image.altText || ''"
:style="{ width: `${image.width}px`, height: `${image.height}px` }"
class="m-auto story-graphic carousel-image"
/>
<div
v-if="image.caption"
class="text-center my-8 text-sm"
v-html="md.render(image.caption)"
></div>
</slide>

<hooper-navigation slot="hooper-addons"></hooper-navigation>
<hooper-pagination slot="hooper-addons"></hooper-pagination>
</hooper>
</full-screen>

<div v-if="config.caption" class="text-center mt-5 text-sm" v-html="md.render(config.caption)"></div>
</div>
</div>
</template>

<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
import { Hooper, Slide, Navigation as HooperNavigation, Pagination as HooperPagination } from 'hooper';
import 'hooper/dist/hooper.css';
import MarkdownIt from 'markdown-it';
import { SlideshowPanel } from '@/definitions';
import FullscreenV from '@/components/panels/helpers/fullscreen.vue';
@Component({
components: {
Hooper,
Slide,
'full-screen': FullscreenV,
HooperNavigation,
HooperPagination
}
})
export default class SlideshowPanelV extends Vue {
@Prop() config!: SlideshowPanel;
@Prop() slideIdx!: number;
width = -1;
md = new MarkdownIt({ html: true });
observer =
this.slideIdx > 2
? new IntersectionObserver(([image]) => {
// lazy load images
if (image.isIntersecting) {
(this.$refs.images as Element).querySelectorAll('.carousel-image').forEach((img) => {
img.setAttribute('src', img.getAttribute('data-src')!);
});
this.$forceUpdate();
this.observer!.disconnect();
}
})
: undefined;
mounted(): void {
setTimeout(() => {
this.width = this.$el.clientWidth - 64;
}, 100);
this.observer?.observe(this.$refs.images as Element);
}
}
</script>

<style lang="scss" scoped>
.hooper {
height: auto;
::v-deep .hooper-navigation svg {
overflow: visible;
padding-left: initial !important;
border-radius: 100%;
background: radial-gradient(white, transparent 75%);
}
::v-deep .hooper-next {
right: calc(-32px - 2em);
}
::v-deep .hooper-prev {
left: calc(-32px - 2em);
}
::v-deep .hooper-pagination {
transform: translate(50%, 200%);
}
::v-deep .hooper-indicator {
border: 1px solid #878787;
width: 24px;
height: 6px;
border-radius: 0px;
&.is-active {
border: none;
background-color: var(--sr-accent-colour);
}
&:hover {
background-color: white;
// background-color: lighten(#00d2d3, 20%);
border-color: var(--sr-accent-colour);
}
}
}
@media screen and (max-width: 640px) {
.carousel {
max-width: 100vw;
background-color: white;
}
.carousel-image {
max-height: 48vh;
}
}
</style>

0 comments on commit 503b506

Please sign in to comment.