8c56921375
Bespoke spotlight walkthrough (no new deps) that guides new users through the main features. A version-stamped invite bubble offers the tour to new users and re-offers it once to existing users after an upgrade; restartable from Settings. - Multi-hole SVG-mask overlay keeps a ringed control and any open modal lit - Steps: scan, scan history, inventory, nodes, edit, text/zone, grouping, style, imports, and a closing recap with a GitHub link - Scan/history/inventory/import steps inject demo data (no backend calls) and are filtered out in standalone, which ends on a full-mode recap - Persisted invite state via localStorage (utils/walkthrough.ts), live tour state via zustand (stores/walkthroughStore.ts) ha-relevant: maybe
28 lines
1.0 KiB
TypeScript
28 lines
1.0 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { getSteps, STEPS } from '../steps'
|
|
|
|
describe('getSteps', () => {
|
|
it('returns every step in full mode', () => {
|
|
expect(getSteps(false)).toHaveLength(STEPS.length)
|
|
})
|
|
|
|
it('drops backend-only (mode:full) steps in standalone', () => {
|
|
const standalone = getSteps(true)
|
|
expect(standalone.every((s) => s.mode !== 'full')).toBe(true)
|
|
expect(standalone.length).toBeLessThan(STEPS.length)
|
|
const ids = standalone.map((s) => s.id)
|
|
// Canvas-only steps survive; backend-only steps are filtered out.
|
|
expect(ids).toEqual(expect.arrayContaining(['welcome', 'nodes', 'grouping', 'style', 'end']))
|
|
expect(ids).not.toContain('scan')
|
|
expect(ids).not.toContain('scan-history')
|
|
expect(ids).not.toContain('inventory')
|
|
expect(ids).not.toContain('imports')
|
|
})
|
|
|
|
it('ends on a step with a GitHub link (the full-mode recap in standalone)', () => {
|
|
const last = getSteps(true).at(-1)
|
|
expect(last?.id).toBe('end')
|
|
expect(last?.link?.href).toContain('github.com')
|
|
})
|
|
})
|