Something went wrong. Please try again or email us directly.
)}
diff --git a/apps/website/src/components/contact/GitHubStarsPill.tsx b/apps/website/src/components/contact/GitHubStarsPill.tsx
index efc0eee8f..5a014c7a3 100644
--- a/apps/website/src/components/contact/GitHubStarsPill.tsx
+++ b/apps/website/src/components/contact/GitHubStarsPill.tsx
@@ -14,7 +14,7 @@ export async function GitHubStarsPill() {
href={REPO_URL}
target="_blank"
rel="noopener noreferrer"
- style={{ textDecoration: 'none' }}
+ className="gh-stars-pill-link"
>
diff --git a/apps/website/src/components/contact/SlaCard.tsx b/apps/website/src/components/contact/SlaCard.tsx
index 303c79e53..c337a7e60 100644
--- a/apps/website/src/components/contact/SlaCard.tsx
+++ b/apps/website/src/components/contact/SlaCard.tsx
@@ -1,20 +1,11 @@
// SPDX-License-Identifier: MIT
import React from 'react';
-import { tokens } from '@threadplane/design-tokens';
import { Card } from '../ui/Card';
export function SlaCard() {
return (
-
-
+
+
Brian or someone on the team replies personally — from a real inbox, not noreply@. We read every message.
diff --git a/apps/website/src/components/pricing/CompareTable.tsx b/apps/website/src/components/pricing/CompareTable.tsx
index 7f3609653..48db280a1 100644
--- a/apps/website/src/components/pricing/CompareTable.tsx
+++ b/apps/website/src/components/pricing/CompareTable.tsx
@@ -1,7 +1,6 @@
'use client';
import { useState } from 'react';
-import { tokens } from '@threadplane/design-tokens';
import { Button } from '../ui/Button';
import { trackCtaClick } from '../../lib/analytics/client';
import type { CtaId } from '../../lib/analytics/events';
@@ -100,16 +99,16 @@ function allInclusive(): Record {
}
const Check = () => (
- ✓
+ ✓
);
const Dash = () => (
- —
+ —
);
function renderCell(value: CellValue): React.ReactNode {
if (typeof value === 'boolean') return value ? : ;
if (value === '—') return ;
- return {value};
+ return {value};
}
function PlanButton({ tier, cycle }: { tier: TierConfig; cycle: BillingCycle }) {
@@ -118,7 +117,7 @@ function PlanButton({ tier, cycle }: { tier: TierConfig; cycle: BillingCycle })
const common = {
variant,
size: 'md' as const,
- style: { width: '100%' },
+ className: 'pricing-plan-btn',
};
if (cta.stripeBuyable) {
return (
@@ -172,42 +171,15 @@ function BillingToggle({
setCycle: (c: BillingCycle) => void;
discountPct: number;
}) {
- const baseBtn = {
- fontFamily: tokens.typography.fontSans,
- fontSize: 13,
- fontWeight: 600,
- padding: '8px 16px',
- border: 'none',
- cursor: 'pointer',
- transition: 'background 150ms ease, color 150ms ease',
- background: 'transparent',
- color: tokens.colors.textSecondary,
- borderRadius: 999,
- } as const;
- const activeBtn = {
- ...baseBtn,
- background: tokens.colors.accent,
- color: '#fff',
- } as const;
return (
-
-
+
+
@@ -215,7 +187,8 @@ function BillingToggle({
role="tab"
aria-selected={cycle === 'annual'}
onClick={() => setCycle('annual')}
- style={cycle === 'annual' ? activeBtn : baseBtn}
+ className="pricing-billing-tab"
+ data-active={cycle === 'annual' || undefined}
>
Annual{discountPct > 0 ? ` — save ${discountPct}%` : ''}
@@ -236,83 +209,28 @@ function SectionTable({
showPrice: boolean;
}) {
return (
-
-
-
+
+
+
- |
+ |
{title}
|
{TIERS.map((tier) => (
{tier.highlight && (
-
+
MOST POPULAR
)}
{tier.name}
@@ -321,19 +239,7 @@ function SectionTable({
|
{showPrice ? (
- |
+ |
Price
|
{TIERS.map((tier) => {
@@ -341,33 +247,15 @@ function SectionTable({
return (
-
-
+
+
{p.display}
{p.period && (
-
+
{p.period}
)}
@@ -378,21 +266,12 @@ function SectionTable({
|
) : (
- |
+ |
{TIERS.map((tier) => (
|
))}
@@ -402,31 +281,17 @@ function SectionTable({
{rows.map((row, i) => (
- |
+ |
{row.feature}
|
{TIERS.map((tier) => (
{renderCell(row.cells[tier.slug])}
|
@@ -454,15 +319,8 @@ function CtaStrip({ cycle }: { cycle: BillingCycle }) {
>
{TIERS.map((tier) => (
-
-
+
@@ -476,25 +334,18 @@ export function CompareTable() {
const discountPct = annualDiscountPercent();
return (
-
+
-
+
-
+
-
+
diff --git a/apps/website/src/components/pricing/CompatibilityMatrix.tsx b/apps/website/src/components/pricing/CompatibilityMatrix.tsx
index 589263c0d..43dd46874 100644
--- a/apps/website/src/components/pricing/CompatibilityMatrix.tsx
+++ b/apps/website/src/components/pricing/CompatibilityMatrix.tsx
@@ -1,6 +1,5 @@
// SPDX-License-Identifier: MIT
import React from 'react';
-import { tokens } from '@threadplane/design-tokens';
interface Row {
label: string;
@@ -15,47 +14,16 @@ const ROWS: ReadonlyArray
= [
{ label: 'Unsupported', versions: 'Angular ≤19', tone: 'muted' },
];
-const TONE_COLORS: Record = {
- success: '#16a34a',
- warn: '#d97706',
- info: tokens.colors.accent,
- muted: tokens.colors.textMuted,
-};
-
export function CompatibilityMatrix() {
return (
-
-
+
+
-
- |
+ |
+ |
Status
|
-
+ |
Angular versions
|
@@ -63,26 +31,10 @@ export function CompatibilityMatrix() {
{ROWS.map((row) => (
- |
+ |
{row.label}
|
-
+ |
{row.versions}
|
diff --git a/apps/website/src/components/pricing/LeadForm.tsx b/apps/website/src/components/pricing/LeadForm.tsx
index c3d816720..287793845 100644
--- a/apps/website/src/components/pricing/LeadForm.tsx
+++ b/apps/website/src/components/pricing/LeadForm.tsx
@@ -1,6 +1,5 @@
'use client';
import { useState } from 'react';
-import { tokens } from '@threadplane/design-tokens';
import { analyticsEvents } from '../../lib/analytics/events';
import { track } from '../../lib/analytics/client';
import { Container } from '../ui/Container';
@@ -73,131 +72,41 @@ export function LeadForm() {
}
};
- const inputStyle: React.CSSProperties = {
- background: tokens.surfaces.surface,
- border: `1px solid ${tokens.surfaces.border}`,
- color: tokens.colors.textPrimary,
- borderRadius: tokens.radius.md,
- padding: '10px 14px',
- width: '100%',
- fontFamily: tokens.typography.body.family,
- fontSize: 14,
- outline: 'none',
- };
-
- const handleFocus = (e: React.FocusEvent) => {
- e.target.style.borderColor = tokens.colors.accent;
- e.target.style.boxShadow = tokens.shadows.focus;
- };
- const handleBlur = (e: React.FocusEvent) => {
- e.target.style.borderColor = tokens.surfaces.border;
- e.target.style.boxShadow = 'none';
- };
-
return (