Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/website/src/components/landing/FairComparisonSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export function FairComparisonSection() {
fontStyle: 'italic', fontSize: '1.05rem', color: tokens.colors.textSecondary,
maxWidth: 560, margin: '0 auto',
}}>
LangChain and LangGraph are excellent. This is what the Angular production layer provides on top.
LangGraph and @langchain/langgraph-sdk are excellent. This is what the Angular production layer provides on top.
</p>
</motion.div>

Expand All @@ -101,7 +101,7 @@ export function FairComparisonSection() {
borderBottom: `1px solid ${tokens.glass.border}`,
padding: '14px 24px',
}}>
{['Capability', 'LangChain + Angular alone', 'With Angular Stream Resource'].map((h, i) => (
{['Capability', '@langchain/langgraph-sdk', 'With Angular Stream Resource'].map((h, i) => (
<div key={h} style={{
fontFamily: 'var(--font-mono,"JetBrains Mono",monospace)',
fontSize: '0.62rem', fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.08em',
Expand Down
12 changes: 6 additions & 6 deletions apps/website/src/components/landing/HomePilotCTA.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import { tokens } from '../../../lib/design-tokens';
import { CitationBadge } from './CitationBadge';

const citation77 = {
source: 'McKinseyState of AI 2024',
url: 'https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai',
stat: 'Most companies remain in experimentation or pilot phases',
note: 'Workflow redesign and human validation are what drive real production value.',
const gartnerCitation = {
source: 'GartnerGenAI Project Failure (2026)',
url: 'https://www.gartner.com/en/articles/genai-project-failure',
stat: '50% of GenAI projects abandoned after proof of concept by end of 2025',
note: 'Poor data quality, inadequate risk controls, escalating costs, and unclear business value are the primary causes.',
};

export function HomePilotCTA() {
Expand All @@ -27,7 +27,7 @@ export function HomePilotCTA() {
Ready to ship your agent?
</h2>
<p style={{ fontFamily: 'Inter, sans-serif', fontSize: 16, lineHeight: 1.7, color: tokens.colors.textSecondary, marginBottom: 32 }}>
Most Angular teams are 77%<CitationBadge citation={citation77} /> of the way there. Our structured 3-month co-pilot engagement closes the gap.
Half of GenAI projects die after proof of concept.<CitationBadge citation={gartnerCitation} /> Yours doesn&apos;t have to. Our structured 3-month co-pilot engagement closes the gap.
</p>
<a
href="/pilot-to-prod"
Expand Down
12 changes: 6 additions & 6 deletions apps/website/src/components/landing/PilotFooterCTA.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import { motion } from 'framer-motion';
import { tokens } from '../../../lib/design-tokens';
import { CitationBadge } from './CitationBadge';

const citation77 = {
source: 'McKinseyState of AI 2024',
url: 'https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai',
stat: 'Most companies remain in experimentation or pilot phases',
note: 'Workflow redesign and human validation are what drive real production value.',
const gartnerCitation = {
source: 'GartnerGenAI Project Failure (2026)',
url: 'https://www.gartner.com/en/articles/genai-project-failure',
stat: '50% of GenAI projects abandoned after proof of concept by end of 2025',
note: 'Poor data quality, inadequate risk controls, escalating costs, and unclear business value are the primary causes.',
};

export function PilotFooterCTA() {
Expand Down Expand Up @@ -74,7 +74,7 @@ export function PilotFooterCTA() {
marginBottom: '2.5rem',
}}
>
Most teams are 77%<CitationBadge citation={citation77} /> of the way there. Angular Stream Resource closes the gap. Start with a conversation.
Half of GenAI projects die after proof of concept.<CitationBadge citation={gartnerCitation} /> Angular Stream Resource closes the gap. Start with a conversation.
</p>

{/* CTA buttons */}
Expand Down
12 changes: 6 additions & 6 deletions apps/website/src/components/landing/PilotHero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import { motion } from 'framer-motion';
import { tokens } from '../../../lib/design-tokens';
import { CitationBadge } from './CitationBadge';

const citation77 = {
source: 'McKinseyState of AI 2024',
url: 'https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai',
stat: 'Most companies remain in experimentation or pilot phases',
note: 'Workflow redesign and human validation are what drive real production value.',
const gartnerCitation = {
source: 'GartnerGenAI Project Failure (2026)',
url: 'https://www.gartner.com/en/articles/genai-project-failure',
stat: '50% of GenAI projects abandoned after proof of concept by end of 2025',
note: 'Poor data quality, inadequate risk controls, escalating costs, and unclear business value are the primary causes.',
};

export function PilotHero() {
Expand Down Expand Up @@ -114,7 +114,7 @@ export function PilotHero() {
marginBottom: '2.5rem',
}}
>
Most Angular teams are 77%<CitationBadge citation={citation77} /> of the way there. Angular Stream Resource closes the
Half of GenAI projects die after proof of concept.<CitationBadge citation={gartnerCitation} /> Yours doesn&apos;t have to. Angular Stream Resource closes the
gap — app deployment license, fixed price, your team owns the result.
</motion.p>

Expand Down
36 changes: 18 additions & 18 deletions apps/website/src/components/landing/ProblemSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ const STATS: Array<{ num: string; label: string; citation: Citation }> = [
},
},
{
num: '31%',
label: 'of prioritized AI use cases actually reach production',
num: '50%',
label: 'of GenAI projects abandoned after proof of concept',
citation: {
source: 'ISGAI Adoption Reports',
url: 'https://isg-one.com',
stat: '~31% of prioritized AI use cases reach production',
note: 'Enterprise AI initiatives consistently stall between pilot and production.',
source: 'GartnerGenAI Project Failure (2026)',
url: 'https://www.gartner.com/en/articles/genai-project-failure',
stat: '50% of GenAI projects abandoned after proof of concept by end of 2025',
note: 'Poor data quality, inadequate risk controls, escalating costs, and unclear business value are the primary causes.',
},
},
{
Expand Down Expand Up @@ -69,21 +69,21 @@ export function ProblemSection() {
`linear-gradient(90deg, rgba(221,0,49,.6), rgba(221,0,49,.4))`
);
const [fillTransition, setFillTransition] = useState('none');
const counterRunning77 = phase === 'filling';
const counterRunning50 = phase === 'filling';
const counterRunning100 = phase === 'closing' || phase === 'done';
const count77 = useCounter(77, 1700, counterRunning77);
const count100 = useCounter(23, 1000, counterRunning100);
const count50 = useCounter(50, 1700, counterRunning50);
const count100 = useCounter(50, 1000, counterRunning100);
// 'done' timeout (4400ms) fires after closing counter finishes (3200 + 1000 = 4200ms)
// so 77 + count100 always reaches 100 before the phase snaps to literal 100
const displayCount = phase === 'done' ? 100 : phase === 'closing' ? 77 + count100 : count77;
// so 50 + count100 always reaches 100 before the phase snaps to literal 100
const displayCount = phase === 'done' ? 100 : phase === 'closing' ? 50 + count100 : count50;

const runAnimation = useCallback(() => {
if (phase !== 'idle') return;
const timers: ReturnType<typeof setTimeout>[] = [];
// Phase 1 (150ms): fill to 77%
// Phase 1 (150ms): fill to 50% — half of projects reach POC
timers.push(setTimeout(() => {
setFillTransition('width 1.7s cubic-bezier(.4,0,.2,1)');
setFillWidth('77%');
setFillWidth('50%');
setPhase('filling');
}, 150));
// Phase 2 (2100ms): stall — marker + hatch + shake
Expand All @@ -92,7 +92,7 @@ export function ProblemSection() {
timers.push(setTimeout(() => {
setFillTransition('width 1s cubic-bezier(.4,0,.2,1)');
setFillGradient(
'linear-gradient(90deg, rgba(221,0,49,.5) 0%, rgba(221,0,49,.38) 70%, rgba(0,64,144,.8) 82%, #004090 100%)'
'linear-gradient(90deg, rgba(221,0,49,.5) 0%, rgba(221,0,49,.38) 40%, rgba(0,64,144,.8) 60%, #004090 100%)'
);
setFillWidth('100%');
setPhase('closing');
Expand Down Expand Up @@ -266,8 +266,8 @@ export function ProblemSection() {
{/* Hatch overlay (gap zone) — decorative */}
<div aria-hidden="true" style={{
position: 'absolute',
left: '77%', top: 0,
width: '23%', height: '100%',
left: '50%', top: 0,
width: '50%', height: '100%',
overflow: 'hidden',
opacity: showStall ? 1 : 0,
transition: 'opacity 0.4s',
Expand All @@ -286,7 +286,7 @@ export function ProblemSection() {
{/* Stall pin — outside the overflow:hidden track, decorative */}
<div aria-hidden="true" style={{
position: 'absolute',
left: '77%',
left: '50%',
top: -8,
transform: 'translateX(-50%)',
opacity: showStall ? 1 : 0,
Expand All @@ -296,7 +296,7 @@ export function ProblemSection() {
}}>
<div style={{ width: 2, height: 34, background: tokens.colors.angularRed, margin: '0 auto', borderRadius: 1 }} />
<div style={{ fontFamily: 'var(--font-mono,"JetBrains Mono",monospace)', fontSize: '0.6rem', color: tokens.colors.angularRed, whiteSpace: 'nowrap', marginTop: 3, fontWeight: 700 }}>
77%
50% abandon here
</div>
</div>
</div>
Expand Down