diff --git a/examples/demo/index.html b/examples/demo/index.html index ec7d818..0884fe6 100644 --- a/examples/demo/index.html +++ b/examples/demo/index.html @@ -58,12 +58,13 @@ } *{box-sizing:border-box;margin:0} button,.toggle,.btn,.vbtn,.seg b{-webkit-tap-highlight-color:transparent;touch-action:manipulation;user-select:none} +a{-webkit-tap-highlight-color:transparent} :focus-visible{outline:2px solid var(--indigo);outline-offset:2px;border-radius:var(--r)} html{scroll-behavior:smooth} body{background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:15px;line-height:1.55; -webkit-font-smoothing:antialiased;transition:background .25s var(--ease),color .25s var(--ease); overflow-x:hidden} -.wrap{position:relative;z-index:1;max-width:1080px;margin:0 auto;padding:44px 22px 78px} +.wrap{position:relative;z-index:1;max-width:1080px;margin:0 auto;padding:44px 24px 80px} header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap} .brand{display:flex;flex-direction:column;gap:3px} .logo{display:inline-flex;align-items:center;margin:-8px 0;padding:8px 0;font-size:27px;font-weight:560;letter-spacing:-.025em;color:inherit;text-decoration:none}.logo .d{color:var(--red)} @@ -89,23 +90,23 @@ .situation{font-size:17px;color:var(--ink);font-weight:500;max-width:66ch;line-height:1.5;margin-bottom:4px} .situation.tech{font-size:15px;color:var(--muted);font-weight:400} h2{font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--dim); - margin:42px 0 16px;display:flex;align-items:center;gap:10px} + margin:44px 0 16px;display:flex;align-items:center;gap:10px} h2::after{content:"";flex:1;height:1px;background:var(--hair)} .grid{display:grid;gap:14px}.cards{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))} .party{background:var(--surface-top);border:1px solid var(--hair); border-radius:var(--r-lg);padding:18px 19px;box-shadow:var(--ambient)} .party .who{font-weight:560;font-size:15.5px;display:flex;align-items:center;justify-content:space-between;gap:8px} .party .blurb{font-size:13.5px;color:var(--muted);margin-top:6px;line-height:1.45} -.party .sub{font-size:10.5px;color:var(--dim);text-transform:uppercase;letter-spacing:.09em;margin-top:13px} +.party .sub{font-size:10.5px;color:var(--dim);text-transform:uppercase;letter-spacing:.09em;margin-top:12px} .party ul{list-style:none;padding:0;margin:6px 0 0;font-size:13px;color:var(--muted)} .party li{padding:2.5px 0;display:flex;gap:9px;align-items:flex-start} .party li.red::before{content:"";width:15px;height:2px;background:var(--red);flex:none;border-radius:2px;margin-top:8px} .party li.none{color:var(--dim);font-style:italic} -.btn{border:none;border-radius:var(--r);padding:12px 24px;font:inherit;font-weight:560;font-size:14.5px;cursor:pointer; +.btn{border:none;border-radius:var(--r-full);padding:12px 24px;font:inherit;font-weight:560;font-size:14.5px;cursor:pointer; background:var(--indigo);color:#fff;transition:.2s var(--ease);box-shadow:inset 0 1px 0 rgba(255,255,255,.10)} .btn:hover{filter:brightness(1.08);transform:translateY(-1px)} .btn:active{transform:translateY(0) scale(.985);filter:brightness(1.02)} -.opt{background:var(--surface);border:1px solid var(--hair);border-radius:var(--r-lg);padding:15px 17px;margin:11px 0;transition:.25s var(--ease)} +.opt{background:var(--surface);border:1px solid var(--hair);border-radius:var(--r-lg);padding:15px 17px;margin:12px 0;transition:.25s var(--ease)} .opt:not(.blocked):not(.winner):hover{border-color:var(--hair2)} .opt .top{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap} .opt .name{font-weight:540;font-size:15px} @@ -113,15 +114,15 @@ .opt.blocked{border-color:var(--red-hair);background:var(--red-bg)} .opt.winner{border-color:var(--indigo);box-shadow:0 0 0 1px var(--indigo)} .chips{display:flex;gap:6px;flex-wrap:wrap} -.chip{font-family:var(--mono);font-size:11px;font-weight:500;border-radius:var(--r-full);padding:2.5px 10px; +.chip{font-family:var(--mono);font-size:11px;font-weight:500;border-radius:var(--r-full);padding:5px 12px; display:inline-flex;gap:5px;align-items:center;background:var(--sunken);color:var(--muted);border:1px solid var(--hair)} .chip.ok{background:var(--verify-bg);color:var(--verify);border-color:var(--verify-hair)} .chip.no{background:var(--red-bg);color:var(--red);border-color:var(--red-hair)} -.tagline-sm{font-size:12.5px;margin-top:9px;color:var(--dim)} +.tagline-sm{font-size:12.5px;margin-top:8px;color:var(--dim)} .tagline-sm.block{color:var(--red);font-weight:500} .tagline-sm.win{color:var(--indigo);font-weight:560} .muted{color:var(--muted);font-size:13px} -.bar{display:grid;grid-template-columns:170px 1fr 70px;align-items:center;gap:14px;margin:9px 0} +.bar{display:grid;grid-template-columns:170px 1fr 70px;align-items:center;gap:14px;margin:8px 0} .bar .lbl{font-size:13px;color:var(--muted)} .track{background:var(--sunken);border:1px solid var(--hair);border-radius:var(--r-full);height:14px;overflow:hidden} .fill{height:100%;background:var(--indigo);border-radius:var(--r-full);transition:width .6s var(--ease)} @@ -136,7 +137,7 @@ overflow-wrap:anywhere} .receipt .k{color:var(--dim)} .verify{margin-top:14px;display:flex;gap:14px;align-items:center;flex-wrap:wrap} -.vbtn{border:1px solid var(--hair2);background:var(--surface);color:var(--ink);border-radius:var(--r); +.vbtn{border:1px solid var(--hair2);background:var(--surface);color:var(--ink);border-radius:var(--r-full); padding:9px 16px;font:inherit;font-size:13px;cursor:pointer;transition:.2s var(--ease)} .vbtn:hover{border-color:var(--verify);color:var(--verify)} .vbtn:active{transform:scale(.97)} @@ -147,7 +148,7 @@ /* ─── candy layer: hero, cinematic reveal, celebration ─────────────────────────── */ /* hero */ -.hero{margin:26px 0 8px;position:relative} +.hero{margin:24px 0 8px;position:relative} .eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11.5px;font-weight:600; letter-spacing:.16em;text-transform:uppercase;color:var(--indigo); background:var(--indigo-bg); @@ -158,13 +159,13 @@ .hero h1 .g{color:var(--indigo)} .hero .sub{margin:18px 0 0;font-size:clamp(15px,2.4vw,18px);line-height:1.55;color:var(--muted);max-width:60ch} .hero .sub b{color:var(--ink);font-weight:600} -.hero-actions{display:flex;flex-wrap:wrap;gap:13px;align-items:center;margin-top:26px} -.cta{position:relative;overflow:hidden;border:none;border-radius:var(--r);padding:14px 26px;font:inherit;font-weight:640; +.hero-actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:24px} +.cta{position:relative;overflow:hidden;border:none;border-radius:var(--r-full);padding:14px 26px;font:inherit;font-weight:640; font-size:15px;cursor:pointer;color:#fff;background:var(--indigo); box-shadow:inset 0 1px 0 rgba(255,255,255,.10);transition:.2s var(--ease)} .cta:hover{transform:translateY(-1px);filter:brightness(1.06)} .cta:active{transform:translateY(0) scale(.98)} -.trustrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px} +.trustrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:24px} .icp-hook{color:var(--dim);font-size:12.5px;margin-top:14px} .icp-hook a{color:var(--muted);text-decoration:underline;text-decoration-color:var(--hair2);text-underline-offset:2px} .icp-hook a:hover{color:var(--indigo)} @@ -219,13 +220,13 @@ .foot-links a:hover{color:var(--indigo)} .foot-links svg{width:15px;height:15px;flex:none} .foot-meta{color:var(--dim);font-size:12.5px} -.foot-wrap{max-width:1180px;margin:0 auto;padding:30px 22px 46px} +.foot-wrap{max-width:1180px;margin:0 auto;padding:32px 24px 48px} /* ─── the three enforced properties: bridge between hero and the live demo ────── */ .kicker{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px; font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)} .props{border-bottom:1px solid var(--hair)} -.props-inner{max-width:1180px;margin:0 auto;padding:36px 22px 40px} +.props-inner{max-width:1180px;margin:0 auto;padding:36px 24px 40px} .props-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin-top:18px} .prop{background:var(--surface-top);border:1px solid var(--hair);border-radius:var(--r-lg); padding:20px 21px;box-shadow:var(--ambient); @@ -252,13 +253,13 @@ /* ─── hero band: full-bleed, ambient wash, decorative live proof-in-motion ─────── */ .hero-band{position:relative;overflow:hidden;border-bottom:1px solid var(--hair)} -.hero-inner{position:relative;max-width:1180px;margin:0 auto;padding:40px 22px 46px; +.hero-inner{position:relative;max-width:1180px;margin:0 auto;padding:40px 24px 48px; display:grid;grid-template-columns:1fr;gap:8px} .hero-inner header{max-width:none} .hero-cols{display:grid;grid-template-columns:1.15fr .85fr;gap:44px;align-items:center;margin-top:8px} .hero-cols>*{min-width:0} @media (max-width:920px){.hero-cols{grid-template-columns:1fr}} -.hero-copy .hero{margin:22px 0 0} +.hero-copy .hero{margin:24px 0 0} .hero-copy .hero h1{max-width:none} /* decorative visualization — a silent, looping "3 verdicts → the fair pick" moment */ @@ -269,7 +270,7 @@ .proofviz .pv-live{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;color:var(--verify)} .proofviz .pv-live i{width:5px;height:5px;border-radius:50%;background:var(--verify);animation:pvBlink 1.8s var(--ease) infinite} @keyframes pvBlink{0%,100%{opacity:1}50%{opacity:.35}} -.pv-row{display:grid;grid-template-columns:74px 1fr 34px;align-items:center;gap:11px;margin:9px 0} +.pv-row{display:grid;grid-template-columns:74px 1fr 34px;align-items:center;gap:12px;margin:8px 0} .pv-row .pv-who{font-size:12px;color:var(--muted);font-weight:540} .pv-row .pv-track{background:var(--sunken);border:1px solid var(--hair);border-radius:var(--r-full);height:10px;overflow:hidden} .pv-row .pv-fill{height:100%;border-radius:var(--r-full);background:var(--indigo-dim);width:0; @@ -379,7 +380,7 @@

The options on the table

Each chip is a masked verdict — the coordinator sees only who accepted, never which limit was crossed.

-
+
runs the real engine — watch the cheat get blocked
diff --git a/landing/src/components/Footer.astro b/landing/src/components/Footer.astro index c146577..8aa9ec6 100644 --- a/landing/src/components/Footer.astro +++ b/landing/src/components/Footer.astro @@ -19,7 +19,7 @@ const links = [ fill: true, }, { - href: "mailto:oleh@veheria.tech", + href: "mailto:hello@parleyprotocol.com", label: "Contact", icon: "M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4-8 5-8-5V6l8 5 8-5v2z", fill: true, diff --git a/landing/src/pages/404.astro b/landing/src/pages/404.astro index ad9130b..49b67ee 100644 --- a/landing/src/pages/404.astro +++ b/landing/src/pages/404.astro @@ -26,7 +26,7 @@ import Footer from "../components/Footer.astro";
Back to Parley diff --git a/landing/src/pages/index.astro b/landing/src/pages/index.astro index b35e67e..37a6112 100644 --- a/landing/src/pages/index.astro +++ b/landing/src/pages/index.astro @@ -1,233 +1,550 @@ --- import Layout from "../layouts/Layout.astro"; import Header from "../components/Header.astro"; -import Tape from "../components/Tape.astro"; -import TapeSnippet from "../components/TapeSnippet.astro"; import Footer from "../components/Footer.astro"; +import { tapeSnippet, tapeColorClass } from "../data/tape"; + +const DEMO_URL = "/demo/"; + +const wrap = "mx-auto w-full max-w-[1372px] px-6 md:px-16 lg:px-24"; const btnPrimary = - "rounded-[10px] bg-indigo px-[26px] py-[14px] text-[15px] font-[640] text-white shadow-[inset_0_1px_0_rgba(255,255,255,.10)] transition-all duration-200 ease-[cubic-bezier(0.16,1,0.3,1)] hover:-translate-y-px hover:brightness-[1.06] active:translate-y-0 active:scale-[0.98]"; + "inline-flex min-h-12 items-center justify-center gap-2 rounded-full bg-indigo px-7 py-3.5 text-[15px] font-[640] text-white shadow-[inset_0_1px_0_rgba(255,255,255,.10)] transition-all duration-200 ease-[cubic-bezier(0.16,1,0.3,1)] hover:-translate-y-px hover:brightness-[1.06] active:translate-y-0 active:scale-[0.98]"; -const DEMO_URL = "/demo/"; -const README_30S_URL = "https://github.com/5uper0/parley#see-it-in-30-seconds"; - -const steps = [ - { - numeral: "01", - numeralColor: "text-redline", - title: "Red lines", - desc: "Hard constraints as code predicates. A crossed line is rejected, never negotiated away.", - tapeRef: "cara → verdict: red-line", - tapeRefColor: "text-muted", - }, - { - numeral: "02", - numeralColor: "text-masked", - title: "Masked verdict", - desc: "The coordinator sees only a masked ok/red-line verdict — never your private sheet or why a line was crossed.", - tapeRef: "dan's sheet: private, never shared", - tapeRefColor: "text-muted", - }, - { - numeral: "03", - numeralColor: "text-indigo", - title: "Max-min consensus", - desc: "Among feasible options, lift the least-happy party. No feasible option = honest deadlock.", - tapeRef: "max-min → option B", - tapeRefColor: "text-muted", - }, - { - numeral: "04", - numeralColor: "text-verify", - title: "Verifiable transcript", - desc: "A tamper-evident SHA-256 record. Replay your own sheet to prove no red line was crossed.", - tapeRef: "✓ sha256 verified by 3/3 owners", - tapeRefColor: "text-verify", - }, -]; ---- +const btnGhost = + "group inline-flex min-h-12 items-center gap-1.5 text-[15px] font-medium text-muted transition-colors hover:text-ink"; - -
- +const propBase = + "rounded-[14px] border-t border-r border-b-[3px] border-l-[3px] border-hairline bg-surface"; -
- -
-
-

- PROVABLE, NOT HOPED -

-

- Zero betrayals, - provably. -

-

- The trust layer for the agent economy. Agents with rival owners reach - consensus without exposing a single private preference. -

- -
+const deviceBlock = + "overflow-x-auto rounded-[10px] border border-hairline bg-bg px-[18px] py-4 font-mono text-[12.5px] leading-[1.9] text-muted"; -
+const jsonLd = JSON.stringify({ + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "Parley", + url: "https://parleyprotocol.com/", + applicationCategory: "DeveloperApplication", + operatingSystem: "Any", + description: + "Provable consensus for AI agents of rival owners: deterministic red lines, max-min consensus over masked verdicts, and a verifiable non-betrayal transcript. No cryptocurrency or blockchain; self-hosted, open source.", + license: "https://github.com/5uper0/parley/blob/main/LICENSE", + offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, + codeRepository: "https://github.com/5uper0/parley", +}); +--- - -
-

- 01 — THE GAP NOBODY PRODUCTISED -

-

- Most agent tooling solves transport (A2A, MCP), 1:1 agentic commerce, - or cooperative debate between agents of the same owner. -

-

- Parley solves the gap: delegates of different, conflicting, private - owners reaching a decision none of them can rig — and proving it. -

-
+ +