add assets
23
assets/Gallery-3.3.0/LICENSE.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright © 2013 Sebastian Tschan, https://blueimp.net
|
||||||
|
|
||||||
|
Swipe implementation based on: https://github.com/thebird/Swipe
|
||||||
|
Copyright © 2013 Brad Birdsall, https://github.com/thebird
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
1449
assets/Gallery-3.3.0/README.md
Normal file
97
assets/Gallery-3.3.0/css/blueimp-gallery-indicator.css
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
/*
|
||||||
|
* blueimp Gallery Indicator CSS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
.blueimp-gallery > .indicator {
|
||||||
|
position: absolute;
|
||||||
|
top: auto;
|
||||||
|
right: 15px;
|
||||||
|
bottom: 15px;
|
||||||
|
left: 15px;
|
||||||
|
margin: 0 40px;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 10px;
|
||||||
|
display: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .indicator > li {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
width: 9px;
|
||||||
|
height: 9px;
|
||||||
|
margin: 6px 3px 0 3px;
|
||||||
|
-webkit-box-sizing: content-box;
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
background: #ccc;
|
||||||
|
background: rgba(255, 255, 255, 0.25) center no-repeat;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 2px #000;
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IE7 fixes */
|
||||||
|
* + html .blueimp-gallery > .indicator > li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueimp-gallery > .indicator > li:hover,
|
||||||
|
.blueimp-gallery > .indicator > .active {
|
||||||
|
background-color: #fff;
|
||||||
|
border-color: #fff;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueimp-gallery > .indicator > li:after {
|
||||||
|
opacity: 0;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
content: '';
|
||||||
|
top: -5em;
|
||||||
|
left: 4px;
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
transition: transform 600ms ease-out, opacity 400ms ease-out;
|
||||||
|
transform: translateX(-50%) translateY(0) translateZ(0px);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueimp-gallery > .indicator > li:hover:after {
|
||||||
|
opacity: 1;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: inherit;
|
||||||
|
transform: translateX(-50%) translateY(-5px) translateZ(0px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueimp-gallery > .indicator > .active:after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueimp-gallery-controls > .indicator {
|
||||||
|
display: block;
|
||||||
|
/* Fix z-index issues (controls behind slide element) on Android: */
|
||||||
|
-webkit-transform: translateZ(0);
|
||||||
|
-moz-transform: translateZ(0);
|
||||||
|
-ms-transform: translateZ(0);
|
||||||
|
-o-transform: translateZ(0);
|
||||||
|
transform: translateZ(0);
|
||||||
|
}
|
||||||
|
.blueimp-gallery-single > .indicator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
69
assets/Gallery-3.3.0/css/blueimp-gallery-video.css
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
/*
|
||||||
|
* blueimp Gallery Video Factory CSS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-content > video,
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-content > iframe,
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-content > .video-cover {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-content > .video-cover {
|
||||||
|
background: center no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-iframe > .video-cover {
|
||||||
|
background-color: #000;
|
||||||
|
background-color: rgba(0, 0, 0, 0.7);
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-content > .video-play {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: -64px auto 0;
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
background: url(../img/video-play.png) center no-repeat;
|
||||||
|
opacity: 0.8;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-svgasimg > .slides > .slide > .video-content > .video-play {
|
||||||
|
background-image: url(../img/video-play.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-playing > .video-play,
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-playing > .video-cover {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-loading > .video-play {
|
||||||
|
background: url(../img/loading.gif) center no-repeat;
|
||||||
|
background-size: 64px 64px;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-smil > .slides > .slide > .video-loading > .video-play {
|
||||||
|
background-image: url(../img/loading.svg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IE7 fixes */
|
||||||
|
* + html .blueimp-gallery > .slides > .slide > .video-content {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
* + html .blueimp-gallery > .slides > .slide > .video-content > .video-play {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueimp-gallery > .slides > .slide > .video-content > .video-play:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
249
assets/Gallery-3.3.0/css/blueimp-gallery.css
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
/*
|
||||||
|
* blueimp Gallery CSS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
.blueimp-gallery,
|
||||||
|
.blueimp-gallery > .slides > .slide > .slide-content,
|
||||||
|
.blueimp-gallery > .slides > .slide > .slide-content > img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
-webkit-transition: opacity 0.2s linear;
|
||||||
|
-moz-transition: opacity 0.2s linear;
|
||||||
|
-ms-transition: opacity 0.2s linear;
|
||||||
|
-o-transition: opacity 0.2s linear;
|
||||||
|
transition: opacity 0.2s linear;
|
||||||
|
/* Prevent artifacts in Mozilla Firefox: */
|
||||||
|
backface-visibility: hidden;
|
||||||
|
-moz-backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .slide-content,
|
||||||
|
.blueimp-gallery > .slides > .slide > .slide-content > img {
|
||||||
|
margin: auto;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.blueimp-gallery {
|
||||||
|
position: fixed;
|
||||||
|
z-index: 999999;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #000;
|
||||||
|
opacity: 0;
|
||||||
|
display: none;
|
||||||
|
direction: ltr;
|
||||||
|
-ms-touch-action: pinch-zoom;
|
||||||
|
touch-action: pinch-zoom;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-carousel {
|
||||||
|
position: relative;
|
||||||
|
z-index: auto;
|
||||||
|
margin: 1em auto;
|
||||||
|
/* Set the carousel width/height ratio to 16/9: */
|
||||||
|
padding-bottom: 56.25%;
|
||||||
|
box-shadow: 0 0 4px rgba(0, 0, 0, 0.1);
|
||||||
|
-ms-touch-action: pan-y pinch-zoom;
|
||||||
|
touch-action: pan-y pinch-zoom;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-display {
|
||||||
|
display: block;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides {
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-carousel > .slides {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide {
|
||||||
|
visibility: hidden;
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
height: 100%;
|
||||||
|
text-align: center;
|
||||||
|
-webkit-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
-moz-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
-ms-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
-o-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide-prev,
|
||||||
|
.blueimp-gallery > .slides > .slide-active,
|
||||||
|
.blueimp-gallery > .slides > .slide-next {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide-loading {
|
||||||
|
background: url(../img/loading.gif) center no-repeat;
|
||||||
|
background-size: 64px 64px;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-smil > .slides > .slide-loading {
|
||||||
|
background-image: url(../img/loading.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide-loading > .slide-content {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide-error {
|
||||||
|
background: url(../img/error.png) center no-repeat;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-svgasimg > .slides > .slide-error {
|
||||||
|
background-image: url(../img/error.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide-error > .slide-content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-display > .prev,
|
||||||
|
.blueimp-gallery-display > .next {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 15px;
|
||||||
|
width: 8px;
|
||||||
|
height: 20px;
|
||||||
|
padding: 10px 14px 10px 18px;
|
||||||
|
margin-top: -23px;
|
||||||
|
-webkit-box-sizing: content-box;
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
background: #222 url(../img/prev.png) center no-repeat;
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
border: 3px solid #fff;
|
||||||
|
-webkit-border-radius: 30px;
|
||||||
|
-moz-border-radius: 30px;
|
||||||
|
border-radius: 30px;
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: pointer;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-display > .next {
|
||||||
|
right: 15px;
|
||||||
|
left: auto;
|
||||||
|
background-image: url(../img/next.png);
|
||||||
|
}
|
||||||
|
.blueimp-gallery-svgasimg > .prev {
|
||||||
|
background-image: url(../img/prev.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery-svgasimg > .next {
|
||||||
|
background-image: url(../img/next.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery-display > .close {
|
||||||
|
position: absolute;
|
||||||
|
top: 15px;
|
||||||
|
right: 15px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
background: url(../img/close.png) center no-repeat;
|
||||||
|
opacity: 0.8;
|
||||||
|
cursor: pointer;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-svgasimg > .close {
|
||||||
|
background-image: url(../img/close.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .title {
|
||||||
|
position: absolute;
|
||||||
|
top: 15px;
|
||||||
|
left: 15px;
|
||||||
|
margin: 0 60px 0 0;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 30px;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 0 2px #000;
|
||||||
|
opacity: 0.8;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-display > .play-pause {
|
||||||
|
position: absolute;
|
||||||
|
right: 15px;
|
||||||
|
bottom: 15px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
background: url(../img/play-pause.png) 0 0 no-repeat;
|
||||||
|
cursor: pointer;
|
||||||
|
opacity: 0.5;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-svgasimg > .play-pause {
|
||||||
|
background-image: url(../img/play-pause.svg);
|
||||||
|
}
|
||||||
|
.blueimp-gallery-playing > .play-pause {
|
||||||
|
background-position: -30px 0;
|
||||||
|
}
|
||||||
|
.blueimp-gallery-controls > .prev,
|
||||||
|
.blueimp-gallery-controls > .next,
|
||||||
|
.blueimp-gallery-controls > .close,
|
||||||
|
.blueimp-gallery-controls > .title,
|
||||||
|
.blueimp-gallery-controls > .play-pause {
|
||||||
|
display: block;
|
||||||
|
/* Fix z-index issues (controls behind slide element) on Android: */
|
||||||
|
-webkit-transform: translateZ(0);
|
||||||
|
-moz-transform: translateZ(0);
|
||||||
|
-ms-transform: translateZ(0);
|
||||||
|
-o-transform: translateZ(0);
|
||||||
|
transform: translateZ(0);
|
||||||
|
}
|
||||||
|
.blueimp-gallery-single > .prev,
|
||||||
|
.blueimp-gallery-left > .prev,
|
||||||
|
.blueimp-gallery-single > .next,
|
||||||
|
.blueimp-gallery-right > .next,
|
||||||
|
.blueimp-gallery-single > .play-pause {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .slides > .slide > .slide-content,
|
||||||
|
.blueimp-gallery > .prev,
|
||||||
|
.blueimp-gallery > .next,
|
||||||
|
.blueimp-gallery > .close,
|
||||||
|
.blueimp-gallery > .play-pause {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.blueimp-gallery > .prev:hover,
|
||||||
|
.blueimp-gallery > .next:hover,
|
||||||
|
.blueimp-gallery > .close:hover,
|
||||||
|
.blueimp-gallery > .title:hover,
|
||||||
|
.blueimp-gallery > .play-pause:hover {
|
||||||
|
color: #fff;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IE7 fixes */
|
||||||
|
* + html .blueimp-gallery > .slides > .slide {
|
||||||
|
min-height: 300px;
|
||||||
|
}
|
||||||
|
* + html .blueimp-gallery > .slides > .slide > .slide-content {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
* + html .blueimp-gallery > .slides > .slide > .slide-content > img {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
@supports (object-fit: contain) {
|
||||||
|
.blueimp-gallery-contain > .slides > .slide > .slide-content,
|
||||||
|
.blueimp-gallery-contain > .slides > .slide > .slide-content > img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
.blueimp-gallery-carousel {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
assets/Gallery-3.3.0/css/blueimp-gallery.min.css
vendored
Normal file
1
assets/Gallery-3.3.0/css/blueimp-gallery.min.css.map
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["blueimp-gallery.css","blueimp-gallery-indicator.css","blueimp-gallery-video.css"],"names":[],"mappings":"iBAYA,iBACA,+CACA,mDACE,SAAU,SACV,IAAK,EACL,MAAO,EACP,OAAQ,EACR,KAAM,EACN,mBAAoB,QAAQ,IAAK,OACjC,gBAAiB,QAAQ,IAAK,OAC9B,eAAgB,QAAQ,IAAK,OAC7B,cAAe,QAAQ,IAAK,OAC5B,WAAY,QAAQ,IAAK,OAEzB,oBAAqB,OACrB,yBAA0B,OAE5B,+CACA,mDACE,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,UAAW,KACX,WAAY,KACZ,QAAS,EAEX,iBACE,SAAU,MACV,QAAS,OACT,SAAU,OACV,WAAY,KACZ,QAAS,EACT,QAAS,KACT,UAAW,IACX,iBAAkB,WAClB,aAAc,WAEhB,0BACE,SAAU,SACV,QAAS,KACT,OAAQ,IAAI,KAEZ,eAAgB,OAChB,WAAY,EAAE,EAAE,IAAI,eACpB,iBAAkB,MAAM,WACxB,aAAc,MAAM,WACpB,QAAS,MAEX,yBACE,QAAS,MACT,QAAS,EAEX,yBACE,SAAU,SACV,OAAQ,KACR,SAAU,OAEZ,kCACE,SAAU,SAEZ,gCACE,WAAY,OACZ,SAAU,SACV,MAAO,KACP,OAAQ,KACR,WAAY,OACZ,mCAAoC,+BACpC,gCAAiC,+BACjC,+BAAgC,+BAChC,8BAA+B,+BAC/B,2BAA4B,+BAG9B,uCACA,qCAFA,qCAGE,WAAY,QAEd,wCACE,WAAY,wBAAwB,OAAO,UAC3C,gBAAiB,KAAK,KAExB,6CACE,iBAAkB,wBAEpB,uDACE,QAAS,EAEX,sCACE,WAAY,sBAAsB,OAAO,UAE3C,+CACE,iBAAkB,sBAEpB,qDACE,QAAS,KAGX,+BADA,+BAEE,SAAU,SACV,IAAK,IACL,KAAM,KACN,MAAO,IACP,OAAQ,KACR,QAAS,KAAK,KAAK,KAAK,KACxB,WAAY,MACZ,mBAAoB,YACpB,gBAAiB,YACjB,WAAY,YACZ,WAAY,KAAK,qBAAqB,OAAO,UAC7C,iBAAkB,eAClB,OAAQ,IAAI,MAAM,KAClB,sBAAuB,KACvB,mBAAoB,KACpB,cAAe,KACf,QAAS,GACT,OAAQ,QACR,QAAS,KAEX,+BACE,MAAO,KACP,KAAM,KACN,iBAAkB,qBAEpB,gCACE,iBAAkB,qBAEpB,gCACE,iBAAkB,qBAEpB,gCACE,SAAU,SACV,IAAK,KACL,MAAO,KACP,MAAO,KACP,OAAQ,KACR,WAAY,sBAAsB,OAAO,UACzC,QAAS,GACT,OAAQ,QACR,QAAS,KAEX,iCACE,iBAAkB,sBAEpB,wBACE,SAAU,SACV,IAAK,KACL,KAAM,KACN,OAAQ,EAAE,KAAK,EAAE,EACjB,UAAW,KACX,YAAa,KACb,MAAO,KACP,YAAa,EAAE,EAAE,IAAI,KACrB,QAAS,GACT,QAAS,KAEX,qCACE,SAAU,SACV,MAAO,KACP,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,WAAY,2BAA2B,EAAE,EAAE,UAC3C,OAAQ,QACR,QAAS,GACT,QAAS,KAEX,sCACE,iBAAkB,2BAEpB,qCACE,oBAAqB,MAAM,EAI7B,iCADA,gCAGA,sCAJA,gCAGA,iCAEE,QAAS,MAET,kBAAmB,cACnB,eAAgB,cAChB,cAAe,cACf,aAAc,cACd,UAAW,cAGb,4BAEA,6BADA,8BAEA,oCAJA,8BAKE,QAAS,KAKX,wBADA,uBAEA,6BAHA,uBADA,+CAKE,oBAAqB,KACrB,mBAAoB,KACpB,iBAAkB,KAClB,gBAAiB,KACjB,YAAa,KAIf,8BADA,6BAGA,mCAJA,6BAGA,8BAEE,MAAO,KACP,QAAS,EAIX,uCACE,WAAY,MAEd,sDACE,SAAU,SAEZ,0DACE,SAAU,SAGZ,+BACE,uDACA,2DACE,MAAO,KACP,OAAQ,KACR,WAAY,SAIhB,oCACE,0BACE,WAAY,MC1OhB,4BACE,SAAU,SACV,IAAK,KACL,MAAO,KACP,OAAQ,KACR,KAAM,KACN,OAAQ,EAAE,KACV,QAAS,EACT,WAAY,KACZ,WAAY,OACZ,YAAa,KACb,QAAS,KACT,oBAAqB,KACrB,mBAAoB,KACpB,iBAAkB,KAClB,gBAAiB,KACjB,YAAa,KAEf,+BACE,QAAS,aACT,SAAU,SACV,MAAO,IACP,OAAQ,IACR,OAAQ,IAAI,IAAI,EAAE,IAClB,mBAAoB,YACpB,gBAAiB,YACjB,WAAY,YACZ,OAAQ,IAAI,MAAM,YAClB,WAAY,KACZ,WAAY,sBAA0B,OAAO,UAC7C,cAAe,IACf,WAAY,EAAE,EAAE,IAAI,KACpB,QAAS,GACT,OAAQ,QAIV,sCACE,QAAS,OAIX,oCADA,qCAEE,iBAAkB,KAClB,aAAc,KACd,QAAS,EAGX,qCACE,QAAS,EACT,QAAS,MACT,SAAU,SACV,QAAS,GACT,IAAK,KACL,KAAM,IACN,MAAO,KACP,OAAQ,KACR,WAAY,UAAU,IAAM,QAAQ,CAAE,QAAQ,IAAM,SACpD,UAAW,iBAAiB,cAAc,cAC1C,eAAgB,KAGlB,2CACE,QAAS,EACT,cAAe,IACf,WAAY,QACZ,UAAW,iBAAiB,iBAAiB,cAG/C,0CACE,QAAS,KAGX,qCACE,QAAS,MAET,kBAAmB,cACnB,eAAgB,cAChB,cAAe,cACf,aAAc,cACd,UAAW,cAEb,mCACE,QAAS,KCjFX,4DADA,sDADA,qDAGE,SAAU,SACV,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,OAAQ,KAEV,4DACE,WAAY,OAAO,UACnB,gBAAiB,QAEnB,2DACE,iBAAkB,KAClB,iBAAkB,eAEpB,2DACE,SAAU,SACV,IAAK,IACL,MAAO,EACP,KAAM,EACN,OAAQ,MAAM,KAAK,EACnB,MAAO,MACP,OAAQ,MACR,WAAY,2BAA2B,OAAO,UAC9C,QAAS,GACT,OAAQ,QAEV,oEACE,iBAAkB,2BAGpB,4DADA,2DAEE,QAAS,KAEX,2DACE,WAAY,wBAAwB,OAAO,UAC3C,gBAAiB,KAAK,KAExB,gEACE,iBAAkB,wBAIpB,sDACE,OAAQ,KAEV,kEACE,KAAM,IACN,YAAa,MAGf,iEACE,QAAS"}
|
||||||
78
assets/Gallery-3.3.0/css/demo/demo.css
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery Demo CSS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
body {
|
||||||
|
max-width: 990px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 1em;
|
||||||
|
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',
|
||||||
|
Arial, sans-serif;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
line-height: 1.4;
|
||||||
|
background: #212121;
|
||||||
|
color: #dedede;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: #61afef;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a:visited {
|
||||||
|
color: #56b6c2;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #98c379;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
border: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
margin-top: 1.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
body {
|
||||||
|
background: #ececec;
|
||||||
|
color: #212121;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: #225c8d;
|
||||||
|
}
|
||||||
|
a:visited {
|
||||||
|
color: #378f9a;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #6fa349;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 540px) {
|
||||||
|
#navigation {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
#navigation li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
#navigation li:not(:first-child)::before {
|
||||||
|
content: ' | ';
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
assets/Gallery-3.3.0/img/close.png
Normal file
|
After Width: | Height: | Size: 163 B |
4
assets/Gallery-3.3.0/img/close.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="20" height="20">
|
||||||
|
<path d="M1 5 L5 1 L10 6 L15 1 L19 5 L14 10 L19 15 L15 19 L10 14 L5 19 L1 15 L6 10 Z" stroke="#fff" fill="#000" fill-opacity="0.5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 258 B |
BIN
assets/Gallery-3.3.0/img/error.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
6
assets/Gallery-3.3.0/img/error.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64">
|
||||||
|
<circle cx="32" cy="32" r="25" stroke="red" stroke-width="7" fill="#fff" fill-opacity="0.2"/>
|
||||||
|
<rect x="28" y="17" width="8" height="30" fill="red" transform="rotate(45, 32, 32)"/>
|
||||||
|
<rect x="28" y="17" width="8" height="30" fill="red" transform="rotate(135, 32, 32)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 394 B |
BIN
assets/Gallery-3.3.0/img/loading.gif
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
52
assets/Gallery-3.3.0/img/loading.svg
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background: none; display: block; shape-rendering: auto;" width="64px" height="64px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
|
||||||
|
<g transform="rotate(0 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.5729166666666666s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(30 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.5208333333333333s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(60 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.46874999999999994s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(90 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.41666666666666663s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(120 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.36458333333333326s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(150 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.31249999999999994s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(180 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.26041666666666663s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(210 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.20833333333333331s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(240 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.15624999999999997s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(270 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.10416666666666666s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(300 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="-0.05208333333333333s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g><g transform="rotate(330 50 50)">
|
||||||
|
<rect x="47" y="2" rx="3" ry="3.6" width="6" height="24" fill="#bdbdbd">
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="0.625s" begin="0s" repeatCount="indefinite"></animate>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
BIN
assets/Gallery-3.3.0/img/next.png
Normal file
|
After Width: | Height: | Size: 166 B |
4
assets/Gallery-3.3.0/img/next.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="8" height="20">
|
||||||
|
<path d="M0 0 V2 L6 10 L0 18 V20 L8 10 Z" stroke="#fff" fill="#fff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 194 B |
BIN
assets/Gallery-3.3.0/img/play-pause.png
Normal file
|
After Width: | Height: | Size: 432 B |
6
assets/Gallery-3.3.0/img/play-pause.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="30">
|
||||||
|
<polygon points="5,2 5,28 27,15" stroke="#fff" stroke-width="2" fill="#000" fill-opacity="0.5"/>
|
||||||
|
<rect x="35" y="3" width="8" height="24" stroke="#fff" stroke-width="2" fill="#000" fill-opacity="0.5"/>
|
||||||
|
<rect x="47" y="3" width="8" height="24" stroke="#fff" stroke-width="2" fill="#000" fill-opacity="0.5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 434 B |
BIN
assets/Gallery-3.3.0/img/prev.png
Normal file
|
After Width: | Height: | Size: 170 B |
4
assets/Gallery-3.3.0/img/prev.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="8" height="20">
|
||||||
|
<path d="M8 0 V2 L2 10 L8 18 V20 L0 10 Z" stroke="#fff" fill="#fff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 194 B |
BIN
assets/Gallery-3.3.0/img/video-play.png
Normal file
|
After Width: | Height: | Size: 993 B |
5
assets/Gallery-3.3.0/img/video-play.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64">
|
||||||
|
<circle cx="32" cy="32" r="25" stroke="#fff" stroke-width="7" fill="#000" fill-opacity="0.2"/>
|
||||||
|
<polygon points="26,22 26,42 43,32" fill="#fff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 271 B |
158
assets/Gallery-3.3.0/index.html
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
* blueimp Gallery Demo
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<!--[if IE]>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<![endif]-->
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>blueimp Gallery</title>
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="blueimp Gallery is a touch-enabled, responsive and customizable image and video gallery, carousel and lightbox, optimized for both mobile and desktop web browsers. It features swipe, mouse and keyboard navigation, transition effects, slideshow functionality, fullscreen support and on-demand content loading and can be extended to display additional content types."
|
||||||
|
/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<link rel="stylesheet" href="css/blueimp-gallery.css" />
|
||||||
|
<link rel="stylesheet" href="css/blueimp-gallery-indicator.css" />
|
||||||
|
<link rel="stylesheet" href="css/blueimp-gallery-video.css" />
|
||||||
|
<link rel="stylesheet" href="css/demo/demo.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>blueimp Gallery</h1>
|
||||||
|
<p>
|
||||||
|
<a href="https://github.com/blueimp/Gallery">blueimp Gallery</a> is a
|
||||||
|
touch-enabled, responsive and customizable image & video gallery,
|
||||||
|
carousel and lightbox, optimized for both mobile and desktop web browsers.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
It features swipe, mouse and keyboard navigation, transition effects,
|
||||||
|
slideshow functionality, fullscreen support and on-demand content loading
|
||||||
|
and can be extended to display additional content types.
|
||||||
|
</p>
|
||||||
|
<ul id="navigation">
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/blueimp/Gallery/releases">Download</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="https://github.com/blueimp/Gallery">Source Code</a></li>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/blueimp/Gallery/blob/master/README.md"
|
||||||
|
>Documentation</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
<li><a href="https://blueimp.net">© Sebastian Tschan</a></li>
|
||||||
|
</ul>
|
||||||
|
<h2>Carousel image gallery</h2>
|
||||||
|
<!-- The Gallery as inline carousel -->
|
||||||
|
<div
|
||||||
|
id="blueimp-image-carousel"
|
||||||
|
class="blueimp-gallery blueimp-gallery-carousel"
|
||||||
|
aria-label="image carousel"
|
||||||
|
>
|
||||||
|
<div class="slides" aria-live="off"></div>
|
||||||
|
<h3 class="title"></h3>
|
||||||
|
<a
|
||||||
|
class="prev"
|
||||||
|
aria-controls="blueimp-image-carousel"
|
||||||
|
aria-label="previous slide"
|
||||||
|
></a>
|
||||||
|
<a
|
||||||
|
class="next"
|
||||||
|
aria-controls="blueimp-image-carousel"
|
||||||
|
aria-label="next slide"
|
||||||
|
></a>
|
||||||
|
<a
|
||||||
|
class="play-pause"
|
||||||
|
aria-controls="blueimp-image-carousel"
|
||||||
|
aria-label="play slideshow"
|
||||||
|
aria-pressed="true"
|
||||||
|
role="button"
|
||||||
|
></a>
|
||||||
|
</div>
|
||||||
|
<h2>Carousel video gallery</h2>
|
||||||
|
<!-- The Gallery as inline carousel -->
|
||||||
|
<div
|
||||||
|
id="blueimp-video-carousel"
|
||||||
|
class="blueimp-gallery blueimp-gallery-controls blueimp-gallery-carousel"
|
||||||
|
aria-label="video carousel"
|
||||||
|
>
|
||||||
|
<div class="slides" aria-live="polite"></div>
|
||||||
|
<h3 class="title"></h3>
|
||||||
|
<a
|
||||||
|
class="prev"
|
||||||
|
aria-controls="blueimp-video-carousel"
|
||||||
|
aria-label="previous slide"
|
||||||
|
></a>
|
||||||
|
<a
|
||||||
|
class="next"
|
||||||
|
aria-controls="blueimp-video-carousel"
|
||||||
|
aria-label="next slide"
|
||||||
|
></a>
|
||||||
|
</div>
|
||||||
|
<h2>Lightbox image gallery</h2>
|
||||||
|
<p>
|
||||||
|
<input type="checkbox" id="fullscreen" />
|
||||||
|
<label for="fullscreen">Fullscreen</label>
|
||||||
|
</p>
|
||||||
|
<!-- The container for the list of example images -->
|
||||||
|
<div id="links" class="links"></div>
|
||||||
|
<!-- The Gallery as lightbox dialog -->
|
||||||
|
<div
|
||||||
|
id="blueimp-gallery"
|
||||||
|
class="blueimp-gallery"
|
||||||
|
aria-label="image gallery"
|
||||||
|
aria-modal="true"
|
||||||
|
role="dialog"
|
||||||
|
>
|
||||||
|
<div class="slides" aria-live="polite"></div>
|
||||||
|
<h3 class="title"></h3>
|
||||||
|
<a
|
||||||
|
class="prev"
|
||||||
|
aria-controls="blueimp-gallery"
|
||||||
|
aria-label="previous slide"
|
||||||
|
aria-keyshortcuts="ArrowLeft"
|
||||||
|
></a>
|
||||||
|
<a
|
||||||
|
class="next"
|
||||||
|
aria-controls="blueimp-gallery"
|
||||||
|
aria-label="next slide"
|
||||||
|
aria-keyshortcuts="ArrowRight"
|
||||||
|
></a>
|
||||||
|
<a
|
||||||
|
class="close"
|
||||||
|
aria-controls="blueimp-gallery"
|
||||||
|
aria-label="close"
|
||||||
|
aria-keyshortcuts="Escape"
|
||||||
|
></a>
|
||||||
|
<a
|
||||||
|
class="play-pause"
|
||||||
|
aria-controls="blueimp-gallery"
|
||||||
|
aria-label="play slideshow"
|
||||||
|
aria-keyshortcuts="Space"
|
||||||
|
aria-pressed="false"
|
||||||
|
role="button"
|
||||||
|
></a>
|
||||||
|
<ol class="indicator"></ol>
|
||||||
|
</div>
|
||||||
|
<script src="js/blueimp-helper.js"></script>
|
||||||
|
<script src="js/blueimp-gallery.js"></script>
|
||||||
|
<script src="js/blueimp-gallery-fullscreen.js"></script>
|
||||||
|
<script src="js/blueimp-gallery-indicator.js"></script>
|
||||||
|
<script src="js/blueimp-gallery-video.js"></script>
|
||||||
|
<script src="js/blueimp-gallery-vimeo.js"></script>
|
||||||
|
<script src="js/blueimp-gallery-youtube.js"></script>
|
||||||
|
<script src="js/vendor/jquery.js"></script>
|
||||||
|
<script src="js/jquery.blueimp-gallery.js"></script>
|
||||||
|
<script src="js/demo/demo.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
86
assets/Gallery-3.3.0/js/blueimp-gallery-fullscreen.js
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery Fullscreen JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define */
|
||||||
|
|
||||||
|
;(function (factory) {
|
||||||
|
'use strict'
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// Register as an anonymous AMD module:
|
||||||
|
define(['./blueimp-helper', './blueimp-gallery'], factory)
|
||||||
|
} else {
|
||||||
|
// Browser globals:
|
||||||
|
factory(window.blueimp.helper || window.jQuery, window.blueimp.Gallery)
|
||||||
|
}
|
||||||
|
})(function ($, Gallery) {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
var galleryPrototype = Gallery.prototype
|
||||||
|
|
||||||
|
$.extend(galleryPrototype.options, {
|
||||||
|
// Defines if the gallery should open in fullscreen mode:
|
||||||
|
fullscreen: false
|
||||||
|
})
|
||||||
|
|
||||||
|
var initialize = galleryPrototype.initialize
|
||||||
|
var close = galleryPrototype.close
|
||||||
|
|
||||||
|
$.extend(galleryPrototype, {
|
||||||
|
getFullScreenElement: function () {
|
||||||
|
return (
|
||||||
|
document.fullscreenElement ||
|
||||||
|
document.webkitFullscreenElement ||
|
||||||
|
document.mozFullScreenElement ||
|
||||||
|
document.msFullscreenElement
|
||||||
|
)
|
||||||
|
},
|
||||||
|
|
||||||
|
requestFullScreen: function (element) {
|
||||||
|
if (element.requestFullscreen) {
|
||||||
|
element.requestFullscreen()
|
||||||
|
} else if (element.webkitRequestFullscreen) {
|
||||||
|
element.webkitRequestFullscreen()
|
||||||
|
} else if (element.mozRequestFullScreen) {
|
||||||
|
element.mozRequestFullScreen()
|
||||||
|
} else if (element.msRequestFullscreen) {
|
||||||
|
element.msRequestFullscreen()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
exitFullScreen: function () {
|
||||||
|
if (document.exitFullscreen) {
|
||||||
|
document.exitFullscreen()
|
||||||
|
} else if (document.webkitCancelFullScreen) {
|
||||||
|
document.webkitCancelFullScreen()
|
||||||
|
} else if (document.mozCancelFullScreen) {
|
||||||
|
document.mozCancelFullScreen()
|
||||||
|
} else if (document.msExitFullscreen) {
|
||||||
|
document.msExitFullscreen()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function () {
|
||||||
|
initialize.call(this)
|
||||||
|
if (this.options.fullscreen && !this.getFullScreenElement()) {
|
||||||
|
this.requestFullScreen(this.container[0])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
close: function () {
|
||||||
|
if (this.getFullScreenElement() === this.container[0]) {
|
||||||
|
this.exitFullScreen()
|
||||||
|
}
|
||||||
|
close.call(this)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return Gallery
|
||||||
|
})
|
||||||
148
assets/Gallery-3.3.0/js/blueimp-gallery-indicator.js
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery Indicator JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define */
|
||||||
|
|
||||||
|
;(function (factory) {
|
||||||
|
'use strict'
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// Register as an anonymous AMD module:
|
||||||
|
define(['./blueimp-helper', './blueimp-gallery'], factory)
|
||||||
|
} else {
|
||||||
|
// Browser globals:
|
||||||
|
factory(window.blueimp.helper || window.jQuery, window.blueimp.Gallery)
|
||||||
|
}
|
||||||
|
})(function ($, Gallery) {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
var galleryPrototype = Gallery.prototype
|
||||||
|
|
||||||
|
$.extend(galleryPrototype.options, {
|
||||||
|
// The tag name, Id, element or querySelector of the indicator container:
|
||||||
|
indicatorContainer: 'ol',
|
||||||
|
// The class for the active indicator:
|
||||||
|
activeIndicatorClass: 'active',
|
||||||
|
// The list object property (or data attribute) with the thumbnail URL,
|
||||||
|
// used as alternative to a thumbnail child element:
|
||||||
|
thumbnailProperty: 'thumbnail',
|
||||||
|
// Defines if the gallery indicators should display a thumbnail:
|
||||||
|
thumbnailIndicators: true
|
||||||
|
})
|
||||||
|
|
||||||
|
var initSlides = galleryPrototype.initSlides
|
||||||
|
var addSlide = galleryPrototype.addSlide
|
||||||
|
var resetSlides = galleryPrototype.resetSlides
|
||||||
|
var handleClick = galleryPrototype.handleClick
|
||||||
|
var handleSlide = galleryPrototype.handleSlide
|
||||||
|
var handleClose = galleryPrototype.handleClose
|
||||||
|
|
||||||
|
$.extend(galleryPrototype, {
|
||||||
|
createIndicator: function (obj) {
|
||||||
|
var indicator = this.indicatorPrototype.cloneNode(false)
|
||||||
|
var title = this.getItemProperty(obj, this.options.titleProperty)
|
||||||
|
var thumbnailProperty = this.options.thumbnailProperty
|
||||||
|
var thumbnailUrl
|
||||||
|
var thumbnail
|
||||||
|
if (this.options.thumbnailIndicators) {
|
||||||
|
if (thumbnailProperty) {
|
||||||
|
thumbnailUrl = this.getItemProperty(obj, thumbnailProperty)
|
||||||
|
}
|
||||||
|
if (thumbnailUrl === undefined) {
|
||||||
|
thumbnail = obj.getElementsByTagName && $(obj).find('img')[0]
|
||||||
|
if (thumbnail) {
|
||||||
|
thumbnailUrl = thumbnail.src
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (thumbnailUrl) {
|
||||||
|
indicator.style.backgroundImage = 'url("' + thumbnailUrl + '")'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (title) {
|
||||||
|
indicator.title = title
|
||||||
|
}
|
||||||
|
indicator.setAttribute('role', 'link')
|
||||||
|
return indicator
|
||||||
|
},
|
||||||
|
|
||||||
|
addIndicator: function (index) {
|
||||||
|
if (this.indicatorContainer.length) {
|
||||||
|
var indicator = this.createIndicator(this.list[index])
|
||||||
|
indicator.setAttribute('data-index', index)
|
||||||
|
this.indicatorContainer[0].appendChild(indicator)
|
||||||
|
this.indicators.push(indicator)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setActiveIndicator: function (index) {
|
||||||
|
if (this.indicators) {
|
||||||
|
if (this.activeIndicator) {
|
||||||
|
this.activeIndicator.removeClass(this.options.activeIndicatorClass)
|
||||||
|
}
|
||||||
|
this.activeIndicator = $(this.indicators[index])
|
||||||
|
this.activeIndicator.addClass(this.options.activeIndicatorClass)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initSlides: function (reload) {
|
||||||
|
if (!reload) {
|
||||||
|
this.indicatorContainer = this.container.find(
|
||||||
|
this.options.indicatorContainer
|
||||||
|
)
|
||||||
|
if (this.indicatorContainer.length) {
|
||||||
|
this.indicatorPrototype = document.createElement('li')
|
||||||
|
this.indicators = this.indicatorContainer[0].children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
initSlides.call(this, reload)
|
||||||
|
},
|
||||||
|
|
||||||
|
addSlide: function (index) {
|
||||||
|
addSlide.call(this, index)
|
||||||
|
this.addIndicator(index)
|
||||||
|
},
|
||||||
|
|
||||||
|
resetSlides: function () {
|
||||||
|
resetSlides.call(this)
|
||||||
|
this.indicatorContainer.empty()
|
||||||
|
this.indicators = []
|
||||||
|
},
|
||||||
|
|
||||||
|
handleClick: function (event) {
|
||||||
|
var target = event.target || event.srcElement
|
||||||
|
var parent = target.parentNode
|
||||||
|
if (parent === this.indicatorContainer[0]) {
|
||||||
|
// Click on indicator element
|
||||||
|
this.preventDefault(event)
|
||||||
|
this.slide(this.getNodeIndex(target))
|
||||||
|
} else if (parent.parentNode === this.indicatorContainer[0]) {
|
||||||
|
// Click on indicator child element
|
||||||
|
this.preventDefault(event)
|
||||||
|
this.slide(this.getNodeIndex(parent))
|
||||||
|
} else {
|
||||||
|
return handleClick.call(this, event)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSlide: function (oldIndex, newIndex) {
|
||||||
|
handleSlide.call(this, oldIndex, newIndex)
|
||||||
|
this.setActiveIndicator(newIndex)
|
||||||
|
},
|
||||||
|
|
||||||
|
handleClose: function () {
|
||||||
|
if (this.activeIndicator) {
|
||||||
|
this.activeIndicator.removeClass(this.options.activeIndicatorClass)
|
||||||
|
}
|
||||||
|
handleClose.call(this)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return Gallery
|
||||||
|
})
|
||||||
188
assets/Gallery-3.3.0/js/blueimp-gallery-video.js
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery Video Factory JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define */
|
||||||
|
|
||||||
|
;(function (factory) {
|
||||||
|
'use strict'
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// Register as an anonymous AMD module:
|
||||||
|
define(['./blueimp-helper', './blueimp-gallery'], factory)
|
||||||
|
} else {
|
||||||
|
// Browser globals:
|
||||||
|
factory(window.blueimp.helper || window.jQuery, window.blueimp.Gallery)
|
||||||
|
}
|
||||||
|
})(function ($, Gallery) {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
var galleryPrototype = Gallery.prototype
|
||||||
|
|
||||||
|
$.extend(galleryPrototype.options, {
|
||||||
|
// The class for video content elements:
|
||||||
|
videoContentClass: 'video-content',
|
||||||
|
// The class for video when it is loading:
|
||||||
|
videoLoadingClass: 'video-loading',
|
||||||
|
// The class for video when it is playing:
|
||||||
|
videoPlayingClass: 'video-playing',
|
||||||
|
// The class for video content displayed in an iframe:
|
||||||
|
videoIframeClass: 'video-iframe',
|
||||||
|
// The class for the video cover element:
|
||||||
|
videoCoverClass: 'video-cover',
|
||||||
|
// The class for the video play control:
|
||||||
|
videoPlayClass: 'video-play',
|
||||||
|
// Play videos inline by default:
|
||||||
|
videoPlaysInline: true,
|
||||||
|
// The list object property (or data attribute) for video preload:
|
||||||
|
videoPreloadProperty: 'preload',
|
||||||
|
// The list object property (or data attribute) for the video poster URL:
|
||||||
|
videoPosterProperty: 'poster'
|
||||||
|
})
|
||||||
|
|
||||||
|
var handleSlide = galleryPrototype.handleSlide
|
||||||
|
|
||||||
|
$.extend(galleryPrototype, {
|
||||||
|
handleSlide: function (oldIndex, newIndex) {
|
||||||
|
handleSlide.call(this, oldIndex, newIndex)
|
||||||
|
this.setTimeout(function () {
|
||||||
|
if (this.activeVideo) {
|
||||||
|
this.activeVideo.pause()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
videoFactory: function (obj, callback, videoInterface) {
|
||||||
|
var that = this
|
||||||
|
var options = this.options
|
||||||
|
var videoContainerNode = this.elementPrototype.cloneNode(false)
|
||||||
|
var videoContainer = $(videoContainerNode)
|
||||||
|
var errorArgs = [
|
||||||
|
{
|
||||||
|
type: 'error',
|
||||||
|
target: videoContainerNode
|
||||||
|
}
|
||||||
|
]
|
||||||
|
var video = videoInterface || document.createElement('video')
|
||||||
|
var coverElement = this.elementPrototype.cloneNode(false)
|
||||||
|
var playElement = document.createElement('a')
|
||||||
|
var url = this.getItemProperty(obj, options.urlProperty)
|
||||||
|
var sources = this.getItemProperty(obj, options.sourcesProperty)
|
||||||
|
var title = this.getItemProperty(obj, options.titleProperty)
|
||||||
|
var posterUrl = this.getItemProperty(obj, options.videoPosterProperty)
|
||||||
|
var playControls = [playElement]
|
||||||
|
var hasGalleryControls
|
||||||
|
var isLoading
|
||||||
|
var i
|
||||||
|
videoContainer.addClass(options.videoContentClass)
|
||||||
|
$(playElement).addClass(options.videoPlayClass)
|
||||||
|
if (
|
||||||
|
!$(coverElement)
|
||||||
|
.addClass(options.videoCoverClass)
|
||||||
|
.hasClass(options.toggleClass)
|
||||||
|
) {
|
||||||
|
playControls.push(coverElement)
|
||||||
|
}
|
||||||
|
coverElement.draggable = false
|
||||||
|
if (title) {
|
||||||
|
videoContainerNode.title = title
|
||||||
|
playElement.setAttribute('aria-label', title)
|
||||||
|
}
|
||||||
|
if (posterUrl) {
|
||||||
|
// Set as background image instead of as poster video element property:
|
||||||
|
// - Is accessible for browsers that do not support the video element
|
||||||
|
// - Is accessible for both video element and iframe video players
|
||||||
|
// - Avoids visual artifacts in IE with the poster property set
|
||||||
|
coverElement.style.backgroundImage = 'url("' + posterUrl + '")'
|
||||||
|
}
|
||||||
|
if (video.setAttribute) {
|
||||||
|
if (options.videoPlaysInline) video.setAttribute('playsinline', '')
|
||||||
|
} else {
|
||||||
|
videoContainer.addClass(options.videoIframeClass)
|
||||||
|
}
|
||||||
|
video.preload =
|
||||||
|
this.getItemProperty(obj, options.videoPreloadProperty) || 'none'
|
||||||
|
if (this.support.source && sources) {
|
||||||
|
for (i = 0; i < sources.length; i += 1) {
|
||||||
|
video.appendChild(
|
||||||
|
$.extend(this.sourcePrototype.cloneNode(false), sources[i])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (url) video.src = url
|
||||||
|
playElement.href = url || (sources && sources.length && sources[0].src)
|
||||||
|
if (video.play && video.pause) {
|
||||||
|
;(videoInterface || $(video))
|
||||||
|
.on('error', function () {
|
||||||
|
that.setTimeout(callback, errorArgs)
|
||||||
|
})
|
||||||
|
.on('pause', function () {
|
||||||
|
if (video.seeking) return
|
||||||
|
isLoading = false
|
||||||
|
videoContainer
|
||||||
|
.removeClass(that.options.videoLoadingClass)
|
||||||
|
.removeClass(that.options.videoPlayingClass)
|
||||||
|
if (hasGalleryControls) {
|
||||||
|
that.container.addClass(that.options.controlsClass)
|
||||||
|
}
|
||||||
|
video.controls = false
|
||||||
|
if (video === that.activeVideo) delete that.activeVideo
|
||||||
|
if (that.interval) {
|
||||||
|
// Continue slideshow interval
|
||||||
|
that.play()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('playing', function () {
|
||||||
|
isLoading = false
|
||||||
|
coverElement.removeAttribute('style')
|
||||||
|
videoContainer
|
||||||
|
.removeClass(that.options.videoLoadingClass)
|
||||||
|
.addClass(that.options.videoPlayingClass)
|
||||||
|
})
|
||||||
|
.on('play', function () {
|
||||||
|
// Clear slideshow timeout:
|
||||||
|
window.clearTimeout(that.timeout)
|
||||||
|
isLoading = true
|
||||||
|
videoContainer.addClass(that.options.videoLoadingClass)
|
||||||
|
if (that.container.hasClass(that.options.controlsClass)) {
|
||||||
|
hasGalleryControls = true
|
||||||
|
that.container.removeClass(that.options.controlsClass)
|
||||||
|
} else {
|
||||||
|
hasGalleryControls = false
|
||||||
|
}
|
||||||
|
video.controls = true
|
||||||
|
that.activeVideo = video
|
||||||
|
})
|
||||||
|
$(playControls).on('click', function (event) {
|
||||||
|
that.preventDefault(event)
|
||||||
|
that.activeVideo = video
|
||||||
|
if (isLoading) {
|
||||||
|
video.pause()
|
||||||
|
} else {
|
||||||
|
video.play()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
videoContainerNode.appendChild(
|
||||||
|
(videoInterface && videoInterface.element) || video
|
||||||
|
)
|
||||||
|
}
|
||||||
|
videoContainerNode.appendChild(coverElement)
|
||||||
|
videoContainerNode.appendChild(playElement)
|
||||||
|
this.setTimeout(callback, [
|
||||||
|
{
|
||||||
|
type: 'load',
|
||||||
|
target: videoContainerNode
|
||||||
|
}
|
||||||
|
])
|
||||||
|
return videoContainerNode
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return Gallery
|
||||||
|
})
|
||||||
212
assets/Gallery-3.3.0/js/blueimp-gallery-vimeo.js
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery Vimeo Video Factory JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define, $f */
|
||||||
|
|
||||||
|
;(function (factory) {
|
||||||
|
'use strict'
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// Register as an anonymous AMD module:
|
||||||
|
define(['./blueimp-helper', './blueimp-gallery-video'], factory)
|
||||||
|
} else {
|
||||||
|
// Browser globals:
|
||||||
|
factory(window.blueimp.helper || window.jQuery, window.blueimp.Gallery)
|
||||||
|
}
|
||||||
|
})(function ($, Gallery) {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
if (!window.postMessage) {
|
||||||
|
return Gallery
|
||||||
|
}
|
||||||
|
|
||||||
|
var galleryPrototype = Gallery.prototype
|
||||||
|
|
||||||
|
$.extend(galleryPrototype.options, {
|
||||||
|
// The list object property (or data attribute) with the Vimeo video id:
|
||||||
|
vimeoVideoIdProperty: 'vimeo',
|
||||||
|
// The URL for the Vimeo video player, can be extended with custom parameters:
|
||||||
|
// https://developer.vimeo.com/player/embedding
|
||||||
|
vimeoPlayerUrl:
|
||||||
|
'https://player.vimeo.com/video/VIDEO_ID?api=1&player_id=PLAYER_ID',
|
||||||
|
// The prefix for the Vimeo video player ID:
|
||||||
|
vimeoPlayerIdPrefix: 'vimeo-player-',
|
||||||
|
// Require a click on the native Vimeo player for the initial playback:
|
||||||
|
vimeoClickToPlay: false
|
||||||
|
})
|
||||||
|
|
||||||
|
var textFactory =
|
||||||
|
galleryPrototype.textFactory || galleryPrototype.imageFactory
|
||||||
|
var VimeoPlayer = function (url, videoId, playerId, clickToPlay) {
|
||||||
|
this.url = url
|
||||||
|
this.videoId = videoId
|
||||||
|
this.playerId = playerId
|
||||||
|
this.clickToPlay = clickToPlay
|
||||||
|
this.element = document.createElement('div')
|
||||||
|
this.listeners = {}
|
||||||
|
}
|
||||||
|
var counter = 0
|
||||||
|
|
||||||
|
$.extend(VimeoPlayer.prototype, {
|
||||||
|
on: function (type, func) {
|
||||||
|
this.listeners[type] = func
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
loadAPI: function () {
|
||||||
|
var that = this
|
||||||
|
var apiUrl = 'https://f.vimeocdn.com/js/froogaloop2.min.js'
|
||||||
|
var scriptTags = document.getElementsByTagName('script')
|
||||||
|
var i = scriptTags.length
|
||||||
|
var scriptTag
|
||||||
|
var called
|
||||||
|
/**
|
||||||
|
* Callback function
|
||||||
|
*/
|
||||||
|
function callback() {
|
||||||
|
if (!called && that.playOnReady) {
|
||||||
|
that.play()
|
||||||
|
}
|
||||||
|
called = true
|
||||||
|
}
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
if (scriptTags[i].src === apiUrl) {
|
||||||
|
scriptTag = scriptTags[i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!scriptTag) {
|
||||||
|
scriptTag = document.createElement('script')
|
||||||
|
scriptTag.src = apiUrl
|
||||||
|
}
|
||||||
|
$(scriptTag).on('load', callback)
|
||||||
|
scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0])
|
||||||
|
// Fix for cached scripts on IE 8:
|
||||||
|
if (/loaded|complete/.test(scriptTag.readyState)) {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onReady: function () {
|
||||||
|
var that = this
|
||||||
|
this.ready = true
|
||||||
|
this.player.addEvent('play', function () {
|
||||||
|
that.hasPlayed = true
|
||||||
|
that.onPlaying()
|
||||||
|
})
|
||||||
|
this.player.addEvent('pause', function () {
|
||||||
|
that.onPause()
|
||||||
|
})
|
||||||
|
this.player.addEvent('finish', function () {
|
||||||
|
that.onPause()
|
||||||
|
})
|
||||||
|
if (this.playOnReady) {
|
||||||
|
this.play()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onPlaying: function () {
|
||||||
|
if (this.playStatus < 2) {
|
||||||
|
this.listeners.playing()
|
||||||
|
this.playStatus = 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onPause: function () {
|
||||||
|
this.listeners.pause()
|
||||||
|
delete this.playStatus
|
||||||
|
},
|
||||||
|
|
||||||
|
insertIframe: function () {
|
||||||
|
var iframe = document.createElement('iframe')
|
||||||
|
iframe.src = this.url
|
||||||
|
.replace('VIDEO_ID', this.videoId)
|
||||||
|
.replace('PLAYER_ID', this.playerId)
|
||||||
|
iframe.id = this.playerId
|
||||||
|
iframe.allow = 'autoplay'
|
||||||
|
this.element.parentNode.replaceChild(iframe, this.element)
|
||||||
|
this.element = iframe
|
||||||
|
},
|
||||||
|
|
||||||
|
play: function () {
|
||||||
|
var that = this
|
||||||
|
if (!this.playStatus) {
|
||||||
|
this.listeners.play()
|
||||||
|
this.playStatus = 1
|
||||||
|
}
|
||||||
|
if (this.ready) {
|
||||||
|
if (
|
||||||
|
!this.hasPlayed &&
|
||||||
|
(this.clickToPlay ||
|
||||||
|
(window.navigator &&
|
||||||
|
/iP(hone|od|ad)/.test(window.navigator.platform)))
|
||||||
|
) {
|
||||||
|
// Manually trigger the playing callback if clickToPlay
|
||||||
|
// is enabled and to workaround a limitation in iOS,
|
||||||
|
// which requires synchronous user interaction to start
|
||||||
|
// the video playback:
|
||||||
|
this.onPlaying()
|
||||||
|
} else {
|
||||||
|
this.player.api('play')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.playOnReady = true
|
||||||
|
if (!window.$f) {
|
||||||
|
this.loadAPI()
|
||||||
|
} else if (!this.player) {
|
||||||
|
this.insertIframe()
|
||||||
|
this.player = $f(this.element)
|
||||||
|
this.player.addEvent('ready', function () {
|
||||||
|
that.onReady()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
pause: function () {
|
||||||
|
if (this.ready) {
|
||||||
|
this.player.api('pause')
|
||||||
|
} else if (this.playStatus) {
|
||||||
|
delete this.playOnReady
|
||||||
|
this.listeners.pause()
|
||||||
|
delete this.playStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$.extend(galleryPrototype, {
|
||||||
|
VimeoPlayer: VimeoPlayer,
|
||||||
|
|
||||||
|
textFactory: function (obj, callback) {
|
||||||
|
var options = this.options
|
||||||
|
var videoId = this.getItemProperty(obj, options.vimeoVideoIdProperty)
|
||||||
|
if (videoId) {
|
||||||
|
if (this.getItemProperty(obj, options.urlProperty) === undefined) {
|
||||||
|
obj[options.urlProperty] = 'https://vimeo.com/' + videoId
|
||||||
|
}
|
||||||
|
counter += 1
|
||||||
|
return this.videoFactory(
|
||||||
|
obj,
|
||||||
|
callback,
|
||||||
|
new VimeoPlayer(
|
||||||
|
options.vimeoPlayerUrl,
|
||||||
|
videoId,
|
||||||
|
options.vimeoPlayerIdPrefix + counter,
|
||||||
|
options.vimeoClickToPlay
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return textFactory.call(this, obj, callback)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return Gallery
|
||||||
|
})
|
||||||
224
assets/Gallery-3.3.0/js/blueimp-gallery-youtube.js
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery YouTube Video Factory JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define, YT */
|
||||||
|
|
||||||
|
;(function (factory) {
|
||||||
|
'use strict'
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// Register as an anonymous AMD module:
|
||||||
|
define(['./blueimp-helper', './blueimp-gallery-video'], factory)
|
||||||
|
} else {
|
||||||
|
// Browser globals:
|
||||||
|
factory(window.blueimp.helper || window.jQuery, window.blueimp.Gallery)
|
||||||
|
}
|
||||||
|
})(function ($, Gallery) {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
if (!window.postMessage) {
|
||||||
|
return Gallery
|
||||||
|
}
|
||||||
|
|
||||||
|
var galleryPrototype = Gallery.prototype
|
||||||
|
|
||||||
|
$.extend(galleryPrototype.options, {
|
||||||
|
// The list object property (or data attribute) with the YouTube video id:
|
||||||
|
youTubeVideoIdProperty: 'youtube',
|
||||||
|
// Optional object with parameters passed to the YouTube video player:
|
||||||
|
// https://developers.google.com/youtube/player_parameters
|
||||||
|
youTubePlayerVars: {
|
||||||
|
wmode: 'transparent'
|
||||||
|
},
|
||||||
|
// Require a click on the native YouTube player for the initial playback:
|
||||||
|
youTubeClickToPlay: false
|
||||||
|
})
|
||||||
|
|
||||||
|
var textFactory =
|
||||||
|
galleryPrototype.textFactory || galleryPrototype.imageFactory
|
||||||
|
var YouTubePlayer = function (videoId, playerVars, clickToPlay) {
|
||||||
|
this.videoId = videoId
|
||||||
|
this.playerVars = playerVars
|
||||||
|
this.clickToPlay = clickToPlay
|
||||||
|
this.element = document.createElement('div')
|
||||||
|
this.listeners = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
$.extend(YouTubePlayer.prototype, {
|
||||||
|
on: function (type, func) {
|
||||||
|
this.listeners[type] = func
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
loadAPI: function () {
|
||||||
|
var that = this
|
||||||
|
var onYouTubeIframeAPIReady = window.onYouTubeIframeAPIReady
|
||||||
|
var apiUrl = 'https://www.youtube.com/iframe_api'
|
||||||
|
var scriptTags = document.getElementsByTagName('script')
|
||||||
|
var i = scriptTags.length
|
||||||
|
var scriptTag
|
||||||
|
window.onYouTubeIframeAPIReady = function () {
|
||||||
|
if (onYouTubeIframeAPIReady) {
|
||||||
|
onYouTubeIframeAPIReady.apply(this)
|
||||||
|
}
|
||||||
|
if (that.playOnReady) {
|
||||||
|
that.play()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
if (scriptTags[i].src === apiUrl) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scriptTag = document.createElement('script')
|
||||||
|
scriptTag.src = apiUrl
|
||||||
|
scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0])
|
||||||
|
},
|
||||||
|
|
||||||
|
onReady: function () {
|
||||||
|
this.ready = true
|
||||||
|
if (this.playOnReady) {
|
||||||
|
this.play()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onPlaying: function () {
|
||||||
|
if (this.playStatus < 2) {
|
||||||
|
this.listeners.playing()
|
||||||
|
this.playStatus = 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onPause: function () {
|
||||||
|
this.listeners.pause()
|
||||||
|
delete this.playStatus
|
||||||
|
},
|
||||||
|
|
||||||
|
onStateChange: function (event) {
|
||||||
|
window.clearTimeout(this.pauseTimeout)
|
||||||
|
switch (event.data) {
|
||||||
|
case YT.PlayerState.PLAYING:
|
||||||
|
this.hasPlayed = true
|
||||||
|
this.onPlaying()
|
||||||
|
break
|
||||||
|
case YT.PlayerState.UNSTARTED:
|
||||||
|
case YT.PlayerState.PAUSED:
|
||||||
|
// YouTube sends an unstarted event if pause is triggered before the
|
||||||
|
// video has started.
|
||||||
|
// YouTube sends a pause event when seeking.
|
||||||
|
// In both cases, we initiate a pause in a timeout that gets cleared
|
||||||
|
// if followed by another event within the timeout window.
|
||||||
|
this.pauseTimeout = galleryPrototype.setTimeout.call(
|
||||||
|
this,
|
||||||
|
this.onPause,
|
||||||
|
null,
|
||||||
|
500
|
||||||
|
)
|
||||||
|
break
|
||||||
|
case YT.PlayerState.ENDED:
|
||||||
|
this.onPause()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onError: function (event) {
|
||||||
|
this.listeners.error(event)
|
||||||
|
},
|
||||||
|
|
||||||
|
play: function () {
|
||||||
|
var that = this
|
||||||
|
if (!this.playStatus) {
|
||||||
|
this.listeners.play()
|
||||||
|
this.playStatus = 1
|
||||||
|
}
|
||||||
|
if (this.ready) {
|
||||||
|
if (
|
||||||
|
!this.hasPlayed &&
|
||||||
|
(this.clickToPlay ||
|
||||||
|
(window.navigator &&
|
||||||
|
/iP(hone|od|ad)/.test(window.navigator.platform)))
|
||||||
|
) {
|
||||||
|
// Manually trigger the playing callback if clickToPlay
|
||||||
|
// is enabled and to workaround a limitation in iOS,
|
||||||
|
// which requires synchronous user interaction to start
|
||||||
|
// the video playback:
|
||||||
|
this.onPlaying()
|
||||||
|
} else {
|
||||||
|
this.player.playVideo()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.playOnReady = true
|
||||||
|
if (!(window.YT && YT.Player)) {
|
||||||
|
this.loadAPI()
|
||||||
|
} else if (!this.player) {
|
||||||
|
this.player = new YT.Player(this.element, {
|
||||||
|
videoId: this.videoId,
|
||||||
|
playerVars: this.playerVars,
|
||||||
|
events: {
|
||||||
|
onReady: function () {
|
||||||
|
that.onReady()
|
||||||
|
},
|
||||||
|
onStateChange: function (event) {
|
||||||
|
that.onStateChange(event)
|
||||||
|
},
|
||||||
|
onError: function (event) {
|
||||||
|
that.onError(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
pause: function () {
|
||||||
|
if (this.ready) {
|
||||||
|
this.player.pauseVideo()
|
||||||
|
} else if (this.playStatus) {
|
||||||
|
delete this.playOnReady
|
||||||
|
this.listeners.pause()
|
||||||
|
delete this.playStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$.extend(galleryPrototype, {
|
||||||
|
YouTubePlayer: YouTubePlayer,
|
||||||
|
|
||||||
|
textFactory: function (obj, callback) {
|
||||||
|
var options = this.options
|
||||||
|
var videoId = this.getItemProperty(obj, options.youTubeVideoIdProperty)
|
||||||
|
if (videoId) {
|
||||||
|
if (this.getItemProperty(obj, options.urlProperty) === undefined) {
|
||||||
|
obj[options.urlProperty] =
|
||||||
|
'https://www.youtube.com/watch?v=' + videoId
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
this.getItemProperty(obj, options.videoPosterProperty) === undefined
|
||||||
|
) {
|
||||||
|
obj[options.videoPosterProperty] =
|
||||||
|
'https://img.youtube.com/vi/' + videoId + '/maxresdefault.jpg'
|
||||||
|
}
|
||||||
|
return this.videoFactory(
|
||||||
|
obj,
|
||||||
|
callback,
|
||||||
|
new YouTubePlayer(
|
||||||
|
videoId,
|
||||||
|
options.youTubePlayerVars,
|
||||||
|
options.youTubeClickToPlay
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return textFactory.call(this, obj, callback)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return Gallery
|
||||||
|
})
|
||||||
1551
assets/Gallery-3.3.0/js/blueimp-gallery.js
Normal file
2
assets/Gallery-3.3.0/js/blueimp-gallery.min.js
vendored
Normal file
1
assets/Gallery-3.3.0/js/blueimp-gallery.min.js.map
Normal file
217
assets/Gallery-3.3.0/js/blueimp-helper.js
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
/*
|
||||||
|
* blueimp helper JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define */
|
||||||
|
|
||||||
|
/* eslint-disable no-param-reassign */
|
||||||
|
|
||||||
|
;(function () {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object.assign polyfill
|
||||||
|
*
|
||||||
|
* @param {object} obj1 First object
|
||||||
|
* @param {object} obj2 Second object
|
||||||
|
* @returns {object} Merged object
|
||||||
|
*/
|
||||||
|
function extend(obj1, obj2) {
|
||||||
|
var prop
|
||||||
|
for (prop in obj2) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(obj2, prop)) {
|
||||||
|
obj1[prop] = obj2[prop]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return obj1
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Helper constructor
|
||||||
|
*
|
||||||
|
* @class
|
||||||
|
* @param {*} query jQuery type query argument
|
||||||
|
*/
|
||||||
|
function Helper(query) {
|
||||||
|
if (!this || this.find !== Helper.prototype.find) {
|
||||||
|
// Called as function instead of as constructor,
|
||||||
|
// so we simply return a new instance:
|
||||||
|
return new Helper(query)
|
||||||
|
}
|
||||||
|
this.length = 0
|
||||||
|
if (query) {
|
||||||
|
if (typeof query === 'string') {
|
||||||
|
query = this.find(query)
|
||||||
|
}
|
||||||
|
if (query.nodeType || query === query.window) {
|
||||||
|
// Single HTML element
|
||||||
|
this.length = 1
|
||||||
|
this[0] = query
|
||||||
|
} else {
|
||||||
|
// HTML element collection
|
||||||
|
var i = query.length
|
||||||
|
this.length = i
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
this[i] = query[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Helper.extend = extend
|
||||||
|
|
||||||
|
Helper.contains = function (container, element) {
|
||||||
|
do {
|
||||||
|
element = element.parentNode
|
||||||
|
if (element === container) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} while (element)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
Helper.parseJSON = function (string) {
|
||||||
|
return JSON.parse(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
extend(Helper.prototype, {
|
||||||
|
find: function (query) {
|
||||||
|
var container = this[0] || document
|
||||||
|
if (typeof query === 'string') {
|
||||||
|
if (container.querySelectorAll) {
|
||||||
|
query = container.querySelectorAll(query)
|
||||||
|
} else if (query.charAt(0) === '#') {
|
||||||
|
query = container.getElementById(query.slice(1))
|
||||||
|
} else {
|
||||||
|
query = container.getElementsByTagName(query)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Helper(query)
|
||||||
|
},
|
||||||
|
|
||||||
|
hasClass: function (className) {
|
||||||
|
if (!this[0]) return false
|
||||||
|
return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(
|
||||||
|
this[0].className
|
||||||
|
)
|
||||||
|
},
|
||||||
|
|
||||||
|
addClass: function (className) {
|
||||||
|
var i = this.length
|
||||||
|
var classNames
|
||||||
|
var element
|
||||||
|
var j
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
element = this[i]
|
||||||
|
if (!element.className) {
|
||||||
|
element.className = className
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (!classNames) classNames = className.split(/\s+/)
|
||||||
|
for (j = 0; j < classNames.length; j += 1) {
|
||||||
|
if (this.hasClass(classNames[j])) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
element.className += ' ' + classNames[j]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
removeClass: function (className) {
|
||||||
|
// Match any of the given class names
|
||||||
|
var regexp = new RegExp('^(?:' + className.split(/\s+/).join('|') + ')$')
|
||||||
|
// Match any class names and their trailing whitespace
|
||||||
|
var matcher = /(\S+)(?:\s+|$)/g
|
||||||
|
var replacer = function (match, className) {
|
||||||
|
// Replace class names that match the given ones
|
||||||
|
return regexp.test(className) ? '' : match
|
||||||
|
}
|
||||||
|
var trimEnd = /\s+$/
|
||||||
|
var i = this.length
|
||||||
|
var element
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
element = this[i]
|
||||||
|
element.className = element.className
|
||||||
|
.replace(matcher, replacer)
|
||||||
|
.replace(trimEnd, '')
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
on: function (eventName, handler) {
|
||||||
|
var eventNames = eventName.split(/\s+/)
|
||||||
|
var i
|
||||||
|
var element
|
||||||
|
while (eventNames.length) {
|
||||||
|
eventName = eventNames.shift()
|
||||||
|
i = this.length
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
element = this[i]
|
||||||
|
if (element.addEventListener) {
|
||||||
|
element.addEventListener(eventName, handler, false)
|
||||||
|
} else if (element.attachEvent) {
|
||||||
|
element.attachEvent('on' + eventName, handler)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
off: function (eventName, handler) {
|
||||||
|
var eventNames = eventName.split(/\s+/)
|
||||||
|
var i
|
||||||
|
var element
|
||||||
|
while (eventNames.length) {
|
||||||
|
eventName = eventNames.shift()
|
||||||
|
i = this.length
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
element = this[i]
|
||||||
|
if (element.removeEventListener) {
|
||||||
|
element.removeEventListener(eventName, handler, false)
|
||||||
|
} else if (element.detachEvent) {
|
||||||
|
element.detachEvent('on' + eventName, handler)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
empty: function () {
|
||||||
|
var i = this.length
|
||||||
|
var element
|
||||||
|
while (i) {
|
||||||
|
i -= 1
|
||||||
|
element = this[i]
|
||||||
|
while (element.hasChildNodes()) {
|
||||||
|
element.removeChild(element.lastChild)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
|
first: function () {
|
||||||
|
return new Helper(this[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(function () {
|
||||||
|
return Helper
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
window.blueimp = window.blueimp || {}
|
||||||
|
window.blueimp.helper = Helper
|
||||||
|
}
|
||||||
|
})()
|
||||||
140
assets/Gallery-3.3.0/js/demo/demo.js
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery Demo JS
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global blueimp, $ */
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Flickr image types:
|
||||||
|
var imageTypes = [
|
||||||
|
// https://www.flickr.com/services/api/misc.urls.html
|
||||||
|
'sq', // 75x75
|
||||||
|
'q', // 150x150
|
||||||
|
't', // 100 on longest side
|
||||||
|
's', // 240 on longest side
|
||||||
|
'n', // 320 on longest side
|
||||||
|
'm', // 500 on longest side
|
||||||
|
'z', // 640 on longest side
|
||||||
|
'c', // 800 on longest side
|
||||||
|
'l', // 1024 on longest side
|
||||||
|
'h', // 1600 on longest side
|
||||||
|
'k', // 2048 on longest side
|
||||||
|
'o' // original dimensions
|
||||||
|
]
|
||||||
|
|
||||||
|
// Load demo images from Flickr:
|
||||||
|
$.ajax({
|
||||||
|
url: 'https://api.flickr.com/services/rest/',
|
||||||
|
data: {
|
||||||
|
// https://www.flickr.com/services/api/flickr.interestingness.getList.html
|
||||||
|
method: 'flickr.interestingness.getList',
|
||||||
|
format: 'json',
|
||||||
|
extras: 'url_' + imageTypes.join(',url_'),
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
api_key: '7617adae70159d09ba78cfec73c13be3'
|
||||||
|
},
|
||||||
|
dataType: 'jsonp',
|
||||||
|
jsonp: 'jsoncallback'
|
||||||
|
}).done(function (result) {
|
||||||
|
var maxWidth = $(document.body).css('max-width')
|
||||||
|
var sizes = '(min-width: ' + maxWidth + ') ' + maxWidth + ', 100vw'
|
||||||
|
var carouselLinks = []
|
||||||
|
var linksContainer = $('#links')
|
||||||
|
// Add the demo images as links with thumbnails to the page:
|
||||||
|
$.each(result.photos.photo, function (_, photo) {
|
||||||
|
var thumbnail = $('<img>')
|
||||||
|
.prop('loading', 'lazy')
|
||||||
|
.prop('width', photo.width_sq)
|
||||||
|
.prop('height', photo.height_sq)
|
||||||
|
.prop('src', photo.url_sq)
|
||||||
|
.prop('alt', photo.title)
|
||||||
|
var srcset = []
|
||||||
|
$.each(imageTypes, function (_, type) {
|
||||||
|
var url = photo['url_' + type]
|
||||||
|
var width = photo['width_' + type]
|
||||||
|
if (url) {
|
||||||
|
srcset.push(url + ' ' + width + 'w')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
srcset = srcset.join(',')
|
||||||
|
$('<a></a>')
|
||||||
|
.append(thumbnail)
|
||||||
|
.prop('title', photo.title)
|
||||||
|
.prop('href', photo.url_l)
|
||||||
|
.attr('data-srcset', srcset)
|
||||||
|
.attr('data-gallery', '')
|
||||||
|
.appendTo(linksContainer)
|
||||||
|
carouselLinks.push({
|
||||||
|
title: photo.title,
|
||||||
|
href: photo.url_l,
|
||||||
|
sizes: sizes,
|
||||||
|
srcset: srcset
|
||||||
|
})
|
||||||
|
})
|
||||||
|
// Initialize the Gallery as image carousel:
|
||||||
|
// eslint-disable-next-line new-cap
|
||||||
|
blueimp.Gallery(carouselLinks, {
|
||||||
|
container: '#blueimp-image-carousel',
|
||||||
|
carousel: true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Initialize the Gallery as video carousel:
|
||||||
|
// eslint-disable-next-line new-cap
|
||||||
|
blueimp.Gallery(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
title: 'Sintel',
|
||||||
|
type: 'video',
|
||||||
|
sources: [
|
||||||
|
{
|
||||||
|
type: 'video/webm',
|
||||||
|
src:
|
||||||
|
'https://upload.wikimedia.org/wikipedia/commons/f/f1/' +
|
||||||
|
'Sintel_movie_4K.webm'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'video/mp4',
|
||||||
|
src: 'https://archive.org/download/Sintel/sintel-2048-surround.mp4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'video/ogg',
|
||||||
|
src: 'https://archive.org/download/Sintel/sintel-2048-stereo.ogv'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
poster:
|
||||||
|
'https://upload.wikimedia.org/wikipedia/commons/d/dc/' +
|
||||||
|
'Sintel_1920x1080.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'LES TWINS - An Industry Ahead',
|
||||||
|
type: 'text/html',
|
||||||
|
youtube: 'zi4CIXpx7Bg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'KN1GHT - Last Moon',
|
||||||
|
type: 'text/html',
|
||||||
|
vimeo: '73686146',
|
||||||
|
poster: 'https://secure-a.vimeocdn.com/ts/448/835/448835699_960.jpg'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
{
|
||||||
|
container: '#blueimp-video-carousel',
|
||||||
|
carousel: true,
|
||||||
|
startSlideshow: false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
$('#fullscreen').change(function () {
|
||||||
|
$('#blueimp-gallery').data('fullscreen', this.checked)
|
||||||
|
})
|
||||||
|
})
|
||||||
75
assets/Gallery-3.3.0/js/jquery.blueimp-gallery.js
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* blueimp Gallery jQuery plugin
|
||||||
|
* https://github.com/blueimp/Gallery
|
||||||
|
*
|
||||||
|
* Copyright 2013, Sebastian Tschan
|
||||||
|
* https://blueimp.net
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define */
|
||||||
|
|
||||||
|
;(function (factory) {
|
||||||
|
'use strict'
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(['jquery', './blueimp-gallery'], factory)
|
||||||
|
} else {
|
||||||
|
factory(window.jQuery, window.blueimp.Gallery)
|
||||||
|
}
|
||||||
|
})(function ($, Gallery) {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Global click handler to open links with data-gallery attribute
|
||||||
|
// in the Gallery lightbox:
|
||||||
|
$(document).on('click', '[data-gallery]', function (event) {
|
||||||
|
// Get the container id from the data-gallery attribute:
|
||||||
|
var id = $(this).data('gallery')
|
||||||
|
var widget = $(id)
|
||||||
|
var container =
|
||||||
|
(widget.length && widget) || $(Gallery.prototype.options.container)
|
||||||
|
var callbacks = {
|
||||||
|
onopen: function () {
|
||||||
|
container.data('gallery', this).trigger('open')
|
||||||
|
},
|
||||||
|
onopened: function () {
|
||||||
|
container.trigger('opened')
|
||||||
|
},
|
||||||
|
onslide: function () {
|
||||||
|
container.trigger('slide', arguments)
|
||||||
|
},
|
||||||
|
onslideend: function () {
|
||||||
|
container.trigger('slideend', arguments)
|
||||||
|
},
|
||||||
|
onslidecomplete: function () {
|
||||||
|
container.trigger('slidecomplete', arguments)
|
||||||
|
},
|
||||||
|
onclose: function () {
|
||||||
|
container.trigger('close')
|
||||||
|
},
|
||||||
|
onclosed: function () {
|
||||||
|
container.trigger('closed').removeData('gallery')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var options = $.extend(
|
||||||
|
// Retrieve custom options from data-attributes
|
||||||
|
// on the Gallery widget:
|
||||||
|
container.data(),
|
||||||
|
{
|
||||||
|
container: container[0],
|
||||||
|
index: this,
|
||||||
|
event: event
|
||||||
|
},
|
||||||
|
callbacks
|
||||||
|
)
|
||||||
|
// Select all links with the same data-gallery attribute:
|
||||||
|
var links = $(this)
|
||||||
|
.closest('[data-gallery-group], body')
|
||||||
|
.find('[data-gallery="' + id + '"]')
|
||||||
|
if (options.filter) {
|
||||||
|
links = links.filter(options.filter)
|
||||||
|
}
|
||||||
|
return new Gallery(links, options)
|
||||||
|
})
|
||||||
|
})
|
||||||
2
assets/Gallery-3.3.0/js/jquery.blueimp-gallery.min.js
vendored
Normal file
11008
assets/Gallery-3.3.0/js/vendor/jquery.js
vendored
Normal file
2883
assets/Gallery-3.3.0/package-lock.json
generated
Normal file
98
assets/Gallery-3.3.0/package.json
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
{
|
||||||
|
"name": "blueimp-gallery",
|
||||||
|
"version": "3.3.0",
|
||||||
|
"title": "blueimp Gallery",
|
||||||
|
"description": "blueimp Gallery is a touch-enabled, responsive and customizable image and video gallery, carousel and lightbox, optimized for both mobile and desktop web browsers. It features swipe, mouse and keyboard navigation, transition effects, slideshow functionality, fullscreen support and on-demand content loading and can be extended to display additional content types.",
|
||||||
|
"keywords": [
|
||||||
|
"image",
|
||||||
|
"video",
|
||||||
|
"gallery",
|
||||||
|
"carousel",
|
||||||
|
"lightbox",
|
||||||
|
"mobile",
|
||||||
|
"desktop",
|
||||||
|
"touch",
|
||||||
|
"responsive",
|
||||||
|
"swipe",
|
||||||
|
"mouse",
|
||||||
|
"keyboard",
|
||||||
|
"navigation",
|
||||||
|
"transition",
|
||||||
|
"effects",
|
||||||
|
"slideshow",
|
||||||
|
"fullscreen"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/blueimp/Gallery",
|
||||||
|
"author": {
|
||||||
|
"name": "Sebastian Tschan",
|
||||||
|
"url": "https://blueimp.net"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/blueimp/Gallery.git"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"clean-css-cli": "4",
|
||||||
|
"eslint": "7",
|
||||||
|
"eslint-config-blueimp": "2",
|
||||||
|
"eslint-config-prettier": "6",
|
||||||
|
"eslint-plugin-jsdoc": "30",
|
||||||
|
"eslint-plugin-prettier": "3",
|
||||||
|
"prettier": "2",
|
||||||
|
"stylelint": "13",
|
||||||
|
"stylelint-config-prettier": "8",
|
||||||
|
"stylelint-config-recommended": "3",
|
||||||
|
"uglify-js": "3"
|
||||||
|
},
|
||||||
|
"stylelint": {
|
||||||
|
"extends": [
|
||||||
|
"stylelint-config-recommended",
|
||||||
|
"stylelint-config-prettier"
|
||||||
|
],
|
||||||
|
"ignoreFiles": [
|
||||||
|
"css/*.min.css"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"extends": [
|
||||||
|
"blueimp",
|
||||||
|
"plugin:jsdoc/recommended",
|
||||||
|
"plugin:prettier/recommended"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"browser": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"eslintIgnore": [
|
||||||
|
"js/*.min.js",
|
||||||
|
"js/vendor"
|
||||||
|
],
|
||||||
|
"prettier": {
|
||||||
|
"arrowParens": "avoid",
|
||||||
|
"proseWrap": "always",
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "none"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "stylelint '**/*.css' && eslint .",
|
||||||
|
"build:js": "cd js && uglifyjs blueimp-helper.js blueimp-gallery.js blueimp-gallery-fullscreen.js blueimp-gallery-indicator.js blueimp-gallery-video.js blueimp-gallery-vimeo.js blueimp-gallery-youtube.js --ie8 -c -m -o blueimp-gallery.min.js --source-map url=blueimp-gallery.min.js.map",
|
||||||
|
"build:jquery": "cd js && uglifyjs blueimp-gallery.js blueimp-gallery-fullscreen.js blueimp-gallery-indicator.js blueimp-gallery-video.js blueimp-gallery-vimeo.js blueimp-gallery-youtube.js jquery.blueimp-gallery.js --ie8 -c -m -o jquery.blueimp-gallery.min.js --source-map url=jquery.blueimp-gallery.min.js.map",
|
||||||
|
"build:css": "cd css && cleancss -c ie7 --source-map -o blueimp-gallery.min.css blueimp-gallery.css blueimp-gallery-indicator.css blueimp-gallery-video.css",
|
||||||
|
"build": "npm run build:js && npm run build:jquery && npm run build:css",
|
||||||
|
"preversion": "npm test",
|
||||||
|
"version": "npm run build && git add -A js css",
|
||||||
|
"postversion": "git push --tags origin master master:gh-pages && npm publish"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"css/*.css",
|
||||||
|
"css/*.css.map",
|
||||||
|
"img/*.gif",
|
||||||
|
"img/*.png",
|
||||||
|
"img/*.svg",
|
||||||
|
"js/*.js",
|
||||||
|
"js/*.js.map"
|
||||||
|
],
|
||||||
|
"main": "js/blueimp-gallery.js"
|
||||||
|
}
|
||||||
@@ -1,6 +1,113 @@
|
|||||||
CKEditor 4 Changelog
|
CKEditor 4 Changelog
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
## CKEditor 4.16.1
|
||||||
|
|
||||||
|
Fixed Issues:
|
||||||
|
* [#4617](https://github.com/ckeditor/ckeditor4/issues/4617): Fixed: [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) is not accessible in inline editors.
|
||||||
|
* [#4493](https://github.com/ckeditor/ckeditor4/issues/4493): Fixed: The [drop-down](https://ckeditor.com/cke4/addon/richcombo) label does not reflect the current value of the drop-down.
|
||||||
|
* [#1572](https://github.com/ckeditor/ckeditor4/issues/1572): Fixed: A paragraph before or after a [widget](https://ckeditor.com/cke4/addon/widget) cannot be removed. Thanks to [bunglegrind](https://github.com/bunglegrind)!
|
||||||
|
* [#4301](https://github.com/ckeditor/ckeditor4/issues/4301): Fixed: Pasted content is overwritten when pasted in an initially empty editor with the [`div` Enter mode](https://ckeditor.com/docs/ckeditor4/latest/features/enterkey.html).
|
||||||
|
* [#4351](https://github.com/ckeditor/ckeditor4/issues/4351): Fixed: Incorrect values for RGBA/HSLA colors in [Color Dialog](https://ckeditor.com/cke4/addon/colordialog).
|
||||||
|
* [#4509](https://github.com/ckeditor/ckeditor4/issues/4509): Fixed: Incorrect handling of drag & drop inside [widgets](https://ckeditor.com/cke4/addon/widget) and nested editables.
|
||||||
|
* [#4611](https://github.com/ckeditor/ckeditor4/issues/4611): [Android, iOS] Fixed: Incorrect hover styles for buttons in the toolbar on mobile devices.
|
||||||
|
* [#4652](https://github.com/ckeditor/ckeditor4/issues/4652): Fixed: [Event data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_eventInfo.html) set to `false` is treated as an event cancelation.
|
||||||
|
|
||||||
|
## CKEditor 4.16
|
||||||
|
|
||||||
|
**Security Updates:**
|
||||||
|
|
||||||
|
* Fixed ReDoS vulnerability in the [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin.
|
||||||
|
|
||||||
|
Issue summary: It was possible to execute a ReDoS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted URL-like text into the editor and press <kbd>Enter</kbd> or <kbd>Space</kbd>.
|
||||||
|
|
||||||
|
* Fixed ReDoS vulnerability in the [Advanced Tab for Dialogs](https://ckeditor.com/cke4/addon/dialogadvtab) plugin.
|
||||||
|
|
||||||
|
Issue summary: It was possible to execute a ReDoS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted text into the Styles dialog.
|
||||||
|
|
||||||
|
**An upgrade is highly recommended!**
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Unsupported image formats are now gracefully handled by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin on paste, additionally showing descriptive error messages.
|
||||||
|
* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Unsupported image formats are now gracefully handled by the [Paste from LibreOffice](https://ckeditor.com/cke4/addon/pastefromlibreoffice) plugin on paste, additionally showing descriptive error messages.
|
||||||
|
* [#3582](https://github.com/ckeditor/ckeditor4/issues/3582): Introduced smart positioning of the [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) panel used by the [Mentions](https://ckeditor.com/cke4/addon/mentions) and [Emoji](https://ckeditor.com/cke4/addon/emoji) plugins. The panel will now be additionally positioned related to the browser viewport to be always fully visible.
|
||||||
|
* [#4388](https://github.com/ckeditor/ckeditor4/issues/4388): Added the option to remove an iframe created with the [IFrame Dialog](https://ckeditor.com/cke4/addon/iframe) plugin from the sequential keyboard navigation using the `tabindex` attribute. Thanks to [Timo Kirkkala](https://github.com/kirkkala)!
|
||||||
|
|
||||||
|
Fixed Issues:
|
||||||
|
|
||||||
|
* [#1134](https://github.com/ckeditor/ckeditor4/issues/1134): [Safari] Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not embed images.
|
||||||
|
* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Fixed: No images are imported from Microsoft Word when the content is pasted via the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin if there is at least one image of unsupported format.
|
||||||
|
* [#4379](https://github.com/ckeditor/ckeditor4/issues/4379): [Edge] Fixed: Incorrect detection of the [high contrast mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_a11y.html#high-contrast-mode).
|
||||||
|
* [#4422](https://github.com/ckeditor/ckeditor4/issues/4422): Fixed: Missing space between the button name and the keyboard shortcut inside the button label in the [high contrast mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_a11y.html#high-contrast-mode).
|
||||||
|
* [#2208](https://github.com/ckeditor/ckeditor4/issues/2208): [IE] Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin duplicates the native browser implementation.
|
||||||
|
* [#1824](https://github.com/ckeditor/ckeditor4/issues/1824): Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin should require the [Link](https://ckeditor.com/cke4/addon/link) plugin.
|
||||||
|
* [#4253](https://github.com/ckeditor/ckeditor4/issues/4253): Fixed: The [Editor Placeholder](https://ckeditor.com/cke4/addon/editorplaceholder) plugin throws an error during the editor initialization with [`config.fullPage`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-fullPage) enabled when there is no `<body>` tag in the editor content.
|
||||||
|
* [#4372](https://github.com/ckeditor/ckeditor4/issues/4372): Fixed: The [Autogrow](https://ckeditor.com/cke4/addon/autogrow) plugin changes the editor's width when used with an absolute [`config.width`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-width) value.
|
||||||
|
|
||||||
|
API Changes:
|
||||||
|
|
||||||
|
* [#4358](https://github.com/ckeditor/ckeditor4/issues/4358): Introduced the [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html) class which adds colors validation and methods for converting colors between various formats: named colors, HEX, RGB, RGBA, HSL and HSLA.
|
||||||
|
* [#3782](https://github.com/ckeditor/ckeditor4/issues/3782): Moved the [`CKEDITOR.plugins.pastetools.filters.word.images`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters_word_images.html) filters to the [`CKEDITOR.plugins.pastetools.filters.image`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters_image.html) namespace.
|
||||||
|
* [#4297](https://github.com/ckeditor/ckeditor4/issues/4297): All [`CKEDITOR.plugins.pastetools.filters`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters.html) are now available under the [`CKEDITOR.pasteTools`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-pasteTools) alias.
|
||||||
|
* [#4394](https://github.com/ckeditor/ckeditor4/issues/4394): Introduced [`CKEDITOR.ajax`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html) specialized loading methods for loading binary ([`CKEDITOR.ajax.loadBinary()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html#method-loadBinary)) and text ([`CKEDITOR.ajax.loadText()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html#method-loadText)) data.
|
||||||
|
|
||||||
|
Other Changes:
|
||||||
|
|
||||||
|
* The [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugin is now disabled by default in [Standard and Full presets](https://ckeditor.com/cke4/presets). It can be enabled via [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins) configuration option.
|
||||||
|
|
||||||
|
## CKEditor 4.15.1
|
||||||
|
|
||||||
|
**Security Updates:**
|
||||||
|
|
||||||
|
* Fixed XSS vulnerability in the [Color History feature](https://ckeditor.com/docs/ckeditor4/latest/features/colorbutton.html#color-history) reported by [Mark Wade](https://github.com/mark-wade).
|
||||||
|
|
||||||
|
Issue summary: It was possible to execute an XSS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted HTML code into the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) dialog.
|
||||||
|
|
||||||
|
**An upgrade is highly recommended!**
|
||||||
|
|
||||||
|
Fixed Issues:
|
||||||
|
|
||||||
|
* [#4293](https://github.com/ckeditor/ckeditor4/issues/4293): Fixed: The [`CKEDITOR.inlineAll()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inlineAll) method tries to initialize inline editor also on elements with an editor already attached to them.
|
||||||
|
* [#3961](https://github.com/ckeditor/ckeditor4/issues/3961): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin prevents editing of merged cells.
|
||||||
|
* [#3649](https://github.com/ckeditor/ckeditor4/issues/3649): Fixed: Applying a [block format](https://ckeditor.com/docs/ckeditor4/latest/features/format.html) should remove existing block styles.
|
||||||
|
* [#4282](https://github.com/ckeditor/ckeditor4/issues/4282): Fixed: The [script loader](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_scriptLoader.html) does not execute callback for scripts already loaded when called for the second time. Thanks to [Alexander Korotkevich](https://github.com/aldoom)!
|
||||||
|
* [#4273](https://github.com/ckeditor/ckeditor4/issues/4273): Fixed: A memory leak in the [`CKEDITOR.domReady()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-domReady) method connected with not removing `load` event listeners. Thanks to [rohit1](https://github.com/rohit1)!
|
||||||
|
* [#1330](https://github.com/ckeditor/ckeditor4/issues/1330): Fixed: Incomplete CSS margin parsing if an `auto` or `0` value is used.
|
||||||
|
* [#4286](https://github.com/ckeditor/ckeditor4/issues/4286): Fixed: The [Auto Grow](https://ckeditor.com/cke4/addon/autogrow) plugin causes the editor width to be set to `0` on editor resize.
|
||||||
|
* [#848](https://github.com/ckeditor/ckeditor4/issues/848): Fixed: Arabic text not being "bound" correctly when pasting. Thanks to [Thomas Hunkapiller](https://github.com/devoidfury) and [J. Ivan Duarte Rodríguez](https://github.com/jidrone-mbm)!
|
||||||
|
|
||||||
|
API Changes:
|
||||||
|
|
||||||
|
* [#3649](https://github.com/ckeditor/ckeditor4/issues/3649): Added a new [`stylesRemove`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-stylesRemove) editor event.
|
||||||
|
|
||||||
|
Other Changes:
|
||||||
|
|
||||||
|
* [#4262](https://github.com/ckeditor/ckeditor4/issues/4262): Removed the global reference to the `stylesLoaded` variable. Thanks to [Levi Carter](https://github.com/swiftMessenger)!
|
||||||
|
* Updated the [Export to PDF](https://ckeditor.com/cke4/addon/exportpdf) plugin to `1.0.1` version:
|
||||||
|
* Improved external CSS support for [classic editor](https://ckeditor.com/docs/ckeditor4/latest/examples/classic.html) by handling exceptions and displaying convenient [error messages](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_errors.html#exportpdf-stylesheets-incaccessible).
|
||||||
|
|
||||||
|
## CKEditor 4.15
|
||||||
|
|
||||||
|
New features:
|
||||||
|
|
||||||
|
* [#3940](https://github.com/ckeditor/ckeditor4/issues/3940): Introduced the `colorName` property for customizing foreground and background styles in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin via the [`config.colorButton_foreStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_foreStyle) and [`config.colorButton_backStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_backStyle) configuration options.
|
||||||
|
* [#3793](https://github.com/ckeditor/ckeditor4/issues/3793): Introduced the [Editor Placeholder](https://ckeditor.com/cke4/addon/editorplaceholder) plugin.
|
||||||
|
* [#1795](https://github.com/ckeditor/ckeditor4/issues/1795): The colors picked from the [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) are now stored in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) palette and can be reused easily.
|
||||||
|
* [#3783](https://github.com/ckeditor/ckeditor4/issues/3783): The colors used in the document are now displayed as a part of the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) palette.
|
||||||
|
|
||||||
|
Fixed Issues:
|
||||||
|
|
||||||
|
* [#4060](https://github.com/ckeditor/ckeditor4/issues/4060): Fixed: The content inside a [widget](https://ckeditor.com/cke4/addon/widget) nested editable is escaped twice.
|
||||||
|
* [#4183](https://github.com/ckeditor/ckeditor4/issues/4183): [Safari] Fixed: Incorrect image dimensions when using the [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin alongside the [IFrame Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) plugin.
|
||||||
|
* [#3693](https://github.com/ckeditor/ckeditor4/issues/3693): Fixed: Incorrect default values for several [Color Button](https://ckeditor.com/cke4/addon/colorbutton) configuration variables in the API documentation.
|
||||||
|
* [#3795](https://github.com/ckeditor/ckeditor4/issues/3795): Fixed: Setting the [`config.dataIndentationChars`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-dataIndentationChars) configuration option to an empty string is ignored and replaced by a tab (`\t`) character. Thanks to [Thomas Grinderslev](https://github.com/Znegl)!
|
||||||
|
* [#4107](https://github.com/ckeditor/ckeditor4/issues/4107): Fixed: Multiple [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) instances cause keyboard navigation issues.
|
||||||
|
* [#4041](https://github.com/ckeditor/ckeditor4/issues/4041): Fixed: The[`selection.scrollIntoView`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_selection.html#method-scrollIntoView) method throws an error when the editor selection is not set.
|
||||||
|
* [#3361](https://github.com/ckeditor/ckeditor4/issues/3361): Fixed: Loading multiple [custom editor configurations](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-customConfig) is prone to a race condition between these.
|
||||||
|
* [#4007](https://github.com/ckeditor/ckeditor4/issues/4007): Fixed: Screen readers do not announce the [Rich Combo](https://ckeditor.com/cke4/addon/richcombo) plugin is collapsed or expanded.
|
||||||
|
* [#4141](https://github.com/ckeditor/ckeditor4/issues/4141): Fixed: The styles are incorrectly applied when there is a `<select>` element inside the editor.
|
||||||
|
|
||||||
## CKEditor 4.14.1
|
## CKEditor 4.14.1
|
||||||
|
|
||||||
Fixed Issues:
|
Fixed Issues:
|
||||||
@@ -33,7 +140,7 @@ Other Changes:
|
|||||||
|
|
||||||
Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode or (i) copy the specially crafted HTML code, prepared by the attacker and (ii) paste it into CKEditor in WYSIWYG mode.
|
Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode or (i) copy the specially crafted HTML code, prepared by the attacker and (ii) paste it into CKEditor in WYSIWYG mode.
|
||||||
|
|
||||||
* Fixed XSS vulnerability in the WebSpellChecker plugin reported by [Pham Van Khanh](https://twitter.com/rskvp93) from Viettel Cyber Security.
|
* Fixed XSS vulnerability in the WebSpellChecker Dialog plugin reported by [Pham Van Khanh](https://twitter.com/rskvp93) from Viettel Cyber Security.
|
||||||
|
|
||||||
Issue summary: It was possible to execute XSS using CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, then (iii) switch back to WYSIWYG mode, and (iv) preview CKEditor content outside CKEditor editable area.
|
Issue summary: It was possible to execute XSS using CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, then (iii) switch back to WYSIWYG mode, and (iv) preview CKEditor content outside CKEditor editable area.
|
||||||
|
|
||||||
@@ -52,7 +159,7 @@ Fixed Issues:
|
|||||||
|
|
||||||
* [#3587](https://github.com/ckeditor/ckeditor4/issues/3587): [Edge, IE] Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) with form input elements loses focus during typing.
|
* [#3587](https://github.com/ckeditor/ckeditor4/issues/3587): [Edge, IE] Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) with form input elements loses focus during typing.
|
||||||
* [#3705](https://github.com/ckeditor/ckeditor4/issues/3705): [Safari] Fixed: Safari incorrectly removes blocks with the [`editor.extractSelectedHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-extractSelectedHtml) method after selecting all content.
|
* [#3705](https://github.com/ckeditor/ckeditor4/issues/3705): [Safari] Fixed: Safari incorrectly removes blocks with the [`editor.extractSelectedHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-extractSelectedHtml) method after selecting all content.
|
||||||
* [#1306](https://github.com/ckeditor/ckeditor4/issues/1306): Fixed: The [Font](https://ckeditor.com/cke4/addon/colorbutton) plugin creates nested HTML `<span>` tags when reapplying the same font multiple times.
|
* [#1306](https://github.com/ckeditor/ckeditor4/issues/1306): Fixed: The [Font](https://ckeditor.com/cke4/addon/font) plugin creates nested HTML `<span>` tags when reapplying the same font multiple times.
|
||||||
* [#3498](https://github.com/ckeditor/ckeditor4/issues/3498): Fixed: The editor throws an error during the copy operation when a [widget](https://ckeditor.com/cke4/addon/widget) is partially selected.
|
* [#3498](https://github.com/ckeditor/ckeditor4/issues/3498): Fixed: The editor throws an error during the copy operation when a [widget](https://ckeditor.com/cke4/addon/widget) is partially selected.
|
||||||
* [#2517](https://github.com/ckeditor/ckeditor4/issues/2517): [Chrome, Firefox, Safari] Fixed: Inserting a new image when the selection partially covers an existing [enhanced image](https://ckeditor.com/cke4/addon/image2) widget throws an error.
|
* [#2517](https://github.com/ckeditor/ckeditor4/issues/2517): [Chrome, Firefox, Safari] Fixed: Inserting a new image when the selection partially covers an existing [enhanced image](https://ckeditor.com/cke4/addon/image2) widget throws an error.
|
||||||
* [#3007](https://github.com/ckeditor/ckeditor4/issues/3007): [Chrome, Firefox, Safari] Fixed: Cannot modify the editor content once the selection is released over a [widget](https://ckeditor.com/cke4/addon/widget).
|
* [#3007](https://github.com/ckeditor/ckeditor4/issues/3007): [Chrome, Firefox, Safari] Fixed: Cannot modify the editor content once the selection is released over a [widget](https://ckeditor.com/cke4/addon/widget).
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Software License Agreement
|
|||||||
==========================
|
==========================
|
||||||
|
|
||||||
CKEditor - The text editor for Internet - https://ckeditor.com/
|
CKEditor - The text editor for Internet - https://ckeditor.com/
|
||||||
Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
|
Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
|
||||||
|
|
||||||
Licensed under the terms of any of the following licenses at your
|
Licensed under the terms of any of the following licenses at your
|
||||||
choice:
|
choice:
|
||||||
@@ -37,7 +37,7 @@ done by developers outside of CKSource with their express permission.
|
|||||||
|
|
||||||
The following libraries are included in CKEditor under the MIT license (see Appendix D):
|
The following libraries are included in CKEditor under the MIT license (see Appendix D):
|
||||||
|
|
||||||
* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2020, CKSource - Frederico Knabben.
|
* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2021, CKSource - Frederico Knabben.
|
||||||
* PicoModal (included in `samples/js/sf.js`) - Copyright (c) 2012 James Frasca.
|
* PicoModal (included in `samples/js/sf.js`) - Copyright (c) 2012 James Frasca.
|
||||||
* CodeMirror (included in the samples) - Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others.
|
* CodeMirror (included in the samples) - Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others.
|
||||||
* ES6Promise - Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors.
|
* ES6Promise - Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors.
|
||||||
@@ -1419,3 +1419,17 @@ Redistribution and use in source and binary forms, with or without modification,
|
|||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Appendix H: The BSD-2 License
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
```
|
||||||
|
|
||||||
|
(Ignore this line: %REMOVE_START%)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
CKEditor 4
|
CKEditor 4
|
||||||
==========
|
==========
|
||||||
|
|
||||||
Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
|
Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
|
||||||
https://ckeditor.com - See LICENSE.md for license information.
|
https://ckeditor.com - See LICENSE.md for license information.
|
||||||
|
|
||||||
CKEditor 4 is a text editor to be used inside web pages. It's not a replacement
|
CKEditor 4 is a text editor to be used inside web pages. It's not a replacement
|
||||||
|
|||||||
2
assets/ckeditor/ckeditor/adapters/jquery.js
vendored
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
|
Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
|
||||||
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
||||||
*/
|
*/
|
||||||
(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},
|
(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
|
* @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
|
||||||
* For licensing, see LICENSE.md or https://ckeditor.com/license
|
* For licensing, see LICENSE.md or https://ckeditor.com/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -13,10 +13,10 @@
|
|||||||
* (1) https://ckeditor.com/cke4/builder
|
* (1) https://ckeditor.com/cke4/builder
|
||||||
* Visit online builder to build CKEditor from scratch.
|
* Visit online builder to build CKEditor from scratch.
|
||||||
*
|
*
|
||||||
* (2) https://ckeditor.com/cke4/builder/4e3a4ca28d8cb0c407b480601a63d4b6
|
* (2) https://ckeditor.com/cke4/builder/e431e193e5a737fc50cd68589730b6df
|
||||||
* Visit online builder to build CKEditor, starting with the same setup as before.
|
* Visit online builder to build CKEditor, starting with the same setup as before.
|
||||||
*
|
*
|
||||||
* (3) https://ckeditor.com/cke4/builder/download/4e3a4ca28d8cb0c407b480601a63d4b6
|
* (3) https://ckeditor.com/cke4/builder/download/e431e193e5a737fc50cd68589730b6df
|
||||||
* Straight download link to the latest version of CKEditor (Optimized) with the same setup as before.
|
* Straight download link to the latest version of CKEditor (Optimized) with the same setup as before.
|
||||||
*
|
*
|
||||||
* NOTE:
|
* NOTE:
|
||||||
@@ -39,6 +39,7 @@ var CKBUILDER_CONFIG = {
|
|||||||
'.jshintrc',
|
'.jshintrc',
|
||||||
'.mailmap',
|
'.mailmap',
|
||||||
'.npm',
|
'.npm',
|
||||||
|
'.nvmrc',
|
||||||
'.travis.yml',
|
'.travis.yml',
|
||||||
'bender-err.log',
|
'bender-err.log',
|
||||||
'bender-out.log',
|
'bender-out.log',
|
||||||
@@ -48,6 +49,7 @@ var CKBUILDER_CONFIG = {
|
|||||||
'gruntfile.js',
|
'gruntfile.js',
|
||||||
'less',
|
'less',
|
||||||
'node_modules',
|
'node_modules',
|
||||||
|
'package-lock.json',
|
||||||
'package.json',
|
'package.json',
|
||||||
'tests'
|
'tests'
|
||||||
],
|
],
|
||||||
@@ -64,9 +66,11 @@ var CKBUILDER_CONFIG = {
|
|||||||
'copyformatting' : 1,
|
'copyformatting' : 1,
|
||||||
'dialogadvtab' : 1,
|
'dialogadvtab' : 1,
|
||||||
'div' : 1,
|
'div' : 1,
|
||||||
|
'editorplaceholder' : 1,
|
||||||
'elementspath' : 1,
|
'elementspath' : 1,
|
||||||
'enterkey' : 1,
|
'enterkey' : 1,
|
||||||
'entities' : 1,
|
'entities' : 1,
|
||||||
|
'exportpdf' : 1,
|
||||||
'filebrowser' : 1,
|
'filebrowser' : 1,
|
||||||
'find' : 1,
|
'find' : 1,
|
||||||
'flash' : 1,
|
'flash' : 1,
|
||||||
@@ -90,9 +94,9 @@ var CKBUILDER_CONFIG = {
|
|||||||
'newpage' : 1,
|
'newpage' : 1,
|
||||||
'pagebreak' : 1,
|
'pagebreak' : 1,
|
||||||
'pastefromgdocs' : 1,
|
'pastefromgdocs' : 1,
|
||||||
|
'pastefromlibreoffice' : 1,
|
||||||
'pastefromword' : 1,
|
'pastefromword' : 1,
|
||||||
'pastetext' : 1,
|
'pastetext' : 1,
|
||||||
'pastetools' : 1,
|
|
||||||
'preview' : 1,
|
'preview' : 1,
|
||||||
'print' : 1,
|
'print' : 1,
|
||||||
'removeformat' : 1,
|
'removeformat' : 1,
|
||||||
@@ -114,7 +118,6 @@ var CKBUILDER_CONFIG = {
|
|||||||
'toolbar' : 1,
|
'toolbar' : 1,
|
||||||
'undo' : 1,
|
'undo' : 1,
|
||||||
'uploadimage' : 1,
|
'uploadimage' : 1,
|
||||||
'wsc' : 1,
|
|
||||||
'wysiwygarea' : 1
|
'wysiwygarea' : 1
|
||||||
},
|
},
|
||||||
languages : {
|
languages : {
|
||||||
|
|||||||
1248
assets/ckeditor/ckeditor/ckeditor.js
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
|
* @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
|
||||||
* For licensing, see https://ckeditor.com/legal/ckeditor-oss-license
|
* For licensing, see https://ckeditor.com/legal/ckeditor-oss-license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
|
Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
|
||||||
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||