|
@@ -2,20 +2,38 @@
|
|
|
<Modal
|
|
|
v-if="showing"
|
|
|
class="media-modal-view"
|
|
|
- @backdropClicked="hide"
|
|
|
+ @backdropClicked="hideIfNotSwiped"
|
|
|
>
|
|
|
- <img
|
|
|
+ <SwipeClick
|
|
|
v-if="type === 'image'"
|
|
|
- :class="{ loading }"
|
|
|
- class="modal-image"
|
|
|
- :src="currentMedia.url"
|
|
|
- :alt="currentMedia.description"
|
|
|
- :title="currentMedia.description"
|
|
|
- @touchstart.stop="mediaTouchStart"
|
|
|
- @touchmove.stop="mediaTouchMove"
|
|
|
- @click="hide"
|
|
|
- @load="onImageLoaded"
|
|
|
+ ref="swipeClick"
|
|
|
+ class="modal-image-container"
|
|
|
+ :direction="swipeDirection"
|
|
|
+ :threshold="swipeThreshold"
|
|
|
+ @preview-requested="handleSwipePreview"
|
|
|
+ @swipe-finished="handleSwipeEnd"
|
|
|
+ @swipeless-clicked="hide"
|
|
|
>
|
|
|
+ <PinchZoom
|
|
|
+ ref="pinchZoom"
|
|
|
+ class="modal-image-container-inner"
|
|
|
+ selector=".modal-image"
|
|
|
+ reach-min-scale-strategy="reset"
|
|
|
+ stop-propagate-handled="stop-propgate-handled"
|
|
|
+ :allow-pan-min-scale="pinchZoomMinScale"
|
|
|
+ :min-scale="pinchZoomMinScale"
|
|
|
+ :reset-to-min-scale-limit="pinchZoomScaleResetLimit"
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ :class="{ loading }"
|
|
|
+ class="modal-image"
|
|
|
+ :src="currentMedia.url"
|
|
|
+ :alt="currentMedia.description"
|
|
|
+ :title="currentMedia.description"
|
|
|
+ @load="onImageLoaded"
|
|
|
+ >
|
|
|
+ </PinchZoom>
|
|
|
+ </SwipeClick>
|
|
|
<VideoAttachment
|
|
|
v-if="type === 'video'"
|
|
|
class="modal-image"
|
|
@@ -40,25 +58,36 @@
|
|
|
<button
|
|
|
v-if="canNavigate"
|
|
|
:title="$t('media_modal.previous')"
|
|
|
- class="modal-view-button-arrow modal-view-button-arrow--prev"
|
|
|
+ class="modal-view-button modal-view-button-arrow modal-view-button-arrow--prev"
|
|
|
@click.stop.prevent="goPrev"
|
|
|
>
|
|
|
<FAIcon
|
|
|
- class="arrow-icon"
|
|
|
+ class="button-icon arrow-icon"
|
|
|
icon="chevron-left"
|
|
|
/>
|
|
|
</button>
|
|
|
<button
|
|
|
v-if="canNavigate"
|
|
|
:title="$t('media_modal.next')"
|
|
|
- class="modal-view-button-arrow modal-view-button-arrow--next"
|
|
|
+ class="modal-view-button modal-view-button-arrow modal-view-button-arrow--next"
|
|
|
@click.stop.prevent="goNext"
|
|
|
>
|
|
|
<FAIcon
|
|
|
- class="arrow-icon"
|
|
|
+ class="button-icon arrow-icon"
|
|
|
icon="chevron-right"
|
|
|
/>
|
|
|
</button>
|
|
|
+ <button
|
|
|
+ class="modal-view-button modal-view-button-hide"
|
|
|
+ :title="$t('media_modal.hide')"
|
|
|
+ @click.stop.prevent="hide"
|
|
|
+ >
|
|
|
+ <FAIcon
|
|
|
+ class="button-icon"
|
|
|
+ icon="times"
|
|
|
+ />
|
|
|
+ </button>
|
|
|
+
|
|
|
<span
|
|
|
v-if="description"
|
|
|
class="description"
|
|
@@ -86,11 +115,17 @@
|
|
|
<script src="./media_modal.js"></script>
|
|
|
|
|
|
<style lang="scss">
|
|
|
+$modal-view-button-icon-height: 3em;
|
|
|
+$modal-view-button-icon-half-height: calc(#{$modal-view-button-icon-height} / 2);
|
|
|
+$modal-view-button-icon-width: 3em;
|
|
|
+$modal-view-button-icon-margin: 0.5em;
|
|
|
+
|
|
|
.modal-view.media-modal-view {
|
|
|
z-index: 1001;
|
|
|
flex-direction: column;
|
|
|
|
|
|
- .modal-view-button-arrow {
|
|
|
+ .modal-view-button-arrow,
|
|
|
+ .modal-view-button-hide {
|
|
|
opacity: 0.75;
|
|
|
|
|
|
&:focus,
|
|
@@ -103,6 +138,7 @@
|
|
|
opacity: 1;
|
|
|
}
|
|
|
}
|
|
|
+ overflow: hidden;
|
|
|
}
|
|
|
|
|
|
.media-modal-view {
|
|
@@ -115,6 +151,29 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ .modal-image-container {
|
|
|
+ display: flex;
|
|
|
+ overflow: hidden;
|
|
|
+ align-items: center;
|
|
|
+ flex-direction: column;
|
|
|
+ max-width: 100%;
|
|
|
+ max-height: 100%;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ flex-grow: 1;
|
|
|
+ justify-content: center;
|
|
|
+
|
|
|
+ &-inner {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ flex-grow: 1;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
.description,
|
|
|
.counter {
|
|
|
/* Hardcoded since background is also hardcoded */
|
|
@@ -134,9 +193,8 @@
|
|
|
}
|
|
|
|
|
|
.modal-image {
|
|
|
- max-width: 90%;
|
|
|
- max-height: 90%;
|
|
|
- box-shadow: 0px 5px 15px 0 rgba(0, 0, 0, 0.5);
|
|
|
+ max-width: 100%;
|
|
|
+ max-height: 100%;
|
|
|
image-orientation: from-image; // NOTE: only FF supports this
|
|
|
animation: 0.1s cubic-bezier(0.7, 0, 1, 0.6) media-fadein;
|
|
|
|
|
@@ -159,13 +217,7 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- .modal-view-button-arrow {
|
|
|
- position: absolute;
|
|
|
- display: block;
|
|
|
- top: 50%;
|
|
|
- margin-top: -50px;
|
|
|
- width: 70px;
|
|
|
- height: 100px;
|
|
|
+ .modal-view-button {
|
|
|
border: 0;
|
|
|
padding: 0;
|
|
|
opacity: 0;
|
|
@@ -175,14 +227,33 @@
|
|
|
overflow: visible;
|
|
|
cursor: pointer;
|
|
|
transition: opacity 333ms cubic-bezier(.4,0,.22,1);
|
|
|
+ height: $modal-view-button-icon-height;
|
|
|
+ width: $modal-view-button-icon-width;
|
|
|
|
|
|
- .arrow-icon {
|
|
|
+ .button-icon {
|
|
|
position: absolute;
|
|
|
- top: 35px;
|
|
|
- height: 30px;
|
|
|
- width: 32px;
|
|
|
+ height: $modal-view-button-icon-height;
|
|
|
+ width: $modal-view-button-icon-width;
|
|
|
font-size: 14px;
|
|
|
- line-height: 30px;
|
|
|
+ line-height: $modal-view-button-icon-height;
|
|
|
+ color: #FFF;
|
|
|
+ text-align: center;
|
|
|
+ background-color: rgba(0,0,0,.3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .modal-view-button-arrow {
|
|
|
+ position: absolute;
|
|
|
+ display: block;
|
|
|
+ top: 50%;
|
|
|
+ margin-top: $modal-view-button-icon-half-height;
|
|
|
+ width: $modal-view-button-icon-width;
|
|
|
+ height: $modal-view-button-icon-height;
|
|
|
+
|
|
|
+ .arrow-icon {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ line-height: $modal-view-button-icon-height;
|
|
|
color: #FFF;
|
|
|
text-align: center;
|
|
|
background-color: rgba(0,0,0,.3);
|
|
@@ -191,16 +262,26 @@
|
|
|
&--prev {
|
|
|
left: 0;
|
|
|
.arrow-icon {
|
|
|
- left: 6px;
|
|
|
+ left: $modal-view-button-icon-margin;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
&--next {
|
|
|
right: 0;
|
|
|
.arrow-icon {
|
|
|
- right: 6px;
|
|
|
+ right: $modal-view-button-icon-margin;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .modal-view-button-hide {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ right: 0;
|
|
|
+ .button-icon {
|
|
|
+ top: $modal-view-button-icon-margin;
|
|
|
+ right: $modal-view-button-icon-margin;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|