aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/Head.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/Head.zig')
-rw-r--r--src/frontend/Head.zig58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/frontend/Head.zig b/src/frontend/Head.zig
new file mode 100644
index 0000000..0eb090f
--- /dev/null
+++ b/src/frontend/Head.zig
@@ -0,0 +1,58 @@
+const File = @import("File.zig");
+const Component = @import("Component.zig");
+
+const z_component_code: File.Script = .minify("z-component.js");
+
+pub const Meta = struct {
+ name: []const u8,
+ content: []const u8,
+
+ pub fn to_html_string(comptime self: @This()) []const u8 {
+ return "<meta name=\"" ++ self.name ++ "\" content=\"" ++ self.content ++ "\">";
+ }
+};
+
+title: []const u8,
+meta: []const Meta,
+
+pub const empty: @This() = .{
+ .title = "",
+ .meta = &.{},
+};
+
+pub fn default(comptime title: []const u8) @This() {
+ return .{
+ .title = title,
+ .meta = &.{
+ .{
+ .name = "viewport",
+ .content = "width=device-width, initial-scale=1.0",
+ },
+ },
+ };
+}
+
+pub fn to_html_string(
+ comptime self: @This(),
+ comptime components: []const Component,
+ comptime styles: []const File.Style,
+) []const u8 {
+ var content: []const u8 = "<head>" ++ z_component_code.to_html_string();
+
+ content = content ++ "<title>" ++ self.title ++ "</title>";
+
+ inline for (components) |component| {
+ content = content ++ comptime component.to_html_string();
+ }
+
+ inline for (styles) |style| {
+ content = content ++ comptime style.to_html_string();
+ }
+
+ inline for (self.meta) |meta| {
+ content = content ++ comptime meta.to_html_string();
+ }
+
+ content = content ++ "</head>";
+ return content;
+}