From 612e6811ed2b41d9acce876bfe7a4ab0ece6939c Mon Sep 17 00:00:00 2001 From: jatinkrmalik Date: Mon, 19 Jan 2026 16:47:34 -0800 Subject: [PATCH] feat(web): Add live demo, improve logo and install UX Changes: - Use actual app logo SVG image for consistent branding - Added live browser-based speech recognition demo using Web Speech API - Allows users to try voice-to-text directly in their browser - Clear indication that the demo uses cloud-based Web Speech API - Prominent call-to-action to install Vocalinux for offline experience - Redesigned one-click install box with better visual hierarchy - Left-aligned layout with clear instructions - Terminal-style command display with copy button - Added compatibility info and install time estimates - Improved footer and feature section with consistent logo usage --- web/src/app/page.tsx | 127 ++++++------ web/src/components/icons.tsx | 25 ++- web/src/components/live-demo.tsx | 323 +++++++++++++++++++++++++++++++ web/src/components/logo.tsx | 2 +- 4 files changed, 417 insertions(+), 60 deletions(-) create mode 100644 web/src/components/live-demo.tsx diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index 9ced407..d51fb4c 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -2,8 +2,10 @@ import React, { useState, useEffect, useCallback } from "react"; import { motion } from "framer-motion"; +import Image from "next/image"; import { useDoublePress } from "@/hooks/use-double-press"; import { DictationOverlay } from "@/components/dictation-overlay"; +import { LiveDemo } from "@/components/live-demo"; import { Mic, Terminal, @@ -30,9 +32,9 @@ import { Volume2, Sparkles, Heart, + ExternalLink, } from "lucide-react"; import { ThemeToggle } from "@/components/theme-toggle"; -import { VocalinuxLogo } from "@/components/icons"; import SyntaxHighlighter from "react-syntax-highlighter"; import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs"; import { useInView } from "react-intersection-observer"; @@ -170,7 +172,14 @@ export default function HomePage() {