Mercurial
diff design_system/main.c @ 251:117c4d53c9a4
[ui] Add HTML-first Web Component system
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Tue, 04 Aug 2026 09:14:57 -0700 |
| parents | |
| children | 7a7581f040e8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/design_system/main.c Tue Aug 04 09:14:57 2026 -0700 @@ -0,0 +1,98 @@ +#include "seobeo/seobeo.h" + +#include <stdlib.h> +#include <string.h> + +static Seobeo_Request_Entry *Get_Component_Catalog( + Seobeo_Request_Entry *request, + Dowa_Arena *arena) +{ + (void)request; + size_t file_size = 0; + char *source = Seobeo_Web_LoadFile("/index.html", &file_size); + if (!source) + { + Seobeo_Request_Entry *response = NULL; + Dowa_HashMap_Push_Arena(response, "status", "500", arena); + Dowa_HashMap_Push_Arena( + response, + "content-type", + "text/plain; charset=utf-8", + arena); + Dowa_HashMap_Push_Arena( + response, + "body", + "Component catalog is unavailable.", + arena); + return response; + } + + char *body = Dowa_Arena_Allocate(arena, file_size + 1); + if (!body) + { + free(source); + return NULL; + } + memcpy(body, source, file_size + 1); + free(source); + + char *content_length = Dowa_Arena_Allocate(arena, 32); + snprintf(content_length, 32, "%zu", file_size); + Seobeo_Request_Entry *response = NULL; + Dowa_HashMap_Push_Arena(response, "status", "200", arena); + Dowa_HashMap_Push_Arena( + response, + "content-type", + "text/html; charset=utf-8", + arena); + Dowa_HashMap_Push_Arena( + response, + "content-length", + content_length, + arena); + Dowa_HashMap_Push_Arena(response, "body", body, arena); + return response; +} + +static boolean Port_Is_Valid(const char *port) +{ + if (!port || port[0] == '\0') + return FALSE; + char *end = NULL; + long value = strtol(port, &end, 10); + return end != port && + *end == '\0' && + value > 0 && + value <= 65535; +} + +int main(void) +{ + Seobeo_Router_Init(); + Seobeo_Router_Register("GET", "/", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/tokens", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/components", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/components/button", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/components/card", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/components/alert", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/components/field", Get_Component_Catalog); + Seobeo_Router_Register("GET", "/components/stack", Get_Component_Catalog); + + const char *port = getenv("DESIGN_SYSTEM_PORT"); + if (!port || port[0] == '\0') + port = "6980"; + if (!Port_Is_Valid(port)) + { + Seobeo_Log(SEOBEO_ERROR, "Invalid design-system port: %s\n", port); + Seobeo_Router_Destroy(); + return 1; + } + int result = Seobeo_Web_Server_Start_On( + "127.0.0.1", + "design_system/src", + port, + SEOBEO_MODE_EDGE, + 2); + Seobeo_Router_Destroy(); + return result; +}