Skip to content

Commit e5b30a3

Browse files
committed
popup: Add support for themes
1 parent 8378d87 commit e5b30a3

File tree

6 files changed

+128
-50
lines changed

6 files changed

+128
-50
lines changed

src/background.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ var defaultSettings = {
2323
gpgPath: null,
2424
stores: {},
2525
foreignFills: {},
26-
username: null
26+
username: null,
27+
theme: "dark"
2728
};
2829

2930
var authListeners = {};

src/options/interface.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ function view(ctl, params) {
5252
nodes.push(createInput.call(this, "username", "Default username", "john.smith"));
5353
nodes.push(createInput.call(this, "gpgPath", "Custom gpg binary", "/path/to/gpg"));
5454

55+
nodes.push(m("h3", "Theme"));
56+
nodes.push(createDropdown.call(this, "theme", [m("option", { value: "dark" }, "Dark")]));
57+
5558
nodes.push(m("h3", "Custom store locations"));
5659
nodes.push(
5760
m("div", { class: "notice" }, "(this overrides default store and $PASSWORD_STORE_DIR)")
@@ -146,6 +149,29 @@ function createInput(key, title, placeholder) {
146149
]);
147150
}
148151

152+
/**
153+
* Generates vnode for a dropdown setting
154+
*
155+
* @since 3.0.13
156+
*
157+
* @param string key Settings key
158+
* @param array options Array of objects with value and text fields
159+
* @return Vnode
160+
*/
161+
function createDropdown(key, options) {
162+
return m(
163+
"select",
164+
{
165+
value: this.settings[key],
166+
onchange: e => {
167+
this.settings[key] = e.target.value;
168+
this.saveEnabled = true;
169+
}
170+
},
171+
options
172+
);
173+
}
174+
149175
/**
150176
* Generates vnode for a checkbox setting
151177
*

src/popup/colors-dark.less

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
@import "colors.less";
2+
3+
.colors-dark {
4+
.colors(
5+
@bg-color: #414141,
6+
@default-bg-color: #393939,
7+
@hover-bg-color: #363636,
8+
@text-color: #c4c4c4,
9+
@error-text-color: #f00,
10+
@dim-text-color: #a0a0a0,
11+
@badge-color: #626262,
12+
@input-bg-color: #4a4a4a,
13+
@active-input-bg-color: #4f4f4f,
14+
@input-text-color: #eee,
15+
@hint-bg-color: #d79921,
16+
@hint-color: #363636
17+
);
18+
}

src/popup/colors.less

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
.colors(
2+
@bg-color,
3+
@default-bg-color,
4+
@hover-bg-color,
5+
@text-color,
6+
@error-text-color,
7+
@dim-text-color,
8+
@badge-color,
9+
@input-bg-color,
10+
@active-input-bg-color,
11+
@input-text-color,
12+
@hint-bg-color,
13+
@hint-color) {
14+
@match-text-color: @hint-bg-color;
15+
16+
html,
17+
body {
18+
background-color: @bg-color;
19+
color: @text-color;
20+
}
21+
22+
.badge {
23+
background-color: @badge-color;
24+
}
25+
26+
.part.error {
27+
color: @error-text-color;
28+
}
29+
30+
.part.search {
31+
background-color: @input-bg-color;
32+
}
33+
34+
.part.search:focus-within {
35+
background-color: @active-input-bg-color;
36+
}
37+
38+
.part.search > .hint {
39+
background-color: @hint-bg-color;
40+
color: @hint-color;
41+
}
42+
43+
.part.search > input[type="text"] {
44+
background-color: transparent;
45+
color: @input-text-color;
46+
}
47+
48+
.part.search > input[type="text"]::placeholder {
49+
color: @dim-text-color;
50+
}
51+
52+
.logins:not(:hover):not(:focus-within) .part.login:first-child > .name {
53+
background-color: @default-bg-color;
54+
}
55+
56+
.part.login > .name:hover,
57+
.part.login > .name:focus,
58+
.part.login > .action:hover,
59+
.part.login > .action:focus,
60+
.part.login:focus > .name {
61+
background-color: @hover-bg-color;
62+
outline: none;
63+
}
64+
65+
.part.login em {
66+
color: @match-text-color;
67+
}
68+
69+
.updates {
70+
border-top: 1px solid @hover-bg-color;
71+
72+
span,
73+
a {
74+
color: @error-text-color;
75+
}
76+
}
77+
}

src/popup/popup.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ async function run() {
117117
}
118118
var popup = new Interface(settings, logins);
119119
popup.attach(document.body);
120+
121+
document
122+
.getElementsByTagName("html")[0]
123+
.setAttribute("class", "colors-" + settings["theme"]);
120124
} catch (e) {
121125
handleError(e);
122126
}

src/popup/popup.less

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,4 @@
1-
@bg-color: #414141;
2-
@default-bg-color: #393939;
3-
@hover-bg-color: #363636;
4-
@text-color: #c4c4c4;
5-
@error-text-color: #f00;
6-
@dim-text-color: #a0a0a0;
7-
8-
@input-bg-color: #4a4a4a;
9-
@active-input-bg-color: #4f4f4f;
10-
@input-text-color: #eee;
11-
12-
@hint-bg-color: #d79921;
13-
@hint-color: #363636;
14-
15-
@match-text-color: @hint-bg-color;
1+
@import "colors-dark.less";
162

173
@login-height: 53px;
184
@max-logins-height: @login-height * 7;
@@ -42,8 +28,6 @@ body {
4228
min-width: 260px;
4329
overflow-x: hidden;
4430
white-space: nowrap;
45-
background-color: @bg-color;
46-
color: @text-color;
4731
}
4832

4933
@media (min-resolution: 192dpi) {
@@ -75,7 +59,6 @@ body {
7559
.badge {
7660
display: flex;
7761
align-items: center;
78-
background-color: #626262;
7962
border-radius: 4px;
8063
font-size: 12px;
8164
margin-right: 8px;
@@ -98,7 +81,6 @@ body {
9881
}
9982

10083
.part.error {
101-
color: @error-text-color;
10284
white-space: normal;
10385
padding: 7px;
10486
}
@@ -114,16 +96,9 @@ body {
11496
background-position: top 6px right 6px;
11597
background-repeat: no-repeat;
11698
background-size: 18px;
117-
background-color: @input-bg-color;
118-
}
119-
120-
.part.search:focus-within {
121-
background-color: @active-input-bg-color;
12299
}
123100

124101
.part.search > .hint {
125-
background-color: @hint-bg-color;
126-
color: @hint-color;
127102
line-height: 19px;
128103
}
129104

@@ -138,32 +113,16 @@ body {
138113
}
139114

140115
.part.search > input[type="text"] {
141-
background-color: transparent;
142116
border: none;
143117
outline: none;
144118
width: 100%;
145-
color: @input-text-color;
146119
font-family: "Open Sans";
147120
}
148121

149122
.part.search > input[type="text"]::placeholder {
150-
color: @dim-text-color;
151123
opacity: 1;
152124
}
153125

154-
.logins:not(:hover):not(:focus-within) .part.login:first-child > .name {
155-
background-color: @default-bg-color;
156-
}
157-
158-
.part.login > .name:hover,
159-
.part.login > .name:focus,
160-
.part.login > .action:hover,
161-
.part.login > .action:focus,
162-
.part.login:focus > .name {
163-
background-color: @hover-bg-color;
164-
outline: none;
165-
}
166-
167126
.part.login {
168127
display: flex;
169128
cursor: pointer;
@@ -221,16 +180,9 @@ body {
221180
}
222181

223182
.part.login em {
224-
color: @match-text-color;
225183
font-style: normal;
226184
}
227185

228186
.updates {
229187
padding: @login-part-padding;
230-
border-top: 1px solid @hover-bg-color;
231-
232-
span,
233-
a {
234-
color: @error-text-color;
235-
}
236188
}

0 commit comments

Comments
 (0)