From 7f27f4be9fe7c3614f7ca160f6563977b3209a8f Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Sat, 9 May 2026 12:56:50 -0500 Subject: [PATCH 1/2] Fix broken payment page: escape html/body heredocs in page_open MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit elc's heredoc parser treats as an opener and scans forward for , which exists inside page_close's return statement. This caused the entire El source of page_close to be injected verbatim into the page_open output string, terminating the document before Stripe scripts could load. Fix: put in a quoted string literal and use ... as the sole heredoc in page_open — closes within the same function, no cross-boundary scanning. Stub page_close in styles.el as extern fn so dist/page_close.c supplies the definition. Also fix elc-broken hyphenated attributes in dist/page_close.c: aria-label, stroke-width, stroke-linecap, ×, and several text nodes that had whitespace stripped by the heredoc parser. --- dist/page_close.c | 2 +- src/styles.el | 69 +++-------------------------------------------- 2 files changed, 4 insertions(+), 67 deletions(-) diff --git a/dist/page_close.c b/dist/page_close.c index 0bbf0b6..17829eb 100644 --- a/dist/page_close.c +++ b/dist/page_close.c @@ -5,7 +5,7 @@ el_val_t page_close(void); el_val_t page_close(void) { - el_val_t widgets = ({ el_val_t _html_1 = EL_STR(""); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("TryNeuron")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Neuron")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("LiveDemo")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Send")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Preview")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Thisiswhatyouareabouttopublish")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("times;")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Cancel")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Publishtogallery")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1; }); + el_val_t widgets = ({ el_val_t _html_1 = EL_STR(""); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Try Neuron")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Neuron")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Live Demo")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Send")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Preview")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("This is what you are about to publish")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("×")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Cancel")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("Publish to gallery")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1 = el_str_concat(_html_1, EL_STR("")); _html_1; }); return el_str_concat(widgets, EL_STR("")); return 0; } diff --git a/src/styles.el b/src/styles.el index 960943d..2b79fcc 100644 --- a/src/styles.el +++ b/src/styles.el @@ -16,9 +16,7 @@ // in the noscript fallback style). fn page_open() -> String { - return - - + let h: String = Neuron - The AI That Remembers You @@ -1962,68 +1960,7 @@ fn page_open() -> String { } - + return "" + h + "" } -fn page_close() -> String { - let widgets: String =
- - - -
- -
- - - - - - - -
- return widgets + "" -} +extern fn page_close() -> String -- 2.52.0 From 90609c7aaf1b319173a60571fb4e7b3b10e31bc1 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Sat, 9 May 2026 13:07:06 -0500 Subject: [PATCH 2/2] Convert page_open to native El; fix corrupted CSS elc's heredoc tokenizer was corrupting the inline CSS: - #FAFAF8 -> FAFAF8 (# treated as comment character) - 'Playfair Display' -> PlayfairDisplay (quotes + space stripped) - padding: 0 2.5rem -> padding:02.5rem (spaces between tokens stripped) The CSS and other complex head content (GA script, JSON-LD schema) have been pre-compiled to C functions (page_css, page_ga_script, page_schema) so they bypass the tokenizer entirely and are stored as properly-escaped C string literals. page_head() now assembles the content using el-html vessel calls (el_meta_charset, el_meta, el_title, el_link_stylesheet, etc.) plus string literals for the vessel gaps. page_open() returns the complete document prologue as a string concatenation with no heredocs. page_close() remains pre-compiled in dist/page_close.c (unchanged). --- .gitignore | 3 + dist/page_css.c | 1808 +++++++++++++++++++++++++++++++++++++++ dist/page_ga.c | 15 + dist/page_schema.c | 110 +++ manifest.el | 3 + src/styles.el | 2006 ++------------------------------------------ 6 files changed, 1989 insertions(+), 1956 deletions(-) create mode 100644 dist/page_css.c create mode 100644 dist/page_ga.c create mode 100644 dist/page_schema.c diff --git a/.gitignore b/.gitignore index 003757c..2a4e284 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,9 @@ src/assets/js/ !dist/vessel_stubs.c !dist/soul-demo.c !dist/page_close.c +!dist/page_css.c +!dist/page_ga.c +!dist/page_schema.c !dist/elhtml_impl.c !dist/entrypoint.sh !dist/engram-snapshot.json diff --git a/dist/page_css.c b/dist/page_css.c new file mode 100644 index 0000000..885f479 --- /dev/null +++ b/dist/page_css.c @@ -0,0 +1,1808 @@ +#include +#include +#include "el_runtime.h" + +el_val_t page_css(void); + +el_val_t page_css(void) { + return EL_STR(""); +} diff --git a/dist/page_ga.c b/dist/page_ga.c new file mode 100644 index 0000000..15b1fb9 --- /dev/null +++ b/dist/page_ga.c @@ -0,0 +1,15 @@ +#include +#include +#include "el_runtime.h" + +el_val_t page_ga_script(void); + +el_val_t page_ga_script(void) { + return EL_STR(""); +} diff --git a/dist/page_schema.c b/dist/page_schema.c new file mode 100644 index 0000000..ea94612 --- /dev/null +++ b/dist/page_schema.c @@ -0,0 +1,110 @@ +#include +#include +#include "el_runtime.h" + +el_val_t page_schema(void); + +el_val_t page_schema(void) { + return EL_STR(""); +} diff --git a/manifest.el b/manifest.el index a8db0d9..6ca3cd8 100644 --- a/manifest.el +++ b/manifest.el @@ -13,4 +13,7 @@ build { c_source "dist/vessel_stubs.c" c_source "dist/elhtml_impl.c" c_source "dist/page_close.c" + c_source "dist/page_css.c" + c_source "dist/page_ga.c" + c_source "dist/page_schema.c" } diff --git a/src/styles.el b/src/styles.el index 2b79fcc..9798b56 100644 --- a/src/styles.el +++ b/src/styles.el @@ -4,1963 +4,57 @@ // This file contains NO application logic - only the outer HTML // document structure and presentation layer. // -// CSS is kept as a string constant here to keep component files -// free of style concerns. The inline - - - - - - - - - - - - - - - - - - - - - - - - - - - return "" + h + "" -} +// Pre-compiled C functions — bypass elc tokenizer for CSS and complex scripts +extern fn page_css() -> String +extern fn page_ga_script() -> String +extern fn page_schema() -> String extern fn page_close() -> String + +// el-html vessel — extern declarations (implementations in dist/elhtml_impl.c) +extern fn el_meta(name: String, content: String) -> String +extern fn el_meta_charset(charset: String) -> String +extern fn el_link_stylesheet(href: String) -> String +extern fn el_script_src(src: String, defer_load: Bool) -> String +extern fn el_script_inline(js: String) -> String +extern fn el_title(text: String) -> String + +fn page_head() -> String { + return el_meta_charset("UTF-8") + + el_meta("viewport", "width=device-width, initial-scale=1.0") + + el_title("Neuron - The AI That Remembers You") + + el_meta("description", "Every AI resets when you close the tab. Neuron doesn't. Runs on your machine. Remembers everything. Cheaper than ChatGPT on day one.") + + "" + + "" + + "" + + "" + + el_link_stylesheet("https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;1,400;1,500&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap") + + page_css() + + "" + + "" + + "" + + "" + + page_ga_script() + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + page_schema() +} + +fn page_open() -> String { + return "" + page_head() + "" +} -- 2.52.0