From d87c5e1658c9b85684c7ca2c0f52e687f2299ff9 Mon Sep 17 00:00:00 2001 From: Nic Barker Date: Fri, 31 Jan 2025 15:02:49 +1300 Subject: [PATCH] Migrate official website to new API --- .../build/clay/index.html | 50 +++-- .../build/clay/index.wasm | Bin 169842 -> 111977 bytes examples/clay-official-website/index.html | 50 +++-- examples/clay-official-website/main.c | 208 +++++++++--------- 4 files changed, 165 insertions(+), 143 deletions(-) diff --git a/examples/clay-official-website/build/clay/index.html b/examples/clay-official-website/build/clay/index.html index f168175..0eab546 100644 --- a/examples/clay-official-website/build/clay/index.html +++ b/examples/clay-official-website/build/clay/index.html @@ -113,7 +113,6 @@ ]}; let rectangleConfigDefinition = { name: 'rectangle', type: 'struct', members: [ { name: 'color', ...colorDefinition }, - { name: 'cornerRadius', ...cornerRadiusDefinition }, { name: 'link', ...stringDefinition }, { name: 'cursorPointer', type: 'uint8_t' }, ]}; @@ -123,7 +122,6 @@ { name: 'top', ...borderDefinition }, { name: 'bottom', ...borderDefinition }, { name: 'betweenChildren', ...borderDefinition }, - { name: 'cornerRadius', ...cornerRadiusDefinition } ]}; let textConfigDefinition = { name: 'text', type: 'struct', members: [ { name: 'textColor', ...colorDefinition }, @@ -149,6 +147,9 @@ let customConfigDefinition = { name: 'custom', type: 'struct', members: [ { name: 'customData', type: 'uint32_t' }, ]} + let sharedConfigDefinition = { name: 'shared', type: 'struct', members: [ + { name: 'cornerRadius', ...cornerRadiusDefinition }, + ]}; let renderCommandDefinition = { name: 'CLay_RenderCommand', type: 'struct', @@ -160,7 +161,10 @@ { name: 'height', type: 'float' }, ]}, { name: 'config', type: 'uint32_t'}, - { name: 'text', ...stringSliceDefinition }, + { name: 'textOrSharedConfig', type: 'union', members: [ + { name: 'text', ...stringSliceDefinition }, + { name: 'sharedConfig', type: 'uint32_t' } + ]}, { name: 'zIndex', type: 'int32_t' }, { name: 'id', type: 'uint32_t' }, { name: 'commandType', type: 'uint32_t', }, @@ -378,7 +382,7 @@ let isMultiConfigElement = previousId === renderCommand.id.value; if (!elementCache[renderCommand.id.value]) { let elementType = 'div'; - switch (renderCommand.commandType.value) { + switch (renderCommand.commandType.value & 0xff) { case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { if (readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition).link.length.value > 0) { elementType = 'a'; @@ -386,6 +390,7 @@ break; } case CLAY_RENDER_COMMAND_TYPE_IMAGE: { + console.log('test5'); elementType = 'img'; break; } default: break; @@ -439,6 +444,7 @@ } case (CLAY_RENDER_COMMAND_TYPE_RECTANGLE): { let config = readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition); + let sharedConfig = readStructAtAddress( renderCommand.textOrSharedConfig.sharedConfig.value, sharedConfigDefinition); let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size)); let linkContents = config.link.length.value > 0 ? textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(config.link.chars.value, config.link.chars.value + config.link.length.value))) : 0; memoryDataView.setUint32(0, renderCommand.id.value, true); @@ -459,22 +465,23 @@ elementData.previousMemoryConfig = configMemory; let color = config.color; element.style.backgroundColor = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`; - if (config.cornerRadius.topLeft.value > 0) { - element.style.borderTopLeftRadius = config.cornerRadius.topLeft.value + 'px'; + if (sharedConfig.cornerRadius.topLeft.value > 0) { + element.style.borderTopLeftRadius = sharedConfig.cornerRadius.topLeft.value + 'px'; } - if (config.cornerRadius.topRight.value > 0) { - element.style.borderTopRightRadius = config.cornerRadius.topRight.value + 'px'; + if (sharedConfig.cornerRadius.topRight.value > 0) { + element.style.borderTopRightRadius = sharedConfig.cornerRadius.topRight.value + 'px'; } - if (config.cornerRadius.bottomLeft.value > 0) { - element.style.borderBottomLeftRadius = config.cornerRadius.bottomLeft.value + 'px'; + if (sharedConfig.cornerRadius.bottomLeft.value > 0) { + element.style.borderBottomLeftRadius = sharedConfig.cornerRadius.bottomLeft.value + 'px'; } - if (config.cornerRadius.bottomRight.value > 0) { - element.style.borderBottomRightRadius = config.cornerRadius.bottomRight.value + 'px'; + if (sharedConfig.cornerRadius.bottomRight.value > 0) { + element.style.borderBottomRightRadius = sharedConfig.cornerRadius.bottomRight.value + 'px'; } break; } case (CLAY_RENDER_COMMAND_TYPE_BORDER): { let config = readStructAtAddress(renderCommand.config.value, borderConfigDefinition); + let sharedConfig = readStructAtAddress( renderCommand.textOrSharedConfig.sharedConfig.value, sharedConfigDefinition); let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size)); if (!dirty && !MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) { break; @@ -496,24 +503,24 @@ let color = config.bottom.color; element.style.borderBottom = `${config.bottom.width.value}px solid rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})` } - if (config.cornerRadius.topLeft.value > 0) { - element.style.borderTopLeftRadius = config.cornerRadius.topLeft.value + 'px'; + if (sharedConfig.cornerRadius.topLeft.value > 0) { + element.style.borderTopLeftRadius = sharedConfig.cornerRadius.topLeft.value + 'px'; } - if (config.cornerRadius.topRight.value > 0) { - element.style.borderTopRightRadius = config.cornerRadius.topRight.value + 'px'; + if (sharedConfig.cornerRadius.topRight.value > 0) { + element.style.borderTopRightRadius = sharedConfig.cornerRadius.topRight.value + 'px'; } - if (config.cornerRadius.bottomLeft.value > 0) { - element.style.borderBottomLeftRadius = config.cornerRadius.bottomLeft.value + 'px'; + if (sharedConfig.cornerRadius.bottomLeft.value > 0) { + element.style.borderBottomLeftRadius = sharedConfig.cornerRadius.bottomLeft.value + 'px'; } - if (config.cornerRadius.bottomRight.value > 0) { - element.style.borderBottomRightRadius = config.cornerRadius.bottomRight.value + 'px'; + if (sharedConfig.cornerRadius.bottomRight.value > 0) { + element.style.borderBottomRightRadius = sharedConfig.cornerRadius.bottomRight.value + 'px'; } break; } case (CLAY_RENDER_COMMAND_TYPE_TEXT): { let config = readStructAtAddress(renderCommand.config.value, textConfigDefinition); let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size)); - let textContents = renderCommand.text; + let textContents = renderCommand.textOrSharedConfig.text; let stringContents = new Uint8Array(memoryDataView.buffer.slice(textContents.chars.value, textContents.chars.value + textContents.length.value)); if (MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) { element.className = 'text'; @@ -549,6 +556,7 @@ break; } case (CLAY_RENDER_COMMAND_TYPE_IMAGE): { + console.log('test1'); let config = readStructAtAddress(renderCommand.config.value, imageConfigDefinition); let srcContents = new Uint8Array(memoryDataView.buffer.slice(config.sourceURL.chars.value, config.sourceURL.chars.value + config.sourceURL.length.value)); if (srcContents.length !== elementData.previousMemoryText.length || MemoryIsDifferent(srcContents, elementData.previousMemoryText, srcContents.length)) { diff --git a/examples/clay-official-website/build/clay/index.wasm b/examples/clay-official-website/build/clay/index.wasm index 6125d2afc13b113b09c1592cd077c352370e3e5c..91fa130e75d619678e4c0ff373494d615f218211 100755 GIT binary patch literal 111977 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

rP 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

&IeC2Sx5AecCj4`~?<^40r#z}fBL9pT1L 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 W&SGF6<8Jf&A^zU8QJ3}K|Nj7GlN^iy diff --git a/examples/clay-official-website/index.html b/examples/clay-official-website/index.html index f168175..0eab546 100644 --- a/examples/clay-official-website/index.html +++ b/examples/clay-official-website/index.html @@ -113,7 +113,6 @@ ]}; let rectangleConfigDefinition = { name: 'rectangle', type: 'struct', members: [ { name: 'color', ...colorDefinition }, - { name: 'cornerRadius', ...cornerRadiusDefinition }, { name: 'link', ...stringDefinition }, { name: 'cursorPointer', type: 'uint8_t' }, ]}; @@ -123,7 +122,6 @@ { name: 'top', ...borderDefinition }, { name: 'bottom', ...borderDefinition }, { name: 'betweenChildren', ...borderDefinition }, - { name: 'cornerRadius', ...cornerRadiusDefinition } ]}; let textConfigDefinition = { name: 'text', type: 'struct', members: [ { name: 'textColor', ...colorDefinition }, @@ -149,6 +147,9 @@ let customConfigDefinition = { name: 'custom', type: 'struct', members: [ { name: 'customData', type: 'uint32_t' }, ]} + let sharedConfigDefinition = { name: 'shared', type: 'struct', members: [ + { name: 'cornerRadius', ...cornerRadiusDefinition }, + ]}; let renderCommandDefinition = { name: 'CLay_RenderCommand', type: 'struct', @@ -160,7 +161,10 @@ { name: 'height', type: 'float' }, ]}, { name: 'config', type: 'uint32_t'}, - { name: 'text', ...stringSliceDefinition }, + { name: 'textOrSharedConfig', type: 'union', members: [ + { name: 'text', ...stringSliceDefinition }, + { name: 'sharedConfig', type: 'uint32_t' } + ]}, { name: 'zIndex', type: 'int32_t' }, { name: 'id', type: 'uint32_t' }, { name: 'commandType', type: 'uint32_t', }, @@ -378,7 +382,7 @@ let isMultiConfigElement = previousId === renderCommand.id.value; if (!elementCache[renderCommand.id.value]) { let elementType = 'div'; - switch (renderCommand.commandType.value) { + switch (renderCommand.commandType.value & 0xff) { case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { if (readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition).link.length.value > 0) { elementType = 'a'; @@ -386,6 +390,7 @@ break; } case CLAY_RENDER_COMMAND_TYPE_IMAGE: { + console.log('test5'); elementType = 'img'; break; } default: break; @@ -439,6 +444,7 @@ } case (CLAY_RENDER_COMMAND_TYPE_RECTANGLE): { let config = readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition); + let sharedConfig = readStructAtAddress( renderCommand.textOrSharedConfig.sharedConfig.value, sharedConfigDefinition); let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size)); let linkContents = config.link.length.value > 0 ? textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(config.link.chars.value, config.link.chars.value + config.link.length.value))) : 0; memoryDataView.setUint32(0, renderCommand.id.value, true); @@ -459,22 +465,23 @@ elementData.previousMemoryConfig = configMemory; let color = config.color; element.style.backgroundColor = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`; - if (config.cornerRadius.topLeft.value > 0) { - element.style.borderTopLeftRadius = config.cornerRadius.topLeft.value + 'px'; + if (sharedConfig.cornerRadius.topLeft.value > 0) { + element.style.borderTopLeftRadius = sharedConfig.cornerRadius.topLeft.value + 'px'; } - if (config.cornerRadius.topRight.value > 0) { - element.style.borderTopRightRadius = config.cornerRadius.topRight.value + 'px'; + if (sharedConfig.cornerRadius.topRight.value > 0) { + element.style.borderTopRightRadius = sharedConfig.cornerRadius.topRight.value + 'px'; } - if (config.cornerRadius.bottomLeft.value > 0) { - element.style.borderBottomLeftRadius = config.cornerRadius.bottomLeft.value + 'px'; + if (sharedConfig.cornerRadius.bottomLeft.value > 0) { + element.style.borderBottomLeftRadius = sharedConfig.cornerRadius.bottomLeft.value + 'px'; } - if (config.cornerRadius.bottomRight.value > 0) { - element.style.borderBottomRightRadius = config.cornerRadius.bottomRight.value + 'px'; + if (sharedConfig.cornerRadius.bottomRight.value > 0) { + element.style.borderBottomRightRadius = sharedConfig.cornerRadius.bottomRight.value + 'px'; } break; } case (CLAY_RENDER_COMMAND_TYPE_BORDER): { let config = readStructAtAddress(renderCommand.config.value, borderConfigDefinition); + let sharedConfig = readStructAtAddress( renderCommand.textOrSharedConfig.sharedConfig.value, sharedConfigDefinition); let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size)); if (!dirty && !MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) { break; @@ -496,24 +503,24 @@ let color = config.bottom.color; element.style.borderBottom = `${config.bottom.width.value}px solid rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})` } - if (config.cornerRadius.topLeft.value > 0) { - element.style.borderTopLeftRadius = config.cornerRadius.topLeft.value + 'px'; + if (sharedConfig.cornerRadius.topLeft.value > 0) { + element.style.borderTopLeftRadius = sharedConfig.cornerRadius.topLeft.value + 'px'; } - if (config.cornerRadius.topRight.value > 0) { - element.style.borderTopRightRadius = config.cornerRadius.topRight.value + 'px'; + if (sharedConfig.cornerRadius.topRight.value > 0) { + element.style.borderTopRightRadius = sharedConfig.cornerRadius.topRight.value + 'px'; } - if (config.cornerRadius.bottomLeft.value > 0) { - element.style.borderBottomLeftRadius = config.cornerRadius.bottomLeft.value + 'px'; + if (sharedConfig.cornerRadius.bottomLeft.value > 0) { + element.style.borderBottomLeftRadius = sharedConfig.cornerRadius.bottomLeft.value + 'px'; } - if (config.cornerRadius.bottomRight.value > 0) { - element.style.borderBottomRightRadius = config.cornerRadius.bottomRight.value + 'px'; + if (sharedConfig.cornerRadius.bottomRight.value > 0) { + element.style.borderBottomRightRadius = sharedConfig.cornerRadius.bottomRight.value + 'px'; } break; } case (CLAY_RENDER_COMMAND_TYPE_TEXT): { let config = readStructAtAddress(renderCommand.config.value, textConfigDefinition); let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size)); - let textContents = renderCommand.text; + let textContents = renderCommand.textOrSharedConfig.text; let stringContents = new Uint8Array(memoryDataView.buffer.slice(textContents.chars.value, textContents.chars.value + textContents.length.value)); if (MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) { element.className = 'text'; @@ -549,6 +556,7 @@ break; } case (CLAY_RENDER_COMMAND_TYPE_IMAGE): { + console.log('test1'); let config = readStructAtAddress(renderCommand.config.value, imageConfigDefinition); let srcContents = new Uint8Array(memoryDataView.buffer.slice(config.sourceURL.chars.value, config.sourceURL.chars.value + config.sourceURL.length.value)); if (srcContents.length !== elementData.previousMemoryText.length || MemoryIsDifferent(srcContents, elementData.previousMemoryText, srcContents.length)) { diff --git a/examples/clay-official-website/main.c b/examples/clay-official-website/main.c index 4944262..e97213f 100644 --- a/examples/clay-official-website/main.c +++ b/examples/clay-official-website/main.c @@ -41,21 +41,21 @@ Clay_TextElementConfig headerTextConfig = (Clay_TextElementConfig) { .fontId = 2 Clay_TextElementConfig blobTextConfig = (Clay_TextElementConfig) { .fontId = 2, .fontSize = 30, .textColor = {244, 235, 230, 255} }; void LandingPageBlob(int index, int fontSize, Clay_Color color, Clay_String text, Clay_String imageURL) { - CLAY(CLAY_IDI("HeroBlob", index), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 480) }, .padding = CLAY_PADDING_ALL(16), .childGap = 16, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }), CLAY_BORDER_OUTSIDE_RADIUS(2, color, 10)) { - CLAY(CLAY_IDI("CheckImage", index), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(32) } }), CLAY_IMAGE({ .sourceDimensions = { 128, 128 }, .sourceURL = imageURL })) {} + CLAY({ .id = CLAY_IDI("HeroBlob", index), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 480) }, .padding = CLAY_PADDING_ALL(16), .childGap = 16, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }, .border = CLAY_BORDER_OUTSIDE({ 2, color }), .shared = { .cornerRadius = CLAY_CORNER_RADIUS(10) } }) { + CLAY({ .id = CLAY_IDI("CheckImage", index), .layout = { .sizing = { CLAY_SIZING_FIXED(32) } }, .image = { .sourceDimensions = { 128, 128 }, .sourceURL = imageURL } }) {} CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .fontSize = fontSize, .fontId = FONT_ID_BODY_24, .textColor = color })); } } void LandingPageDesktop() { - CLAY(CLAY_ID("LandingPage1Desktop"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(.min = windowHeight - 70) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = { 50, 50 } })) { - CLAY(CLAY_ID("LandingPage1"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(32), .childGap = 32 }), CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } })) { - CLAY(CLAY_ID("LeftText"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_PERCENT(0.55f) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("LandingPage1Desktop"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(.min = windowHeight - 70) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = { 50, 50 } } }) { + CLAY({ .id = CLAY_ID("LandingPage1"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(32), .childGap = 32 }, .border = { .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } } }) { + CLAY({ .id = CLAY_ID("LeftText"), .layout = { .sizing = { .width = CLAY_SIZING_PERCENT(0.55f) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance."), CLAY_TEXT_CONFIG({ .fontSize = 56, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); - CLAY(CLAY_ID("LandingPageSpacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(32) } })) {} + CLAY({ .id = CLAY_ID("LandingPageSpacer"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(32) } } }) {} CLAY_TEXT(CLAY_STRING("Clay is laying out this webpage right now!"), CLAY_TEXT_CONFIG({ .fontSize = 36, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE })); } - CLAY(CLAY_ID("HeroImageOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_PERCENT(0.45f) }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16 })) { + CLAY({ .id = CLAY_ID("HeroImageOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_PERCENT(0.45f) }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16 } }) { LandingPageBlob(1, 32, COLOR_BLOB_BORDER_5, CLAY_STRING("High performance"), CLAY_STRING("/clay/images/check_5.png")); LandingPageBlob(2, 32, COLOR_BLOB_BORDER_4, CLAY_STRING("Flexbox-style responsive layout"), CLAY_STRING("/clay/images/check_4.png")); LandingPageBlob(3, 32, COLOR_BLOB_BORDER_3, CLAY_STRING("Declarative syntax"), CLAY_STRING("/clay/images/check_3.png")); @@ -67,13 +67,13 @@ void LandingPageDesktop() { } void LandingPageMobile() { - CLAY(CLAY_ID("LandingPage1Mobile"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(.min = windowHeight - 70) }, .childAlignment = {CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = { 16, 16, 32, 32 }, .childGap = 32 })) { - CLAY(CLAY_ID("LeftText"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("LandingPage1Mobile"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(.min = windowHeight - 70) }, .childAlignment = {CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = { 16, 16, 32, 32 }, .childGap = 32 } }) { + CLAY({ .id = CLAY_ID("LeftText"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance."), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); - CLAY(CLAY_ID("LandingPageSpacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(32) } })) {} + CLAY({ .id = CLAY_ID("LandingPageSpacer"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(32) } } }) {} CLAY_TEXT(CLAY_STRING("Clay is laying out this webpage right now!"), CLAY_TEXT_CONFIG({ .fontSize = 32, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE })); } - CLAY(CLAY_ID("HeroImageOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(0) }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16 })) { + CLAY({ .id = CLAY_ID("HeroImageOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(0) }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16 } }) { LandingPageBlob(1, 28, COLOR_BLOB_BORDER_5, CLAY_STRING("High performance"), CLAY_STRING("/clay/images/check_5.png")); LandingPageBlob(2, 28, COLOR_BLOB_BORDER_4, CLAY_STRING("Flexbox-style responsive layout"), CLAY_STRING("/clay/images/check_4.png")); LandingPageBlob(3, 28, COLOR_BLOB_BORDER_3, CLAY_STRING("Declarative syntax"), CLAY_STRING("/clay/images/check_3.png")); @@ -84,17 +84,17 @@ void LandingPageMobile() { } void FeatureBlocksDesktop() { - CLAY(CLAY_ID("FeatureBlocksOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) } })) { - CLAY(CLAY_ID("FeatureBlocksInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }), CLAY_BORDER({ .betweenChildren = { .width = 2, .color = COLOR_RED } })) { + CLAY({ .id = CLAY_ID("FeatureBlocksOuter"), .layout = { .sizing = { CLAY_SIZING_GROW(0) } } }) { + CLAY({ .id = CLAY_ID("FeatureBlocksInner"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }, .border = { .betweenChildren = { .width = 2, .color = COLOR_RED } }}) { Clay_TextElementConfig *textConfig = CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_RED }); - CLAY(CLAY_ID("HFileBoxOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {50, 50, 32, 32}, .childGap = 8 })) { - CLAY(CLAY_ID("HFileIncludeOuter"), CLAY_LAYOUT({ .padding = {8, 4} }), CLAY_RECTANGLE({ .color = COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(8) })) { + CLAY({ .id = CLAY_ID("HFileBoxOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {50, 50, 32, 32}, .childGap = 8 } }) { + CLAY({ .id = CLAY_ID("HFileIncludeOuter"), .layout = { .padding = {8, 4} }, .rectangle = { .color = COLOR_RED }, .shared = { .cornerRadius = CLAY_CORNER_RADIUS(8) } }) { CLAY_TEXT(CLAY_STRING("#include clay.h"), CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_LIGHT })); } CLAY_TEXT(CLAY_STRING("~2000 lines of C99."), textConfig); CLAY_TEXT(CLAY_STRING("Zero dependencies, including no C standard library."), textConfig); } - CLAY(CLAY_ID("BringYourOwnRendererOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {50, 50, 32, 32}, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("BringYourOwnRendererOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {50, 50, 32, 32}, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Renderer agnostic."), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = COLOR_ORANGE })); CLAY_TEXT(CLAY_STRING("Layout with clay, then render with Raylib, WebGL Canvas or even as HTML."), textConfig); CLAY_TEXT(CLAY_STRING("Flexible output for easy compositing in your custom engine or environment."), textConfig); @@ -104,16 +104,16 @@ void FeatureBlocksDesktop() { } void FeatureBlocksMobile() { - CLAY(CLAY_ID("FeatureBlocksInner"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0) } }), CLAY_BORDER({ .betweenChildren = { .width = 2, .color = COLOR_RED } })) { + CLAY({ .id = CLAY_ID("FeatureBlocksInner"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0) } }, .border = { .betweenChildren = { .width = 2, .color = COLOR_RED } } }) { Clay_TextElementConfig *textConfig = CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_RED }); - CLAY(CLAY_ID("HFileBoxOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 8 })) { - CLAY(CLAY_ID("HFileIncludeOuter"), CLAY_LAYOUT({ .padding = {8, 4} }), CLAY_RECTANGLE({ .color = COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(8) })) { + CLAY({ .id = CLAY_ID("HFileBoxOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 8 } }) { + CLAY({ .id = CLAY_ID("HFileIncludeOuter"), .layout = { .padding = {8, 4} }, .rectangle = { .color = COLOR_RED }, .shared = { .cornerRadius = CLAY_CORNER_RADIUS(8) } }) { CLAY_TEXT(CLAY_STRING("#include clay.h"), CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_LIGHT })); } CLAY_TEXT(CLAY_STRING("~2000 lines of C99."), textConfig); CLAY_TEXT(CLAY_STRING("Zero dependencies, including no C standard library."), textConfig); } - CLAY(CLAY_ID("BringYourOwnRendererOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("BringYourOwnRendererOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Renderer agnostic."), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = COLOR_ORANGE })); CLAY_TEXT(CLAY_STRING("Layout with clay, then render with Raylib, WebGL Canvas or even as HTML."), textConfig); CLAY_TEXT(CLAY_STRING("Flexible output for easy compositing in your custom engine or environment."), textConfig); @@ -122,33 +122,33 @@ void FeatureBlocksMobile() { } void DeclarativeSyntaxPageDesktop() { - CLAY(CLAY_ID("SyntaxPageDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = { 50, 50 } })) { - CLAY(CLAY_ID("SyntaxPage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = CLAY_PADDING_ALL(32), .childGap = 32 }), CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } })) { - CLAY(CLAY_ID("SyntaxPageLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("SyntaxPageDesktop"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = { 50, 50 } } }) { + CLAY({ .id = CLAY_ID("SyntaxPage"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = CLAY_PADDING_ALL(32), .childGap = 32 }, .border = { .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } } }) { + CLAY({ .id = CLAY_ID("SyntaxPageLeftText"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Declarative Syntax"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); - CLAY(CLAY_ID("SyntaxSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) } })) {} + CLAY({ .id = CLAY_ID("SyntaxSpacer"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) } } }) {} CLAY_TEXT(CLAY_STRING("Flexible and readable declarative syntax with nested UI element hierarchies."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("Mix elements with standard C code like loops, conditionals and functions."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("Create your own library of re-usable components from UI primitives like text, images and rectangles."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY(CLAY_ID("SyntaxPageRightImage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER} })) { - CLAY(CLAY_ID("SyntaxPageRightImageInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 568) } }), CLAY_IMAGE({ .sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png") })) {} + CLAY({ .id = CLAY_ID("SyntaxPageRightImage"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER} } }) { + CLAY({ .id = CLAY_ID("SyntaxPageRightImageInner"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 568) } }, .image = { .sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png") } }) {} } } } } void DeclarativeSyntaxPageMobile() { - CLAY(CLAY_ID("SyntaxPageDesktop"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 16 })) { - CLAY(CLAY_ID("SyntaxPageLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("SyntaxPageDesktop"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 16 } }) { + CLAY({ .id = CLAY_ID("SyntaxPageLeftText"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Declarative Syntax"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); - CLAY(CLAY_ID("SyntaxSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) } })) {} + CLAY({ .id = CLAY_ID("SyntaxSpacer"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) } } }) {} CLAY_TEXT(CLAY_STRING("Flexible and readable declarative syntax with nested UI element hierarchies."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("Mix elements with standard C code like loops, conditionals and functions."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("Create your own library of re-usable components from UI primitives like text, images and rectangles."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY(CLAY_ID("SyntaxPageRightImage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER} })) { - CLAY(CLAY_ID("SyntaxPageRightImageInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 568) } }), CLAY_IMAGE({ .sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png") } )) {} + CLAY({ .id = CLAY_ID("SyntaxPageRightImage"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER} } }) { + CLAY({ .id = CLAY_ID("SyntaxPageRightImageInner"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 568) } }, .image = { .sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png") } }) {} } } } @@ -165,20 +165,20 @@ Clay_Color ColorLerp(Clay_Color a, Clay_Color b, float amount) { Clay_String LOREM_IPSUM_TEXT = CLAY_STRING("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); void HighPerformancePageDesktop(float lerpValue) { - CLAY(CLAY_ID("PerformanceOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {82, 82, 32, 32}, .childGap = 64 }), CLAY_RECTANGLE({ .color = COLOR_RED })) { - CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("PerformanceOuter"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {82, 82, 32, 32}, .childGap = 64 }, .rectangle = { .color = COLOR_RED } }) { + CLAY({ .id = CLAY_ID("PerformanceLeftText"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); - CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) }})) {} + CLAY({ .id = CLAY_ID("PerformanceSpacer"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) }} }) {} CLAY_TEXT(CLAY_STRING("Fast enough to recompute your entire UI every frame."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); CLAY_TEXT(CLAY_STRING("Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); CLAY_TEXT(CLAY_STRING("Simplify animations and reactive UI design by avoiding the standard performance hacks."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); } - CLAY(CLAY_ID("PerformanceRightImageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER} })) { - CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(400) } }), CLAY_BORDER_ALL({ .width = 2, .color = COLOR_LIGHT })) { - CLAY(CLAY_ID("AnimationDemoContainerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.3f + 0.4f * lerpValue), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(32) }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue) })) { + CLAY({ .id = CLAY_ID("PerformanceRightImageOuter"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER} } }) { + CLAY({ .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(400) } }, .border = CLAY_BORDER_ALL({ .width = 2, .color = COLOR_LIGHT }) }) { + CLAY({ .id = CLAY_ID("AnimationDemoContainerLeft"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.3f + 0.4f * lerpValue), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(32) }, .rectangle = { .color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue) } }) { CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } - CLAY(CLAY_ID("AnimationDemoContainerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(32) }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue) })) { + CLAY({ .id = CLAY_ID("AnimationDemoContainerRight"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(32) }, .rectangle = { .color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue) } }) { CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } } @@ -187,20 +187,20 @@ void HighPerformancePageDesktop(float lerpValue) { } void HighPerformancePageMobile(float lerpValue) { - CLAY(CLAY_ID("PerformanceOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 32 }), CLAY_RECTANGLE({ .color = COLOR_RED })) { - CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("PerformanceOuter"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {16, 16, 32, 32}, .childGap = 32 }, .rectangle = { .color = COLOR_RED } }) { + CLAY({ .id = CLAY_ID("PerformanceLeftText"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); - CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) }})) {} + CLAY({ .id = CLAY_ID("PerformanceSpacer"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) }} }) {} CLAY_TEXT(CLAY_STRING("Fast enough to recompute your entire UI every frame."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); CLAY_TEXT(CLAY_STRING("Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); CLAY_TEXT(CLAY_STRING("Simplify animations and reactive UI design by avoiding the standard performance hacks."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); } - CLAY(CLAY_ID("PerformanceRightImageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {CLAY_ALIGN_X_CENTER} })) { - CLAY(CLAY_ID(""), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(400) } }), CLAY_BORDER_ALL({ .width = 2, .color = COLOR_LIGHT })) { - CLAY(CLAY_ID("AnimationDemoContainerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.35f + 0.3f * lerpValue), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(16) }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue) })) { + CLAY({ .id = CLAY_ID("PerformanceRightImageOuter"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .childAlignment = {CLAY_ALIGN_X_CENTER} } }) { + CLAY({ .id = CLAY_ID(""), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(400) } }, .border = CLAY_BORDER_ALL({ .width = 2, .color = COLOR_LIGHT }) }) { + CLAY({ .id = CLAY_ID("AnimationDemoContainerLeft"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.35f + 0.3f * lerpValue), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(16) }, .rectangle = { .color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue) } }) { CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } - CLAY(CLAY_ID("AnimationDemoContainerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(16) }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue) })) { + CLAY({ .id = CLAY_ID("AnimationDemoContainerRight"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = CLAY_PADDING_ALL(16) }, .rectangle = { .color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue) } }) { CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } } @@ -217,36 +217,40 @@ void HandleRendererButtonInteraction(Clay_ElementId elementId, Clay_PointerData } void RendererButtonActive(Clay_String text) { - CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(300) }, .padding = CLAY_PADDING_ALL(16) }), - CLAY_RECTANGLE({ .color = Clay_Hovered() ? COLOR_RED_HOVER : COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(10) }) - ) { + CLAY({ + .layout = { .sizing = {CLAY_SIZING_FIXED(300) }, .padding = CLAY_PADDING_ALL(16) }, + .rectangle = { .color = Clay_Hovered() ? COLOR_RED_HOVER : COLOR_RED }, + .shared = { .cornerRadius = CLAY_CORNER_RADIUS(10) } + }) { CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); } } void RendererButtonInactive(Clay_String text, size_t rendererIndex) { - CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(300)}, .padding = CLAY_PADDING_ALL(16) }), - CLAY_BORDER_OUTSIDE_RADIUS(2, COLOR_RED, 10), - CLAY_RECTANGLE({ .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT, .cornerRadius = CLAY_CORNER_RADIUS(10), .cursorPointer = true }), - Clay_OnHover(HandleRendererButtonInteraction, rendererIndex) - ) { + CLAY({ + .layout = { .sizing = {CLAY_SIZING_FIXED(300)}, .padding = CLAY_PADDING_ALL(16) }, + .border = CLAY_BORDER_OUTSIDE({ 2, COLOR_RED }), + .rectangle = { .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT, .cursorPointer = true }, + .shared = { .cornerRadius = CLAY_CORNER_RADIUS(10) } + }) { + Clay_OnHover(HandleRendererButtonInteraction, rendererIndex); CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } } void RendererPageDesktop() { - CLAY(CLAY_ID("RendererPageDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = { 50, 50 } })) { - CLAY(CLAY_ID("RendererPage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = CLAY_PADDING_ALL(32), .childGap = 32 }), CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } })) { - CLAY(CLAY_ID("RendererLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("RendererPageDesktop"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = { 50, 50 } } }) { + CLAY({ .id = CLAY_ID("RendererPage"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = CLAY_PADDING_ALL(32), .childGap = 32 }, .border = { .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } } }) { + CLAY({ .id = CLAY_ID("RendererLeftText"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Renderer & Platform Agnostic"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); - CLAY(CLAY_ID("RendererSpacerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) }})) {} + CLAY({ .id = CLAY_ID("RendererSpacerLeft"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) }} }) {} CLAY_TEXT(CLAY_STRING("Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("There's even an HTML renderer - you're looking at it right now!"), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY(CLAY_ID("RendererRightText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .childAlignment = {CLAY_ALIGN_X_CENTER}, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 })) { + CLAY({ .id = CLAY_ID("RendererRightText"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.5) }, .childAlignment = {CLAY_ALIGN_X_CENTER}, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 } }) { CLAY_TEXT(CLAY_STRING("Try changing renderer!"), CLAY_TEXT_CONFIG({ .fontSize = 36, .fontId = FONT_ID_BODY_36, .textColor = COLOR_ORANGE })); - CLAY(CLAY_ID("RendererSpacerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 32) } })) {} + CLAY({ .id = CLAY_ID("RendererSpacerRight"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 32) } } }) {} if (ACTIVE_RENDERER_INDEX == 0) { RendererButtonActive(CLAY_STRING("HTML Renderer")); RendererButtonInactive(CLAY_STRING("Canvas Renderer"), 1); @@ -260,17 +264,17 @@ void RendererPageDesktop() { } void RendererPageMobile() { - CLAY(CLAY_ID("RendererMobile"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = { 16, 16, 32, 32}, .childGap = 32 }), CLAY_RECTANGLE({ .color = COLOR_LIGHT })) { - CLAY(CLAY_ID("RendererLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("RendererMobile"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = { 16, 16, 32, 32}, .childGap = 32 }, .rectangle = { .color = COLOR_LIGHT } }) { + CLAY({ .id = CLAY_ID("RendererLeftText"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Renderer & Platform Agnostic"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); - CLAY(CLAY_ID("RendererSpacerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) }})) {} + CLAY({ .id = CLAY_ID("RendererSpacerLeft"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) }} }) {} CLAY_TEXT(CLAY_STRING("Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); CLAY_TEXT(CLAY_STRING("There's even an HTML renderer - you're looking at it right now!"), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY(CLAY_ID("RendererRightText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 })) { + CLAY({ .id = CLAY_ID("RendererRightText"), .layout = { .sizing = { CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 } }) { CLAY_TEXT(CLAY_STRING("Try changing renderer!"), CLAY_TEXT_CONFIG({ .fontSize = 36, .fontId = FONT_ID_BODY_36, .textColor = COLOR_ORANGE })); - CLAY(CLAY_ID("RendererSpacerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 32) }})) {} + CLAY({ .id = CLAY_ID("RendererSpacerRight"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 32) }} }) {} if (ACTIVE_RENDERER_INDEX == 0) { RendererButtonActive(CLAY_STRING("HTML Renderer")); RendererButtonInactive(CLAY_STRING("Canvas Renderer"), 1); @@ -283,17 +287,17 @@ void RendererPageMobile() { } void DebuggerPageDesktop() { - CLAY(CLAY_ID("DebuggerDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = { 82, 82, 32, 32 }, .childGap = 64 }), CLAY_RECTANGLE({ .color = COLOR_RED })) { - CLAY(CLAY_ID("DebuggerLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY({ .id = CLAY_ID("DebuggerDesktop"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = { 82, 82, 32, 32 }, .childGap = 64 }, .rectangle = { .color = COLOR_RED } }) { + CLAY({ .id = CLAY_ID("DebuggerLeftText"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 } }) { CLAY_TEXT(CLAY_STRING("Integrated Debug Tools"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); - CLAY(CLAY_ID("DebuggerSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 16) }})) {} + CLAY({ .id = CLAY_ID("DebuggerSpacer"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 16) }} }) {} CLAY_TEXT(CLAY_STRING("Clay includes built in \"Chrome Inspector\"-style debug tooling."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); CLAY_TEXT(CLAY_STRING("View your layout hierarchy and config in real time."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); - CLAY(CLAY_ID("DebuggerPageSpacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(32) } })) {} + CLAY({ .id = CLAY_ID("DebuggerPageSpacer"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(32) } } }) {} CLAY_TEXT(CLAY_STRING("Press the \"d\" key to try it out now!"), CLAY_TEXT_CONFIG({ .fontSize = 32, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE })); } - CLAY(CLAY_ID("DebuggerRightImageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER} })) { - CLAY(CLAY_ID("DebuggerPageRightImageInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(.max = 558) } }), CLAY_IMAGE({ .sourceDimensions = {1620, 1474}, .sourceURL = CLAY_STRING("/clay/images/debugger.png") })) {} + CLAY({ .id = CLAY_ID("DebuggerRightImageOuter"), .layout = { .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER} } }) { + CLAY({ .id = CLAY_ID("DebuggerPageRightImageInner"), .layout = { .sizing = { CLAY_SIZING_GROW(.max = 558) } }, .image = { .sourceDimensions = {1620, 1474}, .sourceURL = CLAY_STRING("/clay/images/debugger.png") } }) {} } } } @@ -310,45 +314,46 @@ float animationLerpValue = -1.0f; Clay_RenderCommandArray CreateLayout(bool mobileScreen, float lerpValue) { Clay_BeginLayout(); - CLAY(CLAY_ID("OuterContainer"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) } }), CLAY_RECTANGLE({ .color = COLOR_LIGHT })) { - CLAY(CLAY_ID("Header"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(50) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = { 32, 32 } })) { + CLAY({ .id = CLAY_ID("OuterContainer"), .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) } }, .rectangle = { .color = COLOR_LIGHT } }) { + CLAY({ .id = CLAY_ID("Header"), .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(50) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = { 32, 32 } } }) { CLAY_TEXT(CLAY_STRING("Clay"), &headerTextConfig); - CLAY(CLAY_ID("Spacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(0) } })) {} + CLAY({ .id = CLAY_ID("Spacer"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} if (!mobileScreen) { - CLAY(CLAY_ID("LinkExamplesOuter"), CLAY_LAYOUT({ .padding = {8, 8} }), CLAY_RECTANGLE({ .link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples"), .color = {0,0,0,0} })) { + CLAY({ .id = CLAY_ID("LinkExamplesOuter"), .layout = { .padding = {8, 8} }, .rectangle = { .link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples"), .color = {0,0,0,0} } }) { CLAY_TEXT(CLAY_STRING("Examples"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } - CLAY(CLAY_ID("LinkDocsOuter"), CLAY_LAYOUT({ .padding = {8, 8} }), CLAY_RECTANGLE({ .link = CLAY_STRING("https://github.com/nicbarker/clay/blob/main/README.md"), .color = {0,0,0,0} })) { + CLAY({ .id = CLAY_ID("LinkDocsOuter"), .layout = { .padding = {8, 8} }, .rectangle = { .link = CLAY_STRING("https://github.com/nicbarker/clay/blob/main/README.md"), .color = {0,0,0,0} } }) { CLAY_TEXT(CLAY_STRING("Docs"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } } - CLAY(CLAY_LAYOUT({ .padding = {16, 16, 6, 6} }), - CLAY_RECTANGLE({ - .cornerRadius = CLAY_CORNER_RADIUS(10), - .link = CLAY_STRING("https://discord.gg/b4FTWkxdvT"), - .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT }), - CLAY_BORDER_OUTSIDE_RADIUS(2, COLOR_RED, 10) - ) { + CLAY({ + .layout = { .padding = {16, 16, 6, 6} }, + .rectangle = {.link = CLAY_STRING("https://discord.gg/b4FTWkxdvT"), .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT}, + .border = CLAY_BORDER_OUTSIDE({ 2, COLOR_RED }), + .shared = { .cornerRadius = CLAY_CORNER_RADIUS(10) } + }) { CLAY_TEXT(CLAY_STRING("Discord"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } - CLAY(CLAY_LAYOUT({ .padding = {16, 16, 6, 6} }), - CLAY_RECTANGLE({ .cornerRadius = CLAY_CORNER_RADIUS(10), .link = CLAY_STRING("https://github.com/nicbarker/clay"), .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT }), - CLAY_BORDER_OUTSIDE_RADIUS(2, COLOR_RED, 10) - ) { + CLAY({ + .layout = { .padding = {16, 16, 6, 6} }, + .rectangle = { .link = CLAY_STRING("https://github.com/nicbarker/clay"), .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT }, + .border = CLAY_BORDER_OUTSIDE({ 2, COLOR_RED }), + .shared = { .cornerRadius = CLAY_CORNER_RADIUS(10) } + }) { CLAY_TEXT(CLAY_STRING("Github"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } } Clay_LayoutConfig topBorderConfig = (Clay_LayoutConfig) { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(4) }}; - CLAY(CLAY_ID("TopBorder1"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_5 })) {} - CLAY(CLAY_ID("TopBorder2"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_4 })) {} - CLAY(CLAY_ID("TopBorder3"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_3 })) {} - CLAY(CLAY_ID("TopBorder4"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_2 })) {} - CLAY(CLAY_ID("TopBorder5"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_1 })) {} - CLAY(CLAY_ID("OuterScrollContainer"), - CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }), - CLAY_SCROLL({ .vertical = true }), - CLAY_BORDER({ .betweenChildren = {2, COLOR_RED} }) - ) { + CLAY({ .id = CLAY_ID("TopBorder1"), .layout = topBorderConfig, .rectangle = { .color = COLOR_TOP_BORDER_5 } }) {} + CLAY({ .id = CLAY_ID("TopBorder2"), .layout = topBorderConfig, .rectangle = { .color = COLOR_TOP_BORDER_4 } }) {} + CLAY({ .id = CLAY_ID("TopBorder3"), .layout = topBorderConfig, .rectangle = { .color = COLOR_TOP_BORDER_3 } }) {} + CLAY({ .id = CLAY_ID("TopBorder4"), .layout = topBorderConfig, .rectangle = { .color = COLOR_TOP_BORDER_2 } }) {} + CLAY({ .id = CLAY_ID("TopBorder5"), .layout = topBorderConfig, .rectangle = { .color = COLOR_TOP_BORDER_1 } }) {} + CLAY({ .id = CLAY_ID("OuterScrollContainer"), + .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }, + .scroll = { .vertical = true }, + .border = { .betweenChildren = { 2, COLOR_RED } } + }) { if (mobileScreen) { LandingPageMobile(); FeatureBlocksMobile(); @@ -375,11 +380,12 @@ Clay_RenderCommandArray CreateLayout(bool mobileScreen, float lerpValue) { scrollbarColor = (Clay_Color){225, 138, 50, 160}; } float scrollHeight = scrollData.scrollContainerDimensions.height - 12; - CLAY(CLAY_ID("ScrollBar"), - CLAY_FLOATING({ .offset = { .x = -6, .y = -(scrollData.scrollPosition->y / scrollData.contentDimensions.height) * scrollHeight + 6}, .zIndex = 1, .parentId = Clay_GetElementId(CLAY_STRING("OuterScrollContainer")).id, .attachment = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_TOP }}), - CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(10), CLAY_SIZING_FIXED((scrollHeight / scrollData.contentDimensions.height) * scrollHeight)} }), - CLAY_RECTANGLE({ .cornerRadius = CLAY_CORNER_RADIUS(5), .color = scrollbarColor }) - ) {} + CLAY({ .id = CLAY_ID("ScrollBar"), + .floating = { .offset = { .x = -6, .y = -(scrollData.scrollPosition->y / scrollData.contentDimensions.height) * scrollHeight + 6}, .zIndex = 1, .parentId = Clay_GetElementId(CLAY_STRING("OuterScrollContainer")).id, .attachment = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_TOP }}, + .layout = { .sizing = {CLAY_SIZING_FIXED(10), CLAY_SIZING_FIXED((scrollHeight / scrollData.contentDimensions.height) * scrollHeight)} }, + .rectangle = { .color = scrollbarColor }, + .shared = { .cornerRadius = CLAY_CORNER_RADIUS(5) } + }) {} } return Clay_EndLayout(); }