diff --git a/LibHTML/CSS/Selector.cpp b/LibHTML/CSS/Selector.cpp
new file mode 100644
index 0000000000..de7a87d1d4
--- /dev/null
+++ b/LibHTML/CSS/Selector.cpp
@@ -0,0 +1,9 @@
+#include
+
+Selector::Selector()
+{
+}
+
+Selector::~Selector()
+{
+}
diff --git a/LibHTML/CSS/Selector.h b/LibHTML/CSS/Selector.h
new file mode 100644
index 0000000000..cc87e34653
--- /dev/null
+++ b/LibHTML/CSS/Selector.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include
+#include
+
+class Selector {
+public:
+ Selector();
+ ~Selector();
+
+ struct Component {
+ enum class Type { Invalid, TagName, Id, Class };
+ Type type { Type::Invalid };
+ String value;
+ };
+
+ const Vector& components() const { return m_components; }
+
+private:
+ Vector m_components;
+};
diff --git a/LibHTML/CSS/StyleDeclaration.cpp b/LibHTML/CSS/StyleDeclaration.cpp
new file mode 100644
index 0000000000..187c6ab766
--- /dev/null
+++ b/LibHTML/CSS/StyleDeclaration.cpp
@@ -0,0 +1,9 @@
+#include
+
+StyleDeclaration::StyleDeclaration()
+{
+}
+
+StyleDeclaration::~StyleDeclaration()
+{
+}
diff --git a/LibHTML/CSS/StyleDeclaration.h b/LibHTML/CSS/StyleDeclaration.h
new file mode 100644
index 0000000000..558e084925
--- /dev/null
+++ b/LibHTML/CSS/StyleDeclaration.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include
+#include
+
+class StyleDeclaration {
+public:
+ StyleDeclaration();
+ ~StyleDeclaration();
+
+ const String& property_name() const { return m_property_name; }
+ const StyleValue& value() const { return *m_value; }
+
+public:
+ String m_property_name;
+ RetainPtr m_value;
+};
diff --git a/LibHTML/CSS/StyleRule.cpp b/LibHTML/CSS/StyleRule.cpp
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/LibHTML/CSS/StyleRule.h b/LibHTML/CSS/StyleRule.h
new file mode 100644
index 0000000000..657d851d95
--- /dev/null
+++ b/LibHTML/CSS/StyleRule.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include
+#include
+#include
+
+class StyleRule {
+public:
+ StyleRule();
+ ~StyleRule();
+
+private:
+ Vector m_selectors;
+ Vector m_declarations;
+};
diff --git a/LibHTML/CSS/StyleSheet.cpp b/LibHTML/CSS/StyleSheet.cpp
new file mode 100644
index 0000000000..840b46835b
--- /dev/null
+++ b/LibHTML/CSS/StyleSheet.cpp
@@ -0,0 +1,9 @@
+#include
+
+StyleSheet::StyleSheet()
+{
+}
+
+StyleSheet::~StyleSheet()
+{
+}
diff --git a/LibHTML/CSS/StyleSheet.h b/LibHTML/CSS/StyleSheet.h
new file mode 100644
index 0000000000..7089b59e67
--- /dev/null
+++ b/LibHTML/CSS/StyleSheet.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include
+#include
+
+class StyleSheet {
+public:
+ StyleSheet();
+ ~StyleSheet();
+
+ const Vector& rules() const { return m_rules; }
+
+private:
+ Vector m_rules;
+};
diff --git a/LibHTML/CSS/StyleValue.cpp b/LibHTML/CSS/StyleValue.cpp
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/LibHTML/CSS/StyleValue.h b/LibHTML/CSS/StyleValue.h
new file mode 100644
index 0000000000..1796f86b0b
--- /dev/null
+++ b/LibHTML/CSS/StyleValue.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include
+
+class StyleValue : public Retainable {
+public:
+ virtual ~StyleValue();
+
+ enum Type {
+ Invalid,
+ Inherit,
+ Initial,
+ Primitive,
+ };
+
+ Type type() const { return m_type; }
+
+protected:
+ explicit StyleValue(Type);
+
+private:
+ Type m_type { Type::Invalid };
+};
diff --git a/LibHTML/Makefile b/LibHTML/Makefile
index 1b068adc31..1e3039fb72 100644
--- a/LibHTML/Makefile
+++ b/LibHTML/Makefile
@@ -6,6 +6,11 @@ LIBHTML_OBJS = \
DOM/Element.o \
DOM/Document.o \
DOM/Text.o \
+ CSS/Selector.o \
+ CSS/StyleSheet.o \
+ CSS/StyleRule.o \
+ CSS/StyleDeclaration.o \
+ CSS/StyleValue.o \
Parser/Parser.o \
Layout/LayoutNode.o \
Layout/LayoutText.o \