mirror of https://github.com/twbs/ratchet.git
Build mobile apps with simple HTML, CSS, and JS components.
http://goratchet.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.9 KiB
173 lines
4.9 KiB
11 years ago
|
$(function() {
|
||
|
|
||
|
var doc;
|
||
|
var device;
|
||
|
var platformToggle;
|
||
|
var windowWidth;
|
||
|
var windowHeight;
|
||
|
var pageHeight;
|
||
|
var contentPadding;
|
||
|
var footerHeight;
|
||
|
var navComponentLinks;
|
||
|
var componentsList;
|
||
|
var contentSection;
|
||
|
var currentActive;
|
||
|
var topCache;
|
||
|
var eventListeners;
|
||
|
var toolbarToggle;
|
||
|
var toggleTop;
|
||
|
var toggleHeight;
|
||
|
|
||
|
|
||
|
var initialize = function () {
|
||
|
currentActive = 0;
|
||
|
topCache = [];
|
||
|
win = $(window);
|
||
|
doc = $(document);
|
||
|
bod = $(document.body)
|
||
|
device = device || $('.js-device');
|
||
|
navComponentLinks = $('.js-jump-menu');
|
||
|
componentsList = $('.js-component-group');
|
||
|
componentLinks = $('.component-example a');
|
||
|
contentSection = $('.component');
|
||
|
topCache = contentSection.map(function () { return $(this).offset().top })
|
||
|
windowHeight = $(window).height() / 3
|
||
|
windowWidth = $(window).width();
|
||
|
pageHeight = $(document).height();
|
||
|
contentPadding = parseInt($('.docs-content').css('padding-bottom'));
|
||
|
footerHeight = $('.docs-footer').outerHeight(false);
|
||
|
toolbarToggle = $('.js-docs-component-toolbar');
|
||
|
|
||
|
// Device placement
|
||
|
if (windowWidth >= 768) {
|
||
|
device.initialLeft = device.offset().left;
|
||
|
device.initialTop = device.initialTop || device.offset().top;
|
||
|
device.dockingOffset = ($(window).height() - device.height())/2;
|
||
|
}
|
||
|
|
||
|
checkDesktopContent();
|
||
|
calculateScroll();
|
||
|
calculateToggle();
|
||
|
|
||
|
if (!eventListeners) addEventListeners();
|
||
|
}
|
||
|
|
||
|
var addEventListeners = function () {
|
||
|
eventListeners = true;
|
||
|
|
||
|
device.on('click', function (e) {
|
||
|
e.preventDefault();
|
||
|
});
|
||
|
|
||
|
// Mobile navigation
|
||
|
$('.js-docs-nav-trigger').on('click', function () {
|
||
|
var nav = $('.docs-nav-group');
|
||
|
var trigger = $('.js-docs-nav-trigger');
|
||
|
|
||
|
trigger.toggleClass('active');
|
||
|
nav.toggleClass('active');
|
||
|
});
|
||
|
|
||
|
navComponentLinks.click(function(e) {
|
||
|
e.stopPropagation();
|
||
|
e.preventDefault();
|
||
|
componentsList.toggleClass('active');
|
||
|
})
|
||
|
|
||
|
doc.on('click', function () {
|
||
|
componentsList.removeClass('active');
|
||
|
})
|
||
|
|
||
|
// Platform switcher
|
||
|
$('.platform-switch').on('click', function () {
|
||
|
var components = $('.docs-components');
|
||
|
var platform = $(this).attr('data-platform');
|
||
|
|
||
|
// Set platform
|
||
|
if (components.hasClass('platform-ios')) {
|
||
|
components.removeClass('platform-ios');
|
||
|
components.addClass(platform);
|
||
|
} else if (components.hasClass('platform-android')) {
|
||
|
components.removeClass('platform-android');
|
||
|
components.addClass(platform);
|
||
|
} else {
|
||
|
components.addClass(platform);
|
||
|
}
|
||
|
|
||
|
// Deal with active states
|
||
|
$(this).siblings('.active').removeClass('active');
|
||
|
$(this).addClass('active');
|
||
|
});
|
||
|
|
||
|
win.on('scroll', calculateScroll);
|
||
|
win.on('scroll', calculateToggle);
|
||
|
}
|
||
|
|
||
|
var checkDesktopContent = function () {
|
||
|
windowWidth = $(window).width();
|
||
|
if (windowWidth <= 768) {
|
||
|
var content = $('.content')
|
||
|
if (content.length > 1) {
|
||
|
$(content[0]).remove()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var calculateScroll = function() {
|
||
|
// if small screen don't worry about this
|
||
|
if (windowWidth <= 768) return
|
||
|
|
||
|
// Save scrollTop value
|
||
|
var contentSectionItem;
|
||
|
var currentTop = win.scrollTop();
|
||
|
|
||
|
if((device.initialTop - currentTop) <= device.dockingOffset) {
|
||
|
device[0].className = "device device-fixed";
|
||
|
device.css({top: device.dockingOffset})
|
||
|
} else {
|
||
|
device[0].className = "device"
|
||
|
device[0].setAttribute('style','')
|
||
|
}
|
||
|
|
||
|
// Injection of components into device
|
||
|
for (var l = contentSection.length; l--;) {
|
||
|
if ((topCache[l] - currentTop) < windowHeight) {
|
||
|
if (currentActive == l) return;
|
||
|
currentActive = l;
|
||
|
bod.find('.component.active').removeClass('active');
|
||
|
contentSectionItem = $(contentSection[l])
|
||
|
contentSectionItem.addClass('active')
|
||
|
if(contentSectionItem.attr('id')) {
|
||
|
device.attr("id", contentSectionItem.attr('id') + "InDevice");
|
||
|
} else {
|
||
|
device.attr("id", "")
|
||
|
}
|
||
|
if (!contentSectionItem.hasClass('informational')) {
|
||
|
updateContent(contentSectionItem.find('.highlight .html').text())
|
||
|
}
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function updateContent(content) {
|
||
|
$('#iwindow').html(content);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Toolbar toggle
|
||
|
var calculateToggle = function () {
|
||
|
var currentTop = win.scrollTop();
|
||
|
var headerHeight = $('.docs-sub-header').outerHeight();
|
||
|
|
||
|
if(currentTop >= headerHeight) {
|
||
|
toolbarToggle.addClass('visible');
|
||
|
} else if (currentTop <= headerHeight) {
|
||
|
toolbarToggle.removeClass('visible');
|
||
|
componentsList.removeClass('active');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$(window).on('load resize', initialize);
|
||
|
$(window).on('load', function () { new FingerBlast('.device-content'); });
|
||
|
});
|