git ssb

16+

Dominic / patchbay



Tree: ee289a19dca6fefc3c9308225b6c429fdeb79ad6

Files: ee289a19dca6fefc3c9308225b6c429fdeb79ad6 / app / html / scroller.js

1750 bytesRaw
1const nest = require('depnest')
2const { h } = require('mutant')
3
4exports.gives = nest('app.html.scroller')
5
6exports.create = function (api) {
7 return nest('app.html.scroller', Scroller)
8
9 function Scroller (opts = {}) {
10 const { prepend = [], content = null, append = [], classList = [], className = '', title = '' } = opts
11
12 const contentSection = h('section.content', { title: '' }, content)
13
14 const container = h('Scroller',
15 { classList, className, title, style: { 'overflow-y': 'scroll', 'overflow-x': 'auto' } },
16 [
17 h('section.top', prepend),
18 contentSection,
19 h('section.bottom', append)
20 ]
21 )
22
23 container.scroll = keyscroll(contentSection)
24
25 return {
26 content: contentSection,
27 container
28 }
29 }
30}
31
32function keyscroll (content) {
33 var curMsgEl
34
35 if (!content) return () => {}
36
37 content.addEventListener('click', onActivateChild, false)
38 content.addEventListener('focus', onActivateChild, true)
39
40 function onActivateChild (ev) {
41 for (var el = ev.target; el; el = el.parentNode) {
42 if (el.parentNode === content) {
43 curMsgEl = el
44 return
45 }
46 }
47 }
48
49 return function scroll (d) {
50 const child = (!curMsgEl || d === 'first') ? content.firstChild
51 : (!curMsgEl || d === 'last') ? content.lastChild
52 : d < 0 ? curMsgEl.previousElementSibling || content.firstChild
53 : d > 0 ? curMsgEl.nextElementSibling || content.lastChild
54 : curMsgEl
55 selectChild(child)
56
57 return curMsgEl
58 }
59
60 function selectChild (el) {
61 if (!el) { return }
62
63 if (!el.scrollIntoViewIfNeeded && !el.scrollIntoView) return
64 ;(el.scrollIntoViewIfNeeded || el.scrollIntoView).call(el)
65 el.focus()
66 curMsgEl = el
67 }
68}
69

Built with git-ssb-web