diff --git a/apps/web/app/onboarding/page.tsx b/apps/web/app/onboarding/page.tsx index d1a91123..da64cd5d 100644 --- a/apps/web/app/onboarding/page.tsx +++ b/apps/web/app/onboarding/page.tsx @@ -169,7 +169,7 @@ export default function OnboardingPage() {
{isWelcomeFlow && ( )} diff --git a/apps/web/app/onboarding/setup/chat-sidebar.tsx b/apps/web/app/onboarding/setup/chat-sidebar.tsx index b9d9bb81..a8adc2b8 100644 --- a/apps/web/app/onboarding/setup/chat-sidebar.tsx +++ b/apps/web/app/onboarding/setup/chat-sidebar.tsx @@ -8,7 +8,7 @@ import { PanelRightCloseIcon, SendIcon } from "lucide-react" import { collectValidUrls } from "@/utils/url-helpers" import { $fetch } from "@lib/api" import { cn } from "@lib/utils" -import { dmSansFont } from "@/utils/fonts" +import { dmSansClassName } from "@/utils/fonts" interface ChatSidebarProps { formData: { @@ -268,13 +268,13 @@ export function ChatSidebar({ formData }: ChatSidebarProps) { key="closed" className={cn( "absolute top-0 right-0 flex items-start justify-start m-4", - dmSansFont.className, + dmSansClassName(), )} layoutId="chat-toggle-button" >
{messages.length === 0 && !isLoading && !formData && ( -
+
Waiting for your input
@@ -325,7 +325,7 @@ export function ChatSidebar({ formData }: ChatSidebarProps) { className="flex items-start gap-2" > {msg.type === "waiting" ? ( -
+
{msg.message}
@@ -374,7 +374,7 @@ export function ChatSidebar({ formData }: ChatSidebarProps) { )} {memory.description && ( -

+

{memory.description}

)} @@ -403,13 +403,13 @@ export function ChatSidebar({ formData }: ChatSidebarProps) { onChange={(e) => setMessage(e.target.value)} onKeyDown={handleKeyDown} placeholder="Chat with your Supermemory" - className="w-full text-foreground placeholder:text-foreground/20 rounded-sm outline-none resize-none text-base leading-relaxed bg-transparent px-2 h-10" + className="w-full text-white placeholder:text-white/20 rounded-sm outline-none resize-none text-base leading-relaxed bg-transparent px-2 h-10" />
-
+
{integrationCards.map((card) => { const isClickable = card.title === "Connect to AI" @@ -81,7 +83,9 @@ export function IntegrationsStep() {
-

+

Grow with your supermemory

-

+

I learn and personalize over time, so every interaction feels natural.

@@ -89,12 +88,10 @@ export function FeaturesStep() { initial={{ opacity: 0, y: 10 }} > diff --git a/apps/web/app/onboarding/welcome/memories-step.tsx b/apps/web/app/onboarding/welcome/memories-step.tsx index 044ddd2b..6fdd8610 100644 --- a/apps/web/app/onboarding/welcome/memories-step.tsx +++ b/apps/web/app/onboarding/welcome/memories-step.tsx @@ -65,7 +65,7 @@ export function MemoriesStep({ onSubmit }: MemoriesStepProps) { placeholder="x.com/yourhandle" value={twitterHandle} onChange={(e) => setTwitterHandle(e.target.value)} - className="w-full px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-[#8A8A8A] focus:outline-none focus:border-[#4A4A4A] transition-colors" + className="w-full px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-onboarding focus:outline-none focus:border-[#4A4A4A] transition-colors" />
@@ -82,7 +82,7 @@ export function MemoriesStep({ onSubmit }: MemoriesStepProps) { placeholder="linkedin.com/in/yourname" value={linkedinProfile} onChange={(e) => setLinkedinProfile(e.target.value)} - className="w-full px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-[#8A8A8A] focus:outline-none focus:border-[#4A4A4A] transition-colors" + className="w-full px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-onboarding focus:outline-none focus:border-[#4A4A4A] transition-colors" />
@@ -99,7 +99,7 @@ export function MemoriesStep({ onSubmit }: MemoriesStepProps) { {otherLinks.map((link, index) => (
updateOtherLink(index, e.target.value)} - className="flex-1 px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-[#8A8A8A] focus:outline-none focus:border-[#4A4A4A] transition-colors" + className="flex-1 px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-onboarding focus:outline-none focus:border-[#4A4A4A] transition-colors" /> {index === otherLinks.length - 1 && otherLinks.length < 3 && ( @@ -135,7 +135,7 @@ export function MemoriesStep({ onSubmit }: MemoriesStepProps) { value={description} onChange={(e) => setDescription(e.target.value)} rows={4} - className="w-full px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-[#8A8A8A] focus:outline-none focus:border-[#4A4A4A] transition-colors" + className="w-full px-4 py-2 bg-[#070E1B] border border-[#525966]/20 rounded-xl text-white placeholder-onboarding focus:outline-none focus:border-[#4A4A4A] transition-colors min-h-[4rem]" />
diff --git a/apps/web/components/mcp-detail-view.tsx b/apps/web/components/mcp-detail-view.tsx index cfa60f92..37bfd6ef 100644 --- a/apps/web/components/mcp-detail-view.tsx +++ b/apps/web/components/mcp-detail-view.tsx @@ -2,9 +2,18 @@ import { useState, useEffect } from "react" import { Button } from "@ui/components/button" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@ui/components/select" import { CircleCheckIcon, CopyIcon } from "lucide-react" import { toast } from "sonner" import { analytics } from "@/lib/analytics" +import { cn } from "@lib/utils" +import { dmSansClassName } from "@/utils/fonts" const clients = { cursor: "Cursor", @@ -65,42 +74,67 @@ export function MCPDetailView({ onBack }: MCPDetailViewProps) {
-
-

+
+

Connect your AI to supermemory MCP

-
+
-

+

MCP connects your AI apps to create and use memories directly

-
+
-

+

Auto-fetch the right context from anything you've saved

-
+
-

+

One-time setup, seamless integration across your workflow

-
-
-
+
+
+
+
1
-
-

- Select your AI client -

-
+
+
+

+ Select your AI client +

+ {selectedClient && + } +
+
{Object.entries(clients) .slice(0, 7) .map(([key, clientName]) => ( @@ -132,11 +166,11 @@ export function MCPDetailView({ onBack }: MCPDetailViewProps) {
-
+
2
-
-

+
+

Copy the installation command

{selectedClient && ( @@ -257,7 +291,7 @@ export function MCPDetailView({ onBack }: MCPDetailViewProps) {
@@ -281,7 +315,7 @@ export function MCPDetailView({ onBack }: MCPDetailViewProps) {
-
+
3
diff --git a/apps/web/globals.css b/apps/web/globals.css index 3ff20004..0fbf5557 100644 --- a/apps/web/globals.css +++ b/apps/web/globals.css @@ -1,6 +1,14 @@ @import "tailwindcss"; @plugin "@tailwindcss/typography"; +@theme { + --color-onboarding: #525966; +} + +:root { + --color-placeholder-onboarding: #525966; +} + .sm-tweet-theme .react-tweet-theme { --tweet-container-margin: 0px; } @@ -20,4 +28,10 @@ .scrollbar-thin::-webkit-scrollbar-track { background: transparent; +} + +[class*="dmSans"], +.font-dm-sans { + letter-spacing: -0.01em; + line-height: 135%; } \ No newline at end of file diff --git a/apps/web/public/onboarding/mcp.png b/apps/web/public/onboarding/mcp.png new file mode 100644 index 00000000..b346ecfe Binary files /dev/null and b/apps/web/public/onboarding/mcp.png differ diff --git a/apps/web/utils/fonts.ts b/apps/web/utils/fonts.ts index b7c96b56..661eb747 100644 --- a/apps/web/utils/fonts.ts +++ b/apps/web/utils/fonts.ts @@ -1,13 +1,29 @@ import { DM_Mono, DM_Sans } from "next/font/google" +import { cn } from "@lib/utils" +// DM Sans font export const dmSansFont = DM_Sans({ subsets: ["latin"], weight: ["400", "500", "700"], variable: "--font-dm-sans", }) +// DM Mono font export const dmMonoFont = DM_Mono({ subsets: ["latin"], weight: ["400"], variable: "--font-dm-mono", }) + +/** + * Utility function that combines dmSansFont.className with required typography styles + * (letter-spacing: -0.01em and line-height: 135%) + */ +export function dmSansClassName(additionalClasses?: string) { + return cn( + dmSansFont.className, + "tracking-[-0.01em]", + "leading-[135%]", + additionalClasses, + ) +} diff --git a/packages/ui/components/button.tsx b/packages/ui/components/button.tsx index 123ca6b7..afb7c129 100644 --- a/packages/ui/components/button.tsx +++ b/packages/ui/components/button.tsx @@ -22,6 +22,7 @@ const buttonVariants = cva( "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", link: "text-primary underline-offset-4 hover:underline", settingsNav: "cursor-pointer rounded-sm bg-transparent", + onboarding: "rounded-xl !px-6 !py-3 bg-black border border-[#161F2C] hover:bg-[#161F2C] !h-[40px] cursor-pointer text-white", }, size: { default: "h-9 px-4 py-2 has-[>svg]:px-3",