Skip to content

Commit 648c3bb

Browse files
DylanMerigaudclaude
andcommitted
Tighten the header + link the default-workflow hint to the Build tab
Header: pair the logo with "ledgerloop" as one centered lockup (it was floating low, centered against the two-line block), shorten the tagline to one line, and trim the top padding — less height, no value lost. Pipeline trace: when no workflow is derived, "Default workflow — build your own to route against it" now links back to the Build the workflow tab (threaded a tab-switch callback down through AppView -> Dashboard). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent cb875fa commit 648c3bb

3 files changed

Lines changed: 36 additions & 15 deletions

File tree

app/page.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default async function Page() {
3636
just BELOW this box — off the bottom edge — so it only appears when you scroll
3737
down, giving the content the full screen. On mobile it all falls back to
3838
natural height + normal page scroll. */}
39-
<div className="flex flex-col pb-3 pt-7 sm:pt-9 lg:h-dvh lg:pb-5">
39+
<div className="flex flex-col pb-3 pt-5 sm:pt-6 lg:h-dvh lg:pb-5">
4040
<Header />
4141
<div className="min-h-0 flex-1">
4242
{dbError ? (
@@ -55,21 +55,21 @@ export default async function Page() {
5555

5656
const Header = () => {
5757
return (
58-
<header className="mb-6 flex flex-wrap items-start justify-between gap-4">
59-
<div className="flex items-center gap-3">
60-
<LogoMark />
61-
<div>
58+
<header className="mb-5 flex flex-wrap items-start justify-between gap-4">
59+
<div>
60+
<div className="flex items-center gap-3">
61+
<LogoMark />
6262
<h1 className="text-[19px] font-semibold leading-none tracking-tight text-ink">
6363
ledgerloop
6464
</h1>
65-
<p className="mt-1.5 max-w-xl text-[13.5px] leading-snug text-muted">
66-
An onboarding agent that reads a client&apos;s HRIS and{" "}
67-
<span className="font-medium text-ink">
68-
derives their approval workflow
69-
</span>
70-
, then runs procure-to-pay against it.
71-
</p>
7265
</div>
66+
<p className="mt-2 max-w-xl text-[13.5px] leading-snug text-muted">
67+
Reads a client&apos;s HRIS,{" "}
68+
<span className="font-medium text-ink">
69+
derives their approval workflow
70+
</span>
71+
, and runs procure-to-pay against it.
72+
</p>
7373
</div>
7474
<div className="flex shrink-0 items-center gap-2">
7575
<HowItWorks />

components/app-view.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ export const AppView = ({ queue }: { queue: QueueItem[] }) => {
5959
/>
6060
</div>
6161
<div className={view === "pipeline" ? "h-full" : "hidden"}>
62-
<Dashboard queue={queue} workflow={workflow} />
62+
<Dashboard
63+
queue={queue}
64+
workflow={workflow}
65+
onBuildWorkflow={() => setView("onboarding")}
66+
/>
6367
</div>
6468
</div>
6569
</div>

components/dashboard.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,13 +230,24 @@ const Spinner = () => {
230230
*/
231231
const RunningAgainst = ({
232232
workflow,
233+
onBuildWorkflow,
233234
}: {
234235
workflow: TApprovalWorkflow | null;
236+
/** Jump back to the "Build the workflow" tab to run discovery. */
237+
onBuildWorkflow: () => void;
235238
}) => {
236239
if (!workflow) {
237240
return (
238241
<p className="mt-1 text-[11px] text-faint">
239-
Default workflow — run discovery to route against your own.
242+
Default workflow —{" "}
243+
<button
244+
type="button"
245+
onClick={onBuildWorkflow}
246+
className="font-medium text-accent underline-offset-2 hover:underline"
247+
>
248+
build your own
249+
</button>{" "}
250+
to route against it.
240251
</p>
241252
);
242253
}
@@ -254,12 +265,15 @@ const RunningAgainst = ({
254265
export const Dashboard = ({
255266
queue,
256267
workflow,
268+
onBuildWorkflow,
257269
}: {
258270
queue: QueueItem[];
259271
/** The active approval workflow this pipeline runs against (lifted from
260272
onboarding via AppView). null until discovery has run — the server then falls
261273
back to its default DAG. */
262274
workflow: TApprovalWorkflow | null;
275+
/** Switch to the "Build the workflow" tab (the trace's no-workflow hint links here). */
276+
onBuildWorkflow: () => void;
263277
}) => {
264278
const [selectedId, setSelectedId] = useState<string | null>(
265279
queue[0]?.id ?? null,
@@ -574,7 +588,10 @@ export const Dashboard = ({
574588
<span className="font-mono">{previewItem.invoiceNumber}</span>
575589
</p>
576590
)}
577-
<RunningAgainst workflow={workflow} />
591+
<RunningAgainst
592+
workflow={workflow}
593+
onBuildWorkflow={onBuildWorkflow}
594+
/>
578595
</div>
579596
{state.status === "awaiting" && selected && gates.length >= 2 ? (
580597
// Several gates pend in parallel — decide each on its node in the graph,

0 commit comments

Comments
 (0)