sigal 2.3__py3-none-any.whl → 2.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. sigal/__init__.py +2 -285
  2. sigal/__main__.py +312 -0
  3. sigal/gallery.py +188 -158
  4. sigal/image.py +113 -115
  5. sigal/log.py +11 -11
  6. sigal/plugins/adjust.py +4 -4
  7. sigal/plugins/compress_assets.py +26 -25
  8. sigal/plugins/copyright.py +8 -8
  9. sigal/plugins/encrypt/encrypt.py +7 -7
  10. sigal/plugins/encrypt/endec.py +2 -2
  11. sigal/plugins/extended_caching.py +26 -22
  12. sigal/plugins/feeds.py +19 -21
  13. sigal/plugins/media_page.py +1 -1
  14. sigal/plugins/nomedia.py +1 -1
  15. sigal/plugins/nonmedia_files.py +59 -93
  16. sigal/plugins/titleregexp.py +98 -0
  17. sigal/plugins/watermark.py +13 -13
  18. sigal/plugins/zip_gallery.py +17 -8
  19. sigal/settings.py +92 -78
  20. sigal/signals.py +10 -10
  21. sigal/templates/sigal.conf.py +18 -14
  22. sigal/themes/default/templates/decrypt.html +1 -0
  23. sigal/themes/default/templates/description.html +29 -0
  24. sigal/themes/default/templates/footer.html +3 -0
  25. sigal/themes/galleria/templates/album_items.html +4 -23
  26. sigal/themes/photoswipe/static/photoswipe-dynamic-caption-plugin.esm.js +414 -0
  27. sigal/themes/photoswipe/static/photoswipe-dynamic-caption-plugin.esm.min.js +5 -0
  28. sigal/themes/photoswipe/static/photoswipe-fullscreen.esm.js +129 -0
  29. sigal/themes/photoswipe/static/photoswipe-fullscreen.esm.min.js +8 -0
  30. sigal/themes/photoswipe/static/photoswipe-lightbox.esm.js +1960 -0
  31. sigal/themes/photoswipe/static/photoswipe-lightbox.esm.js.map +1 -0
  32. sigal/themes/photoswipe/static/photoswipe-lightbox.esm.min.js +5 -0
  33. sigal/themes/photoswipe/static/photoswipe-video-plugin.esm.js +257 -0
  34. sigal/themes/photoswipe/static/photoswipe-video-plugin.esm.min.js +1 -0
  35. sigal/themes/photoswipe/static/photoswipe.css +385 -140
  36. sigal/themes/photoswipe/static/photoswipe.esm.js +7081 -0
  37. sigal/themes/photoswipe/static/photoswipe.esm.js.map +1 -0
  38. sigal/themes/photoswipe/static/photoswipe.esm.min.js +5 -0
  39. sigal/themes/photoswipe/static/styles.css +53 -0
  40. sigal/themes/photoswipe/templates/album.html +69 -74
  41. sigal/utils.py +80 -12
  42. sigal/version.py +20 -4
  43. sigal/video.py +43 -24
  44. sigal/writer.py +26 -8
  45. {sigal-2.3.dist-info → sigal-2.5.dist-info}/LICENSE +1 -1
  46. {sigal-2.3.dist-info → sigal-2.5.dist-info}/METADATA +23 -30
  47. {sigal-2.3.dist-info → sigal-2.5.dist-info}/RECORD +50 -50
  48. {sigal-2.3.dist-info → sigal-2.5.dist-info}/WHEEL +1 -1
  49. sigal-2.5.dist-info/entry_points.txt +2 -0
  50. sigal/plugins/upload_s3.py +0 -106
  51. sigal/themes/photoswipe/static/app.js +0 -214
  52. sigal/themes/photoswipe/static/default-skin/default-skin.css +0 -485
  53. sigal/themes/photoswipe/static/default-skin/default-skin.css.map +0 -10
  54. sigal/themes/photoswipe/static/default-skin/default-skin.png +0 -0
  55. sigal/themes/photoswipe/static/default-skin/default-skin.svg +0 -36
  56. sigal/themes/photoswipe/static/default-skin/preloader.gif +0 -0
  57. sigal/themes/photoswipe/static/echo/blank.gif +0 -0
  58. sigal/themes/photoswipe/static/echo/echo.js +0 -135
  59. sigal/themes/photoswipe/static/echo/echo.min.js +0 -2
  60. sigal/themes/photoswipe/static/photoswipe-ui-default.js +0 -871
  61. sigal/themes/photoswipe/static/photoswipe-ui-default.min.js +0 -1
  62. sigal/themes/photoswipe/static/photoswipe.css.map +0 -10
  63. sigal/themes/photoswipe/static/photoswipe.js +0 -3592
  64. sigal/themes/photoswipe/static/photoswipe.min.js +0 -1
  65. sigal-2.3.dist-info/entry_points.txt +0 -2
  66. {sigal-2.3.dist-info → sigal-2.5.dist-info}/top_level.txt +0 -0
@@ -1,214 +0,0 @@
1
- echo.init({
2
- offset: 100,
3
- throttle: 250,
4
- unload: false
5
- });
6
-
7
- var initPhotoSwipeFromDOM = function(gallerySelector) {
8
-
9
- // parse slide data (url, title, size ...) from DOM elements
10
- // (children of gallerySelector)
11
- var parseThumbnailElements = function(el) {
12
- var thumbElements = el.childNodes,
13
- numNodes = thumbElements.length,
14
- items = [],
15
- figureEl,
16
- linkEl,
17
- size,
18
- item;
19
-
20
- for(var i = 0; i < numNodes; i++) {
21
-
22
- figureEl = thumbElements[i]; // <figure> element
23
-
24
- // include only element nodes
25
- if(figureEl.nodeType !== 1) {
26
- continue;
27
- }
28
-
29
- linkEl = figureEl.children[0]; // <a> element
30
-
31
- // create slide object
32
- if (linkEl.getAttribute('data-type') == 'video') {
33
- item = {
34
- html: linkEl.getAttribute('data-video')
35
- };
36
- } else {
37
- size = linkEl.getAttribute('data-size').split('x');
38
- item = {
39
- src: linkEl.getAttribute('href'),
40
- w: parseInt(size[0], 10),
41
- h: parseInt(size[1], 10)
42
- };
43
- }
44
-
45
- if(figureEl.children.length > 1) {
46
- // <figcaption> content
47
- item.title = figureEl.children[1].innerHTML;
48
- }
49
-
50
- if(linkEl.children.length > 0) {
51
- // <img> thumbnail element, retrieving thumbnail url
52
- item.msrc = linkEl.children[0].getAttribute('data-echo');
53
- }
54
-
55
- item.el = figureEl; // save link to element for getThumbBoundsFn
56
- items.push(item);
57
- }
58
-
59
- return items;
60
- };
61
-
62
- // find nearest parent element
63
- var closest = function closest(el, fn) {
64
- return el && ( fn(el) ? el : closest(el.parentNode, fn) );
65
- };
66
-
67
- // triggers when user clicks on thumbnail
68
- var onThumbnailsClick = function(e) {
69
- e = e || window.event;
70
- e.preventDefault ? e.preventDefault() : e.returnValue = false;
71
-
72
- var eTarget = e.target || e.srcElement;
73
-
74
- // find root element of slide
75
- var clickedListItem = closest(eTarget, function(el) {
76
- return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
77
- });
78
-
79
- if(!clickedListItem) {
80
- return;
81
- }
82
-
83
- // find index of clicked item by looping through all child nodes
84
- // alternatively, you may define index via data- attribute
85
- var clickedGallery = clickedListItem.parentNode,
86
- childNodes = clickedListItem.parentNode.childNodes,
87
- numChildNodes = childNodes.length,
88
- nodeIndex = 0,
89
- index;
90
-
91
- for (var i = 0; i < numChildNodes; i++) {
92
- if(childNodes[i].nodeType !== 1) {
93
- continue;
94
- }
95
-
96
- if(childNodes[i] === clickedListItem) {
97
- index = nodeIndex;
98
- break;
99
- }
100
- nodeIndex++;
101
- }
102
-
103
-
104
-
105
- if(index >= 0) {
106
- // open PhotoSwipe if valid index found
107
- openPhotoSwipe( index, clickedGallery );
108
- }
109
- return false;
110
- };
111
-
112
- // parse picture index and gallery index from URL (#&pid=1&gid=2)
113
- var photoswipeParseHash = function() {
114
- var hash = window.location.hash.substring(1),
115
- params = {};
116
-
117
- if(hash.length < 5) {
118
- return params;
119
- }
120
-
121
- var vars = hash.split('&');
122
- for (var i = 0; i < vars.length; i++) {
123
- if(!vars[i]) {
124
- continue;
125
- }
126
- var pair = vars[i].split('=');
127
- if(pair.length < 2) {
128
- continue;
129
- }
130
- params[pair[0]] = pair[1];
131
- }
132
-
133
- if(params.gid) {
134
- params.gid = parseInt(params.gid, 10);
135
- }
136
-
137
- return params;
138
- };
139
-
140
- var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
141
- var pswpElement = document.querySelectorAll('.pswp')[0],
142
- gallery,
143
- options,
144
- items;
145
-
146
- items = parseThumbnailElements(galleryElement);
147
-
148
- // define options (if needed)
149
- options = {
150
-
151
- // define gallery index (for URL)
152
- galleryUID: galleryElement.getAttribute('data-pswp-uid'),
153
-
154
- getThumbBoundsFn: function(index) {
155
- // See Options -> getThumbBoundsFn section of documentation for more info
156
- var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
157
- pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
158
- rect = thumbnail.getBoundingClientRect();
159
-
160
- return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
161
- }
162
-
163
- };
164
-
165
- // PhotoSwipe opened from URL
166
- if(fromURL) {
167
- if(options.galleryPIDs) {
168
- // parse real index when custom PIDs are used
169
- // http://photoswipe.com/documentation/faq.html#custom-pid-in-url
170
- for(var j = 0; j < items.length; j++) {
171
- if(items[j].pid == index) {
172
- options.index = j;
173
- break;
174
- }
175
- }
176
- } else {
177
- // in URL indexes start from 1
178
- options.index = parseInt(index, 10) - 1;
179
- }
180
- } else {
181
- options.index = parseInt(index, 10);
182
- }
183
-
184
- // exit if index not found
185
- if( isNaN(options.index) ) {
186
- return;
187
- }
188
-
189
- if(disableAnimation) {
190
- options.showAnimationDuration = 0;
191
- }
192
-
193
- // Pass data to PhotoSwipe and initialize it
194
- gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
195
- gallery.init();
196
- };
197
-
198
- // loop through all gallery elements and bind events
199
- var galleryElements = document.querySelectorAll( gallerySelector );
200
-
201
- for(var i = 0, l = galleryElements.length; i < l; i++) {
202
- galleryElements[i].setAttribute('data-pswp-uid', i+1);
203
- galleryElements[i].onclick = onThumbnailsClick;
204
- }
205
-
206
- // Parse URL and open gallery if it contains #&pid=3&gid=1
207
- var hashData = photoswipeParseHash();
208
- if(hashData.pid && hashData.gid) {
209
- openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true );
210
- }
211
- };
212
-
213
- // execute above function
214
- initPhotoSwipeFromDOM('.gallery');
@@ -1,485 +0,0 @@
1
- /*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */
2
- /*
3
-
4
- Contents:
5
-
6
- 1. Buttons
7
- 2. Share modal and links
8
- 3. Index indicator ("1 of X" counter)
9
- 4. Caption
10
- 5. Loading indicator
11
- 6. Additional styles (root element, top bar, idle state, hidden state, etc.)
12
-
13
- */
14
- /*
15
-
16
- 1. Buttons
17
-
18
- */
19
- /* <button> css reset */
20
- .pswp__button {
21
- width: 44px;
22
- height: 44px;
23
- position: relative;
24
- background: none;
25
- cursor: pointer;
26
- overflow: visible;
27
- -webkit-appearance: none;
28
- display: block;
29
- border: 0;
30
- padding: 0;
31
- margin: 0;
32
- float: right;
33
- opacity: 0.75;
34
- -webkit-transition: opacity 0.2s;
35
- transition: opacity 0.2s;
36
- -webkit-box-shadow: none;
37
- box-shadow: none; }
38
- .pswp__button:focus, .pswp__button:hover {
39
- opacity: 1; }
40
- .pswp__button:active {
41
- outline: none;
42
- opacity: 0.9; }
43
- .pswp__button::-moz-focus-inner {
44
- padding: 0;
45
- border: 0; }
46
-
47
- /* pswp__ui--over-close class it added when mouse is over element that should close gallery */
48
- .pswp__ui--over-close .pswp__button--close {
49
- opacity: 1; }
50
-
51
- .pswp__button,
52
- .pswp__button--arrow--left:before,
53
- .pswp__button--arrow--right:before {
54
- background: url(default-skin.png) 0 0 no-repeat;
55
- background-size: 264px 88px;
56
- width: 44px;
57
- height: 44px; }
58
-
59
- @media (-webkit-min-device-pixel-ratio: 1.1), (-webkit-min-device-pixel-ratio: 1.09375), (min-resolution: 105dpi), (min-resolution: 1.1dppx) {
60
- /* Serve SVG sprite if browser supports SVG and resolution is more than 105dpi */
61
- .pswp--svg .pswp__button,
62
- .pswp--svg .pswp__button--arrow--left:before,
63
- .pswp--svg .pswp__button--arrow--right:before {
64
- background-image: url(default-skin.svg); }
65
- .pswp--svg .pswp__button--arrow--left,
66
- .pswp--svg .pswp__button--arrow--right {
67
- background: none; } }
68
-
69
- .pswp__button--close {
70
- background-position: 0 -44px; }
71
-
72
- .pswp__button--share {
73
- background-position: -44px -44px; }
74
-
75
- .pswp__button--download {
76
- background-position: -176px 0; }
77
-
78
- .pswp__button--fs {
79
- display: none; }
80
-
81
- .pswp--supports-fs .pswp__button--fs {
82
- display: block; }
83
-
84
- .pswp--fs .pswp__button--fs {
85
- background-position: -44px 0; }
86
-
87
- .pswp__button--zoom {
88
- display: none;
89
- background-position: -88px 0; }
90
-
91
- .pswp--zoom-allowed .pswp__button--zoom {
92
- display: block; }
93
-
94
- .pswp--zoomed-in .pswp__button--zoom {
95
- background-position: -132px 0; }
96
-
97
- /* no arrows on touch screens */
98
- .pswp--touch:not(.pswp--preventswipe) .pswp__button--arrow--left,
99
- .pswp--touch:not(.pswp--preventswipe) .pswp__button--arrow--right {
100
- visibility: hidden; }
101
-
102
- /*
103
- Arrow buttons hit area
104
- (icon is added to :before pseudo-element)
105
- */
106
- .pswp__button--arrow--left,
107
- .pswp__button--arrow--right {
108
- background: none;
109
- top: 50%;
110
- margin-top: -50px;
111
- width: 70px;
112
- height: 100px;
113
- position: absolute; }
114
-
115
- .pswp__button--arrow--left {
116
- left: 0; }
117
-
118
- .pswp__button--arrow--right {
119
- right: 0; }
120
-
121
- .pswp__button--arrow--left:before,
122
- .pswp__button--arrow--right:before {
123
- content: '';
124
- top: 35px;
125
- background-color: rgba(0, 0, 0, 0.3);
126
- height: 30px;
127
- width: 32px;
128
- position: absolute; }
129
-
130
- .pswp__button--arrow--left:before {
131
- left: 6px;
132
- background-position: -138px -44px; }
133
-
134
- .pswp__button--arrow--right:before {
135
- right: 6px;
136
- background-position: -94px -44px; }
137
-
138
- /*
139
-
140
- 2. Share modal/popup and links
141
-
142
- */
143
- .pswp__counter,
144
- .pswp__share-modal {
145
- -webkit-user-select: none;
146
- -ms-user-select: none;
147
- user-select: none; }
148
-
149
- .pswp__share-modal {
150
- display: block;
151
- background: rgba(0, 0, 0, 0.5);
152
- width: 100%;
153
- height: 100%;
154
- top: 0;
155
- left: 0;
156
- padding: 10px;
157
- position: absolute;
158
- z-index: 16777371;
159
- opacity: 0;
160
- -webkit-transition: opacity 0.25s ease-out;
161
- transition: opacity 0.25s ease-out;
162
- -webkit-backface-visibility: hidden;
163
- will-change: opacity; }
164
-
165
- .pswp__share-modal--hidden {
166
- display: none; }
167
-
168
- .pswp__share-tooltip {
169
- z-index: 16777391;
170
- position: absolute;
171
- background: #fff;
172
- top: 56px;
173
- border-radius: 2px;
174
- display: block;
175
- width: auto;
176
- right: 44px;
177
- -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
178
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
179
- -webkit-transform: translateY(6px);
180
- -ms-transform: translateY(6px);
181
- transform: translateY(6px);
182
- -webkit-transition: -webkit-transform 0.25s;
183
- transition: transform 0.25s;
184
- -webkit-backface-visibility: hidden;
185
- will-change: transform; }
186
- .pswp__share-tooltip a {
187
- display: block;
188
- padding: 8px 12px;
189
- color: #000;
190
- text-decoration: none;
191
- font-size: 14px;
192
- line-height: 18px; }
193
- .pswp__share-tooltip a:hover {
194
- text-decoration: none;
195
- color: #000; }
196
- .pswp__share-tooltip a:first-child {
197
- /* round corners on the first/last list item */
198
- border-radius: 2px 2px 0 0; }
199
- .pswp__share-tooltip a:last-child {
200
- border-radius: 0 0 2px 2px; }
201
-
202
- .pswp__share-modal--fade-in {
203
- opacity: 1; }
204
- .pswp__share-modal--fade-in .pswp__share-tooltip {
205
- -webkit-transform: translateY(0);
206
- -ms-transform: translateY(0);
207
- transform: translateY(0); }
208
-
209
- /* increase size of share links on touch devices */
210
- .pswp--touch .pswp__share-tooltip a {
211
- padding: 16px 12px; }
212
-
213
- a.pswp__share--facebook:before {
214
- content: '';
215
- display: block;
216
- width: 0;
217
- height: 0;
218
- position: absolute;
219
- top: -12px;
220
- right: 15px;
221
- border: 6px solid rgba(0, 0, 0, 0);
222
- border-bottom-color: #fff;
223
- -webkit-pointer-events: none;
224
- -moz-pointer-events: none;
225
- pointer-events: none; }
226
-
227
- a.pswp__share--facebook:hover {
228
- background: #3e5c9a;
229
- color: #fff; }
230
- a.pswp__share--facebook:hover:before {
231
- border-bottom-color: #3e5c9a; }
232
-
233
- a.pswp__share--twitter:hover {
234
- background: #55acee;
235
- color: #fff; }
236
-
237
- a.pswp__share--pinterest:hover {
238
- background: #ccc;
239
- color: #ce272d; }
240
-
241
- a.pswp__share--download:hover {
242
- background: #ddd; }
243
-
244
- /*
245
-
246
- 3. Index indicator ("1 of X" counter)
247
-
248
- */
249
- .pswp__counter {
250
- position: absolute;
251
- left: 0;
252
- top: 0;
253
- height: 44px;
254
- font-size: 13px;
255
- line-height: 44px;
256
- color: #fff;
257
- opacity: 0.75;
258
- padding: 0 10px; }
259
-
260
- /*
261
-
262
- 4. Caption
263
-
264
- */
265
- .pswp__caption {
266
- position: absolute;
267
- left: 0;
268
- bottom: 0;
269
- width: 100%;
270
- min-height: 44px; }
271
- .pswp__caption small {
272
- font-size: 11px;
273
- color: #bbb; }
274
-
275
- .pswp__caption__center {
276
- text-align: center;
277
- max-width: 420px;
278
- margin: 0 auto;
279
- font-size: 13px;
280
- padding: 10px;
281
- line-height: 20px;
282
- color: #ccc; }
283
-
284
- .pswp__caption--empty {
285
- display: none; }
286
-
287
- /* Fake caption element, used to calculate height of next/prev image */
288
- .pswp__caption--fake {
289
- visibility: hidden; }
290
-
291
- /*
292
-
293
- 5. Loading indicator (preloader)
294
-
295
- You can play with it here - http://codepen.io/dimsemenov/pen/yyBWoR
296
-
297
- */
298
- .pswp__preloader {
299
- width: 44px;
300
- height: 44px;
301
- position: absolute;
302
- top: 0;
303
- left: 50%;
304
- margin-left: -22px;
305
- opacity: 0;
306
- -webkit-transition: opacity 0.25s ease-out;
307
- transition: opacity 0.25s ease-out;
308
- will-change: opacity;
309
- direction: ltr; }
310
-
311
- .pswp__preloader__icn {
312
- width: 20px;
313
- height: 20px;
314
- margin: 12px; }
315
-
316
- .pswp__preloader--active {
317
- opacity: 1; }
318
- .pswp__preloader--active .pswp__preloader__icn {
319
- /* We use .gif in browsers that don't support CSS animation */
320
- background: url(preloader.gif) 0 0 no-repeat; }
321
-
322
- .pswp--css_animation .pswp__preloader--active {
323
- opacity: 1; }
324
- .pswp--css_animation .pswp__preloader--active .pswp__preloader__icn {
325
- -webkit-animation: clockwise 500ms linear infinite;
326
- animation: clockwise 500ms linear infinite; }
327
- .pswp--css_animation .pswp__preloader--active .pswp__preloader__donut {
328
- -webkit-animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
329
- animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite; }
330
-
331
- .pswp--css_animation .pswp__preloader__icn {
332
- background: none;
333
- opacity: 0.75;
334
- width: 14px;
335
- height: 14px;
336
- position: absolute;
337
- left: 15px;
338
- top: 15px;
339
- margin: 0; }
340
-
341
- .pswp--css_animation .pswp__preloader__cut {
342
- /*
343
- The idea of animating inner circle is based on Polymer ("material") loading indicator
344
- by Keanu Lee https://blog.keanulee.com/2014/10/20/the-tale-of-three-spinners.html
345
- */
346
- position: relative;
347
- width: 7px;
348
- height: 14px;
349
- overflow: hidden; }
350
-
351
- .pswp--css_animation .pswp__preloader__donut {
352
- -webkit-box-sizing: border-box;
353
- box-sizing: border-box;
354
- width: 14px;
355
- height: 14px;
356
- border: 2px solid #fff;
357
- border-radius: 50%;
358
- border-left-color: transparent;
359
- border-bottom-color: transparent;
360
- position: absolute;
361
- top: 0;
362
- left: 0;
363
- background: none;
364
- margin: 0; }
365
-
366
- @media screen and (max-width: 1024px) {
367
- .pswp__preloader {
368
- position: relative;
369
- left: auto;
370
- top: auto;
371
- margin: 0;
372
- float: right; } }
373
-
374
- @-webkit-keyframes clockwise {
375
- 0% {
376
- -webkit-transform: rotate(0deg);
377
- transform: rotate(0deg); }
378
- 100% {
379
- -webkit-transform: rotate(360deg);
380
- transform: rotate(360deg); } }
381
-
382
- @keyframes clockwise {
383
- 0% {
384
- -webkit-transform: rotate(0deg);
385
- transform: rotate(0deg); }
386
- 100% {
387
- -webkit-transform: rotate(360deg);
388
- transform: rotate(360deg); } }
389
-
390
- @-webkit-keyframes donut-rotate {
391
- 0% {
392
- -webkit-transform: rotate(0);
393
- transform: rotate(0); }
394
- 50% {
395
- -webkit-transform: rotate(-140deg);
396
- transform: rotate(-140deg); }
397
- 100% {
398
- -webkit-transform: rotate(0);
399
- transform: rotate(0); } }
400
-
401
- @keyframes donut-rotate {
402
- 0% {
403
- -webkit-transform: rotate(0);
404
- transform: rotate(0); }
405
- 50% {
406
- -webkit-transform: rotate(-140deg);
407
- transform: rotate(-140deg); }
408
- 100% {
409
- -webkit-transform: rotate(0);
410
- transform: rotate(0); } }
411
-
412
- /*
413
-
414
- 6. Additional styles
415
-
416
- */
417
- /* root element of UI */
418
- .pswp__ui {
419
- -webkit-font-smoothing: auto;
420
- visibility: visible;
421
- opacity: 1;
422
- z-index: 16777321; }
423
-
424
- /* top black bar with buttons and "1 of X" indicator */
425
- .pswp__top-bar {
426
- position: absolute;
427
- left: 0;
428
- top: 0;
429
- height: 44px;
430
- width: 100%; }
431
-
432
- .pswp__caption,
433
- .pswp__top-bar,
434
- .pswp--has_mouse .pswp__button--arrow--left,
435
- .pswp--has_mouse .pswp__button--arrow--right {
436
- -webkit-backface-visibility: hidden;
437
- will-change: opacity;
438
- -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
439
- transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
440
-
441
- /* pswp--has_mouse class is added only when two subsequent mousemove events occur */
442
- .pswp--has_mouse .pswp__button--arrow--left,
443
- .pswp--has_mouse .pswp__button--arrow--right {
444
- visibility: visible; }
445
-
446
- .pswp__top-bar,
447
- .pswp__caption {
448
- background-color: rgba(0, 0, 0, 0.5); }
449
-
450
- /* pswp__ui--fit class is added when main image "fits" between top bar and bottom bar (caption) */
451
- .pswp__ui--fit .pswp__top-bar,
452
- .pswp__ui--fit .pswp__caption {
453
- background-color: rgba(0, 0, 0, 0.3); }
454
-
455
- /* pswp__ui--idle class is added when mouse isn't moving for several seconds (JS option timeToIdle) */
456
- .pswp__ui--idle .pswp__top-bar {
457
- opacity: 0; }
458
-
459
- .pswp__ui--idle .pswp__button--arrow--left,
460
- .pswp__ui--idle .pswp__button--arrow--right {
461
- opacity: 0; }
462
-
463
- /*
464
- pswp__ui--hidden class is added when controls are hidden
465
- e.g. when user taps to toggle visibility of controls
466
- */
467
- .pswp__ui--hidden .pswp__top-bar,
468
- .pswp__ui--hidden .pswp__caption,
469
- .pswp__ui--hidden .pswp__button--arrow--left,
470
- .pswp__ui--hidden .pswp__button--arrow--right {
471
- /* Force paint & create composition layer for controls. */
472
- opacity: 0.001;
473
- visibility: hidden; }
474
-
475
- /* pswp__ui--one-slide class is added when there is just one item in gallery */
476
- .pswp__ui--one-slide .pswp__button--arrow--left,
477
- .pswp__ui--one-slide .pswp__button--arrow--right,
478
- .pswp__ui--one-slide .pswp__counter {
479
- display: none; }
480
-
481
- .pswp__element--disabled {
482
- display: none !important; }
483
-
484
- .pswp--minimal--dark .pswp__top-bar {
485
- background: none; }