semantic-ui-sass 2.3.1.2 → 2.4.4.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +4 -2
  4. data/CHANGELOG.md +124 -100
  5. data/README.md +87 -16
  6. data/app/assets/javascripts/semantic-ui/dimmer.js +27 -4
  7. data/app/assets/javascripts/semantic-ui/dropdown.js +41 -9
  8. data/app/assets/javascripts/semantic-ui/embed.js +11 -1
  9. data/app/assets/javascripts/semantic-ui/modal.js +85 -10
  10. data/app/assets/javascripts/semantic-ui/popup.js +14 -5
  11. data/app/assets/javascripts/semantic-ui/search.js +1 -1
  12. data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +1 -1
  13. data/app/assets/stylesheets/semantic-ui/collections/_form.scss +5 -5
  14. data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +28 -28
  15. data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +11 -11
  16. data/app/assets/stylesheets/semantic-ui/collections/_message.scss +1 -1
  17. data/app/assets/stylesheets/semantic-ui/collections/_table.scss +5 -5
  18. data/app/assets/stylesheets/semantic-ui/elements/_all.scss +2 -0
  19. data/app/assets/stylesheets/semantic-ui/elements/_button.scss +153 -3
  20. data/app/assets/stylesheets/semantic-ui/elements/_container.scss +30 -31
  21. data/app/assets/stylesheets/semantic-ui/elements/_container_variables.scss +48 -0
  22. data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +3 -3
  23. data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +2 -1
  24. data/app/assets/stylesheets/semantic-ui/elements/_header.scss +1 -1
  25. data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +36 -17
  26. data/app/assets/stylesheets/semantic-ui/elements/_image.scss +1 -1
  27. data/app/assets/stylesheets/semantic-ui/elements/_input.scss +1 -1
  28. data/app/assets/stylesheets/semantic-ui/elements/_label.scss +22 -22
  29. data/app/assets/stylesheets/semantic-ui/elements/_list.scss +3 -1
  30. data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +1 -1
  31. data/app/assets/stylesheets/semantic-ui/elements/_placeholder.scss +239 -0
  32. data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +1 -1
  33. data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +1 -1
  34. data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +65 -3
  35. data/app/assets/stylesheets/semantic-ui/elements/_step.scss +6 -6
  36. data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +1 -1
  37. data/app/assets/stylesheets/semantic-ui/globals/_site.scss +39 -37
  38. data/app/assets/stylesheets/semantic-ui/globals/_variables.scss +46 -2
  39. data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +1 -1
  40. data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +1 -1
  41. data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +27 -13
  42. data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +38 -29
  43. data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +1 -1
  44. data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +60 -35
  45. data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +1 -1
  46. data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +2 -2
  47. data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +1 -1
  48. data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +1 -1
  49. data/app/assets/stylesheets/semantic-ui/modules/_search.scss +4 -2
  50. data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +1 -1
  51. data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +1 -1
  52. data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +1 -1
  53. data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +1 -1
  54. data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +1 -1
  55. data/app/assets/stylesheets/semantic-ui/views/_ad.scss +2 -2
  56. data/app/assets/stylesheets/semantic-ui/views/_card.scss +4 -4
  57. data/app/assets/stylesheets/semantic-ui/views/_comment.scss +1 -1
  58. data/app/assets/stylesheets/semantic-ui/views/_feed.scss +1 -1
  59. data/app/assets/stylesheets/semantic-ui/views/_item.scss +4 -4
  60. data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +23 -26
  61. data/lib/semantic-ui-sass.rb +2 -2
  62. data/lib/semantic/ui/sass/version.rb +2 -2
  63. data/package.json +29 -0
  64. data/script.js +56 -0
  65. data/semantic-ui-sass.gemspec +2 -2
  66. data/spec/dummy/app/assets/config/manifest.js +3 -0
  67. data/tasks/converter.rb +29 -2
  68. data/yarn.lock +4 -0
  69. metadata +19 -13
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Semantic UI for Sass
2
2
 
3
- `semantic-ui-sass` is an Sass-powered version of [Semantic UI](https://github.com/Semantic-Org/Semantic-UI) and ready to drop into Rails, Compass, or Sprockets.
3
+ `semantic-ui-sass` is an Sass-powered version of
4
+ [Semantic UI](https://github.com/Semantic-Org/Semantic-UI) and ready to drop
5
+ into Rails, Compass, or Sprockets.
4
6
 
5
7
  [![Build Status](https://travis-ci.org/doabit/semantic-ui-sass.svg?branch=master)](https://travis-ci.org/doabit/semantic-ui-sass)
6
8
 
@@ -14,22 +16,24 @@ The gem only has default theme.
14
16
  gem 'semantic-ui-sass'
15
17
  ```
16
18
 
17
- `bundle install` and restart your server to make the files available through the pipeline.
19
+ `bundle install` and restart your server to make the files available through the
20
+ pipeline.
18
21
 
19
22
  # semantic-ui-sass with Rails or Sprockets
20
23
 
21
24
  ## CSS
22
25
 
23
- Import Semantic in an SCSS file (for example, `application.css.scss`) to get all of Semantic's styles
26
+ Import Semantic in an SCSS file (for example, `application.css.scss`) to get all
27
+ of Semantic's styles
24
28
 
25
29
  ```css
26
- @import "semantic-ui";
30
+ @import 'semantic-ui';
27
31
  ```
28
32
 
29
33
  You can also include modules
30
34
 
31
35
  ```css
32
- @import "semantic-ui/collections/menu";
36
+ @import 'semantic-ui/collections/menu';
33
37
  ```
34
38
 
35
39
  ## Custom font
@@ -40,41 +44,103 @@ $font-url: 'http://fonts.useso.com/css?family=Lato:400,700,400italic,700italic&s
40
44
  ```
41
45
 
42
46
  ## Skip font loading
47
+
43
48
  ```css
44
49
  $import-google-fonts: false;
45
50
  @import 'semantic-ui';
46
51
  ```
47
52
 
48
53
  ## Custom font family
54
+
49
55
  ```css
50
56
  $font-family: 'custom-font-family';
51
57
  @import 'semantic-ui';
52
58
  ```
53
59
 
60
+ ### Skip use of custom scrollbars
61
+
62
+ ```css
63
+ $use-custom-scrollbars: false;
64
+ @import 'semantic-ui';
65
+ ```
66
+
54
67
  ## All variables, you can custom any of that
68
+
69
+ Fonts:
70
+
55
71
  ```css
56
- $import-google-fonts: true !default;
57
- $font-url: 'https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin,latin-ext' !default;
58
72
  $font-name: 'Lato' !default;
59
73
  $font-family: $font-name, 'Helvetica Neue', Arial, Helvetica, sans-serif !default;
74
+ $font-url: 'https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin,latin-ext' !default;
75
+ $import-google-fonts: true !default;
76
+ ```
77
+
78
+ Scrollbars:
79
+
80
+ ```css
81
+ $use-custom-scrollbars: true !default;
82
+ ```
83
+
84
+ Breakpoints:
85
+
86
+ ```css
87
+ $mobile-breakpoint: 320px !default;
88
+ $tablet-breakpoint: 768px !default;
89
+ $computer-breakpoint: 992px !default;
90
+ $large-monitor-breakpoint: 1200px !default;
91
+ $widescreen-monitor-breakpoint: 1920px !default;
60
92
  ```
61
93
 
62
94
  ## Javascripts
63
95
 
64
- We have a helper that includes all Semantic javascripts. Put this in your Javascript manifest (usually in `application.js`) to
96
+ ### Ruby on Rails Version 5
97
+
98
+ We have a helper that includes all Semantic javascripts. Put this in your
99
+ Javascript manifest (usually in `application.js`) to
65
100
 
66
101
  ```js
67
102
  // Loads all Semantic javascripts
68
103
  //= require semantic-ui
69
104
  ```
70
105
 
71
- You can also load individual modules, provided you also require any dependencies.
106
+ You can also load individual modules, provided you also require any
107
+ dependencies.
72
108
 
73
109
  ```js
74
110
  //= require semantic-ui/modal
75
111
  //= require semantic-ui/dropdown
76
112
  ```
77
113
 
114
+ ### Ruby on Rails Version 6+
115
+
116
+ Add packages with yarn:
117
+
118
+ ```console
119
+ yarn add jquery popper.js @doabit/semantic-ui-sass
120
+ ```
121
+
122
+ In config/webpack/environment.js add the following:
123
+
124
+ ```js
125
+ const webpack = require('webpack')
126
+
127
+ environment.plugins.append(
128
+ 'Provide',
129
+ new webpack.ProvidePlugin({
130
+ $: 'jquery',
131
+ jQuery: 'jquery',
132
+ Popper: ['popper.js', 'default']
133
+ })
134
+ )
135
+ ```
136
+
137
+ In app/javascript/packs/application.js add the following:
138
+
139
+ ```js
140
+ import '@doabit/semantic-ui-sass'
141
+ import '@doabit/semantic-ui-sass/src/scss/semantic-ui.scss'
142
+ ```
143
+
78
144
  # semantic-ui-sass with Compass
79
145
 
80
146
  ## New project
@@ -88,13 +154,16 @@ compass create compass-project -r semantic-ui-sass --using semantic-ui
88
154
 
89
155
  This will sort a few things out:
90
156
 
91
- * You'll get a starting `styles.scss`
92
- * You'll get a compiled stylesheet compiled & ready to drop into your application
93
- * We'll also copy the Semantic javascripts & images & fonts into their respective folders for you
157
+ - You'll get a starting `styles.scss`
158
+ - You'll get a compiled stylesheet compiled & ready to drop into your
159
+ application
160
+ - We'll also copy the Semantic javascripts & images & fonts into their
161
+ respective folders for you
94
162
 
95
163
  ## Existing project
96
164
 
97
- Install the gem, add the require statement to the top of your configuration file, and install the extension.
165
+ Install the gem, add the require statement to the top of your configuration
166
+ file, and install the extension.
98
167
 
99
168
  ```console
100
169
  gem install semantic-ui-sass
@@ -111,7 +180,9 @@ compass install semantic-ui
111
180
 
112
181
  ### NOTE
113
182
 
114
- When using compass, you should visit file in local server, eg `http://localhost:3000/index.html`, rather than `file:///Users/doabit/demo/index.html`
183
+ When using compass, you should visit file in local server, eg
184
+ `http://localhost:3000/index.html`, rather than
185
+ `file:///Users/doabit/demo/index.html`
115
186
 
116
187
  # Rails Helpers
117
188
 
@@ -163,8 +234,8 @@ semantic_icon('add', id: 'id')
163
234
 
164
235
  ## TODO
165
236
 
166
- * Add global variables
167
- * Add rails helpers like `render_flash`?
237
+ - Add global variables
238
+ - Add rails helpers like `render_flash`?
168
239
 
169
240
  ## Contributing
170
241
 
@@ -83,7 +83,6 @@ $.fn.dimmer = function(parameters) {
83
83
  else {
84
84
  $dimmer = module.create();
85
85
  }
86
- module.set.variation();
87
86
  }
88
87
  },
89
88
 
@@ -157,7 +156,7 @@ $.fn.dimmer = function(parameters) {
157
156
  module.hide();
158
157
  event.stopImmediatePropagation();
159
158
  }
160
- }
159
+ },
161
160
  },
162
161
 
163
162
  addContent: function(element) {
@@ -190,6 +189,7 @@ $.fn.dimmer = function(parameters) {
190
189
  : function(){}
191
190
  ;
192
191
  module.debug('Showing dimmer', $dimmer, settings);
192
+ module.set.variation();
193
193
  if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {
194
194
  module.animate.show(callback);
195
195
  settings.onShow.call(element);
@@ -233,12 +233,22 @@ $.fn.dimmer = function(parameters) {
233
233
  : function(){}
234
234
  ;
235
235
  if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
236
+ if(settings.useFlex) {
237
+ module.debug('Using flex dimmer');
238
+ module.remove.legacy();
239
+ }
240
+ else {
241
+ module.debug('Using legacy non-flex dimmer');
242
+ module.set.legacy();
243
+ }
236
244
  if(settings.opacity !== 'auto') {
237
245
  module.set.opacity();
238
246
  }
239
247
  $dimmer
240
248
  .transition({
241
- displayType : 'flex',
249
+ displayType : settings.useFlex
250
+ ? 'flex'
251
+ : 'block',
242
252
  animation : settings.transition + ' in',
243
253
  queue : false,
244
254
  duration : module.get.duration(),
@@ -283,7 +293,9 @@ $.fn.dimmer = function(parameters) {
283
293
  module.verbose('Hiding dimmer with css');
284
294
  $dimmer
285
295
  .transition({
286
- displayType : 'flex',
296
+ displayType : settings.useFlex
297
+ ? 'flex'
298
+ : 'block',
287
299
  animation : settings.transition + ' out',
288
300
  queue : false,
289
301
  duration : module.get.duration(),
@@ -292,6 +304,7 @@ $.fn.dimmer = function(parameters) {
292
304
  module.remove.dimmed();
293
305
  },
294
306
  onComplete : function() {
307
+ module.remove.variation();
295
308
  module.remove.active();
296
309
  callback();
297
310
  }
@@ -405,6 +418,9 @@ $.fn.dimmer = function(parameters) {
405
418
  module.debug('Setting opacity to', opacity);
406
419
  $dimmer.css('background-color', color);
407
420
  },
421
+ legacy: function() {
422
+ $dimmer.addClass(className.legacy);
423
+ },
408
424
  active: function() {
409
425
  $dimmer.addClass(className.active);
410
426
  },
@@ -434,6 +450,9 @@ $.fn.dimmer = function(parameters) {
434
450
  .removeClass(className.active)
435
451
  ;
436
452
  },
453
+ legacy: function() {
454
+ $dimmer.removeClass(className.legacy);
455
+ },
437
456
  dimmed: function() {
438
457
  $dimmable.removeClass(className.dimmed);
439
458
  },
@@ -647,6 +666,9 @@ $.fn.dimmer.settings = {
647
666
  verbose : false,
648
667
  performance : true,
649
668
 
669
+ // whether should use flex layout
670
+ useFlex : true,
671
+
650
672
  // name to distinguish between multiple dimmers in context
651
673
  dimmerName : false,
652
674
 
@@ -690,6 +712,7 @@ $.fn.dimmer.settings = {
690
712
  dimmer : 'dimmer',
691
713
  disabled : 'disabled',
692
714
  hide : 'hide',
715
+ legacy : 'legacy',
693
716
  pageDimmer : 'page',
694
717
  show : 'show'
695
718
  },
@@ -605,7 +605,6 @@ $.fn.dropdown = function(parameters) {
605
605
  else {
606
606
  if(settings.on == 'click') {
607
607
  $module
608
- .on('click' + eventNamespace, selector.icon, module.event.icon.click)
609
608
  .on('click' + eventNamespace, module.event.test.toggle)
610
609
  ;
611
610
  }
@@ -621,6 +620,7 @@ $.fn.dropdown = function(parameters) {
621
620
  ;
622
621
  }
623
622
  $module
623
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
624
624
  .on('mousedown' + eventNamespace, module.event.mousedown)
625
625
  .on('mouseup' + eventNamespace, module.event.mouseup)
626
626
  .on('focus' + eventNamespace, module.event.focus)
@@ -754,10 +754,19 @@ $.fn.dropdown = function(parameters) {
754
754
  callback();
755
755
  },
756
756
  onSuccess : function(response) {
757
- module.remove.message();
758
- module.setup.menu({
759
- values: response[fields.remoteValues]
760
- });
757
+ var
758
+ values = response[fields.remoteValues],
759
+ hasRemoteValues = ($.isArray(values) && values.length > 0)
760
+ ;
761
+ if(hasRemoteValues) {
762
+ module.remove.message();
763
+ module.setup.menu({
764
+ values: response[fields.remoteValues]
765
+ });
766
+ }
767
+ else {
768
+ module.add.message(message.noResults);
769
+ }
761
770
  callback();
762
771
  }
763
772
  }
@@ -1010,7 +1019,12 @@ $.fn.dropdown = function(parameters) {
1010
1019
  },
1011
1020
  icon: {
1012
1021
  click: function(event) {
1013
- module.toggle();
1022
+ if($icon.hasClass(className.clear)) {
1023
+ module.clear();
1024
+ }
1025
+ else if (module.can.click()) {
1026
+ module.toggle();
1027
+ }
1014
1028
  }
1015
1029
  },
1016
1030
  text: {
@@ -1637,7 +1651,7 @@ $.fn.dropdown = function(parameters) {
1637
1651
  },
1638
1652
 
1639
1653
  hide: function(text, value, element) {
1640
- module.set.value(value, text);
1654
+ module.set.value(value, text, $(element));
1641
1655
  module.hideAndClear();
1642
1656
  }
1643
1657
 
@@ -2472,6 +2486,15 @@ $.fn.dropdown = function(parameters) {
2472
2486
  $module.data(metadata.value, stringValue);
2473
2487
  }
2474
2488
  }
2489
+ if(module.is.single() && settings.clearable) {
2490
+ // treat undefined or '' as empty
2491
+ if(!escapedValue) {
2492
+ module.remove.clearable();
2493
+ }
2494
+ else {
2495
+ module.set.clearable();
2496
+ }
2497
+ }
2475
2498
  if(settings.fireOnInit === false && module.is.initialLoad()) {
2476
2499
  module.verbose('No callback on initial load', settings.onChange);
2477
2500
  }
@@ -2567,7 +2590,10 @@ $.fn.dropdown = function(parameters) {
2567
2590
  }
2568
2591
  })
2569
2592
  ;
2570
- }
2593
+ },
2594
+ clearable: function() {
2595
+ $icon.addClass(className.clear);
2596
+ },
2571
2597
  },
2572
2598
 
2573
2599
  add: {
@@ -2765,7 +2791,7 @@ $.fn.dropdown = function(parameters) {
2765
2791
  }
2766
2792
  module.set.value(newValue, addedValue, addedText, $selectedItem);
2767
2793
  module.check.maxSelections();
2768
- }
2794
+ },
2769
2795
  },
2770
2796
 
2771
2797
  remove: {
@@ -2990,6 +3016,9 @@ $.fn.dropdown = function(parameters) {
2990
3016
  .removeAttr('tabindex')
2991
3017
  ;
2992
3018
  }
3019
+ },
3020
+ clearable: function() {
3021
+ $icon.removeClass(className.clear);
2993
3022
  }
2994
3023
  },
2995
3024
 
@@ -3677,6 +3706,8 @@ $.fn.dropdown.settings = {
3677
3706
 
3678
3707
  values : false, // specify values to use for dropdown
3679
3708
 
3709
+ clearable : false, // whether the value of the dropdown can be cleared
3710
+
3680
3711
  apiSettings : false,
3681
3712
  selectOnKeydown : true, // Whether selection should occur automatically when keyboard shortcuts used
3682
3713
  minCharacters : 0, // Minimum characters required to trigger API call
@@ -3829,6 +3860,7 @@ $.fn.dropdown.settings = {
3829
3860
  active : 'active',
3830
3861
  addition : 'addition',
3831
3862
  animating : 'animating',
3863
+ clear : 'clear',
3832
3864
  disabled : 'disabled',
3833
3865
  empty : 'empty',
3834
3866
  dropdown : 'ui dropdown',
@@ -10,7 +10,7 @@
10
10
 
11
11
  ;(function ($, window, document, undefined) {
12
12
 
13
- 'use strict';
13
+ "use strict";
14
14
 
15
15
  window = (typeof window != 'undefined' && window.Math == Math)
16
16
  ? window
@@ -181,6 +181,7 @@ $.fn.embed = function(parameters) {
181
181
  // clears embed
182
182
  reset: function() {
183
183
  module.debug('Clearing embed and showing placeholder');
184
+ module.remove.data();
184
185
  module.remove.active();
185
186
  module.remove.embed();
186
187
  module.showPlaceholder();
@@ -300,6 +301,15 @@ $.fn.embed = function(parameters) {
300
301
  },
301
302
 
302
303
  remove: {
304
+ data: function() {
305
+ $module
306
+ .removeData(metadata.id)
307
+ .removeData(metadata.icon)
308
+ .removeData(metadata.placeholder)
309
+ .removeData(metadata.source)
310
+ .removeData(metadata.url)
311
+ ;
312
+ },
303
313
  active: function() {
304
314
  $module.removeClass(className.active);
305
315
  },
@@ -110,8 +110,7 @@ $.fn.modal = function(parameters) {
110
110
  debug : settings.debug,
111
111
  variation : settings.centered
112
112
  ? false
113
- : 'top aligned'
114
- ,
113
+ : 'top aligned',
115
114
  dimmerName : 'modals'
116
115
  },
117
116
  dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
@@ -132,7 +131,7 @@ $.fn.modal = function(parameters) {
132
131
  $dimmer = $dimmable.dimmer('get dimmer');
133
132
  },
134
133
  id: function() {
135
- id = (Math.random().toString(16) + '000000000').substr(2,8);
134
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
136
135
  elementEventNamespace = '.' + id;
137
136
  module.verbose('Creating unique id for element', id);
138
137
  }
@@ -167,6 +166,9 @@ $.fn.modal = function(parameters) {
167
166
  refresh: function() {
168
167
  module.remove.scrolling();
169
168
  module.cacheSizes();
169
+ if(!module.can.useFlex()) {
170
+ module.set.modalOffset();
171
+ }
170
172
  module.set.screenHeight();
171
173
  module.set.type();
172
174
  },
@@ -207,12 +209,22 @@ $.fn.modal = function(parameters) {
207
209
  $window
208
210
  .on('resize' + elementEventNamespace, module.event.resize)
209
211
  ;
212
+ },
213
+ scrollLock: function() {
214
+ // touch events default to passive, due to changes in chrome to optimize mobile perf
215
+ $dimmable.get(0).addEventListener('touchmove', module.event.preventScroll, { passive: false });
216
+ }
217
+ },
218
+
219
+ unbind: {
220
+ scrollLock: function() {
221
+ $dimmable.get(0).removeEventListener('touchmove', module.event.preventScroll, { passive: false });
210
222
  }
211
223
  },
212
224
 
213
225
  get: {
214
226
  id: function() {
215
- return (Math.random().toString(16) + '000000000').substr(2,8);
227
+ return (Math.random().toString(16) + '000000000').substr(2, 8);
216
228
  }
217
229
  },
218
230
 
@@ -227,6 +239,9 @@ $.fn.modal = function(parameters) {
227
239
  ignoreRepeatedEvents = false;
228
240
  });
229
241
  },
242
+ preventScroll: function(event) {
243
+ event.preventDefault();
244
+ },
230
245
  deny: function() {
231
246
  if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
232
247
  module.verbose('Deny callback returned false cancelling hide');
@@ -304,6 +319,8 @@ $.fn.modal = function(parameters) {
304
319
  ;
305
320
  module.refreshModals();
306
321
  module.set.dimmerSettings();
322
+ module.set.dimmerStyles();
323
+
307
324
  module.showModal(callback);
308
325
  },
309
326
 
@@ -322,9 +339,16 @@ $.fn.modal = function(parameters) {
322
339
  : function(){}
323
340
  ;
324
341
  if( module.is.animating() || !module.is.active() ) {
325
-
326
342
  module.showDimmer();
327
343
  module.cacheSizes();
344
+ if(module.can.useFlex()) {
345
+ module.remove.legacy();
346
+ }
347
+ else {
348
+ module.set.legacy();
349
+ module.set.modalOffset();
350
+ module.debug('Using non-flex legacy modal positioning.');
351
+ }
328
352
  module.set.screenHeight();
329
353
  module.set.type();
330
354
  module.set.clickaway();
@@ -402,6 +426,7 @@ $.fn.modal = function(parameters) {
402
426
  },
403
427
  onComplete : function() {
404
428
  settings.onHidden.call(element);
429
+ module.remove.dimmerStyles();
405
430
  module.restore.focus();
406
431
  callback();
407
432
  }
@@ -426,6 +451,7 @@ $.fn.modal = function(parameters) {
426
451
 
427
452
  hideDimmer: function() {
428
453
  if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {
454
+ module.unbind.scrollLock();
429
455
  $dimmable.dimmer('hide', function() {
430
456
  module.remove.clickaway();
431
457
  module.remove.screenHeight();
@@ -513,11 +539,18 @@ $.fn.modal = function(parameters) {
513
539
  active: function() {
514
540
  $module.removeClass(className.active);
515
541
  },
542
+ legacy: function() {
543
+ $module.removeClass(className.legacy);
544
+ },
516
545
  clickaway: function() {
517
546
  $dimmer
518
547
  .off('click' + elementEventNamespace)
519
548
  ;
520
549
  },
550
+ dimmerStyles: function() {
551
+ $dimmer.removeClass(className.inverted);
552
+ $dimmable.removeClass(className.blurring);
553
+ },
521
554
  bodyStyle: function() {
522
555
  if($body.attr('style') === '') {
523
556
  module.verbose('Removing style attribute');
@@ -546,11 +579,13 @@ $.fn.modal = function(parameters) {
546
579
  $module.addClass(className.loading);
547
580
  var
548
581
  scrollHeight = $module.prop('scrollHeight'),
582
+ modalWidth = $module.outerWidth(),
549
583
  modalHeight = $module.outerHeight()
550
584
  ;
551
585
  if(module.cache === undefined || modalHeight !== 0) {
552
586
  module.cache = {
553
587
  pageHeight : $(document).outerHeight(),
588
+ width : modalWidth,
554
589
  height : modalHeight + settings.offset,
555
590
  scrollHeight : scrollHeight + settings.offset,
556
591
  contextHeight : (settings.context == 'body')
@@ -564,6 +599,12 @@ $.fn.modal = function(parameters) {
564
599
  },
565
600
 
566
601
  can: {
602
+ useFlex: function() {
603
+ return (settings.useFlex == 'auto')
604
+ ? settings.detachable && !module.is.ie()
605
+ : settings.useFlex
606
+ ;
607
+ },
567
608
  fit: function() {
568
609
  var
569
610
  contextHeight = module.cache.contextHeight,
@@ -585,6 +626,13 @@ $.fn.modal = function(parameters) {
585
626
  active: function() {
586
627
  return $module.hasClass(className.active);
587
628
  },
629
+ ie: function() {
630
+ var
631
+ isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
632
+ isIE = ('ActiveXObject' in window)
633
+ ;
634
+ return (isIE11 || isIE);
635
+ },
588
636
  animating: function() {
589
637
  return $module.transition('is supported')
590
638
  ? $module.transition('is animating')
@@ -596,7 +644,7 @@ $.fn.modal = function(parameters) {
596
644
  },
597
645
  modernBrowser: function() {
598
646
  // appName for IE11 reports 'Netscape' can no longer use
599
- return !(window.ActiveXObject || "ActiveXObject" in window);
647
+ return !(window.ActiveXObject || 'ActiveXObject' in window);
600
648
  }
601
649
  },
602
650
 
@@ -628,10 +676,10 @@ $.fn.modal = function(parameters) {
628
676
  debug : settings.debug,
629
677
  dimmerName : 'modals',
630
678
  closable : 'auto',
679
+ useFlex : module.can.useFlex(),
631
680
  variation : settings.centered
632
681
  ? false
633
- : 'top aligned'
634
- ,
682
+ : 'top aligned',
635
683
  duration : {
636
684
  show : settings.duration,
637
685
  hide : settings.duration
@@ -644,6 +692,11 @@ $.fn.modal = function(parameters) {
644
692
  ? dimmerSettings.variation + ' inverted'
645
693
  : 'inverted'
646
694
  ;
695
+ }
696
+ $context.dimmer('setting', dimmerSettings);
697
+ },
698
+ dimmerStyles: function() {
699
+ if(settings.inverted) {
647
700
  $dimmer.addClass(className.inverted);
648
701
  }
649
702
  else {
@@ -655,7 +708,21 @@ $.fn.modal = function(parameters) {
655
708
  else {
656
709
  $dimmable.removeClass(className.blurring);
657
710
  }
658
- $context.dimmer('setting', dimmerSettings);
711
+ },
712
+ modalOffset: function() {
713
+ var
714
+ width = module.cache.width,
715
+ height = module.cache.height
716
+ ;
717
+ $module
718
+ .css({
719
+ marginTop: (settings.centered && module.can.fit())
720
+ ? -(height / 2)
721
+ : 0,
722
+ marginLeft: -(width / 2)
723
+ })
724
+ ;
725
+ module.verbose('Setting modal offset for legacy mode');
659
726
  },
660
727
  screenHeight: function() {
661
728
  if( module.can.fit() ) {
@@ -674,12 +741,17 @@ $.fn.modal = function(parameters) {
674
741
  scrolling: function() {
675
742
  $dimmable.addClass(className.scrolling);
676
743
  $module.addClass(className.scrolling);
744
+ module.unbind.scrollLock();
745
+ },
746
+ legacy: function() {
747
+ $module.addClass(className.legacy);
677
748
  },
678
749
  type: function() {
679
750
  if(module.can.fit()) {
680
751
  module.verbose('Modal fits on screen');
681
752
  if(!module.others.active() && !module.others.animating()) {
682
753
  module.remove.scrolling();
754
+ module.bind.scrollLock();
683
755
  }
684
756
  }
685
757
  else {
@@ -880,6 +952,9 @@ $.fn.modal.settings = {
880
952
  name : 'Modal',
881
953
  namespace : 'modal',
882
954
 
955
+ useFlex : 'auto',
956
+ offset : 0,
957
+
883
958
  silent : false,
884
959
  debug : false,
885
960
  verbose : false,
@@ -909,7 +984,6 @@ $.fn.modal.settings = {
909
984
 
910
985
  queue : false,
911
986
  duration : 500,
912
- offset : 0,
913
987
  transition : 'scale',
914
988
 
915
989
  // padding with edge of page
@@ -949,6 +1023,7 @@ $.fn.modal.settings = {
949
1023
  animating : 'animating',
950
1024
  blurring : 'blurring',
951
1025
  inverted : 'inverted',
1026
+ legacy : 'legacy',
952
1027
  loading : 'loading',
953
1028
  scrolling : 'scrolling',
954
1029
  undetached : 'undetached'