Spaces:
Running
Running
Commit ·
20810d7
1
Parent(s): dec9131
Widen the column from 700px to 960px
Browse filesThe measure was chosen for prose, but most of the app isn't prose: the
before/after comparison is two answers meant to be compared side by side,
and the dataset preview is a fixed 420px panel. Both were sharing 700px
while half the screen sat empty, and the vertical space that costs is
exactly what was in short supply.
Safe to widen because text already carries its own caps in ch -- the lede
at 34ch, notes and descriptions at 62-70ch -- so nothing prose-like
stretches with the column.
The exception was the conversation preview, whose turns were capped at 86%
of the container: at 960px that is 825px, well past 120 characters a line.
Those now use a 68ch measure, so a turn still looks like a turn.
- src/components/Chrome.tsx +2 -2
- src/components/ConversationPreview.tsx +8 -3
- src/screens/Auth.tsx +2 -2
- src/screens/CheckData.tsx +3 -3
- src/screens/Done.tsx +1 -1
- src/screens/Running.tsx +2 -2
- src/screens/Start.tsx +2 -2
src/components/Chrome.tsx
CHANGED
|
@@ -78,7 +78,7 @@ function Runs({ runs, onOpen }: { runs: Run[]; onOpen: (id: string) => void }) {
|
|
| 78 |
onClick={() => setOpen(false)}
|
| 79 |
/>
|
| 80 |
<div className="absolute inset-x-0 top-12 z-50 border-b border-line bg-panel">
|
| 81 |
-
<div className="mx-auto max-w-[
|
| 82 |
{runs.map((r) => {
|
| 83 |
const done = r.status === "done";
|
| 84 |
const failed = r.status === "error";
|
|
@@ -132,7 +132,7 @@ export function Header({
|
|
| 132 |
return (
|
| 133 |
<header className="sticky top-0 z-40 border-b border-line bg-bg/90 backdrop-blur">
|
| 134 |
{/* Same measure as every screen — the wordmark lines up with the column. */}
|
| 135 |
-
<div className="mx-auto flex h-12 max-w-[
|
| 136 |
{onHome ? (
|
| 137 |
<button onClick={onHome} aria-label="Back to the start">
|
| 138 |
<Wordmark />
|
|
|
|
| 78 |
onClick={() => setOpen(false)}
|
| 79 |
/>
|
| 80 |
<div className="absolute inset-x-0 top-12 z-50 border-b border-line bg-panel">
|
| 81 |
+
<div className="mx-auto max-w-[960px] px-5">
|
| 82 |
{runs.map((r) => {
|
| 83 |
const done = r.status === "done";
|
| 84 |
const failed = r.status === "error";
|
|
|
|
| 132 |
return (
|
| 133 |
<header className="sticky top-0 z-40 border-b border-line bg-bg/90 backdrop-blur">
|
| 134 |
{/* Same measure as every screen — the wordmark lines up with the column. */}
|
| 135 |
+
<div className="mx-auto flex h-12 max-w-[960px] items-center justify-between gap-4 px-5">
|
| 136 |
{onHome ? (
|
| 137 |
<button onClick={onHome} aria-label="Back to the start">
|
| 138 |
<Wordmark />
|
src/components/ConversationPreview.tsx
CHANGED
|
@@ -77,7 +77,7 @@ function Turn({
|
|
| 77 |
if (message.role === "tool") {
|
| 78 |
return (
|
| 79 |
<div className={cn("flex justify-start", dimmed && "opacity-35")}>
|
| 80 |
-
<div className="min-w-0 max-w-[
|
| 81 |
<div className="cap mb-1 text-dim">
|
| 82 |
{message.name ? `${message.name} answered` : "the tool answered"}
|
| 83 |
</div>
|
|
@@ -92,7 +92,7 @@ function Turn({
|
|
| 92 |
if (calls.length > 0) {
|
| 93 |
return (
|
| 94 |
<div className={cn("flex justify-end", dimmed && "opacity-35")}>
|
| 95 |
-
<div className="min-w-0 max-w-[
|
| 96 |
<div className="cap mb-1.5 text-right">assistant</div>
|
| 97 |
<div className="flex flex-col gap-2">
|
| 98 |
{calls.map((call, index) => (
|
|
@@ -110,7 +110,12 @@ function Turn({
|
|
| 110 |
|
| 111 |
return (
|
| 112 |
<div className={cn("flex", reply ? "justify-end" : "justify-start")}>
|
| 113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
<div className={cn("cap mb-1.5", reply && "text-right")}>{message.role}</div>
|
| 115 |
<div
|
| 116 |
className={cn(
|
|
|
|
| 77 |
if (message.role === "tool") {
|
| 78 |
return (
|
| 79 |
<div className={cn("flex justify-start", dimmed && "opacity-35")}>
|
| 80 |
+
<div className="min-w-0 max-w-[68ch] border-l-2 border-line pl-3">
|
| 81 |
<div className="cap mb-1 text-dim">
|
| 82 |
{message.name ? `${message.name} answered` : "the tool answered"}
|
| 83 |
</div>
|
|
|
|
| 92 |
if (calls.length > 0) {
|
| 93 |
return (
|
| 94 |
<div className={cn("flex justify-end", dimmed && "opacity-35")}>
|
| 95 |
+
<div className="min-w-0 max-w-[68ch]">
|
| 96 |
<div className="cap mb-1.5 text-right">assistant</div>
|
| 97 |
<div className="flex flex-col gap-2">
|
| 98 |
{calls.map((call, index) => (
|
|
|
|
| 110 |
|
| 111 |
return (
|
| 112 |
<div className={cn("flex", reply ? "justify-end" : "justify-start")}>
|
| 113 |
+
{/*
|
| 114 |
+
A character measure, not a percentage. The column is wider than it was, and a
|
| 115 |
+
line of dialogue at 86% of it would run past 120 characters — unreadable, and
|
| 116 |
+
the turns would stop looking like turns.
|
| 117 |
+
*/}
|
| 118 |
+
<div className={cn("max-w-[68ch] min-w-0", dimmed && "opacity-35")}>
|
| 119 |
<div className={cn("cap mb-1.5", reply && "text-right")}>{message.role}</div>
|
| 120 |
<div
|
| 121 |
className={cn(
|
src/screens/Auth.tsx
CHANGED
|
@@ -31,7 +31,7 @@ export function Auth({ onSignedIn }: { onSignedIn: (token: string) => Promise<vo
|
|
| 31 |
};
|
| 32 |
|
| 33 |
return (
|
| 34 |
-
<div className="mx-auto flex min-h-[calc(100vh-3rem)] max-w-[
|
| 35 |
<Lede className="max-w-[30ch]">
|
| 36 |
<i>Fine-tune a model on your own conversations.</i>
|
| 37 |
</Lede>
|
|
@@ -80,7 +80,7 @@ export function Auth({ onSignedIn }: { onSignedIn: (token: string) => Promise<vo
|
|
| 80 |
/** Shown for the moment the session check takes. */
|
| 81 |
export function Checking() {
|
| 82 |
return (
|
| 83 |
-
<div className="mx-auto flex min-h-[calc(100vh-3rem)] max-w-[
|
| 84 |
<Cap>Checking your session…</Cap>
|
| 85 |
</div>
|
| 86 |
);
|
|
|
|
| 31 |
};
|
| 32 |
|
| 33 |
return (
|
| 34 |
+
<div className="mx-auto flex min-h-[calc(100vh-3rem)] max-w-[960px] flex-col justify-center gap-7 px-5 pb-24">
|
| 35 |
<Lede className="max-w-[30ch]">
|
| 36 |
<i>Fine-tune a model on your own conversations.</i>
|
| 37 |
</Lede>
|
|
|
|
| 80 |
/** Shown for the moment the session check takes. */
|
| 81 |
export function Checking() {
|
| 82 |
return (
|
| 83 |
+
<div className="mx-auto flex min-h-[calc(100vh-3rem)] max-w-[960px] items-center px-5">
|
| 84 |
<Cap>Checking your session…</Cap>
|
| 85 |
</div>
|
| 86 |
);
|
src/screens/CheckData.tsx
CHANGED
|
@@ -27,7 +27,7 @@ function Notes({ issues }: { issues: Issue[] }) {
|
|
| 27 |
|
| 28 |
function Reading({ dataset }: { dataset: DatasetSummary }) {
|
| 29 |
return (
|
| 30 |
-
<div className="mx-auto max-w-[
|
| 31 |
<div className="flex items-center gap-3 text-[13px] text-mut">
|
| 32 |
<Spinner className="text-hot" />
|
| 33 |
Reading {dataset.id}
|
|
@@ -62,7 +62,7 @@ export function CheckData({
|
|
| 62 |
|
| 63 |
if (error) {
|
| 64 |
return (
|
| 65 |
-
<div className="mx-auto flex max-w-[
|
| 66 |
<Lede>
|
| 67 |
<i>{error}</i>
|
| 68 |
</Lede>
|
|
@@ -90,7 +90,7 @@ export function CheckData({
|
|
| 90 |
);
|
| 91 |
|
| 92 |
return (
|
| 93 |
-
<div className="mx-auto flex max-w-[
|
| 94 |
<button
|
| 95 |
onClick={onBack}
|
| 96 |
className="cap self-start transition-colors hover:text-ink"
|
|
|
|
| 27 |
|
| 28 |
function Reading({ dataset }: { dataset: DatasetSummary }) {
|
| 29 |
return (
|
| 30 |
+
<div className="mx-auto max-w-[960px] px-5 pt-32">
|
| 31 |
<div className="flex items-center gap-3 text-[13px] text-mut">
|
| 32 |
<Spinner className="text-hot" />
|
| 33 |
Reading {dataset.id}
|
|
|
|
| 62 |
|
| 63 |
if (error) {
|
| 64 |
return (
|
| 65 |
+
<div className="mx-auto flex max-w-[960px] flex-col items-start gap-6 px-5 pt-32">
|
| 66 |
<Lede>
|
| 67 |
<i>{error}</i>
|
| 68 |
</Lede>
|
|
|
|
| 90 |
);
|
| 91 |
|
| 92 |
return (
|
| 93 |
+
<div className="mx-auto flex max-w-[960px] flex-col gap-7 px-5 pt-10 pb-16">
|
| 94 |
<button
|
| 95 |
onClick={onBack}
|
| 96 |
className="cap self-start transition-colors hover:text-ink"
|
src/screens/Done.tsx
CHANGED
|
@@ -66,7 +66,7 @@ export function Done({ run, onRestart }: { run: Run; onRestart: () => void }) {
|
|
| 66 |
* minutes for is the proof that their model came out different, and that belongs
|
| 67 |
* above the fold. So: what happened, shown; then where it lives.
|
| 68 |
*/
|
| 69 |
-
<div className="mx-auto flex max-w-[
|
| 70 |
<Lede>
|
| 71 |
<i>Your model is ready.</i> <em>Here's what changed.</em>
|
| 72 |
</Lede>
|
|
|
|
| 66 |
* minutes for is the proof that their model came out different, and that belongs
|
| 67 |
* above the fold. So: what happened, shown; then where it lives.
|
| 68 |
*/
|
| 69 |
+
<div className="mx-auto flex max-w-[960px] flex-col gap-8 px-5 pt-10 pb-20">
|
| 70 |
<Lede>
|
| 71 |
<i>Your model is ready.</i> <em>Here's what changed.</em>
|
| 72 |
</Lede>
|
src/screens/Running.tsx
CHANGED
|
@@ -87,7 +87,7 @@ export function Running({ run }: { run: Run }) {
|
|
| 87 |
|
| 88 |
if (run.status === "error") {
|
| 89 |
return (
|
| 90 |
-
<div className="mx-auto flex max-w-[
|
| 91 |
<Lede>
|
| 92 |
<i>This run stopped early.</i>
|
| 93 |
</Lede>
|
|
@@ -100,7 +100,7 @@ export function Running({ run }: { run: Run }) {
|
|
| 100 |
}
|
| 101 |
|
| 102 |
return (
|
| 103 |
-
<div className="mx-auto flex max-w-[
|
| 104 |
<Lede>
|
| 105 |
<i>{eta(run.etaSeconds)}.</i> <em>You can close this page.</em>
|
| 106 |
</Lede>
|
|
|
|
| 87 |
|
| 88 |
if (run.status === "error") {
|
| 89 |
return (
|
| 90 |
+
<div className="mx-auto flex max-w-[960px] flex-col gap-6 px-5 pt-10 pb-20">
|
| 91 |
<Lede>
|
| 92 |
<i>This run stopped early.</i>
|
| 93 |
</Lede>
|
|
|
|
| 100 |
}
|
| 101 |
|
| 102 |
return (
|
| 103 |
+
<div className="mx-auto flex max-w-[960px] flex-col gap-8 px-5 pt-10 pb-20">
|
| 104 |
<Lede>
|
| 105 |
<i>{eta(run.etaSeconds)}.</i> <em>You can close this page.</em>
|
| 106 |
</Lede>
|
src/screens/Start.tsx
CHANGED
|
@@ -181,7 +181,7 @@ export function Start({
|
|
| 181 |
}, [query, user, token]);
|
| 182 |
|
| 183 |
return (
|
| 184 |
-
<div className="mx-auto flex max-w-[
|
| 185 |
<Lede>
|
| 186 |
<i>Pick a model and a dataset.</i>
|
| 187 |
</Lede>
|
|
@@ -256,7 +256,7 @@ export function Start({
|
|
| 256 |
{/* -------------------------------------------------------- sticky bar */}
|
| 257 |
{dataset && (
|
| 258 |
<div className="fixed inset-x-0 bottom-0 z-30 border-t border-line bg-bg/95 backdrop-blur">
|
| 259 |
-
<div className="mx-auto flex max-w-[
|
| 260 |
<span className="min-w-0 truncate text-[12.5px]">
|
| 261 |
{dataset.id} <span className="text-dim">· {fmt(dataset.rows)} conversations</span>
|
| 262 |
</span>
|
|
|
|
| 181 |
}, [query, user, token]);
|
| 182 |
|
| 183 |
return (
|
| 184 |
+
<div className="mx-auto flex max-w-[960px] flex-col gap-8 px-5 pt-10 pb-24">
|
| 185 |
<Lede>
|
| 186 |
<i>Pick a model and a dataset.</i>
|
| 187 |
</Lede>
|
|
|
|
| 256 |
{/* -------------------------------------------------------- sticky bar */}
|
| 257 |
{dataset && (
|
| 258 |
<div className="fixed inset-x-0 bottom-0 z-30 border-t border-line bg-bg/95 backdrop-blur">
|
| 259 |
+
<div className="mx-auto flex max-w-[960px] items-center justify-between gap-4 px-5 py-3">
|
| 260 |
<span className="min-w-0 truncate text-[12.5px]">
|
| 261 |
{dataset.id} <span className="text-dim">· {fmt(dataset.rows)} conversations</span>
|
| 262 |
</span>
|