diff --git a/apps/web/src/components/practice/CelebrationProgressionBanner.stories.tsx b/apps/web/src/components/practice/CelebrationProgressionBanner.stories.tsx new file mode 100644 index 00000000..60f03bae --- /dev/null +++ b/apps/web/src/components/practice/CelebrationProgressionBanner.stories.tsx @@ -0,0 +1,728 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { useEffect, useState } from 'react' +import type { ProgressionMode } from '@/lib/curriculum/session-mode' +import { css } from '../../../styled-system/css' +import { CelebrationProgressionBanner } from './CelebrationProgressionBanner' + +// ============================================================================= +// Mock Data +// ============================================================================= + +const mockProgressionMode: ProgressionMode = { + type: 'progression', + nextSkill: { skillId: 'add-5-complement-3', displayName: '+5 − 3', pKnown: 0 }, + phase: { + id: 'L1.add.+5-3.five', + levelId: 1, + operation: 'addition', + targetNumber: 2, + usesFiveComplement: true, + usesTenComplement: false, + name: 'Five-Complement Addition', + description: 'Learn to add using five-complement technique', + primarySkillId: 'add-5-complement-3', + order: 5, + }, + tutorialRequired: true, + skipCount: 0, + focusDescription: 'Learning: +5 − 3', +} + +// ============================================================================= +// Helper to clear localStorage for fresh celebrations +// ============================================================================= + +function clearCelebrationState() { + if (typeof window !== 'undefined') { + localStorage.removeItem('skill-celebration-state') + } +} + +// ============================================================================= +// Wrapper Components for Stories +// ============================================================================= + +interface StoryWrapperProps { + children: React.ReactNode + isDark?: boolean +} + +function StoryWrapper({ children, isDark = false }: StoryWrapperProps) { + return ( +
+ At {speed}x, the full 60-second transition takes {Math.round(60 / speed)} seconds +
++ Confetti should fire once when this story loads +
++ Drag the slider to see the transition at any point +
++ {mode.tutorialRequired ? 'New Skill Unlocked: ' : 'Ready to practice: '} + {mode.nextSkill.displayName} +
++ {mode.tutorialRequired ? 'Ready to start the tutorial' : 'Continue building mastery'} +
+