/ examples / clay.c
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  }