From 59c7b84d2322dc8ec8d09975666ec967f3d5f76c Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 06:15:28 +0000 Subject: [PATCH] feat: Add react-joyride guided walkthrough for first-time users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add react-joyride dependency and TypeScript types - Implement GuidedTour component with localStorage state management - Add data-tour attributes to key UI elements (sidebar, search, shortcuts, tools list, main content) - Integrate guided tour into main Layout component - Add keyboard shortcut (⌘⇧?) to manually trigger tour - Update KeyboardShortcuts component to show tour shortcut - Tour automatically shows for first-time users and remembers completion state 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Nadim Tuhin --- package.json | 2 + src/App.tsx | 23 ++++- src/components/GuidedTour.tsx | 147 +++++++++++++++++++++++++++ src/components/KeyboardShortcuts.tsx | 4 + 4 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 src/components/GuidedTour.tsx diff --git a/package.json b/package.json index 5cd95dc..1265bd3 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "prettier": "^3.4.2", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-joyride": "^2.8.2", "react-markdown": "^9.0.3", "react-router-dom": "^7.5.2", "sharp": "^0.33.2", @@ -64,6 +65,7 @@ "@types/papaparse": "^5.3.14", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", + "@types/react-joyride": "^2.0.5", "@types/sharp": "^0.32.0", "@types/uuid": "^9.0.8", "@vitejs/plugin-react": "^4.3.1", diff --git a/src/App.tsx b/src/App.tsx index 6ab9c90..d2b1bf4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -90,6 +90,7 @@ import HtmlMinifyBeautify from "./components/HtmlMinifyBeautify"; import SpotlightSearch from "./components/SpotlightSearch"; import KeyboardShortcuts from "./components/KeyboardShortcuts"; import Credits from "./components/Credits"; +import GuidedTour, { useShouldShowTour } from "./components/GuidedTour"; import { DndContext, closestCenter, @@ -197,6 +198,7 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { const [isSpotlightOpen, setIsSpotlightOpen] = useState(false); const [isShortcutsOpen, setIsShortcutsOpen] = useState(false); const [isSidebarExpanded, setIsSidebarExpanded] = useState(true); + const { shouldShow: shouldShowTour, setShouldShow: setShowTour } = useShouldShowTour(); const [tools, setTools] = useState(() => { const savedOrder = localStorage.getItem("toolsOrder"); if (savedOrder) { @@ -236,6 +238,11 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { e.preventDefault(); setIsShortcutsOpen(true); } + // Command/Control + Shift + ? for tour + if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key === "?") { + e.preventDefault(); + setShowTour(true); + } }; document.addEventListener("keydown", handleKeyDown); @@ -289,6 +296,7 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { DevUtils @@ -308,6 +316,7 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { onClick={() => setIsSpotlightOpen(true)} className="p-1.5 hover:bg-gray-100 rounded" title="Search (⌘K)" + data-tour="search-button" > @@ -315,6 +324,7 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { onClick={() => setIsShortcutsOpen(true)} className="p-1.5 hover:bg-gray-100 rounded" title="Keyboard Shortcuts (⌘?)" + data-tour="shortcuts-button" > @@ -322,6 +332,7 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { onClick={() => setIsSidebarExpanded(false)} className="p-1.5 hover:bg-gray-100 rounded" title="Collapse Sidebar" + data-tour="sidebar-toggle" > @@ -330,7 +341,7 @@ function Layout({ tools: defaultTools }: { tools: Tool[] }) { {isSidebarExpanded && ( -
+ -