From 3f77baf96722f37d602cdd8197f2f5faa6bd4cc2 Mon Sep 17 00:00:00 2001 From: Marcus Vorwaller Date: Tue, 20 Jan 2026 13:43:48 -0800 Subject: [PATCH] Marketing site update --- website/src/css/custom.css | 120 +++++++--- website/src/pages/index.js | 448 +++++++++++++++++++------------------ 2 files changed, 324 insertions(+), 244 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 0cbe16f0..1fa75346 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -383,10 +383,11 @@ a:hover { background: rgba(102, 217, 239, 0.12); } +/* Side-by-side layout for git/files/conversations/worktrees */ .sc-frameBody { display: grid; - grid-template-columns: 220px 1fr; - min-height: 360px; + grid-template-columns: 28% 72%; + min-height: 340px; } @media (max-width: 996px) { @@ -395,8 +396,44 @@ a:hover { } } +/* Stacked layout for TD */ +.sc-frameBodyStacked { + display: flex; + flex-direction: column; + gap: 6px; + padding: 8px; + min-height: 340px; +} + +.sc-frameBodyStacked .sc-tdSection { + border-radius: 8px; + border: 1px solid var(--sc-border); + background: rgba(0, 0, 0, 0.2); + padding: 8px 10px; + flex: 1; +} + +.sc-frameBodyStacked .sc-tdSection:first-child { + flex: 0 0 auto; +} + +/* Pane sidebar (left side) */ +.sc-paneSidebar { + border-right: 1px solid var(--sc-border); + background: rgba(18, 20, 23, 0.30); + padding: 10px; + overflow: hidden; +} + +/* Pane main (right side) */ +.sc-paneMain { + padding: 10px; + overflow: hidden; +} + +/* Deprecated single pane - keep for fallback */ .sc-frameBodySingle { - height: 380px; + height: 340px; overflow: hidden; } @@ -429,27 +466,28 @@ a:hover { } .sc-sectionTitle { - font-size: 12px; + font-size: 10px; color: rgba(232,232,227,0.68); - margin: 0 0 8px; + margin: 0 0 6px; letter-spacing: 0.35px; + text-transform: uppercase; } .sc-list { display: grid; - gap: 6px; + gap: 4px; } .sc-item { display: flex; align-items: center; - gap: 8px; + gap: 6px; border: 1px solid transparent; - border-radius: 10px; - padding: 8px 8px; + border-radius: 6px; + padding: 5px 6px; color: rgba(232,232,227,0.78); background: rgba(0,0,0,0.12); - font-size: 13px; + font-size: 11px; } .sc-itemActive { @@ -471,13 +509,13 @@ a:hover { .sc-bulletBlue { background: rgba(102, 217, 239, 0.45); } .sc-codeBlock { - border-radius: 12px; + border-radius: 8px; border: 1px solid var(--sc-border); background: rgba(0,0,0,0.28); - padding: 10px 12px; + padding: 8px 10px; overflow: auto; - font-size: 12px; - line-height: 1.45; + font-size: 10px; + line-height: 1.4; color: rgba(232,232,227,0.88); box-shadow: 0 0 0 1px rgba(255,255,255,0.02) inset; } @@ -754,8 +792,8 @@ a:hover { .sc-componentContent { display: grid; - grid-template-columns: 1fr 1.5fr; - gap: 32px; + grid-template-columns: 1fr 2fr; + gap: 28px; align-items: start; } @@ -811,11 +849,11 @@ a:hover { /* ---------- Mockup styles ---------- */ .sc-mockup { - border-radius: 12px; + border-radius: 10px; border: 1px solid var(--sc-border); background: rgba(0, 0, 0, 0.4); overflow: hidden; - font-size: 13px; + font-size: 11px; font-family: var(--ifm-font-family-monospace); } @@ -823,20 +861,22 @@ a:hover { display: flex; align-items: center; justify-content: space-between; - padding: 10px 14px; + padding: 8px 12px; border-bottom: 1px solid var(--sc-border); background: rgba(18, 20, 23, 0.6); } .sc-mockupTitle { font-weight: 600; + font-size: 12px; color: rgba(232,232,227,0.9); } +/* Side-by-side mockup body (default for most plugins) */ .sc-mockupBody { display: grid; - grid-template-columns: 180px 1fr; - min-height: 280px; + grid-template-columns: 30% 70%; + min-height: 260px; } @media (max-width: 768px) { @@ -845,28 +885,44 @@ a:hover { } } +/* Stacked mockup body for TD */ +.sc-mockupBodyStacked { + display: flex; + flex-direction: column; + gap: 6px; + padding: 8px; + min-height: 260px; +} + +.sc-mockupBodyStacked .sc-mockupSection { + border-radius: 6px; + border: 1px solid var(--sc-border); + background: rgba(0, 0, 0, 0.2); + padding: 8px; +} + .sc-mockupSidebar { - padding: 12px; + padding: 10px; border-right: 1px solid var(--sc-border); background: rgba(18, 20, 23, 0.3); display: flex; flex-direction: column; - gap: 6px; + gap: 4px; } .sc-mockupMain { - padding: 12px; + padding: 10px; } .sc-mockupItem { display: flex; align-items: center; - gap: 8px; - padding: 8px 10px; - border-radius: 8px; + gap: 6px; + padding: 5px 8px; + border-radius: 6px; background: rgba(0,0,0,0.2); border: 1px solid transparent; - font-size: 12px; + font-size: 10px; color: rgba(232,232,227,0.78); } @@ -876,10 +932,10 @@ a:hover { } .sc-mockupFooter { - padding: 8px 14px; + padding: 6px 12px; border-top: 1px solid var(--sc-border); background: rgba(18, 20, 23, 0.6); - font-size: 11px; + font-size: 10px; } .sc-mockupDetail, @@ -888,9 +944,9 @@ a:hover { .sc-mockupConvo, .sc-mockupWorktree { background: rgba(0, 0, 0, 0.25); - border-radius: 8px; + border-radius: 6px; border: 1px solid var(--sc-border); - padding: 12px; + padding: 10px; } .sc-bulletYellow { background: rgba(230, 219, 116, 0.45); } diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 60dc74aa..2048633b 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -35,33 +35,36 @@ function CopyButton({ text }) { function TdPane() { return ( <> -

Tasks

-
+
+

Current Work

td-a1b2c3 Implement auth flow
-
- - td-d4e5f6 Add rate limiting -
-
- - td-g7h8i9 Fix memory leak +
+
+

Board

+
+
+ + td-d4e5f6 Add rate limiting +
+
+ + td-g7h8i9 Fix memory leak +
+
+ + td-j0k1l2 Update API docs +
-
-
-
td-a1b2c3 | in_progress
-
-
Title: Implement auth flow
-
Status: in_progress
-
Created: 2h ago
-
-
Subtasks:
-
[x] Create auth middleware
-
[x] Add JWT validation
-
[ ] Write integration tests
+
+

Activity

+
+
00:39 td-a1b2c3 Started
+
00:15 td-d4e5f6 Created
+
); @@ -70,36 +73,44 @@ function TdPane() { function GitPane() { return ( <> -

Changes

-
-
- - M internal/auth/middleware.go -
-
- - A internal/auth/jwt.go +
+

Modified

+
+
+ M + middleware.go +
+
+ A + jwt.go +
+
+ D + old_auth.go +
-
- - D internal/auth/old_auth.go +

Commits

+
+
+ 736a844 + Minor fixes +
-
-
-
internal/auth/middleware.go
-
-
@@ -42,6 +42,18 @@
-
+ func AuthMiddleware(next http.Handler) http.Handler {'{'}
-
+ return http.HandlerFunc(func(w, r) {'{'}
-
+ token := r.Header.Get("Authorization")
-
+ if !ValidateJWT(token) {'{'}
-
+ http.Error(w, "Unauthorized", 401)
-
+ return
-
+ {'}'}
-
+ next.ServeHTTP(w, r)
-
+ {'}'})
-
+ {'}'}
+
+
+
internal/auth/middleware.go
+
+
@@ -42,6 +42,14 @@
+
+func AuthMiddleware(next) {'{'}
+
+ return http.HandlerFunc(w, r) {'{'}
+
+ token := r.Header.Get("Auth")
+
+ if !ValidateJWT(token) {'{'}
+
+ http.Error(w, "Unauth", 401)
+
+ {'}'}
+
+ {'}'})
+
+{'}'}
+
); @@ -108,42 +119,49 @@ function GitPane() { function FilesPane() { return ( <> -

Project Files

-
-
- [v] - internal/ -
-
- [v] - auth/ -
-
- - middleware.go -
-
- - jwt.go -
-
- [>] - plugins/ +
+

Files

+
+
+ [v] + internal/ +
+
+ [v] + auth/ +
+
+ + middleware.go +
+
+ + jwt.go +
+
+ [>] + plugins/ +
+
+ [>] + app/ +
-
-
-
middleware.go | 156 lines
-
-
package auth
-
-
import (
-
"net/http"
-
"strings"
-
)
-
-
// AuthMiddleware validates JWT tokens
-
func AuthMiddleware(next http.Handler)...
+
+
+
middleware.go | 156 lines
+
+
package auth
+
+
import (
+
"net/http"
+
"strings"
+
)
+
+
// AuthMiddleware validates requests
+
func AuthMiddleware(next)...
+
); @@ -152,34 +170,41 @@ function FilesPane() { function ConversationsPane() { return ( <> -

All Sessions chronological

-
-
- - auth-flow | Claude | 24m -
-
- - rate-limit | Cursor | 2h -
-
- - refactor | Gemini | 1d +
+

Sessions

+
+
+ + auth-flow Claude +
+
+ + rate-limit Cursor +
+
+ + refactor Gemini +
+
+ + api-docs Claude +
-
-
-
auth-flow | Claude Code
-
-
User: Add JWT auth to the API
-
-
Claude: I'll implement JWT authentication.
-
First, let me check the existing auth...
-
-
-> Read internal/auth/middleware.go
-
-> Edit internal/auth/jwt.go
-
-
12.4k tokens | 24 minutes
+
+
+
auth-flow | Claude Code
+
+
User: Add JWT auth to the API
+
+
Claude: I'll implement JWT auth.
+
Let me check the existing auth...
+
+
-> Read middleware.go
+
-> Edit jwt.go
+
+
12.4k tokens | 24m
+
); @@ -188,34 +213,41 @@ function ConversationsPane() { function WorktreesPane() { return ( <> -

Worktrees zero commands

-
-
- - main -
-
- - feature/auth PR #47 -
-
- - fix/memory PR #52 +
+

Worktrees

+
+
+ + main +
+
+ + feature/auth #47 +
+
+ + fix/memory #52 +
+
+ + docs/update +
-
-
-
feature/auth | Ready to merge
-
-
Task: td-a1b2c3 from td
-
Prompts: 3 configured
-
-
Actions:
-
[n] New worktree + agent
-
[s] Send task from td
-
[p] Run prompt sequence
-
-
* 3 commits ahead | checks passing
+
+
+
feature/auth | Ready
+
+
Task: td-a1b2c3 from td
+
Prompts: 3 configured
+
+
Actions:
+
[n] New worktree + agent
+
[s] Send task from td
+
[p] Run prompt sequence
+
+
3 commits ahead | checks pass
+
); @@ -274,10 +306,8 @@ function Frame({ activeTab, onTabChange }) { ))}
-
-
- {renderPane()} -
+
+ {renderPane()}
@@ -320,47 +350,41 @@ function TdMockup() { Task Management 3 tasks | 1 in progress
-
-
+
+
+
Current Work
-
-
td-a1b2c3
-
Implement auth
-
+ td-a1b2c3 + in_progress + Implement auth flow
-
- -
-
td-d4e5f6
-
Rate limiting
+
+
+
Board
+
+
+ REV + td-d4e5f6 + Add rate limiting
-
-
- -
-
td-g7h8i9
-
Memory leak
+
+ RDY + td-g7h8i9 + Fix memory leak +
+
+ RDY + td-j0k1l2 + Update API docs
-
-
-
Implement auth flow
-
-
Status: in_progress
-
Created: 2h ago
-
Epic: td-epic-auth
-
-
-
Subtasks
-
-
[x] Create auth middleware
-
[x] Add JWT validation
-
[ ] Write integration tests
-
[ ] Update API docs
-
-
+
+
Activity
+
+
00:39 td-a1b2c3 Started
+
00:15 td-d4e5f6 Submitted for review
@@ -379,11 +403,11 @@ function GitMockup() {
Git Status - feature/auth-flow | 3 changed + feature/auth | 3 changed
-
Staged
+
Staged
M middleware.go @@ -392,7 +416,7 @@ function GitMockup() { A jwt.go
-
Unstaged
+
Unstaged
D old_auth.go @@ -400,11 +424,11 @@ function GitMockup() {
-
internal/auth/middleware.go
-
+
internal/auth/middleware.go
+
@@ -42,6 +42,14 @@
-
+func AuthMiddleware(next http.Handler) {'{'}
-
+ return http.HandlerFunc(func(w, r) {'{'}
+
+func AuthMiddleware(next) {'{'}
+
+ return http.HandlerFunc(w, r) {'{'}
+ token := r.Header.Get("Auth")
+ if !ValidateJWT(token) {'{'}
+ http.Error(w, "Unauth", 401)
@@ -438,38 +462,38 @@ function FilesMockup() { [v] internal/
-
+
[v] auth/
-
+
middleware.go
-
+
jwt.go
-
+
[>] plugins/
-
+
[>] app/
-
middleware.go | 156 lines | Go
-
+
middleware.go | 156 lines | Go
+
package auth
-
+
import (
"net/http"
"strings"
)
-
+
// AuthMiddleware validates requests
func AuthMiddleware(next)...
@@ -498,40 +522,40 @@ function ConversationsMockup() {
-
auth-flow Claude
-
24m ago | 12.4k
+
auth-flow Claude
+
24m | 12.4k
-
rate-limit Cursor
-
2h ago | 8.2k
+
rate-limit Cursor
+
2h | 8.2k
-
refactor Gemini
-
1d ago | 24.1k
+
refactor Gemini
+
1d | 24.1k
-
-
User
-
Add JWT authentication to the API endpoints
+
+
User
+
Add JWT auth to the API endpoints
-
-
Claude
-
I'll implement JWT authentication for your API.
-
Let me check the existing auth setup...
+
+
Claude
+
I'll implement JWT auth for your API.
+
Let me check the existing auth setup...
-
+
-> Read middleware.go
-> Edit jwt.go
-
-> Write tests/auth_test.go
+
-> Write auth_test.go
@@ -551,7 +575,7 @@ function WorktreesMockup() {
Worktrees - zero commands | auto everything + zero commands | auto
@@ -559,35 +583,35 @@ function WorktreesMockup() {
main
-
default
+
default
feature/auth
-
PR #47 | ready
+
PR #47 | ready
fix/memory
-
td-g7h8i9
+
td-g7h8i9
-
feature/auth
-
+
feature/auth
+
PR: #47 Add JWT auth
Task: td-a1b2c3 from td
Status: Ready to merge
-
-
Quick actions
-
[n] New worktree + start agent
+
+
Quick actions
+
[n] New worktree + agent
[s] Send task from td
[p] Run prompt sequence
[m] Merge & cleanup