diff --git a/apps/browser-extension/entrypoints/background.ts b/apps/browser-extension/entrypoints/background.ts index 1066e6b0..338ff671 100644 --- a/apps/browser-extension/entrypoints/background.ts +++ b/apps/browser-extension/entrypoints/background.ts @@ -26,12 +26,19 @@ interface SearchResponse { export default defineBackground(() => { let twitterImporter: TwitterImporter | null = null; - browser.runtime.onInstalled.addListener(() => { + browser.runtime.onInstalled.addListener((details) => { browser.contextMenus.create({ id: CONTEXT_MENU_IDS.SAVE_TO_SUPERMEMORY, title: "Save to Supermemory", contexts: ["selection", "page", "link"], }); + + // Open welcome tab on first install + if (details.reason === "install") { + browser.tabs.create({ + url: browser.runtime.getURL("/welcome.html"), + }); + } }); // Intercept Twitter requests to capture authentication headers. diff --git a/apps/browser-extension/entrypoints/welcome/Welcome.tsx b/apps/browser-extension/entrypoints/welcome/Welcome.tsx new file mode 100644 index 00000000..097d3abd --- /dev/null +++ b/apps/browser-extension/entrypoints/welcome/Welcome.tsx @@ -0,0 +1,135 @@ +function Welcome() { + return ( +
+
+ {/* Header */} +
+ Supermemory +

+ Your AI-powered second brain for saving and organizing everything + that matters +

+
+ + {/* Features Section */} +
+

What can you do with Supermemory?

+ +
+
+
💾
+

Save Any Page

+

+ Instantly save web pages, articles, and content to your personal + knowledge base +

+
+ +
+
🐦
+

Import Twitter/X Bookmarks

+

+ Bring all your saved tweets and bookmarks into one organized + place +

+
+ +
+
🤖
+

Import ChatGPT Memories

+

+ Keep your important AI conversations and insights accessible +

+
+ +
+
🔍
+

AI-Powered Search

+

+ Find anything you've saved using intelligent semantic search +

+
+
+
+ + {/* Getting Started */} +
+

+ Get Started in 2 Simple Steps +

+ +
+
+
1
+
+

Login to Your Account

+

Connect your Supermemory account to start saving content

+
+
+ +
+
2
+
+

Start Saving

+

Click the extension icon on any page to save it instantly

+
+
+
+
+ + {/* Actions */} +
+ + +
+

+ Need help getting started?{" "} + +

+
+
+ + {/* Footer */} +
+

+ Learn more at{" "} + + supermemory.ai + +

+
+
+
+ ); +} + +export default Welcome; diff --git a/apps/browser-extension/entrypoints/welcome/index.html b/apps/browser-extension/entrypoints/welcome/index.html new file mode 100644 index 00000000..abaab93b --- /dev/null +++ b/apps/browser-extension/entrypoints/welcome/index.html @@ -0,0 +1,13 @@ + + + + + + + Welcome to Supermemory + + +
+ + + \ No newline at end of file diff --git a/apps/browser-extension/entrypoints/welcome/main.tsx b/apps/browser-extension/entrypoints/welcome/main.tsx new file mode 100644 index 00000000..a9233deb --- /dev/null +++ b/apps/browser-extension/entrypoints/welcome/main.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import Welcome from "./Welcome"; +import "./welcome.css"; + +const rootElement = document.getElementById("root"); +if (rootElement) { + ReactDOM.createRoot(rootElement).render( + + + , + ); +} diff --git a/apps/browser-extension/entrypoints/welcome/welcome.css b/apps/browser-extension/entrypoints/welcome/welcome.css new file mode 100644 index 00000000..3362fffe --- /dev/null +++ b/apps/browser-extension/entrypoints/welcome/welcome.css @@ -0,0 +1,310 @@ +/* Custom Font Definitions */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url('/fonts/SpaceGrotesk-Light.ttf') format('truetype'); +} + +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('/fonts/SpaceGrotesk-Regular.ttf') format('truetype'); +} + +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('/fonts/SpaceGrotesk-Medium.ttf') format('truetype'); +} + +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url('/fonts/SpaceGrotesk-SemiBold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url('/fonts/SpaceGrotesk-Bold.ttf') format('truetype'); +} + +/* Welcome Page Styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + background: #ffffff; + color: #000000; + line-height: 1.5; +} + +.welcome-container { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 32px; + background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); +} + +.welcome-content { + max-width: 800px; + width: 100%; + text-align: center; +} + +/* Header Styles */ +.welcome-header { + margin-bottom: 48px; +} + +.welcome-logo { + height: 64px; + margin-bottom: 24px; +} + +.welcome-title { + font-size: 32px; + font-weight: 700; + color: #000000; + margin-bottom: 16px; +} + +.welcome-subtitle { + font-size: 18px; + color: #6c757d; + font-weight: 400; + max-width: 600px; + margin: 0 auto; +} + +/* Features Section */ +.welcome-features { + margin-bottom: 48px; +} + +.features-title { + font-size: 24px; + font-weight: 600; + color: #000000; + margin-bottom: 32px; +} + +.features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 24px; + margin-bottom: 32px; +} + +.feature-card { + background: #ffffff; + border: 1px solid #e9ecef; + border-radius: 12px; + padding: 24px; + text-align: center; + transition: all 0.2s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); +} + +.feature-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + border-color: #ced4da; +} + +.feature-icon { + font-size: 32px; + margin-bottom: 16px; + display: block; +} + +.feature-card h3 { + font-size: 18px; + font-weight: 600; + color: #000000; + margin-bottom: 12px; +} + +.feature-card p { + font-size: 14px; + color: #6c757d; + line-height: 1.4; +} + +/* Getting Started Section */ +.welcome-getting-started { + margin-bottom: 48px; +} + +.getting-started-title { + font-size: 24px; + font-weight: 600; + color: #000000; + margin-bottom: 32px; +} + +.steps { + display: flex; + justify-content: center; + gap: 32px; + flex-wrap: wrap; +} + +.step { + display: flex; + align-items: center; + gap: 16px; + max-width: 300px; + text-align: left; +} + +.step-number { + width: 48px; + height: 48px; + background: #374151; + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + font-weight: 600; + flex-shrink: 0; +} + +.step-content h3 { + font-size: 16px; + font-weight: 600; + color: #000000; + margin-bottom: 4px; +} + +.step-content p { + font-size: 14px; + color: #6c757d; + line-height: 1.3; +} + +/* Actions Section */ +.welcome-actions { + margin-bottom: 32px; +} + +.login-primary-btn { + width: auto; + min-width: 200px; + padding: 16px 32px; + background-color: #374151; + color: white; + border: none; + border-radius: 24px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: background-color 0.2s ease; + margin-bottom: 16px; + outline: none; +} + +.login-primary-btn:hover:not(:disabled) { + background-color: #1f2937; +} + +.login-primary-btn:disabled { + background-color: #9e9e9e; + cursor: not-allowed; +} + +.welcome-help { + margin-top: 16px; +} + +.help-text { + font-size: 14px; + color: #6c757d; + margin: 0; +} + +.help-link { + background: none; + border: none; + color: #4285f4; + cursor: pointer; + text-decoration: underline; + font-size: 14px; + padding: 0; + outline: none; +} + +.help-link:hover { + color: #1a73e8; +} + +/* Footer */ +.welcome-footer { + border-top: 1px solid #e9ecef; + padding-top: 24px; + margin-top: 32px; +} + +.welcome-footer p { + font-size: 14px; + color: #6c757d; +} + +.footer-link { + color: #4285f4; + text-decoration: none; +} + +.footer-link:hover { + text-decoration: underline; + color: #1a73e8; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .welcome-container { + padding: 16px; + } + + .welcome-title { + font-size: 28px; + } + + .welcome-subtitle { + font-size: 16px; + } + + .features-grid { + grid-template-columns: 1fr; + gap: 16px; + } + + .steps { + flex-direction: column; + align-items: center; + } + + .step { + max-width: 100%; + text-align: center; + flex-direction: column; + } +} \ No newline at end of file