Define the base URL which osqueryd clients use to connect and register with Kolide.
Note: Please ensure the URL you choose is accessible to all endpoints that need to communicate with Kolide. Otherwise, they will not be able to correctly register.
@@ -81,51 +111,82 @@ class RegistrationForm extends Component {
return false;
}
- renderHeader = () => {
+ renderContent = () => {
const { page } = this.props;
- const headerText = PAGE_HEADER_TEXT[page];
-
- if (headerText) {
- return
{headerText} ;
- }
-
- return false;
- }
-
- renderPageForm = () => {
const { formData } = this.state;
- const { onPageFormSubmit, onSubmit } = this;
- const { page } = this.props;
-
- if (page === 1) {
- return
;
- }
-
- if (page === 2) {
- return
;
- }
-
- if (page === 3) {
- return
;
- }
+ const {
+ onSubmitConfirmation,
+ renderDescription,
+ renderHeader,
+ } = this;
if (page === 4) {
- return
;
+ return (
+
+ {renderHeader()}
+
+
+ );
}
- return false;
+ return (
+
+ {renderHeader()}
+ {renderDescription()}
+
+ );
}
render () {
- const { onSubmit } = this.props;
- const { renderDescription, renderHeader, renderPageForm } = this;
+ const { onSubmit, page } = this.props;
+ const { formData } = this.state;
+ const { isCurrentPage, onPageFormSubmit, renderContent } = this;
+
+ const containerClass = classnames(`${baseClass}__container`, {
+ [`${baseClass}__container--complete`]: page > 3,
+ });
+
+ const adminDetailsClass = classnames(
+ `${baseClass}__field-wrapper`,
+ `${baseClass}__field-wrapper--admin`
+ );
+
+ const orgDetailsClass = classnames(
+ `${baseClass}__field-wrapper`,
+ `${baseClass}__field-wrapper--org`
+ );
+
+ const kolideDetailsClass = classnames(
+ `${baseClass}__field-wrapper`,
+ `${baseClass}__field-wrapper--kolide`
+ );
+
+ const formSectionClasses = classnames(
+ `${baseClass}__form`,
+ {
+ [`${baseClass}__form--step1-active`]: page === 1,
+ [`${baseClass}__form--step1-complete`]: page > 1,
+ [`${baseClass}__form--step2-active`]: page === 2,
+ [`${baseClass}__form--step2-complete`]: page > 2,
+ [`${baseClass}__form--step3-active`]: page === 3,
+ [`${baseClass}__form--step3-complete`]: page > 3,
+ }
+ );
return (
-
+
+
+ {renderContent()}
+
+
+
+
);
}
}
diff --git a/frontend/components/forms/RegistrationForm/_styles.scss b/frontend/components/forms/RegistrationForm/_styles.scss
new file mode 100644
index 0000000000..03d00eeac9
--- /dev/null
+++ b/frontend/components/forms/RegistrationForm/_styles.scss
@@ -0,0 +1,196 @@
+.user-registration {
+ @include display(flex);
+ @include align-content(center);
+ @include justify-content(center);
+ @include flex-grow(1);
+
+ &__container {
+ @include align-self(center);
+ @include size(500px 520px);
+ border-radius: 4px;
+ background-color: $bg-light;
+ box-shadow: 0 0 30px 0 rgba(0, 0, 0, 0.3);
+ box-sizing: border-box;
+ padding: 25px 35px;
+ margin-top: -55px;
+
+ &--complete {
+ padding: 0;
+
+ .user-registration__title {
+ font-size: 24px;
+ font-weight: $bold;
+ line-height: 0.54;
+ letter-spacing: 0.9px;
+ color: $text-dark;
+ padding: 25px 35px;
+ }
+ }
+ }
+
+ &__form {
+ @include transform(translateY(-85px));
+ width: 100%;
+ height: 470px;
+ position: absolute;
+ top: 50%;
+ left: 0;
+ overflow: hidden;
+ box-sizing: border-box;
+ padding: 25px 0;
+
+ @include breakpoint(tablet) {
+ @include transform(translateY(-100px));
+ }
+
+ &--step1-complete {
+ .user-registration__field-wrapper--admin {
+ left: -184px;
+ }
+
+ .user-registration__field-wrapper--org {
+ left: 50%;
+ }
+
+ .user-registration__field-wrapper--kolide {
+ left: calc(100% + 184px);
+ }
+ }
+
+ &--step2-complete {
+ .user-registration__field-wrapper--admin {
+ left: calc(-50% - 184px);
+ }
+
+ .user-registration__field-wrapper--org {
+ left: -184px;
+ }
+
+ .user-registration__field-wrapper--kolide {
+ left: 50%;
+ }
+ }
+
+ &--step3-complete {
+ .user-registration__field-wrapper--admin {
+ left: calc(-100% - 184px);
+ }
+
+ .user-registration__field-wrapper--org {
+ left: calc(-50% - 184px);
+ }
+
+ .user-registration__field-wrapper--kolide {
+ left: -184px;
+ }
+ }
+
+ &::before,
+ &::after {
+ background-image: linear-gradient(to right, $accent-dark 50%, transparent 50%);
+ background-position: left top;
+ background-repeat: repeat-x;
+ background-size: 17px 2px;
+ position: absolute;
+ top: 100px;
+ left: 50%;
+ width: 50%;
+ height: 2px;
+ content: '';
+ z-index: 1;
+ }
+
+ &::before {
+ left: auto;
+ right: 50%;
+ }
+
+ &--step1-active {
+ &::before {
+ display: none;
+ }
+ }
+
+ &--step3-active,
+ &--step3-complete {
+ &::after {
+ display: none;
+ }
+ }
+ }
+
+ &__description {
+ font-size: 14px;
+ font-weight: $light;
+ line-height: 1.43;
+ letter-spacing: 0.5px;
+ color: $text-dark;
+ }
+
+ &__title {
+ font-size: 18px;
+ font-weight: $bold;
+ line-height: 0.72;
+ letter-spacing: 0.6px;
+ color: $text-dark;
+ margin: 0;
+ padding: 0;
+ }
+
+ &__field-wrapper {
+ @include transition(left 300ms ease);
+ width: 430px;
+ min-height: 400px;
+ padding-bottom: 75px;
+ border-radius: 4px;
+ background-color: $bg-light;
+ box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.3);
+ margin: 0 auto;
+ position: absolute;
+ box-sizing: border-box;
+ margin-left: -215px;
+ z-index: 2;
+
+ &--admin {
+ left: 50%;
+ }
+
+ &--org {
+ left: calc(100% + 184px);
+ }
+
+ &--kolide {
+ top: 45px;
+ left: calc(150% + 184px);
+ }
+
+ input {
+ background-color: transparent;
+ }
+
+ .button {
+ bottom: 0;
+ top: auto;
+ position: absolute;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+
+ &:active {
+ top: auto;
+ }
+ }
+
+ .registration-fields {
+ padding: 0 35px 25px;
+ box-sizing: border-box;
+ }
+ }
+
+ &__confirmation {
+ background-color: $bg-light;
+ position: relative;
+ z-index: 2;
+ width: 500px;
+ height: 500px;
+ }
+}
diff --git a/frontend/components/forms/fields/Checkbox/Checkbox.jsx b/frontend/components/forms/fields/Checkbox/Checkbox.jsx
new file mode 100644
index 0000000000..939587582b
--- /dev/null
+++ b/frontend/components/forms/fields/Checkbox/Checkbox.jsx
@@ -0,0 +1,33 @@
+import React, { Component, PropTypes } from 'react';
+import classnames from 'classnames';
+import { noop } from 'lodash';
+
+const baseClass = 'kolide-checkbox';
+
+class InputField extends Component {
+ static propTypes = {
+ children: PropTypes.node,
+ className: PropTypes.string,
+ name: PropTypes.string,
+ onChange: PropTypes.func,
+ };
+
+ static defaultProps = {
+ onChange: noop,
+ };
+
+ render () {
+ const { children, className, name, onChange } = this.props;
+ const checkBoxClass = classnames(baseClass, className);
+
+ return (
+
+
+
+ {children}
+
+ );
+ }
+}
+
+export default InputField;
diff --git a/frontend/components/forms/fields/Checkbox/Checkbox.tests.jsx b/frontend/components/forms/fields/Checkbox/Checkbox.tests.jsx
new file mode 100644
index 0000000000..d577e3e530
--- /dev/null
+++ b/frontend/components/forms/fields/Checkbox/Checkbox.tests.jsx
@@ -0,0 +1,11 @@
+import React from 'react';
+import expect from 'expect';
+import { mount } from 'enzyme';
+
+import Checkbox from './Checkbox';
+
+describe('Checkbox - component', () => {
+ it('renders', () => {
+ expect(mount(
)).toExist();
+ });
+});
diff --git a/frontend/components/forms/fields/Checkbox/_styles.scss b/frontend/components/forms/fields/Checkbox/_styles.scss
new file mode 100644
index 0000000000..51262a19c9
--- /dev/null
+++ b/frontend/components/forms/fields/Checkbox/_styles.scss
@@ -0,0 +1,45 @@
+.kolide-checkbox {
+ &__input {
+ visibility: hidden;
+ margin: 0;
+
+ &:checked + .kolide-checkbox__tick {
+ &::after {
+ background-color: $brand;
+ border: solid 2px $brand;
+ }
+
+ &::before {
+ @include transform(rotate(45deg));
+ @include position(absolute, 50% null null 50%);
+ box-sizing: border-box;
+ display: table;
+ width: 7px;
+ height: 13px;
+ margin: -8px 0 0 -4px;
+ border: 2px solid $white;
+ border-top: 0;
+ border-left: 0;
+ content: '';
+ }
+ }
+ }
+
+ &__tick {
+ @include size(20px);
+ position: absolute;
+ display: inline-block;
+
+ &::after {
+ @include transition(border 75ms ease-in-out, background 75ms ease-in-out);
+ @include size(20px);
+ border-radius: 2px;
+ border: solid 2px $border-medium;
+ content: '';
+ box-sizing: border-box;
+ display: block;
+ background-color: $white;
+ visibility: visible;
+ }
+ }
+}
diff --git a/frontend/components/forms/fields/Checkbox/index.js b/frontend/components/forms/fields/Checkbox/index.js
new file mode 100644
index 0000000000..f3d29de1e6
--- /dev/null
+++ b/frontend/components/forms/fields/Checkbox/index.js
@@ -0,0 +1 @@
+export default from './Checkbox';
diff --git a/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx b/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx
index ba5e299ed7..9b00a76f3c 100644
--- a/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx
+++ b/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx
@@ -10,10 +10,12 @@ class InputFieldWithIcon extends InputField {
static propTypes = {
autofocus: PropTypes.bool,
error: PropTypes.string,
+ hint: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
iconName: PropTypes.string,
name: PropTypes.string,
onChange: PropTypes.func,
placeholder: PropTypes.string,
+ tabIndex: PropTypes.number,
type: PropTypes.string,
className: PropTypes.string,
};
@@ -33,9 +35,19 @@ class InputFieldWithIcon extends InputField {
return
{placeholder}
;
}
+ renderHint = () => {
+ const { hint } = this.props;
+
+ if (hint) {
+ return
{hint} ;
+ }
+
+ return false;
+ }
+
render () {
- const { className, error, iconName, name, placeholder, type, value } = this.props;
- const { onInputChange } = this;
+ const { className, error, iconName, name, placeholder, tabIndex, type, value } = this.props;
+ const { onInputChange, renderHint } = this;
const inputClasses = classnames(
`${baseClass}__input`,
@@ -60,10 +72,12 @@ class InputFieldWithIcon extends InputField {
className={inputClasses}
placeholder={placeholder}
ref={(r) => { this.input = r; }}
+ tabIndex={tabIndex}
type={type}
value={value}
/>
{iconName &&
}
+ {renderHint()}
);
}
diff --git a/frontend/components/forms/fields/InputFieldWithIcon/_styles.scss b/frontend/components/forms/fields/InputFieldWithIcon/_styles.scss
index 56941e5d44..168bbcd53d 100644
--- a/frontend/components/forms/fields/InputFieldWithIcon/_styles.scss
+++ b/frontend/components/forms/fields/InputFieldWithIcon/_styles.scss
@@ -7,7 +7,7 @@
position: absolute;
right: 6px;
top: 28px;
- font-size: 20px;
+ font-size: 14px;
color: $accent-text;
&--active {
@@ -27,13 +27,18 @@
font-size: 20px;
border-bottom-style: solid;
border-bottom-color: $brand-ultralight;
- color: $accent-text;
padding-right: 30px;
opacity: 1;
text-indent: 1px;
position: relative;
width: 100%;
box-sizing: border-box;
+ font-family: 'Oxygen', $helvetica;
+ color: $text-dark;
+
+ @include placeholder {
+ color: $accent-text;
+ }
&:focus {
outline: none;
@@ -63,4 +68,19 @@
font-size: $small;
text-transform: lowercase;
}
+
+ &__hint {
+ font-size: 14px;
+ font-weight: $normal;
+ line-height: 1.57;
+ letter-spacing: 1px;
+ color: $accent-text;
+
+ code {
+ color: $brand-light;
+ background-color: $accent-light;
+ padding: 2px;
+ font-family: 'SourceCodePro', $monospace;
+ }
+ }
}
diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/TargetDetails/_styles.scss b/frontend/components/forms/fields/SelectTargetsDropdown/TargetDetails/_styles.scss
index 109a0be625..793f772d16 100644
--- a/frontend/components/forms/fields/SelectTargetsDropdown/TargetDetails/_styles.scss
+++ b/frontend/components/forms/fields/SelectTargetsDropdown/TargetDetails/_styles.scss
@@ -7,7 +7,7 @@
font-size: $xsmall;
display: none;
- @include breakpoint(tablet) {
+ @include breakpoint(ltdesktop) {
display: inline-block;
position: absolute;
top: 10px;
@@ -20,7 +20,7 @@
}
}
- @include breakpoint(tablet) {
+ @include breakpoint(ltdesktop) {
padding-top: $pad-most;
}
}
diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/_styles.scss b/frontend/components/forms/fields/SelectTargetsDropdown/_styles.scss
index 89b8bc5199..b011dd57c0 100644
--- a/frontend/components/forms/fields/SelectTargetsDropdown/_styles.scss
+++ b/frontend/components/forms/fields/SelectTargetsDropdown/_styles.scss
@@ -181,7 +181,7 @@
}
}
- @include breakpoint(tablet) {
+ @include breakpoint(ltdesktop) {
.Select-menu-outer {
.Select-menu {
min-width: 665px;
diff --git a/frontend/interfaces/registration_form_data.js b/frontend/interfaces/registration_form_data.js
index c61c347b56..f9a8fedc41 100644
--- a/frontend/interfaces/registration_form_data.js
+++ b/frontend/interfaces/registration_form_data.js
@@ -1,7 +1,6 @@
import { PropTypes } from 'react';
export default PropTypes.shape({
- full_name: PropTypes.string,
username: PropTypes.string,
password: PropTypes.string,
password_confirmation: PropTypes.string,
diff --git a/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.jsx b/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.jsx
index b0488f7d8e..e2b794149b 100644
--- a/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.jsx
+++ b/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.jsx
@@ -24,21 +24,26 @@ class Breadcrumbs extends Component {
render () {
const { onClick } = this;
const { page } = this.props;
- const page1ClassName = classnames('button--unstyled', 'page-1-btn', {
- 'is-active': page >= 1,
+ const baseClass = 'registration-breadcrumbs';
+ const pageBaseClass = `${baseClass}__page`;
+ const page1ClassName = classnames(pageBaseClass, `${pageBaseClass}--1`, 'button--unstyled', {
+ [`${pageBaseClass}--active`]: page === 1,
+ [`${pageBaseClass}--complete`]: page > 1,
});
- const page2ClassName = classnames('button--unstyled', 'page-2-btn', {
- 'is-active': page >= 2,
+ const page2ClassName = classnames(pageBaseClass, `${pageBaseClass}--2`, 'button--unstyled', {
+ [`${pageBaseClass}--active`]: page === 2,
+ [`${pageBaseClass}--complete`]: page > 2,
});
- const page3ClassName = classnames('button--unstyled', 'page-3-btn', {
- 'is-active': page >= 3,
+ const page3ClassName = classnames(pageBaseClass, `${pageBaseClass}--3`, 'button--unstyled', {
+ [`${pageBaseClass}--active`]: page === 3,
+ [`${pageBaseClass}--complete`]: page > 3,
});
return (
-
-
Page 1
-
Page 2
-
Page 3
+
+ Setup User
+ Setup Organization
+ Set Kolide URL
);
}
diff --git a/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.tests.jsx b/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.tests.jsx
index 1fb5a6d2d5..566e2b05d0 100644
--- a/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.tests.jsx
+++ b/frontend/pages/RegistrationPage/Breadcrumbs/Breadcrumbs.tests.jsx
@@ -14,21 +14,21 @@ describe('Breadcrumbs - component', () => {
it('renders page 1 Button as active when the page prop is 1', () => {
const component = mount(
);
- const page1Btn = component.find('button.page-1-btn');
- const page2Btn = component.find('button.page-2-btn');
- const page3Btn = component.find('button.page-3-btn');
+ const page1Btn = component.find('button.registration-breadcrumbs__page--1');
+ const page2Btn = component.find('button.registration-breadcrumbs__page--2');
+ const page3Btn = component.find('button.registration-breadcrumbs__page--3');
- expect(page1Btn.prop('className')).toInclude('is-active');
- expect(page2Btn.prop('className')).toNotInclude('is-active');
- expect(page3Btn.prop('className')).toNotInclude('is-active');
+ expect(page1Btn.prop('className')).toInclude('registration-breadcrumbs__page--active');
+ expect(page2Btn.prop('className')).toNotInclude('registration-breadcrumbs__page--active');
+ expect(page3Btn.prop('className')).toNotInclude('registration-breadcrumbs__page--active');
});
it('calls the onClick prop with the page # when clicked', () => {
const onClickSpy = createSpy();
const component = mount(
);
- const page1Btn = component.find('button.page-1-btn');
- const page2Btn = component.find('button.page-2-btn');
- const page3Btn = component.find('button.page-3-btn');
+ const page1Btn = component.find('button.registration-breadcrumbs__page--1');
+ const page2Btn = component.find('button.registration-breadcrumbs__page--2');
+ const page3Btn = component.find('button.registration-breadcrumbs__page--3');
page1Btn.simulate('click');
diff --git a/frontend/pages/RegistrationPage/Breadcrumbs/_styles.scss b/frontend/pages/RegistrationPage/Breadcrumbs/_styles.scss
new file mode 100644
index 0000000000..112452407a
--- /dev/null
+++ b/frontend/pages/RegistrationPage/Breadcrumbs/_styles.scss
@@ -0,0 +1,146 @@
+.registration-breadcrumbs {
+ @include display(flex);
+ @include justify-content(space-between);
+ @include align-content(center);
+ width: 665px;
+ height: 125px;
+ margin: 0 auto;
+
+ @include breakpoint(tablet) {
+ height: 75px;
+ }
+
+ &__page {
+ text-align: center;
+ width: 145px;
+ font-size: 14px;
+ font-weight: $normal;
+ line-height: 1.53;
+ letter-spacing: 0.5px;
+ color: $text-medium;
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 235px;
+ height: 2px;
+ background-image: linear-gradient(to right, $accent-dark 50%, transparent 50%);
+ background-position: left top;
+ background-repeat: repeat-x;
+ background-size: 17px 2px;
+ bottom: 43px;
+ left: 84px;
+
+ @include breakpoint(tablet) {
+ bottom: 23px;
+ }
+ }
+
+ &::after {
+ @extend %kolidecon;
+ @include size(24px);
+ background-color: $white;
+ display: block;
+ border-radius: 50%;
+ content: '';
+ font-size: 28px;
+ margin: 14px auto 0;
+ position: relative;
+ z-index: 1;
+ cursor: pointer;
+
+ @include breakpoint(tablet) {
+ margin-top: 4px;
+ }
+ }
+
+ &:focus {
+ outline: none;
+ }
+
+ &--active {
+ font-weight: $bold;
+ color: $text-dark;
+ }
+
+ &--1 {
+ &::after {
+ border: solid 2px $success;
+ }
+
+ &.registration-breadcrumbs__page--active {
+ &::after {
+ background-color: $success;
+ }
+ }
+
+ &.registration-breadcrumbs__page--complete {
+ &::before {
+ background-image: linear-gradient(to right, $success 0%, $link 100%);
+ background-size: auto;
+ z-index: 2;
+ }
+
+ &::after {
+ @include size(28px);
+ content: '\f035';
+ color: $success;
+ border: 0;
+ }
+ }
+ }
+
+ &--2 {
+ &::after {
+ border: solid 2px $link;
+ }
+
+ &.registration-breadcrumbs__page--active {
+ &::after {
+ background-color: $link;
+ }
+ }
+
+ &.registration-breadcrumbs__page--complete {
+ &::before {
+ background-image: linear-gradient(to right, $link 0%, $brand-light 100%);
+ background-size: auto;
+ z-index: 2;
+ }
+
+ &::after {
+ @include size(28px);
+ content: '\f035';
+ color: $link;
+ border: 0;
+ }
+ }
+ }
+
+ &--3 {
+ &::before {
+ display: none;
+ }
+
+ &::after {
+ border: solid 2px $brand-light;
+ }
+
+ &.registration-breadcrumbs__page--active {
+ &::after {
+ background-color: $brand-light;
+ }
+ }
+
+ &.registration-breadcrumbs__page--complete {
+ &::after {
+ @include size(28px);
+ content: '\f035';
+ color: $brand-light;
+ border: 0;
+ }
+ }
+ }
+ }
+}
diff --git a/frontend/pages/RegistrationPage/RegistrationPage.jsx b/frontend/pages/RegistrationPage/RegistrationPage.jsx
index 151f4a4751..d744f9bdcd 100644
--- a/frontend/pages/RegistrationPage/RegistrationPage.jsx
+++ b/frontend/pages/RegistrationPage/RegistrationPage.jsx
@@ -10,6 +10,8 @@ import { setup } from 'redux/nodes/auth/actions';
import { showBackgroundImage } from 'redux/nodes/app/actions';
import userInterface from 'interfaces/user';
+import kolideLogo from '../../../assets/images/kolide-logo-condensed.svg';
+
export class RegistrationPage extends Component {
static propTypes = {
currentUser: userInterface,
@@ -70,6 +72,11 @@ export class RegistrationPage extends Component {
}
onSetPage = (page) => {
+ const { page: currentPage } = this.state;
+ if (page >= currentPage) {
+ return false;
+ }
+
this.setState({ page });
return false;
@@ -85,7 +92,12 @@ export class RegistrationPage extends Component {
}
return (
-
+
+
diff --git a/frontend/pages/RegistrationPage/RegistrationPage.tests.jsx b/frontend/pages/RegistrationPage/RegistrationPage.tests.jsx
index ea8bc05556..3355eb40f6 100644
--- a/frontend/pages/RegistrationPage/RegistrationPage.tests.jsx
+++ b/frontend/pages/RegistrationPage/RegistrationPage.tests.jsx
@@ -84,6 +84,7 @@ describe('RegistrationPage - component', () => {
describe('#onSetPage', () => {
it('sets state to the page number', () => {
const page = mount(
);
+ page.setState({ page: 3 });
page.node.onSetPage(3);
expect(page.state()).toInclude({ page: 3 });
diff --git a/frontend/pages/RegistrationPage/_styles.scss b/frontend/pages/RegistrationPage/_styles.scss
new file mode 100644
index 0000000000..0624707c48
--- /dev/null
+++ b/frontend/pages/RegistrationPage/_styles.scss
@@ -0,0 +1,19 @@
+.registration-page {
+ @include display(flex);
+ @include justify-content(center);
+ @include flex-direction(column);
+ min-height: calc(100vh - #{$footer-height});
+ position: relative;
+
+ &__logo {
+ @include position(absolute, 15px null null 15px);
+ width: 200px;
+
+ @include breakpoint(tablet) {
+ width: 125px;
+ position: static;
+ display: block;
+ margin: 15px 0 0 15px;
+ }
+ }
+}
diff --git a/frontend/pages/hosts/NewHostPage/_styles.scss b/frontend/pages/hosts/NewHostPage/_styles.scss
index 9328f3df55..3f9ee7942c 100644
--- a/frontend/pages/hosts/NewHostPage/_styles.scss
+++ b/frontend/pages/hosts/NewHostPage/_styles.scss
@@ -26,7 +26,7 @@
border: solid 1px $accent-dark;
box-shadow: inset 0 0 8px 0 rgba($black, 0.12);
box-sizing: border-box;
- font-family: Source-codePro, Oxygen;
+ font-family: SourceCodePro, Oxygen;
font-size: $medium;
height: 60px;
letter-spacing: 1.2px;
@@ -100,6 +100,6 @@
code {
color: $brand;
- font-family: Source-codePro, Oxygen;
+ font-family: SourceCodePro, Oxygen;
}
}
diff --git a/frontend/styles/global/_global.scss b/frontend/styles/global/_global.scss
index 6c0d7672b2..640d0c9563 100644
--- a/frontend/styles/global/_global.scss
+++ b/frontend/styles/global/_global.scss
@@ -1,6 +1,7 @@
html {
position: relative;
min-height: 100%;
+ min-width: $min-width;
// Because iOS hates us we must fight to the death!
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
// End Apple War
@@ -13,6 +14,7 @@ body {
font-family: 'Oxygen', sans-serif;
font-size: $base;
line-height: 1.6;
+ min-width: $min-width;
}
h1,
@@ -37,6 +39,7 @@ h3 {
}
input,
-textarea {
+textarea,
+button {
font-family: 'Oxygen', sans-serif;
}
diff --git a/frontend/styles/global/_icons.scss b/frontend/styles/global/_icons.scss
index 128a25459b..99cd75c9bd 100644
--- a/frontend/styles/global/_icons.scss
+++ b/frontend/styles/global/_icons.scss
@@ -112,18 +112,6 @@
content: '\f029';
}
- .kolidecon-username:before {
- content: '\f02a';
-}
-
- .kolidecon-password:before {
- content: '\f02b';
-}
-
- .kolidecon-email:before {
- content: '\f02c';
-}
-
.kolidecon-query:before {
content: '\f02d';
}
@@ -288,6 +276,18 @@
content: '\f03d';
}
+ .kolidecon-username:before {
+ content: '\f02a';
+}
+
+ .kolidecon-password:before {
+ content: '\f02b';
+}
+
+ .kolidecon-email:before {
+ content: '\f02c';
+}
+
.sr-only {
position: absolute;
diff --git a/frontend/styles/var/mixins.scss b/frontend/styles/var/mixins.scss
index 9343c705a4..6480d1aa1b 100644
--- a/frontend/styles/var/mixins.scss
+++ b/frontend/styles/var/mixins.scss
@@ -1,10 +1,15 @@
$min-width: 768px;
-$medium-width: 1280px;
+$medium-width: 1024px;
+$desktop-width: 1280px;
$max-width: 2560px;
@mixin breakpoint($size: desktop) {
@if ($size == tablet) {
- @media (min-width: $min-width) and (max-width: $medium-width - 1) {
+ @media (max-width: $medium-width) {
+ @content;
+ }
+ } @else if ($size == ltdesktop) {
+ @media (min-width: $min-width) and (max-width: $desktop-width - 1) {
@content;
}
} @else {
diff --git a/frontend/templates/react.tmpl b/frontend/templates/react.tmpl
index 77716a9ee8..2b01131de0 100644
--- a/frontend/templates/react.tmpl
+++ b/frontend/templates/react.tmpl
@@ -2,6 +2,7 @@
+
Kolide