less-rails-semantic_ui 2.1.8.2 → 2.2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +15 -0
  3. data/assets/fonts/semantic_ui/themes/default/assets/fonts/icons.eot +0 -0
  4. data/assets/fonts/semantic_ui/themes/default/assets/fonts/icons.svg +146 -26
  5. data/assets/fonts/semantic_ui/themes/default/assets/fonts/icons.ttf +0 -0
  6. data/assets/fonts/semantic_ui/themes/default/assets/fonts/icons.woff +0 -0
  7. data/assets/fonts/semantic_ui/themes/default/assets/fonts/icons.woff2 +0 -0
  8. data/assets/javascripts/semantic_ui/definitions/behaviors/api.js +41 -16
  9. data/assets/javascripts/semantic_ui/definitions/behaviors/colorize.js +233 -227
  10. data/assets/javascripts/semantic_ui/definitions/behaviors/form.js +58 -23
  11. data/assets/javascripts/semantic_ui/definitions/behaviors/state.js +20 -7
  12. data/assets/javascripts/semantic_ui/definitions/behaviors/visibility.js +89 -22
  13. data/assets/javascripts/semantic_ui/definitions/behaviors/visit.js +13 -5
  14. data/assets/javascripts/semantic_ui/definitions/globals/site.js +2 -2
  15. data/assets/javascripts/semantic_ui/definitions/modules/accordion.js +20 -6
  16. data/assets/javascripts/semantic_ui/definitions/modules/checkbox.js +31 -9
  17. data/assets/javascripts/semantic_ui/definitions/modules/dimmer.js +27 -9
  18. data/assets/javascripts/semantic_ui/definitions/modules/dropdown.js +482 -207
  19. data/assets/javascripts/semantic_ui/definitions/modules/embed.js +50 -13
  20. data/assets/javascripts/semantic_ui/definitions/modules/modal.js +28 -13
  21. data/assets/javascripts/semantic_ui/definitions/modules/nag.js +28 -7
  22. data/assets/javascripts/semantic_ui/definitions/modules/popup.js +136 -76
  23. data/assets/javascripts/semantic_ui/definitions/modules/progress.js +177 -62
  24. data/assets/javascripts/semantic_ui/definitions/modules/rating.js +41 -8
  25. data/assets/javascripts/semantic_ui/definitions/modules/search.js +109 -56
  26. data/assets/javascripts/semantic_ui/definitions/modules/shape.js +52 -19
  27. data/assets/javascripts/semantic_ui/definitions/modules/sidebar.js +21 -7
  28. data/assets/javascripts/semantic_ui/definitions/modules/sticky.js +48 -19
  29. data/assets/javascripts/semantic_ui/definitions/modules/tab.js +57 -27
  30. data/assets/javascripts/semantic_ui/definitions/modules/transition.js +24 -8
  31. data/assets/stylesheets/semantic_ui/definitions/collections/breadcrumb.less +1 -2
  32. data/assets/stylesheets/semantic_ui/definitions/collections/form.less +42 -36
  33. data/assets/stylesheets/semantic_ui/definitions/collections/grid.less +12 -5
  34. data/assets/stylesheets/semantic_ui/definitions/collections/menu.less +50 -6
  35. data/assets/stylesheets/semantic_ui/definitions/collections/message.less +20 -1
  36. data/assets/stylesheets/semantic_ui/definitions/collections/table.less +16 -3
  37. data/assets/stylesheets/semantic_ui/definitions/elements/button.less +184 -40
  38. data/assets/stylesheets/semantic_ui/definitions/elements/container.less +1 -2
  39. data/assets/stylesheets/semantic_ui/definitions/elements/divider.less +1 -3
  40. data/assets/stylesheets/semantic_ui/definitions/elements/flag.less +1 -2
  41. data/assets/stylesheets/semantic_ui/definitions/elements/header.less +2 -2
  42. data/assets/stylesheets/semantic_ui/definitions/elements/icon.less +1 -2
  43. data/assets/stylesheets/semantic_ui/definitions/elements/image.less +6 -1
  44. data/assets/stylesheets/semantic_ui/definitions/elements/input.less +14 -14
  45. data/assets/stylesheets/semantic_ui/definitions/elements/label.less +3 -3
  46. data/assets/stylesheets/semantic_ui/definitions/elements/list.less +29 -16
  47. data/assets/stylesheets/semantic_ui/definitions/elements/loader.less +72 -9
  48. data/assets/stylesheets/semantic_ui/definitions/elements/rail.less +21 -2
  49. data/assets/stylesheets/semantic_ui/definitions/elements/reveal.less +2 -3
  50. data/assets/stylesheets/semantic_ui/definitions/elements/segment.less +44 -3
  51. data/assets/stylesheets/semantic_ui/definitions/elements/step.less +28 -8
  52. data/assets/stylesheets/semantic_ui/definitions/globals/reset.less +1 -2
  53. data/assets/stylesheets/semantic_ui/definitions/globals/site.less +0 -1
  54. data/assets/stylesheets/semantic_ui/definitions/modules/accordion.less +0 -1
  55. data/assets/stylesheets/semantic_ui/definitions/modules/checkbox.less +9 -10
  56. data/assets/stylesheets/semantic_ui/definitions/modules/dimmer.less +1 -2
  57. data/assets/stylesheets/semantic_ui/definitions/modules/dropdown.less +39 -21
  58. data/assets/stylesheets/semantic_ui/definitions/modules/embed.less +0 -1
  59. data/assets/stylesheets/semantic_ui/definitions/modules/modal.less +0 -1
  60. data/assets/stylesheets/semantic_ui/definitions/modules/nag.less +1 -2
  61. data/assets/stylesheets/semantic_ui/definitions/modules/popup.less +344 -2
  62. data/assets/stylesheets/semantic_ui/definitions/modules/progress.less +0 -1
  63. data/assets/stylesheets/semantic_ui/definitions/modules/rating.less +0 -1
  64. data/assets/stylesheets/semantic_ui/definitions/modules/search.less +1 -1
  65. data/assets/stylesheets/semantic_ui/definitions/modules/shape.less +1 -2
  66. data/assets/stylesheets/semantic_ui/definitions/modules/sidebar.less +1 -2
  67. data/assets/stylesheets/semantic_ui/definitions/modules/sticky.less +1 -2
  68. data/assets/stylesheets/semantic_ui/definitions/modules/tab.less +1 -2
  69. data/assets/stylesheets/semantic_ui/definitions/modules/transition.less +1 -2
  70. data/assets/stylesheets/semantic_ui/definitions/views/card.less +20 -2
  71. data/assets/stylesheets/semantic_ui/definitions/views/comment.less +1 -2
  72. data/assets/stylesheets/semantic_ui/definitions/views/feed.less +0 -1
  73. data/assets/stylesheets/semantic_ui/definitions/views/item.less +1 -2
  74. data/assets/stylesheets/semantic_ui/definitions/views/statistic.less +18 -19
  75. data/assets/stylesheets/semantic_ui/themes/basic/globals/reset.overrides +1 -1
  76. data/assets/stylesheets/semantic_ui/themes/default/collections/form.variables +4 -5
  77. data/assets/stylesheets/semantic_ui/themes/default/collections/menu.variables +13 -0
  78. data/assets/stylesheets/semantic_ui/themes/default/collections/message.variables +47 -1
  79. data/assets/stylesheets/semantic_ui/themes/default/collections/table.variables +7 -2
  80. data/assets/stylesheets/semantic_ui/themes/default/elements/button.variables +14 -0
  81. data/assets/stylesheets/semantic_ui/themes/default/elements/icon.overrides +263 -76
  82. data/assets/stylesheets/semantic_ui/themes/default/elements/icon.variables +3 -1
  83. data/assets/stylesheets/semantic_ui/themes/default/elements/input.variables +2 -4
  84. data/assets/stylesheets/semantic_ui/themes/default/elements/list.variables +2 -1
  85. data/assets/stylesheets/semantic_ui/themes/default/elements/loader.variables +17 -5
  86. data/assets/stylesheets/semantic_ui/themes/default/elements/rail.variables +2 -2
  87. data/assets/stylesheets/semantic_ui/themes/default/elements/step.variables +1 -1
  88. data/assets/stylesheets/semantic_ui/themes/default/globals/reset.overrides +1 -6
  89. data/assets/stylesheets/semantic_ui/themes/default/globals/site.variables +170 -46
  90. data/assets/stylesheets/semantic_ui/themes/default/modules/dropdown.variables +15 -12
  91. data/assets/stylesheets/semantic_ui/themes/default/modules/popup.variables +41 -3
  92. data/assets/stylesheets/semantic_ui/themes/default/modules/rating.overrides +2 -2
  93. data/assets/stylesheets/semantic_ui/themes/default/modules/sticky.variables +1 -1
  94. data/assets/stylesheets/semantic_ui/themes/default/views/card.variables +11 -0
  95. data/assets/stylesheets/semantic_ui/themes/material/collections/menu.variables +1 -1
  96. data/lib/less/rails/semantic_ui/version.rb +1 -1
  97. metadata +4 -3
@@ -1,9 +1,8 @@
1
1
  /*!
2
- * # Semantic UI - Video
2
+ * # Semantic UI - Embed
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2015 Contributors
7
6
  * Released under the MIT license
8
7
  * http://opensource.org/licenses/MIT
9
8
  *
@@ -13,6 +12,13 @@
13
12
 
14
13
  "use strict";
15
14
 
15
+ window = (typeof window != 'undefined' && window.Math == Math)
16
+ ? window
17
+ : (typeof self != 'undefined' && self.Math == Math)
18
+ ? self
19
+ : Function('return this')()
20
+ ;
21
+
16
22
  $.fn.embed = function(parameters) {
17
23
 
18
24
  var
@@ -140,6 +146,12 @@ $.fn.embed = function(parameters) {
140
146
  module.debug('Creating embed object', $embed);
141
147
  },
142
148
 
149
+ changeEmbed: function(url) {
150
+ $embed
151
+ .html( module.generate.embed(url) )
152
+ ;
153
+ },
154
+
143
155
  createAndShow: function() {
144
156
  module.createEmbed();
145
157
  module.show();
@@ -151,9 +163,19 @@ $.fn.embed = function(parameters) {
151
163
  $module
152
164
  .data(metadata.source, source)
153
165
  .data(metadata.id, id)
154
- .data(metadata.url, url)
155
166
  ;
156
- module.create();
167
+ if(url) {
168
+ $module.data(metadata.url, url);
169
+ }
170
+ else {
171
+ $module.removeData(metadata.url);
172
+ }
173
+ if(module.has.embed()) {
174
+ module.changeEmbed();
175
+ }
176
+ else {
177
+ module.create();
178
+ }
157
179
  },
158
180
 
159
181
  // clears embed
@@ -333,6 +355,9 @@ $.fn.embed = function(parameters) {
333
355
  },
334
356
 
335
357
  has: {
358
+ embed: function() {
359
+ return ($embed.length > 0);
360
+ },
336
361
  placeholder: function() {
337
362
  return settings.placeholder || $module.data(metadata.placeholder);
338
363
  }
@@ -359,7 +384,12 @@ $.fn.embed = function(parameters) {
359
384
  $.extend(true, settings, name);
360
385
  }
361
386
  else if(value !== undefined) {
362
- settings[name] = value;
387
+ if($.isPlainObject(settings[name])) {
388
+ $.extend(true, settings[name], value);
389
+ }
390
+ else {
391
+ settings[name] = value;
392
+ }
363
393
  }
364
394
  else {
365
395
  return settings[name];
@@ -377,7 +407,7 @@ $.fn.embed = function(parameters) {
377
407
  }
378
408
  },
379
409
  debug: function() {
380
- if(settings.debug) {
410
+ if(!settings.silent && settings.debug) {
381
411
  if(settings.performance) {
382
412
  module.performance.log(arguments);
383
413
  }
@@ -388,7 +418,7 @@ $.fn.embed = function(parameters) {
388
418
  }
389
419
  },
390
420
  verbose: function() {
391
- if(settings.verbose && settings.debug) {
421
+ if(!settings.silent && settings.verbose && settings.debug) {
392
422
  if(settings.performance) {
393
423
  module.performance.log(arguments);
394
424
  }
@@ -399,8 +429,10 @@ $.fn.embed = function(parameters) {
399
429
  }
400
430
  },
401
431
  error: function() {
402
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
403
- module.error.apply(console, arguments);
432
+ if(!settings.silent) {
433
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
434
+ module.error.apply(console, arguments);
435
+ }
404
436
  },
405
437
  performance: {
406
438
  log: function(message) {
@@ -537,6 +569,7 @@ $.fn.embed.settings = {
537
569
  name : 'Embed',
538
570
  namespace : 'embed',
539
571
 
572
+ silent : false,
540
573
  debug : false,
541
574
  verbose : false,
542
575
  performance : true,
@@ -598,7 +631,7 @@ $.fn.embed.settings = {
598
631
  return {
599
632
  autohide : !settings.brandedUI,
600
633
  autoplay : settings.autoplay,
601
- color : settings.colors || undefined,
634
+ color : settings.color || undefined,
602
635
  hq : settings.hd,
603
636
  jsapi : settings.api,
604
637
  modestbranding : !settings.brandedUI
@@ -616,7 +649,7 @@ $.fn.embed.settings = {
616
649
  api : settings.api,
617
650
  autoplay : settings.autoplay,
618
651
  byline : settings.brandedUI,
619
- color : settings.colors || undefined,
652
+ color : settings.color || undefined,
620
653
  portrait : settings.brandedUI,
621
654
  title : settings.brandedUI
622
655
  };
@@ -626,8 +659,12 @@ $.fn.embed.settings = {
626
659
 
627
660
  templates: {
628
661
  iframe : function(url, parameters) {
662
+ var src = url;
663
+ if (parameters) {
664
+ src += '?' + parameters;
665
+ }
629
666
  return ''
630
- + '<iframe src="' + url + '?' + parameters + '"'
667
+ + '<iframe src="' + src + '"'
631
668
  + ' width="100%" height="100%"'
632
669
  + ' frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'
633
670
  ;
@@ -647,7 +684,7 @@ $.fn.embed.settings = {
647
684
  },
648
685
 
649
686
  // NOT YET IMPLEMENTED
650
- api : true,
687
+ api : false,
651
688
  onPause : function() {},
652
689
  onPlay : function() {},
653
690
  onStop : function() {}
@@ -3,16 +3,22 @@
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2015 Contributors
7
6
  * Released under the MIT license
8
7
  * http://opensource.org/licenses/MIT
9
8
  *
10
9
  */
11
10
 
12
- ;(function ( $, window, document, undefined ) {
11
+ ;(function ($, window, document, undefined) {
13
12
 
14
13
  "use strict";
15
14
 
15
+ window = (typeof window != 'undefined' && window.Math == Math)
16
+ ? window
17
+ : (typeof self != 'undefined' && self.Math == Math)
18
+ ? self
19
+ : Function('return this')()
20
+ ;
21
+
16
22
  $.fn.modal = function(parameters) {
17
23
  var
18
24
  $allModules = $(this),
@@ -66,7 +72,7 @@ $.fn.modal = function(parameters) {
66
72
  element = this,
67
73
  instance = $module.data(moduleNamespace),
68
74
 
69
- elementNamespace,
75
+ elementEventNamespace,
70
76
  id,
71
77
  observer,
72
78
  module
@@ -134,7 +140,7 @@ $.fn.modal = function(parameters) {
134
140
  },
135
141
  id: function() {
136
142
  id = (Math.random().toString(16) + '000000000').substr(2,8);
137
- elementNamespace = '.' + id;
143
+ elementEventNamespace = '.' + id;
138
144
  module.verbose('Creating unique id for element', id);
139
145
  }
140
146
  },
@@ -145,7 +151,8 @@ $.fn.modal = function(parameters) {
145
151
  .removeData(moduleNamespace)
146
152
  .off(eventNamespace)
147
153
  ;
148
- $window.off(elementNamespace);
154
+ $window.off(elementEventNamespace);
155
+ $dimmer.off(elementEventNamespace);
149
156
  $close.off(eventNamespace);
150
157
  $context.dimmer('destroy');
151
158
  },
@@ -206,7 +213,7 @@ $.fn.modal = function(parameters) {
206
213
  .on('click' + eventNamespace, selector.deny, module.event.deny)
207
214
  ;
208
215
  $window
209
- .on('resize' + elementNamespace, module.event.resize)
216
+ .on('resize' + elementEventNamespace, module.event.resize)
210
217
  ;
211
218
  }
212
219
  },
@@ -496,7 +503,7 @@ $.fn.modal = function(parameters) {
496
503
  clickaway: function() {
497
504
  if(settings.closable) {
498
505
  $dimmer
499
- .off('click' + elementNamespace)
506
+ .off('click' + elementEventNamespace)
500
507
  ;
501
508
  }
502
509
  },
@@ -581,7 +588,7 @@ $.fn.modal = function(parameters) {
581
588
  clickaway: function() {
582
589
  if(settings.closable) {
583
590
  $dimmer
584
- .on('click' + elementNamespace, module.event.click)
591
+ .on('click' + elementEventNamespace, module.event.click)
585
592
  ;
586
593
  }
587
594
  },
@@ -645,7 +652,12 @@ $.fn.modal = function(parameters) {
645
652
  $.extend(true, settings, name);
646
653
  }
647
654
  else if(value !== undefined) {
648
- settings[name] = value;
655
+ if($.isPlainObject(settings[name])) {
656
+ $.extend(true, settings[name], value);
657
+ }
658
+ else {
659
+ settings[name] = value;
660
+ }
649
661
  }
650
662
  else {
651
663
  return settings[name];
@@ -663,7 +675,7 @@ $.fn.modal = function(parameters) {
663
675
  }
664
676
  },
665
677
  debug: function() {
666
- if(settings.debug) {
678
+ if(!settings.silent && settings.debug) {
667
679
  if(settings.performance) {
668
680
  module.performance.log(arguments);
669
681
  }
@@ -674,7 +686,7 @@ $.fn.modal = function(parameters) {
674
686
  }
675
687
  },
676
688
  verbose: function() {
677
- if(settings.verbose && settings.debug) {
689
+ if(!settings.silent && settings.verbose && settings.debug) {
678
690
  if(settings.performance) {
679
691
  module.performance.log(arguments);
680
692
  }
@@ -685,8 +697,10 @@ $.fn.modal = function(parameters) {
685
697
  }
686
698
  },
687
699
  error: function() {
688
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
689
- module.error.apply(console, arguments);
700
+ if(!settings.silent) {
701
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
702
+ module.error.apply(console, arguments);
703
+ }
690
704
  },
691
705
  performance: {
692
706
  log: function(message) {
@@ -820,6 +834,7 @@ $.fn.modal.settings = {
820
834
  name : 'Modal',
821
835
  namespace : 'modal',
822
836
 
837
+ silent : false,
823
838
  debug : false,
824
839
  verbose : false,
825
840
  performance : true,
@@ -3,7 +3,6 @@
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2015 Contributors
7
6
  * Released under the MIT license
8
7
  * http://opensource.org/licenses/MIT
9
8
  *
@@ -13,6 +12,13 @@
13
12
 
14
13
  "use strict";
15
14
 
15
+ window = (typeof window != 'undefined' && window.Math == Math)
16
+ ? window
17
+ : (typeof self != 'undefined' && self.Math == Math)
18
+ ? self
19
+ : Function('return this')()
20
+ ;
21
+
16
22
  $.fn.nag = function(parameters) {
17
23
  var
18
24
  $allModules = $(this),
@@ -255,7 +261,12 @@ $.fn.nag = function(parameters) {
255
261
  $.extend(true, settings, name);
256
262
  }
257
263
  else if(value !== undefined) {
258
- settings[name] = value;
264
+ if($.isPlainObject(settings[name])) {
265
+ $.extend(true, settings[name], value);
266
+ }
267
+ else {
268
+ settings[name] = value;
269
+ }
259
270
  }
260
271
  else {
261
272
  return settings[name];
@@ -273,7 +284,7 @@ $.fn.nag = function(parameters) {
273
284
  }
274
285
  },
275
286
  debug: function() {
276
- if(settings.debug) {
287
+ if(!settings.silent && settings.debug) {
277
288
  if(settings.performance) {
278
289
  module.performance.log(arguments);
279
290
  }
@@ -284,7 +295,7 @@ $.fn.nag = function(parameters) {
284
295
  }
285
296
  },
286
297
  verbose: function() {
287
- if(settings.verbose && settings.debug) {
298
+ if(!settings.silent && settings.verbose && settings.debug) {
288
299
  if(settings.performance) {
289
300
  module.performance.log(arguments);
290
301
  }
@@ -295,8 +306,10 @@ $.fn.nag = function(parameters) {
295
306
  }
296
307
  },
297
308
  error: function() {
298
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
299
- module.error.apply(console, arguments);
309
+ if(!settings.silent) {
310
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
311
+ module.error.apply(console, arguments);
312
+ }
300
313
  },
301
314
  performance: {
302
315
  log: function(message) {
@@ -430,13 +443,14 @@ $.fn.nag.settings = {
430
443
 
431
444
  name : 'Nag',
432
445
 
446
+ silent : false,
433
447
  debug : false,
434
448
  verbose : false,
435
449
  performance : true,
436
450
 
437
451
  namespace : 'Nag',
438
452
 
439
- // allows cookie to be overriden
453
+ // allows cookie to be overridden
440
454
  persist : false,
441
455
 
442
456
  // set to zero to require manually dismissal, otherwise hides on its own
@@ -483,4 +497,11 @@ $.fn.nag.settings = {
483
497
 
484
498
  };
485
499
 
500
+ // Adds easing
501
+ $.extend( $.easing, {
502
+ easeOutQuad: function (x, t, b, c, d) {
503
+ return -c *(t/=d)*(t-2) + b;
504
+ }
505
+ });
506
+
486
507
  })( jQuery, window, document );
@@ -3,7 +3,6 @@
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2015 Contributors
7
6
  * Released under the MIT license
8
7
  * http://opensource.org/licenses/MIT
9
8
  *
@@ -13,6 +12,13 @@
13
12
 
14
13
  "use strict";
15
14
 
15
+ window = (typeof window != 'undefined' && window.Math == Math)
16
+ ? window
17
+ : (typeof self != 'undefined' && self.Math == Math)
18
+ ? self
19
+ : Function('return this')()
20
+ ;
21
+
16
22
  $.fn.popup = function(parameters) {
17
23
  var
18
24
  $allModules = $(this),
@@ -50,6 +56,8 @@ $.fn.popup = function(parameters) {
50
56
 
51
57
  $module = $(this),
52
58
  $context = $(settings.context),
59
+ $scrollContext = $(settings.scrollContext),
60
+ $boundary = $(settings.boundary),
53
61
  $target = (settings.target)
54
62
  ? $(settings.target)
55
63
  : $module,
@@ -64,6 +72,7 @@ $.fn.popup = function(parameters) {
64
72
  element = this,
65
73
  instance = $module.data(moduleNamespace),
66
74
 
75
+ documentObserver,
67
76
  elementNamespace,
68
77
  id,
69
78
  module
@@ -76,9 +85,10 @@ $.fn.popup = function(parameters) {
76
85
  module.debug('Initializing', $module);
77
86
  module.createID();
78
87
  module.bind.events();
79
- if( !module.exists() && settings.preserve) {
88
+ if(!module.exists() && settings.preserve) {
80
89
  module.create();
81
90
  }
91
+ module.observeChanges();
82
92
  module.instantiate();
83
93
  },
84
94
 
@@ -90,6 +100,17 @@ $.fn.popup = function(parameters) {
90
100
  ;
91
101
  },
92
102
 
103
+ observeChanges: function() {
104
+ if('MutationObserver' in window) {
105
+ documentObserver = new MutationObserver(module.event.documentChanged);
106
+ documentObserver.observe(document, {
107
+ childList : true,
108
+ subtree : true
109
+ });
110
+ module.debug('Setting up mutation observer', documentObserver);
111
+ }
112
+ },
113
+
93
114
  refresh: function() {
94
115
  if(settings.popup) {
95
116
  $popup = $(settings.popup).eq(0);
@@ -136,6 +157,9 @@ $.fn.popup = function(parameters) {
136
157
 
137
158
  destroy: function() {
138
159
  module.debug('Destroying previous module');
160
+ if(documentObserver) {
161
+ documentObserver.disconnect();
162
+ }
139
163
  // remove element only if was created dynamically
140
164
  if($popup && !settings.preserve) {
141
165
  module.removePopup();
@@ -144,9 +168,9 @@ $.fn.popup = function(parameters) {
144
168
  clearTimeout(module.hideTimer);
145
169
  clearTimeout(module.showTimer);
146
170
  // remove events
147
- $window.off(elementNamespace);
171
+ module.unbind.close();
172
+ module.unbind.events();
148
173
  $module
149
- .off(eventNamespace)
150
174
  .removeData(moduleNamespace)
151
175
  ;
152
176
  },
@@ -181,9 +205,26 @@ $.fn.popup = function(parameters) {
181
205
  module.set.position();
182
206
  }
183
207
  },
208
+ documentChanged: function(mutations) {
209
+ [].forEach.call(mutations, function(mutation) {
210
+ if(mutation.removedNodes) {
211
+ [].forEach.call(mutation.removedNodes, function(node) {
212
+ if(node == element || $(node).find(element).length > 0) {
213
+ module.debug('Element removed from DOM, tearing down events');
214
+ module.destroy();
215
+ }
216
+ });
217
+ }
218
+ });
219
+ },
184
220
  hideGracefully: function(event) {
221
+ var
222
+ $target = $(event.target),
223
+ isInDOM = $.contains(document.documentElement, event.target),
224
+ inPopup = ($target.closest(selector.popup).length > 0)
225
+ ;
185
226
  // don't close on clicks inside popup
186
- if(event && $(event.target).closest(selector.popup).length === 0) {
227
+ if(event && !inPopup && isInDOM) {
187
228
  module.debug('Click occurred outside popup hiding popup');
188
229
  module.hide();
189
230
  }
@@ -237,7 +278,7 @@ $.fn.popup = function(parameters) {
237
278
  else if($target.next(selector.popup).length !== 0) {
238
279
  module.verbose('Pre-existing popup found');
239
280
  settings.inline = true;
240
- settings.popups = $target.next(selector.popup).data(metadata.activator, $module);
281
+ settings.popup = $target.next(selector.popup).data(metadata.activator, $module);
241
282
  module.refresh();
242
283
  if(settings.hoverable) {
243
284
  module.bind.popup();
@@ -257,7 +298,7 @@ $.fn.popup = function(parameters) {
257
298
  },
258
299
 
259
300
  createID: function() {
260
- id = (Math.random().toString(16) + '000000000').substr(2,8);
301
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
261
302
  elementNamespace = '.' + id;
262
303
  module.verbose('Creating unique id for element', id);
263
304
  },
@@ -321,7 +362,7 @@ $.fn.popup = function(parameters) {
321
362
  .each(function() {
322
363
  $(this)
323
364
  .data(metadata.activator)
324
- .popup('hide')
365
+ .popup('hide')
325
366
  ;
326
367
  })
327
368
  ;
@@ -370,6 +411,11 @@ $.fn.popup = function(parameters) {
370
411
  return true;
371
412
  }
372
413
  },
414
+ supports: {
415
+ svg: function() {
416
+ return (typeof SVGGraphicsElement === undefined);
417
+ }
418
+ },
373
419
  animate: {
374
420
  show: function(callback) {
375
421
  callback = $.isFunction(callback) ? callback : function(){};
@@ -454,11 +500,18 @@ $.fn.popup = function(parameters) {
454
500
  },
455
501
  calculations: function() {
456
502
  var
457
- targetElement = $target[0],
458
- targetPosition = (settings.inline || (settings.popup && settings.movePopup))
503
+ targetElement = $target[0],
504
+ isWindow = ($boundary[0] == window),
505
+ targetPosition = (settings.inline || (settings.popup && settings.movePopup))
459
506
  ? $target.position()
460
507
  : $target.offset(),
461
- calculations = {},
508
+ screenPosition = (isWindow)
509
+ ? { top: 0, left: 0 }
510
+ : $boundary.offset(),
511
+ calculations = {},
512
+ scroll = (isWindow)
513
+ ? { top: $window.scrollTop(), left: $window.scrollLeft() }
514
+ : { top: 0, left: 0},
462
515
  screen
463
516
  ;
464
517
  calculations = {
@@ -483,12 +536,14 @@ $.fn.popup = function(parameters) {
483
536
  },
484
537
  // screen boundaries
485
538
  screen : {
539
+ top : screenPosition.top,
540
+ left : screenPosition.left,
486
541
  scroll: {
487
- top : $window.scrollTop(),
488
- left : $window.scrollLeft()
542
+ top : scroll.top,
543
+ left : scroll.left
489
544
  },
490
- width : $window.width(),
491
- height : $window.height()
545
+ width : $boundary.width(),
546
+ height : $boundary.height()
492
547
  }
493
548
  };
494
549
 
@@ -508,16 +563,16 @@ $.fn.popup = function(parameters) {
508
563
  calculations.target.margin.left = (settings.inline)
509
564
  ? module.is.rtl()
510
565
  ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10)
511
- : parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-left') , 10)
566
+ : parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10)
512
567
  : 0
513
568
  ;
514
569
  // calculate screen boundaries
515
570
  screen = calculations.screen;
516
571
  calculations.boundary = {
517
- top : screen.scroll.top,
518
- bottom : screen.scroll.top + screen.height,
519
- left : screen.scroll.left,
520
- right : screen.scroll.left + screen.width
572
+ top : screen.top + screen.scroll.top,
573
+ bottom : screen.top + screen.scroll.top + screen.height,
574
+ left : screen.left + screen.scroll.left,
575
+ right : screen.left + screen.scroll.left + screen.width
521
576
  };
522
577
  return calculations;
523
578
  },
@@ -551,7 +606,6 @@ $.fn.popup = function(parameters) {
551
606
  popup,
552
607
  boundary
553
608
  ;
554
- offset = offset || module.get.offset();
555
609
  calculations = calculations || module.get.calculations();
556
610
 
557
611
  // shorthand
@@ -697,7 +751,7 @@ $.fn.popup = function(parameters) {
697
751
  popup = calculations.popup;
698
752
  parent = calculations.parent;
699
753
 
700
- if(target.width === 0 && target.height === 0 && !(target.element instanceof SVGGraphicsElement)) {
754
+ if(target.width === 0 && target.height === 0 && !module.is.svg(target.element)) {
701
755
  module.debug('Popup target is hidden, no action taken');
702
756
  return false;
703
757
  }
@@ -929,11 +983,8 @@ $.fn.popup = function(parameters) {
929
983
  }
930
984
  },
931
985
  close: function() {
932
- if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {
933
- $document
934
- .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)
935
- ;
936
- $context
986
+ if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {
987
+ $scrollContext
937
988
  .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)
938
989
  ;
939
990
  }
@@ -959,28 +1010,22 @@ $.fn.popup = function(parameters) {
959
1010
  },
960
1011
 
961
1012
  unbind: {
1013
+ events: function() {
1014
+ $window
1015
+ .off(elementNamespace)
1016
+ ;
1017
+ $module
1018
+ .off(eventNamespace)
1019
+ ;
1020
+ },
962
1021
  close: function() {
963
- if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {
964
- $document
965
- .off('scroll' + elementNamespace, module.hide)
966
- ;
967
- $context
968
- .off('scroll' + elementNamespace, module.hide)
969
- ;
970
- }
971
- if(settings.on == 'hover' && openedWithTouch) {
972
- $document
973
- .off('touchstart' + elementNamespace)
974
- ;
975
- openedWithTouch = false;
976
- }
977
- if(settings.on == 'click' && settings.closable) {
978
- module.verbose('Removing close event from document');
979
- $document
980
- .off('click' + elementNamespace)
981
- ;
982
- }
983
- }
1022
+ $document
1023
+ .off(elementNamespace)
1024
+ ;
1025
+ $scrollContext
1026
+ .off(elementNamespace)
1027
+ ;
1028
+ },
984
1029
  },
985
1030
 
986
1031
  has: {
@@ -1008,6 +1053,9 @@ $.fn.popup = function(parameters) {
1008
1053
  return false;
1009
1054
  }
1010
1055
  },
1056
+ svg: function(element) {
1057
+ return module.supports.svg() && (element instanceof SVGGraphicsElement);
1058
+ },
1011
1059
  active: function() {
1012
1060
  return $module.hasClass(className.active);
1013
1061
  },
@@ -1068,7 +1116,7 @@ $.fn.popup = function(parameters) {
1068
1116
  }
1069
1117
  },
1070
1118
  debug: function() {
1071
- if(settings.debug) {
1119
+ if(!settings.silent && settings.debug) {
1072
1120
  if(settings.performance) {
1073
1121
  module.performance.log(arguments);
1074
1122
  }
@@ -1079,7 +1127,7 @@ $.fn.popup = function(parameters) {
1079
1127
  }
1080
1128
  },
1081
1129
  verbose: function() {
1082
- if(settings.verbose && settings.debug) {
1130
+ if(!settings.silent && settings.verbose && settings.debug) {
1083
1131
  if(settings.performance) {
1084
1132
  module.performance.log(arguments);
1085
1133
  }
@@ -1090,8 +1138,10 @@ $.fn.popup = function(parameters) {
1090
1138
  }
1091
1139
  },
1092
1140
  error: function() {
1093
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1094
- module.error.apply(console, arguments);
1141
+ if(!settings.silent) {
1142
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1143
+ module.error.apply(console, arguments);
1144
+ }
1095
1145
  },
1096
1146
  performance: {
1097
1147
  log: function(message) {
@@ -1222,46 +1272,53 @@ $.fn.popup = function(parameters) {
1222
1272
 
1223
1273
  $.fn.popup.settings = {
1224
1274
 
1225
- name : 'Popup',
1275
+ name : 'Popup',
1226
1276
 
1227
1277
  // module settings
1228
- debug : false,
1229
- verbose : false,
1230
- performance : true,
1231
- namespace : 'popup',
1278
+ silent : false,
1279
+ debug : false,
1280
+ verbose : false,
1281
+ performance : true,
1282
+ namespace : 'popup',
1283
+
1284
+ // whether it should use dom mutation observers
1285
+ observeChanges : true,
1232
1286
 
1233
1287
  // callback only when element added to dom
1234
- onCreate : function(){},
1288
+ onCreate : function(){},
1235
1289
 
1236
1290
  // callback before element removed from dom
1237
- onRemove : function(){},
1291
+ onRemove : function(){},
1238
1292
 
1239
1293
  // callback before show animation
1240
- onShow : function(){},
1294
+ onShow : function(){},
1241
1295
 
1242
1296
  // callback after show animation
1243
- onVisible : function(){},
1297
+ onVisible : function(){},
1244
1298
 
1245
1299
  // callback before hide animation
1246
- onHide : function(){},
1300
+ onHide : function(){},
1247
1301
 
1248
1302
  // callback when popup cannot be positioned in visible screen
1249
- onUnplaceable: function(){},
1303
+ onUnplaceable : function(){},
1250
1304
 
1251
1305
  // callback after hide animation
1252
- onHidden : function(){},
1306
+ onHidden : function(){},
1253
1307
 
1254
1308
  // when to show popup
1255
- on : 'hover',
1309
+ on : 'hover',
1310
+
1311
+ // element to use to determine if popup is out of boundary
1312
+ boundary : window,
1256
1313
 
1257
1314
  // whether to add touchstart events when using hover
1258
1315
  addTouchEvents : true,
1259
1316
 
1260
1317
  // default position relative to element
1261
- position : 'top left',
1318
+ position : 'top left',
1262
1319
 
1263
1320
  // name of variation to use
1264
- variation : '',
1321
+ variation : '',
1265
1322
 
1266
1323
  // whether popup should be moved to context
1267
1324
  movePopup : true,
@@ -1282,31 +1339,34 @@ $.fn.popup.settings = {
1282
1339
  hoverable : false,
1283
1340
 
1284
1341
  // explicitly set content
1285
- content : false,
1342
+ content : false,
1286
1343
 
1287
1344
  // explicitly set html
1288
- html : false,
1345
+ html : false,
1289
1346
 
1290
1347
  // explicitly set title
1291
- title : false,
1348
+ title : false,
1292
1349
 
1293
1350
  // whether automatically close on clickaway when on click
1294
- closable : true,
1351
+ closable : true,
1295
1352
 
1296
1353
  // automatically hide on scroll
1297
- hideOnScroll : 'auto',
1354
+ hideOnScroll : 'auto',
1298
1355
 
1299
1356
  // hide other popups on show
1300
- exclusive : false,
1357
+ exclusive : false,
1301
1358
 
1302
1359
  // context to attach popups
1303
- context : 'body',
1360
+ context : 'body',
1361
+
1362
+ // context for binding scroll events
1363
+ scrollContext : window,
1304
1364
 
1305
1365
  // position to prefer when calculating new position
1306
- prefer : 'opposite',
1366
+ prefer : 'opposite',
1307
1367
 
1308
1368
  // specify position to appear even if it doesn't fit
1309
- lastResort : false,
1369
+ lastResort : false,
1310
1370
 
1311
1371
  // delay used to prevent accidental refiring of animations due to user error
1312
1372
  delay : {