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