mirror of https://github.com/status-im/timbre.git
113 lines
3.4 KiB
JavaScript
113 lines
3.4 KiB
JavaScript
function visibleInParent(element) {
|
|
var position = $(element).position().top
|
|
return position > -50 && position < ($(element).offsetParent().height() - 50)
|
|
}
|
|
|
|
function hasFragment(link, fragment) {
|
|
return $(link).attr("href").indexOf("#" + fragment) != -1
|
|
}
|
|
|
|
function findLinkByFragment(elements, fragment) {
|
|
return $(elements).filter(function(i, e) { return hasFragment(e, fragment)}).first()
|
|
}
|
|
|
|
function scrollToCurrentVarLink(elements) {
|
|
var elements = $(elements);
|
|
var parent = elements.offsetParent();
|
|
|
|
if (elements.length == 0) return;
|
|
|
|
var top = elements.first().position().top;
|
|
var bottom = elements.last().position().top + elements.last().height();
|
|
|
|
if (top >= 0 && bottom <= parent.height()) return;
|
|
|
|
if (top < 0) {
|
|
parent.scrollTop(parent.scrollTop() + top);
|
|
}
|
|
else if (bottom > parent.height()) {
|
|
parent.scrollTop(parent.scrollTop() + bottom - parent.height());
|
|
}
|
|
}
|
|
|
|
function setCurrentVarLink() {
|
|
$('.secondary a').parent().removeClass('current')
|
|
$('.anchor').
|
|
filter(function(index) { return visibleInParent(this) }).
|
|
each(function(index, element) {
|
|
findLinkByFragment(".secondary a", element.id).
|
|
parent().
|
|
addClass('current')
|
|
});
|
|
scrollToCurrentVarLink('.secondary .current');
|
|
}
|
|
|
|
var hasStorage = (function() { try { return localStorage.getItem } catch(e) {} }())
|
|
|
|
function scrollPositionId(element) {
|
|
var directory = window.location.href.replace(/[^\/]+\.html$/, '')
|
|
return 'scroll::' + $(element).attr('id') + '::' + directory
|
|
}
|
|
|
|
function storeScrollPosition(element) {
|
|
if (!hasStorage) return;
|
|
localStorage.setItem(scrollPositionId(element) + "::x", $(element).scrollLeft())
|
|
localStorage.setItem(scrollPositionId(element) + "::y", $(element).scrollTop())
|
|
}
|
|
|
|
function recallScrollPosition(element) {
|
|
if (!hasStorage) return;
|
|
$(element).scrollLeft(localStorage.getItem(scrollPositionId(element) + "::x"))
|
|
$(element).scrollTop(localStorage.getItem(scrollPositionId(element) + "::y"))
|
|
}
|
|
|
|
function persistScrollPosition(element) {
|
|
recallScrollPosition(element)
|
|
$(element).scroll(function() { storeScrollPosition(element) })
|
|
}
|
|
|
|
function sidebarContentWidth(element) {
|
|
var widths = $(element).find('.inner').map(function() { return $(this).innerWidth() })
|
|
return Math.max.apply(Math, widths)
|
|
}
|
|
|
|
function calculateSize(width, snap, margin, minimum) {
|
|
if (width == 0) {
|
|
return 0
|
|
}
|
|
else {
|
|
return Math.max(minimum, (Math.ceil(width / snap) * snap) + (margin * 2))
|
|
}
|
|
}
|
|
|
|
function resizeSidebars() {
|
|
var primaryWidth = sidebarContentWidth('.primary')
|
|
var secondaryWidth = 0
|
|
|
|
if ($('.secondary').length != 0) {
|
|
secondaryWidth = sidebarContentWidth('.secondary')
|
|
}
|
|
|
|
// snap to grid
|
|
primaryWidth = calculateSize(primaryWidth, 32, 13, 160)
|
|
secondaryWidth = calculateSize(secondaryWidth, 32, 13, 160)
|
|
|
|
$('.primary').css('width', primaryWidth)
|
|
$('.secondary').css('width', secondaryWidth).css('left', primaryWidth + 1)
|
|
|
|
if (secondaryWidth > 0) {
|
|
$('#content').css('left', primaryWidth + secondaryWidth + 2)
|
|
}
|
|
else {
|
|
$('#content').css('left', primaryWidth + 1)
|
|
}
|
|
}
|
|
|
|
$(window).ready(resizeSidebars)
|
|
$(window).ready(setCurrentVarLink)
|
|
$(window).ready(function() { persistScrollPosition('.primary')})
|
|
$(window).ready(function() {
|
|
$('#content').scroll(setCurrentVarLink)
|
|
$(window).resize(setCurrentVarLink)
|
|
})
|