diff --git a/apps/web/src/routes/_view/press-kit.app.tsx b/apps/web/src/routes/_view/press-kit.app.tsx deleted file mode 100644 index b18a7664b0..0000000000 --- a/apps/web/src/routes/_view/press-kit.app.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; - -export const Route = createFileRoute("/_view/press-kit/app")({ - component: RouteComponent, -}); - -function RouteComponent() { - return
Hello "/_view/press-kit/press-kit/app"!
; -} diff --git a/apps/web/src/routes/_view/press-kit/app.tsx b/apps/web/src/routes/_view/press-kit/app.tsx new file mode 100644 index 0000000000..c6c7077ddb --- /dev/null +++ b/apps/web/src/routes/_view/press-kit/app.tsx @@ -0,0 +1,508 @@ +import { createFileRoute, useNavigate } from "@tanstack/react-router"; +import { Menu, X, XIcon } from "lucide-react"; +import { AnimatePresence, motion } from "motion/react"; +import { useEffect, useState } from "react"; + +import { + ResizableHandle, + ResizablePanel, + ResizablePanelGroup, +} from "@hypr/ui/components/ui/resizable"; +import { useIsMobile } from "@hypr/ui/hooks/use-mobile"; +import { cn } from "@hypr/utils"; + +import { Image } from "@/components/image"; +import { MockWindow } from "@/components/mock-window"; + +type AppSearch = { + type?: "screenshot"; + id?: string; +}; + +export const Route = createFileRoute("/_view/press-kit/app")({ + component: Component, + validateSearch: (search: Record): AppSearch => { + return { + type: search.type === "screenshot" ? search.type : undefined, + id: typeof search.id === "string" ? search.id : undefined, + }; + }, + head: () => ({ + meta: [ + { title: "App Screenshots - Hyprnote Press Kit" }, + { + name: "description", + content: "Download Hyprnote app screenshots and UI assets.", + }, + ], + }), +}); + +const screenshots = [ + { + id: "float-compact", + name: "float-compact.jpg", + url: "/api/images/hyprnote/float-compact.jpg", + description: "Compact floating window mode", + }, + { + id: "float-memos", + name: "float-memos.jpg", + url: "/api/images/hyprnote/float-memos.jpg", + description: "Floating window with memos", + }, + { + id: "float-transcript", + name: "float-transcript.jpg", + url: "/api/images/hyprnote/float-transcript.jpg", + description: "Floating window with transcript", + }, + { + id: "float-insights", + name: "float-insights.jpg", + url: "/api/images/hyprnote/float-insights.jpg", + description: "Floating window with AI insights", + }, + { + id: "float-chat", + name: "float-chat.jpg", + url: "/api/images/hyprnote/float-chat.jpg", + description: "Floating window with chat", + }, + { + id: "ai-notetaking-hero", + name: "ai-notetaking-hero.jpg", + url: "/api/images/hyprnote/ai-notetaking-hero.jpg", + description: "AI notetaking hero image", + }, + { + id: "search-1", + name: "search-1.jpg", + url: "/api/images/hyprnote/search-1.jpg", + description: "Search interface", + }, + { + id: "search-2", + name: "search-2.jpg", + url: "/api/images/hyprnote/search-2.jpg", + description: "Search results", + }, + { + id: "search-3", + name: "search-3.jpg", + url: "/api/images/hyprnote/search-3.jpg", + description: "Search detail view", + }, +]; + +type SelectedItem = { type: "screenshot"; data: (typeof screenshots)[0] }; + +function Component() { + const navigate = useNavigate({ from: Route.fullPath }); + const search = Route.useSearch(); + const [selectedItem, setSelectedItem] = useState(null); + + useEffect(() => { + if (search.type === "screenshot" && search.id) { + const screenshot = screenshots.find((s) => s.id === search.id); + if (screenshot) { + setSelectedItem({ type: "screenshot", data: screenshot }); + } + } else { + setSelectedItem(null); + } + }, [search.type, search.id]); + + const handleSetSelectedItem = (item: SelectedItem | null) => { + setSelectedItem(item); + if (item === null) { + navigate({ search: {} }); + } else if (item.type === "screenshot") { + navigate({ search: { type: "screenshot", id: item.data.id } }); + } + }; + + return ( +
+
+ + +
+
+ ); +} + +function HeroSection() { + return ( +
+
+

+ App Screenshots +

+

+ Download high-quality screenshots of Hyprnote for press and marketing + materials. +

+
+
+ ); +} + +function AppContentSection({ + selectedItem, + setSelectedItem, +}: { + selectedItem: SelectedItem | null; + setSelectedItem: (item: SelectedItem | null) => void; +}) { + const isMobile = useIsMobile(); + const [drawerOpen, setDrawerOpen] = useState(false); + + return ( +
+
+ setDrawerOpen(true)} + className="p-1 hover:bg-neutral-200 rounded transition-colors" + aria-label="Open navigation" + > + + + ) + } + > +
+ {!selectedItem ? ( + + ) : isMobile ? ( + <> + setDrawerOpen(false)} + selectedItem={selectedItem} + setSelectedItem={setSelectedItem} + /> + + + ) : ( + + )} +
+ + + +
+
+ ); +} + +function AppGridView({ + setSelectedItem, +}: { + setSelectedItem: (item: SelectedItem) => void; +}) { + return ( +
+ +
+ ); +} + +function ScreenshotsGrid({ + setSelectedItem, +}: { + setSelectedItem: (item: SelectedItem) => void; +}) { + return ( +
+
+ Screenshots +
+
+ {screenshots.map((screenshot) => ( + + ))} +
+
+ ); +} + +function AppDetailView({ + selectedItem, + setSelectedItem, +}: { + selectedItem: SelectedItem; + setSelectedItem: (item: SelectedItem | null) => void; +}) { + return ( + + + + + + ); +} + +function MobileSidebarDrawer({ + open, + onClose, + selectedItem, + setSelectedItem, +}: { + open: boolean; + onClose: () => void; + selectedItem: SelectedItem; + setSelectedItem: (item: SelectedItem) => void; +}) { + return ( + + {open && ( + <> + + +
+ + Navigation + + +
+
+ { + setSelectedItem(item); + onClose(); + }} + /> +
+
+ + )} +
+ ); +} + +function AppDetailContent({ + selectedItem, + setSelectedItem, +}: { + selectedItem: SelectedItem; + setSelectedItem: (item: SelectedItem | null) => void; +}) { + return ( +
+ {selectedItem?.type === "screenshot" && ( + setSelectedItem(null)} + /> + )} +
+ ); +} + +function AppSidebar({ + selectedItem, + setSelectedItem, +}: { + selectedItem: SelectedItem; + setSelectedItem: (item: SelectedItem) => void; +}) { + return ( + +
+ +
+
+ ); +} + +function ScreenshotsSidebar({ + selectedItem, + setSelectedItem, +}: { + selectedItem: SelectedItem; + setSelectedItem: (item: SelectedItem) => void; +}) { + return ( +
+
+ Screenshots +
+
+ {screenshots.map((screenshot) => ( + + ))} +
+
+ ); +} + +function AppDetailPanel({ + selectedItem, + setSelectedItem, +}: { + selectedItem: SelectedItem; + setSelectedItem: (item: SelectedItem | null) => void; +}) { + return ( + +
+ {selectedItem?.type === "screenshot" && ( + setSelectedItem(null)} + /> + )} +
+
+ ); +} + +function ScreenshotDetail({ + screenshot, + onClose, +}: { + screenshot: (typeof screenshots)[0]; + onClose: () => void; +}) { + return ( + <> +
+

{screenshot.name}

+
+ + Download + + +
+
+ +
+ {screenshot.name} + +

{screenshot.description}

+
+ + ); +} + +function AppStatusBar({ selectedItem }: { selectedItem: SelectedItem | null }) { + return ( +
+ + {selectedItem + ? `Viewing ${selectedItem.data.name}` + : `${screenshots.length} items, 1 group`} + +
+ ); +} diff --git a/apps/web/src/routes/_view/press-kit.tsx b/apps/web/src/routes/_view/press-kit/index.tsx similarity index 95% rename from apps/web/src/routes/_view/press-kit.tsx rename to apps/web/src/routes/_view/press-kit/index.tsx index be6831d4c2..e315deaff2 100644 --- a/apps/web/src/routes/_view/press-kit.tsx +++ b/apps/web/src/routes/_view/press-kit/index.tsx @@ -8,7 +8,7 @@ const TITLE = "Press Kit - Hyprnote"; const DESCRIPTION = "Download Hyprnote press materials, logos, screenshots, and brand assets."; -export const Route = createFileRoute("/_view/press-kit")({ +export const Route = createFileRoute("/_view/press-kit/")({ component: Component, head: () => ({ meta: [ @@ -44,7 +44,6 @@ function Component() { style={{ backgroundImage: "url(/patterns/dots.svg)" }} >
- {/* Hero Section */}

@@ -63,13 +62,10 @@ function Component() {

- {/* Finder Section */}
- {/* Finder-style content area */}
- {/* Press Materials Group */}
Press Materials @@ -99,7 +95,6 @@ function Component() {
- {/* Quick Actions Group */}
Quick Actions @@ -133,7 +128,6 @@ function Component() {
- {/* Finder-style status bar */}
7 items, 2 groups