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/
-
-
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() {
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