Commit c431b9f86d04597436c8fd31782d8ab7a1a65f4e
Merge pull request #83 from ssbc/refactor_hypertabs
Refactor hypertabsmix irving authored on 2/3/2017, 6:30:33 AM
GitHub committed on 2/3/2017, 6:30:33 AM
Parent: 0132c055406a2cc025989cea9154fea161b776c9
Parent: da787189e650087caa476419997849d890f75995
Files changed
keyscroll.js | changed |
modules_basic/avatar/avatar.js | changed |
modules_basic/message/render.js | changed |
modules_basic/scroller.mcss | changed |
modules_core/app.js | changed |
modules_core/search-box.js | changed |
modules_core/style/index.js | changed |
modules_core/style/hypertabs.js | added |
modules_core/style/hypertabs.mcss | added |
modules_core/suggest-box.css | changed |
modules_core/tabs.js | changed |
modules_core/app.mcss | added |
modules_core/search-box.mcss | added |
modules_extra/search.js | changed |
package.json | changed |
style.css | changed |
keyscroll.js | ||
---|---|---|
@@ -23,10 +23,10 @@ | ||
23 | 23 … | curMsgEl = el |
24 | 24 … | } |
25 | 25 … | |
26 | 26 … | return function scroll(d) { |
27 | - selectChild(!curMsgEl ? container.firstChild | |
27 … | + selectChild((!curMsgEl || d == 'first') ? container.firstChild | |
28 … | + : d < 0 ? curMsgEl.previousElementSibling || container.firstChild | |
28 | 29 … | : d > 0 ? curMsgEl.nextElementSibling || container.lastChild |
29 | - : d < 0 ? curMsgEl.previousElementSibling || container.firstChild | |
30 | 30 … | : curMsgEl) |
31 | 31 … | } |
32 | 32 … | } |
modules_basic/avatar/avatar.js | ||
---|---|---|
@@ -20,8 +20,9 @@ | ||
20 | 20 … | avatar_name_link |
21 | 21 … | } |
22 | 22 … | |
23 | 23 … | function avatar (author, classes) { |
24 … | + // ??? BUG | |
24 | 25 … | return exports.avatar_image_name_link(author, classes) |
25 | 26 … | } |
26 | 27 … | |
27 | 28 … | function avatar_image_name_link (author, classes) { |
modules_basic/message/render.js | ||
---|---|---|
@@ -47,10 +47,10 @@ | ||
47 | 47 … | ]) |
48 | 48 … | return msgEl |
49 | 49 … | |
50 | 50 … | function navigateToMessageOnEnter (ev) { |
51 | - // on enter, hit first meta. | |
52 | - if(ev.keyCode == 13) { | |
51 … | + // on enter (or 'o'), hit first meta. | |
52 … | + if(ev.keyCode == 13 || ev.keyCode == 79) { | |
53 | 53 … | |
54 | 54 … | // unless in an input |
55 | 55 … | if (ev.target.nodeName === 'INPUT' |
56 | 56 … | || ev.target.nodeName === 'TEXTAREA') return |
modules_basic/scroller.mcss | ||
---|---|---|
@@ -3,8 +3,9 @@ | ||
3 | 3 … | flex-direction: column |
4 | 4 … | |
5 | 5 … | overflow: auto |
6 | 6 … | width: 100% |
7 … | + height: 100% | |
7 | 8 … | min-height: 0px |
8 | 9 … | |
9 | 10 … | div.wrapper { |
10 | 11 … | flex: 1 |
modules_core/app.js | ||
---|---|---|
@@ -1,46 +1,58 @@ | ||
1 | -var h = require('hyperscript') | |
2 | -var insertCss = require('insert-css') | |
1 … | +const fs = require('fs') | |
2 … | +const h = require('../h') | |
3 … | +const { Value } = require('@mmckegg/mutant') | |
4 … | +const insertCss = require('insert-css') | |
3 | 5 … | |
4 | -module.exports = { | |
5 | - needs: { | |
6 | - screen_view: 'first', | |
7 | - styles: 'first' | |
8 | - }, | |
9 | - gives: 'app', | |
10 | - create: function (api) { | |
11 | - return function () { | |
12 | - process.nextTick(function () { | |
13 | - insertCss(api.styles()) | |
14 | - }) | |
6 … | +exports.needs = { | |
7 … | + screen_view: 'first', | |
8 … | + styles: 'first' | |
9 … | +} | |
15 | 10 … | |
16 | - window.addEventListener('error', window.onError = function (e) { | |
17 | - document.body.appendChild(h('div.error', | |
18 | - h('h1', e.message), | |
19 | - h('big', h('code', e.filename + ':' + e.lineno)), | |
20 | - h('pre', e.error ? (e.error.stack || e.error.toString()) : e.toString()))) | |
21 | - }) | |
11 … | +exports.gives = { | |
12 … | + app: true, | |
13 … | + mcss: true | |
14 … | +} | |
22 | 15 … | |
23 | - function hash() { | |
24 | - return window.location.hash.substring(1) | |
25 | - } | |
16 … | +exports.create = function (api) { | |
17 … | + return { | |
18 … | + app, | |
19 … | + mcss: () => fs.readFileSync(__filename.replace(/js$/, 'mcss'), 'utf8') | |
20 … | + } | |
26 | 21 … | |
27 | - var view = api.screen_view(hash() || 'tabs') | |
22 … | + function app () { | |
23 … | + process.nextTick(() => insertCss(api.styles())) | |
28 | 24 … | |
29 | - var screen = h('div.screen.column', view) | |
25 … | + var view = Value(getView()) | |
26 … | + var screen = h('App', view) | |
30 | 27 … | |
31 | - window.onhashchange = function (ev) { | |
32 | - var _view = view | |
33 | - view = api.screen_view(hash() || 'tabs') | |
28 … | + window.onhashchange = () => view.set(getView()) | |
29 … | + document.body.appendChild(screen) | |
34 | 30 … | |
35 | - if(_view) screen.replaceChild(view, _view) | |
36 | - else document.body.appendChild(view) | |
37 | - } | |
31 … | + window.addEventListener('error', window.onError = displayError) | |
38 | 32 … | |
39 | - document.body.appendChild(screen) | |
33 … | + return screen | |
34 … | + } | |
40 | 35 … | |
41 | - return screen | |
42 | - } | |
36 … | + function getView () { | |
37 … | + const view = window.location.hash.substring(1) || 'tabs' | |
38 … | + return api.screen_view(view) | |
43 | 39 … | } |
44 | 40 … | } |
45 | 41 … | |
42 … | +function displayError (e) { | |
43 … | + document.body.querySelector('.\\.content').appendChild( | |
44 … | + h('div.page', [ | |
45 … | + h('Error', { title: e.message }, [ | |
46 … | + h('h1', e.message), | |
47 … | + h('big', [ | |
48 … | + h('code', e.filename + ':' + e.lineno) | |
49 … | + ]), | |
50 … | + h('pre', e.error | |
51 … | + ? (e.error.stack || e.error.toString()) | |
52 … | + : e.toString() | |
53 … | + ) | |
54 … | + ]) | |
55 … | + ]) | |
56 … | + ) | |
57 … | +} | |
46 | 58 … |
modules_core/search-box.js | ||
---|---|---|
@@ -1,50 +1,61 @@ | ||
1 | 1 … | |
2 | -var h = require('hyperscript') | |
2 … | +const h = require('../h') | |
3 … | +const fs = require('fs') | |
3 | 4 … | |
5 … | + | |
4 | 6 … | exports.needs = { |
5 | 7 … | suggest_search: 'map', //REWRITE |
6 | 8 … | build_suggest_box: 'first' |
7 | 9 … | } |
8 | 10 … | |
9 | -exports.gives = 'search_box' | |
11 … | +exports.gives = { | |
12 … | + search_box: true, | |
13 … | + mcss: true | |
14 … | +} | |
10 | 15 … | |
11 | 16 … | exports.create = function (api) { |
12 | 17 … | |
13 | - return function (go) { | |
14 | - | |
15 | - var search = h('input.searchprompt', { | |
18 … | + return { | |
19 … | + search_box, | |
20 … | + mcss: () => fs.readFileSync(__filename.replace(/js$/, 'mcss'), 'utf8') | |
21 … | + } | |
22 … | + | |
23 … | + function search_box (go) { | |
24 … | + const input = h('input', { | |
16 | 25 … | type: 'search', |
17 | 26 … | placeholder: 'Commands', |
18 | - onkeydown: ev => { | |
27 … | + 'ev-keyup': ev => { | |
19 | 28 … | switch (ev.keyCode) { |
20 | 29 … | case 13: // enter |
21 | 30 … | ev.stopPropagation() |
22 | 31 … | suggestBox.complete() |
23 | 32 … | |
24 | - if (go(search.value.trim(), !ev.ctrlKey)) | |
25 | - search.blur() | |
33 … | + if (go(input.value.trim(), !ev.ctrlKey)) | |
34 … | + input.blur() | |
26 | 35 … | return |
27 | 36 … | case 27: // escape |
28 | 37 … | ev.preventDefault() |
29 | - search.blur() | |
38 … | + input.blur() | |
30 | 39 … | return |
31 | 40 … | } |
32 | 41 … | } |
33 | 42 … | }) |
43 … | + const search = h('Search', input) | |
34 | 44 … | |
45 … | + search.input = input | |
35 | 46 … | search.activate = (sigil, ev) => { |
36 | - search.focus() | |
47 … | + input.focus() | |
37 | 48 … | ev.preventDefault() |
38 | - if (search.value[0] === sigil) { | |
39 | - search.selectionStart = 1 | |
40 | - search.selectionEnd = search.value.length | |
49 … | + if (input.value[0] === sigil) { | |
50 … | + input.selectionStart = 1 | |
51 … | + input.selectionEnd = input.value.length | |
41 | 52 … | } else { |
42 | - search.value = sigil | |
53 … | + input.value = sigil | |
43 | 54 … | } |
44 | 55 … | } |
45 | 56 … | |
46 | - var suggestBox = api.build_suggest_box(search, api.suggest_search) | |
57 … | + const suggestBox = api.build_suggest_box(input, api.suggest_search) | |
47 | 58 … | |
48 | 59 … | return search |
49 | 60 … | } |
50 | 61 … |
modules_core/style/index.js | ||
---|---|---|
@@ -1,5 +1,6 @@ | ||
1 | 1 … | module.exports = { |
2 | - 'styles': require('./styles'), | |
3 | - 'mixins': require('./mixins') | |
2 … | + 'hypertabs': require('./hypertabs'), | |
3 … | + 'mixins': require('./mixins'), | |
4 … | + 'styles': require('./styles') | |
4 | 5 … | } |
5 | 6 … |
modules_core/style/hypertabs.js | ||
---|---|---|
@@ -1,0 +1,13 @@ | ||
1 … | +const fs = require('fs') | |
2 … | + | |
3 … | +module.exports = { | |
4 … | + gives: { | |
5 … | + mcss: true | |
6 … | + }, | |
7 … | + create: function (api) { | |
8 … | + return { | |
9 … | + mcss: () => fs.readFileSync(__filename.replace(/js$/, 'mcss'), 'utf8') | |
10 … | + } | |
11 … | + } | |
12 … | +} | |
13 … | + |
modules_core/style/hypertabs.mcss | ||
---|---|---|
@@ -1,0 +1,93 @@ | ||
1 … | +Hypertabs { | |
2 … | + display: flex | |
3 … | + flex-direction: column | |
4 … | + | |
5 … | + height: 100% /* needed to stop scroller blowing out */ | |
6 … | + | |
7 … | + nav { | |
8 … | + display: flex | |
9 … | + | |
10 … | + background: linear-gradient(to bottom, #efefef, #e5e5e5) | |
11 … | + | |
12 … | + section.tabs { | |
13 … | + flex-grow: 1 | |
14 … | + display: flex | |
15 … | + min-width: 0 | |
16 … | + | |
17 … | + div.tab { | |
18 … | + flex-grow: 1 | |
19 … | + | |
20 … | + display: flex | |
21 … | + align-items: center | |
22 … | + justify-content: space-between | |
23 … | + | |
24 … | + font-size: .9rem | |
25 … | + background-color: #efefef | |
26 … | + overflow-x: hidden | |
27 … | + | |
28 … | + padding: 0 .4rem | |
29 … | + margin-left: .6rem | |
30 … | + border: 1px gainsboro solid | |
31 … | + border-bottom: none | |
32 … | + | |
33 … | + -selected { | |
34 … | + color: #222 | |
35 … | + background-color: #fff | |
36 … | + | |
37 … | + a.close { | |
38 … | + visibility: visible | |
39 … | + } | |
40 … | + } | |
41 … | + | |
42 … | + -notify { | |
43 … | + background-color: orange; | |
44 … | + } | |
45 … | + | |
46 … | + | |
47 … | + a { | |
48 … | + color: #666 | |
49 … | + | |
50 … | + :hover { | |
51 … | + color: #0088cc | |
52 … | + text-decoration: none | |
53 … | + } | |
54 … | + } | |
55 … | + | |
56 … | + a.link { | |
57 … | + flex-grow: 1 | |
58 … | + flex-shrink: 0 | |
59 … | + overflow-x: hidden | |
60 … | + min-width: 0 | |
61 … | + max-width: 90% | |
62 … | + white-space: nowrap | |
63 … | + text-overflow: ellipsis | |
64 … | + } | |
65 … | + | |
66 … | + a.close { | |
67 … | + visibility: hidden | |
68 … | + } | |
69 … | + } | |
70 … | + | |
71 … | + } | |
72 … | + | |
73 … | + div.extra { | |
74 … | + display: flex | |
75 … | + align-items: center | |
76 … | + } | |
77 … | + } | |
78 … | + | |
79 … | + section.content { | |
80 … | + display: flex | |
81 … | + | |
82 … | + height: 100% /* needed to stop making nav weird */ | |
83 … | + | |
84 … | + div.page { | |
85 … | + flex-grow: 1 | |
86 … | + | |
87 … | + display: flex /*hack to get give Scroller context it needs */ | |
88 … | + | |
89 … | + padding-top: .2rem | |
90 … | + } | |
91 … | + } | |
92 … | +} | |
93 … | + |
modules_core/suggest-box.css | ||
---|---|---|
@@ -27,9 +27,9 @@ | ||
27 | 27 … | background-color: #fff; |
28 | 28 … | border: 1px gainsboro solid; |
29 | 29 … | |
30 | 30 … | padding: .2rem .5rem; |
31 | - margin-top: .7rem; | |
31 … | + margin-top: .35rem; | |
32 | 32 … | } |
33 | 33 … | |
34 | 34 … | body > .suggest-box > ul { |
35 | 35 … | list-style-type: none; |
modules_core/tabs.js | ||
---|---|---|
@@ -1,6 +1,6 @@ | ||
1 | 1 … | const Tabs = require('hypertabs') |
2 | -const h = require('hyperscript') | |
2 … | +const h = require('../h') | |
3 | 3 … | const keyscroll = require('../keyscroll') |
4 | 4 … | const open = require('open-external') |
5 | 5 … | const { webFrame, remote } = require('electron') |
6 | 6 … | |
@@ -24,44 +24,40 @@ | ||
24 | 24 … | return function (path) { |
25 | 25 … | if(path !== 'tabs') return |
26 | 26 … | |
27 | 27 … | function setSelected (indexes) { |
28 | - var ids = indexes.map(function (index) { | |
29 | - return tabs.get(index).id | |
30 | - }) | |
28 … | + const ids = indexes.map(index => tabs.get(index).content.id) | |
31 | 29 … | if(search) |
32 | 30 … | if(ids.length > 1) |
33 | - search.value = 'split('+ids.join(',')+')' | |
31 … | + search.input.value = 'split('+ids.join(',')+')' | |
34 | 32 … | else |
35 | - search.value = ids[0] | |
33 … | + search.input.value = ids[0] | |
36 | 34 … | } |
37 | 35 … | |
38 | - var search | |
39 | - var tabs = Tabs(setSelected) | |
40 | - | |
41 | - search = api.search_box(function (path, change) { | |
42 | - | |
36 … | + const tabs = Tabs(setSelected) | |
37 … | + const search = api.search_box((path, change) => { | |
43 | 38 … | if(tabs.has(path)) { |
44 | 39 … | tabs.select(path) |
45 | 40 … | return true |
46 | 41 … | } |
47 | - var el = api.screen_view(path) | |
48 | 42 … | |
49 | - if(el) { | |
50 | - if(!el.title) el.title = path | |
51 | - el.scroll = keyscroll(el.querySelector('.Scroller .\\.content')) | |
52 | - tabs.add(el, change) | |
53 | - // localStorage.openTabs = JSON.stringify(tabs.tabs) | |
54 | - return change | |
55 | - } | |
43 … | + const el = api.screen_view(path) | |
44 … | + if (!el) return | |
45 … | + | |
46 … | + if(!el.title) el.title = path | |
47 … | + el.scroll = keyscroll(el.querySelector('.Scroller .\\.content')) | |
48 … | + tabs.add(el, change) | |
49 … | +// localStorage.openTabs = JSON.stringify(tabs.tabs) | |
50 … | + return change | |
56 | 51 … | }) |
57 | 52 … | |
58 | - //reposition hypertabs menu to inside a container... | |
59 | - tabs.insertBefore(h('div.header.row', | |
60 | - h('div.header__tabs.row', tabs.firstChild), //tabs | |
61 | - h('div.header__search.row.end', [search, api.menu()]) | |
62 | - ), tabs.firstChild) | |
63 | - // tabs.insertBefore(search, tabs.firstChild.nextSibling) | |
53 … | + // TODO add options to Tabs : e.g. Tabs(setSelected, { append: el }) | |
54 … | + tabs.firstChild.appendChild( | |
55 … | + h('div.extra', [ | |
56 … | + search, | |
57 … | + api.menu() | |
58 … | + ]) | |
59 … | + ) | |
64 | 60 … | |
65 | 61 … | var saved = [] |
66 | 62 … | // try { saved = JSON.parse(localStorage.openTabs) } |
67 | 63 … | // catch (_) { } |
@@ -78,8 +74,9 @@ | ||
78 | 74 … | if(el) tabs.add(el, false, false) |
79 | 75 … | }) |
80 | 76 … | |
81 | 77 … | tabs.select(0) |
78 … | + search.input.value = null // start with an empty field to show placeholder | |
82 | 79 … | |
83 | 80 … | //handle link clicks |
84 | 81 … | window.onclick = function (ev) { |
85 | 82 … | var link = ancestor(ev.target) |
@@ -109,24 +106,34 @@ | ||
109 | 106 … | |
110 | 107 … | return false |
111 | 108 … | } |
112 | 109 … | |
110 … | + var gPressed = false | |
113 | 111 … | window.addEventListener('keydown', function (ev) { |
114 | 112 … | if (ev.target.nodeName === 'INPUT' || ev.target.nodeName === 'TEXTAREA') |
115 | 113 … | return |
114 … | + | |
115 … | + // scroll to top | |
116 … | + if (ev.keyCode == 71) { // g | |
117 … | + if (!gPressed) return gPressed = true | |
118 … | + var el = tabs.get(tabs.selected[0]).firstChild.scroll('first') | |
119 … | + gPressed = false | |
120 … | + } else { | |
121 … | + gPressed = false | |
122 … | + } | |
123 … | + | |
116 | 124 … | switch(ev.keyCode) { |
117 | - | |
118 | 125 … | // scroll through tabs |
119 | 126 … | case 72: // h |
120 | 127 … | return tabs.selectRelative(-1) |
121 | 128 … | case 76: // l |
122 | 129 … | return tabs.selectRelative(1) |
123 | 130 … | |
124 | 131 … | // scroll through messages |
125 | 132 … | case 74: // j |
126 | - return tabs.get(tabs.selected[0]).scroll(1) | |
133 … | + return tabs.get(tabs.selected[0]).firstChild.scroll(1) | |
127 | 134 … | case 75: // k |
128 | - return tabs.get(tabs.selected[0]).scroll(-1) | |
135 … | + return tabs.get(tabs.selected[0]).firstChild.scroll(-1) | |
129 | 136 … | |
130 | 137 … | // close a tab |
131 | 138 … | case 88: // x |
132 | 139 … | if (tabs.selected) { |
modules_core/app.mcss | ||
---|---|---|
@@ -1,0 +1,29 @@ | ||
1 … | +App { | |
2 … | + position: absolute | |
3 … | + | |
4 … | + top: 0 | |
5 … | + bottom: 0 | |
6 … | + left: 0 | |
7 … | + right: 0 | |
8 … | + overflow: hidden | |
9 … | + min-height: 0px | |
10 … | + | |
11 … | +} | |
12 … | + | |
13 … | + | |
14 … | +Error { | |
15 … | + padding: 1rem | |
16 … | + | |
17 … | + h1 { | |
18 … | + color: red | |
19 … | + } | |
20 … | + | |
21 … | + big { | |
22 … | + } | |
23 … | + | |
24 … | + pre { | |
25 … | + padding: 1rem | |
26 … | + border: 1px gainsboro solid | |
27 … | + } | |
28 … | +} | |
29 … | + |
modules_core/search-box.mcss | ||
---|---|---|
@@ -1,0 +1,13 @@ | ||
1 … | +Search { | |
2 … | + input { | |
3 … | + height: 1.4rem | |
4 … | + border-radius: .1rem | |
5 … | + | |
6 … | + padding-left: .7rem | |
7 … | + padding-right: .5rem | |
8 … | + | |
9 … | + margin-left: 1em | |
10 … | + /* margin-right: 1em */ | |
11 … | + } | |
12 … | +} | |
13 … | + |
modules_extra/search.js | ||
---|---|---|
@@ -61,8 +61,9 @@ | ||
61 | 61 … | var total = 0, matches = 0 |
62 | 62 … | |
63 | 63 … | var header = h('div.search_header', '') |
64 | 64 … | var { container, content } = api.build_scroller({ prepend: header}) |
65 … | + container.id = path // helps tabs find this tab | |
65 | 66 … | |
66 | 67 … | function matchesQuery (data) { |
67 | 68 … | total++ |
68 | 69 … | var m = _matches(data) |
package.json | ||
---|---|---|
@@ -29,9 +29,9 @@ | ||
29 | 29 … | "hyperfile": "^1.1.0", |
30 | 30 … | "hyperlightbox": "1.0.0", |
31 | 31 … | "hyperprogress": "0.1.0", |
32 | 32 … | "hyperscript": "^1.4.7", |
33 | - "hypertabs": "^3.0.3", | |
33 … | + "hypertabs": "^4.0.0", | |
34 | 34 … | "insert-css": "^2.0.0", |
35 | 35 … | "is-visible": "^2.1.1", |
36 | 36 … | "kvgraph": "^0.1.0", |
37 | 37 … | "map-filter-reduce": "^3.0.1", |
style.css | ||
---|---|---|
@@ -28,15 +28,8 @@ | ||
28 | 28 … | color: #005580; |
29 | 29 … | text-decoration: underline; |
30 | 30 … | } |
31 | 31 … | |
32 | -.screen { | |
33 | - position: absolute; | |
34 | - top: 0; bottom: 0; | |
35 | - left: 0; right: 0; | |
36 | - overflow-y: hidden; | |
37 | -} | |
38 | - | |
39 | 32 … | .column { |
40 | 33 … | display: flex; |
41 | 34 … | flex-direction: column; |
42 | 35 … | min-height:0px; |
@@ -65,18 +58,8 @@ | ||
65 | 58 … | .expand { |
66 | 59 … | justify-content: space-between; |
67 | 60 … | } |
68 | 61 … | |
69 | -.scroll-y { | |
70 | - overflow-y: auto; | |
71 | - min-height: 0px; | |
72 | -} | |
73 | - | |
74 | -.scroll-x { | |
75 | - overflow-x: auto; | |
76 | - min-width: 0px; | |
77 | -} | |
78 | - | |
79 | 62 … | pre { |
80 | 63 … | white-space: pre-wrap; |
81 | 64 … | word-wrap: break-word; |
82 | 65 … | } |
@@ -150,21 +133,8 @@ | ||
150 | 133 … | border-radius: .2em; |
151 | 134 … | z-index: 5; |
152 | 135 … | } |
153 | 136 … | |
154 | -/* scrolling feeds, threads */ | |
155 | - | |
156 | -.scroller { | |
157 | - width: 100%; | |
158 | -} | |
159 | - | |
160 | -.scroller__wrapper { | |
161 | - flex: 1; | |
162 | - max-width: 600px; | |
163 | - margin-left: auto; | |
164 | - margin-right: auto; | |
165 | -} | |
166 | - | |
167 | 137 … | /* messages */ |
168 | 138 … | /* is .title used any more? */ |
169 | 139 … | |
170 | 140 … | .title { |
@@ -207,21 +177,8 @@ | ||
207 | 177 … | .avatar--fullsize { |
208 | 178 … | width: 50%; |
209 | 179 … | } |
210 | 180 … | |
211 | -.profile { | |
212 | - padding: .5ex; | |
213 | - overflow: auto; | |
214 | -} | |
215 | - | |
216 | -.profile input { | |
217 | - width: 100%; | |
218 | -} | |
219 | - | |
220 | -.profile__info { | |
221 | - margin-left: .5em; | |
222 | -} | |
223 | - | |
224 | 181 … | /* lightbox - used in message-confirm */ |
225 | 182 … | |
226 | 183 … | .lightbox { |
227 | 184 … | position: fixed; |
@@ -240,22 +197,9 @@ | ||
240 | 197 … | border: 1px solid #eee; |
241 | 198 … | border-radius: .2em; |
242 | 199 … | } |
243 | 200 … | |
244 | -/* searchprompt */ | |
245 | 201 … | |
246 | -.searchprompt { | |
247 | - float: left; | |
248 | - width: 85%; | |
249 | - height: 2em; | |
250 | - margin-top: .3em; | |
251 | - border-radius: 1em; | |
252 | - padding-left: .7em; | |
253 | - padding-right: 0.5em; | |
254 | - margin-left: 1em; | |
255 | - margin-right: 1em; | |
256 | -} | |
257 | - | |
258 | 202 … | /* TextNodeSearcher highlights */ |
259 | 203 … | |
260 | 204 … | highlight { |
261 | 205 … | background: #ff8; |
@@ -289,79 +233,16 @@ | ||
289 | 233 … | border-radius: 100%; |
290 | 234 … | background: #08c; |
291 | 235 … | } |
292 | 236 … | |
293 | -.error { | |
294 | - background: red; | |
295 | -} | |
296 | - | |
297 | 237 … | /* tabs */ |
298 | 238 … | |
299 | 239 … | .header { |
300 | 240 … | background: #f5f5f5; |
301 | 241 … | border-bottom: 1px inset; |
302 | 242 … | flex-shrink: 0; |
303 | 243 … | } |
304 | 244 … | |
305 | -.header__tabs { | |
306 | - width: 100%; | |
307 | - min-width: 0px; | |
308 | -} | |
309 | - | |
310 | -/* --- hypertabs ------- */ | |
311 | - | |
312 | -.hypertabs__tabs { | |
313 | - min-width: 0px; | |
314 | - width: 100%; | |
315 | -} | |
316 | - | |
317 | -.hypertabs__tab { | |
318 | - overflow-x: hidden; | |
319 | - min-width: 0px; | |
320 | - width: 100%; | |
321 | -} | |
322 | - | |
323 | -.hypertabs__button { | |
324 | - overflow-x: hidden; | |
325 | - min-width: 0px; | |
326 | - width: 100%; | |
327 | -} | |
328 | - | |
329 | -.hypertabs__tab { | |
330 | - color: black; | |
331 | - background: #f5f5f5; | |
332 | - border-top-left-radius: 5px; | |
333 | - margin-left: -3px; | |
334 | - border-bottom: none; | |
335 | - padding-top: .56em; | |
336 | - padding-left: 1em; | |
337 | - border-left: 1px solid #ddd; | |
338 | - width: 100%; | |
339 | -} | |
340 | - | |
341 | -.hypertabs__tab > a { | |
342 | - color: #666; | |
343 | - text-decoration: none; | |
344 | - white-space: nowrap; | |
345 | - font-size: .9em; | |
346 | -} | |
347 | - | |
348 | -.hypertabs--selected { | |
349 | - font-weight: bold; | |
350 | - background: #eee; | |
351 | - border-top-right-radius: 5px; | |
352 | - z-index: 1; | |
353 | -} | |
354 | - | |
355 | -.hypertabs__x { | |
356 | - display: none; | |
357 | - transform: translate(-4px, -3px); | |
358 | -} | |
359 | - | |
360 | -.hypertabs--selected .hypertabs__x { | |
361 | - display: block; | |
362 | -} | |
363 | - | |
364 | 245 … | /* progress bar */ |
365 | 246 … | |
366 | 247 … | .hyperprogress__bar { |
367 | 248 … | background: darkgrey; |
Built with git-ssb-web