Polish: nav hamburger, pillar alignment, wordmark, hero tightening

- Nav: responsive hamburger at ≤1060px, full mobile menu with close behaviors
- Nav: all section anchors are absolute (/#...) for correct cross-page routing
- Pillars: flex column cards with margin-top:auto on taglines — all three align
- About footer: image wordmark matches main page (was plain text "Neuron")
- Hero: "Six patents" → "Patented"; sub-copy trimmed to one clean sentence
- Environmental/efficiency/inference: remove all "memory graph" mentions, cite 40% token reduction
- Environmental: savings calculator (slider, live annual savings calculation)
This commit is contained in:
Will Anderson
2026-04-29 17:31:26 -05:00
parent 3c462b3bf8
commit 4769613d10
7 changed files with 217 additions and 44 deletions
+2 -2
View File
@@ -120,8 +120,8 @@ fn about_page() -> String {
<div class=\"container\">
<div class=\"footer-inner\">
<a href=\"/\" class=\"footer-brand\" aria-label=\"Neuron home\">
<p class=\"footer-brand-name\">Neuron</p>
<a href=\"/\" class=\"footer-brand\" aria-label=\"Neuron home\" style=\"display:flex;flex-direction:column;align-items:center;\">
<img src=\"/assets/brand/neuron-wordmark-on-light.png\" srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" alt=\"Neuron\" height=\"24\" style=\"display:block;margin-bottom:0.35rem;\">
<p class=\"footer-brand-tagline\">Built Different.</p>
</a>
+2 -2
View File
@@ -57,10 +57,10 @@ fn efficiency() -> String {
<path d=\"M16 15l2 2 2-2\"/>
</svg>
</div>
<p class=\"efficiency-stat\">up to 38% per call</p>
<p class=\"efficiency-stat\">40% fewer tokens</p>
<p class=\"efficiency-title\">Context compression</p>
<div class=\"efficiency-rule\"></div>
<p class=\"efficiency-body\">The compression algorithm delivers up to 38% token reduction per context call - benchmarked on real prose content. Total savings compound: fewer calls, precise context assembly, smaller prompts on every step.</p>
<p class=\"efficiency-body\">Neuron delivers a 40% reduction in tokens across your AI interactions. Precise context assembly means smaller prompts on every call. Total savings compound: fewer calls, less compute, lower cost on every step.</p>
</div>
</div>
+35 -7
View File
@@ -18,20 +18,48 @@ fn environmental() -> String {
</div>
<h2 class=\"display-lg reveal\" style=\"transition-delay:80ms;margin-bottom:1.5rem\">
The AI that remembers<br>doesn&#39;t have to<br><span class=\"gold\">recompute.</span>
40% fewer tokens.<br><span class=\"gold\">Same work done.</span>
</h2>
<p class=\"reveal\" style=\"transition-delay:160ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8;margin-bottom:1.25rem\">
Every time you open ChatGPT and explain who you are again, that&#39;s computation that didn&#39;t need to happen. Every time the AI re-establishes your context from scratch, energy is spent re-deriving what it already knew.
Neuron delivers a 40% reduction in tokens across your AI interactions. Less computation. Lower cost. A smaller footprint. This isn&#39;t a setting you toggle - it&#39;s what persistent context does by default.
</p>
<p class=\"reveal\" style=\"transition-delay:220ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8;margin-bottom:1.25rem\">
Neuron&#39;s memory graph persists. The context tax - the repeated re-inference of who you are and what you&#39;re working on - doesn&#39;t accumulate. Over months of use, that compounds into a meaningful reduction in total computation.
Every time you open ChatGPT and explain who you are again, that&#39;s computation that didn&#39;t need to happen. With Neuron, that context tax doesn&#39;t accumulate. Over months of use, 40% fewer tokens compounds into a meaningful reduction in total compute - and a meaningful reduction in what you pay.
</p>
<p class=\"reveal\" style=\"transition-delay:280ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8\">
<p class=\"reveal\" style=\"transition-delay:280ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8;margin-bottom:2.5rem\">
This isn&#39;t a green marketing claim. It&#39;s a consequence of the design. The same architecture that makes Neuron better for you also makes it lighter on the planet.
</p>
<div class=\"reveal\" style=\"transition-delay:340ms;background:var(--card);border:1px solid rgba(0,82,160,.18);padding:2rem\">
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:var(--navy);margin-bottom:1.25rem\">Savings calculator</p>
<p style=\"font-family:var(--body);font-size:0.875rem;color:var(--t2);margin-bottom:1rem\">If you spend <strong id=\"calc-spend\" style=\"color:var(--t1)\">$50</strong>/month on AI&hellip;</p>
<input type=\"range\" id=\"calc-slider\" min=\"10\" max=\"500\" step=\"10\" value=\"50\" style=\"width:100%;accent-color:var(--navy);margin-bottom:1.5rem\">
<div style=\"display:flex;align-items:baseline;gap:0.75rem;margin-bottom:0.375rem\">
<span id=\"calc-savings\" style=\"font-family:var(--head);font-size:2.5rem;font-weight:600;color:var(--navy)\">$240</span>
<span style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.15em;text-transform:uppercase;color:var(--t3)\">saved per year</span>
</div>
<p style=\"font-family:var(--body);font-size:0.75rem;color:var(--t3)\">Based on 40% token reduction applied to your monthly spend.</p>
</div>
<script>
(function() {
var slider = document.getElementById('calc-slider');
var spendEl = document.getElementById('calc-spend');
var savingsEl = document.getElementById('calc-savings');
if (!slider) return;
function update() {
var monthly = parseInt(slider.value, 10);
var annual = Math.round(monthly * 0.40 * 12);
spendEl.textContent = '$' + monthly;
savingsEl.textContent = '$' + annual;
}
slider.addEventListener('input', update);
update();
})();
</script>
</div>
<div style=\"display:flex;flex-direction:column;gap:1.5rem;padding-top:1rem\">
@@ -48,15 +76,15 @@ fn environmental() -> String {
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:rgba(0,120,84,.70);margin-bottom:0.75rem\">No database server for your data</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">On-device storage</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
Your memory graph lives in a custom on-device storage layer we built for this purpose. No cloud database servers running 24&#x2F;7 to store and serve your conversations. No replication across availability zones. Just your device.
Your context lives on your device in a purpose-built local storage layer. No cloud database servers running 24&#x2F;7 to store and serve your conversations. No replication across availability zones. Just your device.
</p>
</div>
<div class=\"reveal card-dark\" style=\"transition-delay:300ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,120,84,.40)\">
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:rgba(0,120,84,.70);margin-bottom:0.75rem\">Persistent context = less recomputation</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">Remembered once, retrieved - not re-derived</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">No re-explaining. No wasted tokens.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
The structured memory graph means Neuron retrieves relevant context rather than re-inferring it from long conversation histories. Shorter, more targeted prompts. Less total token processing per useful outcome.
Neuron surfaces exactly what&#39;s relevant for each conversation - no re-deriving who you are from long histories. Shorter, more targeted prompts. 40% fewer tokens per useful outcome.
</p>
</div>
+3 -4
View File
@@ -10,16 +10,15 @@ fn hero() -> String {
<div class=\"glow-tl\" aria-hidden=\"true\"></div>
<div class=\"glow-br\" aria-hidden=\"true\"></div>
<p class=\"label hero-label animate-up-1\">One builder. Six patents. No permission.</p>
<p class=\"label hero-label animate-up-1\">One builder. Patented. No permission.</p>
<h1 class=\"display-xl hero-headline animate-up-2\">
Every AI resets when you close the tab.
<em class=\"gold\" style=\"font-style:normal\">I built the one that doesn&#39;t - and priced it below the ones that do.</em>
<em class=\"gold\" style=\"font-style:normal\">I built the one that doesn&#39;t.</em>
</h1>
<p class=\"hero-sub animate-up-3\">
Runs on your machine. Remembers everything. Cheaper than ChatGPT on day one.
No cloud required - and when you want inference, mine costs less than theirs.
Runs on your machine. Remembers everything. Priced below ChatGPT on day one.
</p>
<div class=\"hero-ctas animate-up-5\">
+1 -1
View File
@@ -43,7 +43,7 @@ fn inference() -> String {
<span class=\"stat-num\">Neuron</span>
<span class=\"stat-label\">The model - live on day one</span>
</div>
<p class=\"stat-body\">Built on Qwen3 - open weights, Sonnet-equivalent capability. Neuron wraps it with your full context, your memory graph, and years of accumulated intelligence. The model is the floor. Neuron is the ceiling.</p>
<p class=\"stat-body\">Built on Qwen3 - open weights, Sonnet-equivalent capability. Neuron wraps it with your full context, years of accumulated intelligence. The model is the floor. Neuron is the ceiling.</p>
</div>
<div class=\"stat-row reveal\" style=\"transition-delay:240ms\">
<div class=\"stat-row-head\">
+68 -8
View File
@@ -1,15 +1,14 @@
// components/nav.el - Top navigation bar.
// components/nav.el Top navigation bar.
//
// Returns an HTML string. Server-rendered, no JavaScript required for
// the nav structure itself. Scroll-based opacity is CSS-only via
// :has() and scroll-driven animations where supported; we default to
// a clean transparent state that looks great on first load.
// Responsive: desktop shows full link bar, 1060px collapses to hamburger.
// Hamburger toggles .nav-mobile panel. Closes on link click or outside click.
fn nav() -> String {
return "
<nav id=\"nav\">
<div class=\"nav-inner\">
<a href=\"/\" class=\"nav-logo\" aria-label=\"Neuron home\"><img src=\"/assets/brand/neuron-wordmark-on-light.png\" srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" alt=\"Neuron\" height=\"28\"></a>
<div class=\"nav-links\">
<a href=\"/#how-it-works\" class=\"nav-link\">How it works</a>
<a href=\"/#mission\" class=\"nav-link\">Mission</a>
@@ -17,11 +16,72 @@ fn nav() -> String {
<a href=\"/#environmental\" class=\"nav-link\">Environment</a>
<a href=\"/#pricing\" class=\"nav-link\">Pricing</a>
<a href=\"/#enterprise\" class=\"nav-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-link\">About</a>
<a href=\"#share\" class=\"nav-link cta\">Share Neuron </a>
<a href=\"#pricing\" class=\"nav-cta\">Get Access</a>
<a href=\"/about\" class=\"nav-link\">About</a>
<a href=\"/#share\" class=\"nav-link cta\">Share Neuron &#8594;</a>
<a href=\"/#pricing\" class=\"nav-cta\">Get Access</a>
</div>
<button class=\"nav-hamburger\" id=\"nav-hamburger\" aria-label=\"Open navigation\" aria-expanded=\"false\" aria-controls=\"nav-mobile\">
<span></span>
<span></span>
<span></span>
</button>
<div class=\"nav-mobile\" id=\"nav-mobile\" role=\"navigation\" aria-label=\"Mobile navigation\">
<a href=\"/#how-it-works\" class=\"nav-mobile-link\">How it works</a>
<a href=\"/#mission\" class=\"nav-mobile-link\">Mission</a>
<a href=\"/#safety\" class=\"nav-mobile-link\">Safety</a>
<a href=\"/#environmental\" class=\"nav-mobile-link\">Environment</a>
<a href=\"/#pricing\" class=\"nav-mobile-link\">Pricing</a>
<a href=\"/#enterprise\" class=\"nav-mobile-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-mobile-link\">About</a>
<a href=\"/#share\" class=\"nav-mobile-link cta\">Share Neuron &#8594;</a>
<a href=\"/#pricing\" class=\"nav-mobile-cta\">Get Access</a>
</div>
</div>
</nav>
<script>
(function() {
var btn = document.getElementById('nav-hamburger');
var menu = document.getElementById('nav-mobile');
var nav = document.getElementById('nav');
if (!btn || !menu) return;
function close() {
menu.classList.remove('open');
btn.setAttribute('aria-expanded', 'false');
}
function open() {
menu.classList.add('open');
btn.setAttribute('aria-expanded', 'true');
}
function toggle() {
if (menu.classList.contains('open')) { close(); } else { open(); }
}
btn.addEventListener('click', function(e) { e.stopPropagation(); toggle(); });
// Close on any link inside mobile menu
menu.querySelectorAll('a').forEach(function(a) {
a.addEventListener('click', close);
});
// Close when clicking outside
document.addEventListener('click', function(e) {
if (!nav.contains(e.target)) { close(); }
});
// Close on Escape
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') { close(); }
});
// Close if viewport grows past breakpoint
window.addEventListener('resize', function() {
if (window.innerWidth > 1060) { close(); }
});
})();
</script>
"
}
+106 -20
View File
@@ -198,49 +198,46 @@ fn page_open() -> String {
#nav {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 50;
z-index: 100;
transition: background 500ms, border-color 500ms;
}
#nav.scrolled {
background: rgba(250,250,248,.92);
background: rgba(250,250,248,.95);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
}
.nav-inner {
max-width: 1280px;
margin: 0 auto;
padding: 0 2.5rem;
padding: 0 2rem;
height: 4rem;
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
}
.nav-logo img { height: 2.25rem; width: auto; display: block; }
.nav-logo-text {
font-family: var(--head);
font-size: 1.4rem;
font-weight: 600;
color: var(--t1);
text-decoration: none;
letter-spacing: -0.02em;
}
.nav-logo img { height: 2rem; width: auto; display: block; }
/* Desktop links */
.nav-links {
display: flex;
align-items: center;
gap: 2rem;
gap: 1.25rem;
flex-wrap: nowrap;
}
.nav-link {
font-family: var(--body);
font-size: 0.7rem;
font-size: 0.675rem;
font-weight: 400;
letter-spacing: 0.18em;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--t3);
text-decoration: none;
white-space: nowrap;
transition: color 200ms;
}
.nav-link:hover { color: var(--t1); }
@@ -249,21 +246,107 @@ fn page_open() -> String {
.nav-cta {
font-family: var(--body);
font-size: 0.7rem;
font-size: 0.675rem;
font-weight: 500;
letter-spacing: 0.15em;
text-transform: uppercase;
color: #fff;
background: var(--navy);
text-decoration: none;
padding: 0.625rem 1.25rem;
padding: 0.575rem 1.1rem;
white-space: nowrap;
box-shadow: 0 2px 12px rgba(0,82,160,.20);
transition: background 300ms;
}
.nav-cta:hover { background: #0078D4; }
@media (max-width: 768px) {
.nav-links .nav-link:not(.nav-link-mobile) { display: none; }
/* Hamburger button */
.nav-hamburger {
display: none;
flex-direction: column;
justify-content: center;
gap: 5px;
background: none;
border: none;
cursor: pointer;
padding: 6px 4px;
z-index: 101;
-webkit-tap-highlight-color: transparent;
}
.nav-hamburger span {
display: block;
width: 22px;
height: 2px;
background: var(--t1);
border-radius: 1px;
transition: transform 280ms ease, opacity 200ms ease;
transform-origin: center;
}
.nav-hamburger[aria-expanded="true"] span:nth-child(1) {
transform: translateY(7px) rotate(45deg);
}
.nav-hamburger[aria-expanded="true"] span:nth-child(2) {
opacity: 0;
transform: scaleX(0);
}
.nav-hamburger[aria-expanded="true"] span:nth-child(3) {
transform: translateY(-7px) rotate(-45deg);
}
/* Mobile menu */
.nav-mobile {
display: none;
position: absolute;
top: 4rem;
left: 0; right: 0;
background: rgba(250,250,248,.98);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
padding: 0.5rem 0 1.5rem;
flex-direction: column;
box-shadow: 0 8px 32px rgba(0,0,0,.08);
}
.nav-mobile.open { display: flex; }
.nav-mobile-link {
display: block;
padding: 0.875rem 2rem;
font-family: var(--body);
font-size: 0.75rem;
font-weight: 400;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--t2);
text-decoration: none;
border-bottom: 1px solid rgba(0,0,0,.05);
transition: color 150ms, background 150ms;
}
.nav-mobile-link:last-child { border-bottom: none; }
.nav-mobile-link:hover { color: var(--t1); background: rgba(0,82,160,.03); }
.nav-mobile-link.cta { color: var(--navy); }
.nav-mobile-cta {
display: block;
margin: 1rem 2rem 0;
padding: 0.8rem 1.5rem;
text-align: center;
font-family: var(--body);
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.15em;
text-transform: uppercase;
color: #fff;
background: var(--navy);
text-decoration: none;
}
/* Responsive breakpoints */
@media (max-width: 1060px) {
.nav-links { display: none; }
.nav-hamburger { display: flex; }
}
@media (min-width: 1061px) {
.nav-mobile { display: none !important; }
.nav-hamburger { display: none !important; }
}
/* HERO */
@@ -351,6 +434,8 @@ fn page_open() -> String {
.pillar-card {
padding: 2.5rem 3rem;
display: flex;
flex-direction: column;
}
.pillar-numeral {
font-family: var(--head);
@@ -374,9 +459,10 @@ fn page_open() -> String {
font-size: 0.95rem;
color: var(--t2);
line-height: 1.75;
margin-bottom: 2rem;
flex: 1;
}
.pillar-detail {
margin-top: 2rem;
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.15em;