diff --git a/COPYRIGHT b/COPYRIGHT index 0a3fefbf4..2dea3e322 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -29,3 +29,4 @@ This project includes the work of others, namely: * reportlab, (c) ReportLab Europe Ltd, BSD License * django-compressor, (c) Jannis Leidel and contributors, MIT License * static3, (c) Roman Mohr and contributors, LGPL License +* Lightbox, (c) Lokesh Dhakar, MIT License diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index ca807454a..a9e1b00db 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -75,5 +75,8 @@ {% endblocktrans %} {% endwith %} +{% compress js %} + +{% endcompress %} diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index a1364617a..c6050fa26 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -62,9 +62,12 @@
{% if item.picture %} - {{ item.name }} + + {{ item.name }} + {% endif %} {{ item.name }} @@ -118,6 +121,14 @@ {% else %}
+ {% if item.picture %} + + {{ item.name }} + + {% endif %} {{ item.name }} {% if item.short_description %}

{{ item.short_description }}

{% endif %}
diff --git a/src/static/lightbox/css/lightbox.css b/src/static/lightbox/css/lightbox.css new file mode 100644 index 000000000..e48791aa2 --- /dev/null +++ b/src/static/lightbox/css/lightbox.css @@ -0,0 +1,210 @@ +/* Preload images */ +body:after { + content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png) url(../images/next.png); + display: none; +} + +.lightboxOverlay { + position: absolute; + top: 0; + left: 0; + z-index: 9999; + background-color: black; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + opacity: 0.8; + display: none; +} + +.lightbox { + position: absolute; + left: 0; + width: 100%; + z-index: 10000; + text-align: center; + line-height: 0; + font-weight: normal; +} + +.lightbox .lb-image { + display: block; + height: auto; + max-width: inherit; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -ms-border-radius: 3px; + -o-border-radius: 3px; + border-radius: 3px; +} + +.lightbox a img { + border: none; +} + +.lb-outerContainer { + position: relative; + background-color: white; + *zoom: 1; + width: 250px; + height: 250px; + margin: 0 auto; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} + +.lb-outerContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-container { + padding: 4px; +} + +.lb-loader { + position: absolute; + top: 43%; + left: 0; + height: 25%; + width: 100%; + text-align: center; + line-height: 0; +} + +.lb-cancel { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + background: url(../images/loading.gif) no-repeat; +} + +.lb-nav { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 10; +} + +.lb-container > .nav { + left: 0; +} + +.lb-nav a { + outline: none; + background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); +} + +.lb-prev, .lb-next { + height: 100%; + cursor: pointer; + display: block; +} + +.lb-nav a.lb-prev { + width: 34%; + left: 0; + float: left; + background: url(../images/prev.png) left 48% no-repeat; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + -o-transition: opacity 0.6s; + transition: opacity 0.6s; +} + +.lb-nav a.lb-prev:hover { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +.lb-nav a.lb-next { + width: 64%; + right: 0; + float: right; + background: url(../images/next.png) right 48% no-repeat; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + -o-transition: opacity 0.6s; + transition: opacity 0.6s; +} + +.lb-nav a.lb-next:hover { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +.lb-dataContainer { + margin: 0 auto; + padding-top: 5px; + *zoom: 1; + width: 100%; + -moz-border-radius-bottomleft: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.lb-dataContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-data { + padding: 0 4px; + color: #ccc; +} + +.lb-data .lb-details { + width: 85%; + float: left; + text-align: left; + line-height: 1.1em; +} + +.lb-data .lb-caption { + font-size: 13px; + font-weight: bold; + line-height: 1em; +} + +.lb-data .lb-number { + display: block; + clear: left; + padding-bottom: 1em; + font-size: 12px; + color: #999999; +} + +.lb-data .lb-close { + display: block; + float: right; + width: 30px; + height: 30px; + background: url(../images/close.png) top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.lb-data .lb-close:hover { + cursor: pointer; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} diff --git a/src/static/lightbox/images/close.png b/src/static/lightbox/images/close.png new file mode 100644 index 000000000..20baa1db5 Binary files /dev/null and b/src/static/lightbox/images/close.png differ diff --git a/src/static/lightbox/images/loading.gif b/src/static/lightbox/images/loading.gif new file mode 100644 index 000000000..5087c2a64 Binary files /dev/null and b/src/static/lightbox/images/loading.gif differ diff --git a/src/static/lightbox/images/next.png b/src/static/lightbox/images/next.png new file mode 100644 index 000000000..08365ac84 Binary files /dev/null and b/src/static/lightbox/images/next.png differ diff --git a/src/static/lightbox/images/prev.png b/src/static/lightbox/images/prev.png new file mode 100644 index 000000000..329fa9860 Binary files /dev/null and b/src/static/lightbox/images/prev.png differ diff --git a/src/static/lightbox/js/lightbox.js b/src/static/lightbox/js/lightbox.js new file mode 100644 index 000000000..e4689f4c2 --- /dev/null +++ b/src/static/lightbox/js/lightbox.js @@ -0,0 +1,444 @@ +/*! + * Lightbox v2.8.1 + * by Lokesh Dhakar + * + * More info: + * http://lokeshdhakar.com/projects/lightbox2/ + * + * Copyright 2007, 2015 Lokesh Dhakar + * Released under the MIT license + * https://github.com/lokesh/lightbox2/blob/master/LICENSE + */ + +// Uses Node, AMD or browser globals to create a module. +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(require('jquery')); + } else { + // Browser globals (root is window) + root.lightbox = factory(root.jQuery); + } +}(this, function ($) { + + function Lightbox(options) { + this.album = []; + this.currentImageIndex = void 0; + this.init(); + + // options + this.options = $.extend({}, this.constructor.defaults); + this.option(options); + } + + // Descriptions of all options available on the demo site: + // http://lokeshdhakar.com/projects/lightbox2/index.html#options + Lightbox.defaults = { + albumLabel: 'Image %1 of %2', + alwaysShowNavOnTouchDevices: false, + fadeDuration: 500, + fitImagesInViewport: true, + // maxWidth: 800, + // maxHeight: 600, + positionFromTop: 50, + resizeDuration: 700, + showImageNumberLabel: true, + wrapAround: false + }; + + Lightbox.prototype.option = function(options) { + $.extend(this.options, options); + }; + + Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) { + return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages); + }; + + Lightbox.prototype.init = function() { + this.enable(); + this.build(); + }; + + // Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes + // that contain 'lightbox'. When these are clicked, start lightbox. + Lightbox.prototype.enable = function() { + var self = this; + $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) { + self.start($(event.currentTarget)); + return false; + }); + }; + + // Build html for the lightbox and the overlay. + // Attach event handlers to the new DOM elements. click click click + Lightbox.prototype.build = function() { + var self = this; + $('
').appendTo($('body')); + + // Cache jQuery objects + this.$lightbox = $('#lightbox'); + this.$overlay = $('#lightboxOverlay'); + this.$outerContainer = this.$lightbox.find('.lb-outerContainer'); + this.$container = this.$lightbox.find('.lb-container'); + + // Store css values for future lookup + this.containerTopPadding = parseInt(this.$container.css('padding-top'), 10); + this.containerRightPadding = parseInt(this.$container.css('padding-right'), 10); + this.containerBottomPadding = parseInt(this.$container.css('padding-bottom'), 10); + this.containerLeftPadding = parseInt(this.$container.css('padding-left'), 10); + + // Attach event handlers to the newly minted DOM elements + this.$overlay.hide().on('click', function() { + self.end(); + return false; + }); + + this.$lightbox.hide().on('click', function(event) { + if ($(event.target).attr('id') === 'lightbox') { + self.end(); + } + return false; + }); + + this.$outerContainer.on('click', function(event) { + if ($(event.target).attr('id') === 'lightbox') { + self.end(); + } + return false; + }); + + this.$lightbox.find('.lb-prev').on('click', function() { + if (self.currentImageIndex === 0) { + self.changeImage(self.album.length - 1); + } else { + self.changeImage(self.currentImageIndex - 1); + } + return false; + }); + + this.$lightbox.find('.lb-next').on('click', function() { + if (self.currentImageIndex === self.album.length - 1) { + self.changeImage(0); + } else { + self.changeImage(self.currentImageIndex + 1); + } + return false; + }); + + this.$lightbox.find('.lb-loader, .lb-close').on('click', function() { + self.end(); + return false; + }); + }; + + // Show overlay and lightbox. If the image is part of a set, add siblings to album array. + Lightbox.prototype.start = function($link) { + var self = this; + var $window = $(window); + + $window.on('resize', $.proxy(this.sizeOverlay, this)); + + $('select, object, embed').css({ + visibility: 'hidden' + }); + + this.sizeOverlay(); + + this.album = []; + var imageNumber = 0; + + function addToAlbum($link) { + self.album.push({ + link: $link.attr('href'), + title: $link.attr('data-title') || $link.attr('title') + }); + } + + // Support both data-lightbox attribute and rel attribute implementations + var dataLightboxValue = $link.attr('data-lightbox'); + var $links; + + if (dataLightboxValue) { + $links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]'); + for (var i = 0; i < $links.length; i = ++i) { + addToAlbum($($links[i])); + if ($links[i] === $link[0]) { + imageNumber = i; + } + } + } else { + if ($link.attr('rel') === 'lightbox') { + // If image is not part of a set + addToAlbum($link); + } else { + // If image is part of a set + $links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]'); + for (var j = 0; j < $links.length; j = ++j) { + addToAlbum($($links[j])); + if ($links[j] === $link[0]) { + imageNumber = j; + } + } + } + } + + // Position Lightbox + var top = $window.scrollTop() + this.options.positionFromTop; + var left = $window.scrollLeft(); + this.$lightbox.css({ + top: top + 'px', + left: left + 'px' + }).fadeIn(this.options.fadeDuration); + + this.changeImage(imageNumber); + }; + + // Hide most UI elements in preparation for the animated resizing of the lightbox. + Lightbox.prototype.changeImage = function(imageNumber) { + var self = this; + + this.disableKeyboardNav(); + var $image = this.$lightbox.find('.lb-image'); + + this.$overlay.fadeIn(this.options.fadeDuration); + + $('.lb-loader').fadeIn('slow'); + this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide(); + + this.$outerContainer.addClass('animating'); + + // When image to show is preloaded, we send the width and height to sizeContainer() + var preloader = new Image(); + preloader.onload = function() { + var $preloader; + var imageHeight; + var imageWidth; + var maxImageHeight; + var maxImageWidth; + var windowHeight; + var windowWidth; + + $image.attr('src', self.album[imageNumber].link); + + $preloader = $(preloader); + + $image.width(preloader.width); + $image.height(preloader.height); + + if (self.options.fitImagesInViewport) { + // Fit image inside the viewport. + // Take into account the border around the image and an additional 10px gutter on each side. + + windowWidth = $(window).width(); + windowHeight = $(window).height(); + maxImageWidth = windowWidth - self.containerLeftPadding - self.containerRightPadding - 20; + maxImageHeight = windowHeight - self.containerTopPadding - self.containerBottomPadding - 120; + + // Check if image size is larger then maxWidth|maxHeight in settings + if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) { + maxImageWidth = self.options.maxWidth; + } + if (self.options.maxHeight && self.options.maxHeight < maxImageWidth) { + maxImageHeight = self.options.maxHeight; + } + + // Is there a fitting issue? + if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) { + if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) { + imageWidth = maxImageWidth; + imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10); + $image.width(imageWidth); + $image.height(imageHeight); + } else { + imageHeight = maxImageHeight; + imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10); + $image.width(imageWidth); + $image.height(imageHeight); + } + } + } + self.sizeContainer($image.width(), $image.height()); + }; + + preloader.src = this.album[imageNumber].link; + this.currentImageIndex = imageNumber; + }; + + // Stretch overlay to fit the viewport + Lightbox.prototype.sizeOverlay = function() { + this.$overlay + .width($(window).width()) + .height($(document).height()); + }; + + // Animate the size of the lightbox to fit the image we are showing + Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) { + var self = this; + + var oldWidth = this.$outerContainer.outerWidth(); + var oldHeight = this.$outerContainer.outerHeight(); + var newWidth = imageWidth + this.containerLeftPadding + this.containerRightPadding; + var newHeight = imageHeight + this.containerTopPadding + this.containerBottomPadding; + + function postResize() { + self.$lightbox.find('.lb-dataContainer').width(newWidth); + self.$lightbox.find('.lb-prevLink').height(newHeight); + self.$lightbox.find('.lb-nextLink').height(newHeight); + self.showImage(); + } + + if (oldWidth !== newWidth || oldHeight !== newHeight) { + this.$outerContainer.animate({ + width: newWidth, + height: newHeight + }, this.options.resizeDuration, 'swing', function() { + postResize(); + }); + } else { + postResize(); + } + }; + + // Display the image and its details and begin preload neighboring images. + Lightbox.prototype.showImage = function() { + this.$lightbox.find('.lb-loader').stop(true).hide(); + this.$lightbox.find('.lb-image').fadeIn('slow'); + + this.updateNav(); + this.updateDetails(); + this.preloadNeighboringImages(); + this.enableKeyboardNav(); + }; + + // Display previous and next navigation if appropriate. + Lightbox.prototype.updateNav = function() { + // Check to see if the browser supports touch events. If so, we take the conservative approach + // and assume that mouse hover events are not supported and always show prev/next navigation + // arrows in image sets. + var alwaysShowNav = false; + try { + document.createEvent('TouchEvent'); + alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false; + } catch (e) {} + + this.$lightbox.find('.lb-nav').show(); + + if (this.album.length > 1) { + if (this.options.wrapAround) { + if (alwaysShowNav) { + this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1'); + } + this.$lightbox.find('.lb-prev, .lb-next').show(); + } else { + if (this.currentImageIndex > 0) { + this.$lightbox.find('.lb-prev').show(); + if (alwaysShowNav) { + this.$lightbox.find('.lb-prev').css('opacity', '1'); + } + } + if (this.currentImageIndex < this.album.length - 1) { + this.$lightbox.find('.lb-next').show(); + if (alwaysShowNav) { + this.$lightbox.find('.lb-next').css('opacity', '1'); + } + } + } + } + }; + + // Display caption, image number, and closing button. + Lightbox.prototype.updateDetails = function() { + var self = this; + + // Enable anchor clicks in the injected caption html. + // Thanks Nate Wright for the fix. @https://github.com/NateWr + if (typeof this.album[this.currentImageIndex].title !== 'undefined' && + this.album[this.currentImageIndex].title !== '') { + this.$lightbox.find('.lb-caption') + .html(this.album[this.currentImageIndex].title) + .fadeIn('fast') + .find('a').on('click', function(event) { + if ($(this).attr('target') !== undefined) { + window.open($(this).attr('href'), $(this).attr('target')); + } else { + location.href = $(this).attr('href'); + } + }); + } + + if (this.album.length > 1 && this.options.showImageNumberLabel) { + var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length); + this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast'); + } else { + this.$lightbox.find('.lb-number').hide(); + } + + this.$outerContainer.removeClass('animating'); + + this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() { + return self.sizeOverlay(); + }); + }; + + // Preload previous and next images in set. + Lightbox.prototype.preloadNeighboringImages = function() { + if (this.album.length > this.currentImageIndex + 1) { + var preloadNext = new Image(); + preloadNext.src = this.album[this.currentImageIndex + 1].link; + } + if (this.currentImageIndex > 0) { + var preloadPrev = new Image(); + preloadPrev.src = this.album[this.currentImageIndex - 1].link; + } + }; + + Lightbox.prototype.enableKeyboardNav = function() { + $(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this)); + }; + + Lightbox.prototype.disableKeyboardNav = function() { + $(document).off('.keyboard'); + }; + + Lightbox.prototype.keyboardAction = function(event) { + var KEYCODE_ESC = 27; + var KEYCODE_LEFTARROW = 37; + var KEYCODE_RIGHTARROW = 39; + + var keycode = event.keyCode; + var key = String.fromCharCode(keycode).toLowerCase(); + if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) { + this.end(); + } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) { + if (this.currentImageIndex !== 0) { + this.changeImage(this.currentImageIndex - 1); + } else if (this.options.wrapAround && this.album.length > 1) { + this.changeImage(this.album.length - 1); + } + } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) { + if (this.currentImageIndex !== this.album.length - 1) { + this.changeImage(this.currentImageIndex + 1); + } else if (this.options.wrapAround && this.album.length > 1) { + this.changeImage(0); + } + } + }; + + // Closing time. :-( + Lightbox.prototype.end = function() { + this.disableKeyboardNav(); + $(window).off('resize', this.sizeOverlay); + this.$lightbox.fadeOut(this.options.fadeDuration); + this.$overlay.fadeOut(this.options.fadeDuration); + $('select, object, embed').css({ + visibility: 'visible' + }); + }; + + return new Lightbox(); +})); diff --git a/src/static/lightbox/js/lightbox.min.js b/src/static/lightbox/js/lightbox.min.js new file mode 100644 index 000000000..14c35c868 --- /dev/null +++ b/src/static/lightbox/js/lightbox.min.js @@ -0,0 +1,13 @@ +/*! + * Lightbox v2.8.1 + * by Lokesh Dhakar + * + * More info: + * http://lokeshdhakar.com/projects/lightbox2/ + * + * Copyright 2007, 2015 Lokesh Dhakar + * Released under the MIT license + * https://github.com/lokesh/lightbox2/blob/master/LICENSE + */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.lightbox=b(a.jQuery)}(this,function(a){function b(b){this.album=[],this.currentImageIndex=void 0,this.init(),this.options=a.extend({},this.constructor.defaults),this.option(b)}return b.defaults={albumLabel:"Image %1 of %2",alwaysShowNavOnTouchDevices:!1,fadeDuration:500,fitImagesInViewport:!0,positionFromTop:50,resizeDuration:700,showImageNumberLabel:!0,wrapAround:!1},b.prototype.option=function(b){a.extend(this.options,b)},b.prototype.imageCountLabel=function(a,b){return this.options.albumLabel.replace(/%1/g,a).replace(/%2/g,b)},b.prototype.init=function(){this.enable(),this.build()},b.prototype.enable=function(){var b=this;a("body").on("click","a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",function(c){return b.start(a(c.currentTarget)),!1})},b.prototype.build=function(){var b=this;a('
').appendTo(a("body")),this.$lightbox=a("#lightbox"),this.$overlay=a("#lightboxOverlay"),this.$outerContainer=this.$lightbox.find(".lb-outerContainer"),this.$container=this.$lightbox.find(".lb-container"),this.containerTopPadding=parseInt(this.$container.css("padding-top"),10),this.containerRightPadding=parseInt(this.$container.css("padding-right"),10),this.containerBottomPadding=parseInt(this.$container.css("padding-bottom"),10),this.containerLeftPadding=parseInt(this.$container.css("padding-left"),10),this.$overlay.hide().on("click",function(){return b.end(),!1}),this.$lightbox.hide().on("click",function(c){return"lightbox"===a(c.target).attr("id")&&b.end(),!1}),this.$outerContainer.on("click",function(c){return"lightbox"===a(c.target).attr("id")&&b.end(),!1}),this.$lightbox.find(".lb-prev").on("click",function(){return 0===b.currentImageIndex?b.changeImage(b.album.length-1):b.changeImage(b.currentImageIndex-1),!1}),this.$lightbox.find(".lb-next").on("click",function(){return b.currentImageIndex===b.album.length-1?b.changeImage(0):b.changeImage(b.currentImageIndex+1),!1}),this.$lightbox.find(".lb-loader, .lb-close").on("click",function(){return b.end(),!1})},b.prototype.start=function(b){function c(a){d.album.push({link:a.attr("href"),title:a.attr("data-title")||a.attr("title")})}var d=this,e=a(window);e.on("resize",a.proxy(this.sizeOverlay,this)),a("select, object, embed").css({visibility:"hidden"}),this.sizeOverlay(),this.album=[];var f,g=0,h=b.attr("data-lightbox");if(h){f=a(b.prop("tagName")+'[data-lightbox="'+h+'"]');for(var i=0;ij||e.height>i)&&(e.width/j>e.height/i?(h=j,g=parseInt(e.height/(e.width/h),10),d.width(h),d.height(g)):(g=i,h=parseInt(e.width/(e.height/g),10),d.width(h),d.height(g)))),c.sizeContainer(d.width(),d.height())},e.src=this.album[b].link,this.currentImageIndex=b},b.prototype.sizeOverlay=function(){this.$overlay.width(a(window).width()).height(a(document).height())},b.prototype.sizeContainer=function(a,b){function c(){d.$lightbox.find(".lb-dataContainer").width(g),d.$lightbox.find(".lb-prevLink").height(h),d.$lightbox.find(".lb-nextLink").height(h),d.showImage()}var d=this,e=this.$outerContainer.outerWidth(),f=this.$outerContainer.outerHeight(),g=a+this.containerLeftPadding+this.containerRightPadding,h=b+this.containerTopPadding+this.containerBottomPadding;e!==g||f!==h?this.$outerContainer.animate({width:g,height:h},this.options.resizeDuration,"swing",function(){c()}):c()},b.prototype.showImage=function(){this.$lightbox.find(".lb-loader").stop(!0).hide(),this.$lightbox.find(".lb-image").fadeIn("slow"),this.updateNav(),this.updateDetails(),this.preloadNeighboringImages(),this.enableKeyboardNav()},b.prototype.updateNav=function(){var a=!1;try{document.createEvent("TouchEvent"),a=this.options.alwaysShowNavOnTouchDevices?!0:!1}catch(b){}this.$lightbox.find(".lb-nav").show(),this.album.length>1&&(this.options.wrapAround?(a&&this.$lightbox.find(".lb-prev, .lb-next").css("opacity","1"),this.$lightbox.find(".lb-prev, .lb-next").show()):(this.currentImageIndex>0&&(this.$lightbox.find(".lb-prev").show(),a&&this.$lightbox.find(".lb-prev").css("opacity","1")),this.currentImageIndex1&&this.options.showImageNumberLabel){var c=this.imageCountLabel(this.currentImageIndex+1,this.album.length);this.$lightbox.find(".lb-number").text(c).fadeIn("fast")}else this.$lightbox.find(".lb-number").hide();this.$outerContainer.removeClass("animating"),this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration,function(){return b.sizeOverlay()})},b.prototype.preloadNeighboringImages=function(){if(this.album.length>this.currentImageIndex+1){var a=new Image;a.src=this.album[this.currentImageIndex+1].link}if(this.currentImageIndex>0){var b=new Image;b.src=this.album[this.currentImageIndex-1].link}},b.prototype.enableKeyboardNav=function(){a(document).on("keyup.keyboard",a.proxy(this.keyboardAction,this))},b.prototype.disableKeyboardNav=function(){a(document).off(".keyboard")},b.prototype.keyboardAction=function(a){var b=27,c=37,d=39,e=a.keyCode,f=String.fromCharCode(e).toLowerCase();e===b||f.match(/x|o|c/)?this.end():"p"===f||e===c?0!==this.currentImageIndex?this.changeImage(this.currentImageIndex-1):this.options.wrapAround&&this.album.length>1&&this.changeImage(this.album.length-1):("n"===f||e===d)&&(this.currentImageIndex!==this.album.length-1?this.changeImage(this.currentImageIndex+1):this.options.wrapAround&&this.album.length>1&&this.changeImage(0))},b.prototype.end=function(){this.disableKeyboardNav(),a(window).off("resize",this.sizeOverlay),this.$lightbox.fadeOut(this.options.fadeDuration),this.$overlay.fadeOut(this.options.fadeDuration),a("select, object, embed").css({visibility:"visible"})},new b}); +//# sourceMappingURL=lightbox.min.map \ No newline at end of file diff --git a/src/static/lightbox/js/lightbox.min.map b/src/static/lightbox/js/lightbox.min.map new file mode 100644 index 000000000..8d048d4f1 --- /dev/null +++ b/src/static/lightbox/js/lightbox.min.map @@ -0,0 +1 @@ +{"version":3,"file":"lightbox.min.js","sources":["../../src/js/lightbox.js"],"names":["root","factory","define","amd","exports","module","require","lightbox","jQuery","this","$","Lightbox","options","album","currentImageIndex","init","extend","constructor","defaults","option","albumLabel","alwaysShowNavOnTouchDevices","fadeDuration","fitImagesInViewport","positionFromTop","resizeDuration","showImageNumberLabel","wrapAround","prototype","imageCountLabel","currentImageNum","totalImages","replace","enable","build","self","on","event","start","currentTarget","appendTo","$lightbox","$overlay","$outerContainer","find","$container","containerTopPadding","parseInt","css","containerRightPadding","containerBottomPadding","containerLeftPadding","hide","end","target","attr","changeImage","length","$link","addToAlbum","push","link","title","$window","window","proxy","sizeOverlay","visibility","$links","imageNumber","dataLightboxValue","prop","i","j","top","scrollTop","left","scrollLeft","fadeIn","disableKeyboardNav","$image","addClass","preloader","Image","onload","$preloader","imageHeight","imageWidth","maxImageHeight","maxImageWidth","windowHeight","windowWidth","width","height","maxWidth","maxHeight","sizeContainer","src","document","postResize","newWidth","newHeight","showImage","oldWidth","outerWidth","oldHeight","outerHeight","animate","stop","updateNav","updateDetails","preloadNeighboringImages","enableKeyboardNav","alwaysShowNav","createEvent","e","show","html","undefined","open","location","href","labelText","text","removeClass","preloadNext","preloadPrev","keyboardAction","off","KEYCODE_ESC","KEYCODE_LEFTARROW","KEYCODE_RIGHTARROW","keycode","keyCode","key","String","fromCharCode","toLowerCase","match","fadeOut"],"mappings":"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"} \ No newline at end of file diff --git a/src/static/pretixpresale/less/event.less b/src/static/pretixpresale/less/event.less index 4e8ae7254..63cd642c8 100644 --- a/src/static/pretixpresale/less/event.less +++ b/src/static/pretixpresale/less/event.less @@ -24,6 +24,8 @@ .productpicture { float: left; margin-right: 10px; + text-decoration: none; + display: block; } } .item-with-variations .product-row.headline, .product-row.simple { diff --git a/src/static/pretixpresale/less/main.less b/src/static/pretixpresale/less/main.less index 525f30048..dde6291e7 100644 --- a/src/static/pretixpresale/less/main.less +++ b/src/static/pretixpresale/less/main.less @@ -1,5 +1,6 @@ @import "../../bootstrap/less/bootstrap.less"; @import "../../fontawesome/less/font-awesome.less"; +@import "../../lightbox/css/lightbox.css"; @fa-font-path: "../../fontawesome/fonts"; @brand-primary: #8E44B3;