flexbox, code cleanup

This commit is contained in:
Face
2025-07-28 15:22:34 +03:00
parent e0a8b6f414
commit d02b109743
222 changed files with 5163 additions and 530 deletions

View File

@@ -20,3 +20,41 @@ Issues:
Notes:
- **< input />** is sort-of inline in normal web. We render it as a block element (new-line).
- A single `RichTextLabel` for inline text tags should stop, we should use invididual ones so it's easier to style and achieve separation through a `vboxcontainer`.
Supported styles:
- **Font style:**
- `font-bold`
- `font-italic`
- `underline`
- **Font size:**
- `text-xs` → 12
- `text-sm` → 14
- `text-base` → 16
- `text-lg` → 18
- `text-xl` → 20
- `text-2xl` → 24
- `text-3xl` → 30
- `text-4xl` → 36
- `text-5xl` → 48
- `text-6xl` → 60
- **Font family:**
- `font-mono`
- **Text color:**
- `text-[color]`
- **Background color:**
- `bg-[color]`
- **Flexbox**
- `flex` / `inline-flex` (display: flex/inline-flex)
- `flex-row`, `flex-row-reverse`, `flex-col`, `flex-col-reverse` (flex-direction)
- `flex-nowrap`, `flex-wrap`, `flex-wrap-reverse` (flex-wrap)
- `justify-start`, `justify-end`, `justify-center`, `justify-between`, `justify-around`, `justify-evenly` (justify-content)
- `items-start`, `items-end`, `items-center`, `items-baseline`, `items-stretch` (align-items)
- `content-start`, `content-end`, `content-center`, `content-between`, `content-around`, `content-evenly`, `content-stretch` (align-content)
- `gap-{size}`, `row-gap-{size}`, `col-gap-{size}` (gap, row-gap, column-gap)
- `flex-grow-{n}` (flex-grow)
- `flex-shrink-{n}` (flex-shrink)
- `basis-{size}` (flex-basis)
- `self-auto`, `self-start`, `self-end`, `self-center`, `self-stretch`, `self-baseline` (align-self)
- `order-{n}` (order)

View File

@@ -1,72 +0,0 @@
func _test_find_methods(parser: HTMLParser):
_log_result("\n--- Testing Find Methods ---")
# Test find_all
var all_scripts = parser.find_all("script")
_log_result("All script tags: " + str(all_scripts.size()))
var scripts_with_src = parser.find_all("script", "src")
_log_result("Script tags with src: " + str(scripts_with_src.size()))
# Test find_first
var first_meta = parser.find_first("meta")
if first_meta:
_log_result("First meta tag found with attributes: " + str(first_meta.attributes))
else:
_log_result("No meta tags found")
# Test find_by_id (won't find anything in our example)
var by_id = parser.find_by_id("main")
_log_result("Element with id 'main': " + str(by_id != null))
func _test_attribute_extraction(parser: HTMLParser):
_log_result("\n--- Testing Attribute Extraction ---")
var script_sources = parser.get_attribute_values("script", "src")
_log_result("Script sources: " + str(script_sources))
var meta_names = parser.get_attribute_values("meta", "name")
_log_result("Meta names: " + str(meta_names))
var hrefs = parser.get_attribute_values("icon", "href")
_log_result("Icon hrefs: " + str(hrefs))
func _test_convenience_methods(parser: HTMLParser):
_log_result("\n--- Testing Convenience Methods ---")
# Test convenience methods
var title = parser.get_title()
_log_result("Page title: '" + title + "'")
var theme_color = parser.get_meta_content("theme-color")
_log_result("Theme color: '" + theme_color + "'")
var description = parser.get_meta_content("description")
_log_result("Description: '" + description + "'")
var all_scripts = parser.get_all_scripts()
_log_result("All script sources: " + str(all_scripts))
var all_images = parser.get_all_images()
_log_result("All image sources: " + str(all_images))
var all_stylesheets = parser.get_all_stylesheets()
_log_result("All stylesheets: " + str(all_stylesheets))
func _log_element_tree(element: HTMLParser.HTMLElement, depth: int):
if depth == 0:
_log_result("\n--- Element Tree ---")
var indent = " ".repeat(depth)
var element_info = indent + element.tag_name
if element.attributes.size() > 0:
element_info += " " + str(element.attributes)
if element.text_content.length() > 0:
element_info += " [text: '" + element.text_content.substr(0, 30) + "']"
_log_result(element_info)
for child in element.children:
_log_element_tree(child, depth + 1)

View File

@@ -1 +0,0 @@
uid://dyeeapgo7qlng

9
Scenes/Tags/div.tscn Normal file
View File

@@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://lyg7t5edfneu"]
[ext_resource type="Script" uid="uid://ckks1ccehq6al" path="res://Scripts/Tags/div.gd" id="1_div"]
[node name="Div" type="VBoxContainer"]
anchors_preset = 10
anchor_right = 1.0
grow_horizontal = 2
script = ExtResource("1_div")

View File

@@ -3,10 +3,13 @@
[ext_resource type="Script" uid="uid://4pbphta3r67k" path="res://Scripts/Tags/span.gd" id="1_span"]
[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="2_theme"]
[node name="RichTextLabel" type="RichTextLabel"]
[node name="Span" type="RichTextLabel"]
z_index = 1
anchors_preset = 10
anchor_right = 1.0
grow_horizontal = 2
size_flags_horizontal = 0
size_flags_vertical = 0
focus_mode = 2
mouse_default_cursor_shape = 1
theme = ExtResource("2_theme")
@@ -18,3 +21,14 @@ autowrap_mode = 0
vertical_alignment = 2
selection_enabled = true
script = ExtResource("1_span")
[node name="BackgroundRect" type="ColorRect" parent="."]
z_index = -1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(1, 1, 1, 0)

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=27 format=3 uid="uid://bytm7bt2s4ak8"]
[gd_scene load_steps=29 format=3 uid="uid://bytm7bt2s4ak8"]
[ext_resource type="Script" uid="uid://bg5iqnwic1rio" path="res://Scripts/main.gd" id="1_8q3xr"]
[ext_resource type="Texture2D" uid="uid://df1m4j7uxi63v" path="res://Assets/Icons/chevron-down.svg" id="2_6bp64"]
@@ -11,6 +11,8 @@
[ext_resource type="Texture2D" uid="uid://cehbtwq6gq0cn" path="res://Assets/Icons/plus.svg" id="5_ynf5e"]
[ext_resource type="Script" uid="uid://bgqglerkcylxx" path="res://addons/SmoothScroll/SmoothScrollContainer.gd" id="10_d1ilt"]
[ext_resource type="Script" uid="uid://b7h0k2h2qwlqv" path="res://addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd" id="11_6iyac"]
[ext_resource type="Script" uid="uid://2dcp833juv7b" path="res://addons/godot-flexbox/flex_container.gd" id="12_6iyac"]
[ext_resource type="PackedScene" uid="uid://bkj3x5y2m8qrl" path="res://Scenes/Tags/span.tscn" id="13_fdnlq"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_344ge"]
@@ -216,11 +218,53 @@ metadata/_custom_type_script = "uid://bgqglerkcylxx"
[node name="WebsiteContainer" type="VBoxContainer" parent="VBoxContainer/SmoothScrollContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(200, 200)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/separation = 22
[node name="Control" type="Control" parent="VBoxContainer/SmoothScrollContainer/WebsiteContainer"]
layout_mode = 2
mouse_filter = 1
[node name="FlexContainer" type="Container" parent="VBoxContainer/SmoothScrollContainer/WebsiteContainer/Control"]
custom_minimum_size = Vector2(40, 60)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("12_6iyac")
flex_direction = 0
justify_content = 1
align_items = 2
align_content = 2
metadata/_custom_type_script = "uid://2dcp833juv7b"
[node name="FlexContainer" type="Container" parent="VBoxContainer/SmoothScrollContainer/WebsiteContainer/Control/FlexContainer"]
custom_minimum_size = Vector2(40, 40)
layout_mode = 2
script = ExtResource("12_6iyac")
metadata/_custom_type_script = "uid://2dcp833juv7b"
metadata/flex_metas = {
&"align_self": 0,
&"grow": 0.0
}
[node name="RichTextLabel" parent="VBoxContainer/SmoothScrollContainer/WebsiteContainer/Control/FlexContainer/FlexContainer" instance=ExtResource("13_fdnlq")]
layout_mode = 2
mouse_filter = 1
[node name="RichTextLabel2" parent="VBoxContainer/SmoothScrollContainer/WebsiteContainer/Control/FlexContainer/FlexContainer" instance=ExtResource("13_fdnlq")]
layout_mode = 2
mouse_filter = 1
[node name="RichTextLabel3" parent="VBoxContainer/SmoothScrollContainer/WebsiteContainer/Control/FlexContainer/FlexContainer" instance=ExtResource("13_fdnlq")]
layout_mode = 2
mouse_filter = 1
[node name="WebsiteBackground" type="Panel" parent="."]
z_index = -1
layout_mode = 1

View File

@@ -0,0 +1,131 @@
@tool
class_name AutoSizingFlexContainer
extends FlexContainer
signal flex_resized
var bgcolor: Color = Color(0,0,0,0)
func set_background_color(color: Color) -> void:
bgcolor = color
queue_redraw()
func _notification(what: int) -> void:
super._notification(what)
if what == NOTIFICATION_DRAW and bgcolor.a > 0:
draw_rect(Rect2(Vector2.ZERO, size), bgcolor)
# This is the overridden layout logic for the auto-sizing container
func _resort() -> void:
#size_flags_horizontal = Control.SIZE_SHRINK_CENTER
if debug_draw:
_draw_rects.clear()
var child_count = get_child_count()
var valid_child_index = 0
for i in range(child_count):
var c = get_child(i)
if not c is Control or c.is_set_as_top_level():
continue
var cid = c.get_instance_id()
var target_index = _find_index_from_flex_list(_flex_list, cid)
var flexbox: Flexbox
# If the child is not visible, remove its corresponding flexbox node
if not c.is_visible_in_tree():
if target_index != -1:
_root.remove_child_at(target_index)
_flex_list.remove_at(target_index)
continue
# Find, swap, or create a new flexbox node for the child
if target_index != -1:
var old_flex_data = _flex_list[valid_child_index]
var new_flex_data = _flex_list[target_index]
flexbox = new_flex_data[FlexDataType.FLEXBOX]
if old_flex_data[FlexDataType.CID] != cid:
_root.swap_child(valid_child_index, target_index)
_flex_list[target_index] = old_flex_data
_flex_list[valid_child_index] = new_flex_data
else:
flexbox = Flexbox.new()
_root.insert_child(flexbox, valid_child_index)
_flex_list.insert(valid_child_index, [cid, flexbox, c])
# Set the minimum size and apply flex properties for the child
_set_control_min_size(c, flexbox)
var flex_metas = c.get_meta("flex_metas", {})
if flex_metas.size():
apply_flex_meta(flexbox, flex_metas)
if flex_metas.has("padding"):
padding_wrapper(c, flex_metas.get("padding"))
valid_child_index += 1
# Clean up any flexbox nodes for children that were removed
child_count = valid_child_index
if child_count != _flex_list.size():
for i in range(_flex_list.size() - 1, child_count - 1, -1):
_root.remove_child_at(i)
_flex_list.resize(child_count)
_root.mark_dirty_and_propogate()
var auto_size_width = not has_meta("custom_css_width")
var auto_size_height = not has_meta("custom_css_height")
var available_width = NAN if auto_size_width else size.x
var available_height = NAN if auto_size_height else size.y
_root.calculate_layout(available_width, available_height, 1) # 1 = LTR direction
# Get the size computed by Yoga
var computed_size = Vector2(
_root.get_computed_width(),
_root.get_computed_height()
)
# Respect any explicit width/height set via metadata
var custom_w = 0.0
if has_meta("custom_css_width"):
custom_w = float(get_meta("custom_css_width"))
var custom_h = 0.0
if has_meta("custom_css_height"):
custom_h = float(get_meta("custom_css_height"))
var needed_size = Vector2(
max(custom_w, computed_size.x),
max(custom_h, computed_size.y)
)
# Construct the new minimum size for this container
var new_min_size = custom_minimum_size
if auto_size_width:
new_min_size.x = needed_size.x
if auto_size_height:
new_min_size.y = needed_size.y
if not custom_minimum_size.is_equal_approx(new_min_size):
custom_minimum_size = new_min_size
# Apply the calculated layout to each child control
for flex_data in _flex_list:
var flexbox = flex_data[FlexDataType.FLEXBOX]
var c = flex_data[FlexDataType.CONTROL]
var offset = Vector2(flexbox.get_computed_left(), flexbox.get_computed_top())
var rect_size = Vector2(flexbox.get_computed_width(), flexbox.get_computed_height())
_fit_child_in_rect(c, Rect2(offset, rect_size))
if debug_draw:
_draw_debug_rect(Rect2(offset, rect_size), Color(1, 0, 0, 0.8))
if has_meta("custom_css_background_color"):
set_background_color(get_meta("custom_css_background_color"))
queue_redraw()
emit_signal("flex_resized")

View File

@@ -0,0 +1 @@
uid://feiw2baeu5ye

View File

@@ -258,6 +258,96 @@ func parse_utility_class(rule: CSSRule, utility_name: String) -> void:
rule.properties["max-height"] = parse_size(val)
return
# Flex container
if utility_name == "flex":
rule.properties["display"] = "flex"
return
if utility_name == "inline-flex":
rule.properties["display"] = "inline-flex"
return
# Flex direction
match utility_name:
"flex-row": rule.properties["flex-direction"] = "row"; return
"flex-row-reverse": rule.properties["flex-direction"] = "row-reverse"; return
"flex-col": rule.properties["flex-direction"] = "column"; return
"flex-col-reverse": rule.properties["flex-direction"] = "column-reverse"; return
# Flex wrap
match utility_name:
"flex-nowrap": rule.properties["flex-wrap"] = "nowrap"; return
"flex-wrap": rule.properties["flex-wrap"] = "wrap"; return
"flex-wrap-reverse": rule.properties["flex-wrap"] = "wrap-reverse"; return
# Justify content
match utility_name:
"justify-start": rule.properties["justify-content"] = "flex-start"; return
"justify-end": rule.properties["justify-content"] = "flex-end"; return
"justify-center": rule.properties["justify-content"] = "center"; return
"justify-between": rule.properties["justify-content"] = "space-between"; return
"justify-around": rule.properties["justify-content"] = "space-around"; return
"justify-evenly": rule.properties["justify-content"] = "space-evenly"; return
# Align items
match utility_name:
"items-start": rule.properties["align-items"] = "flex-start"; return
"items-end": rule.properties["align-items"] = "flex-end"; return
"items-center": rule.properties["align-items"] = "center"; return
"items-baseline": rule.properties["align-items"] = "baseline"; return
"items-stretch": rule.properties["align-items"] = "stretch"; return
# Align content
match utility_name:
"content-start": rule.properties["align-content"] = "flex-start"; return
"content-end": rule.properties["align-content"] = "flex-end"; return
"content-center": rule.properties["align-content"] = "center"; return
"content-between": rule.properties["align-content"] = "space-between"; return
"content-around": rule.properties["align-content"] = "space-around"; return
"content-stretch": rule.properties["align-content"] = "stretch"; return
# Gap
if utility_name.begins_with("gap-"):
var val = utility_name.substr(4)
rule.properties["gap"] = parse_size(val)
return
if utility_name.begins_with("row-gap-"):
var val = utility_name.substr(8)
rule.properties["row-gap"] = parse_size(val)
return
if utility_name.begins_with("col-gap-"):
var val = utility_name.substr(8)
rule.properties["column-gap"] = parse_size(val)
return
# FLEX ITEM PROPERTIES
if utility_name.begins_with("flex-grow-"):
var val = utility_name.substr(10)
rule.properties["flex-grow"] = val.to_float()
return
if utility_name.begins_with("flex-shrink-"):
var val = utility_name.substr(12)
rule.properties["flex-shrink"] = val.to_float()
return
if utility_name.begins_with("basis-"):
var val = utility_name.substr(6)
rule.properties["flex-basis"] = parse_size(val)
return
# Align self
match utility_name:
"self-auto": rule.properties["align-self"] = "auto"; return
"self-start": rule.properties["align-self"] = "flex-start"; return
"self-end": rule.properties["align-self"] = "flex-end"; return
"self-center": rule.properties["align-self"] = "center"; return
"self-stretch": rule.properties["align-self"] = "stretch"; return
"self-baseline": rule.properties["align-self"] = "baseline"; return
# Order
if utility_name.begins_with("order-"):
var val = utility_name.substr(6)
rule.properties["order"] = val.to_int()
return
# Handle more utility classes as needed
# Add more cases here for other utilities
@@ -292,7 +382,6 @@ func extract_bracket_content(string: String, start_idx: int) -> String:
return string.substr(open_idx + 1, close_idx - open_idx - 1)
func parse_color(color_string: String) -> Color:
print("DEBUG: parsing color: ", color_string)
color_string = color_string.strip_edges()
# Handle hex colors

View File

@@ -55,21 +55,6 @@ var xml_parser: XMLParser
var bitcode: PackedByteArray
var parse_result: ParseResult
var DEFAULT_CSS := """
h1 { text-5xl font-bold }
h2 { text-4xl font-bold }
h3 { text-3xl font-bold }
h4 { text-2xl font-bold }
h5 { text-xl font-bold }
b { font-bold }
i { font-italic }
u { underline }
small { text-xl }
mark { bg-[#FFFF00] }
code { text-xl font-mono }
a { text-[#1a0dab] }
"""
func _init(data: PackedByteArray):
bitcode = data
xml_parser = XMLParser.new()
@@ -125,7 +110,7 @@ func process_styles() -> void:
return
# Collect all style element content
var css_content = DEFAULT_CSS
var css_content = Constants.DEFAULT_CSS
var style_elements = find_all("style")
for style_element in style_elements:
if style_element.get_attribute("src").is_empty():

View File

@@ -4,3 +4,229 @@ const MAIN_COLOR = Color(27/255.0, 27/255.0, 27/255.0, 1)
const SECONDARY_COLOR = Color(43/255.0, 43/255.0, 43/255.0, 1)
const HOVER_COLOR = Color(0, 0, 0, 1)
const DEFAULT_CSS = """
h1 { text-5xl font-bold }
h2 { text-4xl font-bold }
h3 { text-3xl font-bold }
h4 { text-2xl font-bold }
h5 { text-xl font-bold }
b { font-bold }
i { font-italic }
u { underline }
small { text-xl }
mark { bg-[#FFFF00] }
code { text-xl font-mono }
a { text-[#1a0dab] }
pre { text-xl font-mono }
"""
var HTML_CONTENT = "<head>
<title>My cool web</title>
<icon src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Google_%22G%22_logo.svg/768px-Google_%22G%22_logo.svg.png\">
<meta name=\"theme-color\" content=\"#000000\">
<meta name=\"description\" content=\"My cool web\">
<style>
h1 { text-[#ff0000] font-italic hover:text-[#00ff00] }
p { text-[#333333] text-2xl }
</style>
<style src=\"styles.css\">
<script src=\"script.lua\" />
</head>
<body>
<h1>Header 1</h1>
<h2>Header 2</h2>
<h3>Header 3</h3>
<h4>Header 4</h4>
<h5>Header 5</h5>
<h6>Header 6</h6>
<p>Hey there! this is a test</p>
<b>This is bold</b>
<i>This is italic <mark>actually, and it's pretty <u>cool</u></mark></i>
<u>This is underline</u>
<small>this is small</small>
<mark>this is marked</mark>
<code>this is code<span> THIS IS A SPAN AND SHOULDNT BE ANY DIFFERENT</span></code>
<p>
<a href=\"https://youtube.com\">Hello gang</a>
</p>
<pre>
Text in a pre element
is displayed in a fixed-width
font, and it preserves
both spaces and
line breaks
</pre>
<p style=\"text-center w-32 h-32\">
So
</p>
<select style=\"text-center max-w-5 max-h-32\">
<option value=\"test1\">Test 1</option>
<option value=\"test2\" selected=\"true\">Test 2</option>
<option value=\"test3\">Test 3</option>
<option value=\"test4\" disabled=\"true\">Test 4</option>
<option value=\"test5\">Test 5</option>
</select>
<textarea />
<textarea cols=\"30\" />
<textarea rows=\"2\" />
<textarea maxlength=\"20\" />
<textarea readonly=\"true\">le skibidi le toilet</textarea>
<textarea disabled=\"true\" value=\"DISABLED\" />
<textarea placeholder=\"this is a placeholder...\" />
<!-- action, method, and type=submit are for when we implement Lua -->
<form action=\"/submit\" method=\"POST\">
<span>Name:</span>
<input type=\"text\" placeholder=\"First name\" value=\"John\" maxlength=\"20\" minlength=\"3\" />
<span>Email regex:</span>
<input type=\"text\" placeholder=\"Last name\" value=\"Doe\" pattern=\"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$\" />
<span>Smart:</span>
<input type=\"checkbox\" />
<input type=\"checkbox\" value=\"true\" />
<p>favorite food</p>
<input type=\"radio\" group=\"food\" />
<span>Pizza</span>
<input type=\"radio\" group=\"food\" />
<span>Berry</span>
<input type=\"radio\" group=\"food\" />
<span>Gary</span>
<h2>Color</h2>
<input type=\"color\" value=\"#ff0000\" />
<h2>Date</h2>
<input type=\"date\" value=\"2018-07-22\" />
<h2>Range Slider</h2>
<input style=\"max-w-2 max-h-2\" type=\"range\" min=\"0\" max=\"100\" step=\"5\" value=\"50\" />
<h2>Number Input</h2>
<input type=\"number\" min=\"1\" max=\"10\" step=\"0.5\" value=\"5\" placeholder=\"Enter number\" />
<h2>File Upload</h2>
<input type=\"file\" accept=\".txt,.pdf,image/*\" />
<input type=\"password\" placeholder=\"your password...\" />
<button type=\"submit\">Submit</button>
</form>
<separator direction=\"horizontal\" />
# Ordered list
<ol>
<li>hello gang</li>
<li>this</li>
<li>is</li>
</ol>
<ol type=\"zero-lead\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"lower-alpha\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"upper-alpha\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"lower-roman\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"upper-roman\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ul>
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<ul type=\"circle\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<ul type=\"none\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<ul type=\"square\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<img style=\"text-center max-w-24 max-h-24\" src=\"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMNUPIKabszX0Js_c0kfa4cz_JQYKfGTuBUA&s\" />
<separator direction=\"vertical\" />
<!-- FLEXBOX EXAMPLES -->
<h2>Flex Row (gap, justify-between, items-center)</h2>
<div style=\"flex flex-row gap-4 justify-between items-center w-64 h-16 bg-[#f0f0f0]\">
<span style=\"bg-[#ffaaaa] w-16 h-8 flex items-center justify-center\">A</span>
<span style=\"bg-[#aaffaa] w-16 h-8 flex items-center justify-center\">B</span>
<span style=\"bg-[#aaaaff] w-16 h-8 flex items-center justify-center\">C</span>
</div>
<h2>Flex Column (gap, items-center, content-center)</h2>
<div style=\"flex flex-col gap-2 items-center content-center h-32 w-32 bg-[#e0e0e0]\">
<span style=\"bg-[#ffaaaa] w-16 h-6 flex items-center justify-center\">1</span>
<span style=\"bg-[#aaffaa] w-16 h-6 flex items-center justify-center\">2</span>
<span style=\"bg-[#aaaaff] w-16 h-6 flex items-center justify-center\">3</span>
</div>
<h2>Flex Wrap (row, wrap, gap)</h2>
<div style=\"flex flex-row flex-wrap gap-2 w-40 bg-[#f8f8f8]\">
<span style=\"bg-[#ffaaaa] w-16 h-6 flex items-center justify-center\">X</span>
<span style=\"bg-[#aaffaa] w-16 h-6 flex items-center justify-center\">Y</span>
<span style=\"bg-[#aaaaff] w-16 h-6 flex items-center justify-center\">Z</span>
<span style=\"bg-[#ffffaa] w-16 h-6 flex items-center justify-center\">W</span>
</div>
<h2>Flex Grow/Shrink/Basis</h2>
<div style=\"flex flex-row gap-2 w-64 bg-[#f0f0f0]\">
<span style=\"bg-[#ffaaaa] flex-grow-1 h-8 flex items-center justify-center\">Grow 1</span>
<span style=\"bg-[#aaffaa] flex-grow-2 h-8 flex items-center justify-center\">Grow 2</span>
<span style=\"bg-[#aaaaff] flex-shrink-0 w-8 h-8 flex items-center justify-center\">No Shrink</span>
</div>
<h2>Align Self</h2>
<div style=\"flex flex-row h-24 bg-[#f0f0f0] items-stretch gap-2 w-64\">
<span style=\"bg-[#ffaaaa] w-12 h-8 self-start flex items-center justify-center\">Start</span>
<span style=\"bg-[#aaffaa] w-12 h-8 self-center flex items-center justify-center\">Center</span>
<span style=\"bg-[#aaaaff] w-12 h-8 self-end flex items-center justify-center\">End</span>
<span style=\"bg-[#ffffaa] w-12 h-8 self-stretch flex items-center justify-center\">Stretch</span>
</div>
</body>".to_utf8_buffer()

231
Scripts/StyleManager.gd Normal file
View File

@@ -0,0 +1,231 @@
class_name StyleManager
extends RefCounted
static func parse_size(val):
if val == null: return null
if typeof(val) == TYPE_INT or typeof(val) == TYPE_FLOAT:
return float(val)
if val.ends_with("px"):
return float(val.replace("px", ""))
if val.ends_with("rem"):
return float(val.replace("rem", "")) * 16.0
if val.ends_with("%"):
# Not supported directly, skip
return null
return float(val)
static func apply_element_styles(node: Control, element: HTMLParser.HTMLElement, parser: HTMLParser) -> Control:
var styles = parser.get_element_styles(element)
var label = null
if not (node is FlexContainer):
label = node if node is RichTextLabel else node.get_node_or_null("RichTextLabel")
var width = null
var height = null
if styles.has("width"):
width = parse_size(styles["width"])
if styles.has("height"):
height = parse_size(styles["height"])
# Apply size directly to the node given.
if width != null or height != null:
node.custom_minimum_size = Vector2(
width if width != null else node.custom_minimum_size.x,
height if height != null else node.custom_minimum_size.y
)
if width != null:
node.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN
if height != null:
node.size_flags_vertical = Control.SIZE_SHRINK_BEGIN
if label and label != node:
label.anchors_preset = Control.PRESET_FULL_RECT
# Apply background color
if styles.has("background-color"):
var target_node_for_bg = node if node is FlexContainer else label
if target_node_for_bg:
print("SETTING BACKGROUND FOR ", target_node_for_bg, " TO COLOR: ", styles)
target_node_for_bg.set_meta("custom_css_background_color", styles["background-color"])
if target_node_for_bg.has_method("add_background_rect"):
target_node_for_bg.call_deferred("add_background_rect")
if label:
apply_styles_to_label(label, styles, element, parser)
return node
static func apply_styles_to_label(label: RichTextLabel, styles: Dictionary, element: HTMLParser.HTMLElement, parser) -> void:
var text = element.get_preserved_text() if element.tag_name == "pre" else element.get_bbcode_formatted_text(parser)
var font_size = 24 # default
# Apply font size
if styles.has("font-size"):
font_size = int(styles["font-size"])
# Apply color
var color_tag = ""
if styles.has("color"):
var color = styles["color"] as Color
color_tag = "[color=#%s]" % color.to_html(false)
# Apply bold
var bold_open = ""
var bold_close = ""
if styles.has("font-bold") and styles["font-bold"]:
bold_open = "[b]"
bold_close = "[/b]"
# Apply italic
var italic_open = ""
var italic_close = ""
if styles.has("font-italic") and styles["font-italic"]:
italic_open = "[i]"
italic_close = "[/i]"
# Apply underline
var underline_open = ""
var underline_close = ""
if styles.has("underline") and styles["underline"]:
underline_open = "[u]"
underline_close = "[/u]"
# Apply monospace font
var mono_open = ""
var mono_close = ""
if styles.has("font-mono") and styles["font-mono"]:
mono_open = "[code]"
mono_close = "[/code]"
if styles.has("text-align"):
match styles["text-align"]:
"left":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT
"center":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
"right":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
"justify":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_FILL
# Construct final text
var styled_text = "[font_size=%d]%s%s%s%s%s%s%s%s%s%s%s[/font_size]" % [
font_size,
color_tag,
bold_open,
italic_open,
underline_open,
mono_open,
text,
mono_close,
underline_close,
italic_close,
bold_close,
"[/color]" if color_tag.length() > 0 else "",
]
label.text = styled_text
static func apply_flex_container_properties(node: FlexContainer, styles: Dictionary) -> void:
# Flex direction
if styles.has("flex-direction"):
match styles["flex-direction"]:
"row": node.flex_direction = FlexContainer.FlexDirection.Row
"row-reverse": node.flex_direction = FlexContainer.FlexDirection.RowReverse
"column": node.flex_direction = FlexContainer.FlexDirection.Column
"column-reverse": node.flex_direction = FlexContainer.FlexDirection.ColumnReverse
# Flex wrap
if styles.has("flex-wrap"):
match styles["flex-wrap"]:
"nowrap": node.flex_wrap = FlexContainer.FlexWrap.NoWrap
"wrap": node.flex_wrap = FlexContainer.FlexWrap.Wrap
"wrap-reverse": node.flex_wrap = FlexContainer.FlexWrap.WrapReverse
# Justify content
if styles.has("justify-content"):
match styles["justify-content"]:
"flex-start": node.justify_content = FlexContainer.JustifyContent.FlexStart
"flex-end": node.justify_content = FlexContainer.JustifyContent.FlexEnd
"center": node.justify_content = FlexContainer.JustifyContent.Center
"space-between": node.justify_content = FlexContainer.JustifyContent.SpaceBetween
"space-around": node.justify_content = FlexContainer.JustifyContent.SpaceAround
"space-evenly": node.justify_content = FlexContainer.JustifyContent.SpaceEvenly
# Align items
if styles.has("align-items"):
match styles["align-items"]:
"flex-start": node.align_items = FlexContainer.AlignItems.FlexStart
"flex-end": node.align_items = FlexContainer.AlignItems.FlexEnd
"center": node.align_items = FlexContainer.AlignItems.Center
"stretch": node.align_items = FlexContainer.AlignItems.Stretch
"baseline": node.align_items = FlexContainer.AlignItems.Baseline
# Align content
if styles.has("align-content"):
match styles["align-content"]:
"flex-start": node.align_content = FlexContainer.AlignContent.FlexStart
"flex-end": node.align_content = FlexContainer.AlignContent.FlexEnd
"center": node.align_content = FlexContainer.AlignContent.Center
"stretch": node.align_content = FlexContainer.AlignContent.Stretch
"space-between": node.align_content = FlexContainer.AlignContent.SpaceBetween
"space-around": node.align_content = FlexContainer.AlignContent.SpaceAround
# Gap
if styles.has("gap"):
# YGGutterAll = 2
node._root.set_gap(2, parse_flex_value(styles["gap"]))
if styles.has("row-gap"):
# YGGutterRow = 1
node._root.set_gap(1, parse_flex_value(styles["row-gap"]))
if styles.has("column-gap"):
# YGGutterColumn = 0
node._root.set_gap(0, parse_flex_value(styles["column-gap"]))
if styles.has("width"):
node.set_meta("custom_css_width", parse_size(styles["width"]))
if styles.has("height"):
node.set_meta("custom_css_height", parse_size(styles["height"]))
if styles.has("background-color"):
node.set_meta("custom_css_background_color", styles["background-color"])
node.update_layout()
static func apply_flex_item_properties(node: Control, styles: Dictionary) -> void:
var properties: Dictionary = node.get_meta("flex_metas", {}).duplicate(true)
var changed = false
if styles.has("flex-grow"):
properties["grow"] = float(styles["flex-grow"])
changed = true
if styles.has("flex-shrink"):
properties["shrink"] = float(styles["flex-shrink"])
changed = true
if styles.has("flex-basis"):
properties["basis"] = parse_flex_value(styles["flex-basis"])
changed = true
if styles.has("align-self"):
var align_self_value = -1
match styles["align-self"]:
"auto": align_self_value = FlexContainer.AlignItems.Auto
"flex-start": align_self_value = FlexContainer.AlignItems.FlexStart
"flex-end": align_self_value = FlexContainer.AlignItems.FlexEnd
"center": align_self_value = FlexContainer.AlignItems.Center
"stretch": align_self_value = FlexContainer.AlignItems.Stretch
"baseline": align_self_value = FlexContainer.AlignItems.Baseline
if align_self_value != -1:
properties["align_self"] = align_self_value
changed = true
if changed:
node.set_meta("flex_metas", properties)
# The parent FlexContainer must be notified to update its layout.
var parent = node.get_parent()
if parent is FlexContainer:
parent.update_layout()
static func parse_flex_value(val):
if val is float or val is int:
return float(val)
if val is String:
var s_val = val.strip_edges()
if s_val.is_valid_float():
return s_val.to_float()
if s_val.ends_with("%"):
# NOTE: Flex-basis percentages not supported by flexbox
return s_val.trim_suffix("%").to_float() / 100.0
if s_val.ends_with("px"):
return s_val.trim_suffix("px").to_float()
if s_val == "auto":
return "auto"
return null

View File

@@ -0,0 +1 @@
uid://dg2rhkcabusn1

4
Scripts/Tags/div.gd Normal file
View File

@@ -0,0 +1,4 @@
extends FlexContainer
func init(a):
pass

1
Scripts/Tags/div.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://ckks1ccehq6al

View File

@@ -3,5 +3,4 @@ extends Control
@onready var rich_text_label: RichTextLabel = $RichTextLabel
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=48][b]%s[/b][/font_size]" % element.get_bbcode_formatted_text(parser)
pass

View File

@@ -3,5 +3,4 @@ extends Control
@onready var rich_text_label: RichTextLabel = $RichTextLabel
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=36][b]%s[/b][/font_size]" % element.get_bbcode_formatted_text(parser)
pass

View File

@@ -3,5 +3,4 @@ extends Control
@onready var rich_text_label: RichTextLabel = $RichTextLabel
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=28][b]%s[/b][/font_size]" % element.get_bbcode_formatted_text(parser)
pass

View File

@@ -3,5 +3,4 @@ extends Control
@onready var rich_text_label: RichTextLabel = $RichTextLabel
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=24][b]%s[/b][/font_size]" % element.get_bbcode_formatted_text(parser)
pass

View File

@@ -3,5 +3,4 @@ extends Control
@onready var rich_text_label: RichTextLabel = $RichTextLabel
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=20][b]%s[/b][/font_size]" % element.get_bbcode_formatted_text(parser)
pass

View File

@@ -3,5 +3,4 @@ extends Control
@onready var rich_text_label: RichTextLabel = $RichTextLabel
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=16][b]%s[/b][/font_size]" % element.get_bbcode_formatted_text(parser)
pass

View File

@@ -1,5 +1,5 @@
class_name Pre
extends VBoxContainer
func init(element: HTMLParser.HTMLElement) -> void:
var label: RichTextLabel = $RichTextLabel
label.text = "[font_size=20][code]%s[/code][/font_size]" % element.get_preserved_text()
pass

View File

@@ -1,6 +1,16 @@
extends RichTextLabel
@onready var rich_text_label: RichTextLabel = self
@onready var background_rect: ColorRect = $BackgroundRect
func init(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> void:
text = "[font_size=24]%s[/font_size]" % element.get_bbcode_formatted_text(parser)
func _ready():
if has_meta("custom_css_background_color"):
add_background_rect()
func add_background_rect():
var color = get_meta("custom_css_background_color")
background_rect.color = color
background_rect.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

View File

@@ -4,6 +4,7 @@ extends Control
@onready var website_container: Control = %WebsiteContainer
@onready var tab_container: TabManager = $VBoxContainer/TabContainer
const LOADER_CIRCLE = preload("res://Assets/Icons/loader-circle.svg")
const AUTO_SIZING_FLEX_CONTAINER = preload("res://Scripts/AutoSizingFlexContainer.gd")
const P = preload("res://Scenes/Tags/p.tscn")
const IMG = preload("res://Scenes/Tags/img.tscn")
@@ -26,6 +27,7 @@ const LI = preload("res://Scenes/Tags/li.tscn")
const SELECT = preload("res://Scenes/Tags/select.tscn")
const OPTION = preload("res://Scenes/Tags/option.tscn")
const TEXTAREA = preload("res://Scenes/Tags/textarea.tscn")
const DIV = preload("res://Scenes/Tags/div.tscn")
const MIN_SIZE = Vector2i(750, 200)
@@ -34,182 +36,12 @@ func _ready():
ProjectSettings.set_setting("display/window/size/min_height", MIN_SIZE.y)
DisplayServer.window_set_min_size(MIN_SIZE)
func render():
func render() -> void:
# Clear existing content
for child in website_container.get_children():
child.queue_free()
var html_bytes = "<head>
<title>My cool web</title>
<icon src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Google_%22G%22_logo.svg/768px-Google_%22G%22_logo.svg.png\">
<meta name=\"theme-color\" content=\"#000000\">
<meta name=\"description\" content=\"My cool web\">
<style>
h1 { text-[#ff0000] font-italic hover:text-[#00ff00] }
p { text-[#333333] text-2xl }
</style>
<style src=\"styles.css\">
<script src=\"script.lua\" />
</head>
<body>
<h1>Header 1</h1>
<h2>Header 2</h2>
<h3>Header 3</h3>
<h4>Header 4</h4>
<h5>Header 5</h5>
<h6>Header 6</h6>
<p>Hey there! this is a test</p>
<b>This is bold</b>
<i>This is italic <mark>actually, and it's pretty <u>cool</u></mark></i>
<u>This is underline</u>
<small>this is small</small>
<mark>this is marked</mark>
<code>this is code<span> THIS IS A SPAN AND SHOULDNT BE ANY DIFFERENT</span></code>
<p>
<a href=\"https://youtube.com\">Hello gang</a>
</p>
<pre>
Text in a pre element
is displayed in a fixed-width
font, and it preserves
both spaces and
line breaks
</pre>
<p style=\"text-center w-32 h-32\">
So
</p>
<select style=\"text-center max-w-5 max-h-32\">
<option value=\"test1\">Test 1</option>
<option value=\"test2\" selected=\"true\">Test 2</option>
<option value=\"test3\">Test 3</option>
<option value=\"test4\" disabled=\"true\">Test 4</option>
<option value=\"test5\">Test 5</option>
</select>
<textarea />
<textarea cols=\"30\" />
<textarea rows=\"2\" />
<textarea maxlength=\"20\" />
<textarea readonly=\"true\">le skibidi le toilet</textarea>
<textarea disabled=\"true\" value=\"DISABLED\" />
<textarea placeholder=\"this is a placeholder...\" />
<!-- action, method, and type=submit are for when we implement Lua -->
<form action=\"/submit\" method=\"POST\">
<span>Name:</span>
<input type=\"text\" placeholder=\"First name\" value=\"John\" maxlength=\"20\" minlength=\"3\" />
<span>Email regex:</span>
<input type=\"text\" placeholder=\"Last name\" value=\"Doe\" pattern=\"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$\" />
<span>Smart:</span>
<input type=\"checkbox\" />
<input type=\"checkbox\" value=\"true\" />
<p>favorite food</p>
<input type=\"radio\" group=\"food\" />
<span>Pizza</span>
<input type=\"radio\" group=\"food\" />
<span>Berry</span>
<input type=\"radio\" group=\"food\" />
<span>Gary</span>
<h2>Color</h2>
<input type=\"color\" value=\"#ff0000\" />
<h2>Date</h2>
<input type=\"date\" value=\"2018-07-22\" />
<h2>Range Slider</h2>
<input style=\"max-w-2 max-h-2\" type=\"range\" min=\"0\" max=\"100\" step=\"5\" value=\"50\" />
<h2>Number Input</h2>
<input type=\"number\" min=\"1\" max=\"10\" step=\"0.5\" value=\"5\" placeholder=\"Enter number\" />
<h2>File Upload</h2>
<input type=\"file\" accept=\".txt,.pdf,image/*\" />
<input type=\"password\" placeholder=\"your password...\" />
<button type=\"submit\">Submit</button>
</form>
<separator direction=\"horizontal\" />
# Ordered list
<ol>
<li>hello gang</li>
<li>this</li>
<li>is</li>
</ol>
<ol type=\"zero-lead\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"lower-alpha\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"upper-alpha\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"lower-roman\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ol type=\"upper-roman\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ol>
<ul>
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<ul type=\"circle\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<ul type=\"none\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<ul type=\"square\">
<li>hello gang</li>
<li>this</li>
<li>is</li>
<li>a test</li>
</ul>
<img style=\"text-center max-w-24 max-h-24\" src=\"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMNUPIKabszX0Js_c0kfa4cz_JQYKfGTuBUA&s\" />
<separator direction=\"vertical\" />
</body>".to_utf8_buffer()
var html_bytes = Constants.HTML_CONTENT
var parser: HTMLParser = HTMLParser.new(html_bytes)
var parse_result = parser.parse()
@@ -252,6 +84,8 @@ So
# Handle hyperlinks for all inline elements
if contains_hyperlink(inline_element) and inline_node.rich_text_label:
inline_node.rich_text_label.meta_clicked.connect(func(meta): OS.shell_open(str(meta)))
else:
print("Failed to create inline element node: ", inline_element.tag_name)
safe_add_child(website_container, hbox)
continue
@@ -270,171 +104,11 @@ So
i += 1
func safe_add_child(parent: Node, child: Node) -> void:
static func safe_add_child(parent: Node, child: Node) -> void:
if child.get_parent():
child.get_parent().remove_child(child)
parent.add_child(child)
func parse_size(val):
if typeof(val) == TYPE_INT or typeof(val) == TYPE_FLOAT:
return float(val)
if val.ends_with("px"):
return float(val.replace("px", ""))
if val.ends_with("rem"):
return float(val.replace("rem", "")) * 16.0
if val.ends_with("%"):
# Not supported directly, skip
return null
return float(val)
func apply_element_styles(node: Control, element: HTMLParser.HTMLElement, parser: HTMLParser) -> Control:
var styles = parser.get_element_styles(element)
var label = node if node is RichTextLabel else node.get_node_or_null("RichTextLabel")
var max_width = null
var max_height = null
var min_width = null
var min_height = null
var width = null
var height = null
# Handle width/height/min/max
if styles.has("width"):
width = parse_size(styles["width"])
if styles.has("height"):
height = parse_size(styles["height"])
if styles.has("min-width"):
min_width = parse_size(styles["min-width"])
if styles.has("min-height"):
min_height = parse_size(styles["min-height"])
if styles.has("max-width"):
max_width = parse_size(styles["max-width"])
if styles.has("max-height"):
max_height = parse_size(styles["max-height"])
# Apply min size
if min_width != null or min_height != null:
node.custom_minimum_size = Vector2(
min_width if min_width != null else node.custom_minimum_size.x,
min_height if min_height != null else node.custom_minimum_size.y
)
# Apply w/h size
if width != null or height != null:
node.custom_minimum_size = Vector2(
width if width != null else node.custom_minimum_size.x,
height if height != null else node.custom_minimum_size.y
)
# Set size flags to shrink (without center) so it doesn't expand beyond minimum
if width != null:
node.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN
if height != null:
node.size_flags_vertical = Control.SIZE_SHRINK_BEGIN
if label and label != node: # If label is a child of node
label.anchors_preset = Control.PRESET_FULL_RECT
label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
label.size_flags_vertical = Control.SIZE_EXPAND_FILL
# Apply max constraints via MaxSizeContainer
var result_node = node
if max_width != null or max_height != null:
var max_container = MaxSizeControl.new()
max_container.max_size = Vector2(
max_width if max_width != null else -1,
max_height if max_height != null else -1
)
safe_add_child(website_container, max_container)
result_node = max_container
if label:
apply_styles_to_label(label, styles, element, parser)
return result_node
func apply_styles_to_label(label: RichTextLabel, styles: Dictionary, element: HTMLParser.HTMLElement, parser) -> void:
var text = element.get_bbcode_formatted_text(parser) # pass parser
var font_size = 24 # default
print("applying styles to: ", text)
print("applying styles to label: ", label.text, " | styles: ")
for child in styles:
print(child)
# Apply font size
if styles.has("font-size"):
font_size = int(styles["font-size"])
# Apply color
var color_tag = ""
if styles.has("color"):
var color = styles["color"] as Color
color_tag = "[color=#%s]" % color.to_html(false)
# Apply background color
var bg_color_tag = ""
var bg_color_close = ""
if styles.has("background-color"):
var bg_color = styles["background-color"] as Color
bg_color_tag = "[bgcolor=#%s]" % bg_color.to_html(false)
bg_color_close = "[/bgcolor]"
# Apply bold
var bold_open = ""
var bold_close = ""
if styles.has("font-bold") and styles["font-bold"]:
bold_open = "[b]"
bold_close = "[/b]"
# Apply italic
var italic_open = ""
var italic_close = ""
if styles.has("font-italic") and styles["font-italic"]:
italic_open = "[i]"
italic_close = "[/i]"
# Apply underline
var underline_open = ""
var underline_close = ""
if styles.has("underline") and styles["underline"]:
underline_open = "[u]"
underline_close = "[/u]"
# Apply monospace font
var mono_open = ""
var mono_close = ""
if styles.has("font-mono") and styles["font-mono"]:
mono_open = "[code]"
mono_close = "[/code]"
if styles.has("text-align"):
match styles["text-align"]:
"left":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT
"center":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
"right":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
"justify":
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_FILL
# Construct final text
var styled_text = "[font_size=%d]%s%s%s%s%s%s%s%s%s%s%s%s%s[/font_size]" % [
font_size,
bg_color_tag,
color_tag,
bold_open,
italic_open,
underline_open,
mono_open,
text,
mono_close,
underline_close,
italic_close,
bold_close,
"[/color]" if color_tag.length() > 0 else "",
bg_color_close
]
label.text = styled_text
func contains_hyperlink(element: HTMLParser.HTMLElement) -> bool:
if element.tag_name == "a":
return true
@@ -445,143 +119,133 @@ func contains_hyperlink(element: HTMLParser.HTMLElement) -> bool:
return false
func create_element_node(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> Control:
func create_element_node(element: HTMLParser.HTMLElement, parser: HTMLParser) -> Control:
var styles = parser.get_element_styles(element)
var is_flex_container = styles.has("display") and ("flex" in styles["display"])
var final_node: Control
var container_for_children: Node
# If this is an inline element AND not a flex container, do NOT recursively add child nodes for its children.
# Only create a node for the outermost inline group; nested inline tags are handled by BBCode.
if element.is_inline_element() and not is_flex_container:
final_node = await create_element_node_internal(element, parser)
if not final_node:
return null
final_node = StyleManager.apply_element_styles(final_node, element, parser)
# Flex item properties may still apply
StyleManager.apply_flex_item_properties(final_node, styles)
return final_node
if is_flex_container:
# The element's primary identity IS a flex container.
# We create it directly.
final_node = AUTO_SIZING_FLEX_CONTAINER.new()
final_node.name = "Flex_" + element.tag_name
container_for_children = final_node
# If the element itself has text (like <span style="flex">TEXT</span>)
if not element.text_content.is_empty():
var new_node = await create_element_node_internal(element, parser)
container_for_children.add_child(new_node)
else:
final_node = await create_element_node_internal(element, parser)
if not final_node:
return null # Unsupported tag
# Children will be added to this node.
container_for_children = final_node
# Applies background, size, etc. to the FlexContainer (top-level node)
final_node = StyleManager.apply_element_styles(final_node, element, parser)
# Apply flex CONTAINER properties if it's a flex container
if is_flex_container:
StyleManager.apply_flex_container_properties(final_node, styles)
# Apply flex ITEM properties
StyleManager.apply_flex_item_properties(final_node, styles)
# Add child elements (but NOT for ul/ol which handle their own children)
if element.tag_name != "ul" and element.tag_name != "ol":
for child_element in element.children:
# Only add child nodes if the child is NOT an inline element
# UNLESS the parent is a flex container (inline elements become flex items)
if not child_element.is_inline_element() or is_flex_container:
var child_node = await create_element_node(child_element, parser)
if child_node and is_instance_valid(container_for_children):
safe_add_child(container_for_children, child_node)
return final_node
func create_element_node_internal(element: HTMLParser.HTMLElement, parser: HTMLParser = null) -> Control:
var node: Control = null
match element.tag_name:
"p":
node = P.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"h1":
node = H1.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"h2":
node = H2.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"h3":
node = H3.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"h4":
node = H4.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"h5":
node = H5.instantiate()
node.init(element)
"h6":
node = H6.instantiate()
node.init(element)
"pre":
node = PRE.instantiate()
node.init(element)
"h1", "h2", "h3", "h4", "h5", "h6":
match element.tag_name:
"h1": node = H1.instantiate()
"h2": node = H2.instantiate()
"h3": node = H3.instantiate()
"h4": node = H4.instantiate()
"h5": node = H5.instantiate()
"h6": node = H6.instantiate()
node.init(element)
"br":
node = BR.instantiate()
node.init(element)
"img":
node = IMG.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"separator":
node = SEPARATOR.instantiate()
node.init(element)
"form":
node = FORM.instantiate()
node.init(element)
# Forms need to manually process their children
for child_element in element.children:
var child_node = await create_element_node(child_element)
if child_node:
node.add_child(child_node)
var child_node = await create_element_node(child_element, parser)
safe_add_child(node, child_node)
"input":
node = INPUT.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"button":
node = BUTTON.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"span":
"span", "b", "i", "u", "small", "mark", "code", "a":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"b":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"i":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"u":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"small":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"mark":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"code":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"a":
node = SPAN.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"ul":
node = UL.instantiate()
website_container.add_child(node) # Add to scene tree first
website_container.add_child(node)
await node.init(element)
return node # Return early since we already added it
return node
"ol":
node = OL.instantiate()
website_container.add_child(node) # Add to scene tree first
website_container.add_child(node)
await node.init(element)
return node # Return early since we already added it
return node
"li":
node = LI.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"select":
node = SELECT.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"option":
node = OPTION.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"textarea":
node = TEXTAREA.instantiate()
node.init(element)
if parser:
node = apply_element_styles(node, element, parser)
"div":
node = DIV.instantiate()
node.init(element)
_:
return null

View File

@@ -0,0 +1,81 @@
class_name IconAssets
static var icons_map
static var current_theme
static var color_conversion_map = {}
const flex_icons_sources = [
"AlignContentAroundRowIcon",
"AlignContentAroundColumnIcon",
"AlignContentBetweenRowIcon",
"AlignContentBetweenColumnIcon",
"AlignContentCenterRowIcon",
"AlignContentCenterColumnIcon",
"AlignContentEndRowIcon",
"AlignContentEndColumnIcon",
"AlignContentStartRowIcon",
"AlignContentStartColumnIcon",
"AlignContentStretchRowIcon",
"AlignContentStretchColumnIcon",
"AlignItemsBaselineColumnIcon",
"AlignItemsBaselineRowIcon",
"AlignItemsCenterColumnIcon",
"AlignItemsCenterRowIcon",
"AlignItemsEndColumnIcon",
"AlignItemsEndRowIcon",
"AlignItemsStartColumnIcon",
"AlignItemsStartRowIcon",
"AlignItemsStretchColumnIcon",
"AlignItemsStretchRowIcon",
"DisplayFlexRow",
"DisplayFlexColumn",
"ArrowReverseIcon",
"FlexWrapNoWrapColumnIcon",
"FlexWrapNoWrapRowIcon",
"FlexWrapWrapColumnIcon",
"FlexWrapWrapRowIcon",
"JustifyContentCenterColumnIcon",
"JustifyContentCenterRowIcon",
"JustifyContentEndColumnIcon",
"JustifyContentEndRowIcon",
"JustifyContentSpaceAroundColumnIcon",
"JustifyContentSpaceAroundRowIcon",
"JustifyContentSpaceBetweenColumnIcon",
"JustifyContentSpaceBetweenRowIcon",
"JustifyContentSpaceEvenlyColumnIcon",
"JustifyContentSpaceEvenlyRowIcon",
"JustifyContentStartColumnIcon",
"JustifyContentStartRowIcon",
]
static func get_icon(icon:String):
return icons_map[current_theme].get(icon)
#maybe bugs here, map should be initial here
static func generate_icons(dark_theme):
if icons_map == null:
icons_map = {}
if icons_map.has(dark_theme):
current_theme = dark_theme
return
if current_theme != dark_theme:
current_theme = dark_theme
icons_map[current_theme] = {}
var icon_theme = "dark" if dark_theme else "light"
for icon_name in flex_icons_sources:
icons_map[current_theme][icon_name] = load("res://addons/godot-flexbox/assets/%s/%s.svg" % [icon_theme, icon_name])
static func add_conversion_color_pair(p_from_color:String, p_to_color:String):
color_conversion_map[Color.html(p_from_color)] = Color.html(p_to_color)
static func conversion_color_pairs():
color_conversion_map = {}
add_conversion_color_pair("#d6d6d6", "#474747"); # Highlighted part
add_conversion_color_pair("#474747", "#d6d6d6"); # Background part

View File

@@ -0,0 +1 @@
uid://df0yh5hcurt8

View File

@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_12)">
<path d="M0 -4.76837e-07L0 16H1L1 -4.76837e-07H0ZM15 -4.76837e-07L15 16H16V-4.76837e-07H15ZM3 12L3 4H7L7 12H3ZM9 12V4H13V12H9Z" fill="#D6D6D6"/>
</g>
<defs>
<clipPath id="clip0_8_12">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 418 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d2l1kkssssaxp"
path="res://.godot/imported/AlignContentAroundColumnIcon.svg-17b7bde393ab6adaa268b2798824d09b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentAroundColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentAroundColumnIcon.svg-17b7bde393ab6adaa268b2798824d09b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceAroundColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 22.5H0V24h24v-1.5ZM6 4.5h12v6H6v-6ZM6 13.5h12v6H6v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 253 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cb1pyfu0vgkk1"
path="res://.godot/imported/AlignContentAroundRowIcon.svg-cba31d3e2cb2814c6c9754f54ba99e3f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentAroundRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentAroundRowIcon.svg-cba31d3e2cb2814c6c9754f54ba99e3f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_14)">
<path d="M0 -4.76837e-07L0 16H1L1 -4.76837e-07H0ZM15 -4.76837e-07L15 16H16V-4.76837e-07H15ZM2 12L2 4H6L6 12H2ZM10 12V4H14V12H10Z" fill="#D6D6D6"/>
</g>
<defs>
<clipPath id="clip0_8_14">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 420 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1tuprcke6b3q"
path="res://.godot/imported/AlignContentBetweenColumnIcon.svg-9afaff8eb0d52c831e9744a6274140d2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentBetweenColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentBetweenColumnIcon.svg-9afaff8eb0d52c831e9744a6274140d2.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceBetweenColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 22.5H0V24h24v-1.5ZM6 3h12v6H6V3ZM6 15h12v6H6v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 249 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b3vvj6nsa3elh"
path="res://.godot/imported/AlignContentBetweenRowIcon.svg-158985a6f23611020a314ec7766b2774.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentBetweenRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentBetweenRowIcon.svg-158985a6f23611020a314ec7766b2774.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0V16H9V0H8ZM3 12L3 4H7L7 12H3ZM10 12V4H14V12H10Z" fill="#D6D6D6"/>
</svg>

After

Width:  |  Height:  |  Size: 182 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clevjexvw81s2"
path="res://.godot/imported/AlignContentCenterColumnIcon.svg-08aa103afcf470f41a749b0fb2d99d82.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentCenterColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentCenterColumnIcon.svg-08aa103afcf470f41a749b0fb2d99d82.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M16 8H0v1h16V8ZM4 3h8v4H4V3ZM4 10h8v4H4v-4Z"/></svg>

After

Width:  |  Height:  |  Size: 151 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfh1fayri054d"
path="res://.godot/imported/AlignContentCenterRowIcon.svg-b53ff1cff2db32cd9dbc50e9faa97318.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentCenterRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentCenterRowIcon.svg-b53ff1cff2db32cd9dbc50e9faa97318.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,15 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_6)">
<mask id="mask0_8_6" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
<path d="M0 16L0 0L16 0V16H0Z" fill="white"/>
</mask>
<g mask="url(#mask0_8_6)">
<path d="M15 0L15 16H16V0H15ZM5 12L5 4H9V12H5ZM10 12V4H14V12H10Z" fill="#D6D6D6"/>
</g>
</g>
<defs>
<clipPath id="clip0_8_6">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 552 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://buai0bv8miqrx"
path="res://.godot/imported/AlignContentEndColumnIcon.svg-05770fba0491527fd1aa0f93463055f7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentEndColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentEndColumnIcon.svg-05770fba0491527fd1aa0f93463055f7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><g fill="#d6d6d6" clip-path="url(#a)"><path d="M16 15H0v1h16v-1ZM4 5h8v4H4V5ZM4 10h8v4H4v-4Z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 258 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpwkqbay3gfi7"
path="res://.godot/imported/AlignContentEndRowIcon.svg-16c42695d544572c28c7a549c03ef6e5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentEndRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentEndRowIcon.svg-16c42695d544572c28c7a549c03ef6e5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 0L1 16H2L2 0H1ZM3 12L3 4H7L7 12H3ZM8 12V4H12V12H8Z" fill="#D6D6D6"/>
</svg>

After

Width:  |  Height:  |  Size: 184 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgh1u6p45ydad"
path="res://.godot/imported/AlignContentStartColumnIcon.svg-c7a947a2f05d8cac15b8ee078ffcd394.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStartColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentStartColumnIcon.svg-c7a947a2f05d8cac15b8ee078ffcd394.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M16 1H0v1h16V1ZM4 3h8v4H4V3ZM4 8h8v4H4V8Z"/></svg>

After

Width:  |  Height:  |  Size: 149 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2hof4hdg1idm"
path="res://.godot/imported/AlignContentStartRowIcon.svg-87b04e46a18453a15fb124940ed848bf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStartRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentStartRowIcon.svg-87b04e46a18453a15fb124940ed848bf.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,15 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_16)">
<mask id="mask0_8_16" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
<path d="M0 16L0 0L16 0V16H0Z" fill="white"/>
</mask>
<g mask="url(#mask0_8_16)">
<path d="M0 0L0 16H1L1 0H0ZM15 0L15 16H16V0H15ZM1.5 12L1.5 4H7L7 12H1.5ZM9 12V4H14.5V12H9Z" fill="#D6D6D6"/>
</g>
</g>
<defs>
<clipPath id="clip0_8_16">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 582 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cn28p8262kj8c"
path="res://.godot/imported/AlignContentStretchColumnIcon.svg-2138f6a1dd3cd0e6c36dc134e4b05be4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStretchColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentStretchColumnIcon.svg-2138f6a1dd3cd0e6c36dc134e4b05be4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><g fill="#d6d6d6" clip-path="url(#a)"><path d="M16 0H0v1h16V0ZM16 15H0v1h16v-1ZM4 1.5h8V7H4V1.5ZM4 9h8v5.5H4V9Z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 277 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://mjhhl7uu0oe4"
path="res://.godot/imported/AlignContentStretchRowIcon.svg-a266e80aa9bb8b02b559638407561029.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStretchRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentStretchRowIcon.svg-a266e80aa9bb8b02b559638407561029.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsBaselineColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" fill-rule="evenodd" d="M12 0h-1.5v4.5h-6v6h6V12h-6v6h6v6H12v-6h3v-6h-3v-1.5h6v-6h-6V0Zm-1.5 16.5v-3H6v3h4.5Zm0-7.5V6H6v3h4.5Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 314 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cmyap54y4yo35"
path="res://.godot/imported/AlignItemsBaselineColumnIcon.svg-12db9ba8b1c5af2f67b4496f15d2a1b5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsBaselineColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsBaselineColumnIcon.svg-12db9ba8b1c5af2f67b4496f15d2a1b5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsBaselineRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" fill-rule="evenodd" d="M12 4.5h6v6h6V12h-6v3h-6v-3h-1.5v6h-6v-6H0v-1.5h4.5v-6h6v6H12v-6Zm1.5 6h3V6h-3v4.5Zm-4.5 0V6H6v4.5h3Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 310 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://daysqt8ngikir"
path="res://.godot/imported/AlignItemsBaselineRowIcon.svg-ee5f5f80c57ab0b9c1bb8a5acf7a7ff6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsBaselineRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsBaselineRowIcon.svg-ee5f5f80c57ab0b9c1bb8a5acf7a7ff6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsCenterColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M12 0h-1.5v4.5h-6v6h6V12H6v6h4.5v6H12v-6h4.5v-6H12v-1.5h6v-6h-6V0Z"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://i3yof2smssw7"
path="res://.godot/imported/AlignItemsCenterColumnIcon.svg-ab2ddd42e3b55aa9dcfb797f6664ebbf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsCenterColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsCenterColumnIcon.svg-ab2ddd42e3b55aa9dcfb797f6664ebbf.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsCenterRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M4.5 4.5h6v6H12V6h6v4.5h6V12h-6v4.5h-6V12h-1.5v6h-6v-6H0v-1.5h4.5v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dv74mug5v87k6"
path="res://.godot/imported/AlignItemsCenterRowIcon.svg-c0171f6e84379dae8f5d5cca5e70651b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsCenterRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsCenterRowIcon.svg-c0171f6e84379dae8f5d5cca5e70651b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsEndColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0h-1.5v24H24V0ZM9 4.5h12v6H9v-6ZM12 12h9v6h-9v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 220 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cv0qfpmcerq8t"
path="res://.godot/imported/AlignItemsEndColumnIcon.svg-0b1bec61efada17b6ef38f636a37118d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsEndColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsEndColumnIcon.svg-0b1bec61efada17b6ef38f636a37118d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsEndRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M10.5 9h-6v12h6V9ZM18 12h-6v9h6v-9ZM0 24v-1.5h24V24H0Z"/></svg>

After

Width:  |  Height:  |  Size: 218 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://uyy8l6dk5r4k"
path="res://.godot/imported/AlignItemsEndRowIcon.svg-78e2def3804324657d53b0434695fc5d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsEndRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsEndRowIcon.svg-78e2def3804324657d53b0434695fc5d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsStartColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M1.5 0H0v24h1.5V0ZM3 4.5h12v6H3v-6ZM3 12h9v6H3v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 219 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fwuvoi0hdms0"
path="res://.godot/imported/AlignItemsStartColumnIcon.svg-b03da1dff93ac7771c712ddf441e5466.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStartColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStartColumnIcon.svg-b03da1dff93ac7771c712ddf441e5466.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#d6d6d6" data-wf-icon="AlignItemsStartRowIcon" viewBox="0 0 24 24"><path d="M0 0h24v1.5H0V0ZM10.5 3h-6v12h6V3ZM18 3h-6v9h6V3Z"/></svg>

After

Width:  |  Height:  |  Size: 203 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://csb7tfc5p5bhm"
path="res://.godot/imported/AlignItemsStartRowIcon.svg-2c1c6961d68a00a806c5094555410a31.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStartRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStartRowIcon.svg-2c1c6961d68a00a806c5094555410a31.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsStretchColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" stroke="#d6d6d6" d="M3.75 5.25h16.5v4.5H3.75v-4.5Zm0 7.5h16.5v4.5H3.75v-4.5Z"/><path fill="#d6d6d6" d="M0 0h1.5v24H0V0Zm22.5 0H24v24h-1.5V0Z"/></svg>

After

Width:  |  Height:  |  Size: 308 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cf81mj2tgw2b5"
path="res://.godot/imported/AlignItemsStretchColumnIcon.svg-ecf2a24725ab2745508c65d0c3fa73a7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStretchColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStretchColumnIcon.svg-ecf2a24725ab2745508c65d0c3fa73a7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsStretchRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 24v-1.5H0V24h24ZM4.5 3h6v18h-6V3ZM12 3h6v18h-6V3Z"/></svg>

After

Width:  |  Height:  |  Size: 238 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://qw8gc5s41jag"
path="res://.godot/imported/AlignItemsStretchRowIcon.svg-9b7b56f1bb1014d12909ed7e17069829.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStretchRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStretchRowIcon.svg-9b7b56f1bb1014d12909ed7e17069829.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="ArrowReverseIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" fill-rule="evenodd" d="m16.485 6 .015-4.5-6 6 6 6-.015-4.5V6ZM22.5 6h-6v3h6V6ZM7.515 15 7.5 10.5l6 6-6 6 .015-4.5v-3ZM1.5 18h6v-3h-6v3Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 312 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c5lajpvqkfcv2"
path="res://.godot/imported/ArrowReverseIcon.svg-693bd0370d26679b76ee3608e9c4045e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/ArrowReverseIcon.svg"
dest_files=["res://.godot/imported/ArrowReverseIcon.svg-693bd0370d26679b76ee3608e9c4045e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg width="16" height="16" aria-hidden="true" class="bem-Svg" data-icon="DisplayFlex" style="display:block"><path fill="#d6d6d6" fill-rule="evenodd" d="M2 2h12v12H2V2zM1 1h14v14H1V1z" clip-rule="evenodd" opacity=".6"/><path fill="#d6d6d6" fill-rule="evenodd" d="M7 4H4v8h3V4zm2 0h3v8H9V4z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 318 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c8x3hek74tddw"
path="res://.godot/imported/DisplayFlexColumn.svg-9fb088e3aea8789b5fbc455f02b614a7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/DisplayFlexColumn.svg"
dest_files=["res://.godot/imported/DisplayFlexColumn.svg-9fb088e3aea8789b5fbc455f02b614a7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" fill="none"><g><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g fill-rule="evenodd" mask="url(#b)"><path d="M2 14h12V2H2zM1 1h14v14H1z" opacity=".6" style="fill:#919191"/><path d="M12 7H4V4h8zm0 2v3H4V9z" style="fill:#d6d6d6"/></g></g><defs><path id="a" d="M0 0h16v16H0z"/></defs></svg>

After

Width:  |  Height:  |  Size: 400 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2xodbt05umvh"
path="res://.godot/imported/DisplayFlexRow.svg-ef4eb78c813528e12d55e4b37a753a01.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/DisplayFlexRow.svg"
dest_files=["res://.godot/imported/DisplayFlexRow.svg-ef4eb78c813528e12d55e4b37a753a01.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M5 15v-3h6v3zM5 5V2h6v3z"/><path stroke="#d6d6d6" d="M5.5 9.5v-2h5v2z"/></svg>

After

Width:  |  Height:  |  Size: 177 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfpwpkwc4qfsc"
path="res://.godot/imported/FlexWrapNoWrapColumnIcon.svg-1a0c68d7c077fa1651c1c62b2c35e0f5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/FlexWrapNoWrapColumnIcon.svg"
dest_files=["res://.godot/imported/FlexWrapNoWrapColumnIcon.svg-1a0c68d7c077fa1651c1c62b2c35e0f5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M1 5h3v6H1zM11 5h3v6h-3z"/><path stroke="#d6d6d6" d="M6.5 5.5h2v5h-2z"/></svg>

After

Width:  |  Height:  |  Size: 177 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqhbh3ko4igdy"
path="res://.godot/imported/FlexWrapNoWrapRowIcon.svg-6a6e67f3589c8062f614346cb3b32d5a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/FlexWrapNoWrapRowIcon.svg"
dest_files=["res://.godot/imported/FlexWrapNoWrapRowIcon.svg-6a6e67f3589c8062f614346cb3b32d5a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path stroke="#d6d6d6" d="M9.5 14.5v-2h5v2zM9.5 4.5v-2h5v2z"/><path fill="#d6d6d6" d="M9 10V7h6v3zM1 15v-3h6v3zM1 5V2h6v3z"/><path stroke="#d6d6d6" d="M1.5 9.5v-2h5v2z"/></svg>

After

Width:  |  Height:  |  Size: 251 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://shf5a4lgmjli"
path="res://.godot/imported/FlexWrapWrapColumnIcon.svg-9cc96abc98f89b3767c8fffe67a41432.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/FlexWrapWrapColumnIcon.svg"
dest_files=["res://.godot/imported/FlexWrapWrapColumnIcon.svg-9cc96abc98f89b3767c8fffe67a41432.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path stroke="#d6d6d6" d="M1.5 9.5h2v5h-2zM11.5 9.5h2v5h-2z"/><path fill="#d6d6d6" d="M6 9h3v6H6zM1 1h3v6H1zM11 1h3v6h-3z"/><path stroke="#d6d6d6" d="M6.5 1.5h2v5h-2z"/></svg>

After

Width:  |  Height:  |  Size: 250 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://8n0yyxrr1pno"
path="res://.godot/imported/FlexWrapWrapRowIcon.svg-0f7b98c48acc1634f334dae13a7ee95b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/FlexWrapWrapRowIcon.svg"
dest_files=["res://.godot/imported/FlexWrapWrapRowIcon.svg-0f7b98c48acc1634f334dae13a7ee95b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentCenterColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M6 3h12v6H6V3ZM6 13.5h12v6H6v-6ZM24 10.5H0V12h24v-1.5Z"/></svg>

After

Width:  |  Height:  |  Size: 228 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bsx27gd0ja8lw"
path="res://.godot/imported/JustifyContentCenterColumnIcon.svg-accf8e59f9796ffb1efa272c77c23e10.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentCenterColumnIcon.svg"
dest_files=["res://.godot/imported/JustifyContentCenterColumnIcon.svg-accf8e59f9796ffb1efa272c77c23e10.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentCenterRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M12 0h-1.5v24H12V0ZM3 6h6v12H3V6ZM13.5 6h6v12h-6V6Z"/></svg>

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bi5kl220r8lv0"
path="res://.godot/imported/JustifyContentCenterRowIcon.svg-3e0a34413a4f54b2eadecd6a77c23b7c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentCenterRowIcon.svg"
dest_files=["res://.godot/imported/JustifyContentCenterRowIcon.svg-3e0a34413a4f54b2eadecd6a77c23b7c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentEndColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M6 7.5h12v6H6v-6ZM6 15h12v6H6v-6ZM24 22.5H0V24h24v-1.5Z"/></svg>

After

Width:  |  Height:  |  Size: 226 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dljvexaavrypt"
path="res://.godot/imported/JustifyContentEndColumnIcon.svg-24bea85f06d9bb753047b623509c4165.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentEndColumnIcon.svg"
dest_files=["res://.godot/imported/JustifyContentEndColumnIcon.svg-24bea85f06d9bb753047b623509c4165.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentEndRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M22.5 0H24v24h-1.5V0ZM13.5 6h-6v12h6V6ZM21 6h-6v12h6V6Z"/></svg>

After

Width:  |  Height:  |  Size: 223 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ddqsn7agtl6pn"
path="res://.godot/imported/JustifyContentEndRowIcon.svg-ce50017de708c2f87254fa5076d636a0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentEndRowIcon.svg"
dest_files=["res://.godot/imported/JustifyContentEndRowIcon.svg-ce50017de708c2f87254fa5076d636a0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceAroundColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 22.5H0V24h24v-1.5ZM6 4.5h12v6H6v-6ZM6 13.5h12v6H6v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 253 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://pu6etw6b3oba"
path="res://.godot/imported/JustifyContentSpaceAroundColumnIcon.svg-bdb07b48ea99ef0796b795f21084c1c5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentSpaceAroundColumnIcon.svg"
dest_files=["res://.godot/imported/JustifyContentSpaceAroundColumnIcon.svg-bdb07b48ea99ef0796b795f21084c1c5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceAroundRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0h-1.5v24H24V0ZM1.5 0H0v24h1.5V0ZM4.5 6h6v12h-6V6ZM13.5 6h6v12h-6V6Z"/></svg>

After

Width:  |  Height:  |  Size: 248 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://be7eq58hdnrc6"
path="res://.godot/imported/JustifyContentSpaceAroundRowIcon.svg-977089142de0b372b82d9e3ac5adc4d2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentSpaceAroundRowIcon.svg"
dest_files=["res://.godot/imported/JustifyContentSpaceAroundRowIcon.svg-977089142de0b372b82d9e3ac5adc4d2.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceBetweenColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 22.5H0V24h24v-1.5ZM6 3h12v6H6V3ZM6 15h12v6H6v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 249 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://t3r0ja1j3ipq"
path="res://.godot/imported/JustifyContentSpaceBetweenColumnIcon.svg-d4fa6a9009ecb6fc68cd7018813cabd8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentSpaceBetweenColumnIcon.svg"
dest_files=["res://.godot/imported/JustifyContentSpaceBetweenColumnIcon.svg-d4fa6a9009ecb6fc68cd7018813cabd8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceBetweenRowReverseIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0h-1.5v24H24V0ZM1.5 0H0v24h1.5V0ZM3 6h6v12H3V6ZM15 6h6v12h-6V6Z"/></svg>

After

Width:  |  Height:  |  Size: 251 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nc21g00imy6k"
path="res://.godot/imported/JustifyContentSpaceBetweenRowIcon.svg-51ac13a232d207876cb9aed9df479a5a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/JustifyContentSpaceBetweenRowIcon.svg"
dest_files=["res://.godot/imported/JustifyContentSpaceBetweenRowIcon.svg-51ac13a232d207876cb9aed9df479a5a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

Some files were not shown because too many files have changed in this diff Show More