diff --git a/assets/fonts/kolidecons/kolidecons.woff b/assets/fonts/kolidecons/kolidecons.woff
index 0343901297..0cd13cc0b0 100644
Binary files a/assets/fonts/kolidecons/kolidecons.woff and b/assets/fonts/kolidecons/kolidecons.woff differ
diff --git a/frontend/components/buttons/Rocker/Rocker.jsx b/frontend/components/buttons/Rocker/Rocker.jsx
new file mode 100644
index 0000000000..e0de2a5dcf
--- /dev/null
+++ b/frontend/components/buttons/Rocker/Rocker.jsx
@@ -0,0 +1,51 @@
+import React, { Component, PropTypes } from 'react';
+import { noop } from 'lodash';
+import classnames from 'classnames';
+
+class Rocker extends Component {
+
+ static propTypes = {
+ className: PropTypes.string,
+ handleChange: PropTypes.func,
+ name: PropTypes.string,
+ options: PropTypes.shape({
+ aText: PropTypes.string,
+ aIcon: PropTypes.string,
+ bText: PropTypes.string,
+ bIcon: PropTypes.string,
+ }),
+ value: PropTypes.string,
+ };
+
+ static defaultProps = {
+ handleChange: noop,
+ };
+
+ render () {
+ const { className, handleChange, name, options, value } = this.props;
+ const { aText, aIcon, bText, bIcon } = options;
+ const baseClass = 'kolide-rocker';
+
+ const rockerClasses = classnames(baseClass, className);
+
+ return (
+
+
+
+ );
+ }
+}
+
+export default Rocker;
diff --git a/frontend/components/buttons/Rocker/_styles.scss b/frontend/components/buttons/Rocker/_styles.scss
new file mode 100644
index 0000000000..fedb38edea
--- /dev/null
+++ b/frontend/components/buttons/Rocker/_styles.scss
@@ -0,0 +1,132 @@
+.kolide-rocker {
+ &__label {
+ position: relative;
+ cursor: pointer;
+ width: 180px;
+ height: 36px;
+ border-radius: 2px;
+ background-color: #9fa5ab;
+ display: block;
+ padding: 0 2px;
+ box-shadow: inset 0 -3px 3px #aab3bd;
+ }
+
+ &__checkbox {
+ display: none;
+
+ &:checked ~ .kolide-rocker__switch--opt-b {
+ span {
+ @include transform(skewX(0) rotateZ(0));
+ top: 3px;
+ }
+
+ &::after {
+ @include transform(skewX(0) rotateZ(0) translate(0, 0));
+ left: 0;
+ width: 90px;
+ height: 35px;
+ bottom: 3px;
+ }
+ }
+
+ &:checked ~ .kolide-rocker__switch--opt-a {
+ span {
+ @include transform(skewX(-6deg) rotateZ(-6deg));
+ top: -6px;
+ }
+
+ &::after {
+ @include transform(skewX(-6deg) rotateZ(-6deg) translate(-1px, -3px));
+ right: -1px;
+ width: 90px;
+ height: 35px;
+ bottom: 5px;
+ }
+ }
+ }
+
+ &__switch {
+ @include user-select(none);
+ @include position(absolute, auto auto auto auto);
+ font-family: 'Oxygen', $helvetica;
+ font-weight: 600;
+ font-style: normal;
+ box-sizing: border-box;
+ text-transform: uppercase;
+ display: block;
+ width: 90px;
+ height: 35px;
+
+ &::after {
+ @include transition(transform 50ms ease-in-out, bottom 50ms ease-in-out);
+ bottom: 3px;
+ border-radius: 2px;
+ content: attr(data-content);
+ width: 90px;
+ height: 33px;
+ position: absolute;
+ box-sizing: border-box;
+ }
+
+ &:hover {
+ cursor: pointer;
+ }
+
+ span {
+ @include transition(transform 50ms ease-in-out, top 50ms ease-in-out);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ font-size: 15px;
+ color: #fff;
+ letter-spacing: 0.6px;
+ display: block;
+ text-align: center;
+ width: 100%;
+
+ .kolidecon {
+ margin-right: 5px;
+ }
+ }
+
+ &--opt-b {
+ @include linear-gradient(-180deg, #eaedfb 81%, #aab3bd 100%);
+ left: 2px;
+
+ span {
+ @include transform(skewX(6deg) rotateZ(6deg));
+ color: #b8c2e3;
+ transform-origin: left top;
+ top: -6px;
+ }
+
+ &::after {
+ @include transform(skewX(6deg) rotateZ(6deg) translate(-1px, -3px));
+ background-color: #fff;
+ border: solid 1px #d4d8df;
+ border-radius: 2px 1px 1px 2px;
+ left: 1px;
+ bottom: 5px;
+ }
+ }
+
+ &--opt-a {
+ @include linear-gradient(-180deg, #9651ca 81%, #6e3c93 100%);
+ right: 2px;
+
+ span {
+ transform-origin: right top;
+ top: 4px;
+ }
+
+ &::after {
+ background-color: #ae6ddf;
+ border: solid 1px #9651ca;
+ border-radius: 1px 2px 2px 1px;
+ right: 0;
+ bottom: 3px;
+ }
+ }
+ }
+}
diff --git a/frontend/components/buttons/Rocker/index.js b/frontend/components/buttons/Rocker/index.js
new file mode 100644
index 0000000000..c19ce0e5f3
--- /dev/null
+++ b/frontend/components/buttons/Rocker/index.js
@@ -0,0 +1 @@
+export default from './Rocker';
diff --git a/frontend/pages/HomePage/HomePage.jsx b/frontend/pages/HomePage/HomePage.jsx
index c5ac14b499..5da65bf56e 100644
--- a/frontend/pages/HomePage/HomePage.jsx
+++ b/frontend/pages/HomePage/HomePage.jsx
@@ -3,6 +3,7 @@ import { connect } from 'react-redux';
import { Link } from 'react-router';
import Avatar from '../../components/Avatar';
+import Rocker from '../../components/buttons/Rocker';
import paths from '../../router/paths';
import userInterface from '../../interfaces/user';
@@ -15,12 +16,19 @@ export class HomePage extends Component {
const { user } = this.props;
const { LOGOUT } = paths;
const baseClass = 'home-page';
+ const rockerOpts = {
+ aText: 'List',
+ aIcon: 'list-select',
+ bText: 'Grid',
+ bIcon: 'grid-select',
+ };
return (
{user &&
}
You are successfully logged in!
{user &&
Logout}
+
);
}
diff --git a/frontend/styles/global/_global.scss b/frontend/styles/global/_global.scss
index f3a16b56ba..03606a975b 100644
--- a/frontend/styles/global/_global.scss
+++ b/frontend/styles/global/_global.scss
@@ -1,6 +1,9 @@
html {
position: relative;
min-height: 100%;
+ // Because iOS hates us we must fight to the death!
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ // End Apple War
}
body {
diff --git a/frontend/styles/global/_icons.scss b/frontend/styles/global/_icons.scss
index 2649fe6fdb..4110086fee 100644
--- a/frontend/styles/global/_icons.scss
+++ b/frontend/styles/global/_icons.scss
@@ -1,228 +1,236 @@
-[class^="kolidecon-"],
-[class*=" kolidecon-"],
+[class^='kolidecon-'],
+[class*=' kolidecon-'],
.kolidecon {
- display: inline-block;
- font: normal normal normal 14px/1 'kolidecons';
- font-size: inherit;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
+ display: inline-block;
+ font: normal normal normal 14px/1 'kolidecons';
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
}
- .kolidecon-lg {
- font-size: 1.33333333em;
- line-height: 0.75em;
- vertical-align: -15%;
+.kolidecon-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
}
.kolidecon-2x {
- font-size: 2em;
+ font-size: 2em;
}
.kolidecon-3x {
- font-size: 3em;
+ font-size: 3em;
}
.kolidecon-4x {
- font-size: 4em;
+ font-size: 4em;
}
.kolidecon-5x {
- font-size: 5em;
+ font-size: 5em;
}
- .kolidecon-fw {
- width: 1.28571429em;
- text-align: center;
+.kolidecon-fw {
+ width: 1.28571429em;
+ text-align: center;
}
- .kolidecon-kolide-logo-flat:before {
- content: '\f000';
+.kolidecon-kolide-logo-flat:before {
+ content: '\f000';
}
- .kolidecon-chevrondown:before {
- content: '\f004';
+.kolidecon-chevrondown:before {
+ content: '\f004';
}
- .kolidecon-chevronleft:before {
- content: '\f006';
+.kolidecon-chevronleft:before {
+ content: '\f006';
}
- .kolidecon-chevronright:before {
- content: '\f008';
+.kolidecon-chevronright:before {
+ content: '\f008';
}
- .kolidecon-chevronup:before {
- content: '\f00a';
+.kolidecon-chevronup:before {
+ content: '\f00a';
}
- .kolidecon-cpu:before {
- content: '\f00c';
+.kolidecon-cpu:before {
+ content: '\f00c';
}
- .kolidecon-downcarat:before {
- content: '\f00d';
+.kolidecon-downcarat:before {
+ content: '\f00d';
}
- .kolidecon-filter:before {
- content: '\f00f';
+.kolidecon-filter:before {
+ content: '\f00f';
}
- .kolidecon-mac:before {
- content: '\f012';
+.kolidecon-mac:before {
+ content: '\f012';
}
- .kolidecon-memory:before {
- content: '\f013';
+.kolidecon-memory:before {
+ content: '\f013';
}
- .kolidecon-penciledit:before {
- content: '\f015';
+.kolidecon-penciledit:before {
+ content: '\f015';
}
- .kolidecon-storage:before {
- content: '\f019';
+.kolidecon-storage:before {
+ content: '\f019';
}
- .kolidecon-upcarat:before {
- content: '\f01b';
+.kolidecon-upcarat:before {
+ content: '\f01b';
}
- .kolidecon-uptime:before {
- content: '\f01c';
+.kolidecon-uptime:before {
+ content: '\f01c';
}
- .kolidecon-world:before {
- content: '\f01d';
+.kolidecon-world:before {
+ content: '\f01d';
}
- .kolidecon-osquery:before {
- content: '\f021';
+.kolidecon-osquery:before {
+ content: '\f021';
}
- .kolidecon-join:before {
- content: '\f022';
+.kolidecon-join:before {
+ content: '\f022';
}
- .kolidecon-add-button:before {
- content: '\f029';
+.kolidecon-add-button:before {
+ content: '\f029';
}
- .kolidecon-username:before {
- content: '\f02a';
+.kolidecon-username:before {
+ content: '\f02a';
}
- .kolidecon-password:before {
- content: '\f02b';
+.kolidecon-password:before {
+ content: '\f02b';
}
- .kolidecon-email:before {
- content: '\f02c';
+.kolidecon-email:before {
+ content: '\f02c';
}
- .kolidecon-query:before {
- content: '\f02d';
+.kolidecon-query:before {
+ content: '\f02d';
}
- .kolidecon-hosts:before {
- content: '\f02e';
+.kolidecon-hosts:before {
+ content: '\f02e';
}
- .kolidecon-packs:before {
- content: '\f02f';
+.kolidecon-packs:before {
+ content: '\f02f';
}
- .kolidecon-help:before {
- content: '\f030';
+.kolidecon-help:before {
+ content: '\f030';
}
- .kolidecon-admin:before {
- content: '\f031';
+.kolidecon-admin:before {
+ content: '\f031';
}
- .kolidecon-config:before {
- content: '\f032';
+.kolidecon-config:before {
+ content: '\f032';
}
- .kolidecon-label:before {
- content: '\f033';
+.kolidecon-mia:before {
+ content: '\f034';
}
- .kolidecon-mia:before {
- content: '\f034';
+.kolidecon-success-check:before {
+ content: '\f035';
}
- .kolidecon-success-check:before {
- content: '\f035';
+.kolidecon-offline:before {
+ content: '\f036';
}
- .kolidecon-offline:before {
- content: '\f036';
+.kolidecon-windows:before {
+ content: '\f037';
}
- .kolidecon-windows:before {
- content: '\f037';
+.kolidecon-centos:before {
+ content: '\f038';
}
- .kolidecon-centos:before {
- content: '\f038';
+.kolidecon-ubuntu:before {
+ content: '\f039';
}
- .kolidecon-ubuntu:before {
- content: '\f039';
+.kolidecon-apple:before {
+ content: '\f03a';
}
- .kolidecon-apple:before {
- content: '\f03a';
+.kolidecon-search:before {
+ content: '\f03b';
}
- .kolidecon-search:before {
- content: '\f03b';
+.kolidecon-all-hosts:before {
+ content: '\f03c';
}
- .kolidecon-all-hosts:before {
- content: '\f03c';
+.kolidecon-single-host:before {
+ content: '\f03d';
}
- .kolidecon-single-host:before {
- content: '\f03d';
+.kolidecon-alerts:before {
+ content: '\f03e';
}
- .kolidecon-alerts:before {
- content: '\f03e';
+.kolidecon-logout:before {
+ content: '\f03f';
}
- .kolidecon-logout:before {
- content: '\f03f';
+.kolidecon-user-settings:before {
+ content: '\f040';
}
- .kolidecon-user-settings:before {
- content: '\f040';
+.kolidecon-clipboard:before {
+ content: '\f043';
}
- .kolidecon-clipboard:before {
- content: '\f043';
+.kolidecon-list-select:before {
+ content: '\f044';
+}
+
+.kolidecon-grid-select:before {
+ content: '\f045';
+}
+
+.kolidecon-label:before {
+ content: '\f033';
}
.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- border: 0
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- margin: 0;
- overflow: visible;
- clip: auto
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto
}
diff --git a/frontend/templates/react.tmpl b/frontend/templates/react.tmpl
index 84252d3469..77716a9ee8 100644
--- a/frontend/templates/react.tmpl
+++ b/frontend/templates/react.tmpl
@@ -8,5 +8,8 @@
+
+
+