From 1608b8f6f575a72493a38df7455de36dc343972c Mon Sep 17 00:00:00 2001
From: The 64th Gamer <69170079+The64thGamer@users.noreply.github.com>
Date: Mon, 7 Apr 2025 08:06:42 -0600
Subject: [PATCH] More epicness

---
 Scenes/Node Types/Float.tscn        |  17 +++++++++++++
 Scenes/Node Types/Random.tscn       |  17 +++++++++++++
 Scenes/Node Types/Sine.tscn         |   1 +
 Scenes/Nodes/Node Row.tscn          |  31 +++++++++++++++++++++++-
 Scenes/Nodes/Node.tscn              |  19 +++++++++------
 Scripts/GL_Float.gd                 |  11 +++++++++
 Scripts/GL_Float.gd.uid             |   1 +
 Scripts/GL_Node.gd                  |  36 ++++++++++++++++++++++++----
 Scripts/GL_Node_Picker.gd           |   9 +++++++
 Scripts/GL_Node_Picker.gd.uid       |   1 +
 Scripts/GL_Node_Picker_Bool.gd      |   4 ++++
 Scripts/GL_Node_Picker_Bool.gd.uid  |   1 +
 Scripts/GL_Node_Picker_Color.gd     |   4 ++++
 Scripts/GL_Node_Picker_Color.gd.uid |   1 +
 Scripts/GL_Node_Picker_Float.gd     |   4 ++++
 Scripts/GL_Node_Picker_Float.gd.uid |   1 +
 Scripts/GL_Random.gd                |  14 +++++++++++
 Scripts/GL_Random.gd.uid            |   1 +
 Scripts/GL_Search.gd                |   2 +-
 Scripts/GL_Sine.gd                  |   8 ++++---
 UI/Fonts/lectus.otf                 | Bin 0 -> 13704 bytes
 UI/Fonts/lectus.otf.import          |  35 +++++++++++++++++++++++++++
 UI/Fonts/lectus.ttf                 | Bin 0 -> 26468 bytes
 UI/Fonts/lectus.ttf.import          |  35 +++++++++++++++++++++++++++
 UI/Themes/Default.tres              |  13 ++++++++++
 UI/Themes/NodeTheme.tres            |  11 +++++++++
 26 files changed, 260 insertions(+), 17 deletions(-)
 create mode 100644 Scenes/Node Types/Float.tscn
 create mode 100644 Scenes/Node Types/Random.tscn
 create mode 100644 Scripts/GL_Float.gd
 create mode 100644 Scripts/GL_Float.gd.uid
 create mode 100644 Scripts/GL_Node_Picker.gd
 create mode 100644 Scripts/GL_Node_Picker.gd.uid
 create mode 100644 Scripts/GL_Node_Picker_Bool.gd
 create mode 100644 Scripts/GL_Node_Picker_Bool.gd.uid
 create mode 100644 Scripts/GL_Node_Picker_Color.gd
 create mode 100644 Scripts/GL_Node_Picker_Color.gd.uid
 create mode 100644 Scripts/GL_Node_Picker_Float.gd
 create mode 100644 Scripts/GL_Node_Picker_Float.gd.uid
 create mode 100644 Scripts/GL_Random.gd
 create mode 100644 Scripts/GL_Random.gd.uid
 create mode 100644 UI/Fonts/lectus.otf
 create mode 100644 UI/Fonts/lectus.otf.import
 create mode 100644 UI/Fonts/lectus.ttf
 create mode 100644 UI/Fonts/lectus.ttf.import
 create mode 100644 UI/Themes/Default.tres
 create mode 100644 UI/Themes/NodeTheme.tres

diff --git a/Scenes/Node Types/Float.tscn b/Scenes/Node Types/Float.tscn
new file mode 100644
index 0000000..60d2546
--- /dev/null
+++ b/Scenes/Node Types/Float.tscn	
@@ -0,0 +1,17 @@
+[gd_scene load_steps=3 format=3 uid="uid://b2bkg67ii1e4p"]
+
+[ext_resource type="PackedScene" uid="uid://b0arjg8r75f8y" path="res://Scenes/Nodes/Node.tscn" id="1_cnobp"]
+[ext_resource type="Script" uid="uid://b325grg0122jn" path="res://Scripts/GL_Float.gd" id="2_cnobp"]
+
+[node name="Sine" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+mouse_filter = 1
+
+[node name="Node" parent="." instance=ExtResource("1_cnobp")]
+layout_mode = 0
+offset_right = 200.0
+script = ExtResource("2_cnobp")
+
+[connection signal="mouse_entered" from="Node" to="Node" method="mouse_enter"]
+[connection signal="mouse_exited" from="Node" to="Node" method="mouse_exit"]
diff --git a/Scenes/Node Types/Random.tscn b/Scenes/Node Types/Random.tscn
new file mode 100644
index 0000000..9aea24f
--- /dev/null
+++ b/Scenes/Node Types/Random.tscn	
@@ -0,0 +1,17 @@
+[gd_scene load_steps=3 format=3 uid="uid://dhn8qtyeny0sm"]
+
+[ext_resource type="PackedScene" uid="uid://b0arjg8r75f8y" path="res://Scenes/Nodes/Node.tscn" id="1_wswgt"]
+[ext_resource type="Script" uid="uid://3vek1806nwqj" path="res://Scripts/GL_Random.gd" id="2_wswgt"]
+
+[node name="Sine" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+mouse_filter = 1
+
+[node name="Node" parent="." instance=ExtResource("1_wswgt")]
+layout_mode = 0
+offset_right = 200.0
+script = ExtResource("2_wswgt")
+
+[connection signal="mouse_entered" from="Node" to="Node" method="mouse_enter"]
+[connection signal="mouse_exited" from="Node" to="Node" method="mouse_exit"]
diff --git a/Scenes/Node Types/Sine.tscn b/Scenes/Node Types/Sine.tscn
index f87868b..dff98c4 100644
--- a/Scenes/Node Types/Sine.tscn	
+++ b/Scenes/Node Types/Sine.tscn	
@@ -10,6 +10,7 @@ mouse_filter = 1
 
 [node name="Node" parent="." instance=ExtResource("1_m6pki")]
 layout_mode = 0
+offset_right = 200.0
 script = ExtResource("2_claki")
 
 [connection signal="mouse_entered" from="Node" to="Node" method="mouse_enter"]
diff --git a/Scenes/Nodes/Node Row.tscn b/Scenes/Nodes/Node Row.tscn
index c45db0e..77163a7 100644
--- a/Scenes/Nodes/Node Row.tscn	
+++ b/Scenes/Nodes/Node Row.tscn	
@@ -1,6 +1,9 @@
-[gd_scene load_steps=2 format=3 uid="uid://bdcxusbd86oox"]
+[gd_scene load_steps=5 format=3 uid="uid://bdcxusbd86oox"]
 
 [ext_resource type="Script" uid="uid://dwl36vn5chqmq" path="res://Scripts/GL_Node_Point.gd" id="1_fygh4"]
+[ext_resource type="Script" uid="uid://q5qlhwvjb16w" path="res://Scripts/GL_Node_Picker_Float.gd" id="2_vlx6y"]
+[ext_resource type="Script" uid="uid://dflftb37a7ind" path="res://Scripts/GL_Node_Picker_Color.gd" id="3_tf34m"]
+[ext_resource type="Script" uid="uid://b7ysqwtxh8pf" path="res://Scripts/GL_Node_Picker_Bool.gd" id="4_yal7b"]
 
 [node name="Node Row" type="HBoxContainer"]
 
@@ -17,6 +20,29 @@ mouse_filter = 1
 text = "Testtesttesttesttest"
 clip_text = true
 
+[node name="Pick Float" type="HSlider" parent="."]
+visible = false
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 1
+max_value = 1.0
+step = 0.0
+script = ExtResource("2_vlx6y")
+
+[node name="Pick Color" type="ColorPickerButton" parent="."]
+visible = false
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+color = Color(0.894432, 0.326066, 0.580441, 1)
+script = ExtResource("3_tf34m")
+
+[node name="Pick Bool" type="CheckButton" parent="."]
+visible = false
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+script = ExtResource("4_yal7b")
+
 [node name="Output" type="Button" parent="." groups=["Outputs"]]
 layout_mode = 2
 mouse_default_cursor_shape = 2
@@ -25,4 +51,7 @@ script = ExtResource("1_fygh4")
 
 [connection signal="mouse_entered" from="Input" to="Input" method="mouse_enter"]
 [connection signal="mouse_exited" from="Input" to="Input" method="mouse_exit"]
+[connection signal="value_changed" from="Pick Float" to="Pick Float" method="value_changed"]
+[connection signal="color_changed" from="Pick Color" to="Pick Color" method="color_changed"]
+[connection signal="toggled" from="Pick Bool" to="Pick Bool" method="toggled"]
 [connection signal="button_down" from="Output" to="Output" method="_start_drag"]
diff --git a/Scenes/Nodes/Node.tscn b/Scenes/Nodes/Node.tscn
index d820fee..e0a91e6 100644
--- a/Scenes/Nodes/Node.tscn
+++ b/Scenes/Nodes/Node.tscn
@@ -1,13 +1,15 @@
-[gd_scene format=3 uid="uid://b0arjg8r75f8y"]
+[gd_scene load_steps=2 format=3 uid="uid://b0arjg8r75f8y"]
+
+[ext_resource type="Theme" uid="uid://b3wjoiiv6sq22" path="res://UI/Themes/Default.tres" id="1_arhwt"]
 
 [node name="Node" type="Panel"]
-custom_minimum_size = Vector2(100, 100)
-offset_right = 100.0
-offset_bottom = 100.0
+custom_minimum_size = Vector2(200, 100)
+offset_right = 200.0
+offset_bottom = 50.0
 mouse_default_cursor_shape = 6
+theme = ExtResource("1_arhwt")
 
-[node name="Holder" type="VBoxContainer" parent="."]
-custom_minimum_size = Vector2(100, 100)
+[node name="Margins" type="MarginContainer" parent="."]
 layout_mode = 1
 anchors_preset = 15
 anchor_right = 1.0
@@ -15,7 +17,10 @@ anchor_bottom = 1.0
 grow_horizontal = 2
 grow_vertical = 2
 
-[node name="Title" type="Label" parent="Holder"]
+[node name="Holder" type="VBoxContainer" parent="Margins"]
+layout_mode = 2
+
+[node name="Title" type="Label" parent="Margins/Holder"]
 layout_mode = 2
 text = "Test"
 horizontal_alignment = 1
diff --git a/Scripts/GL_Float.gd b/Scripts/GL_Float.gd
new file mode 100644
index 0000000..9b59f8d
--- /dev/null
+++ b/Scripts/GL_Float.gd
@@ -0,0 +1,11 @@
+extends GL_Node
+
+func _ready():
+	_set_title("Float")
+	_create_row("Output",null,0.0,true,0.0,1)
+	pass 
+
+func _process(delta):
+	super._process(delta)
+	rows["Output"]["output"] = rows["Output"]["pickValue"]
+	_send_input("Output")
diff --git a/Scripts/GL_Float.gd.uid b/Scripts/GL_Float.gd.uid
new file mode 100644
index 0000000..fd42519
--- /dev/null
+++ b/Scripts/GL_Float.gd.uid
@@ -0,0 +1 @@
+uid://b325grg0122jn
diff --git a/Scripts/GL_Node.gd b/Scripts/GL_Node.gd
index 969e598..36b3e18 100644
--- a/Scripts/GL_Node.gd
+++ b/Scripts/GL_Node.gd
@@ -24,7 +24,7 @@ func _create_uuid():
 	uuid = rand.randi()
 
 func _update_visuals():
-	var holder = get_node("Holder")
+	var holder = get_node("Margins").get_node("Holder")
 	for child in holder.get_children():
 		if child.name != "Title":
 			child.queue_free()
@@ -39,11 +39,31 @@ func _update_visuals():
 		input.mainNode = self
 		output.valueName = str(key)
 		output.mainNode = self
+		if rows[key]["picker"] == true:
+			match typeof(rows[key]["pickValue"]):
+				TYPE_FLOAT:
+					assignPick(nodeRow.get_node("Pick Float"),str(key))
+					var slider = nodeRow.get_node("Pick Float") as HSlider
+					slider.max_value = rows[key]["pickFloatMax"]
+					slider.value = rows[key]["pickValue"]
+				TYPE_BOOL:
+					assignPick(nodeRow.get_node("Pick Bool"),str(key))
+					(nodeRow.get_node("Pick Float") as ColorPickerButton).color = rows[key]["pickValue"]
+				TYPE_COLOR:
+					assignPick(nodeRow.get_node("Pick Color"),str(key))
+					(nodeRow.get_node("Pick Float") as CheckButton).button_pressed = rows[key]["pickValue"]
+			
+				
 		_set_inout_type(nodeRow.get_node("Input") as Button,rows[key]["input"])
 		_set_inout_type(nodeRow.get_node("Output") as Button,rows[key]["output"])
 
+func assignPick(pick:GL_Node_Picker,key:String):
+	if pick != null:
+		pick.mainNode = self
+		pick.valueName = key
+
 func give_input_point_pos(name:String) -> Vector2:
-	var holder = get_node("Holder").get_node(name)
+	var holder = get_node("Margins").get_node("Holder").get_node(name)
 	if holder == null:
 		return global_position
 	else:
@@ -65,10 +85,10 @@ func _set_inout_type(label:Button, value):
 			label.visible = false
 
 func _set_title(name:String):
-	(get_node("Holder").get_node("Title") as Label).text = name
+	(get_node("Margins").get_node("Holder").get_node("Title") as Label).text = name
 
-func _create_row(name:String,input,output):
-	rows[name] = {"input": input, "output": output, "connections": []}
+func _create_row(name:String,input,output,picker:bool,pickDefault,pickFloatMaximum:float):
+	rows[name] = {"input": input, "output": output, "connections": [], "picker":picker,"pickValue":pickDefault,"backConnected":false,"pickFloatMax":pickFloatMaximum}
 	_update_visuals()
 
 func _recieve_input(inputName:String,value):
@@ -86,6 +106,11 @@ func _send_input(output_name: String):
 		if target and input_name:
 			target._recieve_input(input_name, rows[output_name]["output"])
 
+func _confirm_backConnection(input_name:String):
+	if !rows.has(input_name):
+		return
+	rows[input_name]["backConnected"] = true
+
 func _create_connection(target:GL_Node,input_name:String,output_name:String):
 	if not rows.has(output_name):
 		return
@@ -113,6 +138,7 @@ func _create_connection(target:GL_Node,input_name:String,output_name:String):
 	connections.append(thenew)
 	rows[output_name]["connections"] = connections
 	
+	target._confirm_backConnection(input_name)
 	
 func mouse_enter():
 	canDrag = true
diff --git a/Scripts/GL_Node_Picker.gd b/Scripts/GL_Node_Picker.gd
new file mode 100644
index 0000000..ba6792c
--- /dev/null
+++ b/Scripts/GL_Node_Picker.gd
@@ -0,0 +1,9 @@
+extends Control
+class_name GL_Node_Picker
+var mainNode : GL_Node
+var valueName:String
+
+func _process(delta):
+	if mainNode == null:
+		return
+	visible = !mainNode.rows[valueName]["backConnected"]
diff --git a/Scripts/GL_Node_Picker.gd.uid b/Scripts/GL_Node_Picker.gd.uid
new file mode 100644
index 0000000..7a8238a
--- /dev/null
+++ b/Scripts/GL_Node_Picker.gd.uid
@@ -0,0 +1 @@
+uid://csv3oi505a3yw
diff --git a/Scripts/GL_Node_Picker_Bool.gd b/Scripts/GL_Node_Picker_Bool.gd
new file mode 100644
index 0000000..3488074
--- /dev/null
+++ b/Scripts/GL_Node_Picker_Bool.gd
@@ -0,0 +1,4 @@
+extends GL_Node_Picker
+
+func toggled(value:bool):
+	mainNode.rows[valueName]["pickValue"] = value
diff --git a/Scripts/GL_Node_Picker_Bool.gd.uid b/Scripts/GL_Node_Picker_Bool.gd.uid
new file mode 100644
index 0000000..ccf7147
--- /dev/null
+++ b/Scripts/GL_Node_Picker_Bool.gd.uid
@@ -0,0 +1 @@
+uid://b7ysqwtxh8pf
diff --git a/Scripts/GL_Node_Picker_Color.gd b/Scripts/GL_Node_Picker_Color.gd
new file mode 100644
index 0000000..db8dbd2
--- /dev/null
+++ b/Scripts/GL_Node_Picker_Color.gd
@@ -0,0 +1,4 @@
+extends GL_Node_Picker
+
+func color_changed(value:Color):
+	mainNode.rows[valueName]["pickValue"] = value
diff --git a/Scripts/GL_Node_Picker_Color.gd.uid b/Scripts/GL_Node_Picker_Color.gd.uid
new file mode 100644
index 0000000..357aaea
--- /dev/null
+++ b/Scripts/GL_Node_Picker_Color.gd.uid
@@ -0,0 +1 @@
+uid://dflftb37a7ind
diff --git a/Scripts/GL_Node_Picker_Float.gd b/Scripts/GL_Node_Picker_Float.gd
new file mode 100644
index 0000000..530ed11
--- /dev/null
+++ b/Scripts/GL_Node_Picker_Float.gd
@@ -0,0 +1,4 @@
+extends GL_Node_Picker
+
+func value_changed(value:float):
+	mainNode.rows[valueName]["pickValue"] = value
diff --git a/Scripts/GL_Node_Picker_Float.gd.uid b/Scripts/GL_Node_Picker_Float.gd.uid
new file mode 100644
index 0000000..569c7a0
--- /dev/null
+++ b/Scripts/GL_Node_Picker_Float.gd.uid
@@ -0,0 +1 @@
+uid://q5qlhwvjb16w
diff --git a/Scripts/GL_Random.gd b/Scripts/GL_Random.gd
new file mode 100644
index 0000000..af006df
--- /dev/null
+++ b/Scripts/GL_Random.gd
@@ -0,0 +1,14 @@
+extends GL_Node
+var rng : RandomNumberGenerator
+
+func _ready():
+	_set_title("Random")
+	_create_row("Output",null,0.0,false,null,0)
+	rng = RandomNumberGenerator.new()
+	rng.seed = Time.get_ticks_msec()
+	pass 
+
+func _process(delta):
+	super._process(delta)
+	rows["Output"]["output"] = rng.randf()
+	_send_input("Output")
diff --git a/Scripts/GL_Random.gd.uid b/Scripts/GL_Random.gd.uid
new file mode 100644
index 0000000..38999eb
--- /dev/null
+++ b/Scripts/GL_Random.gd.uid
@@ -0,0 +1 @@
+uid://3vek1806nwqj
diff --git a/Scripts/GL_Search.gd b/Scripts/GL_Search.gd
index 972dd16..88557e0 100644
--- a/Scripts/GL_Search.gd
+++ b/Scripts/GL_Search.gd
@@ -1,6 +1,6 @@
 extends Control
 
-var rows : Dictionary = {"Sine":99}
+var rows : Dictionary = {"Sine":99,"Random":99,"Float":99}
 var searching : bool
 var lastMousePos : Vector2
 
diff --git a/Scripts/GL_Sine.gd b/Scripts/GL_Sine.gd
index ba20afd..4898744 100644
--- a/Scripts/GL_Sine.gd
+++ b/Scripts/GL_Sine.gd
@@ -2,11 +2,13 @@ extends GL_Node
 
 func _ready():
 	_set_title("Sine")
-	_create_row("Output",null,0.0)
-	_create_row("Length",0.01,null)
+	_create_row("Output",null,0.0,false,null,0)
+	_create_row("Length",0.01,null,true,0.01,0.05)
 	pass 
 
 func _process(delta):
 	super._process(delta)
-	rows["Output"]["output"] = sin(Time.get_ticks_msec() * rows["Length"].get("input",1))
+	if rows["Length"]["picker"] == true && rows["Length"]["backConnected"] == false:
+		rows["Length"]["input"] = rows["Length"]["pickValue"]
+	rows["Output"]["output"] = (sin(Time.get_ticks_msec() * rows["Length"].get("input",1)) / 2) + 0.5
 	_send_input("Output")
diff --git a/UI/Fonts/lectus.otf b/UI/Fonts/lectus.otf
new file mode 100644
index 0000000000000000000000000000000000000000..48bbc475a30311bd76aee03666a9e7bc8ff52ae6
GIT binary patch
literal 13704
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

literal 0
HcmV?d00001

diff --git a/UI/Fonts/lectus.otf.import b/UI/Fonts/lectus.otf.import
new file mode 100644
index 0000000..e3ae67c
--- /dev/null
+++ b/UI/Fonts/lectus.otf.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://d1fox3cy2qhx"
+path="res://.godot/imported/lectus.otf-7c6965b88aea060243f3c50fbfb098b9.fontdata"
+
+[deps]
+
+source_file="res://UI/Fonts/lectus.otf"
+dest_files=["res://.godot/imported/lectus.otf-7c6965b88aea060243f3c50fbfb098b9.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/UI/Fonts/lectus.ttf b/UI/Fonts/lectus.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..58aafa31e6314227691c9ea50dd15074a7632834
GIT binary patch
literal 26468
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
HxcYwq)~*C+

literal 0
HcmV?d00001

diff --git a/UI/Fonts/lectus.ttf.import b/UI/Fonts/lectus.ttf.import
new file mode 100644
index 0000000..09c3b14
--- /dev/null
+++ b/UI/Fonts/lectus.ttf.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://kjbv8xwyxfmp"
+path="res://.godot/imported/lectus.ttf-06bbf50f1312c892a54d0a5c8d6eacee.fontdata"
+
+[deps]
+
+source_file="res://UI/Fonts/lectus.ttf"
+dest_files=["res://.godot/imported/lectus.ttf-06bbf50f1312c892a54d0a5c8d6eacee.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/UI/Themes/Default.tres b/UI/Themes/Default.tres
new file mode 100644
index 0000000..58cbc50
--- /dev/null
+++ b/UI/Themes/Default.tres
@@ -0,0 +1,13 @@
+[gd_resource type="Theme" load_steps=3 format=3 uid="uid://b3wjoiiv6sq22"]
+
+[ext_resource type="FontFile" uid="uid://d1fox3cy2qhx" path="res://UI/Fonts/lectus.otf" id="1_crk4k"]
+[ext_resource type="StyleBox" uid="uid://crsm0yvhb6rv1" path="res://UI/Themes/NodeTheme.tres" id="1_ne1i0"]
+
+[resource]
+Label/font_sizes/font_size = 12
+Label/fonts/font = ExtResource("1_crk4k")
+MarginContainer/constants/margin_bottom = 10
+MarginContainer/constants/margin_left = 10
+MarginContainer/constants/margin_right = 10
+MarginContainer/constants/margin_top = 10
+Panel/styles/panel = ExtResource("1_ne1i0")
diff --git a/UI/Themes/NodeTheme.tres b/UI/Themes/NodeTheme.tres
new file mode 100644
index 0000000..eaf2651
--- /dev/null
+++ b/UI/Themes/NodeTheme.tres
@@ -0,0 +1,11 @@
+[gd_resource type="StyleBoxFlat" format=3 uid="uid://crsm0yvhb6rv1"]
+
+[resource]
+bg_color = Color(0.178668, 0.310803, 0.118615, 1)
+border_width_left = 5
+border_width_top = 5
+border_width_right = 5
+border_width_bottom = 5
+border_blend = true
+corner_radius_top_left = 2
+corner_radius_top_right = 2