clay.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/ioctl.h> 4 #include <unistd.h> 5 6 #define CLAY_IMPLEMENTATION 7 #include "clay.h" 8 #include "clay_renderer_terminal_ansi.c" 9 10 static void on_error(Clay_ErrorData error) { 11 fprintf(stderr, "clay error: %.*s\n", error.errorText.length, 12 error.errorText.chars); 13 } 14 15 int main(void) { 16 struct winsize ws; 17 ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); 18 int term_width = ws.ws_col; 19 int term_height = ws.ws_row; 20 int col_width = ws.ws_xpixel / ws.ws_col; 21 if (col_width == 0) col_width = 8; 22 23 uint32_t mem_size = Clay_MinMemorySize(); 24 Clay_Arena arena = Clay_CreateArenaWithCapacityAndMemory(mem_size, malloc(mem_size)); 25 26 Clay_Initialize(arena, 27 (Clay_Dimensions){(float)(term_width * col_width), 28 (float)(term_height * col_width)}, 29 (Clay_ErrorHandler){.errorHandlerFunction = on_error}); 30 Clay_SetMeasureTextFunction(Console_MeasureText, &col_width); 31 32 Clay_BeginLayout(); 33 34 CLAY(CLAY_ID("Root"), { 35 .layout = { 36 .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, 37 .layoutDirection = CLAY_TOP_TO_BOTTOM, 38 .padding = {1, 1, 1, 1}, 39 .childGap = 1, 40 }, 41 .backgroundColor = {30, 30, 30, 255}, 42 }) { 43 CLAY(CLAY_ID("Header"), { 44 .layout = { 45 .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(3 * col_width)}, 46 .padding = {1, 1, 0, 0}, 47 .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, 48 }, 49 .backgroundColor = {50, 120, 200, 255}, 50 }) { 51 CLAY_TEXT(CLAY_STRING("Hello, Clay!"), CLAY_TEXT_CONFIG({ 52 .textColor = {255, 255, 255, 255}, 53 .fontSize = 1, 54 })); 55 } 56 57 CLAY(CLAY_ID("Body"), { 58 .layout = { 59 .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, 60 .childGap = 1, 61 }, 62 }) { 63 CLAY(CLAY_ID("Sidebar"), { 64 .layout = { 65 .sizing = {CLAY_SIZING_FIXED(20 * col_width), CLAY_SIZING_GROW(0)}, 66 .padding = {1, 1, 1, 1}, 67 .layoutDirection = CLAY_TOP_TO_BOTTOM, 68 .childGap = 1, 69 }, 70 .backgroundColor = {45, 45, 45, 255}, 71 }) { 72 CLAY_TEXT(CLAY_STRING("Sidebar"), CLAY_TEXT_CONFIG({ 73 .textColor = {180, 180, 180, 255}, 74 .fontSize = 1, 75 })); 76 CLAY_TEXT(CLAY_STRING("Item 1"), CLAY_TEXT_CONFIG({ 77 .textColor = {140, 140, 140, 255}, 78 .fontSize = 1, 79 })); 80 CLAY_TEXT(CLAY_STRING("Item 2"), CLAY_TEXT_CONFIG({ 81 .textColor = {140, 140, 140, 255}, 82 .fontSize = 1, 83 })); 84 CLAY_TEXT(CLAY_STRING("Item 3"), CLAY_TEXT_CONFIG({ 85 .textColor = {140, 140, 140, 255}, 86 .fontSize = 1, 87 })); 88 } 89 90 CLAY(CLAY_ID("Content"), { 91 .layout = { 92 .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, 93 .padding = {2, 2, 1, 1}, 94 .layoutDirection = CLAY_TOP_TO_BOTTOM, 95 .childGap = 1, 96 }, 97 .backgroundColor = {40, 40, 40, 255}, 98 }) { 99 CLAY_TEXT(CLAY_STRING("Welcome to Clay."), CLAY_TEXT_CONFIG({ 100 .textColor = {220, 220, 220, 255}, 101 .fontSize = 1, 102 })); 103 CLAY_TEXT(CLAY_STRING("A declarative UI layout library in a single C header."), CLAY_TEXT_CONFIG({ 104 .textColor = {160, 160, 160, 255}, 105 .fontSize = 1, 106 })); 107 CLAY_TEXT(CLAY_STRING("This is rendering in your terminal via ANSI escape codes."), CLAY_TEXT_CONFIG({ 108 .textColor = {100, 180, 100, 255}, 109 .fontSize = 1, 110 })); 111 } 112 } 113 } 114 115 Clay_RenderCommandArray commands = Clay_EndLayout(0.016f); 116 Clay_Terminal_Render(commands, term_width, term_height, col_width); 117 118 printf("\033[%d;1H", term_height); 119 120 free(arena.memory); 121 return 0; 122 }