diff --git a/example.html b/example.html
index 2e2c5dc..eb3cd3b 100644
--- a/example.html
+++ b/example.html
@@ -35,6 +35,11 @@
     
       
       
+      
+        
+          
+        
+      
       
         
 Selected node code 
         
diff --git a/src/main.js b/src/main.js
index 4b752ea..e2e48e7 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,6 +2,7 @@ import {demoConfig} from "./demo-config";
 import "@vanillawc/wc-codemirror";
 
 import "./script-graph";
+import "./script-graph3";
 
 import { ActionHandler } from "./script-to-graph";
 
@@ -12,6 +13,9 @@ let nodes = [];
 
 window.onload = () => {
 
+  const graph2 = document.createElement("script-graph3");
+  document.querySelector("#graph2").appendChild(graph2);
+
   let src = demoConfig;
 
   const fullcode = document.querySelector("#fullcode");
diff --git a/src/script-graph.ts b/src/script-graph.ts
index b01bd79..6f2095f 100644
--- a/src/script-graph.ts
+++ b/src/script-graph.ts
@@ -11,9 +11,9 @@ import { mdiPlus } from "@mdi/js";
 const SIZE = 35;
 const DIST = 20;
 
-interface TreeNode {
+export interface TreeNode {
   icon: String;
-  styles: String;
+  styles?: String;
   end?: Boolean;
   children?: (TreeNode | TreeNode[])[];
   clickCallback?: any;
diff --git a/src/script-graph3.ts b/src/script-graph3.ts
new file mode 100644
index 0000000..392e5e8
--- /dev/null
+++ b/src/script-graph3.ts
@@ -0,0 +1,110 @@
+import {
+  LitElement,
+  html,
+  css,
+  svg,
+  property,
+  TemplateResult
+} from "lit-element";
+
+import { mdiAsterisk } from "@mdi/js";
+
+const SIZE = 35;
+const DIST = 20;
+
+interface GraphNode extends LitElement{
+  render_svg(): TemplateResult;
+  width: number;
+  height: number;
+}
+
+class ScriptGraphNode extends LitElement {
+
+  @property() icon = mdiAsterisk;
+
+  get width() {
+    return SIZE;
+  }
+  get height() {
+    return SIZE + DIST;
+  }
+
+  render_svg() {
+    return svg`
+      
+      
+      
+    `
+  }
+
+}
+
+class ScriptGraph3 extends LitElement {
+
+  @property() content = [];
+  @property() _width = 0;
+  @property() _height = 0;
+
+  connectedCallback() {
+    super.connectedCallback();
+    console.log(this.querySelectorAll('*'))
+
+  }
+
+  async updateChildren() {
+    this.content = [];
+    let y = 0;
+    let w = 0;
+    for (const e of this.querySelectorAll('*') as NodeListOf) {
+      this.content.push({
+        svg: e.render_svg(),
+        offset_y: y,
+      });
+      y += e.height;
+      w = Math.max(w, e.width);
+    }
+    this._width = w;
+    this._height = y;
+    this.requestUpdate();
+  }
+
+  childrenChangedCallback() {
+    console.log("Children changed");
+  }
+
+  render() {
+
+
+    let y = 0;
+    let nodes = [];
+    for (const e of this.content) {
+
+    }
+
+    return html`
+    
+    
+    
+    `
+  }
+
+}
+customElements.define("script-graph3", ScriptGraph3);
+customElements.define("script-graph-node", ScriptGraphNode);
diff --git a/src/script-to-graph.ts b/src/script-to-graph.ts
index cbbe9eb..200c0f3 100644
--- a/src/script-to-graph.ts
+++ b/src/script-to-graph.ts
@@ -32,6 +32,9 @@ const ICONS = {
   YAML: mdiCodeJson,
 };
 
+import { TreeNode} from "./script-graph";
+import { Action } from "./types";
+
 const OPTIONS = [
   "condition",
   "delay",
@@ -44,10 +47,14 @@ const OPTIONS = [
   "choose",
 ];
 
+interface NodeHandler {
+  (action, selected: any[], select, update): TreeNode;
+}
+
 const SPECIAL = {
   condition: (action, selected, select, update) => {
     return {
-      icon: ICONS["choose"],
+      icon: ICONS["condition"],
       clickCallback: () => select([1], action, update),
       children: [
         {
@@ -164,13 +171,16 @@ const SPECIAL = {
 
 };
 
+interface NoAction {
+}
+
 export class ActionHandler {
-  _actions = [];
+  _actions: (Action | NoAction)[] = [];
   updateCallback = null;
   selectCallback = null;
-  selected = [];
+  selected: number[] = [];
 
-  constructor(actions = []) {
+  constructor(actions: (Action | NoAction)[] = []) {
     this._actions = actions;
   }
 
@@ -184,10 +194,10 @@ export class ActionHandler {
   }
 
   get graph() {
-    return this.actions.map((_, idx) => this._make_graph_node(idx));
+    return this.actions.map((action, idx) => this._make_graph_node(idx, action));
   }
 
-  _update_action(idx, action) {
+  _update_action(idx: number, action) {
     if(action === null)
       this.actions.splice(idx, 1);
     else
@@ -196,21 +206,20 @@ export class ActionHandler {
       this.updateCallback(this.actions);
   }
 
-  _add_action(idx) {
+  _add_action(idx: number) {
     this.actions.splice(idx, 0, {});
     if (this.updateCallback)
       this.updateCallback(this.actions);
     this._select_node([idx], {}, (a) =>this._update_action(idx, a));
   }
 
-  _select_node(idx, action, update=null) {
-    this.selected = idx;
+  _select_node(path: number[], action, update=null) {
+    this.selected = path;
     if (this.selectCallback)
-      this.selectCallback(idx, action, update);
+      this.selectCallback(path, action, update);
   }
 
-  _make_graph_node(idx) {
-    const action = this.actions[idx] || {};
+  _make_graph_node(idx: number, action): TreeNode {
     let _type = "yaml";
     if (Object.keys(action).length === 0)
       _type = "new";
@@ -218,7 +227,7 @@ export class ActionHandler {
       _type = OPTIONS.find((option) => option in action) || "YAML";
 
     const selected = this.selected.length >= 1 && this.selected[0] == idx;
-    let node = {};
+    let node: TreeNode = {icon: ""};
 
     if (_type in SPECIAL) {
       node = SPECIAL[_type](
diff --git a/src/types.ts b/src/types.ts
new file mode 100644
index 0000000..2881f17
--- /dev/null
+++ b/src/types.ts
@@ -0,0 +1,70 @@
+export interface Condition {
+  condition: string;
+}
+
+export interface EventAction {
+  event: string;
+  event_data?: { [key: string]: any };
+  event_data_template?: { [key: string]: any };
+}
+
+export interface ServiceAction {
+  service: string;
+  entity_id?: string;
+  data?: { [key: string]: any };
+}
+
+export interface DeviceAction {
+  device_id: string;
+  domain: string;
+  entity_id: string;
+}
+
+export interface DelayAction {
+  delay: number;
+}
+
+export interface SceneAction {
+  scene: string;
+}
+
+export interface WaitAction {
+  wait_template: string;
+  timeout?: number;
+}
+
+export interface RepeatAction {
+  repeat: CountRepeat | WhileRepeat | UntilRepeat;
+}
+
+interface BaseRepeat {
+  sequence: Action[];
+}
+
+export interface CountRepeat extends BaseRepeat {
+  count: number;
+}
+
+export interface WhileRepeat extends BaseRepeat {
+  while: Condition[];
+}
+
+export interface UntilRepeat extends BaseRepeat {
+  until: Condition[];
+}
+
+export interface ChooseAction {
+  choose: [{ conditions: Condition[]; sequence: Action[] }];
+  default?: Action[];
+}
+
+export type Action =
+  | EventAction
+  | DeviceAction
+  | ServiceAction
+  | Condition
+  | DelayAction
+  | SceneAction
+  | WaitAction
+  | RepeatAction
+  | ChooseAction;