ff-dashboard
Version:
Flimflam dashboard component comprised of a main panel and two side panels
44 lines (38 loc) • 1.2 kB
JavaScript
import R from 'ramda'
import h from 'snabbdom/h'
module.exports = (state, body, dir) => {
let isLeft = dir === 'left'
let style = {
transition: `${dir} ${state.transition}, visibility ${state.transition}`
, visibility: state.displayPanel$() === dir ? 'visible' : 'hidden'
}
const attrs = {}
attrs[`data-ff-dashboard-${dir}-panel`] = ''
return h('div', {
style
, attrs
, hook: {
insert: vnode => {
setWidth(state, isLeft)(vnode.elm)
window.addEventListener('resize', ev => setWidth(state, isLeft)(vnode.elm))
}
, update: vnode => {
let elm = vnode.elm
elm.style[dir] = (dir === state.displayPanel$() ? 0 : `-${elm.offsetWidth}px`)
}
}
}
, [ h('div'
, {attrs: { 'data-ff-dashboard-panel-body' : ''}}
, [body])]
)
}
const setWidth = (state, isLeft) => panel => {
let parentWidth = panel.parentElement.offsetWidth
let width = isLeft ? state.leftPanelWidth : state.rightPanelWidth
let offset = isLeft ? state.leftPanelOffset : state.rightPanelOffset
let remainder = parentWidth - offset
panel.style.width = parentWidth >= width + offset
? width + 'px'
: remainder + 'px'
}