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;
+}