From 7d7750a95c37a2ced11de8a1e5d5086e9f0385c7 Mon Sep 17 00:00:00 2001 From: johan0A Date: Tue, 7 Jan 2025 16:59:33 +0100 Subject: [PATCH] improved clay-official-website example --- examples/clay-official-website/src/main.zig | 89 +++++++++++------- .../src/resources/zig-mark.png | Bin 0 -> 18023 bytes 2 files changed, 56 insertions(+), 33 deletions(-) create mode 100644 examples/clay-official-website/src/resources/zig-mark.png diff --git a/examples/clay-official-website/src/main.zig b/examples/clay-official-website/src/main.zig index acac526..965ca63 100644 --- a/examples/clay-official-website/src/main.zig +++ b/examples/clay-official-website/src/main.zig @@ -9,6 +9,7 @@ var checkImage2: rl.Texture2D = undefined; var checkImage3: rl.Texture2D = undefined; var checkImage4: rl.Texture2D = undefined; var checkImage5: rl.Texture2D = undefined; +var zig_logo_image6: rl.Texture2D = undefined; const FONT_ID_BODY_16 = 0; const FONT_ID_TITLE_56 = 9; @@ -31,6 +32,7 @@ const COLOR_ORANGE = cl.Color{ 225, 138, 50, 255 }; const COLOR_BLUE = cl.Color{ 111, 173, 162, 255 }; const COLOR_TEAL = cl.Color{ 111, 173, 162, 255 }; const COLOR_BLUE_DARK = cl.Color{ 2, 32, 82, 255 }; +const COLOR_ZIG_LOGO = cl.Color{ 247, 164, 29, 255 }; // Colors for top stripe const COLORS_TOP_BORDER = [_]cl.Color{ @@ -52,17 +54,17 @@ const border_data = cl.BorderData{ .width = 2, .color = COLOR_RED }; var window_height: isize = 0; var window_width: isize = 0; -fn LandingPageBlob(index: u32, font_size: u16, font_id: u16, color: cl.Color, text: []const u8, image: *rl.Texture2D) void { +fn LandingPageBlob(index: u32, font_size: u16, font_id: u16, color: cl.Color, image_size: f32, max_width: f32, text: []const u8, image: *rl.Texture2D) void { cl.UI(&.{ .IDI("HeroBlob", index), - .layout(.{ .sizing = .{ .w = .growMinMax(.{ .max = 480 }) }, .padding = .all(16), .gap = 16, .alignment = .{ .y = .CENTER } }), + .layout(.{ .sizing = .{ .w = .growMinMax(.{ .max = max_width }) }, .padding = .all(16), .gap = 16, .alignment = .{ .y = .CENTER } }), .border(.outside(color, 2, 10)), }); { defer cl.CLOSE(); cl.UI(&.{ .IDI("CheckImage", index), - .layout(.{ .sizing = .{ .w = .fixed(32) } }), + .layout(.{ .sizing = .{ .w = .fixed(image_size) } }), .image(.{ .image_data = image, .source_dimensions = .{ .w = 128, .h = 128 } }), }); cl.CLOSE(); @@ -84,40 +86,59 @@ fn landingPageDesktop() void { defer cl.CLOSE(); cl.UI(&.{ .ID("LandingPage1"), - .layout(.{ .sizing = .grow, .alignment = .{ .y = .CENTER }, .padding = .all(32), .gap = 32 }), + .layout(.{ + .sizing = .{ .w = .grow, .h = .fitMinMax(.{ .min = @floatFromInt(window_height - 70) }) }, + .direction = .TOP_TO_BOTTOM, + .alignment = .{ .x = .CENTER }, + .padding = .all(32), + .gap = 32, + }), .border(.{ .left = border_data, .right = border_data }), }); { defer cl.CLOSE(); - cl.UI(&.{ - .ID("LeftText"), - .layout(.{ .sizing = .{ .w = .percent(0.55) }, .direction = .TOP_TO_BOTTOM, .gap = 8 }), - }); - { - defer cl.CLOSE(); - cl.text( - "Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance.", - cl.Config.text(.{ .font_size = 56, .font_id = FONT_ID_TITLE_56, .color = COLOR_RED }), - ); - cl.UI(&.{ .ID("Spacer"), .layout(.{ .sizing = .{ .w = .grow, .h = .fixed(32) } }) }); - cl.CLOSE(); - cl.text( - "Clay is laying out this webpage .right now!", - cl.Config.text(.{ .font_size = 36, .font_id = FONT_ID_BODY_36, .color = COLOR_ORANGE }), - ); - } + LandingPageBlob(1, 30, FONT_ID_BODY_30, COLOR_ZIG_LOGO, 64, 510, "The official Clay website recreated with zclay: clay-zig-bindings", &zig_logo_image6); cl.UI(&.{ - .ID("HeroImageOuter"), - .layout(.{ .sizing = .{ .w = .percent(0.45) }, .direction = .TOP_TO_BOTTOM, .alignment = .{ .x = .CENTER }, .gap = 16 }), + .ID("ClayPresentation"), + .layout(.{ + .sizing = .grow, + .alignment = .{ .y = .CENTER }, + .gap = 16, + }), }); { defer cl.CLOSE(); - LandingPageBlob(1, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_5, "High performance", &checkImage5); - LandingPageBlob(2, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_4, "Flexbox-style responsive layout", &checkImage4); - LandingPageBlob(3, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_3, "Declarative syntax", &checkImage3); - LandingPageBlob(4, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_2, "Single .h file for C/C++", &checkImage2); - LandingPageBlob(5, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_1, "Compile to 15kb .wasm", &checkImage1); + cl.UI(&.{ + .ID("LeftText"), + .layout(.{ .sizing = .{ .w = .percent(0.55) }, .direction = .TOP_TO_BOTTOM, .gap = 8 }), + }); + { + defer cl.CLOSE(); + cl.text( + "Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance.", + cl.Config.text(.{ .font_size = 56, .font_id = FONT_ID_TITLE_56, .color = COLOR_RED }), + ); + cl.UI(&.{ .ID("Spacer"), .layout(.{ .sizing = .{ .w = .grow, .h = .fixed(32) } }) }); + cl.CLOSE(); + cl.text( + "Clay is laying out this webpage .right now!", + cl.Config.text(.{ .font_size = 36, .font_id = FONT_ID_BODY_36, .color = COLOR_ORANGE }), + ); + } + + cl.UI(&.{ + .ID("HeroImageOuter"), + .layout(.{ .sizing = .{ .w = .percent(0.45) }, .direction = .TOP_TO_BOTTOM, .alignment = .{ .x = .CENTER }, .gap = 16 }), + }); + { + defer cl.CLOSE(); + LandingPageBlob(1, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_5, 32, 480, "High performance", &checkImage5); + LandingPageBlob(2, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_4, 32, 480, "Flexbox-style responsive layout", &checkImage4); + LandingPageBlob(3, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_3, 32, 480, "Declarative syntax", &checkImage3); + LandingPageBlob(4, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_2, 32, 480, "Single .h file for C/C++", &checkImage2); + LandingPageBlob(5, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_1, 32, 480, "Compile to 15kb .wasm", &checkImage1); + } } } } @@ -136,6 +157,7 @@ fn landingPageMobile() void { }); { defer cl.CLOSE(); + LandingPageBlob(1, 30, FONT_ID_BODY_30, COLOR_ZIG_LOGO, 64, 510, "The official Clay website recreated with zclay: clay-zig-bindings", &zig_logo_image6); cl.UI(&.{ .ID("LeftText"), .layout(.{ .sizing = .{ .w = .grow }, .direction = .TOP_TO_BOTTOM, .gap = 8 }), @@ -160,11 +182,11 @@ fn landingPageMobile() void { }); { defer cl.CLOSE(); - LandingPageBlob(1, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_5, "High performance", &checkImage5); - LandingPageBlob(2, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_4, "Flexbox-style responsive layout", &checkImage4); - LandingPageBlob(3, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_3, "Declarative syntax", &checkImage3); - LandingPageBlob(4, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_2, "Single .h file for C/C++", &checkImage2); - LandingPageBlob(5, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_1, "Compile to 15kb .wasm", &checkImage1); + LandingPageBlob(1, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_5, 32, 480, "High performance", &checkImage5); + LandingPageBlob(2, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_4, 32, 480, "Flexbox-style responsive layout", &checkImage4); + LandingPageBlob(3, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_3, 32, 480, "Declarative syntax", &checkImage3); + LandingPageBlob(4, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_2, 32, 480, "Single .h file for C/C++", &checkImage2); + LandingPageBlob(5, 30, FONT_ID_BODY_30, COLOR_BLOB_BORDER_1, 32, 480, "Compile to 15kb .wasm", &checkImage1); } } } @@ -651,6 +673,7 @@ pub fn main() anyerror!void { checkImage3 = loadImage("resources/check_3.png"); checkImage4 = loadImage("resources/check_4.png"); checkImage5 = loadImage("resources/check_5.png"); + zig_logo_image6 = loadImage("resources/zig-mark.png"); var animation_lerp_value: f32 = -1.0; var debug_mode_enabled = false; diff --git a/examples/clay-official-website/src/resources/zig-mark.png b/examples/clay-official-website/src/resources/zig-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..48c1c8309f681bd3fdae9b449a0815ea366db1e2 GIT binary patch literal 18023 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