Skip to content

Commit 391613e

Browse files
V48 Gate 3 (implementation-only): rich tooltips across deposit/read stat surfaces + compact source-selection spacing
Rich hover tooltips (the TelemetryExplainerTrigger used by telemetry pills, now generalized: 'as' div wrapper for block rows, optional generic section) across every stat surface the pages show: - route header metric chips (Depositing: Stage/Options/Positive ROI/ Admitted/Network/Authority/Earning estimate; Reading: Stage/Rows/ Boundary/Quote) via ProductRouteMetric.description - source-safe session rows, organization-authority rows, earning- supply-intelligence rows, and opportunity-root rows on /deposits - deposit proof-detail roots via ProductRouteProofRoot.description - disclosure summaries (Disclosure boundary, Authority blockers) via ProductRouteDisclosure.summaryDescription - transactions-table overview stat cards (Activity/Own visible/Visible tokens) and state pills (selection, mode, data source, search span) - Provider/Repository kickers on the deposit source selection get the established (i) inline explainers (new provider explainer copy) Copy lives in app/deposits/deposit-stat-explainers.ts. Spacing: the source-selection stack compacts — provider/repo and branch/commit blocks tightened (mt-3/gap-3), branch+commit pair at tablet instead of lg, card chrome shrunk (px-3 py-2.5, h-9 combobox triggers, smaller captions), summary strip tightened. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent c205813 commit 391613e

9 files changed

Lines changed: 425 additions & 82 deletions

uapi/app/deposits/DepositPageClient.tsx

Lines changed: 96 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ import { QuantumOrb } from "@/components/base/bitcode/effects/quantum-orb";
7070
import { verifiedAccessOrbConfig } from "@/app/(root)/components/landing/marketing-landing-shared";
7171
import BitcodeInlineExplainer from "@/components/base/bitcode/execution/BitcodeInlineExplainer";
7272
import { DEPOSIT_SECTION_EXPLAINERS } from "@/app/deposits/deposit-explainers";
73+
import {
74+
DEPOSIT_AUTHORITY_BLOCKERS_EXPLAINER,
75+
DEPOSIT_AUTHORITY_ROW_EXPLAINERS,
76+
DEPOSIT_DISCLOSURE_BOUNDARY_EXPLAINER,
77+
DEPOSIT_EARNING_ROW_EXPLAINERS,
78+
DEPOSIT_HEADER_METRIC_EXPLAINERS,
79+
DEPOSIT_OPPORTUNITY_ROOT_EXPLAINER,
80+
DEPOSIT_PROOF_ROOT_EXPLAINERS,
81+
DEPOSIT_SESSION_ROW_EXPLAINERS,
82+
} from "@/app/deposits/deposit-stat-explainers";
83+
import { TelemetryExplainerTrigger } from "@/components/base/bitcode/execution/TelemetryExplainerTrigger";
7384
import type {
7485
DepositOptionReviewDecision,
7586
DepositOptionReviewDecisionState,
@@ -1246,33 +1257,40 @@ export default function DepositPageClient() {
12461257
metrics={[
12471258
{
12481259
label: "Stage",
1260+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Stage"],
12491261
value: depositRouteSession.activeStepId.replace(/-/g, " "),
12501262
},
12511263
{
12521264
label: "Options",
1265+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Options"],
12531266
value: depositRouteSession.synthesis.optionCount,
12541267
},
12551268
{
12561269
label: "Positive ROI",
1270+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Positive ROI"],
12571271
value: depositRouteSession.policy.reviewablePositiveRoiCount,
12581272
},
12591273
{
12601274
label: "Admitted",
1275+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Admitted"],
12611276
value: depositRouteSession.admission.admittedCount,
12621277
},
12631278
{
12641279
label: "Network",
1280+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Network"],
12651281
value:
12661282
networkDepositoryCount === null ? "—" : networkDepositoryCount,
12671283
},
12681284
{
12691285
label: "Authority",
1286+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Authority"],
12701287
value:
12711288
depositRouteSession.organizationPolicyWalletAuthority.aggregate
12721289
.state,
12731290
},
12741291
{
12751292
label: "Earning estimate",
1293+
description: DEPOSIT_HEADER_METRIC_EXPLAINERS["Earning estimate"],
12761294
value: formatSats(
12771295
depositRouteSession.earningSupplyIntelligence.aggregate
12781296
.totalExpectedCompensationSats,
@@ -2239,7 +2257,15 @@ export default function DepositPageClient() {
22392257
/>
22402258
</summary>
22412259
<dl className="mt-4 grid gap-2">
2242-
<div className="border border-emerald-300/15 bg-emerald-300/[0.04] px-3 py-2">
2260+
<TelemetryExplainerTrigger
2261+
as="div"
2262+
className="border border-emerald-300/15 bg-emerald-300/[0.04] px-3 py-2"
2263+
explainer={{
2264+
kicker: "Earning intelligence",
2265+
title: "Likely demand",
2266+
specific: DEPOSIT_EARNING_ROW_EXPLAINERS["Likely demand"],
2267+
}}
2268+
>
22432269
<dt className="text-[0.58rem] uppercase tracking-[0.14em] text-neutral-500">
22442270
Likely demand
22452271
</dt>
@@ -2251,8 +2277,16 @@ export default function DepositPageClient() {
22512277
)}
22522278
%
22532279
</dd>
2254-
</div>
2255-
<div className="border border-white/8 bg-black/20 px-3 py-2">
2280+
</TelemetryExplainerTrigger>
2281+
<TelemetryExplainerTrigger
2282+
as="div"
2283+
className="border border-white/8 bg-black/20 px-3 py-2"
2284+
explainer={{
2285+
kicker: "Earning intelligence",
2286+
title: "Unfit Need opportunities",
2287+
specific: DEPOSIT_EARNING_ROW_EXPLAINERS["Unfit Need opportunities"],
2288+
}}
2289+
>
22562290
<dt className="text-[0.58rem] uppercase tracking-[0.14em] text-neutral-500">
22572291
Unfit Need opportunities
22582292
</dt>
@@ -2267,8 +2301,16 @@ export default function DepositPageClient() {
22672301
.unfitNeedOpportunities.state
22682302
}
22692303
</dd>
2270-
</div>
2271-
<div className="border border-white/8 bg-black/20 px-3 py-2">
2304+
</TelemetryExplainerTrigger>
2305+
<TelemetryExplainerTrigger
2306+
as="div"
2307+
className="border border-white/8 bg-black/20 px-3 py-2"
2308+
explainer={{
2309+
kicker: "Earning intelligence",
2310+
title: "Expected compensation",
2311+
specific: DEPOSIT_EARNING_ROW_EXPLAINERS["Expected compensation"],
2312+
}}
2313+
>
22722314
<dt className="text-[0.58rem] uppercase tracking-[0.14em] text-neutral-500">
22732315
Expected compensation
22742316
</dt>
@@ -2283,8 +2325,16 @@ export default function DepositPageClient() {
22832325
.expectedCompensationRangeSats.high,
22842326
)}
22852327
</dd>
2286-
</div>
2287-
<div className="border border-white/8 bg-black/20 px-3 py-2">
2328+
</TelemetryExplainerTrigger>
2329+
<TelemetryExplainerTrigger
2330+
as="div"
2331+
className="border border-white/8 bg-black/20 px-3 py-2"
2332+
explainer={{
2333+
kicker: "Earning intelligence",
2334+
title: "Supply recommendations",
2335+
specific: DEPOSIT_EARNING_ROW_EXPLAINERS["Supply recommendations"],
2336+
}}
2337+
>
22882338
<dt className="text-[0.58rem] uppercase tracking-[0.14em] text-neutral-500">
22892339
Supply recommendations
22902340
</dt>
@@ -2300,7 +2350,7 @@ export default function DepositPageClient() {
23002350
}{" "}
23012351
repair
23022352
</dd>
2303-
</div>
2353+
</TelemetryExplainerTrigger>
23042354
</dl>
23052355
<details className="mt-3 border border-emerald-300/15 bg-emerald-300/[0.04] px-3 py-3">
23062356
<summary className="cursor-pointer text-[0.62rem] uppercase tracking-[0.16em] text-emerald-100/85">
@@ -2309,14 +2359,22 @@ export default function DepositPageClient() {
23092359
<dl className="mt-2 grid gap-2">
23102360
{depositRouteSession.earningSupplyIntelligence.unfitNeedOpportunities.opportunities.map(
23112361
(opportunity) => (
2312-
<div key={opportunity.id}>
2362+
<TelemetryExplainerTrigger
2363+
key={opportunity.id}
2364+
as="div"
2365+
explainer={{
2366+
kicker: "Opportunity root",
2367+
title: opportunity.label,
2368+
specific: DEPOSIT_OPPORTUNITY_ROOT_EXPLAINER,
2369+
}}
2370+
>
23132371
<dt className="text-[0.56rem] uppercase tracking-[0.12em] text-neutral-500">
23142372
{opportunity.label}
23152373
</dt>
23162374
<dd className="break-all font-mono text-[0.66rem] text-neutral-300">
23172375
{opportunity.opportunityRoot}
23182376
</dd>
2319-
</div>
2377+
</TelemetryExplainerTrigger>
23202378
),
23212379
)}
23222380
</dl>
@@ -2343,17 +2401,25 @@ export default function DepositPageClient() {
23432401
</summary>
23442402
<dl className="mt-4 grid gap-2">
23452403
{authorityRows.map((row) => (
2346-
<div
2404+
<TelemetryExplainerTrigger
23472405
key={row.label}
2406+
as="div"
23482407
className="border border-white/8 bg-black/20 px-3 py-2"
2408+
explainer={{
2409+
kicker: "Governance",
2410+
title: row.label,
2411+
specific:
2412+
DEPOSIT_AUTHORITY_ROW_EXPLAINERS[row.label] ??
2413+
"Organization authority state for this deposit route.",
2414+
}}
23492415
>
23502416
<dt className="text-[0.58rem] uppercase tracking-[0.14em] text-neutral-500">
23512417
{row.label}
23522418
</dt>
23532419
<dd className="mt-1 break-words font-mono text-[0.68rem] text-neutral-200">
23542420
{row.value}
23552421
</dd>
2356-
</div>
2422+
</TelemetryExplainerTrigger>
23572423
))}
23582424
</dl>
23592425
{depositRouteSession.organizationPolicyWalletAuthority.aggregate
@@ -2362,6 +2428,7 @@ export default function DepositPageClient() {
23622428
<ProductRouteDisclosure
23632429
title="Authority blockers"
23642430
tone="emerald"
2431+
summaryDescription={DEPOSIT_AUTHORITY_BLOCKERS_EXPLAINER}
23652432
>
23662433
{depositRouteSession.organizationPolicyWalletAuthority.aggregate.blockers.join(
23672434
"; ",
@@ -2391,23 +2458,32 @@ export default function DepositPageClient() {
23912458
</summary>
23922459
<dl className="mt-4 grid gap-2">
23932460
{sessionRows.map((row) => (
2394-
<div
2461+
<TelemetryExplainerTrigger
23952462
key={row.label}
2463+
as="div"
23962464
className="border border-white/8 bg-black/20 px-3 py-2"
2465+
explainer={{
2466+
kicker: "Session state",
2467+
title: row.label,
2468+
specific:
2469+
DEPOSIT_SESSION_ROW_EXPLAINERS[row.label] ??
2470+
"Source-safe session state for this deposit route.",
2471+
}}
23972472
>
23982473
<dt className="text-[0.58rem] uppercase tracking-[0.14em] text-neutral-500">
23992474
{row.label}
24002475
</dt>
24012476
<dd className="mt-1 break-words font-mono text-[0.68rem] text-neutral-200">
24022477
{row.value}
24032478
</dd>
2404-
</div>
2479+
</TelemetryExplainerTrigger>
24052480
))}
24062481
</dl>
24072482
<div className="mt-3">
24082483
<ProductRouteDisclosure
24092484
title="Disclosure boundary"
24102485
tone="emerald"
2486+
summaryDescription={DEPOSIT_DISCLOSURE_BOUNDARY_EXPLAINER}
24112487
>
24122488
Visible: measurements, demand roots, source path roots, policy
24132489
roots, estimated ROI, BTD potential, compensation metadata.
@@ -2424,34 +2500,40 @@ export default function DepositPageClient() {
24242500
roots={[
24252501
{
24262502
id: "route-session-root",
2503+
description: DEPOSIT_PROOF_ROOT_EXPLAINERS["route-session-root"],
24272504
label: "Route session root",
24282505
root: depositRouteSession.proofRoot,
24292506
},
24302507
{
24312508
id: "synthesis-root",
2509+
description: DEPOSIT_PROOF_ROOT_EXPLAINERS["synthesis-root"],
24322510
label: "Synthesis root",
24332511
root: depositRouteSession.synthesis.roots.synthesisRoot,
24342512
},
24352513
{
24362514
id: "policy-root",
2515+
description: DEPOSIT_PROOF_ROOT_EXPLAINERS["policy-root"],
24372516
label: "Policy root",
24382517
root: depositRouteSession.policy.roots.policyReportRoot,
24392518
},
24402519
{
24412520
id: "admission-root",
2521+
description: DEPOSIT_PROOF_ROOT_EXPLAINERS["admission-root"],
24422522
label: "Admission root",
24432523
root:
24442524
depositRouteSession.admission.roots.admissionReportRoot,
24452525
},
24462526
{
24472527
id: "earning-root",
2528+
description: DEPOSIT_PROOF_ROOT_EXPLAINERS["earning-root"],
24482529
label: "Earning intelligence root",
24492530
root:
24502531
depositRouteSession.earningSupplyIntelligence.roots
24512532
.intelligenceRoot,
24522533
},
24532534
{
24542535
id: "authority-root",
2536+
description: DEPOSIT_PROOF_ROOT_EXPLAINERS["authority-root"],
24552537
label: "Authority root",
24562538
root:
24572539
depositRouteSession.organizationPolicyWalletAuthority

uapi/app/deposits/DepositSourceSelection.tsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -448,10 +448,11 @@ export default function DepositSourceSelection({
448448
</button>
449449
</div>
450450

451-
<div className="mt-4 grid gap-3 lg:grid-cols-[minmax(0,240px)_minmax(0,1fr)]">
451+
<div className="mt-3 grid gap-3 lg:grid-cols-[minmax(0,240px)_minmax(0,1fr)]">
452452
<div>
453-
<span className="text-[0.62rem] uppercase tracking-[0.18em] text-neutral-500">
454-
Provider
453+
<span className="flex items-center gap-2 text-[0.62rem] uppercase tracking-[0.18em] text-neutral-500">
454+
<span>Provider</span>
455+
<BitcodeInlineExplainer explainer={DEPOSIT_SECTION_EXPLAINERS.provider} triggerAriaLabel="More info about this field" />
455456
</span>
456457
<div className="mt-1.5">
457458
<SearchableSelect
@@ -486,8 +487,9 @@ export default function DepositSourceSelection({
486487
</div>
487488
</div>
488489
<div>
489-
<span className="text-[0.62rem] uppercase tracking-[0.18em] text-neutral-500">
490-
Repository
490+
<span className="flex items-center gap-2 text-[0.62rem] uppercase tracking-[0.18em] text-neutral-500">
491+
<span>Repository</span>
492+
<BitcodeInlineExplainer explainer={DEPOSIT_SECTION_EXPLAINERS.repository} triggerAriaLabel="More info about this field" />
491493
</span>
492494
<div className="mt-1.5">
493495
<VCSRepositorySelector
@@ -519,14 +521,14 @@ export default function DepositSourceSelection({
519521
</div>
520522
</div>
521523

522-
<div className="mt-4 grid gap-4 lg:grid-cols-2">
523-
<div className="rounded-[1.25rem] border border-white/8 bg-white/5 px-4 py-4">
524+
<div className="mt-3 grid gap-3 tablet:grid-cols-2">
525+
<div className="rounded-[1rem] border border-white/8 bg-white/5 px-3 py-2.5">
524526
<span className="flex items-center gap-2 text-[0.64rem] uppercase tracking-[0.2em] text-neutral-400">
525527
<GitBranch className="h-3.5 w-3.5" />
526528
<span>Branch</span>
527529
<BitcodeInlineExplainer explainer={DEPOSIT_SECTION_EXPLAINERS.branch} triggerAriaLabel="More info about this field" />
528530
</span>
529-
<div className="mt-3">
531+
<div className="mt-2">
530532
<SearchableSelect
531533
aria-label="Repository source branch"
532534
value={selectedBranch || null}
@@ -555,22 +557,22 @@ export default function DepositSourceSelection({
555557
params.delete("commit");
556558
})
557559
}
558-
className="rounded-xl border-white/10 bg-[rgba(10,15,30,0.88)] px-3 py-3 text-sm text-white hover:bg-[rgba(10,15,30,0.88)] focus:border-emerald-400/40"
560+
className="h-9 rounded-xl border-white/10 bg-[rgba(10,15,30,0.88)] px-3 text-sm text-white hover:bg-[rgba(10,15,30,0.88)] focus:border-emerald-400/40"
559561
/>
560562
</div>
561-
<p className="mt-2 text-[0.68rem] uppercase tracking-[0.18em] text-neutral-500">
563+
<p className="mt-1.5 text-[0.6rem] uppercase tracking-[0.16em] text-neutral-500">
562564
{isLoadingBranches
563565
? "Loading branches…"
564566
: "Default branch is selected when available"}
565567
</p>
566568
</div>
567569

568-
<div className="rounded-[1.25rem] border border-white/8 bg-white/5 px-4 py-4">
570+
<div className="rounded-[1rem] border border-white/8 bg-white/5 px-3 py-2.5">
569571
<span className="flex items-center gap-2 text-[0.64rem] uppercase tracking-[0.2em] text-neutral-400">
570572
<span>Commit / ref</span>
571573
<BitcodeInlineExplainer explainer={DEPOSIT_SECTION_EXPLAINERS.commit} triggerAriaLabel="More info about this field" />
572574
</span>
573-
<div className="mt-3">
575+
<div className="mt-2">
574576
<SearchableSelect
575577
aria-label="Repository source commit"
576578
value={selectedCommit || null}
@@ -596,18 +598,18 @@ export default function DepositSourceSelection({
596598
params.delete("commit");
597599
})
598600
}
599-
className="rounded-xl border-white/10 bg-[rgba(10,15,30,0.88)] px-3 py-3 text-sm text-white hover:bg-[rgba(10,15,30,0.88)] focus:border-emerald-400/40"
601+
className="h-9 rounded-xl border-white/10 bg-[rgba(10,15,30,0.88)] px-3 text-sm text-white hover:bg-[rgba(10,15,30,0.88)] focus:border-emerald-400/40"
600602
/>
601603
</div>
602-
<p className="mt-2 text-[0.68rem] uppercase tracking-[0.18em] text-neutral-500">
604+
<p className="mt-1.5 text-[0.6rem] uppercase tracking-[0.16em] text-neutral-500">
603605
{isLoadingCommits
604606
? "Loading commits…"
605607
: "Latest branch commit is selected when available"}
606608
</p>
607609
</div>
608610
</div>
609611

610-
<div className="mt-4 flex flex-wrap items-center justify-between gap-3 border border-white/8 bg-white/[0.025] px-4 py-3">
612+
<div className="mt-3 flex flex-wrap items-center justify-between gap-3 border border-white/8 bg-white/[0.025] px-3 py-2.5">
611613
<span className="flex items-center gap-2 text-sm text-neutral-300">
612614
{connectionStatus?.connected ? null : (
613615
<Lock className="h-3.5 w-3.5 text-neutral-500" />

uapi/app/deposits/deposit-explainers.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ export const DEPOSIT_SECTION_EXPLAINERS = {
3131
canon: DEPOSIT_CANON_REFS,
3232
},
3333
}),
34+
provider: buildExplainer({
35+
kicker: 'Provider',
36+
title: 'Repository provider',
37+
summary:
38+
'The version-control host Bitcode reads your repositories from. GitHub is the supported provider today; the selection drives which account connection and repository inventory the deposit route uses.',
39+
detail:
40+
'Switching provider clears the selected repository, branch, and commit — the source package re-derives from the new provider connection. The item description shows whether the provider connection is currently live.',
41+
points: [
42+
'Pick the host whose repositories you want to deposit from',
43+
'Connection state is checked live against the provider session',
44+
'More providers (GitLab, Bitbucket) slot in through the same selector',
45+
],
46+
references: {
47+
source: [...DEPOSIT_SOURCE_REFS, 'uapi/app/terminal/terminal-repository-context.ts'],
48+
canon: DEPOSIT_CANON_REFS,
49+
},
50+
}),
3451
repository: buildExplainer({
3552
kicker: 'Repository',
3653
title: 'Select the repository you are depositing',

0 commit comments

Comments
 (0)