Skip to content

Commit fc7bc3a

Browse files
V48 (impl-only): Packs row UX, header parity, marketing buy/sell copy
Remove keyboard hint; normalize Packs/Read/Deposit header height; whole-row pack select with measurements; deeper multi-token pack search; refine landing copy for AssetPack buyers and sellers.
1 parent f878a99 commit fc7bc3a

9 files changed

Lines changed: 243 additions & 154 deletions

File tree

uapi/components/bitcode/activity/PackActivityModel/pack-activity-model.ts

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,28 @@ function matchesFilter(value: string | null, filter: string | undefined) {
860860
return !filter || filter === 'all' || String(value || '') === filter;
861861
}
862862

863+
function flattenMetadataSearchTokens(value: unknown, depth = 0): string[] {
864+
if (value == null || depth > 4) return [];
865+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
866+
return [String(value)];
867+
}
868+
if (Array.isArray(value)) {
869+
return value.flatMap((entry) => flattenMetadataSearchTokens(entry, depth + 1));
870+
}
871+
if (typeof value === 'object') {
872+
return Object.entries(value as Record<string, unknown>).flatMap(([key, entry]) => [
873+
key,
874+
...flattenMetadataSearchTokens(entry, depth + 1),
875+
]);
876+
}
877+
return [];
878+
}
879+
880+
/**
881+
* Full-text corpus for /packs search: every source-safe field buyers use to
882+
* find AssetPacks — titles, absolute/neediness measurements, values, proofs,
883+
* states, accounting/governance roots, and shallow metadata.
884+
*/
863885
function buildSearchText(record: PackActivityRecord) {
864886
return [
865887
record.id,
@@ -870,35 +892,64 @@ function buildSearchText(record: PackActivityRecord) {
870892
record.repository,
871893
record.assetPackTitle,
872894
record.settlementState,
895+
record.rightsState,
873896
record.compensationState,
874897
record.deliveryState,
898+
record.deliveryReference,
875899
record.repairState,
900+
record.timestamp,
901+
record.scope,
876902
record.commodityState.assetPackState,
877903
record.commodityState.btdState,
878904
record.commodityState.btcState,
879905
record.commodityState.disclosureBoundary,
906+
...(Array.isArray(record.commodityState.blockers)
907+
? record.commodityState.blockers
908+
: []),
880909
...record.measurements.flatMap((measurement) => [
881910
measurement.id,
882911
measurement.label,
883912
String(measurement.value),
884913
measurement.unit,
885914
measurement.root,
915+
// Common absolute / neediness phrasing so partial queries hit.
916+
'absolute',
917+
'measurement',
918+
'neediness',
919+
`${measurement.label} ${measurement.value}`,
920+
measurement.unit ? `${measurement.value} ${measurement.unit}` : null,
921+
]),
922+
...record.values.flatMap((value) => [
923+
value.id,
924+
value.label,
925+
String(value.amount),
926+
value.unit,
927+
`${value.label} ${value.amount}`,
928+
`${value.amount} ${value.unit}`,
929+
]),
930+
...record.proofRoots.flatMap((proofRoot) => [
931+
proofRoot.id,
932+
proofRoot.label,
933+
proofRoot.root,
886934
]),
887-
...record.values.flatMap((value) => [value.id, value.label, String(value.amount), value.unit]),
888-
...record.proofRoots.flatMap((proofRoot) => [proofRoot.id, proofRoot.label, proofRoot.root]),
889935
record.accounting?.state,
890936
record.accounting?.btdRangeState,
891937
record.accounting?.btcSettlementState,
892938
record.accounting?.compensationState,
893939
record.accounting?.reconciliationState,
894940
record.accounting?.treasuryRouteState,
895941
record.accounting?.statementRoot,
942+
record.accounting ? String(record.accounting.contributorCount) : null,
943+
record.accounting ? String(record.accounting.depositorCount) : null,
944+
record.accounting ? String(record.accounting.finalSettlementSats) : null,
945+
record.accounting ? String(record.accounting.allocatedContributorSats) : null,
896946
record.governance?.state,
897947
record.governance?.route,
898948
record.governance?.walletState,
899949
record.governance?.spendState,
900950
record.governance?.depositState,
901951
record.governance?.authorityRoot,
952+
...flattenMetadataSearchTokens(record.metadata),
902953
]
903954
.filter(Boolean)
904955
.join(' ')
@@ -966,7 +1017,13 @@ export function filterPackActivityRecords(
9661017
if (!matchesFilter(record.deliveryState, filters.deliveryState)) return false;
9671018
if (!matchesFilter(record.repairState, filters.repairState)) return false;
9681019
if (!matchesFilter(record.repository, filters.repository)) return false;
969-
if (normalizedSearch && !buildSearchText(record).includes(normalizedSearch)) return false;
1020+
if (normalizedSearch) {
1021+
// Multi-token AND: every whitespace-separated term must appear somewhere
1022+
// in the pack corpus (measurements, absolutes, proofs, states, …).
1023+
const haystack = buildSearchText(record);
1024+
const tokens = normalizedSearch.split(/\s+/).filter(Boolean);
1025+
if (!tokens.every((token) => haystack.includes(token))) return false;
1026+
}
9701027
return true;
9711028
});
9721029
}

uapi/components/bitcode/layout/BitcodePublicCopy/bitcode-public-copy.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
export const BITCODE_PUBLIC_COPY = {
2-
eyebrow: 'AssetPacks for measured technical intelligence',
2+
eyebrow: 'Buy and sell measured AssetPacks',
33
headline: 'Bitcode is auditable market infrastructure for technical knowledge.',
44
description:
5-
'Bitcode turns code, docs, diagrams, and technical context into source-safe AssetPack commodities. BTD records scalar knowledge volume and rights, BTC settles value transfer, and proof readback keeps deposit, Reading, delivery, and compensation auditable.',
5+
'Sellers deposit repositories as source-safe AssetPacks with measured quality and fit. Buyers state a Need, review options, and settle in BTC. BTD records knowledge volume and rights; proof readback keeps every handoff auditable.',
66
capabilityChips: [
7-
'ASSETPACKS',
8-
'BTD VOLUME',
7+
'SELL ASSETPACKS',
8+
'BUY WITH NEED',
99
'BTC SETTLEMENT',
10-
'DOCS',
10+
'PROOF READBACK',
1111
],
1212
primaryCta: {
1313
href: '/reads',
14-
label: 'Request Read',
14+
label: 'Buy AssetPacks',
1515
},
1616
secondaryCta: {
17-
href: '/docs',
18-
label: 'Read docs',
17+
href: '/deposits',
18+
label: 'Sell AssetPacks',
1919
},
2020
guide: {
2121
posts: [
@@ -25,7 +25,7 @@ export const BITCODE_PUBLIC_COPY = {
2525
title: '$BTD: Scalar Volume And Rights For Technical Knowledge',
2626
meta: 'April 2026 * Garrett Maring',
2727
body:
28-
"April launched the Bitcode Protocol. It is available at our open-source repository with auditable, reproducible specification. The website now centers Packs, Deposit, Read, and proof-backed docs for AssetPack commerce.",
28+
"April launched the Bitcode Protocol. Open-source, auditable, and reproducible — with Packs, Deposit, and Read as the live surfaces for AssetPack commerce.",
2929
highlights: ['$BTD', 'Bitcode Protocol', 'AssetPacks'],
3030
},
3131
{
@@ -34,61 +34,61 @@ export const BITCODE_PUBLIC_COPY = {
3434
title: "Bitcode's source-to-AssetPack protocol, now",
3535
meta: 'March 2026 * Garrett Maring',
3636
body:
37-
"$BTD's purpose is to measure technical knowledge volume and rights while BTC settlement compensates contributors fairly. Provable knowledge measuring algorithms build the foundation for source-safe AssetPack deposit, Reading, settlement, and delivery.",
37+
"$BTD measures technical knowledge volume and rights while BTC settlement compensates contributors. Measured deposit and Reading form the market path for source-safe AssetPack trade.",
3838
highlights: ['$BTD', 'BTC settlement'],
3939
},
4040
],
4141
},
4242
terminalPreview: {
43-
pill: 'Packs',
44-
kicker: 'Activity preview',
45-
rail: ['deposit', 'read', 'settle'],
43+
pill: 'Market',
44+
kicker: 'AssetPack commerce',
45+
rail: ['sell', 'buy', 'settle'],
4646
},
4747
testnetLaunch: {
4848
badge: 'Commercial testnet',
49-
title: 'Sell and buy IP the Bitcode way, live on BTC testnet.',
49+
title: 'Sell and buy AssetPacks on BTC testnet.',
5050
meaning:
51-
'Testnet means BTC amounts are testnet and free while everything else stays production-intended: source-safe measurements, deterministic quotes, settlement ordering, BTD rights, and repository delivery are real protocol state.',
51+
'Testnet BTC is free; measurements, quotes, settlement order, BTD rights, and delivery remain production-shaped protocol state.',
5252
flow: [
5353
{
5454
step: '01',
55-
label: 'Deposit IP',
55+
label: 'Sell (Deposit)',
5656
href: '/deposits',
5757
detail:
58-
'Connect a repository, review source-safe AssetPack measurements, and approve Depository admission.',
58+
'Connect a repository, synthesize measured AssetPack options, and admit supply to the Depository.',
5959
},
6060
{
6161
step: '02',
62-
label: 'Read and buy',
62+
label: 'Buy (Read)',
6363
href: '/reads',
6464
detail:
65-
'Accept a synthesized Need, review fit measurements and the BTC-testnet quote basis, then settle.',
65+
'Write a Need, review fit measurements and the quote, then SettleAssetPack in BTC-testnet.',
6666
},
6767
{
6868
step: '03',
69-
label: 'Audit on Packs',
69+
label: 'Audit (Packs)',
7070
href: '/packs',
7171
detail:
72-
'Follow settlement, BTD rights, delivery, and compensation through expandable proof readback.',
72+
'Inspect settlement, rights, delivery, and compensation with expandable proof roots.',
7373
},
7474
],
7575
trust:
76-
'Proof-backed trust: protocol law and proof readback decide state; the website explains it.',
76+
'Trust the proof: protocol law and proof readback decide state; the product surfaces explain it.',
7777
sourceSafety:
78-
'Source-safe IP exchange: measurements stay visible while source-bearing AssetPack contents stay withheld until BTC finality and BTD rights transfer.',
78+
'Source-safe trade: buyers see measurements before pay; protected source stays withheld until BTC finality and BTD rights transfer.',
7979
},
8080
operatorFrame: {
81-
title: 'Bitcode Reading',
82-
subtitle: 'deposit, read, proof, settlement, and delivery around one flow',
83-
badge: 'full detail',
81+
title: 'AssetPack market',
82+
subtitle: 'sell supply · buy against Need · settle with proof',
83+
badge: 'live paths',
8484
modes: ['Packs', 'Deposit', 'Read', 'Proofs'],
8585
},
8686
giveContribution: {
87-
title: 'Pack supply',
87+
title: 'What you sell',
8888
},
8989
sourceToSettlement: {
90-
title: 'Source to settlement',
91-
subtitle: 'auditable market path',
90+
title: 'From repo to paid delivery',
91+
subtitle: 'seller → buyer market path',
9292
badge: '6 stages',
9393
stages: [
9494
{ number: '01', stage: 'deposit' },

uapi/components/bitcode/routes/ProductRouteShell/ProductRouteShell.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,11 @@ export function ProductRouteShell({
163163
className={`min-h-screen ${toneClasses.page} px-4 pb-24 pt-32 text-neutral-100 tablet:px-6 desktop:px-8`}
164164
>
165165
<div className="mx-auto grid w-full max-w-[1800px] gap-5">
166-
{/* Compact route header: one wrapping row — title block left, metric
167-
CHIPS (label · value inline) right — instead of a tall stacked
168-
card grid. */}
166+
{/* Compact route header — fixed height band shared by Packs / Reads /
167+
Deposits: title left, metric chips right (never a second full-width
168+
metric row that stretches one route taller than the others). */}
169169
<header
170-
className={`flex flex-wrap items-center gap-x-6 gap-y-3 border ${toneClasses.headerBorder} bg-[linear-gradient(135deg,rgba(7,14,26,0.96),rgba(4,9,18,0.92))] px-5 py-3.5 shadow-[0_30px_100px_rgba(0,0,0,0.34)]`}
170+
className={`grid items-center gap-x-6 gap-y-2 border ${toneClasses.headerBorder} bg-[linear-gradient(135deg,rgba(7,14,26,0.96),rgba(4,9,18,0.92))] px-5 py-3 shadow-[0_30px_100px_rgba(0,0,0,0.34)] tablet:grid-cols-[minmax(0,1fr)_auto] tablet:min-h-[5.75rem]`}
171171
>
172172
<div className="min-w-0">
173173
<p
@@ -179,22 +179,22 @@ export function ProductRouteShell({
179179
<h1 className="mt-1 text-xl font-semibold tracking-tight text-white tablet:text-2xl">
180180
{title}
181181
</h1>
182-
<p className="mt-1 max-w-3xl text-xs leading-5 text-neutral-400 tablet:text-sm">
182+
<p className="mt-1 line-clamp-2 max-w-3xl text-xs leading-5 text-neutral-400 tablet:text-sm">
183183
{summary}
184184
</p>
185185
</div>
186-
<dl className="ml-auto flex flex-wrap items-center gap-2 text-[0.6rem] uppercase tracking-[0.16em] text-neutral-300">
186+
<dl className="flex max-w-full flex-wrap items-center justify-start gap-1.5 text-[0.58rem] uppercase tracking-[0.14em] text-neutral-300 tablet:max-w-[min(42rem,52vw)] tablet:justify-end">
187187
{metrics.map((metric) => {
188188
const chipBody = (
189189
<>
190190
<dt className="text-neutral-500">{metric.label}</dt>
191-
<dd className="text-xs font-semibold text-white">
191+
<dd className="text-[0.7rem] font-semibold text-white">
192192
{metric.value}
193193
</dd>
194194
</>
195195
);
196196
const chipClass =
197-
"flex items-baseline gap-2 border border-white/10 bg-white/[0.045] px-2.5 py-1.5";
197+
"flex shrink-0 items-baseline gap-1.5 border border-white/10 bg-white/[0.045] px-2 py-1";
198198
return metric.description ? (
199199
<TelemetryExplainerTrigger
200200
key={metric.label}

uapi/components/marketing/MarketingLandingPillarCard/MarketingLandingPillarCard.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function MarketingLandingPillarCard({
4444
} ${title.includes('$BTD') ? 'phone:col-span-2 desktop:col-span-1' : ''}`}
4545
style={paintedMotionStyle}
4646
>
47-
{title === 'Deposit' ? (
47+
{title === 'Sell' ? (
4848
<>
4949
<div className="absolute inset-0 bg-[linear-gradient(135deg,rgba(9,6,29,0.98),rgba(40,18,62,0.9))]" />
5050
<div
@@ -76,7 +76,7 @@ export function MarketingLandingPillarCard({
7676
{title}
7777
</p>
7878
<p className="mt-1 max-w-[14ch] text-[9px] uppercase tracking-[0.16em] text-violet-100/52 phone:max-w-[16ch] phone:text-[10px]">
79-
deposit-side intake
79+
supply intake
8080
</p>
8181
</div>
8282
</div>
@@ -87,24 +87,24 @@ export function MarketingLandingPillarCard({
8787
<div className="mt-4 space-y-3 border-t border-white/12 pt-4">
8888
<div className="border-l-4 border-purple-400 pl-3">
8989
<p className="text-[11px] font-semibold uppercase tracking-[0.18em] text-white">
90-
Technical assets
90+
What you package
9191
</p>
9292
<p className="mt-1 text-[11px] leading-4 text-violet-100/72">
9393
code, docs, diagrams, PDFs, and notes
9494
</p>
9595
</div>
9696
<div className="border-l-4 border-pink-400 pl-3">
9797
<p className="text-[11px] font-semibold uppercase tracking-[0.18em] text-white">
98-
Context at deposit
98+
Proven on deposit
9999
</p>
100100
<p className="mt-1 text-[11px] leading-4 text-violet-100/72">
101-
commits, citations, authorship, and metadata
101+
commits, authorship, paths, and SHA
102102
</p>
103103
</div>
104104
</div>
105105
</div>
106106
</>
107-
) : title === 'Measure' ? (
107+
) : title === 'Buy' ? (
108108
<>
109109
<div className="absolute inset-0 bg-gradient-to-br from-[#021511]/95 via-[#06231f]/84 to-[#02060d]" />
110110
<div
@@ -153,7 +153,7 @@ export function MarketingLandingPillarCard({
153153
<div className="relative">
154154
<div className="relative min-h-[58px] pr-16 text-emerald-100 phone:min-h-[68px] phone:pr-20">
155155
<span className="absolute right-0 top-0 inline-flex min-w-[64px] items-center justify-center rounded-none border border-emerald-200/12 bg-emerald-400/8 px-2.5 py-1 text-center text-[8px] uppercase tracking-[0.16em] text-emerald-50/72 phone:min-w-[72px]">
156-
weighted
156+
read
157157
</span>
158158
<div className="flex min-w-0 items-start gap-2">
159159
<Icon className="h-4 w-4 text-emerald-300" />
@@ -162,7 +162,7 @@ export function MarketingLandingPillarCard({
162162
{title}
163163
</p>
164164
<p className="mt-1 max-w-[16ch] text-[9px] uppercase tracking-[0.16em] text-emerald-100/52 phone:max-w-[18ch] phone:text-[10px]">
165-
read fit + quality + valence
165+
need · fit · options
166166
</p>
167167
</div>
168168
</div>
@@ -187,7 +187,7 @@ export function MarketingLandingPillarCard({
187187
</div>
188188
<div className="mt-4 rounded-none border border-emerald-200/12 bg-black/25 px-3 py-2.5 shadow-[inset_0_1px_0_rgba(255,255,255,0.05)]">
189189
<p className="text-[8px] font-semibold uppercase tracking-[0.2em] text-emerald-200/62">
190-
active read
190+
example need
191191
</p>
192192
<p className="mt-1 font-mono text-[10px] leading-4 text-emerald-50/84 phone:text-[11px]">
193193
{measureCardReadNeed}
@@ -208,7 +208,7 @@ export function MarketingLandingPillarCard({
208208
className="absolute inset-0"
209209
style={{
210210
backgroundImage:
211-
'repeating-linear-gradient(0deg, transparent 0 20px, rgba(255,255,255,0.08) 21px), repeating-linear-gradient(90deg, transparent 0 20px, rgba(255,255,255,0.08) 21px)',
211+
'repeating-linear-gradient(0deg, transparent 0 20px,rgba(255,255,255,0.08) 21px), repeating-linear-gradient(90deg, transparent 0 20px,rgba(255,255,255,0.08) 21px)',
212212
maskImage: 'radial-gradient(circle 220px at center, white 72%, transparent 100%)',
213213
WebkitMaskImage: 'radial-gradient(circle 220px at center, white 72%, transparent 100%)',
214214
}}
@@ -226,7 +226,7 @@ export function MarketingLandingPillarCard({
226226
{title}
227227
</p>
228228
<p className="mt-1 max-w-[14ch] text-[9px] uppercase tracking-[0.16em] text-orange-100/52 phone:max-w-[16ch] phone:text-[10px]">
229-
settlement + issuance
229+
btc · btd · delivery
230230
</p>
231231
</div>
232232
</div>
@@ -247,12 +247,12 @@ export function MarketingLandingPillarCard({
247247
</p>
248248
<div className="mt-4 rounded-none border border-orange-200/12 bg-black/25 px-3 py-2">
249249
<p className="font-mono text-[10px] uppercase tracking-[0.18em] text-orange-50/76">
250-
{'live supply · licensed reads · usage metering'}
250+
{'buyer pays BTC · seller earns · rights transfer'}
251251
</p>
252252
</div>
253253
<div className="mt-4 rounded-none border border-orange-200/12 bg-black/25 px-3 py-2">
254254
<p className="font-mono text-[10px] uppercase tracking-[0.18em] text-orange-50/76">
255-
{'supply the depot -> consumption is metered -> value-based issuance'}
255+
{'source unlocks only after finality + BTD rights'}
256256
</p>
257257
</div>
258258
</div>

0 commit comments

Comments
 (0)