Commit 586029e96f32a0cff461ec17d522d4877ec63fc0
merge
Dominic Tarr committed on 10/25/2016, 1:42:29 PMParent: bfe1cc1971947547bf1a8c0d9facad16ba4eb786
Parent: 0e8b5960a55bb51280320035b8d4cb1ecd883988
Files changed
modules_basic/follow.js | changed |
modules_basic/like.js | changed |
modules_basic/message-link.js | changed |
modules_basic/message-name.js | changed |
modules_basic/message.js | changed |
modules_basic/private.js | changed |
modules_basic/thread.js | changed |
modules_core/menu.js | changed |
modules_core/message-confirm.js | changed |
modules_core/tabs.js | changed |
modules_extra/git.js | changed |
modules_extra/notifications.js | changed |
modules_extra/raw.js | changed |
modules_extra/theme.js | changed |
package.json | changed |
style.css | changed |
modules_basic/follow.js | ||
---|---|---|
@@ -1,7 +1,10 @@ | ||
1 | 1 … | var h = require('hyperscript') |
2 | 2 … | var u = require('../util') |
3 | -var avatar = require('../plugs').first(exports.avatar = []) | |
3 … | +var plugs = require('../plugs') | |
4 … | +var avatar = plugs.first(exports.avatar = []) | |
5 … | +var avatar_name = plugs.first(exports.avatar_name = []) | |
6 … | +var avatar_link = plugs.first(exports.avatar_link = []) | |
4 | 7 … | var pull = require('pull-stream') |
5 | 8 … | var plugs = require('../plugs') |
6 | 9 … | |
7 | 10 … | //render a message when someone follows someone, |
@@ -9,8 +12,21 @@ | ||
9 | 12 … | function isRelated(value, name) { |
10 | 13 … | return value ? name : value === false ? 'un'+name : '' |
11 | 14 … | } |
12 | 15 … | |
16 … | +exports.message_content = | |
17 … | +exports.message_content_mini = function (msg) { | |
18 … | + var content = msg.value.content | |
19 … | + if(content.type == 'contact' && content.contact) { | |
20 … | + var relation = isRelated(content.following, 'follows') | |
21 … | + if(content.blocking) relation = 'blocks' | |
22 … | + return [ | |
23 … | + relation, ' ', | |
24 … | + avatar_link(content.contact, avatar_name(content.contact), '') | |
25 … | + ] | |
26 … | + } | |
27 … | +} | |
28 … | + | |
13 | 29 … | exports.message_content = function (msg) { |
14 | 30 … | |
15 | 31 … | var content = msg.value.content |
16 | 32 … | if(content.type == 'contact' && content.contact) { |
modules_basic/like.js | ||
---|---|---|
@@ -8,15 +8,17 @@ | ||
8 | 8 … | var message_confirm = plugs.first(exports.message_confirm = []) |
9 | 9 … | var message_link = plugs.first(exports.message_link = []) |
10 | 10 … | var sbot_links = plugs.first(exports.sbot_links = []) |
11 | 11 … | |
12 | -exports.message_content = function (msg, sbot) { | |
12 … | + | |
13 … | +exports.message_content = | |
14 … | +exports.message_content_mini = function (msg, sbot) { | |
13 | 15 … | if(msg.value.content.type !== 'vote') return |
14 | 16 … | var link = msg.value.content.vote.link |
15 | - return h('div', | |
17 … | + return [ | |
16 | 18 … | msg.value.content.vote.value > 0 ? 'Dug' : 'Undug', |
17 | 19 … | ' ', message_link(link) |
18 | - ) | |
20 … | + ] | |
19 | 21 … | } |
20 | 22 … | |
21 | 23 … | exports.message_meta = function (msg, sbot) { |
22 | 24 … | var digs = h('a') |
modules_basic/message-link.js | ||
---|---|---|
@@ -1,30 +1,33 @@ | ||
1 | 1 … | var h = require('hyperscript') |
2 … | +var ref = require('ssb-ref') | |
2 | 3 … | |
3 | -var sbot_get = require('../plugs').first(exports.sbot_get = []) | |
4 … | +var first = require('../plugs').first | |
5 … | +var sbot_get = first(exports.sbot_get = []) | |
6 … | +var message_name = first(exports.message_name = []) | |
4 | 7 … | |
5 | 8 … | exports.message_link = function (id) { |
6 | 9 … | |
7 | 10 … | if('string' !== typeof id) |
8 | 11 … | throw new Error('link must be to message id') |
9 | 12 … | |
10 | 13 … | var link = h('a', {href: '#'+id}, id.substring(0, 10)+'...') |
11 | 14 … | |
12 | - sbot_get(id, function (err, value) { | |
13 | - if(err) { | |
14 | - if (err.name == 'NotFoundError') | |
15 | - link.textContent += ' (missing)' | |
16 | - else | |
17 | - console.error(err) | |
18 | - return | |
19 | - } | |
20 | - if(value.content.text) | |
21 | - link.textContent = value.content.text.substring(0, 40)+'...' | |
22 | - }) | |
15 … | + if(ref.isMsg(id)) | |
16 … | + message_name(id, function (err, name) { | |
17 … | + if(err) console.error(err) | |
18 … | + else link.textContent = name | |
19 … | + }) | |
23 | 20 … | |
24 | 21 … | return link |
25 | 22 … | } |
26 | 23 … | |
27 | 24 … | |
28 | 25 … | |
29 | 26 … | |
30 | 27 … | |
28 … | + | |
29 … | + | |
30 … | + | |
31 … | + | |
32 … | + | |
33 … | + |
modules_basic/message-name.js | ||
---|---|---|
@@ -1,8 +1,15 @@ | ||
1 | 1 … | |
2 | 2 … | var sbot_get = require('../plugs').first(exports.sbot_get = []) |
3 | 3 … | |
4 | -exports.message_name = function (id) { | |
4 … | +exports.message_name = function (id, cb) { | |
5 | 5 … | sbot_get(id, function (err, value) { |
6 | - | |
6 … | + if(err && err.name == 'NotFoundError') | |
7 … | + return cb(null, id.substring(0, 10)+'...(missing)') | |
8 … | + if(value.content.type === 'post' && 'string' === typeof value.content.text) | |
9 … | + return cb(null, value.content.text.substring(0, 40)+'...') | |
10 … | + else if('string' === typeof value.content.text) | |
11 … | + return cb(null, value.content.type + ':'+value.content.text.substring(0, 20)) | |
12 … | + else | |
13 … | + return cb(null, id.substring(0, 10)+'...') | |
7 | 14 … | }) |
8 | 15 … | } |
modules_basic/message.js | ||
---|---|---|
@@ -1,20 +1,35 @@ | ||
1 | 1 … | var h = require('hyperscript') |
2 | 2 … | var u = require('../util') |
3 | 3 … | var pull = require('pull-stream') |
4 | 4 … | |
5 | - | |
6 | - | |
7 | 5 … | var plugs = require('../plugs') |
8 | 6 … | var message_content = plugs.first(exports.message_content = []) |
7 … | +var message_content_mini = plugs.first(exports.message_content_mini = []) | |
9 | 8 … | var avatar = plugs.first(exports.avatar = []) |
9 … | +var avatar_name = plugs.first(exports.avatar_name = []) | |
10 … | +var avatar_link = plugs.first(exports.avatar_link = []) | |
10 | 11 … | var message_meta = plugs.map(exports.message_meta = []) |
11 | 12 … | var message_action = plugs.map(exports.message_action = []) |
12 | 13 … | var message_link = plugs.first(exports.message_link = []) |
13 | 14 … | |
14 | 15 … | var sbot_links = plugs.first(exports.sbot_links = []) |
15 | 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', | |
21 … | + h('div.message_content.row', | |
22 … | + h('div', | |
23 … | + avatar_link(msg.value.author, avatar_name(msg.value.author), ''), | |
24 … | + ' ', elMini), | |
25 … | + h('div.message_meta.row', message_meta(msg)) | |
26 … | + ) | |
27 … | + ) | |
28 … | + div.setAttribute('tabindex', '0') | |
29 … | + return div | |
30 … | + } | |
31 … | + | |
17 | 32 … | var el = message_content(msg) |
18 | 33 … | if(!el) return |
19 | 34 … | |
20 | 35 … | var links = [] |
modules_basic/private.js | ||
---|---|---|
@@ -75,9 +75,9 @@ | ||
75 | 75 … | if(Array.isArray(ary)) return ary.map(iter) |
76 | 76 … | } |
77 | 77 … | |
78 | 78 … | exports.message_meta = function (msg) { |
79 | - if(msg.value.private) | |
79 … | + if(msg.value.content.recps || msg.value.private) | |
80 | 80 … | return h('span.row', 'PRIVATE', map(msg.value.content.recps, function (id) { |
81 | 81 … | return avatar_image_link('string' == typeof id ? id : id.link, 'thumbnail') |
82 | 82 … | })) |
83 | 83 … | } |
modules_basic/thread.js | ||
---|---|---|
@@ -4,8 +4,9 @@ | ||
4 | 4 … | var ref = require('ssb-ref') |
5 | 5 … | var h = require('hyperscript') |
6 | 6 … | var u = require('../util') |
7 | 7 … | var Scroller = require('pull-scroll') |
8 … | +var self_id = require('../keys').id | |
8 | 9 … | |
9 | 10 … | function once (cont) { |
10 | 11 … | var ended = false |
11 | 12 … | return function (abort, cb) { |
@@ -22,8 +23,9 @@ | ||
22 | 23 … | |
23 | 24 … | var plugs = require('../plugs') |
24 | 25 … | |
25 | 26 … | var message_render = plugs.first(exports.message_render = []) |
27 … | +var message_name = plugs.first(exports.message_name = []) | |
26 | 28 … | var message_compose = plugs.first(exports.message_compose = []) |
27 | 29 … | var message_unbox = plugs.first(exports.message_unbox = []) |
28 | 30 … | |
29 | 31 … | var sbot_get = plugs.first(exports.sbot_get = []) |
@@ -65,8 +67,12 @@ | ||
65 | 67 … | message_compose(meta, {shrink: false, placeholder: 'Write a reply'}) |
66 | 68 … | ) |
67 | 69 … | ) |
68 | 70 … | |
71 … | + message_name(id, function (err, name) { | |
72 … | + div.id = name | |
73 … | + }) | |
74 … | + | |
69 | 75 … | pull( |
70 | 76 … | sbot_links({ |
71 | 77 … | rel: 'root', dest: id, keys: true, old: false |
72 | 78 … | }), |
@@ -97,10 +103,15 @@ | ||
97 | 103 … | meta.root = thread[0].value.content.root || thread[0].key |
98 | 104 … | meta.channel = thread[0].value.content.channel |
99 | 105 … | |
100 | 106 … | var recps = thread[0].value.content.recps |
101 | - if(recps && thread[0].value.private) | |
102 | - meta.recps = recps | |
107 … | + var private = thread[0].value.private | |
108 … | + if(private) { | |
109 … | + if(recps) | |
110 … | + meta.recps = recps | |
111 … | + else | |
112 … | + meta.recps = [thread[0].value.author, self_id] | |
113 … | + } | |
103 | 114 … | }) |
104 | 115 … | } |
105 | 116 … | |
106 | 117 … | loadThread() |
modules_core/menu.js | ||
---|---|---|
@@ -3,11 +3,11 @@ | ||
3 | 3 … | |
4 | 4 … | var menu_items = plugs.map(exports.menu_items = []) |
5 | 5 … | |
6 | 6 … | var status = h('div.status.error') //start off disconnected |
7 | - var list = h('div.column', {style: 'display: none;'}) | |
7 … | + var list = h('div.menu.column', {style: 'display: none;'}) | |
8 | 8 … | |
9 | -var menu = h('div.menu.column', status, list , { | |
9 … | +var menu = h('div.column', status, list , { | |
10 | 10 … | onmouseover: function (e) { |
11 | 11 … | list.style.display = 'flex' |
12 | 12 … | }, onmouseout: function () { |
13 | 13 … | list.style.display = 'none' |
modules_core/message-confirm.js | ||
---|---|---|
@@ -1,27 +1,41 @@ | ||
1 | 1 … | var lightbox = require('hyperlightbox') |
2 | 2 … | var h = require('hyperscript') |
3 | 3 … | var u = require('../util') |
4 … | +var self_id = require('../keys').id | |
4 | 5 … | //publish or add |
5 | 6 … | |
6 | 7 … | var plugs = require('../plugs') |
7 | 8 … | |
8 | 9 … | var publish = plugs.first(exports.sbot_publish = []) |
9 | 10 … | var message_content = plugs.first(exports.message_content = []) |
11 … | +var avatar = plugs.first(exports.avatar = []) | |
12 … | +var message_meta = plugs.map(exports.message_meta = []) | |
10 | 13 … | |
11 | 14 … | exports.message_confirm = function (content, cb) { |
12 | 15 … | |
13 | 16 … | cb = cb || function () {} |
14 | 17 … | |
15 | 18 … | var lb = lightbox() |
16 | 19 … | document.body.appendChild(lb) |
17 | 20 … | |
21 … | + var msg = { | |
22 … | + key: "DRAFT", | |
23 … | + value: { | |
24 … | + author: self_id, | |
25 … | + previous: null, | |
26 … | + sequence: null, | |
27 … | + timestamp: Date.now(), | |
28 … | + content: content | |
29 … | + } | |
30 … | + } | |
31 … | + | |
18 | 32 … | var okay = h('button', 'okay', {onclick: function () { |
19 | 33 … | lb.remove() |
20 | 34 … | publish(content, cb) |
21 | 35 … | }}) |
22 | 36 … | |
23 | - var cancel = h('button', 'cancel', {onclick: function () { | |
37 … | + var cancel = h('button', 'Cancel', {onclick: function () { | |
24 | 38 … | lb.remove() |
25 | 39 … | cb(null) |
26 | 40 … | }}) |
27 | 41 … | |
@@ -29,10 +43,16 @@ | ||
29 | 43 … | if(ev.keyCode === 27) cancel.click() //escape |
30 | 44 … | }) |
31 | 45 … | |
32 | 46 … | lb.show(h('div.column.message-confirm', |
33 | - message_content({key: "DRAFT", value: {content: content}}) | |
34 | - || h('pre', JSON.stringify(content, null, 2)), | |
47 … | + h('div.message', | |
48 … | + h('div.title.row', | |
49 … | + h('div.avatar', avatar(msg.value.author, 'thumbnail')), | |
50 … | + h('div.message_meta.row', message_meta(msg)) | |
51 … | + ), | |
52 … | + h('div.message_content', message_content(msg) | |
53 … | + || h('pre', JSON.stringify(msg, null, 2))) | |
54 … | + ), | |
35 | 55 … | h('div.row.message-confirm__controls', okay, cancel) |
36 | 56 … | )) |
37 | 57 … | |
38 | 58 … | okay.focus() |
modules_core/tabs.js | ||
---|---|---|
@@ -166,13 +166,15 @@ | ||
166 | 166 … | window.removeEventListener('error', window.onError) |
167 | 167 … | delete window.onError |
168 | 168 … | } |
169 | 169 … | |
170 … | + var errors = h('div.errors', {id: 'errors'}) | |
171 … | + | |
170 | 172 … | // put errors in a tab |
171 | 173 … | window.addEventListener('error', function (ev) { |
172 | 174 … | var err = ev.error || ev |
173 | 175 … | if(!tabs.has('errors')) |
174 | - tabs.add('errors', errors, false) | |
176 … | + tabs.add(errors, false) | |
175 | 177 … | var el = h('div.message', |
176 | 178 … | h('strong', err.message), |
177 | 179 … | h('pre', err.stack)) |
178 | 180 … | if (errorsContent.firstChild) |
@@ -180,8 +182,25 @@ | ||
180 | 182 … | else |
181 | 183 … | errorsContent.appendChild(el) |
182 | 184 … | }) |
183 | 185 … | |
186 … | + if (process.versions.electron) { | |
187 … | + window.addEventListener('contextmenu', function (ev) { | |
188 … | + ev.preventDefault() | |
189 … | + var remote = require('electron').remote | |
190 … | + var Menu = remote.Menu | |
191 … | + var MenuItem = remote.MenuItem | |
192 … | + var menu = new Menu() | |
193 … | + menu.append(new MenuItem({ | |
194 … | + label: 'Inspect Element', | |
195 … | + click: function () { | |
196 … | + remote.getCurrentWindow().inspectElement(ev.x, ev.y) | |
197 … | + } | |
198 … | + })) | |
199 … | + menu.popup(remote.getCurrentWindow()) | |
200 … | + }) | |
201 … | + } | |
202 … | + | |
184 | 203 … | return tabs |
185 | 204 … | } |
186 | 205 … | |
187 | 206 … | |
@@ -191,4 +210,5 @@ | ||
191 | 210 … | |
192 | 211 … | |
193 | 212 … | |
194 | 213 … | |
214 … | + |
modules_extra/git.js | ||
---|---|---|
@@ -76,17 +76,26 @@ | ||
76 | 76 … | }) |
77 | 77 … | ) |
78 | 78 … | } |
79 | 79 … | |
80 | -function repoLink(id) { | |
81 | - var el = h('a', {href: '#'+id}, id.substr(0, 10) + '…') | |
82 | - getAvatar({links: sbot_links}, self_id, id, function (err, avatar) { | |
80 … | +function repoText(id) { | |
81 … | + var text = document.createTextNode(id.substr(0, 10) + '…') | |
82 … | + getAvatar({links: sbot_links, get: sbot_get}, self_id, id, | |
83 … | + function (err, avatar) { | |
83 | 84 … | if(err) return console.error(err) |
84 | - el.textContent = avatar.name | |
85 … | + text.nodeValue = avatar.name | |
85 | 86 … | }) |
86 | - return el | |
87 … | + return text | |
87 | 88 … | } |
88 | 89 … | |
90 … | +function repoLink(id) { | |
91 … | + return h('a', {href: '#'+id}, repoText(id)) | |
92 … | +} | |
93 … | + | |
94 … | +function repoName(id) { | |
95 … | + return h('ins', repoText(id)) | |
96 … | +} | |
97 … | + | |
89 | 98 … | function getIssueState(id, cb) { |
90 | 99 … | pull( |
91 | 100 … | sbot_links({dest: id, rel: 'issues', values: true, reverse: true}), |
92 | 101 … | pull.map(function (msg) { |
@@ -130,19 +139,8 @@ | ||
130 | 139 … | } |
131 | 140 … | return t |
132 | 141 … | } |
133 | 142 … | |
134 | -function repoName(id, link) { | |
135 | - var el = link | |
136 | - ? h('a', {href: '#'+id}, id.substr(0, 8) + '…') | |
137 | - : h('ins', id.substr(0, 8) + '…') | |
138 | - getAvatar({links: sbot_links}, self_id, id, function (err, avatar) { | |
139 | - if(err) return console.error(err) | |
140 | - el.textContent = avatar.name | |
141 | - }) | |
142 | - return el | |
143 | -} | |
144 | - | |
145 | 143 … | function renderIssueEdit(c) { |
146 | 144 … | var id = c.issue || c.link |
147 | 145 … | return [ |
148 | 146 … | c.title ? h('p', 'renamed issue ', message_link(id), |
@@ -158,9 +156,9 @@ | ||
158 | 156 … | var branchesT, tagsT, openIssuesT, closedIssuesT, openPRsT, closedPRsT |
159 | 157 … | var forksT |
160 | 158 … | var div = h('div', |
161 | 159 … | h('p', 'git repo ', repoName(msg.key)), |
162 | - c.upstream ? h('p', 'fork of ', repoName(c.upstream, true)) : '', | |
160 … | + c.upstream ? h('p', 'fork of ', repoLink(c.upstream)) : '', | |
163 | 161 … | h('p', h('code', 'ssb://' + msg.key)), |
164 | 162 … | h('div.git-table-wrapper', {style: {'max-height': '12em'}}, |
165 | 163 … | h('table', |
166 | 164 … | branchesT = tableRows(h('tr', |
@@ -186,12 +184,14 @@ | ||
186 | 184 … | h('div.git-table-wrapper', |
187 | 185 … | h('table', |
188 | 186 … | forksT = tableRows(h('tr', |
189 | 187 … | h('th', 'forks'))))), |
190 | - h('div', h('a', {href: '#', onclick: function () { | |
188 … | + h('div', h('a', {href: '#', onclick: function (e) { | |
189 … | + e.preventDefault() | |
191 | 190 … | this.parentNode.replaceChild(issueForm(msg), this) |
192 | 191 … | }}, 'New Issue…')), |
193 | - h('div', h('a', {href: '#', onclick: function () { | |
192 … | + h('div', h('a', {href: '#', onclick: function (e) { | |
193 … | + e.preventDefault() | |
194 | 194 … | this.parentNode.replaceChild(pullRequestForm(msg), this) |
195 | 195 … | }}, 'New Pull Request…'))) |
196 | 196 … | |
197 | 197 … | pull(getRefs(msg), pull.drain(function (ref) { |
@@ -246,9 +246,9 @@ | ||
246 | 246 … | pull( |
247 | 247 … | getForks(msg.key), |
248 | 248 … | pull.drain(function (fork) { |
249 | 249 … | forksT.append(h('tr', h('td', |
250 | - repoName(fork.id, true), | |
250 … | + repoLink(fork.id), | |
251 | 251 … | ' by ', h('a', {href: '#'+fork.author}, avatar_name(fork.author))))) |
252 | 252 … | }, function (err) { |
253 | 253 … | if (err) console.error(err) |
254 | 254 … | }) |
@@ -335,9 +335,9 @@ | ||
335 | 335 … | } |
336 | 336 … | } |
337 | 337 … | |
338 | 338 … | function issueForm(msg, contentEl) { |
339 | - return h('form', | |
339 … | + var form = h('form', | |
340 | 340 … | h('strong', 'New Issue:'), |
341 | 341 … | message_compose( |
342 | 342 … | {type: 'issue', project: msg.key}, |
343 | 343 … | function (value) { return value }, |
@@ -351,8 +351,9 @@ | ||
351 | 351 … | )) |
352 | 352 … | } |
353 | 353 … | ) |
354 | 354 … | ) |
355 … | + return form | |
355 | 356 … | } |
356 | 357 … | |
357 | 358 … | function branchMenu(msg, full) { |
358 | 359 … | return combobox({ |
@@ -400,9 +401,9 @@ | ||
400 | 401 … | pull.once({id: msg.key, author: msg.value.author}), |
401 | 402 … | getForks(msg.key) |
402 | 403 … | ]), pull.map(function (fork) { |
403 | 404 … | return h('option', {value: fork.id}, |
404 | - repoName(fork.id), ' by ', avatar_name(fork.author)) | |
405 … | + repoLink(fork.id), ' by ', avatar_name(fork.author)) | |
405 | 406 … | })) |
406 | 407 … | }), |
407 | 408 … | ':', |
408 | 409 … | headBranchInput, |
@@ -439,9 +440,10 @@ | ||
439 | 440 … | exports.message_action = function (msg, sbot) { |
440 | 441 … | var c = msg.value.content |
441 | 442 … | if(c.type === 'issue' || c.type === 'pull-request') { |
442 | 443 … | var isOpen |
443 | - var a = h('a', {href: '#', onclick: function () { | |
444 … | + var a = h('a', {href: '#', onclick: function (e) { | |
445 … | + e.preventDefault() | |
444 | 446 … | message_confirm({ |
445 | 447 … | type: 'issue-edit', |
446 | 448 … | root: msg.key, |
447 | 449 … | issues: [{ |
modules_extra/notifications.js | ||
---|---|---|
@@ -4,8 +4,9 @@ | ||
4 | 4 … | var Scroller = require('pull-scroll') |
5 | 5 … | var paramap = require('pull-paramap') |
6 | 6 … | var plugs = require('../plugs') |
7 | 7 … | var cont = require('cont') |
8 … | +var ref = require('ssb-ref') | |
8 | 9 … | |
9 | 10 … | var message_render = plugs.first(exports.message_render = []) |
10 | 11 … | var sbot_log = plugs.first(exports.sbot_log = []) |
11 | 12 … | var sbot_get = plugs.first(exports.sbot_get = []) |
@@ -30,8 +31,9 @@ | ||
30 | 31 … | |
31 | 32 … | function isOurMsg(id, cb) { |
32 | 33 … | if (!id) return cb(null, false) |
33 | 34 … | if (typeof id === 'object' && typeof id.link === 'string') id = id.link |
35 … | + if (!ref.isMsg(id)) return cb(null, false) | |
34 | 36 … | sbot_get(id, function (err, msg) { |
35 | 37 … | if (err && err.name == 'NotFoundError') cb(null, false) |
36 | 38 … | else if (err) cb(err) |
37 | 39 … | else if (msg.content.type === 'issue' || msg.content.type === 'pull-request') |
modules_extra/raw.js | ||
---|---|---|
@@ -9,9 +9,9 @@ | ||
9 | 9 … | |
10 | 10 … | // from ssb-ref |
11 | 11 … | var refRegex = /((?:@|%|&)[A-Za-z0-9\/+]{43}=\.[\w\d]+)/g |
12 | 12 … | |
13 | -function linkify(text) { | |
13 … | +exports.linkify = function (text) { | |
14 | 14 … | var arr = text.split(refRegex) |
15 | 15 … | for (var i = 1; i < arr.length; i += 2) { |
16 | 16 … | arr[i] = h('a', {href: '#' + arr[i]}, arr[i]) |
17 | 17 … | } |
@@ -32,9 +32,9 @@ | ||
32 | 32 … | // move away the content |
33 | 33 … | while (el = msgContentEl.firstChild) |
34 | 34 … | tmp.appendChild(el) |
35 | 35 … | // show the raw stuff |
36 | - if (!pre) pre = h('pre', linkify(JSON.stringify({ | |
36 … | + if (!pre) pre = h('pre', exports.linkify(JSON.stringify({ | |
37 | 37 … | key: msg.key, |
38 | 38 … | value: msg.value |
39 | 39 … | }, 0, 2))) |
40 | 40 … | msgContentEl.appendChild(pre) |
modules_extra/theme.js | ||
---|---|---|
@@ -95,29 +95,42 @@ | ||
95 | 95 … | |
96 | 96 … | function theme_view() { |
97 | 97 … | var themeInput |
98 | 98 … | var themesList = h('form.themes__list') |
99 | - var themesByKey = {} | |
99 … | + var themesPerFeed = {/* feedid: {blobid||name: theme} */} | |
100 | 100 … | |
101 | 101 … | pull( |
102 | 102 … | themes(), |
103 | - pull.unique('id'), | |
104 | 103 … | pull.drain(function (theme) { |
105 | - // don't show old versions of theme | |
106 | - var key = theme.feed + theme.name | |
107 | - var newerTheme = themesByKey[key] | |
104 … | + var map = themesPerFeed[theme.feed] || (themesPerFeed[theme.feed] = {}) | |
105 … | + // replace old theme | |
106 … | + var prevByName = map[theme.name] | |
107 … | + var prevById = map[theme.id] | |
108 | 108 … | theme.el = renderTheme(theme) |
109 | - themesByKey[key] = theme | |
110 | - if (!newerTheme) { | |
111 | - // show latest theme | |
109 … | + map[theme.name] = theme | |
110 … | + map[theme.id] = theme | |
111 … | + if (prevById) { | |
112 … | + // remove theme which is having its id reused | |
113 … | + themesList.removeChild(prevById.el) | |
114 … | + // prevById.el.appendChild(document.createTextNode(' (renamed)')) | |
115 … | + if (prevById === prevByName) { | |
116 … | + prevByName = null | |
117 … | + } | |
118 … | + } | |
119 … | + if (prevByName) { | |
120 … | + // update theme | |
121 … | + if (prevByName.id === localStorage.themeId | |
122 … | + || prevByName.id === activeTheme) { | |
123 … | + // keep old version because the user is still using it | |
124 … | + prevByName.el.appendChild(document.createTextNode(' (old)')) | |
125 … | + insertAfter(themesList, theme.el, prevByName.el) | |
126 … | + } else { | |
127 … | + // replace old version | |
128 … | + themesList.replaceChild(theme.el, prevByName.el) | |
129 … | + } | |
130 … | + } else { | |
131 … | + // show new theme | |
112 | 132 … | themesList.appendChild(theme.el) |
113 | - } else if (theme.id === localStorage.themeId | |
114 | - || theme.id === activeTheme) { | |
115 | - // show old version because the user is still using it | |
116 | - theme.el.appendChild(document.createTextNode(' (old)')) | |
117 | - insertAfter(themesList, theme.el, newerTheme.el) | |
118 | - } else { | |
119 | - // ignore old version of theme | |
120 | 133 … | } |
121 | 134 … | }, function (err) { |
122 | 135 … | if (err) console.error(err) |
123 | 136 … | }) |
package.json | ||
---|---|---|
@@ -1,8 +1,8 @@ | ||
1 | 1 … | { |
2 | 2 … | "name": "patchbay", |
3 | 3 … | "description": "a pluggable patchwork", |
4 | - "version": "3.2.0", | |
4 … | + "version": "3.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" |
@@ -35,10 +35,10 @@ | ||
35 | 35 … | "pull-stream": "^3.4.5", |
36 | 36 … | "scuttlebot": "^8.7.2", |
37 | 37 … | "simple-mime": "^0.1.0", |
38 | 38 … | "split-buffer": "^1.0.0", |
39 | - "ssb-avatar": "^0.1.0", | |
40 | 39 … | "ssb-blobs": "^0.1.7", |
40 … | + "ssb-avatar": "^0.2.0", | |
41 | 41 … | "ssb-client": "^4.0.3", |
42 | 42 … | "ssb-config": "^2.1.1", |
43 | 43 … | "ssb-feed": "^2.2.1", |
44 | 44 … | "ssb-keys": "^6.1.0", |
@@ -62,4 +62,7 @@ | ||
62 | 62 … | }, |
63 | 63 … | "author": "Dominic Tarr <dominic.tarr@gmail.com> (http://dominictarr.com)", |
64 | 64 … | "license": "MIT" |
65 | 65 … | } |
66 … | + | |
67 … | + | |
68 … | + |
style.css | ||
---|---|---|
@@ -5,8 +5,19 @@ | ||
5 | 5 … | * { |
6 | 6 … | word-break: break-word; |
7 | 7 … | } |
8 | 8 … | |
9 … | +a:link, a:visited, a:active { | |
10 … | + color: #0088cc; | |
11 … | + text-decoration: none; | |
12 … | +} | |
13 … | + | |
14 … | +a:hover, | |
15 … | +a:focus { | |
16 … | + color: #005580; | |
17 … | + text-decoration: underline; | |
18 … | +} | |
19 … | + | |
9 | 20 … | .screen { |
10 | 21 … | position: absolute; |
11 | 22 … | top: 0px; bottom: 0px; |
12 | 23 … | left: 0px; right: 0px; |
@@ -70,9 +81,59 @@ | ||
70 | 81 … | margin-bottom: .9em; |
71 | 82 … | } |
72 | 83 … | |
73 | 84 … | input, textarea { |
85 … | + border: none; | |
86 … | + border-radius: .2em; | |
87 … | + font-family: sans-serif; | |
88 … | +} | |
89 … | + | |
90 … | +input:focus, .compose:focus, .message:focus, button:focus { | |
91 … | + outline: none; | |
92 … | + border-color: #0088cc; | |
93 … | + box-shadow: 0 0 4px #0088cc; | |
94 … | +} | |
95 … | + | |
96 … | +textarea { | |
97 … | + padding: .5em; | |
98 … | +} | |
99 … | + | |
100 … | +textarea:focus { | |
101 … | + outline: none; | |
102 … | + border-color: none; | |
103 … | + box-shadow: none; | |
104 … | +} | |
105 … | + | |
106 … | +button { | |
107 … | + background: #fff; | |
108 … | + color: #666; | |
109 … | + border: 1px solid #bbb; | |
110 … | + border-radius: .5em; | |
111 … | + padding: .7em; | |
112 … | + margin: .5em; | |
113 … | + cursor: pointer; | |
114 … | + text-transform: uppercase; | |
115 … | + font-weight: bold; | |
116 … | + font-size: .7em; | |
117 … | +} | |
118 … | + | |
119 … | +button:hover { | |
120 … | + background: #ccc; | |
121 … | + border: 1px solid #bbb; | |
122 … | +} | |
123 … | + | |
124 … | +.menu { | |
125 … | + position: absolute; | |
126 … | + top: .5em; | |
127 … | + right: .5em; | |
128 … | + padding-top: .5em; | |
129 … | + padding-bottom: .5em; | |
130 … | + padding-right: 1em; | |
131 … | + padding-left: 1em; | |
132 … | + background: #f5f5f5; | |
74 | 133 … | border: 1px solid #eee; |
134 … | + box-shadow: 3px 0px 3px #ccc; | |
135 … | + border-radius: .2em; | |
75 | 136 … | } |
76 | 137 … | |
77 | 138 … | /* scrolling feeds, threads */ |
78 | 139 … | |
@@ -90,20 +151,41 @@ | ||
90 | 151 … | /* compose */ |
91 | 152 … | |
92 | 153 … | .compose { |
93 | 154 … | width: 100%; |
155 … | + margin-top: .5em; | |
156 … | + margin-bottom: .5em; | |
157 … | + box-shadow: #dadada 1px 2px 8px; | |
94 | 158 … | } |
95 | 159 … | |
160 … | +.compose button { | |
161 … | + float: right; | |
162 … | +} | |
163 … | + | |
96 | 164 … | /* messages */ |
97 | 165 … | |
98 | 166 … | .message { |
99 | 167 … | display: block; |
100 | 168 … | flex-basis: 0; |
101 | 169 … | word-wrap: break-word; |
102 | 170 … | display: inline-block; |
103 | - border: 1px solid #eee; | |
171 … | + margin-bottom: 1em; | |
172 … | + padding: 0.3rem; | |
173 … | + border-radius: 2px; | |
174 … | + box-shadow: #dadada 1px 2px 8px; | |
104 | 175 … | } |
105 | 176 … | |
177 … | +.message_content div > span { | |
178 … | + font-size: 0.8rem; | |
179 … | + margin-bottom: 0.7rem; | |
180 … | + display: block; | |
181 … | + color: #888; | |
182 … | +} | |
183 … | + | |
184 … | +.message_content div > span a { | |
185 … | + color: #005d8c; | |
186 … | +} | |
187 … | + | |
106 | 188 … | .message_meta input { |
107 | 189 … | font-size: .8em; |
108 | 190 … | } |
109 | 191 … | |
@@ -158,18 +240,25 @@ | ||
158 | 240 … | padding-left: -2em; |
159 | 241 … | } |
160 | 242 … | |
161 | 243 … | .suggest-box .selected { |
162 | - background: yellow; | |
244 … | + background: #eee; | |
163 | 245 … | } |
164 | 246 … | |
165 | 247 … | .suggest-box { |
166 | 248 … | width: max-content; |
167 | 249 … | background: white; |
250 … | + border-radius: 1em; | |
168 | 251 … | } |
169 | 252 … | |
170 | 253 … | /* avatar */ |
171 | 254 … | |
255 … | +.avatar--large, | |
256 … | +.avatar--thumbnail, | |
257 … | +.avatar--fullsize { | |
258 … | + border: 1px solid #eee; | |
259 … | +} | |
260 … | + | |
172 | 261 … | .avatar { |
173 | 262 … | display: flex; |
174 | 263 … | flex-direction: row; |
175 | 264 … | } |
@@ -205,23 +294,37 @@ | ||
205 | 294 … | /* lightbox - used in message-confirm */ |
206 | 295 … | |
207 | 296 … | .lightbox { |
208 | 297 … | overflow: auto; |
209 | - padding: 1em; | |
210 | - background: white; | |
298 … | + padding: 1.5em; | |
299 … | + margin-top: 3em; | |
300 … | + margin-bottom: 3em; | |
301 … | + width: 600px; | |
302 … | + background: #f5f5f5; | |
303 … | + margin-left: auto; | |
304 … | + margin-right: auto; | |
305 … | + border: 1px solid #eee; | |
306 … | + border-radius: .2em; | |
307 … | + box-shadow: #dadada 1px 2px 8px; | |
211 | 308 … | } |
212 | 309 … | |
213 | 310 … | /* searchprompt */ |
214 | 311 … | |
215 | 312 … | .searchprompt { |
216 | - width: 100%; | |
217 | - height: 2.55em; | |
313 … | + float: left; | |
314 … | + width: 85%; | |
315 … | + height: 2em; | |
316 … | + margin-top: .3em; | |
317 … | + border-radius: 1em; | |
318 … | + padding-left: .2em; | |
319 … | + margin-left: 1em; | |
320 … | + margin-right: 1em; | |
218 | 321 … | } |
219 | 322 … | |
220 | 323 … | /* TextNodeSearcher highlights */ |
221 | 324 … | |
222 | 325 … | .highlight { |
223 | - background: yellow; | |
326 … | + background: #f5f5f5; | |
224 | 327 … | } |
225 | 328 … | |
226 | 329 … | /* avatar editor */ |
227 | 330 … | |
@@ -248,22 +351,15 @@ | ||
248 | 351 … | width: .7em; |
249 | 352 … | height: .7em; |
250 | 353 … | margin: .7em; |
251 | 354 … | border-radius: 100%; |
252 | - background: green; | |
355 … | + background: #08c; | |
253 | 356 … | } |
254 | 357 … | |
255 | 358 … | .error { |
256 | 359 … | background: red; |
257 | 360 … | } |
258 | 361 … | |
259 | -/* invite codes */ | |
260 | - | |
261 | -.hyperprogress__liquid { | |
262 | - height: 1ex; | |
263 | - background: blue; | |
264 | -} | |
265 | - | |
266 | 362 … | /* themes */ |
267 | 363 … | |
268 | 364 … | .theme { |
269 | 365 … | margin-left: 1ex; |
@@ -276,10 +372,11 @@ | ||
276 | 372 … | |
277 | 373 … | /* tabs */ |
278 | 374 … | |
279 | 375 … | .header { |
280 | - background: lightgray; | |
281 | - border-bottom: 2px inset; | |
376 … | + background: #f5f5f5; | |
377 … | + border-bottom: 1px inset; | |
378 … | + box-shadow: 3px 0px 3px #ccc; | |
282 | 379 … | flex-shrink: 0; |
283 | 380 … | } |
284 | 381 … | |
285 | 382 … | .header__tabs { |
@@ -307,35 +404,39 @@ | ||
307 | 404 … | } |
308 | 405 … | |
309 | 406 … | .hypertabs__tab { |
310 | 407 … | color: black; |
311 | - background: lightgray; | |
312 | - border-right: 1px solid #ccc; | |
408 … | + background: #f5f5f5; | |
313 | 409 … | border-top-left-radius: 5px; |
314 | 410 … | margin-left: -3px; |
315 | 411 … | border-bottom: none; |
316 | - padding-top: .35em; | |
317 | - padding-left: .5em; | |
412 … | + padding-top: .56em; | |
413 … | + padding-left: 1em; | |
414 … | + border-left: 1px solid #ddd; | |
318 | 415 … | width: 100%; |
319 | 416 … | } |
320 | 417 … | |
321 | 418 … | .hypertabs__tab > a { |
322 | - color: black; | |
419 … | + color: #666; | |
323 | 420 … | text-decoration: none; |
324 | 421 … | white-space: nowrap; |
422 … | + font-size: .9em; | |
325 | 423 … | } |
326 | 424 … | |
327 | 425 … | .hypertabs--selected { |
328 | - background: #E7E7E7; | |
329 | - border-top-right-radius: 3px; | |
426 … | + font-weight: bold; | |
427 … | + background: #eee; | |
428 … | + border-top-right-radius: 5px; | |
330 | 429 … | z-index: 1; |
331 | 430 … | } |
332 | 431 … | |
333 | 432 … | .hypertabs__x { |
334 | 433 … | display: none; |
335 | - transform: translate(-5px, -3px); | |
434 … | + transform: translate(-4px, -3px); | |
336 | 435 … | } |
337 | 436 … | |
338 | 437 … | .hypertabs--selected .hypertabs__x { |
339 | 438 … | display: block; |
340 | 439 … | } |
341 | 440 … | |
441 … | + | |
442 … | + |
Built with git-ssb-web