fomantic-ui-sass 2.8.8.1 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/app/assets/fonts/semantic-ui/brand-icons.eot +0 -0
  4. data/app/assets/fonts/semantic-ui/brand-icons.svg +41 -6
  5. data/app/assets/fonts/semantic-ui/brand-icons.ttf +0 -0
  6. data/app/assets/fonts/semantic-ui/brand-icons.woff +0 -0
  7. data/app/assets/fonts/semantic-ui/brand-icons.woff2 +0 -0
  8. data/app/assets/fonts/semantic-ui/icons.eot +0 -0
  9. data/app/assets/fonts/semantic-ui/icons.svg +245 -7
  10. data/app/assets/fonts/semantic-ui/icons.ttf +0 -0
  11. data/app/assets/fonts/semantic-ui/icons.woff +0 -0
  12. data/app/assets/fonts/semantic-ui/icons.woff2 +0 -0
  13. data/app/assets/fonts/semantic-ui/outline-icons.eot +0 -0
  14. data/app/assets/fonts/semantic-ui/outline-icons.svg +2 -2
  15. data/app/assets/fonts/semantic-ui/outline-icons.ttf +0 -0
  16. data/app/assets/fonts/semantic-ui/outline-icons.woff +0 -0
  17. data/app/assets/fonts/semantic-ui/outline-icons.woff2 +0 -0
  18. data/app/assets/javascripts/semantic-ui/accordion.js +9 -3
  19. data/app/assets/javascripts/semantic-ui/api.js +92 -33
  20. data/app/assets/javascripts/semantic-ui/calendar.js +200 -82
  21. data/app/assets/javascripts/semantic-ui/checkbox.js +20 -13
  22. data/app/assets/javascripts/semantic-ui/dimmer.js +24 -9
  23. data/app/assets/javascripts/semantic-ui/dropdown.js +250 -205
  24. data/app/assets/javascripts/semantic-ui/embed.js +13 -9
  25. data/app/assets/javascripts/semantic-ui/flyout.js +1530 -0
  26. data/app/assets/javascripts/semantic-ui/form.js +47 -41
  27. data/app/assets/javascripts/semantic-ui/modal.js +187 -83
  28. data/app/assets/javascripts/semantic-ui/nag.js +2 -2
  29. data/app/assets/javascripts/semantic-ui/popup.js +16 -22
  30. data/app/assets/javascripts/semantic-ui/progress.js +7 -4
  31. data/app/assets/javascripts/semantic-ui/rating.js +7 -3
  32. data/app/assets/javascripts/semantic-ui/search.js +47 -20
  33. data/app/assets/javascripts/semantic-ui/shape.js +3 -3
  34. data/app/assets/javascripts/semantic-ui/sidebar.js +140 -43
  35. data/app/assets/javascripts/semantic-ui/site.js +1 -1
  36. data/app/assets/javascripts/semantic-ui/slider.js +78 -63
  37. data/app/assets/javascripts/semantic-ui/state.js +2 -2
  38. data/app/assets/javascripts/semantic-ui/sticky.js +30 -19
  39. data/app/assets/javascripts/semantic-ui/tab.js +24 -6
  40. data/app/assets/javascripts/semantic-ui/toast.js +67 -33
  41. data/app/assets/javascripts/semantic-ui/transition.js +27 -22
  42. data/app/assets/javascripts/semantic-ui/visibility.js +5 -5
  43. data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +1 -1
  44. data/app/assets/stylesheets/semantic-ui/collections/_form.scss +160 -83
  45. data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +25 -21
  46. data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +110 -78
  47. data/app/assets/stylesheets/semantic-ui/collections/_message.scss +43 -43
  48. data/app/assets/stylesheets/semantic-ui/collections/_table.scss +1684 -272
  49. data/app/assets/stylesheets/semantic-ui/elements/_button.scss +204 -157
  50. data/app/assets/stylesheets/semantic-ui/elements/_container.scss +98 -4
  51. data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +31 -31
  52. data/app/assets/stylesheets/semantic-ui/elements/_emoji.scss +10799 -8841
  53. data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +1021 -915
  54. data/app/assets/stylesheets/semantic-ui/elements/_header.scss +6 -4
  55. data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +2110 -2061
  56. data/app/assets/stylesheets/semantic-ui/elements/_image.scss +1 -1
  57. data/app/assets/stylesheets/semantic-ui/elements/_input.scss +759 -22
  58. data/app/assets/stylesheets/semantic-ui/elements/_label.scss +72 -68
  59. data/app/assets/stylesheets/semantic-ui/elements/_list.scss +31 -31
  60. data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +352 -352
  61. data/app/assets/stylesheets/semantic-ui/elements/_placeholder.scss +33 -33
  62. data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +1 -1
  63. data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +1 -1
  64. data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +118 -34
  65. data/app/assets/stylesheets/semantic-ui/elements/_step.scss +32 -32
  66. data/app/assets/stylesheets/semantic-ui/elements/_text.scss +1 -1
  67. data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +5 -4
  68. data/app/assets/stylesheets/semantic-ui/globals/_site.scss +139 -42
  69. data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +177 -37
  70. data/app/assets/stylesheets/semantic-ui/modules/_calendar.scss +18 -1
  71. data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +93 -92
  72. data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +33 -18
  73. data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +101 -51
  74. data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +5 -5
  75. data/app/assets/stylesheets/semantic-ui/modules/_flyout.scss +592 -0
  76. data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +37 -6
  77. data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +1 -1
  78. data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +103 -105
  79. data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +1 -1
  80. data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +7 -46
  81. data/app/assets/stylesheets/semantic-ui/modules/_search.scss +6 -6
  82. data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +1 -1
  83. data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +23 -9
  84. data/app/assets/stylesheets/semantic-ui/modules/_slider.scss +17 -17
  85. data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +1 -1
  86. data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +5 -5
  87. data/app/assets/stylesheets/semantic-ui/modules/_toast.scss +49 -1
  88. data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +1 -1
  89. data/app/assets/stylesheets/semantic-ui/views/_ad.scss +4 -4
  90. data/app/assets/stylesheets/semantic-ui/views/_card.scss +754 -117
  91. data/app/assets/stylesheets/semantic-ui/views/_comment.scss +12 -12
  92. data/app/assets/stylesheets/semantic-ui/views/_feed.scss +29 -29
  93. data/app/assets/stylesheets/semantic-ui/views/_item.scss +17 -17
  94. data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +4 -4
  95. data/lib/fomantic/ui/sass/version.rb +2 -2
  96. metadata +5 -3
@@ -0,0 +1,1530 @@
1
+ /*!
2
+ * # Fomantic-UI - Flyout
3
+ * http://github.com/fomantic/Fomantic-UI/
4
+ *
5
+ *
6
+ * Released under the MIT license
7
+ * http://opensource.org/licenses/MIT
8
+ *
9
+ */
10
+
11
+ ;(function ($, window, document, undefined) {
12
+
13
+ 'use strict';
14
+
15
+ $.isFunction = $.isFunction || function(obj) {
16
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
17
+ };
18
+
19
+ window = (typeof window != 'undefined' && window.Math == Math)
20
+ ? window
21
+ : (typeof self != 'undefined' && self.Math == Math)
22
+ ? self
23
+ : Function('return this')()
24
+ ;
25
+
26
+ $.flyout = $.fn.flyout = function(parameters) {
27
+ var
28
+ $allModules = $(this),
29
+ $window = $(window),
30
+ $document = $(document),
31
+ $html = $('html'),
32
+ $head = $('head'),
33
+ $body = $('body'),
34
+
35
+ moduleSelector = $allModules.selector || '',
36
+
37
+ time = new Date().getTime(),
38
+ performance = [],
39
+
40
+ query = arguments[0],
41
+ methodInvoked = (typeof query == 'string'),
42
+ queryArguments = [].slice.call(arguments, 1),
43
+
44
+ requestAnimationFrame = window.requestAnimationFrame
45
+ || window.mozRequestAnimationFrame
46
+ || window.webkitRequestAnimationFrame
47
+ || window.msRequestAnimationFrame
48
+ || function(callback) { setTimeout(callback, 0); },
49
+
50
+ returnedValue
51
+ ;
52
+
53
+ $allModules
54
+ .each(function() {
55
+ var
56
+ settings = ( $.isPlainObject(parameters) )
57
+ ? $.extend(true, {}, $.fn.flyout.settings, parameters)
58
+ : $.extend({}, $.fn.flyout.settings),
59
+
60
+ selector = settings.selector,
61
+ className = settings.className,
62
+ namespace = settings.namespace,
63
+ fields = settings.fields,
64
+ regExp = settings.regExp,
65
+ error = settings.error,
66
+
67
+ eventNamespace = '.' + namespace,
68
+ moduleNamespace = 'module-' + namespace,
69
+
70
+ $module = $(this),
71
+ $context = [window,document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $body,
72
+ $closeIcon = $module.find(selector.close),
73
+ $inputs,
74
+ $focusedElement,
75
+
76
+ $flyouts = $module.children(selector.flyout),
77
+ $pusher = $context.children(selector.pusher),
78
+ $style,
79
+
80
+ isFlyoutComponent = $module.hasClass('flyout'),
81
+
82
+ element = this,
83
+ instance = isFlyoutComponent ? $module.data(moduleNamespace) : undefined,
84
+
85
+ ignoreRepeatedEvents = false,
86
+ isBody = $context[0] === $body[0],
87
+ initialBodyMargin = '',
88
+ tempBodyMargin = '',
89
+ hadScrollbar = false,
90
+
91
+ elementNamespace,
92
+ id,
93
+ observer,
94
+ currentScroll,
95
+ transitionEvent,
96
+
97
+ module
98
+ ;
99
+
100
+ module = {
101
+
102
+ initialize: function() {
103
+ module.debug('Initializing flyout', parameters);
104
+
105
+ module.create.id();
106
+ if(!isFlyoutComponent) {
107
+ module.create.flyout();
108
+ if(!$.isFunction(settings.onHidden)) {
109
+ settings.onHidden = function () {
110
+ module.destroy();
111
+ $module.remove();
112
+ };
113
+ }
114
+ if(!settings.autoShow) {
115
+ settings.autoShow = true;
116
+ }
117
+ }
118
+ $module.addClass(settings.class);
119
+ if (settings.title !== '') {
120
+ $module.find(selector.header).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle);
121
+ }
122
+ if (settings.content !== '') {
123
+ $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent);
124
+ }
125
+ if(module.has.configActions()){
126
+ var $actions = $module.find(selector.actions).addClass(settings.classActions);
127
+ if ($actions.length === 0) {
128
+ $actions = $('<div/>', {class: className.actions + ' ' + (settings.classActions || '')}).appendTo($module);
129
+ } else {
130
+ $actions.empty();
131
+ }
132
+ settings.actions.forEach(function (el) {
133
+ var
134
+ icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
135
+ text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
136
+ cls = module.helpers.deQuote(el[fields.class] || ''),
137
+ click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {}
138
+ ;
139
+ $actions.append($('<button/>', {
140
+ html: icon + text,
141
+ 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g,''),
142
+ class: className.button + ' ' + cls,
143
+ click: function () {
144
+ if (click.call(element, $module) === false) {
145
+ return;
146
+ }
147
+ module.hide();
148
+ }
149
+ }));
150
+ });
151
+ }
152
+
153
+ transitionEvent = module.get.transitionEvent();
154
+
155
+ // avoids locking rendering if initialized in onReady
156
+ if(settings.delaySetup) {
157
+ requestAnimationFrame(module.setup.layout);
158
+ }
159
+ else {
160
+ module.setup.layout();
161
+ }
162
+
163
+ requestAnimationFrame(function() {
164
+ module.setup.cache();
165
+ });
166
+
167
+ if (module.get.direction() == 'left' || module.get.direction() == 'right') {
168
+ module.setup.heights();
169
+ module.bind.resize();
170
+ }
171
+ module.bind.events();
172
+ module.observeChanges();
173
+ module.instantiate();
174
+
175
+ if(settings.autoShow){
176
+ module.show();
177
+ }
178
+ },
179
+
180
+ instantiate: function() {
181
+ module.verbose('Storing instance of module', module);
182
+ instance = module;
183
+ $module
184
+ .data(moduleNamespace, instance)
185
+ ;
186
+ },
187
+
188
+ create: {
189
+ flyout: function() {
190
+ module.verbose('Programmaticaly create flyout', $context);
191
+ $module = $('<div/>', {class: className.flyout, role: 'dialog', 'aria-modal': settings.dimPage});
192
+ if (settings.closeIcon) {
193
+ $closeIcon = $('<i/>', {class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close})
194
+ $module.append($closeIcon);
195
+ }
196
+ if (settings.title !== '') {
197
+ var titleId = '_' + module.get.id() + 'title';
198
+ $module.attr('aria-labelledby', titleId);
199
+ $('<div/>', {class: className.header, id: titleId}).appendTo($module);
200
+ }
201
+ if (settings.content !== '') {
202
+ var descId = '_' + module.get.id() + 'desc';
203
+ $module.attr('aria-describedby', descId);
204
+ $('<div/>', {class: className.content, id: descId}).appendTo($module);
205
+ }
206
+ if (module.has.configActions()) {
207
+ $('<div/>', {class: className.actions}).appendTo($module);
208
+ }
209
+ $module.prependTo($context);
210
+ element = $module[0];
211
+ },
212
+ id: function() {
213
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
214
+ elementNamespace = '.' + id;
215
+ module.verbose('Creating unique id for element', id);
216
+ }
217
+ },
218
+
219
+ destroy: function() {
220
+ if (observer) {
221
+ observer.disconnect();
222
+ }
223
+ module.verbose('Destroying previous module for', $module);
224
+ $module
225
+ .off(eventNamespace)
226
+ .removeData(moduleNamespace)
227
+ ;
228
+ if(module.is.ios()) {
229
+ module.remove.ios();
230
+ }
231
+ $closeIcon.off(elementNamespace);
232
+ if($inputs) {
233
+ $inputs.off(elementNamespace);
234
+ }
235
+ // bound by uuid
236
+ $context.off(elementNamespace);
237
+ $window.off(elementNamespace);
238
+ $document.off(elementNamespace);
239
+ },
240
+
241
+ event: {
242
+ keyboard: function(event) {
243
+ var
244
+ keyCode = event.which
245
+ ;
246
+ if(keyCode === settings.keys.escape) {
247
+ if(settings.closable) {
248
+ module.debug('Escape key pressed hiding flyout');
249
+ module.hide();
250
+ }
251
+ else {
252
+ module.debug('Escape key pressed, but closable is set to false');
253
+ }
254
+ event.preventDefault();
255
+ }
256
+ },
257
+ resize: function() {
258
+ module.setup.heights();
259
+ },
260
+ clickaway: function(event) {
261
+ if(settings.closable){
262
+ var
263
+ clickedInPusher = ($pusher.find(event.target).length > 0 || $pusher.is(event.target)),
264
+ clickedContext = ($context.is(event.target))
265
+ ;
266
+ if(clickedInPusher) {
267
+ module.verbose('User clicked on dimmed page');
268
+ module.hide();
269
+ }
270
+ if(clickedContext) {
271
+ module.verbose('User clicked on dimmable context (scaled out page)');
272
+ module.hide();
273
+ }
274
+ }
275
+ },
276
+ close: function(event) {
277
+ module.hide();
278
+ },
279
+ closeKeyUp: function(event){
280
+ var
281
+ keyCode = event.which
282
+ ;
283
+ if (keyCode === settings.keys.enter || keyCode === settings.keys.space) {
284
+ module.hide();
285
+ }
286
+ },
287
+ inputKeyDown: {
288
+ first: function(event) {
289
+ var
290
+ keyCode = event.which
291
+ ;
292
+ if (keyCode === settings.keys.tab && event.shiftKey) {
293
+ $inputs.last().focus();
294
+ event.preventDefault();
295
+ }
296
+ },
297
+ last: function(event) {
298
+ var
299
+ keyCode = event.which
300
+ ;
301
+ if (keyCode === settings.keys.tab && !event.shiftKey) {
302
+ $inputs.first().focus();
303
+ event.preventDefault();
304
+ }
305
+ }
306
+ },
307
+ approve: function(event) {
308
+ if (ignoreRepeatedEvents || settings.onApprove.call(module.element, $(this)) === false) {
309
+ module.verbose('Approve callback returned false cancelling close');
310
+ return;
311
+ }
312
+ ignoreRepeatedEvents = true;
313
+ module.hide(function() {
314
+ ignoreRepeatedEvents = false;
315
+ });
316
+ },
317
+ deny: function(event) {
318
+ if (ignoreRepeatedEvents || settings.onDeny.call(module.element, $(this)) === false) {
319
+ module.verbose('Deny callback returned false cancelling close');
320
+ return;
321
+ }
322
+ ignoreRepeatedEvents = true;
323
+ module.hide(function() {
324
+ ignoreRepeatedEvents = false;
325
+ });
326
+ },
327
+ touch: function(event) {
328
+ //event.stopPropagation();
329
+ },
330
+ containScroll: function(event) {
331
+ if(element.scrollTop <= 0) {
332
+ element.scrollTop = 1;
333
+ }
334
+ if((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {
335
+ element.scrollTop = element.scrollHeight - element.offsetHeight - 1;
336
+ }
337
+ },
338
+ scroll: function(event) {
339
+ if( $(event.target).closest(selector.flyout).length === 0 ) {
340
+ event.preventDefault();
341
+ }
342
+ }
343
+ },
344
+
345
+ bind: {
346
+ resize: function() {
347
+ module.verbose('Adding resize event to window', $window);
348
+ $window.on('resize' + elementNamespace, module.event.resize);
349
+ },
350
+ events: function() {
351
+ module.verbose('Attaching events');
352
+ $module
353
+ .on('click' + eventNamespace, selector.close, module.event.close)
354
+ .on('click' + eventNamespace, selector.approve, module.event.approve)
355
+ .on('click' + eventNamespace, selector.deny, module.event.deny)
356
+ ;
357
+ $closeIcon
358
+ .on('keyup' + elementNamespace, module.event.closeKeyUp)
359
+ ;
360
+ },
361
+ clickaway: function() {
362
+ module.verbose('Adding clickaway events to context', $context);
363
+ $context
364
+ .on('click' + elementNamespace, module.event.clickaway)
365
+ .on('touchend' + elementNamespace, module.event.clickaway)
366
+ ;
367
+ },
368
+ scrollLock: function() {
369
+ if(settings.scrollLock) {
370
+ module.debug('Disabling page scroll');
371
+ hadScrollbar = module.has.scrollbar();
372
+ if(hadScrollbar) {
373
+ module.save.bodyMargin();
374
+ module.set.bodyMargin();
375
+ }
376
+ $context.addClass(className.locked);
377
+ }
378
+ module.verbose('Adding events to contain flyout scroll');
379
+ $document
380
+ .on('touchmove' + elementNamespace, module.event.touch)
381
+ ;
382
+ $module
383
+ .on('scroll' + eventNamespace, module.event.containScroll)
384
+ ;
385
+ }
386
+ },
387
+ unbind: {
388
+ clickaway: function() {
389
+ module.verbose('Removing clickaway events from context', $context);
390
+ $context.off(elementNamespace);
391
+ },
392
+ scrollLock: function() {
393
+ module.verbose('Removing scroll lock from page');
394
+ if(hadScrollbar) {
395
+ module.restore.bodyMargin();
396
+ }
397
+ $context.removeClass(className.locked);
398
+ $document.off(elementNamespace);
399
+ $module.off('scroll' + eventNamespace);
400
+ }
401
+ },
402
+
403
+ add: {
404
+ inlineCSS: function() {
405
+ var
406
+ width = module.cache.width || $module.outerWidth(),
407
+ height = module.cache.height || $module.outerHeight(),
408
+ isRTL = module.is.rtl(),
409
+ direction = module.get.direction(),
410
+ distance = {
411
+ left : width,
412
+ right : -width,
413
+ top : height,
414
+ bottom : -height
415
+ },
416
+ style
417
+ ;
418
+
419
+ if(isRTL){
420
+ module.verbose('RTL detected, flipping widths');
421
+ distance.left = -width;
422
+ distance.right = width;
423
+ }
424
+
425
+ style = '<style>';
426
+
427
+ if(direction === 'left' || direction === 'right') {
428
+ module.debug('Adding CSS rules for animation distance', width);
429
+ style += ''
430
+ + ' .ui.visible.' + direction + '.flyout ~ .fixed,'
431
+ + ' .ui.visible.' + direction + '.flyout ~ .pusher {'
432
+ + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
433
+ + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
434
+ + ' }'
435
+ ;
436
+ }
437
+ else if(direction === 'top' || direction == 'bottom') {
438
+ style += ''
439
+ + ' .ui.visible.' + direction + '.flyout ~ .fixed,'
440
+ + ' .ui.visible.' + direction + '.flyout ~ .pusher {'
441
+ + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
442
+ + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
443
+ + ' }'
444
+ ;
445
+ }
446
+
447
+ /* IE is only browser not to create context with transforms */
448
+ /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */
449
+ if( module.is.ie() ) {
450
+ if(direction === 'left' || direction === 'right') {
451
+ module.debug('Adding CSS rules for animation distance', width);
452
+ style += ''
453
+ + ' body.pushable > .ui.visible.' + direction + '.flyout ~ .pusher::after {'
454
+ + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
455
+ + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
456
+ + ' }'
457
+ ;
458
+ }
459
+ else if(direction === 'top' || direction == 'bottom') {
460
+ style += ''
461
+ + ' body.pushable > .ui.visible.' + direction + '.flyout ~ .pusher::after {'
462
+ + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
463
+ + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
464
+ + ' }'
465
+ ;
466
+ }
467
+ /* opposite sides visible forces content overlay */
468
+ style += ''
469
+ + ' body.pushable > .ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .pusher::after,'
470
+ + ' body.pushable > .ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .pusher::after {'
471
+ + ' -webkit-transform: translate3d(0, 0, 0);'
472
+ + ' transform: translate3d(0, 0, 0);'
473
+ + ' }'
474
+ ;
475
+ }
476
+ style += '</style>';
477
+ $style = $(style)
478
+ .appendTo($head)
479
+ ;
480
+ module.debug('Adding sizing css to head', $style);
481
+ },
482
+ keyboardShortcuts: function() {
483
+ module.verbose('Adding keyboard shortcuts');
484
+ $document
485
+ .on('keydown' + eventNamespace, module.event.keyboard)
486
+ ;
487
+ }
488
+ },
489
+ observeChanges: function() {
490
+ if('MutationObserver' in window) {
491
+ observer = new MutationObserver(function(mutations) {
492
+ module.refreshInputs();
493
+ });
494
+ observer.observe(element, {
495
+ childList : true,
496
+ subtree : true
497
+ });
498
+ module.debug('Setting up mutation observer', observer);
499
+ }
500
+ },
501
+ refresh: function() {
502
+ module.verbose('Refreshing selector cache');
503
+ $context = [window,document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $body;
504
+ module.refreshFlyouts();
505
+ $pusher = $context.children(selector.pusher);
506
+ module.clear.cache();
507
+ },
508
+
509
+ refreshFlyouts: function() {
510
+ module.verbose('Refreshing other flyouts');
511
+ $flyouts = $context.children(selector.flyout);
512
+ },
513
+
514
+ refreshInputs: function(){
515
+ if($inputs){
516
+ $inputs
517
+ .off('keydown' + elementNamespace)
518
+ ;
519
+ }
520
+ if(!settings.dimPage){
521
+ return;
522
+ }
523
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
524
+ return $(this).closest('.disabled').length === 0;
525
+ });
526
+ $inputs.first()
527
+ .on('keydown' + elementNamespace, module.event.inputKeyDown.first)
528
+ ;
529
+ $inputs.last()
530
+ .on('keydown' + elementNamespace, module.event.inputKeyDown.last)
531
+ ;
532
+ },
533
+
534
+ setup: {
535
+ cache: function() {
536
+ module.cache = {
537
+ width : $module.outerWidth(),
538
+ height : $module.outerHeight()
539
+ };
540
+ },
541
+ layout: function() {
542
+ if( $context.children(selector.pusher).length === 0 ) {
543
+ module.debug('Adding wrapper element for flyout');
544
+ module.error(error.pusher);
545
+ $pusher = $('<div class="pusher" />');
546
+ $context
547
+ .children()
548
+ .not(selector.omitted)
549
+ .not($flyouts)
550
+ .wrapAll($pusher)
551
+ ;
552
+ module.refresh();
553
+ }
554
+ if($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {
555
+ module.debug('Moved flyout to correct parent element');
556
+ module.error(error.movedFlyout, element);
557
+ $module.detach().prependTo($context);
558
+ module.refresh();
559
+ }
560
+ if( module.is.mobile() ) {
561
+ $module.addClass(className.fullscreen);
562
+ }
563
+ module.clear.cache();
564
+ module.set.pushable();
565
+ module.set.direction();
566
+ },
567
+ heights: function() {
568
+ module.debug('Setting up heights', $module);
569
+ var
570
+ $header = $module.children(selector.header),
571
+ $content = $module.children(selector.content),
572
+ $actions = $module.children(selector.actions)
573
+ ;
574
+ $content.css('min-height', ($context.height() - $header.outerHeight() - $actions.outerHeight()) + 'px');
575
+ }
576
+ },
577
+
578
+ attachEvents: function(selector, event) {
579
+ var
580
+ $toggle = $(selector)
581
+ ;
582
+ event = $.isFunction(module[event])
583
+ ? module[event]
584
+ : module.toggle
585
+ ;
586
+ if($toggle.length > 0) {
587
+ module.debug('Attaching flyout events to element', selector, event);
588
+ $toggle
589
+ .on('click' + eventNamespace, event)
590
+ ;
591
+ }
592
+ else {
593
+ module.error(error.notFound, selector);
594
+ }
595
+ },
596
+
597
+ show: function(callback) {
598
+ callback = $.isFunction(callback)
599
+ ? callback
600
+ : function(){}
601
+ ;
602
+ if(module.is.hidden()) {
603
+ if(settings.onShow.call(element) === false) {
604
+ module.verbose('Show callback returned false cancelling show');
605
+ return;
606
+ }
607
+ module.refresh();
608
+ if(module.othersActive()) {
609
+ module.debug('Other flyouts currently visible');
610
+ if(settings.exclusive) {
611
+ module.hideOthers();
612
+ } else {
613
+ ignoreRepeatedEvents = false;
614
+ }
615
+ }
616
+ module.set.dimmerStyles();
617
+ module.pushPage(function() {
618
+ callback.call(element);
619
+ settings.onVisible.call(element);
620
+ if(settings.keyboardShortcuts) {
621
+ module.add.keyboardShortcuts();
622
+ }
623
+ module.save.focus();
624
+ module.refreshInputs();
625
+ if(settings.autofocus) {
626
+ module.set.autofocus();
627
+ }
628
+ });
629
+ settings.onChange.call(element);
630
+ }
631
+ else {
632
+ module.debug('Flyout is already visible');
633
+ }
634
+ },
635
+
636
+ hide: function(callback) {
637
+ callback = $.isFunction(callback)
638
+ ? callback
639
+ : function(){}
640
+ ;
641
+ if(settings.onHide.call(element, $(this)) === false) {
642
+ module.verbose('Hide callback returned false cancelling hide');
643
+ ignoreRepeatedEvents = false;
644
+ return false;
645
+ }
646
+ if(module.is.visible() || module.is.animating()) {
647
+ module.debug('Hiding flyout', callback);
648
+ module.refreshFlyouts();
649
+ module.pullPage(function() {
650
+ callback.call(element);
651
+ if($.isFunction(settings.onHidden)) {
652
+ settings.onHidden.call(element);
653
+ }
654
+ module.restore.focus();
655
+ });
656
+ settings.onChange.call(element);
657
+ }
658
+ },
659
+
660
+ othersAnimating: function() {
661
+ return ($flyouts.not($module).filter('.' + className.animating).length > 0);
662
+ },
663
+ othersVisible: function() {
664
+ return ($flyouts.not($module).filter('.' + className.visible).length > 0);
665
+ },
666
+ othersActive: function() {
667
+ return(module.othersVisible() || module.othersAnimating());
668
+ },
669
+
670
+ hideOthers: function(callback) {
671
+ var
672
+ $otherFlyouts = $flyouts.not($module).filter('.' + className.visible),
673
+ flyoutCount = $otherFlyouts.length,
674
+ callbackCount = 0
675
+ ;
676
+ callback = callback || function(){};
677
+ $otherFlyouts
678
+ .flyout('hide', function() {
679
+ callbackCount++;
680
+ if(callbackCount == flyoutCount) {
681
+ callback();
682
+ }
683
+ })
684
+ ;
685
+ },
686
+
687
+ toggle: function() {
688
+ module.verbose('Determining toggled direction');
689
+ if(module.is.hidden()) {
690
+ module.show();
691
+ }
692
+ else {
693
+ module.hide();
694
+ }
695
+ },
696
+
697
+ pushPage: function(callback) {
698
+ var
699
+ animate,
700
+ dim,
701
+ transitionEnd
702
+ ;
703
+ callback = $.isFunction(callback)
704
+ ? callback
705
+ : function(){}
706
+ ;
707
+ module.set.overlay();
708
+ if(settings.returnScroll) {
709
+ currentScroll = (isBody ? $window : $context).scrollTop();
710
+ }
711
+ module.bind.scrollLock();
712
+ animate = function() {
713
+ module.bind.clickaway();
714
+ module.add.inlineCSS();
715
+ module.set.animating();
716
+ module.set.visible();
717
+ };
718
+ dim = function() {
719
+ module.set.dimmed();
720
+ };
721
+ transitionEnd = function(event) {
722
+ if( event.target == $module[0] ) {
723
+ $module.off(transitionEvent + elementNamespace, transitionEnd);
724
+ module.remove.animating();
725
+ callback.call(element);
726
+ }
727
+ };
728
+ $module.off(transitionEvent + elementNamespace);
729
+ $module.on(transitionEvent + elementNamespace, transitionEnd);
730
+ requestAnimationFrame(animate);
731
+ if(settings.dimPage && !module.othersVisible()) {
732
+ requestAnimationFrame(dim);
733
+ }
734
+ },
735
+
736
+ pullPage: function(callback) {
737
+ var
738
+ animate,
739
+ transitionEnd
740
+ ;
741
+ callback = $.isFunction(callback)
742
+ ? callback
743
+ : function(){}
744
+ ;
745
+ module.verbose('Removing context push state', module.get.direction());
746
+
747
+ module.unbind.clickaway();
748
+ if(!module.othersActive()) {
749
+ module.unbind.scrollLock();
750
+ if( settings.keyboardShortcuts ) {
751
+ module.remove.keyboardShortcuts();
752
+ }
753
+ }
754
+
755
+
756
+ animate = function() {
757
+ module.set.overlay();
758
+ module.set.animating();
759
+ if(settings.dimPage && !module.othersVisible()) {
760
+ module.set.closing();
761
+ }
762
+ module.remove.visible();
763
+ };
764
+ transitionEnd = function(event) {
765
+ if( event.target == $module[0] ) {
766
+ $module.off(transitionEvent + elementNamespace, transitionEnd);
767
+ module.remove.animating();
768
+ module.remove.closing();
769
+ module.remove.overlay();
770
+ module.remove.inlineCSS();
771
+ if(settings.returnScroll) {
772
+ module.scrollBack();
773
+ }
774
+ if (settings.dimPage && !module.othersVisible()) {
775
+ $pusher.removeClass(className.dimmed);
776
+ }
777
+ callback.call(element);
778
+ }
779
+ };
780
+ $module.off(transitionEvent + elementNamespace);
781
+ $module.on(transitionEvent + elementNamespace, transitionEnd);
782
+ requestAnimationFrame(animate);
783
+ },
784
+
785
+ scrollToTop: function() {
786
+ module.verbose('Scrolling to top of page to avoid animation issues');
787
+ $module.scrollTop(0);
788
+ (isBody ? $window : $context)[0].scrollTo(0, 0);
789
+ },
790
+
791
+ scrollBack: function() {
792
+ module.verbose('Scrolling back to original page position');
793
+ (isBody ? $window : $context)[0].scrollTo(0, currentScroll);
794
+ },
795
+
796
+ clear: {
797
+ cache: function() {
798
+ module.verbose('Clearing cached dimensions');
799
+ module.cache = {};
800
+ }
801
+ },
802
+
803
+ set: {
804
+ autofocus: function() {
805
+ var
806
+ $autofocus = $inputs.filter('[autofocus]'),
807
+ $input = ($autofocus.length > 0)
808
+ ? $autofocus.first()
809
+ : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
810
+ ;
811
+ if($input.length > 0) {
812
+ $input.focus();
813
+ }
814
+ },
815
+ dimmerStyles: function() {
816
+ if(settings.blurring) {
817
+ $pusher.addClass(className.blurring);
818
+ }
819
+ else {
820
+ $pusher.removeClass(className.blurring);
821
+ }
822
+ },
823
+ bodyMargin: function() {
824
+ var position = module.can.leftBodyScrollbar() ? 'left':'right';
825
+ $context.css((isBody ? 'margin-':'padding-')+position, tempBodyMargin + 'px');
826
+ $context.find(selector.bodyFixed.replace('right',position)).each(function(){
827
+ var el = $(this),
828
+ attribute = el.css('position') === 'fixed' ? 'padding-'+position : position
829
+ ;
830
+ el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');
831
+ });
832
+ },
833
+
834
+ // ios only (scroll on html not document). This prevent auto-resize canvas/scroll in ios
835
+ // (This is no longer necessary in latest iOS)
836
+ ios: function() {
837
+ $html.addClass(className.ios);
838
+ },
839
+
840
+ // container
841
+ pushed: function() {
842
+ $context.addClass(className.pushed);
843
+ },
844
+ pushable: function() {
845
+ $context.addClass(className.pushable);
846
+ },
847
+
848
+ // pusher
849
+ dimmed: function() {
850
+ $pusher.addClass(className.dimmed);
851
+ },
852
+
853
+ // flyout
854
+ active: function() {
855
+ $module.addClass(className.active);
856
+ },
857
+ animating: function() {
858
+ $module.addClass(className.animating);
859
+ },
860
+ closing: function() {
861
+ $pusher.addClass(className.closing);
862
+ },
863
+ direction: function(direction) {
864
+ direction = direction || module.get.direction();
865
+ $module.addClass(className[direction]);
866
+ },
867
+ visible: function() {
868
+ $module.addClass(className.visible);
869
+ },
870
+ overlay: function() {
871
+ $module.addClass(className.overlay);
872
+ }
873
+ },
874
+ remove: {
875
+
876
+ inlineCSS: function() {
877
+ module.debug('Removing inline css styles', $style);
878
+ if($style && $style.length > 0) {
879
+ $style.remove();
880
+ }
881
+ },
882
+ keyboardShortcuts: function() {
883
+ module.verbose('Removing keyboard shortcuts');
884
+ $document
885
+ .off('keydown' + eventNamespace)
886
+ ;
887
+ },
888
+
889
+ // ios scroll on html not document
890
+ ios: function() {
891
+ $html.removeClass(className.ios);
892
+ },
893
+
894
+ // context
895
+ pushed: function() {
896
+ $context.removeClass(className.pushed);
897
+ },
898
+ pushable: function() {
899
+ $context.removeClass(className.pushable);
900
+ },
901
+
902
+ // flyout
903
+ active: function() {
904
+ $module.removeClass(className.active);
905
+ },
906
+ animating: function() {
907
+ $module.removeClass(className.animating);
908
+ },
909
+ closing: function() {
910
+ $pusher.removeClass(className.closing);
911
+ },
912
+ direction: function(direction) {
913
+ direction = direction || module.get.direction();
914
+ $module.removeClass(className[direction]);
915
+ },
916
+ visible: function() {
917
+ $module.removeClass(className.visible);
918
+ },
919
+ overlay: function() {
920
+ $module.removeClass(className.overlay);
921
+ }
922
+ },
923
+
924
+ get: {
925
+ direction: function() {
926
+ if($module.hasClass(className.top)) {
927
+ return className.top;
928
+ }
929
+ else if($module.hasClass(className.right)) {
930
+ return className.right;
931
+ }
932
+ else if($module.hasClass(className.bottom)) {
933
+ return className.bottom;
934
+ }
935
+ return className.left;
936
+ },
937
+ transitionEvent: function() {
938
+ var
939
+ element = document.createElement('element'),
940
+ transitions = {
941
+ 'transition' :'transitionend',
942
+ 'OTransition' :'oTransitionEnd',
943
+ 'MozTransition' :'transitionend',
944
+ 'WebkitTransition' :'webkitTransitionEnd'
945
+ },
946
+ transition
947
+ ;
948
+ for(transition in transitions){
949
+ if( element.style[transition] !== undefined ){
950
+ return transitions[transition];
951
+ }
952
+ }
953
+ },
954
+ id: function() {
955
+ return id;
956
+ },
957
+ element: function() {
958
+ return $module;
959
+ },
960
+ settings: function() {
961
+ return settings;
962
+ }
963
+ },
964
+
965
+ can: {
966
+ leftBodyScrollbar: function () {
967
+ if (module.cache.leftBodyScrollbar === undefined) {
968
+ module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());
969
+ }
970
+ return module.cache.leftBodyScrollbar;
971
+ }
972
+ },
973
+
974
+ save: {
975
+ focus: function() {
976
+ var
977
+ $activeElement = $(document.activeElement),
978
+ inCurrentFlyout = $activeElement.closest($module).length > 0
979
+ ;
980
+ if(!inCurrentFlyout) {
981
+ $focusedElement = $(document.activeElement).blur();
982
+ }
983
+ },
984
+ bodyMargin: function() {
985
+ initialBodyMargin = $context.css((isBody ? 'margin-':'padding-')+(module.can.leftBodyScrollbar() ? 'left':'right'));
986
+ var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, '')),
987
+ bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth;
988
+ tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;
989
+ }
990
+ },
991
+
992
+ is: {
993
+ safari: function() {
994
+ if(module.cache.isSafari === undefined) {
995
+ module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;
996
+ }
997
+ return module.cache.isSafari;
998
+ },
999
+ edge: function(){
1000
+ if(module.cache.isEdge === undefined) {
1001
+ module.cache.isEdge = !!window.setImmediate && !module.is.ie();
1002
+ }
1003
+ return module.cache.isEdge;
1004
+ },
1005
+ firefox: function(){
1006
+ if(module.cache.isFirefox === undefined) {
1007
+ module.cache.isFirefox = !!window.InstallTrigger;
1008
+ }
1009
+ return module.cache.isFirefox;
1010
+ },
1011
+ iframe: function() {
1012
+ return !(self === top);
1013
+ },
1014
+ ie: function() {
1015
+ if(module.cache.isIE === undefined) {
1016
+ var
1017
+ isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
1018
+ isIE = ('ActiveXObject' in window)
1019
+ ;
1020
+ module.cache.isIE = (isIE11 || isIE);
1021
+ }
1022
+ return module.cache.isIE;
1023
+ },
1024
+ ios: function() {
1025
+ var
1026
+ userAgent = navigator.userAgent,
1027
+ isIOS = userAgent.match(regExp.ios),
1028
+ isMobileChrome = userAgent.match(regExp.mobileChrome)
1029
+ ;
1030
+ if(isIOS && !isMobileChrome) {
1031
+ module.verbose('Browser was found to be iOS', userAgent);
1032
+ return true;
1033
+ }
1034
+ else {
1035
+ return false;
1036
+ }
1037
+ },
1038
+ mobile: function() {
1039
+ var
1040
+ userAgent = navigator.userAgent,
1041
+ isMobile = userAgent.match(regExp.mobile)
1042
+ ;
1043
+ if(isMobile) {
1044
+ module.verbose('Browser was found to be mobile', userAgent);
1045
+ return true;
1046
+ }
1047
+ else {
1048
+ module.verbose('Browser is not mobile, using regular transition', userAgent);
1049
+ return false;
1050
+ }
1051
+ },
1052
+ hidden: function() {
1053
+ return !module.is.visible();
1054
+ },
1055
+ visible: function() {
1056
+ return $module.hasClass(className.visible);
1057
+ },
1058
+ animating: function() {
1059
+ return $context.hasClass(className.animating);
1060
+ },
1061
+ rtl: function () {
1062
+ if(module.cache.isRTL === undefined) {
1063
+ module.cache.isRTL = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl';
1064
+ }
1065
+ return module.cache.isRTL;
1066
+ }
1067
+ },
1068
+
1069
+ has: {
1070
+ configActions: function () {
1071
+ return Array.isArray(settings.actions) && settings.actions.length > 0;
1072
+ },
1073
+ scrollbar: function() {
1074
+ return isBody || $context.css('overflow-y') !== 'hidden';
1075
+ }
1076
+ },
1077
+
1078
+ restore: {
1079
+ focus: function() {
1080
+ if($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {
1081
+ $focusedElement.focus();
1082
+ }
1083
+ },
1084
+ bodyMargin: function() {
1085
+ var position = module.can.leftBodyScrollbar() ? 'left':'right';
1086
+ $context.css((isBody ? 'margin-':'padding-')+position, initialBodyMargin);
1087
+ $context.find(selector.bodyFixed.replace('right',position)).each(function(){
1088
+ var el = $(this),
1089
+ attribute = el.css('position') === 'fixed' ? 'padding-'+position : position
1090
+ ;
1091
+ el.css(attribute, '');
1092
+ });
1093
+ }
1094
+ },
1095
+
1096
+ helpers: {
1097
+ deQuote: function(string) {
1098
+ return String(string).replace(/"/g,"");
1099
+ },
1100
+ escape: function(string, preserveHTML) {
1101
+ if (preserveHTML){
1102
+ return string;
1103
+ }
1104
+ var
1105
+ badChars = /[<>"'`]/g,
1106
+ shouldEscape = /[&<>"'`]/,
1107
+ escape = {
1108
+ "<": "&lt;",
1109
+ ">": "&gt;",
1110
+ '"': "&quot;",
1111
+ "'": "&#x27;",
1112
+ "`": "&#x60;"
1113
+ },
1114
+ escapedChar = function(chr) {
1115
+ return escape[chr];
1116
+ }
1117
+ ;
1118
+ if(shouldEscape.test(string)) {
1119
+ string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
1120
+ return string.replace(badChars, escapedChar);
1121
+ }
1122
+ return string;
1123
+ }
1124
+ },
1125
+
1126
+ setting: function(name, value) {
1127
+ module.debug('Changing setting', name, value);
1128
+ if( $.isPlainObject(name) ) {
1129
+ $.extend(true, settings, name);
1130
+ }
1131
+ else if(value !== undefined) {
1132
+ if($.isPlainObject(settings[name])) {
1133
+ $.extend(true, settings[name], value);
1134
+ }
1135
+ else {
1136
+ settings[name] = value;
1137
+ }
1138
+ }
1139
+ else {
1140
+ return settings[name];
1141
+ }
1142
+ },
1143
+ internal: function(name, value) {
1144
+ if( $.isPlainObject(name) ) {
1145
+ $.extend(true, module, name);
1146
+ }
1147
+ else if(value !== undefined) {
1148
+ module[name] = value;
1149
+ }
1150
+ else {
1151
+ return module[name];
1152
+ }
1153
+ },
1154
+ debug: function() {
1155
+ if(!settings.silent && settings.debug) {
1156
+ if(settings.performance) {
1157
+ module.performance.log(arguments);
1158
+ }
1159
+ else {
1160
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1161
+ module.debug.apply(console, arguments);
1162
+ }
1163
+ }
1164
+ },
1165
+ verbose: function() {
1166
+ if(!settings.silent && settings.verbose && settings.debug) {
1167
+ if(settings.performance) {
1168
+ module.performance.log(arguments);
1169
+ }
1170
+ else {
1171
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1172
+ module.verbose.apply(console, arguments);
1173
+ }
1174
+ }
1175
+ },
1176
+ error: function() {
1177
+ if(!settings.silent) {
1178
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1179
+ module.error.apply(console, arguments);
1180
+ }
1181
+ },
1182
+ performance: {
1183
+ log: function(message) {
1184
+ var
1185
+ currentTime,
1186
+ executionTime,
1187
+ previousTime
1188
+ ;
1189
+ if(settings.performance) {
1190
+ currentTime = new Date().getTime();
1191
+ previousTime = time || currentTime;
1192
+ executionTime = currentTime - previousTime;
1193
+ time = currentTime;
1194
+ performance.push({
1195
+ 'Name' : message[0],
1196
+ 'Arguments' : [].slice.call(message, 1) || '',
1197
+ 'Element' : element,
1198
+ 'Execution Time' : executionTime
1199
+ });
1200
+ }
1201
+ clearTimeout(module.performance.timer);
1202
+ module.performance.timer = setTimeout(module.performance.display, 500);
1203
+ },
1204
+ display: function() {
1205
+ var
1206
+ title = settings.name + ':',
1207
+ totalTime = 0
1208
+ ;
1209
+ time = false;
1210
+ clearTimeout(module.performance.timer);
1211
+ $.each(performance, function(index, data) {
1212
+ totalTime += data['Execution Time'];
1213
+ });
1214
+ title += ' ' + totalTime + 'ms';
1215
+ if(moduleSelector) {
1216
+ title += ' \'' + moduleSelector + '\'';
1217
+ }
1218
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
1219
+ console.groupCollapsed(title);
1220
+ if(console.table) {
1221
+ console.table(performance);
1222
+ }
1223
+ else {
1224
+ $.each(performance, function(index, data) {
1225
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
1226
+ });
1227
+ }
1228
+ console.groupEnd();
1229
+ }
1230
+ performance = [];
1231
+ }
1232
+ },
1233
+ invoke: function(query, passedArguments, context) {
1234
+ var
1235
+ object = instance,
1236
+ maxDepth,
1237
+ found,
1238
+ response
1239
+ ;
1240
+ passedArguments = passedArguments || queryArguments;
1241
+ context = element || context;
1242
+ if(typeof query == 'string' && object !== undefined) {
1243
+ query = query.split(/[\. ]/);
1244
+ maxDepth = query.length - 1;
1245
+ $.each(query, function(depth, value) {
1246
+ var camelCaseValue = (depth != maxDepth)
1247
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1248
+ : query
1249
+ ;
1250
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
1251
+ object = object[camelCaseValue];
1252
+ }
1253
+ else if( object[camelCaseValue] !== undefined ) {
1254
+ found = object[camelCaseValue];
1255
+ return false;
1256
+ }
1257
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
1258
+ object = object[value];
1259
+ }
1260
+ else if( object[value] !== undefined ) {
1261
+ found = object[value];
1262
+ return false;
1263
+ }
1264
+ else {
1265
+ module.error(error.method, query);
1266
+ return false;
1267
+ }
1268
+ });
1269
+ }
1270
+ if ( $.isFunction( found ) ) {
1271
+ response = found.apply(context, passedArguments);
1272
+ }
1273
+ else if(found !== undefined) {
1274
+ response = found;
1275
+ }
1276
+ if(Array.isArray(returnedValue)) {
1277
+ returnedValue.push(response);
1278
+ }
1279
+ else if(returnedValue !== undefined) {
1280
+ returnedValue = [returnedValue, response];
1281
+ }
1282
+ else if(response !== undefined) {
1283
+ returnedValue = response;
1284
+ }
1285
+ return found;
1286
+ }
1287
+ }
1288
+ ;
1289
+
1290
+ if(methodInvoked) {
1291
+ if(instance === undefined) {
1292
+ if ($.isFunction(settings.templates[query])) {
1293
+ settings.autoShow = true;
1294
+ settings.className.flyout = settings.className.template;
1295
+ settings = $.extend(true, {}, settings, settings.templates[query].apply(module ,queryArguments));
1296
+
1297
+ // reassign shortcuts
1298
+ className = settings.className;
1299
+ namespace = settings.namespace;
1300
+ fields = settings.fields;
1301
+ error = settings.error;
1302
+ }
1303
+ module.initialize();
1304
+ }
1305
+ if (!$.isFunction(settings.templates[query])) {
1306
+ module.invoke(query);
1307
+ }
1308
+ }
1309
+ else {
1310
+ if(instance !== undefined) {
1311
+ instance.invoke('destroy');
1312
+ }
1313
+ module.initialize();
1314
+ returnedValue = $module;
1315
+ }
1316
+ });
1317
+
1318
+ return (returnedValue !== undefined)
1319
+ ? returnedValue
1320
+ : this
1321
+ ;
1322
+ };
1323
+
1324
+ $.fn.flyout.settings = {
1325
+
1326
+ name : 'Flyout',
1327
+ namespace : 'flyout',
1328
+
1329
+ silent : false,
1330
+ debug : false,
1331
+ verbose : false,
1332
+ performance : true,
1333
+
1334
+ context : 'body',
1335
+ exclusive : false,
1336
+ closable : true,
1337
+ autofocus : true,
1338
+ restoreFocus : true,
1339
+ dimPage : true,
1340
+ scrollLock : false,
1341
+ returnScroll : false,
1342
+ delaySetup : false,
1343
+ autoShow : false,
1344
+
1345
+ keyboardShortcuts: true,
1346
+
1347
+ //dynamic content
1348
+ title : '',
1349
+ content : '',
1350
+ class : '',
1351
+ classTitle : '',
1352
+ classContent : '',
1353
+ classActions : '',
1354
+ closeIcon : false,
1355
+ actions : false,
1356
+ preserveHTML : true,
1357
+
1358
+ fields : {
1359
+ class : 'class',
1360
+ text : 'text',
1361
+ icon : 'icon',
1362
+ click : 'click'
1363
+ },
1364
+
1365
+ onChange : function(){},
1366
+ onShow : function(){},
1367
+ onHide : function(){ return true; },
1368
+
1369
+ onHidden : false,
1370
+ onVisible : function(){},
1371
+
1372
+ onApprove : function(){},
1373
+ onDeny : function(){},
1374
+
1375
+ keys : {
1376
+ space : 32,
1377
+ enter : 13,
1378
+ escape : 27,
1379
+ tab : 9,
1380
+ },
1381
+
1382
+ className : {
1383
+ flyout : 'ui flyout',
1384
+ close : 'close icon',
1385
+ header : 'ui header',
1386
+ content : 'content',
1387
+ actions : 'actions',
1388
+ active : 'active',
1389
+ animating : 'animating',
1390
+ blurring : 'blurring',
1391
+ closing : 'closing',
1392
+ dimmed : 'dimmed',
1393
+ ios : 'ios',
1394
+ locked : 'locked',
1395
+ pushable : 'pushable',
1396
+ pushed : 'pushed',
1397
+ right : 'right',
1398
+ top : 'top',
1399
+ left : 'left',
1400
+ bottom : 'bottom',
1401
+ visible : 'visible',
1402
+ overlay : 'overlay',
1403
+ fullscreen : 'fullscreen',
1404
+ template : 'ui flyout',
1405
+ button : 'ui button',
1406
+ ok : 'positive',
1407
+ cancel : 'negative',
1408
+ prompt : 'ui fluid input'
1409
+ },
1410
+
1411
+ selector: {
1412
+ bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.right.flyout, > .ui.fixed.nag, > .ui.fixed.nag > .close',
1413
+ fixed : '.fixed',
1414
+ omitted : 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',
1415
+ pusher : '.pusher',
1416
+ flyout : '.ui.flyout',
1417
+ header : '.ui.header',
1418
+ content : '.content',
1419
+ actions : '.actions',
1420
+ close : '.close',
1421
+ approve : '.actions .positive, .actions .approve, .actions .ok',
1422
+ deny : '.actions .negative, .actions .deny, .actions .cancel'
1423
+ },
1424
+
1425
+ regExp: {
1426
+ ios : /(iPad|iPhone|iPod)/g,
1427
+ mobileChrome : /(CriOS)/g,
1428
+ mobile : /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g
1429
+ },
1430
+
1431
+ error : {
1432
+ method : 'The method you called is not defined.',
1433
+ pusher : 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',
1434
+ movedFlyout : 'Had to move flyout. For optimal performance make sure flyout and pusher are direct children of your body tag',
1435
+ notFound : 'There were no elements that matched the specified selector'
1436
+ },
1437
+
1438
+ text: {
1439
+ ok : 'Ok',
1440
+ cancel : 'Cancel',
1441
+ close : 'Close'
1442
+ }
1443
+ };
1444
+
1445
+ $.fn.flyout.settings.templates = {
1446
+ getArguments: function(args) {
1447
+ var queryArguments = [].slice.call(args);
1448
+ if($.isPlainObject(queryArguments[0])){
1449
+ return $.extend({
1450
+ handler:function(){},
1451
+ content:'',
1452
+ title: ''
1453
+ }, queryArguments[0]);
1454
+ } else {
1455
+ if(!$.isFunction(queryArguments[queryArguments.length-1])) {
1456
+ queryArguments.push(function() {});
1457
+ }
1458
+ return {
1459
+ handler: queryArguments.pop(),
1460
+ content: queryArguments.pop() || '',
1461
+ title: queryArguments.pop() || ''
1462
+ };
1463
+ }
1464
+ },
1465
+ alert: function () {
1466
+ var
1467
+ settings = this.get.settings(),
1468
+ args = settings.templates.getArguments(arguments)
1469
+ ;
1470
+ return {
1471
+ title : args.title,
1472
+ content: args.content,
1473
+ actions: [{
1474
+ text : settings.text.ok,
1475
+ class: settings.className.ok,
1476
+ click: args.handler
1477
+ }]
1478
+ }
1479
+ },
1480
+ confirm: function () {
1481
+ var
1482
+ settings = this.get.settings(),
1483
+ args = settings.templates.getArguments(arguments)
1484
+ ;
1485
+ return {
1486
+ title : args.title,
1487
+ content: args.content,
1488
+ actions: [{
1489
+ text : settings.text.ok,
1490
+ class: settings.className.ok,
1491
+ click: function(){args.handler(true)}
1492
+ },{
1493
+ text: settings.text.cancel,
1494
+ class: settings.className.cancel,
1495
+ click: function(){args.handler(false)}
1496
+ }]
1497
+ }
1498
+ },
1499
+ prompt: function () {
1500
+ var
1501
+ $this = this,
1502
+ settings = this.get.settings(),
1503
+ args = settings.templates.getArguments(arguments),
1504
+ input = $($.parseHTML(args.content)).filter('.ui.input')
1505
+ ;
1506
+ if (input.length === 0) {
1507
+ args.content += '<p><div class="'+settings.className.prompt+'"><input placeholder="'+this.helpers.deQuote(args.placeholder || '')+'" type="text" value="'+this.helpers.deQuote(args.defaultValue || '')+'"></div></p>';
1508
+ }
1509
+ return {
1510
+ title : args.title,
1511
+ content: args.content,
1512
+ actions: [{
1513
+ text: settings.text.ok,
1514
+ class: settings.className.ok,
1515
+ click: function(){
1516
+ var settings = $this.get.settings(),
1517
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
1518
+ ;
1519
+ args.handler($(inputField).val());
1520
+ }
1521
+ },{
1522
+ text: settings.text.cancel,
1523
+ class: settings.className.cancel,
1524
+ click: function(){args.handler(null)}
1525
+ }]
1526
+ }
1527
+ }
1528
+ };
1529
+
1530
+ })( jQuery, window, document );