Commit 560b4eeaebdc81616f23b3384a8c6ac9c0126e09
merge
Dominic Tarr committed on 12/6/2016, 3:20:44 PMParent: 3a059da9a5018fb341af69ba26f2bf1a59c0005c
Parent: 86745d2ae3eb9733681d16c4e9cfabeeef30b588
Files changed
README.md | changed |
modules_basic/compose.js | changed |
modules_basic/follow.js | changed |
modules_basic/index.js | changed |
modules_basic/invite.js | changed |
modules_basic/like.js | changed |
modules_basic/markdown.js | changed |
modules_basic/message-name.js | changed |
modules_basic/message.js | changed |
modules_basic/names.js | changed |
modules_basic/private.js | changed |
modules_basic/public.js | changed |
modules_basic/search-box.js | changed |
modules_basic/suggest-mentions.js | changed |
modules_basic/thread.js | changed |
modules_basic/timestamp.js | changed |
modules_basic/pub.js | added |
modules_core/tabs.js | changed |
modules_extra/channel.js | changed |
modules_extra/git.js | changed |
modules_extra/index.js | changed |
modules_extra/network.js | changed |
modules_extra/notifications.js | changed |
modules_extra/query.js | changed |
modules_extra/versions.js | changed |
modules_extra/dns.js | added |
modules_extra/emoji.js | added |
modules_extra/git-ssb.js | added |
modules_extra/suggest-emoji.js | added |
package.json | changed |
plugs.js | changed |
style.css | changed |
README.md | ||
---|---|---|
@@ -33,11 +33,11 @@ | ||
33 | 33 … | ``` |
34 | 34 … | git clone https://github.com/dominictarr/patchbay.git |
35 | 35 … | cd patchbay |
36 | 36 … | npm install |
37 | -npm install electro electron-prebuilt -g | |
38 | -npm run build | |
39 | -electro index.js | |
37 … | +npm run rebuild | |
38 … | +npm run bundle | |
39 … | +npm start | |
40 | 40 … | ``` |
41 | 41 … | |
42 | 42 … | ## how to add a feature |
43 | 43 … |
modules_basic/compose.js | ||
---|---|---|
@@ -1,22 +1,19 @@ | ||
1 | 1 … | |
2 | 2 … | var h = require('hyperscript') |
3 | 3 … | var u = require('../util') |
4 | 4 … | var suggest = require('suggest-box') |
5 | -var cont = require('cont') | |
6 | 5 … | var mentions = require('ssb-mentions') |
7 | 6 … | var lightbox = require('hyperlightbox') |
8 | 7 … | |
9 | 8 … | var plugs = require('../plugs') |
10 | 9 … | |
11 | -//var suggest = plugs.map(exports.suggest = []) | |
10 … | +var suggest_mentions= plugs.asyncConcat(exports.suggest_mentions = []) | |
12 | 11 … | var publish = plugs.first(exports.sbot_publish = []) |
13 | 12 … | var message_content = plugs.first(exports.message_content = []) |
14 | 13 … | var message_confirm = plugs.first(exports.message_confirm = []) |
15 | 14 … | var file_input = plugs.first(exports.file_input = []) |
16 | 15 … | |
17 | -exports.suggest = [] | |
18 | - | |
19 | 16 … | function id (e) { return e } |
20 | 17 … | |
21 | 18 … | /* |
22 | 19 … | opts can take |
@@ -125,26 +122,11 @@ | ||
125 | 122 … | publishBtn) |
126 | 123 … | ) |
127 | 124 … | ) |
128 | 125 … | |
129 | - suggest(ta, function (word, cb) { | |
130 | - cont.para(exports.suggest.map(function (fn) { | |
131 | - return function (cb) { fn(word, cb) } | |
132 | - })) | |
133 | - (function (err, results) { | |
134 | - if(err) console.error(err) | |
135 | - results = results.reduce(function (ary, item) { | |
136 | - return ary.concat(item) | |
137 | - }, []).sort(function (a, b) { | |
138 | - return b.rank - a.rank | |
139 | - }).filter(Boolean) | |
126 … | + suggest(ta, suggest_mentions, {}) | |
140 | 127 … | |
141 | - cb(null, results) | |
142 | - }) | |
143 | - }, {}) | |
144 | - | |
145 | 128 … | return composer |
146 | 129 … | |
147 | 130 … | } |
148 | 131 … | |
149 | 132 … | |
150 | - |
modules_basic/follow.js | ||
---|---|---|
@@ -52,9 +52,9 @@ | ||
52 | 52 … | update() |
53 | 53 … | }) |
54 | 54 … | |
55 | 55 … | var state = h('label') |
56 | - var label = h('label') | |
56 … | + var label = h('span') | |
57 | 57 … | |
58 | 58 … | function update () { |
59 | 59 … | state.textContent = ( |
60 | 60 … | follows_you && you_follow ? 'friend' |
@@ -71,10 +71,12 @@ | ||
71 | 71 … | message_confirm({ |
72 | 72 … | type: 'contact', |
73 | 73 … | contact: id, |
74 | 74 … | following: !you_follow |
75 | - }, function (err) { | |
76 | - //TODO: update after following. | |
75 … | + }, function (err, msg) { | |
76 … | + if (err) return console.error(err) | |
77 … | + you_follow = msg.value.content.following | |
78 … | + update() | |
77 | 79 … | }) |
78 | 80 … | }}, h('br'), label) |
79 | 81 … | ) |
80 | 82 … | } |
modules_basic/index.js | ||
---|---|---|
@@ -17,8 +17,9 @@ | ||
17 | 17 … | "message.js": require('./message.js'), |
18 | 18 … | "names.js": require('./names.js'), |
19 | 19 … | "post.js": require('./post.js'), |
20 | 20 … | "private.js": require('./private.js'), |
21 … | + "pub.js": require('./pub.js'), | |
21 | 22 … | "public.js": require('./public.js'), |
22 | 23 … | "relationships.js": require('./relationships.js'), |
23 | 24 … | "search-box.js": require('./search-box.js'), |
24 | 25 … | "setup.js": require('./setup'), |
modules_basic/invite.js | ||
---|---|---|
@@ -92,9 +92,9 @@ | ||
92 | 92 … | |
93 | 93 … | //TODO: handle in a consistent way with either hashrouting |
94 | 94 … | //or with tabs... |
95 | 95 … | if(parts[0] === data.invite) |
96 | - location.hash = data.redirect | |
96 … | + location.hash = '' | |
97 | 97 … | else |
98 | 98 … | console.log("NO REDIRECT") |
99 | 99 … | }) |
100 | 100 … | } |
modules_basic/like.js | ||
---|---|---|
@@ -14,9 +14,9 @@ | ||
14 | 14 … | exports.message_content_mini = function (msg, sbot) { |
15 | 15 … | if(msg.value.content.type !== 'vote') return |
16 | 16 … | var link = msg.value.content.vote.link |
17 | 17 … | return [ |
18 | - msg.value.content.vote.value > 0 ? 'Dug' : 'Undug', | |
18 … | + msg.value.content.vote.value > 0 ? 'dug' : 'undug', | |
19 | 19 … | ' ', message_link(link) |
20 | 20 … | ] |
21 | 21 … | } |
22 | 22 … |
modules_basic/markdown.js | ||
---|---|---|
@@ -1,10 +1,21 @@ | ||
1 | 1 … | var markdown = require('ssb-markdown') |
2 | 2 … | var h = require('hyperscript') |
3 | 3 … | var ref = require('ssb-ref') |
4 | 4 … | |
5 | -var blob_url = require('../plugs').first(exports.blob_url = []) | |
5 … | +var plugs = require('../plugs') | |
6 … | +var blob_url = plugs.first(exports.blob_url = []) | |
7 … | +var emoji_url = plugs.first(exports.emoji_url = []) | |
6 | 8 … | |
9 … | +function renderEmoji(emoji) { | |
10 … | + var url = emoji_url(emoji) | |
11 … | + if (!url) return ':' + emoji + ':' | |
12 … | + return '<img src="' + encodeURI(url) + '"' | |
13 … | + + ' alt=":' + escape(emoji) + ':"' | |
14 … | + + ' title=":' + escape(emoji) + ':"' | |
15 … | + + ' class="emoji">' | |
16 … | +} | |
17 … | + | |
7 | 18 … | exports.markdown = function (content) { |
8 | 19 … | if('string' === typeof content) |
9 | 20 … | content = {text: content} |
10 | 21 … | //handle patchwork style mentions. |
@@ -15,8 +26,9 @@ | ||
15 | 26 … | }) |
16 | 27 … | |
17 | 28 … | var md = h('div.markdown') |
18 | 29 … | md.innerHTML = markdown.block(content.text, { |
30 … | + emoji: renderEmoji, | |
19 | 31 … | toUrl: function (id) { |
20 | 32 … | if(ref.isBlob(id)) return blob_url(id) |
21 | 33 … | return '#'+(mentions[id]?mentions[id]:id) |
22 | 34 … | } |
modules_basic/message-name.js | ||
---|---|---|
@@ -1,10 +1,10 @@ | ||
1 | 1 … | |
2 | 2 … | var sbot_get = require('../plugs').first(exports.sbot_get = []) |
3 | 3 … | |
4 | 4 … | function title (s) { |
5 | - var m = /^[^\n]{0,40}/.exec(s) | |
6 | - return m && (m[0].length == 40 ? m[0]+'...' : m[0]) | |
5 … | + var m = /^\n*([^\n]{0,40})/.exec(s) | |
6 … | + return m && (m[1].length == 40 ? m[1]+'...' : m[1]) | |
7 | 7 … | } |
8 | 8 … | |
9 | 9 … | exports.message_name = function (id, cb) { |
10 | 10 … | sbot_get(id, function (err, value) { |
modules_basic/message.js | ||
---|---|---|
@@ -13,26 +13,31 @@ | ||
13 | 13 … | var message_link = plugs.first(exports.message_link = []) |
14 | 14 … | |
15 | 15 … | var sbot_links = plugs.first(exports.sbot_links = []) |
16 | 16 … | |
17 | -exports.message_render = function (msg, sbot) { | |
18 | - var elMini = message_content_mini(msg) | |
19 | - if (elMini) { | |
20 | - var div = h('div.message.message--mini', | |
21 | - h('div.row', | |
22 | - h('div', | |
23 | - avatar_link(msg.value.author, avatar_name(msg.value.author), ''), | |
24 | - ' ', | |
25 | - h('span.message_content', elMini)), | |
26 | - h('div.message_meta.row', message_meta(msg)) | |
27 | - ) | |
17 … | +function mini(msg, el) { | |
18 … | + var div = h('div.message.message--mini', | |
19 … | + h('div.row', | |
20 … | + h('div', | |
21 … | + avatar_link(msg.value.author, avatar_name(msg.value.author)), | |
22 … | + h('span.message_content', el)), | |
23 … | + h('div.message_meta.row', message_meta(msg)) | |
28 | 24 … | ) |
29 | - div.setAttribute('tabindex', '0') | |
30 | - return div | |
31 | - } | |
25 … | + ) | |
26 … | + div.setAttribute('tabindex', '0') | |
27 … | + return div | |
28 … | +} | |
32 | 29 … | |
30 … | +function message_content_mini_fallback(msg) { | |
31 … | + return h('code', msg.value.content.type) | |
32 … | +} | |
33 … | + | |
34 … | +exports.message_render = function (msg, sbot) { | |
35 … | + var el = message_content_mini(msg) | |
36 … | + if(el) return mini(msg, el) | |
37 … | + | |
33 | 38 … | var el = message_content(msg) |
34 | - if(!el) return | |
39 … | + if(!el) return mini(msg, message_content_mini_fallback(msg)) | |
35 | 40 … | |
36 | 41 … | var links = [] |
37 | 42 … | for(var k in CACHE) { |
38 | 43 … | var _msg = CACHE[k] |
modules_basic/names.js | ||
---|---|---|
@@ -91,14 +91,33 @@ | ||
91 | 91 … | }) |
92 | 92 … | ) |
93 | 93 … | } |
94 | 94 … | |
95 … | +var queryNamedGitRepos = [ | |
96 … | + {$filter: { | |
97 … | + value: { | |
98 … | + content: { | |
99 … | + type: "git-repo", | |
100 … | + name: {"$prefix": ""} | |
101 … | + } | |
102 … | + } | |
103 … | + }}, | |
104 … | + {$map: { | |
105 … | + name: ["value", "content", "name"], | |
106 … | + id: ['key'], | |
107 … | + ts: "timestamp" | |
108 … | + }}, | |
109 … | + reduce | |
110 … | +] | |
111 … | + | |
112 … | + | |
95 | 113 … | exports.connection_status = function (err) { |
96 | 114 … | if(!err) { |
97 | 115 … | pull( |
98 | 116 … | many([ |
99 | 117 … | sbot_links2({query: [filter, map, reduce]}), |
100 | - add_sigil(sbot_query({query: [filter2, map2, reduce]})) | |
118 … | + add_sigil(sbot_query({query: [filter2, map2, reduce]})), | |
119 … | + add_sigil(sbot_query({query: queryNamedGitRepos})) | |
101 | 120 … | ]), |
102 | 121 … | //reducing also ensures order by the lookup properties |
103 | 122 … | //in this case: [name, id] |
104 | 123 … | mfr.reduce(merge), |
@@ -112,9 +131,10 @@ | ||
112 | 131 … | ) |
113 | 132 … | |
114 | 133 … | pull(many([ |
115 | 134 … | sbot_links2({query: [filter, map], old: false}), |
116 | - add_sigil(sbot_query({query: [filter2, map2], old: false})) | |
135 … | + add_sigil(sbot_query({query: [filter2, map2], old: false})), | |
136 … | + add_sigil(sbot_query({query: queryNamedGitRepos, old: false})) | |
117 | 137 … | ]), |
118 | 138 … | pull.drain(update)) |
119 | 139 … | } |
120 | 140 … | } |
modules_basic/private.js | ||
---|---|---|
@@ -11,8 +11,9 @@ | ||
11 | 11 … | var message_unbox = plugs.first(exports.message_unbox = []) |
12 | 12 … | var sbot_log = plugs.first(exports.sbot_log = []) |
13 | 13 … | var sbot_whoami = plugs.first(exports.sbot_whoami = []) |
14 | 14 … | var avatar_image_link = plugs.first(exports.avatar_image_link = []) |
15 … | +var emoji_url = plugs.first(exports.emoji_url = []) | |
15 | 16 … | |
16 | 17 … | function unbox () { |
17 | 18 … | return pull( |
18 | 19 … | pull.filter(function (msg) { |
@@ -24,8 +25,12 @@ | ||
24 | 25 … | pull.filter(Boolean) |
25 | 26 … | ) |
26 | 27 … | } |
27 | 28 … | |
29 … | +exports.builtin_tabs = function () { | |
30 … | + return ['/private'] | |
31 … | +} | |
32 … | + | |
28 | 33 … | exports.screen_view = function (path) { |
29 | 34 … | if(path !== '/private') return |
30 | 35 … | |
31 | 36 … | var div = h('div.column.scroller', |
@@ -86,5 +91,15 @@ | ||
86 | 91 … | return avatar_image_link('string' == typeof id ? id : id.link, 'thumbnail') |
87 | 92 … | })) |
88 | 93 … | } |
89 | 94 … | |
95 … | +exports.message_content_mini = function (msg, sbot) { | |
96 … | + if (typeof msg.value.content === 'string') { | |
97 … | + var icon = emoji_url('lock') | |
98 … | + return icon | |
99 … | + ? h('img', {className: 'emoji', src: icon}) | |
100 … | + : 'PRIVATE' | |
101 … | + } | |
102 … | +} | |
90 | 103 … | |
104 … | + | |
105 … | + |
modules_basic/public.js | ||
---|---|---|
@@ -7,8 +7,12 @@ | ||
7 | 7 … | var message_render = plugs.first(exports.message_render = []) |
8 | 8 … | var message_compose = plugs.first(exports.message_compose = []) |
9 | 9 … | var sbot_log = plugs.first(exports.sbot_log = []) |
10 | 10 … | |
11 … | +exports.builtin_tabs = function () { | |
12 … | + return ['/public'] | |
13 … | +} | |
14 … | + | |
11 | 15 … | exports.screen_view = function (path, sbot) { |
12 | 16 … | if(path === '/public') { |
13 | 17 … | |
14 | 18 … | var content = h('div.column.scroller__content') |
@@ -33,25 +37,4 @@ | ||
33 | 37 … | return div |
34 | 38 … | } |
35 | 39 … | } |
36 | 40 … | |
37 | - | |
38 | - | |
39 | - | |
40 | - | |
41 | - | |
42 | - | |
43 | - | |
44 | - | |
45 | - | |
46 | - | |
47 | - | |
48 | - | |
49 | - | |
50 | - | |
51 | - | |
52 | - | |
53 | - | |
54 | - | |
55 | - | |
56 | - | |
57 | - |
modules_basic/search-box.js | ||
---|---|---|
@@ -3,30 +3,19 @@ | ||
3 | 3 … | var pull = require('pull-stream') |
4 | 4 … | var plugs = require('../plugs') |
5 | 5 … | var sbot_query = plugs.first(exports.sbot_query = []) |
6 | 6 … | var sbot_links2 = plugs.first(exports.sbot_links2 = []) |
7 … | +var suggest_search = plugs.asyncConcat(exports.suggest_search = []) | |
7 | 8 … | |
8 | 9 … | var channels = [] |
9 | 10 … | |
10 | -var signified = require('../plugs').first(exports.signified = []) | |
11 | 11 … | |
12 | -//TODO: this list should be generated from plugs | |
13 | -var builtinTabs = [ | |
14 | - '/public', '/private', '/notifications', | |
15 | - '/network', '/query', '/versions' | |
16 | -].map(function (name) { | |
17 | - return { | |
18 | - title: name, | |
19 | - value: name, | |
20 | - } | |
21 | -}) | |
22 | - | |
23 | 12 … | exports.search_box = function (go) { |
24 | 13 … | |
25 | 14 … | var suggestBox |
26 | 15 … | var search = h('input.searchprompt', { |
27 | 16 … | type: 'search', |
28 | - placeholder: '?word, @key, #channel', | |
17 … | + placeholder: 'Commands', | |
29 | 18 … | onkeydown: function (ev) { |
30 | 19 … | switch (ev.keyCode) { |
31 | 20 … | case 13: // enter |
32 | 21 … | if (suggestBox && suggestBox.active) { |
@@ -58,55 +47,9 @@ | ||
58 | 47 … | var suggestions = {} |
59 | 48 … | |
60 | 49 … | // delay until the element has a parent |
61 | 50 … | setTimeout(function () { |
62 | - suggestBox = suggest(search, function (word, cb) { | |
63 | - if(/^#\w/.test(word)) | |
64 | - cb(null, channels.filter(function (chan) { | |
65 | - return ('#'+chan.name).substring(0, word.length) === word | |
66 | - }) | |
67 | - .map(function (chan) { | |
68 | - var name = '#'+chan.name | |
69 | - return { | |
70 | - title: name, | |
71 | - value: name, | |
72 | - subtitle: chan.rank | |
73 | - } | |
74 | - })) | |
75 | - else if(/^[@%]\w/.test(word)) { | |
76 | - signified(word, function (_, names) { | |
77 | - cb(null, names.map(function (e) { | |
78 | - return { | |
79 | - title: e.name + ':'+e.id.substring(0, 10), | |
80 | - value: e.id, | |
81 | - subtitle: e.rank | |
82 | - } | |
83 | - })) | |
84 | - }) | |
85 | - } else if(/^\//.test(word)) { | |
86 | - cb(null, builtinTabs.filter(function (name) { | |
87 | - return name.value.substr(0, word.length) === word | |
88 | - })) | |
89 | - } | |
90 | - }, {}) | |
51 … | + suggestBox = suggest(search, suggest_search, {}) | |
91 | 52 … | }, 10) |
92 | 53 … | |
93 | - | |
94 | - pull( | |
95 | - sbot_query({query: [ | |
96 | - {$filter: {value: {content: {channel: {$gt: ''}}}}}, | |
97 | - {$reduce: { | |
98 | - name: ['value', 'content', 'channel'], | |
99 | - rank: {$count: true} | |
100 | - }} | |
101 | - ]}), | |
102 | - pull.collect(function (err, chans) { | |
103 | - if (err) return console.error(err) | |
104 | - channels = chans | |
105 | - }) | |
106 | - ) | |
107 | - | |
108 | 54 … | return search |
109 | 55 … | } |
110 | - | |
111 | - | |
112 | - |
modules_basic/suggest-mentions.js | ||
---|---|---|
@@ -1,15 +1,15 @@ | ||
1 | 1 … | var pull = require('pull-stream') |
2 | -var cont = require('cont') | |
3 | 2 … | function isImage (filename) { |
4 | 3 … | return /\.(gif|jpg|png|svg)$/i.test(filename) |
5 | 4 … | } |
6 | 5 … | |
7 | 6 … | var sbot_links2 = require('../plugs').first(exports.sbot_links2 = []) |
8 | 7 … | var blob_url = require('../plugs').first(exports.blob_url = []) |
9 | 8 … | var signified = require('../plugs').first(exports.signified = []) |
9 … | +var builtin_tabs = require('../plugs').map(exports.builtin_tabs = []) | |
10 | 10 … | |
11 | -exports.suggest = cont.to(function (word, cb) { | |
11 … | +exports.suggest_mentions = function (word, cb) { | |
12 | 12 … | if(!/^[%&@]\w/.test(word)) return cb() |
13 | 13 … | |
14 | 14 … | |
15 | 15 … | signified(word, function (err, names) { |
@@ -22,11 +22,35 @@ | ||
22 | 22 … | //TODO: avatar images... |
23 | 23 … | } |
24 | 24 … | })) |
25 | 25 … | }) |
26 | -}) | |
26 … | +} | |
27 | 27 … | |
28 … | +exports.suggest_search = function (query, cb) { | |
29 … | + if(/^[@%]\w/.test(query)) { | |
30 … | + signified(query, function (_, names) { | |
31 … | + cb(null, names.map(function (e) { | |
32 … | + return { | |
33 … | + title: e.name + ':'+e.id.substring(0, 10), | |
34 … | + value: e.id, | |
35 … | + subtitle: e.rank, | |
36 … | + rank: e.rank | |
37 … | + } | |
38 … | + })) | |
39 … | + }) | |
28 | 40 … | |
41 … | + } else if(/^\//.test(query)) { | |
42 … | + var tabs = [].concat.apply([], builtin_tabs()) | |
43 … | + cb(null, tabs.filter(function (name) { | |
44 … | + return name.substr(0, query.length) === query | |
45 … | + }).map(function (name) { | |
46 … | + return { | |
47 … | + title: name, | |
48 … | + value: name, | |
49 … | + } | |
50 … | + })) | |
51 … | + } else cb() | |
52 … | +} | |
29 | 53 … | |
30 | 54 … | |
31 | 55 … | |
32 | 56 … | |
@@ -37,4 +61,5 @@ | ||
37 | 61 … | |
38 | 62 … | |
39 | 63 … | |
40 | 64 … | |
65 … | + |
modules_basic/thread.js | ||
---|---|---|
@@ -35,8 +35,9 @@ | ||
35 | 35 … | //in this case, it's inconvienent that panel only takes |
36 | 36 … | //a stream. maybe it would be better to accept an array? |
37 | 37 … | |
38 | 38 … | sbot_get(root, function (err, value) { |
39 … | + if (err) return cb(err) | |
39 | 40 … | var msg = {key: root, value: value} |
40 | 41 … | // if(value.content.root) return getThread(value.content.root, cb) |
41 | 42 … | |
42 | 43 … | pull( |
@@ -87,8 +88,10 @@ | ||
87 | 88 … | //would probably be better keep an id for each message element |
88 | 89 … | //(i.e. message key) and then update it if necessary. |
89 | 90 … | //also, it may have moved (say, if you received a missing message) |
90 | 91 … | content.innerHTML = '' |
92 … | + if(err) return content.appendChild(h('pre', err.stack)) | |
93 … | + | |
91 | 94 … | //decrypt |
92 | 95 … | thread = thread.map(function (msg) { |
93 | 96 … | return 'string' === typeof msg.value.content ? message_unbox(msg) : msg |
94 | 97 … | }) |
modules_basic/timestamp.js | ||
---|---|---|
@@ -1,12 +1,7 @@ | ||
1 | 1 … | var h = require('hyperscript') |
2 | -var _human = require('human-time') | |
2 … | +var human = require('human-time') | |
3 | 3 … | |
4 | -function human (date) { | |
5 | - var s =_human(date).split(' ') | |
6 | - return s[0] + (s[1] == 'month' ? 'M' : s[1][0]) | |
7 | -} | |
8 | - | |
9 | 4 … | function updateTimestampEl(el) { |
10 | 5 … | el.firstChild.nodeValue = human(new Date(el.timestamp)) |
11 | 6 … | return el |
12 | 7 … | } |
@@ -16,14 +11,11 @@ | ||
16 | 11 … | els.forEach(updateTimestampEl) |
17 | 12 … | }, 60e3) |
18 | 13 … | |
19 | 14 … | exports.message_meta = function (msg) { |
20 | - var d = new Date(msg.value.timestamp) | |
21 | 15 … | return updateTimestampEl(h('a.enter.timestamp', { |
22 | 16 … | href: '#'+msg.key, |
23 | 17 … | timestamp: msg.value.timestamp, |
24 | - title: _human(d) + '\n'+d | |
18 … | + title: new Date(msg.value.timestamp) | |
25 | 19 … | }, '')) |
26 | 20 … | } |
27 | 21 … | |
28 | - | |
29 | - |
modules_basic/pub.js | ||
---|---|---|
@@ -1,0 +1,18 @@ | ||
1 … | +var h = require('hyperscript') | |
2 … | +var plugs = require('../plugs') | |
3 … | +var avatar_name = plugs.first(exports.avatar_name = []) | |
4 … | +var avatar_link = plugs.first(exports.avatar_link = []) | |
5 … | + | |
6 … | +exports.message_content = function (msg, sbot) { | |
7 … | + var c = msg.value.content | |
8 … | + if (c.type === 'pub') { | |
9 … | + var address = c.address || {} | |
10 … | + return [ | |
11 … | + h('p', 'announced an address for ', | |
12 … | + avatar_link(address.key, avatar_name(address.key)), ':'), | |
13 … | + h('blockquote', | |
14 … | + h('code', address.host + ':' + address.port) | |
15 … | + ) | |
16 … | + ] | |
17 … | + } | |
18 … | +} |
modules_core/tabs.js | ||
---|---|---|
@@ -85,8 +85,11 @@ | ||
85 | 85 … | |
86 | 86 … | ev.preventDefault() |
87 | 87 … | ev.stopPropagation() |
88 | 88 … | |
89 … | + //let the application handle this link | |
90 … | + if (link.getAttribute('href') === '#') return | |
91 … | + | |
89 | 92 … | //open external links. |
90 | 93 … | //this ought to be made into something more runcible |
91 | 94 … | if(open.isExternal(link.href)) return open(link.href) |
92 | 95 … | |
@@ -160,11 +163,12 @@ | ||
160 | 163 … | }) |
161 | 164 … | |
162 | 165 … | // errors tab |
163 | 166 … | var errorsContent = h('div.column.scroller__content') |
164 | - var errors = h('div.column.scroller', | |
165 | - {style: {'overflow':'auto'}}, | |
166 | - h('div.scroller__wrapper', | |
167 … | + var errors = h('div.column.scroller', { | |
168 … | + id: 'errors', | |
169 … | + style: {'overflow':'auto'} | |
170 … | + }, h('div.scroller__wrapper', | |
167 | 171 … | errorsContent |
168 | 172 … | ) |
169 | 173 … | ) |
170 | 174 … | |
@@ -173,10 +177,8 @@ | ||
173 | 177 … | window.removeEventListener('error', window.onError) |
174 | 178 … | delete window.onError |
175 | 179 … | } |
176 | 180 … | |
177 | - var errors = h('div.errors', {id: 'errors'}) | |
178 | - | |
179 | 181 … | // put errors in a tab |
180 | 182 … | window.addEventListener('error', function (ev) { |
181 | 183 … | var err = ev.error || ev |
182 | 184 … | if(!tabs.has('errors')) |
modules_extra/channel.js | ||
---|---|---|
@@ -7,8 +7,9 @@ | ||
7 | 7 … | var message_render = plugs.first(exports.message_render = []) |
8 | 8 … | var message_compose = plugs.first(exports.message_compose = []) |
9 | 9 … | var sbot_log = plugs.first(exports.sbot_log = []) |
10 | 10 … | var sbot_query = plugs.first(exports.sbot_query = []) |
11 … | +var mfr = require('map-filter-reduce') | |
11 | 12 … | |
12 | 13 … | exports.message_meta = function (msg) { |
13 | 14 … | var chan = msg.value.content.channel |
14 | 15 … | if (chan) |
@@ -49,4 +50,55 @@ | ||
49 | 50 … | |
50 | 51 … | return div |
51 | 52 … | } |
52 | 53 … | } |
54 … | + | |
55 … | +var channels | |
56 … | + | |
57 … | +var filter = {$filter: {value: {content: {channel: {$gt: ''}}}}} | |
58 … | +var map = {$map: {'name': ['value', 'content', 'channel']}} | |
59 … | +var reduce = {$reduce: { | |
60 … | + name: 'name', | |
61 … | + rank: {$count: true} | |
62 … | +}} | |
63 … | + | |
64 … | +exports.connection_status = function (err) { | |
65 … | + if(err) return | |
66 … | + | |
67 … | + channels = [] | |
68 … | + | |
69 … | + pull( | |
70 … | + sbot_query({query: [filter, map, reduce]}), | |
71 … | + pull.collect(function (err, chans) { | |
72 … | + if (err) return console.error(err) | |
73 … | + channels = chans.concat(channels) | |
74 … | + }) | |
75 … | + ) | |
76 … | + | |
77 … | + pull( | |
78 … | + sbot_log({old: false}), | |
79 … | + mfr.filter(filter), | |
80 … | + mfr.map(map), | |
81 … | + pull.drain(function (chan) { | |
82 … | + var c = channels.find(function (e) { | |
83 … | + return e.name === chan.name | |
84 … | + }) | |
85 … | + if (c) c.rank++ | |
86 … | + else channels.push(chan) | |
87 … | + }) | |
88 … | + ) | |
89 … | +} | |
90 … | + | |
91 … | +exports.suggest_search = function (query, cb) { | |
92 … | + if(!/^#\w/.test(query)) return cb() | |
93 … | + cb(null, channels.filter(function (chan) { | |
94 … | + return ('#'+chan.name).substring(0, query.length) === query | |
95 … | + }) | |
96 … | + .map(function (chan) { | |
97 … | + var name = '#'+chan.name | |
98 … | + return { | |
99 … | + title: name, | |
100 … | + value: name, | |
101 … | + subtitle: chan.rank | |
102 … | + } | |
103 … | + })) | |
104 … | +} |
modules_extra/git.js | ||
---|---|---|
@@ -186,12 +186,10 @@ | ||
186 | 186 … | h('div', h('a', {href: '#', onclick: function (e) { |
187 | 187 … | e.preventDefault() |
188 | 188 … | this.parentNode.replaceChild(issueForm(msg), this) |
189 | 189 … | }}, 'New Issue…')), |
190 | - h('div', h('a', {href: '#', onclick: function (e) { | |
191 | - e.preventDefault() | |
192 | - this.parentNode.replaceChild(pullRequestForm(msg), this) | |
193 | - }}, 'New Pull Request…'))) | |
190 … | + newPullRequestButton.call(this, msg) | |
191 … | + ) | |
194 | 192 … | |
195 | 193 … | pull(getRefs(msg), pull.drain(function (ref) { |
196 | 194 … | var name = ref.realname || ref.name |
197 | 195 … | var author = ref.link && ref.link.value.author |
@@ -289,9 +287,10 @@ | ||
289 | 287 … | h('code', issue.object), ' ', h('q', issue.label)) |
290 | 288 … | if (issue.open === false) |
291 | 289 … | return h('p', 'Closed ', message_link(issue.link), ' in ', |
292 | 290 … | h('code', issue.object), ' ', h('q', issue.label)) |
293 | - }) : null | |
291 … | + }) : null, | |
292 … | + newPullRequestButton.call(this, msg) | |
294 | 293 … | ] |
295 | 294 … | } |
296 | 295 … | |
297 | 296 … | if(c.type === 'issue-edit' |
@@ -382,8 +381,21 @@ | ||
382 | 381 … | })) |
383 | 382 … | }) |
384 | 383 … | } |
385 | 384 … | |
385 … | +function newPullRequestButton(msg) { | |
386 … | + return h('div', [ | |
387 … | + h('a', { | |
388 … | + href: '#', | |
389 … | + onclick: function (e) { | |
390 … | + e.preventDefault() | |
391 … | + this.parentNode.replaceChild(pullRequestForm(msg), this) | |
392 … | + }}, | |
393 … | + 'New Pull Request…' | |
394 … | + ) | |
395 … | + ]) | |
396 … | +} | |
397 … | + | |
386 | 398 … | function pullRequestForm(msg) { |
387 | 399 … | var headRepoInput |
388 | 400 … | var headBranchInput = branchMenu() |
389 | 401 … | var branchInput = branchMenu(msg) |
modules_extra/index.js | ||
---|---|---|
@@ -1,8 +1,12 @@ | ||
1 | 1 … | module.exports = { |
2 | 2 … | "audio-mp3.js": require('./audio-mp3.js'), |
3 | 3 … | "channel.js": require('./channel.js'), |
4 … | + "emoji.js": require('./emoji.js'), | |
5 … | + "suggest-emoji.js": require('./suggest-emoji.js'), | |
6 … | + "dns.js": require('./dns.js'), | |
4 | 7 … | "git.js": require('./git.js'), |
8 … | + "git-ssb.js": require('./git-ssb.js'), | |
5 | 9 … | "notifications.js": require('./notifications.js'), |
6 | 10 … | "meta-image.js": require('./meta-image.js'), |
7 | 11 … | "music-release-cc.js": require('./music-release-cc.js'), |
8 | 12 … | "music-release.js": require('./music-release.js'), |
modules_extra/network.js | ||
---|---|---|
@@ -17,8 +17,12 @@ | ||
17 | 17 … | exports.menu_items = function () { |
18 | 18 … | return h('a', {href: '#/network'}, '/network') |
19 | 19 … | } |
20 | 20 … | |
21 … | +exports.builtin_tabs = function () { | |
22 … | + return ['/network'] | |
23 … | +} | |
24 … | + | |
21 | 25 … | //types of peers |
22 | 26 … | |
23 | 27 … | |
24 | 28 … | //on the same wifi network |
modules_extra/notifications.js | ||
---|---|---|
@@ -22,8 +22,12 @@ | ||
22 | 22 … | pull.filter(Boolean) |
23 | 23 … | ) |
24 | 24 … | } |
25 | 25 … | |
26 … | +exports.builtin_tabs = function () { | |
27 … | + return ['/notifications'] | |
28 … | +} | |
29 … | + | |
26 | 30 … | function notifications(ourIds) { |
27 | 31 … | |
28 | 32 … | function linksToUs(link) { |
29 | 33 … | return link && link.link in ourIds |
modules_extra/query.js | ||
---|---|---|
@@ -7,8 +7,12 @@ | ||
7 | 7 … | exports.menu_items = function () { |
8 | 8 … | return h('a', {href:'#/query'}, '/query') |
9 | 9 … | } |
10 | 10 … | |
11 … | +exports.builtin_tabs = function () { | |
12 … | + return ['/query'] | |
13 … | +} | |
14 … | + | |
11 | 15 … | exports.screen_view = function (path) { |
12 | 16 … | if(path != '/query') return |
13 | 17 … | var output, status, editor, stream, query |
14 | 18 … |
modules_extra/versions.js | ||
---|---|---|
@@ -3,8 +3,12 @@ | ||
3 | 3 … | exports.menu_items = function () { |
4 | 4 … | return h('a', {href: '#/versions'}, '/versions') |
5 | 5 … | } |
6 | 6 … | |
7 … | +exports.builtin_tabs = function () { | |
8 … | + return ['/versions'] | |
9 … | +} | |
10 … | + | |
7 | 11 … | exports.screen_view = function (path) { |
8 | 12 … | if(path !== '/versions') return |
9 | 13 … | |
10 | 14 … | if('undefined' === typeof WebBoot) |
modules_extra/dns.js | ||
---|---|---|
@@ -1,0 +1,28 @@ | ||
1 … | +var h = require('hyperscript') | |
2 … | + | |
3 … | +function array(obj) { | |
4 … | + return !obj ? [] : Array.isArray(obj) ? obj : [obj] | |
5 … | +} | |
6 … | + | |
7 … | +function idLink(id) { | |
8 … | + return h('a', {href: '#'+id}, id.substring(0, 10)+'…') | |
9 … | +} | |
10 … | + | |
11 … | +exports.message_content = function (msg, sbot) { | |
12 … | + var c = msg.value.content | |
13 … | + | |
14 … | + if(c.type === 'ssb-dns') { | |
15 … | + var record = c.record || {} | |
16 … | + return h('div', | |
17 … | + h('p', | |
18 … | + h('ins', {title: 'name'}, record.name), ' ', | |
19 … | + h('em', {title: 'ttl'}, record.ttl), ' ', | |
20 … | + h('span', {title: 'class'}, record.class), ' ', | |
21 … | + h('span', {title: 'type'}, record.type), | |
22 … | + h('pre', {title: 'data'}, | |
23 … | + JSON.stringify(record.data || record.value, null, 2)), | |
24 … | + !c.branch ? null : h('div', h('span', | |
25 … | + 'replaces: ', array(c.branch).map(idLink))) | |
26 … | + )) | |
27 … | + } | |
28 … | +} |
modules_extra/emoji.js | ||
---|---|---|
@@ -1,0 +1,14 @@ | ||
1 … | +var emojis = require('emoji-named-characters') | |
2 … | +var emojiNames = Object.keys(emojis) | |
3 … | + | |
4 … | +var plugs = require('../plugs') | |
5 … | +var blob_url = plugs.first(exports.blob_url = []) | |
6 … | + | |
7 … | +exports.emoji_names = function () { | |
8 … | + return emojiNames | |
9 … | +} | |
10 … | + | |
11 … | +exports.emoji_url = function (emoji) { | |
12 … | + return emoji in emojis && | |
13 … | + blob_url(emoji).replace(/\/blobs\/get/, '/img/emoji') + '.png' | |
14 … | +} |
modules_extra/git-ssb.js | |||
---|---|---|---|
@@ -1,0 +1,41 @@ | |||
1 … | +var h = require('hyperscript') | ||
2 … | +var u = require('../util') | ||
3 … | +var pull = require('pull-stream') | ||
4 … | +var Scroller = require('pull-scroll') | ||
5 … | + | ||
6 … | +var plugs = require('../plugs') | ||
7 … | +var message_render = plugs.first(exports.message_render = []) | ||
8 … | +var message_compose = plugs.first(exports.message_compose = []) | ||
9 … | +var sbot_log = plugs.first(exports.sbot_log = []) | ||
10 … | + | ||
11 … | +exports.menu_items = function () { | ||
12 … | + return h('a', {href: '#/git-ssb'}, '/git-ssb') | ||
13 … | +} | ||
14 … | + | ||
15 … | +exports.screen_view = function (path, sbot) { | ||
16 … | + if(path === '/git-ssb') { | ||
17 … | + | ||
18 … | + var content = h('div.column.scroller__content') | ||
19 … | + var div = h('div.column.scroller', | ||
20 … | + {style: {'overflow':'auto'}}, | ||
21 … | + h('div.scroller__wrapper', content) | ||
22 … | + ) | ||
23 … | + | ||
24 … | + pull( | ||
25 … | + u.next(sbot_log, {old: false, limit: 100}), | ||
26 … | + Scroller(div, content, message_render, true, false) | ||
27 … | + ) | ||
28 … | + | ||
29 … | + pull( | ||
30 … | + u.next(sbot_log, {reverse: true, limit: 100, live: false}), | ||
31 … | + pull.filter(function(msg) { return msg.value.content.type }), | ||
32 … | + pull.filter(function(msg) { | ||
33 … | + return msg.value.content.type.match(/^git/) | ||
34 … | + }), | ||
35 … | + Scroller(div, content, message_render, false, false) | ||
36 … | + ) | ||
37 … | + | ||
38 … | + return div | ||
39 … | + } | ||
40 … | +} | ||
41 … | + |
modules_extra/suggest-emoji.js | ||
---|---|---|
@@ -1,0 +1,19 @@ | ||
1 … | +var plugs = require('../plugs') | |
2 … | +var emoji_url = plugs.first(exports.emoji_url = []) | |
3 … | +var emoji_names = plugs.first(exports.emoji_names = []) | |
4 … | + | |
5 … | +exports.suggest_mentions = function (word, cb) { | |
6 … | + if (word[0] !== ':' || word.length < 2) return cb() | |
7 … | + word = word.substr(1) | |
8 … | + if (word[word.length-1] === ':') word = word.substr(0, word.length-1) | |
9 … | + cb(null, emoji_names().filter(function (name) { | |
10 … | + return name.substr(0, word.length) === word | |
11 … | + }).slice(0, 50).map(function (emoji) { | |
12 … | + return { | |
13 … | + image: emoji_url(emoji), | |
14 … | + title: emoji, | |
15 … | + subtitle: emoji, | |
16 … | + value: ':' + emoji + ':' | |
17 … | + } | |
18 … | + })) | |
19 … | +} |
package.json | ||
---|---|---|
@@ -1,8 +1,8 @@ | ||
1 | 1 … | { |
2 | 2 … | "name": "patchbay", |
3 | 3 … | "description": "a pluggable patchwork", |
4 | - "version": "5.2.0", | |
4 … | + "version": "5.5.0", | |
5 | 5 … | "homepage": "https://github.com/dominictarr/patchbay", |
6 | 6 … | "repository": { |
7 | 7 … | "type": "git", |
8 | 8 … | "url": "git://github.com/dominictarr/patchbay.git" |
@@ -55,14 +55,21 @@ | ||
55 | 55 … | "text-node-searcher": "^1.1.0", |
56 | 56 … | "visualize-buffer": "0.0.0" |
57 | 57 … | }, |
58 | 58 … | "devDependencies": { |
59 | - "browselectrify": "^1.0.1" | |
59 … | + "browselectrify": "^1.0.1", | |
60 … | + "electro": "^2.0.3", | |
61 … | + "electron": "^1.4.10" | |
60 | 62 … | }, |
61 | 63 … | "scripts": { |
62 | - "build": "node scripts/style.js && mkdir -p build && browselectrify index.js > build/bundle.js", | |
64 … | + "lite": "node scripts/style.js && mkdir -p build && browserify index.js | indexhtmlify > build/index.html", | |
65 … | + "start": "electro index.js", | |
66 … | + "bundle": "node scripts/style.js && mkdir -p build && browselectrify index.js > build/bundle.js", | |
67 … | + "rebuild": "npm rebuild --runtime=electron --target=$(electron -v) --abi=$(electron --abi) --disturl=https://atom.io/download/atom-shell", | |
63 | 68 … | "graph": "node index.js | dot -Tsvg > graph.svg", |
64 | 69 … | "test": "set -e; for t in test/*.js; do node $t; done" |
65 | 70 … | }, |
66 | 71 … | "author": "Dominic Tarr <dominic.tarr@gmail.com> (http://dominictarr.com)", |
67 | 72 … | "license": "MIT" |
68 | 73 … | } |
74 … | + | |
75 … | + |
plugs.js | ||
---|---|---|
@@ -16,5 +16,25 @@ | ||
16 | 16 … | }).filter(Boolean) |
17 | 17 … | } |
18 | 18 … | } |
19 | 19 … | |
20 … | +exports.asyncConcat = function (plug) { | |
21 … | + return function () { | |
22 … | + var args = [].slice.call(arguments) | |
23 … | + var cb = args.pop() | |
24 … | + var allResults = [] | |
25 … | + var waiting = plug.length | |
26 … | + plug.forEach(function (fn) { | |
27 … | + if (!fn) return next() | |
28 … | + fn.apply(null, args.concat(next)) | |
29 … | + }) | |
30 … | + function next(err, results) { | |
31 … | + if (err) { | |
32 … | + waiting = 0 | |
33 … | + return cb(err) | |
34 … | + } | |
35 … | + if (results) allResults = allResults.concat(results) | |
36 … | + if (--waiting === 0) cb(null, allResults) | |
37 … | + } | |
38 … | + } | |
39 … | +} | |
20 | 40 … |
style.css | ||
---|---|---|
@@ -1,8 +1,19 @@ | ||
1 | 1 … | body { |
2 | 2 … | font-family: sans-serif; |
3 | 3 … | } |
4 | 4 … | |
5 … | +h1, h2, h3, h4, h5, h6, p, ul, ol { | |
6 … | + margin-top: .35em; | |
7 … | +} | |
8 … | + | |
9 … | +h1 { font-size: 1.2em; } | |
10 … | +h2 { font-size: 1.18em; } | |
11 … | +h3 { font-size: 1.15em; } | |
12 … | +h4 { font-size: 1.12em; } | |
13 … | +h5 { font-size: 1.1em; } | |
14 … | +h6 { font-size: 1em; } | |
15 … | + | |
5 | 16 … | * { |
6 | 17 … | word-break: break-word; |
7 | 18 … | } |
8 | 19 … | |
@@ -18,10 +29,10 @@ | ||
18 | 29 … | } |
19 | 30 … | |
20 | 31 … | .screen { |
21 | 32 … | position: absolute; |
22 | - top: 0px; bottom: 0px; | |
23 | - left: 0px; right: 0px; | |
33 … | + top: 0; bottom: 0; | |
34 … | + left: 0; right: 0; | |
24 | 35 … | overflow-y: hidden; |
25 | 36 … | } |
26 | 37 … | |
27 | 38 … | .column { |
@@ -98,14 +109,14 @@ | ||
98 | 109 … | } |
99 | 110 … | |
100 | 111 … | textarea { |
101 | 112 … | padding: .5em; |
113 … | + font-size: 1em; | |
102 | 114 … | } |
103 | 115 … | |
104 | 116 … | textarea:focus { |
105 | 117 … | outline: none; |
106 | 118 … | border-color: none; |
107 | - box-shadow: none; | |
108 | 119 … | } |
109 | 120 … | |
110 | 121 … | button { |
111 | 122 … | background: #fff; |
@@ -134,10 +145,10 @@ | ||
134 | 145 … | padding-right: 1em; |
135 | 146 … | padding-left: 1em; |
136 | 147 … | background: #f5f5f5; |
137 | 148 … | border: 1px solid #eee; |
138 | - box-shadow: 3px 0px 3px #ccc; | |
139 | 149 … | border-radius: .2em; |
150 … | + z-index: 5; | |
140 | 151 … | } |
141 | 152 … | |
142 | 153 … | /* scrolling feeds, threads */ |
143 | 154 … | |
@@ -157,9 +168,9 @@ | ||
157 | 168 … | .compose { |
158 | 169 … | width: 100%; |
159 | 170 … | margin-top: .5em; |
160 | 171 … | margin-bottom: .5em; |
161 | - box-shadow: #dadada 1px 2px 8px; | |
172 … | + border: 1px solid #f5f5f5; | |
162 | 173 … | } |
163 | 174 … | |
164 | 175 … | .compose button { |
165 | 176 … | float: right; |
@@ -167,36 +178,41 @@ | ||
167 | 178 … | |
168 | 179 … | /* messages */ |
169 | 180 … | |
170 | 181 … | .message { |
171 | - word-wrap: break-word; | |
172 | - margin-bottom: 1em; | |
173 | - padding: 0.3rem; | |
174 | - border-radius: 2px; | |
175 | - box-shadow: #dadada 1px 2px 8px; | |
182 … | + position: relative; | |
183 … | + flex-basis: 0; | |
184 … | + margin-top: .25em; | |
185 … | + margin-bottom: .25em; | |
186 … | + padding: .2em; | |
187 … | + border-top: 1px solid #f5f5f5; | |
188 … | + // border-bottom: 1px solid #f5f5f5; | |
176 | 189 … | background: white; |
177 | 190 … | } |
178 | 191 … | |
192 … | +.message:hover { | |
193 … | + background: #f9f9f9; | |
194 … | +} | |
195 … | + | |
179 | 196 … | .message--mini { |
180 | - margin-bottom: 1em; | |
181 | - padding: ; | |
182 | - border-radius: 0; | |
183 | - box-shadow: none; | |
197 … | + font-size: 1em; | |
198 … | + margin: 0; | |
199 … | + padding: .2em; | |
200 … | + border: none; | |
184 | 201 … | background: inherit; |
185 | 202 … | } |
186 | 203 … | |
187 | 204 … | .message_content div > span { |
188 | - font-size: 0.8rem; | |
189 | - margin-bottom: 0.7rem; | |
205 … | + font-size: 0.9em; | |
206 … | + margin-bottom: 0.7em; | |
190 | 207 … | display: block; |
191 | 208 … | color: #888; |
192 | 209 … | } |
193 | 210 … | |
194 | 211 … | .message_content--mini div > span { |
195 | 212 … | display: inline-block; |
196 | 213 … | } |
197 | 214 … | |
198 | - | |
199 | 215 … | .message_content div > span a { |
200 | 216 … | color: #005d8c; |
201 | 217 … | } |
202 | 218 … | |
@@ -212,9 +228,10 @@ | ||
212 | 228 … | margin-left: .5ex; |
213 | 229 … | } |
214 | 230 … | |
215 | 231 … | .message_actions { |
216 | - float: right; | |
232 … | + position: absolute; | |
233 … | + bottom: 0; right: 0; | |
217 | 234 … | margin-right: .5ex; |
218 | 235 … | margin-bottom: .5ex; |
219 | 236 … | } |
220 | 237 … | |
@@ -243,30 +260,46 @@ | ||
243 | 260 … | border-right: 2px solid #eee; |
244 | 261 … | padding-right: 5px; |
245 | 262 … | } |
246 | 263 … | |
264 … | +.emoji { | |
265 … | + height: 1em; | |
266 … | + width: 1em; | |
267 … | + vertical-align: top; | |
268 … | +} | |
247 | 269 … | |
270 … | + | |
248 | 271 … | /* -- suggest box */ |
249 | 272 … | |
250 | 273 … | .suggest-box > * { |
251 | 274 … | display: block; |
252 | 275 … | } |
253 | 276 … | |
254 | 277 … | .suggest-box ul { |
278 … | + padding: 0; | |
255 | 279 … | list-style-type: none; |
256 | 280 … | padding-left: 0; |
281 … | + background: #eee; | |
282 … | + border: 1px solid #eee; | |
283 … | + border-radius: 2px; | |
257 | 284 … | } |
258 | 285 … | |
259 | 286 … | .suggest-box .selected { |
260 | - background: #eee; | |
287 … | + background: white; | |
261 | 288 … | } |
262 | 289 … | |
263 | 290 … | .suggest-box { |
264 | 291 … | width: max-content; |
265 | - background: white; | |
292 … | + background: #white; | |
266 | 293 … | border-radius: 1em; |
267 | 294 … | } |
268 | 295 … | |
296 … | +/* emoji */ | |
297 … | +.suggest-box img { | |
298 … | + height: 20px; | |
299 … | + width: 20px; | |
300 … | +} | |
301 … | + | |
269 | 302 … | /* avatar */ |
270 | 303 … | |
271 | 304 … | .avatar--large, |
272 | 305 … | .avatar--thumbnail, |
@@ -281,13 +314,14 @@ | ||
281 | 314 … | |
282 | 315 … | .avatar--thumbnail { |
283 | 316 … | width: 2.5em; |
284 | 317 … | height: 2.5em; |
318 … | + float: left; | |
285 | 319 … | margin-right: .5ex; |
286 | 320 … | } |
287 | 321 … | |
288 | 322 … | .avatar--fullsize { |
289 | - width: 100%; | |
323 … | + width: 50%; | |
290 | 324 … | } |
291 | 325 … | |
292 | 326 … | .profile { |
293 | 327 … | padding: .5ex; |
@@ -314,9 +348,9 @@ | ||
314 | 348 … | margin-left: auto; |
315 | 349 … | margin-right: auto; |
316 | 350 … | border: 1px solid #eee; |
317 | 351 … | border-radius: .2em; |
318 | - box-shadow: #dadada 1px 2px 8px; | |
352 … | + z-index: 2; | |
319 | 353 … | } |
320 | 354 … | |
321 | 355 … | /* searchprompt */ |
322 | 356 … | |
@@ -374,9 +408,8 @@ | ||
374 | 408 … | |
375 | 409 … | .header { |
376 | 410 … | background: #f5f5f5; |
377 | 411 … | border-bottom: 1px inset; |
378 | - box-shadow: 3px 0px 3px #ccc; | |
379 | 412 … | flex-shrink: 0; |
380 | 413 … | } |
381 | 414 … | |
382 | 415 … | .header__tabs { |
@@ -437,12 +470,8 @@ | ||
437 | 470 … | .hypertabs--selected .hypertabs__x { |
438 | 471 … | display: block; |
439 | 472 … | } |
440 | 473 … | |
441 | -.screen { | |
442 | - background: #f5f5f5 | |
443 | -} | |
444 | - | |
445 | 474 … | /* progress bar */ |
446 | 475 … | |
447 | 476 … | .hyperprogress__bar { |
448 | 477 … | background: darkgrey; |
Built with git-ssb-web