From 908cea6fe83ac2a20bb17016d59d5f48c7b16285 Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Wed, 26 Nov 2025 00:35:46 +0900 Subject: [PATCH 1/2] feat: add floating panel tabs with responsive interactions --- .../routes/_view/product/ai-notetaking.tsx | 301 ++++++++++++------ 1 file changed, 209 insertions(+), 92 deletions(-) diff --git a/apps/web/src/routes/_view/product/ai-notetaking.tsx b/apps/web/src/routes/_view/product/ai-notetaking.tsx index 0cb9fc416e..26413149d5 100644 --- a/apps/web/src/routes/_view/product/ai-notetaking.tsx +++ b/apps/web/src/routes/_view/product/ai-notetaking.tsx @@ -7,7 +7,7 @@ import { SearchIcon, } from "lucide-react"; import { AnimatePresence, motion } from "motion/react"; -import { memo, useEffect, useState } from "react"; +import { memo, useEffect, useRef, useState } from "react"; import { Typewriter } from "@hypr/ui/components/ui/typewriter"; import { cn } from "@hypr/utils"; @@ -41,6 +41,44 @@ export const Route = createFileRoute("/_view/product/ai-notetaking")({ }), }); +const tabs = [ + { + title: "Compact Mode", + description: + "The default collapsed overlay that indicates the meeting is being listened to. Minimal and unobtrusive, staying out of your way.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-compact.jpg", + }, + { + title: "Memos", + description: + "Take quick notes during the meeting. Jot down important points, ideas, or reminders without losing focus on the conversation.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-memos.jpg", + }, + { + title: "Transcript", + description: + "Watch the live transcript as the conversation unfolds in real-time, so you never miss what was said during the meeting.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-transcript.jpg", + }, + { + title: "Live Insights", + description: + "Get a rolling summary of the past 5 minutes with AI-powered suggestions. For sales calls, receive prompts for qualification questions and next steps.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-insights.jpg", + }, + { + title: "Chat", + description: + "Ask questions and get instant answers during the meeting. Query the transcript, get clarifications, or find specific information on the fly.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-chat.jpg", + }, +]; + function Component() { return (
); } +const floatingPanelTabs = [ + { + title: "Compact Mode", + description: + "Minimal overlay that indicates recording is active. Stays out of your way.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-compact.jpg", + }, + { + title: "Memos", + description: + "Take quick notes during the meeting without losing focus on the conversation.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-memos.jpg", + }, + { + title: "Transcript", + description: + "Watch the live transcript as the conversation unfolds in real-time.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-transcript.jpg", + }, + { + title: "Live Insights", + description: + "Rolling summary of the past 5 minutes with AI suggestions and next steps.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-insights.jpg", + }, + { + title: "Chat", + description: "Ask questions and get instant answers during the meeting.", + image: + "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-chat.jpg", + }, +]; + function FloatingPanelSection() { return (
@@ -2067,10 +2142,73 @@ function FloatingPanelHeader() { } function FloatingPanelContent() { + const [selectedTab, setSelectedTab] = useState(0); + const scrollRef = useRef(null); + + const scrollToTab = (index: number) => { + setSelectedTab(index); + if (scrollRef.current) { + const container = scrollRef.current; + const scrollLeft = container.offsetWidth * index; + container.scrollTo({ left: scrollLeft, behavior: "smooth" }); + } + }; + return (
+ + - +
+ ); +} + +function FloatingPanelTablet({ + selectedTab, + setSelectedTab, +}: { + selectedTab: number; + setSelectedTab: (index: number) => void; +}) { + return ( +
+
+
+
+ {floatingPanelTabs.map((tab, index) => ( + + ))} +
+
+ +
+ {`${floatingPanelTabs[selectedTab].title} +
+
); } @@ -2078,52 +2216,14 @@ function FloatingPanelContent() { function FloatingPanelDesktop() { const [selectedTab, setSelectedTab] = useState(0); - const tabs = [ - { - title: "Compact Mode", - description: - "The default collapsed overlay that indicates the meeting is being listened to. Minimal and unobtrusive, staying out of your way.", - image: - "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-compact.jpg", - }, - { - title: "Memos", - description: - "Take quick notes during the meeting. Jot down important points, ideas, or reminders without losing focus on the conversation.", - image: - "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-memos.jpg", - }, - { - title: "Transcript", - description: - "Watch the live transcript as the conversation unfolds in real-time, so you never miss what was said during the meeting.", - image: - "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-transcript.jpg", - }, - { - title: "Live Insights", - description: - "Get a rolling summary of the past 5 minutes with AI-powered suggestions. For sales calls, receive prompts for qualification questions and next steps.", - image: - "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-insights.jpg", - }, - { - title: "Chat", - description: - "Ask questions and get instant answers during the meeting. Query the transcript, get clarifications, or find specific information on the fly.", - image: - "https://ijoptyyjrfqwaqhyxkxj.supabase.co/storage/v1/object/public/public_images/hyprnote/float-chat.jpg", - }, - ]; - return ( -
+
- {tabs.map((tab, index) => ( + {floatingPanelTabs.map((tab, index) => (
setSelectedTab(index)} @@ -2133,12 +2233,12 @@ function FloatingPanelDesktop() { selectedTab === index ? "bg-stone-50" : "hover:bg-neutral-50", ])} > -

- +

+

{tab.title} - {" "} - – {tab.description} -

+

+

{tab.description}

+
))}
@@ -2146,8 +2246,8 @@ function FloatingPanelDesktop() {
{`${tabs[selectedTab].title}
@@ -2155,52 +2255,69 @@ function FloatingPanelDesktop() { ); } -function FloatingPanelMobile() { +function FloatingPanelMobile({ + scrollRef, + selectedTab, + setSelectedTab, + scrollToTab, +}: { + scrollRef: React.RefObject; + selectedTab: number; + setSelectedTab: (index: number) => void; + scrollToTab: (index: number) => void; +}) { return (
-
- Floating panel preview -
-
-

- Compact Mode – - The default collapsed overlay that indicates the meeting is being - listened to. Minimal and unobtrusive, staying out of your way. -

-
-
-

- Memos – Take - quick notes during the meeting. Jot down important points, ideas, or - reminders without losing focus on the conversation. -

-
-
-

- Transcript – - Watch the live transcript as the conversation unfolds in real-time, so - you never miss what was said during the meeting. -

-
-
-

- Live Insights – - Get a rolling summary of the past 5 minutes with AI-powered - suggestions. For sales calls, receive prompts for qualification - questions and next steps. -

+
{ + const container = e.currentTarget; + const scrollLeft = container.scrollLeft; + const itemWidth = container.offsetWidth; + const index = Math.round(scrollLeft / itemWidth); + setSelectedTab(index); + }} + > +
+ {floatingPanelTabs.map((tab, index) => ( +
+
+
+ {`${tab.title} +
+
+

+ + {tab.title} + {" "} + – {tab.description} +

+
+
+
+ ))} +
-
-

- Chat – Ask - questions and get instant answers during the meeting. Query the - transcript, get clarifications, or find specific information on the - fly. -

+ +
+ {tabs.map((_, index) => ( +
); From f467f84957ddefacff2084a26dcad006225e90ab Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Wed, 26 Nov 2025 00:35:51 +0900 Subject: [PATCH 2/2] chores --- apps/web/netlify/edge-functions/og.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/netlify/edge-functions/og.tsx b/apps/web/netlify/edge-functions/og.tsx index 6461d65ca7..8d2b66cabf 100644 --- a/apps/web/netlify/edge-functions/og.tsx +++ b/apps/web/netlify/edge-functions/og.tsx @@ -115,7 +115,7 @@ function renderTemplate(params: z.infer) { {params.title}
- {params.headers.map((header, i) => ( + {params.headers.map((header: string, i: number) => (