mirror of
https://github.com/HandBrake/HandBrake-docs.git
synced 2025-12-13 11:04:47 -06:00
template: Add jQuery and Featherlight lightbox plugin.
This commit is contained in:
parent
2a33fd4fa0
commit
34761afc37
@ -147,6 +147,10 @@ article.docs figcaption {
|
|||||||
color: rgb(120,120,120);
|
color: rgb(120,120,120);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.featherlight .featherlight-content {
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Wider than 390 */
|
/* Wider than 390 */
|
||||||
@media (min-width: 390px) {
|
@media (min-width: 390px) {
|
||||||
|
|
||||||
|
|||||||
127
templates/mark1/css/vendor/featherlight/featherlight-1.4.0.css
vendored
Executable file
127
templates/mark1/css/vendor/featherlight/featherlight-1.4.0.css
vendored
Executable file
@ -0,0 +1,127 @@
|
|||||||
|
/**
|
||||||
|
* Featherlight – ultra slim jQuery lightbox
|
||||||
|
* Version 1.4.0 - http://noelboss.github.io/featherlight/
|
||||||
|
*
|
||||||
|
* Copyright 2016, Noël Raoul Bossart (http://www.noelboss.com)
|
||||||
|
* MIT Licensed.
|
||||||
|
**/
|
||||||
|
@media all {
|
||||||
|
.featherlight {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
/* dimensions: spanning the background from edge to edge */
|
||||||
|
position:fixed;
|
||||||
|
top: 0; right: 0; bottom: 0; left: 0;
|
||||||
|
z-index: 2147483647; /* z-index needs to be >= elements on the site. */
|
||||||
|
|
||||||
|
/* position: centering content */
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
/* insures that the ::before pseudo element doesn't force wrap with fixed width content; */
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
/* styling */
|
||||||
|
cursor: pointer;
|
||||||
|
background: #333;
|
||||||
|
/* IE8 "hack" for nested featherlights */
|
||||||
|
background: rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* support for nested featherlights. Does not work in IE8 (use JS to fix) */
|
||||||
|
.featherlight:last-of-type {
|
||||||
|
background: rgba(0, 0, 0, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.featherlight:before {
|
||||||
|
/* position: trick to center content vertically */
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
height: 100%;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: -0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.featherlight .featherlight-content {
|
||||||
|
/* make content container for positioned elements (close button) */
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
/* position: centering vertical and horizontal */
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
/* dimensions: cut off images */
|
||||||
|
overflow: auto;
|
||||||
|
padding: 25px 25px 0;
|
||||||
|
border-bottom: 25px solid transparent;
|
||||||
|
|
||||||
|
/* dimensions: handling large content */
|
||||||
|
margin-left: 5%;
|
||||||
|
margin-right: 5%;
|
||||||
|
max-height: 95%;
|
||||||
|
|
||||||
|
/* styling */
|
||||||
|
background: #fff;
|
||||||
|
cursor: auto;
|
||||||
|
|
||||||
|
/* reset white-space wrapping */
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* contains the content */
|
||||||
|
.featherlight .featherlight-inner {
|
||||||
|
/* make sure its visible */
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.featherlight .featherlight-close-icon {
|
||||||
|
/* position: centering vertical and horizontal */
|
||||||
|
position: absolute;
|
||||||
|
z-index: 9999;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
|
||||||
|
/* dimensions: 25px x 25px */
|
||||||
|
line-height: 25px;
|
||||||
|
width: 25px;
|
||||||
|
|
||||||
|
/* styling */
|
||||||
|
cursor: pointer;
|
||||||
|
text-align: center;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background: #fff; /* Set the background in case it overlaps the content */
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.featherlight .featherlight-image {
|
||||||
|
/* styling */
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.featherlight-iframe .featherlight-content {
|
||||||
|
/* removed the border for image croping since iframe is edge to edge */
|
||||||
|
border-bottom: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.featherlight iframe {
|
||||||
|
/* styling */
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* handling phones and small screens */
|
||||||
|
@media only screen and (max-width: 1024px) {
|
||||||
|
.featherlight .featherlight-content {
|
||||||
|
/* dimensions: maximize lightbox with for small screens */
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
max-height: 98%;
|
||||||
|
|
||||||
|
padding: 10px 10px 0;
|
||||||
|
border-bottom: 10px solid transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
templates/mark1/css/vendor/featherlight/featherlight-1.4.0.min.css
vendored
Executable file
8
templates/mark1/css/vendor/featherlight/featherlight-1.4.0.min.css
vendored
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* Featherlight - ultra slim jQuery lightbox
|
||||||
|
* Version 1.4.0 - http://noelboss.github.io/featherlight/
|
||||||
|
*
|
||||||
|
* Copyright 2016, Noël Raoul Bossart (http://www.noelboss.com)
|
||||||
|
* MIT Licensed.
|
||||||
|
**/
|
||||||
|
@media all{.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483647;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:rgba(0,0,0,0)}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:'';display:inline-block;height:100%;vertical-align:middle;margin-right:-.25em}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font-family:Arial,sans-serif;background:#fff;background:rgba(255,255,255,.3);color:#000}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0}.featherlight iframe{border:0}}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:10px;margin-right:10px;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}}
|
||||||
@ -5,6 +5,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta name="author" content="{{ meta.authors }}" />
|
<meta name="author" content="{{ meta.authors }}" />
|
||||||
<title>{{ document.project }} Documentation — {{ document.title }}</title>
|
<title>{{ document.project }} Documentation — {{ document.title }}</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ base.relpath }}css/vendor/featherlight/featherlight-1.4.0.min.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="{{ base.relpath }}css/style.css" />
|
<link rel="stylesheet" type="text/css" href="{{ base.relpath }}css/style.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -13,5 +14,8 @@
|
|||||||
{{ document.content }}
|
{{ document.content }}
|
||||||
{{ template.footer }}
|
{{ template.footer }}
|
||||||
</article>
|
</article>
|
||||||
|
<script src="{{ base.relpath }}js/vendor/jquery/jquery-2.2.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="{{ base.relpath }}js/vendor/featherlight/featherlight-1.4.0.min.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script src="{{ base.relpath }}js/scripts.js?201604070001" type="text/javascript" charset="utf-8"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
5
templates/mark1/js/scripts.js
Normal file
5
templates/mark1/js/scripts.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
$.featherlight.autoBind = false;
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('article.docs > figure > a:has(img)').featherlight({type: 'image', openSpeed: 150, closeSpeed: 150});
|
||||||
|
});
|
||||||
557
templates/mark1/js/vendor/featherlight/featherlight-1.4.0.js
vendored
Executable file
557
templates/mark1/js/vendor/featherlight/featherlight-1.4.0.js
vendored
Executable file
@ -0,0 +1,557 @@
|
|||||||
|
/**
|
||||||
|
* Featherlight - ultra slim jQuery lightbox
|
||||||
|
* Version 1.4.0 - http://noelboss.github.io/featherlight/
|
||||||
|
*
|
||||||
|
* Copyright 2016, Noël Raoul Bossart (http://www.noelboss.com)
|
||||||
|
* MIT Licensed.
|
||||||
|
**/
|
||||||
|
(function($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
if('undefined' === typeof $) {
|
||||||
|
if('console' in window){ window.console.info('Too much lightness, Featherlight needs jQuery.'); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Featherlight is exported as $.featherlight.
|
||||||
|
It is a function used to open a featherlight lightbox.
|
||||||
|
|
||||||
|
[tech]
|
||||||
|
Featherlight uses prototype inheritance.
|
||||||
|
Each opened lightbox will have a corresponding object.
|
||||||
|
That object may have some attributes that override the
|
||||||
|
prototype's.
|
||||||
|
Extensions created with Featherlight.extend will have their
|
||||||
|
own prototype that inherits from Featherlight's prototype,
|
||||||
|
thus attributes can be overriden either at the object level,
|
||||||
|
or at the extension level.
|
||||||
|
To create callbacks that chain themselves instead of overriding,
|
||||||
|
use chainCallbacks.
|
||||||
|
For those familiar with CoffeeScript, this correspond to
|
||||||
|
Featherlight being a class and the Gallery being a class
|
||||||
|
extending Featherlight.
|
||||||
|
The chainCallbacks is used since we don't have access to
|
||||||
|
CoffeeScript's `super`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Featherlight($content, config) {
|
||||||
|
if(this instanceof Featherlight) { /* called with new */
|
||||||
|
this.id = Featherlight.id++;
|
||||||
|
this.setup($content, config);
|
||||||
|
this.chainCallbacks(Featherlight._callbackChain);
|
||||||
|
} else {
|
||||||
|
var fl = new Featherlight($content, config);
|
||||||
|
fl.open();
|
||||||
|
return fl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var opened = [],
|
||||||
|
pruneOpened = function(remove) {
|
||||||
|
opened = $.grep(opened, function(fl) {
|
||||||
|
return fl !== remove && fl.$instance.closest('body').length > 0;
|
||||||
|
} );
|
||||||
|
return opened;
|
||||||
|
};
|
||||||
|
|
||||||
|
// structure({iframeMinHeight: 44, foo: 0}, 'iframe')
|
||||||
|
// #=> {min-height: 44}
|
||||||
|
var structure = function(obj, prefix) {
|
||||||
|
var result = {},
|
||||||
|
regex = new RegExp('^' + prefix + '([A-Z])(.*)');
|
||||||
|
for (var key in obj) {
|
||||||
|
var match = key.match(regex);
|
||||||
|
if (match) {
|
||||||
|
var dasherized = (match[1] + match[2].replace(/([A-Z])/g, '-$1')).toLowerCase();
|
||||||
|
result[dasherized] = obj[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* document wide key handler */
|
||||||
|
var eventMap = { keyup: 'onKeyUp', resize: 'onResize' };
|
||||||
|
|
||||||
|
var globalEventHandler = function(event) {
|
||||||
|
$.each(Featherlight.opened().reverse(), function() {
|
||||||
|
if (!event.isDefaultPrevented()) {
|
||||||
|
if (false === this[eventMap[event.type]](event)) {
|
||||||
|
event.preventDefault(); event.stopPropagation(); return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var toggleGlobalEvents = function(set) {
|
||||||
|
if(set !== Featherlight._globalHandlerInstalled) {
|
||||||
|
Featherlight._globalHandlerInstalled = set;
|
||||||
|
var events = $.map(eventMap, function(_, name) { return name+'.'+Featherlight.prototype.namespace; } ).join(' ');
|
||||||
|
$(window)[set ? 'on' : 'off'](events, globalEventHandler);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Featherlight.prototype = {
|
||||||
|
constructor: Featherlight,
|
||||||
|
/*** defaults ***/
|
||||||
|
/* extend featherlight with defaults and methods */
|
||||||
|
namespace: 'featherlight', /* Name of the events and css class prefix */
|
||||||
|
targetAttr: 'data-featherlight', /* Attribute of the triggered element that contains the selector to the lightbox content */
|
||||||
|
variant: null, /* Class that will be added to change look of the lightbox */
|
||||||
|
resetCss: false, /* Reset all css */
|
||||||
|
background: null, /* Custom DOM for the background, wrapper and the closebutton */
|
||||||
|
openTrigger: 'click', /* Event that triggers the lightbox */
|
||||||
|
closeTrigger: 'click', /* Event that triggers the closing of the lightbox */
|
||||||
|
filter: null, /* Selector to filter events. Think $(...).on('click', filter, eventHandler) */
|
||||||
|
root: 'body', /* Where to append featherlights */
|
||||||
|
openSpeed: 250, /* Duration of opening animation */
|
||||||
|
closeSpeed: 250, /* Duration of closing animation */
|
||||||
|
closeOnClick: 'background', /* Close lightbox on click ('background', 'anywhere' or false) */
|
||||||
|
closeOnEsc: true, /* Close lightbox when pressing esc */
|
||||||
|
closeIcon: '✕', /* Close icon */
|
||||||
|
loading: '', /* Content to show while initial content is loading */
|
||||||
|
persist: false, /* If set, the content will persist and will be shown again when opened again. 'shared' is a special value when binding multiple elements for them to share the same content */
|
||||||
|
otherClose: null, /* Selector for alternate close buttons (e.g. "a.close") */
|
||||||
|
beforeOpen: $.noop, /* Called before open. can return false to prevent opening of lightbox. Gets event as parameter, this contains all data */
|
||||||
|
beforeContent: $.noop, /* Called when content is loaded. Gets event as parameter, this contains all data */
|
||||||
|
beforeClose: $.noop, /* Called before close. can return false to prevent opening of lightbox. Gets event as parameter, this contains all data */
|
||||||
|
afterOpen: $.noop, /* Called after open. Gets event as parameter, this contains all data */
|
||||||
|
afterContent: $.noop, /* Called after content is ready and has been set. Gets event as parameter, this contains all data */
|
||||||
|
afterClose: $.noop, /* Called after close. Gets event as parameter, this contains all data */
|
||||||
|
onKeyUp: $.noop, /* Called on key up for the frontmost featherlight */
|
||||||
|
onResize: $.noop, /* Called after new content and when a window is resized */
|
||||||
|
type: null, /* Specify type of lightbox. If unset, it will check for the targetAttrs value. */
|
||||||
|
contentFilters: ['jquery', 'image', 'html', 'ajax', 'iframe', 'text'], /* List of content filters to use to determine the content */
|
||||||
|
|
||||||
|
/*** methods ***/
|
||||||
|
/* setup iterates over a single instance of featherlight and prepares the background and binds the events */
|
||||||
|
setup: function(target, config){
|
||||||
|
/* all arguments are optional */
|
||||||
|
if (typeof target === 'object' && target instanceof $ === false && !config) {
|
||||||
|
config = target;
|
||||||
|
target = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = $.extend(this, config, {target: target}),
|
||||||
|
css = !self.resetCss ? self.namespace : self.namespace+'-reset', /* by adding -reset to the classname, we reset all the default css */
|
||||||
|
$background = $(self.background || [
|
||||||
|
'<div class="'+css+'-loading '+css+'">',
|
||||||
|
'<div class="'+css+'-content">',
|
||||||
|
'<span class="'+css+'-close-icon '+ self.namespace + '-close">',
|
||||||
|
self.closeIcon,
|
||||||
|
'</span>',
|
||||||
|
'<div class="'+self.namespace+'-inner">' + self.loading + '</div>',
|
||||||
|
'</div>',
|
||||||
|
'</div>'].join('')),
|
||||||
|
closeButtonSelector = '.'+self.namespace+'-close' + (self.otherClose ? ',' + self.otherClose : '');
|
||||||
|
|
||||||
|
self.$instance = $background.clone().addClass(self.variant); /* clone DOM for the background, wrapper and the close button */
|
||||||
|
|
||||||
|
/* close when click on background/anywhere/null or closebox */
|
||||||
|
self.$instance.on(self.closeTrigger+'.'+self.namespace, function(event) {
|
||||||
|
var $target = $(event.target);
|
||||||
|
if( ('background' === self.closeOnClick && $target.is('.'+self.namespace))
|
||||||
|
|| 'anywhere' === self.closeOnClick
|
||||||
|
|| $target.closest(closeButtonSelector).length ){
|
||||||
|
self.close(event);
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
/* this method prepares the content and converts it into a jQuery object or a promise */
|
||||||
|
getContent: function(){
|
||||||
|
if(this.persist !== false && this.$content) {
|
||||||
|
return this.$content;
|
||||||
|
}
|
||||||
|
var self = this,
|
||||||
|
filters = this.constructor.contentFilters,
|
||||||
|
readTargetAttr = function(name){ return self.$currentTarget && self.$currentTarget.attr(name); },
|
||||||
|
targetValue = readTargetAttr(self.targetAttr),
|
||||||
|
data = self.target || targetValue || '';
|
||||||
|
|
||||||
|
/* Find which filter applies */
|
||||||
|
var filter = filters[self.type]; /* check explicit type like {type: 'image'} */
|
||||||
|
|
||||||
|
/* check explicit type like data-featherlight="image" */
|
||||||
|
if(!filter && data in filters) {
|
||||||
|
filter = filters[data];
|
||||||
|
data = self.target && targetValue;
|
||||||
|
}
|
||||||
|
data = data || readTargetAttr('href') || '';
|
||||||
|
|
||||||
|
/* check explicity type & content like {image: 'photo.jpg'} */
|
||||||
|
if(!filter) {
|
||||||
|
for(var filterName in filters) {
|
||||||
|
if(self[filterName]) {
|
||||||
|
filter = filters[filterName];
|
||||||
|
data = self[filterName];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* otherwise it's implicit, run checks */
|
||||||
|
if(!filter) {
|
||||||
|
var target = data;
|
||||||
|
data = null;
|
||||||
|
$.each(self.contentFilters, function() {
|
||||||
|
filter = filters[this];
|
||||||
|
if(filter.test) {
|
||||||
|
data = filter.test(target);
|
||||||
|
}
|
||||||
|
if(!data && filter.regex && target.match && target.match(filter.regex)) {
|
||||||
|
data = target;
|
||||||
|
}
|
||||||
|
return !data;
|
||||||
|
});
|
||||||
|
if(!data) {
|
||||||
|
if('console' in window){ window.console.error('Featherlight: no content filter found ' + (target ? ' for "' + target + '"' : ' (no target specified)')); }
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Process it */
|
||||||
|
return filter.process.call(self, data);
|
||||||
|
},
|
||||||
|
|
||||||
|
/* sets the content of $instance to $content */
|
||||||
|
setContent: function($content){
|
||||||
|
var self = this;
|
||||||
|
/* we need a special class for the iframe */
|
||||||
|
if($content.is('iframe') || $('iframe', $content).length > 0){
|
||||||
|
self.$instance.addClass(self.namespace+'-iframe');
|
||||||
|
}
|
||||||
|
|
||||||
|
self.$instance.removeClass(self.namespace+'-loading');
|
||||||
|
|
||||||
|
/* replace content by appending to existing one before it is removed
|
||||||
|
this insures that featherlight-inner remain at the same relative
|
||||||
|
position to any other items added to featherlight-content */
|
||||||
|
self.$instance.find('.'+self.namespace+'-inner')
|
||||||
|
.not($content) /* excluded new content, important if persisted */
|
||||||
|
.slice(1).remove().end() /* In the unexpected event where there are many inner elements, remove all but the first one */
|
||||||
|
.replaceWith($.contains(self.$instance[0], $content[0]) ? '' : $content);
|
||||||
|
|
||||||
|
self.$content = $content.addClass(self.namespace+'-inner');
|
||||||
|
|
||||||
|
return self;
|
||||||
|
},
|
||||||
|
|
||||||
|
/* opens the lightbox. "this" contains $instance with the lightbox, and with the config.
|
||||||
|
Returns a promise that is resolved after is successfully opened. */
|
||||||
|
open: function(event){
|
||||||
|
var self = this;
|
||||||
|
self.$instance.hide().appendTo(self.root);
|
||||||
|
if((!event || !event.isDefaultPrevented())
|
||||||
|
&& self.beforeOpen(event) !== false) {
|
||||||
|
|
||||||
|
if(event){
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
var $content = self.getContent();
|
||||||
|
|
||||||
|
if($content) {
|
||||||
|
opened.push(self);
|
||||||
|
|
||||||
|
toggleGlobalEvents(true);
|
||||||
|
|
||||||
|
self.$instance.fadeIn(self.openSpeed);
|
||||||
|
self.beforeContent(event);
|
||||||
|
|
||||||
|
/* Set content and show */
|
||||||
|
return $.when($content)
|
||||||
|
.always(function($content){
|
||||||
|
self.setContent($content);
|
||||||
|
self.afterContent(event);
|
||||||
|
})
|
||||||
|
.then(self.$instance.promise())
|
||||||
|
/* Call afterOpen after fadeIn is done */
|
||||||
|
.done(function(){ self.afterOpen(event); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.$instance.detach();
|
||||||
|
return $.Deferred().reject().promise();
|
||||||
|
},
|
||||||
|
|
||||||
|
/* closes the lightbox. "this" contains $instance with the lightbox, and with the config
|
||||||
|
returns a promise, resolved after the lightbox is successfully closed. */
|
||||||
|
close: function(event){
|
||||||
|
var self = this,
|
||||||
|
deferred = $.Deferred();
|
||||||
|
|
||||||
|
if(self.beforeClose(event) === false) {
|
||||||
|
deferred.reject();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (0 === pruneOpened(self).length) {
|
||||||
|
toggleGlobalEvents(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.$instance.fadeOut(self.closeSpeed,function(){
|
||||||
|
self.$instance.detach();
|
||||||
|
self.afterClose(event);
|
||||||
|
deferred.resolve();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return deferred.promise();
|
||||||
|
},
|
||||||
|
|
||||||
|
/* resizes the content so it fits in visible area and keeps the same aspect ratio.
|
||||||
|
Does nothing if either the width or the height is not specified.
|
||||||
|
Called automatically on window resize.
|
||||||
|
Override if you want different behavior. */
|
||||||
|
resize: function(w, h) {
|
||||||
|
if (w && h) {
|
||||||
|
/* Reset apparent image size first so container grows */
|
||||||
|
this.$content.css('width', '').css('height', '');
|
||||||
|
/* Calculate the worst ratio so that dimensions fit */
|
||||||
|
var ratio = Math.max(
|
||||||
|
w / parseInt(this.$content.parent().css('width'),10),
|
||||||
|
h / parseInt(this.$content.parent().css('height'),10));
|
||||||
|
/* Resize content */
|
||||||
|
if (ratio > 1) {
|
||||||
|
this.$content.css('width', '' + w / ratio + 'px').css('height', '' + h / ratio + 'px');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Utility function to chain callbacks
|
||||||
|
[Warning: guru-level]
|
||||||
|
Used be extensions that want to let users specify callbacks but
|
||||||
|
also need themselves to use the callbacks.
|
||||||
|
The argument 'chain' has callback names as keys and function(super, event)
|
||||||
|
as values. That function is meant to call `super` at some point.
|
||||||
|
*/
|
||||||
|
chainCallbacks: function(chain) {
|
||||||
|
for (var name in chain) {
|
||||||
|
this[name] = $.proxy(chain[name], this, $.proxy(this[name], this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.extend(Featherlight, {
|
||||||
|
id: 0, /* Used to id single featherlight instances */
|
||||||
|
autoBind: '[data-featherlight]', /* Will automatically bind elements matching this selector. Clear or set before onReady */
|
||||||
|
defaults: Featherlight.prototype, /* You can access and override all defaults using $.featherlight.defaults, which is just a synonym for $.featherlight.prototype */
|
||||||
|
/* Contains the logic to determine content */
|
||||||
|
contentFilters: {
|
||||||
|
jquery: {
|
||||||
|
regex: /^[#.]\w/, /* Anything that starts with a class name or identifiers */
|
||||||
|
test: function(elem) { return elem instanceof $ && elem; },
|
||||||
|
process: function(elem) { return this.persist !== false ? $(elem) : $(elem).clone(true); }
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
regex: /\.(png|jpg|jpeg|gif|tiff|bmp|svg)(\?\S*)?$/i,
|
||||||
|
process: function(url) {
|
||||||
|
var self = this,
|
||||||
|
deferred = $.Deferred(),
|
||||||
|
img = new Image(),
|
||||||
|
$img = $('<img src="'+url+'" alt="" class="'+self.namespace+'-image" />');
|
||||||
|
img.onload = function() {
|
||||||
|
/* Store naturalWidth & height for IE8 */
|
||||||
|
$img.naturalWidth = img.width; $img.naturalHeight = img.height;
|
||||||
|
deferred.resolve( $img );
|
||||||
|
};
|
||||||
|
img.onerror = function() { deferred.reject($img); };
|
||||||
|
img.src = url;
|
||||||
|
return deferred.promise();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
html: {
|
||||||
|
regex: /^\s*<[\w!][^<]*>/, /* Anything that starts with some kind of valid tag */
|
||||||
|
process: function(html) { return $(html); }
|
||||||
|
},
|
||||||
|
ajax: {
|
||||||
|
regex: /./, /* At this point, any content is assumed to be an URL */
|
||||||
|
process: function(url) {
|
||||||
|
var self = this,
|
||||||
|
deferred = $.Deferred();
|
||||||
|
/* we are using load so one can specify a target with: url.html #targetelement */
|
||||||
|
var $container = $('<div></div>').load(url, function(response, status){
|
||||||
|
if ( status !== "error" ) {
|
||||||
|
deferred.resolve($container.contents());
|
||||||
|
}
|
||||||
|
deferred.fail();
|
||||||
|
});
|
||||||
|
return deferred.promise();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
iframe: {
|
||||||
|
process: function(url) {
|
||||||
|
var deferred = new $.Deferred();
|
||||||
|
var $content = $('<iframe/>')
|
||||||
|
.hide()
|
||||||
|
.attr('src', url)
|
||||||
|
.css(structure(this, 'iframe'))
|
||||||
|
.on('load', function() { deferred.resolve($content.show()); })
|
||||||
|
// We can't move an <iframe> and avoid reloading it,
|
||||||
|
// so let's put it in place ourselves right now:
|
||||||
|
.appendTo(this.$instance.find('.' + this.namespace + '-content'));
|
||||||
|
return deferred.promise();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
process: function(text) { return $('<div>', {text: text}); }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
functionAttributes: ['beforeOpen', 'afterOpen', 'beforeContent', 'afterContent', 'beforeClose', 'afterClose'],
|
||||||
|
|
||||||
|
/*** class methods ***/
|
||||||
|
/* read element's attributes starting with data-featherlight- */
|
||||||
|
readElementConfig: function(element, namespace) {
|
||||||
|
var Klass = this,
|
||||||
|
regexp = new RegExp('^data-' + namespace + '-(.*)'),
|
||||||
|
config = {};
|
||||||
|
if (element && element.attributes) {
|
||||||
|
$.each(element.attributes, function(){
|
||||||
|
var match = this.name.match(regexp);
|
||||||
|
if (match) {
|
||||||
|
var val = this.value,
|
||||||
|
name = $.camelCase(match[1]);
|
||||||
|
if ($.inArray(name, Klass.functionAttributes) >= 0) { /* jshint -W054 */
|
||||||
|
val = new Function(val); /* jshint +W054 */
|
||||||
|
} else {
|
||||||
|
try { val = $.parseJSON(val); }
|
||||||
|
catch(e) {}
|
||||||
|
}
|
||||||
|
config[name] = val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return config;
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Used to create a Featherlight extension
|
||||||
|
[Warning: guru-level]
|
||||||
|
Creates the extension's prototype that in turn
|
||||||
|
inherits Featherlight's prototype.
|
||||||
|
Could be used to extend an extension too...
|
||||||
|
This is pretty high level wizardy, it comes pretty much straight
|
||||||
|
from CoffeeScript and won't teach you anything about Featherlight
|
||||||
|
as it's not really specific to this library.
|
||||||
|
My suggestion: move along and keep your sanity.
|
||||||
|
*/
|
||||||
|
extend: function(child, defaults) {
|
||||||
|
/* Setup class hierarchy, adapted from CoffeeScript */
|
||||||
|
var Ctor = function(){ this.constructor = child; };
|
||||||
|
Ctor.prototype = this.prototype;
|
||||||
|
child.prototype = new Ctor();
|
||||||
|
child.__super__ = this.prototype;
|
||||||
|
/* Copy class methods & attributes */
|
||||||
|
$.extend(child, this, defaults);
|
||||||
|
child.defaults = child.prototype;
|
||||||
|
return child;
|
||||||
|
},
|
||||||
|
|
||||||
|
attach: function($source, $content, config) {
|
||||||
|
var Klass = this;
|
||||||
|
if (typeof $content === 'object' && $content instanceof $ === false && !config) {
|
||||||
|
config = $content;
|
||||||
|
$content = undefined;
|
||||||
|
}
|
||||||
|
/* make a copy */
|
||||||
|
config = $.extend({}, config);
|
||||||
|
|
||||||
|
/* Only for openTrigger and namespace... */
|
||||||
|
var namespace = config.namespace || Klass.defaults.namespace,
|
||||||
|
tempConfig = $.extend({}, Klass.defaults, Klass.readElementConfig($source[0], namespace), config),
|
||||||
|
sharedPersist;
|
||||||
|
|
||||||
|
$source.on(tempConfig.openTrigger+'.'+tempConfig.namespace, tempConfig.filter, function(event) {
|
||||||
|
/* ... since we might as well compute the config on the actual target */
|
||||||
|
var elemConfig = $.extend(
|
||||||
|
{$source: $source, $currentTarget: $(this)},
|
||||||
|
Klass.readElementConfig($source[0], tempConfig.namespace),
|
||||||
|
Klass.readElementConfig(this, tempConfig.namespace),
|
||||||
|
config);
|
||||||
|
var fl = sharedPersist || $(this).data('featherlight-persisted') || new Klass($content, elemConfig);
|
||||||
|
if(fl.persist === 'shared') {
|
||||||
|
sharedPersist = fl;
|
||||||
|
} else if(fl.persist !== false) {
|
||||||
|
$(this).data('featherlight-persisted', fl);
|
||||||
|
}
|
||||||
|
elemConfig.$currentTarget.blur(); // Otherwise 'enter' key might trigger the dialog again
|
||||||
|
fl.open(event);
|
||||||
|
});
|
||||||
|
return $source;
|
||||||
|
},
|
||||||
|
|
||||||
|
current: function() {
|
||||||
|
var all = this.opened();
|
||||||
|
return all[all.length - 1] || null;
|
||||||
|
},
|
||||||
|
|
||||||
|
opened: function() {
|
||||||
|
var klass = this;
|
||||||
|
pruneOpened();
|
||||||
|
return $.grep(opened, function(fl) { return fl instanceof klass; } );
|
||||||
|
},
|
||||||
|
|
||||||
|
close: function(event) {
|
||||||
|
var cur = this.current();
|
||||||
|
if(cur) { return cur.close(event); }
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Does the auto binding on startup.
|
||||||
|
Meant only to be used by Featherlight and its extensions
|
||||||
|
*/
|
||||||
|
_onReady: function() {
|
||||||
|
var Klass = this;
|
||||||
|
if(Klass.autoBind){
|
||||||
|
/* Bind existing elements */
|
||||||
|
$(Klass.autoBind).each(function(){
|
||||||
|
Klass.attach($(this));
|
||||||
|
});
|
||||||
|
/* If a click propagates to the document level, then we have an item that was added later on */
|
||||||
|
$(document).on('click', Klass.autoBind, function(evt) {
|
||||||
|
if (evt.isDefaultPrevented() || evt.namespace === 'featherlight') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
evt.preventDefault();
|
||||||
|
/* Bind featherlight */
|
||||||
|
Klass.attach($(evt.currentTarget));
|
||||||
|
/* Click again; this time our binding will catch it */
|
||||||
|
$(evt.target).trigger('click.featherlight');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Featherlight uses the onKeyUp callback to intercept the escape key.
|
||||||
|
Private to Featherlight.
|
||||||
|
*/
|
||||||
|
_callbackChain: {
|
||||||
|
onKeyUp: function(_super, event){
|
||||||
|
if(27 === event.keyCode) {
|
||||||
|
if (this.closeOnEsc) {
|
||||||
|
$.featherlight.close(event);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return _super(event);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onResize: function(_super, event){
|
||||||
|
this.resize(this.$content.naturalWidth, this.$content.naturalHeight);
|
||||||
|
return _super(event);
|
||||||
|
},
|
||||||
|
|
||||||
|
afterContent: function(_super, event){
|
||||||
|
var r = _super(event);
|
||||||
|
this.onResize(event);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$.featherlight = Featherlight;
|
||||||
|
|
||||||
|
/* bind jQuery elements to trigger featherlight */
|
||||||
|
$.fn.featherlight = function($content, config) {
|
||||||
|
return Featherlight.attach(this, $content, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* bind featherlight on ready if config autoBind is set */
|
||||||
|
$(document).ready(function(){ Featherlight._onReady(); });
|
||||||
|
}(jQuery));
|
||||||
8
templates/mark1/js/vendor/featherlight/featherlight-1.4.0.min.js
vendored
Executable file
8
templates/mark1/js/vendor/featherlight/featherlight-1.4.0.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
9842
templates/mark1/js/vendor/jquery/jquery-2.2.3.js
vendored
Normal file
9842
templates/mark1/js/vendor/jquery/jquery-2.2.3.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
templates/mark1/js/vendor/jquery/jquery-2.2.3.min.js
vendored
Normal file
4
templates/mark1/js/vendor/jquery/jquery-2.2.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user