improved a lot of things
This commit is contained in:
@@ -313,7 +313,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-actions">
|
<div class="nav-actions">
|
||||||
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
||||||
<a href="#" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Get Started</a>
|
||||||
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -339,7 +339,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-mobile-ctas">
|
<div class="nav-mobile-ctas">
|
||||||
<a href="#" class="btn btn-secondary">Log in</a>
|
<a href="#" class="btn btn-secondary">Log in</a>
|
||||||
<a href="#" class="btn btn-primary">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -351,7 +351,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h1 class="d1 reveal">MCP channel to<br>Cursor, Claude Code<br>& more.</h1>
|
<h1 class="d1 reveal">MCP channel to<br>Cursor, Claude Code<br>& more.</h1>
|
||||||
<p class="subtitle reveal">Agent Bridge exposes your entire Origin Graph through the Model Context Protocol — so Cursor, Claude Code, and any MCP-compatible agent can read your component tree, run diffs, and propose changes without leaving the editor.</p>
|
<p class="subtitle reveal">Agent Bridge exposes your entire Origin Graph through the Model Context Protocol — so Cursor, Claude Code, and any MCP-compatible agent can read your component tree, run diffs, and propose changes without leaving the editor.</p>
|
||||||
<div class="page-hero-ctas reveal">
|
<div class="page-hero-ctas reveal">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -792,7 +792,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h2 class="cta-headline">Give your agents<br>real context.</h2>
|
<h2 class="cta-headline">Give your agents<br>real context.</h2>
|
||||||
<p class="cta-sub">Connect Cursor or Claude Code to your live Origin Graph in under five minutes. No hallucinated docs — just your actual codebase, queryable from any MCP agent.</p>
|
<p class="cta-sub">Connect Cursor or Claude Code to your live Origin Graph in under five minutes. No hallucinated docs — just your actual codebase, queryable from any MCP agent.</p>
|
||||||
<div class="cta-actions">
|
<div class="cta-actions">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-actions">
|
<div class="nav-actions">
|
||||||
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
||||||
<a href="#" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Get Started</a>
|
||||||
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -309,7 +309,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-mobile-ctas">
|
<div class="nav-mobile-ctas">
|
||||||
<a href="#" class="btn btn-secondary">Log in</a>
|
<a href="#" class="btn btn-secondary">Log in</a>
|
||||||
<a href="#" class="btn btn-primary">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -321,7 +321,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h1 class="d1 reveal">AI-filled design,<br>constrained to your system.</h1>
|
<h1 class="d1 reveal">AI-filled design,<br>constrained to your system.</h1>
|
||||||
<p class="subtitle reveal">Describe a component in plain language. Completion Zone generates it using only tokens, variants, and patterns that already exist in your design system — no hallucinated styles, no drift.</p>
|
<p class="subtitle reveal">Describe a component in plain language. Completion Zone generates it using only tokens, variants, and patterns that already exist in your design system — no hallucinated styles, no drift.</p>
|
||||||
<div class="page-hero-ctas reveal">
|
<div class="page-hero-ctas reveal">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -484,7 +484,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor"><path d="M7 1.5L8.1 5.4 12 6.5l-3.9 1.1L7 11.5 5.9 7.6 2 6.5l3.9-1.1z"/><circle cx="11" cy="2.5" r="1" fill="currentColor" opacity="0.5"/></svg></span>Only spacings from your scale — no magic numbers, no arbitrary pixel values slipping through.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor"><path d="M7 1.5L8.1 5.4 12 6.5l-3.9 1.1L7 11.5 5.9 7.6 2 6.5l3.9-1.1z"/><circle cx="11" cy="2.5" r="1" fill="currentColor" opacity="0.5"/></svg></span>Only spacings from your scale — no magic numbers, no arbitrary pixel values slipping through.</li>
|
||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor"><path d="M7 1.5L8.1 5.4 12 6.5l-3.9 1.1L7 11.5 5.9 7.6 2 6.5l3.9-1.1z"/><circle cx="11" cy="2.5" r="1" fill="currentColor" opacity="0.5"/></svg></span>Generates real code, not images — the output is a live component on your artboard, not a static screenshot.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor"><path d="M7 1.5L8.1 5.4 12 6.5l-3.9 1.1L7 11.5 5.9 7.6 2 6.5l3.9-1.1z"/><circle cx="11" cy="2.5" r="1" fill="currentColor" opacity="0.5"/></svg></span>Generates real code, not images — the output is a live component on your artboard, not a static screenshot.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="#" class="btn btn-primary">Request early access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Two-column comparison visual -->
|
<!-- Two-column comparison visual -->
|
||||||
@@ -728,7 +728,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h2 class="cta-headline">Fill the gaps in your<br>design system.</h2>
|
<h2 class="cta-headline">Fill the gaps in your<br>design system.</h2>
|
||||||
<p class="cta-sub">Early access is free. Connect your Origin Graph and run your first completion in under two minutes.</p>
|
<p class="cta-sub">Early access is free. Connect your Origin Graph and run your first completion in under two minutes.</p>
|
||||||
<div class="cta-actions">
|
<div class="cta-actions">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -286,7 +286,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-actions">
|
<div class="nav-actions">
|
||||||
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
||||||
<a href="#" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Get Started</a>
|
||||||
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -312,7 +312,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-mobile-ctas">
|
<div class="nav-mobile-ctas">
|
||||||
<a href="#" class="btn btn-secondary">Log in</a>
|
<a href="#" class="btn btn-secondary">Log in</a>
|
||||||
<a href="#" class="btn btn-primary">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -324,7 +324,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h1 class="d1 reveal">Connect your<br>entire workflow.</h1>
|
<h1 class="d1 reveal">Connect your<br>entire workflow.</h1>
|
||||||
<p class="subtitle reveal">Originmain integrates with GitHub, Figma, Linear, Slack, VS Code, Cursor, TypeScript, and React — so every part of your design-to-code pipeline is connected, without changing how you work.</p>
|
<p class="subtitle reveal">Originmain integrates with GitHub, Figma, Linear, Slack, VS Code, Cursor, TypeScript, and React — so every part of your design-to-code pipeline is connected, without changing how you work.</p>
|
||||||
<div class="page-hero-ctas reveal">
|
<div class="page-hero-ctas reveal">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -756,7 +756,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h2 class="cta-headline">Your whole stack,<br>finally connected.</h2>
|
<h2 class="cta-headline">Your whole stack,<br>finally connected.</h2>
|
||||||
<p class="cta-sub">Connect GitHub and Figma in under two minutes. Every other integration is one click from the dashboard.</p>
|
<p class="cta-sub">Connect GitHub and Figma in under two minutes. Every other integration is one click from the dashboard.</p>
|
||||||
<div class="cta-actions">
|
<div class="cta-actions">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-actions">
|
<div class="nav-actions">
|
||||||
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
||||||
<a href="#" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Get Started</a>
|
||||||
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -336,7 +336,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-mobile-ctas">
|
<div class="nav-mobile-ctas">
|
||||||
<a href="#" class="btn btn-secondary">Log in</a>
|
<a href="#" class="btn btn-secondary">Log in</a>
|
||||||
<a href="#" class="btn btn-primary">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -348,7 +348,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h1 class="d1 reveal">Ship component-level<br>diffs, not redlines.</h1>
|
<h1 class="d1 reveal">Ship component-level<br>diffs, not redlines.</h1>
|
||||||
<p class="subtitle reveal">Every design change is expressed as a structured diff of props, styles, and tree — not a screenshot comparison. Reviewers see exactly what changed and why.</p>
|
<p class="subtitle reveal">Every design change is expressed as a structured diff of props, styles, and tree — not a screenshot comparison. Reviewers see exactly what changed and why.</p>
|
||||||
<div class="page-hero-ctas reveal">
|
<div class="page-hero-ctas reveal">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -460,7 +460,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="4" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/><rect x="6" y="2.5" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/></svg></span>Output is a standard unified patch string — parseable by any diff tooling in your stack.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="4" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/><rect x="6" y="2.5" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/></svg></span>Output is a standard unified patch string — parseable by any diff tooling in your stack.</li>
|
||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="4" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/><rect x="6" y="2.5" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/></svg></span>CI/CD can consume the patch directly — block merges, post PR comments, or trigger alerts on specific prop changes.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="4" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/><rect x="6" y="2.5" width="6.5" height="7.5" rx="1.3" stroke="currentColor" stroke-width="1.3"/></svg></span>CI/CD can consume the patch directly — block merges, post PR comments, or trigger alerts on specific prop changes.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="#" class="btn btn-primary">Request early access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="feat-vis feat-vis-dark reveal">
|
<div class="feat-vis feat-vis-dark reveal">
|
||||||
<div style="position:absolute;inset:0;padding:24px;display:flex;flex-direction:column;overflow:hidden;">
|
<div style="position:absolute;inset:0;padding:24px;display:flex;flex-direction:column;overflow:hidden;">
|
||||||
@@ -663,7 +663,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h2 class="cta-headline">No more redline hell.<br>Ship the diff.</h2>
|
<h2 class="cta-headline">No more redline hell.<br>Ship the diff.</h2>
|
||||||
<p class="cta-sub">Every design change expressed as a structured, machine-readable, component-level diff. Early access is free.</p>
|
<p class="cta-sub">Every design change expressed as a structured, machine-readable, component-level diff. Early access is free.</p>
|
||||||
<div class="cta-actions">
|
<div class="cta-actions">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-actions">
|
<div class="nav-actions">
|
||||||
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
||||||
<a href="#" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Get Started</a>
|
||||||
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -296,7 +296,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-mobile-ctas">
|
<div class="nav-mobile-ctas">
|
||||||
<a href="#" class="btn btn-secondary">Log in</a>
|
<a href="#" class="btn btn-secondary">Log in</a>
|
||||||
<a href="#" class="btn btn-primary">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -308,7 +308,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h1 class="d1 reveal">Your app,<br>live on the canvas.</h1>
|
<h1 class="d1 reveal">Your app,<br>live on the canvas.</h1>
|
||||||
<p class="subtitle reveal">Not a mockup. Not a screenshot. Every artboard is a real iframe render of your actual component tree — running your real code, connected to your real data.</p>
|
<p class="subtitle reveal">Not a mockup. Not a screenshot. Every artboard is a real iframe render of your actual component tree — running your real code, connected to your real data.</p>
|
||||||
<div class="page-hero-ctas reveal">
|
<div class="page-hero-ctas reveal">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -418,7 +418,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="2.5" r="1.5" fill="currentColor"/><circle cx="2.5" cy="11" r="1.5" fill="currentColor"/><circle cx="11.5" cy="11" r="1.5" fill="currentColor"/><path d="M6.2 3.8L3.2 9.6M7.8 3.8l3 5.8M3.8 11h6.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></span>The full fiber tree is mapped — every component, hook, and context value.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="2.5" r="1.5" fill="currentColor"/><circle cx="2.5" cy="11" r="1.5" fill="currentColor"/><circle cx="11.5" cy="11" r="1.5" fill="currentColor"/><path d="M6.2 3.8L3.2 9.6M7.8 3.8l3 5.8M3.8 11h6.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></span>The full fiber tree is mapped — every component, hook, and context value.</li>
|
||||||
<li><span class="feat-pt-icon">⚡</span>Hot module reload propagates instantly. The canvas always reflects the current build.</li>
|
<li><span class="feat-pt-icon">⚡</span>Hot module reload propagates instantly. The canvas always reflects the current build.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="#" class="btn btn-primary">Request early access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="feat-vis feat-vis-dark reveal">
|
<div class="feat-vis feat-vis-dark reveal">
|
||||||
<div style="position:absolute;inset:0;padding:24px;display:flex;flex-direction:column;gap:8px;overflow:hidden;">
|
<div style="position:absolute;inset:0;padding:24px;display:flex;flex-direction:column;gap:8px;overflow:hidden;">
|
||||||
@@ -575,7 +575,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h2 class="cta-headline">See your app<br>live on the canvas.</h2>
|
<h2 class="cta-headline">See your app<br>live on the canvas.</h2>
|
||||||
<p class="cta-sub">Early access is free. Connect your first artboard in under two minutes.</p>
|
<p class="cta-sub">Early access is free. Connect your first artboard in under two minutes.</p>
|
||||||
<div class="cta-actions">
|
<div class="cta-actions">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-actions">
|
<div class="nav-actions">
|
||||||
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
<a href="#" class="btn btn-secondary" style="padding:7px 16px;font-size:.875rem">Log in</a>
|
||||||
<a href="#" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary" style="padding:8px 18px;font-size:.875rem">Get Started</a>
|
||||||
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
<button class="nav-burger" id="nav-burger" aria-label="Menu"><span></span><span></span><span></span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -300,7 +300,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="nav-mobile-ctas">
|
<div class="nav-mobile-ctas">
|
||||||
<a href="#" class="btn btn-secondary">Log in</a>
|
<a href="#" class="btn btn-secondary">Log in</a>
|
||||||
<a href="#" class="btn btn-primary">Request Access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -312,7 +312,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h1 class="d1 reveal">Every component,<br>indexed and queryable.</h1>
|
<h1 class="d1 reveal">Every component,<br>indexed and queryable.</h1>
|
||||||
<p class="subtitle reveal">The Origin Graph is a living knowledge graph of your entire component ecosystem — relationships, history, usage, and design tokens — all queryable in real time.</p>
|
<p class="subtitle reveal">The Origin Graph is a living knowledge graph of your entire component ecosystem — relationships, history, usage, and design tokens — all queryable in real time.</p>
|
||||||
<div class="page-hero-ctas reveal">
|
<div class="page-hero-ctas reveal">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
<a href="#how-it-works" class="btn btn-outline-white btn-lg">See how it works ↓</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -503,7 +503,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="2.5" r="1.5" fill="currentColor"/><circle cx="2.5" cy="11" r="1.5" fill="currentColor"/><circle cx="11.5" cy="11" r="1.5" fill="currentColor"/><path d="M6.2 3.8L3.2 9.6M7.8 3.8l3 5.8M3.8 11h6.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></span>Affected nodes are ranked by depth: direct consumers first, transitive next.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="2.5" r="1.5" fill="currentColor"/><circle cx="2.5" cy="11" r="1.5" fill="currentColor"/><circle cx="11.5" cy="11" r="1.5" fill="currentColor"/><path d="M6.2 3.8L3.2 9.6M7.8 3.8l3 5.8M3.8 11h6.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></span>Affected nodes are ranked by depth: direct consumers first, transitive next.</li>
|
||||||
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="2.5" r="1.5" fill="currentColor"/><circle cx="2.5" cy="11" r="1.5" fill="currentColor"/><circle cx="11.5" cy="11" r="1.5" fill="currentColor"/><path d="M6.2 3.8L3.2 9.6M7.8 3.8l3 5.8M3.8 11h6.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></span>The result feeds directly into Intent Diff, so every PR ships with a complete blast-radius audit.</li>
|
<li><span class="feat-pt-icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="2.5" r="1.5" fill="currentColor"/><circle cx="2.5" cy="11" r="1.5" fill="currentColor"/><circle cx="11.5" cy="11" r="1.5" fill="currentColor"/><path d="M6.2 3.8L3.2 9.6M7.8 3.8l3 5.8M3.8 11h6.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></span>The result feeds directly into Intent Diff, so every PR ships with a complete blast-radius audit.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="#" class="btn btn-primary">Request early access</a>
|
<a href="/sign-up" class="btn btn-primary">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="feat-vis feat-vis-dark reveal">
|
<div class="feat-vis feat-vis-dark reveal">
|
||||||
<div style="position:absolute;inset:0;padding:28px;display:flex;flex-direction:column;overflow:hidden;">
|
<div style="position:absolute;inset:0;padding:28px;display:flex;flex-direction:column;overflow:hidden;">
|
||||||
@@ -697,7 +697,7 @@ footer{background:#08080C;border-top:1px solid rgba(255,255,255,0.06);padding:72
|
|||||||
<h2 class="cta-headline">Your component graph,<br>always up to date.</h2>
|
<h2 class="cta-headline">Your component graph,<br>always up to date.</h2>
|
||||||
<p class="cta-sub">Early access is free. Connect your repo and the first full graph index runs in under a minute.</p>
|
<p class="cta-sub">Early access is free. Connect your repo and the first full graph index runs in under a minute.</p>
|
||||||
<div class="cta-actions">
|
<div class="cta-actions">
|
||||||
<a href="#" class="btn btn-white btn-lg">Request Early Access</a>
|
<a href="/sign-up" class="btn btn-white btn-lg">Get Started Free</a>
|
||||||
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
<a href="/" class="btn btn-outline-white btn-lg">Back to overview</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2398,7 +2398,7 @@ footer {
|
|||||||
<li><span class="px-check">✓</span> Linear + Slack integration</li>
|
<li><span class="px-check">✓</span> Linear + Slack integration</li>
|
||||||
<li><span class="px-check">✓</span> Multiplayer canvas</li>
|
<li><span class="px-check">✓</span> Multiplayer canvas</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="/sign-up" class="btn btn-blue btn-full">Request early access</a>
|
<a href="/sign-up" class="btn btn-blue btn-full">Get Started Free</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="px-card">
|
<div class="px-card">
|
||||||
<div class="px-tier">Enterprise</div>
|
<div class="px-tier">Enterprise</div>
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
import { useRef, useEffect, useCallback } from 'react';
|
import { useRef, useEffect, useCallback } from 'react';
|
||||||
import { useViewport } from '@/store/viewport';
|
import { useViewport } from '@/store/viewport';
|
||||||
import { useCanvas } from '@/store/canvas';
|
import { useCanvas } from '@/store/canvas';
|
||||||
import { useWorkspace } from '@/hooks/useWorkspace';
|
|
||||||
import { useArtboards } from '@/hooks/useArtboards';
|
import { useArtboards } from '@/hooks/useArtboards';
|
||||||
import { Artboard } from './Artboard';
|
import { Artboard } from './Artboard';
|
||||||
|
|
||||||
@@ -12,10 +11,8 @@ export function Canvas() {
|
|||||||
const panX = useViewport((s) => s.panX);
|
const panX = useViewport((s) => s.panX);
|
||||||
const panY = useViewport((s) => s.panY);
|
const panY = useViewport((s) => s.panY);
|
||||||
const zoom = useViewport((s) => s.zoom);
|
const zoom = useViewport((s) => s.zoom);
|
||||||
const { activeTool, selectArtboard } = useCanvas();
|
const { activeTool, selectArtboard, workspaceId } = useCanvas();
|
||||||
|
const { artboards } = useArtboards(workspaceId ?? undefined);
|
||||||
const { data: workspace } = useWorkspace();
|
|
||||||
const { artboards } = useArtboards(workspace?.id);
|
|
||||||
|
|
||||||
const isPanning = useRef(false);
|
const isPanning = useRef(false);
|
||||||
const lastPos = useRef({ x: 0, y: 0 });
|
const lastPos = useRef({ x: 0, y: 0 });
|
||||||
|
|||||||
@@ -19,6 +19,12 @@ interface AppChromeProps {
|
|||||||
|
|
||||||
export function AppChrome({ workspaceId, projectId, workspaceName, projectName }: AppChromeProps) {
|
export function AppChrome({ workspaceId, projectId, workspaceName, projectName }: AppChromeProps) {
|
||||||
const selectedArtboardId = useCanvas((s) => s.selectedArtboardId);
|
const selectedArtboardId = useCanvas((s) => s.selectedArtboardId);
|
||||||
|
const setContext = useCanvas((s) => s.setContext);
|
||||||
|
|
||||||
|
// Push workspace/project IDs into the store so Canvas and Navigator can read them.
|
||||||
|
useEffect(() => {
|
||||||
|
if (workspaceId && projectId) setContext(workspaceId, projectId);
|
||||||
|
}, [workspaceId, projectId, setContext]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function onKeyDown(e: KeyboardEvent) {
|
function onKeyDown(e: KeyboardEvent) {
|
||||||
@@ -37,24 +43,28 @@ export function AppChrome({ workspaceId, projectId, workspaceName, projectName }
|
|||||||
window.addEventListener('keydown', onKeyDown);
|
window.addEventListener('keydown', onKeyDown);
|
||||||
return () => window.removeEventListener('keydown', onKeyDown);
|
return () => window.removeEventListener('keydown', onKeyDown);
|
||||||
}, [selectedArtboardId]);
|
}, [selectedArtboardId]);
|
||||||
const showBreadcrumb = workspaceId && projectId;
|
|
||||||
|
const showBreadcrumb = Boolean(workspaceId && projectId);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
// Outer flex-column: breadcrumb on top (fixed height), inner grid fills the rest.
|
||||||
|
// Breadcrumb lives OUTSIDE the grid so the Toolbar/panel gridRow placements
|
||||||
|
// never shift regardless of whether the breadcrumb is visible.
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
display: 'grid',
|
display: 'flex',
|
||||||
gridTemplateRows: showBreadcrumb ? '36px 44px 1fr' : '44px 1fr',
|
flexDirection: 'column',
|
||||||
gridTemplateColumns: '220px 1fr 272px',
|
|
||||||
height: '100dvh',
|
height: '100dvh',
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
background: '#0C0C10',
|
background: '#0C0C10',
|
||||||
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif",
|
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Breadcrumb bar — spans all 3 columns, only shown when project context is set */}
|
{/* ── Breadcrumb bar ─────────────────────────────────── */}
|
||||||
{showBreadcrumb && (
|
{showBreadcrumb && (
|
||||||
<div style={{
|
<div style={{
|
||||||
gridColumn: '1 / -1',
|
height: 36,
|
||||||
|
flexShrink: 0,
|
||||||
background: '#0A0A0E',
|
background: '#0A0A0E',
|
||||||
borderBottom: '1px solid rgba(255,255,255,0.06)',
|
borderBottom: '1px solid rgba(255,255,255,0.06)',
|
||||||
display: 'flex', alignItems: 'center',
|
display: 'flex', alignItems: 'center',
|
||||||
@@ -87,17 +97,29 @@ export function AppChrome({ workspaceId, projectId, workspaceName, projectName }
|
|||||||
|
|
||||||
<div style={{ flex: 1 }} />
|
<div style={{ flex: 1 }} />
|
||||||
|
|
||||||
{/* User avatar in the top-right corner of canvas */}
|
|
||||||
<div style={{ transform: 'scale(0.8)', transformOrigin: 'right center' }}>
|
<div style={{ transform: 'scale(0.8)', transformOrigin: 'right center' }}>
|
||||||
<UserButton />
|
<UserButton />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* ── Inner grid: Toolbar (row 1) + panels (row 2) ─── */}
|
||||||
|
{/* Rows are always 44px + 1fr — breadcrumb never enters this grid. */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
minHeight: 0,
|
||||||
|
display: 'grid',
|
||||||
|
gridTemplateRows: '44px 1fr',
|
||||||
|
gridTemplateColumns: '220px 1fr 272px',
|
||||||
|
overflow: 'hidden',
|
||||||
|
}}
|
||||||
|
>
|
||||||
<Toolbar />
|
<Toolbar />
|
||||||
<ArtboardNavigator />
|
<ArtboardNavigator />
|
||||||
<Canvas />
|
<Canvas />
|
||||||
<Inspector />
|
<Inspector />
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { useFileTree, FileTree } from '@pierre/trees/react';
|
|||||||
import { themeToTreeStyles } from '@pierre/trees';
|
import { themeToTreeStyles } from '@pierre/trees';
|
||||||
import { SquareRegular } from '@fluentui/react-icons';
|
import { SquareRegular } from '@fluentui/react-icons';
|
||||||
import { useCanvas } from '@/store/canvas';
|
import { useCanvas } from '@/store/canvas';
|
||||||
import { useWorkspace } from '@/hooks/useWorkspace';
|
|
||||||
import { useArtboards } from '@/hooks/useArtboards';
|
import { useArtboards } from '@/hooks/useArtboards';
|
||||||
|
|
||||||
const FILE_PATHS = [
|
const FILE_PATHS = [
|
||||||
@@ -48,9 +47,8 @@ const treeThemeStyles = themeToTreeStyles({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export function ArtboardNavigator() {
|
export function ArtboardNavigator() {
|
||||||
const { selectedArtboardId, selectArtboard } = useCanvas();
|
const { selectedArtboardId, selectArtboard, workspaceId } = useCanvas();
|
||||||
const { data: workspace } = useWorkspace();
|
const { artboards } = useArtboards(workspaceId ?? undefined);
|
||||||
const { artboards } = useArtboards(workspace?.id);
|
|
||||||
|
|
||||||
const { model } = useFileTree({
|
const { model } = useFileTree({
|
||||||
paths: FILE_PATHS,
|
paths: FILE_PATHS,
|
||||||
|
|||||||
@@ -5,13 +5,20 @@ export type Tool = 'select' | 'pan' | 'artboard' | 'zone';
|
|||||||
interface CanvasStore {
|
interface CanvasStore {
|
||||||
activeTool: Tool;
|
activeTool: Tool;
|
||||||
selectedArtboardId: string | null;
|
selectedArtboardId: string | null;
|
||||||
|
/** Workspace/project context set by AppChrome on mount. */
|
||||||
|
workspaceId: string | null;
|
||||||
|
projectId: string | null;
|
||||||
setActiveTool: (tool: Tool) => void;
|
setActiveTool: (tool: Tool) => void;
|
||||||
selectArtboard: (id: string | null) => void;
|
selectArtboard: (id: string | null) => void;
|
||||||
|
setContext: (workspaceId: string, projectId: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useCanvas = create<CanvasStore>((set) => ({
|
export const useCanvas = create<CanvasStore>((set) => ({
|
||||||
activeTool: 'select',
|
activeTool: 'select',
|
||||||
selectedArtboardId: 'dashboard-card',
|
selectedArtboardId: null,
|
||||||
|
workspaceId: null,
|
||||||
|
projectId: null,
|
||||||
setActiveTool: (tool) => set({ activeTool: tool }),
|
setActiveTool: (tool) => set({ activeTool: tool }),
|
||||||
selectArtboard: (id) => set({ selectedArtboardId: id }),
|
selectArtboard: (id) => set({ selectedArtboardId: id }),
|
||||||
|
setContext: (workspaceId, projectId) => set({ workspaceId, projectId }),
|
||||||
}));
|
}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user