diff options
Diffstat (limited to 'public/gallery.js')
-rw-r--r-- | public/gallery.js | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/public/gallery.js b/public/gallery.js index 940b0d2..bf73c84 100644 --- a/public/gallery.js +++ b/public/gallery.js @@ -53,6 +53,44 @@ let BrowseModel = { }, } +let BrowseLink = { + view(vnode) { + const link = vnode.attrs.link + + let c = 'selected' + if (link.level < 0) + c = 'parent' + if (link.level > 0) + c = 'child' + + return m('li', { + class: c, + }, m(m.route.Link, { + href: `/browse/:key`, + params: {key: link.path}, + }, link.name)) + }, +} + +let BrowseView = { + // So that Page Up/Down, etc., work after changing directories. + // Programmatically focusing a scrollable element requires setting tabindex, + // and causes :focus-visible on page load, which we suppress in CSS. + // I wish there was another way, but the workaround isn't particularly bad. + // focus({focusVisible: true}) is FF 104+ only and experimental. + oncreate(vnode) { vnode.dom.focus() }, + + view(vnode) { + return m('.browser[tabindex=0]', { + key: BrowseModel.path, + }, BrowseModel.entries.map(e => { + return m(m.route.Link, {href: `/view/${e.sha1}`}, + m('img', {src: `/thumb/${e.sha1}`, + width: e.thumbW, height: e.thumbH, title: e.name})) + })) + }, +} + let Browse = { // Reload the model immediately, to improve responsivity. // But we don't need to: https://mithril.js.org/route.html#preloading-data @@ -64,20 +102,12 @@ let Browse = { view(vnode) { return m('.container', {}, [ - m('.header', {}, "Browse"), - m('ul', BrowseModel.getBrowseLinks().map(link => { - // TODO: Differentiate the level as CSS classes. - // - Last entry (current path) should look selected. - return m('li', m(m.route.Link, { - href: `/browse/:key`, - params: {key: link.path}, - }, `${link.level} ${link.name}`)) - })), - m('.browser', {}, BrowseModel.entries.map(e => { - return m(m.route.Link, {href: `/view/${e.sha1}`}, - m('img', {src: `/thumb/${e.sha1}`, - width: e.thumbW, height: e.thumbH, title: e.name})) - })), + m('.header', {}, "Browser"), + m('.body', {}, [ + m('ul.sidebar', BrowseModel.getBrowseLinks().map(link => + m(BrowseLink, {link}))), + m(BrowseView), + ]), ]) }, } @@ -105,11 +135,12 @@ let View = { }, view(vnode) { - return m('.container', {}, [ - m('.header', {}, "View"), + const view = m('.view', [ ViewModel.sha1 !== undefined ? m('img', {src: `/image/${ViewModel.sha1}`}) : "No image.", + ]) + const viewbar = m('.viewbar', [ m('h2', "Locations"), m('ul', ViewModel.paths.map(sd => m('li', sd))), m('h2', "Tags"), @@ -119,6 +150,13 @@ let View = { ([tag, weight]) => m("li", `${tag}: ${weight}`))), ]), ]) + return m('.container', {}, [ + m('.header', {}, "View"), + m('.body', {}, [ + view, + viewbar, + ]), + ]) }, } |