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.

185 lines
4.9 KiB

/* jshint jquery: true */
/* eslint-env jquery */
/* global FingerBlast: true */
$(function () {
'use strict';
var doc;
var device;
var windowWidth;
var windowHeight;
var navComponentLinks;
var componentsList;
var contentSection;
var currentActive;
var topCache;
var win;
var bod;
var eventListeners;
var toolbarToggle;
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');
contentSection = $('.component');
topCache = contentSection.map(function () { return $(this).offset().top; });
windowHeight = $(window).height() / 3;
windowWidth = $(window).width();
toolbarToggle = $('.js-docs-component-toolbar');
// Device placement
if (windowWidth >= 768 && device.offset()) {
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();
// exit if no device
if (!device.length) {
return;
}
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', '');
}
function updateContent(content) {
$('#iwindow').html(content);
}
// 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 .language-html').text());
}
break;
}
}
};
// 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 () {
if (window.FingerBlast) {
new FingerBlast('.device-content');
}
});
});