Diffinery

codician/diffinerypublic

Open-source, agent-first GitHub and GitHub Actions alternative that runs on your own Cloudflare account: git hosting, pull requests, code review and drop-in GitHub Actions YAML on Workers, Durable Objects, R2 and Containers.

Today: show repositories you work in, and keep the top bar on one line on phones (#64)

The side column said "You have no repositories yet" to someone who owns
none but is a collaborator elsewhere; it now lists those repositories.
At 390px the login and Sign out wrapped onto two lines in the top bar;
the login shows as the avatar only on phones, and nav items no longer wrap.


Claude-Session: https://claude.ai/code/session_014VDQqT8oL18uLJ9fpsNxW2

Co-authored-by: Claude <noreply@anthropic.com>
Canberk Demirci authored · GitHub committed signed1 parent bc58f9acommit 08d34168e54b3b67a4e475fb404bc27293ed7531Browse files
3 files changed+12−10
modifiedapps/diffinery/src/web/account.tsx+5−3View file
@@ -235,6 +235,8 @@
235235 ]);
236236 const mine = repos.filter((r) => r.owner_id === me.id || orgs.some((o) => o.id === r.owner_id));
237237 const others = repos.filter((r) => !mine.includes(r));
238+ // Someone who owns nothing yet but works in others' repositories sees those instead.
239+ const side = mine.length ? mine : others;
238240 return render(
239241 c,
240242 { title: "Today" },
@@ -243,14 +245,14 @@
243245 <aside class="side after">
244246 <section>
245247 <div class="row between mb">
246- <h3 class="m0">Your repositories</h3>
248+ <h3 class="m0">{mine.length || !others.length ? "Your repositories" : "Repositories"}</h3>
247249 <a class="btn sm primary" href="/new">
248250 {raw(ICONS.plus)} New
249251 </a>
250252 </div>
251- {mine.length ? (
253+ {side.length ? (
252254 <div class="nav">
253- {mine.slice(0, 40).map((r) => (
255+ {side.slice(0, 40).map((r) => (
254256 <a href={repoUrl(r)} class="nowrap" style="overflow:hidden;text-overflow:ellipsis">
255257 <Avatar login={r.owner_login} /> {r.owner_login}/<b>{r.name}</b>
256258 </a>
modifiedapps/diffinery/src/web/assets.ts+4−4View file
@@ -60,7 +60,7 @@
6060 .ok{color:var(--green)}.bad{color:var(--red)}.warn{color:var(--amber)}.run{color:var(--amber)}.merged{color:var(--purple)}
6161 .top{position:sticky;top:0;z-index:20;background:color-mix(in srgb,var(--bg) 88%,transparent);backdrop-filter:saturate(1.6) blur(10px);border-bottom:1px solid var(--border)}
6262 .top .wrap{display:flex;align-items:center;gap:14px;height:52px}
63-.brand{display:flex;align-items:center;gap:8px;font-weight:650;color:var(--fg);letter-spacing:-.01em}
63+.brand{display:flex;align-items:center;gap:8px;font-weight:650;color:var(--fg);letter-spacing:-.01em;white-space:nowrap}
6464 .brand:hover{text-decoration:none}.brand svg{color:var(--brand)}
6565 .top nav{display:flex;align-items:center;gap:4px;margin-left:auto}
6666 .top nav a{color:var(--fg2);padding:6px 10px;border-radius:6px}.top nav a:hover{background:var(--bg-hover);color:var(--fg);text-decoration:none}
@@ -102,7 +102,7 @@
102102 .formrow+.hint{font-size:12px;color:var(--fg2);margin-top:8px}
103103 .grid{display:grid;grid-template-columns:minmax(0,1fr) 296px;gap:24px}
104104 .grid.left{grid-template-columns:260px minmax(0,1fr)}
105-@media (max-width:900px){.grid,.grid.left{grid-template-columns:minmax(0,1fr)}.grid.left>.side.after{order:2}.pal-btn{min-width:0}.pal-btn span{display:none}}@media (max-width:600px){.pal-btn kbd{display:none}}
105+@media (max-width:900px){.grid,.grid.left{grid-template-columns:minmax(0,1fr)}.grid.left>.side.after{order:2}.pal-btn{min-width:0}.pal-btn span{display:none}}@media (max-width:600px){.pal-btn kbd{display:none}.top .wrap{gap:8px}.top nav{gap:0}.top nav a{padding:6px 8px}.top .who>span{display:none}.top .navbtn{padding:6px 8px}}@media (max-width:360px){.brand>span{display:none}}
106106 .box{border:1px solid var(--border);border-radius:var(--r);background:var(--bg);margin:0 0 16px;overflow:hidden}
107107 .box>.head{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--bg2);border-bottom:1px solid var(--border);flex-wrap:wrap}
108108 .box>.body{padding:14px}
@@ -132,7 +132,7 @@
132132 input[type=file]::file-selector-button:hover{background:var(--bg-hover);border-color:var(--fg3)}
133133 .avpick{display:flex;gap:20px;align-items:center;flex-wrap:wrap}.avpick .grow{min-width:240px}
134134 .avpick [data-avatar-status]:empty{display:none}
135-.who{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--fg)}
135+.who{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--fg)}.top .who{white-space:nowrap}
136136 .repohead{padding:18px 0 0;border-bottom:1px solid var(--border);background:var(--bg2)}
137137 .repohead h1{font-size:19px;font-weight:500;display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 6px}
138138 .repohead h1 a{color:var(--fg)}.repohead h1 strong a{font-weight:650}
@@ -283,7 +283,7 @@
283283 a.sha:hover{text-decoration:none;background:var(--accent-soft);color:var(--accent)}
284284 .right{text-align:right}.mt{margin-top:16px}.mb{margin-bottom:16px}.m0{margin:0}
285285 form.inline{display:inline}
286-.navbtn{background:none;border:0;color:var(--fg2);padding:6px 10px;border-radius:6px;font:inherit;cursor:pointer}.navbtn:hover{background:var(--bg-hover);color:var(--fg)}
286+.navbtn{background:none;border:0;color:var(--fg2);padding:6px 10px;border-radius:6px;font:inherit;cursor:pointer;white-space:nowrap}.navbtn:hover{background:var(--bg-hover);color:var(--fg)}
287287 .btn.block{display:flex;width:100%;justify-content:center}
288288 .authcard{max-width:440px;margin:56px auto}.authcard .body{padding:28px}.authcard h1{font-size:24px;margin:12px 0 8px}
289289 .authmark{width:44px;height:44px;border-radius:var(--r);display:grid;place-items:center;background:color-mix(in srgb,var(--brand) 14%,transparent);color:var(--brand)}.authmark svg{width:22px;height:22px}
modifiedapps/diffinery/src/web/ui.tsx+3−3View file
@@ -441,8 +441,8 @@
441441 >
442442 <header class="top">
443443 <div class="wrap">
444- <a class="brand" href="/">
445- {raw(ICONS.logo)} Diffinery
444+ <a class="brand" href="/" aria-label="Diffinery home">
445+ {raw(ICONS.logo)} <span>Diffinery</span>
446446 </a>
447447 {active ? (
448448 <button type="button" class="pal-btn" data-palette="1" aria-label="Open command palette">
@@ -463,7 +463,7 @@
463463 <a href="/notifications" title="Notifications">
464464 {raw(ICONS.bell)}
465465 </a>
466- <a href="/settings" title="Settings" class="who">
466+ <a href="/settings" title="Settings" aria-label={`Settings (${me.login})`} class="who">
467467 <Avatar login={me.login} version={me.avatar_version} /> <span>{me.login}</span>
468468 </a>
469469 </>