diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx
index 52a3523..f64e417 100644
--- a/src/components/Layout.tsx
+++ b/src/components/Layout.tsx
@@ -204,7 +204,7 @@ function MobileHeaderUserMenu({
- Wallet
+ Wallet & Stash
diff --git a/src/components/SasquatchGuide.tsx b/src/components/SasquatchGuide.tsx
index 2f96609..91f6835 100644
--- a/src/components/SasquatchGuide.tsx
+++ b/src/components/SasquatchGuide.tsx
@@ -358,7 +358,9 @@ export function SasquatchGuide({ message, onDismiss }: SasquatchGuideProps) {
dragMoved.current = false;
setTimeout(() => setIsDragging(false), 50);
if (!wasDrag) {
+ // Always open the panel — even on pages without a context message
setIsMinimized(false);
+ setIsVisible(true);
}
}, [setIsMinimized]);
@@ -576,16 +578,33 @@ Instructions:
};
}, [handleSendMessage, setIsMinimized]);
- // Show if we have a message prop OR if we've been opened externally
- const shouldShow = !!message || isVisible;
- if (!shouldShow) return null;
+ // The minimized bubble is ALWAYS visible so the user can reopen Sasquatch on any page.
+ // The full panel shows only when there's a message or when opened externally/by user tap.
+ const shouldShowPanel = !!message || isVisible;
const inputDisabled = isThinking;
+ // Build a fallback generic message for pages with no specific context
+ const activeMessage = message ?? {
+ id: 'generic',
+ title: 'SkateSpots Assistant 🦧',
+ message: "Yo! I'm The Sasquatch. Ask me anything about spots, events, coaches, gear, or how the app works. I've got live data from the SkateSpots relay!",
+ context: undefined,
+ suggestedQuestions: [
+ 'Find spots near me',
+ 'Any upcoming events?',
+ 'What is Nostr?',
+ 'How do zaps work?',
+ 'What is My Stash?',
+ 'How to add a spot?',
+ ],
+ enableChat: true,
+ };
+
return (
<>
- {/* ── Minimized bubble — draggable ── */}
- {isMinimized && (
+ {/* ── Minimized bubble — always visible, draggable ── */}
+ {(!shouldShowPanel || isMinimized) && (