From a28be80b61fbfd241d6732ae607bc711731b5b58 Mon Sep 17 00:00:00 2001
From: Paul Kaplan <pkaplan@media.mit.edu>
Date: Thu, 9 Mar 2017 11:02:22 -0500
Subject: [PATCH] Move modal close button to shared component

---
 src/components/close-button/close-button.css  |  44 ++++++++++++++++++
 src/components/close-button/close-button.jsx  |  38 +++++++++++++++
 .../{modal => close-button}/icon--close.svg   | Bin
 src/components/modal/modal.css                |  33 +------------
 src/components/modal/modal.jsx                |  13 ++----
 5 files changed, 88 insertions(+), 40 deletions(-)
 create mode 100644 src/components/close-button/close-button.css
 create mode 100644 src/components/close-button/close-button.jsx
 rename src/components/{modal => close-button}/icon--close.svg (100%)

diff --git a/src/components/close-button/close-button.css b/src/components/close-button/close-button.css
new file mode 100644
index 000000000..ef48624c4
--- /dev/null
+++ b/src/components/close-button/close-button.css
@@ -0,0 +1,44 @@
+@import "../../css/colors.css";
+@import "../../css/units.css";
+
+.close-button {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    color: gray;
+    background-color: $blue;
+
+    border-radius: 50%;
+    border-color: #dbdbdb;
+    border-style: solid;
+
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    cursor: pointer;
+    transition: all 0.15s ease-out; /* @todo: standardize with var */
+}
+
+.small {
+    width: 1rem;
+    height: 1rem;
+    border-width: 1px;
+}
+
+.large {
+    width: 2.75rem;
+    height: 2.75rem;
+    border-width: 2px;
+}
+
+.close-button:hover {
+    transform: scale(1.1, 1.1);
+}
+
+/*  Same icon as Sprite Selector Add button, but rotated.
+    TODO: reuse?
+*/
+.close-icon {
+    transform-origin: 50%;
+    transform: rotate(45deg);
+    width: 40%;
+}
diff --git a/src/components/close-button/close-button.jsx b/src/components/close-button/close-button.jsx
new file mode 100644
index 000000000..7335dbd11
--- /dev/null
+++ b/src/components/close-button/close-button.jsx
@@ -0,0 +1,38 @@
+const React = require('react');
+const classNames = require('classnames');
+
+const styles = require('./close-button.css');
+const closeIcon = require('./icon--close.svg');
+
+const CloseButton = (props) => (
+    <div
+        className={classNames(
+            styles.closeButton,
+            props.className,
+            {
+                [styles.large]: props.size === CloseButton.SIZE_LARGE,
+                [styles.small]: props.size === CloseButton.SIZE_SMALL
+            }
+        )}
+        onClick={props.onClick}
+    >
+        <img
+            className={styles.closeIcon}
+            src={closeIcon}
+        />
+    </div>
+);
+
+CloseButton.SIZE_LARGE = 'large';
+CloseButton.SIZE_SMALL = 'small';
+
+CloseButton.propTypes = {
+    onClick: React.PropTypes.func,
+    size: React.PropTypes.oneOf([CloseButton.SIZE_LARGE, CloseButton.SIZE_SMALL])
+};
+
+CloseButton.defaultProps = {
+    size: CloseButton.SIZE_LARGE
+};
+
+module.exports = CloseButton
diff --git a/src/components/modal/icon--close.svg b/src/components/close-button/icon--close.svg
similarity index 100%
rename from src/components/modal/icon--close.svg
rename to src/components/close-button/icon--close.svg
diff --git a/src/components/modal/modal.css b/src/components/modal/modal.css
index 46a51a191..dea04e1f4 100644
--- a/src/components/modal/modal.css
+++ b/src/components/modal/modal.css
@@ -33,38 +33,9 @@
     background: $ui-pane-gray;
 }
 
-.modal-close-button {
-    display: flex;
+.close-button {
     position: absolute;
-    z-index: 2147483647;
-    align-items: center;
-    justify-content: center;
-
     top: 1rem;
     right: 1rem;
-    width: 2.75rem !important;
-    height: 2.75rem !important;
-
-    color: gray;
-    background-color: $blue;
-
-    border-radius: 50% !important;
-    border: 2px solid #dbdbdb;
-
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    cursor: pointer;
-    transition: all 0.15s ease-out; /* @todo: standardize with var */ 
-}
-
-.modal-close-button:hover {
-    transform: scale(1.1, 1.1);
-}
-
-/*  Same icon as Sprite Selector Add button, but rotated.
-    @todo: reuse? 
-*/
-.close-icon {
-    transform-origin: 50%;
-    transform: rotate(45deg);
-    width: 40%;
+    z-index: 2;
 }
diff --git a/src/components/modal/modal.jsx b/src/components/modal/modal.jsx
index 51c5e353d..17537a892 100644
--- a/src/components/modal/modal.jsx
+++ b/src/components/modal/modal.jsx
@@ -2,9 +2,9 @@ const React = require('react');
 const ReactModal = require('react-modal');
 
 const Box = require('../box/box.jsx');
+const CloseButton = require('../close-button/close-button.jsx');
 
 const styles = require('./modal.css');
-const closeIcon = require('./icon--close.svg');
 
 class ModalComponent extends React.Component {
     render () {
@@ -17,15 +17,10 @@ class ModalComponent extends React.Component {
                 ref={m => (this.modal = m)}
                 onRequestClose={this.props.onRequestClose}
             >
-                <div
-                    className={styles.modalCloseButton}
+                <CloseButton
+                    className={styles.closeButton}
                     onClick={this.props.onRequestClose}
-                >
-                    <img
-                        className={styles.closeIcon}
-                        src={closeIcon}
-                    />
-                </div>
+                />
                 <Box
                     className={styles.modalChildren}
                     direction="column"
-- 
GitLab