From 254afd2fb27f3e4aad550df1a9ed024e29cd395c Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Sun, 3 May 2026 10:15:24 -0500 Subject: [PATCH] fix(ci+chat): drop docker buildx flags + style chat code blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI: gitea runner ships docker without the buildx plugin, so `docker buildx build --platform linux/amd64 --load` exits 125 ("unknown flag: --platform") in both the full build (build-stage.sh) and the asset-only fast path (deploy.yaml). Runner host is already linux/amd64, so explicit --platform is redundant. Switch both call sites to plain `docker build`. This unblocks the pipeline — every run since the workflow was added (~26 runs) has failed at this exact step. Chat: the live chat bubble renders marked.parse() output via innerHTML, but .demo-msg-ai .demo-msg-bubble only had CSS rules for p/ul/ol/li/strong. Fenced code blocks rendered as

with no styling — they appeared as wrapped plaintext, hard to
distinguish from prose. Add rules for code (inline and block),
pre, blockquote, em, h1-h4, and a, mirroring the share-card
styling (which always had them) so chat code blocks finally get
the monospace + tinted-background treatment users expect.
---
 .gitea/workflows/deploy.yaml |  6 ++++-
 build-stage.sh               | 10 ++++++--
 src/styles.el                | 47 ++++++++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml
index f3e964d..279dbc1 100644
--- a/.gitea/workflows/deploy.yaml
+++ b/.gitea/workflows/deploy.yaml
@@ -146,7 +146,11 @@ jobs:
           COPY src/assets /srv/landing/assets
           COPY src/shares /srv/landing/shares
           EOF
-          docker buildx build --platform linux/amd64 --load \
+          # Plain `docker build` — the gitea runner ships docker without
+          # the buildx plugin, so `docker buildx build --platform ...`
+          # exits 125 ("unknown flag: --platform"). The runner host is
+          # already linux/amd64 so cross-platform isn't needed here.
+          docker build \
             --build-arg BASE="$LATEST" \
             -f /tmp/Dockerfile.assets \
             -t "marketing:${{ steps.tag.outputs.tag }}" \
diff --git a/build-stage.sh b/build-stage.sh
index fb2a6fd..0a3ce1e 100755
--- a/build-stage.sh
+++ b/build-stage.sh
@@ -87,8 +87,14 @@ sed "${SED_INPLACE[@]}" \
   's|#include "el_runtime.h"|#include "el_runtime.h"\nel_val_t http_get_auth(el_val_t url, el_val_t tok);\nel_val_t http_post_auth(el_val_t url, el_val_t tok, el_val_t body);\nel_val_t http_post_auth_json(el_val_t url, el_val_t tok, el_val_t body);\nel_val_t http_delete_auth(el_val_t url, el_val_t bearer_tok, el_val_t apikey);\nel_val_t cwd(void);\nel_val_t color_bold(el_val_t s);\nel_val_t unix_timestamp(void);\nel_val_t gcs_write(el_val_t bucket, el_val_t object_name, el_val_t content);\nel_val_t gcs_read(el_val_t bucket, el_val_t object_name);\nel_val_t supabase_insert(el_val_t project_url, el_val_t service_key, el_val_t table, el_val_t row_json);\nel_val_t supabase_get(el_val_t project_url, el_val_t service_key, el_val_t table_and_query);\nel_val_t supabase_auth_user(el_val_t project_url, el_val_t anon_key, el_val_t user_jwt);\nel_val_t supabase_admin_invite(el_val_t project_url, el_val_t service_key, el_val_t body_json);\nel_val_t supabase_upsert_user(el_val_t project_url, el_val_t anon_key, el_val_t user_jwt, el_val_t table_and_query, el_val_t row_json);|' \
   dist/main.c
 
-echo "==> Building Docker image marketing:${TAG} for linux/amd64"
-docker buildx build --platform linux/amd64 --load \
+echo "==> Building Docker image marketing:${TAG}"
+# Plain `docker build` — the gitea runner doesn't ship buildx, so
+# `docker buildx build --platform ...` exits 125 ("unknown flag:
+# --platform"). The runner host is already linux/amd64 so the
+# explicit --platform is redundant. BUILDKIT_INLINE_CACHE works with
+# plain docker as long as DOCKER_BUILDKIT=1 is set (default on the
+# runner).
+docker build \
     --build-arg BUILDKIT_INLINE_CACHE=1 \
     --cache-from us-central1-docker.pkg.dev/neuron-785695/neuron-marketing/marketing:latest \
     -f Dockerfile.stage \
diff --git a/src/styles.el b/src/styles.el
index 3de832c..4ec8645 100644
--- a/src/styles.el
+++ b/src/styles.el
@@ -1603,6 +1603,53 @@ fn page_open() -> String {
     .demo-msg-ai .demo-msg-bubble ul, .demo-msg-ai .demo-msg-bubble ol { margin: 0.5rem 0 0.5rem 1.25rem; }
     .demo-msg-ai .demo-msg-bubble li + li { margin-top: 0.25rem; }
     .demo-msg-ai .demo-msg-bubble strong { font-weight: 600; }
+    .demo-msg-ai .demo-msg-bubble em { font-style: italic; }
+    .demo-msg-ai .demo-msg-bubble a { color: var(--navy); text-decoration: underline; }
+    /* Code: marked.js emits  for inline backticks and 
 for
+       fenced blocks. Without these rules they render as unstyled inline
+       text and the user can't tell where the code starts and stops. */
+    .demo-msg-ai .demo-msg-bubble code {
+      font-family: 'IBM Plex Mono', Menlo, Consolas, monospace;
+      font-size: 0.85em;
+      background: rgba(0, 0, 0, 0.06);
+      padding: 1px 4px;
+      border-radius: 3px;
+      word-break: break-word;
+    }
+    .demo-msg-ai .demo-msg-bubble pre {
+      background: rgba(0, 0, 0, 0.06);
+      padding: 0.75rem;
+      border-radius: 6px;
+      overflow-x: auto;
+      font-size: 0.85em;
+      line-height: 1.5;
+      margin: 0.5rem 0;
+      max-width: 100%;
+      white-space: pre;
+    }
+    .demo-msg-ai .demo-msg-bubble pre code {
+      background: none;
+      padding: 0;
+      font-size: inherit;
+      word-break: normal;
+    }
+    .demo-msg-ai .demo-msg-bubble blockquote {
+      border-left: 3px solid var(--border);
+      margin: 0.5rem 0;
+      padding: 0.25rem 0 0.25rem 0.75rem;
+      color: var(--t2);
+    }
+    .demo-msg-ai .demo-msg-bubble h1,
+    .demo-msg-ai .demo-msg-bubble h2,
+    .demo-msg-ai .demo-msg-bubble h3,
+    .demo-msg-ai .demo-msg-bubble h4 {
+      font-weight: 600;
+      margin: 0.5rem 0 0.25rem;
+    }
+    .demo-msg-ai .demo-msg-bubble h1 { font-size: 1.05em; }
+    .demo-msg-ai .demo-msg-bubble h2 { font-size: 1em; }
+    .demo-msg-ai .demo-msg-bubble h3 { font-size: 0.95em; }
+    .demo-msg-ai .demo-msg-bubble h4 { font-size: 0.9em; }
     .demo-msg-share {
       position: relative;
       margin-top: 0.375rem;