diff --git a/client/coral-ui/components/Dropdown.css b/client/coral-ui/components/Dropdown.css
new file mode 100644
index 000000000..431f59076
--- /dev/null
+++ b/client/coral-ui/components/Dropdown.css
@@ -0,0 +1,50 @@
+.dropdown {
+ position: relative;
+ width: 150px;
+ height: 36px;
+ background: #2c2c2c;
+ padding: 10px 15px;
+ box-sizing: border-box;
+ color: white;
+ border-radius: 2px;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
+}
+
+.dropdown {
+ cursor: pointer;
+}
+
+.label {
+ text-transform: capitalize;
+}
+
+.list {
+ position: absolute;
+ top: 30px;
+ left: 10px;
+ color: #2c2c2c;
+ border-radius: 2px;
+ background: white;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
+ width: 100%;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ transform: scale(0);
+ transition: transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);
+ transform-origin: 0 0;
+}
+
+.listActive {
+ opacity: 1;
+ transform: scale(1);
+ z-index: 999;
+}
+
+.arrow {
+ position: absolute;
+ right: 15px;
+ font-size: 1.2rem;
+ vertical-align: middle;
+ top: 13px;
+}
\ No newline at end of file
diff --git a/client/coral-ui/components/Dropdown.js b/client/coral-ui/components/Dropdown.js
new file mode 100644
index 000000000..c9bd357f1
--- /dev/null
+++ b/client/coral-ui/components/Dropdown.js
@@ -0,0 +1,115 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import styles from './Dropdown.css';
+import Icon from './Icon';
+import cn from 'classnames';
+import ClickOutside from 'coral-framework/components/ClickOutside';
+
+class Dropdown extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ selected: {
+ label: props.label || '',
+ value: props.value || ''
+ },
+ isOpen: false
+ };
+ }
+
+ componentWillReceiveProps(newProps) {
+ if (newProps.value && newProps.value !== this.state.selected.value) {
+ this.setState({
+ selected: {
+ label: newProps.label,
+ value: newProps.value
+ }
+ });
+ }
+ }
+
+ compoentDidMount() {
+ document.addEventListener('click', this.handleClick, false);
+ document.addEventListener('touchend', this.handleClick, false);
+ }
+
+ componentWillUnmount() {
+ document.removeEventListener('click', this.handleClick, false);
+ document.removeEventListener('touchend', this.handleClick, false);
+ }
+
+ fireChange = (newState) => {
+ if (newState.selected !== this.state.selected && this.props.onChange) {
+ this.props.onChange(newState.selected.value);
+ }
+ }
+
+ setValue = (value, label) => {
+ const newState = {
+ selected: {
+ label: label,
+ value: value
+ },
+ isOpen: false
+ };
+ this.fireChange(newState);
+ this.setState(newState);
+ }
+
+ handleClick = () => {
+ this.setState({
+ isOpen: !this.state.isOpen
+ });
+ }
+
+ hideMenu = () => {
+ this.setState({
+ isOpen: false
+ });
+ }
+
+ renderLabel() {
+ if (this.props.label) {
+ return this.props.label;
+ } else if (this.props.value) {
+ return this.props.value;
+ } else {
+ return this.props.placeholder;
+ }
+ }
+
+ render() {
+ return (
+
+ {React.Children.toArray(this.props.children)
+ .map((child) =>
+ React.cloneElement(child, {
+ key: child.props.value,
+ onClick: () => this.setValue(child.props.value, child.props.children)
+ }))}
+
+