diff --git a/src/App.tsx b/src/App.tsx
index 4d4af40..94fcd4b 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -711,11 +711,19 @@ export default function App() {
// First visit: a short welcome, unless a link already brought them here with a purpose.
const [showOnboarding, setShowOnboarding] = useState(() => {
const params = new URLSearchParams(window.location.search);
+ // ?welcome replays it on purpose (from Settings).
+ if (params.has("welcome")) return true;
return !params.has("challenge") && !params.has("daily") && !params.has("drill") && shouldOnboard();
});
const finishOnboarding = useCallback((choice: OnboardingChoice | null) => {
markOnboarded();
setShowOnboarding(false);
+ if (new URLSearchParams(window.location.search).has("welcome")) {
+ setSearchParams((params) => {
+ params.delete("welcome");
+ return params;
+ }, { replace: true });
+ }
if (choice?.kind === "code") {
if (devCategory !== "public") handleDevCategoryChange("public");
handleLanguageChange(choice.language);
@@ -726,7 +734,7 @@ export default function App() {
handleDevCategoryChange("passages");
}
focusWorkspace();
- }, [devCategory, handleDevCategoryChange, handleLanguageChange, handleTextLanguageChange, focusWorkspace]);
+ }, [devCategory, handleDevCategoryChange, handleLanguageChange, handleTextLanguageChange, focusWorkspace, setSearchParams]);
const handleNextSnippet = useCallback(() => {
setResult(null);
diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx
index 6e73d58..4653454 100644
--- a/src/routes/Settings.tsx
+++ b/src/routes/Settings.tsx
@@ -588,6 +588,9 @@ export default function Settings() {
Esc: restart
Tab: indent / stop
Enter: retry
+
+ Replay welcome tour
+