aboutsummaryrefslogtreecommitdiff
path: root/public/gallery.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/gallery.js')
-rw-r--r--public/gallery.js70
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,
+ ]),
+ ])
},
}