mirror of
https://github.com/different-ai/openwork
synced 2026-04-25 17:15:34 +02:00
fix(landing,den): clean up pricing copy, remove Windows from grid, add billing pricing to den, darker borders
This commit is contained in:
@@ -60,7 +60,7 @@ export function BillingDashboardScreen() {
|
||||
? formatSubscriptionStatus(subscription.status)
|
||||
: billingSummary?.hasActivePlan
|
||||
? "Active"
|
||||
: "Trial ready";
|
||||
: "Purchase required";
|
||||
const nextBillingDate = subscription?.currentPeriodEnd
|
||||
? formatIsoDate(subscription.currentPeriodEnd)
|
||||
: "Not available";
|
||||
@@ -92,7 +92,7 @@ export function BillingDashboardScreen() {
|
||||
<p className="text-[15px] text-gray-700">
|
||||
{billingSummary?.hasActivePlan
|
||||
? `This workspace's plan is currently ${statusLabel.toLowerCase()} and renews on ${nextBillingDate}.`
|
||||
: "Start your OpenWork Cloud billing flow when your team is ready to share templates and cloud workflows."}
|
||||
: "Workers are $50/month each. Purchase a worker to enable hosted launches for your team."}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -184,6 +184,27 @@ export function BillingDashboardScreen() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mb-6 rounded-[20px] border border-gray-100 bg-white p-8 shadow-[0_2px_12px_-4px_rgba(0,0,0,0.06)]">
|
||||
<h2 className="mb-4 text-[15px] font-medium text-gray-900">Pricing</h2>
|
||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
|
||||
<div className="rounded-[16px] border border-gray-100 bg-gray-50 p-4">
|
||||
<p className="mb-1 text-[12px] font-semibold uppercase tracking-wide text-gray-500">Solo</p>
|
||||
<p className="text-[20px] font-semibold text-gray-900">$0</p>
|
||||
<p className="mt-1 text-[13px] text-gray-500">Free forever · open source</p>
|
||||
</div>
|
||||
<div className="rounded-[16px] border border-gray-100 bg-gray-50 p-4">
|
||||
<p className="mb-1 text-[12px] font-semibold uppercase tracking-wide text-gray-500">Cloud worker</p>
|
||||
<p className="text-[20px] font-semibold text-gray-900">$50<span className="text-[13px] font-medium text-gray-500">/month</span></p>
|
||||
<p className="mt-1 text-[13px] text-gray-500">Per worker · 5 seats included</p>
|
||||
</div>
|
||||
<div className="rounded-[16px] border border-gray-100 bg-gray-50 p-4">
|
||||
<p className="mb-1 text-[12px] font-semibold uppercase tracking-wide text-gray-500">Enterprise</p>
|
||||
<p className="text-[20px] font-semibold text-gray-900">Custom</p>
|
||||
<p className="mt-1 text-[13px] text-gray-500">Windows included · talk to us</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-between rounded-[20px] border border-gray-100 bg-white p-6 shadow-[0_2px_12px_-4px_rgba(0,0,0,0.06)]">
|
||||
<div>
|
||||
<h2 className="mb-1 text-[15px] font-medium text-gray-900">Invoices</h2>
|
||||
|
||||
@@ -123,7 +123,7 @@ export default async function Download() {
|
||||
Windows support — $99/year
|
||||
</h3>
|
||||
<p className="mb-5 text-[14px] leading-7 text-gray-600">
|
||||
Purchase through Polar, then we will send your Windows build link manually in phase one.
|
||||
Purchase through Polar and we will send your Windows build link after checkout.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-3">
|
||||
<a
|
||||
|
||||
@@ -7,7 +7,7 @@ import { getGithubData } from "../../lib/github";
|
||||
export const metadata = {
|
||||
title: "OpenWork — Pricing",
|
||||
description:
|
||||
"Free solo desktop usage, annual Windows support, monthly cloud workers, and enterprise licensing."
|
||||
"Free desktop app, cloud workers from $50/month, and enterprise licensing."
|
||||
};
|
||||
|
||||
export default async function PricingPage() {
|
||||
@@ -32,15 +32,9 @@ export default async function PricingPage() {
|
||||
|
||||
<main className="mx-auto flex w-full max-w-6xl flex-col gap-16 px-6 pb-24 md:gap-20 md:px-8 md:pb-28">
|
||||
<section className="max-w-4xl pt-6 md:pt-10">
|
||||
<div className="mb-4 inline-flex rounded-full border border-white/70 bg-white/80 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.24em] text-slate-500 shadow-sm">
|
||||
OpenWork pricing
|
||||
</div>
|
||||
<h1 className="mb-6 text-4xl font-medium leading-[1.05] tracking-tight md:text-5xl lg:text-6xl">
|
||||
Pricing that keeps desktop free and makes paid access explicit.
|
||||
Pricing
|
||||
</h1>
|
||||
<p className="max-w-3xl text-lg leading-relaxed text-slate-600 md:text-xl">
|
||||
Start solo for free. Purchase Windows support when you need it. Add hosted workers when you want cloud runtime. Talk to us for enterprise licensing.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<PricingGrid windowsCheckoutUrl={windowsCheckoutUrl} callUrl={callUrl} />
|
||||
|
||||
@@ -111,9 +111,9 @@ export function LandingHome(props: Props) {
|
||||
<div className="mb-6 flex flex-wrap items-center gap-x-3 gap-y-2 text-[13px] font-medium text-gray-500 md:text-[14px]">
|
||||
<span>Solo free forever</span>
|
||||
<span aria-hidden="true">•</span>
|
||||
<span>Windows support $99/year</span>
|
||||
<span aria-hidden="true">•</span>
|
||||
<span>Workers $50/month</span>
|
||||
<span aria-hidden="true">•</span>
|
||||
<span>Enterprise talk to us</span>
|
||||
</div>
|
||||
|
||||
<div className="mt-6 flex flex-col items-start gap-4 sm:flex-row sm:items-center">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { ArrowUpRight, Cloud, Download, Monitor, Shield, CornerRightDown } from "lucide-react";
|
||||
import { ArrowUpRight, Cloud, Download, Shield, CornerRightDown } from "lucide-react";
|
||||
import { ResponsiveGrain } from "./responsive-grain";
|
||||
|
||||
type PricingGridProps = {
|
||||
@@ -19,7 +19,6 @@ type PricingCard = {
|
||||
external?: boolean;
|
||||
features: Array<{ text: string; icon: typeof Download }>;
|
||||
footer: string;
|
||||
/** GrainGradient colors revealed on hover */
|
||||
gradientColors: string[];
|
||||
gradientBack: string;
|
||||
gradientShape: "corners" | "wave" | "dots" | "truchet" | "ripple" | "blob" | "sphere";
|
||||
@@ -42,7 +41,6 @@ function PricingCardView({ card }: { card: PricingCard }) {
|
||||
shape={card.gradientShape}
|
||||
speed={0.4}
|
||||
/>
|
||||
{/* Overlay for text contrast */}
|
||||
<div className="absolute inset-0 bg-black/10 mix-blend-overlay" />
|
||||
</div>
|
||||
|
||||
@@ -85,9 +83,9 @@ function PricingCardView({ card }: { card: PricingCard }) {
|
||||
return (
|
||||
<div
|
||||
key={idx}
|
||||
className="flex items-start gap-3 py-3 border-b border-dotted border-gray-200/80 last:border-0 text-[13px] text-gray-700 font-medium"
|
||||
className="flex items-start gap-3 py-3 border-b border-dotted border-gray-400/40 last:border-0 text-[13px] text-gray-700 font-medium"
|
||||
>
|
||||
<Icon className="w-[18px] h-[18px] text-gray-600 shrink-0 mt-0.5" strokeWidth={1.5} />
|
||||
<Icon className="w-[18px] h-[18px] text-gray-500 shrink-0 mt-0.5" strokeWidth={1.5} />
|
||||
<span className="leading-snug">{feature.text}</span>
|
||||
</div>
|
||||
);
|
||||
@@ -118,24 +116,6 @@ export function PricingGrid(props: PricingGridProps) {
|
||||
{ text: "Bring your own keys", icon: Download },
|
||||
],
|
||||
footer: "Free forever",
|
||||
gradientColors: ["#6B7280", "#374151", "#1F2937", "#111827"],
|
||||
gradientBack: "#0F172A",
|
||||
gradientShape: "sphere",
|
||||
},
|
||||
{
|
||||
id: "windows-support",
|
||||
title: "Windows",
|
||||
price: "$99",
|
||||
priceSub: "per year · 1 seat",
|
||||
ctaLabel: "Purchase Windows",
|
||||
href: props.windowsCheckoutUrl,
|
||||
external: /^https?:\/\//.test(props.windowsCheckoutUrl),
|
||||
features: [
|
||||
{ text: "1 Windows seat", icon: Monitor },
|
||||
{ text: "Binary access", icon: Monitor },
|
||||
{ text: "1 year of updates", icon: Monitor },
|
||||
],
|
||||
footer: "Manual delivery in phase one",
|
||||
gradientColors: ["#7C3AED", "#A855F7", "#6D28D9", "#4338CA"],
|
||||
gradientBack: "#1E1B4B",
|
||||
gradientShape: "wave",
|
||||
@@ -149,11 +129,11 @@ export function PricingGrid(props: PricingGridProps) {
|
||||
href: "https://app.openworklabs.com/checkout",
|
||||
external: true,
|
||||
features: [
|
||||
{ text: "5 seats included", icon: Cloud },
|
||||
{ text: "Hosted OpenWork worker", icon: Cloud },
|
||||
{ text: "Monthly billing", icon: Cloud },
|
||||
{ text: "$50 per additional worker", icon: Cloud },
|
||||
],
|
||||
footer: "5 seats included · workers disabled by default",
|
||||
footer: "Workers disabled by default",
|
||||
gradientColors: ["#2563EB", "#0284C7", "#0EA5E9", "#0F172A"],
|
||||
gradientBack: "#0C1220",
|
||||
gradientShape: "ripple",
|
||||
@@ -162,7 +142,7 @@ export function PricingGrid(props: PricingGridProps) {
|
||||
id: "enterprise-license",
|
||||
title: "Enterprise",
|
||||
price: "Custom pricing",
|
||||
priceSub: "licensing",
|
||||
priceSub: "",
|
||||
isCustomPricing: true,
|
||||
ctaLabel: "Talk to us",
|
||||
href: props.callUrl,
|
||||
@@ -189,16 +169,16 @@ export function PricingGrid(props: PricingGridProps) {
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative border-l border-t border-dotted border-gray-200/80">
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 relative border-l border-t border-dotted border-gray-400/50">
|
||||
{cards.map((card) => (
|
||||
<div key={card.id} className="p-6 border-r border-b border-dotted border-gray-200/80 flex flex-col h-full">
|
||||
<div key={card.id} className="p-6 border-r border-b border-dotted border-gray-400/50 flex flex-col h-full">
|
||||
<PricingCardView card={card} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<p className="text-center text-[12px] font-medium text-gray-500">
|
||||
Prices exclude taxes. Windows delivery is manual in phase one.
|
||||
Prices exclude taxes.
|
||||
</p>
|
||||
</section>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user