From 4518bfdbceaed635b424fc630f8d460aaebb0b11 Mon Sep 17 00:00:00 2001 From: WispX Date: Sun, 19 Dec 2021 22:31:14 +0800 Subject: [PATCH] =?UTF-8?q?:lipstick:=20=E5=AE=8C=E5=96=84=E6=88=91?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E7=89=87=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/User/ImageController.php | 17 +- app/Models/Image.php | 7 +- package-lock.json | 17 +- package.json | 4 +- public/css/app.css | 100 +- public/css/common.css | 3 + .../photo-swipe/default-skin/default-skin.css | 482 -- .../photo-swipe/default-skin/default-skin.png | Bin 547 -> 0 bytes .../photo-swipe/default-skin/default-skin.svg | 1 - .../photo-swipe/default-skin/preloader.gif | Bin 866 -> 0 bytes public/css/photo-swipe/photoswipe.css | 179 - public/css/viewer-js/viewer.min.css | 9 + .../photo-swipe/jquery.photoswipe-global.js | 4807 ----------------- .../photo-swipe/photoswipe-ui-default.min.js | 4 - public/js/photo-swipe/photoswipe.min.js | 4 - public/js/viewer-js/viewer.min.js | 10 + public/mix-manifest.json | 10 +- resources/css/common.less | 4 + .../views/components/container.blade.php | 5 + resources/views/components/dropdown.blade.php | 2 +- .../views/components/loading-spin.blade.php | 2 +- resources/views/images.blade.php | 173 +- resources/views/layouts/app.blade.php | 13 +- resources/views/layouts/guest.blade.php | 2 +- resources/views/layouts/header.blade.php | 8 +- routes/web.php | 2 +- webpack.mix.js | 10 +- 27 files changed, 304 insertions(+), 5571 deletions(-) delete mode 100644 public/css/photo-swipe/default-skin/default-skin.css delete mode 100644 public/css/photo-swipe/default-skin/default-skin.png delete mode 100644 public/css/photo-swipe/default-skin/default-skin.svg delete mode 100644 public/css/photo-swipe/default-skin/preloader.gif delete mode 100644 public/css/photo-swipe/photoswipe.css create mode 100644 public/css/viewer-js/viewer.min.css delete mode 100644 public/js/photo-swipe/jquery.photoswipe-global.js delete mode 100644 public/js/photo-swipe/photoswipe-ui-default.min.js delete mode 100644 public/js/photo-swipe/photoswipe.min.js create mode 100644 public/js/viewer-js/viewer.min.js create mode 100644 resources/views/components/container.blade.php 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