Skip to content

Commit 9229e61

Browse files
committed
er
1 parent 7ecdc3f commit 9229e61

5 files changed

Lines changed: 174 additions & 3 deletions

File tree

apps/web/src/app/page.tsx

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ import {
3030
CheckCircle2,
3131
Search,
3232
Cloud,
33+
Users,
34+
Building2,
35+
Check,
3336
} from "lucide-react";
3437
import { sidebarData } from "@/components/sidebar/data/sidebar-data";
3538
import { homepageFaqItems } from "@/lib/seo/structured-data";
@@ -701,6 +704,76 @@ export default function Page() {
701704
</div>
702705
</Link>
703706
</motion.div>
707+
708+
{/* T4 — Teams & Workspaces (full-width, NEW) */}
709+
<motion.div
710+
variants={fadeUp}
711+
transition={{ duration: 0.55, delay: 0.25 }}
712+
className="md:col-span-3"
713+
>
714+
<Link
715+
href="/login"
716+
className="group relative flex flex-col gap-6 overflow-hidden rounded-2xl glass-overlay p-6 transition-all duration-300 hover:scale-[1.01] hover:shadow-2xl dark:hover:shadow-black/40 md:flex-row md:items-center md:p-8"
717+
>
718+
<div className="absolute inset-0 opacity-0 group-hover:opacity-[0.06] transition-opacity duration-500 bg-gradient-to-br from-sky-500 to-indigo-400" />
719+
720+
<div className="relative z-10 flex-1">
721+
<div className="mb-4 flex items-center gap-2">
722+
<div className="w-9 h-9 rounded-lg bg-gradient-to-br from-sky-500 to-indigo-400 p-px shadow-md">
723+
<div className="flex h-full w-full items-center justify-center rounded-[7px] bg-card dark:bg-[hsl(var(--surface-2))]">
724+
<Users className="h-4 w-4 text-foreground" />
725+
</div>
726+
</div>
727+
<span className="text-[11px] font-mono uppercase tracking-wider text-muted-foreground">
728+
Built for Teams
729+
</span>
730+
<span className="mdt-pill text-[10px]">NEW</span>
731+
</div>
732+
<h3 className="relative z-10 mb-3 text-2xl font-semibold">
733+
One platform. Your whole team.
734+
</h3>
735+
<p className="max-w-lg text-sm leading-relaxed text-muted-foreground md:text-base">
736+
Create organizations and shared workspaces, invite teammates, and control
737+
exactly who can use what — owners, admins, developers, and viewers each get
738+
the right level of access. Switch between personal and team context in one
739+
click; every tool follows.
740+
</p>
741+
<div className="mt-4 inline-flex items-center gap-1.5 text-sm font-medium text-foreground/80 transition-colors group-hover:text-foreground">
742+
<span>Set up your team workspace</span>
743+
<ArrowRight className="h-4 w-4 transition-transform group-hover:translate-x-0.5" />
744+
</div>
745+
</div>
746+
747+
{/* Workspace + roles preview */}
748+
<div className="relative z-10 w-full shrink-0 md:w-[340px]">
749+
<div className="overflow-hidden rounded-xl border border-border/40 bg-background font-mono text-xs dark:border-white/5">
750+
<div className="flex items-center gap-2 border-b border-border/40 bg-muted/40 px-3 py-2">
751+
<Building2 className="h-3.5 w-3.5 text-muted-foreground" />
752+
<span className="font-semibold">Acme Engineering</span>
753+
<span className="ml-auto rounded bg-sky-500/15 px-1.5 py-0.5 text-[10px] font-semibold text-sky-600 dark:text-sky-400">
754+
Team workspace
755+
</span>
756+
</div>
757+
<div className="divide-y divide-border/30 dark:divide-white/5">
758+
{[
759+
{ name: "ada@acme.dev", role: "Owner" },
760+
{ name: "grace@acme.dev", role: "Admin" },
761+
{ name: "linus@acme.dev", role: "Developer" },
762+
{ name: "margaret@acme.dev", role: "Viewer" },
763+
].map((m) => (
764+
<div key={m.name} className="flex items-center gap-2 px-3 py-2">
765+
<Check className="h-3 w-3 shrink-0 text-emerald-500" />
766+
<span className="truncate text-muted-foreground">{m.name}</span>
767+
<span className="ml-auto rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-foreground/70">
768+
{m.role}
769+
</span>
770+
</div>
771+
))}
772+
</div>
773+
</div>
774+
</div>
775+
</Link>
776+
</motion.div>
704777
</div>
705778
</Section>
706779
</div>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"use client";
2+
3+
import { useEffect, useState } from "react";
4+
import Link from "next/link";
5+
import { ArrowRight, X } from "lucide-react";
6+
7+
const DISMISS_KEY = "mdt-launch-offer-dismissed";
8+
9+
/**
10+
* Slim launch-offer strip above the marketing header. Dismissible per browser
11+
* (localStorage). Rendered on marketing pages only via <Header/>.
12+
*/
13+
export function AnnouncementBanner() {
14+
// Start hidden to avoid a flash for users who already dismissed it.
15+
const [visible, setVisible] = useState(false);
16+
17+
useEffect(() => {
18+
try {
19+
if (!localStorage.getItem(DISMISS_KEY)) setVisible(true);
20+
} catch {
21+
setVisible(true);
22+
}
23+
}, []);
24+
25+
const dismiss = () => {
26+
setVisible(false);
27+
try {
28+
localStorage.setItem(DISMISS_KEY, "1");
29+
} catch {
30+
/* ignore */
31+
}
32+
};
33+
34+
if (!visible) return null;
35+
36+
return (
37+
<div className="relative z-[60] bg-[linear-gradient(100deg,#5b63f0,#9a5cf2_52%,#4fd0e6)] text-white">
38+
<div className="container mx-auto flex items-center justify-center gap-2 px-10 py-2 text-center text-[13px] font-medium sm:gap-3">
39+
<span className="hidden rounded-full bg-white/15 px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wider ring-1 ring-inset ring-white/25 sm:inline-flex">
40+
Launch offer
41+
</span>
42+
<p className="truncate">
43+
First <span className="font-bold">250 accounts</span> get every Pro &amp; Team feature,
44+
free. No card needed.
45+
</p>
46+
<Link
47+
href="/login"
48+
className="hidden shrink-0 items-center gap-1 font-semibold underline decoration-white/50 underline-offset-2 transition-opacity hover:opacity-90 sm:inline-flex"
49+
>
50+
Claim yours <ArrowRight className="h-3.5 w-3.5" />
51+
</Link>
52+
<button
53+
type="button"
54+
onClick={dismiss}
55+
aria-label="Dismiss announcement"
56+
className="absolute right-3 top-1/2 -translate-y-1/2 rounded-md p-1 text-white/80 transition-colors hover:bg-white/15 hover:text-white"
57+
>
58+
<X className="h-4 w-4" />
59+
</button>
60+
</div>
61+
</div>
62+
);
63+
}

apps/web/src/components/header.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Github, Menu, X, ArrowRight } from "lucide-react";
55
import { Button } from "@/components/ui/button";
66
import { ModeToggle } from "./modeToggle";
77
import { Logo } from "./logo";
8+
import { AnnouncementBanner } from "./announcement-banner";
89
import { Magnetic } from "@/components/mdt-magnetic";
910
import { motion, AnimatePresence } from "framer-motion";
1011
import { cn } from "@/lib/utils";
@@ -77,6 +78,7 @@ export function Header({ showThemeToggle = true }: HeaderProps) {
7778
: "border-b border-transparent bg-transparent"
7879
)}
7980
>
81+
<AnnouncementBanner />
8082
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl">
8183
<div className="flex h-16 items-center justify-between">
8284
{/* Logo */}

apps/web/src/components/pricing-tiers.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ export function PricingTiers() {
104104
<p className="max-w-2xl text-muted-foreground">
105105
Self-host for free, forever. Upgrade to cloud when you want the convenience.
106106
</p>
107+
<p className="mdt-pill inline-flex items-center gap-1.5 text-sm">
108+
<span aria-hidden>🎉</span> Launch offer — every plan is free for a limited time
109+
</p>
107110

108111
<div
109112
role="radiogroup"
@@ -161,8 +164,26 @@ export function PricingTiers() {
161164
</p>
162165

163166
<div className="mt-5 mb-6">
164-
<div className="text-4xl font-bold tracking-tight">{big}</div>
165-
<div className="mt-1 text-xs text-muted-foreground">{sub}</div>
167+
{tier.monthly !== null && tier.monthly > 0 ? (
168+
// Launch offer: paid tiers are free for a limited time — show
169+
// the real price struck through so the value reads instantly.
170+
<>
171+
<div className="flex items-baseline gap-2.5">
172+
<span className="text-2xl font-semibold text-muted-foreground/70 line-through decoration-[1.5px]">
173+
{big}
174+
</span>
175+
<span className="mdt-grad-text text-4xl font-bold tracking-tight">Free</span>
176+
</div>
177+
<div className="mt-1 text-xs text-muted-foreground">
178+
for a limited time · normally {sub}
179+
</div>
180+
</>
181+
) : (
182+
<>
183+
<div className="text-4xl font-bold tracking-tight">{big}</div>
184+
<div className="mt-1 text-xs text-muted-foreground">{sub}</div>
185+
</>
186+
)}
166187
</div>
167188

168189
<Link

apps/web/src/lib/seo/platform-pages.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ export const platformSeoPages: PlatformSeoPage[] = [
7171
slug: 'features',
7272
title: 'Developer Toolkit Features',
7373
description:
74-
'Explore MyDevTools features: unified dashboard, command palette, favorites, browser-based tools, secure sync, self-hosting, and managed cloud hosting.',
74+
'Explore MyDevTools features: unified dashboard, command palette, team workspaces with role-based access, browser-based tools, secure sync, self-hosting, and managed cloud hosting.',
7575
keywords: [
7676
'developer toolkit features',
7777
'browser developer tools features',
7878
'online developer dashboard',
7979
'developer tools command palette',
80+
'team workspaces developer tools',
81+
'role based access developer tools',
8082
],
8183
eyebrow: 'Features',
8284
heading: 'Features built for fast, private developer workflows',
@@ -95,6 +97,16 @@ export const platformSeoPages: PlatformSeoPage[] = [
9597
'Use public tool pages for discovery, then open the full app when ready.',
9698
],
9799
},
100+
{
101+
title: 'Team workspaces with roles',
102+
body:
103+
'Create organizations and shared workspaces, invite teammates, and give each person the right level of access — no more pasting secrets over chat.',
104+
bullets: [
105+
'Organizations group your workspaces; switch between personal and team context in one click.',
106+
'Four roles — owner, admin, developer, viewer — control who can manage members and which tools each role can use.',
107+
'Bookmarks, notes, snippets, and connections are scoped per workspace, so team data stays with the team.',
108+
],
109+
},
98110
{
99111
title: 'Browser-based utilities',
100112
body:

0 commit comments

Comments
 (0)