UNPKG

16.6 kBJavaScriptView Raw
1/**
2 * @module settings-panel/theme/typer
3 *
4 * White theme
5 */
6'use strict';
7
8const px = require('add-px-to-style');
9const fonts = require('google-fonts');
10const color = require('tinycolor2');
11const scopeCss = require('scope-css');
12const interpolate = require('color-interpolate');
13const none = require('./none');
14
15
16module.exports = typer;
17
18// typer.palette = ['#4B4E59', '#BCC1C7' ,'#F1F1F3'];
19// typer.palette = ['#32393F', '#3F4851', '#49565F', '#ADB7C0', '#F4FBFF'];
20// typer.palette = ['#111', '#eee'];
21typer.palette = ['white', 'black'];
22// typer.palette = ['#fff', '#24D4C0' ,'#21282E'];
23typer.active = '#24D4C0';
24
25typer.fontSize = 12;
26typer.fontFamily = '"Montserrat", sans-serif';
27typer.labelWidth = '9em';
28typer.inputHeight = 2;
29typer.padding = 1/5;
30
31//color balance
32typer.bg = .9;
33typer.radius = 2;
34typer.fg = .08;
35
36fonts.add({
37 'Montserrat': [400, 600]
38});
39
40
41function typer (opts) {
42 opts = opts || {};
43
44 let h = opts.inputHeight || typer.inputHeight;
45 let labelWidth = opts.labelWidth || typer.labelWidth;
46 let fontSize = opts.fontSize || typer.fontSize;
47 let font = opts.fontFamily || typer.fontFamily;
48 let radius = opts.radius || typer.radius;
49 let padding = opts.padding || typer.padding;
50
51 //background/active tones
52 let bg = opts.bg || typer.bg;
53 let fg = opts.fg || typer.fg;
54
55
56 //palette
57 let palette = opts.palette || typer.palette;
58 let pick = interpolate(palette);
59
60 //obtain palette sorted by brightnes
61 let nPalette = palette.slice().sort((a, b) => color(a).getLuminance() - color(b).getLuminance());
62 let npick = interpolate(nPalette);
63
64 //the color of light/shadow to mix
65 let light = color.mix('white', nPalette[nPalette.length - 1], 25).toString();
66 let shadow = color.mix('black', nPalette[0], 25).toString();
67
68 let active = opts.active || tone(.5);
69
70 //helpers
71 function tone (amt) {
72 if (typeof amt === 'number') {
73 amt = Math.max(Math.min(amt, 1), 0);
74 return color(pick(amt)).toString();
75 }
76 return amt;
77 }
78 function ntone (amt) {
79 if (typeof amt === 'number') {
80 amt = Math.max(Math.min(amt, 1), 0);
81 return color(npick(amt)).toString();
82 }
83 return amt;
84 }
85 function lighten (v, amt, t = tone) {
86 return color(t(v)).lighten(amt*100);
87 }
88 function darken (v, amt, t = tone) {
89 return color(t(v)).darken(amt*100);
90 }
91 function alpha (c, value) {
92 return color(c).setAlpha(value).toString();
93 }
94
95 let inversed = color(palette[0]).getLuminance() > color(palette[palette.length - 1]).getLuminance();
96
97
98 let pop = (v = .9, d = .05, t = tone) => `
99 ${text(fg, v)}
100 background-color: ${t(v)};
101 background-image: linear-gradient(to bottom, ${lighten(v, d, t)}, ${darken(v, d, t)});
102 box-shadow: inset 1px 0px ${alpha(light, .04)}, inset 0px 1px ${alpha(light, .15)}, inset 0px -1px 1px ${alpha(light, .07)}, 0 1px 2px ${alpha(shadow, .35)};
103 `;
104 let push = (v = .1, d = .05, t = tone) => `
105 background: ${t(v)};
106 /*background-image: linear-gradient(to bottom, ${darken(v, d, t)}, ${lighten(v, d, t)});*/
107 box-shadow: inset 0 1px 2px ${alpha(shadow, .18)}, 0 1px ${alpha(light, .2)};
108 color: ${t(1 - fg)};
109 text-shadow: none;
110 `;
111 let text = (v, bg) => color(tone(v)).getLuminance() > color(tone(bg)).getLuminance() ? `
112 color: ${tone(v)};
113 background: ${tone(bg)};
114 text-shadow: 0 -1px ${color.mix(tone(bg), shadow, 50)};
115 ` : `
116 color: ${tone(v)};
117 background: ${tone(bg)};
118 text-shadow: 0 1px ${color.mix(tone(bg), light, 50)};
119 `;
120
121 return none({
122 fontSize: fontSize,
123 fontFamily: font,
124 inputHeight: h,
125 labelWidth: labelWidth,
126 palette: [tone(fg), tone(bg)],
127 padding: padding
128 }) + `
129 :host {
130 ${text(fg, bg)};
131 box-shadow: inset 0 1px ${alpha(light, .15)}, 0 1.5px 11px -2px ${alpha(shadow, .666)};
132 border-radius: ${radius*2}px;
133 }
134
135 .settings-panel-title {
136 font-weight: 400;
137 ${text(fg, bg)};
138 background: none;
139 }
140
141 .settings-panel-label {
142 ${text(.25, bg)};
143 background: none;
144 }
145
146 .settings-panel-field:hover .settings-panel-label {
147 color: ${tone(fg)};
148 }
149
150
151
152 /** Values */
153 .settings-panel-value {
154 }
155 .settings-panel-value:first-child {
156 }
157 .settings-panel-value:hover,
158 .settings-panel-value:focus {
159 }
160
161
162
163 /** Sliders */
164 .settings-panel-range {
165 -webkit-appearance: none;
166 -moz-appearance: none;
167 appearance: none;
168 background: none;
169 border: 0;
170 }
171 .settings-panel-field--range:hover .settings-panel-range,
172 .settings-panel-range:focus {
173 outline: none;
174 }
175 .settings-panel-range::-webkit-slider-runnable-track {
176 height: .5em;
177 border-radius: .5em;
178 ${push(fg, .05)}
179 }
180 .settings-panel-range::-moz-range-track {
181 height: .5em;
182 border-radius: .5em;
183 ${push(fg, .05)}
184 }
185 .settings-panel-range::-ms-track {
186 ${push(fg, .05)}
187 outline: none;
188 color: transparent;
189 border: none;
190 height: .5em;
191 border-radius: .5em;
192 }
193 .settings-panel-range::-ms-fill-lower {
194 border-radius: .5em;
195 ${push(fg, .05)}
196 }
197 .settings-panel-range::-ms-fill-upper {
198 border-radius: .5em;
199 ${push(.93, .05)}
200 }
201
202 @supports (--css: variables) {
203 .settings-panel-range {
204 width: 100%;
205 --active: ${active};
206 --bg: ${tone(.9)};
207 --track-background: linear-gradient(to right, var(--active) 0, var(--active) var(--value), var(--bg) 0) no-repeat;
208 }
209 .settings-panel-range::-webkit-slider-runnable-track {
210 background: var(--track-background);
211 }
212 .settings-panel-range::-moz-range-track {
213 background: var(--track-background);
214 }
215 .settings-panel-field--range .settings-panel-input {
216 margin-right: ${h}em;
217 }
218 .settings-panel-field--range:hover .settings-panel-range,
219 .settings-panel-range:focus {
220 --bg: ${tone(.93)};
221 }
222 .settings-panel-range-value {
223 display: none;
224 position: absolute;
225 top: -${h*1.25}em;
226 text-align: center;
227 padding: 0;
228 color: ${tone(fg)};
229 background: ${tone(1)};
230 box-shadow: 0 1px 5px -1px ${alpha(shadow, .5)};
231 border-radius: ${radius}px;
232 z-index: 3;
233 margin-left: ${-h*.65}em;
234 width: ${h*2}em;
235 text-shadow: none;
236 left: calc(var(--value) - var(--coef) * ${h*.8}em);
237 }
238 .settings-panel-field--range .settings-panel-value-tip {
239 position: absolute;
240 height: 0;
241 top: -${h*.25}em;
242 left: calc(var(--value) - var(--coef) * ${h*.8}em);
243 margin-left: ${h*.1}em;
244 display: none;
245 z-index: 3;
246 border-top: ${h*.3}em solid ${tone(1)};
247 border-left: ${h*.3}em solid transparent;
248 border-right: ${h*.3}em solid transparent;
249 border-bottom: none;
250 }
251 .settings-panel-input:before {
252 border-top: ${h*.3}em solid ${alpha(shadow, .25)};
253 }
254 .settings-panel-field--range:hover .settings-panel-value-tip,
255 .settings-panel-range:focus ~ .settings-panel-value-tip {
256 display: block;
257 }
258 .settings-panel-field--range:hover .settings-panel-value,
259 .settings-panel-range:focus ~ .settings-panel-value {
260 display: block;
261 }
262 }
263
264 .settings-panel-range::-webkit-slider-thumb {
265 ${pop(fg, -.05)};
266 height: ${h*.8}em;
267 width: ${h*.8}em;
268 border-radius: ${h*.8}em;
269 margin-top: -${h*.4}em;
270 border: 0;
271 position: relative;
272 top: .25em;
273 -webkit-appearance: none;
274 appearance: none;
275 z-index: 3;
276 }
277 .settings-panel-range:focus::-webkit-slider-thumb,
278 .settings-panel-range:hover::-webkit-slider-thumb,
279 .settings-panel-field--range:hover .settings-panel-range::-webkit-slider-thumb {
280 }
281 .settings-panel-range::-webkit-slider-thumb:active {
282 }
283
284 .settings-panel-range::-moz-range-thumb {
285 ${pop(fg, -.05)};
286 height: ${h*.8}em;
287 width: ${h*.8}em;
288 border-radius: ${h*.8}em;
289 margin-top: -${h*.4}em;
290 border: 0;
291 position: relative;
292 top: .25em;
293 -moz-appearance: none;
294 appearance: none;
295 z-index: 3;
296 }
297 .settings-panel-range:focus::-moz-range-thumb,
298 .settings-panel-range::-moz-range-thumb:hover,
299 .settings-panel-field--range:hover .settings-panel-range::-moz-range-thumb {
300 }
301 .settings-panel-range::-moz-range-thumb:active {
302 }
303
304 .settings-panel-range::-ms-thumb {
305 ${pop(fg, -.05)};
306 height: ${h*.8}em;
307 width: ${h*.8}em;
308 border-radius: ${h*.8}em;
309 border: 0;
310 position: relative;
311 top: .25em;
312 -ms-appearance: none;
313 appearance: none;
314 z-index: 3;
315 }
316 .settings-panel-range:focus::-ms-thumb,
317 .settings-panel-range:hover::-ms-thumb,
318 .settings-panel-field--range:hover .settings-panel-range::-ms-thumb {
319 }
320 .settings-panel-range::-ms-thumb:active {
321 }
322
323
324 /** Interval */
325 .settings-panel-interval {
326 background: none;
327 }
328 .settings-panel-interval:after {
329 content: '';
330 position: absolute;
331 width: 100%;
332 left: 0;
333 bottom: 0;
334 top: 0;
335 height: .5em;
336 border-radius: .5em;
337 margin-top: auto;
338 margin-bottom: auto;
339 ${push(.9, .05)}
340 background: ${tone(.9)};
341 }
342 .settings-panel-field--interval:hover .settings-panel-interval:after,
343 .settings-panel-interval-dragging .settings-panel-interval:after {
344 background: ${tone(.93)};
345 }
346 .settings-panel-interval-handle {
347 position: absolute;
348 z-index: 1;
349 top: 0;
350 height: .5em;
351 bottom: 0;
352 margin-top: auto;
353 margin-bottom: auto;
354 background: ${active};
355 }
356 .settings-panel-interval-handle:after,
357 .settings-panel-interval-handle:before {
358 content: '';
359 position: absolute;
360 right: -${h*.4}em;
361 top: 0;
362 bottom: 0;
363 margin: auto;
364 height: ${h*.8}em;
365 width: ${h*.8}em;
366 border-radius: ${h*.8}em;
367 ${pop(fg, -.05)};
368 }
369 .settings-panel-interval-handle:before {
370 left: -${h*.4}em;
371 right: auto;
372 }
373
374 .settings-panel-field--interval:hover .settings-panel-interval-handle:after,
375 .settings-panel-field--interval:hover .settings-panel-interval-handle:before,
376 .settings-panel-interval-dragging .settings-panel-interval-handle:after,
377 .settings-panel-interval-dragging .settings-panel-interval-handle:before {
378 ${pop(fg, -.05)};
379 }
380
381 @supports (--css: variables) {
382 .settings-panel-interval {
383 width: 100%;
384 }
385
386 .settings-panel-interval-value {
387 position: absolute;
388 top: -${h*1.25}em;
389 text-align: center;
390 padding: 0;
391 display: none;
392 color: ${tone(fg)};
393 background: ${tone(1)};
394 box-shadow: 0 1px 5px -1px ${alpha(shadow, .5)};
395 border-radius: ${radius}px;
396 z-index: 3;
397 margin-left: ${-h}em;
398 width: ${h*2}em;
399 text-shadow: none;
400 left: var(--value);
401 }
402
403 .settings-panel-field--interval .settings-panel-value-tip {
404 position: absolute;
405 height: 0;
406 display: none;
407 top: -${h*.25}em;
408 left: var(--low);
409 margin-left: ${-h*.3}em;
410 z-index: 3;
411 border-top: ${h*.3}em solid ${tone(1)};
412 border-left: ${h*.3}em solid transparent;
413 border-right: ${h*.3}em solid transparent;
414 border-bottom: none;
415 }
416 .settings-panel-interval-value--right + .settings-panel-value-tip {
417 left: var(--high);
418 }
419
420 .settings-panel-input:before {
421 border-top: ${h*.3}em solid ${alpha(shadow, .25)};
422 }
423 .settings-panel-field--interval:hover .settings-panel-interval-value,
424 .settings-panel-interval-dragging .settings-panel-interval-value {
425 display: block;
426 }
427 @media (min-width: 640px) {
428 .settings-panel-field--interval:hover .settings-panel-value-tip,
429 .settings-panel-interval-dragging .settings-panel-value-tip {
430 display: block;
431 }
432 }
433 }
434
435
436 /** Switch style */
437 .settings-panel-switch {
438 }
439 .settings-panel-switch-input {
440 display: none;
441 }
442 .settings-panel-switch-label {
443 position: relative;
444 display: inline-block;
445 padding: 0 ${h/2}em;
446 margin: 0;
447 z-index: 2;
448 text-align: center;
449 ${pop(bg * .95, .07)};
450 color: ${tone(.25)};
451 }
452 .settings-panel-switch-input:checked + .settings-panel-switch-label {
453 ${push(.95, bg)};
454 color: ${tone(fg)};
455 }
456
457 .settings-panel-switch-input:first-child + .settings-panel-switch-label {
458 border-top-left-radius: 2px;
459 border-bottom-left-radius: 2px;
460 }
461 .settings-panel-switch-label:last-child {
462 border-top-right-radius: 2px;
463 border-bottom-right-radius: 2px;
464 }
465
466 .settings-panel-switch-label:hover {
467 ${pop(bg * .95 + (inversed ? -.07 : .07), .07)};
468 }
469 .settings-panel-switch-label:active {
470 ${pop(bg * .95 + (inversed ? .07 : -.07), .07)};
471 }
472
473
474 /** Select */
475 .settings-panel-select {
476 border-radius: ${radius}px;
477 padding-left: ${h/4}em;
478 outline: none;
479 border: none;
480 -webkit-appearance: none;
481 -moz-appearance: none;
482 -o-appearance:none;
483 appearance:none;
484 ${pop(bg * .95, .07)};
485 color: ${tone(.25)};
486 }
487 .settings-panel-select:hover,
488 .settings-panel-select:active,
489 .settings-panel-select:focus {
490 ${pop(bg * .95 + (inversed ? -.07 : .07), .07)};
491 }
492 .settings-panel-select::-ms-expand {
493 display: none;
494 }
495 .settings-panel-select-triangle {
496 color: inherit;
497 display: block;
498 transform: scale(.8);
499 }
500
501
502 /** Button */
503 .settings-panel-button {
504 text-align: center;
505 border: none;
506 border-radius: ${radius}px;
507 ${pop(bg * .95, .07)};
508 color: ${tone(.25)};
509 }
510 .settings-panel-button:focus {
511 outline: none;
512 }
513 .settings-panel-button:hover {
514 ${pop(bg * .95 + (inversed ? -.07 : .07), .07)};
515 color: ${tone(fg)};
516 }
517 .settings-panel-button:active {
518 ${push(fg, .05)};
519 }
520
521
522 /** Text */
523 .settings-panel-text,
524 .settings-panel-textarea {
525 -webkit-appearance: none;
526 -moz-appearance: none;
527 -o-appearance:none;
528 border: none;
529 height: ${h}em;
530 padding: 0;
531 width: 100%;
532 border-radius: ${radius}px;
533 padding-left: .4em;
534 ${push(bg*.95)};
535 color: ${tone(fg)};
536 text-shadow: none;
537 }
538 .settings-panel-textarea {
539 padding-top: .35em;
540 }
541
542 .settings-panel-text:hover,
543 .settings-panel-textarea:hover,
544 .settings-panel-text:focus,
545 .settings-panel-textarea:focus {
546 ${push(bg * .95 - .04)};
547 color: ${tone(fg)};
548 outline: none;
549 }
550
551 /** Color */
552 .settings-panel-color {
553 position: relative;
554 width: ${h}em;
555 border-top-left-radius: 3px;
556 border-bottom-left-radius: 3px;
557 display: inline-block;
558 vertical-align: baseline;
559 box-shadow: 0 1px ${alpha(light, .2)};
560 }
561 .settings-panel-color-value {
562 -webkit-appearance: none;
563 -moz-appearance: none;
564 -o-appearance:none;
565 border: none;
566 padding-left: ${h/4}em;
567 width: calc(100% - ${h}em);
568 font-family: inherit;
569 border-top-left-radius: 0;
570 border-bottom-left-radius: 0;
571 border-top-right-radius: 3px;
572 border-bottom-right-radius: 3px;
573 ${push(bg*.95)};
574 color: ${tone(fg)};
575 text-shadow: none;
576 }
577 .settings-panel-color-value:hover,
578 .settings-panel-color-value:focus {
579 outline: none;
580 ${push(bg * .95 - .04)};
581 color: ${tone(fg)};
582 }
583
584
585 /** Checkbox */
586 .settings-panel-checkbox {
587 display: none;
588 }
589 .settings-panel-checkbox-label {
590 display: inline-block;
591 ${text(.25, bg)};
592 position: relative;
593 margin-right: ${h}em;
594 }
595 .settings-panel-checkbox-label:before {
596 font-family: "Material Icons";
597 content: '';
598 font-weight: bolder;
599 font-size: ${h*.75}em;
600 display: block;
601 float: left;
602 width: 2em;
603 margin-right: -2em;
604 margin-top: -${h*.1}em;
605 opacity: 0;
606 z-index: 1;
607 position: relative;
608 color: ${tone(fg)};
609 text-shadow: 0 1px 2px ${alpha(shadow, .5)};
610 }
611 .settings-panel-checkbox-label:after {
612 content: '';
613 display: block;
614 float: left;
615 margin-top: -${h*.05}em;
616 width: ${h*.666}em;
617 height: ${h*.666}em;
618 border-radius: ${radius}px;
619 position: relative;
620 margin-right: ${h/3}em;
621 line-height: ${h/2}em;
622 text-align: center;
623 z-index: 0;
624 ${push(.9)};
625 }
626 .settings-panel-checkbox-label:hover {
627 color: ${tone(fg)};
628 }
629 .settings-panel-checkbox-label:hover:after {
630 ${push(.93, .07)};
631 }
632 .settings-panel-checkbox:checked + .settings-panel-checkbox-label {
633 }
634 .settings-panel-checkbox:checked + .settings-panel-checkbox-label:before {
635 opacity: 1;
636 }
637 .settings-panel-checkbox:checked + .settings-panel-checkbox-label:after {
638 ${push(.93, .1)};
639 }
640
641
642 /** Decorations */
643 ::-webkit-input-placeholder {
644 color: ${alpha(tone(0), .5)};
645 }
646 ::-moz-placeholder {
647 color: ${alpha(tone(0), .5)};
648 }
649 :-ms-input-placeholder {
650 color: ${alpha(tone(0), .5)};
651 }
652 :-moz-placeholder {
653 color: ${alpha(tone(0), .5)};
654 }
655 ::-moz-selection {
656 background: ${tone(fg)};
657 color: ${tone(bg)};
658 }
659 ::selection {
660 background: ${tone(fg)};
661 color: ${tone(bg)};
662 }
663 :host hr {
664 border: none;
665 height: 3px;
666 border-radius: ${radius}px;
667 margin: ${h/3}em 0;
668 ${push(bg * .98, .05)};
669 }
670 `;
671};
672
\No newline at end of file