""" Configuration and constants for Tesla Coil Spark Course application """ from pathlib import Path # ============================================================================ # Paths # ============================================================================ # Base directory (spark-lessons/) BASE_DIR = Path(__file__).parent.parent # Content directories LESSONS_DIR = BASE_DIR / 'lessons' EXERCISES_DIR = BASE_DIR / 'exercises' REFERENCE_DIR = BASE_DIR / 'reference' WORKED_EXAMPLES_DIR = BASE_DIR / 'worked-examples' ASSETS_DIR = BASE_DIR / 'assets' # Course structure COURSE_JSON = BASE_DIR / 'course.json' # Resources RESOURCES_DIR = BASE_DIR / 'resources' STYLES_DIR = RESOURCES_DIR / 'styles' ICONS_DIR = RESOURCES_DIR / 'icons' DATABASE_DIR = RESOURCES_DIR / 'database' SYMBOLS_JSON = RESOURCES_DIR / 'symbols_definitions.json' IMAGES_DIR = ASSETS_DIR / 'images' # User data (created in user's home directory) USER_HOME = Path.home() USER_DATA_DIR = USER_HOME / '.tesla_spark_course' USER_DATA_DIR.mkdir(exist_ok=True) DATABASE_PATH = USER_DATA_DIR / 'progress.db' USER_NOTES_DIR = USER_DATA_DIR / 'notes' USER_NOTES_DIR.mkdir(exist_ok=True) # ============================================================================ # Application Constants # ============================================================================ APP_NAME = "Tesla Coil Spark Physics Course" APP_VERSION = "1.0.0" APP_AUTHOR = "Tesla Coil Community" # ============================================================================ # UI Constants # ============================================================================ # Window dimensions DEFAULT_WINDOW_WIDTH = 1400 DEFAULT_WINDOW_HEIGHT = 900 MIN_WINDOW_WIDTH = 1000 MIN_WINDOW_HEIGHT = 600 # Panel sizes NAVIGATION_PANEL_MIN_WIDTH = 250 NAVIGATION_PANEL_DEFAULT_WIDTH = 300 PROGRESS_PANEL_MIN_WIDTH = 280 PROGRESS_PANEL_DEFAULT_WIDTH = 320 CONTENT_PANEL_MIN_WIDTH = 600 # Font sizes FONT_SIZE_SMALL = 10 FONT_SIZE_NORMAL = 12 FONT_SIZE_LARGE = 14 FONT_SIZE_TITLE = 16 # Colors (light theme) COLOR_PRIMARY = "#3498db" # Blue COLOR_SECONDARY = "#9b59b6" # Purple COLOR_SUCCESS = "#27ae60" # Green COLOR_WARNING = "#f39c12" # Orange COLOR_DANGER = "#e74c3c" # Red COLOR_ERROR = "#e74c3c" # Red (alias) COLOR_INFO = "#2ecc71" # Light green COLOR_BACKGROUND = "#ffffff" # White COLOR_PANEL_BACKGROUND = "#f8f9fa" # Light gray COLOR_TEXT = "#2c3e50" # Dark blue-gray COLOR_TEXT_SECONDARY = "#7f8c8d" # Gray COLOR_BORDER = "#dee2e6" # Light border COLOR_HIGHLIGHT = "#e3f2fd" # Light blue # Status colors COLOR_STATUS_COMPLETE = "#27ae60" # Green COLOR_STATUS_IN_PROGRESS = "#f39c12" # Orange COLOR_STATUS_NOT_STARTED = "#95a5a6" # Gray COLOR_STATUS_LOCKED = "#bdc3c7" # Light gray # Progress bar colors COLOR_PROGRESS_BG = "#ecf0f1" COLOR_PROGRESS_FG = "#3498db" COLOR_PROGRESS_COMPLETE = "#2ecc71" # ============================================================================ # Course Constants # ============================================================================ TOTAL_LESSONS = 30 TOTAL_EXERCISES = 18 TOTAL_POINTS = 525 TOTAL_PARTS = 4 # Difficulty levels DIFFICULTY_BEGINNER = "beginner" DIFFICULTY_INTERMEDIATE = "intermediate" DIFFICULTY_ADVANCED = "advanced" DIFFICULTY_COLORS = { DIFFICULTY_BEGINNER: "#2ecc71", # Green DIFFICULTY_INTERMEDIATE: "#f39c12", # Orange DIFFICULTY_ADVANCED: "#e74c3c" # Red } # Lesson status STATUS_NOT_STARTED = "not_started" STATUS_IN_PROGRESS = "in_progress" STATUS_COMPLETED = "completed" # Status icons (Unicode) ICON_COMPLETE = "โœ“" ICON_IN_PROGRESS = "โŠ™" ICON_NOT_STARTED = "โ—‹" ICON_LOCKED = "๐Ÿ”’" ICON_EXERCISE = "โšก" ICON_BOOKMARK = "โญ" # ============================================================================ # Progress & Gamification Constants # ============================================================================ # Level thresholds (points) LEVELS = [ (0, "Novice", "Circuit Curious"), (100, "Learner", "Circuit Explorer"), (250, "Practitioner", "Circuit Master"), (400, "Expert", "Tesla Scholar"), ] # Achievement definitions ACHIEVEMENTS = { 'quick_learner': { 'name': 'Quick Learner', 'description': 'Complete first lesson in under 15 minutes', 'icon': '๐Ÿ†', 'condition': 'first_lesson_under_15min' }, 'accuracy_master': { 'name': 'Accuracy Master', 'description': 'Maintain 85%+ average on exercises', 'icon': '๐ŸŽฏ', 'condition': 'exercise_avg_85_percent' }, 'bookworm': { 'name': 'Bookworm', 'description': 'Complete Part 1 in under 3 hours', 'icon': '๐Ÿ“š', 'condition': 'part1_under_3hours' }, 'streak_master': { 'name': 'Streak Master', 'description': 'Study for 7 consecutive days', 'icon': '๐Ÿ”ฅ', 'condition': 'streak_7_days' }, 'lab_rat': { 'name': 'Lab Rat', 'description': 'Complete 5 exercises with perfect scores', 'icon': '๐Ÿงช', 'condition': 'perfect_5_exercises' }, 'insight': { 'name': 'Insight', 'description': 'Average fewer than 2 hints per exercise', 'icon': '๐Ÿ’ก', 'condition': 'avg_hints_under_2' }, 'power_user': { 'name': 'Power User', 'description': 'Use 10+ keyboard shortcuts', 'icon': 'โšก', 'condition': 'shortcuts_10_plus' }, 'graduate': { 'name': 'Graduate', 'description': 'Complete all 30 lessons', 'icon': '๐ŸŽ“', 'condition': 'all_lessons_complete' }, } # ============================================================================ # Auto-save Settings # ============================================================================ AUTO_SAVE_INTERVAL = 10000 # milliseconds (10 seconds) PROGRESS_UPDATE_INTERVAL = 1000 # milliseconds (1 second for time tracking) # ============================================================================ # Markdown Rendering # ============================================================================ # MathJax CDN MATHJAX_CDN = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" # Markdown extensions MARKDOWN_EXTENSIONS = [ 'extra', 'codehilite', 'tables', 'toc', 'pymdownx.arithmatex', 'pymdownx.superfences', 'pymdownx.highlight', ] # ============================================================================ # Keyboard Shortcuts # ============================================================================ SHORTCUTS = { 'next_lesson': 'Ctrl+Right', 'prev_lesson': 'Ctrl+Left', 'first_lesson': 'Ctrl+Home', 'last_lesson': 'Ctrl+End', 'search': 'Ctrl+F', 'bookmark': 'Ctrl+B', 'mark_complete': 'Ctrl+M', 'exercises': 'Ctrl+E', 'references': 'Ctrl+R', 'notes': 'Ctrl+N', 'dashboard': 'Ctrl+P', 'fullscreen': 'F11', 'quit': 'Ctrl+Q', } # ============================================================================ # Default User Settings # ============================================================================ DEFAULT_SETTINGS = { 'theme': 'light', 'font_size': FONT_SIZE_NORMAL, 'auto_save': True, 'show_hints': True, 'learning_path': 'intermediate', 'auto_mark_complete': True, # Auto-mark at 95% scroll 'sound_effects': False, } # ============================================================================ # Debug Mode # ============================================================================ DEBUG = True # Set to False for production VERBOSE_LOGGING = DEBUG