diff --git a/app/Http/Controllers/User/ImageController.php b/app/Http/Controllers/User/ImageController.php index 85fed33a..e032e436 100644 --- a/app/Http/Controllers/User/ImageController.php +++ b/app/Http/Controllers/User/ImageController.php @@ -3,17 +3,32 @@ namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; +use App\Models\Image; use App\Models\User; +use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\View\View; class ImageController extends Controller { - public function index(): View + public function index(Request $request): View|Response { /** @var User $user */ $user = Auth::user(); + if ($request->method() === 'POST') { + $images = $user->images()->latest()->paginate(40); + $images->getCollection()->each(function (Image $image) { + $image->human_date = $image->created_at->diffForHumans(); + $image->date = $image->created_at->format('Y-m-d H:i:s'); + $image->append(['url', 'filename'])->setVisible([ + 'id', 'filename', 'url', 'human_date', 'date', 'human_date' + ]); + }); + return $this->success('success', compact('images')); + } + return view('images'); } } diff --git a/app/Models/Image.php b/app/Models/Image.php index 40e78037..7cdd462d 100644 --- a/app/Models/Image.php +++ b/app/Models/Image.php @@ -9,7 +9,6 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Storage; -use Illuminate\Support\Str; /** * @property int $id @@ -21,6 +20,7 @@ use Illuminate\Support\Str; * @property string $pathname * @property string $origin_name * @property string $alias_name + * @property string $filename * @property float $size * @property string $mimetype * @property string $md5 @@ -68,6 +68,11 @@ class Image extends Model 'is_unhealthy' => 'bool', ]; + public function getFilenameAttribute(): string + { + return $this->alias_name ?: $this->origin_name; + } + public function getPathnameAttribute(): string { return "{$this->path}/{$this->name}"; diff --git a/package-lock.json b/package-lock.json index 8315f56e..9083edf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,12 +22,12 @@ "less": "^4.1.2", "less-loader": "^10.2.0", "lodash": "^4.17.19", - "photoswipe": "^4.1.3", "postcss": "^8.2.1", "postcss-import": "^12.0.1", "resolve-url-loader": "^4.0.0", "tailwindcss": "^3.0.0", - "toastr": "^2.1.4" + "toastr": "^2.1.4", + "viewerjs": "^1.10.2" } }, "node_modules/@babel/code-frame": { @@ -10111,6 +10111,13 @@ "node": ">= 0.8" } }, + "node_modules/viewerjs": { + "version": "1.10.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/viewerjs/-/viewerjs-1.10.2.tgz", + "integrity": "sha512-v/4+OUF/71JthlvYuqfse+WGkMJO0LxvWiOLsAoxWw+RWjMdEBWn0ZQ5Mc+OhNIFd9uLhG62GzfFIplvix8odg==", + "dev": true, + "license": "MIT" + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://repo.huaweicloud.com/repository/npm/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -17894,6 +17901,12 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "viewerjs": { + "version": "1.10.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/viewerjs/-/viewerjs-1.10.2.tgz", + "integrity": "sha512-v/4+OUF/71JthlvYuqfse+WGkMJO0LxvWiOLsAoxWw+RWjMdEBWn0ZQ5Mc+OhNIFd9uLhG62GzfFIplvix8odg==", + "dev": true + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://repo.huaweicloud.com/repository/npm/vm-browserify/-/vm-browserify-1.1.2.tgz", diff --git a/package.json b/package.json index 7c06ad77..efe71fbf 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,11 @@ "less": "^4.1.2", "less-loader": "^10.2.0", "lodash": "^4.17.19", - "photoswipe": "^4.1.3", "postcss": "^8.2.1", "postcss-import": "^12.0.1", "resolve-url-loader": "^4.0.0", "tailwindcss": "^3.0.0", - "toastr": "^2.1.4" + "toastr": "^2.1.4", + "viewerjs": "^1.10.2" } } diff --git a/public/css/app.css b/public/css/app.css index bb545bc9..dfb09925 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -636,6 +636,9 @@ select { white-space: nowrap; border-width: 0; } +.static { + position: static; +} .fixed { position: fixed; } @@ -645,6 +648,10 @@ select { .relative { position: relative; } +.sticky { + position: -webkit-sticky; + position: sticky; +} .inset-0 { top: 0px; right: 0px; @@ -678,6 +685,15 @@ select { .bottom-0 { bottom: 0px; } +.left-2 { + left: 0.5rem; +} +.bottom-2 { + bottom: 0.5rem; +} +.top-14 { + top: 3.5rem; +} .z-0 { z-index: 0; } @@ -690,6 +706,9 @@ select { .z-\[1\] { z-index: 1; } +.z-\[2\] { + z-index: 2; +} .m-2 { margin: 0.5rem; } @@ -764,9 +783,18 @@ select { .mr-4 { margin-right: 1rem; } +.ml-64 { + margin-left: 16rem; +} +.mb-6 { + margin-bottom: 1.5rem; +} .block { display: block; } +.inline { + display: inline; +} .flex { display: flex; } @@ -860,6 +888,18 @@ select { .w-36 { width: 9rem; } +.w-\[90\%\] { + width: 90%; +} +.w-64 { + width: 16rem; +} +.w-72 { + width: 18rem; +} +.w-80 { + width: 20rem; +} .max-w-xl { max-width: 36rem; } @@ -925,6 +965,9 @@ select { .cursor-pointer { cursor: pointer; } +.cursor-not-allowed { + cursor: not-allowed; +} .select-all { -webkit-user-select: all; -moz-user-select: all; @@ -1017,6 +1060,9 @@ select { .overflow-scroll { overflow: scroll; } +.overflow-y-scroll { + overflow-y: scroll; +} .overscroll-contain { -ms-scroll-chaining: none; overscroll-behavior: contain; @@ -1113,10 +1159,6 @@ select { --tw-border-opacity: 1; border-color: rgb(243 244 246 / var(--tw-border-opacity)); } -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); @@ -1164,9 +1206,25 @@ select { .bg-opacity-75 { --tw-bg-opacity: 0.75; } +.bg-gradient-to-t { + background-image: linear-gradient(to top, var(--tw-gradient-stops)); +} +.from-black { + --tw-gradient-from: #000; + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgb(0 0 0 / 0)); +} .fill-current { fill: currentColor; } +.fill-blue-500 { + fill: #3b82f6; +} +.fill-gray-300 { + fill: #d1d5db; +} +.fill-red-300 { + fill: #fca5a5; +} .p-4 { padding: 1rem; } @@ -1259,6 +1317,24 @@ select { .pl-0 { padding-left: 0px; } +.pt-4 { + padding-top: 1rem; +} +.pb-4 { + padding-bottom: 1rem; +} +.pt-16 { + padding-top: 4rem; +} +.pt-24 { + padding-top: 6rem; +} +.pt-20 { + padding-top: 5rem; +} +.pt-2 { + padding-top: 0.5rem; +} .text-center { text-align: center; } @@ -1654,10 +1730,6 @@ select { .group:hover .group-hover\:block { display: block; } -.group:hover .group-hover\:border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} .dark .dark\:bg-gray-900 { --tw-bg-opacity: 1; background-color: rgb(17 24 39 / var(--tw-bg-opacity)); @@ -1759,6 +1831,10 @@ select { margin-top: 0px; } + .md\:mt-2 { + margin-top: 0.5rem; + } + .md\:block { display: block; } @@ -1813,6 +1889,14 @@ select { padding-right: 2.5rem; } + .md\:pt-24 { + padding-top: 6rem; + } + + .md\:pt-4 { + padding-top: 1rem; + } + .md\:hover\:w-52:hover { width: 13rem; } diff --git a/public/css/common.css b/public/css/common.css index 7549a5c4..8d8c4830 100644 --- a/public/css/common.css +++ b/public/css/common.css @@ -239,4 +239,7 @@ progress::-webkit-progress-value { .toast-close-button { right: -0.15em; } +.viewer-backdrop { + background-color: rgba(0, 0, 0, 0.75); +} diff --git a/public/css/photo-swipe/default-skin/default-skin.css b/public/css/photo-swipe/default-skin/default-skin.css deleted file mode 100644 index c9616326..00000000 --- a/public/css/photo-swipe/default-skin/default-skin.css +++ /dev/null @@ -1,482 +0,0 @@ -/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */ -/* - - Contents: - - 1. Buttons - 2. Share modal and links - 3. Index indicator ("1 of X" counter) - 4. Caption - 5. Loading indicator - 6. Additional styles (root element, top bar, idle state, hidden state, etc.) - -*/ -/* - - 1. Buttons - - */ -/*
').appendTo('body'), - uid = 1; - - function getImgs($gallery) { - var slideSelector = getOptions($gallery).slideSelector; - - return $gallery.find(slideSelector).map(function (index) { - var $img = $(this).data('index', index), - tagName = this.tagName.toUpperCase(); - - if (tagName === 'A') { - if (this.hash) { - $img = $(this.hash); - } else { - $img = $img.find('img').eq(0); - $img.data('original-src', this.href); - } - } else if (tagName !== 'IMG') { - $img = $img.find('img'); - } - - return $img[0]; - }); - } - - function getThumbBoundsFn($imgs) { - return function _getThumbBoundsFn(index) { - var $img = $imgs.eq(index), - imgOffset = $img.offset(), - imgWidth = $img[0].width; - - return { x: imgOffset.left, y: imgOffset.top, w: imgWidth }; - }; - } - - function getWH(wh, $img) { - var d = $.Deferred(), - wh_value = $img.data('original-src-' + wh), - original_src = decodeURI($img.data('original-src') || $img.attr('src')), - matches = original_src.match(/(\d+)[*×x](\d+)/); - - if (wh_value) { - d.resolve(wh_value); - } else if (matches !== null) { - d.resolve(matches[wh === 'width' ? 1 : 2]); - } else { - $('').on('load', function () { - d.resolve(this[wh]); - }).attr('src', $img.attr('src')); - } - - return d.promise(); - } - - function getHeight($img) { - return getWH('height', $img); - } - - function getWidth($img) { - return getWH('width', $img); - } - - function getImgSize($img) { - return $.when(getWidth($img), getHeight($img)); - } - - function getImgInfo() { - var $img = $(this), - original_src = $img.data('original-src') || $img.attr('src'), - d = $.Deferred(); - - if (this.tagName !== 'IMG') { - d.resolve({ - html: this.innerHTML - }); - } else { - getImgSize($img).done(function (w, h) { - var src = $img.attr('src'), - title, - caption_classname, - $figcaption; - - function get_caption($elem, selector) { - var $parent = $elem.parent(), - $caption_element; - - if (!$parent.length) { - return undefined; - } - - $caption_element = $parent.find(selector); - if ($caption_element.length) { - return $caption_element.html(); - } - - return get_caption($parent, selector); - } - - // try to find the slide title from : - // (in order) - // - // 1. `data-caption-class` (a class-name that indicates the element containing the caption) - // 2. `figcaption` element (the `figcaption` that resides inside a `figure` which contains the slide `img` element) - // 3. `alt` attribute (the `alt` attribute of the slide `img` element) - - if (caption_classname = $img.data('caption-class')) { - title = get_caption($img, '.' + caption_classname); - } else if (($figcaption = $img.closest('figure').find('figcaption')) && $figcaption.length) { - title = $figcaption.html(); - } else { - title = $img.attr('alt'); - } - - d.resolve({ - w: w, - h: h, - src: original_src, - msrc: src, - title: title - }); - }); - } - - return d.promise(); - } - - function getImgInfoArray($imgs) { - var imgInfoArray = $imgs.map(getImgInfo).get(), - d = $.Deferred(); - - $.when.apply($, imgInfoArray).done(function () { - var imgInfoArray = Array.prototype.slice.call(arguments); - d.resolve(imgInfoArray); - }); - - return d.promise(); - } - - function getOptions($gallery) { - return $gallery.data('photoswipeOptions'); - } - - function addUID($gallery) { - if (!$gallery.data('pswp-uid')) { - $gallery.data('pswp-uid', uid++); - } - } - - function openPhotoSwipe(index, $gallery, $imgs, imgInfoArray) { - var options = $.extend(getOptions($gallery).globalOptions, { index: index, getThumbBoundsFn: getThumbBoundsFn($imgs), galleryUID: $gallery.data('pswp-uid') }), - photoSwipe = new _photoswipe2.default($defaultGallery[0], _photoswipeUiDefault2.default, imgInfoArray, options); - - $.each(getOptions($gallery).events, function (eventName, eventHandler) { - photoSwipe.listen(eventName, eventHandler); - }); - - photoSwipe.init(); - } - - // parse picture index and gallery index from URL (#&pid=1&gid=2) - function photoswipeParseHash() { - var hash = window.location.hash.substring(1), - params = {}; - - if (hash.length < 5) { - return params; - } - - var vars = hash.split('&'); - for (var i = 0; i < vars.length; i++) { - if (!vars[i]) { - continue; - } - var pair = vars[i].split('='); - if (pair.length < 2) { - continue; - } - params[pair[0]] = parseInt(pair[1], 10); - } - - return params; - } - - function openFromURL($galleries) { - // Parse URL and open gallery if it contains #&pid=3&gid=1 - var hashData = photoswipeParseHash(); - if (hashData.pid && hashData.gid) { - (function () { - var $gallery = $galleries[hashData.gid - 1], - pid = hashData.pid - 1, - $imgs = getImgs($gallery), - imgInfoArrayPromise = getImgInfoArray($imgs); - - imgInfoArrayPromise.done(function (imgInfoArray) { - openPhotoSwipe(pid, $gallery, $imgs, imgInfoArray); - }); - })(); - } - } - - function addClickHandler($gallery, $imgs, imgInfoArray) { - $gallery.on('click.photoswipe', getOptions($gallery).slideSelector, function (e) { - e.preventDefault(); - openPhotoSwipe($(this).data('index'), $gallery, $imgs, imgInfoArray); - }); - } - - function removeClickHandler($gallery) { - $gallery.off('click.photoswipe'); - } - - function update($gallery) { - var $imgs = getImgs($gallery), - imgInfoArrayPromise = getImgInfoArray($imgs); - - imgInfoArrayPromise.done(function (imgInfoArray) { - removeClickHandler($gallery); - addClickHandler($gallery, $imgs, imgInfoArray); - }); - } - - $.fn.photoSwipe = function () { - var slideSelector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'img'; - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var events = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - var defaultOptions = { - bgOpacity: 0.973, - showHideOpacity: true - }, - globalOptions = $.extend(defaultOptions, options); - - // Initialize each gallery - var $galleries = [], - isUpdate = slideSelector === 'update'; - - this.each(function () { - if (isUpdate) { - update($(this)); - return; - } - - var $gallery = $(this).data('photoswipeOptions', { slideSelector: slideSelector, globalOptions: globalOptions, events: events }), - // save options - $imgs = getImgs($gallery), - imgInfoArrayPromise = getImgInfoArray($imgs); - - addUID($gallery); - $galleries.push($gallery); - - imgInfoArrayPromise.done(function (imgInfoArray) { - addClickHandler($gallery, $imgs, imgInfoArray); - }); - }); - - if (!isUpdate) { - openFromURL($galleries); - } - - return this; - }; - - // Attach original PhotoSwipe to $.fn.photoSwipe - $.fn.photoSwipe.PhotoSwipe = _photoswipe2.default; -} - - - PhotoSwipeMounter(jQuery); - - -exports.default = PhotoSwipeMounter; -exports.PhotoSwipe = _photoswipe2.default; - -},{"./libs/photoswipe-ui-default":3,"photoswipe":1}],3:[function(require,module,exports){ -'use strict'; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -/*! PhotoSwipe Default UI - 4.1.1 - 2015-12-24 -* http://photoswipe.com -* Copyright (c) 2015 Dmitry Semenov; */ -/** -* -* UI on top of main sliding area (caption, arrows, close button, etc.). -* Built just using public methods/properties of PhotoSwipe. -* -*/ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define(factory); - } else if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') { - module.exports = factory(); - } else { - root.PhotoSwipeUI_Default = factory(); - } -})(undefined, function () { - - 'use strict'; - - var PhotoSwipeUI_Default = function PhotoSwipeUI_Default(pswp, framework) { - - var ui = this; - var _overlayUIUpdated = false, - _controlsVisible = true, - _fullscrenAPI, - _controls, - _captionContainer, - _fakeCaptionContainer, - _indexIndicator, - _shareButton, - _shareModal, - _shareModalHidden = true, - _initalCloseOnScrollValue, - _isIdle, - _listen, - _loadingIndicator, - _loadingIndicatorHidden, - _loadingIndicatorTimeout, - _galleryHasOneSlide, - _options, - _defaultUIOptions = { - barsSize: { top: 44, bottom: 'auto' }, - closeElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'], - timeToIdle: 4000, - timeToIdleOutside: 1000, - loadingIndicatorDelay: 1000, // 2s - - addCaptionHTMLFn: function addCaptionHTMLFn(item, captionEl /*, isFake */) { - if (!item.title) { - captionEl.children[0].innerHTML = ''; - return false; - } - captionEl.children[0].innerHTML = item.title; - return true; - }, - - closeEl: true, - captionEl: true, - fullscreenEl: true, - zoomEl: true, - shareEl: true, - counterEl: true, - arrowEl: true, - preloaderEl: true, - - tapToClose: false, - tapToToggleControls: true, - - clickToCloseNonZoomable: true, - - shareButtons: [{ id: 'facebook', label: 'Share on Facebook', url: 'https://www.facebook.com/sharer/sharer.php?u={{url}}' }, { id: 'twitter', label: 'Tweet', url: 'https://twitter.com/intent/tweet?text={{text}}&url={{url}}' }, { id: 'pinterest', label: 'Pin it', url: 'http://www.pinterest.com/pin/create/button/' + '?url={{url}}&media={{image_url}}&description={{text}}' }, { id: 'download', label: 'Download image', url: '{{raw_image_url}}', download: true }], - getImageURLForShare: function getImageURLForShare() /* shareButtonData */{ - return pswp.currItem.src || ''; - }, - getPageURLForShare: function getPageURLForShare() /* shareButtonData */{ - return window.location.href; - }, - getTextForShare: function getTextForShare() /* shareButtonData */{ - return pswp.currItem.title || ''; - }, - - indexIndicatorSep: ' / ', - fitControlsWidth: 1200 - - }, - _blockControlsTap, - _blockControlsTapTimeout; - - var _onControlsTap = function _onControlsTap(e) { - if (_blockControlsTap) { - return true; - } - - e = e || window.event; - - if (_options.timeToIdle && _options.mouseUsed && !_isIdle) { - // reset idle timer - _onIdleMouseMove(); - } - - var target = e.target || e.srcElement, - uiElement, - clickedClass = target.getAttribute('class') || '', - found; - - for (var i = 0; i < _uiElements.length; i++) { - uiElement = _uiElements[i]; - if (uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name) > -1) { - uiElement.onTap(); - found = true; - } - } - - if (found) { - if (e.stopPropagation) { - e.stopPropagation(); - } - _blockControlsTap = true; - - // Some versions of Android don't prevent ghost click event - // when preventDefault() was called on touchstart and/or touchend. - // - // This happens on v4.3, 4.2, 4.1, - // older versions strangely work correctly, - // but just in case we add delay on all of them) - var tapDelay = framework.features.isOldAndroid ? 600 : 30; - _blockControlsTapTimeout = setTimeout(function () { - _blockControlsTap = false; - }, tapDelay); - } - }, - _fitControlsInViewport = function _fitControlsInViewport() { - return !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth; - }, - _togglePswpClass = function _togglePswpClass(el, cName, add) { - framework[(add ? 'add' : 'remove') + 'Class'](el, 'pswp__' + cName); - }, - - - // add class when there is just one item in the gallery - // (by default it hides left/right arrows and 1ofX counter) - _countNumItems = function _countNumItems() { - var hasOneSlide = _options.getNumItemsFn() === 1; - - if (hasOneSlide !== _galleryHasOneSlide) { - _togglePswpClass(_controls, 'ui--one-slide', hasOneSlide); - _galleryHasOneSlide = hasOneSlide; - } - }, - _toggleShareModalClass = function _toggleShareModalClass() { - _togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden); - }, - _toggleShareModal = function _toggleShareModal() { - - _shareModalHidden = !_shareModalHidden; - - if (!_shareModalHidden) { - _toggleShareModalClass(); - setTimeout(function () { - if (!_shareModalHidden) { - framework.addClass(_shareModal, 'pswp__share-modal--fade-in'); - } - }, 30); - } else { - framework.removeClass(_shareModal, 'pswp__share-modal--fade-in'); - setTimeout(function () { - if (_shareModalHidden) { - _toggleShareModalClass(); - } - }, 300); - } - - if (!_shareModalHidden) { - _updateShareURLs(); - } - return false; - }, - _openWindowPopup = function _openWindowPopup(e) { - e = e || window.event; - var target = e.target || e.srcElement; - - pswp.shout('shareLinkClick', e, target); - - if (!target.href) { - return false; - } - - if (target.hasAttribute('download')) { - return true; - } - - window.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,' + 'location=yes,width=550,height=420,top=100,left=' + (window.screen ? Math.round(screen.width / 2 - 275) : 100)); - - if (!_shareModalHidden) { - _toggleShareModal(); - } - - return false; - }, - _updateShareURLs = function _updateShareURLs() { - var shareButtonOut = '', - shareButtonData, - shareURL, - image_url, - page_url, - share_text; - - for (var i = 0; i < _options.shareButtons.length; i++) { - shareButtonData = _options.shareButtons[i]; - - image_url = _options.getImageURLForShare(shareButtonData); - page_url = _options.getPageURLForShare(shareButtonData); - share_text = _options.getTextForShare(shareButtonData); - - shareURL = shareButtonData.url.replace('{{url}}', encodeURIComponent(page_url)).replace('{{image_url}}', encodeURIComponent(image_url)).replace('{{raw_image_url}}', image_url).replace('{{text}}', encodeURIComponent(share_text)); - - shareButtonOut += '' + shareButtonData.label + ''; - - if (_options.parseShareButtonOut) { - shareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut); - } - } - _shareModal.children[0].innerHTML = shareButtonOut; - _shareModal.children[0].onclick = _openWindowPopup; - }, - _hasCloseClass = function _hasCloseClass(target) { - for (var i = 0; i < _options.closeElClasses.length; i++) { - if (framework.hasClass(target, 'pswp__' + _options.closeElClasses[i])) { - return true; - } - } - }, - _idleInterval, - _idleTimer, - _idleIncrement = 0, - _onIdleMouseMove = function _onIdleMouseMove() { - clearTimeout(_idleTimer); - _idleIncrement = 0; - if (_isIdle) { - ui.setIdle(false); - } - }, - _onMouseLeaveWindow = function _onMouseLeaveWindow(e) { - e = e ? e : window.event; - var from = e.relatedTarget || e.toElement; - if (!from || from.nodeName === 'HTML') { - clearTimeout(_idleTimer); - _idleTimer = setTimeout(function () { - ui.setIdle(true); - }, _options.timeToIdleOutside); - } - }, - _setupFullscreenAPI = function _setupFullscreenAPI() { - if (_options.fullscreenEl && !framework.features.isOldAndroid) { - if (!_fullscrenAPI) { - _fullscrenAPI = ui.getFullscreenAPI(); - } - if (_fullscrenAPI) { - framework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen); - ui.updateFullscreen(); - framework.addClass(pswp.template, 'pswp--supports-fs'); - } else { - framework.removeClass(pswp.template, 'pswp--supports-fs'); - } - } - }, - _setupLoadingIndicator = function _setupLoadingIndicator() { - // Setup loading indicator - if (_options.preloaderEl) { - - _toggleLoadingIndicator(true); - - _listen('beforeChange', function () { - - clearTimeout(_loadingIndicatorTimeout); - - // display loading indicator with delay - _loadingIndicatorTimeout = setTimeout(function () { - - if (pswp.currItem && pswp.currItem.loading) { - - if (!pswp.allowProgressiveImg() || pswp.currItem.img && !pswp.currItem.img.naturalWidth) { - // show preloader if progressive loading is not enabled, - // or image width is not defined yet (because of slow connection) - _toggleLoadingIndicator(false); - // items-controller.js function allowProgressiveImg - } - } else { - _toggleLoadingIndicator(true); // hide preloader - } - }, _options.loadingIndicatorDelay); - }); - _listen('imageLoadComplete', function (index, item) { - if (pswp.currItem === item) { - _toggleLoadingIndicator(true); - } - }); - } - }, - _toggleLoadingIndicator = function _toggleLoadingIndicator(hide) { - if (_loadingIndicatorHidden !== hide) { - _togglePswpClass(_loadingIndicator, 'preloader--active', !hide); - _loadingIndicatorHidden = hide; - } - }, - _applyNavBarGaps = function _applyNavBarGaps(item) { - var gap = item.vGap; - - if (_fitControlsInViewport()) { - - var bars = _options.barsSize; - if (_options.captionEl && bars.bottom === 'auto') { - if (!_fakeCaptionContainer) { - _fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake'); - _fakeCaptionContainer.appendChild(framework.createEl('pswp__caption__center')); - _controls.insertBefore(_fakeCaptionContainer, _captionContainer); - framework.addClass(_controls, 'pswp__ui--fit'); - } - if (_options.addCaptionHTMLFn(item, _fakeCaptionContainer, true)) { - - var captionSize = _fakeCaptionContainer.clientHeight; - gap.bottom = parseInt(captionSize, 10) || 44; - } else { - gap.bottom = bars.top; // if no caption, set size of bottom gap to size of top - } - } else { - gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom; - } - - // height of top bar is static, no need to calculate it - gap.top = bars.top; - } else { - gap.top = gap.bottom = 0; - } - }, - _setupIdle = function _setupIdle() { - // Hide controls when mouse is used - if (_options.timeToIdle) { - _listen('mouseUsed', function () { - - framework.bind(document, 'mousemove', _onIdleMouseMove); - framework.bind(document, 'mouseout', _onMouseLeaveWindow); - - _idleInterval = setInterval(function () { - _idleIncrement++; - if (_idleIncrement === 2) { - ui.setIdle(true); - } - }, _options.timeToIdle / 2); - }); - } - }, - _setupHidingControlsDuringGestures = function _setupHidingControlsDuringGestures() { - - // Hide controls on vertical drag - _listen('onVerticalDrag', function (now) { - if (_controlsVisible && now < 0.95) { - ui.hideControls(); - } else if (!_controlsVisible && now >= 0.95) { - ui.showControls(); - } - }); - - // Hide controls when pinching to close - var pinchControlsHidden; - _listen('onPinchClose', function (now) { - if (_controlsVisible && now < 0.9) { - ui.hideControls(); - pinchControlsHidden = true; - } else if (pinchControlsHidden && !_controlsVisible && now > 0.9) { - ui.showControls(); - } - }); - - _listen('zoomGestureEnded', function () { - pinchControlsHidden = false; - if (pinchControlsHidden && !_controlsVisible) { - ui.showControls(); - } - }); - }; - - var _uiElements = [{ - name: 'caption', - option: 'captionEl', - onInit: function onInit(el) { - _captionContainer = el; - } - }, { - name: 'share-modal', - option: 'shareEl', - onInit: function onInit(el) { - _shareModal = el; - }, - onTap: function onTap() { - _toggleShareModal(); - } - }, { - name: 'button--share', - option: 'shareEl', - onInit: function onInit(el) { - _shareButton = el; - }, - onTap: function onTap() { - _toggleShareModal(); - } - }, { - name: 'button--zoom', - option: 'zoomEl', - onTap: pswp.toggleDesktopZoom - }, { - name: 'counter', - option: 'counterEl', - onInit: function onInit(el) { - _indexIndicator = el; - } - }, { - name: 'button--close', - option: 'closeEl', - onTap: pswp.close - }, { - name: 'button--arrow--left', - option: 'arrowEl', - onTap: pswp.prev - }, { - name: 'button--arrow--right', - option: 'arrowEl', - onTap: pswp.next - }, { - name: 'button--fs', - option: 'fullscreenEl', - onTap: function onTap() { - if (_fullscrenAPI.isFullscreen()) { - _fullscrenAPI.exit(); - } else { - _fullscrenAPI.enter(); - } - } - }, { - name: 'preloader', - option: 'preloaderEl', - onInit: function onInit(el) { - _loadingIndicator = el; - } - }]; - - var _setupUIElements = function _setupUIElements() { - var item, classAttr, uiElement; - - var loopThroughChildElements = function loopThroughChildElements(sChildren) { - if (!sChildren) { - return; - } - - var l = sChildren.length; - for (var i = 0; i < l; i++) { - item = sChildren[i]; - classAttr = item.className; - - for (var a = 0; a < _uiElements.length; a++) { - uiElement = _uiElements[a]; - - if (classAttr.indexOf('pswp__' + uiElement.name) > -1) { - - if (_options[uiElement.option]) { - // if element is not disabled from options - - framework.removeClass(item, 'pswp__element--disabled'); - if (uiElement.onInit) { - uiElement.onInit(item); - } - - //item.style.display = 'block'; - } else { - framework.addClass(item, 'pswp__element--disabled'); - //item.style.display = 'none'; - } - } - } - } - }; - loopThroughChildElements(_controls.children); - - var topBar = framework.getChildByClass(_controls, 'pswp__top-bar'); - if (topBar) { - loopThroughChildElements(topBar.children); - } - }; - - ui.init = function () { - - // extend options - framework.extend(pswp.options, _defaultUIOptions, true); - - // create local link for fast access - _options = pswp.options; - - // find pswp__ui element - _controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui'); - - // create local link - _listen = pswp.listen; - - _setupHidingControlsDuringGestures(); - - // update controls when slides change - _listen('beforeChange', ui.update); - - // toggle zoom on double-tap - _listen('doubleTap', function (point) { - var initialZoomLevel = pswp.currItem.initialZoomLevel; - if (pswp.getZoomLevel() !== initialZoomLevel) { - pswp.zoomTo(initialZoomLevel, point, 333); - } else { - pswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333); - } - }); - - // Allow text selection in caption - _listen('preventDragEvent', function (e, isDown, preventObj) { - var t = e.target || e.srcElement; - if (t && t.getAttribute('class') && e.type.indexOf('mouse') > -1 && (t.getAttribute('class').indexOf('__caption') > 0 || /(SMALL|STRONG|EM)/i.test(t.tagName))) { - preventObj.prevent = false; - } - }); - - // bind events for UI - _listen('bindEvents', function () { - framework.bind(_controls, 'pswpTap click', _onControlsTap); - framework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap); - - if (!pswp.likelyTouchDevice) { - framework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver); - } - }); - - // unbind events for UI - _listen('unbindEvents', function () { - if (!_shareModalHidden) { - _toggleShareModal(); - } - - if (_idleInterval) { - clearInterval(_idleInterval); - } - framework.unbind(document, 'mouseout', _onMouseLeaveWindow); - framework.unbind(document, 'mousemove', _onIdleMouseMove); - framework.unbind(_controls, 'pswpTap click', _onControlsTap); - framework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap); - framework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver); - - if (_fullscrenAPI) { - framework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen); - if (_fullscrenAPI.isFullscreen()) { - _options.hideAnimationDuration = 0; - _fullscrenAPI.exit(); - } - _fullscrenAPI = null; - } - }); - - // clean up things when gallery is destroyed - _listen('destroy', function () { - if (_options.captionEl) { - if (_fakeCaptionContainer) { - _controls.removeChild(_fakeCaptionContainer); - } - framework.removeClass(_captionContainer, 'pswp__caption--empty'); - } - - if (_shareModal) { - _shareModal.children[0].onclick = null; - } - framework.removeClass(_controls, 'pswp__ui--over-close'); - framework.addClass(_controls, 'pswp__ui--hidden'); - ui.setIdle(false); - }); - - if (!_options.showAnimationDuration) { - framework.removeClass(_controls, 'pswp__ui--hidden'); - } - _listen('initialZoomIn', function () { - if (_options.showAnimationDuration) { - framework.removeClass(_controls, 'pswp__ui--hidden'); - } - }); - _listen('initialZoomOut', function () { - framework.addClass(_controls, 'pswp__ui--hidden'); - }); - - _listen('parseVerticalMargin', _applyNavBarGaps); - - _setupUIElements(); - - if (_options.shareEl && _shareButton && _shareModal) { - _shareModalHidden = true; - } - - _countNumItems(); - - _setupIdle(); - - _setupFullscreenAPI(); - - _setupLoadingIndicator(); - }; - - ui.setIdle = function (isIdle) { - _isIdle = isIdle; - _togglePswpClass(_controls, 'ui--idle', isIdle); - }; - - ui.update = function () { - // Don't update UI if it's hidden - if (_controlsVisible && pswp.currItem) { - - ui.updateIndexIndicator(); - - if (_options.captionEl) { - _options.addCaptionHTMLFn(pswp.currItem, _captionContainer); - - _togglePswpClass(_captionContainer, 'caption--empty', !pswp.currItem.title); - } - - _overlayUIUpdated = true; - } else { - _overlayUIUpdated = false; - } - - if (!_shareModalHidden) { - _toggleShareModal(); - } - - _countNumItems(); - }; - - ui.updateFullscreen = function (e) { - - if (e) { - // some browsers change window scroll position during the fullscreen - // so PhotoSwipe updates it just in case - setTimeout(function () { - pswp.setScrollOffset(0, framework.getScrollY()); - }, 50); - } - - // toogle pswp--fs class on root element - framework[(_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class'](pswp.template, 'pswp--fs'); - }; - - ui.updateIndexIndicator = function () { - if (_options.counterEl) { - _indexIndicator.innerHTML = pswp.getCurrentIndex() + 1 + _options.indexIndicatorSep + _options.getNumItemsFn(); - } - }; - - ui.onGlobalTap = function (e) { - e = e || window.event; - var target = e.target || e.srcElement; - - if (_blockControlsTap) { - return; - } - - if (e.detail && e.detail.pointerType === 'mouse') { - - // close gallery if clicked outside of the image - if (_hasCloseClass(target)) { - pswp.close(); - return; - } - - if (framework.hasClass(target, 'pswp__img')) { - if (pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) { - if (_options.clickToCloseNonZoomable) { - pswp.close(); - } - } else { - pswp.toggleDesktopZoom(e.detail.releasePoint); - } - } - } else { - - // tap anywhere (except buttons) to toggle visibility of controls - if (_options.tapToToggleControls) { - if (_controlsVisible) { - ui.hideControls(); - } else { - ui.showControls(); - } - } - - // tap to close gallery - if (_options.tapToClose && (framework.hasClass(target, 'pswp__img') || _hasCloseClass(target))) { - pswp.close(); - return; - } - } - }; - ui.onMouseOver = function (e) { - e = e || window.event; - var target = e.target || e.srcElement; - - // add class when mouse is over an element that should close the gallery - _togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target)); - }; - - ui.hideControls = function () { - framework.addClass(_controls, 'pswp__ui--hidden'); - _controlsVisible = false; - }; - - ui.showControls = function () { - _controlsVisible = true; - if (!_overlayUIUpdated) { - ui.update(); - } - framework.removeClass(_controls, 'pswp__ui--hidden'); - }; - - ui.supportsFullscreen = function () { - var d = document; - return !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen); - }; - - ui.getFullscreenAPI = function () { - var dE = document.documentElement, - api, - tF = 'fullscreenchange'; - - if (dE.requestFullscreen) { - api = { - enterK: 'requestFullscreen', - exitK: 'exitFullscreen', - elementK: 'fullscreenElement', - eventK: tF - }; - } else if (dE.mozRequestFullScreen) { - api = { - enterK: 'mozRequestFullScreen', - exitK: 'mozCancelFullScreen', - elementK: 'mozFullScreenElement', - eventK: 'moz' + tF - }; - } else if (dE.webkitRequestFullscreen) { - api = { - enterK: 'webkitRequestFullscreen', - exitK: 'webkitExitFullscreen', - elementK: 'webkitFullscreenElement', - eventK: 'webkit' + tF - }; - } else if (dE.msRequestFullscreen) { - api = { - enterK: 'msRequestFullscreen', - exitK: 'msExitFullscreen', - elementK: 'msFullscreenElement', - eventK: 'MSFullscreenChange' - }; - } - - if (api) { - api.enter = function () { - // disable close-on-scroll in fullscreen - _initalCloseOnScrollValue = _options.closeOnScroll; - _options.closeOnScroll = false; - - if (this.enterK === 'webkitRequestFullscreen') { - pswp.template[this.enterK](Element.ALLOW_KEYBOARD_INPUT); - } else { - return pswp.template[this.enterK](); - } - }; - api.exit = function () { - _options.closeOnScroll = _initalCloseOnScrollValue; - - return document[this.exitK](); - }; - api.isFullscreen = function () { - return document[this.elementK]; - }; - } - - return api; - }; - }; - return PhotoSwipeUI_Default; -}); - -},{}]},{},[2]); diff --git a/public/js/photo-swipe/photoswipe-ui-default.min.js b/public/js/photo-swipe/photoswipe-ui-default.min.js deleted file mode 100644 index ab7bedc7..00000000 --- a/public/js/photo-swipe/photoswipe-ui-default.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08 -* http://photoswipe.com -* Copyright (c) 2019 Dmitry Semenov; */ -!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.PhotoSwipeUI_Default=b()}(this,function(){"use strict";var a=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v=this,w=!1,x=!0,y=!0,z={barsSize:{top:44,bottom:"auto"},closeElClasses:["item","caption","zoom-wrap","ui","top-bar"],timeToIdle:4e3,timeToIdleOutside:1e3,loadingIndicatorDelay:1e3,addCaptionHTMLFn:function(a,b){return a.title?(b.children[0].innerHTML=a.title,!0):(b.children[0].innerHTML="",!1)},closeEl:!0,captionEl:!0,fullscreenEl:!0,zoomEl:!0,shareEl:!0,counterEl:!0,arrowEl:!0,preloaderEl:!0,tapToClose:!1,tapToToggleControls:!0,clickToCloseNonZoomable:!0,shareButtons:[{id:"facebook",label:"Share on Facebook",url:"https://www.facebook.com/sharer/sharer.php?u={{url}}"},{id:"twitter",label:"Tweet",url:"https://twitter.com/intent/tweet?text={{text}}&url={{url}}"},{id:"pinterest",label:"Pin it",url:"http://www.pinterest.com/pin/create/button/?url={{url}}&media={{image_url}}&description={{text}}"},{id:"download",label:"Download image",url:"{{raw_image_url}}",download:!0}],getImageURLForShare:function(){return a.currItem.src||""},getPageURLForShare:function(){return window.location.href},getTextForShare:function(){return a.currItem.title||""},indexIndicatorSep:" / ",fitControlsWidth:1200},A=function(a){if(r)return!0;a=a||window.event,q.timeToIdle&&q.mouseUsed&&!k&&K();for(var c,d,e=a.target||a.srcElement,f=e.getAttribute("class")||"",g=0;g-1&&(c.onTap(),d=!0);if(d){a.stopPropagation&&a.stopPropagation(),r=!0;var h=b.features.isOldAndroid?600:30;s=setTimeout(function(){r=!1},h)}},B=function(){return!a.likelyTouchDevice||q.mouseUsed||screen.width>q.fitControlsWidth},C=function(a,c,d){b[(d?"add":"remove")+"Class"](a,"pswp__"+c)},D=function(){var a=1===q.getNumItemsFn();a!==p&&(C(d,"ui--one-slide",a),p=a)},E=function(){C(i,"share-modal--hidden",y)},F=function(){return y=!y,y?(b.removeClass(i,"pswp__share-modal--fade-in"),setTimeout(function(){y&&E()},300)):(E(),setTimeout(function(){y||b.addClass(i,"pswp__share-modal--fade-in")},30)),y||H(),!1},G=function(b){b=b||window.event;var c=b.target||b.srcElement;return a.shout("shareLinkClick",b,c),!!c.href&&(!!c.hasAttribute("download")||(window.open(c.href,"pswp_share","scrollbars=yes,resizable=yes,toolbar=no,location=yes,width=550,height=420,top=100,left="+(window.screen?Math.round(screen.width/2-275):100)),y||F(),!1))},H=function(){for(var a,b,c,d,e,f="",g=0;g"+a.label+"",q.parseShareButtonOut&&(f=q.parseShareButtonOut(a,f));i.children[0].innerHTML=f,i.children[0].onclick=G},I=function(a){for(var c=0;c=.95&&v.showControls()});var a;l("onPinchClose",function(b){x&&b<.9?(v.hideControls(),a=!0):a&&!x&&b>.9&&v.showControls()}),l("zoomGestureEnded",function(){a=!1,a&&!x&&v.showControls()})},S=[{name:"caption",option:"captionEl",onInit:function(a){e=a}},{name:"share-modal",option:"shareEl",onInit:function(a){i=a},onTap:function(){F()}},{name:"button--share",option:"shareEl",onInit:function(a){h=a},onTap:function(){F()}},{name:"button--zoom",option:"zoomEl",onTap:a.toggleDesktopZoom},{name:"counter",option:"counterEl",onInit:function(a){g=a}},{name:"button--close",option:"closeEl",onTap:a.close},{name:"button--arrow--left",option:"arrowEl",onTap:a.prev},{name:"button--arrow--right",option:"arrowEl",onTap:a.next},{name:"button--fs",option:"fullscreenEl",onTap:function(){c.isFullscreen()?c.exit():c.enter()}},{name:"preloader",option:"preloaderEl",onInit:function(a){m=a}}],T=function(){var a,c,e,f=function(d){if(d)for(var f=d.length,g=0;g-1&&(q[e.option]?(b.removeClass(a,"pswp__element--disabled"),e.onInit&&e.onInit(a)):b.addClass(a,"pswp__element--disabled"))}};f(d.children);var g=b.getChildByClass(d,"pswp__top-bar");g&&f(g.children)};v.init=function(){b.extend(a.options,z,!0),q=a.options,d=b.getChildByClass(a.scrollWrap,"pswp__ui"),l=a.listen,R(),l("beforeChange",v.update),l("doubleTap",function(b){var c=a.currItem.initialZoomLevel;a.getZoomLevel()!==c?a.zoomTo(c,b,333):a.zoomTo(q.getDoubleTapZoom(!1,a.currItem),b,333)}),l("preventDragEvent",function(a,b,c){var d=a.target||a.srcElement;d&&d.getAttribute("class")&&a.type.indexOf("mouse")>-1&&(d.getAttribute("class").indexOf("__caption")>0||/(SMALL|STRONG|EM)/i.test(d.tagName))&&(c.prevent=!1)}),l("bindEvents",function(){b.bind(d,"pswpTap click",A),b.bind(a.scrollWrap,"pswpTap",v.onGlobalTap),a.likelyTouchDevice||b.bind(a.scrollWrap,"mouseover",v.onMouseOver)}),l("unbindEvents",function(){y||F(),t&&clearInterval(t),b.unbind(document,"mouseout",L),b.unbind(document,"mousemove",K),b.unbind(d,"pswpTap click",A),b.unbind(a.scrollWrap,"pswpTap",v.onGlobalTap),b.unbind(a.scrollWrap,"mouseover",v.onMouseOver),c&&(b.unbind(document,c.eventK,v.updateFullscreen),c.isFullscreen()&&(q.hideAnimationDuration=0,c.exit()),c=null)}),l("destroy",function(){q.captionEl&&(f&&d.removeChild(f),b.removeClass(e,"pswp__caption--empty")),i&&(i.children[0].onclick=null),b.removeClass(d,"pswp__ui--over-close"),b.addClass(d,"pswp__ui--hidden"),v.setIdle(!1)}),q.showAnimationDuration||b.removeClass(d,"pswp__ui--hidden"),l("initialZoomIn",function(){q.showAnimationDuration&&b.removeClass(d,"pswp__ui--hidden")}),l("initialZoomOut",function(){b.addClass(d,"pswp__ui--hidden")}),l("parseVerticalMargin",P),T(),q.shareEl&&h&&i&&(y=!0),D(),Q(),M(),N()},v.setIdle=function(a){k=a,C(d,"ui--idle",a)},v.update=function(){x&&a.currItem?(v.updateIndexIndicator(),q.captionEl&&(q.addCaptionHTMLFn(a.currItem,e),C(e,"caption--empty",!a.currItem.title)),w=!0):w=!1,y||F(),D()},v.updateFullscreen=function(d){d&&setTimeout(function(){a.setScrollOffset(0,b.getScrollY())},50),b[(c.isFullscreen()?"add":"remove")+"Class"](a.template,"pswp--fs")},v.updateIndexIndicator=function(){q.counterEl&&(g.innerHTML=a.getCurrentIndex()+1+q.indexIndicatorSep+q.getNumItemsFn())},v.onGlobalTap=function(c){c=c||window.event;var d=c.target||c.srcElement;if(!r)if(c.detail&&"mouse"===c.detail.pointerType){if(I(d))return void a.close();b.hasClass(d,"pswp__img")&&(1===a.getZoomLevel()&&a.getZoomLevel()<=a.currItem.fitRatio?q.clickToCloseNonZoomable&&a.close():a.toggleDesktopZoom(c.detail.releasePoint))}else if(q.tapToToggleControls&&(x?v.hideControls():v.showControls()),q.tapToClose&&(b.hasClass(d,"pswp__img")||I(d)))return void a.close()},v.onMouseOver=function(a){a=a||window.event;var b=a.target||a.srcElement;C(d,"ui--over-close",I(b))},v.hideControls=function(){b.addClass(d,"pswp__ui--hidden"),x=!1},v.showControls=function(){x=!0,w||v.update(),b.removeClass(d,"pswp__ui--hidden")},v.supportsFullscreen=function(){var a=document;return!!(a.exitFullscreen||a.mozCancelFullScreen||a.webkitExitFullscreen||a.msExitFullscreen)},v.getFullscreenAPI=function(){var b,c=document.documentElement,d="fullscreenchange";return c.requestFullscreen?b={enterK:"requestFullscreen",exitK:"exitFullscreen",elementK:"fullscreenElement",eventK:d}:c.mozRequestFullScreen?b={enterK:"mozRequestFullScreen",exitK:"mozCancelFullScreen",elementK:"mozFullScreenElement",eventK:"moz"+d}:c.webkitRequestFullscreen?b={enterK:"webkitRequestFullscreen",exitK:"webkitExitFullscreen",elementK:"webkitFullscreenElement",eventK:"webkit"+d}:c.msRequestFullscreen&&(b={enterK:"msRequestFullscreen",exitK:"msExitFullscreen",elementK:"msFullscreenElement",eventK:"MSFullscreenChange"}),b&&(b.enter=function(){return j=q.closeOnScroll,q.closeOnScroll=!1,"webkitRequestFullscreen"!==this.enterK?a.template[this.enterK]():void a.template[this.enterK](Element.ALLOW_KEYBOARD_INPUT)},b.exit=function(){return q.closeOnScroll=j,document[this.exitK]()},b.isFullscreen=function(){return document[this.elementK]}),b}};return a}); \ No newline at end of file diff --git a/public/js/photo-swipe/photoswipe.min.js b/public/js/photo-swipe/photoswipe.min.js deleted file mode 100644 index 03708613..00000000 --- a/public/js/photo-swipe/photoswipe.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! PhotoSwipe - v4.1.3 - 2019-01-08 -* http://photoswipe.com -* Copyright (c) 2019 Dmitry Semenov; */ -!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.PhotoSwipe=b()}(this,function(){"use strict";var a=function(a,b,c,d){var e={features:null,bind:function(a,b,c,d){var e=(d?"remove":"add")+"EventListener";b=b.split(" ");for(var f=0;f0&&(g=parseInt(g[1],10),g>=1&&g<8&&(d.isOldIOSPhone=!0))}var h=f.match(/Android\s([0-9\.]*)/),i=h?h[1]:0;i=parseFloat(i),i>=1&&(i<4.4&&(d.isOldAndroid=!0),d.androidVersion=i),d.isMobileOpera=/opera mini|opera mobi/i.test(f)}for(var j,k,l=["transform","perspective","animationName"],m=["","webkit","Moz","ms","O"],n=0;n<4;n++){c=m[n];for(var o=0;o<3;o++)j=l[o],k=c+(c?j.charAt(0).toUpperCase()+j.slice(1):j),!d[j]&&k in b&&(d[j]=k);c&&!d.raf&&(c=c.toLowerCase(),d.raf=window[c+"RequestAnimationFrame"],d.raf&&(d.caf=window[c+"CancelAnimationFrame"]||window[c+"CancelRequestAnimationFrame"]))}if(!d.raf){var p=0;d.raf=function(a){var b=(new Date).getTime(),c=Math.max(0,16-(b-p)),d=window.setTimeout(function(){a(b+c)},c);return p=b+c,d},d.caf=function(a){clearTimeout(a)}}return d.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,e.features=d,d}};e.detectFeatures(),e.features.oldIE&&(e.bind=function(a,b,c,d){b=b.split(" ");for(var e,f=(d?"detach":"attach")+"Event",g=function(){c.handleEvent.call(c)},h=0;hb-1?a-b:a<0?b+a:a},Ba={},Ca=function(a,b){return Ba[a]||(Ba[a]=[]),Ba[a].push(b)},Da=function(a){var b=Ba[a];if(b){var c=Array.prototype.slice.call(arguments);c.shift();for(var d=0;df.currItem.fitRatio?ya||(mc(f.currItem,!1,!0),ya=!0):ya&&(mc(f.currItem),ya=!1)),Ga(ea,pa.x,pa.y,s))},Ia=function(a){a.container&&Ga(a.container.style,a.initialPosition.x,a.initialPosition.y,a.initialZoomLevel,a)},Ja=function(a,b){b[E]=u+a+"px, 0px"+v},Ka=function(a,b){if(!i.loop&&b){var c=m+(ta.x*ra-a)/ta.x,d=Math.round(a-tb.x);(c<0&&d>0||c>=ac()-1&&d<0)&&(a=tb.x+d*i.mainScrollEndFriction)}tb.x=a,Ja(a,n)},La=function(a,b){var c=ub[a]-sa[a];return oa[a]+na[a]+c-c*(b/t)},Ma=function(a,b){a.x=b.x,a.y=b.y,b.id&&(a.id=b.id)},Na=function(a){a.x=Math.round(a.x),a.y=Math.round(a.y)},Oa=null,Pa=function(){Oa&&(e.unbind(document,"mousemove",Pa),e.addClass(a,"pswp--has_mouse"),i.mouseUsed=!0,Da("mouseUsed")),Oa=setTimeout(function(){Oa=null},100)},Qa=function(){e.bind(document,"keydown",f),N.transform&&e.bind(f.scrollWrap,"click",f),i.mouseUsed||e.bind(document,"mousemove",Pa),e.bind(window,"resize scroll orientationchange",f),Da("bindEvents")},Ra=function(){e.unbind(window,"resize scroll orientationchange",f),e.unbind(window,"scroll",r.scroll),e.unbind(document,"keydown",f),e.unbind(document,"mousemove",Pa),N.transform&&e.unbind(f.scrollWrap,"click",f),V&&e.unbind(window,p,f),clearTimeout(O),Da("unbindEvents")},Sa=function(a,b){var c=ic(f.currItem,qa,a);return b&&(da=c),c},Ta=function(a){return a||(a=f.currItem),a.initialZoomLevel},Ua=function(a){return a||(a=f.currItem),a.w>0?i.maxSpreadZoom:1},Va=function(a,b,c,d){return d===f.currItem.initialZoomLevel?(c[a]=f.currItem.initialPosition[a],!0):(c[a]=La(a,d),c[a]>b.min[a]?(c[a]=b.min[a],!0):c[a]1?1:a.fitRatio,c=a.container.style,d=b*a.w,e=b*a.h;c.width=d+"px",c.height=e+"px",c.left=a.initialPosition.x+"px",c.top=a.initialPosition.y+"px"},Ha=function(){if(ea){var a=ea,b=f.currItem,c=b.fitRatio>1?1:b.fitRatio,d=c*b.w,e=c*b.h;a.width=d+"px",a.height=e+"px",a.left=pa.x+"px",a.top=pa.y+"px"}}},Xa=function(a){var b="";i.escKey&&27===a.keyCode?b="close":i.arrowKeys&&(37===a.keyCode?b="prev":39===a.keyCode&&(b="next")),b&&(a.ctrlKey||a.altKey||a.shiftKey||a.metaKey||(a.preventDefault?a.preventDefault():a.returnValue=!1,f[b]()))},Ya=function(a){a&&(Y||X||fa||T)&&(a.preventDefault(),a.stopPropagation())},Za=function(){f.setScrollOffset(0,e.getScrollY())},$a={},_a=0,ab=function(a){$a[a]&&($a[a].raf&&I($a[a].raf),_a--,delete $a[a])},bb=function(a){$a[a]&&ab(a),$a[a]||(_a++,$a[a]={})},cb=function(){for(var a in $a)$a.hasOwnProperty(a)&&ab(a)},db=function(a,b,c,d,e,f,g){var h,i=Ea();bb(a);var j=function(){if($a[a]){if(h=Ea()-i,h>=d)return ab(a),f(c),void(g&&g());f((c-b)*e(h/d)+b),$a[a].raf=H(j)}};j()},eb={shout:Da,listen:Ca,viewportSize:qa,options:i,isMainScrollAnimating:function(){return fa},getZoomLevel:function(){return s},getCurrentIndex:function(){return m},isDragging:function(){return V},isZooming:function(){return aa},setScrollOffset:function(a,b){sa.x=a,M=sa.y=b,Da("updateScrollOffset",sa)},applyZoomPan:function(a,b,c,d){pa.x=b,pa.y=c,s=a,Ha(d)},init:function(){if(!j&&!k){var c;f.framework=e,f.template=a,f.bg=e.getChildByClass(a,"pswp__bg"),J=a.className,j=!0,N=e.detectFeatures(),H=N.raf,I=N.caf,E=N.transform,L=N.oldIE,f.scrollWrap=e.getChildByClass(a,"pswp__scroll-wrap"),f.container=e.getChildByClass(f.scrollWrap,"pswp__container"),n=f.container.style,f.itemHolders=y=[{el:f.container.children[0],wrap:0,index:-1},{el:f.container.children[1],wrap:0,index:-1},{el:f.container.children[2],wrap:0,index:-1}],y[0].el.style.display=y[2].el.style.display="none",Wa(),r={resize:f.updateSize,orientationchange:function(){clearTimeout(O),O=setTimeout(function(){qa.x!==f.scrollWrap.clientWidth&&f.updateSize()},500)},scroll:Za,keydown:Xa,click:Ya};var d=N.isOldIOSPhone||N.isOldAndroid||N.isMobileOpera;for(N.animationName&&N.transform&&!d||(i.showAnimationDuration=i.hideAnimationDuration=0),c=0;c=ac())&&(m=0),f.currItem=_b(m),(N.isOldIOSPhone||N.isOldAndroid)&&(va=!1),a.setAttribute("aria-hidden","false"),i.modal&&(va?a.style.position="fixed":(a.style.position="absolute",a.style.top=e.getScrollY()+"px")),void 0===M&&(Da("initialLayout"),M=K=e.getScrollY());var l="pswp--open ";for(i.mainClass&&(l+=i.mainClass+" "),i.showHideOpacity&&(l+="pswp--animate_opacity "),l+=G?"pswp--touch":"pswp--notouch",l+=N.animationName?" pswp--css_animation":"",l+=N.svg?" pswp--svg":"",e.addClass(a,l),f.updateSize(),o=-1,ua=null,c=0;cda.min.x?a=da.min.x:ada.min.y?b=da.min.y:b=h&&(o+=ua+(ua>0?-h:h),c=h);for(var d=0;d0?(b=y.shift(),y[h-1]=b,o++,Ja((o+2)*ta.x,b.el.style),f.setContent(b,m-c+d+1+1)):(b=y.pop(),y.unshift(b),o--,Ja(o*ta.x,b.el.style),f.setContent(b,m+c-d-1-1));if(ea&&1===Math.abs(ua)){var e=_b(z);e.initialZoomLevel!==s&&(ic(e,qa),mc(e),Ia(e))}ua=0,f.updateCurrZoomItem(),z=m,Da("afterChange")}}},updateSize:function(b){if(!va&&i.modal){var c=e.getScrollY();if(M!==c&&(a.style.top=c+"px",M=c),!b&&xa.x===window.innerWidth&&xa.y===window.innerHeight)return;xa.x=window.innerWidth,xa.y=window.innerHeight,a.style.height=xa.y+"px"}if(qa.x=f.scrollWrap.clientWidth,qa.y=f.scrollWrap.clientHeight,Za(),ta.x=qa.x+Math.round(qa.x*i.spacing),ta.y=qa.y,Ka(ta.x*ra),Da("beforeResize"),void 0!==o){for(var d,g,j,k=0;k2&&(j=Aa(j)),g=_b(j),g&&(x||g.needsUpdate||!g.bounds)?(f.cleanSlide(g),f.setContent(d,j),1===k&&(f.currItem=g,f.updateCurrZoomItem(!0)),g.needsUpdate=!1):d.index===-1&&j>=0&&f.setContent(d,j),g&&g.container&&(ic(g,qa),mc(g),Ia(g));x=!1}t=s=f.currItem.initialZoomLevel,da=f.currItem.bounds,da&&(pa.x=da.center.x,pa.y=da.center.y,Ha(!0)),Da("resize")},zoomTo:function(a,b,c,d,f){b&&(t=s,ub.x=Math.abs(b.x)-pa.x,ub.y=Math.abs(b.y)-pa.y,Ma(oa,pa));var g=Sa(a,!1),h={};Va("x",g,h,a),Va("y",g,h,a);var i=s,j={x:pa.x,y:pa.y};Na(h);var k=function(b){1===b?(s=a,pa.x=h.x,pa.y=h.y):(s=(a-i)*b+i,pa.x=(h.x-j.x)*b+j.x,pa.y=(h.y-j.y)*b+j.y),f&&f(b),Ha(1===b)};c?db("customZoomTo",0,1,c,d||e.easing.sine.inOut,k):k(1)}},fb=30,gb=10,hb={},ib={},jb={},kb={},lb={},mb=[],nb={},ob=[],pb={},qb=0,rb=ma(),sb=0,tb=ma(),ub=ma(),vb=ma(),wb=function(a,b){return a.x===b.x&&a.y===b.y},xb=function(a,b){return Math.abs(a.x-b.x)-1)&&(b(a)?a:Cb(a.parentNode,b)))},Db={},Eb=function(a,b){return Db.prevent=!Cb(a.target,i.isClickableElement),Da("preventDragEvent",a,b,Db),Db.prevent},Fb=function(a,b){return b.x=a.pageX,b.y=a.pageY,b.id=a.identifier,b},Gb=function(a,b,c){c.x=.5*(a.x+b.x),c.y=.5*(a.y+b.y)},Hb=function(a,b,c){if(a-Q>50){var d=ob.length>2?ob.shift():{};d.x=b,d.y=c,ob.push(d),Q=a}},Ib=function(){var a=pa.y-f.currItem.initialPosition.y;return 1-Math.abs(a/(qa.y/2))},Jb={},Kb={},Lb=[],Mb=function(a){for(;Lb.length>0;)Lb.pop();return F?(la=0,mb.forEach(function(a){0===la?Lb[0]=a:1===la&&(Lb[1]=a),la++})):a.type.indexOf("touch")>-1?a.touches&&a.touches.length>0&&(Lb[0]=Fb(a.touches[0],Jb),a.touches.length>1&&(Lb[1]=Fb(a.touches[1],Kb))):(Jb.x=a.pageX,Jb.y=a.pageY,Jb.id="",Lb[0]=Jb),Lb},Nb=function(a,b){var c,d,e,g,h=0,j=pa[a]+b[a],k=b[a]>0,l=tb.x+b.x,m=tb.x-nb.x;return c=j>da.min[a]||jda.min[a]&&(c=i.panEndFriction,h=da.min[a]-j,d=da.min[a]-oa[a]),(d<=0||m<0)&&ac()>1?(g=l,m<0&&l>nb.x&&(g=nb.x)):da.min.x!==da.max.x&&(e=j)):(j0)&&ac()>1?(g=l,m>0&&lf.currItem.fitRatio&&(pa[a]+=b[a]*c)):(void 0!==g&&(Ka(g,!0),$=g!==nb.x),da.min.x!==da.max.x&&(void 0!==e?pa.x=e:$||(pa.x+=b.x*c)),void 0!==g)},Ob=function(a){if(!("mousedown"===a.type&&a.button>0)){if($b)return void a.preventDefault();if(!U||"mousedown"!==a.type){if(Eb(a,!0)&&a.preventDefault(),Da("pointerDown"),F){var b=e.arraySearch(mb,a.pointerId,"id");b<0&&(b=mb.length),mb[b]={x:a.pageX,y:a.pageY,id:a.pointerId}}var c=Mb(a),d=c.length;_=null,cb(),V&&1!==d||(V=ha=!0,e.bind(window,p,f),S=ka=ia=T=$=Y=W=X=!1,ga=null,Da("firstTouchStart",c),Ma(oa,pa),na.x=na.y=0,Ma(kb,c[0]),Ma(lb,kb),nb.x=ta.x*ra,ob=[{x:kb.x,y:kb.y}],Q=P=Ea(),Sa(s,!0),zb(),Ab()),!aa&&d>1&&!fa&&!$&&(t=s,X=!1,aa=W=!0,na.y=na.x=0,Ma(oa,pa),Ma(hb,c[0]),Ma(ib,c[1]),Gb(hb,ib,vb),ub.x=Math.abs(vb.x)-pa.x,ub.y=Math.abs(vb.y)-pa.y,ba=ca=yb(hb,ib))}}},Pb=function(a){if(a.preventDefault(),F){var b=e.arraySearch(mb,a.pointerId,"id");if(b>-1){var c=mb[b];c.x=a.pageX,c.y=a.pageY}}if(V){var d=Mb(a);if(ga||Y||aa)_=d;else if(tb.x!==ta.x*ra)ga="h";else{var f=Math.abs(d[0].x-kb.x)-Math.abs(d[0].y-kb.y);Math.abs(f)>=gb&&(ga=f>0?"h":"v",_=d)}}},Qb=function(){if(_){var a=_.length;if(0!==a)if(Ma(hb,_[0]),jb.x=hb.x-kb.x,jb.y=hb.y-kb.y,aa&&a>1){if(kb.x=hb.x,kb.y=hb.y,!jb.x&&!jb.y&&wb(_[1],ib))return;Ma(ib,_[1]),X||(X=!0,Da("zoomGestureStarted"));var b=yb(hb,ib),c=Vb(b);c>f.currItem.initialZoomLevel+f.currItem.initialZoomLevel/15&&(ka=!0);var d=1,e=Ta(),g=Ua();if(c1&&(d=1),c=e-d*(e/3);else c>g&&(d=(c-g)/(6*e),d>1&&(d=1),c=g+d*e);d<0&&(d=0),ba=b,Gb(hb,ib,rb),na.x+=rb.x-vb.x,na.y+=rb.y-vb.y,Ma(vb,rb),pa.x=La("x",c),pa.y=La("y",c),S=c>s,s=c,Ha()}else{if(!ga)return;if(ha&&(ha=!1,Math.abs(jb.x)>=gb&&(jb.x-=_[0].x-lb.x),Math.abs(jb.y)>=gb&&(jb.y-=_[0].y-lb.y)),kb.x=hb.x,kb.y=hb.y,0===jb.x&&0===jb.y)return;if("v"===ga&&i.closeOnVerticalDrag&&!Bb()){na.y+=jb.y,pa.y+=jb.y;var k=Ib();return T=!0,Da("onVerticalDrag",k),Fa(k),void Ha()}Hb(Ea(),hb.x,hb.y),Y=!0,da=f.currItem.bounds;var l=Nb("x",jb);l||(Nb("y",jb),Na(pa),Ha())}}},Rb=function(a){if(N.isOldAndroid){if(U&&"mouseup"===a.type)return;a.type.indexOf("touch")>-1&&(clearTimeout(U),U=setTimeout(function(){U=0},600))}Da("pointerUp"),Eb(a,!1)&&a.preventDefault();var b;if(F){var c=e.arraySearch(mb,a.pointerId,"id");if(c>-1)if(b=mb.splice(c,1)[0],navigator.msPointerEnabled){var d={4:"mouse",2:"touch",3:"pen"};b.type=d[a.pointerType],b.type||(b.type=a.pointerType||"mouse")}else b.type=a.pointerType||"mouse"}var g,h=Mb(a),j=h.length;if("mouseup"===a.type&&(j=0),2===j)return _=null,!0;1===j&&Ma(lb,h[0]),0!==j||ga||fa||(b||("mouseup"===a.type?b={x:a.pageX,y:a.pageY,type:"mouse"}:a.changedTouches&&a.changedTouches[0]&&(b={x:a.changedTouches[0].pageX,y:a.changedTouches[0].pageY,type:"touch"})),Da("touchRelease",a,b));var k=-1;if(0===j&&(V=!1,e.unbind(window,p,f),zb(),aa?k=0:sb!==-1&&(k=Ea()-sb)),sb=1===j?Ea():-1,g=k!==-1&&k<150?"zoom":"swipe",aa&&j<2&&(aa=!1,1===j&&(g="zoomPointerUp"),Da("zoomGestureEnded")),_=null,Y||X||fa||T)if(cb(),R||(R=Sb()),R.calculateSwipeSpeed("x"),T){var l=Ib();if(lf.currItem.fitRatio&&Tb(R))}},Sb=function(){var a,b,c={lastFlickOffset:{},lastFlickDist:{},lastFlickSpeed:{},slowDownRatio:{},slowDownRatioReverse:{},speedDecelerationRatio:{},speedDecelerationRatioAbs:{},distanceOffset:{},backAnimDestination:{},backAnimStarted:{},calculateSwipeSpeed:function(d){ob.length>1?(a=Ea()-Q+50,b=ob[ob.length-2][d]):(a=Ea()-P,b=lb[d]),c.lastFlickOffset[d]=kb[d]-b,c.lastFlickDist[d]=Math.abs(c.lastFlickOffset[d]),c.lastFlickDist[d]>20?c.lastFlickSpeed[d]=c.lastFlickOffset[d]/a:c.lastFlickSpeed[d]=0,Math.abs(c.lastFlickSpeed[d])<.1&&(c.lastFlickSpeed[d]=0),c.slowDownRatio[d]=.95,c.slowDownRatioReverse[d]=1-c.slowDownRatio[d],c.speedDecelerationRatio[d]=1},calculateOverBoundsAnimOffset:function(a,b){c.backAnimStarted[a]||(pa[a]>da.min[a]?c.backAnimDestination[a]=da.min[a]:pa[a]fb&&(h||b.lastFlickOffset.x>20)?d=-1:g<-fb&&(h||b.lastFlickOffset.x<-20)&&(d=1)}var j;d&&(m+=d,m<0?(m=i.loop?ac()-1:0,j=!0):m>=ac()&&(m=i.loop?0:ac()-1,j=!0),j&&!i.loop||(ua+=d,ra-=d,c=!0));var k,l=ta.x*ra,n=Math.abs(l-tb.x);return c||l>tb.x==b.lastFlickSpeed.x>0?(k=Math.abs(b.lastFlickSpeed.x)>0?n/Math.abs(b.lastFlickSpeed.x):333,k=Math.min(k,400),k=Math.max(k,250)):k=333,qb===m&&(c=!1),fa=!0,Da("mainScrollAnimStart"),db("mainScroll",tb.x,l,k,e.easing.cubic.out,Ka,function(){cb(),fa=!1,qb=-1,(c||qb!==m)&&f.updateCurrItem(),Da("mainScrollAnimComplete")}),c&&f.updateCurrItem(!0),c},Vb=function(a){return 1/ca*a*t},Wb=function(){var a=s,b=Ta(),c=Ua();sc&&(a=c);var d,g=1,h=ja;return ia&&!S&&!ka&&s1||navigator.msMaxTouchPoints>1),f.likelyTouchDevice=G,r[A]=Ob,r[B]=Pb,r[C]=Rb,D&&(r[D]=r[C]),N.touch&&(q+=" mousedown",p+=" mousemove mouseup",r.mousedown=r[A],r.mousemove=r[B],r.mouseup=r[C]),G||(i.allowPanToNext=!1)}}});var Xb,Yb,Zb,$b,_b,ac,bc,cc=function(b,c,d,g){Xb&&clearTimeout(Xb),$b=!0,Zb=!0;var h;b.initialLayout?(h=b.initialLayout,b.initialLayout=null):h=i.getThumbBoundsFn&&i.getThumbBoundsFn(m);var j=d?i.hideAnimationDuration:i.showAnimationDuration,k=function(){ab("initialZoom"),d?(f.template.removeAttribute("style"),f.bg.removeAttribute("style")):(Fa(1),c&&(c.style.display="block"),e.addClass(a,"pswp--animated-in"),Da("initialZoom"+(d?"OutEnd":"InEnd"))),g&&g(),$b=!1};if(!j||!h||void 0===h.x)return Da("initialZoom"+(d?"Out":"In")),s=b.initialZoomLevel,Ma(pa,b.initialPosition),Ha(),a.style.opacity=d?0:1,Fa(1),void(j?setTimeout(function(){k()},j):k());var n=function(){var c=l,g=!f.currItem.src||f.currItem.loadError||i.showHideOpacity;b.miniImg&&(b.miniImg.style.webkitBackfaceVisibility="hidden"),d||(s=h.w/b.w,pa.x=h.x,pa.y=h.y-K,f[g?"template":"bg"].style.opacity=.001,Ha()),bb("initialZoom"),d&&!c&&e.removeClass(a,"pswp--animated-in"),g&&(d?e[(c?"remove":"add")+"Class"](a,"pswp--animate_opacity"):setTimeout(function(){e.addClass(a,"pswp--animate_opacity")},30)),Xb=setTimeout(function(){if(Da("initialZoom"+(d?"Out":"In")),d){var f=h.w/b.w,i={x:pa.x,y:pa.y},l=s,m=ja,n=function(b){1===b?(s=f,pa.x=h.x,pa.y=h.y-M):(s=(f-l)*b+l,pa.x=(h.x-i.x)*b+i.x,pa.y=(h.y-M-i.y)*b+i.y),Ha(),g?a.style.opacity=1-b:Fa(m-b*m)};c?db("initialZoom",0,1,j,e.easing.cubic.out,n,k):(n(1),Xb=setTimeout(k,j+20))}else s=b.initialZoomLevel,Ma(pa,b.initialPosition),Ha(),Fa(1),g?a.style.opacity=1:Fa(1),Xb=setTimeout(k,j+20)},d?25:90)};n()},dc={},ec=[],fc={index:0,errorMsg:'
The image could not be loaded.
',forceProgressiveLoading:!1,preload:[1,1],getNumItemsFn:function(){return Yb.length}},gc=function(){return{center:{x:0,y:0},max:{x:0,y:0},min:{x:0,y:0}}},hc=function(a,b,c){var d=a.bounds;d.center.x=Math.round((dc.x-b)/2),d.center.y=Math.round((dc.y-c)/2)+a.vGap.top,d.max.x=b>dc.x?Math.round(dc.x-b):d.center.x,d.max.y=c>dc.y?Math.round(dc.y-c)+a.vGap.top:d.center.y,d.min.x=b>dc.x?0:d.center.x,d.min.y=c>dc.y?a.vGap.top:d.center.y},ic=function(a,b,c){if(a.src&&!a.loadError){var d=!c;if(d&&(a.vGap||(a.vGap={top:0,bottom:0}),Da("parseVerticalMargin",a)),dc.x=b.x,dc.y=b.y-a.vGap.top-a.vGap.bottom,d){var e=dc.x/a.w,f=dc.y/a.h;a.fitRatio=e1&&(c=1),a.initialZoomLevel=c,a.bounds||(a.bounds=gc())}if(!c)return;return hc(a,a.w*c,a.h*c),d&&c===a.initialZoomLevel&&(a.initialPosition=a.bounds.center),a.bounds}return a.w=a.h=0,a.initialZoomLevel=a.fitRatio=1,a.bounds=gc(),a.initialPosition=a.bounds.center,a.bounds},jc=function(a,b,c,d,e,g){b.loadError||d&&(b.imageAppended=!0,mc(b,d,b===f.currItem&&ya),c.appendChild(d),g&&setTimeout(function(){b&&b.loaded&&b.placeholder&&(b.placeholder.style.display="none",b.placeholder=null)},500))},kc=function(a){a.loading=!0,a.loaded=!1;var b=a.img=e.createEl("pswp__img","img"),c=function(){a.loading=!1,a.loaded=!0,a.loadComplete?a.loadComplete(a):a.img=null,b.onload=b.onerror=null,b=null};return b.onload=c,b.onerror=function(){a.loadError=!0,c()},b.src=a.src,b},lc=function(a,b){if(a.src&&a.loadError&&a.container)return b&&(a.container.innerHTML=""),a.container.innerHTML=i.errorMsg.replace("%url%",a.src),!0},mc=function(a,b,c){if(a.src){b||(b=a.container.lastChild);var d=c?a.w:Math.round(a.w*a.fitRatio),e=c?a.h:Math.round(a.h*a.fitRatio);a.placeholder&&!a.loaded&&(a.placeholder.style.width=d+"px",a.placeholder.style.height=e+"px"),b.style.width=d+"px",b.style.height=e+"px"}},nc=function(){if(ec.length){for(var a,b=0;b=0,e=Math.min(c[0],ac()),g=Math.min(c[1],ac());for(b=1;b<=(d?g:e);b++)f.lazyLoadItem(m+b);for(b=1;b<=(d?e:g);b++)f.lazyLoadItem(m-b)}),Ca("initialLayout",function(){f.currItem.initialLayout=i.getThumbBoundsFn&&i.getThumbBoundsFn(m)}),Ca("mainScrollAnimComplete",nc),Ca("initialZoomInEnd",nc),Ca("destroy",function(){for(var a,b=0;b=0&&(void 0!==Yb[a]&&Yb[a])},allowProgressiveImg:function(){return i.forceProgressiveLoading||!G||i.mouseUsed||screen.width>1200},setContent:function(a,b){i.loop&&(b=Aa(b));var c=f.getItemAt(a.index);c&&(c.container=null);var d,g=f.getItemAt(b);if(!g)return void(a.el.innerHTML="");Da("gettingData",b,g),a.index=b,a.item=g;var h=g.container=e.createEl("pswp__zoom-wrap");if(!g.src&&g.html&&(g.html.tagName?h.appendChild(g.html):h.innerHTML=g.html),lc(g),ic(g,qa),!g.src||g.loadError||g.loaded)g.src&&!g.loadError&&(d=e.createEl("pswp__img","img"),d.style.opacity=1,d.src=g.src,mc(g,d),jc(b,g,h,d,!0));else{if(g.loadComplete=function(c){if(j){if(a&&a.index===b){if(lc(c,!0))return c.loadComplete=c.img=null,ic(c,qa),Ia(c),void(a.index===m&&f.updateCurrZoomItem());c.imageAppended?!$b&&c.placeholder&&(c.placeholder.style.display="none",c.placeholder=null):N.transform&&(fa||$b)?ec.push({item:c,baseDiv:h,img:c.img,index:b,holder:a,clearPlaceholder:!0}):jc(b,c,h,c.img,fa||$b,!0)}c.loadComplete=null,c.img=null,Da("imageLoadComplete",b,c)}},e.features.transform){var k="pswp__img pswp__img--placeholder";k+=g.msrc?"":" pswp__img--placeholder--blank";var l=e.createEl(k,g.msrc?"img":"");g.msrc&&(l.src=g.msrc),mc(g,l),h.appendChild(l),g.placeholder=l}g.loading||kc(g),f.allowProgressiveImg()&&(!Zb&&N.transform?ec.push({item:g,baseDiv:h,img:g.img,index:b,holder:a}):jc(b,g,h,g.img,!0,!0))}Zb||b!==m?Ia(g):(ea=h.style,cc(g,d||g.img)),a.el.innerHTML="",a.el.appendChild(h)},cleanSlide:function(a){a.img&&(a.img.onload=a.img.onerror=null),a.loaded=a.loading=a.img=a.imageAppended=!1}}});var oc,pc={},qc=function(a,b,c){var d=document.createEvent("CustomEvent"),e={origEvent:a,target:a.target,releasePoint:b,pointerType:c||"touch"};d.initCustomEvent("pswpTap",!0,!0,e),a.target.dispatchEvent(d)};za("Tap",{publicMethods:{initTap:function(){Ca("firstTouchStart",f.onTapStart),Ca("touchRelease",f.onTapRelease),Ca("destroy",function(){pc={},oc=null})},onTapStart:function(a){a.length>1&&(clearTimeout(oc),oc=null)},onTapRelease:function(a,b){if(b&&!Y&&!W&&!_a){var c=b;if(oc&&(clearTimeout(oc),oc=null,xb(c,pc)))return void Da("doubleTap",c);if("mouse"===b.type)return void qc(a,b,"mouse");var d=a.target.tagName.toUpperCase();if("BUTTON"===d||e.hasClass(a.target,"pswp__single-tap"))return void qc(a,b);Ma(pc,c),oc=setTimeout(function(){qc(a,b),oc=null},300)}}}});var rc;za("DesktopZoom",{publicMethods:{initDesktopZoom:function(){L||(G?Ca("mouseUsed",function(){f.setupDesktopZoom()}):f.setupDesktopZoom(!0))},setupDesktopZoom:function(b){rc={};var c="wheel mousewheel DOMMouseScroll";Ca("bindEvents",function(){e.bind(a,c,f.handleMouseWheel)}),Ca("unbindEvents",function(){rc&&e.unbind(a,c,f.handleMouseWheel)}),f.mouseZoomedIn=!1;var d,g=function(){f.mouseZoomedIn&&(e.removeClass(a,"pswp--zoomed-in"),f.mouseZoomedIn=!1),s<1?e.addClass(a,"pswp--zoom-allowed"):e.removeClass(a,"pswp--zoom-allowed"),h()},h=function(){d&&(e.removeClass(a,"pswp--dragging"),d=!1)};Ca("resize",g),Ca("afterChange",g),Ca("pointerDown",function(){f.mouseZoomedIn&&(d=!0,e.addClass(a,"pswp--dragging"))}),Ca("pointerUp",h),b||g()},handleMouseWheel:function(a){if(s<=f.currItem.fitRatio)return i.modal&&(!i.closeOnScroll||_a||V?a.preventDefault():E&&Math.abs(a.deltaY)>2&&(l=!0,f.close())),!0;if(a.stopPropagation(),rc.x=0,"deltaX"in a)1===a.deltaMode?(rc.x=18*a.deltaX,rc.y=18*a.deltaY):(rc.x=a.deltaX,rc.y=a.deltaY);else if("wheelDelta"in a)a.wheelDeltaX&&(rc.x=-.16*a.wheelDeltaX),a.wheelDeltaY?rc.y=-.16*a.wheelDeltaY:rc.y=-.16*a.wheelDelta;else{if(!("detail"in a))return;rc.y=a.detail}Sa(s,!0);var b=pa.x-rc.x,c=pa.y-rc.y;(i.modal||b<=da.min.x&&b>=da.max.x&&c<=da.min.y&&c>=da.max.y)&&a.preventDefault(),f.panTo(b,c)},toggleDesktopZoom:function(b){b=b||{x:qa.x/2+sa.x,y:qa.y/2+sa.y};var c=i.getDoubleTapZoom(!0,f.currItem),d=s===c;f.mouseZoomedIn=!d,f.zoomTo(d?f.currItem.initialZoomLevel:c,b,333),e[(d?"remove":"add")+"Class"](a,"pswp--zoomed-in")}}});var sc,tc,uc,vc,wc,xc,yc,zc,Ac,Bc,Cc,Dc,Ec={history:!0,galleryUID:1},Fc=function(){return Cc.hash.substring(1)},Gc=function(){sc&&clearTimeout(sc),uc&&clearTimeout(uc)},Hc=function(){var a=Fc(),b={};if(a.length<5)return b;var c,d=a.split("&");for(c=0;c-1&&(yc=yc.substring(0,b),"&"===yc.slice(-1)&&(yc=yc.slice(0,-1))),setTimeout(function(){j&&e.bind(window,"hashchange",f.onHashChange)},40)}},onHashChange:function(){return Fc()===yc?(Ac=!0,void f.close()):void(vc||(wc=!0,f.goTo(Hc().pid),wc=!1))},updateURL:function(){Gc(),wc||(zc?sc=setTimeout(Ic,800):Ic())}}}),e.extend(f,eb)};return a}); \ No newline at end of file diff --git a/public/js/viewer-js/viewer.min.js b/public/js/viewer-js/viewer.min.js new file mode 100644 index 00000000..bd1d78db --- /dev/null +++ b/public/js/viewer-js/viewer.min.js @@ -0,0 +1,10 @@ +/*! + * Viewer.js v1.10.2 + * https://fengyuanchen.github.io/viewerjs + * + * Copyright 2015-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2021-10-22T13:59:51.046Z + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Viewer=e()}(this,function(){"use strict";function e(e,t){var i,n=Object.keys(e);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(e),t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)),n}function l(n){for(var t=1;t=this.length||this.viewed&&t===this.index)return this;if(!this.isShown)return this.index=t,this.show();this.viewing&&this.viewing.abort();var e=this.element,n=this.options,o=this.title,s=this.canvas,a=this.items[t],r=a.querySelector("img"),h=gt(r,"originalUrl"),l=r.getAttribute("alt"),c=document.createElement("img");if(ot(n.inheritedAttributes,function(t){var e=r.getAttribute(t);null!==e&&c.setAttribute(t,e)}),c.src=h,c.alt=l,nt(n.view)&&yt(e,"view",n.view,{once:!0}),!1===xt(e,"view",{originalImage:this.images[t],index:t,image:c})||!this.isShown||this.hiding||this.played)return this;h=this.items[this.index];h&&(ct(h,f),h.removeAttribute("aria-selected")),lt(a,f),a.setAttribute("aria-selected",!0),n.focus&&a.focus(),this.image=c,this.viewed=!1,this.index=t,this.imageData={},lt(c,D),n.loading&<(s,T),s.innerHTML="",s.appendChild(c),this.renderList(),o.innerHTML="";function u(){var t=i.imageData,e=Array.isArray(n.title)?n.title[1]:n.title;o.innerHTML=_(t=nt(e)?e.call(i,c,t):"".concat(l," (").concat(t.naturalWidth," × ").concat(t.naturalHeight,")"))?t.replace(/&(?!amp;|quot;|#39;|lt;|gt;)/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">"):t}var d,m;return yt(e,V,u,{once:!0}),this.viewing={abort:function(){wt(e,V,u),c.complete?i.imageRendering?i.imageRendering.abort():i.imageInitializing&&i.imageInitializing.abort():(c.src="",wt(c,N,d),i.timeout&&clearTimeout(i.timeout))}},c.complete?this.load():(yt(c,N,d=function(){wt(c,Y,m),i.load()},{once:!0}),yt(c,Y,m=function(){wt(c,N,d),i.timeout&&(clearTimeout(i.timeout),i.timeout=!1),ct(c,D),n.loading&&ct(i.canvas,T)},{once:!0}),this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(function(){ct(c,D),i.timeout=!1},1e3)),this},prev:function(){var t=this.index-1;return t<0&&(t=0Math.abs(r)&&(this.pointers={},1
',n=(i=d.querySelector(".".concat(g,"-container"))).querySelector(".".concat(g,"-title")),o=i.querySelector(".".concat(g,"-toolbar")),a=i.querySelector(".".concat(g,"-navbar")),m=i.querySelector(".".concat(g,"-button")),d=i.querySelector(".".concat(g,"-canvas")),this.parent=e,this.viewer=i,this.title=n,this.toolbar=o,this.navbar=a,this.button=m,this.canvas=d,this.footer=i.querySelector(".".concat(g,"-footer")),this.tooltipBox=i.querySelector(".".concat(g,"-tooltip")),this.player=i.querySelector(".".concat(g,"-player")),this.list=i.querySelector(".".concat(g,"-list")),i.id="".concat(g).concat(this.id),n.id="".concat(g,"Title").concat(this.id),lt(n,s.title?Tt(Array.isArray(s.title)?s.title[0]:s.title):y),lt(a,s.navbar?Tt(s.navbar):y),ut(m,y,!s.button),s.keyboard&&m.setAttribute("tabindex",0),s.backdrop&&(lt(i,"".concat(g,"-backdrop")),s.inline||"static"===s.backdrop||ft(d,K,"hide")),_(s.className)&&s.className&&s.className.split(Z).forEach(function(t){lt(i,t)}),s.toolbar?(r=document.createElement("ul"),h=it(s.toolbar),l=$.slice(0,3),c=$.slice(7,9),u=$.slice(9),h||lt(o,Tt(s.toolbar)),ot(h?s.toolbar:$,function(t,e){var i=h&&it(t),n=h?mt(e):t,o=i&&!Q(t.show)?t.show:t;!o||!s.zoomable&&-1!==l.indexOf(n)||!s.rotatable&&-1!==c.indexOf(n)||!s.scalable&&-1!==u.indexOf(n)||(e=i&&!Q(t.size)?t.size:t,i=i&&!Q(t.click)?t.click:t,t=document.createElement("li"),s.keyboard&&t.setAttribute("tabindex",0),t.setAttribute("role","button"),lt(t,"".concat(g,"-").concat(n)),nt(i)||ft(t,K,n),J(o)&<(t,Tt(o)),-1!==["small","large"].indexOf(e)?lt(t,"".concat(g,"-").concat(e)):"play"===n&<(t,"".concat(g,"-large")),nt(i)&&yt(t,O,i),r.appendChild(t))}),o.appendChild(r)):lt(o,y),s.rotatable||(lt(d=o.querySelectorAll('li[class*="rotate"]'),D),ot(d,function(t){o.appendChild(t)})),s.inline?(lt(m,w),rt(i,{zIndex:s.zIndexInline}),"static"===window.getComputedStyle(e).position&&rt(e,{position:"relative"}),e.insertBefore(i,t.nextSibling)):(lt(m,v),lt(i,b),lt(i,p),lt(i,y),rt(i,{zIndex:s.zIndex}),(m=(m=_(m=s.container)?t.ownerDocument.querySelector(m):m)||this.body).appendChild(i)),s.inline&&(this.render(),this.bind(),this.isShown=!0),this.ready=!0,nt(s.ready)&&yt(t,H,s.ready,{once:!0}),!1!==xt(t,H)?this.ready&&s.inline&&this.view(this.index):this.ready=!1)}}])&&o(t.prototype,e),n&&o(t,n),i}();return st(n.prototype,At,r,t,St,Ot),n}); \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index eb19ced5..35827fd3 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -9,13 +9,7 @@ "/js/blueimp-load-image/load-image.all.min.js": "/js/blueimp-load-image/load-image.all.min.js", "/css/justified-gallery/justifiedGallery.min.css": "/css/justified-gallery/justifiedGallery.min.css", "/js/justified-gallery/jquery.justifiedGallery.min.js": "/js/justified-gallery/jquery.justifiedGallery.min.js", - "/css/photo-swipe/photoswipe.css": "/css/photo-swipe/photoswipe.css", - "/css/photo-swipe/default-skin/default-skin.css": "/css/photo-swipe/default-skin/default-skin.css", - "/css/photo-swipe/default-skin/default-skin.png": "/css/photo-swipe/default-skin/default-skin.png", - "/css/photo-swipe/default-skin/default-skin.svg": "/css/photo-swipe/default-skin/default-skin.svg", - "/css/photo-swipe/default-skin/preloader.gif": "/css/photo-swipe/default-skin/preloader.gif", - "/js/photo-swipe/photoswipe.min.js": "/js/photo-swipe/photoswipe.min.js", - "/js/photo-swipe/photoswipe-ui-default.min.js": "/js/photo-swipe/photoswipe-ui-default.min.js", - "/js/photo-swipe/jquery.photoswipe-global.js": "/js/photo-swipe/jquery.photoswipe-global.js", + "/css/viewer-js/viewer.min.css": "/css/viewer-js/viewer.min.css", + "/js/viewer-js/viewer.min.js": "/js/viewer-js/viewer.min.js", "/js/clipboard/clipboard.min.js": "/js/clipboard/clipboard.min.js" } diff --git a/resources/css/common.less b/resources/css/common.less index 9964366e..ca679ac6 100644 --- a/resources/css/common.less +++ b/resources/css/common.less @@ -30,3 +30,7 @@ progress::-webkit-progress-value { .toast-close-button { right: -0.15em; } + +.viewer-backdrop { + background-color: rgba(0, 0, 0, .75); +} diff --git a/resources/views/components/container.blade.php b/resources/views/components/container.blade.php new file mode 100644 index 00000000..09d73bb4 --- /dev/null +++ b/resources/views/components/container.blade.php @@ -0,0 +1,5 @@ +@props(['full' => request()->routeIs('images')]) + +
merge(['class' => $full ? 'mx-auto sm:ml-64' : 'mx-auto sm:ml-64 px-6 md:px-10 lg:px-10 xl:px-10 2xl:px-60']) }}> + {{ $slot }} +
diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php index 5702b814..9bc0b876 100644 --- a/resources/views/components/dropdown.blade.php +++ b/resources/views/components/dropdown.blade.php @@ -12,7 +12,7 @@ x-transition:leave="transition ease-in duration-75" x-transition:leave-start="transform opacity-100 scale-100" x-transition:leave-end="transform opacity-0 scale-95" - class="absolute z-[1] {{ $classes[$direction] }} mt-2 w-48 rounded-md shadow-lg py-1 bg-white ring-1 ring-black ring-opacity-5 focus:outline-none" + class="absolute z-[9] {{ $classes[$direction] }} mt-2 w-48 rounded-md shadow-lg py-1 bg-white ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" aria-orientation="vertical" aria-labelledby="user-menu-button" diff --git a/resources/views/components/loading-spin.blade.php b/resources/views/components/loading-spin.blade.php index f618865a..8b981c7d 100644 --- a/resources/views/components/loading-spin.blade.php +++ b/resources/views/components/loading-spin.blade.php @@ -1,4 +1,4 @@ - +merge(['class' => 'animate-spin -ml-1 mr-3 h-5 w-5 text-white']) }} xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> diff --git a/resources/views/images.blade.php b/resources/views/images.blade.php index 964c1b6f..7e490359 100644 --- a/resources/views/images.blade.php +++ b/resources/views/images.blade.php @@ -2,68 +2,145 @@ @push('styles') - - + @endpush -
- -
- - - 选中项 - +
+ + +
+ + + 选中项 + - - 移动到相册 - 标记为不健康 - 公开 - 删除 - - -
-
- - - - 排序 - + + 移动到相册 + 标记为不健康 + 公开 + 删除 + + +
+
+ + + + 排序 + - - 最新 - 最早 - 最大 - 最小 - - -
+ + 最新 + 最早 + 最大 + 最小 + + +
+
-
- @foreach(Auth::user()->images()->get() as $image) - - - - @endforeach + +
+ + + + @push('scripts') - + @endpush diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 3372909a..6f0ca3c1 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -1,5 +1,4 @@ -@props(['full' => request()->routeIs('images')]) @@ -13,11 +12,11 @@ + @stack('styles') - @stack('styles') @@ -25,7 +24,7 @@
@include('layouts.sidebar') - @include('layouts.header', ['full' => $full]) + @include('layouts.header')
-
-
- {{ $slot }} -
-
+ + {{ $slot }} +
@stack('scripts') diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php index a3da1e2d..9a8f9cf7 100644 --- a/resources/views/layouts/guest.blade.php +++ b/resources/views/layouts/guest.blade.php @@ -12,11 +12,11 @@ + @stack('styles') - @stack('styles') diff --git a/resources/views/layouts/header.blade.php b/resources/views/layouts/header.blade.php index 9d6b5899..870260ec 100644 --- a/resources/views/layouts/header.blade.php +++ b/resources/views/layouts/header.blade.php @@ -1,7 +1,5 @@ -@props(['full' => false]) - -
-
+
+ +
diff --git a/routes/web.php b/routes/web.php index 658febe3..6fb7ab95 100644 --- a/routes/web.php +++ b/routes/web.php @@ -21,7 +21,7 @@ Route::post('/upload', [Controller::class, 'upload']); Route::group(['middleware' => ['auth']], function () { Route::get('/dashboard', [UserController::class, 'dashboard'])->name('dashboard'); Route::get('/upload', fn () => view('upload'))->name('upload'); - Route::get('/images', [ImageController::class, 'index'])->name('images'); + Route::any('/images', [ImageController::class, 'index'])->name('images'); }); require __DIR__.'/auth.php'; diff --git a/webpack.mix.js b/webpack.mix.js index 049d8cea..86a55090 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -28,13 +28,9 @@ mix.copy('node_modules/blueimp-load-image/js/load-image.all.min.js', 'public/js/ mix.copy('node_modules/justifiedGallery/dist/css/justifiedGallery.min.css', 'public/css/justified-gallery'); mix.copy('node_modules/justifiedGallery/dist/js/jquery.justifiedGallery.min.js', 'public/js/justified-gallery'); -// photoSwipe -mix.copy('node_modules/photoswipe/dist/photoswipe.css', 'public/css/photo-swipe'); -mix.copy('node_modules/photoswipe/dist/default-skin', 'public/css/photo-swipe/default-skin'); -mix.copy('node_modules/photoswipe/dist/photoswipe.min.js', 'public/js/photo-swipe'); -mix.copy('node_modules/photoswipe/dist/photoswipe-ui-default.min.js', 'public/js/photo-swipe') -// jquery Photoswipe -mix.copy('node_modules/jquery.photoswipe/dist/jquery.photoswipe-global.js', 'public/js/photo-swipe') +// viewer.js +mix.copy('node_modules/viewerjs/dist/viewer.min.css', 'public/css/viewer-js') +mix.copy('node_modules/viewerjs/dist/viewer.min.js', 'public/js/viewer-js') // clipboard mix.copy('node_modules/clipboard/dist/clipboard.min.js', 'public/js/clipboard')