feat(homepage): align Understand Anything brand experience

This commit is contained in:
chienvon
2026-07-13 00:21:27 -04:00
parent e99fd9ee1b
commit 400d7e9852
12 changed files with 993 additions and 235 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -4,7 +4,7 @@ const youTubeUrl = `https://www.youtube.com/watch?v=${youTubeId}`;
const embedUrl = `https://www.youtube.com/embed/${youTubeId}?si=IB3cjpjbq9wis5D7`;
---
<section class="community-video">
<section class="community-video" id="community">
<span class="community-video-label reveal">Community</span>
<h2 class="community-video-heading reveal">
A walkthrough from the
+1 -1
View File
@@ -33,7 +33,7 @@ const features = [
];
---
<section class="features">
<section class="features" id="features">
<div class="features-grid">
{features.map((f, i) => (
<div class={`feature-card reveal reveal-delay-${(i % 2) + 1}`}>
+221 -59
View File
@@ -1,88 +1,250 @@
---
const githubUrl = 'https://github.com/Egonex-AI/Understand-Anything';
const repositoryUrl = 'https://github.com/Egonex-AI/Understand-Anything';
const githubUrl = 'https://github.com/Egonex-AI';
const xUrl = 'https://x.com/EgonexAI';
const egonexProductUrl = 'https://www.egonex.ai/';
const privacyUrl = 'https://legal.egonex.ai/en/privacy';
const termsUrl = 'https://legal.egonex.ai/en/terms';
const configuredMotherSiteUrl = (import.meta.env.PUBLIC_MOTHER_SITE_URL ?? '')
.trim()
.replace(/\/+$/, '');
const motherHomeUrl = configuredMotherSiteUrl
? `${configuredMotherSiteUrl}/#top`
: 'https://egonexai.com/#top';
const currentYear = new Date().getFullYear();
---
<footer class="footer">
<div class="footer-inner">
<span class="footer-logo">Understand Anything</span>
<div class="footer-links">
<a href={githubUrl} target="_blank" rel="noopener noreferrer">GitHub</a>
<span class="footer-sep">&middot;</span>
<a href="/demo/">Live Demo</a>
<span class="footer-sep">&middot;</span>
<a href={`${githubUrl}/blob/main/LICENSE`} target="_blank" rel="noopener noreferrer">MIT License</a>
<footer class="brand-footer">
<div class="brand-footer-inner">
<div class="brand-footer-row">
<a class="brand-footer-logo" href={motherHomeUrl} data-mother-site-link aria-label="EgonexAI home">
<img
src="/assets/egonexai/egonex-logo.png"
width="28"
height="28"
alt=""
aria-hidden="true"
loading="lazy"
decoding="async"
/>
<span>EgonexAI</span>
</a>
<div class="brand-footer-links">
<nav class="brand-footer-link-group" aria-label="EgonexAI products">
<a href={egonexProductUrl}>Egonex</a>
<a href="/" aria-current="page">Understand Anything</a>
</nav>
<nav class="brand-footer-link-group" aria-label="Legal and project links">
<a href={motherHomeUrl} data-mother-site-link>About Us</a>
<a href="mailto:affiliate@egonex.ai">Contact Us</a>
<a href={privacyUrl} target="_blank" rel="noopener noreferrer">Privacy</a>
<a href={termsUrl} target="_blank" rel="noopener noreferrer">Terms</a>
<a href={`${repositoryUrl}/blob/main/LICENSE`} target="_blank" rel="noopener noreferrer">MIT License</a>
<a href={repositoryUrl} target="_blank" rel="noopener noreferrer">Source Code</a>
</nav>
</div>
<div class="brand-footer-social-links" aria-label="EgonexAI social links">
<a href={xUrl} target="_blank" rel="noopener noreferrer" aria-label="EgonexAI on X">
<svg viewBox="0 0 24 24" width="17" height="17" fill="currentColor" aria-hidden="true">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24h-6.657l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231 5.45-6.231Zm-1.161 17.52h1.833L7.084 4.126H5.117L17.083 19.77Z"></path>
</svg>
</a>
<a href={githubUrl} target="_blank" rel="noopener noreferrer" aria-label="EgonexAI on GitHub">
<svg viewBox="0 0 24 24" width="17" height="17" fill="currentColor" aria-hidden="true">
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"></path>
</svg>
</a>
</div>
</div>
<div class="brand-footer-bottom">
<span>&copy; {currentYear} Infinite Universe, Inc.</span>
</div>
<p class="footer-note">An open-source project from Egonex. Originally created by Lum1104.</p>
<p class="footer-note">&copy; 2026 Infinite Universe, Inc.</p>
</div>
</footer>
<style>
.footer {
padding: 4rem 2rem;
border-top: 1px solid var(--border);
text-align: center;
.brand-footer {
position: relative;
z-index: 3;
overflow: hidden;
padding: 30px 32px 22px;
color: #1a0b54;
background:
radial-gradient(circle at 78% 0%, rgba(88, 43, 232, 0.08), transparent 38%),
linear-gradient(180deg, #ffffff 0%, #f7f5ff 100%);
font-family: var(--font-brand);
}
.footer-inner {
max-width: 1200px;
.brand-footer,
.brand-footer * {
box-sizing: border-box;
font-family: var(--font-brand);
}
.brand-footer-inner {
width: min(100%, 1152px);
margin: 0 auto;
}
.footer-links {
.brand-footer-row {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 28px;
min-height: 40px;
}
.brand-footer-logo {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
gap: 8px;
color: #1a0b54;
text-decoration: none;
}
.brand-footer-logo:hover {
color: #1a0b54;
text-decoration: none;
}
.brand-footer-logo img {
width: 28px;
height: 28px;
flex: 0 0 auto;
object-fit: contain;
}
.brand-footer-logo span {
font-size: 22px;
font-weight: 500;
line-height: 1;
letter-spacing: -0.02em;
}
.brand-footer-links,
.brand-footer-link-group {
display: flex;
align-items: center;
}
.brand-footer-links {
justify-content: center;
min-width: 0;
gap: 26px;
}
.brand-footer-link-group {
gap: 18px;
flex-wrap: wrap;
gap: 0.5rem 0.25rem;
justify-content: center;
}
.footer-logo {
font-family: var(--font-heading);
font-size: 1.15rem;
color: var(--text);
display: block;
margin-bottom: 1rem;
}
.footer-links {
margin-bottom: 1rem;
}
.footer-links a {
color: var(--text-muted);
font-size: 0.85rem;
.brand-footer-link-group a {
color: #746c91;
font-size: 13px;
line-height: 1.25;
text-decoration: none;
transition: color 0.2s;
white-space: nowrap;
transition: color 180ms ease;
}
.footer-links a:hover {
color: var(--accent);
}
.footer-sep {
color: var(--border);
margin: 0 0.6rem;
}
.footer-note {
font-size: 0.8rem;
color: var(--text-muted);
margin: 0.25rem 0;
}
.footer-note a {
color: var(--accent);
.brand-footer-link-group a:hover,
.brand-footer-link-group a[aria-current='page'] {
color: #582be8;
text-decoration: none;
}
.footer-note a:hover {
text-decoration: underline;
.brand-footer-social-links {
display: flex;
flex: 0 0 auto;
gap: 6px;
}
@media (max-width: 480px) {
.footer { padding: 3rem 1.25rem; }
.footer-sep { display: none; }
.footer-links { gap: 0.25rem 1rem; }
.brand-footer-social-links a {
width: 36px;
height: 36px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 11px;
color: #582be8;
background: #f4f2fb;
text-decoration: none;
transition: color 180ms ease, background-color 180ms ease, transform 180ms ease;
}
.brand-footer-social-links a:hover {
color: #ffffff;
background: #582be8;
text-decoration: none;
transform: translateY(-1px);
}
.brand-footer-bottom {
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
gap: 0.35rem 1.5rem;
margin-top: 18px;
color: #817a96;
font-size: 11px;
line-height: 1.45;
}
.brand-footer a:focus-visible {
outline: 3px solid rgba(88, 43, 232, 0.48);
outline-offset: 3px;
}
@media (max-width: 1000px) {
.brand-footer-row {
grid-template-columns: 1fr auto;
gap: 18px 24px;
}
.brand-footer-links {
grid-column: 1 / -1;
grid-row: 2;
justify-content: flex-start;
}
.brand-footer-social-links {
margin-left: auto;
}
}
@media (max-width: 680px) {
.brand-footer {
padding: 26px 20px 22px;
}
.brand-footer-links {
align-items: flex-start;
flex-direction: column;
gap: 12px;
}
.brand-footer-link-group {
flex-wrap: wrap;
justify-content: flex-start;
gap: 10px 16px;
}
.brand-footer-bottom {
justify-content: flex-start;
gap: 0.4rem;
margin-top: 20px;
}
}
@media (prefers-reduced-motion: reduce) {
.brand-footer * {
transition-duration: 0.01ms !important;
}
}
</style>
+33 -80
View File
@@ -3,7 +3,7 @@ const githubUrl = 'https://github.com/Egonex-AI/Understand-Anything';
const egonexUrl = 'https://egonex.ai';
---
<section class="hero">
<section class="hero" id="top">
<div class="hero-bg">
<img src="/images/hero.jpg" alt="" class="hero-bg-img" loading="eager" />
<div class="hero-overlay"></div>
@@ -38,8 +38,8 @@ const egonexUrl = 'https://egonex.ai';
</div>
<div class="hero-actions anim anim-6">
<a href="#install" class="hero-cta">Get Started</a>
<a href="/demo/" class="hero-demo">Live Demo &rarr;</a>
<a href="#install" class="hero-cta"><span>Get Started</span></a>
<a href="#live-demo" class="hero-demo">Live Demo &rarr;</a>
<a href={githubUrl} target="_blank" rel="noopener noreferrer" class="hero-secondary">
<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" style="vertical-align:-2px;margin-right:4px;"><path d="M12 .587l3.668 7.568L24 9.306l-6 5.986 1.416 8.421L12 19.897l-7.416 3.816L6 15.292 0 9.306l8.332-1.151z"/></svg>
Star on GitHub
@@ -83,12 +83,6 @@ const egonexUrl = 'https://egonex.ai';
/>
</a>
<a href={egonexUrl} target="_blank" rel="noopener noreferrer" class="hero-company anim anim-6">
<span class="hero-company-label">Company</span>
<span class="hero-company-divider">&middot;</span>
<span class="hero-company-site">egonex.ai</span>
<span class="hero-company-arrow">&rarr;</span>
</a>
</div>
</section>
@@ -289,22 +283,34 @@ const egonexUrl = 'https://egonex.ai';
}
.hero-cta {
background: linear-gradient(135deg, var(--accent), var(--accent-3));
background: var(--egonex-gradient-primary);
color: #ffffff;
padding: 0.85rem 2.5rem;
padding: 1px;
border-radius: 999px;
font-weight: 600;
font-size: 1.05rem;
text-decoration: none;
box-shadow: 0 16px 34px rgba(88, 43, 232, 0.22);
transition: box-shadow 0.3s ease, transform 0.2s ease, filter 0.2s ease;
box-shadow: none;
transition: transform 0.2s ease;
}
.hero-cta span {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.85rem 2.5rem;
border-radius: 999px;
background: #582be8;
transition: background 0.3s ease;
}
.hero-cta:hover {
text-decoration: none;
box-shadow: 0 22px 44px rgba(88, 43, 232, 0.28);
transform: translateY(-2px);
filter: brightness(1.02);
}
.hero-cta:hover span,
.hero-cta:focus-visible span {
background: transparent;
}
.hero-demo {
@@ -321,11 +327,16 @@ const egonexUrl = 'https://egonex.ai';
.hero-demo:hover {
background: #ffffff;
box-shadow: 0 16px 34px rgba(88, 43, 232, 0.12);
box-shadow: 0 12px 28px rgba(88, 43, 232, 0.18);
transform: translateY(-2px);
text-decoration: none;
}
.hero-cta:active,
.hero-demo:active {
transform: scale(0.98);
}
.hero-secondary {
color: var(--text-muted);
font-size: 0.95rem;
@@ -435,61 +446,6 @@ const egonexUrl = 'https://egonex.ai';
white-space: nowrap;
}
.hero-company {
margin-top: 1.25rem;
display: inline-flex;
align-items: center;
gap: 0.55rem;
padding: 0.45rem 1.1rem;
border: 1px solid rgba(88, 43, 232, 0.18);
border-radius: 100px;
background: rgba(255, 255, 255, 0.68);
box-shadow: var(--shadow-card);
backdrop-filter: blur(18px) saturate(1.12);
text-decoration: none;
transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.2s ease,
background-color 0.25s ease;
}
.hero-company:hover {
border-color: rgba(88, 43, 232, 0.3);
background: #ffffff;
box-shadow: 0 18px 38px rgba(88, 43, 232, 0.14);
transform: translateY(-1px);
text-decoration: none;
}
.hero-company-label {
font-family: var(--font-code);
font-size: 0.7rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--accent);
}
.hero-company-divider {
color: rgba(88, 43, 232, 0.36);
font-size: 0.85rem;
line-height: 1;
}
.hero-company-site {
font-family: var(--font-code);
font-size: 0.82rem;
color: var(--text-soft);
}
.hero-company-arrow {
color: var(--accent);
font-size: 0.95rem;
line-height: 1;
transition: transform 0.2s ease;
}
.hero-company:hover .hero-company-arrow {
transform: translateX(3px);
}
/* Staggered entrance */
@keyframes heroIn {
from {
@@ -576,16 +532,13 @@ const egonexUrl = 'https://egonex.ai';
padding: 0.85rem 1.5rem;
justify-content: center;
}
.hero-cta span {
width: 100%;
padding: 0.85rem 1.5rem;
}
.hero-pillars { flex-direction: column; gap: 0.4rem; }
.pillar-dot { display: none; }
.hero-company {
flex-direction: column;
gap: 0.25rem;
padding: 0.6rem 1.25rem;
max-width: 100%;
}
.hero-company-divider { display: none; }
.hero-company-site { font-size: 0.78rem; }
}
@media (max-width: 480px) {
+659 -78
View File
@@ -1,133 +1,714 @@
---
const githubUrl = 'https://github.com/Egonex-AI/Understand-Anything';
const egonexProductUrl = 'https://www.egonex.ai/';
const configuredMotherSiteUrl = (import.meta.env.PUBLIC_MOTHER_SITE_URL ?? '')
.trim()
.replace(/\/+$/, '');
const motherHomeUrl = configuredMotherSiteUrl
? `${configuredMotherSiteUrl}/#top`
: 'https://egonexai.com/#top';
const navigation = {
home: '#top',
features: '#features',
liveDemo: '#live-demo',
community: '#community',
getStarted: '#install',
};
---
<nav class="nav" id="nav">
<div class="nav-inner">
<a href="/" class="nav-logo">EgonexAI</a>
<div class="nav-links">
<a href={githubUrl} target="_blank" rel="noopener noreferrer" class="nav-github">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor" aria-hidden="true">
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/>
<span class="brand-scroll-marker" id="brand-scroll-marker" aria-hidden="true"></span>
<header class="brand-header" id="brand-header">
<nav class="brand-nav" aria-label="Primary navigation">
<a class="brand-home" href={motherHomeUrl} data-mother-site-link aria-label="EgonexAI home">
<img
src="/assets/egonexai/egonex-logo.png"
width="28"
height="28"
alt=""
aria-hidden="true"
decoding="async"
/>
<span>EgonexAI</span>
</a>
<div class="brand-desktop-nav" aria-label="EgonexAI navigation">
<a href={navigation.home}>Home</a>
<details class="brand-products" id="brand-products">
<summary aria-haspopup="menu">
<span>Products</span>
<svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">
<path d="m4 6 4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</summary>
<div class="brand-products-menu" role="menu" aria-label="Products">
<a href={egonexProductUrl} role="menuitem">
<strong>Egonex</strong>
<span>Find the right people for real work</span>
</a>
<a href="/" role="menuitem" aria-current="page">
<strong>Understand Anything</strong>
<span>Understand codebases through guided context</span>
</a>
</div>
</details>
<a href={navigation.features}>Features</a>
<a href={navigation.liveDemo}>Live Demo</a>
<a href={navigation.community}>Community</a>
</div>
<div class="brand-desktop-actions">
<a
class="brand-github"
href={githubUrl}
target="_blank"
rel="noopener noreferrer"
>
<svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true">
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"></path>
</svg>
<span>GitHub</span>
</a>
<a href="#install" class="nav-cta">Get Started</a>
<a class="brand-cta" href={navigation.getStarted}><span>Get Started</span></a>
</div>
</div>
</nav>
<button
class="brand-menu-toggle"
id="brand-menu-toggle"
type="button"
aria-expanded="false"
aria-controls="brand-mobile-menu"
aria-label="Open navigation menu"
>
<svg class="brand-menu-open-icon" viewBox="0 0 24 24" width="22" height="22" aria-hidden="true">
<path d="M4 7h16M4 12h16M4 17h16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path>
</svg>
<svg class="brand-menu-close-icon" viewBox="0 0 24 24" width="22" height="22" aria-hidden="true" hidden>
<path d="m6 6 12 12M18 6 6 18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path>
</svg>
</button>
<div class="brand-mobile-panel" id="brand-mobile-menu" hidden>
<a href={navigation.home}>Home</a>
<div class="brand-mobile-products">
<span class="brand-mobile-label">Products</span>
<a href={egonexProductUrl}>
<strong>Egonex</strong>
<span>Find the right people for real work</span>
</a>
<a href="/" aria-current="page">
<strong>Understand Anything</strong>
<span>Understand codebases through guided context</span>
</a>
</div>
<a href={navigation.features}>Features</a>
<a href={navigation.liveDemo}>Live Demo</a>
<a href={navigation.community}>Community</a>
<div class="brand-mobile-actions">
<a
class="brand-github"
href={githubUrl}
target="_blank"
rel="noopener noreferrer"
>
<svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true">
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"></path>
</svg>
<span>GitHub</span>
</a>
<a class="brand-cta" href={navigation.getStarted}><span>Get Started</span></a>
</div>
</div>
</nav>
</header>
<script>
const nav = document.getElementById('nav');
if (nav) {
window.addEventListener('scroll', () => {
nav.classList.toggle('scrolled', window.scrollY > 50);
const header = document.getElementById('brand-header');
const scrollMarker = document.getElementById('brand-scroll-marker');
const products = document.getElementById('brand-products');
const productsSummary = products?.querySelector('summary');
const productItems = products?.querySelectorAll<HTMLElement>('[role="menuitem"]');
const menuToggle = document.getElementById('brand-menu-toggle');
const mobileMenu = document.getElementById('brand-mobile-menu');
const menuOpenIcon = menuToggle?.querySelector<SVGElement>('.brand-menu-open-icon');
const menuCloseIcon = menuToggle?.querySelector<SVGElement>('.brand-menu-close-icon');
if (['127.0.0.1', 'localhost', '::1', '[::1]'].includes(window.location.hostname)) {
document.querySelectorAll<HTMLAnchorElement>('[data-mother-site-link]').forEach((link) => {
link.href = 'http://127.0.0.1:4174/#top';
});
}
if (header && scrollMarker && 'IntersectionObserver' in window) {
const observer = new IntersectionObserver(
([entry]) => header.classList.toggle('is-compact', !entry.isIntersecting),
{ threshold: 0 }
);
observer.observe(scrollMarker);
}
const closeProducts = (restoreFocus = false) => {
if (!(products instanceof HTMLDetailsElement) || !products.open) return;
products.open = false;
if (restoreFocus && productsSummary instanceof HTMLElement) productsSummary.focus();
};
const setMobileMenu = (open: boolean, restoreFocus = false) => {
if (!(menuToggle instanceof HTMLButtonElement) || !(mobileMenu instanceof HTMLElement)) return;
menuToggle.setAttribute('aria-expanded', String(open));
menuToggle.setAttribute('aria-label', open ? 'Close navigation menu' : 'Open navigation menu');
mobileMenu.hidden = !open;
menuOpenIcon?.toggleAttribute('hidden', open);
menuCloseIcon?.toggleAttribute('hidden', !open);
document.documentElement.classList.toggle('brand-menu-is-open', open);
if (restoreFocus) menuToggle.focus();
};
productsSummary?.addEventListener('keydown', (event) => {
if (!(products instanceof HTMLDetailsElement) || !productItems?.length) return;
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
event.preventDefault();
products.open = true;
const item = event.key === 'ArrowDown' ? productItems[0] : productItems[productItems.length - 1];
item?.focus();
}
});
productItems?.forEach((item, index) => {
item.addEventListener('keydown', (event) => {
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
event.preventDefault();
const direction = event.key === 'ArrowDown' ? 1 : -1;
const nextIndex = (index + direction + productItems.length) % productItems.length;
productItems[nextIndex]?.focus();
});
});
menuToggle?.addEventListener('click', () => {
const isOpen = menuToggle.getAttribute('aria-expanded') === 'true';
setMobileMenu(!isOpen);
closeProducts();
});
mobileMenu?.querySelectorAll('a').forEach((link) => {
link.addEventListener('click', () => setMobileMenu(false));
});
document.addEventListener('keydown', (event) => {
if (event.key !== 'Escape') return;
closeProducts(true);
if (menuToggle?.getAttribute('aria-expanded') === 'true') setMobileMenu(false, true);
});
document.addEventListener('click', (event) => {
const target = event.target;
if (!(target instanceof Node)) return;
if (products && !products.contains(target)) closeProducts();
if (header && !header.contains(target)) setMobileMenu(false);
});
const desktopQuery = window.matchMedia('(min-width: 1100px)');
products?.addEventListener('pointerenter', () => {
if (desktopQuery.matches && products instanceof HTMLDetailsElement) products.open = true;
});
products?.addEventListener('pointerleave', () => {
if (desktopQuery.matches) closeProducts();
});
products?.addEventListener('focusin', () => {
if (desktopQuery.matches && products instanceof HTMLDetailsElement) products.open = true;
});
products?.addEventListener('focusout', (event) => {
if (!desktopQuery.matches || !(products instanceof HTMLDetailsElement)) return;
const nextTarget = event.relatedTarget;
if (!(nextTarget instanceof Node) || !products.contains(nextTarget)) closeProducts();
});
desktopQuery.addEventListener('change', (event) => {
if (event.matches) setMobileMenu(false);
else closeProducts();
});
</script>
<style>
.nav {
position: fixed;
top: 0;
.brand-scroll-marker {
position: absolute;
top: 20px;
left: 0;
right: 0;
width: 1px;
height: 1px;
pointer-events: none;
}
.brand-header {
position: fixed;
top: 1rem;
left: 50%;
z-index: 100;
padding: 1rem 2rem;
transition: background-color 0.3s ease, backdrop-filter 0.3s ease;
width: min(calc(100% - 2rem), 1152px);
transform: translateX(-50%);
color: #1a0b54;
font-family: var(--font-brand);
transition: width 500ms ease-in-out;
}
.nav.scrolled {
background-color: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
.brand-header.is-compact {
width: min(calc(100% - 2rem), 1024px);
}
.nav.scrolled .nav-logo {
color: var(--text);
.brand-header,
.brand-header * {
box-sizing: border-box;
font-family: var(--font-brand);
}
.nav.scrolled .nav-github {
color: var(--text-muted);
}
.nav.scrolled .nav-github:hover {
color: var(--text);
}
.nav-inner {
max-width: 1200px;
margin: 0 auto;
display: flex;
.brand-nav {
position: relative;
min-height: 54px;
display: grid;
grid-template-columns: minmax(180px, 1fr) auto minmax(180px, 1fr);
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 6px 8px 6px 20px;
border-radius: 16px;
background: #ffffff;
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
transition: padding 500ms ease-in-out, box-shadow 500ms ease-in-out;
}
.nav-logo {
font-family: var(--font-heading);
font-size: 1.25rem;
color: var(--text);
text-decoration: none;
.brand-header.is-compact .brand-nav {
padding-left: 16px;
}
.brand-home {
grid-column: 1;
justify-self: start;
display: inline-flex;
flex: 0 0 auto;
align-items: center;
gap: 8px;
min-width: 0;
}
.nav-logo:hover {
color: #1a0b54;
text-decoration: none;
color: var(--accent);
}
.nav-links {
.brand-home:hover {
color: #1a0b54;
text-decoration: none;
}
.brand-home img {
width: 28px;
height: 28px;
flex: 0 0 auto;
object-fit: contain;
}
.brand-home span {
font-size: 22px;
font-weight: 500;
line-height: 1;
letter-spacing: -0.02em;
white-space: nowrap;
}
.brand-desktop-nav {
grid-column: 2;
justify-self: center;
display: flex;
align-items: center;
gap: 1.5rem;
justify-content: center;
gap: 4px;
transition: gap 500ms ease-in-out;
}
.nav-github {
display: flex;
.brand-header.is-compact .brand-desktop-nav {
gap: 0;
}
.brand-desktop-nav > a,
.brand-products > summary {
min-height: 40px;
display: inline-flex;
align-items: center;
gap: 0.5rem;
color: var(--text-muted);
font-size: 0.9rem;
justify-content: center;
gap: 4px;
padding: 0 16px;
border: 0;
border-radius: 12px;
color: #1a0b54;
background: transparent;
font-size: 14px;
font-weight: 400;
line-height: 1;
text-decoration: none;
transition: color 0.2s;
white-space: nowrap;
cursor: pointer;
transition: background-color 180ms ease, color 180ms ease, padding 500ms ease-in-out, transform 180ms ease;
}
.nav-github:hover {
color: var(--text);
.brand-header.is-compact .brand-desktop-nav > a,
.brand-header.is-compact .brand-products > summary {
padding-right: 8px;
padding-left: 8px;
}
.brand-desktop-nav > a:hover,
.brand-products > summary:hover,
.brand-products[open] > summary {
color: #1a0b54;
background: #f4f2fb;
text-decoration: none;
}
.nav-cta {
background: var(--accent);
.brand-desktop-nav > a:active,
.brand-products > summary:active,
.brand-github:active,
.brand-cta:active,
.brand-menu-toggle:active {
transform: scale(0.98);
}
.brand-products {
position: relative;
}
.brand-products::after {
content: '';
position: absolute;
top: 100%;
left: 0;
width: 100%;
height: 14px;
}
.brand-products > summary {
list-style: none;
}
.brand-products > summary::-webkit-details-marker {
display: none;
}
.brand-products > summary svg {
transition: transform 180ms ease;
}
.brand-products[open] > summary svg {
transform: rotate(180deg);
}
.brand-products-menu {
position: absolute;
top: calc(100% + 12px);
left: 50%;
width: 330px;
display: grid;
gap: 4px;
padding: 8px;
border: 1px solid rgba(88, 43, 232, 0.12);
border-radius: 16px;
background: #ffffff;
box-shadow: 0 20px 48px rgba(26, 11, 84, 0.16);
transform: translateX(-50%);
}
.brand-products-menu a {
position: relative;
display: grid;
gap: 4px;
padding: 12px;
border-radius: 12px;
color: #1a0b54;
text-decoration: none;
transition: background-color 180ms ease;
}
.brand-products-menu a:hover,
.brand-products-menu a:focus-visible,
.brand-products-menu a[aria-current='page'] {
background: #f4f1ff;
text-decoration: none;
}
.brand-products-menu a[aria-current='page'] {
color: #582be8;
}
.brand-products-menu a[aria-current='page']::before {
content: '';
position: absolute;
top: 10px;
bottom: 10px;
left: 5px;
width: 3px;
border-radius: 999px;
background: #582be8;
}
.brand-products-menu strong {
font-size: 14px;
font-weight: 500;
line-height: 1.2;
}
.brand-products-menu span {
color: #746c91;
font-size: 12px;
line-height: 1.35;
}
.brand-desktop-actions {
grid-column: 3;
justify-self: end;
display: flex;
flex: 0 0 auto;
align-items: center;
gap: 4px;
}
.brand-github {
min-height: 42px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 0 12px;
border-radius: 12px;
color: #1a0b54;
font-size: 14px;
font-weight: 400;
line-height: 1;
text-decoration: none;
transition: background-color 180ms ease, transform 180ms ease;
}
.brand-github:hover {
color: #1a0b54;
background: #f4f2fb;
text-decoration: none;
}
.brand-cta {
min-height: 42px;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 1px;
border-radius: 12px;
overflow: hidden;
color: #ffffff;
padding: 0.5rem 1.25rem;
border-radius: 6px;
font-weight: 600;
font-size: 0.9rem;
background: var(--egonex-gradient-primary);
box-shadow: none;
font-size: 14px;
font-weight: 500;
line-height: 1;
text-decoration: none;
transition: box-shadow 0.3s ease;
white-space: nowrap;
transition: transform 180ms ease;
}
.nav-cta:hover {
.brand-cta > span {
min-height: 40px;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 19px;
border-radius: 11px;
background: #582be8;
transition: background 300ms ease;
}
.brand-cta:hover {
color: #ffffff;
background: var(--egonex-gradient-primary);
text-decoration: none;
box-shadow: 0 0 20px var(--accent-glow);
}
.brand-cta:hover > span,
.brand-cta:focus-visible > span {
background: transparent;
}
.brand-menu-toggle,
.brand-mobile-panel {
display: none;
}
.brand-menu-open-icon[hidden],
.brand-menu-close-icon[hidden] {
display: none;
}
:global(.brand-menu-is-open) {
overflow: hidden;
}
@media (max-width: 1099px) {
.brand-nav {
grid-template-columns: minmax(0, 1fr) auto;
}
.brand-desktop-nav,
.brand-desktop-actions {
display: none;
}
.brand-menu-toggle {
grid-column: 2;
justify-self: end;
width: 40px;
height: 40px;
display: inline-flex;
flex: 0 0 auto;
align-items: center;
justify-content: center;
margin-left: 0;
padding: 0;
border: 0;
border-radius: 12px;
color: #1a0b54;
background: transparent;
cursor: pointer;
transition: background-color 180ms ease, transform 180ms ease;
}
.brand-menu-toggle:hover {
background: #f4f2fb;
}
.brand-mobile-panel {
position: absolute;
top: calc(100% + 8px);
left: 0;
width: 100%;
display: grid;
gap: 4px;
padding: 10px;
border: 1px solid rgba(88, 43, 232, 0.1);
border-radius: 16px;
background: #ffffff;
box-shadow: 0 20px 48px rgba(26, 11, 84, 0.16);
}
.brand-mobile-panel[hidden] {
display: none;
}
.brand-mobile-panel > a,
.brand-mobile-products > a {
min-height: 42px;
display: flex;
align-items: center;
padding: 0 14px;
border-radius: 12px;
color: #1a0b54;
font-size: 14px;
text-decoration: none;
transition: background-color 180ms ease;
}
.brand-mobile-panel > a:hover,
.brand-mobile-products > a:hover,
.brand-mobile-products > a[aria-current='page'] {
background: #f4f1ff;
text-decoration: none;
}
.brand-mobile-products {
display: grid;
gap: 2px;
padding: 6px;
border-radius: 12px;
background: #f8f7fc;
}
.brand-mobile-label {
padding: 6px 8px 4px;
color: #746c91;
font-size: 12px;
font-weight: 500;
}
.brand-mobile-products > a {
min-height: 0;
display: grid;
align-items: start;
gap: 3px;
padding: 10px 12px;
}
.brand-mobile-products > a strong {
font-size: 14px;
font-weight: 500;
line-height: 1.2;
}
.brand-mobile-products > a span {
color: #746c91;
font-size: 12px;
font-weight: 400;
line-height: 1.35;
}
.brand-mobile-actions {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
gap: 8px;
padding-top: 6px;
border-top: 1px solid #ece9f5;
}
.brand-mobile-actions .brand-github,
.brand-mobile-actions .brand-cta {
min-height: 44px;
}
.brand-mobile-actions .brand-cta > span {
min-height: 42px;
width: 100%;
}
}
@media (max-width: 480px) {
.nav { padding: 0.75rem 1rem; }
.nav-github span { display: none; }
.brand-header {
top: 12px;
width: calc(100% - 24px);
}
.brand-header.is-compact {
width: calc(100% - 24px);
}
.brand-nav {
padding-left: 20px;
}
.brand-home span {
font-size: 20px;
}
}
@media (max-width: 540px) {
.nav { padding: 0.75rem 1rem; }
.nav-logo { font-size: 1.05rem; }
.nav-links { gap: 0.85rem; }
.nav-github span { display: none; }
.nav-cta {
padding: 0.48rem 0.85rem;
font-size: 0.82rem;
white-space: nowrap;
@media (prefers-reduced-motion: reduce) {
.brand-header,
.brand-header * {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
}
}
</style>
+1 -1
View File
@@ -1,4 +1,4 @@
<section class="problem">
<section class="problem" id="what-we-build">
<h2 class="problem-heading reveal">
Most code graphs show you <span class="grad">structure</span>.<br />
Files, functions, edges. A map with no legend.
+9 -4
View File
@@ -4,15 +4,15 @@ const demoUrl = `${base.endsWith('/') ? base : base + '/'}demo/index.html`;
---
<!-- Live Demo -->
<section class="showcase showcase--demo">
<section class="showcase showcase--demo" id="live-demo">
<span class="showcase-label showcase-label--accent reveal">Live Demo</span>
<h2 class="showcase-heading reveal">
See what your code is <span class="grad">really</span> doing
</h2>
<p class="showcase-desc showcase-desc--wide reveal">
Explore every file, function, and dependency &mdash; or switch to <span class="grad">business
knowledge</span> mode and watch your code transform into authentication flows,
payment pipelines, and user lifecycles. Not just a map.
knowledge</span> mode and watch your code<span class="showcase-desc-break"><br /></span>
transform into authentication flows, payment pipelines, and user lifecycles. Not just a map.<span class="showcase-desc-break"><br /></span>
<strong>The story behind your codebase, fully interactive.</strong>
</p>
<div class="showcase-frame showcase-frame--featured reveal reveal-delay-1">
@@ -98,7 +98,11 @@ const demoUrl = `${base.endsWith('/') ? base : base + '/'}demo/index.html`;
}
.showcase-desc--wide {
max-width: 700px;
max-width: 960px;
}
.showcase-desc-break {
display: inline;
}
.showcase-desc strong {
@@ -205,5 +209,6 @@ const demoUrl = `${base.endsWith('/') ? base : base + '/'}demo/index.html`;
.showcase-features { gap: 0.5rem; }
.showcase-pill { font-size: 0.7rem; padding: 0.25rem 0.65rem; }
.showcase-iframe-wrap { aspect-ratio: 4 / 3; }
.showcase-desc-break { display: none; }
}
</style>
+3
View File
@@ -12,6 +12,9 @@ const { title } = Astro.props;
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Turn any codebase into an interactive knowledge graph you can explore, search, and learn from." />
<link rel="preload" href="/fonts/MazzardH-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
<link rel="preload" href="/fonts/MazzardH-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
<link rel="preload" href="/assets/egonexai/egonex-logo.png" as="image" type="image/png" />
<link rel="icon" type="image/png" href="/favicon.png" />
<title>{title}</title>
</head>
+65 -11
View File
@@ -1,4 +1,20 @@
/* Font declarations — self-hosted, no external CDN dependency */
@font-face {
font-family: 'Mazzard H';
src: url('/fonts/MazzardH-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Mazzard H';
src: url('/fonts/MazzardH-Medium.woff2') format('woff2');
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Geist Variable';
src: url('/fonts/GeistVariable.woff2') format('woff2');
@@ -55,10 +71,19 @@
--surface-dark: #10131d;
--border: #e8e1ff;
--border-soft: #eceef4;
--egonex-violet-deep: #35138f;
--egonex-violet: #582be8;
--egonex-violet-bright: #744bef;
--egonex-violet-light: #a996ff;
--egonex-violet-mist: #c2b6ff;
--egonex-gradient-primary: linear-gradient(90deg, #35138f 0%, #582be8 52%, #744bef 100%);
--egonex-gradient-on-dark: linear-gradient(90deg, #a996ff 0%, #8064f4 45%, #c2b6ff 100%);
--egonex-button-glow: 0 12px 28px rgba(88, 43, 232, 0.24);
--egonex-button-glow-hover: 0 16px 36px rgba(88, 43, 232, 0.34);
--accent: #582be8;
--accent-2: #6236ff;
--accent-3: #8b5cf6;
--accent-deep: #4520c8;
--accent-2: #582be8;
--accent-3: #744bef;
--accent-deep: #35138f;
--accent-soft: #f1ecff;
--accent-glow: rgba(88, 43, 232, 0.18);
--text: #0f1020;
@@ -69,15 +94,16 @@
--shadow-soft: 0 30px 80px rgba(88, 43, 232, 0.12), 0 10px 30px rgba(15, 16, 32, 0.08);
--shadow-card: 0 18px 42px rgba(80, 70, 120, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.86);
/* Egonex sweep: violet -> purple */
--grad-cool: #8b5cf6;
--grad-mid: #6236ff;
--grad-warm: #582be8;
--gradient: linear-gradient(135deg, var(--grad-cool), var(--grad-mid), var(--grad-warm));
/* Egonex sweep: deep violet -> brand violet -> bright violet */
--grad-cool: #35138f;
--grad-mid: #582be8;
--grad-warm: #744bef;
--gradient: var(--egonex-gradient-primary);
--font-heading: 'Geist Variable', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-body: 'Geist Variable', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-code: 'Geist Mono Variable', 'JetBrains Mono', 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
--font-heading: 'Mazzard H', sans-serif;
--font-body: 'Mazzard H', sans-serif;
--font-code: 'Mazzard H', sans-serif;
--font-brand: 'Mazzard H', sans-serif;
}
/* Reset & base */
@@ -91,6 +117,19 @@ html {
scroll-behavior: smooth;
}
html,
body,
button,
input,
textarea,
select {
font-family: 'Mazzard H', sans-serif;
}
section[id] {
scroll-margin-top: 6rem;
}
body {
font-family: var(--font-body);
background:
@@ -157,3 +196,18 @@ a {
a:hover {
text-decoration: underline;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
scroll-behavior: auto !important;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}