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:
+2
-2
@@ -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
@@ -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
@@ -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'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's computation that didn'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't a setting you toggle - it'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's memory graph persists. The context tax - the repeated re-inference of who you are and what you're working on - doesn'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's computation that didn't need to happen. With Neuron, that context tax doesn'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't a green marketing claim. It'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…</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/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/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'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
@@ -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't - and priced it below the ones that do.</em>
|
||||
<em class=\"gold\" style=\"font-style:normal\">I built the one that doesn'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
@@ -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
@@ -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 →</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 →</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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user