Skip to content

feat(admin): guided editor tour + onboarding checklist rework - #406

Open
Snoe0 wants to merge 21 commits into
CoreBunch:mainfrom
Snoe0:feat/editor-onboarding-tour
Open

feat(admin): guided editor tour + onboarding checklist rework#406
Snoe0 wants to merge 21 commits into
CoreBunch:mainfrom
Snoe0:feat/editor-onboarding-tour

Conversation

@Snoe0

@Snoe0 Snoe0 commented Aug 18, 2026

Copy link
Copy Markdown

What changed

  • Added a first-run guided tour to the Site editor: a seven-step coach-mark
    walkthrough (welcome → Explorer → new page → modules → Properties panel →
    Framework panel → publish), built on a new generic, reusable tour engine
    (src/admin/shared/tour/ — step definitions, a small Zustand store, and an
    SVG-spotlight overlay renderer) with the Site-specific steps layered on top
    (src/admin/pages/site/tour/).
  • The tour auto-starts once per user the first time they open the Site
    editor, and persists its outcome (completed / dismissed) as a
    server-backed editor-tour user preference so it never reappears
    uninvited.
  • The tour replays anytime, regardless of a previously persisted outcome,
    from two entry points: the command palette ("Take the editor tour", ⌘K)
    and the dashboard onboarding checklist.
  • Reworked the dashboard onboarding checklist: removed the "Install a
    plugin" step (a dead end — the plugin registry doesn't exist yet) and
    replaced it with "Tour the editor" at position 3, wired to the new tour.
  • Made the checklist's "Create your first page" CTA actually teach where
    pages are created: it lands in the editor with the Explorer's Site tab
    open and a short attention pulse on the New page button (a new
    site.revealNewPage pending action), instead of a bare navigation.
  • Reworked the checklist's "Invite your team" step into "View your team &
    roles": its CTA opens the Users page pre-selected on the Roles tab (new
    users.viewRoles pending action), and visiting that tab is what
    completes the step — persisted as a new set-once team-roles-viewed
    user preference. Viewing the team is the step; inviting members is
    optional, so headcount deliberately no longer matters.
  • Fixed the Spotlight command palette's workspace classification
    (workspaceFromPathname) so Dashboard, AI, and plugin-page routes report
    their real workspace instead of falling through to Site — needed for
    cross-workspace commands like "Take the editor tour" to correctly detect
    whether they're already on the Site editor.
  • Added end-to-end coverage for the tour's auto-start, skip, and replay
    flows, and updated the docs that describe the feature (docs/editor.md,
    new docs/features/editor-tour.md, docs/features/dashboard.md,
    docs/features/spotlight.md, docs/reference/persistence-keys.md,
    docs/reference/design-tokens.md, docs/e2e/feature-matrix.md).

Why

Part of #223 (the step-copy fix itself is in #286; this PR is the broader
onboarding work from that thread). The reporter and @DavidBabinec (maintainer) flagged that the
dashboard onboarding checklist gives new users mixed signals and includes a
step (installing a plugin) that doesn't belong before a plugin registry
exists. @DavidBabinec invited me to take on the broader onboarding work in
that thread ("it's time to work on it ... would be great you could help
out"). Reading through the editor cold, the checklist's biggest gap wasn't
wording — it's that a brand-new user has no guided path through the editor
itself (pages, modules, properties, framework variables, publish) before
being asked to do any of those five setup steps. This PR adds that guided
path and folds the plugin-step removal into the same checklist rework, since
both land in the same file and the same review pass.

The plugin-step removal itself was already agreed in #223 between
@AidanAJoyce and @Varshavia, who'd offered to make that specific change
separately. It's included here as a courtesy — @Varshavia, if you'd already
started on it locally, sorry for the overlap; happy to rebase around
whichever lands first.

User impact

  • New users get an in-editor guided tour on first visit instead of being
    dropped into an empty canvas with no orientation.
  • The tour is skippable at any point (Skip tour button, or Escape) and never
    reappears once skipped or finished — it doesn't nag.
  • Anyone can replay it later — new team members, or a user who skipped it
    the first time — from the command palette or the dashboard checklist.
  • The onboarding checklist no longer sends users shopping for plugins that
    don't exist yet.
  • Checklist CTAs now land users somewhere actionable: "Create your first
    page" points at the actual New page button, and "View roles" opens the
    Roles tab it's asking them to explore.

Verification

bun test        # 6662 pass, 0 fail
bun run build   # tsc -b && vite build — clean
bun run lint    # eslint — clean

E2E (not run as part of this gate — Playwright suite is exercised
separately): tests/e2e/editor-tour.e2e.ts covers auto-start-to-completion,
skip-and-persist, and command-palette replay (TOUR-001–TOUR-003 in
docs/e2e/feature-matrix.md); dashboard.e2e.ts covers the reworked
checklist (DASH-003).

Snoe0 added 21 commits August 14, 2026 10:35
…kspace-scoped commands

workspaceFromPathname() only recognized content/data/media/plugins/
users/account and defaulted everything else — including /admin/dashboard
and /admin/ai — to 'site'. That let site-only commands (layers, panels,
framework, preview, ...) leak into workspaces with no open editor, and
made cross-workspace commands like "Take the editor tour" think they
were already on the Site workspace instead of queuing their navigate.
capabilities.e2e.ts and ai.e2e.ts create their own throwaway personas and
drive them into the Site editor via a local openReadableSiteEditor helper.
Those personas never touch the central seeding in account-persona.setup.ts,
so they were genuine first-run users — the tour's fixed inset-0 backdrop
would intercept their subsequent clicks. Seed 'completed' at the top of
each file's openReadableSiteEditor, before the first /admin/site visit.
Moves workspaceFromPathname out of SpotlightRoot.tsx into its own module
(same reason spotlightContext.ts is split out: react-refresh/only-export-
components wants .tsx files to only export components) so it's a plain,
directly testable export. Adds one case per AdminWorkspace plus the
dashboard catch-all, covering the branches the prior fix commit touched.
The coach-mark bubble was remounted via key={stepIndex} on every step,
so it always popped in fresh at (0, 0) before its position was
computed instead of moving from the previous step's position to the
next. TourOverlayInner now owns a single persistent bubble + backdrop
for the whole tour run; the per-step key={stepIndex} logic becomes a
non-visual TourStepResolver that reports {step, anchorEl} upward once
resolved, so the bubble keeps showing the previous step's content in
place while the next one resolves and transitions smoothly via CSS
once it lands. Centered steps now compute a pixel position too instead
of a CSS top:50% override, so they animate the same way.
User feedback: the framework step showed the panel but never told
people to click the rail icon to get there. Anchor the step on
panel-rail-framework (the left-rail icon) instead of framework-panel,
keep prepare() opening the panel so it's visible next to the spotlit
icon, and lead the copy with "click this icon" instead of describing
the panel as already open. The icon's deterministic rail accent
resolves to 'violet' (var(--accent-9)), which renders as magenta/
fuchsia rather than purple, so the copy names that color instead.
…pletes the team step on viewing roles

The dashboard checklist's "Create your first page" CTA now queues a
site.revealNewPage pending action: the editor opens the Explorer's Site
tab and plays a short achromatic attention pulse on the New page button,
showing the user where pages are created instead of bare-navigating.

The "Invite your team" step becomes "View your team & roles": its CTA
queues users.viewRoles so UsersPage lands on the Roles tab, and visiting
that tab writes a new set-once team-roles-viewed user preference, which
is what completes the step (headcount no longer matters — viewing the
team is the step, inviting is optional).
@Snoe0
Snoe0 marked this pull request as ready for review August 18, 2026 20:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant