ソースを参照

merge theme and custom button

sergei 3 年 前
コミット
6ff3a4edf4

+ 4 - 3
kafka-ui-react-app/package-lock.json

@@ -3027,9 +3027,10 @@
       "dev": true
       "dev": true
     },
     },
     "@types/styled-components": {
     "@types/styled-components": {
-      "version": "5.1.14",
-      "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.14.tgz",
-      "integrity": "sha512-d6P1/tyNytqKwam3cQXq7a9uPtovc/mdAs7dBiz1YbDdNIT3X4WmuFU78YdSYh84TXVuhOwezZ3EeKuNBhwsHQ==",
+      "version": "5.1.13",
+      "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.13.tgz",
+      "integrity": "sha512-nIIsiQ+Ag/4xnYf9mhzO3zIZ/zOmKN6HImEZifKh2TLibYz8OudzJbvzDu1uvMfX/+bs0B0RDPB2OIcbrrptVQ==",
+      "dev": true,
       "requires": {
       "requires": {
         "@types/hoist-non-react-statics": "*",
         "@types/hoist-non-react-statics": "*",
         "@types/react": "*",
         "@types/react": "*",

+ 1 - 0
kafka-ui-react-app/package.json

@@ -94,6 +94,7 @@
     "@types/react-router-dom": "^5.1.8",
     "@types/react-router-dom": "^5.1.8",
     "@types/react-test-renderer": "^17.0.1",
     "@types/react-test-renderer": "^17.0.1",
     "@types/redux-mock-store": "^1.0.3",
     "@types/redux-mock-store": "^1.0.3",
+    "@types/styled-components": "^5.1.13",
     "@types/uuid": "^8.3.1",
     "@types/uuid": "^8.3.1",
     "@typescript-eslint/eslint-plugin": "^4.29.1",
     "@typescript-eslint/eslint-plugin": "^4.29.1",
     "@typescript-eslint/parser": "^4.29.1",
     "@typescript-eslint/parser": "^4.29.1",

+ 71 - 67
kafka-ui-react-app/src/components/App.tsx

@@ -11,6 +11,8 @@ import ClusterPage from 'components/Cluster/Cluster';
 import Version from 'components/Version/Version';
 import Version from 'components/Version/Version';
 import Alert from 'components/Alert/Alert';
 import Alert from 'components/Alert/Alert';
 import 'components/App.scss';
 import 'components/App.scss';
+import { ThemeProvider } from 'styled-components';
+import theme from 'theme/theme';
 
 
 export interface AppProps {
 export interface AppProps {
   isClusterListFetched?: boolean;
   isClusterListFetched?: boolean;
@@ -45,81 +47,83 @@ const App: React.FC<AppProps> = ({
   }, [fetchClustersList]);
   }, [fetchClustersList]);
 
 
   return (
   return (
-    <div
-      className={cx('Layout', { 'Layout--sidebarVisible': isSidebarVisible })}
-    >
-      <nav
-        className="navbar is-fixed-top is-white Layout__header"
-        role="navigation"
-        aria-label="main navigation"
+    <ThemeProvider theme={theme}>
+      <div
+        className={cx('Layout', { 'Layout--sidebarVisible': isSidebarVisible })}
       >
       >
-        <div className="navbar-brand">
-          <div
-            className={cx('navbar-burger', 'ml-0', {
-              'is-active': isSidebarVisible,
-            })}
-            onClick={onBurgerClick}
-            onKeyDown={onBurgerClick}
-            role="button"
-            tabIndex={0}
-          >
-            <span />
-            <span />
-            <span />
-          </div>
+        <nav
+          className="navbar is-fixed-top is-white Layout__header"
+          role="navigation"
+          aria-label="main navigation"
+        >
+          <div className="navbar-brand">
+            <div
+              className={cx('navbar-burger', 'ml-0', {
+                'is-active': isSidebarVisible,
+              })}
+              onClick={onBurgerClick}
+              onKeyDown={onBurgerClick}
+              role="button"
+              tabIndex={0}
+            >
+              <span />
+              <span />
+              <span />
+            </div>
 
 
-          <a className="navbar-item title is-5 is-marginless" href="/ui">
-            UI for Apache Kafka
-          </a>
+            <a className="navbar-item title is-5 is-marginless" href="/ui">
+              UI for Apache Kafka
+            </a>
 
 
-          <div className="navbar-item">
-            <Version tag={GIT_TAG} commit={GIT_COMMIT} />
+            <div className="navbar-item">
+              <Version tag={GIT_TAG} commit={GIT_COMMIT} />
+            </div>
           </div>
           </div>
-        </div>
-      </nav>
+        </nav>
 
 
-      <main className="Layout__container">
-        <div className="Layout__sidebar has-shadow has-background-white">
-          <Nav
-            clusters={clusters}
-            isClusterListFetched={isClusterListFetched}
-          />
-        </div>
-        <div
-          className="Layout__sidebarOverlay is-overlay"
-          onClick={closeSidebar}
-          onKeyDown={closeSidebar}
-          tabIndex={-1}
-          aria-hidden="true"
-        />
-        {isClusterListFetched ? (
-          <Switch>
-            <Route
-              exact
-              path={['/', '/ui', '/ui/clusters']}
-              component={Dashboard}
+        <main className="Layout__container">
+          <div className="Layout__sidebar has-shadow has-background-white">
+            <Nav
+              clusters={clusters}
+              isClusterListFetched={isClusterListFetched}
             />
             />
-            <Route path="/ui/clusters/:clusterName" component={ClusterPage} />
-          </Switch>
-        ) : (
-          <PageLoader fullHeight />
-        )}
-      </main>
-
-      <div className="Layout__alerts">
-        {alerts.map(({ id, type, title, message, response, createdAt }) => (
-          <Alert
-            key={id}
-            id={id}
-            type={type}
-            title={title}
-            message={message}
-            response={response}
-            createdAt={createdAt}
+          </div>
+          <div
+            className="Layout__sidebarOverlay is-overlay"
+            onClick={closeSidebar}
+            onKeyDown={closeSidebar}
+            tabIndex={-1}
+            aria-hidden="true"
           />
           />
-        ))}
+          {isClusterListFetched ? (
+            <Switch>
+              <Route
+                exact
+                path={['/', '/ui', '/ui/clusters']}
+                component={Dashboard}
+              />
+              <Route path="/ui/clusters/:clusterName" component={ClusterPage} />
+            </Switch>
+          ) : (
+            <PageLoader fullHeight />
+          )}
+        </main>
+
+        <div className="Layout__alerts">
+          {alerts.map(({ id, type, title, message, response, createdAt }) => (
+            <Alert
+              key={id}
+              id={id}
+              type={type}
+              title={title}
+              message={message}
+              response={response}
+              createdAt={createdAt}
+            />
+          ))}
+        </div>
       </div>
       </div>
-    </div>
+    </ThemeProvider>
   );
   );
 };
 };
 
 

+ 307 - 262
kafka-ui-react-app/src/components/__tests__/__snapshots__/App.spec.tsx.snap

@@ -53,163 +53,171 @@ exports[`App view matches snapshot 1`] = `
         }
         }
         isClusterListFetched={true}
         isClusterListFetched={true}
       >
       >
-        <div
-          className="Layout"
+        <Component
+          theme={
+            Object {
+              "buttonStyles": Object {
+                "fontSize": Object {
+                  "L": "16px",
+                  "M": "14px",
+                  "S": "14px",
+                },
+                "height": Object {
+                  "L": "40px",
+                  "M": "32px",
+                  "S": "24px",
+                },
+                "primary": Object {
+                  "backgroundColor": Object {
+                    "active": "#1414B8",
+                    "hover": "#1717CF",
+                    "normal": "#4F4FFF",
+                  },
+                  "color": "#FFFFFF",
+                  "invertedColors": Object {
+                    "active": "#1414B8",
+                    "hover": "#1717CF",
+                    "normal": "#4F4FFF",
+                  },
+                },
+                "secondary": Object {
+                  "backgroundColor": Object {
+                    "active": "#D5DADD",
+                    "hover": "#E3E6E8",
+                    "normal": "#F1F2F3",
+                  },
+                  "color": "#171A1C",
+                  "invertedColors": Object {
+                    "active": "#171A1C",
+                    "hover": "#454F54",
+                    "normal": "#73848C",
+                  },
+                },
+              },
+            }
+          }
         >
         >
-          <nav
-            aria-label="main navigation"
-            className="navbar is-fixed-top is-white Layout__header"
-            role="navigation"
+          <div
+            className="Layout"
           >
           >
-            <div
-              className="navbar-brand"
+            <nav
+              aria-label="main navigation"
+              className="navbar is-fixed-top is-white Layout__header"
+              role="navigation"
             >
             >
               <div
               <div
-                className="navbar-burger ml-0"
-                onClick={[Function]}
-                onKeyDown={[Function]}
-                role="button"
-                tabIndex={0}
-              >
-                <span />
-                <span />
-                <span />
-              </div>
-              <a
-                className="navbar-item title is-5 is-marginless"
-                href="/ui"
-              >
-                UI for Apache Kafka
-              </a>
-              <div
-                className="navbar-item"
+                className="navbar-brand"
               >
               >
-                <Version />
+                <div
+                  className="navbar-burger ml-0"
+                  onClick={[Function]}
+                  onKeyDown={[Function]}
+                  role="button"
+                  tabIndex={0}
+                >
+                  <span />
+                  <span />
+                  <span />
+                </div>
+                <a
+                  className="navbar-item title is-5 is-marginless"
+                  href="/ui"
+                >
+                  UI for Apache Kafka
+                </a>
+                <div
+                  className="navbar-item"
+                >
+                  <Version />
+                </div>
               </div>
               </div>
-            </div>
-          </nav>
-          <main
-            className="Layout__container"
-          >
-            <div
-              className="Layout__sidebar has-shadow has-background-white"
+            </nav>
+            <main
+              className="Layout__container"
             >
             >
-              <Nav
-                clusters={Array []}
-                isClusterListFetched={true}
+              <div
+                className="Layout__sidebar has-shadow has-background-white"
               >
               >
-                <aside
-                  className="menu has-shadow has-background-white"
+                <Nav
+                  clusters={Array []}
+                  isClusterListFetched={true}
                 >
                 >
-                  <p
-                    className="menu-label"
-                  >
-                    General
-                  </p>
-                  <ul
-                    className="menu-list"
+                  <aside
+                    className="menu has-shadow has-background-white"
                   >
                   >
-                    <li>
-                      <NavLink
-                        activeClassName="is-active"
-                        exact={true}
-                        title="Dashboard"
-                        to="/ui"
-                      >
-                        <Link
-                          aria-current={null}
+                    <p
+                      className="menu-label"
+                    >
+                      General
+                    </p>
+                    <ul
+                      className="menu-list"
+                    >
+                      <li>
+                        <NavLink
+                          activeClassName="is-active"
+                          exact={true}
                           title="Dashboard"
                           title="Dashboard"
-                          to={
-                            Object {
-                              "hash": "",
-                              "pathname": "/ui",
-                              "search": "",
-                              "state": null,
-                            }
-                          }
+                          to="/ui"
                         >
                         >
-                          <LinkAnchor
+                          <Link
                             aria-current={null}
                             aria-current={null}
-                            href="/ui"
-                            navigate={[Function]}
                             title="Dashboard"
                             title="Dashboard"
+                            to={
+                              Object {
+                                "hash": "",
+                                "pathname": "/ui",
+                                "search": "",
+                                "state": null,
+                              }
+                            }
                           >
                           >
-                            <a
+                            <LinkAnchor
                               aria-current={null}
                               aria-current={null}
                               href="/ui"
                               href="/ui"
-                              onClick={[Function]}
+                              navigate={[Function]}
                               title="Dashboard"
                               title="Dashboard"
                             >
                             >
-                              Dashboard
-                            </a>
-                          </LinkAnchor>
-                        </Link>
-                      </NavLink>
-                    </li>
-                  </ul>
-                  <p
-                    className="menu-label"
-                  >
-                    Clusters
-                  </p>
-                </aside>
-              </Nav>
-            </div>
-            <div
-              aria-hidden="true"
-              className="Layout__sidebarOverlay is-overlay"
-              onClick={[Function]}
-              onKeyDown={[Function]}
-              tabIndex={-1}
-            />
-            <Switch>
-              <Route
-                component={[Function]}
-                computedMatch={
-                  Object {
-                    "isExact": true,
-                    "params": Object {},
-                    "path": "/",
-                    "url": "/",
-                  }
-                }
-                exact={true}
-                location={
-                  Object {
-                    "hash": "",
-                    "pathname": "/",
-                    "search": "",
-                    "state": undefined,
-                  }
-                }
-                path={
-                  Array [
-                    "/",
-                    "/ui",
-                    "/ui/clusters",
-                  ]
-                }
-              >
-                <Dashboard
-                  history={
+                              <a
+                                aria-current={null}
+                                href="/ui"
+                                onClick={[Function]}
+                                title="Dashboard"
+                              >
+                                Dashboard
+                              </a>
+                            </LinkAnchor>
+                          </Link>
+                        </NavLink>
+                      </li>
+                    </ul>
+                    <p
+                      className="menu-label"
+                    >
+                      Clusters
+                    </p>
+                  </aside>
+                </Nav>
+              </div>
+              <div
+                aria-hidden="true"
+                className="Layout__sidebarOverlay is-overlay"
+                onClick={[Function]}
+                onKeyDown={[Function]}
+                tabIndex={-1}
+              />
+              <Switch>
+                <Route
+                  component={[Function]}
+                  computedMatch={
                     Object {
                     Object {
-                      "action": "POP",
-                      "block": [Function],
-                      "createHref": [Function],
-                      "go": [Function],
-                      "goBack": [Function],
-                      "goForward": [Function],
-                      "listen": [Function],
-                      "location": Object {
-                        "hash": "",
-                        "pathname": "/",
-                        "search": "",
-                        "state": undefined,
-                      },
-                      "push": [Function],
-                      "replace": [Function],
+                      "isExact": true,
+                      "params": Object {},
+                      "path": "/",
+                      "url": "/",
                     }
                     }
                   }
                   }
+                  exact={true}
                   location={
                   location={
                     Object {
                     Object {
                       "hash": "",
                       "hash": "",
@@ -218,164 +226,201 @@ exports[`App view matches snapshot 1`] = `
                       "state": undefined,
                       "state": undefined,
                     }
                     }
                   }
                   }
-                  match={
-                    Object {
-                      "isExact": true,
-                      "params": Object {},
-                      "path": "/",
-                      "url": "/",
-                    }
+                  path={
+                    Array [
+                      "/",
+                      "/ui",
+                      "/ui/clusters",
+                    ]
                   }
                   }
-                  staticContext={Object {}}
                 >
                 >
-                  <div
-                    className="section"
+                  <Dashboard
+                    history={
+                      Object {
+                        "action": "POP",
+                        "block": [Function],
+                        "createHref": [Function],
+                        "go": [Function],
+                        "goBack": [Function],
+                        "goForward": [Function],
+                        "listen": [Function],
+                        "location": Object {
+                          "hash": "",
+                          "pathname": "/",
+                          "search": "",
+                          "state": undefined,
+                        },
+                        "push": [Function],
+                        "replace": [Function],
+                      }
+                    }
+                    location={
+                      Object {
+                        "hash": "",
+                        "pathname": "/",
+                        "search": "",
+                        "state": undefined,
+                      }
+                    }
+                    match={
+                      Object {
+                        "isExact": true,
+                        "params": Object {},
+                        "path": "/",
+                        "url": "/",
+                      }
+                    }
+                    staticContext={Object {}}
                   >
                   >
                     <div
                     <div
-                      className="level"
+                      className="section"
                     >
                     >
                       <div
                       <div
-                        className="level-item level-left"
+                        className="level"
                       >
                       >
-                        <Breadcrumb>
-                          <nav
-                            aria-label="breadcrumbs"
-                            className="breadcrumb"
-                          >
-                            <ul>
-                              <li
-                                className="is-active"
-                              >
-                                <span
-                                  className=""
+                        <div
+                          className="level-item level-left"
+                        >
+                          <Breadcrumb>
+                            <nav
+                              aria-label="breadcrumbs"
+                              className="breadcrumb"
+                            >
+                              <ul>
+                                <li
+                                  className="is-active"
                                 >
                                 >
-                                  Dashboard
-                                </span>
-                              </li>
-                            </ul>
-                          </nav>
-                        </Breadcrumb>
+                                  <span
+                                    className=""
+                                  >
+                                    Dashboard
+                                  </span>
+                                </li>
+                              </ul>
+                            </nav>
+                          </Breadcrumb>
+                        </div>
                       </div>
                       </div>
-                    </div>
-                    <Connect(ClustersWidget)>
-                      <ClustersWidget
-                        clusters={Array []}
-                        dispatch={[Function]}
-                        offlineClusters={Array []}
-                        onlineClusters={Array []}
-                      >
-                        <div>
-                          <h5
-                            className="title is-5"
-                          >
-                            Clusters
-                          </h5>
-                          <MetricsWrapper>
-                            <div
-                              className="box"
+                      <Connect(ClustersWidget)>
+                        <ClustersWidget
+                          clusters={Array []}
+                          dispatch={[Function]}
+                          offlineClusters={Array []}
+                          onlineClusters={Array []}
+                        >
+                          <div>
+                            <h5
+                              className="title is-5"
                             >
                             >
+                              Clusters
+                            </h5>
+                            <MetricsWrapper>
                               <div
                               <div
-                                className="level"
+                                className="box"
                               >
                               >
-                                <Indicator
-                                  label="Online Clusters"
+                                <div
+                                  className="level"
                                 >
                                 >
-                                  <div
-                                    className="level-item"
+                                  <Indicator
+                                    label="Online Clusters"
                                   >
                                   >
                                     <div
                                     <div
-                                      title="Online Clusters"
+                                      className="level-item"
                                     >
                                     >
-                                      <p
-                                        className="heading"
+                                      <div
+                                        title="Online Clusters"
                                       >
                                       >
-                                        Online Clusters
-                                      </p>
-                                      <p
-                                        className="title has-text-centered"
-                                      >
-                                        <span
-                                          className="tag is-success"
+                                        <p
+                                          className="heading"
+                                        >
+                                          Online Clusters
+                                        </p>
+                                        <p
+                                          className="title has-text-centered"
                                         >
                                         >
-                                          0
-                                        </span>
-                                      </p>
+                                          <span
+                                            className="tag is-success"
+                                          >
+                                            0
+                                          </span>
+                                        </p>
+                                      </div>
                                     </div>
                                     </div>
-                                  </div>
-                                </Indicator>
-                                <Indicator
-                                  label="Offline Clusters"
-                                >
-                                  <div
-                                    className="level-item"
+                                  </Indicator>
+                                  <Indicator
+                                    label="Offline Clusters"
                                   >
                                   >
                                     <div
                                     <div
-                                      title="Offline Clusters"
+                                      className="level-item"
                                     >
                                     >
-                                      <p
-                                        className="heading"
+                                      <div
+                                        title="Offline Clusters"
                                       >
                                       >
-                                        Offline Clusters
-                                      </p>
-                                      <p
-                                        className="title has-text-centered"
-                                      >
-                                        <span
-                                          className="tag is-danger"
+                                        <p
+                                          className="heading"
+                                        >
+                                          Offline Clusters
+                                        </p>
+                                        <p
+                                          className="title has-text-centered"
                                         >
                                         >
-                                          0
-                                        </span>
-                                      </p>
+                                          <span
+                                            className="tag is-danger"
+                                          >
+                                            0
+                                          </span>
+                                        </p>
+                                      </div>
                                     </div>
                                     </div>
-                                  </div>
-                                </Indicator>
-                                <Indicator
-                                  label="Hide online clusters"
-                                >
-                                  <div
-                                    className="level-item"
+                                  </Indicator>
+                                  <Indicator
+                                    label="Hide online clusters"
                                   >
                                   >
                                     <div
                                     <div
-                                      title="Hide online clusters"
+                                      className="level-item"
                                     >
                                     >
-                                      <p
-                                        className="heading"
-                                      >
-                                        Hide online clusters
-                                      </p>
-                                      <p
-                                        className="title has-text-centered"
+                                      <div
+                                        title="Hide online clusters"
                                       >
                                       >
-                                        <input
-                                          checked={false}
-                                          className="switch is-rounded"
-                                          id="switchRoundedDefault"
-                                          name="switchRoundedDefault"
-                                          onChange={[Function]}
-                                          type="checkbox"
-                                        />
-                                        <label
-                                          htmlFor="switchRoundedDefault"
-                                        />
-                                      </p>
+                                        <p
+                                          className="heading"
+                                        >
+                                          Hide online clusters
+                                        </p>
+                                        <p
+                                          className="title has-text-centered"
+                                        >
+                                          <input
+                                            checked={false}
+                                            className="switch is-rounded"
+                                            id="switchRoundedDefault"
+                                            name="switchRoundedDefault"
+                                            onChange={[Function]}
+                                            type="checkbox"
+                                          />
+                                          <label
+                                            htmlFor="switchRoundedDefault"
+                                          />
+                                        </p>
+                                      </div>
                                     </div>
                                     </div>
-                                  </div>
-                                </Indicator>
+                                  </Indicator>
+                                </div>
                               </div>
                               </div>
-                            </div>
-                          </MetricsWrapper>
-                        </div>
-                      </ClustersWidget>
-                    </Connect(ClustersWidget)>
-                  </div>
-                </Dashboard>
-              </Route>
-            </Switch>
-          </main>
-          <div
-            className="Layout__alerts"
-          />
-        </div>
+                            </MetricsWrapper>
+                          </div>
+                        </ClustersWidget>
+                      </Connect(ClustersWidget)>
+                    </div>
+                  </Dashboard>
+                </Route>
+              </Switch>
+            </main>
+            <div
+              className="Layout__alerts"
+            />
+          </div>
+        </Component>
       </App>
       </App>
     </Router>
     </Router>
   </StaticRouter>
   </StaticRouter>

+ 59 - 0
kafka-ui-react-app/src/components/common/Button/Button.styled.ts

@@ -0,0 +1,59 @@
+import styled from 'styled-components';
+
+export interface Props {
+  buttonType: 'primary' | 'secondary';
+  buttonSize: 'S' | 'M' | 'L';
+  isInverted?: boolean;
+}
+
+const StyledButton = styled('button')<Props>`
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  padding: 0px 12px;
+  border: none;
+  border-radius: 4px;
+  white-space: nowrap;
+  margin-right: 0.5rem;
+  margin-bottom: 0.5rem;
+
+  background: ${(props) =>
+    props.isInverted
+      ? 'transparent'
+      : props.theme.buttonStyles[props.buttonType].backgroundColor.normal};
+  color: ${(props) =>
+    props.isInverted
+      ? props.theme.buttonStyles[props.buttonType].invertedColors.normal
+      : props.theme.buttonStyles[props.buttonType].color};
+  font-size: ${(props) => props.theme.buttonStyles.fontSize[props.buttonSize]};
+  height: ${(props) => props.theme.buttonStyles.height[props.buttonSize]};
+
+  &:hover:enabled {
+    background: ${(props) =>
+      props.isInverted
+        ? 'transparent'
+        : props.theme.buttonStyles[props.buttonType].backgroundColor.hover};
+    color: ${(props) =>
+      props.isInverted
+        ? props.theme.buttonStyles[props.buttonType].invertedColors.hover
+        : props.theme.buttonStyles[props.buttonType].color};
+    cursor: pointer;
+  }
+  &:active:enabled {
+    background: ${(props) =>
+      props.isInverted
+        ? 'transparent'
+        : props.theme.buttonStyles[props.buttonType].backgroundColor.active};
+    color: ${(props) =>
+      props.isInverted
+        ? props.theme.buttonStyles[props.buttonType].invertedColors.active
+        : props.theme.buttonStyles[props.buttonType].color};
+  }
+  &:disabled {
+    opacity: 0.5;
+    cursor: not-allowed;
+  }
+`;
+
+export default StyledButton;

+ 11 - 0
kafka-ui-react-app/src/components/common/Button/Button.tsx

@@ -0,0 +1,11 @@
+import StyledButton, {
+  Props as ButtonProps,
+} from 'components/common/Button/Button.styled';
+import React from 'react';
+
+type Props = ButtonProps;
+
+export const Button: React.FC<Props> = (props) => {
+  // Later we can add other logic here
+  return <StyledButton {...props} />;
+};

+ 78 - 0
kafka-ui-react-app/src/theme/theme.ts

@@ -0,0 +1,78 @@
+export const Colors = {
+  neutral: {
+    '0': '#FFFFFF',
+    '5': '#F1F2F3',
+    '10': '#E3E6E8',
+    '15': '#D5DADD',
+    '20': '#C7CED1',
+    '30': '#ABB5BA',
+    '40': '#8F9CA3',
+    '50': '#73848C',
+    '60': '#5C6970',
+    '70': '#454F54',
+    '80': '#2F3639',
+    '90': '#171A1C',
+  },
+  green: {
+    '10': '#D6F5E0',
+    '15': '#C2F0D1',
+    '30': '#85E0A3',
+    '40': '#5CD685',
+    '60': '#29A352',
+  },
+  brand: {
+    '20': '#A3A3F5',
+    '50': '#4F4FFF',
+    '55': '#1717CF',
+    '60': '#1414B8',
+  },
+  red: {
+    '50': '#E51A1A',
+  },
+  orange: {
+    '10': '#FFEECC',
+  },
+};
+
+const theme = {
+  buttonStyles: {
+    primary: {
+      backgroundColor: {
+        normal: Colors.brand[50],
+        hover: Colors.brand[55],
+        active: Colors.brand[60],
+      },
+      color: Colors.neutral[0],
+      invertedColors: {
+        normal: Colors.brand[50],
+        hover: Colors.brand[55],
+        active: Colors.brand[60],
+      },
+    },
+    secondary: {
+      backgroundColor: {
+        normal: Colors.neutral[5],
+        hover: Colors.neutral[10],
+        active: Colors.neutral[15],
+      },
+      color: Colors.neutral[90],
+      invertedColors: {
+        normal: Colors.neutral[50],
+        hover: Colors.neutral[70],
+        active: Colors.neutral[90],
+      },
+    },
+    height: {
+      S: '24px',
+      M: '32px',
+      L: '40px',
+    },
+    fontSize: {
+      S: '14px',
+      M: '14px',
+      L: '16px',
+    },
+  },
+};
+
+export default theme;