diff --git a/examples/todomvc/containers/App.js b/examples/todomvc/containers/App.js
index f2166ea7..d4d4ca27 100644
--- a/examples/todomvc/containers/App.js
+++ b/examples/todomvc/containers/App.js
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
import TodoApp from './TodoApp';
import { createStore, combineReducers, compose } from 'redux';
import { devTools, persistState } from 'redux-devtools';
-import { DevTools, DebugPanel, LogMonitor } from 'redux-devtools/lib/react';
+import { DevTools, DebugPanel, LogMonitor, ChartMonitor } from 'redux-devtools/lib/react';
import { Provider } from 'react-redux';
import * as reducers from '../reducers';
@@ -32,6 +32,11 @@ export default class App extends Component {
monitor={LogMonitor}
visibleOnLoad={true} />
+
+
+
);
}
diff --git a/package.json b/package.json
index 4ec15b2a..0de3a66b 100644
--- a/package.json
+++ b/package.json
@@ -47,6 +47,7 @@
"redux": "^2.0.0 || ^3.0.0"
},
"dependencies": {
+ "d3-state-visualizer": "^0.4.3",
"react-json-tree": "^0.1.9",
"react-mixin": "^1.7.0",
"react-redux": "^2.0.0",
diff --git a/src/react/ChartMonitor.js b/src/react/ChartMonitor.js
new file mode 100644
index 00000000..8c9be4e5
--- /dev/null
+++ b/src/react/ChartMonitor.js
@@ -0,0 +1,131 @@
+import React, { PropTypes, Component } from 'react';
+import * as themes from './themes';
+import visualizer from 'd3-state-visualizer';
+
+const styles = {
+ container: {
+ fontFamily: 'monaco, Consolas, Lucida Console, monospace',
+ position: 'relative',
+ overflowY: 'hidden',
+ width: '100%',
+ height: '100%',
+ minWidth: 300
+ },
+ buttonBar: {
+ textAlign: 'center',
+ borderBottomWidth: 1,
+ borderBottomStyle: 'solid',
+ borderColor: 'transparent',
+ zIndex: 1,
+ display: 'flex',
+ flexDirection: 'row'
+ },
+ elements: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ top: 38,
+ bottom: 0,
+ overflowX: 'hidden',
+ overflowY: 'auto'
+ }
+};
+
+export default class LogMonitor extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ static propTypes = {
+ computedStates: PropTypes.array.isRequired,
+ currentStateIndex: PropTypes.number.isRequired,
+ monitorState: PropTypes.object.isRequired,
+ stagedActions: PropTypes.array.isRequired,
+ skippedActions: PropTypes.object.isRequired,
+ reset: PropTypes.func.isRequired,
+ commit: PropTypes.func.isRequired,
+ rollback: PropTypes.func.isRequired,
+ sweep: PropTypes.func.isRequired,
+ toggleAction: PropTypes.func.isRequired,
+ jumpToState: PropTypes.func.isRequired,
+ setMonitorState: PropTypes.func.isRequired,
+ select: PropTypes.func.isRequired,
+ visibleOnLoad: PropTypes.bool
+ };
+
+ static defaultProps = {
+ select: (state) => state,
+ monitorState: { isVisible: true, isChartVisible: true },
+ theme: 'nicinabox',
+ visibleOnLoad: true
+ };
+
+ componentWillReceiveProps() {
+ }
+
+ componentDidUpdate() {
+ }
+
+ componentWillMount() {
+ let visibleOnLoad = this.props.visibleOnLoad;
+ const { monitorState } = this.props;
+ this.props.setMonitorState({
+ ...monitorState,
+ isVisible: visibleOnLoad
+ });
+ }
+
+ render() {
+ const { monitorState, computedStates } = this.props;
+ const { components: { TreeChart }} = visualizer;
+
+ let theme;
+ if (typeof this.props.theme === 'string') {
+ if (typeof themes[this.props.theme] !== 'undefined') {
+ theme = themes[this.props.theme];
+ } else {
+ console.warn('DevTools theme ' + this.props.theme + ' not found, defaulting to nicinabox');
+ theme = themes.nicinabox;
+ }
+ } else {
+ theme = this.props.theme;
+ }
+ if (!monitorState.isVisible) {
+ return null;
+ }
+
+ const style = {
+ width: '100%',
+ height: '100%',
+ node: {
+ colors: {
+ 'default': theme.base0B,
+ collapsed: theme.base0B,
+ parent: theme.base0E
+ },
+ radius: 7
+ },
+ text: {
+ colors: {
+ 'default': theme.base0D,
+ hover: theme.base06
+ }
+ }
+ };
+
+ return (
+
+
+
+ );
+ }
+}
diff --git a/src/react/index.js b/src/react/index.js
index cce0e96d..1e903d90 100644
--- a/src/react/index.js
+++ b/src/react/index.js
@@ -2,5 +2,6 @@ import React from 'react';
import createDevTools from '../createDevTools';
export const DevTools = createDevTools(React);
+export { default as ChartMonitor } from './ChartMonitor';
export { default as LogMonitor } from './LogMonitor';
export { default as DebugPanel } from './DebugPanel';