Skip to content

Commit 5aa98b4

Browse files
beautyfreeclaude
andcommitted
feat(onboarding): add informational wizard with Skiller branding
Replace the old transactional install-skills step with a four-step informational tour: welcome (logo + tagline) → detected agents → Marketplace teaser → done with CTA cards (Manage skills / Marketplace / Projects). Pick-whatever-fits copy instead of pushing new users into installs they can't yet evaluate. Branding: adds skiller-mark.png (rabbit) + "Skiller" wordmark styled to match the h2 hierarchy, drops the Sparkles icon that clashed with the character-heavy logo. - Logo + tagline: "Your skills HQ for every SKILL.md" - Focus-word highlighting in primary color for scannability - Lazy-loads SKILL.md descriptions for the Marketplace teaser so the user sees what's actually in each skill before deciding to visit Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 40995c4 commit 5aa98b4

3 files changed

Lines changed: 484 additions & 0 deletions

File tree

src/mainview/App.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import SkillsManager from './pages/SkillsManager'
99
import Marketplace from './pages/Marketplace'
1010
import ProjectsPage from './pages/Projects'
1111
import SettingsPage from './pages/Settings'
12+
import OnboardingWizard from './components/OnboardingWizard'
1213
import { useTheme } from './hooks/useTheme'
1314
import CloseConfirmDialog from './components/CloseConfirmDialog'
1415

@@ -17,6 +18,25 @@ function AppInner() {
1718
const { i18n } = useTranslation()
1819
useTheme()
1920
const [closeDialogOpen, setCloseDialogOpen] = useState(false)
21+
// Onboarding shows on very first launch (or when user explicitly replays it
22+
// from Settings). Guarded by a localStorage flag — we respect privacy mode
23+
// by falling back to "not done" if storage throws, which still shows once.
24+
const [onboardingOpen, setOnboardingOpen] = useState(() => {
25+
try {
26+
return localStorage.getItem('skiller.onboarding.done') !== '1'
27+
} catch {
28+
return true
29+
}
30+
})
31+
32+
useEffect(() => {
33+
const handler = (event: Event) => {
34+
const detail = (event as CustomEvent<{ force?: boolean }>).detail
35+
if (detail?.force) setOnboardingOpen(true)
36+
}
37+
window.addEventListener('skiller:open-onboarding', handler)
38+
return () => window.removeEventListener('skiller:open-onboarding', handler)
39+
}, [])
2040

2141
// macOS Electrobun: translucent shell when native blur is on (see shell_runtime + macos-window-effects.ts)
2242
useEffect(() => {
@@ -115,6 +135,9 @@ function AppInner() {
115135
open={closeDialogOpen}
116136
onDone={() => setCloseDialogOpen(false)}
117137
/>
138+
{onboardingOpen && (
139+
<OnboardingWizard onClose={() => setOnboardingOpen(false)} />
140+
)}
118141
<Routes>
119142
{/* Electrobun / file URLs often use .../index.html as the pathname; SPA routes are /. */}
120143
<Route path="/index.html" element={<Navigate to="/" replace />} />
26.1 KB
Loading

0 commit comments

Comments
 (0)