pageflow 13.0.0.beta6 → 13.0.0.beta7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pageflow might be problematic. Click here for more details.

Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +1 -0
  4. data/app/assets/audios/pageflow/unmute.mp3 +0 -0
  5. data/app/assets/images/pageflow/editor/help/phone_horizontal_slideshow_mode.gif +0 -0
  6. data/app/assets/javascripts/pageflow/asset_urls.js.erb +1 -1
  7. data/app/assets/javascripts/pageflow/audio/multi_player.js +4 -0
  8. data/app/assets/javascripts/pageflow/audio_player.js +1 -1
  9. data/app/assets/javascripts/pageflow/background_media.js +22 -0
  10. data/app/assets/javascripts/pageflow/base.js +1 -0
  11. data/app/assets/javascripts/pageflow/browser/agent.js +92 -78
  12. data/app/assets/javascripts/pageflow/browser/autoplay_support.js +2 -2
  13. data/app/assets/javascripts/pageflow/dist/react.js +711 -252
  14. data/app/assets/javascripts/pageflow/editor/api/page_type.js +4 -0
  15. data/app/assets/javascripts/pageflow/editor/base.js +1 -0
  16. data/app/assets/javascripts/pageflow/editor/collections/files_collection.js +8 -0
  17. data/app/assets/javascripts/pageflow/editor/initializers/boot.js +6 -4
  18. data/app/assets/javascripts/pageflow/editor/initializers/setup_asset_urls.js +3 -0
  19. data/app/assets/javascripts/pageflow/editor/models/entry.js +2 -2
  20. data/app/assets/javascripts/pageflow/editor/models/file_stage.js +6 -1
  21. data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +9 -0
  22. data/app/assets/javascripts/pageflow/editor/models/mixins/transient_references.js +12 -2
  23. data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +5 -0
  24. data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +6 -1
  25. data/app/assets/javascripts/pageflow/editor/templates/emulation_mode_button.jst.ejs +26 -0
  26. data/app/assets/javascripts/pageflow/editor/templates/entry_preview.jst.ejs +8 -3
  27. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +1 -1
  28. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_link.js +3 -6
  29. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_transitions.js +14 -4
  30. data/app/assets/javascripts/pageflow/editor/views/edit_storyline_view.js +3 -6
  31. data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +47 -12
  32. data/app/assets/javascripts/pageflow/editor/views/emulation_mode_button_view.js +45 -0
  33. data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +62 -8
  34. data/app/assets/javascripts/pageflow/editor/views/file_stage_item_view.js +7 -0
  35. data/app/assets/javascripts/pageflow/editor/views/help_image_view.js +9 -0
  36. data/app/assets/javascripts/pageflow/editor/views/info_box_view.js +1 -1
  37. data/app/assets/javascripts/pageflow/editor/views/inputs/file_processing_state_display_view.js +60 -0
  38. data/app/assets/javascripts/pageflow/editor/views/sidebar_footer_view.js +12 -0
  39. data/app/assets/javascripts/pageflow/editor/views/widget_types/phone_horizontal_slideshow_mode.js +14 -0
  40. data/app/assets/javascripts/pageflow/entry_data.js +4 -0
  41. data/app/assets/javascripts/pageflow/media_player.js +7 -3
  42. data/app/assets/javascripts/pageflow/media_player/handle_failed_play.js +34 -0
  43. data/app/assets/javascripts/pageflow/media_player/volume_fading/web_audio.js +29 -3
  44. data/app/assets/javascripts/pageflow/page_transitions.js +59 -15
  45. data/app/assets/javascripts/pageflow/page_type.js +5 -1
  46. data/app/assets/javascripts/pageflow/seed_entry_data.js +13 -0
  47. data/app/assets/javascripts/pageflow/slideshow.js +31 -11
  48. data/app/assets/javascripts/pageflow/slideshow/atmo.js +23 -12
  49. data/app/assets/javascripts/pageflow/slideshow/lazy_page_widget.js +9 -3
  50. data/app/assets/javascripts/pageflow/slideshow/navigation_direction.js +37 -0
  51. data/app/assets/javascripts/pageflow/slideshow/page_widget.js +12 -6
  52. data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +13 -16
  53. data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +49 -14
  54. data/app/assets/javascripts/pageflow/ui/views/mixins/input_view.js +10 -3
  55. data/app/assets/javascripts/pageflow/video_player/lazy.js +1 -1
  56. data/app/assets/stylesheets/pageflow/animations/bounce.scss +13 -1
  57. data/app/assets/stylesheets/pageflow/editor/base.scss +5 -0
  58. data/app/assets/stylesheets/pageflow/editor/emulation_mode_button.scss +78 -0
  59. data/app/assets/stylesheets/pageflow/editor/entry_preview.scss +41 -0
  60. data/app/assets/stylesheets/pageflow/editor/file_stages.scss +11 -3
  61. data/app/assets/stylesheets/pageflow/editor/help.scss +4 -14
  62. data/app/assets/stylesheets/pageflow/editor/help_image.scss +5 -0
  63. data/app/assets/stylesheets/pageflow/editor/info_box.scss +5 -0
  64. data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
  65. data/app/assets/stylesheets/pageflow/editor/inputs/file_processing_state_display.scss +18 -0
  66. data/app/assets/stylesheets/pageflow/editor/sidebar_footer.scss +12 -0
  67. data/app/assets/stylesheets/pageflow/entries.scss +29 -6
  68. data/app/assets/stylesheets/pageflow/mixins/breakpoints.scss +5 -3
  69. data/app/assets/stylesheets/pageflow/mixins/icons/fontawesome.scss +1 -1
  70. data/app/assets/stylesheets/pageflow/navigation_mobile.scss +5 -1
  71. data/app/assets/stylesheets/pageflow/page_transitions.scss +0 -6
  72. data/app/assets/stylesheets/pageflow/page_transitions/crossfade.scss +5 -1
  73. data/app/assets/stylesheets/pageflow/page_transitions/fade.scss +44 -36
  74. data/app/assets/stylesheets/pageflow/page_transitions/scroll.scss +96 -11
  75. data/app/assets/stylesheets/pageflow/slideshow.scss +0 -4
  76. data/app/assets/stylesheets/pageflow/themes/default/background_media_unmute_button.scss +68 -0
  77. data/app/assets/stylesheets/pageflow/themes/default/base.scss +1 -0
  78. data/app/assets/stylesheets/pageflow/themes/default/indicators/icons/icon_font.scss +7 -0
  79. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -0
  80. data/app/controllers/pageflow/editor/files_controller.rb +9 -1
  81. data/app/helpers/pageflow/asset_urls_helper.rb +9 -0
  82. data/app/helpers/pageflow/background_image_helper.rb +6 -10
  83. data/app/helpers/pageflow/file_background_images_helper.rb +78 -0
  84. data/app/helpers/pageflow/pages_helper.rb +2 -2
  85. data/app/helpers/pageflow/render_json_helper.rb +3 -2
  86. data/app/models/concerns/pageflow/hosted_file.rb +2 -9
  87. data/app/models/concerns/pageflow/uploaded_file.rb +9 -0
  88. data/app/models/pageflow/draft_entry.rb +2 -2
  89. data/app/models/pageflow/image_file.rb +5 -20
  90. data/app/models/pageflow/image_file_css_background_image_urls.rb +17 -0
  91. data/app/models/pageflow/video_file_css_background_image_urls.rb +13 -0
  92. data/app/views/pageflow/editor/asset_urls/_asset_urls.json.jbuilder +4 -0
  93. data/app/views/pageflow/editor/entries/seed.json.erb +3 -1
  94. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
  95. data/app/views/pageflow/entries/_indicators.html.erb +8 -3
  96. data/app/views/pageflow/entries/edit.html.erb +1 -1
  97. data/app/views/pageflow/entries/show.css.erb +6 -20
  98. data/app/views/pageflow/file_background_images/_rule.css.erb +3 -0
  99. data/config/initializers/features.rb +1 -0
  100. data/config/locales/de.yml +20 -8
  101. data/config/locales/en.yml +23 -11
  102. data/config/routes.rb +1 -0
  103. data/lib/pageflow/built_in_file_type.rb +4 -0
  104. data/lib/pageflow/built_in_widget_type.rb +12 -0
  105. data/lib/pageflow/built_in_widget_types_plugin.rb +5 -0
  106. data/lib/pageflow/file_type.rb +39 -0
  107. data/lib/pageflow/file_types.rb +6 -0
  108. data/lib/pageflow/version.rb +1 -1
  109. data/spec/factories/hosted_files.rb +12 -8
  110. data/vendor/assets/javascripts/audio5.min.js +280 -129
  111. data/vendor/assets/javascripts/iscroll.js +16 -11
  112. metadata +47 -16
  113. data/app/assets/javascripts/pageflow/media_player/catch_play_promise.js +0 -23
  114. data/app/assets/stylesheets/pageflow/page_transitions/scroll_in.scss +0 -66
  115. data/app/assets/stylesheets/pageflow/page_transitions/scroll_in_right.scss +0 -68
  116. data/app/assets/stylesheets/pageflow/page_transitions/scroll_left.scss +0 -20
  117. data/app/assets/stylesheets/pageflow/page_transitions/scroll_over_from_left.scss +0 -12
  118. data/app/assets/stylesheets/pageflow/page_transitions/scroll_over_from_right.scss +0 -12
  119. data/app/assets/stylesheets/pageflow/page_transitions/scroll_right.scss +0 -20
  120. data/lib/pageflow/images/palette.png +0 -0
@@ -2,14 +2,19 @@
2
2
  var attributeName = 'atmo_audio_file_id';
3
3
 
4
4
  pageflow.Atmo = pageflow.Object.extend({
5
- initialize: function(slideshow, events, multiPlayer) {
6
- this.slideshow = slideshow;
7
- this.multiPlayer = multiPlayer;
5
+ initialize: function(options) {
6
+ this.slideshow = options.slideshow;
7
+ this.multiPlayer = options.multiPlayer;
8
+ this.backgroundMedia = options.backgroundMedia;
8
9
  this.disabled = pageflow.browser.has('mobile platform');
9
10
 
10
- this.listenTo(events, 'page:change page:update', function() {
11
+ this.listenTo(options.events, 'page:change page:update background_media:unmute', function() {
11
12
  this.update();
12
13
  });
14
+
15
+ this.listenTo(options.multiPlayer, 'playfailed', function() {
16
+ options.backgroundMedia.mute();
17
+ });
13
18
  },
14
19
 
15
20
  disable: function() {
@@ -46,7 +51,7 @@
46
51
 
47
52
  resume: function() {
48
53
  if (this.multiPlayer.paused()) {
49
- if (this.disabled) {
54
+ if (this.disabled || this.backgroundMedia.muted) {
50
55
  return new $.Deferred().resolve().promise();
51
56
  }
52
57
  else {
@@ -62,7 +67,12 @@
62
67
  var configuration = this.slideshow.currentPageConfiguration();
63
68
 
64
69
  if (!this.disabled) {
65
- this.multiPlayer.fadeTo(configuration[attributeName]);
70
+ if (this.backgroundMedia.muted) {
71
+ this.multiPlayer.fadeOutAndPause();
72
+ }
73
+ else {
74
+ this.multiPlayer.fadeTo(configuration[attributeName]);
75
+ }
66
76
  }
67
77
  },
68
78
 
@@ -86,11 +96,12 @@
86
96
  }
87
97
  });
88
98
 
89
- pageflow.Atmo.create = function(slideshow, events, audio) {
90
- return new pageflow.Atmo(
91
- slideshow,
92
- events,
93
- audio.createMultiPlayer({
99
+ pageflow.Atmo.create = function(slideshow, events, audio, backgroundMedia) {
100
+ return new pageflow.Atmo({
101
+ slideshow: slideshow,
102
+ events: events,
103
+ backgroundMedia: backgroundMedia,
104
+ multiPlayer: audio.createMultiPlayer({
94
105
  loop: true,
95
106
  fadeDuration: 500,
96
107
  crossFade: true,
@@ -98,7 +109,7 @@
98
109
  rewindOnChange: true,
99
110
  pauseInBackground: true
100
111
  })
101
- );
112
+ });
102
113
  };
103
114
 
104
115
  pageflow.Atmo.duringPlaybackModes = ['play', 'mute', 'turn_down'];
@@ -1,6 +1,12 @@
1
1
  (function($) {
2
- var creatingMethods = ['reinit', 'reactivate', 'activate', 'activateAsLandingPage', 'prepare', 'linkedPages'];
3
- var ignoredMethods = ['cleanup', 'refreshScroller', 'resize', 'preload', 'deactivate', 'unprepare'];
2
+ var creatingMethods = [
3
+ 'reinit', 'reactivate', 'activate', 'activateAsLandingPage', 'prepare', 'linkedPages'
4
+ ];
5
+
6
+ var ignoredMethods = [
7
+ 'cleanup', 'refreshScroller', 'resize', 'preload', 'deactivate', 'unprepare',
8
+ 'isPageChangeAllowed'
9
+ ];
4
10
 
5
11
  var prototype = {
6
12
  _create: function() {
@@ -55,4 +61,4 @@
55
61
  });
56
62
 
57
63
  $.widget('pageflow.page', prototype);
58
- }(jQuery));
64
+ }(jQuery));
@@ -0,0 +1,37 @@
1
+ pageflow.navigationDirection = (function() {
2
+ var eventMapping = {
3
+ v: {
4
+ scrollerbumpnext: 'scrollerbumpdown',
5
+ scrollerbumpback: 'scrollerbumpup',
6
+ scrollerhintnext: 'scrollerhintdown',
7
+ scrollerhintback: 'scrollerhintup',
8
+ },
9
+ h: {
10
+ scrollerbumpnext: 'scrollerbumpright',
11
+ scrollerbumpback: 'scrollerbumpleft',
12
+ scrollerhintnext: 'scrollerhintright',
13
+ scrollerhintback: 'scrollerhintleft',
14
+ }
15
+ };
16
+
17
+ return {
18
+ isHorizontalOnPhone: function() {
19
+ return pageflow.widgets.isPresent('phone_horizontal_slideshow_mode');
20
+ },
21
+
22
+ isHorizontal: function() {
23
+ return this.isHorizontalOnPhone() &&
24
+ pageflow.browser.has('phone platform');
25
+ },
26
+
27
+ getEventName: function(name) {
28
+ var result = eventMapping[this.isHorizontal() ? 'h' : 'v'][name];
29
+
30
+ if (!result) {
31
+ throw 'Unknown event name ' + name;
32
+ }
33
+
34
+ return result;
35
+ }
36
+ };
37
+ }());
@@ -101,6 +101,10 @@
101
101
  return this._triggerPageTypeHook('linkedPages');
102
102
  },
103
103
 
104
+ isPageChangeAllowed: function(options) {
105
+ return this._triggerPageTypeHook('isPageChangeAllowed', options);
106
+ },
107
+
104
108
  preload: function() {
105
109
  var page = this;
106
110
 
@@ -152,9 +156,10 @@
152
156
 
153
157
  animateTransition: function(destination, options, callback) {
154
158
  var otherDestination = destination === 'in' ? 'out' : 'in';
155
- var transition = options.transition || this.configuration.transition || 'fade';
156
- var duration = pageflow.pageTransitions.get(transition).duration;
157
- var animateClass = transition + ' animate-' + destination + '-' + options.direction;
159
+ var transition = pageflow.pageTransitions.get(options.transition ||
160
+ this.configuration.transition ||
161
+ 'fade');
162
+ var animateClass = transition.className + ' animate-' + destination + '-' + options.direction;
158
163
 
159
164
  this.element
160
165
  .removeClass('animate-' + otherDestination + '-forwards animate-' + otherDestination + '-backwards')
@@ -163,9 +168,9 @@
163
168
  setTimeout(_.bind(function() {
164
169
  this.element.removeClass(animateClass);
165
170
  callback.call(this);
166
- }, this), duration);
171
+ }, this), transition.duration);
167
172
 
168
- return duration;
173
+ return transition.duration;
169
174
  },
170
175
 
171
176
  _triggerDelayedPageTypeHook: function(name) {
@@ -185,6 +190,7 @@
185
190
 
186
191
  _setupHideTextOnSwipe: function() {
187
192
  if (pageflow.entryData.getThemingOption('hide_text_on_swipe') &&
193
+ !pageflow.navigationDirection.isHorizontal() &&
188
194
  !this.pageType.noHideTextOnSwipe) {
189
195
  this.element.hideTextOnSwipe({
190
196
  eventTargetSelector: '.content > .scroller'
@@ -227,4 +233,4 @@
227
233
  });
228
234
  }
229
235
  });
230
- }(jQuery));
236
+ }(jQuery));
@@ -1,7 +1,7 @@
1
1
  (function($) {
2
2
  var boundaries = {
3
- up: 'top',
4
- down: 'bottom'
3
+ back: 'top',
4
+ next: 'bottom'
5
5
  };
6
6
 
7
7
  $.widget('pageflow.scrollIndicator', {
@@ -13,16 +13,7 @@
13
13
  fadeTimeout;
14
14
 
15
15
  function update(page) {
16
- if (page.hasClass('scroll_indicator_mode_non') ||
17
- (page.hasClass('scroll_indicator_mode_only_next') && direction === 'up') ||
18
- (page.hasClass('scroll_indicator_mode_only_back') && direction === 'down')) {
19
-
20
- that.element.hide();
21
- }
22
- else {
23
- that.element.show();
24
- }
25
-
16
+ that.element.toggleClass('hidden_by_scoll_indicator_mode', hiddenByMode(page));
26
17
  that.element.toggleClass('hidden_for_page', hideScrollIndicatorForPage(page));
27
18
 
28
19
  that.element.toggleClass('invert', invertIndicator(page));
@@ -30,6 +21,12 @@
30
21
  that.element.toggleClass('available', targetPageExists());
31
22
  }
32
23
 
24
+ function hiddenByMode(page) {
25
+ return (page.hasClass('scroll_indicator_mode_non') ||
26
+ (page.hasClass('scroll_indicator_mode_only_next') && direction === 'back') ||
27
+ (page.hasClass('scroll_indicator_mode_only_back') && direction === 'next'));
28
+ }
29
+
33
30
  function invertIndicator(page) {
34
31
  var result = page.data('invertIndicator');
35
32
 
@@ -54,7 +51,7 @@
54
51
  }
55
52
 
56
53
  function targetPageExists() {
57
- return direction === 'down' ? parent.nextPageExists() : parent.previousPageExists();
54
+ return direction === 'next' ? parent.nextPageExists() : parent.previousPageExists();
58
55
  }
59
56
 
60
57
  parent.on('pageactivate', function(event) {
@@ -88,7 +85,7 @@
88
85
  },
89
86
  });
90
87
 
91
- parent.on('scrollerhint' + direction, function() {
88
+ parent.on(pageflow.navigationDirection.getEventName('scrollerhint' + direction), function() {
92
89
  that.element.addClass('animate');
93
90
  setTimeout(function() {
94
91
  that.element.removeClass('animate');
@@ -117,7 +114,7 @@
117
114
  });
118
115
 
119
116
  this.element.on('click', function() {
120
- if (direction === 'down') {
117
+ if (direction === 'next') {
121
118
  parent.next();
122
119
  }
123
120
  else {
@@ -126,4 +123,4 @@
126
123
  });
127
124
  }
128
125
  });
129
- }(jQuery));
126
+ }(jQuery));
@@ -9,6 +9,7 @@
9
9
  $.widget('pageflow.scroller', {
10
10
  dragThreshold: 50,
11
11
  maxXDelta: 50,
12
+ maxYDelta: 50,
12
13
  doubleBumpThreshold: 500,
13
14
 
14
15
  _create: function() {
@@ -208,25 +209,34 @@
208
209
  },
209
210
 
210
211
  // Trigger bumpup or bumpdown when the user drags the page from a
211
- // boundary position.
212
+ // boundary position. Trigger bumpleft or bumpright if user drags
213
+ // horizontally.
212
214
  _initDragGestureBump: function() {
213
215
  var allowUp = false,
214
216
  allowDown = false,
217
+ allowLeft = false,
218
+ allowRight = false,
215
219
  startX, startY;
216
220
 
217
221
  this.element.on('touchstart MSPointerDown pointerdown', _.bind(function(event) {
218
- var point = event.originalEvent.touches ? event.originalEvent.touches[0] : event.originalEvent;
222
+ var point = event.originalEvent.touches ?
223
+ event.originalEvent.touches[0] : event.originalEvent;
224
+
219
225
  startX = point.pageX;
220
226
  startY = point.pageY;
221
227
 
222
- if (!isNonTouchPointer(event)) {
228
+ if (!this._isNonTouchPointer(event)) {
223
229
  allowDown = this._atBoundary('down');
224
230
  allowUp = this._atBoundary('up');
231
+ allowLeft = true;
232
+ allowRight = true;
225
233
  }
226
234
  }, this));
227
235
 
228
236
  this.element.on('touchmove MSPointerMove pointermove', _.bind(function(event) {
229
- var point = event.originalEvent.touches ? event.originalEvent.touches[0] : event.originalEvent;
237
+ var point = event.originalEvent.touches ?
238
+ event.originalEvent.touches[0] : event.originalEvent;
239
+
230
240
  var deltaX = point.pageX - startX;
231
241
  var deltaY = point.pageY - startY;
232
242
 
@@ -234,30 +244,55 @@
234
244
  allowDown = allowUp = false;
235
245
  }
236
246
 
247
+ if (Math.abs(deltaY) > this.maxYDelta) {
248
+ allowLeft = allowRight = false;
249
+ }
250
+
237
251
  if (allowUp && deltaY > this.dragThreshold) {
238
252
  this._trigger('bumpup');
239
- allowDown = allowUp = false;
253
+ allowDown = allowUp = allowLeft = allowRight = false;
240
254
  }
241
255
  else if (allowDown && deltaY < -this.dragThreshold) {
242
256
  this._trigger('bumpdown');
243
- allowDown = allowUp = false;
257
+ allowDown = allowUp = allowLeft = allowRight = false;
258
+ }
259
+ else if (allowLeft && deltaX > this.dragThreshold) {
260
+ this._trigger('bumpleft');
261
+ allowDown = allowUp = allowLeft = allowRight = false;
262
+ }
263
+ else if (allowRight && deltaX < -this.dragThreshold) {
264
+ this._trigger('bumpright');
265
+ allowDown = allowUp = allowLeft = allowRight =false;
244
266
  }
245
267
  }, this));
246
268
 
247
269
  this.element.on('touchend MSPointerUp pointerup', _.bind(function(event) {
248
- if (allowUp) {
270
+ var point = event.originalEvent.touches ?
271
+ event.originalEvent.changedTouches[0] : event.originalEvent;
272
+
273
+ var deltaX = point.pageX - startX;
274
+ var deltaY = point.pageY - startY;
275
+
276
+ if (allowUp && deltaY > 0) {
249
277
  this._trigger('hintup');
250
278
  }
251
- if (allowDown) {
279
+ else if (allowDown && deltaY < 0) {
252
280
  this._trigger('hintdown');
253
281
  }
282
+
283
+ if (allowLeft && deltaX > 0) {
284
+ this._trigger('hintleft');
285
+ }
286
+ else if (allowRight && deltaX < 0) {
287
+ this._trigger('hintright');
288
+ }
254
289
  }, this));
290
+ },
255
291
 
256
- function isNonTouchPointer(event) {
257
- return event.originalEvent.pointerType &&
258
- event.originalEvent.pointerType !== event.originalEvent.MSPOINTER_TYPE_TOUCH &&
259
- event.originalEvent.pointerType !== 'touch';
260
- }
292
+ _isNonTouchPointer: function(event) {
293
+ return event.originalEvent.pointerType &&
294
+ event.originalEvent.pointerType !== event.originalEvent.MSPOINTER_TYPE_TOUCH &&
295
+ event.originalEvent.pointerType !== 'touch';
261
296
  },
262
297
 
263
298
  // Checks whether the scroller is at the very top or very bottom.
@@ -273,4 +308,4 @@
273
308
  }
274
309
  }
275
310
  });
276
- }(jQuery));
311
+ }(jQuery));
@@ -87,6 +87,10 @@
87
87
  * An array of prefixes to lookup translations for labels and
88
88
  * inline help texts based on attribute names.
89
89
  *
90
+ * @param {string} [options.additionalInlineHelpText]
91
+ * A text that will be appended to the translation based inline
92
+ * text.
93
+ *
90
94
  * @param {boolean} [options.disabled]
91
95
  * Render input as disabled.
92
96
  *
@@ -190,7 +194,10 @@ pageflow.inputView = {
190
194
  keys = pageflow.i18nUtils.translationKeysWithSuffix(keys, 'disabled');
191
195
  }
192
196
 
193
- return pageflow.i18nUtils.findTranslation(keys, {defaultValue: '', html: true});
197
+ return _.compact([
198
+ pageflow.i18nUtils.findTranslation(keys, {defaultValue: '', html: true}),
199
+ this.options.additionalInlineHelpText
200
+ ]).join(' ');
194
201
  },
195
202
 
196
203
  updateDisabled: function() {
@@ -217,11 +224,11 @@ pageflow.inputView = {
217
224
  }
218
225
 
219
226
  function updateVisible(model, value) {
220
- view.$el.toggle(isVisible(value));
227
+ view.$el.toggleClass('input-hidden_via_binding', !isVisible(value));
221
228
  }
222
229
 
223
230
  function isVisible(value) {
224
- if (view.options.visibleBindingValue) {
231
+ if ('visibleBindingValue' in view.options) {
225
232
  return value === view.options.visibleBindingValue;
226
233
  }
227
234
  else if (typeof view.options.visible === 'function') {
@@ -80,7 +80,7 @@ pageflow.VideoPlayer.Lazy = function(template, options) {
80
80
  return videoPlayer && videoPlayer.posterImage.unlockShowing();
81
81
  };
82
82
 
83
- _.each(['play', 'playAndFadeIn', 'pause', 'fadeOutAndPause', 'prebuffer', 'src', 'on', 'load', 'currentTime'], function(method) {
83
+ _.each(['play', 'playAndFadeIn', 'pause', 'fadeOutAndPause', 'prebuffer', 'src', 'on', 'load', 'currentTime', 'muted'], function(method) {
84
84
  that[method] = function(/* args */) {
85
85
  var args = arguments;
86
86
 
@@ -8,4 +8,16 @@
8
8
  100% {
9
9
  @include transform(translateY(0));
10
10
  }
11
- }
11
+ }
12
+
13
+ @include keyframes(bounce_x) {
14
+ 0% {
15
+ @include transform(translateX(0));
16
+ }
17
+ 10% {
18
+ @include transform(translateX(-30px));
19
+ }
20
+ 100% {
21
+ @include transform(translateX(0));
22
+ }
23
+ }
@@ -7,6 +7,7 @@
7
7
  @import "./blank_entry";
8
8
  @import "./dialogs";
9
9
  @import "./colors";
10
+ @import "./entry_preview";
10
11
  @import "./background_positioning";
11
12
  @import "./page_selection";
12
13
  @import "./files_explorer";
@@ -68,6 +69,7 @@
68
69
  @import "./file_stages";
69
70
  @import "./file_thumbnails";
70
71
  @import "./file_settings_dialog";
72
+ @import "./info_box";
71
73
  @import "./text_tracks";
72
74
  @import "./static_thumbnails";
73
75
  @import "./wysihtml5";
@@ -81,6 +83,9 @@
81
83
  @import "./page_links";
82
84
  @import "./storyline_picker";
83
85
  @import "./loading";
86
+ @import "./sidebar_footer";
87
+ @import "./emulation_mode_button";
88
+ @import "./help_image";
84
89
 
85
90
  a.publish {
86
91
  @include eye-icon;