Skip to content

Commit e325bde

Browse files
V48 (impl-only): Polish marketing landing measurements, pillars, and micro-blog
Replace Measurement Vector with per-metric Absolutes/Needinesses and standout Final Fit (BTD volume); fix authorship overflow and subtitle whitespace; balance Sell/Buy/Settle copy; add May–July Commercial MVP micro-blog.
1 parent e623d05 commit e325bde

5 files changed

Lines changed: 182 additions & 77 deletions

File tree

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@ export const BITCODE_PUBLIC_COPY = {
1919
},
2020
guide: {
2121
posts: [
22+
{
23+
id: 'may-july-2026',
24+
tab: 'May–July',
25+
title: 'Commercial MVP Development, Protocol Precision',
26+
meta: 'May–July 2026 * Garrett Maring',
27+
body:
28+
'Early summer developed the Commercial MVP—most notably, AssetPack Measurements. Key user-flows are materializing from account creation to Bitcode Settlements. Late summer will launch Bitcode V1.',
29+
highlights: [
30+
'Commercial MVP',
31+
'AssetPack Measurements',
32+
'Bitcode Settlements',
33+
'Bitcode V1',
34+
],
35+
},
2236
{
2337
id: 'april-2026',
2438
tab: 'April',

uapi/components/marketing/MarketingLandingPillarCard/MarketingLandingPillarCard.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export function MarketingLandingPillarCard({
8181
</div>
8282
</div>
8383
</div>
84-
<p className="mt-3 text-[11px] leading-4 text-violet-50/88 phone:text-[13px] phone:leading-5">
84+
<p className="mt-3 min-h-[4.5rem] text-[11px] leading-4 text-violet-50/88 phone:min-h-[5rem] phone:text-[13px] phone:leading-5">
8585
{description}
8686
</p>
8787
<div className="mt-4 space-y-3 border-t border-white/12 pt-4">
@@ -167,7 +167,7 @@ export function MarketingLandingPillarCard({
167167
</div>
168168
</div>
169169
</div>
170-
<p className="mt-3 text-[11px] leading-4 text-emerald-50/88 phone:text-[13px] phone:leading-5">
170+
<p className="mt-3 min-h-[4.5rem] text-[11px] leading-4 text-emerald-50/88 phone:min-h-[5rem] phone:text-[13px] phone:leading-5">
171171
{description}
172172
</p>
173173
<div className="relative mt-4">
@@ -234,7 +234,7 @@ export function MarketingLandingPillarCard({
234234
<BitcodeSoftwareSvgLogo width="44px" softwareClassName="hidden" className="opacity-90" />
235235
</div>
236236
</div>
237-
<p className="mt-3 text-[11px] leading-4 text-orange-50/88 phone:text-[13px] phone:leading-5">
237+
<p className="mt-3 min-h-[4.5rem] text-[11px] leading-4 text-orange-50/88 phone:min-h-[5rem] phone:text-[13px] phone:leading-5">
238238
{hasBtdInDescription ? (
239239
<>
240240
{beforeBtd}

uapi/components/marketing/MarketingLandingShared/MarketingLandingShared.tsx

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const paintedMotionStyle: React.CSSProperties = {
2929
contain: 'paint',
3030
};
3131

32+
// Keep descriptions near-identical length (~79–80 chars) so all three wrap to four lines.
3233
export const productPillars = [
3334
{
3435
title: 'Sell',
@@ -42,29 +43,39 @@ export const productPillars = [
4243
},
4344
{
4445
title: 'Settle',
45-
description: 'Pay in BTC; BTD rights and delivery unlock with proof-backed finality.',
46+
description: 'Pay in BTC; BTD rights and delivery unlock with proof-backed finality after pay.',
4647
Icon: CurrencyDollarIcon,
4748
},
4849
] as const;
4950

50-
export const measurementAxes = [
51-
{
52-
label: 'Quantity',
53-
value: 92,
54-
detail: 'source volume buyers can price against',
55-
},
56-
{
57-
label: 'Quality',
58-
value: 96,
59-
detail: 'structure, correctness, and reproducibility',
60-
},
61-
{
62-
label: 'Fit',
63-
value: 73,
64-
detail: 'how tightly the pack matches a buyer Need',
65-
},
51+
/**
52+
* Marketing depot measurements: per-metric Absolutes + Needinesses (small bars),
53+
* then Final Fit (BTD volume) as the standout summary axis.
54+
*/
55+
export const measurementAbsoluteItems = [
56+
{ label: 'functions', value: 92 },
57+
{ label: 'types', value: 88 },
58+
{ label: 'file span', value: 76 },
59+
{ label: 'symbolic richness', value: 90 },
60+
{ label: 'modularity', value: 84 },
61+
{ label: 'correctness', value: 96 },
62+
{ label: 'objectives fidelity', value: 91 },
63+
{ label: 'computational usage', value: 78 },
6664
] as const;
6765

66+
export const measurementNeedinessItems = [
67+
{ label: 'language fit', value: 94, detail: 'static' },
68+
{ label: 'domain fit', value: 88, detail: 'static' },
69+
{ label: 'interface fit', value: 82, detail: 'static' },
70+
{ label: 'Need-inferred *-fit', value: 79, detail: 'dynamic' },
71+
] as const;
72+
73+
export const measurementFinalFit = {
74+
label: 'Final Fit',
75+
value: 73,
76+
detail: 'BTD volume — weighted scalar over needinesses-fits for the settled AssetPack',
77+
} as const;
78+
6879
export const measureCardReadNeed = 'Need: auth migration rollback for monorepo services';
6980

7081
export const measureCardAxes = [
@@ -87,7 +98,8 @@ export const previewRows = [
8798
valueParts: ['commits', 'authorship', 'paths', 'SHA'],
8899
accentClassName: 'from-fuchsia-400/18 via-purple-400/8 to-transparent',
89100
Icon: LinkIcon,
90-
valuesGridClassName: 'grid-cols-2 laptop:grid-cols-4 desktop:grid-cols-2',
101+
// "authorship" overflows a tight 2-col desktop cell; keep 2-col from phone up with wrap room.
102+
valuesGridClassName: 'grid-cols-1 phone:grid-cols-2',
91103
iconClassName: 'text-white/58',
92104
},
93105
{

uapi/components/marketing/MarketingLandingTerminalPreview/MarketingLandingTerminalPreview.tsx

Lines changed: 124 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import {
1212
animatedMotionStyle,
1313
compactPreviewCards,
1414
entranceEase,
15-
measurementAxes,
15+
measurementAbsoluteItems,
16+
measurementFinalFit,
17+
measurementNeedinessItems,
1618
paintedMotionStyle,
1719
previewRows,
1820
renderOrbitalBullet,
@@ -92,18 +94,16 @@ export const MarketingLandingTerminalPreview = memo(function MarketingLandingTer
9294

9395
<div className="rounded-none border border-white/8 bg-white/5 p-4">
9496
<div className="flex items-start justify-between gap-3">
95-
<div className="min-w-0 flex-1">
96-
<p className="bg-gradient-to-r from-purple-400 via-pink-500 to-red-400 bg-clip-text text-sm font-semibold text-transparent">
97-
{BITCODE_PUBLIC_COPY.operatorFrame.title}
98-
</p>
99-
<p className="mt-1 text-[10px] uppercase tracking-[0.16em] text-emerald-100/52">
100-
{BITCODE_PUBLIC_COPY.operatorFrame.subtitle}
101-
</p>
102-
</div>
103-
<span className="inline-flex min-w-[104px] shrink-0 items-center justify-center rounded-none border border-white/10 bg-white/5 px-2.5 py-1.5 text-center text-[10px] uppercase leading-4 tracking-[0.18em] text-white/60">
97+
<p className="min-w-0 bg-gradient-to-r from-purple-400 via-pink-500 to-red-400 bg-clip-text text-sm font-semibold text-transparent">
98+
{BITCODE_PUBLIC_COPY.operatorFrame.title}
99+
</p>
100+
<span className="inline-flex min-w-[92px] shrink-0 items-center justify-center rounded-none border border-white/10 bg-white/5 px-2.5 py-1.5 text-center text-[10px] uppercase leading-4 tracking-[0.16em] text-white/60">
104101
{BITCODE_PUBLIC_COPY.operatorFrame.badge}
105102
</span>
106103
</div>
104+
<p className="mt-1 text-[10px] uppercase leading-4 tracking-[0.12em] text-emerald-100/52">
105+
{BITCODE_PUBLIC_COPY.operatorFrame.subtitle}
106+
</p>
107107
<div className="mt-4 flex flex-wrap gap-2">
108108
{BITCODE_PUBLIC_COPY.operatorFrame.modes.map((surface) => (
109109
<span
@@ -121,51 +121,124 @@ export const MarketingLandingTerminalPreview = memo(function MarketingLandingTer
121121
<div className="hidden gap-4 p-4 laptop:grid desktop:grid-cols-[0.9fr_1.1fr]">
122122
<div className="space-y-3">
123123
<div className="rounded-none border border-white/8 bg-white/5 p-4">
124-
<p className="text-[12px] font-semibold uppercase tracking-[0.22em] text-emerald-200/74">
125-
Measurement vector
124+
<p className="whitespace-nowrap text-[10px] font-semibold uppercase tracking-[0.14em] text-emerald-200/74">
125+
AssetPacks Measurements
126126
</p>
127+
127128
<div className="mt-4 space-y-4">
128-
{measurementAxes.map((axis) => (
129-
<div key={axis.label}>
130-
<div className="flex items-end justify-between gap-3">
131-
<div>
132-
<p className="text-[15px] font-medium text-white">{axis.label}</p>
133-
<p className="text-[12px] leading-5 text-emerald-100/62">{axis.detail}</p>
134-
</div>
135-
<span className="text-[12px] font-semibold uppercase tracking-[0.24em] text-emerald-200/78">
136-
{axis.value}
137-
</span>
129+
<div>
130+
<p className="text-[13px] font-medium text-white">Absolutes</p>
131+
<ul className="mt-2 space-y-1.5">
132+
{measurementAbsoluteItems.map((item, index) => (
133+
<li key={item.label}>
134+
<div className="flex items-center justify-between gap-2">
135+
<p className="min-w-0 truncate text-[11px] leading-4 text-emerald-100/70">
136+
{item.label}
137+
</p>
138+
<span className="shrink-0 font-mono text-[10px] tabular-nums text-emerald-200/68">
139+
{item.value}
140+
</span>
141+
</div>
142+
<div className="mt-1 h-1 overflow-hidden rounded-none bg-white/6">
143+
<div className="h-full origin-left" style={{ width: `${item.value}%` }}>
144+
<motion.div
145+
initial={{ scaleX: 0 }}
146+
animate={{ scaleX: 1 }}
147+
transition={{
148+
duration: 0.7,
149+
delay: 0.28 + index * 0.03,
150+
ease: entranceEase,
151+
}}
152+
className="h-full rounded-none bg-gradient-to-r from-emerald-500/55 via-emerald-300/70 to-emerald-100/80"
153+
style={{ ...animatedMotionStyle, transformOrigin: 'left center' }}
154+
/>
155+
</div>
156+
</div>
157+
</li>
158+
))}
159+
</ul>
160+
</div>
161+
162+
<div>
163+
<p className="text-[13px] font-medium text-white">Needinesses</p>
164+
<ul className="mt-2 space-y-1.5">
165+
{measurementNeedinessItems.map((item, index) => (
166+
<li key={item.label}>
167+
<div className="flex items-center justify-between gap-2">
168+
<p className="min-w-0 truncate text-[11px] leading-4 text-emerald-100/70">
169+
<span className="text-emerald-100/48">{item.detail}</span>
170+
<span className="mx-1 text-emerald-100/28">·</span>
171+
{item.label}
172+
</p>
173+
<span className="shrink-0 font-mono text-[10px] tabular-nums text-emerald-200/68">
174+
{item.value}
175+
</span>
176+
</div>
177+
<div className="mt-1 h-1 overflow-hidden rounded-none bg-white/6">
178+
<div className="h-full origin-left" style={{ width: `${item.value}%` }}>
179+
<motion.div
180+
initial={{ scaleX: 0 }}
181+
animate={{ scaleX: 1 }}
182+
transition={{
183+
duration: 0.7,
184+
delay: 0.48 + index * 0.04,
185+
ease: entranceEase,
186+
}}
187+
className="h-full rounded-none bg-gradient-to-r from-emerald-500/55 via-emerald-300/70 to-emerald-100/80"
188+
style={{ ...animatedMotionStyle, transformOrigin: 'left center' }}
189+
/>
190+
</div>
191+
</div>
192+
</li>
193+
))}
194+
</ul>
195+
</div>
196+
197+
<div className="rounded-none border border-emerald-300/18 bg-emerald-400/[0.07] p-3 shadow-[inset_0_1px_0_rgba(103,254,183,0.08)]">
198+
<div className="flex items-end justify-between gap-3">
199+
<div className="min-w-0 flex-1">
200+
<p className="bg-gradient-to-r from-emerald-200 via-white to-emerald-100 bg-clip-text text-[15px] font-semibold text-transparent">
201+
{measurementFinalFit.label}
202+
</p>
203+
<p className="mt-1 text-[11px] leading-4 text-emerald-100/72">
204+
{measurementFinalFit.detail}
205+
</p>
138206
</div>
139-
<div className="mt-2 h-2 overflow-hidden rounded-none bg-white/6">
140-
<div className="h-full origin-left" style={{ width: `${axis.value}%` }}>
141-
<motion.div
142-
initial={{ scaleX: 0 }}
143-
animate={{ scaleX: 1 }}
144-
transition={{ duration: 0.9, delay: 0.35, ease: entranceEase }}
145-
className="h-full rounded-none bg-gradient-to-r from-emerald-500/70 via-emerald-300/90 to-emerald-100"
146-
style={{ ...animatedMotionStyle, transformOrigin: 'left center' }}
147-
/>
148-
</div>
207+
<span className="shrink-0 text-[14px] font-semibold uppercase tracking-[0.2em] text-emerald-100">
208+
{measurementFinalFit.value}
209+
</span>
210+
</div>
211+
<div className="mt-2.5 h-2.5 overflow-hidden rounded-none bg-black/30">
212+
<div
213+
className="h-full origin-left"
214+
style={{ width: `${measurementFinalFit.value}%` }}
215+
>
216+
<motion.div
217+
initial={{ scaleX: 0 }}
218+
animate={{ scaleX: 1 }}
219+
transition={{ duration: 1, delay: 0.55, ease: entranceEase }}
220+
className="h-full rounded-none bg-gradient-to-r from-emerald-500/80 via-emerald-300 to-white shadow-[0_0_14px_rgba(103,254,183,0.35)]"
221+
style={{ ...animatedMotionStyle, transformOrigin: 'left center' }}
222+
/>
149223
</div>
150224
</div>
151-
))}
225+
</div>
152226
</div>
153227
</div>
154228

155229
<div className="rounded-none border border-white/8 bg-white/5 p-4">
156230
<div className="flex items-start justify-between gap-3">
157-
<div className="min-w-0 flex-1">
158-
<p className="bg-gradient-to-r from-purple-400 via-pink-500 to-red-400 bg-clip-text text-sm font-semibold text-transparent">
159-
{BITCODE_PUBLIC_COPY.operatorFrame.title}
160-
</p>
161-
<p className="mt-1 text-[10px] uppercase tracking-[0.14em] text-emerald-100/58">
162-
{BITCODE_PUBLIC_COPY.operatorFrame.subtitle}
163-
</p>
164-
</div>
165-
<span className="inline-flex min-w-[128px] shrink-0 items-center justify-center rounded-none border border-white/10 bg-white/5 px-2.5 py-2 text-center text-[10px] uppercase leading-4 tracking-[0.18em] text-white/60">
231+
<p className="min-w-0 bg-gradient-to-r from-purple-400 via-pink-500 to-red-400 bg-clip-text text-sm font-semibold text-transparent">
232+
{BITCODE_PUBLIC_COPY.operatorFrame.title}
233+
</p>
234+
<span className="inline-flex min-w-[92px] shrink-0 items-center justify-center rounded-none border border-white/10 bg-white/5 px-2.5 py-1.5 text-center text-[10px] uppercase leading-4 tracking-[0.16em] text-white/60">
166235
{BITCODE_PUBLIC_COPY.operatorFrame.badge}
167236
</span>
168237
</div>
238+
{/* Full-width subtitle — avoids one-word-per-line squeeze beside the badge. */}
239+
<p className="mt-1 text-[10px] uppercase leading-4 tracking-[0.12em] text-emerald-100/58">
240+
{BITCODE_PUBLIC_COPY.operatorFrame.subtitle}
241+
</p>
169242
<ul className="mt-4 grid grid-cols-2 gap-x-6 gap-y-4 laptop:gap-x-4 laptop:gap-y-3">
170243
{BITCODE_PUBLIC_COPY.operatorFrame.modes.map((surface) => (
171244
<li
@@ -277,7 +350,7 @@ export const MarketingLandingTerminalPreview = memo(function MarketingLandingTer
277350
return (
278351
<span
279352
key={`${key}-${valuePart}`}
280-
className="inline-flex min-w-0 max-w-full items-start gap-2 overflow-hidden tablet:gap-2.5"
353+
className="inline-flex min-w-0 max-w-full items-start gap-2 tablet:gap-2.5"
281354
>
282355
<span className="shrink-0">
283356
{renderOrbitalBullet(
@@ -307,18 +380,17 @@ export const MarketingLandingTerminalPreview = memo(function MarketingLandingTer
307380

308381
<div className="rounded-none border border-white/8 bg-white/5 p-4">
309382
<div className="flex items-start justify-between gap-3">
310-
<div>
311-
<p className="bg-gradient-to-r from-emerald-200 via-white to-orange-200 bg-clip-text text-sm font-semibold text-transparent">
312-
{BITCODE_PUBLIC_COPY.sourceToSettlement.title}
313-
</p>
314-
<p className="mt-1 text-[12px] uppercase tracking-[0.16em] text-emerald-100/58">
315-
{BITCODE_PUBLIC_COPY.sourceToSettlement.subtitle}
316-
</p>
317-
</div>
318-
<span className="inline-flex min-w-[92px] items-center justify-center rounded-none border border-emerald-300/12 bg-emerald-400/6 px-2.5 py-1 font-mono text-center text-[10px] uppercase tracking-[0.18em] text-emerald-50/72">
383+
<p className="min-w-0 bg-gradient-to-r from-emerald-200 via-white to-orange-200 bg-clip-text text-sm font-semibold text-transparent">
384+
{BITCODE_PUBLIC_COPY.sourceToSettlement.title}
385+
</p>
386+
<span className="inline-flex min-w-[92px] shrink-0 items-center justify-center rounded-none border border-emerald-300/12 bg-emerald-400/6 px-2.5 py-1 font-mono text-center text-[10px] uppercase tracking-[0.18em] text-emerald-50/72">
319387
{BITCODE_PUBLIC_COPY.sourceToSettlement.badge}
320388
</span>
321389
</div>
390+
{/* Full-width subtitle — avoids one-word-per-line squeeze beside the badge. */}
391+
<p className="mt-1 text-[12px] uppercase leading-4 tracking-[0.12em] text-emerald-100/58">
392+
{BITCODE_PUBLIC_COPY.sourceToSettlement.subtitle}
393+
</p>
322394
<p className="mt-3 text-[14px] leading-6 text-emerald-100/72">
323395
Commits, citations, authorship, and metadata stay attached as deposit-side context for later proof and settlement.
324396
</p>

0 commit comments

Comments
 (0)