Horizontal drag
-Swipe a lane to the next container on the ring — files, editor, graph, terminal.
-diff --git a/site/README.md b/site/README.md deleted file mode 100644 index 80cedee..0000000 --- a/site/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Mouse site - -Marketing landing page for Mouse — structure inspired by [sleek.design](https://sleek.design/), -visual language from Mouse (`DESIGN.md`), hero driven by the dither-boids widget. - -## Run locally - -```sh -cd site -python3 -m http.server 8765 -# open http://127.0.0.1:8765/ -``` - -## Layout - -| Path | Role | -|---|---| -| `index.html` | Landing page | -| `styles.css` | Monochrome + IBM Plex Mono | -| `main.js` | Nav solidify, reveal-on-scroll, dither pause | -| `dither.html` | Dither-boids widget (`?embed=1&imgs=…`) | -| `assets/` | Logo + interface screenshots | - -Embed mode hides the widget chrome, biases the flock to the right for hero copy, -auto-loads the listed images, and cycles them. diff --git a/site/styles.css b/site/styles.css deleted file mode 100644 index 5cbdd24..0000000 --- a/site/styles.css +++ /dev/null @@ -1,919 +0,0 @@ -/* Mouse marketing site — terminal honesty, monochrome, IBM Plex Mono */ - -:root { - --bg: #f4f4f2; - --bg-deep: #07070a; - --ink: #0a0a0c; - --ink-muted: rgba(10, 10, 12, 0.58); - --paper: #f2f0ea; - --panel: #0d0d11; - --line: rgba(10, 10, 12, 0.12); - --line-strong: rgba(10, 10, 12, 0.28); - --paper-line: rgba(242, 240, 234, 0.14); - --radius: 28px; - --radius-sm: 14px; - --gutter: clamp(1.25rem, 4vw, 3rem); - --max: 1120px; - --font: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - --ease: cubic-bezier(0.22, 1, 0.36, 1); -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; -} - -@media (prefers-reduced-motion: reduce) { - html { scroll-behavior: auto; } - *, *::before, *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } -} - -body { - margin: 0; - font-family: var(--font); - color: var(--ink); - background: var(--bg); - line-height: 1.45; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; -} - -img { - max-width: 100%; - display: block; -} - -a { - color: inherit; - text-decoration: none; -} - -button { - font: inherit; - color: inherit; - background: none; - border: 0; - cursor: pointer; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.wrap { - width: min(100% - 2 * var(--gutter), var(--max)); - margin-inline: auto; -} - -/* ---------- nav ---------- */ - -.nav { - position: fixed; - inset: 0 0 auto 0; - z-index: 40; - height: 64px; - display: flex; - align-items: center; - transition: background 0.35s var(--ease), border-color 0.35s var(--ease), backdrop-filter 0.35s var(--ease); - border-bottom: 1px solid transparent; -} - -.nav.is-solid { - background: rgba(244, 244, 242, 0.86); - border-bottom-color: var(--line); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); -} - -.nav.is-solid .nav-brand, -.nav.is-solid .nav-link { - color: var(--ink); -} - -.nav.is-solid .nav-link { - color: var(--ink-muted); -} - -.nav.is-solid .nav-link:hover { - color: var(--ink); -} - -.nav-inner { - width: min(100% - 2 * var(--gutter), var(--max)); - margin-inline: auto; - display: flex; - align-items: center; - justify-content: space-between; - gap: 1rem; -} - -.nav-brand { - display: inline-flex; - align-items: center; - gap: 0.7rem; - color: var(--paper); - font-weight: 600; - letter-spacing: -0.02em; - font-size: 1.05rem; -} - -.nav-brand img { - width: 28px; - height: 28px; - object-fit: contain; - filter: invert(1); -} - -.nav.is-solid .nav-brand img { - filter: none; -} - -.nav-links { - display: none; - gap: 1.75rem; -} - -@media (min-width: 800px) { - .nav-links { display: flex; } -} - -.nav-link { - color: rgba(242, 240, 234, 0.62); - font-size: 0.85rem; - transition: color 0.2s ease; -} - -.nav-link:hover { - color: var(--paper); -} - -.nav-cta { - display: inline-flex; - align-items: center; - gap: 0.45rem; - height: 34px; - padding: 0 0.9rem; - border-radius: 8px; - background: var(--paper); - color: var(--bg-deep); - font-size: 0.8rem; - font-weight: 600; - transition: transform 0.18s var(--ease), filter 0.18s ease; -} - -.nav.is-solid .nav-cta { - background: var(--ink); - color: var(--paper); -} - -.nav-cta:hover { - transform: translateY(-1px); - filter: brightness(0.96); -} - -/* ---------- hero ---------- */ - -.hero { - position: relative; - min-height: 100svh; - background: var(--bg-deep); - color: var(--paper); - overflow: hidden; - display: grid; - align-items: end; -} - -.hero-viz { - position: absolute; - inset: 0; - border: 0; - width: 100%; - height: 100%; - pointer-events: auto; - z-index: 0; -} - -.hero-fade { - position: absolute; - inset: 0; - z-index: 1; - pointer-events: none; - background: - linear-gradient(90deg, rgba(7, 7, 10, 0.92) 0%, rgba(7, 7, 10, 0.55) 38%, rgba(7, 7, 10, 0.12) 68%, transparent 100%), - linear-gradient(180deg, rgba(7, 7, 10, 0.45) 0%, transparent 28%, transparent 62%, rgba(7, 7, 10, 0.88) 100%); -} - -.hero-content { - position: relative; - z-index: 2; - width: min(100% - 2 * var(--gutter), var(--max)); - margin: 0 auto; - padding: 7.5rem 0 4.5rem; - pointer-events: none; -} - -.hero-content > * { - pointer-events: auto; - max-width: 34rem; -} - -.hero-kicker { - display: inline-flex; - align-items: center; - gap: 0.55rem; - margin: 0 0 1.4rem; - font-size: 0.72rem; - letter-spacing: 0.16em; - text-transform: uppercase; - color: rgba(242, 240, 234, 0.55); -} - -.hero-kicker::before { - content: ""; - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--paper); - box-shadow: 0 0 0 4px rgba(242, 240, 234, 0.12); - animation: pulse-dot 2.2s ease-in-out infinite; -} - -@keyframes pulse-dot { - 0%, 100% { opacity: 0.45; transform: scale(0.9); } - 50% { opacity: 1; transform: scale(1); } -} - -.hero-brand { - margin: 0 0 1rem; - font-size: clamp(3.4rem, 11vw, 6.4rem); - line-height: 0.92; - letter-spacing: -0.06em; - font-weight: 700; -} - -.hero-title { - margin: 0 0 1rem; - font-size: clamp(1.35rem, 3.2vw, 1.85rem); - line-height: 1.25; - font-weight: 500; - letter-spacing: -0.03em; - color: rgba(242, 240, 234, 0.92); -} - -.hero-lede { - margin: 0 0 2rem; - font-size: 0.98rem; - line-height: 1.55; - color: rgba(242, 240, 234, 0.58); - max-width: 28rem; -} - -.hero-lede code { - font-family: inherit; - font-size: 0.92em; - color: rgba(242, 240, 234, 0.82); -} - -.hero-actions { - display: flex; - flex-wrap: wrap; - gap: 0.75rem; - margin-bottom: 2.75rem; -} - -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 0.5rem; - height: 44px; - padding: 0 1.15rem; - border-radius: 10px; - font-size: 0.88rem; - font-weight: 600; - transition: transform 0.18s var(--ease), background 0.18s ease, color 0.18s ease, border-color 0.18s ease; -} - -.btn:hover { - transform: translateY(-1px); -} - -.btn-primary { - background: var(--paper); - color: var(--bg-deep); -} - -.btn-primary:hover { - filter: brightness(0.96); -} - -.btn-ghost { - border: 1px solid rgba(242, 240, 234, 0.28); - color: var(--paper); - background: rgba(13, 13, 17, 0.35); - backdrop-filter: blur(8px); -} - -.btn-ghost:hover { - border-color: rgba(242, 240, 234, 0.55); -} - -.btn-dark { - background: var(--ink); - color: var(--paper); -} - -.btn-dark:hover { - filter: brightness(1.08); -} - -.btn-line { - border: 1px solid var(--line-strong); - color: var(--ink); -} - -.btn-line:hover { - background: rgba(10, 10, 12, 0.04); -} - -.hero-meta { - display: flex; - flex-wrap: wrap; - gap: 0.6rem 1.4rem; - font-size: 0.72rem; - letter-spacing: 0.04em; - text-transform: uppercase; - color: rgba(242, 240, 234, 0.42); -} - -.hero-meta span { - display: inline-flex; - align-items: center; - gap: 0.45rem; -} - -.hero-meta span::before { - content: "·"; - opacity: 0.55; -} - -.hero-hint { - margin-top: 1.75rem; - font-size: 0.72rem; - color: rgba(242, 240, 234, 0.35); - letter-spacing: 0.02em; -} - -/* ---------- sections ---------- */ - -.section { - padding: clamp(4.5rem, 10vw, 7rem) 0; -} - -.section-head { - display: flex; - flex-direction: column; - gap: 0.65rem; - margin-bottom: 2.5rem; - max-width: 36rem; -} - -.section-head h2 { - margin: 0; - font-size: clamp(1.65rem, 3.5vw, 2.35rem); - letter-spacing: -0.04em; - line-height: 1.15; - font-weight: 650; -} - -.section-head p { - margin: 0; - color: var(--ink-muted); - font-size: 0.98rem; -} - -.section-dark { - background: var(--bg-deep); - color: var(--paper); -} - -.section-dark .section-head p { - color: rgba(242, 240, 234, 0.55); -} - -.section-alt { - background: #ebebe8; -} - -/* ---------- gesture grid ---------- */ - -.gesture-grid { - display: grid; - gap: 1rem; - grid-template-columns: 1fr; -} - -@media (min-width: 720px) { - .gesture-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 980px) { - .gesture-grid { - grid-template-columns: repeat(3, 1fr); - } -} - -.gesture-card { - padding: 1.35rem 1.3rem 1.45rem; - border: 1px solid var(--line); - border-radius: var(--radius-sm); - background: rgba(255, 255, 255, 0.55); - transition: transform 0.35s var(--ease), border-color 0.25s ease, background 0.25s ease; -} - -.gesture-card:hover { - transform: translateY(-3px); - border-color: var(--line-strong); - background: #fff; -} - -.gesture-card .key { - display: inline-block; - margin-bottom: 0.85rem; - font-size: 0.68rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.gesture-card h3 { - margin: 0 0 0.55rem; - font-size: 1.05rem; - letter-spacing: -0.02em; -} - -.gesture-card p { - margin: 0; - font-size: 0.88rem; - color: var(--ink-muted); - line-height: 1.5; -} - -.law { - margin-top: 2rem; - padding: 1.25rem 1.35rem; - border-left: 2px solid var(--ink); - background: rgba(10, 10, 12, 0.03); - font-size: 0.92rem; - line-height: 1.55; -} - -.law strong { - font-weight: 650; -} - -/* ---------- showcase / screens ---------- */ - -.showcase { - display: grid; - gap: 1.25rem; -} - -@media (min-width: 900px) { - .showcase { - grid-template-columns: 1.15fr 0.85fr; - align-items: stretch; - } -} - -.phone-frame { - position: relative; - border-radius: calc(var(--radius) + 8px); - background: var(--panel); - padding: 0.85rem; - border: 1px solid rgba(242, 240, 234, 0.08); - overflow: hidden; - min-height: 420px; -} - -.phone-frame img { - width: 100%; - height: 100%; - object-fit: cover; - border-radius: var(--radius); - background: #111; -} - -.phone-caption { - position: absolute; - left: 1.35rem; - bottom: 1.35rem; - right: 1.35rem; - padding: 0.85rem 1rem; - border-radius: 12px; - background: rgba(7, 7, 10, 0.78); - border: 1px solid rgba(242, 240, 234, 0.12); - backdrop-filter: blur(10px); - color: var(--paper); -} - -.phone-caption .label { - display: block; - font-size: 0.68rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: rgba(242, 240, 234, 0.45); - margin-bottom: 0.35rem; -} - -.phone-caption strong { - font-size: 0.95rem; - font-weight: 600; -} - -.stack-cards { - display: grid; - gap: 1rem; -} - -.stack-card { - display: grid; - grid-template-columns: 88px 1fr; - gap: 1rem; - align-items: center; - padding: 0.85rem; - border-radius: var(--radius-sm); - border: 1px solid var(--paper-line); - background: rgba(255, 255, 255, 0.03); - transition: transform 0.3s var(--ease), background 0.25s ease; -} - -.stack-card:hover { - transform: translateX(4px); - background: rgba(255, 255, 255, 0.06); -} - -.stack-card img { - width: 88px; - height: 88px; - object-fit: cover; - border-radius: 10px; - background: #111; -} - -.stack-card h3 { - margin: 0 0 0.3rem; - font-size: 0.98rem; -} - -.stack-card p { - margin: 0; - font-size: 0.82rem; - color: rgba(242, 240, 234, 0.55); - line-height: 1.45; -} - -/* ---------- gallery ---------- */ - -.gallery { - display: grid; - gap: 1.5rem; - grid-template-columns: 1fr; -} - -@media (min-width: 700px) { - .gallery { - grid-template-columns: repeat(2, 1fr); - } -} - -.gallery-item { - display: flex; - flex-direction: column; - gap: 0.85rem; -} - -.gallery-frame { - border-radius: var(--radius); - overflow: hidden; - background: #111; - border: 1px solid var(--line); - aspect-ratio: 16 / 11; -} - -.gallery-frame img { - width: 100%; - height: 100%; - object-fit: cover; - transition: transform 0.55s var(--ease); -} - -.gallery-item:hover .gallery-frame img { - transform: scale(1.03); -} - -.gallery-item h3 { - margin: 0; - font-size: 1rem; - letter-spacing: -0.02em; -} - -.gallery-item p { - margin: 0; - font-size: 0.86rem; - color: var(--ink-muted); -} - -/* ---------- capabilities ---------- */ - -.caps { - display: grid; - gap: 1rem; -} - -@media (min-width: 800px) { - .caps { - grid-template-columns: repeat(3, 1fr); - } -} - -.cap { - padding: 1.5rem 1.35rem; - border-radius: var(--radius-sm); - background: #fff; - border: 1px solid var(--line); -} - -.cap .num { - display: block; - margin-bottom: 1.1rem; - font-size: 0.72rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.cap h3 { - margin: 0 0 0.55rem; - font-size: 1.15rem; - letter-spacing: -0.03em; -} - -.cap p { - margin: 0; - color: var(--ink-muted); - font-size: 0.9rem; - line-height: 1.5; -} - -.cap code { - font-family: inherit; - font-size: 0.84em; - padding: 0.05em 0.3em; - border-radius: 4px; - background: rgba(10, 10, 12, 0.06); -} - -/* ---------- steps ---------- */ - -.steps { - display: grid; - gap: 0; - counter-reset: step; - border-top: 1px solid var(--line); -} - -.step { - display: grid; - gap: 0.75rem; - padding: 1.6rem 0; - border-bottom: 1px solid var(--line); - grid-template-columns: auto 1fr; - align-items: start; -} - -.step::before { - counter-increment: step; - content: counter(step, decimal-leading-zero); - font-size: 0.78rem; - letter-spacing: 0.08em; - color: var(--ink-muted); - padding-top: 0.2rem; - min-width: 2.2rem; -} - -.step h3 { - margin: 0 0 0.4rem; - font-size: 1.1rem; - letter-spacing: -0.02em; -} - -.step p { - margin: 0; - color: var(--ink-muted); - font-size: 0.92rem; - max-width: 40rem; -} - -/* ---------- FAQ ---------- */ - -.faq { - display: grid; - gap: 0.65rem; - max-width: 46rem; -} - -.faq details { - border: 1px solid var(--line); - border-radius: 12px; - background: rgba(255, 255, 255, 0.55); - padding: 0 1.1rem; - transition: border-color 0.2s ease, background 0.2s ease; -} - -.faq details[open] { - background: #fff; - border-color: var(--line-strong); -} - -.faq summary { - list-style: none; - cursor: pointer; - padding: 1.05rem 0; - font-weight: 600; - font-size: 0.95rem; - display: flex; - justify-content: space-between; - gap: 1rem; - align-items: center; -} - -.faq summary::-webkit-details-marker { - display: none; -} - -.faq summary::after { - content: "+"; - font-weight: 400; - color: var(--ink-muted); - font-size: 1.15rem; - line-height: 1; -} - -.faq details[open] summary::after { - content: "−"; -} - -.faq details p { - margin: 0 0 1.1rem; - color: var(--ink-muted); - font-size: 0.9rem; - line-height: 1.55; -} - -/* ---------- CTA band ---------- */ - -.cta-band { - position: relative; - overflow: hidden; - background: var(--bg-deep); - color: var(--paper); - padding: clamp(4.5rem, 10vw, 7rem) 0; - text-align: center; -} - -.cta-band::before { - content: ""; - position: absolute; - left: 50%; - top: -40%; - width: 70vw; - height: 70vw; - transform: translateX(-50%); - background: radial-gradient(circle, rgba(242, 240, 234, 0.12), transparent 62%); - pointer-events: none; -} - -.cta-inner { - position: relative; - z-index: 1; - width: min(100% - 2 * var(--gutter), 40rem); - margin-inline: auto; -} - -.cta-band h2 { - margin: 0 0 0.85rem; - font-size: clamp(1.8rem, 4vw, 2.6rem); - letter-spacing: -0.045em; - line-height: 1.1; -} - -.cta-band p { - margin: 0 0 1.75rem; - color: rgba(242, 240, 234, 0.55); - font-size: 0.98rem; -} - -.cta-actions { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 0.75rem; -} - -/* ---------- footer ---------- */ - -.footer { - padding: 2rem 0 2.5rem; - border-top: 1px solid var(--line); - background: var(--bg); -} - -.footer-inner { - display: flex; - flex-wrap: wrap; - gap: 1rem; - justify-content: space-between; - align-items: center; - font-size: 0.8rem; - color: var(--ink-muted); -} - -.footer-brand { - display: inline-flex; - align-items: center; - gap: 0.55rem; - color: var(--ink); - font-weight: 600; -} - -.footer-brand img { - width: 20px; - height: 20px; -} - -.footer-links { - display: flex; - gap: 1.25rem; -} - -.footer-links a:hover { - color: var(--ink); -} - -/* ---------- motion reveals ---------- */ -/* Hidden only when JS opted in — otherwise content stays readable. */ - -html.js .reveal { - opacity: 0; - transform: translateY(18px); - transition: opacity 0.7s var(--ease), transform 0.7s var(--ease); -} - -html.js .reveal.is-in { - opacity: 1; - transform: none; -} - -html.js .reveal-delay-1 { transition-delay: 0.08s; } -html.js .reveal-delay-2 { transition-delay: 0.16s; } -html.js .reveal-delay-3 { transition-delay: 0.24s; } - -@media (max-width: 720px) { - .hero-fade { - background: - linear-gradient(180deg, rgba(7, 7, 10, 0.55) 0%, rgba(7, 7, 10, 0.28) 28%, rgba(7, 7, 10, 0.72) 58%, rgba(7, 7, 10, 0.94) 100%), - linear-gradient(90deg, rgba(7, 7, 10, 0.88) 0%, rgba(7, 7, 10, 0.55) 55%, rgba(7, 7, 10, 0.2) 100%); - } - - .hero-content { - padding: 6.5rem 0 3.25rem; - } - - .hero-content > * { - max-width: none; - } - - .hero-viz { - opacity: 0.72; - } -} diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..a74a0e3 --- /dev/null +++ b/website/README.md @@ -0,0 +1,26 @@ +# Mouse website + +Marketing landing page for Mouse — a dark, single-page site in the app's own +visual language (`DESIGN.md`): IBM Plex Mono, monochrome, black panels, hero +driven by the dither-boids widget. + +## Run locally + +```sh +cd website +python3 -m http.server 8765 +# open http://127.0.0.1:8765/ +``` + +## Layout + +| Path | Role | +|---|---| +| `index.html` | Landing page | +| `styles.css` | Dark theme, monochrome + IBM Plex Mono | +| `main.js` | Nav solidify, GitHub star count, reveal-on-scroll, dither pause | +| `dither.html` | Dither-boids widget (`?embed=1&imgs=…`) | +| `assets/` | Logo, app screens, interface screenshots | + +Embed mode hides the widget chrome, biases the flock to the right for hero copy, +auto-loads the listed images, and cycles them. diff --git a/website/assets/app-history.png b/website/assets/app-history.png new file mode 100644 index 0000000..104d854 Binary files /dev/null and b/website/assets/app-history.png differ diff --git a/website/assets/app-ruby.png b/website/assets/app-ruby.png new file mode 100644 index 0000000..6843809 Binary files /dev/null and b/website/assets/app-ruby.png differ diff --git a/website/assets/app-vite.png b/website/assets/app-vite.png new file mode 100644 index 0000000..b227c9d Binary files /dev/null and b/website/assets/app-vite.png differ diff --git a/site/assets/interface-editor.png b/website/assets/interface-editor.png similarity index 100% rename from site/assets/interface-editor.png rename to website/assets/interface-editor.png diff --git a/site/assets/interface-git-flow.png b/website/assets/interface-git-flow.png similarity index 100% rename from site/assets/interface-git-flow.png rename to website/assets/interface-git-flow.png diff --git a/site/assets/interface-ring.png b/website/assets/interface-ring.png similarity index 100% rename from site/assets/interface-ring.png rename to website/assets/interface-ring.png diff --git a/site/assets/logo.png b/website/assets/logo.png similarity index 100% rename from site/assets/logo.png rename to website/assets/logo.png diff --git a/site/assets/screen-graph.png b/website/assets/screen-graph.png similarity index 100% rename from site/assets/screen-graph.png rename to website/assets/screen-graph.png diff --git a/site/assets/screen-lanes.png b/website/assets/screen-lanes.png similarity index 100% rename from site/assets/screen-lanes.png rename to website/assets/screen-lanes.png diff --git a/site/assets/screen-shell.png b/website/assets/screen-shell.png similarity index 100% rename from site/assets/screen-shell.png rename to website/assets/screen-shell.png diff --git a/site/assets/screen-spread.png b/website/assets/screen-spread.png similarity index 100% rename from site/assets/screen-spread.png rename to website/assets/screen-spread.png diff --git a/site/dither.html b/website/dither.html similarity index 100% rename from site/dither.html rename to website/dither.html diff --git a/site/index.html b/website/index.html similarity index 67% rename from site/index.html rename to website/index.html index ab7ebef..f2a983d 100644 --- a/site/index.html +++ b/website/index.html @@ -8,32 +8,36 @@ - + - +
Skip to content -Native · iOS & Android
-The coding IDE built for a phone — not shrunk from a desktop.
+ Native for iOS & Android · open source +
- A gesture shell where the whole development environment lives:
- swipe editors, pinch workspaces, run real node and git
- against your GitHub repos.
+ Mouse is a gesture shell where the whole development environment lives:
+ swipe between editors, pinch workspaces open, and run real
+ node and git against your GitHub repos.
The shell owns navigation. Content owns reading and typing. Conflict is settled once, everywhere.
+ Screens +Files, editor, terminal, and the commit graph are containers on a ring. Swipe to the next; pinch to open a new lane.
Swipe a lane to the next container on the ring — files, editor, graph, terminal.
-Drag from the screen edge to travel between rings, or mint a fresh one.
-Two fingers open a lane or close one. Pinch the last lane and the ring folds.
-Pull the capsule between lanes to resize. Springs settle with mass.
+
Browse the tree, edit in place, and read the commit history with colored rails, all on one ring.
+Trees scroll, editors edit, terminals take keystrokes. Vertical stays with content.
+
Scaffold with npx, pipe commands, run scripts. The shell is verified against real /bin/sh.
While the editor is focused, every drag on it belongs to the text — selection and caret first.
+
Pull toolchains and packages, then run them where you are. No server in the middle.
+- The gesture law. - One-finger horizontal drags and all two-finger gestures belong to the shell, everywhere. - Content gets taps, vertical scrolling, and the keyboard. -
The screen is a window onto a ring. Lanes show what is open; the rest wait in reserve.
+ Rings of containers +Lanes show what is open; the rest wait in reserve. A commit moves the same view to a new offset, no reload flash.
+
Dots mark rings. Edge-swipe travels; a fresh ring is born at the end.
+
Edit the file itself in the lane. Floating keyboard. Autosave.
+
Swipe from the editor into the commit surface, then the history rails.
- Two-finger spread opens a blank lane. Pinch closes it again.
-Black containers on a white canvas. IBM Plex Mono. Motion is the arrow — no coach marks.
+ Gestures +The shell owns navigation. Content owns reading and typing. Conflict is settled once, everywhere.
- Editor, commit, graph — consecutive containers on one ring.
+Swipe a lane to the next container on the ring — files, editor, graph, terminal.
- Branch rails, merges, tips — drawn like a desktop client, scrolled with a thumb.
+Drag from the screen edge to travel between rings, or mint a fresh one.
- Continuous 32pt radii. The container is the chrome.
+Two fingers open a lane or close one. Pinch the last lane and the ring folds.
- Spread opens space. Pinch collapses it. The last pinch closes the ring.
+Pull the capsule between lanes to resize. Springs settle with mass.
+Trees scroll, editors edit, terminals take keystrokes. Vertical stays with content.
+While the editor is focused, every drag on it belongs to the text — selection and caret first.
+ The gesture law. + One-finger horizontal drags and all two-finger gestures belong to the shell, everywhere. + Content gets taps, vertical scrolling, and the keyboard. +
No server in the middle. GitHub talks to the phone. The engines are native.
Sign in once. The workspace is the project.
+What Mouse is, and what it is not.
+ FAQ +Clone the repo. Generate the Xcode project. Run.
+Clone the repo. Generate the project. Run.