Commit d542ac6edb25eb991a692944332bd33016e0ce22
add menu
mix irving committed on 4/1/2017, 12:26:35 PMParent: 4c68eb0d5b9492c23ab5b49977560d7c3361d4f1
Files changed
about/html/edit.js | changed |
main/html/app.js | changed |
main/html/hypertabs.mcss | changed |
main/html/menu.js | added |
main/html/menu.mcss | added |
router/html/page/notifications.js | changed |
router/html/page/private.js | changed |
router/html/page/profile.js | changed |
router/html/page/public.js | changed |
router/html/page/search.js | changed |
about/html/edit.js | ||
---|---|---|
@@ -92,10 +92,10 @@ | ||
92 | 92 | h('img', { src: avatarSrc }) |
93 | 93 | ]), |
94 | 94 | h('footer', displayedName) |
95 | 95 | ]), |
96 | - h('section.description', computed(api.about.obs.description(id), (descr)=>{ | |
97 | - if (descr == null) return "" // TODO: should be in patchcore, I think... | |
96 | + h('section.description', computed(api.about.obs.description(id), (descr) => { | |
97 | + if (descr == null) return '' // TODO: should be in patchcore, I think... | |
98 | 98 | return api.message.html.markdown(descr) |
99 | 99 | })), |
100 | 100 | h('section.aliases', [ |
101 | 101 | h('header', 'Aliases'), |
main/html/app.js | ||
---|---|---|
@@ -12,8 +12,9 @@ | ||
12 | 12 | }, |
13 | 13 | html: { |
14 | 14 | error: 'first', |
15 | 15 | externalConfirm: 'first', |
16 | + menu: 'first', | |
16 | 17 | search: 'first' |
17 | 18 | }, |
18 | 19 | sync: { |
19 | 20 | catchKeyboardShortcut: 'first' |
@@ -29,18 +30,21 @@ | ||
29 | 30 | function app () { |
30 | 31 | const css = values(api.styles.css()).join('\n') |
31 | 32 | insertCss(css) |
32 | 33 | |
33 | - const search = api.main.html.search((path, change) => { | |
34 | + const handleSelection = (path, change) => { | |
34 | 35 | if (tabs.has(path)) { |
35 | 36 | tabs.select(path) |
36 | 37 | return true |
37 | 38 | } |
38 | 39 | |
39 | 40 | addPage(path, true, false) |
40 | 41 | return change |
41 | - }) | |
42 | - const tabs = Tabs(onSelect, { append: h('div.navExtra', [ search ]) }) | |
42 | + } | |
43 | + const search = api.main.html.search(handleSelection) | |
44 | + const menu = api.main.html.menu(handleSelection) | |
45 | + | |
46 | + const tabs = Tabs(onSelect, { append: h('div.navExtra', [ search, menu ]) }) | |
43 | 47 | function onSelect (indexes) { |
44 | 48 | search.input.value = tabs.get(indexes[0]).content.id |
45 | 49 | } |
46 | 50 |
main/html/hypertabs.mcss | ||
---|---|---|
@@ -72,9 +72,9 @@ | ||
72 | 72 | } |
73 | 73 | |
74 | 74 | } |
75 | 75 | |
76 | - div.extra { | |
76 | + div.navExtra { | |
77 | 77 | display: flex |
78 | 78 | align-items: center |
79 | 79 | } |
80 | 80 | } |
main/html/menu.js | ||
---|---|---|
@@ -1,0 +1,23 @@ | ||
1 | +const nest = require('depnest') | |
2 | +const { h, Value } = require('mutant') | |
3 | + | |
4 | +exports.gives = nest('main.html.menu') | |
5 | + | |
6 | +exports.needs = nest('router.html.simpleRoute', 'map') | |
7 | + | |
8 | +exports.create = function (api) { | |
9 | + return nest('main.html.menu', menu) | |
10 | + | |
11 | + function menu (handleClick) { | |
12 | + var state = Value('') | |
13 | + | |
14 | + return h('Menu', { | |
15 | + classList: [ state ], | |
16 | + 'ev-mouseover': () => state.set('-active'), | |
17 | + 'ev-mouseout': () => state.set('') | |
18 | + }, [ | |
19 | + h('div', api.router.html.simpleRoute(handleClick)) | |
20 | + ]) | |
21 | + } | |
22 | +} | |
23 | + |
main/html/menu.mcss | ||
---|---|---|
@@ -1,0 +1,29 @@ | ||
1 | +Menu { | |
2 | + background-color: #0088cc | |
3 | + width: 1rem | |
4 | + height: 1rem | |
5 | + | |
6 | + div { | |
7 | + display: none | |
8 | + | |
9 | + position: absolute | |
10 | + top: .5em | |
11 | + right: 0 | |
12 | + padding-top: .5em | |
13 | + padding-bottom: .5em | |
14 | + padding-right: 1em | |
15 | + padding-left: 1em | |
16 | + background: #f5f5f5 | |
17 | + border: 1px solid #eee | |
18 | + z-index: 5 | |
19 | + | |
20 | + } | |
21 | + | |
22 | + -active { | |
23 | + div { | |
24 | + display: flex | |
25 | + flex-direction: column | |
26 | + } | |
27 | + } | |
28 | +} | |
29 | + |
router/html/page/notifications.js | ||
---|---|---|
@@ -1,10 +1,17 @@ | ||
1 | 1 | const nest = require('depnest') |
2 | +const { h } = require('mutant') | |
2 | 3 | const pull = require('pull-stream') |
3 | 4 | const Scroller = require('pull-scroll') |
4 | 5 | const next = require('../../../junk/next-stepper') |
5 | 6 | |
6 | -exports.gives = nest('router.html.page') | |
7 | +exports.gives = nest({ | |
8 | + 'router.html': { | |
9 | + page: true, | |
10 | + simpleRoute: true | |
11 | + } | |
12 | +}) | |
13 | + | |
7 | 14 | exports.needs = nest({ |
8 | 15 | 'feed.pull': { |
9 | 16 | mentions: 'first', |
10 | 17 | public: 'first' |
@@ -12,11 +19,28 @@ | ||
12 | 19 | 'keys.sync.id': 'first', |
13 | 20 | 'main.html.scroller': 'first', |
14 | 21 | 'message.html.render': 'first' |
15 | 22 | }) |
23 | + | |
16 | 24 | exports.create = function (api) { |
17 | - return nest('router.html.page', (path) => { | |
18 | - if (path !== '/notifications') return | |
25 | + const route = '/notifications' | |
26 | + | |
27 | + return nest({ | |
28 | + 'router.html': { | |
29 | + page: notificationsPage, | |
30 | + simpleRoute: menuItem | |
31 | + } | |
32 | + }) | |
33 | + | |
34 | + function menuItem (handleClick) { | |
35 | + return h('a', { | |
36 | + style: { order: 3 }, | |
37 | + 'ev-click': () => handleClick(route) | |
38 | + }, route) | |
39 | + } | |
40 | + | |
41 | + function notificationsPage (path) { | |
42 | + if (path !== route) return | |
19 | 43 | const id = api.keys.sync.id() |
20 | 44 | const mentions = api.feed.pull.mentions(id) |
21 | 45 | |
22 | 46 | const { container, content } = api.main.html.scroller({}) |
@@ -30,7 +54,7 @@ | ||
30 | 54 | next(mentions, {reverse: true, limit: 100, live: false}), |
31 | 55 | Scroller(container, content, api.message.html.render, false, false) |
32 | 56 | ) |
33 | 57 | return container |
34 | - }) | |
58 | + } | |
35 | 59 | } |
36 | 60 |
router/html/page/private.js | ||
---|---|---|
@@ -1,11 +1,17 @@ | ||
1 | 1 | const nest = require('depnest') |
2 | +const { h } = require('mutant') | |
2 | 3 | const pull = require('pull-stream') |
3 | 4 | const Scroller = require('pull-scroll') |
4 | 5 | const next = require('../../../junk/next-stepper') |
5 | 6 | const ref = require('ssb-ref') |
6 | 7 | |
7 | -exports.gives = nest('router.html.page') | |
8 | +exports.gives = nest({ | |
9 | + 'router.html': { | |
10 | + page: true, | |
11 | + simpleRoute: true | |
12 | + } | |
13 | +}) | |
8 | 14 | |
9 | 15 | exports.needs = nest({ |
10 | 16 | 'feed.pull.private': 'first', |
11 | 17 | 'keys.sync.id': 'first', |
@@ -16,12 +22,26 @@ | ||
16 | 22 | } |
17 | 23 | }) |
18 | 24 | |
19 | 25 | exports.create = function (api) { |
20 | - return nest('router.html.page', privatePage) | |
26 | + const route = '/private' | |
21 | 27 | |
28 | + return nest({ | |
29 | + 'router.html': { | |
30 | + page: privatePage, | |
31 | + simpleRoute: menuItem | |
32 | + } | |
33 | + }) | |
34 | + | |
35 | + function menuItem (handleClick) { | |
36 | + return h('a', { | |
37 | + style: { order: 2 }, | |
38 | + 'ev-click': () => handleClick(route) | |
39 | + }, route) | |
40 | + } | |
41 | + | |
22 | 42 | function privatePage (path) { |
23 | - if (path !== '/private') return | |
43 | + if (path !== route) return | |
24 | 44 | |
25 | 45 | const id = api.keys.sync.id() |
26 | 46 | |
27 | 47 | const composer = api.message.html.compose({ |
router/html/page/profile.js | ||
---|---|---|
@@ -5,21 +5,18 @@ | ||
5 | 5 | const { h, watch } = require('mutant') |
6 | 6 | const next = require('../../../junk/next-stepper') |
7 | 7 | |
8 | 8 | exports.gives = nest({ |
9 | - 'router.html.page': true | |
9 | + 'router.html': { | |
10 | + page: true, | |
11 | + simpleRoute: true | |
12 | + } | |
10 | 13 | }) |
11 | -// menu_items | |
12 | 14 | |
13 | 15 | exports.needs = nest({ |
14 | 16 | 'about.html.edit': 'first', |
15 | 17 | 'about.obs': { |
16 | 18 | 'name': 'first' |
17 | - // 'description': 'first', | |
18 | - // 'image': 'first', | |
19 | - // 'imageUrl', | |
20 | - // 'names', | |
21 | - // 'images', | |
22 | 19 | }, |
23 | 20 | 'contact.html.relationships': 'first', |
24 | 21 | 'keys.sync.id': 'first', |
25 | 22 | 'main.html.scroller': 'first', |
@@ -28,16 +25,22 @@ | ||
28 | 25 | }) |
29 | 26 | |
30 | 27 | exports.create = function (api) { |
31 | 28 | return nest({ |
32 | - 'router.html.page': page | |
29 | + 'router.html': { | |
30 | + page: profilePage, | |
31 | + simpleRoute: menuItem | |
32 | + } | |
33 | 33 | }) |
34 | - // menu_items: () => h('a', { | |
35 | - // href: '#'+self_id, | |
36 | - // style: { order: 1 } | |
37 | - // }, '/profile') | |
38 | 34 | |
39 | - function page (id) { | |
35 | + function menuItem (handleClick) { | |
36 | + return h('a', { | |
37 | + style: { order: 0 }, | |
38 | + 'ev-click': () => handleClick(api.keys.sync.id()) | |
39 | + }, '/profile') | |
40 | + } | |
41 | + | |
42 | + function profilePage (id) { | |
40 | 43 | if (!ref.isFeed(id)) return |
41 | 44 | |
42 | 45 | const profile = h('Profile', [ |
43 | 46 | h('section.edit', api.about.html.edit(id)), |
router/html/page/public.js | ||
---|---|---|
@@ -1,10 +1,16 @@ | ||
1 | 1 | const nest = require('depnest') |
2 | +const { h } = require('mutant') | |
2 | 3 | const pull = require('pull-stream') |
3 | 4 | const Scroller = require('pull-scroll') |
4 | 5 | const next = require('../../../junk/next-stepper') |
5 | 6 | |
6 | -exports.gives = nest('router.html.page') | |
7 | +exports.gives = nest({ | |
8 | + 'router.html': { | |
9 | + page: true, | |
10 | + simpleRoute: true | |
11 | + } | |
12 | +}) | |
7 | 13 | |
8 | 14 | exports.needs = nest({ |
9 | 15 | 'feed.pull.public': 'first', |
10 | 16 | 'message.html': { |
@@ -14,12 +20,26 @@ | ||
14 | 20 | 'main.html.scroller': 'first' |
15 | 21 | }) |
16 | 22 | |
17 | 23 | exports.create = function (api) { |
18 | - return nest('router.html.page', publicPage) | |
24 | + const route = '/public' | |
19 | 25 | |
26 | + return nest({ | |
27 | + 'router.html': { | |
28 | + page: publicPage, | |
29 | + simpleRoute: menuItem | |
30 | + } | |
31 | + }) | |
32 | + | |
33 | + function menuItem (handleClick) { | |
34 | + return h('a', { | |
35 | + style: { order: 1 }, | |
36 | + 'ev-click': () => handleClick(route) | |
37 | + }, route) | |
38 | + } | |
39 | + | |
20 | 40 | function publicPage (path) { |
21 | - if (path !== '/public') return | |
41 | + if (path !== route) return | |
22 | 42 | |
23 | 43 | const composer = api.message.html.compose({ |
24 | 44 | meta: { type: 'post' }, |
25 | 45 | placeholder: 'Write a public message' |
router/html/page/search.js | ||
---|---|---|
@@ -132,9 +132,9 @@ | ||
132 | 132 | } else if (/^no source/.test(err.message)) { |
133 | 133 | search.isLinear.set(true) |
134 | 134 | return pull( |
135 | 135 | next(api.sbot_log, {reverse: true, limit: 500, live: false}), |
136 | - pull.through(() => search.linear.checked.set(search.linear.checked()+1)), | |
136 | + pull.through(() => search.linear.checked.set(search.linear.checked() + 1)), | |
137 | 137 | pull.filter(matchesQuery) |
138 | 138 | ) |
139 | 139 | } |
140 | 140 | }), |
Built with git-ssb-web