* removed React UI
* moved js into separate files * updated screenshot.png
This commit is contained in:
parent
29e71c0f96
commit
87995efa63
20 changed files with 60 additions and 16206 deletions
BIN
screenshot.png
BIN
screenshot.png
Binary file not shown.
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 245 KiB |
|
|
@ -64,8 +64,6 @@
|
||||||
.glyphicon {
|
.glyphicon {
|
||||||
position: relative;
|
position: relative;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: bold;
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.glyphicon-plus-sign::before {
|
.glyphicon-plus-sign::before {
|
||||||
|
|
@ -74,7 +72,6 @@
|
||||||
|
|
||||||
.glyphicon-min-sign::before {
|
.glyphicon-min-sign::before {
|
||||||
content: "-";
|
content: "-";
|
||||||
/*transform: translate(0,-5px);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden{
|
.hidden{
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Perfix</title>
|
<title>Perfix</title>
|
||||||
<link rel="stylesheet" href="/css/app.css">
|
<link rel="stylesheet" href="/css/table.css">
|
||||||
<link rel="stylesheet" href="/css/tree.css">
|
<link rel="stylesheet" href="/css/tree.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="application/ecmascript" src="/js/axios.min.js"></script>
|
<script type="application/ecmascript" src="/js/axios.min.js"></script>
|
||||||
<script type="application/ecmascript" src="/js/app.js"></script>
|
<script type="application/ecmascript" src="/js/table.js"></script>
|
||||||
|
<script type="application/ecmascript" src="/js/tree.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
let name_filter = "";
|
let name_filter = "";
|
||||||
let datatable, callstack_data;
|
let datatable;
|
||||||
const datagrid = document.getElementById("datagrid");
|
const datagrid = document.getElementById("datagrid");
|
||||||
const datatree = document.getElementById("datatree");
|
|
||||||
|
|
||||||
function refresh_data_grid() {
|
function refresh_data_grid() {
|
||||||
if (datagrid.firstChild) {
|
if (datagrid.firstChild) {
|
||||||
|
|
@ -104,56 +103,6 @@ function append_table(parent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// (function tabular_view() {
|
|
||||||
|
|
||||||
// }());
|
|
||||||
|
|
||||||
function appendChildren(parent, nodes) {
|
|
||||||
let node;
|
|
||||||
|
|
||||||
for (let i = 0; i < nodes.length; i++) {
|
|
||||||
node = nodes[i];
|
|
||||||
let li = document.createElement("li");
|
|
||||||
|
|
||||||
let branch = document.createElement("i");
|
|
||||||
if (node.children.length > 0) {
|
|
||||||
branch.setAttribute("class", "indicator glyphicon glyphicon-plus-sign");
|
|
||||||
branch.onclick = function (event) {
|
|
||||||
let icon = event.currentTarget.parentElement.firstChild;
|
|
||||||
let ul_to_toggle = icon.nextSibling.nextSibling;
|
|
||||||
|
|
||||||
if (ul_to_toggle.getAttribute("class") === "visible") {
|
|
||||||
icon.setAttribute("class", "indicator glyphicon glyphicon-plus-sign");
|
|
||||||
ul_to_toggle.setAttribute("class", "hidden");
|
|
||||||
} else {
|
|
||||||
icon.setAttribute("class", "indicator glyphicon glyphicon-min-sign");
|
|
||||||
ul_to_toggle.setAttribute("class", "visible");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
let label = document.createElement("a");
|
|
||||||
label.innerText = Math.floor(node["invocation"].duration / 1000) / 1000 + " ms " + node.name;
|
|
||||||
li.appendChild(branch);
|
|
||||||
li.appendChild(label);
|
|
||||||
|
|
||||||
let ul = document.createElement("ul");
|
|
||||||
ul.setAttribute("class", "hidden");
|
|
||||||
li.appendChild(ul);
|
|
||||||
|
|
||||||
appendChildren(ul, node.children);
|
|
||||||
|
|
||||||
parent.appendChild(li);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function refresh_data_tree() {
|
|
||||||
let datatree = document.getElementById("datatree");
|
|
||||||
let new_div = document.createElement("div");
|
|
||||||
new_div.setAttribute("class", "callstack-tree");
|
|
||||||
datatree.appendChild(new_div);
|
|
||||||
appendChildren(new_div, callstack_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
(function main() {
|
(function main() {
|
||||||
update_filter();
|
update_filter();
|
||||||
|
|
||||||
|
|
@ -162,11 +111,5 @@ function refresh_data_tree() {
|
||||||
datatable = response;
|
datatable = response;
|
||||||
refresh_data_grid();
|
refresh_data_grid();
|
||||||
});
|
});
|
||||||
|
|
||||||
axios.get('http://localhost:2048/callstack')
|
|
||||||
.then(response => {
|
|
||||||
callstack_data = response.data;
|
|
||||||
refresh_data_tree();
|
|
||||||
});
|
|
||||||
}());
|
}());
|
||||||
|
|
||||||
56
src/main/resources/js/tree.js
Normal file
56
src/main/resources/js/tree.js
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
let callstack_data;
|
||||||
|
const datatree = document.getElementById("datatree");
|
||||||
|
|
||||||
|
function appendChildren(parent, nodes) {
|
||||||
|
let node;
|
||||||
|
|
||||||
|
for (let i = 0; i < nodes.length; i++) {
|
||||||
|
node = nodes[i];
|
||||||
|
let li = document.createElement("li");
|
||||||
|
|
||||||
|
let branch = document.createElement("i");
|
||||||
|
if (node.children.length > 0) {
|
||||||
|
branch.setAttribute("class", "indicator glyphicon glyphicon-plus-sign");
|
||||||
|
branch.onclick = function (event) {
|
||||||
|
let icon = event.currentTarget.parentElement.firstChild;
|
||||||
|
let ul_to_toggle = icon.nextSibling.nextSibling;
|
||||||
|
|
||||||
|
if (ul_to_toggle.getAttribute("class") === "visible") {
|
||||||
|
icon.setAttribute("class", "indicator glyphicon glyphicon-plus-sign");
|
||||||
|
ul_to_toggle.setAttribute("class", "hidden");
|
||||||
|
} else {
|
||||||
|
icon.setAttribute("class", "indicator glyphicon glyphicon-min-sign");
|
||||||
|
ul_to_toggle.setAttribute("class", "visible");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
let label = document.createElement("a");
|
||||||
|
label.innerText = Math.floor(node["invocation"].duration / 1000) / 1000 + " ms " + node.name;
|
||||||
|
li.appendChild(branch);
|
||||||
|
li.appendChild(label);
|
||||||
|
|
||||||
|
let ul = document.createElement("ul");
|
||||||
|
ul.setAttribute("class", "hidden");
|
||||||
|
li.appendChild(ul);
|
||||||
|
|
||||||
|
appendChildren(ul, node.children);
|
||||||
|
|
||||||
|
parent.appendChild(li);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function refresh_data_tree() {
|
||||||
|
let new_div = document.createElement("div");
|
||||||
|
new_div.setAttribute("class", "callstack-tree");
|
||||||
|
datatree.appendChild(new_div);
|
||||||
|
appendChildren(new_div, callstack_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
(function main() {
|
||||||
|
axios.get('http://localhost:2048/callstack')
|
||||||
|
.then(response => {
|
||||||
|
callstack_data = response.data;
|
||||||
|
refresh_data_tree();
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
[{"/Users/Shautvast/IdeaProjects/perfix2/ui/src/index.js":"1","/Users/Shautvast/IdeaProjects/perfix2/ui/src/Tree.js":"2","/Users/Shautvast/IdeaProjects/perfix2/ui/src/List.js":"3"},{"size":170,"mtime":1607098539627,"results":"4","hashOfConfig":"5"},{"size":1516,"mtime":1607070691358,"results":"6","hashOfConfig":"5"},{"size":906,"mtime":1607070691358,"results":"7","hashOfConfig":"5"},{"filePath":"8","messages":"9","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"10"},"b2tntd",{"filePath":"11","messages":"12","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"10"},{"filePath":"13","messages":"14","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/Shautvast/IdeaProjects/perfix2/ui/src/index.js",[],["15","16"],"/Users/Shautvast/IdeaProjects/perfix2/ui/src/Tree.js",[],"/Users/Shautvast/IdeaProjects/perfix2/ui/src/List.js",[],{"ruleId":"17","replacedBy":"18"},{"ruleId":"19","replacedBy":"20"},"no-native-reassign",["21"],"no-negated-in-lhs",["22"],"no-global-assign","no-unsafe-negation"]
|
|
||||||
15796
ui/package-lock.json
generated
15796
ui/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,39 +0,0 @@
|
||||||
{
|
|
||||||
"name": "myapp",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"dependencies": {
|
|
||||||
"axios": "^0.21.0",
|
|
||||||
"@testing-library/jest-dom": "^5.11.6",
|
|
||||||
"@testing-library/react": "^11.2.2",
|
|
||||||
"@testing-library/user-event": "^12.5.0",
|
|
||||||
"react": "^17.0.1",
|
|
||||||
"react-dom": "^17.0.1",
|
|
||||||
"react-scripts": "4.0.1",
|
|
||||||
"web-vitals": "^0.2.4"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"start": "react-scripts start",
|
|
||||||
"build": "react-scripts build",
|
|
||||||
"test": "react-scripts test",
|
|
||||||
"eject": "react-scripts eject"
|
|
||||||
},
|
|
||||||
"eslintConfig": {
|
|
||||||
"extends": [
|
|
||||||
"react-app",
|
|
||||||
"react-app/jest"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"browserslist": {
|
|
||||||
"production": [
|
|
||||||
">0.2%",
|
|
||||||
"not dead",
|
|
||||||
"not op_mini all"
|
|
||||||
],
|
|
||||||
"development": [
|
|
||||||
"last 1 chrome version",
|
|
||||||
"last 1 firefox version",
|
|
||||||
"last 1 safari version"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB |
|
|
@ -1,40 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
||||||
<meta name="theme-color" content="#000000">
|
|
||||||
<!--
|
|
||||||
manifest.json provides metadata used when your web app is added to the
|
|
||||||
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
|
|
||||||
-->
|
|
||||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
|
|
||||||
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
|
|
||||||
<!--
|
|
||||||
Notice the use of %PUBLIC_URL% in the tags above.
|
|
||||||
It will be replaced with the URL of the `public` folder during the build.
|
|
||||||
Only files inside the `public` folder can be referenced from the HTML.
|
|
||||||
|
|
||||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
|
||||||
work correctly both with client-side routing and a non-root public URL.
|
|
||||||
Learn how to configure a non-root public URL by running `npm run build`.
|
|
||||||
-->
|
|
||||||
<title>Perfix</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
You need to enable JavaScript to run this app.
|
|
||||||
</noscript>
|
|
||||||
<div id="root"></div>
|
|
||||||
<!--
|
|
||||||
This HTML file is a template.
|
|
||||||
If you open it directly in the browser, you will see an empty page.
|
|
||||||
|
|
||||||
You can add webfonts, meta tags, or analytics to this file.
|
|
||||||
The build step will place the bundled scripts into the <body> tag.
|
|
||||||
|
|
||||||
To begin the development, run `npm start` or `yarn start`.
|
|
||||||
To create a production bundle, use `npm run build` or `yarn build`.
|
|
||||||
-->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"short_name": "React App",
|
|
||||||
"name": "Create React App Sample",
|
|
||||||
"icons": [
|
|
||||||
{
|
|
||||||
"src": "favicon.ico",
|
|
||||||
"sizes": "64x64 32x32 24x24 16x16",
|
|
||||||
"type": "image/x-icon"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"start_url": "./index.html",
|
|
||||||
"display": "standalone",
|
|
||||||
"theme_color": "#000000",
|
|
||||||
"background_color": "#ffffff"
|
|
||||||
}
|
|
||||||
140
ui/src/App.css
140
ui/src/App.css
|
|
@ -1,140 +0,0 @@
|
||||||
body {
|
|
||||||
background:white;
|
|
||||||
font: normal 12px/150% Arial, Helvetica, sans-serif;
|
|
||||||
padding:2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.view{
|
|
||||||
padding: 10px;
|
|
||||||
border: 1px solid #006699;
|
|
||||||
-webkit-border-radius: 3px;
|
|
||||||
-moz-border-radius: 3px;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree, .tree ul {
|
|
||||||
margin:0 0 0 1em; /* indentation */
|
|
||||||
padding:0;
|
|
||||||
list-style:none;
|
|
||||||
color:#369;
|
|
||||||
position:relative;
|
|
||||||
left:0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.treeView{
|
|
||||||
position: relative;
|
|
||||||
left:-20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree li input ~ ul{
|
|
||||||
display: none;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree li input:checked ~ ul{
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree ul {margin-left:1em} /* (indentation/2) */
|
|
||||||
|
|
||||||
.tree li:before {
|
|
||||||
content:"";
|
|
||||||
display:block;
|
|
||||||
width:10px; /* same with indentation */
|
|
||||||
height:0;
|
|
||||||
border-top:1px solid;
|
|
||||||
margin-top:-3px; /* border top width */
|
|
||||||
position:absolute;
|
|
||||||
top:1em; /* (line-height/2) */
|
|
||||||
left:px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree li {
|
|
||||||
border-left:1px solid;
|
|
||||||
margin-left: -3px;
|
|
||||||
padding: 0 0em; /* indentation + .5em */
|
|
||||||
line-height: 1.5em; /* default list item's `line-height` */
|
|
||||||
position: relative;
|
|
||||||
color: #00496B;
|
|
||||||
left:20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
text-align: left;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid {
|
|
||||||
padding: 10px;
|
|
||||||
font: normal 12px/150% Arial, Helvetica, sans-serif;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #006699;
|
|
||||||
-webkit-border-radius: 3px;
|
|
||||||
-moz-border-radius: 3px;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table td, .datagrid table th {
|
|
||||||
padding: 3px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table thead th:first-child {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tbody tr {
|
|
||||||
color: #00496B;
|
|
||||||
border-left: 1px solid #E1EEF4;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tbody .alt td {
|
|
||||||
background: #E1EEF4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tbody td:first-child {
|
|
||||||
border-left: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tbody tr:last-child td {
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tfoot td div {
|
|
||||||
border-top: 1px solid #006699;
|
|
||||||
background: #E1EEF4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tfoot td {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 12px
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tfoot td div {
|
|
||||||
padding: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tfoot td ul {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid table tfoot li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.datagrid tbody tr:hover {
|
|
||||||
text-decoration: none;
|
|
||||||
border-color: #006699;
|
|
||||||
color: #FFFFFF;
|
|
||||||
background: none;
|
|
||||||
background-color: #00557F;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.dhtmlx_window_active, div.dhx_modal_cover_dv {
|
|
||||||
position: fixed !important;
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import ReactDOM from 'react-dom';
|
|
||||||
import App from './App';
|
|
||||||
|
|
||||||
it('renders without crashing', () => {
|
|
||||||
const div = document.createElement('div');
|
|
||||||
ReactDOM.render(<App />, div);
|
|
||||||
ReactDOM.unmountComponentAtNode(div);
|
|
||||||
});
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
import './App.css';
|
|
||||||
import axios from 'axios';
|
|
||||||
|
|
||||||
class List extends Component {
|
|
||||||
state = {
|
|
||||||
data: []
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.loadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
loadData() {
|
|
||||||
axios.get('http://localhost:2048/report')
|
|
||||||
.then(response => {
|
|
||||||
this.setState({ data: response.data });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className="datagrid">
|
|
||||||
<h1>List view</h1>
|
|
||||||
<table>
|
|
||||||
<thead><tr><th>name</th><th>invocations</th><th>totalDuration</th><th>average</th></tr></thead>
|
|
||||||
<tbody>
|
|
||||||
{this.state.data.map(datum =>
|
|
||||||
<tr key={datum.name}><td>{datum.name}</td><td>{datum.invocations}</td><td>{Math.floor(datum.totalDuration/1000)/1000}</td><td>{Math.floor(datum.average/1000)/1000}</td></tr>
|
|
||||||
)}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default List;
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
import axios from 'axios';
|
|
||||||
import List from './List';
|
|
||||||
|
|
||||||
class Tree extends Component {
|
|
||||||
state = { data: [] };
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.loadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
loadData() {
|
|
||||||
console.log(this);
|
|
||||||
axios.get("http://localhost:2048/callstack")
|
|
||||||
.then(response => this.setState({ data: response.data }));
|
|
||||||
}
|
|
||||||
|
|
||||||
clearData() {
|
|
||||||
axios.get("http://localhost:2048/clear")
|
|
||||||
.then(response => this.setState({ data: response.data }));
|
|
||||||
}
|
|
||||||
|
|
||||||
renderChildren(children) {
|
|
||||||
return (<ul className="tree">
|
|
||||||
{children.map(
|
|
||||||
r =>
|
|
||||||
<li key={r.name}><input type="checkbox" className="tree"/>
|
|
||||||
{Math.floor(r.invocation.duration / 1000) / 1000} ms
|
|
||||||
{r.name}
|
|
||||||
{this.renderChildren(r.children)}
|
|
||||||
</li>
|
|
||||||
)}
|
|
||||||
</ul>)
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<button type="button" onClick={() => this.clearData()}>clear</button>
|
|
||||||
<button type="button" onClick={() => this.loadData()}>refresh</button>
|
|
||||||
<div className="view"><h1>Callstack view</h1>
|
|
||||||
<div className="treeView">
|
|
||||||
{this.renderChildren(this.state.data)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p/>
|
|
||||||
<List />
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Tree;
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
body {
|
|
||||||
margin: 10;
|
|
||||||
padding: 0;
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import ReactDOM from 'react-dom';
|
|
||||||
import './index.css';
|
|
||||||
import Tree from './Tree';
|
|
||||||
|
|
||||||
ReactDOM.render(<Tree />, document.getElementById('root'));
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 418 B |
Binary file not shown.
|
Before Width: | Height: | Size: 394 B |
Loading…
Add table
Reference in a new issue