class app.views.SidebarHover extends app.View @itemClass: '_list-hover' @events: focus: 'onFocus' blur: 'onBlur' mouseover: 'onMouseover' mouseout: 'onMouseout' scroll: 'onScroll' click: 'onClick' @routes: after: 'onRoute' constructor: (@el) -> unless isPointerEventsSupported() delete @constructor.events.mouseover super init: -> @offsetTop = @el.offsetTop return show: (el) -> unless el is @cursor @hide() if @isTarget(el) and @isTruncated(el.lastElementChild or el) @cursor = el @clone = @makeClone @cursor $.append document.body, @clone @position() return hide: -> if @cursor $.remove @clone @cursor = @clone = null return position: => if @cursor rect = $.rect(@cursor) if rect.top >= @offsetTop @clone.style.top = rect.top + 'px' @clone.style.left = rect.left + 'px' else @hide() return makeClone: (el) -> clone = el.cloneNode(true) clone.classList.add 'clone' clone isTarget: (el) -> el?.classList?.contains @constructor.itemClass isSelected: (el) -> el.classList.contains 'active' isTruncated: (el) -> el.scrollWidth > el.offsetWidth onFocus: (event) => @focusTime = Date.now() @show event.target return onBlur: => @hide() return onMouseover: (event) => if @isTarget(event.target) and not @isSelected(event.target) and @mouseActivated() @show event.target return onMouseout: (event) => if @isTarget(event.target) and @mouseActivated() @hide() return mouseActivated: -> # Skip mouse events caused by focus events scrolling the sidebar. not @focusTime or Date.now() - @focusTime > 500 onScroll: => @position() return onClick: (event) => if event.target is @clone $.click @cursor return onRoute: => @hide() return isPointerEventsSupported = -> el = document.createElement 'div' el.style.cssText = 'pointer-events: auto' el.style.pointerEvents is 'auto'