pageflow-progress-navigation-bar 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +22 -0
- data/.jshintrc +18 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +10 -0
- data/README.md +45 -0
- data/Rakefile +7 -0
- data/app/assets/images/pageflow/progress_navigation_bar/indicator.png +0 -0
- data/app/assets/images/pageflow/progress_navigation_bar/volume_control_sprite.png +0 -0
- data/app/assets/javascript/pageflow/progress_navigation_bar.js +8 -0
- data/app/assets/javascript/pageflow/progress_navigation_bar/widget.js +342 -0
- data/app/assets/stylesheets/pageflow/cross_dependant_styles.css.scss +29 -0
- data/app/assets/stylesheets/pageflow/progress_navigation_bar.css.scss +676 -0
- data/app/assets/stylesheets/pageflow/progress_navigation_bar/themes/default.css.scss +338 -0
- data/app/views/pageflow/progress_navigation_bar/_widget.html.erb +15 -0
- data/app/views/pageflow/progress_navigation_bar/widget/_bar_top.html.erb +79 -0
- data/app/views/pageflow/progress_navigation_bar/widget/_credits_box_content.html.erb +5 -0
- data/app/views/pageflow/progress_navigation_bar/widget/_home_button.html.erb +8 -0
- data/app/views/pageflow/progress_navigation_bar/widget/_page.html.erb +16 -0
- data/config/locales/de.yml +26 -0
- data/config/locales/en.yml +26 -0
- data/lib/pageflow-progress-navigation-bar.rb +9 -0
- data/lib/pageflow/progress_navigation_bar/engine.rb +9 -0
- data/lib/pageflow/progress_navigation_bar/widget_type.rb +13 -0
- data/pageflow-progress-navigation-bar.gemspec +21 -0
- metadata +110 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NWI2M2IyODk5ZmM1YmVhMGMwODBkZWE5OTFhYTZlODNhMGFkODM3Yw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
OWMwODE2OGU3ZWU0MTYyNjg3NzI5MTc1MDQwZWM1MTM3YTY5YmM5Mg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZmVkODdjNTJlNjcyOTE5YThkN2RlYzNjNTIxMDViYjg3MWY5ZjdiYzc3ODY5
|
10
|
+
NDBmYzU3YTQyZjdhMjU5MzliZGJjYzBjYmMwNmE2MWVlZGFiM2I0NTZhMWQ4
|
11
|
+
ZTFiYzI5Zjk1NjMzYWMyNjg0NTUwMjQ2NDNiOTVlNzAyOWIyZGQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OTVjMmUzNWVmNmM3MzY4ZmQ2ZTdkYjUxNTkzOTNiZmE0MDYwYTcyYWVlOWYx
|
14
|
+
NGQ3MjZjMzIwOWVlNzc4NmM3MDA2NDg5OWY0Y2M4YjlmOTVjZjkwNzk5N2I3
|
15
|
+
YjY3ZDQwY2ZlZDczNzBkNTRjMjMxOTI0MWRjZDUyYjY4NDg1Y2Y=
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
*.sqlite3
|
4
|
+
.bundle
|
5
|
+
.config
|
6
|
+
.yardoc
|
7
|
+
.idea
|
8
|
+
InstalledFiles
|
9
|
+
_yardoc
|
10
|
+
coverage
|
11
|
+
doc/
|
12
|
+
lib/bundler/man
|
13
|
+
pkg
|
14
|
+
rdoc
|
15
|
+
spec/reports
|
16
|
+
test/tmp
|
17
|
+
test/version_tmp
|
18
|
+
tmp
|
19
|
+
log
|
20
|
+
Gemfile.lock
|
21
|
+
|
22
|
+
.localeapp
|
data/.jshintrc
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
"browser": true,
|
3
|
+
"undef": true,
|
4
|
+
"immed": true,
|
5
|
+
"trailing": true,
|
6
|
+
"globals": {
|
7
|
+
"jQuery": true,
|
8
|
+
"$": true,
|
9
|
+
"Backbone": true,
|
10
|
+
"_": true,
|
11
|
+
"I18n": true,
|
12
|
+
|
13
|
+
"pageflow": true,
|
14
|
+
|
15
|
+
"confirm": true,
|
16
|
+
"alert": true
|
17
|
+
}
|
18
|
+
}
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in chart.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
# Rails 4 compat
|
7
|
+
gem 'activeadmin', git: 'https://github.com/codevise/active_admin.git', branch: 'rails4'
|
8
|
+
gem 'ransack'
|
9
|
+
gem 'inherited_resources', '1.4.1'
|
10
|
+
gem 'formtastic', '2.3.0.rc2'
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Pageflow Progress Navigation Bar
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/pageflow-progress-navigation-bar.svg)](http://badge.fury.io/rb/pageflow-progress-navigation-bar)
|
4
|
+
|
5
|
+
A navigation bar resembling a progress bar.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's `Gemfile`:
|
10
|
+
|
11
|
+
gem 'pageflow-progress-navigation-bar'
|
12
|
+
|
13
|
+
Register the widget type inside the configure block in `config/initializers/pageflow.rb`
|
14
|
+
|
15
|
+
Pageflow.configure do |config|
|
16
|
+
config.widget_types.register(Pageflow::ProgressNavigationBar.widget_type)
|
17
|
+
end
|
18
|
+
|
19
|
+
Include javascripts and stylesheets:
|
20
|
+
|
21
|
+
# app/assets/javascripts/pageflow/application.js
|
22
|
+
//= require pageflow/progress_navigation_bar
|
23
|
+
|
24
|
+
# app/assets/stylesheets/pageflow/application.css.scss
|
25
|
+
@import "pageflow/progress_navigation_bar";
|
26
|
+
|
27
|
+
# Adding basic style to your theme
|
28
|
+
# app/assets/stylesheets/pageflow/themes/default.css.scss
|
29
|
+
@import "pageflow/progress_navigation_bar/themes/default";
|
30
|
+
|
31
|
+
Execute `bundle install` Restart the application server.
|
32
|
+
|
33
|
+
## Troubleshooting
|
34
|
+
|
35
|
+
If you run into problems while installing the page type, please also refer to the
|
36
|
+
[Troubleshooting](https://github.com/codevise/pageflow/wiki/Troubleshooting) wiki
|
37
|
+
page in the [Pageflow repository](https://github.com/codevise/pageflow). If that
|
38
|
+
doesn't help, consider
|
39
|
+
[filing an issue](https://github.com/codevise/pageflow-progress-navigation-bar/issues).
|
40
|
+
|
41
|
+
## Contributing Locales
|
42
|
+
|
43
|
+
Edit the translations directly on the
|
44
|
+
[pageflow-progress-navigation-bar](http://www.localeapp.com/projects/public?search=tf/pageflow-progress-navigation-bar)
|
45
|
+
locale project.
|
data/Rakefile
ADDED
Binary file
|
@@ -0,0 +1,342 @@
|
|
1
|
+
/*global IScroll*/
|
2
|
+
|
3
|
+
(function($) {
|
4
|
+
$.widget('pageflow.progressNavigationBar', {
|
5
|
+
_create: function() {
|
6
|
+
var overlays = this.element.find('.navigation_site_detail'),
|
7
|
+
that = this,
|
8
|
+
hasHomeButton = !!this.element.find('.navigation_home').length;
|
9
|
+
|
10
|
+
this.element.addClass('js').append(overlays);
|
11
|
+
|
12
|
+
$('a.navigation_top', this.element).topButton();
|
13
|
+
|
14
|
+
$('.navigation_bar_bottom', this.element)
|
15
|
+
.append($('.navigation_bar_top > li', this.element).slice(hasHomeButton ? 4 : 3));
|
16
|
+
|
17
|
+
|
18
|
+
/* open menu magic */
|
19
|
+
var checkingForMouseDelta = false,
|
20
|
+
lastPosition,
|
21
|
+
openBarTimeout,
|
22
|
+
closeBarTimeout,
|
23
|
+
measuringDistance = 600,
|
24
|
+
recentPosition;
|
25
|
+
|
26
|
+
$('body').on('mousemove', function(e) {
|
27
|
+
recentPosition = e.pageX;
|
28
|
+
var measuredDistance = that.element.offset().left - e.pageX;
|
29
|
+
if(measuredDistance < measuringDistance && !checkingForMouseDelta && measuredDistance > 0) {
|
30
|
+
checkingForMouseDelta = true;
|
31
|
+
lastPosition = e.pageX;
|
32
|
+
|
33
|
+
closeBarTimeout = setTimeout(function() {
|
34
|
+
that.element.removeClass('hover');
|
35
|
+
checkingForMouseDelta = false;
|
36
|
+
}, 2000);
|
37
|
+
|
38
|
+
openBarTimeout = setTimeout(function() {
|
39
|
+
if(recentPosition - lastPosition > 100 * (measuredDistance / measuringDistance) + 10) {
|
40
|
+
that.element.addClass('hover');
|
41
|
+
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
checkingForMouseDelta = false;
|
45
|
+
clearTimeout(closeBarTimeout);
|
46
|
+
}
|
47
|
+
},50);
|
48
|
+
}
|
49
|
+
});
|
50
|
+
|
51
|
+
pageflow.slides.on('slideshowchangepage', function() {
|
52
|
+
that.element.addClass('show_on_mobile');
|
53
|
+
setTimeout(function() {
|
54
|
+
that.element.removeClass('show_on_mobile');
|
55
|
+
}, 1000);
|
56
|
+
});
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
that.element.on('mouseenter', function() { that.element.addClass('hover'); clearTimeout(closeBarTimeout);});
|
61
|
+
that.element.on('mousemove', function() { clearTimeout(closeBarTimeout); });
|
62
|
+
that.element.on('mouseleave', function() { that.element.removeClass('hover'); checkingForMouseDelta = false; });
|
63
|
+
|
64
|
+
|
65
|
+
/* keyboard / skiplinks */
|
66
|
+
|
67
|
+
that.element.find('a, *[tabindex]').on('blur', function() {
|
68
|
+
that.element.removeClass('focus');
|
69
|
+
});
|
70
|
+
|
71
|
+
that.element.find('a, *[tabindex]').on('focus', function() {
|
72
|
+
that.element.addClass('focus');
|
73
|
+
});
|
74
|
+
|
75
|
+
/*that.element.on('mousemove', function() {
|
76
|
+
clearTimeout(closeBarTimeout);
|
77
|
+
closeBarTimeout = setTimeout(function() {
|
78
|
+
that.element.removeClass('hover');
|
79
|
+
}, 500);
|
80
|
+
});*/
|
81
|
+
|
82
|
+
/* Volume */
|
83
|
+
|
84
|
+
var handlingVolume = false;
|
85
|
+
var volumeBeforeMute = 1;
|
86
|
+
var muteButton = $('.navigation_bg.navigation_mute', that.element);
|
87
|
+
var changeVolume = function(event) {
|
88
|
+
var volume = 1 - (event.pageY - $('.volume-slider', that.element).offset().top) / $(('.volume-slider')).height();
|
89
|
+
if (volume > 1) { volume = 1; }
|
90
|
+
if (volume < 0) { volume = 0; }
|
91
|
+
setVolume(volume);
|
92
|
+
};
|
93
|
+
|
94
|
+
var setVolume = function(volume) {
|
95
|
+
$('.volume-level', that.element).css({height: volume * 100 + "%"});
|
96
|
+
pageflow.settings.set('volume', volume);
|
97
|
+
|
98
|
+
if (volume === 0) {
|
99
|
+
muteButton
|
100
|
+
.attr('title', muteButton.attr('data-muted-title'))
|
101
|
+
.addClass('muted');
|
102
|
+
}
|
103
|
+
else {
|
104
|
+
muteButton
|
105
|
+
.attr('title', muteButton.attr('data-not-muted-title'))
|
106
|
+
.removeClass('muted');
|
107
|
+
}
|
108
|
+
};
|
109
|
+
|
110
|
+
var toggleMute = function () {
|
111
|
+
if (pageflow.settings.get('volume') > 0) {
|
112
|
+
volumeBeforeMute = pageflow.settings.get('volume');
|
113
|
+
setVolume(0);
|
114
|
+
}
|
115
|
+
else {
|
116
|
+
setVolume(volumeBeforeMute);
|
117
|
+
}
|
118
|
+
};
|
119
|
+
|
120
|
+
muteButton.on("click", function() {
|
121
|
+
toggleMute();
|
122
|
+
});
|
123
|
+
|
124
|
+
$('.volume-level', this.element).css({
|
125
|
+
height: pageflow.settings.get("volume") * 100 + "%"
|
126
|
+
});
|
127
|
+
|
128
|
+
$('.navigation_volume_box', this.element).on("mousedown", function(event) {
|
129
|
+
handlingVolume = true;
|
130
|
+
changeVolume(event);
|
131
|
+
});
|
132
|
+
|
133
|
+
$('.navigation_volume_box', this.element).on("mousemove", function(event) {
|
134
|
+
if(handlingVolume) {
|
135
|
+
changeVolume(event);
|
136
|
+
}
|
137
|
+
});
|
138
|
+
|
139
|
+
setVolume(pageflow.settings.get('volume'));
|
140
|
+
|
141
|
+
/* hide buttons on mobile devices */
|
142
|
+
if (pageflow.features.has('mobile platform')) {
|
143
|
+
that.element.find('.navigation_butten_area').hide();
|
144
|
+
|
145
|
+
}
|
146
|
+
|
147
|
+
/* header button */
|
148
|
+
$('.navigation_main', this.element).click(function() {
|
149
|
+
$(this)
|
150
|
+
.toggleClass('active')
|
151
|
+
.updateTitle();
|
152
|
+
$('.header').toggleClass('active');
|
153
|
+
that.element.toggleClass('header_active');
|
154
|
+
});
|
155
|
+
|
156
|
+
/* open header through skiplinks */
|
157
|
+
$('a[href="#header"], a[href="#search"]', '#skipLinks').click(function() {
|
158
|
+
$('.navigation_main', that.element).addClass('active');
|
159
|
+
$('.header').addClass('active');
|
160
|
+
$(this.getAttribute('href')).select();
|
161
|
+
});
|
162
|
+
|
163
|
+
/* share-button */
|
164
|
+
$('.navigation_menu .navigation_menu_box a', this.element).focus(function() {
|
165
|
+
$(this).parent().parent().addClass('focused');
|
166
|
+
}).blur(function() {
|
167
|
+
$(this).parent().parent().removeClass('focused');
|
168
|
+
});
|
169
|
+
|
170
|
+
var shareBox = $('.navigation_share_box', this.element),
|
171
|
+
links = $('> a', shareBox);
|
172
|
+
shareBox.shareMenu({
|
173
|
+
subMenu: $('.sub_share', shareBox),
|
174
|
+
links: links,
|
175
|
+
insertAfter: links.last(),
|
176
|
+
closeOnMouseLeaving: shareBox
|
177
|
+
});
|
178
|
+
|
179
|
+
/* pages */
|
180
|
+
var pageLinks = $('.navigation_dots a', that.element),
|
181
|
+
target;
|
182
|
+
|
183
|
+
function registerHandler() {
|
184
|
+
target = $(this);
|
185
|
+
target.one('mouseup touchend', goToPage);
|
186
|
+
}
|
187
|
+
|
188
|
+
function removeHandler() {
|
189
|
+
pageLinks.off('mouseup touchend', goToPage);
|
190
|
+
}
|
191
|
+
|
192
|
+
function closeOverview() {
|
193
|
+
$('.overview').removeClass("active");
|
194
|
+
$('.navigation_index', that.element).removeClass("active");
|
195
|
+
}
|
196
|
+
|
197
|
+
function hideOverlay() {
|
198
|
+
$(overlays).addClass('hidden').removeClass('visible');
|
199
|
+
}
|
200
|
+
|
201
|
+
function goToPage(e) {
|
202
|
+
if (target && target[0] != e.currentTarget) {
|
203
|
+
return;
|
204
|
+
}
|
205
|
+
hideOverlay();
|
206
|
+
closeOverview();
|
207
|
+
$('.page .content, .scroll_indicator').removeClass('hidden');
|
208
|
+
pageflow.slides.goToById(this.getAttribute("data-link"));
|
209
|
+
e.preventDefault();
|
210
|
+
}
|
211
|
+
|
212
|
+
pageLinks.each(function(index) {
|
213
|
+
var handlerIn = function() {
|
214
|
+
if (!('ontouchstart' in document.documentElement)) {
|
215
|
+
var calculatedOffset = $(this).offset().top + $(overlays[index]).outerHeight() > $('.progress_navigation_bar').height() ? $('.progress_navigation_bar').height() - $(overlays[index]).outerHeight() : $(this).offset().top;
|
216
|
+
$(overlays[index]).css("top", calculatedOffset).addClass('visible').removeClass('hidden');
|
217
|
+
}
|
218
|
+
};
|
219
|
+
|
220
|
+
$(this).on({
|
221
|
+
'mouseenter focus': handlerIn,
|
222
|
+
'mouseleave blur': hideOverlay,
|
223
|
+
'mousedown touchstart': registerHandler,
|
224
|
+
'click': goToPage
|
225
|
+
});
|
226
|
+
});
|
227
|
+
|
228
|
+
var resizeDots = function() {
|
229
|
+
var pageDotsMaxHeight = 20,
|
230
|
+
pageDotsMinHeight = 1,
|
231
|
+
maxBarHeight = $('#outer_wrapper').height() ? $('#outer_wrapper').height() : $('main').height(),
|
232
|
+
wantedHeight = maxBarHeight / pageLinks.length,
|
233
|
+
appliedHeight = pageDotsMinHeight;
|
234
|
+
|
235
|
+
|
236
|
+
if(wantedHeight <= pageDotsMaxHeight && wantedHeight > pageDotsMinHeight) {
|
237
|
+
appliedHeight = wantedHeight;
|
238
|
+
}
|
239
|
+
else if(wantedHeight > pageDotsMinHeight) {
|
240
|
+
appliedHeight = pageDotsMaxHeight;
|
241
|
+
}
|
242
|
+
|
243
|
+
$('.navigation_dots > li').css('height', appliedHeight + 'px');
|
244
|
+
};
|
245
|
+
|
246
|
+
resizeDots();
|
247
|
+
|
248
|
+
$(window).on('resize', function () {
|
249
|
+
$(overlays).css("top","0");
|
250
|
+
resizeDots();
|
251
|
+
});
|
252
|
+
|
253
|
+
$('.scroller', this.element).each(function () {
|
254
|
+
var scrollerOptions = {
|
255
|
+
mouseWheel: true,
|
256
|
+
bounce : false,
|
257
|
+
probeType : 2
|
258
|
+
};
|
259
|
+
|
260
|
+
/*
|
261
|
+
This is just a quick fix to detect IE10. We should
|
262
|
+
refactor this condition if we decide to use Modernizr
|
263
|
+
or another more global detection.
|
264
|
+
*/
|
265
|
+
if (window.navigator.msPointerEnabled) {
|
266
|
+
scrollerOptions.preventDefault = false;
|
267
|
+
}
|
268
|
+
|
269
|
+
var scroller = new IScroll(this, scrollerOptions);
|
270
|
+
|
271
|
+
$('ul.navigation_dots', that.element).pageNavigationList({
|
272
|
+
scroller: scroller,
|
273
|
+
scrollToActive: true
|
274
|
+
});
|
275
|
+
|
276
|
+
});
|
277
|
+
|
278
|
+
/* hide text button */
|
279
|
+
var hideText = $('.navigation_hide_text', this.element);
|
280
|
+
|
281
|
+
hideText.click(function() {
|
282
|
+
pageflow.hideText.toggle();
|
283
|
+
});
|
284
|
+
|
285
|
+
pageflow.hideText.on('activate deactivate', function() {
|
286
|
+
hideText.toggleClass('active', pageflow.hideText.isActive()).updateTitle();
|
287
|
+
});
|
288
|
+
|
289
|
+
/* fullscreen button */
|
290
|
+
if ($.support.fullscreen) {
|
291
|
+
var fs = $('.navigation_fullscreen', this.element),
|
292
|
+
fullscreenCallback = function(isFullScreen) {
|
293
|
+
fs
|
294
|
+
.toggleClass('active', !!isFullScreen)
|
295
|
+
.updateTitle();
|
296
|
+
};
|
297
|
+
|
298
|
+
fs.click(function() {
|
299
|
+
fs.toggleClass('fs').updateTitle();
|
300
|
+
$('#outer_wrapper').fullScreen({'callback': fullscreenCallback});
|
301
|
+
});
|
302
|
+
}
|
303
|
+
else {
|
304
|
+
$('.navigation_bar_bottom .fullscreen a', this.element).css('visibility', 'hidden');
|
305
|
+
}
|
306
|
+
|
307
|
+
$('.button, .navigation_mute, .scroll_indicator', this.element).on({
|
308
|
+
'touchstart mousedown': function() {
|
309
|
+
$(this).parent().addClass('pressed');
|
310
|
+
},
|
311
|
+
'touchend mouseup': function() {
|
312
|
+
$(this).parent().removeClass('pressed');
|
313
|
+
}
|
314
|
+
});
|
315
|
+
|
316
|
+
$('.navigation_share, .navigation_credits', this.element).on({
|
317
|
+
'touchstart': function() {
|
318
|
+
var element = $(this).parent().parent();
|
319
|
+
element.addClass('open');
|
320
|
+
|
321
|
+
function close(e) {
|
322
|
+
if (!element.find(e.target).length) {
|
323
|
+
element.removeClass('open');
|
324
|
+
$('body').off('touchstart', close);
|
325
|
+
}
|
326
|
+
}
|
327
|
+
$('body').on('touchstart', close);
|
328
|
+
}
|
329
|
+
});
|
330
|
+
|
331
|
+
$('li', this.element).on('mouseleave', function() {
|
332
|
+
$(this).blur();
|
333
|
+
});
|
334
|
+
|
335
|
+
$('body').on({
|
336
|
+
'mouseup': function() {
|
337
|
+
handlingVolume = false;
|
338
|
+
}
|
339
|
+
});
|
340
|
+
}
|
341
|
+
});
|
342
|
+
}(jQuery));
|