From 3e898fb6fb845f6a9f59cfa88b075faa1ac03e5f Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Tue, 5 Jan 2021 19:41:29 +0200
Subject: [PATCH 1/7] Support Material-UI tree

---
 packages/core/src/hooks/use_ref_height.js     |  13 +
 packages/core/src/items/items.js              |  17 ++
 packages/core/src/styles/styles.js            |   2 +-
 packages/core/src/tree.js                     |  22 +-
 .../src/{ => tree_container}/treeStyle.js     |   0
 .../core/src/tree_container/tree_container.js |  17 ++
 packages/docs/stories/core.stories.js         |  45 +++-
 packages/material_ui_tree/package.json        |  22 ++
 .../material_ui_tree/src/header/header.js     |  26 ++
 packages/material_ui_tree/src/index.js        |   3 +
 packages/material_ui_tree/src/input/input.js  |  39 +++
 .../material_ui_tree/src/item/basic_item.js   |   8 +
 packages/material_ui_tree/src/item/item.js    |  38 +++
 .../src/item/searched_item.js                 |  37 +++
 packages/material_ui_tree/src/items/items.js  |  21 ++
 .../material_ui_tree/src/material_ui_tree.js  |  40 +++
 .../src/no_results/no_results.js              |  24 ++
 .../src/tree_container/tree_container.js      |  25 ++
 yarn.lock                                     | 246 +++++++++++++++++-
 19 files changed, 627 insertions(+), 18 deletions(-)
 create mode 100644 packages/core/src/hooks/use_ref_height.js
 create mode 100644 packages/core/src/items/items.js
 rename packages/core/src/{ => tree_container}/treeStyle.js (100%)
 create mode 100644 packages/core/src/tree_container/tree_container.js
 create mode 100644 packages/material_ui_tree/package.json
 create mode 100644 packages/material_ui_tree/src/header/header.js
 create mode 100644 packages/material_ui_tree/src/index.js
 create mode 100644 packages/material_ui_tree/src/input/input.js
 create mode 100644 packages/material_ui_tree/src/item/basic_item.js
 create mode 100644 packages/material_ui_tree/src/item/item.js
 create mode 100644 packages/material_ui_tree/src/item/searched_item.js
 create mode 100644 packages/material_ui_tree/src/items/items.js
 create mode 100644 packages/material_ui_tree/src/material_ui_tree.js
 create mode 100644 packages/material_ui_tree/src/no_results/no_results.js
 create mode 100644 packages/material_ui_tree/src/tree_container/tree_container.js

diff --git a/packages/core/src/hooks/use_ref_height.js b/packages/core/src/hooks/use_ref_height.js
new file mode 100644
index 0000000..5bc28b0
--- /dev/null
+++ b/packages/core/src/hooks/use_ref_height.js
@@ -0,0 +1,13 @@
+import { useEffect, useState } from "react";
+
+const useTreeHeight = ({ ref }) => {
+  const [treeHeight, setTreeHeight] = useState(0);
+
+  useEffect(() => {
+    ref.current && setTreeHeight(ref.current.getBoundingClientRect().height);
+  }, [ref]);
+
+  return treeHeight;
+};
+
+export default useTreeHeight;
diff --git a/packages/core/src/items/items.js b/packages/core/src/items/items.js
new file mode 100644
index 0000000..f8d80d1
--- /dev/null
+++ b/packages/core/src/items/items.js
@@ -0,0 +1,17 @@
+/** @jsx jsx */
+import { jsx } from "@emotion/core";
+import React from "react";
+
+const ItemsRenderer = props => {
+  const {
+    getStyles,
+    children
+  } = props;
+  return (
+      <div css={getStyles("items", props)}>
+        {children}
+      </div>
+  );
+};
+
+export default ItemsRenderer;
diff --git a/packages/core/src/styles/styles.js b/packages/core/src/styles/styles.js
index 0617f74..d3e5669 100644
--- a/packages/core/src/styles/styles.js
+++ b/packages/core/src/styles/styles.js
@@ -1,4 +1,4 @@
-import treeCss from "../treeStyle";
+import treeCss from "../tree_container/treeStyle";
 import {
   wrapperCss as headerWrapperCss,
   backIconCss as headerBackIconCss
diff --git a/packages/core/src/tree.js b/packages/core/src/tree.js
index 6151c33..d383ff9 100644
--- a/packages/core/src/tree.js
+++ b/packages/core/src/tree.js
@@ -1,6 +1,6 @@
 /** @jsx jsx */
 import { jsx } from "@emotion/core";
-import React from "react";
+import React, { useRef } from "react";
 
 import { defaultStyles } from "./styles/styles";
 import ItemDefault from "./item/item";
@@ -10,15 +10,16 @@ import NoResultsDefault from "./no_results/no_results";
 
 import useLeavesManager from "./hooks/use_leaves_manager";
 import useItemCallbacks from "./hooks/use_item_callbacks";
+import TreeContainerRenderer from "./tree_container/tree_container";
+import ItemsRenderer from "./items/items";
+import useTreeHeight from "./hooks/use_ref_height";
 
 const Tree = props => {
   const {
     structure = [],
     title,
     onSelect,
-    className,
     noResultsText = "No matching results",
-    styles,
     headerRenderer: Header = HeaderDefault,
     backIconRenderer,
     inputRenderer: Input = InputDefault,
@@ -26,7 +27,9 @@ const Tree = props => {
     noResultsRenderer: NoResults = NoResultsDefault,
     noResultsIconRenderer,
     itemRenderer: Item = ItemDefault,
-    forwardIconRenderer
+    itemsRenderer: Items = ItemsRenderer,
+    forwardIconRenderer,
+    treeContainerRenderer: TreeContainer = TreeContainerRenderer
   } = props;
 
   const getStyles = (key, props = {}) => {
@@ -36,6 +39,9 @@ const Tree = props => {
     return custom ? custom(base, props) : base;
   };
 
+  const ref = useRef();
+  const treeHeight = useTreeHeight({ ref });
+
   const { onClick, onBackClick, currentDepth, parents } = useItemCallbacks(
     onSelect
   );
@@ -47,7 +53,7 @@ const Tree = props => {
   });
 
   return (
-    <div css={getStyles("tree", props)}>
+    <TreeContainer getStyles={getStyles} innerRef={ref}>
       <Header
         parents={parents}
         title={title}
@@ -63,7 +69,7 @@ const Tree = props => {
         setSearchTerm={setSearchTerm}
         inputIconRenderer={inputIconRenderer}
       />
-      <div css={getStyles("items", props)}>
+      <Items getStyles={getStyles} treeHeight={treeHeight}>
         {leaves &&
           leaves.length > 0 &&
           leaves.map(item => (
@@ -82,8 +88,8 @@ const Tree = props => {
             noResultsIconRenderer={noResultsIconRenderer}
           />
         )}
-      </div>
-    </div>
+      </Items>
+    </TreeContainer>
   );
 };
 
diff --git a/packages/core/src/treeStyle.js b/packages/core/src/tree_container/treeStyle.js
similarity index 100%
rename from packages/core/src/treeStyle.js
rename to packages/core/src/tree_container/treeStyle.js
diff --git a/packages/core/src/tree_container/tree_container.js b/packages/core/src/tree_container/tree_container.js
new file mode 100644
index 0000000..f1d745d
--- /dev/null
+++ b/packages/core/src/tree_container/tree_container.js
@@ -0,0 +1,17 @@
+/** @jsx jsx */
+import { jsx } from "@emotion/core";
+import React from "react";
+
+const TreeContainerRenderer = props => {
+  const {
+    getStyles,
+    children
+  } = props;
+  return (
+      <div css={getStyles("tree", props)}>
+        {children}
+    </div>
+  );
+};
+
+export default TreeContainerRenderer;
diff --git a/packages/docs/stories/core.stories.js b/packages/docs/stories/core.stories.js
index 76082af..e29caf6 100644
--- a/packages/docs/stories/core.stories.js
+++ b/packages/docs/stories/core.stories.js
@@ -1,9 +1,21 @@
 import React from "react";
+import MaterialUITree from "@kenshooui/material_ui_tree";
 import Tree from "@kenshooui/react-tree";
+import makeStyles from "@material-ui/core/styles/makeStyles";
+
+const useStyles = makeStyles({
+  root: {
+    display: "flex",
+    flexDirection: "row"
+  },
+  tree: {
+    padding: 20
+  }
+});
 
 export default {
   title: "Tree",
-  component: Tree
+  component: MaterialUITree
 };
 
 const structure = [
@@ -29,13 +41,30 @@ const structure = [
   ["Keywords", "one level"]
 ];
 
-export const Basic = () => (
-  <Tree
-    structure={structure}
-    title={"Choose an item"}
-    onSelect={item => alert(item)}
-  />
-);
+export const Basic = () => {
+  const classes = useStyles();
+
+  return (
+    <div className={classes.root}>
+      <div className={classes.tree}>
+        <MaterialUITree
+          structure={structure}
+          title={"Choose an item"}
+          onSelect={item => alert(item)}
+          width={300}
+          height={400}
+        />
+      </div>
+      <div className={classes.tree}>
+        <Tree
+          structure={structure}
+          title={"Choose an item"}
+          onSelect={item => alert(item)}
+        />
+      </div>
+    </div>
+  );
+};
 
 Basic.story = {
   name: "basic configuration"
diff --git a/packages/material_ui_tree/package.json b/packages/material_ui_tree/package.json
new file mode 100644
index 0000000..e5880bb
--- /dev/null
+++ b/packages/material_ui_tree/package.json
@@ -0,0 +1,22 @@
+{
+  "name": "@kenshooui/material_ui_tree",
+  "version": "1.0.0",
+  "main": "dist/material_ui_tree.cjs.js",
+  "module": "dist/material_ui_tree.esm.js",
+  "scripts": {},
+  "repository": "https://github.com/kenshoo/react-tree.git",
+  "author": "ui@kenshoo.com",
+  "license": "MIT",
+  "peerDependencies": {
+    "@kenshooui/react-tree": "^1.0.0",
+    "react": "^16.12.0"
+  },
+  "devDependencies": {
+    "react": "^16.12.0"
+  },
+  "dependencies": {
+    "@material-ui/core": "^4.11.2",
+    "@material-ui/icons": "^4.11.2",
+    "classnames": "^2.2.6"
+  }
+}
diff --git a/packages/material_ui_tree/src/header/header.js b/packages/material_ui_tree/src/header/header.js
new file mode 100644
index 0000000..17adc61
--- /dev/null
+++ b/packages/material_ui_tree/src/header/header.js
@@ -0,0 +1,26 @@
+import React from "react";
+import { ChevronLeft } from "@material-ui/icons";
+import Typography from "@material-ui/core/Typography";
+import CardActions from "@material-ui/core/CardActions";
+import Divider from "@material-ui/core/Divider";
+import IconButton from "@material-ui/core/IconButton";
+
+const MaterialUIHeader = ({ parents = [], onClick, title = "" }) => {
+  return (
+    <>
+      <CardActions>
+        {parents.length > 0 && (
+          <IconButton size={"small"}>
+            <ChevronLeft onClick={onClick} />
+          </IconButton>
+        )}
+        <Typography variant="subtitle1">
+          {parents.length > 0 ? parents[parents.length - 1] : title}
+        </Typography>
+      </CardActions>
+      <Divider />
+    </>
+  );
+};
+
+export default MaterialUIHeader;
diff --git a/packages/material_ui_tree/src/index.js b/packages/material_ui_tree/src/index.js
new file mode 100644
index 0000000..012b4c7
--- /dev/null
+++ b/packages/material_ui_tree/src/index.js
@@ -0,0 +1,3 @@
+import MaterialUITree from "./material_ui_tree";
+
+export default MaterialUITree;
diff --git a/packages/material_ui_tree/src/input/input.js b/packages/material_ui_tree/src/input/input.js
new file mode 100644
index 0000000..f7ca737
--- /dev/null
+++ b/packages/material_ui_tree/src/input/input.js
@@ -0,0 +1,39 @@
+import React from "react";
+import { Clear, Search } from "@material-ui/icons";
+import InputAdornment from "@material-ui/core/InputAdornment";
+import InputBase from "@material-ui/core/InputBase";
+import Divider from "@material-ui/core/Divider";
+import CardActions from "@material-ui/core/CardActions";
+import IconButton from "@material-ui/core/IconButton";
+
+const MaterialUIInputRenderer = ({
+  searchTerm = "",
+  setSearchTerm = () => {}
+}) => {
+  return (
+    <>
+      <CardActions>
+        <InputBase
+          id="input-with-icon-adornment"
+          value={searchTerm}
+          onChange={e => setSearchTerm(e.target.value)}
+          startAdornment={
+            <InputAdornment position="start">
+              <Search />
+            </InputAdornment>
+          }
+          endAdornment={
+            searchTerm !== "" && (
+              <IconButton size={"small"}>
+                <Clear onClick={() => setSearchTerm("")} />
+              </IconButton>
+            )
+          }
+        />
+      </CardActions>
+      <Divider />
+    </>
+  );
+};
+
+export default MaterialUIInputRenderer;
diff --git a/packages/material_ui_tree/src/item/basic_item.js b/packages/material_ui_tree/src/item/basic_item.js
new file mode 100644
index 0000000..2b809ff
--- /dev/null
+++ b/packages/material_ui_tree/src/item/basic_item.js
@@ -0,0 +1,8 @@
+import React from "react";
+import ListItemText from "@material-ui/core/ListItemText";
+
+const BasicItem = ({ label = "" }) => {
+  return <ListItemText primary={label} />;
+};
+
+export default BasicItem;
diff --git a/packages/material_ui_tree/src/item/item.js b/packages/material_ui_tree/src/item/item.js
new file mode 100644
index 0000000..b4a3d74
--- /dev/null
+++ b/packages/material_ui_tree/src/item/item.js
@@ -0,0 +1,38 @@
+import React from "react";
+import BasicItem from "./basic_item";
+import { ChevronRight } from "@material-ui/icons";
+import ListItem from "@material-ui/core/ListItem";
+import SearchedItem from "./searched_item";
+
+const MaterialUIItemRenderer = props => {
+  const {
+    searchTerm = "",
+    item: { item, hasChild, currentDepth } = {
+      item: [""],
+      hasChild: false,
+      currentDepth: 0
+    },
+    onClick = () => {}
+  } = props;
+  const searchIndex = item[item.length - 1]
+    .toLowerCase()
+    .indexOf(searchTerm.trim().toLowerCase());
+  return (
+    <ListItem
+      button
+      onClick={() => onClick(item[currentDepth], item, hasChild)}
+    >
+      {searchTerm !== "" && (
+        <SearchedItem
+          item={item}
+          searchIndex={searchIndex}
+          searchTerm={searchTerm.trim()}
+        />
+      )}
+      {searchTerm === "" && <BasicItem label={item[currentDepth]} />}
+      {hasChild && <ChevronRight />}
+    </ListItem>
+  );
+};
+
+export default MaterialUIItemRenderer;
diff --git a/packages/material_ui_tree/src/item/searched_item.js b/packages/material_ui_tree/src/item/searched_item.js
new file mode 100644
index 0000000..82def86
--- /dev/null
+++ b/packages/material_ui_tree/src/item/searched_item.js
@@ -0,0 +1,37 @@
+import React from "react";
+import ListItemText from "@material-ui/core/ListItemText";
+import { makeStyles } from "@material-ui/core/styles";
+import Typography from "@material-ui/core/Typography";
+
+const useStyles = makeStyles(() => ({
+  boldText: {
+    fontWeight: "bold"
+  }
+}));
+
+const SearchedItem = ({ item = [""], searchIndex = 0, searchTerm = "" }) => {
+  const classes = useStyles();
+  const leaf = item[item.length - 1];
+  const parents = item.slice(0, item.length - 1).join(" / ");
+
+  return (
+    <ListItemText
+      primary={
+        <>
+          <Typography component="span">
+            {leaf.substring(0, searchIndex)}
+          </Typography>
+          <Typography component="span" className={classes.boldText}>
+            {leaf.substring(searchIndex, searchIndex + searchTerm.length)}
+          </Typography>
+          <Typography component="span">
+            {leaf.substring(searchIndex + searchTerm.length)}
+          </Typography>
+        </>
+      }
+      secondary={parents}
+    />
+  );
+};
+
+export default SearchedItem;
diff --git a/packages/material_ui_tree/src/items/items.js b/packages/material_ui_tree/src/items/items.js
new file mode 100644
index 0000000..150b9f3
--- /dev/null
+++ b/packages/material_ui_tree/src/items/items.js
@@ -0,0 +1,21 @@
+import React from "react";
+import List from "@material-ui/core/List";
+import makeStyles from "@material-ui/core/styles/makeStyles";
+
+const useStyles = makeStyles(({ treeHeight }) => ({
+  root: {
+    overflow: "auto",
+    maxHeight: treeHeight - 48 - 42
+  }
+}));
+
+const MaterialUIItemsRenderer = ({ children, treeHeight }) => {
+  const classes = useStyles({ treeHeight });
+  return (
+    <List className={classes.root} component="nav">
+      {children}
+    </List>
+  );
+};
+
+export default MaterialUIItemsRenderer;
diff --git a/packages/material_ui_tree/src/material_ui_tree.js b/packages/material_ui_tree/src/material_ui_tree.js
new file mode 100644
index 0000000..42b0f60
--- /dev/null
+++ b/packages/material_ui_tree/src/material_ui_tree.js
@@ -0,0 +1,40 @@
+import React from "react";
+import Tree from "@kenshooui/react-tree";
+import MaterialUIItemRenderer from "./item/item";
+import MaterialUIInputRenderer from "./input/input";
+import MaterialUIContainerRenderer from "./tree_container/tree_container";
+import MaterialUIHeader from "./header/header";
+import MaterialUIItemsRenderer from "./items/items";
+import MaterialUINoResults from "./no_results/no_results";
+
+const MaterialUITree = ({
+  structure = [],
+  title,
+  onSelect,
+  width,
+  height,
+  treeContainerRenderer = MaterialUIContainerRenderer,
+  headerRenderer = MaterialUIHeader,
+  inputRenderer = MaterialUIInputRenderer,
+  itemRenderer = MaterialUIItemRenderer,
+  itemsRenderer = MaterialUIItemsRenderer,
+  noResultsRenderer = MaterialUINoResults
+}) => {
+  return (
+    <Tree
+      structure={structure}
+      title={title}
+      onSelect={onSelect}
+      treeContainerRenderer={props =>
+        treeContainerRenderer({ ...props, width, height })
+      }
+      headerRenderer={headerRenderer}
+      inputRenderer={inputRenderer}
+      itemRenderer={itemRenderer}
+      itemsRenderer={itemsRenderer}
+      noResultsRenderer={noResultsRenderer}
+    />
+  );
+};
+
+export default MaterialUITree;
diff --git a/packages/material_ui_tree/src/no_results/no_results.js b/packages/material_ui_tree/src/no_results/no_results.js
new file mode 100644
index 0000000..3b59af3
--- /dev/null
+++ b/packages/material_ui_tree/src/no_results/no_results.js
@@ -0,0 +1,24 @@
+import React from "react";
+import { Warning } from "@material-ui/icons";
+import Typography from "@material-ui/core/Typography";
+import makeStyles from "@material-ui/core/styles/makeStyles";
+
+const useStyles = makeStyles({
+  root: {
+    display: "flex",
+    flexDirection: "column",
+    alignItems: "center"
+  }
+});
+
+const MaterialUINoResults = ({ text }) => {
+  const classes = useStyles();
+  return (
+    <div className={classes.root}>
+      <Warning fontSize="large" color="disabled" />
+      <Typography variant="subtitle1">{text}</Typography>
+    </div>
+  );
+};
+
+export default MaterialUINoResults;
diff --git a/packages/material_ui_tree/src/tree_container/tree_container.js b/packages/material_ui_tree/src/tree_container/tree_container.js
new file mode 100644
index 0000000..238255a
--- /dev/null
+++ b/packages/material_ui_tree/src/tree_container/tree_container.js
@@ -0,0 +1,25 @@
+import React from "react";
+import { makeStyles } from "@material-ui/core/styles";
+import Card from "@material-ui/core/Card";
+
+const DEFAULT_WIDTH = 230;
+const DEFAULT_HEIGHT = 300;
+const PIXEL_SUFFIX = "px";
+
+const useStyles = makeStyles(({ width, height }) => ({
+  root: {
+    width: (width || DEFAULT_WIDTH) + PIXEL_SUFFIX,
+    height: (height || DEFAULT_HEIGHT) + PIXEL_SUFFIX
+  }
+}));
+
+const MaterialUIContainerRenderer = ({ children, width, height }) => {
+  const classes = useStyles({ width, height });
+  return (
+    <Card raised={true} className={classes.root}>
+      {children}
+    </Card>
+  );
+};
+
+export default MaterialUIContainerRenderer;
diff --git a/yarn.lock b/yarn.lock
index 7cdff2f..0b6409b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -865,6 +865,13 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
+"@babel/runtime@^7.4.4", "@babel/runtime@^7.8.7":
+  version "7.12.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
+  integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
 "@babel/template@^7.7.4", "@babel/template@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8"
@@ -979,6 +986,11 @@
   resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831"
   integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==
 
+"@emotion/hash@^0.8.0":
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
+  integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+
 "@emotion/is-prop-valid@0.8.6":
   version "0.8.6"
   resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.6.tgz#4757646f0a58e9dec614c47c838e7147d88c263c"
@@ -1987,6 +1999,77 @@
     npmlog "^4.1.2"
     write-file-atomic "^2.3.0"
 
+"@material-ui/core@^4.11.2":
+  version "4.11.2"
+  resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.2.tgz#f8276dfa40d88304e6ceb98962af73803d27d42d"
+  integrity sha512-/D1+AQQeYX/WhT/FUk78UCRj8ch/RCglsQLYujYTIqPSJlwZHKcvHidNeVhODXeApojeXjkl0tWdk5C9ofwOkQ==
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    "@material-ui/styles" "^4.11.2"
+    "@material-ui/system" "^4.11.2"
+    "@material-ui/types" "^5.1.0"
+    "@material-ui/utils" "^4.11.2"
+    "@types/react-transition-group" "^4.2.0"
+    clsx "^1.0.4"
+    hoist-non-react-statics "^3.3.2"
+    popper.js "1.16.1-lts"
+    prop-types "^15.7.2"
+    react-is "^16.8.0 || ^17.0.0"
+    react-transition-group "^4.4.0"
+
+"@material-ui/icons@^4.11.2":
+  version "4.11.2"
+  resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5"
+  integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+
+"@material-ui/styles@^4.11.2":
+  version "4.11.2"
+  resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.2.tgz#e70558be3f41719e8c0d63c7a3c9ae163fdc84cb"
+  integrity sha512-xbItf8zkfD3FuGoD9f2vlcyPf9jTEtj9YTJoNNV+NMWaSAHXgrW6geqRoo/IwBuMjqpwqsZhct13e2nUyU9Ljw==
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    "@emotion/hash" "^0.8.0"
+    "@material-ui/types" "^5.1.0"
+    "@material-ui/utils" "^4.11.2"
+    clsx "^1.0.4"
+    csstype "^2.5.2"
+    hoist-non-react-statics "^3.3.2"
+    jss "^10.0.3"
+    jss-plugin-camel-case "^10.0.3"
+    jss-plugin-default-unit "^10.0.3"
+    jss-plugin-global "^10.0.3"
+    jss-plugin-nested "^10.0.3"
+    jss-plugin-props-sort "^10.0.3"
+    jss-plugin-rule-value-function "^10.0.3"
+    jss-plugin-vendor-prefixer "^10.0.3"
+    prop-types "^15.7.2"
+
+"@material-ui/system@^4.11.2":
+  version "4.11.2"
+  resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.11.2.tgz#7f0a754bba3673ed5fdbfa02fe438096c104b1f6"
+  integrity sha512-BELFJEel5E+5DMiZb6XXT3peWRn6UixRvBtKwSxqntmD0+zwbbfCij6jtGwwdJhN1qX/aXrKu10zX31GBaeR7A==
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    "@material-ui/utils" "^4.11.2"
+    csstype "^2.5.2"
+    prop-types "^15.7.2"
+
+"@material-ui/types@^5.1.0":
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2"
+  integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==
+
+"@material-ui/utils@^4.11.2":
+  version "4.11.2"
+  resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a"
+  integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    prop-types "^15.7.2"
+    react-is "^16.8.0 || ^17.0.0"
+
 "@mrmlnc/readdir-enhanced@^2.2.1":
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -2906,6 +2989,13 @@
   dependencies:
     "@types/react" "*"
 
+"@types/react-transition-group@^4.2.0":
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d"
+  integrity sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==
+  dependencies:
+    "@types/react" "*"
+
 "@types/react@*":
   version "16.9.21"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.21.tgz#99e274e2ecfab6bb93920e918341daa3198b348d"
@@ -4682,6 +4772,11 @@ clone@^1.0.2:
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
+clsx@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
+  integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -5198,6 +5293,14 @@ css-tree@1.0.0-alpha.37:
     mdn-data "2.0.4"
     source-map "^0.6.1"
 
+css-vendor@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d"
+  integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==
+  dependencies:
+    "@babel/runtime" "^7.8.3"
+    is-in-browser "^1.0.2"
+
 css-what@2.1:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
@@ -5249,6 +5352,16 @@ csstype@^2.2.0, csstype@^2.5.7:
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098"
   integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==
 
+csstype@^2.5.2:
+  version "2.6.14"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.14.tgz#004822a4050345b55ad4dcc00be1d9cf2f4296de"
+  integrity sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A==
+
+csstype@^3.0.2:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8"
+  integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==
+
 currently-unhandled@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -5574,6 +5687,14 @@ dom-converter@^0.2:
   dependencies:
     utila "~0.4"
 
+dom-helpers@^5.0.1:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b"
+  integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==
+  dependencies:
+    "@babel/runtime" "^7.8.7"
+    csstype "^3.0.2"
+
 dom-serializer@0:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
@@ -7166,7 +7287,7 @@ hmac-drbg@^1.0.0:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.1"
 
-hoist-non-react-statics@^3.3.0:
+hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
   integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -7328,6 +7449,11 @@ humanize-ms@^1.2.1:
   dependencies:
     ms "^2.0.0"
 
+hyphenate-style-name@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d"
+  integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==
+
 iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -7444,6 +7570,13 @@ imurmurhash@^0.1.4:
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
+indefinite-observable@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-2.0.1.tgz#574af29bfbc17eb5947793797bddc94c9d859400"
+  integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==
+  dependencies:
+    symbol-observable "1.2.0"
+
 indent-string@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
@@ -7832,6 +7965,11 @@ is-hexadecimal@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
   integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
 
+is-in-browser@^1.0.2, is-in-browser@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
+  integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=
+
 is-map@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1"
@@ -8686,6 +8824,77 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
+jss-plugin-camel-case@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz#4b0a9c85e65e5eb72cbfba59373686c604d88f72"
+  integrity sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    hyphenate-style-name "^1.0.3"
+    jss "10.5.0"
+
+jss-plugin-default-unit@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz#e9f2e89741b0118ba15d52b4c13bda2b27262373"
+  integrity sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.5.0"
+
+jss-plugin-global@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz#eb357ccd35cb4894277fb2117a78d1e498668ad6"
+  integrity sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.5.0"
+
+jss-plugin-nested@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz#790c506432a23a63c71ceb5044e2ac85f0958702"
+  integrity sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.5.0"
+    tiny-warning "^1.0.2"
+
+jss-plugin-props-sort@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz#5bcc3bd8e68cd3e2dafb47d67db28fd5a4fcf102"
+  integrity sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.5.0"
+
+jss-plugin-rule-value-function@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz#60ee8240dfe60418e1ba4729adee893cbe9be7a3"
+  integrity sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.5.0"
+    tiny-warning "^1.0.2"
+
+jss-plugin-vendor-prefixer@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz#01f04cfff31f43f153f5d71972f5800b10a2eb84"
+  integrity sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    css-vendor "^2.0.8"
+    jss "10.5.0"
+
+jss@10.5.0, jss@^10.0.3:
+  version "10.5.0"
+  resolved "https://registry.yarnpkg.com/jss/-/jss-10.5.0.tgz#0c2de8a29874b2dc8162ab7f34ef6573a87d9dd3"
+  integrity sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    csstype "^3.0.2"
+    indefinite-observable "^2.0.1"
+    is-in-browser "^1.1.3"
+    tiny-warning "^1.0.2"
+
 kind-of@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
@@ -10641,6 +10850,11 @@ polished@^3.3.1:
   dependencies:
     "@babel/runtime" "^7.6.3"
 
+popper.js@1.16.1-lts:
+  version "1.16.1-lts"
+  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05"
+  integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==
+
 popper.js@^1.14.4, popper.js@^1.14.7:
   version "1.16.1"
   resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
@@ -11253,6 +11467,11 @@ react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-i
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
   integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
 
+"react-is@^16.8.0 || ^17.0.0":
+  version "17.0.1"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339"
+  integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==
+
 react-lifecycles-compat@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
@@ -11318,6 +11537,16 @@ react-textarea-autosize@^7.1.0:
     "@babel/runtime" "^7.1.2"
     prop-types "^15.6.0"
 
+react-transition-group@^4.4.0:
+  version "4.4.1"
+  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9"
+  integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    dom-helpers "^5.0.1"
+    loose-envify "^1.4.0"
+    prop-types "^15.6.2"
+
 react@^16.12.0, react@^16.8.3:
   version "16.12.0"
   resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83"
@@ -11552,6 +11781,11 @@ regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3:
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
   integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
 
+regenerator-runtime@^0.13.4:
+  version "0.13.7"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+  integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
 regenerator-transform@^0.14.0:
   version "0.14.1"
   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb"
@@ -12837,6 +13071,11 @@ svgo@^1.2.2:
     unquote "~1.1.1"
     util.promisify "~1.0.0"
 
+symbol-observable@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+  integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
+
 symbol-tree@^3.2.2:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
@@ -13041,6 +13280,11 @@ tiny-emitter@^2.0.0:
   resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
   integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
 
+tiny-warning@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
 tinycolor2@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"

From dfcdbc07dc64368901552ce05af83df76d15c099 Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Tue, 5 Jan 2021 20:02:49 +0200
Subject: [PATCH 2/7] failed trial to pass ref

---
 .../material_ui_tree/src/tree_container/tree_container.js | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/packages/material_ui_tree/src/tree_container/tree_container.js b/packages/material_ui_tree/src/tree_container/tree_container.js
index 238255a..d049936 100644
--- a/packages/material_ui_tree/src/tree_container/tree_container.js
+++ b/packages/material_ui_tree/src/tree_container/tree_container.js
@@ -13,10 +13,14 @@ const useStyles = makeStyles(({ width, height }) => ({
   }
 }));
 
-const MaterialUIContainerRenderer = ({ children, width, height }) => {
+const MaterialUIContainerRenderer = props => {
+  const { children, width, height } = props;
   const classes = useStyles({ width, height });
+  const Container = React.forwardRef((props, ref) => (
+    <div {...props} ref={ref} />
+  ));
   return (
-    <Card raised={true} className={classes.root}>
+    <Card raised={true} className={classes.root} component={Container}>
       {children}
     </Card>
   );

From d66869d0cf13c9cde78f377bf8aa3587cecb282d Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Tue, 5 Jan 2021 20:22:30 +0200
Subject: [PATCH 3/7] fix paddings

---
 packages/material_ui_tree/src/header/header.js | 10 +++++++++-
 packages/material_ui_tree/src/input/input.js   | 10 +++++++++-
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/packages/material_ui_tree/src/header/header.js b/packages/material_ui_tree/src/header/header.js
index 17adc61..4d67482 100644
--- a/packages/material_ui_tree/src/header/header.js
+++ b/packages/material_ui_tree/src/header/header.js
@@ -4,11 +4,19 @@ import Typography from "@material-ui/core/Typography";
 import CardActions from "@material-ui/core/CardActions";
 import Divider from "@material-ui/core/Divider";
 import IconButton from "@material-ui/core/IconButton";
+import { makeStyles } from "@material-ui/core/styles";
+
+const useStyles = makeStyles(() => ({
+  root: {
+    padding: "8px 16px"
+  }
+}));
 
 const MaterialUIHeader = ({ parents = [], onClick, title = "" }) => {
+  const classes = useStyles();
   return (
     <>
-      <CardActions>
+      <CardActions className={classes.root}>
         {parents.length > 0 && (
           <IconButton size={"small"}>
             <ChevronLeft onClick={onClick} />
diff --git a/packages/material_ui_tree/src/input/input.js b/packages/material_ui_tree/src/input/input.js
index f7ca737..a5f41f2 100644
--- a/packages/material_ui_tree/src/input/input.js
+++ b/packages/material_ui_tree/src/input/input.js
@@ -5,14 +5,22 @@ import InputBase from "@material-ui/core/InputBase";
 import Divider from "@material-ui/core/Divider";
 import CardActions from "@material-ui/core/CardActions";
 import IconButton from "@material-ui/core/IconButton";
+import { makeStyles } from "@material-ui/core/styles";
+
+const useStyles = makeStyles(() => ({
+  root: {
+    padding: "8px 16px"
+  }
+}));
 
 const MaterialUIInputRenderer = ({
   searchTerm = "",
   setSearchTerm = () => {}
 }) => {
+  const classes = useStyles();
   return (
     <>
-      <CardActions>
+      <CardActions className={classes.root}>
         <InputBase
           id="input-with-icon-adornment"
           value={searchTerm}

From 62dfb80d455096efdd21bd9e26a170fa9fadda8a Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Wed, 6 Jan 2021 14:42:25 +0200
Subject: [PATCH 4/7] changes after review

---
 packages/core/src/header/header.js            |  3 +-
 .../core/src/hooks/use_components_refs.js     | 16 +++++
 packages/core/src/hooks/use_leaves_manager.js |  4 +-
 packages/core/src/hooks/use_ref_height.js     | 13 ----
 packages/core/src/input/input.js              |  7 +-
 packages/core/src/items/itemsStyle.js         |  4 +-
 .../core/src/no_results/noResultsStyle.js     |  5 +-
 packages/core/src/styles/styles.js            |  4 +-
 packages/core/src/tree.js                     | 48 +++++++++----
 .../{treeStyle.js => treeContainerStyle.js}   |  6 +-
 .../core/src/tree_container/tree_container.js |  9 +--
 packages/docs/stories/core.stories.js         | 68 +++++++++++++++----
 packages/material_ui_tree/package.json        | 16 ++---
 .../material_ui_tree/src/header/header.js     |  6 +-
 packages/material_ui_tree/src/input/input.js  | 14 ++--
 packages/material_ui_tree/src/item/item.js    |  4 +-
 packages/material_ui_tree/src/items/items.js  | 15 ++--
 .../material_ui_tree/src/material_ui_tree.js  |  6 +-
 .../src/no_results/no_results.js              | 12 +++-
 .../src/tree_container/tree_container.js      | 19 ++----
 20 files changed, 175 insertions(+), 104 deletions(-)
 create mode 100644 packages/core/src/hooks/use_components_refs.js
 delete mode 100644 packages/core/src/hooks/use_ref_height.js
 rename packages/core/src/tree_container/{treeStyle.js => treeContainerStyle.js} (75%)

diff --git a/packages/core/src/header/header.js b/packages/core/src/header/header.js
index cfdbb5b..4451d6c 100644
--- a/packages/core/src/header/header.js
+++ b/packages/core/src/header/header.js
@@ -6,6 +6,7 @@ export const BackIconRenderer = () => <>⬅️</>;
 
 const Header = props => {
   const {
+    headerRef,
     parents = [],
     onClick,
     title = "",
@@ -13,7 +14,7 @@ const Header = props => {
     backIconRenderer: BackIcon = BackIconRenderer
   } = props;
   return (
-    <div css={getStyles("header", props)}>
+    <div ref={headerRef} css={getStyles("header", props)}>
       {parents.length > 0 && (
         <>
           <span css={getStyles("headerBackIcon", props)} onClick={onClick}>
diff --git a/packages/core/src/hooks/use_components_refs.js b/packages/core/src/hooks/use_components_refs.js
new file mode 100644
index 0000000..5f1db6d
--- /dev/null
+++ b/packages/core/src/hooks/use_components_refs.js
@@ -0,0 +1,16 @@
+import { useRef } from "react";
+
+const useComponentsRefs = () => {
+  const containerRef = useRef();
+  const headerRef = useRef();
+  const inputRef = useRef();
+
+  const itemsHeight =
+    containerRef?.current?.clientHeight -
+    headerRef?.current?.clientHeight -
+    inputRef?.current?.clientHeight;
+
+  return { containerRef, headerRef, inputRef, itemsHeight };
+};
+
+export default useComponentsRefs;
diff --git a/packages/core/src/hooks/use_leaves_manager.js b/packages/core/src/hooks/use_leaves_manager.js
index 6a5b219..e75b91c 100644
--- a/packages/core/src/hooks/use_leaves_manager.js
+++ b/packages/core/src/hooks/use_leaves_manager.js
@@ -10,6 +10,8 @@ const useLeavesManager = ({ structure, parents, currentDepth }) => {
   const [searchTerm, setSearchTerm] = useState("");
   const [leaves, setLeaves] = useState([]);
 
+  const onInputChange = event => setSearchTerm(event?.target?.value || "");
+
   useEffect(() => {
     const leaves = structure
       .filter(
@@ -22,7 +24,7 @@ const useLeavesManager = ({ structure, parents, currentDepth }) => {
     setLeaves(removeDuplicateLeafs(leaves));
   }, [searchTerm, parents, currentDepth]);
 
-  return { searchTerm, setSearchTerm, leaves };
+  return { searchTerm, setSearchTerm, onInputChange, leaves };
 };
 
 export default useLeavesManager;
diff --git a/packages/core/src/hooks/use_ref_height.js b/packages/core/src/hooks/use_ref_height.js
deleted file mode 100644
index 5bc28b0..0000000
--- a/packages/core/src/hooks/use_ref_height.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { useEffect, useState } from "react";
-
-const useTreeHeight = ({ ref }) => {
-  const [treeHeight, setTreeHeight] = useState(0);
-
-  useEffect(() => {
-    ref.current && setTreeHeight(ref.current.getBoundingClientRect().height);
-  }, [ref]);
-
-  return treeHeight;
-};
-
-export default useTreeHeight;
diff --git a/packages/core/src/input/input.js b/packages/core/src/input/input.js
index 7ab5455..4a53078 100644
--- a/packages/core/src/input/input.js
+++ b/packages/core/src/input/input.js
@@ -6,20 +6,21 @@ export const InputIconRenderer = () => <>🔍</>;
 
 const Input = props => {
   const {
+    inputRef,
     searchTerm,
-    setSearchTerm,
+    onInputChange,
     getStyles,
     inputIconRenderer: InputIcon = InputIconRenderer
   } = props;
   return (
-    <div css={getStyles("inputWrapper", props)}>
+    <div ref={inputRef} css={getStyles("inputWrapper", props)}>
       <span css={getStyles("searchInput", props)}>
         <InputIcon />
       </span>
       <input
         css={getStyles("input", props)}
         value={searchTerm}
-        onChange={e => setSearchTerm(e.target.value)}
+        onChange={onInputChange}
       />
     </div>
   );
diff --git a/packages/core/src/items/itemsStyle.js b/packages/core/src/items/itemsStyle.js
index 2b74e6a..06d91d9 100644
--- a/packages/core/src/items/itemsStyle.js
+++ b/packages/core/src/items/itemsStyle.js
@@ -1,4 +1,4 @@
-export default () => ({
-  maxHeight: "203px",
+export default ({ itemsHeight }) => ({
+  maxHeight: itemsHeight,
   overflowY: "auto"
 });
diff --git a/packages/core/src/no_results/noResultsStyle.js b/packages/core/src/no_results/noResultsStyle.js
index eb567dc..5cd3f21 100644
--- a/packages/core/src/no_results/noResultsStyle.js
+++ b/packages/core/src/no_results/noResultsStyle.js
@@ -1,8 +1,9 @@
-export const css = () => ({
+export const css = ({ itemsHeight }) => ({
   display: "flex",
   flexDirection: "column",
   alignItems: "center",
-  marginTop: "30px"
+  justifyContent: "center",
+  height: itemsHeight
 });
 
 export const icon = () => ({
diff --git a/packages/core/src/styles/styles.js b/packages/core/src/styles/styles.js
index d3e5669..bd1435a 100644
--- a/packages/core/src/styles/styles.js
+++ b/packages/core/src/styles/styles.js
@@ -1,4 +1,4 @@
-import treeCss from "../tree_container/treeStyle";
+import containerCss from "../tree_container/treeContainerStyle";
 import {
   wrapperCss as headerWrapperCss,
   backIconCss as headerBackIconCss
@@ -22,7 +22,7 @@ import {
 } from "../no_results/noResultsStyle";
 
 export const defaultStyles = {
-  tree: treeCss,
+  container: containerCss,
   header: headerWrapperCss,
   headerBackIcon: headerBackIconCss,
   item: itemCss,
diff --git a/packages/core/src/tree.js b/packages/core/src/tree.js
index d383ff9..de7c103 100644
--- a/packages/core/src/tree.js
+++ b/packages/core/src/tree.js
@@ -1,6 +1,6 @@
 /** @jsx jsx */
 import { jsx } from "@emotion/core";
-import React, { useRef } from "react";
+import React from "react";
 
 import { defaultStyles } from "./styles/styles";
 import ItemDefault from "./item/item";
@@ -12,13 +12,19 @@ import useLeavesManager from "./hooks/use_leaves_manager";
 import useItemCallbacks from "./hooks/use_item_callbacks";
 import TreeContainerRenderer from "./tree_container/tree_container";
 import ItemsRenderer from "./items/items";
-import useTreeHeight from "./hooks/use_ref_height";
+import useContainerHeight from "./hooks/use_components_refs";
+
+const DEFAULT_WIDTH = 230;
+const DEFAULT_HEIGHT = 300;
+const PIXEL_SUFFIX = "px";
 
 const Tree = props => {
   const {
     structure = [],
     title,
     onSelect,
+    width,
+    height,
     noResultsText = "No matching results",
     headerRenderer: Header = HeaderDefault,
     backIconRenderer,
@@ -39,22 +45,32 @@ const Tree = props => {
     return custom ? custom(base, props) : base;
   };
 
-  const ref = useRef();
-  const treeHeight = useTreeHeight({ ref });
+  const {
+    containerRef,
+    headerRef,
+    inputRef,
+    itemsHeight
+  } = useContainerHeight();
 
   const { onClick, onBackClick, currentDepth, parents } = useItemCallbacks(
     onSelect
   );
 
-  const { searchTerm, setSearchTerm, leaves } = useLeavesManager({
+  const { searchTerm, onInputChange, leaves } = useLeavesManager({
     structure,
     parents,
     currentDepth
   });
 
   return (
-    <TreeContainer getStyles={getStyles} innerRef={ref}>
+    <TreeContainer
+      containerRef={containerRef}
+      getStyles={getStyles}
+      width={(width || DEFAULT_WIDTH) + PIXEL_SUFFIX}
+      height={(height || DEFAULT_HEIGHT) + PIXEL_SUFFIX}
+    >
       <Header
+        headerRef={headerRef}
         parents={parents}
         title={title}
         onClick={onBackClick}
@@ -64,12 +80,13 @@ const Tree = props => {
         {title}
       </Header>
       <Input
+        inputRef={inputRef}
         getStyles={getStyles}
         searchTerm={searchTerm}
-        setSearchTerm={setSearchTerm}
+        onInputChange={onInputChange}
         inputIconRenderer={inputIconRenderer}
       />
-      <Items getStyles={getStyles} treeHeight={treeHeight}>
+      <Items getStyles={getStyles} itemsHeight={itemsHeight}>
         {leaves &&
           leaves.length > 0 &&
           leaves.map(item => (
@@ -81,14 +98,15 @@ const Tree = props => {
               forwardIconRenderer={forwardIconRenderer}
             />
           ))}
-        {leaves && leaves.length === 0 && (
-          <NoResults
-            text={noResultsText}
-            getStyles={getStyles}
-            noResultsIconRenderer={noResultsIconRenderer}
-          />
-        )}
       </Items>
+      {leaves && leaves.length === 0 && (
+        <NoResults
+          itemsHeight={itemsHeight}
+          text={noResultsText}
+          getStyles={getStyles}
+          noResultsIconRenderer={noResultsIconRenderer}
+        />
+      )}
     </TreeContainer>
   );
 };
diff --git a/packages/core/src/tree_container/treeStyle.js b/packages/core/src/tree_container/treeContainerStyle.js
similarity index 75%
rename from packages/core/src/tree_container/treeStyle.js
rename to packages/core/src/tree_container/treeContainerStyle.js
index ea13bcf..c56620f 100644
--- a/packages/core/src/tree_container/treeStyle.js
+++ b/packages/core/src/tree_container/treeContainerStyle.js
@@ -1,6 +1,6 @@
-export default () => ({
-  width: "230px",
-  height: "280px",
+export default ({ width, height }) => ({
+  width: width,
+  height: height,
   backgroundColor: "#F8F9FA",
   boxShadow: "0 6px 10px 0 rgba(27, 32, 70, 0.09)",
   border: "1px solid #E1E4EB",
diff --git a/packages/core/src/tree_container/tree_container.js b/packages/core/src/tree_container/tree_container.js
index f1d745d..b83173a 100644
--- a/packages/core/src/tree_container/tree_container.js
+++ b/packages/core/src/tree_container/tree_container.js
@@ -3,13 +3,10 @@ import { jsx } from "@emotion/core";
 import React from "react";
 
 const TreeContainerRenderer = props => {
-  const {
-    getStyles,
-    children
-  } = props;
+  const { containerRef, getStyles, children } = props;
   return (
-      <div css={getStyles("tree", props)}>
-        {children}
+    <div ref={containerRef} css={getStyles("container", props)}>
+      {children}
     </div>
   );
 };
diff --git a/packages/docs/stories/core.stories.js b/packages/docs/stories/core.stories.js
index e29caf6..aaab250 100644
--- a/packages/docs/stories/core.stories.js
+++ b/packages/docs/stories/core.stories.js
@@ -1,21 +1,32 @@
 import React from "react";
-import MaterialUITree from "@kenshooui/material_ui_tree";
 import Tree from "@kenshooui/react-tree";
+import MaterialUITree from "@kenshooui/material-tree";
 import makeStyles from "@material-ui/core/styles/makeStyles";
 
 const useStyles = makeStyles({
-  root: {
+  wrapper: {
+    padding: 40,
     display: "flex",
-    flexDirection: "row"
+    justifyContent: "start",
+    alignItems: "start"
   },
-  tree: {
-    padding: 20
+  item: {
+    display: "flex",
+    alignItems: "center",
+    marginRight: 25,
+    flexDirection: "column"
+  },
+  title: {
+    fontSize: 16,
+    color: "#747070",
+    marginBottom: 16,
+    fontWeight: "bold"
   }
 });
 
 export default {
   title: "Tree",
-  component: MaterialUITree
+  component: Tree
 };
 
 const structure = [
@@ -43,23 +54,50 @@ const structure = [
 
 export const Basic = () => {
   const classes = useStyles();
+  return (
+    <div className={classes.wrapper}>
+      <div className={classes.item}>
+        <div className={classes.title}>Default Dimensions</div>
+        <Tree
+          structure={structure}
+          title={"Choose an item"}
+          onSelect={item => alert(item)}
+        />
+      </div>
+      <div className={classes.item}>
+        <div className={classes.title}>Custom Dimensions</div>
+        <Tree
+          structure={structure}
+          title={"Choose an item"}
+          onSelect={item => alert(item)}
+          width={200}
+          height={200}
+        />
+      </div>
+    </div>
+  );
+};
 
+export const MaterialTheme = () => {
+  const classes = useStyles();
   return (
-    <div className={classes.root}>
-      <div className={classes.tree}>
+    <div className={classes.wrapper}>
+      <div className={classes.item}>
+        <div className={classes.title}>Default Dimensions</div>
         <MaterialUITree
           structure={structure}
           title={"Choose an item"}
           onSelect={item => alert(item)}
-          width={300}
-          height={400}
         />
       </div>
-      <div className={classes.tree}>
-        <Tree
+      <div className={classes.item}>
+        <div className={classes.title}>Custom Dimensions</div>
+        <MaterialUITree
           structure={structure}
           title={"Choose an item"}
           onSelect={item => alert(item)}
+          width={250}
+          height={350}
         />
       </div>
     </div>
@@ -67,5 +105,9 @@ export const Basic = () => {
 };
 
 Basic.story = {
-  name: "basic configuration"
+  name: "Basic configuration"
+};
+
+MaterialTheme.story = {
+  name: "Material Theme"
 };
diff --git a/packages/material_ui_tree/package.json b/packages/material_ui_tree/package.json
index e5880bb..1c1859d 100644
--- a/packages/material_ui_tree/package.json
+++ b/packages/material_ui_tree/package.json
@@ -1,22 +1,22 @@
 {
-  "name": "@kenshooui/material_ui_tree",
+  "name": "@kenshooui/material-tree",
   "version": "1.0.0",
-  "main": "dist/material_ui_tree.cjs.js",
-  "module": "dist/material_ui_tree.esm.js",
+  "main": "dist/material-tree.cjs.js",
+  "module": "dist/material-tree.esm.js",
   "scripts": {},
   "repository": "https://github.com/kenshoo/react-tree.git",
   "author": "ui@kenshoo.com",
   "license": "MIT",
   "peerDependencies": {
     "@kenshooui/react-tree": "^1.0.0",
+    "@material-ui/core": "^4.11.2",
+    "@material-ui/icons": "^4.11.2",
     "react": "^16.12.0"
   },
   "devDependencies": {
-    "react": "^16.12.0"
-  },
-  "dependencies": {
     "@material-ui/core": "^4.11.2",
     "@material-ui/icons": "^4.11.2",
-    "classnames": "^2.2.6"
-  }
+    "react": "^16.12.0"
+  },
+  "dependencies": {}
 }
diff --git a/packages/material_ui_tree/src/header/header.js b/packages/material_ui_tree/src/header/header.js
index 4d67482..8033fab 100644
--- a/packages/material_ui_tree/src/header/header.js
+++ b/packages/material_ui_tree/src/header/header.js
@@ -12,10 +12,10 @@ const useStyles = makeStyles(() => ({
   }
 }));
 
-const MaterialUIHeader = ({ parents = [], onClick, title = "" }) => {
+const MaterialUIHeader = ({ headerRef, parents = [], onClick, title = "" }) => {
   const classes = useStyles();
   return (
-    <>
+    <div ref={headerRef}>
       <CardActions className={classes.root}>
         {parents.length > 0 && (
           <IconButton size={"small"}>
@@ -27,7 +27,7 @@ const MaterialUIHeader = ({ parents = [], onClick, title = "" }) => {
         </Typography>
       </CardActions>
       <Divider />
-    </>
+    </div>
   );
 };
 
diff --git a/packages/material_ui_tree/src/input/input.js b/packages/material_ui_tree/src/input/input.js
index a5f41f2..f1fb08c 100644
--- a/packages/material_ui_tree/src/input/input.js
+++ b/packages/material_ui_tree/src/input/input.js
@@ -13,18 +13,20 @@ const useStyles = makeStyles(() => ({
   }
 }));
 
+const noop = () => {};
+
 const MaterialUIInputRenderer = ({
+  inputRef,
   searchTerm = "",
-  setSearchTerm = () => {}
+  onInputChange = noop
 }) => {
   const classes = useStyles();
   return (
-    <>
+    <div ref={inputRef}>
       <CardActions className={classes.root}>
         <InputBase
-          id="input-with-icon-adornment"
           value={searchTerm}
-          onChange={e => setSearchTerm(e.target.value)}
+          onChange={onInputChange}
           startAdornment={
             <InputAdornment position="start">
               <Search />
@@ -33,14 +35,14 @@ const MaterialUIInputRenderer = ({
           endAdornment={
             searchTerm !== "" && (
               <IconButton size={"small"}>
-                <Clear onClick={() => setSearchTerm("")} />
+                <Clear onClick={onInputChange} />
               </IconButton>
             )
           }
         />
       </CardActions>
       <Divider />
-    </>
+    </div>
   );
 };
 
diff --git a/packages/material_ui_tree/src/item/item.js b/packages/material_ui_tree/src/item/item.js
index b4a3d74..56b2d53 100644
--- a/packages/material_ui_tree/src/item/item.js
+++ b/packages/material_ui_tree/src/item/item.js
@@ -4,6 +4,8 @@ import { ChevronRight } from "@material-ui/icons";
 import ListItem from "@material-ui/core/ListItem";
 import SearchedItem from "./searched_item";
 
+const noop = () => {};
+
 const MaterialUIItemRenderer = props => {
   const {
     searchTerm = "",
@@ -12,7 +14,7 @@ const MaterialUIItemRenderer = props => {
       hasChild: false,
       currentDepth: 0
     },
-    onClick = () => {}
+    onClick = noop
   } = props;
   const searchIndex = item[item.length - 1]
     .toLowerCase()
diff --git a/packages/material_ui_tree/src/items/items.js b/packages/material_ui_tree/src/items/items.js
index 150b9f3..66a8888 100644
--- a/packages/material_ui_tree/src/items/items.js
+++ b/packages/material_ui_tree/src/items/items.js
@@ -2,15 +2,18 @@ import React from "react";
 import List from "@material-ui/core/List";
 import makeStyles from "@material-ui/core/styles/makeStyles";
 
-const useStyles = makeStyles(({ treeHeight }) => ({
+const ITEMS_PADDING = 16;
+
+const useStyles = makeStyles({
   root: {
-    overflow: "auto",
-    maxHeight: treeHeight - 48 - 42
+    overflowY: "auto",
+    overflowX: "hidden",
+    maxHeight: props => props.itemsHeight - ITEMS_PADDING
   }
-}));
+});
 
-const MaterialUIItemsRenderer = ({ children, treeHeight }) => {
-  const classes = useStyles({ treeHeight });
+const MaterialUIItemsRenderer = ({ children, itemsHeight }) => {
+  const classes = useStyles({ itemsHeight });
   return (
     <List className={classes.root} component="nav">
       {children}
diff --git a/packages/material_ui_tree/src/material_ui_tree.js b/packages/material_ui_tree/src/material_ui_tree.js
index 42b0f60..2644a9a 100644
--- a/packages/material_ui_tree/src/material_ui_tree.js
+++ b/packages/material_ui_tree/src/material_ui_tree.js
@@ -25,9 +25,9 @@ const MaterialUITree = ({
       structure={structure}
       title={title}
       onSelect={onSelect}
-      treeContainerRenderer={props =>
-        treeContainerRenderer({ ...props, width, height })
-      }
+      width={width}
+      height={height}
+      treeContainerRenderer={treeContainerRenderer}
       headerRenderer={headerRenderer}
       inputRenderer={inputRenderer}
       itemRenderer={itemRenderer}
diff --git a/packages/material_ui_tree/src/no_results/no_results.js b/packages/material_ui_tree/src/no_results/no_results.js
index 3b59af3..e034f6a 100644
--- a/packages/material_ui_tree/src/no_results/no_results.js
+++ b/packages/material_ui_tree/src/no_results/no_results.js
@@ -3,16 +3,22 @@ import { Warning } from "@material-ui/icons";
 import Typography from "@material-ui/core/Typography";
 import makeStyles from "@material-ui/core/styles/makeStyles";
 
+const ITEMS_PADDING = 16;
+
 const useStyles = makeStyles({
   root: {
     display: "flex",
     flexDirection: "column",
-    alignItems: "center"
+    alignItems: "center",
+    justifyContent: "center",
+    height: props => props.itemsHeight - ITEMS_PADDING
   }
 });
 
-const MaterialUINoResults = ({ text }) => {
-  const classes = useStyles();
+const MaterialUINoResults = ({ text, itemsHeight }) => {
+  const classes = useStyles({
+    itemsHeight
+  });
   return (
     <div className={classes.root}>
       <Warning fontSize="large" color="disabled" />
diff --git a/packages/material_ui_tree/src/tree_container/tree_container.js b/packages/material_ui_tree/src/tree_container/tree_container.js
index d049936..62e2dd1 100644
--- a/packages/material_ui_tree/src/tree_container/tree_container.js
+++ b/packages/material_ui_tree/src/tree_container/tree_container.js
@@ -2,25 +2,18 @@ import React from "react";
 import { makeStyles } from "@material-ui/core/styles";
 import Card from "@material-ui/core/Card";
 
-const DEFAULT_WIDTH = 230;
-const DEFAULT_HEIGHT = 300;
-const PIXEL_SUFFIX = "px";
-
-const useStyles = makeStyles(({ width, height }) => ({
+const useStyles = makeStyles({
   root: {
-    width: (width || DEFAULT_WIDTH) + PIXEL_SUFFIX,
-    height: (height || DEFAULT_HEIGHT) + PIXEL_SUFFIX
+    width: props => props.width,
+    height: props => props.height
   }
-}));
+});
 
 const MaterialUIContainerRenderer = props => {
-  const { children, width, height } = props;
+  const { containerRef, children, width, height } = props;
   const classes = useStyles({ width, height });
-  const Container = React.forwardRef((props, ref) => (
-    <div {...props} ref={ref} />
-  ));
   return (
-    <Card raised={true} className={classes.root} component={Container}>
+    <Card ref={containerRef} raised={true} className={classes.root}>
       {children}
     </Card>
   );

From d1a365a57d05a45d69817fc7c38f36b3c97c5b0f Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Wed, 6 Jan 2021 18:38:13 +0200
Subject: [PATCH 5/7] changes after second review

---
 packages/core/src/hooks/use_leaves_manager.js          | 2 +-
 packages/core/src/items/itemsStyle.js                  | 4 ++--
 packages/core/src/no_results/noResultsStyle.js         | 4 ++--
 packages/core/src/tree.js                              | 4 ++--
 packages/material_ui_tree/src/header/header.js         | 5 ++++-
 packages/material_ui_tree/src/items/items.js           | 6 +++---
 packages/material_ui_tree/src/no_results/no_results.js | 6 +++---
 7 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/packages/core/src/hooks/use_leaves_manager.js b/packages/core/src/hooks/use_leaves_manager.js
index e75b91c..ba82b81 100644
--- a/packages/core/src/hooks/use_leaves_manager.js
+++ b/packages/core/src/hooks/use_leaves_manager.js
@@ -10,7 +10,7 @@ const useLeavesManager = ({ structure, parents, currentDepth }) => {
   const [searchTerm, setSearchTerm] = useState("");
   const [leaves, setLeaves] = useState([]);
 
-  const onInputChange = event => setSearchTerm(event?.target?.value || "");
+  const onInputChange = event => setSearchTerm(event.target.value || "");
 
   useEffect(() => {
     const leaves = structure
diff --git a/packages/core/src/items/itemsStyle.js b/packages/core/src/items/itemsStyle.js
index 06d91d9..b7ec733 100644
--- a/packages/core/src/items/itemsStyle.js
+++ b/packages/core/src/items/itemsStyle.js
@@ -1,4 +1,4 @@
-export default ({ itemsHeight }) => ({
-  maxHeight: itemsHeight,
+export default ({ height }) => ({
+  maxHeight: height,
   overflowY: "auto"
 });
diff --git a/packages/core/src/no_results/noResultsStyle.js b/packages/core/src/no_results/noResultsStyle.js
index 5cd3f21..1e48362 100644
--- a/packages/core/src/no_results/noResultsStyle.js
+++ b/packages/core/src/no_results/noResultsStyle.js
@@ -1,9 +1,9 @@
-export const css = ({ itemsHeight }) => ({
+export const css = ({ height }) => ({
   display: "flex",
   flexDirection: "column",
   alignItems: "center",
   justifyContent: "center",
-  height: itemsHeight
+  height: height
 });
 
 export const icon = () => ({
diff --git a/packages/core/src/tree.js b/packages/core/src/tree.js
index de7c103..2e139e0 100644
--- a/packages/core/src/tree.js
+++ b/packages/core/src/tree.js
@@ -86,7 +86,7 @@ const Tree = props => {
         onInputChange={onInputChange}
         inputIconRenderer={inputIconRenderer}
       />
-      <Items getStyles={getStyles} itemsHeight={itemsHeight}>
+      <Items getStyles={getStyles} height={itemsHeight}>
         {leaves &&
           leaves.length > 0 &&
           leaves.map(item => (
@@ -101,7 +101,7 @@ const Tree = props => {
       </Items>
       {leaves && leaves.length === 0 && (
         <NoResults
-          itemsHeight={itemsHeight}
+          height={itemsHeight}
           text={noResultsText}
           getStyles={getStyles}
           noResultsIconRenderer={noResultsIconRenderer}
diff --git a/packages/material_ui_tree/src/header/header.js b/packages/material_ui_tree/src/header/header.js
index 8033fab..0d36a39 100644
--- a/packages/material_ui_tree/src/header/header.js
+++ b/packages/material_ui_tree/src/header/header.js
@@ -9,6 +9,9 @@ import { makeStyles } from "@material-ui/core/styles";
 const useStyles = makeStyles(() => ({
   root: {
     padding: "8px 16px"
+  },
+  button: {
+    marginLeft: -8
   }
 }));
 
@@ -18,7 +21,7 @@ const MaterialUIHeader = ({ headerRef, parents = [], onClick, title = "" }) => {
     <div ref={headerRef}>
       <CardActions className={classes.root}>
         {parents.length > 0 && (
-          <IconButton size={"small"}>
+          <IconButton className={classes.button} size={"small"}>
             <ChevronLeft onClick={onClick} />
           </IconButton>
         )}
diff --git a/packages/material_ui_tree/src/items/items.js b/packages/material_ui_tree/src/items/items.js
index 66a8888..e33e178 100644
--- a/packages/material_ui_tree/src/items/items.js
+++ b/packages/material_ui_tree/src/items/items.js
@@ -8,12 +8,12 @@ const useStyles = makeStyles({
   root: {
     overflowY: "auto",
     overflowX: "hidden",
-    maxHeight: props => props.itemsHeight - ITEMS_PADDING
+    maxHeight: props => props.height - ITEMS_PADDING
   }
 });
 
-const MaterialUIItemsRenderer = ({ children, itemsHeight }) => {
-  const classes = useStyles({ itemsHeight });
+const MaterialUIItemsRenderer = ({ children, height }) => {
+  const classes = useStyles({ height });
   return (
     <List className={classes.root} component="nav">
       {children}
diff --git a/packages/material_ui_tree/src/no_results/no_results.js b/packages/material_ui_tree/src/no_results/no_results.js
index e034f6a..0c1283c 100644
--- a/packages/material_ui_tree/src/no_results/no_results.js
+++ b/packages/material_ui_tree/src/no_results/no_results.js
@@ -11,13 +11,13 @@ const useStyles = makeStyles({
     flexDirection: "column",
     alignItems: "center",
     justifyContent: "center",
-    height: props => props.itemsHeight - ITEMS_PADDING
+    height: props => props.height - ITEMS_PADDING
   }
 });
 
-const MaterialUINoResults = ({ text, itemsHeight }) => {
+const MaterialUINoResults = ({ text, height }) => {
   const classes = useStyles({
-    itemsHeight
+    height
   });
   return (
     <div className={classes.root}>

From 99a65ce3b5d03acc2da00c2c2f9a06a49dd84eb4 Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Thu, 7 Jan 2021 10:13:22 +0200
Subject: [PATCH 6/7] renaming

---
 .../core/src/hooks/use_components_refs.js     |  6 ++--
 packages/docs/stories/core.stories.js         |  6 ++--
 .../material_ui_tree/src/header/header.js     | 11 +++++--
 packages/material_ui_tree/src/index.js        |  4 +--
 packages/material_ui_tree/src/input/input.js  |  4 +--
 packages/material_ui_tree/src/item/item.js    |  4 +--
 packages/material_ui_tree/src/items/items.js  |  4 +--
 .../{material_ui_tree.js => material_tree.js} | 30 ++++++++++---------
 .../src/no_results/no_results.js              |  4 +--
 9 files changed, 41 insertions(+), 32 deletions(-)
 rename packages/material_ui_tree/src/{material_ui_tree.js => material_tree.js} (51%)

diff --git a/packages/core/src/hooks/use_components_refs.js b/packages/core/src/hooks/use_components_refs.js
index 5f1db6d..9d9caa4 100644
--- a/packages/core/src/hooks/use_components_refs.js
+++ b/packages/core/src/hooks/use_components_refs.js
@@ -6,9 +6,9 @@ const useComponentsRefs = () => {
   const inputRef = useRef();
 
   const itemsHeight =
-    containerRef?.current?.clientHeight -
-    headerRef?.current?.clientHeight -
-    inputRef?.current?.clientHeight;
+    (containerRef?.current?.clientHeight || 0) -
+    (headerRef?.current?.clientHeight || 0) -
+    (inputRef?.current?.clientHeight || 0);
 
   return { containerRef, headerRef, inputRef, itemsHeight };
 };
diff --git a/packages/docs/stories/core.stories.js b/packages/docs/stories/core.stories.js
index aaab250..6d959c5 100644
--- a/packages/docs/stories/core.stories.js
+++ b/packages/docs/stories/core.stories.js
@@ -1,6 +1,6 @@
 import React from "react";
 import Tree from "@kenshooui/react-tree";
-import MaterialUITree from "@kenshooui/material-tree";
+import MaterialTree from "@kenshooui/material-tree";
 import makeStyles from "@material-ui/core/styles/makeStyles";
 
 const useStyles = makeStyles({
@@ -84,7 +84,7 @@ export const MaterialTheme = () => {
     <div className={classes.wrapper}>
       <div className={classes.item}>
         <div className={classes.title}>Default Dimensions</div>
-        <MaterialUITree
+        <MaterialTree
           structure={structure}
           title={"Choose an item"}
           onSelect={item => alert(item)}
@@ -92,7 +92,7 @@ export const MaterialTheme = () => {
       </div>
       <div className={classes.item}>
         <div className={classes.title}>Custom Dimensions</div>
-        <MaterialUITree
+        <MaterialTree
           structure={structure}
           title={"Choose an item"}
           onSelect={item => alert(item)}
diff --git a/packages/material_ui_tree/src/header/header.js b/packages/material_ui_tree/src/header/header.js
index 0d36a39..fdd69e7 100644
--- a/packages/material_ui_tree/src/header/header.js
+++ b/packages/material_ui_tree/src/header/header.js
@@ -15,7 +15,14 @@ const useStyles = makeStyles(() => ({
   }
 }));
 
-const MaterialUIHeader = ({ headerRef, parents = [], onClick, title = "" }) => {
+const noop = () => {};
+
+const MaterialHeaderRenderer = ({
+  headerRef,
+  parents = [],
+  onClick = noop,
+  title = ""
+}) => {
   const classes = useStyles();
   return (
     <div ref={headerRef}>
@@ -34,4 +41,4 @@ const MaterialUIHeader = ({ headerRef, parents = [], onClick, title = "" }) => {
   );
 };
 
-export default MaterialUIHeader;
+export default MaterialHeaderRenderer;
diff --git a/packages/material_ui_tree/src/index.js b/packages/material_ui_tree/src/index.js
index 012b4c7..10e07b4 100644
--- a/packages/material_ui_tree/src/index.js
+++ b/packages/material_ui_tree/src/index.js
@@ -1,3 +1,3 @@
-import MaterialUITree from "./material_ui_tree";
+import MaterialTree from "./material_tree";
 
-export default MaterialUITree;
+export default MaterialTree;
diff --git a/packages/material_ui_tree/src/input/input.js b/packages/material_ui_tree/src/input/input.js
index f1fb08c..d29f9a4 100644
--- a/packages/material_ui_tree/src/input/input.js
+++ b/packages/material_ui_tree/src/input/input.js
@@ -15,7 +15,7 @@ const useStyles = makeStyles(() => ({
 
 const noop = () => {};
 
-const MaterialUIInputRenderer = ({
+const MaterialInputRenderer = ({
   inputRef,
   searchTerm = "",
   onInputChange = noop
@@ -46,4 +46,4 @@ const MaterialUIInputRenderer = ({
   );
 };
 
-export default MaterialUIInputRenderer;
+export default MaterialInputRenderer;
diff --git a/packages/material_ui_tree/src/item/item.js b/packages/material_ui_tree/src/item/item.js
index 56b2d53..c04c04a 100644
--- a/packages/material_ui_tree/src/item/item.js
+++ b/packages/material_ui_tree/src/item/item.js
@@ -6,7 +6,7 @@ import SearchedItem from "./searched_item";
 
 const noop = () => {};
 
-const MaterialUIItemRenderer = props => {
+const MaterialItemRenderer = props => {
   const {
     searchTerm = "",
     item: { item, hasChild, currentDepth } = {
@@ -37,4 +37,4 @@ const MaterialUIItemRenderer = props => {
   );
 };
 
-export default MaterialUIItemRenderer;
+export default MaterialItemRenderer;
diff --git a/packages/material_ui_tree/src/items/items.js b/packages/material_ui_tree/src/items/items.js
index e33e178..533acdf 100644
--- a/packages/material_ui_tree/src/items/items.js
+++ b/packages/material_ui_tree/src/items/items.js
@@ -12,7 +12,7 @@ const useStyles = makeStyles({
   }
 });
 
-const MaterialUIItemsRenderer = ({ children, height }) => {
+const MaterialItemsRenderer = ({ children, height }) => {
   const classes = useStyles({ height });
   return (
     <List className={classes.root} component="nav">
@@ -21,4 +21,4 @@ const MaterialUIItemsRenderer = ({ children, height }) => {
   );
 };
 
-export default MaterialUIItemsRenderer;
+export default MaterialItemsRenderer;
diff --git a/packages/material_ui_tree/src/material_ui_tree.js b/packages/material_ui_tree/src/material_tree.js
similarity index 51%
rename from packages/material_ui_tree/src/material_ui_tree.js
rename to packages/material_ui_tree/src/material_tree.js
index 2644a9a..17afc67 100644
--- a/packages/material_ui_tree/src/material_ui_tree.js
+++ b/packages/material_ui_tree/src/material_tree.js
@@ -1,24 +1,26 @@
 import React from "react";
 import Tree from "@kenshooui/react-tree";
-import MaterialUIItemRenderer from "./item/item";
-import MaterialUIInputRenderer from "./input/input";
+import MaterialItemRenderer from "./item/item";
+import MaterialInputRenderer from "./input/input";
 import MaterialUIContainerRenderer from "./tree_container/tree_container";
-import MaterialUIHeader from "./header/header";
-import MaterialUIItemsRenderer from "./items/items";
-import MaterialUINoResults from "./no_results/no_results";
+import MaterialHeaderRenderer from "./header/header";
+import MaterialItemsRenderer from "./items/items";
+import MaterialNoResultsRenderer from "./no_results/no_results";
 
-const MaterialUITree = ({
+const noop = () => {};
+
+const MaterialTree = ({
   structure = [],
-  title,
-  onSelect,
+  title = "",
+  onSelect = noop,
   width,
   height,
   treeContainerRenderer = MaterialUIContainerRenderer,
-  headerRenderer = MaterialUIHeader,
-  inputRenderer = MaterialUIInputRenderer,
-  itemRenderer = MaterialUIItemRenderer,
-  itemsRenderer = MaterialUIItemsRenderer,
-  noResultsRenderer = MaterialUINoResults
+  headerRenderer = MaterialHeaderRenderer,
+  inputRenderer = MaterialInputRenderer,
+  itemRenderer = MaterialItemRenderer,
+  itemsRenderer = MaterialItemsRenderer,
+  noResultsRenderer = MaterialNoResultsRenderer
 }) => {
   return (
     <Tree
@@ -37,4 +39,4 @@ const MaterialUITree = ({
   );
 };
 
-export default MaterialUITree;
+export default MaterialTree;
diff --git a/packages/material_ui_tree/src/no_results/no_results.js b/packages/material_ui_tree/src/no_results/no_results.js
index 0c1283c..3ce3832 100644
--- a/packages/material_ui_tree/src/no_results/no_results.js
+++ b/packages/material_ui_tree/src/no_results/no_results.js
@@ -15,7 +15,7 @@ const useStyles = makeStyles({
   }
 });
 
-const MaterialUINoResults = ({ text, height }) => {
+const MaterialNoResultsRenderer = ({ text, height }) => {
   const classes = useStyles({
     height
   });
@@ -27,4 +27,4 @@ const MaterialUINoResults = ({ text, height }) => {
   );
 };
 
-export default MaterialUINoResults;
+export default MaterialNoResultsRenderer;

From a711428296d7a47f09bbc192baa2774ea5b1de82 Mon Sep 17 00:00:00 2001
From: liatgo <liat.gofshtein@kenshoo.com>
Date: Thu, 7 Jan 2021 14:48:05 +0200
Subject: [PATCH 7/7] Add clear to core and add selected item support

---
 packages/core/src/hooks/use_item_callbacks.js |  8 +++++--
 packages/core/src/input/input.js              |  9 +++++++-
 packages/core/src/input/inputStyle.js         |  7 ++++++
 packages/core/src/item/basic_item.js          |  7 ++++--
 packages/core/src/item/item.js                | 14 ++++++++---
 packages/core/src/item/itemStyle.js           |  4 ++++
 .../item/searched_item/searchedItemStyle.js   |  9 ++++----
 packages/core/src/styles/styles.js            |  9 +++++++-
 packages/core/src/tree.js                     | 22 ++++++++++++++----
 packages/docs/stories/core.stories.js         | 18 +++++++++++++++
 .../material_ui_tree/src/item/basic_item.js   | 14 +++++++++--
 packages/material_ui_tree/src/item/item.js    | 17 ++++++++++++--
 .../src/item/searched_item.js                 | 23 +++++++++++++------
 .../material_ui_tree/src/material_tree.js     |  4 +++-
 14 files changed, 135 insertions(+), 30 deletions(-)

diff --git a/packages/core/src/hooks/use_item_callbacks.js b/packages/core/src/hooks/use_item_callbacks.js
index 94cb31f..7550bae 100644
--- a/packages/core/src/hooks/use_item_callbacks.js
+++ b/packages/core/src/hooks/use_item_callbacks.js
@@ -1,14 +1,17 @@
 import { useState } from "react";
 
-const useItemCallbacks = onSelect => {
+const useItemCallbacks = ({ onSelect, markSelectedItem }) => {
   const [currentDepth, setCurrentDepth] = useState(0);
   const [parents, setParents] = useState([]);
+  const [selectedItem, setSelectedItem] = useState({ item: [], leaf: "" });
 
   const onClick = (label, item, hasChild) => {
     if (hasChild) {
       setParents(parents.concat(label));
       setCurrentDepth(currentDepth + 1);
     } else {
+      markSelectedItem &&
+        setSelectedItem({ item, leaf: item[item.length - 1] });
       onSelect(item);
     }
   };
@@ -24,7 +27,8 @@ const useItemCallbacks = onSelect => {
     currentDepth,
     setCurrentDepth,
     parents,
-    setParents
+    setParents,
+    selectedItem
   };
 };
 
diff --git a/packages/core/src/input/input.js b/packages/core/src/input/input.js
index 4a53078..bb6a160 100644
--- a/packages/core/src/input/input.js
+++ b/packages/core/src/input/input.js
@@ -3,6 +3,7 @@ import { jsx } from "@emotion/core";
 import React from "react";
 
 export const InputIconRenderer = () => <>🔍</>;
+export const ClearIconRenderer = () => <>✘️</>;
 
 const Input = props => {
   const {
@@ -10,7 +11,8 @@ const Input = props => {
     searchTerm,
     onInputChange,
     getStyles,
-    inputIconRenderer: InputIcon = InputIconRenderer
+    inputIconRenderer: InputIcon = InputIconRenderer,
+    clearIconRenderer: ClearIcon = ClearIconRenderer
   } = props;
   return (
     <div ref={inputRef} css={getStyles("inputWrapper", props)}>
@@ -22,6 +24,11 @@ const Input = props => {
         value={searchTerm}
         onChange={onInputChange}
       />
+      {searchTerm !== "" && (
+        <span css={getStyles("clearInput", props)} onClick={onInputChange}>
+          <ClearIcon />
+        </span>
+      )}
     </div>
   );
 };
diff --git a/packages/core/src/input/inputStyle.js b/packages/core/src/input/inputStyle.js
index d0a2c60..1744af8 100644
--- a/packages/core/src/input/inputStyle.js
+++ b/packages/core/src/input/inputStyle.js
@@ -22,6 +22,13 @@ export const searchIconCss = () => ({
   left: "8px"
 });
 
+export const clearIconCss = () => ({
+  position: "absolute",
+  top: "8px",
+  right: "8px",
+  cursor: "pointer"
+});
+
 export const wrapperCss = () => ({
   position: "relative"
 });
diff --git a/packages/core/src/item/basic_item.js b/packages/core/src/item/basic_item.js
index 0ffb54f..52e1e92 100644
--- a/packages/core/src/item/basic_item.js
+++ b/packages/core/src/item/basic_item.js
@@ -1,7 +1,10 @@
+/** @jsx jsx */
+import { jsx } from "@emotion/core";
 import React from "react";
 
-const BasicItem = ({ label = "" }) => {
-  return <span>{label}</span>;
+const BasicItem = props => {
+  const { label = "", getStyles } = props;
+  return <span css={getStyles("selectedItem", props)}>{label}</span>;
 };
 
 export default BasicItem;
diff --git a/packages/core/src/item/item.js b/packages/core/src/item/item.js
index a112151..2a74abe 100644
--- a/packages/core/src/item/item.js
+++ b/packages/core/src/item/item.js
@@ -6,6 +6,7 @@ import SearchedItem from "./searched_item/searched_item";
 import BasicItem from "./basic_item";
 
 export const ForwardIconRenderer = () => <>➡️</>;
+const defaultSelectedItem = { item: [], leaf: "" };
 
 const ItemRenderer = props => {
   const {
@@ -17,8 +18,10 @@ const ItemRenderer = props => {
       currentDepth: 0
     },
     onClick,
-    forwardIconRenderer: ForwardIcon = ForwardIconRenderer
+    forwardIconRenderer: ForwardIcon = ForwardIconRenderer,
+    selectedItem = defaultSelectedItem
   } = props;
+  const isItemSelected = item.toString() === selectedItem.item.toString();
   const searchIndex = item[item.length - 1]
     .toLowerCase()
     .indexOf(searchTerm.trim().toLowerCase());
@@ -33,13 +36,18 @@ const ItemRenderer = props => {
           searchIndex={searchIndex}
           searchTerm={searchTerm.trim()}
           getStyles={getStyles}
+          isSelected={
+            isItemSelected && item[item.length - 1] === selectedItem.leaf
+          }
         />
       )}
       {searchTerm === "" && (
         <BasicItem
+          getStyles={getStyles}
           label={item[currentDepth]}
-          searchIndex={searchIndex}
-          searchTerm={searchTerm.trim()}
+          isSelected={
+            isItemSelected && item[currentDepth] === selectedItem.leaf
+          }
         />
       )}
       {hasChild && (
diff --git a/packages/core/src/item/itemStyle.js b/packages/core/src/item/itemStyle.js
index 08f46a7..52bf79f 100644
--- a/packages/core/src/item/itemStyle.js
+++ b/packages/core/src/item/itemStyle.js
@@ -18,3 +18,7 @@ export const css = props => ({
 });
 
 export const forwardIconCss = () => ({});
+
+export const selectedItem = props => ({
+  fontWeight: props.isSelected ? 600 : 400
+});
diff --git a/packages/core/src/item/searched_item/searchedItemStyle.js b/packages/core/src/item/searched_item/searchedItemStyle.js
index 8d315ab..f74bb55 100644
--- a/packages/core/src/item/searched_item/searchedItemStyle.js
+++ b/packages/core/src/item/searched_item/searchedItemStyle.js
@@ -1,13 +1,14 @@
 export const initialCss = props => ({
-  color: "#545769"
+  color: "#545769",
+  fontWeight: props.isSelected ? 600 : 400
 });
 
-export const highlightCss = props => ({
+export const highlightCss = () => ({
   fontWeight: 600,
-  color: "#2020e1"
+  color: "#268DEC"
 });
 
-export const parentsCss = props => ({
+export const parentsCss = () => ({
   color: "#98A1B8",
   marginTop: "2px"
 });
diff --git a/packages/core/src/styles/styles.js b/packages/core/src/styles/styles.js
index bd1435a..afb763c 100644
--- a/packages/core/src/styles/styles.js
+++ b/packages/core/src/styles/styles.js
@@ -3,7 +3,11 @@ import {
   wrapperCss as headerWrapperCss,
   backIconCss as headerBackIconCss
 } from "../header/headerStyle";
-import { css as itemCss, forwardIconCss } from "../item/itemStyle";
+import {
+  css as itemCss,
+  forwardIconCss,
+  selectedItem as selectedItemCss
+} from "../item/itemStyle";
 import {
   highlightCss,
   initialCss as searchItemInitialCss,
@@ -13,6 +17,7 @@ import itemsCss from "../items/itemsStyle";
 import {
   css as inputCss,
   searchIconCss as inputSearchIconCss,
+  clearIconCss as clearSearchIconCss,
   wrapperCss as inputWrapperCss
 } from "../input/inputStyle";
 import {
@@ -35,7 +40,9 @@ export const defaultStyles = {
   noResultsText: noResultsTextCss,
   input: inputCss,
   searchInput: inputSearchIconCss,
+  clearInput: clearSearchIconCss,
   forwardIcon: forwardIconCss,
+  selectedItem: selectedItemCss,
   inputWrapper: inputWrapperCss
 };
 
diff --git a/packages/core/src/tree.js b/packages/core/src/tree.js
index 2e139e0..d0b1509 100644
--- a/packages/core/src/tree.js
+++ b/packages/core/src/tree.js
@@ -30,12 +30,14 @@ const Tree = props => {
     backIconRenderer,
     inputRenderer: Input = InputDefault,
     inputIconRenderer,
+    clearIconRenderer,
     noResultsRenderer: NoResults = NoResultsDefault,
     noResultsIconRenderer,
     itemRenderer: Item = ItemDefault,
     itemsRenderer: Items = ItemsRenderer,
     forwardIconRenderer,
-    treeContainerRenderer: TreeContainer = TreeContainerRenderer
+    treeContainerRenderer: TreeContainer = TreeContainerRenderer,
+    markSelectedItem = false
   } = props;
 
   const getStyles = (key, props = {}) => {
@@ -52,14 +54,22 @@ const Tree = props => {
     itemsHeight
   } = useContainerHeight();
 
-  const { onClick, onBackClick, currentDepth, parents } = useItemCallbacks(
-    onSelect
-  );
+  const {
+    onClick,
+    onBackClick,
+    currentDepth,
+    parents,
+    selectedItem
+  } = useItemCallbacks({
+    onSelect,
+    markSelectedItem
+  });
 
   const { searchTerm, onInputChange, leaves } = useLeavesManager({
     structure,
     parents,
-    currentDepth
+    currentDepth,
+    selectedItem
   });
 
   return (
@@ -85,6 +95,7 @@ const Tree = props => {
         searchTerm={searchTerm}
         onInputChange={onInputChange}
         inputIconRenderer={inputIconRenderer}
+        clearIconRenderer={clearIconRenderer}
       />
       <Items getStyles={getStyles} height={itemsHeight}>
         {leaves &&
@@ -96,6 +107,7 @@ const Tree = props => {
               item={item}
               onClick={onClick}
               forwardIconRenderer={forwardIconRenderer}
+              selectedItem={selectedItem}
             />
           ))}
       </Items>
diff --git a/packages/docs/stories/core.stories.js b/packages/docs/stories/core.stories.js
index 6d959c5..0aa2389 100644
--- a/packages/docs/stories/core.stories.js
+++ b/packages/docs/stories/core.stories.js
@@ -64,6 +64,15 @@ export const Basic = () => {
           onSelect={item => alert(item)}
         />
       </div>
+      <div className={classes.item}>
+        <div className={classes.title}>Mark selected item</div>
+        <Tree
+          structure={structure}
+          title={"Choose an item"}
+          onSelect={item => alert(item)}
+          markSelectedItem={true}
+        />
+      </div>
       <div className={classes.item}>
         <div className={classes.title}>Custom Dimensions</div>
         <Tree
@@ -90,6 +99,15 @@ export const MaterialTheme = () => {
           onSelect={item => alert(item)}
         />
       </div>
+      <div className={classes.item}>
+        <div className={classes.title}>Mark selected item</div>
+        <MaterialTree
+          structure={structure}
+          title={"Choose an item"}
+          onSelect={item => alert(item)}
+          markSelectedItem={true}
+        />
+      </div>
       <div className={classes.item}>
         <div className={classes.title}>Custom Dimensions</div>
         <MaterialTree
diff --git a/packages/material_ui_tree/src/item/basic_item.js b/packages/material_ui_tree/src/item/basic_item.js
index 2b809ff..7d7bac8 100644
--- a/packages/material_ui_tree/src/item/basic_item.js
+++ b/packages/material_ui_tree/src/item/basic_item.js
@@ -1,8 +1,18 @@
 import React from "react";
 import ListItemText from "@material-ui/core/ListItemText";
+import { makeStyles } from "@material-ui/core/styles";
 
-const BasicItem = ({ label = "" }) => {
-  return <ListItemText primary={label} />;
+const useStyles = makeStyles({
+  selected: {
+    fontWeight: props => (props.isSelected ? 600 : 400)
+  }
+});
+
+const BasicItem = ({ label = "", isSelected = false }) => {
+  const classes = useStyles({ isSelected });
+  return (
+    <ListItemText primary={<span className={classes.selected}>{label}</span>} />
+  );
 };
 
 export default BasicItem;
diff --git a/packages/material_ui_tree/src/item/item.js b/packages/material_ui_tree/src/item/item.js
index c04c04a..142e80e 100644
--- a/packages/material_ui_tree/src/item/item.js
+++ b/packages/material_ui_tree/src/item/item.js
@@ -5,6 +5,7 @@ import ListItem from "@material-ui/core/ListItem";
 import SearchedItem from "./searched_item";
 
 const noop = () => {};
+const defaultSelectedItem = { item: [], leaf: "" };
 
 const MaterialItemRenderer = props => {
   const {
@@ -14,8 +15,10 @@ const MaterialItemRenderer = props => {
       hasChild: false,
       currentDepth: 0
     },
-    onClick = noop
+    onClick = noop,
+    selectedItem = defaultSelectedItem
   } = props;
+  const isItemSelected = item.toString() === selectedItem.item.toString();
   const searchIndex = item[item.length - 1]
     .toLowerCase()
     .indexOf(searchTerm.trim().toLowerCase());
@@ -29,9 +32,19 @@ const MaterialItemRenderer = props => {
           item={item}
           searchIndex={searchIndex}
           searchTerm={searchTerm.trim()}
+          isSelected={
+            isItemSelected && item[item.length - 1] === selectedItem.leaf
+          }
+        />
+      )}
+      {searchTerm === "" && (
+        <BasicItem
+          label={item[currentDepth]}
+          isSelected={
+            isItemSelected && item[currentDepth] === selectedItem.leaf
+          }
         />
       )}
-      {searchTerm === "" && <BasicItem label={item[currentDepth]} />}
       {hasChild && <ChevronRight />}
     </ListItem>
   );
diff --git a/packages/material_ui_tree/src/item/searched_item.js b/packages/material_ui_tree/src/item/searched_item.js
index 82def86..d0d98eb 100644
--- a/packages/material_ui_tree/src/item/searched_item.js
+++ b/packages/material_ui_tree/src/item/searched_item.js
@@ -3,14 +3,23 @@ import ListItemText from "@material-ui/core/ListItemText";
 import { makeStyles } from "@material-ui/core/styles";
 import Typography from "@material-ui/core/Typography";
 
-const useStyles = makeStyles(() => ({
+const useStyles = makeStyles({
   boldText: {
-    fontWeight: "bold"
+    fontWeight: 600,
+    color: "#268DEC"
+  },
+  selected: {
+    fontWeight: props => (props.isSelected ? 600 : 400)
   }
-}));
+});
 
-const SearchedItem = ({ item = [""], searchIndex = 0, searchTerm = "" }) => {
-  const classes = useStyles();
+const SearchedItem = ({
+  item = [""],
+  searchIndex = 0,
+  searchTerm = "",
+  isSelected = false
+}) => {
+  const classes = useStyles({ isSelected });
   const leaf = item[item.length - 1];
   const parents = item.slice(0, item.length - 1).join(" / ");
 
@@ -18,13 +27,13 @@ const SearchedItem = ({ item = [""], searchIndex = 0, searchTerm = "" }) => {
     <ListItemText
       primary={
         <>
-          <Typography component="span">
+          <Typography component="span" className={classes.selected}>
             {leaf.substring(0, searchIndex)}
           </Typography>
           <Typography component="span" className={classes.boldText}>
             {leaf.substring(searchIndex, searchIndex + searchTerm.length)}
           </Typography>
-          <Typography component="span">
+          <Typography component="span" className={classes.selected}>
             {leaf.substring(searchIndex + searchTerm.length)}
           </Typography>
         </>
diff --git a/packages/material_ui_tree/src/material_tree.js b/packages/material_ui_tree/src/material_tree.js
index 17afc67..5d37bfc 100644
--- a/packages/material_ui_tree/src/material_tree.js
+++ b/packages/material_ui_tree/src/material_tree.js
@@ -20,7 +20,8 @@ const MaterialTree = ({
   inputRenderer = MaterialInputRenderer,
   itemRenderer = MaterialItemRenderer,
   itemsRenderer = MaterialItemsRenderer,
-  noResultsRenderer = MaterialNoResultsRenderer
+  noResultsRenderer = MaterialNoResultsRenderer,
+  markSelectedItem = false
 }) => {
   return (
     <Tree
@@ -35,6 +36,7 @@ const MaterialTree = ({
       itemRenderer={itemRenderer}
       itemsRenderer={itemsRenderer}
       noResultsRenderer={noResultsRenderer}
+      markSelectedItem={markSelectedItem}
     />
   );
 };