Skip to content

Commit b11025c

Browse files
V48 (impl-only): Neon-highlight AssetPacks and Bitcoin in hero description
Copy uses Buy them with Bitcoin; AssetPacks glow purple and Bitcoin glow orange in the marketing body.
1 parent ac2301a commit b11025c

3 files changed

Lines changed: 51 additions & 5 deletions

File tree

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ export const BITCODE_PUBLIC_COPY = {
22
eyebrow: 'Buy and sell measured AssetPacks',
33
headline: "AIs trade technical knowledge with Bitcode's on-chain marketplace.",
44
description:
5-
'Make AssetPacks from source-code, exposing only IP you confirm, to deposit them for purchase. Buy AssetPacks with Bitcoin to consume the specific knowledge you request. All running on fully open-source, proven, and ledgerized infrastructure.',
5+
'Make AssetPacks from source-code, exposing only IP you confirm, to deposit them for purchase. Buy them with Bitcoin to consume the specific knowledge you request. All running on fully open-source, proven, and ledgerized infrastructure.',
6+
descriptionHighlights: [
7+
{ text: 'AssetPacks', tone: 'purple' },
8+
{ text: 'Bitcoin', tone: 'orange' },
9+
],
610
capabilityChips: [
711
'Synthesize Options',
812
'Deposit AssetPacks',

uapi/components/marketing/MarketingLandingHero/MarketingLandingHero.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,39 @@ import {
1919
productPillars,
2020
} from '@/components/marketing/MarketingLandingShared/MarketingLandingShared';
2121

22+
const DESCRIPTION_HIGHLIGHT_CLASS: Record<'purple' | 'orange', string> = {
23+
purple:
24+
'font-semibold text-fuchsia-200 [text-shadow:0_0_12px_rgba(232,121,249,0.75),0_0_28px_rgba(192,132,252,0.45)]',
25+
orange:
26+
'font-semibold text-orange-200 [text-shadow:0_0_12px_rgba(251,146,60,0.75),0_0_28px_rgba(251,191,36,0.4)]',
27+
};
28+
29+
function renderDescriptionWithHighlights(
30+
body: string,
31+
highlights: ReadonlyArray<{ text: string; tone: 'purple' | 'orange' }>,
32+
) {
33+
if (!highlights.length) return body;
34+
35+
const pattern = new RegExp(
36+
`(${highlights.map((entry) => entry.text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|')})`,
37+
'g',
38+
);
39+
const toneByText = new Map(highlights.map((entry) => [entry.text, entry.tone]));
40+
41+
return body.split(pattern).map((part, index) => {
42+
if (!part) return null;
43+
const tone = toneByText.get(part);
44+
if (!tone) {
45+
return <React.Fragment key={`desc-${index}`}>{part}</React.Fragment>;
46+
}
47+
return (
48+
<span key={`desc-${part}-${index}`} className={DESCRIPTION_HIGHLIGHT_CLASS[tone]}>
49+
{part}
50+
</span>
51+
);
52+
});
53+
}
54+
2255
/** CTA under each pillar — order and colors match Sell · Buy · Settle columns. */
2356
const pillarCtas = [
2457
{
@@ -72,7 +105,10 @@ export const MarketingLandingHero = memo(function MarketingLandingHero() {
72105
</div>
73106
</h1>
74107
<p className="max-w-[42rem] text-[17px] font-medium leading-[1.5] tracking-[-0.015em] text-white/90 [text-shadow:0_0_18px_rgba(103,254,183,0.05)] phone:text-[19px] tablet:text-[21px]">
75-
{BITCODE_PUBLIC_COPY.description}
108+
{renderDescriptionWithHighlights(
109+
BITCODE_PUBLIC_COPY.description,
110+
BITCODE_PUBLIC_COPY.descriptionHighlights,
111+
)}
76112
</p>
77113
</div>
78114

uapi/tests/marketingLandingPage.test.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,15 @@ describe('MarketingLandingPage', () => {
112112
expect(screen.getByText(/Mint volume from Final Fit/i)).toBeInTheDocument();
113113
expect(screen.getByText('On-chain')).toBeInTheDocument();
114114
expect(
115-
screen.getByText(
116-
/Make AssetPacks from source-code, exposing only IP you confirm/i,
117-
),
115+
screen.getByText((_, node) => {
116+
if (node?.tagName !== 'P') return false;
117+
const text = node.textContent ?? '';
118+
return (
119+
text.includes('Make AssetPacks from source-code') &&
120+
text.includes('Buy them with Bitcoin') &&
121+
text.includes('ledgerized infrastructure')
122+
);
123+
}),
118124
).toBeInTheDocument();
119125
expect(screen.getByText('Synthesize Options')).toBeInTheDocument();
120126
expect(screen.getByText('Deposit AssetPacks')).toBeInTheDocument();

0 commit comments

Comments
 (0)