preview.js (8549B)
1 (function ($) { 2 if (!NodeList.prototype.forEach) { 3 NodeList.prototype.forEach = Array.prototype.forEach; 4 HTMLCollection.prototype.forEach = Array.prototype.forEach; // Because of https://bugzilla.mozilla.org/show_bug.cgi?id=14869 5 6 } 7 8 if (!Array.from) { 9 Array.from = function (object) { 10 return [].slice.call(object); 11 }; 12 } 13 14 $(function () { 15 16 // WebKit contentEditable focus bug workaround: 17 if (/AppleWebKit\/([\d.]+)/.exec(navigator.userAgent)) { 18 var editableFix = $('<input style="position:fixed;z-index-1;width:1px;height:1px;border:none;margin:0;padding:0;" tabIndex="-1">').appendTo('html'); 19 20 $('body').on('blur', "i.mdi[contenteditable]", function () { 21 editableFix[0].setSelectionRange(0, 0); 22 editableFix.blur(); 23 }); 24 } 25 }); 26 27 28 })(jQuery); 29 30 31 jQuery.fn.addFixedOverlay = function (options) { 32 var $ = jQuery; 33 var root = parent; 34 options = $.extend(true, { 35 'types': [], 36 'classes': [], 37 'callback': function () { 38 } 39 }, options); 40 41 this.each(function (index, el) { 42 var $node = $(el); 43 var ovItems = ($node.data('type') || "").trim().replace(/\s\s+/g, ' ').split(' '); 44 var ov = $('<div class="node-overlay"><div class="overlay-top overlay-border"></div><div class="overlay-left overlay-border"></div><div class="overlay-right overlay-border"></div><div class="overlay-bottom overlay-border"></div></div>'); 45 var overlay = root.jQuery('#toolbar-template').html(); 46 var toolbar = $(overlay); 47 var overlaysContainer = root.CP_Customizer.overlays.overlaysContainer(); 48 var optionsGroupOnHoverIN = function (event) { 49 $(this).find('.options-group.cog').addClass('active'); 50 51 if (this.ownerDocument.defaultView.innerHeight - this.getClientRects()[0].top < 400) { 52 $(this).find('.options-group.cog').addClass('reverse'); 53 } else { 54 $(this).find('.options-group.cog').removeClass('reverse'); 55 } 56 57 58 }; 59 var optionsGroupOnHoverOUT = function (event) { 60 $(this).find('.options-group.cog').removeClass('active'); 61 }; 62 63 $.each(options.classes, function (index, val) { 64 ov.addClass(val); 65 }); 66 67 ovItems = ovItems.concat(options.types); 68 ovItems = ovItems.filter(function (type) { 69 return type.length; 70 }); 71 72 if (ovItems.length === 0) { 73 return; 74 } 75 root.CP_Customizer.overlays.assignNode(ov, $node); 76 toolbar.find('.overlay-toolbar-element-type').html('Settings'); 77 toolbar.find('.edit-group').hide(); 78 ov.append(toolbar); 79 $node.data('overlay', ov); 80 $(ov).data('node', this); 81 overlaysContainer.append(ov); 82 $('.overlay-toolbar').hover(optionsGroupOnHoverIN, optionsGroupOnHoverOUT); 83 84 // look for overlay cog items 85 86 function addCogCallback(itemData) { 87 if (itemData.toolbarTitle) { 88 var title = itemData.toolbarTitle; 89 if (typeof itemData.toolbarTitle === "function") { 90 title = itemData.toolbarTitle($node); 91 } 92 93 toolbar.find('.overlay-toolbar-element-type').html(title); 94 } 95 options.callback.apply($node, itemData); 96 } 97 98 for (var i = 0; i < ovItems.length; i++) { 99 var itemType = ovItems[i]; 100 root.CP_Customizer.overlays.addOptionsToFixedOverlay(toolbar.find('.overlay-contextual-menu'), itemType, $node, addCogCallback); 101 } 102 103 if ($(this).width() < $(this).closest('body').width()) { 104 ov.addClass('cog-outside'); 105 } 106 }); 107 return this; 108 }; 109 110 111 var cpHeaderOverlaySS = false; 112 113 jQuery(document).ready(function ($) { 114 var style = jQuery('style[data-name="overlay-opacity"]')[0]; 115 cpHeaderOverlaySS = Array.from(document.styleSheets).filter(function (ss) { 116 return ss.ownerNode === style; 117 }).pop(); 118 }); 119 120 function setOverlayProperty(prop, value) { 121 var rule = (cpHeaderOverlaySS.cssRules || cpHeaderOverlaySS.rules)[0]; 122 rule.style.setProperty(prop, value); 123 } 124 125 function liveUpdate(setting, callback) { 126 var cb = function (value) { 127 value.bind(callback); 128 }; 129 var _setting = setting; 130 var _prefixedSetting = parent.CP_Customizer.slugPrefix() + "_" + setting; 131 wp.customize(_setting, cb); 132 wp.customize(_prefixedSetting, cb); 133 134 135 } 136 137 var __addedSettings = []; 138 139 function liveUpdateAutoSetting(setting, callback) { 140 141 if (__addedSettings.indexOf(setting) !== -1) { 142 return; 143 } 144 145 __addedSettings.push(setting); 146 147 var cb = function (value) { 148 value.bind(callback); 149 }; 150 151 var _setting = 'CP_AUTO_SETTING[' + setting + ']'; 152 var _prefixedSetting = 'CP_AUTO_SETTING[' + parent.CP_Customizer.slugPrefix() + "_" + setting + ']'; 153 wp.customize(_setting, cb); 154 wp.customize(_prefixedSetting, cb); 155 156 if (parent.wp.customize(_setting)) { 157 callback(parent.wp.customize(_setting).get()); 158 } else { 159 if (parent.wp.customize(_prefixedSetting)) { 160 callback(parent.wp.customize(_prefixedSetting).get()); 161 } 162 } 163 } 164 165 function bindLiveUpdates(root, $) { 166 // live update will fallback for slug prefixed themes options 167 168 // $('[data-theme]').each(function () { 169 // var option = $(this).attr('data-theme'); 170 // var self = $(this); 171 // liveUpdateAutoSetting(option, function (to) { 172 // self.add($('[data-theme="' + option + '"]')).html(to); 173 // }); 174 // }); 175 176 $('[data-theme-href]').each(function () { 177 var option = $(this).attr('data-theme-href'); 178 var self = $(this); 179 liveUpdateAutoSetting(option, function (to) { 180 self.attr('href', to); 181 }); 182 }); 183 184 $('[data-theme-src]').each(function () { 185 var option = $(this).attr('data-theme-src'); 186 var self = $(this); 187 liveUpdateAutoSetting(option, function (to) { 188 self.attr('src', to); 189 }); 190 }); 191 192 $('[data-theme-target]').each(function () { 193 var option = $(this).attr('data-theme-target'); 194 var self = $(this); 195 liveUpdateAutoSetting(option, function (to) { 196 var classAttr = self.attr('class'); 197 var newClassAttr = classAttr.replace(/mdi\-[a-z\-]+/ig, "").replace(/\s[\s]+/ig, " ").trim() + " " + to; 198 self.attr('class', newClassAttr); 199 }); 200 }); 201 202 $('[data-theme-mdi]').each(function () { 203 var option = $(this).attr('data-theme'); 204 var self = $(this); 205 liveUpdateAutoSetting(option, function (to) { 206 self.html(to); 207 }); 208 }); 209 } 210 211 function doPreviewDecoration(root, $) { 212 213 214 root.CP_Customizer.on(root.CP_Customizer.events.ELEMENT_DECORATED, function (event, $element) { 215 216 // $element.find('[data-hover-fx]').delay(500).find('.overlay').css({ 217 // display: 'block', 218 // opacity: 0.75 219 // }); 220 // $element.find('[data-hover-fx]').delay(500).find('.swap-inner').css({ 221 // display: 'block', 222 // opacity: 1 223 // }); 224 // 225 // if ($element.is('[data-hover-fx]')) { 226 // $element.delay(500).find('.overlay').css({ 227 // display: 'block', 228 // opacity: 0.75 229 // }); 230 // $element.delay(500).find('.swap-inner').css({ 231 // display: 'block', 232 // opacity: 1 233 // }); 234 // } 235 236 }); 237 238 239 $(document).find('[data-theme]').find(root.CP_Customizer.CONTENT_ELEMENTS).each(function (index, el) { 240 $(this).attr('data-content-editable', true); 241 $(this).attr('data-content-code-editable', true); 242 $(this).attr('contenteditable', true); 243 }); 244 } 245 246 247 jQuery(document).ready(function ($) { 248 249 if (wp.customize && wp.customize.mutationObserver) { 250 wp.customize.mutationObserver.disconnect(); 251 } 252 // if page is not maintainable with companion do not decorate 253 if (!parent.CP_Customizer.preview.data().maintainable) { 254 return; 255 } 256 257 // bindLiveUpdates(parent, jQuery); 258 doPreviewDecoration(parent, $); 259 });