riffscore 1.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/index.d.mts +341 -0
- package/dist/index.d.ts +341 -0
- package/dist/index.js +13793 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13761 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/utils/mergeConfig.ts","../src/utils/generateScore.ts","../src/hooks/useRiffScore.ts","../src/themes.ts","../src/config.ts","../src/constants.ts","../src/utils/debug.ts","../src/engines/ScoreEngine.ts","../src/hooks/useScoreEngine.ts","../src/hooks/useEditorTools.ts","../src/commands/MeasureCommands.ts","../src/commands/TogglePickupCommand.ts","../src/commands/SetGrandStaffCommand.ts","../src/constants/SMuFL.ts","../src/services/MusicService.ts","../src/utils/core.ts","../src/commands/SetTimeSignatureCommand.ts","../src/commands/SetKeySignatureCommand.ts","../src/hooks/useMeasureActions.ts","../src/utils/interaction.ts","../src/utils/validation.ts","../src/engines/toneEngine.ts","../src/utils/commandHelpers.ts","../src/commands/AddEventCommand.ts","../src/commands/AddNoteToEventCommand.ts","../src/commands/DeleteNoteCommand.ts","../src/commands/DeleteEventCommand.ts","../src/commands/ChangePitchCommand.ts","../src/hooks/useNoteActions.ts","../src/commands/UpdateEventCommand.ts","../src/commands/UpdateNoteCommand.ts","../src/hooks/useModifiers.ts","../src/commands/TransposeSelectionCommand.ts","../src/hooks/useNavigation.ts","../src/commands/TupletCommands.ts","../src/commands/RemoveTupletCommand.ts","../src/hooks/useTupletActions.ts","../src/utils/selection.ts","../src/hooks/useSelection.ts","../src/hooks/useEditorMode.ts","../src/utils/focusScore.ts","../src/hooks/useScoreLogic.ts","../src/commands/SetSingleStaffCommand.ts","../src/context/ScoreContext.tsx","../src/context/ThemeContext.tsx","../src/hooks/handlers/handlePlayback.ts","../src/hooks/handlers/handleNavigation.ts","../src/commands/ToggleRestCommand.ts","../src/hooks/handlers/handleMutation.ts","../src/hooks/useKeyboardShortcuts.ts","../src/services/TimelineService.ts","../src/hooks/usePlayback.ts","../src/engines/midiEngine.ts","../src/hooks/useMIDI.ts","../src/hooks/useScoreInteraction.ts","../src/hooks/useSamplerStatus.ts","../src/hooks/useModifierKeys.ts","../src/commands/UpdateTitleCommand.ts","../src/hooks/useTitleEditor.ts","../src/engines/layout/positioning.ts","../src/engines/layout/stems.ts","../src/engines/layout/beaming.ts","../src/engines/layout/tuplets.ts","../src/engines/layout/measure.ts","../src/engines/layout/system.ts","../src/utils/accidentalContext.ts","../src/hooks/useAccidentalContext.ts","../src/hooks/useMeasureLayout.ts","../src/hooks/useMeasureInteraction.ts","../src/hooks/usePreviewRender.ts","../src/components/Canvas/Note.tsx","../src/components/Canvas/Stem.tsx","../src/components/Canvas/Flags.tsx","../src/components/Canvas/ChordGroup.tsx","../src/components/Canvas/Rest.tsx","../src/components/Canvas/GhostPreview.tsx","../src/components/Canvas/Beam.tsx","../src/components/Canvas/TupletBracket.tsx","../src/components/Canvas/Measure.tsx","../src/components/Canvas/Tie.tsx","../src/components/Canvas/ScoreHeader.tsx","../src/components/Canvas/Staff.tsx","../src/hooks/useAutoScroll.ts","../src/hooks/useGrandStaffLayout.ts","../src/hooks/useDragToSelect.ts","../src/components/Assets/GrandStaffBracket.tsx","../src/components/Canvas/ScoreCanvas.tsx","../src/hooks/useFocusTrap.ts","../src/commands/LoadScoreCommand.ts","../src/components/Assets/ClefIcon.tsx","../src/components/Layout/Portal.tsx","../src/components/Toolbar/Menus/DropdownOverlay.tsx","../src/components/Toolbar/Menus/ClefOverlay.tsx","../src/components/Toolbar/Menus/KeySignatureOverlay.tsx","../src/components/Toolbar/Menus/TimeSignatureOverlay.tsx","../src/components/Toolbar/ToolbarButton.tsx","../src/components/Toolbar/StaffControls.tsx","../src/components/Assets/NoteIcon.tsx","../src/components/Assets/RestIcon.tsx","../src/components/Toolbar/DurationControls.tsx","../src/components/Assets/TieIcon.tsx","../src/components/Toolbar/ModifierControls.tsx","../src/components/Toolbar/AccidentalControls.tsx","../src/components/Toolbar/MeasureControls.tsx","../src/components/Toolbar/TupletControls.tsx","../src/components/Toolbar/MelodyLibrary.tsx","../src/components/Toolbar/InputModeToggle.tsx","../src/exporters/jsonExporter.ts","../src/exporters/abcExporter.ts","../src/exporters/musicXmlExporter.ts","../src/hooks/useExport.ts","../src/components/Toolbar/FileMenu.tsx","../src/components/Toolbar/HistoryControls.tsx","../src/components/Toolbar/InstrumentSelector.tsx","../src/components/Toolbar/PlaybackControls.tsx","../src/components/Toolbar/Divider.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Layout/ScoreTitleField.tsx","../src/components/Layout/Overlays/ShortcutsOverlay.tsx","../src/components/Layout/Overlays/ConfirmDialog.tsx","../src/data/melodies.ts","../src/components/Layout/ScoreEditor.tsx","../src/RiffScore.tsx","../demo/app/ConfigMenu.tsx"],"names":["LogLevel","useState","Key","useCallback","start","Note","TonalNote","newStaves","targetNoteId","measure","event","useMemo","lastEvent","useRef","useEffect","React","createContext","jsx","useContext","state","_a","MIN_WIDTH_FACTORS","ratio","ACCIDENTAL_PADDING","jsxs","_b","Staff","Fragment","forwardRef","Music","Check","useImperativeHandle","BookOpen","X"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ThemeName } from './themes';\n\n/**\n * Type definitions for the Sheet Music Editor\n *\n * This file defines the data model for scores, staves, measures, events, and notes.\n * The model supports multiple staves for Grand Staff rendering.\n */\n\n// ========== NOTE ==========\n\nexport interface Note {\n id: string | number;\n pitch: string | null; // e.g., 'C4', 'D#5', 'Bb3', or null for rests\n accidental?: 'sharp' | 'flat' | 'natural' | null;\n tied?: boolean; // Tied to next note\n isRest?: boolean; // True for rest notes (pitchless)\n}\n\n// ========== EVENT ==========\n\nexport interface ScoreEvent {\n id: string | number;\n duration: string; // 'whole', 'half', 'quarter', etc.\n dotted: boolean;\n notes: Note[]; // Multiple notes = chord\n isRest?: boolean;\n tuplet?: {\n ratio: [number, number]; // e.g., [3, 2] for triplet (3 notes in space of 2)\n groupSize: number; // Total notes in tuplet group (e.g., 3 for triplet)\n position: number; // Position within tuplet (0, 1, 2 for triplet)\n baseDuration?: string; // Base duration of the tuplet (e.g., 'eighth' for eighth note triplet)\n id?: string; // Unique ID for the tuplet group\n };\n}\n\n// ========== MEASURE ==========\n\nexport interface Measure {\n id: string | number;\n events: ScoreEvent[];\n isPickup?: boolean;\n}\n\n// ========== STAFF ==========\n\nexport interface Staff {\n id: string | number;\n clef: 'treble' | 'bass' | 'grand';\n keySignature: string; // e.g., 'C', 'G', 'F', 'Bb'\n measures: Measure[];\n}\n\n// ========== SCORE ==========\n\nexport interface Score {\n title: string;\n timeSignature: string; // Shared across staves (e.g., '4/4', '3/4')\n keySignature: string; // Shared across staves (e.g., 'C', 'G')\n bpm: number;\n staves: Staff[];\n}\n\n// ========== HELPER FUNCTIONS ==========\n\n/**\n * Creates a default empty score with a single treble staff\n */\nexport const createDefaultScore = (): Score => ({\n title: 'Composition',\n timeSignature: '4/4',\n keySignature: 'C',\n bpm: 120,\n staves: [\n {\n id: 'staff-1',\n clef: 'treble',\n keySignature: 'C',\n measures: [\n { id: 'm1', events: [] },\n { id: 'm2', events: [] },\n ],\n },\n {\n id: 'staff-2',\n clef: 'bass',\n keySignature: 'C',\n measures: [\n { id: 'm1-bass', events: [] },\n { id: 'm2-bass', events: [] },\n ],\n },\n ],\n});\n\n/**\n * Gets the active staff from a score (currently always the first staff)\n * In future, this could support staff switching for Grand Staff editing\n */\nexport const getActiveStaff = (score: Score, staffIndex: number = 0): Staff => {\n return score.staves[staffIndex] || score.staves[0];\n};\n\n/**\n * Migrates an old-format score to the new staves model\n * Also syncs top-level legacy fields (measures, keySignature, clef) back to staves[0]\n */\nexport const migrateScore = (oldScore: any): Score => {\n // If already in new format with staves\n if (oldScore.staves && Array.isArray(oldScore.staves)) {\n // Sync any top-level legacy fields back to staves[0]\n // This handles the case where code does: setScore({ ...score, measures: newMeasures })\n const result = { ...oldScore };\n\n // Ensure Score has keySignature\n if (!result.keySignature) {\n result.keySignature = result.staves[0]?.keySignature || 'C';\n }\n\n if (result.staves[0]) {\n const updatedStaff = { ...result.staves[0] };\n // If top-level measures exists and differs from staves[0].measures, use top-level\n if (oldScore.measures && oldScore.measures !== result.staves[0].measures) {\n updatedStaff.measures = oldScore.measures;\n }\n // If top-level keySignature exists and differs, use top-level\n if (oldScore.keySignature && oldScore.keySignature !== result.staves[0].keySignature) {\n updatedStaff.keySignature = oldScore.keySignature;\n result.keySignature = oldScore.keySignature; // Sync to Score\n }\n // If top-level clef exists and differs, use top-level\n if (oldScore.clef && oldScore.clef !== result.staves[0].clef) {\n updatedStaff.clef = oldScore.clef;\n }\n\n // Sync timeSignature from staff to score if score is missing it (common in imported melodies)\n if (!result.timeSignature && updatedStaff.timeSignature) {\n result.timeSignature = updatedStaff.timeSignature;\n }\n\n result.staves = [updatedStaff, ...result.staves.slice(1)];\n }\n return result as Score;\n }\n\n // Migrate legacy single-staff format (no staves array)\n return {\n title: oldScore.title || 'Composition',\n timeSignature: oldScore.timeSignature || '4/4',\n keySignature: oldScore.keySignature || 'C',\n bpm: oldScore.bpm || 120,\n staves: [\n {\n id: 'staff-1',\n clef: oldScore.clef || 'treble',\n keySignature: oldScore.keySignature || 'C',\n measures: oldScore.measures || [\n { id: 'm1', events: [] },\n { id: 'm2', events: [] },\n ],\n },\n ],\n };\n};\n\n// ========== MELODY ==========\n\nexport interface Melody {\n id: string;\n title: string;\n score: any;\n}\n\n// ========== SELECTION ==========\n\n/**\n * Represents the current selection state in the editor.\n * Supports Grand Staff by tracking which staff is selected.\n */\nexport interface Selection {\n staffIndex: number; // Index of the selected staff (0 for single staff, 0 or 1 for Grand Staff)\n measureIndex: number | null; // Index of the selected measure\n eventId: string | number | null; // ID of the selected event\n noteId: string | number | null; // ID of the selected note (for chords)\n selectedNotes: Array<{\n // List of all selected notes (including the primary one above)\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n noteId: string | number | null;\n }>;\n anchor?: {\n // The static \"anchor\" point for range selection\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n noteId: string | number | null;\n } | null;\n}\n\n/**\n * Creates a default empty selection\n */\nexport const createDefaultSelection = (): Selection => ({\n staffIndex: 0,\n measureIndex: null,\n eventId: null,\n noteId: null,\n selectedNotes: [],\n anchor: null,\n});\n\n// ========== RIFFSCORE CONFIG ==========\n\n/**\n * Utility type for allowing partial nested objects\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Staff template options for score generation\n */\nexport type StaffTemplate = 'grand' | 'treble' | 'bass';\n\n/**\n * Configuration interface for RiffScore component.\n * Supports two modes:\n * - Generator Mode: Pass `staff` + `measureCount` to create blank scores\n * - Render Mode: Pass `staves` array to load existing compositions\n */\n/**\n * Configuration interface for RiffScore component.\n * Supports two modes:\n * - Generator Mode: Pass `staff` + `measureCount` to create blank scores\n * - Render Mode: Pass `staves` array to load existing compositions\n */\nexport interface RiffScoreConfig {\n ui: {\n showToolbar: boolean;\n scale: number;\n theme?: ThemeName;\n };\n interaction: {\n isEnabled: boolean; // Master switch for all interactions\n enableKeyboard: boolean;\n enablePlayback: boolean;\n };\n score: {\n title: string;\n bpm: number;\n timeSignature: string;\n keySignature: string;\n\n // Generator Mode Options\n staff?: StaffTemplate;\n measureCount?: number;\n\n // Explicit Content (Overrides Generator Options)\n staves?: Staff[];\n };\n}\n\n/**\n * Default RiffScore configuration\n */\nexport const DEFAULT_RIFF_CONFIG: RiffScoreConfig = {\n ui: {\n showToolbar: true,\n scale: 1,\n },\n interaction: {\n isEnabled: true,\n enableKeyboard: true,\n enablePlayback: true,\n },\n score: {\n title: 'Untitled',\n bpm: 120,\n timeSignature: '4/4',\n keySignature: 'C',\n staff: 'grand',\n measureCount: 4,\n },\n};\n","/**\n * Config Merging Utility\n *\n * Deep merge utility for merging partial RiffScore configs with defaults.\n */\n\nimport { RiffScoreConfig, DeepPartial, DEFAULT_RIFF_CONFIG } from '@/types';\n\n/**\n * Checks if a value is a plain object (not array, null, or other type)\n */\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/**\n * Deep merges source into target, with source values overriding target.\n * Only handles plain objects; arrays are replaced not merged.\n */\nfunction mergeObjects<T>(target: T, source: Partial<T>): T {\n if (!isPlainObject(target) || !isPlainObject(source)) {\n return target;\n }\n\n const result = { ...target } as T;\n\n for (const key of Object.keys(source)) {\n const sourceVal = (source as Record<string, unknown>)[key];\n const targetVal = (result as Record<string, unknown>)[key];\n\n if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n (result as Record<string, unknown>)[key] = mergeObjects(targetVal, sourceVal);\n } else if (sourceVal !== undefined) {\n (result as Record<string, unknown>)[key] = sourceVal;\n }\n }\n\n return result;\n}\n\n/**\n * Merges a partial RiffScore config with the default config.\n * Handles nested objects (ui, interaction, score) correctly.\n */\nexport const mergeRiffConfig = (userConfig: DeepPartial<RiffScoreConfig> = {}): RiffScoreConfig => {\n const base = { ...DEFAULT_RIFF_CONFIG };\n\n // Merge each top-level section individually for type safety\n return {\n ui: mergeObjects(base.ui, userConfig.ui ?? {}),\n interaction: mergeObjects(base.interaction, userConfig.interaction ?? {}),\n score: mergeObjects(base.score, userConfig.score ?? {}),\n };\n};\n","/**\n * Score Generator Utility\n *\n * Generates staff structures from templates for RiffScore initialization.\n */\n\nimport { Staff, Measure, StaffTemplate } from '@/types';\n\nlet idCounter = 0;\nconst generateId = (prefix: string): string => `${prefix}-${++idCounter}`;\n\n/**\n * Creates an empty measure (no events).\n * The layout engine will generate a centered, non-interactive placeholder rest for display.\n *\n * NOTE: Empty measures have `events: []`. The layout engine's createEmptyMeasureLayout\n * handles rendering a centered whole rest placeholder that doesn't block input.\n */\nexport const createEmptyMeasure = (): Measure => ({\n id: generateId('m'),\n events: [],\n});\n\n/**\n * Creates a staff with the specified clef and number of measures\n */\nconst createStaff = (\n clef: 'treble' | 'bass',\n measureCount: number,\n keySignature: string\n): Staff => ({\n id: generateId('staff'),\n clef,\n keySignature,\n measures: Array.from({ length: measureCount }, () => createEmptyMeasure()),\n});\n\n/**\n * Generates staves from a template\n * @param template - 'grand', 'treble', or 'bass'\n * @param measureCount - Number of measures per staff\n * @param keySignature - Key signature for all staves\n * @returns Array of Staff objects\n */\nexport const generateStaves = (\n template: StaffTemplate,\n measureCount: number,\n keySignature: string\n): Staff[] => {\n // Reset counter for deterministic IDs in tests\n idCounter = 0;\n\n switch (template) {\n case 'grand':\n return [\n createStaff('treble', measureCount, keySignature),\n createStaff('bass', measureCount, keySignature),\n ];\n case 'treble':\n return [createStaff('treble', measureCount, keySignature)];\n case 'bass':\n return [createStaff('bass', measureCount, keySignature)];\n default:\n // Fallback to treble\n return [createStaff('treble', measureCount, keySignature)];\n }\n};\n\n/**\n * Resets the ID counter (useful for testing)\n */\nexport const resetIdCounter = (): void => {\n idCounter = 0;\n};\n","/**\n * useRiffScore Hook\n *\n * Config-aware wrapper around useScoreLogic that normalizes configuration\n * and derives initial score state from config options.\n */\n\nimport { useMemo } from 'react';\nimport { RiffScoreConfig, DeepPartial, Score } from '@/types';\nimport { mergeRiffConfig } from '@/utils/mergeConfig';\nimport { generateStaves } from '@/utils/generateScore';\n\nexport interface UseRiffScoreResult {\n config: RiffScoreConfig;\n initialScore: Score;\n}\n\n/**\n * Hook that processes RiffScore configuration and derives initial score.\n *\n * Logic:\n * 1. Merge user config with defaults\n * 2. If config.score.staves is provided, use it directly (Render Mode)\n * 3. Otherwise, generate staves from template (Generator Mode)\n */\nexport const useRiffScore = (userConfig: DeepPartial<RiffScoreConfig> = {}): UseRiffScoreResult => {\n // 1. Merge with defaults\n const config = useMemo(() => mergeRiffConfig(userConfig), [userConfig]);\n\n // 2. Derive initial score\n const initialScore = useMemo((): Score => {\n const { score: scoreConfig } = config;\n\n // Render Mode: Use explicit staves if provided\n if (scoreConfig.staves && scoreConfig.staves.length > 0) {\n return {\n title: scoreConfig.title,\n timeSignature: scoreConfig.timeSignature,\n keySignature: scoreConfig.keySignature,\n bpm: scoreConfig.bpm,\n staves: scoreConfig.staves,\n };\n }\n\n // Generator Mode: Generate staves from template\n const template = scoreConfig.staff ?? 'grand';\n const measureCount = scoreConfig.measureCount ?? 2;\n const generatedStaves = generateStaves(template, measureCount, scoreConfig.keySignature);\n\n return {\n title: scoreConfig.title,\n timeSignature: scoreConfig.timeSignature,\n keySignature: scoreConfig.keySignature,\n bpm: scoreConfig.bpm,\n staves: generatedStaves,\n };\n }, [config]);\n\n return { config, initialScore };\n};\n","/**\n * Theme Configuration for Sheet Music Editor\n *\n * Defines color palettes and semantic theme mappings.\n */\n\n// =============================================================================\n// LAYER 1: Descriptive Colors\n// =============================================================================\n\nexport const COLORS = {\n // Slate (Dark/Default)\n slate800: '#1e293b', // Converted from hsla(217, 33%, 18%, 1.00) for hex-alpha compatibility\n slate700: 'hsla(218, 33%, 28%, 1.00)',\n slate600: 'hsla(215, 16%, 38%, 1.00)',\n slate500: 'hsla(215, 16%, 47%, 1.00)',\n slate400: 'hsla(215, 20%, 65%, 1.00)',\n slate200: '#e2e8f0',\n teal: '#1DA59C', // #1DA59C\n\n // Blue (Cool)\n blue950: '#0f172a',\n blue900: '#1e3a8a',\n blue800: '#1e40af',\n blue400: '#60a5fa',\n blue200: '#bfdbfe',\n cyan400: '#22d3ee',\n\n // Warm\n stone900: '#1c1917',\n stone800: '#292524',\n stone500: '#78716c',\n stone400: '#a8a29e',\n stone200: '#e7e5e4',\n orange400: '#fb923c',\n amber400: '#fbbf24',\n\n // Common\n whiteAlpha10: 'rgba(255, 255, 255, 0.1)',\n slate800Alpha80: 'rgba(30, 41, 59, 0.8)',\n blue950Alpha80: 'rgba(15, 23, 42, 0.8)',\n stone900Alpha80: 'rgba(28, 25, 23, 0.8)',\n} as const;\n\n// =============================================================================\n// LAYER 2: Semantic Themes\n// =============================================================================\n\nconst DARK = {\n accent: COLORS.teal,\n background: COLORS.slate800,\n panelBackground: COLORS.slate800Alpha80,\n text: COLORS.slate200,\n secondaryText: COLORS.slate400,\n border: COLORS.whiteAlpha10,\n buttonBackground: COLORS.slate800Alpha80,\n buttonHoverBackground: COLORS.slate700,\n score: {\n line: COLORS.slate500,\n note: COLORS.slate200,\n fill: COLORS.slate200,\n },\n};\n\nconst COOL = {\n accent: COLORS.cyan400,\n background: COLORS.blue950,\n panelBackground: COLORS.blue950Alpha80,\n text: COLORS.blue200,\n secondaryText: COLORS.blue400,\n border: COLORS.whiteAlpha10,\n buttonBackground: COLORS.blue950Alpha80,\n buttonHoverBackground: COLORS.blue900,\n score: {\n line: COLORS.blue400,\n note: COLORS.blue200,\n fill: COLORS.blue200,\n },\n};\n\nconst WARM = {\n accent: COLORS.orange400,\n background: COLORS.stone900,\n panelBackground: COLORS.stone900Alpha80,\n text: COLORS.stone200,\n secondaryText: COLORS.stone400,\n border: COLORS.whiteAlpha10,\n buttonBackground: COLORS.stone900Alpha80,\n buttonHoverBackground: COLORS.stone800,\n score: {\n line: COLORS.stone500,\n note: COLORS.stone200,\n fill: COLORS.stone200,\n },\n};\n\nconst LIGHT = {\n accent: COLORS.teal,\n background: '#ffffff',\n panelBackground: '#f9f9f9',\n text: COLORS.slate800,\n secondaryText: COLORS.slate500,\n border: '#e2e8f0',\n buttonBackground: '#ffffff',\n buttonHoverBackground: '#f1f5f9',\n score: {\n line: COLORS.slate400,\n note: '#000000',\n fill: '#000000',\n },\n};\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\nexport const THEMES = {\n DARK,\n COOL,\n WARM,\n LIGHT,\n} as const;\n\nexport const DEFAULT_THEME = 'DARK';\n\nexport type ThemeName = keyof typeof THEMES;\n\n// Theme interface (structural type, not literal)\nexport interface Theme {\n accent: string;\n background: string;\n panelBackground: string;\n text: string;\n secondaryText: string;\n border: string;\n buttonBackground: string;\n buttonHoverBackground: string;\n score: {\n line: string;\n note: string;\n fill: string;\n };\n}\n","/**\n * Configuration Constants for Sheet Music Editor\n */\n\n// Re-export themes for backwards compatibility\nexport { COLORS, THEMES, DEFAULT_THEME } from './themes';\nexport type { ThemeName, Theme } from './themes';\n\n// =============================================================================\n// LAYOUT CONFIGURATION\n// =============================================================================\n\nexport interface Config {\n lineHeight: number;\n topMargin: number;\n baseY: number;\n quantsPerMeasure: number;\n measurePaddingLeft: number;\n measurePaddingRight: number;\n scoreMarginLeft: number;\n headerWidth: number;\n staffSpacing: number;\n\n debug?: {\n enabled: boolean;\n logCommands: boolean;\n logStateChanges: boolean;\n logValidation: boolean;\n };\n}\n\nexport const CONFIG: Config = {\n lineHeight: 12,\n topMargin: 20,\n baseY: 70,\n quantsPerMeasure: 64,\n measurePaddingLeft: 36,\n measurePaddingRight: 0,\n scoreMarginLeft: 60,\n headerWidth: 60,\n staffSpacing: 120,\n\n debug: {\n enabled: true,\n logCommands: true,\n logStateChanges: true,\n logValidation: true,\n },\n};\n","/**\n * Constants for Sheet Music Editor\n *\n * This file contains:\n * - Music theory constants (note types, time/key signatures)\n * - Derived layout constants (from CONFIG)\n * - Rendering settings (beaming, stems, tuplets, ties)\n */\n\nimport { CONFIG } from './config';\nimport { Key } from 'tonal';\n\n// =============================================================================\n// DERIVED LAYOUT VALUES (from CONFIG.lineHeight)\n// =============================================================================\n\nconst SPACE = CONFIG.lineHeight; // 12px - distance between staff lines\nconst HALF_SPACE = 0.5 * SPACE; // 6px\n\n// Staff positions (Y offset from baseY/top line of staff)\nconst STAFF_POSITION = {\n aboveStaff: -0.5 * SPACE,\n line5: 0,\n space4: 0.5 * SPACE,\n line4: 1 * SPACE,\n space3: 1.5 * SPACE,\n line3: 2 * SPACE,\n space2: 2.5 * SPACE,\n line2: 3 * SPACE,\n space1: 3.5 * SPACE,\n line1: 4 * SPACE,\n belowStaff: 4.5 * SPACE,\n};\n\nexport const MIDDLE_LINE_Y = CONFIG.baseY + 24;\n\n// =============================================================================\n// TIME SIGNATURES\n// =============================================================================\n\nexport const TIME_SIGNATURES: Record<string, number> = {\n '4/4': 64,\n '3/4': 48,\n '2/4': 32,\n '6/8': 48,\n};\n\n// =============================================================================\n// KEY SIGNATURES (Generated from Tonal)\n// =============================================================================\n\nexport interface KeySignature {\n label: string;\n type: 'sharp' | 'flat';\n count: number;\n accidentals: string[];\n mode: 'major' | 'minor';\n tonic: string;\n}\n\nconst SHARPS_ORDER = ['F', 'C', 'G', 'D', 'A', 'E', 'B'];\nconst FLATS_ORDER = ['B', 'E', 'A', 'D', 'G', 'C', 'F'];\n\n// All 15 key signature groups: C (no accidentals), 7 sharps, 7 flats\n// Each major key has a relative minor with the same accidentals\n// Keys are named distinctly: 'C' = C Major, 'Am' = A minor\nconst MAJOR_ROOTS = [\n 'C', // No accidentals\n 'G',\n 'D',\n 'A',\n 'E',\n 'B',\n 'F#',\n 'C#', // Sharp Keys\n 'F',\n 'Bb',\n 'Eb',\n 'Ab',\n 'Db',\n 'Gb',\n 'Cb', // Flat Keys\n];\n\nexport const KEY_SIGNATURES: Record<string, KeySignature> = {};\n\n// Generate all key signatures using Tonal.js\nMAJOR_ROOTS.forEach((majorRoot) => {\n const majorInfo = Key.majorKey(majorRoot);\n const count = Math.abs(majorInfo.alteration);\n const type: 'sharp' | 'flat' = majorInfo.alteration < 0 ? 'flat' : 'sharp';\n const accidentals = type === 'flat' ? FLATS_ORDER.slice(0, count) : SHARPS_ORDER.slice(0, count);\n\n // Major key: stored as root name (e.g., 'G', 'Bb')\n KEY_SIGNATURES[majorRoot] = {\n label: `${majorRoot} Major`,\n type,\n count,\n accidentals,\n mode: 'major',\n tonic: majorRoot,\n };\n\n // Minor key: stored with 'm' suffix (e.g., 'Em', 'Gm')\n // Use the relative minor from Tonal.js\n const minorRoot = majorInfo.minorRelative;\n const minorKey = `${minorRoot}m`;\n KEY_SIGNATURES[minorKey] = {\n label: `${minorRoot} minor`,\n type,\n count,\n accidentals,\n mode: 'minor',\n tonic: minorRoot,\n };\n});\n\n// Key signature accidental positions on staff\nexport interface KeySignatureOffsets {\n treble: { sharp: Record<string, number>; flat: Record<string, number> };\n bass: { sharp: Record<string, number>; flat: Record<string, number> };\n}\n\nexport const KEY_SIGNATURE_OFFSETS: KeySignatureOffsets = {\n treble: {\n sharp: {\n F: STAFF_POSITION.line5,\n C: STAFF_POSITION.space3,\n G: STAFF_POSITION.aboveStaff,\n D: STAFF_POSITION.line4,\n A: STAFF_POSITION.space2,\n E: STAFF_POSITION.space4,\n B: STAFF_POSITION.line3,\n },\n flat: {\n B: STAFF_POSITION.line3,\n E: STAFF_POSITION.space4,\n A: STAFF_POSITION.space2,\n D: STAFF_POSITION.line4,\n G: STAFF_POSITION.line2,\n C: STAFF_POSITION.space3,\n F: STAFF_POSITION.space1,\n },\n },\n bass: {\n sharp: {\n F: STAFF_POSITION.line4,\n C: STAFF_POSITION.space2,\n G: STAFF_POSITION.space4,\n D: STAFF_POSITION.line3,\n A: STAFF_POSITION.line5,\n E: STAFF_POSITION.space3,\n B: STAFF_POSITION.aboveStaff,\n },\n flat: {\n B: STAFF_POSITION.line2,\n E: STAFF_POSITION.space3,\n A: STAFF_POSITION.space1,\n D: STAFF_POSITION.line3,\n G: STAFF_POSITION.line1,\n C: STAFF_POSITION.space2,\n F: STAFF_POSITION.belowStaff,\n },\n },\n};\n\n// =============================================================================\n// CLEF TYPES\n// =============================================================================\n\nexport interface ClefType {\n label: string;\n isGrand?: boolean;\n}\n\nexport const CLEF_TYPES: Record<string, ClefType> = {\n treble: { label: 'Treble' },\n bass: { label: 'Bass' },\n grand: { label: 'Grand', isGrand: true },\n};\n\n// =============================================================================\n// NOTE TYPES\n// =============================================================================\n\nexport interface NoteType {\n duration: number;\n label: string;\n fill: string;\n stroke: string;\n stem: boolean;\n flag?: number;\n abcDuration: string;\n xmlType: string;\n}\n\nexport const NOTE_TYPES: Record<string, NoteType> = {\n whole: {\n duration: 64,\n label: 'Whole',\n fill: 'transparent',\n stroke: 'black',\n stem: false,\n abcDuration: '4',\n xmlType: 'whole',\n },\n half: {\n duration: 32,\n label: 'Half',\n fill: 'transparent',\n stroke: 'black',\n stem: true,\n abcDuration: '2',\n xmlType: 'half',\n },\n quarter: {\n duration: 16,\n label: 'Quarter',\n fill: 'black',\n stroke: 'black',\n stem: true,\n abcDuration: '',\n xmlType: 'quarter',\n },\n eighth: {\n duration: 8,\n label: 'Eighth',\n fill: 'black',\n stroke: 'black',\n stem: true,\n flag: 1,\n abcDuration: '/2',\n xmlType: 'eighth',\n },\n sixteenth: {\n duration: 4,\n label: '16th',\n fill: 'black',\n stroke: 'black',\n stem: true,\n flag: 2,\n abcDuration: '/4',\n xmlType: '16th',\n },\n thirtysecond: {\n duration: 2,\n label: '32nd',\n fill: 'black',\n stroke: 'black',\n stem: true,\n flag: 3,\n abcDuration: '/8',\n xmlType: '32nd',\n },\n sixtyfourth: {\n duration: 1,\n label: '64th',\n fill: 'black',\n stroke: 'black',\n stem: true,\n flag: 4,\n abcDuration: '/16',\n xmlType: '64th',\n },\n};\n\n// =============================================================================\n// LAYOUT CONSTANTS\n// =============================================================================\n\nexport const NOTE_SPACING_BASE_UNIT = 16;\nexport const WHOLE_REST_WIDTH = 12;\nexport const DEFAULT_SCALE = 1;\n\nexport const LAYOUT = {\n // Core Primitives\n LINE_STROKE_WIDTH: 1.5,\n NOTE_RX: 6,\n NOTE_RY: 4,\n DOT_RADIUS: 3,\n\n // Derived from lineHeight\n SECOND_INTERVAL_SHIFT: SPACE - 1,\n SECOND_INTERVAL_SPACE: HALF_SPACE,\n DOT_OFFSET_X: SPACE,\n LEDGER_LINE_EXTENSION: SPACE - 2,\n\n // Accidentals\n ACCIDENTAL: {\n OFFSET_X: -16,\n OFFSET_Y: 0,\n FONT_SIZE: 22, // Legacy, now using getFontSize() from SMuFL\n SPACING: HALF_SPACE + 2,\n },\n\n // Hit Detection\n HIT_AREA: {\n WIDTH: 20,\n HEIGHT: 12,\n OFFSET_X: -10,\n OFFSET_Y: -6,\n },\n HIT_ZONE_RADIUS: 14,\n APPEND_ZONE_WIDTH: 2000,\n\n // Min widths for short notes\n MIN_WIDTH_FACTORS: {\n sixtyfourth: 1.2,\n thirtysecond: 1.5,\n sixteenth: 1.8,\n eighth: 2.2,\n } as Record<string, number>,\n\n LOOKAHEAD_PADDING_FACTOR: 0.3,\n};\n\n// =============================================================================\n// STEM RENDERING\n// =============================================================================\n\nexport const STEM = {\n LENGTHS: {\n default: 44,\n thirtysecond: 44,\n sixtyfourth: 44,\n } as Record<string, number>,\n BEAMED_LENGTHS: {\n default: 44,\n thirtysecond: 48,\n sixtyfourth: 56,\n } as Record<string, number>,\n OFFSET_X: HALF_SPACE + 0.25,\n};\n\n// =============================================================================\n// BEAMING\n// =============================================================================\n\nexport const BEAMING = {\n THICKNESS: 5,\n SPACING: 8,\n MAX_SLOPE: 1.0,\n EXTENSION_PX: 0.625,\n};\n\n// =============================================================================\n// TUPLET BRACKETS\n// =============================================================================\n\nexport const TUPLET = {\n HOOK_HEIGHT: 8,\n PADDING: 15,\n MAX_SLOPE: 0.5,\n NUMBER_FONT_SIZE: 11,\n NUMBER_OFFSET_UP: -4,\n NUMBER_OFFSET_DOWN: 12,\n VISUAL_NOTE_RADIUS: 8,\n};\n\n// =============================================================================\n// TIE RENDERING\n// =============================================================================\n\nexport const TIE = {\n START_GAP: 0,\n END_GAP: 5,\n VERTICAL_OFFSET: 8,\n MID_THICKNESS: 4,\n TIP_THICKNESS: 1.2,\n};\n\n// =============================================================================\n// FLAG RENDERING (not SMuFL glyphs - see constants/SMuFL.ts for those)\n// =============================================================================\n\nexport const FLAG_RENDERING = {\n SPACING: 7,\n SCALE_CLOSEST: 1.3,\n SCALE_OTHERS: 1.2,\n OFFSET: 3,\n};\n\n// =============================================================================\n// STAFF LAYOUT & INTERACTION LIMITS\n// =============================================================================\n\nexport const STAFF_LINES_COUNT = 5;\nexport const STAFF_HEIGHT = (STAFF_LINES_COUNT - 1) * SPACE; // 48px\n\n// Visual limits for interactions\nexport const LEDGER_LINE_STEP = SPACE; // 12px step for full line\nexport const INNER_ZONE_LINES = 1.6; // Lines allowed in the gap between staves\nexport const OUTER_ZONE_LINES = 4.6; // Lines allowed outside the system\n\nexport const CLAMP_LIMITS = {\n // Inner zone (gap) limit: 2 ledger lines (24px)\n INNER_OFFSET: INNER_ZONE_LINES * LEDGER_LINE_STEP,\n\n // Outer zone (top of system) limit: 4 ledger lines up (-48px)\n OUTER_TOP: -(OUTER_ZONE_LINES * LEDGER_LINE_STEP),\n\n // Outer zone (bottom of system) limit: User preference (90px)\n // Accommodates 4 ledger lines down + breathing room\n OUTER_BOTTOM: 90,\n};\n\nexport const MOUSE_OFFSET_SNAP = HALF_SPACE; // 6px\n\nexport const PIANO_RANGE = {\n min: 'A0', // MIDI 21\n max: 'C8', // MIDI 108\n};\n","import { CONFIG } from '@/config';\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class DebugLogger {\n private static instance: DebugLogger;\n\n private constructor() {}\n\n public static getInstance(): DebugLogger {\n if (!DebugLogger.instance) {\n DebugLogger.instance = new DebugLogger();\n }\n return DebugLogger.instance;\n }\n\n private shouldLog(_level: LogLevel): boolean {\n if (!CONFIG.debug?.enabled) return false;\n // Could add level filtering here based on config if needed\n return true;\n }\n\n public log(message: string, data?: any, level: LogLevel = LogLevel.INFO) {\n if (!this.shouldLog(level)) return;\n\n const timestamp = new Date().toISOString().split('T')[1].slice(0, -1);\n const prefix = `[${timestamp}] [${LogLevel[level]}]`;\n\n /* eslint-disable no-console */\n switch (level) {\n case LogLevel.ERROR:\n console.error(prefix, message, data || '');\n break;\n case LogLevel.WARN:\n console.warn(prefix, message, data || '');\n break;\n case LogLevel.DEBUG:\n console.debug(prefix, message, data || '');\n break;\n default:\n console.log(prefix, message, data || '');\n }\n }\n\n public group(label: string) {\n if (CONFIG.debug?.enabled) {\n console.group(label);\n }\n }\n\n public groupEnd() {\n if (CONFIG.debug?.enabled) {\n console.groupEnd();\n }\n }\n\n public logCommand(commandType: string, payload?: any) {\n if (CONFIG.debug?.logCommands) {\n this.log(`COMMAND: ${commandType}`, payload, LogLevel.INFO);\n }\n }\n\n public logStateChange(oldStateHash: string, newStateHash: string) {\n if (CONFIG.debug?.logStateChanges) {\n this.log(`STATE CHANGE: ${oldStateHash} -> ${newStateHash}`, undefined, LogLevel.DEBUG);\n }\n }\n\n public logValidationFailure(reason: string, context?: any) {\n if (CONFIG.debug?.logValidation) {\n this.log(`VALIDATION FAILED: ${reason}`, context, LogLevel.ERROR);\n }\n }\n}\n\nexport const logger = DebugLogger.getInstance();\n","import { Score, createDefaultScore } from '@/types';\nimport { Command } from '@/commands/types';\nimport { logger, LogLevel } from '@/utils/debug';\n\ntype Listener = (score: Score) => void;\n\nexport class ScoreEngine {\n private state: Score;\n private listeners: Set<Listener> = new Set();\n private history: Command[] = [];\n private redoStack: Command[] = [];\n\n constructor(initialScore?: Score) {\n this.state = initialScore || createDefaultScore();\n }\n\n public getHistory(): Command[] {\n return this.history;\n }\n\n public getRedoStack(): Command[] {\n return this.redoStack;\n }\n\n public getState(): Score {\n return this.state;\n }\n\n public setState(newState: Score) {\n if (!newState || !newState.staves) {\n logger.logValidationFailure('Attempted to set invalid state in ScoreEngine', newState);\n return;\n }\n\n this.state = newState;\n this.notifyListeners();\n }\n\n public dispatch(command: Command) {\n logger.logCommand(command.type, command);\n\n try {\n const newState = command.execute(this.state);\n\n if (!newState || !newState.staves) {\n logger.logValidationFailure(`Command ${command.type} returned invalid state`, newState);\n // Don't update state if invalid\n return;\n }\n\n this.history.push(command);\n this.redoStack = []; // Clear redo stack on new action\n this.setState(newState);\n } catch (error) {\n logger.log(`Error executing command ${command.type}`, error, LogLevel.ERROR);\n console.error(error);\n }\n }\n\n public undo() {\n const command = this.history.pop();\n if (command) {\n const newState = command.undo(this.state);\n this.redoStack.push(command);\n this.setState(newState);\n }\n }\n\n public redo() {\n const command = this.redoStack.pop();\n if (command) {\n const newState = command.execute(this.state);\n this.history.push(command);\n this.setState(newState);\n }\n }\n\n public subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach((listener) => listener(this.state));\n }\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { ScoreEngine } from '@/engines/ScoreEngine';\nimport { Score } from '@/types';\n\nexport const useScoreEngine = (initialScore?: Score) => {\n // Use a ref to hold the engine instance so it persists across renders\n // We only want to create it once.\n const engineRef = useRef<ScoreEngine | null>(null);\n\n if (!engineRef.current) {\n engineRef.current = new ScoreEngine(initialScore);\n }\n\n const engine = engineRef.current;\n\n // Local state to trigger re-renders when the engine state changes\n const [score, setScore] = useState<Score>(engine.getState());\n\n useEffect(() => {\n // Subscribe to engine changes\n const unsubscribe = engine.subscribe((newScore) => {\n setScore(newScore);\n });\n\n return () => {\n unsubscribe();\n };\n }, [engine]);\n\n return {\n score,\n engine,\n };\n};\n","import { useState, useCallback } from 'react';\n\n/**\n * Input mode for entry - determines whether canvas clicks create notes or rests.\n */\nexport type InputMode = 'NOTE' | 'REST';\n\n/**\n * Hook for managing editor tool state.\n *\n * Includes: duration, dot, accidental, tie, and input mode.\n */\nexport const useEditorTools = () => {\n const [activeDuration, setActiveDuration] = useState('quarter');\n const [isDotted, setIsDotted] = useState(false);\n const [activeAccidental, setActiveAccidental] = useState<'flat' | 'natural' | 'sharp' | null>(\n null\n );\n const [activeTie, setActiveTie] = useState(false);\n\n /**\n * Current input mode - 'NOTE' for note entry, 'REST' for rest entry.\n * Syncs automatically with selection composition.\n */\n const [inputMode, setInputMode] = useState<InputMode>('NOTE');\n\n // User Preferences (Sticky state)\n const [userSelectedDuration, setUserSelectedDuration] = useState('quarter');\n const [userSelectedDotted, setUserSelectedDotted] = useState(false);\n\n const handleDurationChange = (newDuration: string) => {\n setActiveDuration(newDuration);\n setUserSelectedDuration(newDuration);\n };\n\n const handleDotToggle = () => {\n const newState = !isDotted;\n setIsDotted(newState);\n setUserSelectedDotted(newState);\n return newState;\n };\n\n const handleAccidentalToggle = (type: 'flat' | 'natural' | 'sharp' | null) => {\n const newState = activeAccidental === type ? null : type;\n setActiveAccidental(newState);\n return newState;\n };\n\n const handleTieToggle = () => {\n const newState = !activeTie;\n setActiveTie(newState);\n return newState;\n };\n\n /**\n * Toggles between NOTE and REST input modes.\n */\n const toggleInputMode = useCallback(() => {\n setInputMode((prev) => (prev === 'NOTE' ? 'REST' : 'NOTE'));\n }, []);\n\n return {\n activeDuration,\n setActiveDuration,\n isDotted,\n setIsDotted,\n activeAccidental,\n setActiveAccidental,\n activeTie,\n setActiveTie,\n userSelectedDuration,\n userSelectedDotted,\n handleDurationChange,\n handleDotToggle,\n handleAccidentalToggle,\n handleTieToggle,\n // New: Input mode\n inputMode,\n setInputMode,\n toggleInputMode,\n };\n};\n","import { Command } from './types';\nimport { Score, Measure } from '@/types';\n\nexport class AddMeasureCommand implements Command {\n public readonly type = 'ADD_MEASURE';\n private addedMeasureIds: string[] = [];\n\n execute(score: Score): Score {\n const newStaves = score.staves.map((staff, index) => {\n const newMeasures = [...staff.measures];\n const newId = Date.now().toString() + '-' + index;\n this.addedMeasureIds[index] = newId;\n\n const newMeasure: Measure = {\n id: newId,\n events: [],\n };\n newMeasures.push(newMeasure);\n return { ...staff, measures: newMeasures };\n });\n\n return { ...score, staves: newStaves };\n }\n\n undo(score: Score): Score {\n const newStaves = score.staves.map((staff, index) => {\n const newMeasures = [...staff.measures];\n if (newMeasures.length > 0) {\n const lastMeasure = newMeasures[newMeasures.length - 1];\n // Verify ID matches if we have it recorded\n if (this.addedMeasureIds[index] && lastMeasure.id === this.addedMeasureIds[index]) {\n newMeasures.pop();\n } else if (!this.addedMeasureIds[index]) {\n // Fallback if no ID recorded (legacy?)\n newMeasures.pop();\n }\n }\n return { ...staff, measures: newMeasures };\n });\n\n return { ...score, staves: newStaves };\n }\n}\n\nexport class DeleteMeasureCommand implements Command {\n public readonly type = 'DELETE_MEASURE';\n private deletedMeasures: Measure[] = [];\n private deletedIndex: number = -1;\n\n constructor(private index?: number) {}\n\n execute(score: Score): Score {\n // Determine target index from first staff (assuming sync)\n const firstStaff = score.staves[0];\n if (!firstStaff || firstStaff.measures.length === 0) return score;\n\n const targetIndex = this.index !== undefined ? this.index : firstStaff.measures.length - 1;\n if (targetIndex < 0 || targetIndex >= firstStaff.measures.length) return score;\n\n this.deletedIndex = targetIndex;\n this.deletedMeasures = [];\n\n const newStaves = score.staves.map((staff) => {\n const newMeasures = [...staff.measures];\n if (targetIndex < newMeasures.length) {\n this.deletedMeasures.push(newMeasures[targetIndex]);\n newMeasures.splice(targetIndex, 1);\n }\n return { ...staff, measures: newMeasures };\n });\n\n return { ...score, staves: newStaves };\n }\n\n undo(score: Score): Score {\n if (this.deletedIndex === -1 || this.deletedMeasures.length === 0) return score;\n\n const newStaves = score.staves.map((staff, index) => {\n const newMeasures = [...staff.measures];\n const deletedMeasure = this.deletedMeasures[index]; // Assuming staves order preserved\n if (deletedMeasure) {\n newMeasures.splice(this.deletedIndex, 0, deletedMeasure);\n }\n return { ...staff, measures: newMeasures };\n });\n\n return { ...score, staves: newStaves };\n }\n}\n","import { Command } from './types';\nimport { Score } from '@/types';\n\nexport class TogglePickupCommand implements Command {\n type = 'TOGGLE_PICKUP';\n private previousIsPickup: boolean | undefined;\n\n execute(score: Score): Score {\n // Check first staff to determine current state\n const firstStaff = score.staves[0];\n if (!firstStaff || firstStaff.measures.length === 0) return score;\n\n const firstMeasure = firstStaff.measures[0];\n this.previousIsPickup = !!firstMeasure.isPickup;\n const newIsPickup = !firstMeasure.isPickup;\n\n // Update ALL staves\n const newStaves = score.staves.map((staff) => {\n if (staff.measures.length === 0) return staff;\n const newMeasures = [...staff.measures];\n newMeasures[0] = {\n ...newMeasures[0],\n isPickup: newIsPickup,\n };\n return { ...staff, measures: newMeasures };\n });\n\n return {\n ...score,\n staves: newStaves,\n };\n }\n\n undo(score: Score): Score {\n if (this.previousIsPickup === undefined) return score;\n\n // Restore ALL staves to previous state\n const newStaves = score.staves.map((staff) => {\n if (staff.measures.length === 0) return staff;\n const newMeasures = [...staff.measures];\n newMeasures[0] = {\n ...newMeasures[0],\n isPickup: this.previousIsPickup,\n };\n return { ...staff, measures: newMeasures };\n });\n\n return {\n ...score,\n staves: newStaves,\n };\n }\n}\n","import { Command } from './types';\nimport { Score, Staff, Measure } from '@/types';\n\n/**\n * Command to convert a single-staff score to a Grand Staff (Treble + Bass).\n * - If source is treble: preserves as Treble, adds empty Bass\n * - If source is bass: preserves as Bass, adds empty Treble\n * - Reversible via undo\n */\nexport class SetGrandStaffCommand implements Command {\n type = 'SET_GRAND_STAFF';\n private previousStaves: Staff[] | null = null;\n\n execute(score: Score): Score {\n // Already Grand Staff? No-op\n if (score.staves.length >= 2) return score;\n\n // Store previous state for undo\n this.previousStaves = [...score.staves];\n\n const existingStaff = score.staves[0];\n const isBassClef = existingStaff.clef === 'bass';\n\n // Create empty measures matching existing staff structure\n const emptyMeasures: Measure[] = existingStaff.measures.map((m, index) => ({\n id: Date.now() + index + 1000,\n events: [],\n isPickup: m.isPickup,\n }));\n\n if (isBassClef) {\n // Source is bass clef: keep notes on bass (index 1), add empty treble (index 0)\n const trebleStaff: Staff = {\n id: Date.now() + 2000,\n clef: 'treble',\n keySignature: existingStaff.keySignature,\n measures: emptyMeasures,\n };\n\n // Keep existing staff as bass at index 1\n const bassStaff: Staff = {\n ...existingStaff,\n clef: 'bass', // Ensure it's marked as bass\n };\n\n return {\n ...score,\n staves: [trebleStaff, bassStaff],\n };\n } else {\n // Source is treble clef: keep notes on treble (index 0), add empty bass (index 1)\n const bassStaff: Staff = {\n id: Date.now() + 2000,\n clef: 'bass',\n keySignature: existingStaff.keySignature,\n measures: emptyMeasures,\n };\n\n // Ensure existing staff has treble clef\n const trebleStaff: Staff = {\n ...existingStaff,\n clef: 'treble',\n };\n\n return {\n ...score,\n staves: [trebleStaff, bassStaff],\n };\n }\n }\n\n undo(score: Score): Score {\n if (!this.previousStaves) return score;\n\n return {\n ...score,\n staves: this.previousStaves,\n };\n }\n}\n","/**\n * SMuFL (Standard Music Font Layout) Constants\n *\n * This file contains Unicode codepoints for music symbols as defined by SMuFL.\n * These codepoints are used with the Bravura font to render high-quality music notation.\n *\n * Reference: https://w3c.github.io/smufl/latest/tables/\n */\n\n// ========== NOTEHEADS ==========\nexport const NOTEHEADS = {\n doubleWhole: '\\uE0A0',\n whole: '\\uE0A2',\n half: '\\uE0A3',\n black: '\\uE0A4', // Quarter note and shorter\n\n // Parenthesized noteheads\n parenthesisLeft: '\\uE0F5',\n parenthesisRight: '\\uE0F6',\n} as const;\n\n// ========== RESTS ==========\nexport const RESTS = {\n maxima: '\\uE4E0',\n longa: '\\uE4E1',\n doubleWhole: '\\uE4E2',\n whole: '\\uE4E3',\n half: '\\uE4E4',\n quarter: '\\uE4E5',\n eighth: '\\uE4E6',\n sixteenth: '\\uE4E7',\n thirtysecond: '\\uE4E8',\n sixtyfourth: '\\uE4E9',\n oneHundredTwentyEighth: '\\uE4EA',\n} as const;\n\n// Duration name to glyph mapping\nexport const REST_GLYPHS: Record<string, string> = {\n whole: RESTS.whole,\n half: RESTS.half,\n quarter: RESTS.quarter,\n eighth: RESTS.eighth,\n sixteenth: RESTS.sixteenth,\n thirtysecond: RESTS.thirtysecond,\n sixtyfourth: RESTS.sixtyfourth,\n};\n\n// ========== CLEFS ==========\nexport const CLEFS = {\n gClef: '\\uE050', // Treble clef\n gClef8vb: '\\uE052', // Treble clef with 8 below\n gClef8va: '\\uE053', // Treble clef with 8 above\n fClef: '\\uE062', // Bass clef\n fClef8vb: '\\uE064', // Bass clef with 8 below\n fClef8va: '\\uE065', // Bass clef with 8 above\n cClef: '\\uE05C', // Alto/Tenor clef\n} as const;\n\n// ========== ACCIDENTALS ==========\nexport const ACCIDENTALS = {\n flat: '\\uE260',\n natural: '\\uE261',\n sharp: '\\uE262',\n doubleSharp: '\\uE263',\n doubleFlat: '\\uE264',\n\n // Parenthesized\n parenthesisLeft: '\\uE26A',\n parenthesisRight: '\\uE26B',\n} as const;\n\n// ========== FLAGS ==========\nexport const FLAGS = {\n // Up flags\n eighthUp: '\\uE240',\n sixteenthUp: '\\uE242',\n thirtysecondUp: '\\uE244',\n sixtyfourthUp: '\\uE246',\n oneHundredTwentyEighthUp: '\\uE248',\n\n // Down flags\n eighthDown: '\\uE241',\n sixteenthDown: '\\uE243',\n thirtysecondDown: '\\uE245',\n sixtyfourthDown: '\\uE247',\n oneHundredTwentyEighthDown: '\\uE249',\n} as const;\n\n// ========== PRECOMPOSED NOTES (notehead + stem + flags) ==========\n// Stem up versions - keys match duration names for direct lookup\nexport const PRECOMPOSED_NOTES_UP = {\n whole: '\\uE1D2', // noteWhole (no stem)\n half: '\\uE1D3', // noteHalfUp\n quarter: '\\uE1D5', // noteQuarterUp\n eighth: '\\uE1D7', // note8thUp\n sixteenth: '\\uE1D9', // note16thUp\n thirtysecond: '\\uE1DB', // note32ndUp\n sixtyfourth: '\\uE1DD', // note64thUp\n} as const;\n\n// Stem down versions\nexport const PRECOMPOSED_NOTES_DOWN = {\n whole: '\\uE1D2', // noteWhole (same, no stem)\n half: '\\uE1D4', // noteHalfDown\n quarter: '\\uE1D6', // noteQuarterDown\n eighth: '\\uE1D8', // note8thDown\n sixteenth: '\\uE1DA', // note16thDown\n thirtysecond: '\\uE1DC', // note32ndDown\n sixtyfourth: '\\uE1DE', // note64thDown\n} as const;\n\n// ========== TIME SIGNATURES ==========\nexport const TIME_SIG_DIGITS = {\n 0: '\\uE080',\n 1: '\\uE081',\n 2: '\\uE082',\n 3: '\\uE083',\n 4: '\\uE084',\n 5: '\\uE085',\n 6: '\\uE086',\n 7: '\\uE087',\n 8: '\\uE088',\n 9: '\\uE089',\n common: '\\uE08A', // C (common time)\n cutCommon: '\\uE08B', // Cut C (alla breve)\n} as const;\n\n// ========== AUGMENTATION DOT ==========\nexport const DOTS = {\n augmentationDot: '\\uE1E7',\n} as const;\n\n// ========== DYNAMICS ==========\nexport const DYNAMICS = {\n piano: '\\uE520',\n mezzo: '\\uE521',\n forte: '\\uE522',\n rinforzando: '\\uE523',\n sforzando: '\\uE524',\n z: '\\uE525',\n niente: '\\uE526',\n\n // Combined dynamics\n ppp: '\\uE52A',\n pp: '\\uE52B',\n mp: '\\uE52C',\n mf: '\\uE52D',\n pf: '\\uE52E',\n ff: '\\uE52F',\n fff: '\\uE530',\n fp: '\\uE534',\n fz: '\\uE535',\n sf: '\\uE536',\n sfp: '\\uE537',\n sfz: '\\uE539',\n sffz: '\\uE53B',\n sfff: '\\uE53C',\n} as const;\n\n// ========== ARTICULATIONS ==========\nexport const ARTICULATIONS = {\n accentAbove: '\\uE4A0',\n accentBelow: '\\uE4A1',\n staccatoAbove: '\\uE4A2',\n staccatoBelow: '\\uE4A3',\n tenutoAbove: '\\uE4A4',\n tenutoBelow: '\\uE4A5',\n staccatissimoAbove: '\\uE4A6',\n staccatissimoBelow: '\\uE4A7',\n marcatoAbove: '\\uE4AC',\n marcatoBelow: '\\uE4AD',\n} as const;\n\n// ========== BARLINES ==========\nexport const BARLINES = {\n single: '\\uE030',\n double: '\\uE031',\n final: '\\uE032',\n repeatLeft: '\\uE040',\n repeatRight: '\\uE041',\n repeatDots: '\\uE043',\n} as const;\n\n// ========== ORNAMENTS ==========\nexport const ORNAMENTS = {\n trill: '\\uE566',\n turn: '\\uE567',\n mordent: '\\uE56C',\n mordentInverted: '\\uE56D',\n trillNatural: '\\uE569',\n trillSharp: '\\uE56A',\n trillFlat: '\\uE56B',\n} as const;\n\n// ========== HOLDS AND PAUSES ==========\nexport const HOLDS = {\n fermataAbove: '\\uE4C0',\n fermataBelow: '\\uE4C1',\n fermataShortAbove: '\\uE4C4',\n fermataShortBelow: '\\uE4C5',\n fermataLongAbove: '\\uE4C6',\n fermataLongBelow: '\\uE4C7',\n breathMark: '\\uE4CE',\n caesura: '\\uE4D1',\n} as const;\n\n// ========== FONT CONFIGURATION ==========\n/**\n * SMuFL fonts are designed with 1 staff space = 0.25em\n * For a given staff space in pixels, font size = staffSpace * 4\n *\n * Example: For 12px staff spacing, use 48px font size\n */\nexport const getFontSize = (staffSpace: number): number => staffSpace * 4;\n\n/**\n * Bravura font family with fallback\n */\nexport const BRAVURA_FONT = \"'Bravura', serif\";\n\n// ========== COMBINED EXPORT ==========\nexport const SMUFL = {\n noteheads: NOTEHEADS,\n rests: RESTS,\n clefs: CLEFS,\n accidentals: ACCIDENTALS,\n flags: FLAGS,\n timeSigDigits: TIME_SIG_DIGITS,\n dots: DOTS,\n dynamics: DYNAMICS,\n articulations: ARTICULATIONS,\n barlines: BARLINES,\n ornaments: ORNAMENTS,\n holds: HOLDS,\n} as const;\n\nexport default SMUFL;\n","/**\n * MusicService - Centralized Music Theory & Notation Logic\n *\n * Adapts TonalJS to the specific needs of a score renderer,\n * distinguishing between \"Musical Pitch\" (Audio/Theory) and\n * \"Visual Pitch\" (Staff positioning).\n */\n\nimport { Note, Key } from 'tonal';\nimport { ACCIDENTALS } from '@/constants/SMuFL';\n\n// --- Constants ---\n\nexport const STAFF_LETTERS = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\n\n// ============================================================================\n// 1. ANALYSIS (Audio & Midi)\n// ============================================================================\n\n/** Returns frequency in Hz (0 if invalid). */\nexport const getFrequency = (pitch: string): number => Note.freq(pitch) ?? 0;\n\n/** Returns MIDI number 0-127 (defaults to Middle C/60 if invalid). */\nexport const getMidi = (pitch: string): number => Note.midi(pitch) ?? 60;\n\n/** Returns scientific notation from MIDI (e.g. 60 -> \"C4\"). */\nexport const midiToPitch = (midi: number): string => Note.fromMidi(midi) ?? 'C4';\n\n// ============================================================================\n// 2. THEORY (Keys & Scales)\n// ============================================================================\n\nexport const getKeyInfo = (root: string) => Key.majorKey(root);\n\nexport const getKeyAlteration = (root: string): number => Key.majorKey(root).alteration;\n\nexport const getScaleNotes = (root: string): string[] => [...Key.majorKey(root).scale];\n\n/**\n * Returns the diatonic scale degree for a pitch in a key.\n * @example getScaleDegree(\"G4\", \"C\") -> 5\n */\nexport const getScaleDegree = (pitch: string, keyRoot: string): number => {\n const pc = Note.pitchClass(pitch);\n const scale = getScaleNotes(keyRoot);\n const idx = scale.indexOf(pc);\n return idx === -1 ? 0 : idx + 1;\n};\n\n// ============================================================================\n// 3. NOTATION (Rendering Logic)\n// ============================================================================\n\n/**\n * Returns the \"Visual Pitch\" - the letter and octave without accidentals.\n * Used to determine the Y-position on the staff.\n * @example \"F#4\" -> \"F4\", \"Fb4\" -> \"F4\"\n */\nexport const getStaffPitch = (pitch: string): string => {\n const n = Note.get(pitch);\n return n.letter && n.oct !== undefined ? `${n.letter}${n.oct}` : pitch;\n};\n\n/**\n * Decides if a note needs an accidental glyph based on the Key Signature.\n *\n * Logic:\n * 1. If note is in the key scale -> No accidental.\n * 2. If note is Natural but key expects Sharp/Flat -> Show Natural.\n * 3. If note is Sharp/Flat and not in key -> Show Sharp/Flat.\n */\nexport const needsAccidental = (\n pitch: string,\n keyRoot: string\n): { show: boolean; type: 'sharp' | 'flat' | 'natural' | null } => {\n const n = Note.get(pitch);\n if (!n.pc) return { show: false, type: null };\n\n const scale = Key.majorKey(keyRoot).scale;\n\n // Case A: Diatonic Note (e.g. F# in G Major) -> Clean\n if (scale.includes(n.pc)) {\n return { show: false, type: null };\n }\n\n // Case B: Chromatic Note\n // If the note is natural (alt === 0), it forces a Natural sign against the key\n if (n.alt === 0) {\n return { show: true, type: 'natural' };\n }\n\n // Otherwise, return the alteration type\n return {\n show: true,\n type: n.alt > 0 ? 'sharp' : 'flat',\n };\n};\n\n/**\n * Resolves the final SMuFL glyph for a note, considering overrides.\n */\nexport const getAccidentalGlyph = (\n pitch: string,\n keySignature: string,\n overrideSymbol?: string | null\n): string | null => {\n // 1. Manual Override (User forced an accidental or forced it hidden)\n if (overrideSymbol !== undefined) return overrideSymbol;\n\n // 2. Standard Theory Calculation\n const { show, type } = needsAccidental(pitch, keySignature);\n return show && type ? ACCIDENTALS[type] : null;\n};\n\n// ============================================================================\n// 4. INTERACTION (Drag & Drop Math)\n// ============================================================================\n\n/**\n * Snaps a \"Visual Pitch\" (derived from staff Y-position) to the Musical Key.\n *\n * @example\n * // User clicks \"F\" line in G Major\n * applyKeySignature(\"F4\", \"G\") // -> \"F#4\"\n */\nexport const applyKeySignature = (visualPitch: string, keyRoot: string): string => {\n const n = Note.get(visualPitch);\n if (!n.letter || n.oct === undefined) return visualPitch;\n\n // Find the pitch class in the scale that shares this letter\n const scale = Key.majorKey(keyRoot).scale;\n const match = scale.find((pc) => Note.get(pc).letter === n.letter);\n\n // If found (e.g. found \"F#\" for letter \"F\"), combine with octave\n return match ? `${match}${n.oct}` : visualPitch;\n};\n\n/**\n * Compares two pitches and returns -1, 0, or 1 (like a comparator).\n * Uses MIDI values for comparison.\n */\nexport const comparePitch = (a: string, b: string): number => {\n const midiA = getMidi(a);\n const midiB = getMidi(b);\n return midiA < midiB ? -1 : midiA > midiB ? 1 : 0;\n};\n\n/**\n * Clamps a pitch to the allowed range for a clef.\n * If pitch is out of bounds, returns the boundary pitch.\n */\nexport const clampPitch = (pitch: string, minPitch: string, maxPitch: string): string => {\n if (comparePitch(pitch, minPitch) < 0) return minPitch;\n if (comparePitch(pitch, maxPitch) > 0) return maxPitch;\n return pitch;\n};\n\n/**\n * Calculates a new pitch by moving visually along staff lines,\n * automatically applying the key signature to the destination.\n *\n * @param pitch Starting pitch (e.g. \"C4\")\n * @param steps Visual steps to move (e.g. 1 = next line/space)\n * @param keyRoot Key context (e.g. \"G\")\n * @param pitchRange Optional pitch range for clamping (if provided, result will be clamped)\n */\nexport const movePitchVisual = (\n pitch: string,\n steps: number,\n keyRoot: string = 'C',\n pitchRange?: { min: string; max: string }\n): string => {\n const n = Note.get(pitch);\n if (!n.letter || n.oct === undefined) return pitch;\n\n // 1. Calculate new Letter & Octave (Geometry)\n const currentIdx = STAFF_LETTERS.indexOf(n.letter);\n const totalIdx = currentIdx + steps;\n\n // Handle wrapping (modulo with support for negative numbers)\n const wrappedIdx = ((totalIdx % 7) + 7) % 7;\n const octaveChange = Math.floor(totalIdx / 7);\n\n const newLetter = STAFF_LETTERS[wrappedIdx];\n const newOctave = n.oct + octaveChange;\n\n // 2. Snap to Key (Music Theory)\n let result = applyKeySignature(`${newLetter}${newOctave}`, keyRoot);\n\n // 3. Clamp to allowed range (if pitchRange provided)\n if (pitchRange) {\n result = clampPitch(result, pitchRange.min, pitchRange.max);\n }\n\n return result;\n};\n","import { NOTE_TYPES, TIME_SIGNATURES } from '@/constants';\nimport { getMidi } from '@/services/MusicService';\n\n/**\n * Calculates the duration of a note in quants.\n * @param type - The note type (e.g., 'quarter', 'eighth')\n * @param dotted - Whether the note is dotted (adds 50% duration)\n * @param tuplet - Optional tuplet ratio (e.g., [3, 2] for triplet)\n * @returns Duration in quants\n */\nexport const getNoteDuration = (\n type: string,\n dotted: boolean,\n tuplet?: { ratio: [number, number] }\n) => {\n const base = NOTE_TYPES[type].duration;\n const dottedValue = dotted ? base * 1.5 : base;\n\n // Apply tuplet ratio if present\n // ratio[1] / ratio[0] because we're fitting ratio[0] notes into the space of ratio[1]\n // e.g., [3, 2] means 3 notes in space of 2, so each note is 2/3 the normal duration\n if (tuplet) {\n return (dottedValue * tuplet.ratio[1]) / tuplet.ratio[0];\n }\n\n return dottedValue;\n};\n\n// New Helper: Calculate total measure duration in quants from Event List\n/**\n * Calculates the total duration of a list of events in quants.\n * @param events - List of events\n * @returns Total quants\n */\nexport const calculateTotalQuants = (events: any[]) => {\n return events.reduce((acc, event) => {\n return acc + getNoteDuration(event.duration, event.dotted, event.tuplet);\n }, 0);\n};\n\n// Helper: Decompose quants into valid note durations\n/**\n * Decomposes a total number of quants into a list of valid note durations.\n * Used for reflowing measures when time signature changes.\n * @param quants - Total quants to decompose\n * @returns Array of { duration, dotted, quants }\n */\nexport const getBreakdownOfQuants = (quants: number) => {\n const options = [\n { quants: 64, type: 'whole', dotted: false },\n { quants: 48, type: 'half', dotted: true },\n { quants: 32, type: 'half', dotted: false },\n { quants: 24, type: 'quarter', dotted: true },\n { quants: 16, type: 'quarter', dotted: false },\n { quants: 12, type: 'eighth', dotted: true },\n { quants: 8, type: 'eighth', dotted: false },\n { quants: 6, type: 'sixteenth', dotted: true },\n { quants: 4, type: 'sixteenth', dotted: false },\n { quants: 3, type: 'thirtysecond', dotted: true },\n { quants: 2, type: 'thirtysecond', dotted: false },\n { quants: 1, type: 'sixtyfourth', dotted: false },\n ];\n\n let remaining = quants;\n const parts = [];\n\n for (const opt of options) {\n while (remaining >= opt.quants) {\n parts.push({ duration: opt.type, dotted: opt.dotted, quants: opt.quants });\n remaining -= opt.quants;\n }\n if (remaining === 0) break;\n }\n return parts;\n};\n\n// --- LOGIC HELPERS ---\n\n/**\n * Reflows the score based on a new time signature.\n * Redistributes events into measures, splitting and tying notes as needed.\n * @param measures - Current measures\n * @param newTimeSignature - New time signature string (e.g., '4/4')\n * @returns New list of measures\n */\nexport const reflowScore = (measures: any[], newTimeSignature: string) => {\n const maxQuants = TIME_SIGNATURES[newTimeSignature as keyof typeof TIME_SIGNATURES] || 64;\n\n // 1. Identify if first measure is a pickup\n const isPickup = measures.length > 0 && measures[0].isPickup;\n\n // 2. Flatten all events\n const allEvents: any[] = [];\n measures.forEach((m: any) => {\n m.events.forEach((e: any) => {\n // Clone event to avoid mutation issues\n // Reset ties as we will recalculate them\n const event = {\n ...e,\n notes: e.notes.map((n: any) => ({ ...n, tied: false })),\n };\n allEvents.push(event);\n });\n });\n\n const newMeasures: any[] = [];\n let currentMeasureEvents: any[] = [];\n let currentMeasureQuants = 0;\n\n const commitMeasure = (isPickupMeasure = false) => {\n newMeasures.push({\n id: Date.now() + Math.random(), // New IDs\n events: currentMeasureEvents,\n isPickup: isPickupMeasure,\n });\n currentMeasureEvents = [];\n currentMeasureQuants = 0;\n };\n\n // 3. Handle Pickup Measure specifically\n if (isPickup) {\n // For pickup, we just take events until we fill it OR until we run out of events that \"belong\" to it?\n // Actually, reflow usually implies we are changing time signature.\n // If we have a pickup, we should try to keep the *same* events in it if possible,\n // OR we just fill it up to its current capacity?\n // A pickup measure by definition is incomplete.\n // Strategy: The first measure IS the pickup. We fill it with events until it is \"full\" relative to the NEW time signature?\n // NO, a pickup measure is usually *shorter* than the time signature.\n // So we should probably just take the events that were *already* in the pickup measure?\n // But we flattened everything.\n\n // Let's assume we want to preserve the *duration* of the pickup if possible, or just fill it up to the max of the new time sig?\n // If we change 4/4 to 3/4, and pickup was 1 beat. It should stay 1 beat.\n // If we change 4/4 to 3/4, and pickup was 3 beats. It fits.\n // If we change 4/4 to 2/4, and pickup was 3 beats. It overflows.\n\n // BETTER STRATEGY:\n // We need to know which events belonged to the pickup.\n // But we flattened them.\n\n // Note: originalPickupEvents was removed as dead code (only used for unused pickupQuants)\n\n // We consume events from `allEvents` that match the original pickup's duration (or as much as fits in new time sig)\n // Actually, since we flattened `allEvents`, the first N events are from the pickup.\n\n // We iterate `allEvents`. We fill the first measure until we reach the duration of the original pickup,\n // BUT constrained by `maxQuants` of the new time signature.\n\n // TODO: pickupQuants and pickupFilled were removed as dead code.\n // The actual pickup handling uses targetPickupDuration calculated below.\n\n // Let's set a \"target duration\" for the first measure.\n // If isPickup, target = min(originalPickupDuration, maxQuants).\n // Else target = maxQuants.\n\n // Wait, if we just change time sig, we might want to keep the pickup as is.\n // So target = originalPickupDuration.\n // If originalPickupDuration > maxQuants (e.g. 3 beats pickup going to 2/4), then it MUST be split.\n // So target = min(originalPickupDuration, maxQuants).\n\n // However, `reflowScore` is also used when we add/remove notes?\n // If we add a note to a pickup, it grows.\n // If we add a note to a normal measure, it overflows.\n\n // If `reflowScore` is called, it means we want to re-distribute.\n // If we have a pickup, we generally want to preserve it as a distinct container that doesn't accept overflow from previous (none) or give overflow to next (unless it exceeds time sig).\n\n // Actually, if we are just reflowing, we should treat the pickup as a \"short measure\".\n // But how do we know how short it *should* be?\n // It is defined by its content.\n\n // If we are reflowing because of a Time Sig change:\n // We want to preserve the musical content of the pickup.\n // So we calculate the duration of the original pickup.\n // We fill the new first measure up to that duration.\n // Then we close it and mark it as pickup.\n\n // We need to pull events from `allEvents` until we hit `targetPickupDuration`.\n // Since `allEvents` is ordered, we just process them.\n\n // We need a flag in the loop to know we are filling the pickup.\n }\n\n // Calculate target pickup duration (0 if not a pickup)\n const targetPickupDuration = isPickup\n ? Math.min(calculateTotalQuants(measures[0].events), maxQuants)\n : 0;\n\n // Initialize loop state based on whether we're filling a pickup\n let isFillingPickup = isPickup;\n const pickupTarget = targetPickupDuration;\n\n // 2. Redistribute events\n allEvents.forEach((event) => {\n const eventDuration = getNoteDuration(event.duration, event.dotted, event.tuplet);\n\n // Determine current max for this measure\n let currentMax = maxQuants;\n if (isFillingPickup) {\n currentMax = pickupTarget;\n }\n\n // Does it fit in current measure?\n if (currentMeasureQuants + eventDuration <= currentMax) {\n currentMeasureEvents.push(event);\n currentMeasureQuants += eventDuration;\n } else {\n // Split event\n const available = currentMax - currentMeasureQuants;\n const remaining = eventDuration - available;\n\n // If available is 0, we are full.\n if (available > 0) {\n const firstParts = getBreakdownOfQuants(available);\n firstParts.forEach((part) => {\n const newEvent = {\n ...event,\n id: Date.now() + Math.random(),\n duration: part.duration,\n dotted: part.dotted,\n notes: event.notes.map((n: any) => ({ ...n, tied: true })),\n };\n currentMeasureEvents.push(newEvent);\n });\n }\n\n // Commit current measure\n commitMeasure(isFillingPickup);\n\n // If we were filling pickup, we are done with it.\n if (isFillingPickup) {\n isFillingPickup = false;\n }\n\n // Now handle remaining parts\n // We might have remaining > 0.\n if (remaining > 0) {\n const secondParts = getBreakdownOfQuants(remaining);\n secondParts.forEach((part) => {\n const newEvent = {\n ...event,\n id: Date.now() + Math.random(),\n duration: part.duration,\n dotted: part.dotted,\n notes: event.notes.map((n: any) => ({ ...n, tied: event.notes[0].tied })),\n };\n\n // Check if fits in NEW measure (which is standard size)\n if (currentMeasureQuants + part.quants <= maxQuants) {\n currentMeasureEvents.push(newEvent);\n currentMeasureQuants += part.quants;\n } else {\n // Overflow again (rare for standard notes)\n // Just push and let it overflow for now or split again (omitted for brevity)\n currentMeasureEvents.push(newEvent);\n currentMeasureQuants += part.quants;\n }\n });\n }\n }\n });\n\n // Commit last measure if not empty\n if (currentMeasureEvents.length > 0) {\n commitMeasure(isFillingPickup); // If we ended while still filling pickup, it's a pickup\n }\n\n // Ensure at least one measure\n if (newMeasures.length === 0) {\n newMeasures.push({ id: Date.now(), events: [], isPickup: isPickup });\n }\n\n return newMeasures;\n};\n\n/**\n * Navigates the selection based on direction.\n * @param {Array} measures - List of measures\n * @param {Object} selection - Current selection { measureIndex, eventId, noteId }\n * @param {string} direction - 'left', 'right', 'up', 'down'\n * @returns {Object} New selection object\n */\n/**\n * Helper: Robust check for rest event\n */\nexport const isRestEvent = (event: any): boolean => {\n return !!event.isRest;\n};\n\n/**\n * Helper: Robust check for note event (has at least one pitch)\n */\nexport const isNoteEvent = (event: any): boolean => {\n return !isRestEvent(event) && event.notes?.length > 0;\n};\n\n/**\n * Helper to get noteId for an event.\n * Returns ID for first note (pitch or rest).\n */\nexport const getFirstNoteId = (event: any): string | number | null => {\n if (!event.notes?.length) return null;\n return event.notes[0].id; // Rests now have notes, so this works for both\n};\n\nexport const navigateSelection = (\n measures: any[],\n selection: any,\n direction: string,\n _clef: string = 'treble'\n) => {\n const { measureIndex, eventId, noteId } = selection;\n if (measureIndex === null || !eventId) return selection;\n\n const measure = measures[measureIndex];\n if (!measure) return selection;\n\n const eventIdx = measure.events.findIndex((e: any) => e.id === eventId);\n if (eventIdx === -1) return selection;\n\n if (direction === 'left') {\n if (eventIdx > 0) {\n const prevEvent = measure.events[eventIdx - 1];\n return { ...selection, eventId: prevEvent.id, noteId: getFirstNoteId(prevEvent) };\n } else if (measureIndex > 0) {\n const prevMeasure = measures[measureIndex - 1];\n if (prevMeasure.events.length > 0) {\n const prevEvent = prevMeasure.events[prevMeasure.events.length - 1];\n return {\n ...selection,\n measureIndex: measureIndex - 1,\n eventId: prevEvent.id,\n noteId: getFirstNoteId(prevEvent),\n };\n }\n }\n } else if (direction === 'right') {\n if (eventIdx < measure.events.length - 1) {\n const nextEvent = measure.events[eventIdx + 1];\n return { ...selection, eventId: nextEvent.id, noteId: getFirstNoteId(nextEvent) };\n } else if (measureIndex < measures.length - 1) {\n const nextMeasure = measures[measureIndex + 1];\n if (nextMeasure.events.length > 0) {\n const nextEvent = nextMeasure.events[0];\n return {\n ...selection,\n measureIndex: measureIndex + 1,\n eventId: nextEvent.id,\n noteId: getFirstNoteId(nextEvent),\n };\n }\n }\n } else if (direction === 'up' || direction === 'down') {\n const event = measure.events[eventIdx];\n // Only navigate within chord if event has multiple notes\n if (event.notes?.length > 1 && noteId) {\n // Sort notes by pitch to ensure consistent up/down navigation\n const sortedNotes = [...event.notes].sort((a: any, b: any) => {\n const midiA = getMidi(a.pitch);\n const midiB = getMidi(b.pitch);\n return midiA - midiB;\n });\n\n const currentNoteIdx = sortedNotes.findIndex((n: any) => n.id === noteId);\n if (currentNoteIdx !== -1) {\n // Up = Higher pitch (higher index), Down = Lower pitch (lower index)\n const newIdx = direction === 'up' ? currentNoteIdx + 1 : currentNoteIdx - 1;\n if (newIdx >= 0 && newIdx < sortedNotes.length) {\n return { ...selection, noteId: sortedNotes[newIdx].id };\n }\n }\n }\n }\n\n return selection;\n};\n\n/**\n * Calculates transposition for selected notes.\n * @param {Array} measures - List of measures\n * @param {Object} selection - Current selection\n * @param {string} direction - 'up' or 'down'\n * @param {boolean} isShift - Whether shift is pressed (octave)\n * @param {string} clef - Clef for pitch context\n * @returns {Object|null} Object containing new measures and the modified event, or null if no change\n */\n","import { Command } from './types';\nimport { Score, Staff } from '@/types';\nimport { reflowScore } from '@/utils/core';\n\nexport class SetTimeSignatureCommand implements Command {\n type = 'SET_TIME_SIGNATURE';\n private previousTimeSignature: string | null = null;\n private previousStaves: Staff[] | null = null;\n\n constructor(private newSignature: string) {}\n\n execute(score: Score): Score {\n this.previousTimeSignature = score.timeSignature;\n this.previousStaves = score.staves;\n\n if (this.newSignature === score.timeSignature) {\n return score;\n }\n\n const newStaves = score.staves.map((staff) => ({\n ...staff,\n measures: reflowScore(staff.measures, this.newSignature),\n }));\n\n return {\n ...score,\n timeSignature: this.newSignature,\n staves: newStaves,\n };\n }\n\n undo(score: Score): Score {\n if (!this.previousTimeSignature || !this.previousStaves) return score;\n\n return {\n ...score,\n timeSignature: this.previousTimeSignature,\n staves: this.previousStaves,\n };\n }\n}\n","import { Command } from './types';\nimport { Score, Staff } from '@/types';\n\nexport class SetKeySignatureCommand implements Command {\n type = 'SET_KEY_SIGNATURE';\n private previousKeySignature: string | null = null;\n private previousStaves: Staff[] | null = null;\n\n constructor(private newSignature: string) {}\n\n execute(score: Score): Score {\n this.previousKeySignature = score.keySignature;\n this.previousStaves = score.staves;\n\n if (this.newSignature === score.keySignature) {\n return score;\n }\n\n const newStaves = score.staves.map((staff) => ({\n ...staff,\n keySignature: this.newSignature,\n }));\n\n return {\n ...score,\n keySignature: this.newSignature,\n staves: newStaves,\n };\n }\n\n undo(score: Score): Score {\n if (!this.previousKeySignature || !this.previousStaves) return score;\n\n return {\n ...score,\n keySignature: this.previousKeySignature,\n staves: this.previousStaves,\n };\n }\n}\n","import React, { useCallback } from 'react';\nimport { Score, getActiveStaff, createDefaultSelection, Selection } from '@/types';\nimport { Command } from '@/commands/types';\nimport { AddMeasureCommand, DeleteMeasureCommand } from '@/commands/MeasureCommands';\nimport { TogglePickupCommand } from '@/commands/TogglePickupCommand';\nimport { SetGrandStaffCommand } from '@/commands/SetGrandStaffCommand';\nimport { SetTimeSignatureCommand } from '@/commands/SetTimeSignatureCommand';\nimport { SetKeySignatureCommand } from '@/commands/SetKeySignatureCommand';\n\ninterface UseMeasureActionsProps {\n score: Score;\n setSelection: React.Dispatch<React.SetStateAction<Selection>>;\n setPreviewNote: (note: any) => void;\n dispatch: (command: Command) => void;\n}\n\ninterface UseMeasureActionsReturn {\n handleTimeSignatureChange: (newSig: string) => void;\n handleKeySignatureChange: (newKey: string) => void;\n addMeasure: () => void;\n removeMeasure: () => void;\n togglePickup: () => void;\n setGrandStaff: () => void;\n}\n\n/**\n * Hook for measure-level actions: time/key signature changes, add/remove measures.\n */\nexport const useMeasureActions = ({\n score,\n setSelection,\n setPreviewNote,\n dispatch,\n}: UseMeasureActionsProps): UseMeasureActionsReturn => {\n const handleTimeSignatureChange = useCallback(\n (newSig: string) => {\n if (newSig === score.timeSignature) return;\n dispatch(new SetTimeSignatureCommand(newSig));\n setSelection(createDefaultSelection());\n setPreviewNote(null);\n },\n [score.timeSignature, dispatch, setSelection, setPreviewNote]\n );\n\n const handleKeySignatureChange = useCallback(\n (newKey: string) => {\n if (newKey === score.keySignature) return;\n dispatch(new SetKeySignatureCommand(newKey));\n },\n [score.keySignature, dispatch]\n );\n\n const addMeasure = useCallback(() => {\n dispatch(new AddMeasureCommand());\n }, [dispatch]);\n\n const removeMeasure = useCallback(() => {\n dispatch(new DeleteMeasureCommand());\n }, [dispatch]);\n\n return {\n handleTimeSignatureChange,\n handleKeySignatureChange,\n addMeasure,\n removeMeasure,\n togglePickup: useCallback(() => {\n dispatch(new TogglePickupCommand());\n }, [dispatch]),\n setGrandStaff: useCallback(() => {\n dispatch(new SetGrandStaffCommand());\n }, [dispatch]),\n };\n};\n","import { navigateSelection, calculateTotalQuants, getNoteDuration } from './core';\nimport { movePitchVisual } from '@/services/MusicService';\nimport { CONFIG } from '@/config';\nimport { PIANO_RANGE } from '@/constants';\n\n/**\n * Calculates the next selection state based on navigation direction.\n * Handles standard navigation, ghost note navigation, and boundary checks.\n *\n * @param measures - The current measures of the score\n * @param selection - The current selection state\n * @param direction - The direction of navigation ('left', 'right', 'up', 'down')\n * @param previewNote - The current preview note state (ghost cursor)\n * @param activeDuration - The currently active note duration\n * @param isDotted - Whether the currently active note is dotted\n * @param currentQuantsPerMeasure - The number of quants per measure\n * @returns An object containing the new selection, new previewNote, and optional audio feedback\n */\n\n/**\n * Helper to generate the preview note state for appending to a measure.\n */\nexport const getAppendPreviewNote = (\n measure: any,\n measureIndex: number,\n staffIndex: number,\n activeDuration: string,\n isDotted: boolean,\n pitch?: string,\n isRest: boolean = false\n) => {\n const totalQuants = calculateTotalQuants(measure.events || []);\n // Default pitch logic: try to use last event's pitch, or fallback\n let defaultPitch = pitch;\n if (!defaultPitch) {\n if (measure.events.length > 0) {\n const lastEvent = measure.events[measure.events.length - 1];\n // Skip rests when determining pitch\n if (!lastEvent.isRest && lastEvent.notes?.length > 0) {\n defaultPitch = lastEvent.notes[0].pitch;\n } else {\n defaultPitch = 'C4'; // Fallback for rests\n }\n } else {\n defaultPitch = 'C4'; // Validation fallback, caller should ideally provide better default based on clef\n }\n }\n\n return {\n measureIndex,\n staffIndex,\n quant: totalQuants,\n visualQuant: totalQuants,\n pitch: defaultPitch,\n duration: activeDuration,\n dotted: isDotted,\n mode: 'APPEND',\n index: measure.events.length,\n isRest,\n };\n};\n\nexport const calculateNextSelection = (\n measures: any[],\n selection: any,\n direction: string,\n previewNote: any,\n activeDuration: string,\n isDotted: boolean,\n currentQuantsPerMeasure: number = CONFIG.quantsPerMeasure,\n clef: string = 'treble',\n\n staffIndex: number = 0,\n inputMode: 'NOTE' | 'REST' = 'NOTE'\n) => {\n // 1. Handle Navigation from Preview Note (Ghost Note)\n if (selection.eventId === null && previewNote && direction === 'left') {\n const measureIndex = previewNote.measureIndex;\n const measure = measures[measureIndex];\n // Use previewNote.index - 1 to handle stale measure state after note entry.\n // After adding a note, the measures array may not yet reflect the new event,\n // but previewNote.index is correctly updated by addNoteToMeasure.\n const targetEventIndex =\n previewNote.index > 0 ? previewNote.index - 1 : (measure?.events?.length ?? 1) - 1;\n\n if (measure && targetEventIndex >= 0 && measure.events[targetEventIndex]) {\n const targetEvent = measure.events[targetEventIndex];\n // For rests, use first note's id; for notes, use first note\n const noteId =\n targetEvent.isRest || !targetEvent.notes?.length ? null : targetEvent.notes[0].id;\n const audio = targetEvent.isRest\n ? null\n : { notes: targetEvent.notes, duration: targetEvent.duration, dotted: targetEvent.dotted };\n return {\n selection: { staffIndex, measureIndex, eventId: targetEvent.id, noteId },\n previewNote: null,\n audio,\n };\n } else if (measureIndex > 0) {\n // Select last event of previous measure\n const prevMeasure = measures[measureIndex - 1];\n if (prevMeasure && prevMeasure.events.length > 0) {\n const lastEvent = prevMeasure.events[prevMeasure.events.length - 1];\n const noteId = lastEvent.isRest || !lastEvent.notes?.length ? null : lastEvent.notes[0].id;\n const audio = lastEvent.isRest\n ? null\n : { notes: lastEvent.notes, duration: lastEvent.duration, dotted: lastEvent.dotted };\n return {\n selection: { staffIndex, measureIndex: measureIndex - 1, eventId: lastEvent.id, noteId },\n previewNote: null,\n audio,\n };\n }\n }\n }\n\n // 2. Standard Navigation\n const newSelection = navigateSelection(measures, selection, direction, clef);\n\n if (newSelection !== selection) {\n // Find the event to play audio\n const measure = measures[newSelection.measureIndex];\n let audio = null;\n if (measure) {\n const event = measure.events.find((e: any) => e.id === newSelection.eventId);\n if (event) {\n if (newSelection.noteId) {\n const note = event.notes.find((n: any) => n.id === newSelection.noteId);\n if (note) audio = { notes: [note], duration: event.duration, dotted: event.dotted };\n } else {\n audio = { notes: event.notes, duration: event.duration, dotted: event.dotted };\n }\n }\n }\n return { selection: { ...newSelection, staffIndex }, previewNote: null, audio };\n }\n\n // 3. Handle Navigation Beyond Last Event (to Ghost Note or New Measure)\n if (direction === 'right' && selection.measureIndex !== null) {\n const currentMeasure = measures[selection.measureIndex];\n const eventIdx = currentMeasure.events.findIndex((e: any) => e.id === selection.eventId);\n\n if (eventIdx === currentMeasure.events.length - 1) {\n // We are at the last event, try to move to ghost note\n const totalQuants = calculateTotalQuants(currentMeasure.events);\n const currentEvent = currentMeasure.events[eventIdx];\n\n // Guard against undefined event (can happen if selection is stale)\n if (!currentEvent) {\n return null;\n }\n\n // Get pitch: from note if available, else default based on clef\n const defaultPitch = clef === 'bass' ? 'D3' : 'B4';\n const pitch =\n !currentEvent.isRest && currentEvent.notes?.length > 0\n ? currentEvent.notes[0].pitch\n : defaultPitch;\n\n if (totalQuants < currentQuantsPerMeasure) {\n // Move to ghost note in current measure\n return {\n selection: { staffIndex, measureIndex: null, eventId: null, noteId: null },\n previewNote: getAppendPreviewNote(\n currentMeasure,\n selection.measureIndex,\n staffIndex,\n activeDuration,\n isDotted,\n pitch,\n inputMode === 'REST'\n ),\n audio: null,\n };\n } else {\n // Move to next measure\n const nextMeasureIndex = selection.measureIndex + 1;\n // Check if next measure exists, if not we signal to create it\n const shouldCreateMeasure = nextMeasureIndex >= measures.length;\n\n return {\n selection: { staffIndex, measureIndex: null, eventId: null, noteId: null },\n previewNote: {\n measureIndex: nextMeasureIndex,\n staffIndex,\n quant: 0,\n visualQuant: 0,\n pitch: pitch,\n duration: activeDuration,\n dotted: isDotted,\n mode: 'APPEND',\n index: 0,\n isRest: inputMode === 'REST',\n },\n shouldCreateMeasure,\n audio: null,\n };\n }\n }\n }\n\n return null; // No change\n};\n\n/**\n * Calculates transposition for selected notes.\n * @param {Array} measures - List of measures\n * @param {Object} selection - Current selection\n * @param {number} steps - Visual steps to move (positive or negative)\n * @param {string} keySignature - Key signature root\n * @param {string} clef - Clef for pitch range clamping ('treble' or 'bass')\n * @returns {Object|null} Object containing new measures and the modified event, or null if no change\n */\nexport const calculateTransposition = (\n measures: any[],\n selection: any,\n steps: number,\n keySignature: string = 'C'\n) => {\n const { measureIndex, eventId, noteId } = selection;\n if (measureIndex === null || !eventId) return null;\n\n const newMeasures = [...measures];\n const measure = { ...newMeasures[measureIndex] };\n const events = [...measure.events];\n const eventIdx = events.findIndex((e: any) => e.id === eventId);\n\n if (eventIdx === -1) return null;\n\n const event = { ...events[eventIdx] };\n const notes = [...event.notes];\n\n const modifyNote = (note: any) => {\n // Use movePitchVisual with piano range for clamping\n const newPitch = movePitchVisual(note.pitch, steps, keySignature, PIANO_RANGE);\n return { ...note, pitch: newPitch };\n };\n\n if (noteId) {\n const noteIdx = notes.findIndex((n: any) => n.id === noteId);\n if (noteIdx !== -1) {\n notes[noteIdx] = modifyNote(notes[noteIdx]);\n }\n } else {\n notes.forEach((n: any, i: number) => {\n notes[i] = modifyNote(n);\n });\n }\n\n event.notes = notes;\n events[eventIdx] = event;\n measure.events = events;\n newMeasures[measureIndex] = measure;\n\n return { measures: newMeasures, event };\n};\n\n/**\n * Calculates transposition for selected notes or the preview note.\n *\n * @param measures - The current measures of the score\n * @param selection - The current selection state\n * @param previewNote - The current preview note state\n * @param direction - The direction of transposition ('up', 'down')\n * @param isShift - Whether shift key is pressed (octave jump)\n * @param keySignature - The current key signature (default 'C')\n * @returns An object containing the new measures (if changed), new previewNote (if changed), and audio feedback\n */\nexport const calculateTranspositionWithPreview = (\n measures: any[],\n selection: any,\n previewNote: any,\n direction: string,\n isShift: boolean,\n keySignature: string = 'C'\n) => {\n // Determine steps (Visual Movement)\n // Up = 1, Down = -1. Shift = 7 (Octave)\n let steps = direction === 'up' ? 1 : -1;\n if (isShift) steps *= 7;\n\n // 1. Handle Preview Note (Ghost Note)\n if (selection.eventId === null && previewNote) {\n const newPitch = movePitchVisual(previewNote.pitch, steps, keySignature, PIANO_RANGE);\n if (newPitch !== previewNote.pitch) {\n return {\n previewNote: { ...previewNote, pitch: newPitch },\n audio: {\n notes: [{ pitch: newPitch }],\n duration: previewNote.duration,\n dotted: previewNote.dotted,\n },\n };\n }\n return null;\n }\n\n // 2. Handle Selection Transposition\n const result = calculateTransposition(measures, selection, steps, keySignature);\n\n if (result) {\n const { measures: newMeasures, event } = result;\n let audio = null;\n if (selection.noteId) {\n const note = event.notes.find((n: any) => n.id === selection.noteId);\n if (note) audio = { notes: [note], duration: event.duration, dotted: event.dotted };\n } else {\n audio = { notes: event.notes, duration: event.duration, dotted: event.dotted };\n }\n return { measures: newMeasures, audio };\n }\n\n return null;\n};\n\n/**\n * Calculates the cross-staff selection based on quant alignment.\n * Finds the closest event in the target staff that overlaps with the current selection's absolute quant.\n *\n * @param score - The complete score object\n * @param selection - The current selection state\n * @param direction - 'up' or 'down'\n * @returns {Object|null} New selection object or null if invalid move\n */\nexport const calculateCrossStaffSelection = (\n score: any,\n selection: any,\n direction: string,\n activeDuration: string = 'quarter',\n isDotted: boolean = false\n) => {\n const { staffIndex, measureIndex, eventId } = selection;\n if (staffIndex === undefined || measureIndex === null || !eventId) return null;\n\n const currentStaff = score.staves[staffIndex];\n if (!currentStaff) return null;\n\n // Determine target staff\n const targetStaffIndex = direction === 'up' ? staffIndex - 1 : staffIndex + 1;\n if (targetStaffIndex < 0 || targetStaffIndex >= score.staves.length) return null;\n\n const targetStaff = score.staves[targetStaffIndex];\n\n // Get current event to determine Start Quant Offset within the measure\n const currentMeasure = currentStaff.measures[measureIndex];\n if (!currentMeasure) return null;\n\n let currentQuantStart = 0;\n const currentEvent = currentMeasure.events.find((e: any) => {\n if (e.id === eventId) return true;\n currentQuantStart += getNoteDuration(e.duration, e.dotted, e.tuplet);\n return false;\n });\n\n if (!currentEvent) return null;\n\n // Now look at target staff, same measure index assuming sync\n const targetMeasure = targetStaff.measures[measureIndex];\n\n if (!targetMeasure) return null;\n\n // Find event in target measure that contains currentQuantStart\n let targetEvent = null;\n let targetQuant = 0;\n\n for (const e of targetMeasure.events) {\n const duration = getNoteDuration(e.duration, e.dotted, e.tuplet);\n const start = targetQuant;\n const end = targetQuant + duration;\n\n // Check overlap: if currentQuantStart falls within [start, end)\n if (currentQuantStart >= start && currentQuantStart < end) {\n targetEvent = e;\n break;\n }\n targetQuant += duration;\n }\n\n if (targetEvent) {\n const noteId = targetEvent.notes.length > 0 ? targetEvent.notes[0].id : null;\n\n return {\n selection: {\n staffIndex: targetStaffIndex,\n measureIndex,\n eventId: targetEvent.id,\n noteId,\n selectedNotes: [], // Clear multi-select\n anchor: null, // Clear anchor\n },\n previewNote: null,\n };\n } else {\n // No event found at this time (Gap or Empty Measure)\n // Fallback to \"Append Position\" using consistent logic\n\n // Determine Pitch: Default to a \"middle\" note for the staff clef.\n const clef = targetStaff.clef || 'treble';\n let defaultPitch = 'C4';\n if (clef === 'bass') defaultPitch = 'C3';\n if (clef === 'alto') defaultPitch = 'C4';\n\n const previewNote = getAppendPreviewNote(\n targetMeasure,\n measureIndex,\n targetStaffIndex,\n activeDuration,\n isDotted,\n defaultPitch\n );\n\n return {\n selection: {\n staffIndex: targetStaffIndex,\n measureIndex,\n eventId: null,\n noteId: null,\n selectedNotes: [],\n anchor: null,\n },\n previewNote,\n };\n }\n};\n","import { CONFIG } from '@/config';\nimport { getNoteDuration, calculateTotalQuants } from './core';\n\n/**\n * Checks if a new event with the given duration can fit in the measure.\n * @param events - List of existing events in the measure\n * @param duration - Duration type of the new event\n * @param dotted - Whether the new event is dotted\n * @param maxQuants - Maximum quants allowed in the measure\n * @returns True if it fits, False otherwise\n */\nexport const canAddEventToMeasure = (\n events: any[],\n duration: string,\n dotted: boolean,\n maxQuants: number = CONFIG.quantsPerMeasure\n): boolean => {\n const currentTotal = calculateTotalQuants(events);\n const newDur = getNoteDuration(duration, dotted, undefined);\n return currentTotal + newDur <= maxQuants;\n};\n\n/**\n * Checks if modifying an event's duration would cause the measure to overflow.\n * @param events - List of events in the measure\n * @param eventId - ID of the event being modified\n * @param targetDuration - The new duration to check\n * @param maxQuants - Maximum quants allowed in the measure\n * @returns True if valid, False otherwise\n */\nexport const canModifyEventDuration = (\n events: any[],\n eventId: string | number,\n targetDuration: string,\n maxQuants: number = CONFIG.quantsPerMeasure\n): boolean => {\n const eventIndex = events.findIndex((e: any) => e.id === eventId);\n if (eventIndex === -1) return true; // Defensive: If event doesn't exist, we can't strict check\n\n const currentEvent = events[eventIndex];\n\n // Calculate total of ALL OTHER events\n const otherEventsQuants = events.reduce((acc: number, e: any, idx: number) => {\n if (idx === eventIndex) return acc;\n return acc + getNoteDuration(e.duration, e.dotted, e.tuplet);\n }, 0);\n\n // Calculate new duration for THIS event\n const newEventQuants = getNoteDuration(targetDuration, currentEvent.dotted, currentEvent.tuplet);\n\n return otherEventsQuants + newEventQuants <= maxQuants;\n};\n\n/**\n * Checks if toggling an event's dotted status would cause the measure to overflow.\n * @param events - List of events in the measure\n * @param eventId - ID of the event being modified\n * @param maxQuants - Maximum quants allowed in the measure\n * @returns True if valid, False otherwise\n */\nexport const canToggleEventDot = (\n events: any[],\n eventId: string | number,\n maxQuants: number = CONFIG.quantsPerMeasure\n): boolean => {\n const eventIndex = events.findIndex((e: any) => e.id === eventId);\n if (eventIndex === -1) return true;\n\n const currentEvent = events[eventIndex];\n\n // Calculate total of ALL OTHER events\n const otherEventsQuants = events.reduce((acc: number, e: any, idx: number) => {\n if (idx === eventIndex) return acc;\n return acc + getNoteDuration(e.duration, e.dotted, e.tuplet);\n }, 0);\n\n // Calculate new duration for THIS event (with toggled dot)\n const newEventQuants = getNoteDuration(\n currentEvent.duration,\n !currentEvent.dotted,\n currentEvent.tuplet\n );\n\n return otherEventsQuants + newEventQuants <= maxQuants;\n};\n","/**\n * Tone.js Audio Engine\n *\n * Provides multiple instrument options with progressive loading.\n * Users can choose between synth types and piano samples.\n */\n\nimport * as Tone from 'tone';\nimport { TimelineEvent } from '@/services/TimelineService';\n\n// --- TYPES ---\n\nexport type InstrumentType = 'bright' | 'mellow' | 'organ' | 'piano';\n\nexport type InstrumentState = 'initializing' | 'ready' | 'loading-samples';\n\ninterface ToneEngineState {\n instrumentState: InstrumentState;\n selectedInstrument: InstrumentType;\n samplerLoaded: boolean;\n isPlaying: boolean;\n}\n\n// --- SYNTH PRESETS ---\n\nconst SYNTH_PRESETS = {\n bright: {\n name: 'Bright Synth',\n create: () =>\n new Tone.PolySynth(Tone.FMSynth, {\n harmonicity: 3,\n modulationIndex: 10,\n oscillator: { type: 'sine' as const },\n envelope: {\n attack: 0.01,\n decay: 0.4,\n sustain: 0.2,\n release: 1.5,\n },\n modulation: { type: 'triangle' as const },\n modulationEnvelope: {\n attack: 0.01,\n decay: 0.3,\n sustain: 0.1,\n release: 0.5,\n },\n }),\n volume: -10,\n },\n mellow: {\n name: 'Mellow Synth',\n create: () =>\n new Tone.PolySynth(Tone.Synth, {\n oscillator: { type: 'sine' as const },\n envelope: {\n attack: 0.05, // Slower attack for warmth\n decay: 0.6,\n sustain: 0.3,\n release: 2.0, // Long, smooth release\n },\n }),\n volume: -8,\n },\n organ: {\n name: 'Organ Synth',\n create: () =>\n new Tone.PolySynth(Tone.Synth, {\n oscillator: { type: 'triangle' as const }, // Original audioEngine sound\n envelope: {\n attack: 0.02,\n decay: 0.3,\n sustain: 0.4,\n release: 0.8,\n },\n }),\n volume: -6,\n },\n};\n\n// --- STATE ---\n\n// Mutable registry of synth instances. Properties are added dynamically as instruments are loaded.\nconst synths: Record<string, Tone.PolySynth> = {};\nlet sampler: Tone.Sampler | null = null;\nlet currentPart: Tone.Part | null = null;\nlet state: ToneEngineState = {\n instrumentState: 'initializing',\n selectedInstrument: 'bright',\n samplerLoaded: false,\n isPlaying: false,\n};\n\n// Callbacks for state changes\nlet onStateChange: ((state: ToneEngineState) => void) | null = null;\n\n// --- HELPERS ---\n\nconst freqToNote = (frequency: number): string => {\n return Tone.Frequency(frequency).toNote();\n};\n\nconst updateState = (partial: Partial<ToneEngineState>) => {\n state = { ...state, ...partial };\n onStateChange?.(state);\n};\n\n// --- INITIALIZATION ---\n\n/**\n * Initializes Tone.js audio context and instruments.\n * Must be called from a user gesture (click/tap) due to browser autoplay policy.\n */\nexport const initTone = async (onState?: (state: ToneEngineState) => void): Promise<void> => {\n if (onState) onStateChange = onState;\n\n // Start audio context (requires user gesture)\n await Tone.start();\n\n // Initialize all synth presets\n for (const [key, preset] of Object.entries(SYNTH_PRESETS)) {\n if (!synths[key]) {\n const synth = preset.create().toDestination();\n synth.volume.value = preset.volume;\n synth.maxPolyphony = 24;\n synths[key] = synth;\n }\n }\n\n updateState({ instrumentState: 'ready' });\n\n // Begin loading piano samples in background\n loadPianoSampler();\n};\n\n/**\n * Loads piano samples in background.\n */\nconst loadPianoSampler = () => {\n if (sampler) return;\n\n console.log('🎹 Starting piano sample load...');\n updateState({ instrumentState: 'loading-samples' });\n\n const baseUrl = '/audio/piano/';\n\n sampler = new Tone.Sampler({\n urls: {\n A0: 'A0.mp3',\n C1: 'C1.mp3',\n 'D#1': 'Ds1.mp3',\n 'F#1': 'Fs1.mp3',\n A1: 'A1.mp3',\n C2: 'C2.mp3',\n 'D#2': 'Ds2.mp3',\n 'F#2': 'Fs2.mp3',\n A2: 'A2.mp3',\n C3: 'C3.mp3',\n 'D#3': 'Ds3.mp3',\n 'F#3': 'Fs3.mp3',\n A3: 'A3.mp3',\n C4: 'C4.mp3',\n 'D#4': 'Ds4.mp3',\n 'F#4': 'Fs4.mp3',\n A4: 'A4.mp3',\n C5: 'C5.mp3',\n 'D#5': 'Ds5.mp3',\n 'F#5': 'Fs5.mp3',\n A5: 'A5.mp3',\n C6: 'C6.mp3',\n 'D#6': 'Ds6.mp3',\n 'F#6': 'Fs6.mp3',\n A6: 'A6.mp3',\n C7: 'C7.mp3',\n 'D#7': 'Ds7.mp3',\n 'F#7': 'Fs7.mp3',\n A7: 'A7.mp3',\n C8: 'C8.mp3',\n },\n baseUrl,\n onload: () => {\n console.log('🎹 Piano samples loaded');\n updateState({ samplerLoaded: true, instrumentState: 'ready' });\n },\n onerror: (error) => {\n console.warn('Failed to load piano samples:', error);\n updateState({ instrumentState: 'ready' });\n },\n }).toDestination();\n};\n\n// --- INSTRUMENT SELECTION ---\n\n/**\n * Changes the active instrument.\n */\nexport const setInstrument = (type: InstrumentType): void => {\n updateState({ selectedInstrument: type });\n};\n\n/**\n * Gets the currently active instrument for playback.\n */\nconst getActiveInstrument = (): Tone.PolySynth | Tone.Sampler | null => {\n const selected = state.selectedInstrument;\n\n // Piano samples - use if loaded, else fallback to bright synth\n if (selected === 'piano') {\n if (sampler && state.samplerLoaded) {\n return sampler;\n }\n // Fallback while loading\n return synths['bright'] || null;\n }\n\n // Synth presets\n return synths[selected] || synths['bright'] || null;\n};\n\n/**\n * Gets available instruments for UI dropdown.\n */\nexport const getInstrumentOptions = (): {\n id: InstrumentType;\n name: string;\n loading?: boolean;\n}[] => {\n return [\n { id: 'bright', name: 'Bright Synth' },\n { id: 'mellow', name: 'Mellow Synth' },\n { id: 'organ', name: 'Organ Synth' },\n {\n id: 'piano',\n name: state.samplerLoaded ? 'Piano Samples' : 'Piano (Loading...)',\n loading: !state.samplerLoaded,\n },\n ];\n};\n\n// --- PLAYBACK ---\n\n/**\n * Schedules the score for playback using Tone.js Transport and Part.\n */\nexport const scheduleTonePlayback = (\n timeline: TimelineEvent[],\n bpm: number,\n startTimeOffset: number = 0,\n onPositionUpdate?: (measureIndex: number, quant: number, duration: number) => void,\n onComplete?: () => void\n): void => {\n const instrument = getActiveInstrument();\n if (!instrument) {\n console.error('Tone engine not initialized');\n return;\n }\n\n stopTonePlayback();\n Tone.Transport.bpm.value = bpm;\n\n const filteredTimeline = timeline.filter((e) => e.time >= startTimeOffset);\n if (filteredTimeline.length === 0) {\n onComplete?.();\n return;\n }\n\n const adjustedTimeline = filteredTimeline.map((e) => ({\n ...e,\n time: e.time - startTimeOffset,\n }));\n\n const events = adjustedTimeline.map((e) => ({\n time: e.time,\n note: e.pitch || freqToNote(e.frequency),\n duration: e.duration,\n measureIndex: e.measureIndex,\n quant: e.quant,\n }));\n\n currentPart = new Tone.Part((time, event) => {\n instrument.triggerAttackRelease(event.note, event.duration, time);\n Tone.Draw.schedule(() => {\n onPositionUpdate?.(event.measureIndex, event.quant, event.duration);\n }, time);\n }, events);\n\n currentPart.start(0);\n\n const lastEvent = events[events.length - 1];\n const endTime = lastEvent.time + lastEvent.duration + 0.1;\n\n Tone.Transport.scheduleOnce(() => {\n updateState({ isPlaying: false });\n onComplete?.();\n }, endTime);\n\n Tone.Transport.start();\n updateState({ isPlaying: true });\n};\n\n/**\n * Stops playback and cleans up resources.\n */\nexport const stopTonePlayback = (): void => {\n Tone.Transport.stop();\n Tone.Transport.cancel();\n\n if (currentPart) {\n currentPart.dispose();\n currentPart = null;\n }\n\n updateState({ isPlaying: false });\n};\n\n/**\n * Sets the tempo (BPM) - can be called during playback.\n */\nexport const setTempo = (bpm: number): void => {\n Tone.Transport.bpm.value = bpm;\n};\n\n/**\n * Plays a single note (for preview/click feedback).\n */\nexport const playNote = async (pitch: string, duration: string = '8n'): Promise<void> => {\n if (state.instrumentState === 'initializing') {\n await initTone();\n }\n\n const instrument = getActiveInstrument();\n if (instrument) {\n instrument.triggerAttackRelease(pitch, duration);\n }\n};\n\n// --- STATE GETTERS ---\n\nexport const getInstrumentState = (): InstrumentState => state.instrumentState;\nexport const getSelectedInstrument = (): InstrumentType => state.selectedInstrument;\nexport const isSamplerLoaded = (): boolean => state.samplerLoaded;\nexport const isPlaying = (): boolean => state.isPlaying;\nexport const getState = (): ToneEngineState => ({ ...state });\n","import { Score, Measure, ScoreEvent, Note } from '@/types';\n\n/**\n * Helper to update a specific measure in the score.\n * Handles cloning of the staff and measures array.\n *\n * @param score The current score state\n * @param staffIndex Index of the staff containing the measure\n * @param measureIndex Index of the measure to update\n * @param updateFn Callback to modify the measure. Return true if modification happened, false to abort.\n * The measure passed to this function is already a clone.\n * @returns New score state (with updates) or original score (if invalid path or aborted)\n */\nexport const updateMeasure = (\n score: Score,\n staffIndex: number,\n measureIndex: number,\n updateFn: (measure: Measure) => boolean | void\n): Score => {\n const activeStaff = score.staves[staffIndex];\n if (!activeStaff) return score;\n\n const newMeasures = [...activeStaff.measures];\n if (!newMeasures[measureIndex]) return score;\n\n const measure = { ...newMeasures[measureIndex] };\n\n // Execute update logic\n const shouldUpdate = updateFn(measure);\n\n if (shouldUpdate === false) return score;\n\n newMeasures[measureIndex] = measure;\n\n const newStaves = [...score.staves];\n newStaves[staffIndex] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n};\n\n/**\n * Helper to update a specific event in a measure.\n * Handles cloning of the event array.\n *\n * @param score The current score state\n * @param staffIndex Index of the staff\n * @param measureIndex Index of the measure\n * @param eventIdOrIndex ID or Index of the event to update\n * @param updateFn Callback to modify the event. Return true if modification happened, false to abort.\n * The event passed to this function is already a clone.\n * @returns New score state or original score\n */\nexport const updateEvent = (\n score: Score,\n staffIndex: number,\n measureIndex: number,\n eventIdOrIndex: string | number,\n updateFn: (event: ScoreEvent) => boolean | void\n): Score => {\n return updateMeasure(score, staffIndex, measureIndex, (measure) => {\n const events = [...measure.events];\n\n let eventIndex = -1;\n if (\n typeof eventIdOrIndex === 'number' &&\n eventIdOrIndex < events.length &&\n events[eventIdOrIndex]\n ) {\n // Treat as index if it matches valid range, though ID usually string.\n // To be safe, usually we assume ID. Let's strictly check logic.\n // If we passed an Index (like in RemoveTuplet), we should support it.\n // But usually commands act by ID.\n eventIndex = eventIdOrIndex;\n } else {\n eventIndex = events.findIndex((e) => e.id === eventIdOrIndex);\n }\n\n if (eventIndex === -1) return false;\n\n const event = { ...events[eventIndex] };\n const result = updateFn(event);\n\n if (result === false) return false;\n\n events[eventIndex] = event;\n measure.events = events;\n return true;\n });\n};\n\n/**\n * Helper to update a specific note in an event.\n * Handles cloning of the note array.\n *\n * @param score The current score state\n * @param staffIndex Index of the staff\n * @param measureIndex Index of the measure\n * @param eventId ID of the event\n * @param noteId ID of the note\n * @param updateFn Callback to modify the note. Return true if modification happened, false to abort.\n * The note passed to this function is already a clone.\n * @returns New score state or original score\n */\nexport const updateNote = (\n score: Score,\n staffIndex: number,\n measureIndex: number,\n eventId: string | number,\n noteId: string | number,\n updateFn: (note: Note) => boolean | void\n): Score => {\n return updateEvent(score, staffIndex, measureIndex, eventId, (event) => {\n const noteIndex = event.notes.findIndex((n) => String(n.id) === String(noteId));\n if (noteIndex === -1) return false;\n\n const newNotes = [...event.notes];\n const note = { ...newNotes[noteIndex] };\n\n const result = updateFn(note);\n if (result === false) return false;\n\n newNotes[noteIndex] = note;\n event.notes = newNotes;\n return true;\n });\n};\n","import { Command } from './types';\nimport { Score, Note, ScoreEvent } from '@/types';\nimport { updateMeasure } from '@/utils/commandHelpers';\n\n/**\n * Unified command to add a score event (note or rest) to a measure.\n *\n * This replaces the separate AddNoteCommand and AddRestCommand with a single,\n * unified implementation that handles both cases.\n *\n * @example\n * // Add a note\n * dispatch(new AddEventCommand(0, false, notePayload, 'quarter', false));\n *\n * // Add a rest\n * dispatch(new AddEventCommand(0, true, null, 'quarter', false));\n */\nexport class AddEventCommand implements Command {\n public readonly type = 'ADD_EVENT';\n\n /**\n * @param measureIndex - Index of the target measure\n * @param isRest - Whether this event is a rest\n * @param note - Note payload (null for rests)\n * @param duration - Duration of the event (whole, half, quarter, etc.)\n * @param isDotted - Whether the event is dotted\n * @param index - Optional insertion index within measure events\n * @param eventId - Optional custom event ID (defaults to timestamp)\n * @param staffIndex - Staff index (default 0)\n */\n constructor(\n private measureIndex: number,\n private isRest: boolean,\n private note: Note | null,\n private duration: string,\n private isDotted: boolean,\n private index?: number,\n private eventId?: string,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n return updateMeasure(score, this.staffIndex, this.measureIndex, (measure) => {\n const newEvents = [...measure.events];\n const eventId = this.eventId || Date.now().toString();\n\n let newEvent: ScoreEvent;\n\n if (this.isRest) {\n // Create a rest event with a \"pitchless note\" for selection compatibility\n const restNoteId = `${eventId}-rest`;\n newEvent = {\n id: eventId,\n duration: this.duration,\n dotted: this.isDotted,\n isRest: true,\n notes: [\n {\n id: restNoteId,\n pitch: null,\n isRest: true,\n },\n ],\n };\n } else {\n // Create a note event\n newEvent = {\n id: eventId,\n duration: this.duration,\n dotted: this.isDotted,\n isRest: false,\n notes: this.note ? [this.note] : [],\n };\n }\n\n if (this.index !== undefined && this.index >= 0 && this.index <= newEvents.length) {\n newEvents.splice(this.index, 0, newEvent);\n } else {\n newEvents.push(newEvent);\n }\n\n measure.events = newEvents;\n return true;\n });\n }\n\n undo(score: Score): Score {\n return updateMeasure(score, this.staffIndex, this.measureIndex, (measure) => {\n const newEvents = [...measure.events];\n\n if (this.index !== undefined && this.index >= 0 && this.index < newEvents.length) {\n newEvents.splice(this.index, 1);\n } else {\n newEvents.pop();\n }\n\n measure.events = newEvents;\n return true;\n });\n }\n}\n","import { Command } from './types';\nimport { Score, Note } from '@/types';\nimport { updateEvent } from '@/utils/commandHelpers';\n\nexport class AddNoteToEventCommand implements Command {\n public readonly type = 'ADD_NOTE_TO_EVENT';\n\n constructor(\n private measureIndex: number,\n private eventId: string | number,\n private note: Note,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n return updateEvent(score, this.staffIndex, this.measureIndex, this.eventId, (event) => {\n // Check duplicate\n if (event.notes.some((n) => n.pitch === this.note.pitch)) return false;\n\n event.notes = [...event.notes, this.note];\n return true;\n });\n }\n\n undo(score: Score): Score {\n return updateEvent(score, this.staffIndex, this.measureIndex, this.eventId, (event) => {\n const initialLength = event.notes.length;\n event.notes = event.notes.filter((n) => n.id !== this.note.id);\n return event.notes.length !== initialLength;\n });\n }\n}\n","import { Command } from './types';\nimport { Score, ScoreEvent, Note } from '@/types';\nimport { updateMeasure } from '@/utils/commandHelpers';\n\nexport class DeleteNoteCommand implements Command {\n public readonly type = 'DELETE_NOTE';\n private deletedEventIndex: number = -1;\n private deletedEvent: ScoreEvent | null = null;\n private deletedNote: Note | null = null;\n private wasLastNoteInEvent: boolean = false;\n\n constructor(\n private measureIndex: number,\n private eventId: string | number,\n private noteId: string | number,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n return updateMeasure(score, this.staffIndex, this.measureIndex, (measure) => {\n const eventIndex = measure.events.findIndex((e) => e.id === this.eventId);\n if (eventIndex === -1) return false;\n\n const event = { ...measure.events[eventIndex] };\n this.deletedEventIndex = eventIndex;\n\n const noteIndex = event.notes.findIndex((n) => n.id === this.noteId);\n if (noteIndex === -1) return false;\n\n this.deletedNote = event.notes[noteIndex];\n\n if (event.notes.length === 1) {\n // Remove entire event\n this.wasLastNoteInEvent = true;\n this.deletedEvent = event;\n const newEvents = [...measure.events];\n newEvents.splice(eventIndex, 1);\n measure.events = newEvents;\n } else {\n // Remove just the note\n this.wasLastNoteInEvent = false;\n const newNotes = [...event.notes];\n newNotes.splice(noteIndex, 1);\n event.notes = newNotes;\n\n const newEvents = [...measure.events];\n newEvents[eventIndex] = event;\n measure.events = newEvents;\n }\n return true;\n });\n }\n\n undo(score: Score): Score {\n if (this.deletedEventIndex === -1 || !this.deletedNote) return score;\n\n return updateMeasure(score, this.staffIndex, this.measureIndex, (measure) => {\n const newEvents = [...measure.events];\n\n if (this.wasLastNoteInEvent && this.deletedEvent) {\n // Restore entire event\n newEvents.splice(this.deletedEventIndex, 0, this.deletedEvent);\n } else {\n // Restore note to event\n // Try to find event at original index first (optimistic)\n let targetIndex = this.deletedEventIndex;\n let event = newEvents[targetIndex];\n\n // Verify ID match\n if (!event || event.id !== this.eventId) {\n targetIndex = newEvents.findIndex((e) => e.id === this.eventId);\n if (targetIndex === -1) return false; // Cannot restore\n event = newEvents[targetIndex];\n }\n\n // Clone event and add note\n const newEvent = { ...event };\n newEvent.notes = [...newEvent.notes, this.deletedNote!];\n\n newEvents[targetIndex] = newEvent;\n }\n\n measure.events = newEvents;\n return true;\n });\n }\n}\n","import { Command } from './types';\nimport { Score, getActiveStaff, ScoreEvent } from '@/types';\n\nexport class DeleteEventCommand implements Command {\n public readonly type = 'DELETE_EVENT';\n private deletedEventIndex: number = -1;\n private deletedEvent: ScoreEvent | null = null;\n\n constructor(\n private measureIndex: number,\n private eventId: string | number,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n const activeStaff = getActiveStaff(score, this.staffIndex);\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.measureIndex]) return score;\n\n const measure = { ...newMeasures[this.measureIndex] };\n const eventIndex = measure.events.findIndex((e) => e.id === this.eventId);\n\n if (eventIndex === -1) return score;\n\n this.deletedEvent = measure.events[eventIndex];\n this.deletedEventIndex = eventIndex;\n\n const newEvents = [...measure.events];\n newEvents.splice(eventIndex, 1);\n measure.events = newEvents;\n\n newMeasures[this.measureIndex] = measure;\n const newStaves = [...score.staves];\n newStaves[this.staffIndex] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n\n undo(score: Score): Score {\n if (this.deletedEventIndex === -1 || !this.deletedEvent) return score;\n\n const activeStaff = getActiveStaff(score, this.staffIndex);\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.measureIndex]) return score;\n\n const measure = { ...newMeasures[this.measureIndex] };\n const newEvents = [...measure.events];\n\n newEvents.splice(this.deletedEventIndex, 0, this.deletedEvent);\n\n measure.events = newEvents;\n newMeasures[this.measureIndex] = measure;\n\n const newStaves = [...score.staves];\n newStaves[this.staffIndex] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n}\n","import { Command } from './types';\nimport { Score } from '@/types';\nimport { updateNote } from '@/utils/commandHelpers';\n\nexport class ChangePitchCommand implements Command {\n public readonly type = 'CHANGE_PITCH';\n private oldPitch: string | null = null;\n\n constructor(\n private measureIndex: number,\n private eventId: string | number,\n private noteId: string | number,\n private newPitch: string,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n return updateNote(\n score,\n this.staffIndex,\n this.measureIndex,\n this.eventId,\n this.noteId,\n (note) => {\n this.oldPitch = note.pitch;\n note.pitch = this.newPitch;\n return true;\n }\n );\n }\n\n undo(score: Score): Score {\n if (this.oldPitch === null) return score;\n\n return updateNote(\n score,\n this.staffIndex,\n this.measureIndex,\n this.eventId,\n this.noteId,\n (note) => {\n note.pitch = this.oldPitch!;\n return true;\n }\n );\n }\n}\n","import { useCallback, RefObject } from 'react';\nimport { getAppendPreviewNote } from '@/utils/interaction';\nimport { canAddEventToMeasure } from '@/utils/validation';\nimport { playNote } from '@/engines/toneEngine';\nimport { applyKeySignature } from '@/services/MusicService';\nimport { Note } from 'tonal';\nimport { Score, getActiveStaff, createDefaultSelection, Selection } from '@/types';\nimport { Command } from '@/commands/types';\nimport { AddEventCommand } from '@/commands/AddEventCommand';\nimport { AddNoteToEventCommand } from '@/commands/AddNoteToEventCommand';\nimport { AddMeasureCommand } from '@/commands/MeasureCommands';\nimport { DeleteNoteCommand } from '@/commands/DeleteNoteCommand';\nimport { DeleteEventCommand } from '@/commands/DeleteEventCommand';\nimport { ChangePitchCommand } from '@/commands/ChangePitchCommand';\n\nimport { InputMode } from './useEditorTools';\n\ninterface UseNoteActionsProps {\n scoreRef: RefObject<Score>;\n selection: Selection;\n setSelection: React.Dispatch<React.SetStateAction<Selection>>;\n select: (\n measureIndex: number | null,\n eventId: string | number | null,\n noteId: string | number | null,\n staffIndex?: number,\n options?: any\n ) => void;\n setPreviewNote: (note: any) => void;\n activeDuration: string;\n isDotted: boolean;\n activeAccidental: 'flat' | 'natural' | 'sharp' | null;\n activeTie: boolean;\n currentQuantsPerMeasure: number;\n dispatch: (command: Command) => void;\n /** Input mode: NOTE or REST */\n inputMode: InputMode;\n // deprecated but currently passed by useScoreLogic before refactor is complete\n syncToolbarState?: any;\n}\n\ninterface UseNoteActionsReturn {\n handleMeasureHover: (\n measureIndex: number | null,\n hit: any,\n pitch: string,\n staffIndex?: number\n ) => void;\n addNoteToMeasure: (\n measureIndex: number,\n newNote: any,\n shouldAutoAdvance?: boolean,\n placementOverride?: any\n ) => void;\n addChordToMeasure: (\n measureIndex: number,\n notes: any[],\n duration: string,\n dotted: boolean\n ) => void;\n deleteSelected: () => void;\n updateNotePitch: (\n measureIndex: number,\n eventId: string | number,\n noteId: string | number,\n newPitch: string\n ) => void;\n}\n\n/**\n * Hook for note-level actions: add, delete, chord, and pitch updates.\n */\nexport const useNoteActions = ({\n scoreRef,\n selection,\n setSelection,\n select,\n setPreviewNote,\n activeDuration,\n isDotted,\n activeAccidental,\n activeTie,\n currentQuantsPerMeasure,\n dispatch,\n inputMode,\n}: UseNoteActionsProps): UseNoteActionsReturn => {\n const handleMeasureHover = useCallback(\n (measureIndex: number | null, hit: any, rawPitch: string, staffIndex: number = 0) => {\n if (measureIndex === null || !hit) {\n // Only clear preview if this call is from the same staff as current preview\n // This prevents staff B's mouseLeave from clearing staff A's preview\n setPreviewNote((prev: any) => {\n if (!prev) return null;\n if (prev.staffIndex === staffIndex) return null;\n return prev; // Different staff, keep current preview\n });\n return;\n }\n\n // If rawPitch is empty (Y position outside pitch range), keep previous preview\n // This prevents \"dead zones\" where hover does nothing\n if (!rawPitch) {\n return; // Keep existing preview state\n }\n\n const currentScore = scoreRef.current;\n const currentStaff = getActiveStaff(currentScore, staffIndex);\n const measure = currentStaff.measures[measureIndex];\n\n // --- PITCH CALCULATION ---\n let finalPitch = rawPitch;\n const keySig = currentStaff.keySignature || currentScore.keySignature || 'C';\n\n if (activeAccidental) {\n // User has explicit tool selected (Flat/Sharp/Natural)\n // Apply ABSOLUTE accidental to the raw letter.\n // e.g. \"F4\" + \"flat\" -> \"Fb4\" (Even in Key of G)\n // e.g. \"F4\" + \"sharp\" -> \"F#4\"\n const note = Note.get(rawPitch);\n if (!note.empty && note.letter && note.oct !== undefined) {\n if (activeAccidental === 'sharp') finalPitch = `${note.letter}#${note.oct}`;\n else if (activeAccidental === 'flat') finalPitch = `${note.letter}b${note.oct}`;\n else if (activeAccidental === 'natural') finalPitch = `${note.letter}${note.oct}`;\n }\n } else {\n // Default: Snap to Key Signature\n // e.g. \"F4\" in G Major -> \"F#4\"\n finalPitch = applyKeySignature(rawPitch, keySig);\n }\n\n let targetMeasureIndex = measureIndex;\n let targetIndex = hit.index;\n let targetMode = hit.type === 'EVENT' ? 'CHORD' : hit.type === 'INSERT' ? 'INSERT' : 'APPEND';\n\n if (targetMode === 'INSERT' && targetIndex === measure.events.length) {\n targetMode = 'APPEND';\n }\n\n if (targetMode === 'APPEND') {\n if (\n !canAddEventToMeasure(measure.events, activeDuration, isDotted, currentQuantsPerMeasure)\n ) {\n if (measureIndex === currentStaff.measures.length - 1) {\n targetMeasureIndex = measureIndex + 1;\n targetIndex = 0;\n } else {\n setPreviewNote(null);\n return;\n }\n } else {\n if (measure.events.length > 0) {\n targetMode = 'INSERT';\n targetIndex = measure.events.length;\n }\n }\n } else if (targetMode === 'INSERT') {\n if (\n !canAddEventToMeasure(measure.events, activeDuration, isDotted, currentQuantsPerMeasure)\n ) {\n setPreviewNote(null);\n return;\n }\n }\n\n // Build new preview object\n const newPreview = {\n measureIndex: targetMeasureIndex,\n staffIndex,\n quant: 0,\n visualQuant: 0,\n pitch: finalPitch,\n duration: activeDuration,\n dotted: isDotted,\n mode: targetMode,\n index: targetIndex,\n eventId: hit.type === 'EVENT' ? hit.eventId : undefined,\n isRest: inputMode === 'REST',\n source: 'hover' as const, // Mark as hover-triggered for auto-scroll filtering\n };\n\n // Only update if preview actually changed to avoid flickering\n setPreviewNote((prev: any) => {\n if (!prev) return newPreview;\n // Compare key fields - for rests, ignore pitch since it's not used\n const pitchMatch = newPreview.isRest ? true : prev.pitch === newPreview.pitch;\n if (\n prev.measureIndex === newPreview.measureIndex &&\n prev.staffIndex === newPreview.staffIndex &&\n pitchMatch &&\n prev.mode === newPreview.mode &&\n prev.index === newPreview.index &&\n prev.isRest === newPreview.isRest &&\n prev.duration === newPreview.duration &&\n prev.dotted === newPreview.dotted\n ) {\n return prev; // Return same reference to avoid re-render\n }\n return newPreview;\n });\n },\n [\n activeDuration,\n isDotted,\n currentQuantsPerMeasure,\n scoreRef,\n setPreviewNote,\n activeAccidental,\n inputMode,\n ]\n );\n\n const addNoteToMeasure = useCallback(\n (\n measureIndex: number,\n newNote: any,\n shouldAutoAdvance = false,\n placementOverride: any = null\n ) => {\n const currentScore = scoreRef.current;\n // Use staff from newNote (preview) if available, otherwise selection\n const currentStaffIndex =\n newNote.staffIndex !== undefined ? newNote.staffIndex : selection.staffIndex;\n const currentStaffData = getActiveStaff(currentScore, currentStaffIndex);\n\n const newMeasures = [...currentStaffData.measures];\n\n // Ensure measure exists (though Command handles logic usually)\n\n const targetMeasure = { ...newMeasures[measureIndex] };\n if (!targetMeasure.events) targetMeasure.events = [];\n\n // Determine placement\n let insertIndex = targetMeasure.events.length;\n let mode = 'APPEND';\n\n if (placementOverride) {\n mode = placementOverride.mode;\n insertIndex = placementOverride.index;\n } else if (newNote.mode) {\n mode = newNote.mode;\n insertIndex = newNote.index;\n }\n\n // Check capacity\n if (\n mode !== 'CHORD' &&\n !canAddEventToMeasure(\n targetMeasure.events,\n activeDuration,\n isDotted,\n currentQuantsPerMeasure\n )\n ) {\n if (shouldAutoAdvance && measureIndex === currentStaffData.measures.length - 1) {\n // Auto-create new measure via Command\n dispatch(new AddMeasureCommand());\n // Recursive call will now target the new measure\n addNoteToMeasure(measureIndex + 1, { ...newNote, staffIndex: currentStaffIndex }, false, {\n mode: 'APPEND',\n index: 0,\n });\n return;\n } else {\n // Cannot add\n return;\n }\n }\n\n // Resolve Event ID for CHORD mode\n const targetEventId =\n placementOverride?.eventId ||\n newNote.eventId ||\n (mode === 'CHORD' && targetMeasure.events[insertIndex]?.id);\n\n if (mode === 'CHORD' && targetEventId) {\n // Add note to existing event (only for notes, not rests)\n if (inputMode === 'REST') {\n // Cannot add rest as chord - rests are standalone events\n return;\n }\n const noteToAdd = {\n id: Date.now() + 1,\n pitch: newNote.pitch,\n accidental: activeAccidental,\n tied: activeTie,\n };\n dispatch(\n new AddNoteToEventCommand(measureIndex, targetEventId, noteToAdd, currentStaffIndex)\n );\n\n // Update selection to the new note\n select(measureIndex, targetEventId, noteToAdd.id, currentStaffIndex);\n setPreviewNote(null);\n } else {\n // NEW EVENT (note or rest) - unified path\n const eventId = Date.now().toString();\n const isRest = inputMode === 'REST';\n\n // Build note payload (null for rests)\n const notePayload = isRest\n ? null\n : {\n id: Date.now() + 1,\n pitch: newNote.pitch,\n accidental: activeAccidental,\n tied: activeTie,\n };\n\n // Determine the noteId for selection tracking\n const noteId = isRest ? `${eventId}-rest` : notePayload!.id;\n\n dispatch(\n new AddEventCommand(\n measureIndex,\n isRest,\n notePayload,\n activeDuration,\n isDotted,\n mode === 'INSERT' ? insertIndex : undefined,\n eventId,\n currentStaffIndex\n )\n );\n\n // Update selection history only (mimics consistent behavior for both)\n select(measureIndex, eventId, noteId, currentStaffIndex, { onlyHistory: true });\n setPreviewNote(null);\n }\n\n // Only play sound for notes, not rests\n if (inputMode === 'NOTE') {\n playNote(newNote.pitch);\n }\n\n if (shouldAutoAdvance && mode === 'APPEND') {\n const simulatedEvents = [...targetMeasure.events];\n simulatedEvents.push({\n id: 'sim-event',\n duration: activeDuration,\n dotted: isDotted,\n notes: [{ id: 9999, pitch: newNote.pitch, tied: false }],\n });\n\n const simulatedMeasure = { ...targetMeasure, events: simulatedEvents };\n\n const nextPreview = getAppendPreviewNote(\n simulatedMeasure,\n measureIndex,\n currentStaffIndex,\n activeDuration,\n isDotted,\n newNote.pitch,\n inputMode === 'REST'\n );\n\n if (nextPreview.quant >= currentQuantsPerMeasure) {\n const nextMeasureIndex = measureIndex + 1;\n // Create new measure if it doesn't exist\n if (nextMeasureIndex >= currentStaffData.measures.length) {\n dispatch(new AddMeasureCommand());\n }\n setPreviewNote({\n measureIndex: nextMeasureIndex,\n staffIndex: currentStaffIndex,\n quant: 0,\n visualQuant: 0,\n pitch: newNote.pitch,\n duration: activeDuration,\n dotted: isDotted,\n mode: 'APPEND',\n index: 0,\n source: 'keyboard' as const, // Entry-triggered, should scroll\n });\n } else {\n setPreviewNote({ ...nextPreview, source: 'keyboard' as const });\n }\n return;\n }\n\n setPreviewNote(null);\n },\n [\n activeDuration,\n isDotted,\n currentQuantsPerMeasure,\n scoreRef,\n setPreviewNote,\n activeAccidental,\n activeTie,\n dispatch,\n selection,\n select,\n inputMode,\n ]\n );\n\n const deleteSelected = useCallback(() => {\n // 1. Delete Multi-Selection\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n const notesToDelete = [...selection.selectedNotes];\n notesToDelete.forEach((note) => {\n if (note.noteId) {\n dispatch(\n new DeleteNoteCommand(note.measureIndex, note.eventId, note.noteId, note.staffIndex)\n );\n } else {\n // If this state is reached (event selected but no noteId?), delete event.\n // But new logic says we always have noteId.\n // However, safe fallback:\n dispatch(new DeleteEventCommand(note.measureIndex, note.eventId, note.staffIndex));\n }\n });\n // Clear selection after delete\n select(null, null, null, selection.staffIndex);\n return;\n }\n\n if (selection.measureIndex === null || !selection.eventId) return;\n\n // 2. Delete Single Selection\n if (selection.noteId) {\n dispatch(\n new DeleteNoteCommand(\n selection.measureIndex,\n selection.eventId,\n selection.noteId,\n selection.staffIndex\n )\n );\n } else {\n // Fallback for \"event selected\" (though effectively caught by multi-select usually if we select all notes)\n dispatch(\n new DeleteEventCommand(selection.measureIndex, selection.eventId, selection.staffIndex)\n );\n }\n\n select(null, null, null, selection.staffIndex);\n }, [selection, dispatch, select]);\n\n const addChordToMeasure = useCallback(\n (measureIndex: number, notes: any[], duration: string, dotted: boolean) => {\n if (!notes || notes.length === 0) return;\n\n const eventId = Date.now().toString();\n const firstNote = notes[0];\n\n const noteToAdd = {\n id: Date.now() + 1,\n pitch: firstNote.pitch,\n accidental: firstNote.accidental,\n tied: false,\n };\n\n dispatch(\n new AddEventCommand(\n measureIndex,\n false, // isRest = false for chord notes\n noteToAdd,\n duration,\n dotted,\n undefined,\n eventId,\n selection.staffIndex\n )\n );\n\n for (let i = 1; i < notes.length; i++) {\n const note = notes[i];\n const chordNote = {\n id: Date.now() + 1 + i,\n pitch: note.pitch,\n accidental: note.accidental,\n tied: false,\n };\n dispatch(new AddNoteToEventCommand(measureIndex, eventId, chordNote, selection.staffIndex));\n }\n\n // Select the first note of the chord\n select(measureIndex, eventId, noteToAdd.id, selection.staffIndex);\n setPreviewNote(null);\n },\n [dispatch, select, setPreviewNote, selection.staffIndex]\n );\n\n const updateNotePitch = useCallback(\n (measureIndex: number, eventId: string | number, noteId: string | number, newPitch: string) => {\n dispatch(\n new ChangePitchCommand(measureIndex, eventId, noteId, newPitch, selection.staffIndex)\n );\n },\n [dispatch, selection.staffIndex]\n );\n\n return {\n handleMeasureHover,\n addNoteToMeasure,\n addChordToMeasure,\n deleteSelected,\n updateNotePitch,\n };\n};\n","import { Command } from './types';\nimport { Score, ScoreEvent } from '@/types';\n\nexport class UpdateEventCommand implements Command {\n public readonly type = 'UPDATE_EVENT';\n private previousEvent: ScoreEvent | null = null;\n\n constructor(\n private measureIndex: number,\n private eventId: string | number,\n private updates: Partial<ScoreEvent>,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n const activeStaff = score.staves[this.staffIndex];\n if (!activeStaff) return score;\n\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.measureIndex]) return score;\n\n const measure = { ...newMeasures[this.measureIndex] };\n const eventIndex = measure.events.findIndex((e) => e.id === this.eventId);\n\n if (eventIndex === -1) return score;\n\n const event = { ...measure.events[eventIndex] };\n this.previousEvent = event;\n\n const newEvent = { ...event, ...this.updates };\n\n const newEvents = [...measure.events];\n newEvents[eventIndex] = newEvent;\n measure.events = newEvents;\n\n newMeasures[this.measureIndex] = measure;\n const newStaves = [...score.staves];\n newStaves[this.staffIndex] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n\n undo(score: Score): Score {\n if (!this.previousEvent) return score;\n\n const activeStaff = score.staves[this.staffIndex];\n if (!activeStaff) return score;\n\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.measureIndex]) return score;\n\n const measure = { ...newMeasures[this.measureIndex] };\n const eventIndex = measure.events.findIndex((e) => e.id === this.eventId);\n\n if (eventIndex === -1) return score;\n\n const newEvents = [...measure.events];\n newEvents[eventIndex] = this.previousEvent;\n measure.events = newEvents;\n\n newMeasures[this.measureIndex] = measure;\n const newStaves = [...score.staves];\n newStaves[this.staffIndex] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n}\n","import { Command } from './types';\nimport { Score, Note } from '@/types';\nimport { updateNote } from '@/utils/commandHelpers';\n\nexport class UpdateNoteCommand implements Command {\n public readonly type = 'UPDATE_NOTE';\n private previousNote: Note | null = null;\n\n constructor(\n private measureIndex: number,\n private eventId: string | number,\n private noteId: string | number,\n private updates: Partial<Note>,\n private staffIndex: number = 0\n ) {}\n\n execute(score: Score): Score {\n return updateNote(\n score,\n this.staffIndex,\n this.measureIndex,\n this.eventId,\n this.noteId,\n (note) => {\n this.previousNote = { ...note };\n Object.assign(note, this.updates);\n return true;\n }\n );\n }\n\n undo(score: Score): Score {\n if (!this.previousNote) return score;\n\n return updateNote(\n score,\n this.staffIndex,\n this.measureIndex,\n this.eventId,\n this.noteId,\n (note) => {\n // Restore all properties from previousNote\n // Note: Object.assign implies we overwrite keys, but if 'updates' added keys that were undefined,\n // previousNote might not have them. A strict 'replace' logic is safer if we want full undo.\n // updateNote gives us a clone of the current note.\n // The safest way is to replace the properties we changed.\n\n // Since 'updates' is Partial<Note>, we can just re-apply previousNote properties?\n // Actually, updateNote expects modification of the passed 'note' object.\n // We can just Object.assign(note, this.previousNote).\n Object.assign(note, this.previousNote);\n return true;\n }\n );\n }\n}\n","import { useCallback, RefObject } from 'react';\nimport { canModifyEventDuration, canToggleEventDot } from '@/utils/validation';\nimport { getNoteDuration } from '@/utils/core';\nimport { playNote } from '@/engines/toneEngine';\nimport { Score, getActiveStaff, Selection, Note as ScoreNote } from '@/types';\nimport { Command } from '@/commands/types';\nimport { UpdateEventCommand } from '@/commands/UpdateEventCommand';\nimport { UpdateNoteCommand } from '@/commands/UpdateNoteCommand';\nimport { Note as TonalNote } from 'tonal';\n\ninterface UseModifiersProps {\n scoreRef: RefObject<Score>;\n selection: Selection;\n currentQuantsPerMeasure: number;\n tools: {\n handleDurationChange: (duration: string) => void;\n handleDotToggle: () => boolean;\n handleAccidentalToggle: (type: 'flat' | 'natural' | 'sharp' | null) => string | null;\n handleTieToggle: () => boolean;\n isDotted: boolean;\n activeTie: boolean;\n activeAccidental: 'flat' | 'natural' | 'sharp' | null;\n };\n dispatch: (command: Command) => void;\n}\n\ninterface UseModifiersReturn {\n handleDurationChange: (newDuration: string, applyToSelection?: boolean) => void;\n handleDotToggle: () => void;\n handleAccidentalToggle: (type: 'flat' | 'natural' | 'sharp' | null) => void;\n handleTieToggle: () => void;\n checkDurationValidity: (targetDuration: string) => boolean;\n checkDotValidity: () => boolean;\n}\n\n// --- Helpers ---\n\nconst getNoteTargets = (\n selection: Selection\n): Array<{\n measureIndex: number;\n eventId: string | number;\n noteId: string | number;\n staffIndex: number;\n}> => {\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n return selection.selectedNotes\n .filter((n) => n.noteId)\n .map((n) => ({\n measureIndex: n.measureIndex,\n eventId: n.eventId,\n noteId: n.noteId!,\n staffIndex: n.staffIndex,\n }));\n } else if (selection.measureIndex !== null && selection.eventId && selection.noteId) {\n return [\n {\n measureIndex: selection.measureIndex,\n eventId: selection.eventId,\n noteId: selection.noteId,\n staffIndex: selection.staffIndex !== undefined ? selection.staffIndex : 0,\n },\n ];\n }\n return [];\n};\n\nconst getEventTargets = (\n selection: Selection\n): Array<{ measureIndex: number; eventId: string | number; staffIndex: number }> => {\n const targets: Array<{ measureIndex: number; eventId: string | number; staffIndex: number }> = [];\n\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n selection.selectedNotes.forEach((n) => {\n const exists = targets.find(\n (t) =>\n t.measureIndex === n.measureIndex &&\n t.eventId === n.eventId &&\n t.staffIndex === n.staffIndex\n );\n if (!exists) {\n targets.push({\n measureIndex: n.measureIndex,\n eventId: n.eventId,\n staffIndex: n.staffIndex,\n });\n }\n });\n } else if (selection.measureIndex !== null && selection.eventId) {\n targets.push({\n measureIndex: selection.measureIndex,\n eventId: selection.eventId,\n staffIndex: selection.staffIndex !== undefined ? selection.staffIndex : 0,\n });\n }\n return targets;\n};\n\n// State Setting Logic:\n// Sharp Button -> Set to X#\n// Flat Button -> Set to Xb\n// Natural Button -> Set to X (natural)\nconst calculateNewPitch = (\n currentPitch: string,\n targetType: 'flat' | 'natural' | 'sharp'\n): string | null => {\n const note = TonalNote.get(currentPitch);\n if (note.empty) return null;\n\n const letter = note.letter; // e.g., \"C\"\n const oct = note.oct; // e.g., 4\n if (!letter || oct === undefined) return null;\n\n if (targetType === 'sharp') {\n return `${letter}#${oct}`;\n } else if (targetType === 'flat') {\n return `${letter}b${oct}`;\n } else if (targetType === 'natural') {\n return `${letter}${oct}`;\n }\n\n return currentPitch;\n};\n\n/**\n * Hook for modifier actions: duration, dot, accidental, and tie toggles.\n */\nexport const useModifiers = ({\n scoreRef,\n selection,\n currentQuantsPerMeasure,\n tools,\n dispatch,\n}: UseModifiersProps): UseModifiersReturn => {\n const handleDurationChange = useCallback(\n (newDuration: string, applyToSelection = false) => {\n // Always update the active tool state\n tools.handleDurationChange(newDuration);\n\n // If requested, try to apply to selection\n if (applyToSelection) {\n const targets = getEventTargets(selection);\n\n // Iterate and apply if valid\n targets.forEach((target) => {\n const staff =\n scoreRef.current.staves[target.staffIndex] || getActiveStaff(scoreRef.current);\n const measure = staff.measures[target.measureIndex];\n if (\n measure &&\n canModifyEventDuration(\n measure.events,\n target.eventId,\n newDuration,\n currentQuantsPerMeasure\n )\n ) {\n dispatch(\n new UpdateEventCommand(\n target.measureIndex,\n target.eventId,\n { duration: newDuration },\n target.staffIndex\n )\n );\n }\n });\n }\n },\n [selection, tools, dispatch, scoreRef, currentQuantsPerMeasure]\n );\n\n const handleDotToggle = useCallback(() => {\n const targets = getEventTargets(selection);\n\n // Entry Mode / No Selection: Toggle tool state only\n if (targets.length === 0) {\n tools.handleDotToggle();\n return;\n }\n\n const score = scoreRef.current;\n\n // 1. Fetch event objects to determine global state\n const eventObjects = targets\n .map((t) => {\n const staff = score.staves[t.staffIndex] || getActiveStaff(score);\n return staff.measures[t.measureIndex]?.events.find((e: any) => e.id === t.eventId);\n })\n .filter((e): e is any => !!e);\n\n if (eventObjects.length === 0) return;\n\n // 2. Determine consistency\n // User Request: Turn OFF if heterogeneous.\n // If ANY are dotted, we turn OFF. Only if NONE are dotted do we turn ON.\n const hasAnyDotted = eventObjects.some((e) => e.dotted);\n const targetState = !hasAnyDotted;\n\n // Update tool state to match target\n // We can't set directly, but we can try to sync if mismatched (optional)\n // tools.isDotted is local.\n\n // 3. Apply to all targets\n targets.forEach((target) => {\n const staff = score.staves[target.staffIndex] || getActiveStaff(score);\n const measure = staff.measures[target.measureIndex];\n const event = measure?.events.find((e: any) => e.id === target.eventId);\n\n if (event) {\n // Skip if already in target state\n if (!!event.dotted === targetState) return;\n\n if (canToggleEventDot(measure.events, target.eventId, currentQuantsPerMeasure)) {\n dispatch(\n new UpdateEventCommand(\n target.measureIndex,\n target.eventId,\n { dotted: targetState },\n target.staffIndex\n )\n );\n }\n }\n });\n\n // Sync tool UI (approximate)\n if (tools.isDotted !== targetState) tools.handleDotToggle();\n }, [selection, tools, dispatch, scoreRef, currentQuantsPerMeasure]);\n\n const handleAccidentalToggle = useCallback(\n (type: 'flat' | 'natural' | 'sharp' | null) => {\n if (!type) return;\n\n // Apply logic to finding target\n const targets = getNoteTargets(selection);\n\n // Entry Mode: Toggle tool state\n if (targets.length === 0) {\n tools.handleAccidentalToggle(type);\n return;\n }\n\n const score = scoreRef.current; // access current ref\n\n // 1. Determine consistency (\"Are all selected notes already this type?\")\n const noteObjects = targets\n .map((t) => {\n const staff = score.staves[t.staffIndex] || getActiveStaff(score);\n const event = staff.measures[t.measureIndex]?.events.find((e: any) => e.id === t.eventId);\n // Explicitly cast or check if it matches ScoreNote interface roughly\n return event?.notes.find((n: any) => n.id === t.noteId);\n })\n .filter((n): n is ScoreNote => !!n && n.pitch !== null); // Filter out rests\n\n if (noteObjects.length === 0) return;\n\n const allMatch = noteObjects.every((n) => {\n const note = TonalNote.get(n.pitch!);\n if (type === 'sharp') return note.acc === '#';\n if (type === 'flat') return note.acc === 'b';\n if (type === 'natural') return !note.acc;\n return false;\n });\n\n // 2. Decide Target Action\n // If all match the requested type, toggle OFF (to natural).\n // EXCEPTION: If request is Natural, and all match Natural -> Stay Natural (idempotent).\n let targetType = type;\n if (allMatch && type !== 'natural') {\n targetType = 'natural';\n }\n\n // 3. Apply to all targets\n targets.forEach((target) => {\n const staff = score.staves[target.staffIndex] || getActiveStaff(score);\n const measure = staff.measures[target.measureIndex];\n const event = measure?.events.find((e: any) => e.id === target.eventId);\n const note = event?.notes.find((n: any) => n.id === target.noteId);\n\n // Skip rest notes (null pitch)\n if (note && note.pitch !== null) {\n const newPitch = calculateNewPitch(note.pitch, targetType);\n if (newPitch && newPitch !== note.pitch) {\n dispatch(\n new UpdateNoteCommand(\n target.measureIndex,\n target.eventId,\n target.noteId,\n { pitch: newPitch },\n target.staffIndex\n )\n );\n }\n }\n });\n\n // Play tone for the PRIMARY selection (if it was updated)\n if (selection.measureIndex !== null && selection.eventId && selection.noteId) {\n // Re-calculate simply for preview\n const staffIdx = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n const staff = score.staves[staffIdx] || getActiveStaff(score);\n const measure = staff.measures[selection.measureIndex];\n const event = measure?.events.find((e: any) => e.id === selection.eventId);\n const note = event?.notes.find((n: any) => n.id === selection.noteId);\n // Skip rest notes (null pitch)\n if (note && note.pitch !== null) {\n const newPitch = calculateNewPitch(note.pitch, targetType);\n if (newPitch) playNote(newPitch);\n }\n }\n\n // Update toolbar state\n tools.handleAccidentalToggle(null);\n },\n [selection, tools, dispatch, scoreRef]\n );\n\n const handleTieToggle = useCallback(() => {\n const targets = getNoteTargets(selection);\n\n // Entry Mode\n if (targets.length === 0) {\n tools.handleTieToggle();\n return;\n }\n\n const score = scoreRef.current;\n\n // 1. Fetch note objects\n const noteObjects = targets\n .map((t) => {\n const staff = score.staves[t.staffIndex] || getActiveStaff(score);\n const measure = staff.measures[t.measureIndex];\n const event = measure?.events.find((e: any) => e.id === t.eventId);\n return event?.notes.find((n: any) => n.id === t.noteId);\n })\n .filter((n): n is any => !!n);\n\n if (noteObjects.length === 0) return;\n\n // 2. Determine target state\n // \"Use the same pattern for ties\" -> If ANY tied, turn OFF.\n const hasAnyTied = noteObjects.some((n) => n.tied);\n const targetState = !hasAnyTied;\n\n // 3. Apply to all targets\n targets.forEach((target) => {\n // We just dispatch. Note updates don't require measure-level validation usually (unless changing pitch/duration invalidates something else?)\n // Ties don't affect duration. Safe.\n dispatch(\n new UpdateNoteCommand(\n target.measureIndex,\n target.eventId,\n target.noteId,\n { tied: targetState },\n target.staffIndex\n )\n );\n });\n\n // Sync tool UI\n if (tools.activeTie !== targetState) tools.handleTieToggle();\n }, [selection, tools, dispatch, scoreRef]);\n\n const checkDurationValidity = useCallback(\n (targetDuration: string) => {\n if (selection.measureIndex === null || !selection.eventId) return true;\n\n const staffIdx = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n const staff = scoreRef.current.staves[staffIdx];\n if (!staff) return true;\n\n const measure = staff.measures[selection.measureIndex];\n if (!measure) return true;\n\n return canModifyEventDuration(\n measure.events,\n selection.eventId,\n targetDuration,\n currentQuantsPerMeasure\n );\n },\n [selection, currentQuantsPerMeasure, scoreRef]\n );\n\n const checkDotValidity = useCallback(() => {\n if (selection.measureIndex === null || !selection.eventId) return true;\n\n const staffIdx = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n const staff = scoreRef.current.staves[staffIdx];\n if (!staff) return true;\n\n const measure = staff.measures[selection.measureIndex];\n if (!measure) return true;\n\n return canToggleEventDot(measure.events, selection.eventId, currentQuantsPerMeasure);\n }, [selection, currentQuantsPerMeasure, scoreRef]);\n\n return {\n handleDurationChange,\n handleDotToggle,\n handleAccidentalToggle,\n handleTieToggle,\n checkDurationValidity,\n checkDotValidity,\n };\n};\n","import { Command } from './types';\nimport { Score, getActiveStaff, Selection, Staff } from '@/types';\nimport { movePitchVisual } from '@/services/MusicService';\nimport { PIANO_RANGE } from '@/constants';\n\nexport class TransposeSelectionCommand implements Command {\n public readonly type = 'TRANSPOSE_SELECTION';\n\n constructor(\n private selection: Selection,\n private semitones: number,\n private keySignature: string = 'C'\n ) {}\n\n execute(score: Score): Score {\n if (this.selection.measureIndex === null) return score;\n\n const staffIndex = this.selection.staffIndex ?? 0;\n const activeStaff = getActiveStaff(score, staffIndex);\n // Key-aware transposition uses the key signature, not clef\n const keySig = activeStaff.keySignature || this.keySignature || 'C';\n\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.selection.measureIndex]) return score;\n\n const measure = { ...newMeasures[this.selection.measureIndex] };\n\n // Determine transposition logic\n // The command is called \"semitones\", but typically \"Transpose Selection\" via arrows means \"Visual Steps\".\n // If semitones is small (+/- 1), it usually implies Steps (User pressed Arrow).\n // If semitones is large (+12), it implies Shift+Arrow (Octave).\n\n // BUG FIX: The caller (useNavigation) was passing +12 Semitones for Shift+Up,\n // but the old PitchService treated it as Steps (Octave+6th).\n // Here we need to decide if we are moving by Steps or Semitones.\n\n // For now, let's assume 'semitones' actually means 'steps' in the context of arrow keys.\n // If it's +/- 12, that's 7 steps (Octave).\n // Caller needs to send correct step count?\n // Or we handle it here.\n\n let steps = this.semitones;\n if (Math.abs(steps) === 12) {\n steps = steps > 0 ? 7 : -7;\n }\n\n // Helper for robust ID comparison\n const idsMatch = (a: string | number | null, b: string | number | null) =>\n String(a) === String(b);\n\n const transposeFn = (pitch: string) => movePitchVisual(pitch, steps, keySig, PIANO_RANGE);\n\n // CASE 0: Multi-Note Selection (using selection.selectedNotes)\n if (this.selection.selectedNotes && this.selection.selectedNotes.length > 0) {\n // We need to apply changes to potentially multiple measures/events/notes\n // We'll iterate through all selected notes and build a map of changes\n\n // Group by staff -> measure -> event\n // But since we return a new score, we have to copy structures.\n // Easiest way in this immutable pattern:\n // Deep copy the staves we need? Or just iterate and update?\n // Since performance matters less than correctness here (few selected notes usually):\n\n const newStaves = [...score.staves];\n const staffMap = new Map<number, Staff>(); // Cache modified staves\n\n this.selection.selectedNotes.forEach((sn) => {\n const sIndex = sn.staffIndex;\n let currentStaff = staffMap.get(sIndex);\n if (!currentStaff) {\n // First time touching this staff, copy it from newStaves (which starts as shallow copy of score.staves)\n currentStaff = { ...newStaves[sIndex], measures: [...newStaves[sIndex].measures] };\n staffMap.set(sIndex, currentStaff);\n newStaves[sIndex] = currentStaff; // Update result array reference\n }\n\n // Now find measure\n if (!currentStaff.measures[sn.measureIndex]) return;\n\n // We need to modify the measure. But we might have already modified it in this loop?\n // currentStaff.measures is a NEW array (copied above).\n // But the objects inside are shared until modified.\n\n // We need a way to ensure we edit the same object instance if we hit it twice.\n // Right now currentStaff.measures[i] might be original or already cloned.\n // We can clone it on demand.\n\n // BUT, if we clone it, we need to replace it in the array.\n // Since we are iterating effectively random access, we should probably check if we've cloned it?\n // A Set of cloned measure indices?\n\n // Actually, let's just do it directly on the structure we are building.\n // We need to be careful not to clone twice (losing previous edits) or edit original.\n\n // Let's assume we clone the measure object the first time we touch it?\n // Hard to track \"dirty\" state without a map.\n\n // SIMPLIFICATION:\n // Since `selectedNotes` is usually small, we can just process them.\n // But to avoid overwriting edits to the same measure:\n // We need a `measuresToUpdate` map per staff?\n // Map<measureIndex, Measure>\n });\n\n // Let's restart the approach:\n // 1. Identify all unique (staffIndex, measureIndex) pairs that need updates.\n // 2. For each such measure, find all selected notes within it.\n // 3. Apply changes.\n // 4. Update the score staves.\n\n // Step 1: Group notes by staff -> measure\n const notesByMeasure = new Map<string, typeof this.selection.selectedNotes>();\n\n this.selection.selectedNotes.forEach((sn) => {\n const key = `${sn.staffIndex}-${sn.measureIndex}`;\n if (!notesByMeasure.has(key)) notesByMeasure.set(key, []);\n notesByMeasure.get(key)!.push(sn);\n });\n\n // Step 2 & 3: Apply updates\n notesByMeasure.forEach((notesInMeasure, key) => {\n const [sIdxStr, mIdxStr] = key.split('-');\n const sIdx = parseInt(sIdxStr, 10);\n const mIdx = parseInt(mIdxStr, 10);\n\n // Ensure we have a working copy of the staff\n if (!staffMap.has(sIdx)) {\n staffMap.set(sIdx, {\n ...newStaves[sIdx],\n measures: [...newStaves[sIdx].measures],\n });\n newStaves[sIdx] = staffMap.get(sIdx)!;\n }\n const workingStaff = staffMap.get(sIdx)!;\n\n // Ensure working copy of measure\n const originalMeasure = workingStaff.measures[mIdx];\n if (!originalMeasure) return;\n\n const newMeasure = { ...originalMeasure, events: [...originalMeasure.events] };\n workingStaff.measures[mIdx] = newMeasure;\n\n // Process events in this measure\n // Group notes by event to avoid cloning event multiple times\n const notesByEvent = new Map<string, typeof notesInMeasure>();\n notesInMeasure.forEach((n) => {\n const eKey = String(n.eventId);\n if (!notesByEvent.has(eKey)) notesByEvent.set(eKey, []);\n notesByEvent.get(eKey)!.push(n);\n });\n\n notesByEvent.forEach((notesInEvent, eIdStr) => {\n const eventIndex = newMeasure.events.findIndex((e: any) => String(e.id) === eIdStr);\n if (eventIndex === -1) return;\n\n const newEvent = {\n ...newMeasure.events[eventIndex],\n notes: [...newMeasure.events[eventIndex].notes],\n };\n newMeasure.events[eventIndex] = newEvent;\n\n notesInEvent.forEach((nTarget) => {\n const noteIndex = newEvent.notes.findIndex((note: any) =>\n idsMatch(note.id, nTarget.noteId)\n );\n if (noteIndex !== -1) {\n const currentPitch = newEvent.notes[noteIndex].pitch;\n // Skip rest notes (null pitch)\n if (currentPitch !== null) {\n newEvent.notes[noteIndex] = {\n ...newEvent.notes[noteIndex],\n pitch: transposeFn(currentPitch),\n };\n }\n }\n });\n });\n });\n\n return { ...score, staves: newStaves };\n }\n\n // Case 1: Transpose specific note (Fallback for single selection or if selectedNotes is empty but noteId is set)\n if (this.selection.eventId && this.selection.noteId) {\n const eventIndex = measure.events.findIndex((e) => idsMatch(e.id, this.selection.eventId));\n if (eventIndex === -1) return score;\n\n const event = { ...measure.events[eventIndex] };\n const noteIndex = event.notes.findIndex((n) => idsMatch(n.id, this.selection.noteId));\n\n if (noteIndex === -1) return score;\n\n const note = { ...event.notes[noteIndex] };\n // Skip rest notes (null pitch)\n if (note.pitch !== null) {\n note.pitch = transposeFn(note.pitch);\n }\n\n const newNotes = [...event.notes];\n newNotes[noteIndex] = note;\n event.notes = newNotes;\n\n const newEvents = [...measure.events];\n newEvents[eventIndex] = event;\n measure.events = newEvents;\n }\n // Case 2: Transpose entire event (all notes)\n else if (this.selection.eventId) {\n const eventIndex = measure.events.findIndex((e) => idsMatch(e.id, this.selection.eventId));\n if (eventIndex === -1) return score;\n\n const event = { ...measure.events[eventIndex] };\n const newNotes = event.notes.map((n) => ({\n ...n,\n // Skip rest notes (null pitch)\n pitch: n.pitch !== null ? transposeFn(n.pitch) : null,\n }));\n\n event.notes = newNotes;\n\n const newEvents = [...measure.events];\n newEvents[eventIndex] = event;\n measure.events = newEvents;\n }\n // Case 3: Transpose entire measure\n else {\n const newEvents = measure.events.map((e) => ({\n ...e,\n notes: e.notes.map((n) => ({\n ...n,\n // Skip rest notes (null pitch)\n pitch: n.pitch !== null ? transposeFn(n.pitch) : null,\n })),\n }));\n measure.events = newEvents;\n }\n\n newMeasures[this.selection.measureIndex] = measure;\n const newStaves = [...score.staves];\n newStaves[staffIndex] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n\n undo(score: Score): Score {\n // Undo is just transposing in the opposite direction\n const undoCommand = new TransposeSelectionCommand(\n this.selection,\n -this.semitones,\n this.keySignature\n );\n return undoCommand.execute(score);\n }\n}\n","import React, { useCallback, RefObject } from 'react';\nimport { Selection, Score, getActiveStaff } from '@/types';\nimport {\n calculateNextSelection,\n calculateTranspositionWithPreview,\n calculateCrossStaffSelection,\n} from '@/utils/interaction';\nimport { playNote } from '@/engines/toneEngine';\nimport { Command } from '@/commands/types';\nimport { AddMeasureCommand } from '@/commands/MeasureCommands';\nimport { TransposeSelectionCommand } from '@/commands/TransposeSelectionCommand';\n\ninterface UseNavigationProps {\n scoreRef: RefObject<Score>;\n selection: Selection;\n lastSelection?: Selection | null;\n setSelection: React.Dispatch<React.SetStateAction<Selection>>;\n select: (\n measureIndex: number | null,\n eventId: string | number | null,\n noteId: string | number | null,\n staffIndex?: number,\n options?: any\n ) => void;\n previewNote: any;\n setPreviewNote: (note: any) => void;\n activeDuration: string;\n isDotted: boolean;\n currentQuantsPerMeasure: number;\n dispatch: (command: Command) => void;\n inputMode: 'NOTE' | 'REST';\n}\n\ninterface UseNavigationReturn {\n handleNoteSelection: (\n measureIndex: number,\n eventId: string | number,\n noteId: string | number | null,\n staffIndex?: number,\n isMulti?: boolean,\n selectAllInEvent?: boolean,\n isShift?: boolean\n ) => void;\n moveSelection: (direction: string, isShift: boolean) => void;\n transposeSelection: (direction: string, isShift: boolean) => void;\n switchStaff: (direction: 'up' | 'down') => void;\n}\n\nexport const useNavigation = ({\n scoreRef,\n selection,\n lastSelection,\n select,\n previewNote,\n setPreviewNote,\n activeDuration,\n isDotted,\n currentQuantsPerMeasure,\n dispatch,\n inputMode,\n}: UseNavigationProps): UseNavigationReturn => {\n // --- Internal Helpers ---\n\n const playAudioFeedback = useCallback((notes: any[]) => {\n if (!notes || notes.length === 0) return;\n notes.forEach((n) => playNote(n.pitch));\n }, []);\n\n // --- Public Handlers ---\n\n const handleNoteSelection = useCallback(\n (\n measureIndex: number,\n eventId: string | number,\n noteId: string | number | null,\n staffIndex: number = 0,\n isMulti: boolean = false,\n selectAllInEvent: boolean = false,\n isShift: boolean = false\n ) => {\n select(measureIndex, eventId, noteId, staffIndex, { isMulti, isShift, selectAllInEvent });\n },\n [select]\n );\n\n const moveSelection = useCallback(\n (direction: string, isShift: boolean = false) => {\n const isAtGhostPosition = !selection.eventId || selection.measureIndex === null;\n\n // --- 1. Resume from Ghost State (UX Fix) ---\n // If user is at a ghost note (preview) and presses LEFT, we assume they want to\n // edit the note they just placed (or the last valid selection).\n if (\n isAtGhostPosition &&\n direction === 'left' &&\n lastSelection &&\n lastSelection.eventId &&\n lastSelection.measureIndex !== null\n ) {\n select(\n lastSelection.measureIndex,\n lastSelection.eventId,\n lastSelection.noteId,\n lastSelection.staffIndex\n );\n setPreviewNote(null);\n\n // Audio Feedback for the resumed selection\n const staff = getActiveStaff(scoreRef.current, lastSelection.staffIndex || 0);\n const event = staff.measures[lastSelection.measureIndex]?.events.find(\n (e: any) => e.id === lastSelection.eventId\n );\n if (event && event.notes) playAudioFeedback(event.notes);\n return;\n }\n\n // Determine the \"starting point\" for calculation\n const activeSel =\n isAtGhostPosition && lastSelection && lastSelection.eventId ? lastSelection : selection;\n\n const activeStaff = getActiveStaff(scoreRef.current, activeSel.staffIndex || 0);\n\n // --- 2. Calculate Next Position ---\n const navResult = calculateNextSelection(\n activeStaff.measures,\n activeSel,\n direction,\n previewNote,\n activeDuration,\n isDotted,\n currentQuantsPerMeasure,\n activeStaff.clef,\n activeSel.staffIndex || 0,\n inputMode\n );\n\n if (!navResult) return;\n\n // --- 3. Apply Selection Update ---\n if (navResult.selection) {\n const { measureIndex, eventId, noteId, staffIndex } = navResult.selection;\n\n // Simply pass the calculated target to select().\n // We assume select() handles a null noteId (selecting the whole event/rest) correctly.\n select(measureIndex, eventId, noteId || null, staffIndex, { isShift });\n }\n\n // --- 4. Handle Side Effects ---\n if (navResult.previewNote !== undefined) {\n // Mark as keyboard-triggered so auto-scroll follows it\n setPreviewNote(\n navResult.previewNote ? { ...navResult.previewNote, source: 'keyboard' } : null\n );\n }\n\n if (navResult.shouldCreateMeasure) {\n dispatch(new AddMeasureCommand());\n }\n\n if (navResult.audio) {\n playAudioFeedback(navResult.audio.notes);\n }\n },\n [\n selection,\n lastSelection,\n previewNote,\n activeDuration,\n isDotted,\n currentQuantsPerMeasure,\n scoreRef,\n dispatch,\n select,\n setPreviewNote,\n playAudioFeedback,\n inputMode,\n ]\n );\n\n const transposeSelection = useCallback(\n (direction: string, isShift: boolean) => {\n // 1. Determine Semitone Shift\n let semitones = 0;\n if (direction === 'up') semitones = isShift ? 12 : 1;\n if (direction === 'down') semitones = isShift ? -12 : -1;\n if (semitones === 0) return;\n\n const activeStaff = getActiveStaff(scoreRef.current, selection.staffIndex || 0);\n\n // 2. Scenario A: Transposing Ghost Note (Preview)\n if (selection.eventId === null && previewNote) {\n const previewResult = calculateTranspositionWithPreview(\n activeStaff.measures,\n selection,\n previewNote,\n direction,\n isShift,\n activeStaff.keySignature || 'C'\n );\n\n if (previewResult?.previewNote) {\n setPreviewNote({ ...previewResult.previewNote, source: 'keyboard' });\n if (previewResult.audio) playAudioFeedback(previewResult.audio.notes);\n }\n return;\n }\n\n // 3. Scenario B: Transposing Real Selection\n const keySignature = activeStaff.keySignature || 'C';\n dispatch(new TransposeSelectionCommand(selection, semitones, keySignature));\n\n // Audio Preview for the change\n if (selection.measureIndex !== null && selection.eventId) {\n const audioResult = calculateTranspositionWithPreview(\n activeStaff.measures,\n selection,\n previewNote,\n direction,\n isShift,\n keySignature\n );\n\n if (audioResult?.audio) playAudioFeedback(audioResult.audio.notes);\n }\n },\n [selection, previewNote, scoreRef, dispatch, setPreviewNote, playAudioFeedback]\n );\n\n const switchStaff = useCallback(\n (direction: 'up' | 'down') => {\n const numStaves = scoreRef.current.staves?.length || 1;\n if (numStaves <= 1) return;\n\n // 1. Smart Cross-Staff Selection\n if (selection.eventId) {\n const crossResult = calculateCrossStaffSelection(\n scoreRef.current,\n selection,\n direction,\n activeDuration,\n isDotted\n );\n\n if (crossResult?.selection) {\n select(\n crossResult.selection.measureIndex,\n crossResult.selection.eventId,\n crossResult.selection.noteId,\n crossResult.selection.staffIndex\n );\n\n setPreviewNote(\n crossResult.previewNote ? { ...crossResult.previewNote, source: 'keyboard' } : null\n );\n\n // Play audio if we landed on a real note\n if (crossResult.selection.eventId) {\n const staff = getActiveStaff(scoreRef.current, crossResult.selection.staffIndex);\n const event = staff.measures[crossResult.selection.measureIndex!]?.events.find(\n (e) => e.id === crossResult.selection.eventId\n );\n if (event) playAudioFeedback(event.notes);\n }\n return;\n }\n }\n\n // 2. Fallback: Simple Index Switch\n const currentIdx = selection.staffIndex || 0;\n let newIdx = currentIdx;\n\n if (direction === 'up' && currentIdx > 0) newIdx--;\n else if (direction === 'down' && currentIdx < numStaves - 1) newIdx++;\n\n if (newIdx !== currentIdx) {\n select(null, null, null, newIdx);\n }\n },\n [selection, scoreRef, select, activeDuration, isDotted, playAudioFeedback, setPreviewNote]\n );\n\n return {\n handleNoteSelection,\n moveSelection,\n transposeSelection,\n switchStaff,\n };\n};\n","import { Command } from './types';\nimport { Score, getActiveStaff } from '@/types';\n\n/**\n * Command to apply tuplet metadata to a group of consecutive events.\n * Converts a sequence of regular notes into a tuplet (e.g., triplet, quintuplet).\n */\nexport class ApplyTupletCommand implements Command {\n public readonly type = 'APPLY_TUPLET';\n private previousStates: Array<{\n eventId: string | number;\n tuplet?: { ratio: [number, number]; groupSize: number; position: number };\n }> = [];\n\n constructor(\n private measureIndex: number,\n private startEventIndex: number,\n private groupSize: number,\n private ratio: [number, number] // e.g., [3, 2] for triplet\n ) {}\n\n execute(score: Score): Score {\n const activeStaff = getActiveStaff(score);\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.measureIndex]) {\n return score; // Measure not found\n }\n\n const measure = { ...newMeasures[this.measureIndex] };\n const newEvents = [...measure.events];\n\n // Validate that we have enough events for the tuplet\n if (this.startEventIndex + this.groupSize > newEvents.length) {\n return score; // Not enough events\n }\n\n // Store previous states for undo\n this.previousStates = [];\n\n // Generate a unique ID for this tuplet group\n const tupletId = `tuplet-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n // Apply tuplet metadata to the group of events\n for (let i = 0; i < this.groupSize; i++) {\n const eventIndex = this.startEventIndex + i;\n\n if (eventIndex >= newEvents.length) {\n break; // Not enough events\n }\n\n const event = newEvents[eventIndex];\n\n // Store previous state\n this.previousStates.push({\n eventId: event.id,\n tuplet: event.tuplet ? { ...event.tuplet } : undefined,\n });\n\n // Apply tuplet metadata\n // Determine base duration from the first event (or passed in?)\n // For now, assume uniform duration or take the first one.\n // Ideally, the command should accept baseDuration or infer it.\n // Let's infer it from the first event in the selection if not mixed?\n // Or just take the duration of the current event?\n // Wait, for mixed duration support, the baseDuration is the \"unit\" of the tuplet.\n // e.g. \"Eighth Note Triplet\".\n // Usually the user selects notes of the same duration to make a tuplet.\n // So taking the duration of the first note is a safe bet for creation.\n\n const baseDuration = newEvents[this.startEventIndex].duration;\n\n newEvents[eventIndex] = {\n ...event,\n tuplet: {\n ratio: this.ratio,\n groupSize: this.groupSize,\n position: i,\n baseDuration,\n id: tupletId,\n },\n };\n }\n\n measure.events = newEvents;\n newMeasures[this.measureIndex] = measure;\n\n const newStaves = [...score.staves];\n newStaves[0] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n\n undo(score: Score): Score {\n const activeStaff = getActiveStaff(score);\n const newMeasures = [...activeStaff.measures];\n\n if (!newMeasures[this.measureIndex]) {\n return score;\n }\n\n const measure = { ...newMeasures[this.measureIndex] };\n const newEvents = [...measure.events];\n\n // Restore previous states\n this.previousStates.forEach(({ eventId, tuplet }) => {\n const eventIndex = newEvents.findIndex((e) => e.id === eventId);\n if (eventIndex !== -1) {\n const event = newEvents[eventIndex];\n newEvents[eventIndex] = {\n ...event,\n tuplet,\n };\n }\n });\n\n measure.events = newEvents;\n newMeasures[this.measureIndex] = measure;\n\n const newStaves = [...score.staves];\n newStaves[0] = { ...activeStaff, measures: newMeasures };\n\n return { ...score, staves: newStaves };\n }\n}\n","import { Command } from './types';\nimport { Score } from '@/types';\nimport { updateMeasure } from '@/utils/commandHelpers';\n\n/**\n * Command to remove tuplet metadata from a group of events.\n * Converts tuplet notes back to regular notes.\n */\nexport class RemoveTupletCommand implements Command {\n public readonly type = 'REMOVE_TUPLET';\n private previousStates: Array<{\n eventId: string | number;\n tuplet?: { ratio: [number, number]; groupSize: number; position: number };\n }> = [];\n\n constructor(\n private measureIndex: number,\n private eventIndex: number // Can be any event in the tuplet group\n ) {}\n\n execute(score: Score): Score {\n // Note: This command assumes STAFF 0 (Active Staff) as per current implementation logic\n // seen in original file (\"getActiveStaff(score)\" usually defaults to 0 or active one).\n // Original implementation hardcoded \"newStaves[0]\". We will assume staffIndex 0.\n const staffIndex = 0;\n\n return updateMeasure(score, staffIndex, this.measureIndex, (measure) => {\n const events = measure.events;\n const targetEvent = events[this.eventIndex];\n\n if (!targetEvent?.tuplet) return false;\n\n const { groupSize, position } = targetEvent.tuplet;\n const startIndex = this.eventIndex - position;\n\n this.previousStates = [];\n const newEvents = [...events];\n\n for (let i = 0; i < groupSize; i++) {\n const idx = startIndex + i;\n if (idx < 0 || idx >= newEvents.length) continue;\n\n const event = newEvents[idx];\n this.previousStates.push({\n eventId: event.id,\n tuplet: event.tuplet ? { ...event.tuplet } : undefined,\n });\n\n newEvents[idx] = { ...event, tuplet: undefined };\n }\n\n measure.events = newEvents;\n return true;\n });\n }\n\n undo(score: Score): Score {\n const staffIndex = 0;\n\n return updateMeasure(score, staffIndex, this.measureIndex, (measure) => {\n const newEvents = [...measure.events];\n\n this.previousStates.forEach(({ eventId, tuplet }) => {\n const eventIndex = newEvents.findIndex((e) => e.id === eventId);\n if (eventIndex !== -1) {\n newEvents[eventIndex] = { ...newEvents[eventIndex], tuplet };\n }\n });\n\n measure.events = newEvents;\n return true;\n });\n }\n}\n","import { useCallback } from 'react';\nimport { ApplyTupletCommand } from '@/commands/TupletCommands';\nimport { RemoveTupletCommand } from '@/commands/RemoveTupletCommand';\nimport { getActiveStaff } from '@/types';\nimport { Command } from '@/commands/types';\n\n/**\n * Hook providing tuplet manipulation actions.\n * Handles applying and removing tuplets from selected events.\n */\nexport const useTupletActions = (\n scoreRef: any,\n selection: any,\n dispatch: (command: Command) => void\n) => {\n /**\n * Applies a tuplet to a group of consecutive events starting from current selection.\n * @param ratio - Tuplet ratio, e.g., [3, 2] for triplet\n * @param groupSize - Number of events in tuplet group\n */\n const applyTuplet = useCallback(\n (ratio: [number, number], groupSize: number) => {\n if (!scoreRef.current) {\n console.warn('Score not initialized');\n return false;\n }\n\n if (selection.measureIndex === null || selection.eventId === null) {\n console.warn('No event selected for tuplet application');\n return false;\n }\n\n const currentScore = scoreRef.current;\n const activeStaff = getActiveStaff(currentScore);\n const measure = activeStaff.measures[selection.measureIndex];\n\n if (!measure) {\n console.warn('Selected measure not found');\n return false;\n }\n\n // Find the index of the selected event\n const eventIndex = measure.events.findIndex((e: any) => e.id === selection.eventId);\n\n if (eventIndex === -1) {\n console.warn('Selected event not found in measure');\n return false;\n }\n\n // Validate that we have enough events for the tuplet\n if (eventIndex + groupSize > measure.events.length) {\n console.warn(\n `Not enough events for tuplet (need ${groupSize}, have ${measure.events.length - eventIndex})`\n );\n return false;\n }\n\n // Apply the tuplet\n dispatch(new ApplyTupletCommand(selection.measureIndex, eventIndex, groupSize, ratio));\n\n return true;\n },\n [selection, scoreRef, dispatch]\n );\n\n /**\n * Removes tuplet from the currently selected event's tuplet group.\n */\n const removeTuplet = useCallback(() => {\n if (!scoreRef.current) {\n console.warn('Score not initialized');\n return false;\n }\n\n if (selection.measureIndex === null || selection.eventId === null) {\n console.warn('No event selected for tuplet removal');\n return false;\n }\n\n const currentScore = scoreRef.current;\n const activeStaff = getActiveStaff(currentScore);\n const measure = activeStaff.measures[selection.measureIndex];\n\n if (!measure) {\n console.warn('Selected measure not found');\n return false;\n }\n\n // Find the index of the selected event\n const eventIndex = measure.events.findIndex((e: any) => e.id === selection.eventId);\n\n if (eventIndex === -1) {\n console.warn('Selected event not found in measure');\n return false;\n }\n\n // Check if the event is part of a tuplet\n const event = measure.events[eventIndex];\n if (!event.tuplet) {\n console.warn('Selected event is not part of a tuplet');\n return false;\n }\n\n // Remove the tuplet\n dispatch(new RemoveTupletCommand(selection.measureIndex, eventIndex));\n\n return true;\n }, [selection, scoreRef, dispatch]);\n\n /**\n * Checks if the current selection can have a tuplet applied.\n * @param groupSize - Number of events needed for tuplet\n */\n const canApplyTuplet = useCallback(\n (groupSize: number): boolean => {\n if (!scoreRef.current) return false;\n\n if (selection.measureIndex === null || selection.eventId === null) {\n return false;\n }\n\n const currentScore = scoreRef.current;\n const activeStaff = getActiveStaff(currentScore);\n const measure = activeStaff.measures[selection.measureIndex];\n\n if (!measure) return false;\n\n const eventIndex = measure.events.findIndex((e: any) => e.id === selection.eventId);\n if (eventIndex === -1) return false;\n\n // Check if we have enough consecutive events\n return eventIndex + groupSize <= measure.events.length;\n },\n [selection, scoreRef]\n );\n\n /**\n * Checks if the current selection is part of a tuplet.\n */\n /**\n * Returns the ratio of the tuplet the currently selected event is part of, or null.\n */\n const getActiveTupletRatio = useCallback((): [number, number] | null => {\n if (!scoreRef.current) return null;\n\n if (selection.measureIndex === null || selection.eventId === null) {\n return null;\n }\n\n const currentScore = scoreRef.current;\n const activeStaff = getActiveStaff(currentScore);\n const measure = activeStaff.measures[selection.measureIndex];\n\n if (!measure) return null;\n\n const event = measure.events.find((e: any) => e.id === selection.eventId);\n return event?.tuplet?.ratio || null;\n }, [selection, scoreRef]);\n\n return {\n applyTuplet,\n removeTuplet,\n canApplyTuplet,\n getActiveTupletRatio,\n };\n};\n","import { Selection, createDefaultSelection, Score } from '@/types';\n\ninterface NoteContext {\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n noteId: string | number | null;\n}\n\n/**\n * Robustly compares two IDs.\n * Handles loose equality for string/number mismatches, but strict on null/undefined.\n */\nexport const compareIds = (\n id1: string | number | null | undefined,\n id2: string | number | null | undefined\n): boolean => {\n // Treat null and undefined as equal to each other\n if (id1 == null && id2 == null) return true;\n if (id1 == null || id2 == null) return false;\n return String(id1) === String(id2);\n};\n\n/**\n * Checks if a specific note is currently selected.\n * Prioritizes the multi-selection list if it exists to ensure visual consistency.\n */\nexport const isNoteSelected = (selection: Selection, context: NoteContext): boolean => {\n const { staffIndex, measureIndex, eventId, noteId } = context;\n\n // 1. Check Multi-Selection List (Source of Truth for Multi)\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n return selection.selectedNotes.some(\n (sn) =>\n compareIds(sn.noteId, noteId) &&\n compareIds(sn.eventId, eventId) &&\n sn.measureIndex === measureIndex &&\n sn.staffIndex === staffIndex\n );\n }\n\n // 2. Fallback: Check Primary Selection (Cursor) for Single Select\n return (\n compareIds(selection.eventId, eventId) &&\n compareIds(selection.noteId, noteId) &&\n selection.measureIndex === measureIndex &&\n (selection.staffIndex === undefined || selection.staffIndex === staffIndex)\n );\n};\n\n/**\n * Checks if all provided notes in an event are selected.\n */\nexport const areAllNotesSelected = (\n selection: Selection,\n staffIndex: number,\n measureIndex: number,\n eventId: string | number,\n notes: any[]\n): boolean => {\n if (!notes || notes.length === 0) return false;\n return notes.every((note) =>\n isNoteSelected(selection, { staffIndex, measureIndex, eventId, noteId: note.id })\n );\n};\n\n/**\n * Calculates the new selection state when toggling a note.\n * FIX: Ensures Event/Measure context updates when focus shifts to a different note.\n */\nexport const toggleNoteInSelection = (\n prevSelection: Selection,\n context: NoteContext,\n isMulti: boolean\n): Selection => {\n const { staffIndex, measureIndex, eventId, noteId } = context;\n\n // Only eventId is required - noteId can be null for rests\n if (!eventId) {\n return { ...createDefaultSelection(), staffIndex };\n }\n\n // 1. Single Selection Mode (Simple Replace)\n if (!isMulti) {\n return {\n staffIndex,\n measureIndex,\n eventId,\n noteId,\n selectedNotes: [{ staffIndex, measureIndex, eventId, noteId }],\n anchor: null, // Reset anchor on single click\n };\n }\n\n // 2. Multi-Selection Mode\n\n // Copy existing list or initialize\n const newSelectedNotes = prevSelection.selectedNotes ? [...prevSelection.selectedNotes] : [];\n\n // \"Promote\" existing primary selection to list if it wasn't there yet\n // (This handles the transition from Single -> Multi)\n // Note: noteId can be null for rests, so check eventId and measureIndex only\n if (prevSelection.eventId && prevSelection.measureIndex != null) {\n const isPrevInList = newSelectedNotes.some(\n (n) =>\n compareIds(n.noteId, prevSelection.noteId) && compareIds(n.eventId, prevSelection.eventId)\n );\n\n if (!isPrevInList) {\n newSelectedNotes.push({\n staffIndex: prevSelection.staffIndex ?? 0,\n measureIndex: prevSelection.measureIndex,\n eventId: prevSelection.eventId,\n noteId: prevSelection.noteId, // Can be null for rests\n });\n }\n }\n\n // Check if target is currently in the list\n const existingIndex = newSelectedNotes.findIndex(\n (n) => compareIds(n.noteId, noteId) && compareIds(n.eventId, eventId)\n );\n\n // -- Toggle Logic --\n if (existingIndex >= 0) {\n // REMOVE from selection\n newSelectedNotes.splice(existingIndex, 1);\n } else {\n // ADD to selection\n newSelectedNotes.push({ staffIndex, measureIndex, eventId, noteId });\n }\n\n // -- Calculate New Focus (Cursor) --\n // If list is empty, reset everything\n if (newSelectedNotes.length === 0) {\n return { ...createDefaultSelection(), staffIndex };\n }\n\n // We default the new focus to the note we just clicked...\n let newFocus: NoteContext = { staffIndex, measureIndex, eventId, noteId };\n\n // ...Unless we just toggled that note OFF. Then we focus the last item in the list.\n if (existingIndex >= 0) {\n newFocus = newSelectedNotes[newSelectedNotes.length - 1];\n }\n\n return {\n staffIndex: newFocus.staffIndex,\n measureIndex: newFocus.measureIndex,\n eventId: newFocus.eventId,\n noteId: newFocus.noteId,\n selectedNotes: newSelectedNotes,\n anchor: prevSelection.anchor, // Preserve anchor for shift-select ranges\n };\n};\n\n/**\n * Flattens the score into a linear list.\n */\nexport const getLinearizedNotes = (score: Score): NoteContext[] => {\n const notes: NoteContext[] = [];\n score.staves.forEach((staff, staffInd) => {\n staff.measures.forEach((measure, measureInd) => {\n measure.events.forEach((event) => {\n if (event.notes && event.notes.length > 0) {\n event.notes.forEach((note) => {\n notes.push({\n staffIndex: staffInd,\n measureIndex: measureInd,\n eventId: event.id,\n noteId: note.id,\n });\n });\n }\n });\n });\n });\n return notes;\n};\n\n/**\n * Calculates range.\n * Includes logic to select ALL notes in any event touched by the range (Chord selection).\n */\nexport const calculateNoteRange = (\n anchor: NoteContext,\n focus: NoteContext,\n linearNotes: NoteContext[]\n): NoteContext[] => {\n // Find indices in the linearized score\n const getIndex = (ctx: NoteContext) =>\n linearNotes.findIndex(\n (n) => compareIds(n.noteId, ctx.noteId) && compareIds(n.eventId, ctx.eventId)\n );\n\n const anchorIndex = getIndex(anchor);\n const focusIndex = getIndex(focus);\n\n if (anchorIndex === -1 || focusIndex === -1) return [];\n\n const start = Math.min(anchorIndex, focusIndex);\n const end = Math.max(anchorIndex, focusIndex);\n\n // Get the raw range of notes\n const rawSlice = linearNotes.slice(start, end + 1);\n\n // Expand: Identify all Event IDs touched by this slice\n const affectedEventIds = new Set(rawSlice.map((n) => n.eventId));\n\n // Return all notes (from the linear list) that belong to those events\n // We filter linearNotes again to ensure we pick up notes in the chords that\n // might have been physically \"before\" the start index in data structure but belong to the same event.\n return linearNotes.filter(\n (n) => affectedEventIds.has(n.eventId) && n.staffIndex === anchor.staffIndex // Generally prevent ranges spanning staves\n );\n};\n\n/**\n * Checks if a rest event is selected.\n * Uses the first (and only) note in a rest event for selection checking.\n */\nexport const isRestSelected = (\n selection: Selection,\n event: { id: string | number; notes?: { id: string | number }[] },\n measureIndex: number,\n staffIndex: number\n): boolean => {\n const restNoteId = event.notes?.[0]?.id ?? null;\n\n // Check primary selection\n const isPrimary =\n selection.measureIndex === measureIndex &&\n compareIds(selection.eventId, event.id) &&\n selection.staffIndex === staffIndex;\n\n // Check multi-selection\n const isInMulti =\n selection.selectedNotes?.some(\n (sn) =>\n sn.measureIndex === measureIndex &&\n compareIds(sn.eventId, event.id) &&\n sn.staffIndex === staffIndex &&\n compareIds(sn.noteId, restNoteId)\n ) ?? false;\n\n return isPrimary || isInMulti;\n};\n\n/**\n * Checks if ALL notes in a beam group are selected.\n * A beam is considered selected only when every note it connects is selected.\n */\nexport const isBeamGroupSelected = (\n selection: Selection,\n beam: { ids: (string | number)[] },\n events: { id: string | number; notes?: { id: string | number }[] }[],\n measureIndex: number\n): boolean => {\n // Collect all notes participating in this beam\n const beamNoteIds: { eventId: string | number; noteId: string | number }[] = [];\n\n beam.ids.forEach((eventId) => {\n const ev = events.find((e) => compareIds(e.id, eventId));\n if (ev?.notes) {\n ev.notes.forEach((n) => beamNoteIds.push({ eventId: ev.id, noteId: n.id }));\n }\n });\n\n if (beamNoteIds.length === 0) return false;\n\n // Check if every note is in the selection\n return beamNoteIds.every((bn) => {\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n return selection.selectedNotes.some(\n (sn) =>\n sn.measureIndex === measureIndex &&\n compareIds(sn.eventId, bn.eventId) &&\n compareIds(sn.noteId, bn.noteId)\n );\n }\n return (\n selection.measureIndex === measureIndex &&\n compareIds(selection.eventId, bn.eventId) &&\n compareIds(selection.noteId, bn.noteId)\n );\n });\n};\n","import { useState, useCallback, useMemo } from 'react';\nimport { Selection, createDefaultSelection, Score, getActiveStaff } from '@/types';\nimport { toggleNoteInSelection, calculateNoteRange, getLinearizedNotes } from '@/utils/selection';\nimport { playNote } from '@/engines/toneEngine';\n\ninterface UseSelectionProps {\n score: Score;\n dispatch?: any;\n}\n\nexport const useSelection = ({ score }: UseSelectionProps) => {\n const [selection, setSelection] = useState<Selection>(createDefaultSelection());\n const [lastSelection, setLastSelection] = useState<Selection | null>(null);\n\n // --- Helpers ---\n\n const playAudioFeedback = useCallback((notes: any[]) => {\n notes.filter((n) => n.pitch !== null).forEach((n) => playNote(n.pitch));\n }, []);\n\n // --- Actions ---\n\n const clearSelection = useCallback(() => {\n setSelection((prev) => {\n setLastSelection(prev);\n return {\n ...createDefaultSelection(),\n staffIndex: prev.staffIndex, // Maintain current staff focus\n };\n });\n }, []);\n\n const select = useCallback(\n (\n measureIndex: number | null,\n eventId: string | number | null,\n noteId: string | number | null,\n staffIndex: number = 0,\n options: {\n isMulti?: boolean;\n isShift?: boolean;\n selectAllInEvent?: boolean;\n onlyHistory?: boolean;\n } = {}\n ) => {\n const {\n isMulti = false,\n isShift = false,\n selectAllInEvent = false,\n onlyHistory = false,\n } = options;\n\n if (!eventId || measureIndex === null) {\n if (!onlyHistory) clearSelection();\n return;\n }\n\n const startStaffIndex = staffIndex !== undefined ? staffIndex : selection.staffIndex || 0;\n\n // 1. Handle Shift+Click (Range Selection)\n if (isShift && !onlyHistory) {\n // ... (Logic from useNavigation)\n const anchor = selection.anchor || {\n staffIndex: selection.staffIndex || 0,\n measureIndex: selection.measureIndex!,\n eventId: selection.eventId!,\n noteId: selection.noteId,\n };\n\n // If anchor is invalid (e.g. initial state), just select the target\n if (!anchor.eventId) {\n // Fallthrough to standard selection\n } else {\n const context = {\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId,\n };\n\n // Note: We need linearization logic here.\n // We can import calculateNoteRange from utils/selection\n const linearNotes = getLinearizedNotes(score);\n // We need to make sure 'noteId' is not null for calculation.\n // If noteId is null (event selection), pick first note of event.\n let targetNoteId = noteId;\n if (!targetNoteId) {\n const measure = getActiveStaff(score, startStaffIndex).measures[measureIndex];\n const event = measure?.events.find((e: any) => e.id === eventId);\n if (event && event.notes.length > 0) targetNoteId = event.notes[0].id;\n }\n\n if (targetNoteId) {\n const focus = { ...context, noteId: targetNoteId };\n // Ensure anchor has noteId too\n // ... (Assumption: anchor always has noteId if set correctly)\n\n const selectedNotes = calculateNoteRange(anchor as any, focus, linearNotes);\n\n setSelection((prev) => ({\n ...prev,\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId: targetNoteId, // Update cursor\n selectedNotes,\n anchor, // Keep anchor\n }));\n return;\n }\n }\n }\n\n // 2. Resolve Event Selection (Select All Notes in Event)\n // If selectAllInEvent is TRUE, OR if noteId is NULL (clicking stem/body), we select all notes.\n // \"Events cannot be independently selected.\"\n let targetNoteId = noteId;\n let notesToSelect: any[] = [];\n\n const measure = getActiveStaff(score, startStaffIndex).measures[measureIndex];\n const event = measure?.events.find((e: any) => e.id === eventId);\n\n // Handle REST selection\n // Previously, we treated rests as having NO notes (noteId: null).\n // Now, rests are \"pitchless notes\", so they DO have a noteId.\n // We only fallback to null if the event truly has no notes array (legacy).\n\n // Check if we can use existing notes\n const hasNotes = event && event.notes && event.notes.length > 0;\n\n if (hasNotes) {\n // Standard handling for both Notes and Rests (pitchless notes)\n if (selectAllInEvent || !noteId) {\n notesToSelect = event.notes.map((n: any) => ({\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId: n.id,\n }));\n // Set cursor to first note if not specified\n if (!targetNoteId) targetNoteId = event.notes[0].id;\n } else {\n // Specific note selected (handled by toggleNoteInSelection or generic flow below)\n // But if we are here in \"Resolve Event Selection\", we are building the list for a \"Replace\" or \"Add\" op?\n // Actually, if noteId is provided and selectAllInEvent is false, we might skip this block\n // and let step 4 handle it... UNLESS it's a rest and we need to ensure it works?\n // If we have a specific noteId (even for rest), we're good.\n }\n }\n\n // Capture the selection object that WOULD be set\n let nextSelection: Selection | null = null;\n\n // 3. Update State\n if (notesToSelect.length > 0) {\n if (isMulti && !onlyHistory) {\n setSelection((prev) => {\n const newSelectedNotes = prev.selectedNotes ? [...prev.selectedNotes] : [];\n notesToSelect.forEach((n) => {\n // Standard existence check (works for notes and pitchless rests)\n const exists = newSelectedNotes.some((ex) => {\n if (n.noteId) {\n return ex.noteId === n.noteId;\n } else {\n // Fallback for null noteId (legacy rests)\n return ex.eventId === n.eventId && ex.noteId === null;\n }\n });\n\n if (!exists) {\n newSelectedNotes.push(n);\n }\n });\n return {\n ...prev,\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId: targetNoteId,\n selectedNotes: newSelectedNotes,\n anchor: prev.anchor, // Maintain anchor? Or reset?\n };\n });\n\n // Only play audio if not a rest\n if (!event?.isRest) playAudioFeedback(event?.notes || []);\n return; // Multi-select handled directly via setSelection\n } else {\n // Single Select of Event -> Replace selection\n nextSelection = {\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId: targetNoteId,\n selectedNotes: notesToSelect,\n anchor: { staffIndex: startStaffIndex, measureIndex, eventId, noteId: targetNoteId }, // New Anchor\n };\n }\n } else {\n // 4. Standard Note Toggle (Single Note)\n if (onlyHistory) {\n nextSelection = {\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId: targetNoteId,\n selectedNotes: [\n { staffIndex: startStaffIndex, measureIndex, eventId, noteId: targetNoteId },\n ], // Mimic standard selection structure\n anchor: { staffIndex: startStaffIndex, measureIndex, eventId, noteId: targetNoteId },\n } as Selection;\n } else {\n // Standard Toggle Behavior (defer to functional update)\n setSelection((prev) => {\n const emptySelection = { ...createDefaultSelection(), staffIndex: startStaffIndex };\n const base = prev || emptySelection;\n\n const newSel = toggleNoteInSelection(\n base,\n {\n staffIndex: startStaffIndex,\n measureIndex,\n eventId,\n noteId: targetNoteId,\n },\n isMulti\n );\n return newSel;\n });\n\n // Audio Feedback (Early return for toggle path)\n if (targetNoteId) {\n const note = event?.notes.find((n: any) => n.id === targetNoteId);\n if (note) playAudioFeedback([note]);\n }\n return;\n }\n }\n\n // Apply Logic\n if (onlyHistory && nextSelection) {\n setLastSelection(nextSelection);\n // Ensure visual selection is cleared\n setSelection((prev) => ({\n ...createDefaultSelection(),\n staffIndex: startStaffIndex,\n }));\n } else if (nextSelection) {\n setSelection(nextSelection);\n playAudioFeedback(event?.notes || []);\n }\n },\n [selection, score, playAudioFeedback, clearSelection]\n );\n\n const updateSelection = useCallback((partial: Partial<Selection>) => {\n setSelection((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const selectAllInMeasure = useCallback(\n (measureIndex: number, staffIndex: number = 0) => {\n const measure = getActiveStaff(score, staffIndex).measures[measureIndex];\n if (!measure) return;\n\n const allNotes: any[] = [];\n measure.events.forEach((event: any) => {\n if (event.notes) {\n event.notes.forEach((note: any) => {\n allNotes.push({\n staffIndex,\n measureIndex,\n eventId: event.id,\n noteId: note.id,\n });\n });\n }\n });\n\n if (allNotes.length > 0) {\n const first = allNotes[0];\n setSelection({\n staffIndex,\n measureIndex,\n eventId: first.eventId,\n noteId: first.noteId,\n selectedNotes: allNotes,\n anchor: { ...first },\n });\n }\n },\n [score]\n );\n\n return {\n selection,\n setSelection, // Exposed for low-level overrides if absolutely needed\n select,\n clearSelection,\n updateSelection,\n selectAllInMeasure,\n lastSelection,\n };\n};\n","import { useMemo } from 'react';\nimport { Selection } from '@/types';\n\nexport type EditorState =\n | 'SELECTION_READY' // User has an active selection (editing existing notes)\n | 'ENTRY_READY' // User has a preview cursor (ready to place new notes)\n | 'IDLE'; // No active focus\n\ninterface UseEditorModeProps {\n selection: Selection;\n previewNote: any | null;\n}\n\n/**\n * Derives the high-level input state of the editor.\n * Distinguishes between \"Editing Selection\" vs \"Entering Notes\".\n */\nexport const useEditorMode = ({ selection, previewNote }: UseEditorModeProps) => {\n const editorState: EditorState = useMemo(() => {\n // 1. SELECTION_READY: Active event selection takes precedence\n if (selection.eventId && selection.measureIndex !== null) {\n return 'SELECTION_READY';\n }\n\n // 2. ENTRY_READY: Preview note exists (Mouse hover or Keyboard cursor)\n if (previewNote) {\n return 'ENTRY_READY';\n }\n\n // 3. IDLE: No focus\n return 'IDLE';\n }, [selection, previewNote]);\n\n return {\n editorState,\n // Helper booleans for easier JSX usage\n isSelectionMode: editorState === 'SELECTION_READY',\n isEntryMode: editorState === 'ENTRY_READY',\n };\n};\n","import { Score, Selection, getActiveStaff } from '@/types';\nimport { calculateTotalQuants } from './core';\nimport { TIME_SIGNATURES } from '@/constants';\n\n/** Creates an empty selection at the given position */\nconst createSelection = (\n measureIndex: number | null,\n eventId: string | number | null = null,\n noteId: string | number | null = null\n): Selection => ({\n staffIndex: 0,\n measureIndex,\n eventId,\n noteId,\n selectedNotes: [],\n});\n\n/** Checks if an event still exists in the score */\nconst isSelectionValid = (score: Score, selection: Selection): boolean => {\n if (!selection.eventId || selection.measureIndex === null) return false;\n\n const staff = score.staves[selection.staffIndex || 0];\n const measure = staff?.measures[selection.measureIndex];\n return measure?.events.some((e: any) => e.id === selection.eventId) ?? false;\n};\n\n/**\n * Calculates the selection state for focusing the score.\n *\n * 1. Preserve valid selection (focus memory)\n * 2. Otherwise, position at first available entry point\n */\nexport function calculateFocusSelection(score: Score, existingSelection: Selection): Selection {\n // Preserve valid selection (focus memory)\n if (isSelectionValid(score, existingSelection)) {\n return existingSelection;\n }\n\n // Find first available entry point\n const activeStaff = getActiveStaff(score, 0);\n\n if (!activeStaff.measures?.length) {\n return createSelection(null);\n }\n\n const quantsPerMeasure =\n TIME_SIGNATURES[score.timeSignature as keyof typeof TIME_SIGNATURES] || 64;\n\n for (let i = 0; i < activeStaff.measures.length; i++) {\n const measure = activeStaff.measures[i];\n\n // Empty measure\n if (!measure.events?.length) {\n return createSelection(i);\n }\n\n // Incomplete measure - position after last event\n if (calculateTotalQuants(measure.events) < quantsPerMeasure) {\n const lastEvent = measure.events.at(-1)!;\n return createSelection(i, lastEvent.id, lastEvent.notes?.[0]?.id ?? null);\n }\n }\n\n // All measures full - position at end\n const lastIdx = activeStaff.measures.length - 1;\n const lastEvent = activeStaff.measures[lastIdx].events.at(-1);\n\n return createSelection(lastIdx, lastEvent?.id ?? null, lastEvent?.notes?.[0]?.id ?? null);\n}\n","import { useState, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { TIME_SIGNATURES } from '@/constants';\nimport { CONFIG } from '@/config';\nimport { useScoreEngine } from './useScoreEngine';\nimport { useEditorTools } from './useEditorTools';\nimport { useMeasureActions } from './useMeasureActions';\nimport { useNoteActions } from './useNoteActions';\nimport { useModifiers } from './useModifiers';\nimport { useNavigation } from './useNavigation';\nimport { useTupletActions } from './useTupletActions';\nimport { useSelection } from './useSelection';\nimport { useEditorMode } from './useEditorMode';\n\nimport { Score, createDefaultScore, migrateScore, getActiveStaff } from '@/types';\nimport { getAppendPreviewNote } from '@/utils/interaction';\nimport { calculateFocusSelection } from '@/utils/focusScore';\n\n/**\n * Main score logic orchestrator hook.\n * Composes focused hooks for measure, note, modifier, and navigation actions.\n */\nexport const useScoreLogic = (initialScore: any) => {\n // --- STATE ---\n const defaultScore = createDefaultScore();\n\n // Migrate incoming score to new staves format\n const migratedInitialScore = initialScore ? migrateScore(initialScore) : defaultScore;\n\n // --- ENGINE INTEGRATION ---\n const { score, engine } = useScoreEngine(migratedInitialScore);\n\n const undo = useCallback(() => engine.undo(), [engine]);\n const redo = useCallback(() => engine.redo(), [engine]);\n\n const history = engine.getHistory();\n const redoStack = engine.getRedoStack();\n\n // --- REFS ---\n const scoreRef = useRef(score);\n scoreRef.current = score;\n\n // --- EDITOR TOOLS ---\n const tools = useEditorTools();\n const {\n activeDuration,\n setActiveDuration,\n isDotted,\n setIsDotted,\n activeAccidental,\n setActiveAccidental,\n activeTie,\n setActiveTie,\n inputMode,\n setInputMode,\n toggleInputMode,\n } = tools;\n\n // --- SELECTION & PREVIEW STATE ---\n const {\n selection,\n setSelection,\n select,\n clearSelection,\n updateSelection,\n selectAllInMeasure,\n lastSelection,\n } = useSelection({ score });\n const [previewNote, setPreviewNote] = useState<any>(null);\n\n // --- COMPUTED VALUES ---\n if (!score || !score.staves) {\n console.error('CRITICAL: Score corrupted in useScoreLogic', score);\n // Fallback to prevent crash and allow inspection\n if (!score) console.error('Score is null/undefined');\n else if (!score.staves) console.error('Score.staves is undefined');\n }\n\n const currentQuantsPerMeasure = useMemo(() => {\n if (score.timeSignature) {\n return TIME_SIGNATURES[score.timeSignature as keyof typeof TIME_SIGNATURES] || 64;\n }\n return CONFIG.quantsPerMeasure;\n }, [score.timeSignature]);\n\n // --- SYNC TOOLBAR STATE ---\n // Automatically syncs accidental and tie state on selection change\n useEffect(() => {\n const { measureIndex, eventId, noteId, staffIndex } = selection;\n\n if (measureIndex === null || !eventId) {\n // No selection - DO NOT reset accidental/tie.\n // This allows \"sticky\" tools for note entry (User Request).\n return;\n }\n\n const measure = getActiveStaff(score, staffIndex || 0).measures[measureIndex];\n if (!measure) return;\n\n const event = measure.events.find((e: any) => e.id === eventId);\n\n if (event) {\n // Duration is NOT synced - user controls duration independently\n\n if (noteId) {\n const note = event.notes.find((n: any) => n.id === noteId);\n if (note) {\n setActiveAccidental(note.accidental || null);\n setActiveTie(!!note.tied);\n }\n } else {\n // When no specific note selected (rest or event selection), clear\n setActiveAccidental(null);\n setActiveTie(false);\n }\n\n // Sync inputMode based on selection composition\n // Only update if mode actually differs to prevent unnecessary re-renders\n const targetMode = event.isRest ? 'REST' : 'NOTE';\n if (inputMode !== targetMode) {\n setInputMode(targetMode);\n }\n }\n }, [selection, score, setActiveAccidental, setActiveTie, setInputMode, inputMode]);\n\n // Deprecated shim\n const syncToolbarState = useCallback(() => {}, []);\n\n // --- COMPOSED HOOKS ---\n\n // Measure Actions: time/key signature, add/remove measures\n const measureActions = useMeasureActions({\n score,\n setSelection,\n setPreviewNote,\n dispatch: engine.dispatch.bind(engine),\n });\n\n // Note Actions: add/delete notes, chords\n const noteActions = useNoteActions({\n scoreRef,\n selection,\n setSelection, // Still passed but might be unused if we fully switched\n select,\n setPreviewNote,\n syncToolbarState, // Deprecated\n activeDuration,\n isDotted,\n activeAccidental,\n activeTie,\n currentQuantsPerMeasure,\n dispatch: engine.dispatch.bind(engine),\n inputMode,\n });\n\n // Modifiers: duration, dots, accidentals, ties\n const modifiers = useModifiers({\n scoreRef,\n selection,\n currentQuantsPerMeasure,\n tools,\n dispatch: engine.dispatch.bind(engine),\n });\n\n // Navigation: selection, movement, transposition\n const navigation = useNavigation({\n scoreRef,\n selection,\n lastSelection, // Pass history\n setSelection,\n select,\n previewNote,\n setPreviewNote,\n activeDuration,\n isDotted,\n currentQuantsPerMeasure,\n dispatch: engine.dispatch.bind(engine),\n inputMode,\n });\n\n // Tuplet Actions: apply/remove tuplets\n const tupletActions = useTupletActions(scoreRef, selection, engine.dispatch.bind(engine));\n\n // --- EDITOR MODE ---\n const { editorState } = useEditorMode({ selection, previewNote });\n\n // --- DERIVED SELECTION PROPERTIES ---\n const selectedDurations = useMemo(() => {\n if (editorState !== 'SELECTION_READY') return [];\n\n const durations = new Set<string>();\n const currentScore = scoreRef.current;\n\n // Helper to add duration from an event\n const addFromEvent = (measureIndex: number, eventId: string | number, staffIndex: number) => {\n const staff = currentScore.staves[staffIndex] || getActiveStaff(currentScore);\n const measure = staff.measures[measureIndex];\n const event = measure?.events.find((e: any) => e.id === eventId);\n if (event) durations.add(event.duration);\n };\n\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n // Multi-select\n selection.selectedNotes.forEach((n) => {\n addFromEvent(n.measureIndex, n.eventId, n.staffIndex);\n });\n } else if (selection.measureIndex !== null && selection.eventId) {\n // Single select\n const staffIndex = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n addFromEvent(selection.measureIndex, selection.eventId, staffIndex);\n }\n\n return Array.from(durations);\n }, [selection, score, editorState]);\n\n const selectedDots = useMemo(() => {\n if (editorState !== 'SELECTION_READY') return [];\n\n const dots = new Set<boolean>();\n const currentScore = scoreRef.current;\n\n const addFromEvent = (measureIndex: number, eventId: string | number, staffIndex: number) => {\n const staff = currentScore.staves[staffIndex] || getActiveStaff(currentScore);\n const measure = staff.measures[measureIndex];\n const event = measure?.events.find((e: any) => e.id === eventId);\n if (event) dots.add(!!event.dotted);\n };\n\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n selection.selectedNotes.forEach((n) => addFromEvent(n.measureIndex, n.eventId, n.staffIndex));\n } else if (selection.measureIndex !== null && selection.eventId) {\n const staffIndex = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n addFromEvent(selection.measureIndex, selection.eventId, staffIndex);\n }\n return Array.from(dots);\n }, [selection, score, editorState]);\n\n const selectedTies = useMemo(() => {\n if (editorState !== 'SELECTION_READY') return [];\n\n const ties = new Set<boolean>();\n const currentScore = scoreRef.current;\n\n const addFromNote = (\n measureIndex: number,\n eventId: string | number,\n noteId: string | number | null,\n staffIndex: number\n ) => {\n const staff = currentScore.staves[staffIndex] || getActiveStaff(currentScore);\n const measure = staff.measures[measureIndex];\n const event = measure?.events.find((e: any) => e.id === eventId);\n if (event) {\n if (noteId) {\n const note = event.notes.find((n: any) => n.id === noteId);\n if (note) ties.add(!!note.tied);\n } else {\n event.notes.forEach((n: any) => ties.add(!!n.tied));\n }\n }\n };\n\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n selection.selectedNotes.forEach((n) =>\n addFromNote(n.measureIndex, n.eventId, n.noteId, n.staffIndex)\n );\n } else if (selection.measureIndex !== null && selection.eventId) {\n const staffIndex = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n addFromNote(selection.measureIndex, selection.eventId, selection.noteId, staffIndex);\n }\n return Array.from(ties);\n }, [selection, score, editorState]);\n\n const selectedAccidentals = useMemo(() => {\n if (editorState !== 'SELECTION_READY') return [];\n\n const accidentals = new Set<string>();\n const currentScore = scoreRef.current;\n\n // Helper to determine type from pitch\n const getAccidentalType = (pitch: string): string => {\n // Use very simple parsing or Tonal if imported.\n // Since we want to avoid import in this file if possible?\n // Actually importing Note from tonal is fine.\n // Assuming Note is imported or we use MusicService.\n // Let's use basic regex for speed/dependency avoidance if simple,\n // OR just import Note (preferred for robustness).\n const match = pitch.match(/^([A-G])(#{1,2}|b{1,2})?(\\d+)$/);\n if (!match) return 'natural';\n const acc = match[2];\n if (acc?.startsWith('#')) return 'sharp';\n if (acc?.startsWith('b')) return 'flat';\n return 'natural';\n };\n\n const addFromNote = (\n measureIndex: number,\n eventId: string | number,\n noteId: string | number | null,\n staffIndex: number\n ) => {\n const staff = currentScore.staves[staffIndex] || getActiveStaff(currentScore);\n const measure = staff.measures[measureIndex];\n const event = measure?.events.find((e: any) => e.id === eventId);\n if (event) {\n if (noteId) {\n const note = event.notes.find((n: any) => n.id === noteId);\n // Skip rest notes (null pitch)\n if (note && note.pitch !== null) accidentals.add(getAccidentalType(note.pitch));\n } else {\n event.notes.forEach((n: any) => {\n // Skip rest notes (null pitch)\n if (n.pitch !== null) accidentals.add(getAccidentalType(n.pitch));\n });\n }\n }\n };\n\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n selection.selectedNotes.forEach((n) =>\n addFromNote(n.measureIndex, n.eventId, n.noteId, n.staffIndex)\n );\n } else if (selection.measureIndex !== null && selection.eventId) {\n const staffIndex = selection.staffIndex !== undefined ? selection.staffIndex : 0;\n addFromNote(selection.measureIndex, selection.eventId, selection.noteId, staffIndex);\n }\n return Array.from(accidentals); // ['sharp'], ['flat', 'natural'], etc.\n }, [selection, score, editorState]);\n\n // --- WRAPPED HANDLERS ---\n const handleDurationChangeWrapper = useCallback(\n (newDuration: string) => {\n if (editorState === 'SELECTION_READY') {\n // Apply to selection\n modifiers.handleDurationChange(newDuration, true);\n } else {\n // Just update tool state\n setActiveDuration(newDuration);\n\n // If IDLE, try to bring focus back to last known position\n if (editorState === 'IDLE' && lastSelection && lastSelection.measureIndex !== null) {\n const staffIndex = lastSelection.staffIndex !== undefined ? lastSelection.staffIndex : 0;\n const staff = scoreRef.current.staves[staffIndex] || getActiveStaff(scoreRef.current);\n const measure = staff.measures[lastSelection.measureIndex];\n\n if (measure) {\n // Restore focus using APPEND mode at the measure\n const newPreview = getAppendPreviewNote(\n measure,\n lastSelection.measureIndex,\n staffIndex,\n newDuration, // Use the NEW duration\n isDotted\n );\n setPreviewNote(newPreview);\n }\n } else if (editorState === 'ENTRY_READY' && previewNote) {\n // Update existing preview note immediately?\n // The preview note usually updates automatically via mouse hover,\n // but if keyboard cursor is active, we should update it.\n setPreviewNote((prev: any) => ({\n ...prev,\n duration: newDuration,\n }));\n }\n }\n },\n [\n editorState,\n modifiers.handleDurationChange,\n setActiveDuration,\n lastSelection,\n scoreRef,\n isDotted,\n previewNote,\n ]\n );\n\n // --- FOCUS SCORE ---\n const focusScore = useCallback(() => {\n const newSelection = calculateFocusSelection(score, selection);\n setSelection(newSelection);\n\n // If focusing on an empty position (no eventId), create a preview note for ghost cursor\n if (!newSelection.eventId && newSelection.measureIndex !== null) {\n const staff = score.staves[newSelection.staffIndex || 0];\n const measure = staff?.measures[newSelection.measureIndex];\n if (measure) {\n const clef = staff.clef || 'treble';\n const defaultPitch = clef === 'bass' ? 'D3' : 'B4';\n const preview = getAppendPreviewNote(\n measure,\n newSelection.measureIndex,\n newSelection.staffIndex || 0,\n activeDuration,\n isDotted,\n defaultPitch,\n inputMode === 'REST'\n );\n setPreviewNote(preview);\n }\n }\n }, [score, selection, setSelection, setPreviewNote, activeDuration, isDotted, inputMode]);\n\n // --- EXPORTS ---\n return {\n score,\n selection,\n editorState,\n selectedDurations, // Expose derived durations\n selectedDots,\n selectedTies,\n selectedAccidentals,\n setSelection,\n previewNote,\n setPreviewNote,\n history,\n redoStack,\n undo,\n redo,\n dispatch: engine.dispatch.bind(engine),\n activeDuration,\n setActiveDuration,\n isDotted,\n setIsDotted,\n activeAccidental,\n activeTie,\n inputMode,\n setInputMode,\n toggleInputMode,\n handleTimeSignatureChange: measureActions.handleTimeSignatureChange,\n handleKeySignatureChange: measureActions.handleKeySignatureChange,\n addMeasure: measureActions.addMeasure,\n removeMeasure: measureActions.removeMeasure,\n togglePickup: measureActions.togglePickup,\n setGrandStaff: measureActions.setGrandStaff,\n handleMeasureHover: noteActions.handleMeasureHover,\n addNoteToMeasure: noteActions.addNoteToMeasure,\n addChordToMeasure: noteActions.addChordToMeasure,\n deleteSelected: noteActions.deleteSelected,\n handleNoteSelection: navigation.handleNoteSelection,\n handleDurationChange: handleDurationChangeWrapper, // Use wrapper\n handleDotToggle: modifiers.handleDotToggle,\n handleAccidentalToggle: modifiers.handleAccidentalToggle,\n handleTieToggle: modifiers.handleTieToggle,\n currentQuantsPerMeasure,\n scoreRef,\n checkDurationValidity: modifiers.checkDurationValidity,\n checkDotValidity: modifiers.checkDotValidity,\n updateNotePitch: noteActions.updateNotePitch,\n // Tuplet actions\n applyTuplet: tupletActions.applyTuplet,\n removeTuplet: tupletActions.removeTuplet,\n canApplyTuplet: tupletActions.canApplyTuplet,\n activeTupletRatio: tupletActions.getActiveTupletRatio(),\n transposeSelection: navigation.transposeSelection,\n moveSelection: navigation.moveSelection,\n switchStaff: navigation.switchStaff,\n focusScore,\n };\n};\n","import { Command } from './types';\nimport { Score, Staff } from '@/types';\n\n/**\n * Command to reduce a Grand Staff to a single staff.\n * Supports three modes:\n * - 'keep': Keep only the target clef's staff, discard the other\n * - 'merge': Merge events from both staves into the target clef\n */\nexport class SetSingleStaffCommand implements Command {\n type = 'SET_SINGLE_STAFF';\n private previousStaves: Staff[] | null = null;\n\n constructor(private targetClef: 'treble' | 'bass') {}\n\n execute(score: Score): Score {\n // Not a grand staff? No-op\n if (score.staves.length < 2) return score;\n\n // Store previous state for undo\n this.previousStaves = score.staves.map((s) => ({\n ...s,\n measures: s.measures.map((m) => ({\n ...m,\n events: [...m.events],\n })),\n }));\n\n const trebleStaff = score.staves[0];\n const bassStaff = score.staves[1];\n\n // Determine which staff to keep\n const keepStaff = this.targetClef === 'treble' ? trebleStaff : bassStaff;\n\n // Keep mode: just keep the target staff's measures\n const resultMeasures = keepStaff.measures.map((m) => ({ ...m }));\n\n const resultStaff: Staff = {\n ...keepStaff,\n clef: this.targetClef,\n measures: resultMeasures,\n };\n\n return {\n ...score,\n staves: [resultStaff],\n };\n }\n\n undo(score: Score): Score {\n if (!this.previousStaves) return score;\n\n return {\n ...score,\n staves: this.previousStaves,\n };\n }\n}\n","import React, { createContext, useContext, ReactNode } from 'react';\nimport { useScoreLogic } from '@/hooks/useScoreLogic';\n\nimport { SetSingleStaffCommand } from '@/commands/SetSingleStaffCommand';\n\n// Infers the return type of useScoreLogic and extends it with UI state\ntype ScoreContextType = ReturnType<typeof useScoreLogic> & {\n pendingClefChange: { targetClef: 'treble' | 'bass' } | null;\n setPendingClefChange: React.Dispatch<\n React.SetStateAction<{ targetClef: 'treble' | 'bass' } | null>\n >;\n handleClefChange: (val: string) => void;\n};\n\nexport const ScoreContext = createContext<ScoreContextType | null>(null);\n\nexport const useScoreContext = () => {\n const context = useContext(ScoreContext);\n if (!context) {\n throw new Error('useScoreContext must be used within a ScoreProvider');\n }\n return context;\n};\n\ninterface ScoreProviderProps {\n children: ReactNode;\n initialScore?: any;\n}\n\nexport const ScoreProvider: React.FC<ScoreProviderProps> = ({ children, initialScore }) => {\n const logic = useScoreLogic(initialScore);\n\n // UI State for Clef Confirmation (moved from ScoreEditor)\n const [pendingClefChange, setPendingClefChange] = React.useState<{\n targetClef: 'treble' | 'bass';\n } | null>(null);\n\n const handleClefChange = React.useCallback(\n (val: string) => {\n const newClef = String(val).trim();\n if (newClef === 'grand') {\n logic.setGrandStaff();\n } else if (logic.score.staves.length >= 2) {\n // Switching from grand staff to single clef - show confirmation\n setPendingClefChange({ targetClef: newClef as 'treble' | 'bass' });\n } else {\n // Single staff - just change the clef\n logic.dispatch(new SetSingleStaffCommand(newClef as 'treble' | 'bass'));\n }\n },\n [logic.score.staves.length, logic.setGrandStaff, logic.dispatch]\n );\n\n const contextValue = React.useMemo(\n () => ({\n ...logic,\n pendingClefChange,\n setPendingClefChange,\n handleClefChange,\n }),\n [logic, pendingClefChange, handleClefChange]\n );\n\n return <ScoreContext.Provider value={contextValue}>{children}</ScoreContext.Provider>;\n};\n","import React, { createContext, useContext, useState, useEffect } from 'react';\nimport { THEMES, Theme, ThemeName, DEFAULT_THEME } from '@/config';\nimport { DEFAULT_SCALE } from '@/constants';\n\ninterface ThemeContextType {\n theme: Theme;\n themeName: ThemeName;\n setTheme: (name: ThemeName) => void;\n zoom: number;\n setZoom: (zoom: number) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const ThemeProvider: React.FC<{ children: React.ReactNode; initialTheme?: ThemeName }> = ({\n children,\n initialTheme,\n}) => {\n const [themeName, setThemeName] = useState<ThemeName>(initialTheme || DEFAULT_THEME);\n const [zoom, setZoom] = useState(DEFAULT_SCALE);\n\n useEffect(() => {\n if (initialTheme) {\n setThemeName(initialTheme);\n }\n }, [initialTheme]);\n\n const theme = THEMES[themeName];\n\n return (\n <ThemeContext.Provider value={{ theme, themeName, setTheme: setThemeName, zoom, setZoom }}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = () => {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n","import { getActiveStaff } from '@/types';\n\n/**\n * Handles playback keyboard shortcuts (Space, P).\n */\nexport const handlePlayback = (e: KeyboardEvent, playback: any, selection: any, score: any) => {\n const { playScore, stopPlayback, isPlaying, lastPlayStart } = playback;\n const measures = getActiveStaff(score).measures;\n\n // PLAYBACK 'P'\n if (e.key.toLowerCase() === 'p') {\n e.preventDefault();\n if (selection.measureIndex !== null && selection.eventId) {\n const m = measures[selection.measureIndex];\n const eIdx = m.events.findIndex((evt: any) => evt.id === selection.eventId);\n playScore(selection.measureIndex, eIdx !== -1 ? eIdx : 0);\n } else {\n playScore(0, 0);\n }\n return true;\n }\n\n // SPACEBAR\n if (e.code === 'Space') {\n e.preventDefault();\n if (e.shiftKey && (e.altKey || e.metaKey)) {\n playScore(0, 0);\n } else if (e.shiftKey) {\n playScore(lastPlayStart.measureIndex, lastPlayStart.eventIndex);\n } else {\n if (isPlaying) {\n playback.pausePlayback();\n } else {\n // RESUME from NEXT event if paused (position exists)\n if (playback.playbackPosition && playback.playbackPosition.measureIndex !== null) {\n const resumeQuant = (playback.playbackPosition.quant ?? -1) + 1;\n playScore(playback.playbackPosition.measureIndex, resumeQuant);\n }\n // START from selection if stopped\n else if (selection.measureIndex !== null && selection.eventId) {\n const m = measures[selection.measureIndex];\n const eIdx = m.events.findIndex((evt: any) => evt.id === selection.eventId);\n playScore(selection.measureIndex, eIdx !== -1 ? eIdx : 0);\n }\n // START from beginning\n else {\n playScore(0, 0);\n }\n }\n }\n return true;\n }\n\n return false;\n};\n","/**\n * Handles navigation keyboard shortcuts (Arrow keys).\n * @param switchStaff - Optional function to switch between staves (for Grand Staff)\n */\nexport const handleNavigation = (\n e: KeyboardEvent,\n moveSelection: (direction: string, isShift: boolean) => void,\n switchStaff?: (direction: 'up' | 'down') => void\n) => {\n if (!e.key.startsWith('Arrow')) return false;\n\n const direction = e.key.replace('Arrow', '').toLowerCase(); // left, right, up, down\n\n // Alt+Up/Down = Switch Staff (for Grand Staff)\n if ((direction === 'up' || direction === 'down') && e.altKey && switchStaff) {\n e.preventDefault();\n switchStaff(direction as 'up' | 'down');\n return true;\n }\n\n if (direction === 'left' || direction === 'right') {\n e.preventDefault();\n moveSelection(direction, e.shiftKey);\n return true;\n }\n\n if (direction === 'up' || direction === 'down') {\n // Only handle navigation if Meta/Ctrl is pressed (Chord Navigation)\n // Otherwise it's transposition (handled by handleMutation)\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n moveSelection(direction, e.shiftKey);\n return true;\n }\n }\n\n return false;\n};\n","import { Command } from './types';\nimport { Score, Note, Selection, getActiveStaff } from '@/types';\nimport { updateEvent } from '@/utils/commandHelpers';\n\n/**\n * Represents the previous state of an event for undo purposes.\n */\ninterface EventPreviousState {\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n isRest: boolean;\n notes: Note[];\n}\n\n/**\n * Returns the center pitch for a staff based on its clef.\n * Used when converting rests to notes.\n *\n * @param clef - 'treble' | 'bass' | 'grand'\n * @returns Center pitch (B4 for treble, D3 for bass)\n */\nconst getCenterPitch = (clef: 'treble' | 'bass' | 'grand'): string => {\n return clef === 'bass' ? 'D3' : 'B4';\n};\n\n/**\n * Command to toggle selected events between notes and rests.\n *\n * Logic:\n * - If ALL selected events are rests → convert to notes (centered pitch)\n * - Otherwise (any notes, or mixed) → convert ALL to rests\n *\n * When converting rests to notes:\n * - Pitch is centered on staff (B4 treble, D3 bass)\n * - Single note per event\n *\n * @example\n * dispatch(new ToggleRestCommand(selection));\n */\nexport class ToggleRestCommand implements Command {\n public readonly type = 'TOGGLE_REST';\n\n /** Stores previous state for each event for undo */\n private previousStates: EventPreviousState[] = [];\n\n /**\n * @param selection - Current selection containing events to toggle\n */\n constructor(private selection: Selection) {}\n\n execute(score: Score): Score {\n // Collect unique events from selection\n const eventMap = new Map<\n string,\n { staffIndex: number; measureIndex: number; eventId: string | number }\n >();\n\n for (const item of this.selection.selectedNotes) {\n const key = `${item.staffIndex}-${item.measureIndex}-${item.eventId}`;\n if (!eventMap.has(key)) {\n eventMap.set(key, {\n staffIndex: item.staffIndex,\n measureIndex: item.measureIndex,\n eventId: item.eventId,\n });\n }\n }\n\n // Also include primary selection if not in selectedNotes\n if (this.selection.measureIndex !== null && this.selection.eventId !== null) {\n const key = `${this.selection.staffIndex}-${this.selection.measureIndex}-${this.selection.eventId}`;\n if (!eventMap.has(key)) {\n eventMap.set(key, {\n staffIndex: this.selection.staffIndex,\n measureIndex: this.selection.measureIndex,\n eventId: this.selection.eventId,\n });\n }\n }\n\n if (eventMap.size === 0) return score;\n\n // Check if all are rests\n let allRests = true;\n for (const { staffIndex, measureIndex, eventId } of eventMap.values()) {\n const staff = getActiveStaff(score, staffIndex);\n const measure = staff.measures[measureIndex];\n const event = measure?.events.find((e) => e.id === eventId);\n if (event && !event.isRest) {\n allRests = false;\n break;\n }\n }\n\n // Store previous states and apply changes\n let newScore = score;\n\n for (const { staffIndex, measureIndex, eventId } of eventMap.values()) {\n const staff = getActiveStaff(newScore, staffIndex);\n const measure = staff.measures[measureIndex];\n const event = measure?.events.find((e) => e.id === eventId);\n\n if (!event) continue;\n\n // Store previous state\n this.previousStates.push({\n staffIndex,\n measureIndex,\n eventId,\n isRest: event.isRest ?? false,\n notes: [...event.notes],\n });\n\n // Apply change\n if (allRests) {\n // Convert to notes - keep existing ID for selection continuity\n const clef = staff.clef;\n const centeredPitch = getCenterPitch(clef);\n const firstNoteId = event.notes[0]?.id || `note-${Date.now()}`;\n\n newScore = updateEvent(newScore, staffIndex, measureIndex, eventId, (e) => {\n e.isRest = false;\n e.notes = [\n {\n id: firstNoteId,\n pitch: centeredPitch,\n },\n ];\n return true;\n });\n } else {\n // Convert to rests - create a pitchless note to maintain selection compatibility\n const firstNoteId = event.notes[0]?.id || `${eventId}-rest`;\n newScore = updateEvent(newScore, staffIndex, measureIndex, eventId, (e) => {\n e.isRest = true;\n e.notes = [\n {\n id: firstNoteId,\n pitch: null,\n isRest: true,\n },\n ];\n return true;\n });\n }\n }\n\n return newScore;\n }\n\n undo(score: Score): Score {\n let newScore = score;\n\n // Restore all previous states\n for (const state of this.previousStates) {\n newScore = updateEvent(\n newScore,\n state.staffIndex,\n state.measureIndex,\n state.eventId,\n (event) => {\n event.isRest = state.isRest;\n event.notes = [...state.notes];\n return true;\n }\n );\n }\n\n return newScore;\n }\n}\n","import { ToggleRestCommand } from '@/commands/ToggleRestCommand';\n\n/**\n * Handles mutation keyboard shortcuts (Enter, Delete, Accidentals, Ties, Transposition, Undo/Redo).\n */\nexport const handleMutation = (e: KeyboardEvent, logic: any) => {\n const {\n undo,\n redo,\n handleAccidentalToggle,\n handleTieToggle,\n handleDotToggle,\n deleteSelected,\n transposeSelection,\n addNoteToMeasure,\n previewNote,\n handleDurationChange,\n // R key / Rest toggle\n toggleInputMode,\n selection,\n dispatch,\n editorState,\n } = logic;\n\n // DURATION SHORTCUTS\n // DURATION SHORTCUTS\n const durationMap: { [key: string]: string } = {\n '1': 'sixtyfourth',\n '2': 'thirtysecond',\n '3': 'sixteenth',\n '4': 'eighth',\n '5': 'quarter',\n '6': 'half',\n '7': 'whole',\n };\n\n if (durationMap[e.key]) {\n e.preventDefault();\n const applyToSelection = e.metaKey || e.ctrlKey;\n handleDurationChange(durationMap[e.key], applyToSelection);\n return true;\n }\n\n // REST TOGGLE (R key)\n // Skip if CMD/CTRL is held (allow browser refresh with CMD+R / CTRL+R)\n // - Always toggles inputMode\n // - When selection exists, also converts notes↔rests\n if ((e.key === 'r' || e.key === 'R') && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n\n // Always toggle the input mode\n toggleInputMode();\n\n // If we have a selection, also convert the events\n if (editorState === 'SELECTION_READY' && selection?.selectedNotes?.length > 0) {\n dispatch(new ToggleRestCommand(selection));\n }\n\n return true;\n }\n\n // UNDO / REDO\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z') {\n e.preventDefault();\n if (e.shiftKey) redo();\n else undo();\n return true;\n }\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'y') {\n e.preventDefault();\n redo();\n return true;\n }\n\n // ACCIDENTALS\n if (e.key === '-' || e.key === '_') {\n e.preventDefault();\n handleAccidentalToggle('flat');\n return true;\n }\n if (e.key === '=' || e.key === '+') {\n e.preventDefault();\n handleAccidentalToggle('sharp');\n return true;\n }\n if (e.key === '0') {\n e.preventDefault();\n handleAccidentalToggle('natural');\n return true;\n }\n\n // TIE\n if (e.key.toLowerCase() === 't') {\n e.preventDefault();\n handleTieToggle();\n return true;\n }\n\n // DOT\n if (e.key === '.') {\n e.preventDefault();\n handleDotToggle();\n return true;\n }\n\n // ENTER (Insert Note)\n if (e.key === 'Enter') {\n e.preventDefault();\n if (previewNote) {\n addNoteToMeasure(previewNote.measureIndex, previewNote, true, {\n mode: previewNote.mode,\n index: previewNote.index,\n });\n }\n return true;\n }\n\n // TRANSPOSITION (Arrow Up/Down)\n // Note: Cmd/Ctrl+ArrowUp/Down is handled by handleNavigation for chord navigation\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const direction = e.key.replace('Arrow', '').toLowerCase();\n transposeSelection(direction, e.shiftKey);\n return true;\n }\n\n // DELETE\n if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault();\n deleteSelected();\n return true;\n }\n\n return false;\n};\n","import { useEffect, useCallback } from 'react';\nimport { handlePlayback } from './handlers/handlePlayback';\nimport { handleNavigation } from './handlers/handleNavigation';\nimport { handleMutation } from './handlers/handleMutation';\nimport { getActiveStaff } from '@/types';\n\n/**\n * Hook to handle global keyboard shortcuts.\n * Delegates actions to the provided logic and playback controllers.\n *\n * @param {Object} logic - The score logic object (from useScoreLogic or useGrandStaffLogic)\n * @param {Object} playback - The playback control object (from usePlayback)\n * @param {Object} meta - Meta state (isEditingTitle, etc.)\n * @param {Object} handlers - Specific handlers (handleTitleCommit, etc.)\n */\ninterface UIState {\n isEditingTitle: boolean;\n isHoveringScore: boolean;\n scoreContainerRef: React.RefObject<HTMLDivElement | null>;\n isAnyMenuOpen?: () => boolean;\n isDisabled?: boolean;\n}\n\nexport const useKeyboardShortcuts = (logic: any, playback: any, meta: UIState, handlers: any) => {\n const { selection, score, moveSelection, setSelection, scoreRef, switchStaff } = logic;\n\n const { isEditingTitle, isHoveringScore, scoreContainerRef, isAnyMenuOpen } = meta;\n const { handleTitleCommit } = handlers;\n\n const handleKeyDown = useCallback(\n (e: any) => {\n const tagName = (e.target as HTMLElement).tagName?.toLowerCase() || '';\n if (tagName === 'input' || tagName === 'textarea') {\n if (e.key === 'Enter' && isEditingTitle) {\n e.preventDefault();\n handleTitleCommit();\n }\n return;\n }\n\n if (isEditingTitle) return;\n\n // CHECK FOCUS / HOVER\n // If we have a ref to the score container, ensure we are focused on it OR hovering it\n if (scoreContainerRef && scoreContainerRef.current) {\n const isFocused =\n document.activeElement === scoreContainerRef.current ||\n scoreContainerRef.current.contains(document.activeElement);\n if (!isFocused && !isHoveringScore) {\n return; // Ignore input if not focused and not hovering\n }\n }\n\n if (e.key === 'Escape') {\n e.preventDefault(); // Prevent default browser behavior for Escape key\n console.log('ESC Pressed. Focused:', document.activeElement?.getAttribute('data-testid'));\n\n // First priority: Pause playback if playing\n if (playback.isPlaying) {\n playback.handlePlayToggle();\n return; // Don't clear selection when pausing\n }\n\n if (isAnyMenuOpen && isAnyMenuOpen()) {\n // Menu is open, let the menu handle close (or it closed via blur/click outside)\n // Do NOT clear selection\n return;\n }\n\n if (selection.noteId) {\n // If a single note is selected...\n const activeStaff = getActiveStaff(scoreRef.current);\n const measure = activeStaff.measures[selection.measureIndex!];\n const event = measure.events.find((ev: any) => ev.id === selection.eventId);\n\n if (event && event.notes.length > 1) {\n // Check if we already have ALL notes selected\n const allSelected = event.notes.every((n: any) => {\n if (String(n.id) === String(selection.noteId)) return true;\n return selection.selectedNotes.some((sn: any) => String(sn.noteId) === String(n.id));\n });\n\n if (!allSelected) {\n // Select ALL notes in the chord\n // We keep the current focus (noteId) but add everyone else to selectedNotes\n const allNoteSelections = event.notes.map((n: any) => ({\n staffIndex: selection.staffIndex || 0,\n measureIndex: selection.measureIndex!,\n eventId: selection.eventId!,\n noteId: n.id,\n }));\n\n setSelection({\n ...selection,\n selectedNotes: allNoteSelections,\n });\n return;\n }\n }\n\n // If all selected OR single note, clear selection\n setSelection({\n staffIndex: 0,\n measureIndex: null,\n eventId: null,\n noteId: null,\n selectedNotes: [],\n });\n } else if (selection.eventId) {\n // If event is selected (fallback for rests), clear selection\n setSelection({\n staffIndex: 0,\n measureIndex: null,\n eventId: null,\n noteId: null,\n selectedNotes: [],\n });\n }\n return;\n }\n\n // 1. Playback\n if (handlePlayback(e, playback, selection, score)) return;\n\n // 2. Navigation (includes Alt+Up/Down for staff switching)\n if (handleNavigation(e, moveSelection, switchStaff)) return;\n\n // 3. Mutation\n if (handleMutation(e, logic)) return;\n },\n [\n logic,\n playback,\n meta,\n handlers,\n selection,\n score,\n moveSelection,\n switchStaff,\n isEditingTitle,\n handleTitleCommit,\n isHoveringScore,\n scoreContainerRef,\n ]\n );\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return handleKeyDown;\n};\n","import { TIME_SIGNATURES } from '@/constants';\nimport { getNoteDuration } from '@/utils/core';\nimport { getFrequency } from './MusicService';\nimport { getActiveStaff } from '@/types';\n\nexport interface TimelineEvent {\n time: number; // Start time in seconds\n duration: number; // Duration in seconds\n pitch: string; // Pitch notation (\"C4\", \"F#5\") for Tone.js\n frequency: number; // Frequency in Hz (legacy/backup)\n type: 'note'; // (Future: 'rest')\n measureIndex: number;\n eventIndex: number; // Keep for legacy reference or fallback\n staffIndex: number;\n quant: number; // Relative quant from start of measure\n}\n\n/**\n * Creates a flattened timeline of audio events from the score.\n * Handles timing, ties, and frequency lookup.\n *\n * @param score - The score object\n * @param bpm - Beats per minute\n * @returns Array of TimelineEvents sorted by time\n */\n/**\n * Creates a flattened timeline of audio events from the score.\n * Handles timing, ties, and frequency lookup.\n * Refactored to use \"Flatten-then-Merge\" strategy for cleaner tie resolution.\n *\n * @param score - The score object\n * @param bpm - Beats per minute\n * @returns Array of TimelineEvents sorted by time\n */\nexport const createTimeline = (score: any, bpm: number): TimelineEvent[] => {\n const timeline: TimelineEvent[] = [];\n const secondsPerBeat = 60 / bpm;\n const secondsPerQuant = secondsPerBeat / 16;\n\n const staves = score.staves || [getActiveStaff(score)];\n if (staves.length === 0) return [];\n\n const timeSig = score.timeSignature || '4/4';\n const firstStaffMeasures = staves[0].measures;\n\n // 1. Calculate Start Times for each Measure (Global Grid)\n const measureStartTimes: number[] = [];\n let currentGlobalTime = 0;\n\n firstStaffMeasures.forEach((measure: any) => {\n measureStartTimes.push(currentGlobalTime);\n\n // Calculate duration of this measure\n let measureQuants;\n if (measure.isPickup) {\n measureQuants = measure.events.reduce(\n (acc: number, e: any) => acc + getNoteDuration(e.duration, e.dotted, e.tuplet),\n 0\n );\n } else {\n measureQuants = TIME_SIGNATURES[timeSig as keyof typeof TIME_SIGNATURES] || 64;\n }\n currentGlobalTime += measureQuants * secondsPerQuant;\n });\n\n // Sub-interface for internal processing\n interface RawNoteEvent {\n time: number;\n duration: number;\n pitch: string;\n tied: boolean;\n measureIndex: number;\n eventIndex: number;\n quant: number;\n staffIndex: number;\n }\n\n // 2. Process each Staff independently\n staves.forEach((staff: any, staffIndex: number) => {\n const rawEvents: RawNoteEvent[] = [];\n\n // Flatten all notes in this staff\n staff.measures.forEach((measure: any, mIndex: number) => {\n if (mIndex >= measureStartTimes.length) return;\n const measureStartTime = measureStartTimes[mIndex];\n let currentMeasureQuant = 0;\n\n measure.events.forEach((event: any, eIndex: number) => {\n const eventDurQuants = getNoteDuration(event.duration, event.dotted, event.tuplet);\n\n event.notes.forEach((note: any) => {\n rawEvents.push({\n time: measureStartTime + currentMeasureQuant * secondsPerQuant,\n duration: eventDurQuants * secondsPerQuant,\n pitch: note.pitch,\n tied: !!note.tied,\n measureIndex: mIndex,\n eventIndex: eIndex,\n quant: currentMeasureQuant,\n staffIndex,\n });\n });\n\n currentMeasureQuant += eventDurQuants;\n });\n });\n\n // Sort by Pitch, then Time to group tie chains\n rawEvents.sort((a, b) => {\n if (a.pitch !== b.pitch) return a.pitch.localeCompare(b.pitch);\n return a.time - b.time;\n });\n\n // Merge Ties (Linear Pass)\n if (rawEvents.length > 0) {\n let current = rawEvents[0];\n\n for (let i = 1; i < rawEvents.length; i++) {\n const next = rawEvents[i];\n\n // Check connectivity\n // Must be same pitch (guaranteed by sort usually, but check)\n // Must be 'tied' flag on current\n // Must be adjacent in time (within small epsilon float tolerance)\n const isConnected =\n current.tied &&\n next.pitch === current.pitch &&\n Math.abs(next.time - (current.time + current.duration)) < 0.001;\n\n if (isConnected) {\n // Merge: Extend duration\n current.duration += next.duration;\n // Inherit tie status from next (if this chain continues)\n current.tied = next.tied;\n } else {\n // Push finished event\n addEventToTimeline(current);\n current = next;\n }\n }\n // Push final event\n addEventToTimeline(current);\n }\n });\n\n function addEventToTimeline(raw: RawNoteEvent) {\n const freq = getFrequency(raw.pitch);\n if (freq) {\n timeline.push({\n time: raw.time,\n duration: raw.duration,\n pitch: raw.pitch,\n frequency: freq,\n type: 'note',\n measureIndex: raw.measureIndex,\n eventIndex: raw.eventIndex,\n staffIndex: raw.staffIndex,\n quant: raw.quant,\n });\n }\n }\n\n // Sort by time (interleave staves)\n return timeline.sort((a, b) => a.time - b.time);\n};\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n initTone,\n scheduleTonePlayback,\n stopTonePlayback,\n getState,\n InstrumentState,\n} from '@/engines/toneEngine';\nimport { createTimeline } from '@/services/TimelineService';\n\nexport const usePlayback = (score: any, bpm: number) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [playbackPosition, setPlaybackPosition] = useState<{\n measureIndex: number | null;\n quant: number | null;\n duration: number;\n }>({ measureIndex: null, quant: null, duration: 0 });\n const [lastPlayStart, setLastPlayStart] = useState({ measureIndex: 0, quant: 0 });\n const [instrumentState, setInstrumentState] = useState<InstrumentState>('initializing');\n\n const isInitialized = useRef(false);\n\n // Initialize Tone.js on first user interaction\n const ensureInit = useCallback(async () => {\n if (isInitialized.current) return;\n\n await initTone((state) => {\n setInstrumentState(state.instrumentState);\n });\n\n isInitialized.current = true;\n }, []);\n\n /*\n * Stop playback and reset position (Stop Button behavior)\n */\n const stopPlayback = useCallback(() => {\n stopTonePlayback();\n setIsPlaying(false);\n setPlaybackPosition({ measureIndex: null, quant: null, duration: 0 });\n }, []);\n\n /*\n * Pause playback but retain position (Pause Button behavior)\n */\n const pausePlayback = useCallback(() => {\n stopTonePlayback();\n setIsPlaying(false);\n // Do NOT reset playbackPosition, so cursor stays visible and we can resume\n }, []);\n\n const playScore = useCallback(\n async (startMeasureIndex = 0, startQuant = 0) => {\n await ensureInit();\n\n // Stop any existing playback (clears position state if we called stopPlayback,\n // but here we are about to overwrite it anyway)\n stopTonePlayback();\n\n setLastPlayStart({ measureIndex: startMeasureIndex, quant: startQuant });\n setIsPlaying(true);\n\n // Generate timeline\n const timeline = createTimeline(score, bpm);\n\n // Find start offset time\n let startTimeOffset = 0;\n const startEvent = timeline.find(\n (e) =>\n e.measureIndex >= startMeasureIndex &&\n (e.measureIndex > startMeasureIndex || e.quant >= startQuant)\n );\n\n if (startEvent) {\n startTimeOffset = startEvent.time;\n }\n\n scheduleTonePlayback(\n timeline,\n bpm,\n startTimeOffset,\n (measureIndex, quant, duration) => {\n setPlaybackPosition({ measureIndex, quant, duration: duration || 0 });\n },\n () => {\n setIsPlaying(false);\n setPlaybackPosition({ measureIndex: null, quant: null, duration: 0 });\n }\n );\n },\n [score, bpm, ensureInit]\n );\n\n const handlePlayToggle = useCallback(() => {\n if (isPlaying) {\n pausePlayback();\n } else {\n // Resume from NEXT event (quant + 1) if valid, otherwise start from beginning\n const resumeMeasure = playbackPosition.measureIndex ?? 0;\n const resumeQuant = (playbackPosition.quant ?? -1) + 1; // +1 to skip to next event\n playScore(resumeMeasure, resumeQuant);\n }\n }, [isPlaying, playScore, pausePlayback, playbackPosition]);\n\n return {\n isPlaying,\n playbackPosition,\n playScore,\n stopPlayback,\n pausePlayback,\n handlePlayToggle,\n lastPlayStart,\n instrumentState, // Expose for UI (e.g., \"Loading piano samples...\")\n };\n};\n","// @ts-nocheck\n/**\n * MIDI utility module for connecting to MIDI devices and handling note input.\n * Uses the Web MIDI API.\n */\n\n// @ts-nocheck\n/**\n * MIDI utility module for connecting to MIDI devices and handling note input.\n * Uses the Web MIDI API.\n */\n\nimport { midiToPitch } from '@/services/MusicService';\n\n/**\n * Converts a MIDI note number to a pitch string (e.g., 60 -> \"C4\")\n * now wraps MusicService.midiToPitch\n * @param midiNote - MIDI note number (0-127)\n * @returns Pitch string like \"C4\", \"C#4\", etc.\n */\nexport const midiNoteToPitch = (midiNote: number): string => {\n return midiToPitch(midiNote);\n};\n\n// Legacy helpers removed: isMidiNoteSharp, getMidiNoteAccidental\n// Callers should rely on absolute pitch strings.\n\n/**\n * Request MIDI access and return available input devices\n */\nexport const requestMIDIAccess = async (): Promise<{\n inputs: MIDIInput[];\n access: MIDIAccess | null;\n error: string | null;\n}> => {\n if (typeof navigator === 'undefined' || !navigator.requestMIDIAccess) {\n return { inputs: [], access: null, error: 'Web MIDI API not supported in this browser' };\n }\n\n try {\n const access = await navigator.requestMIDIAccess();\n const inputs = Array.from(access.inputs.values());\n return { inputs, access, error: null };\n } catch (err) {\n return { inputs: [], access: null, error: `MIDI access denied: ${err.message}` };\n }\n};\n\n/**\n * Sets up MIDI input listeners\n * @param access - MIDIAccess object\n * @param onNoteOn - Callback for note-on events (midiNote, velocity)\n * @param onNoteOff - Callback for note-off events (midiNote)\n * @returns Cleanup function to remove listeners\n */\nexport const setupMIDIListeners = (\n access: MIDIAccess,\n onNoteOn: (midiNote: number, velocity: number) => void,\n onNoteOff?: (midiNote: number) => void\n): (() => void) => {\n const handleMessage = (event: MIDIMessageEvent) => {\n const [status, note, velocity] = event.data;\n\n // Note On: 0x90-0x9F (channel 1-16)\n if ((status & 0xf0) === 0x90 && velocity > 0) {\n onNoteOn(note, velocity);\n }\n // Note Off: 0x80-0x8F or Note On with velocity 0\n else if ((status & 0xf0) === 0x80 || ((status & 0xf0) === 0x90 && velocity === 0)) {\n if (onNoteOff) onNoteOff(note);\n }\n };\n\n // Add listener to all inputs\n access.inputs.forEach((input) => {\n input.onmidimessage = handleMessage;\n });\n\n // Handle device connection/disconnection\n access.onstatechange = (event) => {\n const port = event.port;\n if (port.type === 'input') {\n if (port.state === 'connected') {\n port.onmidimessage = handleMessage;\n }\n }\n };\n\n // Return cleanup function\n return () => {\n access.inputs.forEach((input) => {\n input.onmidimessage = null;\n });\n access.onstatechange = null;\n };\n};\n\n// Type declarations for Web MIDI API\ndeclare global {\n interface Navigator {\n requestMIDIAccess(): Promise<MIDIAccess>;\n }\n\n interface MIDIAccess {\n inputs: Map<string, MIDIInput>;\n outputs: Map<string, MIDIOutput>;\n onstatechange: ((event: MIDIConnectionEvent) => void) | null;\n }\n\n interface MIDIInput {\n id: string;\n name: string;\n manufacturer: string;\n state: string;\n type: string;\n onmidimessage: ((event: MIDIMessageEvent) => void) | null;\n }\n\n interface MIDIOutput {\n id: string;\n name: string;\n }\n\n interface MIDIMessageEvent {\n data: Uint8Array;\n }\n\n interface MIDIConnectionEvent {\n port: MIDIInput | MIDIOutput;\n }\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { requestMIDIAccess, setupMIDIListeners, midiNoteToPitch } from '@/engines/midiEngine';\nimport { playNote } from '@/engines/toneEngine';\nimport { getActiveStaff } from '@/types';\n\nexport const useMIDI = (\n addChordCallback: (\n measureIndex: number,\n notes: any[],\n duration: string,\n isDotted: boolean\n ) => void,\n activeDuration: string,\n isDotted: boolean,\n activeAccidental: 'flat' | 'natural' | 'sharp' | null,\n scoreRef: React.MutableRefObject<any>\n) => {\n const [midiStatus, setMidiStatus] = useState<{\n connected: boolean;\n deviceName: string | null;\n error: string | null;\n }>({ connected: false, deviceName: null, error: null });\n\n const midiCleanupRef = useRef<(() => void) | null>(null);\n const midiChordBuffer = useRef<{ pitch: string; accidental: string | null }[]>([]);\n const midiChordTimer = useRef<NodeJS.Timeout | null>(null);\n\n // Refs to access latest state in callbacks\n const activeDurationRef = useRef(activeDuration);\n const isDottedRef = useRef(isDotted);\n const activeAccidentalRef = useRef(activeAccidental);\n const addChordRef = useRef(addChordCallback);\n\n useEffect(() => {\n activeDurationRef.current = activeDuration;\n }, [activeDuration]);\n useEffect(() => {\n isDottedRef.current = isDotted;\n }, [isDotted]);\n useEffect(() => {\n activeAccidentalRef.current = activeAccidental;\n }, [activeAccidental]);\n useEffect(() => {\n addChordRef.current = addChordCallback;\n }, [addChordCallback]);\n\n useEffect(() => {\n const initMIDI = async () => {\n const { inputs, access, error } = await requestMIDIAccess();\n if (error) {\n setMidiStatus({ connected: false, deviceName: null, error });\n return;\n }\n if (inputs.length === 0) {\n setMidiStatus({ connected: false, deviceName: null, error: null });\n return;\n }\n const device = inputs[0];\n setMidiStatus({ connected: true, deviceName: device.name || 'MIDI Device', error: null });\n\n const CHORD_WINDOW_MS = 50;\n\n const commitChord = () => {\n if (midiChordBuffer.current.length === 0) return;\n const notes = [...midiChordBuffer.current];\n midiChordBuffer.current = [];\n\n // Play tones\n const keySignature = scoreRef.current\n ? getActiveStaff(scoreRef.current).keySignature || 'C'\n : 'C';\n notes.forEach((n) => playNote(n.pitch));\n\n // Add chord\n if (addChordRef.current && scoreRef.current) {\n const currentScore = scoreRef.current;\n const targetMeasureIndex = currentScore.measures.length - 1;\n addChordRef.current(\n targetMeasureIndex,\n notes.map((n) => ({\n pitch: n.pitch,\n accidental: n.accidental || activeAccidentalRef.current,\n id: Date.now() + Math.random(),\n })),\n activeDurationRef.current,\n isDottedRef.current\n );\n }\n };\n\n const cleanup = setupMIDIListeners(access as any, (midiNote: number, velocity: number) => {\n const pitch = midiNoteToPitch(midiNote);\n // Valid range check could be here if needed\n\n midiChordBuffer.current.push({ pitch, accidental: null });\n\n if (midiChordTimer.current) clearTimeout(midiChordTimer.current);\n midiChordTimer.current = setTimeout(commitChord, CHORD_WINDOW_MS);\n });\n midiCleanupRef.current = cleanup;\n };\n\n initMIDI();\n\n return () => {\n if (midiCleanupRef.current) midiCleanupRef.current();\n };\n }, []); // Run once on mount\n\n return { midiStatus };\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { movePitchVisual } from '@/services/MusicService';\nimport { CONFIG } from '@/config';\nimport { PIANO_RANGE } from '@/constants';\nimport { isNoteSelected } from '@/utils/selection';\nimport { Selection } from '@/types';\n\ninterface DragState {\n active: boolean;\n measureIndex: number | null;\n eventId: string | null;\n noteId: string | number | null;\n startY: number;\n startPitch: string;\n currentPitch: string;\n staffIndex: number;\n initialPitches: Map<string, string>; // Map noteId -> pitch\n}\n\ninterface UseScoreInteractionProps {\n scoreRef: React.MutableRefObject<any>;\n selection: Selection;\n onUpdatePitch: (\n measureIndex: number,\n eventId: string | number,\n noteId: string | number,\n newPitch: string\n ) => void;\n onSelectNote: (\n measureIndex: number | null,\n eventId: string | number | null,\n noteId: string | number | null,\n staffIndex?: number,\n isMulti?: boolean,\n selectAllInEvent?: boolean,\n isShift?: boolean\n ) => void;\n}\n\nexport const useScoreInteraction = ({\n scoreRef,\n selection,\n onUpdatePitch,\n onSelectNote,\n}: UseScoreInteractionProps) => {\n const [dragState, setDragState] = useState<DragState>({\n active: false,\n measureIndex: null,\n eventId: null,\n noteId: null,\n startY: 0,\n startPitch: '',\n currentPitch: '',\n staffIndex: 0,\n initialPitches: new Map(),\n });\n\n const mouseDownTime = useRef<number>(0);\n const CLICK_THRESHOLD = 200; // ms to distinguish click from drag\n\n const handleDragStart = useCallback(\n (params: {\n measureIndex: number;\n eventId: string | number;\n noteId: string | number;\n startPitch: string;\n startY: number;\n isMulti?: boolean;\n isShift?: boolean;\n selectAllInEvent?: boolean;\n staffIndex?: number;\n }) => {\n const {\n measureIndex,\n eventId,\n noteId,\n startPitch,\n startY,\n isMulti = false,\n isShift = false,\n selectAllInEvent = false,\n staffIndex = 0,\n } = params;\n\n mouseDownTime.current = Date.now();\n\n // Capture initial pitches\n const initialPitches = new Map<string, string>();\n\n // Helper to find pitch\n const getPitch = (\n sIndex: number,\n mIndex: number,\n eId: string,\n nId: string | number | null\n ) => {\n const m = scoreRef.current.staves[sIndex]?.measures[mIndex];\n const e = m?.events.find((ev: any) => String(ev.id) === String(eId));\n if (nId) {\n return e?.notes.find((n: any) => String(n.id) === String(nId))?.pitch;\n }\n return e?.notes[0]?.pitch;\n };\n\n const isNoteInSelection = isNoteSelected(selection, {\n staffIndex,\n measureIndex,\n eventId,\n noteId,\n });\n\n if (isNoteInSelection && selection.selectedNotes && selection.selectedNotes.length > 0) {\n // Multi-move: capture all currently selected notes\n selection.selectedNotes.forEach((n: any) => {\n const p = getPitch(n.staffIndex, n.measureIndex, n.eventId, n.noteId);\n if (p) initialPitches.set(String(n.noteId), p);\n });\n } else if (selectAllInEvent) {\n // Selecting all notes in event - capture all of them for drag\n const measure = scoreRef.current.staves[staffIndex]?.measures[measureIndex];\n const event = measure?.events.find((ev: any) => String(ev.id) === String(eventId));\n if (event && event.notes) {\n event.notes.forEach((n: any) => {\n if (n.pitch) initialPitches.set(String(n.id), n.pitch);\n });\n }\n } else {\n // Single move\n initialPitches.set(String(noteId), startPitch);\n }\n\n setDragState({\n active: true,\n measureIndex,\n eventId: typeof eventId === 'number' ? String(eventId) : eventId,\n noteId,\n startY,\n startPitch,\n currentPitch: startPitch,\n staffIndex,\n initialPitches,\n });\n\n // Only update selection if note is NOT already selected\n // (dragging an already-selected note should preserve the current selection)\n if (!isNoteInSelection) {\n onSelectNote(measureIndex, eventId, noteId, staffIndex, isMulti, selectAllInEvent, isShift);\n }\n },\n [onSelectNote, selection, scoreRef]\n );\n\n useEffect(() => {\n if (!dragState.active) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!dragState.active) return;\n\n const deltaY = dragState.startY - e.clientY;\n const stepHeight = CONFIG.lineHeight / 2; // e.g. 5px\n const steps = Math.round(deltaY / stepHeight);\n\n if (steps === 0) return;\n\n // Get proper context from score\n const currentScore = scoreRef.current;\n const currentStaff = currentScore?.staves?.[dragState.staffIndex];\n const keySignature = currentStaff?.keySignature || 'C';\n\n // Perform bulk update - use dragState context for same-event drags\n dragState.initialPitches.forEach((pStart: string, noteIdStr: string) => {\n const newP = movePitchVisual(pStart, steps, keySignature, PIANO_RANGE);\n\n // Check if this is a multi-event selection by looking at selection state\n // If selection contains notes from different events, use selection to find context\n // Otherwise, all notes share the same event as dragState\n if (selection.selectedNotes && selection.selectedNotes.length > 1) {\n // Multi-select: find note in selection for its context\n const noteInfo = selection.selectedNotes.find((n: any) => String(n.noteId) === noteIdStr);\n if (noteInfo && noteInfo.noteId !== null) {\n onUpdatePitch(noteInfo.measureIndex, noteInfo.eventId, noteInfo.noteId, newP);\n } else if (dragState.measureIndex !== null && dragState.eventId) {\n // Fallback: note is in same event as drag target\n onUpdatePitch(dragState.measureIndex, dragState.eventId, noteIdStr, newP);\n }\n } else if (dragState.measureIndex !== null && dragState.eventId) {\n // Single event: all notes share dragState context\n onUpdatePitch(dragState.measureIndex, dragState.eventId, noteIdStr, newP);\n }\n });\n\n if (dragState.initialPitches.size > 0) {\n // Update local state just for the primary dragged note for smoothness (if tracked)\n const primaryStart =\n dragState.initialPitches.get(String(dragState.noteId)) || dragState.startPitch;\n const newPrimary = movePitchVisual(primaryStart, steps, keySignature, PIANO_RANGE);\n if (newPrimary !== dragState.currentPitch) {\n setDragState((prev) => ({ ...prev, currentPitch: newPrimary }));\n }\n }\n };\n\n const handleMouseUp = () => {\n const dragDuration = Date.now() - mouseDownTime.current;\n\n if (dragDuration < CLICK_THRESHOLD) {\n // Click handled elsewhere\n }\n\n setDragState((prev) => ({ ...prev, active: false }));\n document.body.style.cursor = 'default';\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'ns-resize';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'default';\n };\n }, [dragState, scoreRef, onUpdatePitch, selection]);\n\n return {\n dragState,\n handleDragStart,\n };\n};\n","import { useState, useEffect } from 'react';\nimport { isSamplerLoaded } from '@/engines/toneEngine';\n\n/**\n * Manages the loading state of the Tone.js sampler.\n * Polls the sampler status periodically until loaded.\n */\nexport function useSamplerStatus() {\n const [loaded, setLoaded] = useState(false);\n\n useEffect(() => {\n const checkSampler = () => setLoaded(isSamplerLoaded());\n checkSampler();\n const interval = setInterval(checkSampler, 500);\n return () => clearInterval(interval);\n }, []);\n\n return loaded;\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Tracks whether modifier keys (Ctrl/Meta) are being held.\n * Useful for cursor changes and chord entry hints.\n */\nexport function useModifierKeys() {\n const [modifierHeld, setModifierHeld] = useState(false);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey) setModifierHeld(true);\n };\n const handleKeyUp = (e: KeyboardEvent) => {\n if (!e.metaKey && !e.ctrlKey) setModifierHeld(false);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n };\n }, []);\n\n return modifierHeld;\n}\n","import { Command } from './types';\nimport { Score } from '@/types';\n\nexport class UpdateTitleCommand implements Command {\n type = 'UPDATE_TITLE';\n private previousTitle: string = '';\n\n constructor(private newTitle: string) {}\n\n execute(score: Score): Score {\n this.previousTitle = score.title;\n return {\n ...score,\n title: this.newTitle,\n };\n }\n\n undo(score: Score): Score {\n return {\n ...score,\n title: this.previousTitle,\n };\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { UpdateTitleCommand } from '@/commands/UpdateTitleCommand';\n\ninterface UseTitleEditorResult {\n isEditing: boolean;\n setIsEditing: (editing: boolean) => void;\n buffer: string;\n setBuffer: (value: string) => void;\n commit: () => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\n/**\n * Manages title editing logic including focus, buffer state, and commit.\n */\nexport function useTitleEditor(\n currentTitle: string,\n dispatch: (command: any) => void\n): UseTitleEditorResult {\n const [isEditing, setIsEditing] = useState(false);\n const [buffer, setBuffer] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Focus and select when editing starts\n useEffect(() => {\n if (isEditing && inputRef.current) {\n setBuffer(currentTitle);\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing, currentTitle]);\n\n const commit = useCallback(() => {\n setIsEditing(false);\n if (buffer !== currentTitle) {\n dispatch(new UpdateTitleCommand(buffer));\n }\n }, [buffer, currentTitle, dispatch]);\n\n return { isEditing, setIsEditing, buffer, setBuffer, commit, inputRef };\n}\n","import {\n NOTE_TYPES,\n MIDDLE_LINE_Y,\n NOTE_SPACING_BASE_UNIT,\n KEY_SIGNATURES,\n LAYOUT,\n STEM,\n} from '@/constants';\nimport { CONFIG } from '@/config';\nimport { getNoteDuration } from '@/utils/core';\nimport { Note, ChordLayout, HeaderLayout } from './types';\nimport { getStaffPitch, STAFF_LETTERS } from '@/services/MusicService';\n\n// ========== HEADER LAYOUT (SSOT) ==========\n\n// Layout constants - single source of truth\nconst HEADER_LAYOUT_CONSTANTS = {\n KEY_SIG_START_X: 45,\n KEY_SIG_ACCIDENTAL_WIDTH: 10,\n KEY_SIG_PADDING: 10,\n TIME_SIG_WIDTH: 30,\n TIME_SIG_PADDING: 20,\n};\n\n/**\n * Calculates header layout positions based on key signature.\n * This is the SINGLE SOURCE OF TRUTH for header layout calculations.\n * @param keySignature - The key signature string (e.g., 'C', 'G', 'F')\n * @returns HeaderLayout object with all calculated positions\n */\nexport const calculateHeaderLayout = (keySignature: string): HeaderLayout => {\n const {\n KEY_SIG_START_X,\n KEY_SIG_ACCIDENTAL_WIDTH,\n KEY_SIG_PADDING,\n TIME_SIG_WIDTH,\n TIME_SIG_PADDING,\n } = HEADER_LAYOUT_CONSTANTS;\n\n const keySigCount = KEY_SIGNATURES[keySignature]?.count || 0;\n const keySigVisualWidth = keySigCount > 0 ? keySigCount * KEY_SIG_ACCIDENTAL_WIDTH + 10 : 0;\n const timeSigStartX = KEY_SIG_START_X + keySigVisualWidth + KEY_SIG_PADDING;\n const startOfMeasures = timeSigStartX + TIME_SIG_WIDTH + TIME_SIG_PADDING;\n\n return {\n keySigStartX: KEY_SIG_START_X,\n keySigVisualWidth,\n timeSigStartX,\n startOfMeasures,\n };\n};\n\nexport const HEADER_CONSTANTS = HEADER_LAYOUT_CONSTANTS;\n\n// ========== TREBLE CLEF PITCHES (C3 to G6) ==========\n// Offset is relative to CONFIG.baseY\nexport const PITCH_TO_OFFSET: Record<string, number> = {\n C3: 102,\n D3: 96,\n E3: 90,\n F3: 84,\n G3: 78,\n A3: 72,\n B3: 66,\n C4: 60,\n D4: 54,\n E4: 48,\n F4: 42,\n G4: 36,\n A4: 30,\n B4: 24,\n C5: 18,\n D5: 12,\n E5: 6,\n F5: 0,\n G5: -6,\n A5: -12,\n B5: -18,\n C6: -24,\n D6: -30,\n E6: -36,\n F6: -42,\n G6: -48,\n};\n\n// Inverse mapping: Y offset to pitch (for hit detection - treble)\nexport const Y_TO_PITCH: Record<number, string> = Object.fromEntries(\n Object.entries(PITCH_TO_OFFSET).map(([pitch, offset]) => [offset, pitch])\n);\n\n// ========== BASS CLEF PITCHES (E1 to B4) ==========\n// Same visual positions, different pitches (approximately 2 octaves lower)\nexport const BASS_PITCH_TO_OFFSET: Record<string, number> = {\n E1: 102,\n F1: 96,\n G1: 90,\n A1: 84,\n B1: 78,\n C2: 72,\n D2: 66,\n E2: 60,\n F2: 54,\n G2: 48,\n A2: 42,\n B2: 36,\n C3: 30,\n D3: 24,\n E3: 18,\n F3: 12,\n G3: 6,\n A3: 0,\n B3: -6,\n C4: -12,\n D4: -18,\n E4: -24,\n F4: -30,\n G4: -36,\n A4: -42,\n B4: -48,\n};\n\n// Inverse mapping: Y offset to pitch (for hit detection - bass)\nexport const BASS_Y_TO_PITCH: Record<number, string> = Object.fromEntries(\n Object.entries(BASS_PITCH_TO_OFFSET).map(([pitch, offset]) => [offset, pitch])\n);\n\n// ========== CLEF-AWARE HELPERS ==========\n/**\n * Gets the pitch-to-offset mapping for a given clef.\n */\nexport const getPitchToOffset = (clef: string = 'treble'): Record<string, number> => {\n return clef === 'bass' ? BASS_PITCH_TO_OFFSET : PITCH_TO_OFFSET;\n};\n\n/**\n * Gets the Y-to-pitch mapping for a given clef.\n */\nexport const getYToPitch = (clef: string = 'treble'): Record<number, string> => {\n return clef === 'bass' ? BASS_Y_TO_PITCH : Y_TO_PITCH;\n};\n\n/**\n * Reference points for each clef\n */\nconst CLEF_REFERENCE: Record<string, { pitch: string; offset: number }> = {\n treble: { pitch: 'C4', offset: 60 }, // Middle C on treble\n bass: { pitch: 'E2', offset: 60 }, // E2 on bass at same position\n};\n\n/**\n * Calculates the offset for ANY pitch in a given clef.\n * Uses dynamic calculation based on staff line math, not lookup tables.\n *\n * Each staff step (line/space) = 6px\n * Higher pitch = lower offset (goes up on staff)\n *\n * @param pitch - Pitch to calculate offset for (e.g., \"F#4\", \"C2\", \"G7\")\n * @param clef - Clef context ('treble' or 'bass')\n * @returns Y offset in pixels relative to CONFIG.baseY\n */\nexport const getOffsetForPitch = (\n pitch: string | null | undefined,\n clef: string = 'treble'\n): number => {\n // Handle null/undefined pitch (e.g., rest notes)\n if (!pitch) return 0;\n\n const normalizedPitch = getStaffPitch(pitch);\n\n // Try lookup first for common pitches (faster)\n const mapping = getPitchToOffset(clef);\n if (mapping[normalizedPitch] !== undefined) {\n return mapping[normalizedPitch];\n }\n\n // Dynamic calculation for any pitch\n const ref = CLEF_REFERENCE[clef] || CLEF_REFERENCE.treble;\n\n // Parse pitch letter and octave\n const match = normalizedPitch.match(/^([A-G])(\\d+)$/);\n if (!match) return 0;\n\n const [, letter, octStr] = match;\n const octave = parseInt(octStr, 10);\n\n // Parse reference pitch\n const refMatch = ref.pitch.match(/^([A-G])(\\d+)$/);\n if (!refMatch) return ref.offset;\n\n const [, refLetter, refOctStr] = refMatch;\n const refOctave = parseInt(refOctStr, 10);\n\n // Calculate steps from reference\n const letterIdx = STAFF_LETTERS.indexOf(letter);\n const refLetterIdx = STAFF_LETTERS.indexOf(refLetter);\n\n // Steps = (octave difference * 7) + letter difference\n const stepsFromRef = (octave - refOctave) * 7 + (letterIdx - refLetterIdx);\n\n // Each step up = 6px lower offset (going up on staff)\n return ref.offset - stepsFromRef * 6;\n};\n\n/**\n * Gets the pitch for a Y offset in a given clef.\n */\nexport const getPitchForOffset = (offset: number, clef: string = 'treble'): string | undefined => {\n const mapping = getYToPitch(clef);\n return mapping[offset];\n};\n\n/**\n * Calculates the visual width of a note based on its duration.\n * Spacing is proportional to the square root of quants to balance density.\n * Includes minimum widths for short notes and dot padding.\n * @param duration - The duration type (e.g., 'quarter', 'eighth')\n * @param dotted - Whether the note is dotted\n * @returns The calculated width in pixels\n */\nexport const getNoteWidth = (duration: string, dotted: boolean): number => {\n const quants = getNoteDuration(duration, dotted, undefined);\n const baseWidth = NOTE_SPACING_BASE_UNIT * Math.sqrt(quants);\n\n // Use multipliers relative to the base unit for responsiveness\n const MIN_WIDTH_FACTORS: Record<string, number> = {\n sixtyfourth: 1.2,\n thirtysecond: 1.5,\n sixteenth: 1.8,\n eighth: 2.2,\n };\n\n const minWidth = (MIN_WIDTH_FACTORS[duration] || 0) * NOTE_SPACING_BASE_UNIT;\n\n // Calculate base width (greater of rhythm-based or visual minimum)\n let width = Math.max(baseWidth, minWidth);\n\n // Add space for the dot if dotted (dots appear to the right of notehead)\n if (dotted) {\n width += NOTE_SPACING_BASE_UNIT * 0.5; // Dot width factor\n }\n\n return width;\n};\n\n/**\n * Calculates layout details for a chord (group of notes at the same time).\n * Determines stem direction, note offsets for clusters, and vertical bounds.\n * All calculations use CONFIG.baseY - staff positioning is handled by SVG transforms.\n * @param notes - Array of notes in the chord\n * @param clef - The current clef ('treble' or 'bass')\n * @param forcedDirection - Optional direction to force ('up' or 'down')\n * @returns Object containing sortedNotes, direction, noteOffsets, maxNoteShift, minY, maxY\n */\nexport const calculateChordLayout = (\n notes: Note[],\n clef: string = 'treble',\n forcedDirection?: 'up' | 'down'\n): ChordLayout => {\n // Filter out rest notes (null pitch) since they don't have visual positions\n const realNotes = notes.filter((n) => n.pitch !== null);\n\n if (!realNotes || realNotes.length === 0) {\n return {\n sortedNotes: [],\n direction: forcedDirection || 'up',\n noteOffsets: {},\n maxNoteShift: 0,\n minNoteShift: 0,\n minY: 0,\n maxY: 0,\n };\n }\n\n const sortedNotes = [...realNotes].sort((a, b) => {\n const yA = getOffsetForPitch(a.pitch!, clef);\n const yB = getOffsetForPitch(b.pitch!, clef);\n return yA - yB;\n });\n\n let furthestNote = sortedNotes[0];\n let maxDist = -1;\n let minY = Infinity;\n let maxY = -Infinity;\n\n sortedNotes.forEach((n) => {\n const y = CONFIG.baseY + getOffsetForPitch(n.pitch!, clef);\n const dist = Math.abs(y - MIDDLE_LINE_Y);\n if (dist > maxDist) {\n maxDist = dist;\n furthestNote = n;\n }\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n });\n\n const furthestY = CONFIG.baseY + getOffsetForPitch(furthestNote.pitch!, clef);\n\n // Use forced direction if provided, otherwise calculate based on furthest note\n const direction = forcedDirection || (furthestY <= MIDDLE_LINE_Y ? 'down' : 'up');\n\n const noteOffsets: Record<string, number> = {};\n\n // Second interval displacement depends on stem direction\n // Up-stem: noteheads on LEFT, upper note of second shifts RIGHT (+11)\n // Down-stem: noteheads on RIGHT, lower note of second shifts LEFT (-11)\n\n if (direction === 'up') {\n for (let i = sortedNotes.length - 1; i > 0; i--) {\n const noteLower = sortedNotes[i]; // Higher Y = lower pitch\n const noteUpper = sortedNotes[i - 1]; // Lower Y = higher pitch\n const yLower = getOffsetForPitch(noteLower.pitch!, clef);\n const yUpper = getOffsetForPitch(noteUpper.pitch!, clef);\n if (Math.abs(yLower - yUpper) === 6) {\n if (!noteOffsets[noteLower.id]) {\n noteOffsets[noteUpper.id] = LAYOUT.SECOND_INTERVAL_SHIFT; // Upper note shifts RIGHT\n }\n }\n }\n } else {\n for (let i = 0; i < sortedNotes.length - 1; i++) {\n const noteUpper = sortedNotes[i];\n const noteLower = sortedNotes[i + 1];\n const yUpper = getOffsetForPitch(noteUpper.pitch!, clef);\n const yLower = getOffsetForPitch(noteLower.pitch!, clef);\n if (Math.abs(yLower - yUpper) === 6) {\n if (!noteOffsets[noteUpper.id]) {\n noteOffsets[noteLower.id] = -LAYOUT.SECOND_INTERVAL_SHIFT; // Lower note shifts LEFT\n }\n }\n }\n }\n\n // Track both positive (right shift) and negative (left shift) offsets\n const offsets = Object.values(noteOffsets);\n const maxNoteShift = offsets.length > 0 ? Math.max(0, ...offsets) : 0;\n const minNoteShift = offsets.length > 0 ? Math.min(0, ...offsets) : 0;\n\n return { sortedNotes, direction, noteOffsets, maxNoteShift, minNoteShift, minY, maxY };\n};\n\n/**\n * Calculates the stem X offset for a chord based on its layout and direction.\n * This is the single source of truth for stem positioning logic.\n *\n * Rules:\n * - Up-stem seconds (maxNoteShift > 0): stem at +6 (between notes at 0 and +11)\n * - Down-stem seconds (any offset < 0): stem at -6 (between notes at -11 and 0)\n * - Regular up-stem: stem on right at +6\n * - Regular down-stem: stem on left at -6\n *\n * @param chordLayout - The ChordLayout object from calculateChordLayout\n * @param direction - The stem direction ('up' or 'down')\n * @returns The X offset for the stem relative to noteX\n */\nexport const getStemOffset = (chordLayout: ChordLayout, direction: 'up' | 'down'): number => {\n const hasUpSecond = chordLayout.maxNoteShift > 0;\n const hasDownSecond = Object.values(chordLayout.noteOffsets).some((v) => v < 0);\n\n if (hasUpSecond) return STEM.OFFSET_X;\n if (hasDownSecond) return -STEM.OFFSET_X;\n return direction === 'up' ? STEM.OFFSET_X : -STEM.OFFSET_X;\n};\n","/**\n * Constants and helpers for calculating stem geometry.\n */\n\nimport { STEM } from '@/constants';\n\n// Re-export for backwards compatibility\nexport const STEM_LENGTHS = STEM.LENGTHS;\nexport const STEM_BEAMED_LENGTHS = STEM.BEAMED_LENGTHS;\n\n/**\n * Calculates stem geometry based on beam specifications or default layout.\n * @param {Object} params - Calculation parameters\n * @param {Object} params.beamSpec - Beaming specification (if part of a beam)\n * @param {number} params.stemX - X coordinate of the stem\n * @param {string} params.direction - Stem direction ('up' | 'down')\n * @param {number} params.minY - Highest pitch Y-coordinate (visually lowest)\n * @param {number} params.maxY - Lowest pitch Y-coordinate (visually highest)\n * @param {string} params.duration - Note duration type\n * @returns {{startY: number, endY: number}} Start and end Y coordinates for the stem\n */\nexport const calculateStemGeometry = ({\n beamSpec,\n stemX,\n direction,\n minY,\n maxY,\n duration,\n}: {\n beamSpec?: { startY: number; endY: number; startX: number; endX: number };\n stemX: number;\n direction: 'up' | 'down';\n minY: number;\n maxY: number;\n duration: string;\n}) => {\n if (beamSpec) {\n // y = m*x + b derivation\n const m = (beamSpec.endY - beamSpec.startY) / (beamSpec.endX - beamSpec.startX);\n const stemEndY = beamSpec.startY + m * (stemX - beamSpec.startX);\n const stemStartY = direction === 'up' ? maxY : minY;\n return { startY: stemStartY, endY: stemEndY };\n }\n\n // Standard Stem Logic\n const length = STEM_LENGTHS[duration] || STEM_LENGTHS.default;\n if (direction === 'up') {\n // Up-stem: starts at note (maxY), extends upward\n return { startY: maxY, endY: minY - length };\n }\n // Down-stem: starts at note (minY), extends downward\n return { startY: minY, endY: maxY + length };\n};\n","import { ScoreEvent, BeamGroup } from './types';\nimport { getNoteDuration } from '@/utils/core';\nimport {\n getOffsetForPitch,\n getNoteWidth,\n getPitchForOffset,\n calculateChordLayout,\n getStemOffset,\n} from './positioning';\nimport { CONFIG } from '@/config';\nimport { MIDDLE_LINE_Y, BEAMING } from '@/constants';\n\n// Removed temporary interfaces\n\n/**\n * Groups events into beaming groups based on musical rules (beats, syncopation).\n * All calculations use CONFIG.baseY - staff positioning is handled by SVG transforms.\n * @param events - List of events in the measure\n * @param eventPositions - Map of event IDs to their x-positions\n * @param clef - The clef for pitch offset lookup\n * @returns Array of beam group specifications\n */\nexport const calculateBeamingGroups = (\n events: any[],\n eventPositions: Record<string, number>,\n clef: string = 'treble'\n): any[] => {\n const groups: any[] = [];\n let currentGroup: any[] = [];\n let currentType: string | null = null;\n\n // Helper to finalize a group\n const finalizeGroup = () => {\n if (currentGroup.length > 1) {\n groups.push(processBeamGroup(currentGroup, eventPositions, clef));\n }\n currentGroup = [];\n currentType = null;\n };\n\n let currentQuant = 0;\n\n events.forEach((event: any, index: number) => {\n const type = event.duration;\n const isFlagged = ['eighth', 'sixteenth', 'thirtysecond', 'sixtyfourth'].includes(type);\n const durationQuants = getNoteDuration(type, event.dotted, event.tuplet);\n\n // Break beam if:\n // 1. Not a flagged note\n // 2. Dotted note (simplify for now - standard beaming breaks on dots usually unless configured)\n // 3. Type changes (e.g. 8th to 16th - simple engines often break here, complex ones don't)\n // 4. Rest\n\n if (!isFlagged || event.isRest) {\n finalizeGroup();\n currentQuant += durationQuants;\n return;\n }\n\n if (currentType && currentType !== type) {\n finalizeGroup();\n }\n\n // Check beat boundaries (simple 4/4 assumption: beat every 1024 quants)\n // If currentQuant is a multiple of beat size, we might break?\n // Actually, we break if we CROSS a beat boundary.\n // But for Quarter beats (1024), we usually beam 8ths together within the beat.\n // We shouldn't beam across beat 2-3 in 4/4 usually.\n // Let's implement a simple rule: Break beam if on a beat boundary?\n // No, we start a new beam at the boundary.\n const BEAT_QUANTS = CONFIG.quantsPerMeasure / 4; // Assuming 4/4\n if (currentQuant % BEAT_QUANTS === 0 && currentGroup.length > 0) {\n finalizeGroup();\n }\n\n currentGroup.push(event);\n currentType = type;\n currentQuant += durationQuants;\n });\n\n finalizeGroup();\n return groups;\n};\n\nimport { STEM_LENGTHS, STEM_BEAMED_LENGTHS } from './stems';\n\n/**\n * Calculates the geometry for a single beam group.\n * Implements proper beam sloping based on pitch contour.\n */\nconst processBeamGroup = (\n groupEvents: any[],\n eventPositions: Record<string, number>,\n clef: string\n): any => {\n const startEvent = groupEvents[0];\n const endEvent = groupEvents[groupEvents.length - 1];\n\n // Determine minimum stem length based on the note type with the most beams in the group\n // 32nd notes need longer stems to accommodate 3 beams, 64th for 4 beams\n let minStemLength = STEM_BEAMED_LENGTHS.default;\n\n // Check if group contains shorter durations that require more beam space\n const uniqueDurations = new Set(groupEvents.map((e) => e.duration));\n if (uniqueDurations.has('sixtyfourth')) {\n minStemLength = STEM_BEAMED_LENGTHS.sixtyfourth;\n } else if (uniqueDurations.has('thirtysecond')) {\n minStemLength = STEM_BEAMED_LENGTHS.thirtysecond;\n }\n\n // First pass: collect note data to determine direction\n const noteData = groupEvents.map((e) => {\n const noteX = eventPositions[e.id];\n const noteYs = e.notes.map((n: any) => CONFIG.baseY + getOffsetForPitch(n.pitch, clef));\n\n // Check if this chord has a second interval\n const chordLayout = calculateChordLayout(e.notes, clef);\n const hasSecond = Object.values(chordLayout.noteOffsets).some((v) => v !== 0);\n\n return {\n noteX,\n minY: Math.min(...noteYs),\n maxY: Math.max(...noteYs),\n avgY: noteYs.reduce((sum: number, y: number) => sum + y, 0) / noteYs.length,\n hasSecond,\n };\n });\n\n // Determine stem direction based on average position relative to middle line\n const avgY = noteData.reduce((sum: number, d) => sum + d.avgY, 0) / noteData.length;\n const direction = avgY <= MIDDLE_LINE_Y ? 'down' : 'up';\n\n // Get chord layouts for first and last events\n const startChordLayout = calculateChordLayout(groupEvents[0].notes, clef);\n const endChordLayout = calculateChordLayout(groupEvents[groupEvents.length - 1].notes, clef);\n\n // Use shared getStemOffset function for consistent stem positioning\n const startStemOffset = getStemOffset(startChordLayout, direction);\n const endStemOffset = getStemOffset(endChordLayout, direction);\n\n // Apply stem offset to get actual stem X positions\n // Extend beam by BEAMING.EXTENSION_PX on each side for better visual appearance\n const startX = noteData[0].noteX + startStemOffset - BEAMING.EXTENSION_PX;\n const endX = noteData[noteData.length - 1].noteX + endStemOffset + BEAMING.EXTENSION_PX;\n\n // Update noteData with stem X positions for clearance calculations\n noteData.forEach((d, i) => {\n const layout = calculateChordLayout(groupEvents[i].notes, clef);\n (d as any).eventX = d.noteX + getStemOffset(layout, direction);\n });\n\n // Find the extreme notes (the ones that determine beam position)\n let highestNoteY = Infinity; // Lowest Y value (highest on staff)\n let lowestNoteY = -Infinity; // Highest Y value (lowest on staff)\n\n noteData.forEach((d) => {\n highestNoteY = Math.min(highestNoteY, d.minY);\n lowestNoteY = Math.max(lowestNoteY, d.maxY);\n });\n\n // Calculate beam endpoints based on direction\n // For upward stems: beam connects above the highest (topmost) notes\n // For downward stems: beam connects below the lowest (bottommost) notes\n let startBeamY: number, endBeamY: number;\n\n if (direction === 'up') {\n // Beams above notes - use the highest note positions at start and end\n const startNoteY = noteData[0].minY;\n const endNoteY = noteData[noteData.length - 1].minY;\n\n startBeamY = startNoteY - minStemLength;\n endBeamY = endNoteY - minStemLength;\n } else {\n // Beams below notes - use the lowest note positions at start and end\n const startNoteY = noteData[0].maxY;\n const endNoteY = noteData[noteData.length - 1].maxY;\n\n startBeamY = startNoteY + minStemLength;\n endBeamY = endNoteY + minStemLength;\n }\n\n // Limit beam slope to maximum angle for readability\n const rawSlope = (endBeamY - startBeamY) / (endX - startX);\n\n if (Math.abs(rawSlope) > BEAMING.MAX_SLOPE) {\n // Clamp the slope and recalculate beam endpoints\n const clampedSlope = Math.sign(rawSlope) * BEAMING.MAX_SLOPE;\n const deltaX = endX - startX;\n const deltaY = clampedSlope * deltaX;\n\n // Adjust endBeamY to match the clamped slope\n endBeamY = startBeamY + deltaY;\n }\n\n // Now verify that ALL notes in the group have adequate stem length\n // Calculate beam line: y = mx + b\n const slope = (endBeamY - startBeamY) / (endX - startX);\n const intercept = startBeamY - slope * startX;\n\n // Find the maximum additional clearance needed\n let maxAdditionalClearance = 0;\n\n noteData.forEach((d) => {\n const beamYAtPoint = slope * (d as any).eventX + intercept;\n const anchorNoteY = direction === 'up' ? d.minY : d.maxY;\n const currentStemLength = Math.abs(beamYAtPoint - anchorNoteY);\n\n if (currentStemLength < minStemLength) {\n const needed = minStemLength - currentStemLength;\n maxAdditionalClearance = Math.max(maxAdditionalClearance, needed);\n }\n });\n\n // Apply additional clearance if needed (shift beam away from notes)\n if (maxAdditionalClearance > 0) {\n if (direction === 'up') {\n startBeamY -= maxAdditionalClearance;\n endBeamY -= maxAdditionalClearance;\n } else {\n startBeamY += maxAdditionalClearance;\n endBeamY += maxAdditionalClearance;\n }\n }\n\n return {\n ids: groupEvents.map((e) => e.id),\n startX,\n endX,\n startY: startBeamY,\n endY: endBeamY,\n direction,\n type: startEvent.duration,\n };\n};\n","import { ScoreEvent, TupletBracketGroup } from './types';\nimport { getNoteDuration } from '@/utils/core';\nimport { getOffsetForPitch } from './positioning';\nimport { CONFIG } from '@/config';\nimport { MIDDLE_LINE_Y, TUPLET, STEM } from '@/constants';\n\n/**\n * Helper to determine the events belonging to a tuplet group starting at a given index.\n * Uses ID-based grouping (priority) or falls back to legacy logic.\n */\nexport const getTupletGroup = (events: ScoreEvent[], startIndex: number): ScoreEvent[] => {\n const startEvent = events[startIndex];\n if (!startEvent.tuplet) return [];\n\n const groupEvents: ScoreEvent[] = [];\n const { groupSize, ratio } = startEvent.tuplet;\n\n // Priority 1: ID-based grouping (Robust)\n if (startEvent.tuplet.id) {\n const targetId = startEvent.tuplet.id;\n for (let j = 0; startIndex + j < events.length; j++) {\n const e = events[startIndex + j];\n if (e.tuplet && e.tuplet.id === targetId) {\n groupEvents.push(e);\n } else {\n break; // Stop if ID mismatch or no tuplet\n }\n }\n }\n // Priority 2: BaseDuration-based grouping (Dynamic)\n else if (startEvent.tuplet.baseDuration) {\n const { ratio, baseDuration } = startEvent.tuplet;\n const baseQuants = getNoteDuration(baseDuration, false);\n const targetQuants = ratio[0] * baseQuants;\n\n let currentQuants = 0;\n\n for (let j = 0; startIndex + j < events.length; j++) {\n const e = events[startIndex + j];\n const eventQuants = getNoteDuration(e.duration, e.dotted, undefined);\n currentQuants += eventQuants;\n groupEvents.push(e);\n\n if (currentQuants >= targetQuants) {\n break;\n }\n }\n }\n // Priority 3: GroupSize-based grouping (Legacy)\n else {\n for (let j = 0; j < groupSize && startIndex + j < events.length; j++) {\n groupEvents.push(events[startIndex + j]);\n }\n }\n\n return groupEvents;\n};\n\nexport const calculateTupletBrackets = (\n events: ScoreEvent[],\n eventPositions: Record<string, number>,\n clef: string = 'treble'\n): TupletBracketGroup[] => {\n const brackets: TupletBracketGroup[] = [];\n\n // Helper to get Y bounds of an event (top and bottom of everything: notes, stems)\n const getEventYBounds = (event: ScoreEvent, dir: 'up' | 'down') => {\n // 1. Noteheads - filter out rest notes (null pitch)\n const realNotes = event.notes.filter((n) => n.pitch !== null);\n if (realNotes.length === 0) {\n // Rest event - use staff middle line as default\n const middleY = CONFIG.baseY + CONFIG.lineHeight * 2;\n return { topY: middleY, bottomY: middleY };\n }\n const noteYs = realNotes.map((n) => CONFIG.baseY + getOffsetForPitch(n.pitch!, clef));\n const minNoteY = Math.min(...noteYs);\n const maxNoteY = Math.max(...noteYs);\n\n // 2. Stems\n // We need to know stem direction and length to know where the stem tip is.\n // We can approximate or re-calculate.\n // If we have chordLayout, use it.\n const chordDir = event.chordLayout?.direction || 'down'; // Default down?\n\n // Standard stem length from centralized config\n const stemLen = STEM.LENGTHS.default;\n\n let topY = minNoteY;\n let bottomY = maxNoteY;\n\n if (chordDir === 'up') {\n // Stem goes up from highest note (minY)\n // Actually stem goes up from the note on the right?\n // For single stem, it goes up from the notehead.\n // Stem tip Y = minNoteY - stemLen\n topY = Math.min(topY, minNoteY - stemLen);\n } else {\n // Stem goes down from lowest note (maxY)\n // Stem tip Y = maxNoteY + stemLen\n bottomY = Math.max(bottomY, maxNoteY + stemLen);\n }\n\n return { topY, bottomY };\n };\n\n const processedIndices = new Set<number>();\n\n for (let i = 0; i < events.length; i++) {\n if (processedIndices.has(i)) continue;\n\n const event = events[i];\n if (event.tuplet && event.tuplet.position === 0) {\n const groupEvents = getTupletGroup(events, i);\n\n // Mark indices as processed to avoid duplicates if we iterate differently later\n // (Though here we just iterate linearly, but good practice)\n // Actually, calculateTupletBrackets iterates all events.\n // We only care about position === 0.\n\n if (groupEvents.length === 0) continue;\n\n // 1. Determine Direction\n // Rule: Place on stem side.\n // If majority stems up -> Bracket Up (above).\n // If majority stems down -> Bracket Down (below).\n let upCount = 0;\n let downCount = 0;\n groupEvents.forEach((e) => {\n if (e.chordLayout?.direction === 'up') upCount++;\n else downCount++;\n });\n\n const direction = upCount >= downCount ? 'up' : 'down';\n\n // 2. Calculate Slope and Position\n // We want to draw a line from start to end that clears all \"obstacles\" on that side.\n // Calculate slope based on first and last note\n // Note: startX/endX are centers of note heads.\n // We want the bracket to extend to the outer edges of the note heads.\n\n // Calculate bounds based on ALL events in the group to ensure we cover everything\n // (handles potential unsorted events or layout anomalies)\n const xValues = groupEvents.map((e) => eventPositions[e.id] || 0);\n const minX = Math.min(...xValues);\n const maxX = Math.max(...xValues);\n\n // Increase radius slightly to ensure it visually covers the note head fully\n const startX = minX - TUPLET.VISUAL_NOTE_RADIUS;\n const endX = maxX + TUPLET.VISUAL_NOTE_RADIUS;\n\n // Calculate Y bounds (top and bottom of the group)\n const yBounds = groupEvents.map((e) => getEventYBounds(e, direction));\n const topY = Math.min(...yBounds.map((b) => b.topY));\n const bottomY = Math.max(...yBounds.map((b) => b.bottomY));\n\n // Calculate \"Limit Y\" for each event on the bracket side\n // If Up: Limit is topY (lowest value). We want bracket Y < topY.\n // If Down: Limit is bottomY (highest value). We want bracket Y > bottomY.\n\n const limits = groupEvents.map((e) => {\n const bounds = getEventYBounds(e, direction);\n return {\n x: eventPositions[e.id],\n y: direction === 'up' ? bounds.topY : bounds.bottomY,\n };\n });\n\n // Initial guess: Line between first and last limit\n // Add some padding\n let y1 = limits[0].y + (direction === 'up' ? -TUPLET.PADDING : TUPLET.PADDING);\n let y2 =\n limits[limits.length - 1].y + (direction === 'up' ? -TUPLET.PADDING : TUPLET.PADDING);\n\n // Calculate slope m\n let m = (y2 - y1) / (endX - startX);\n\n // Limit slope (max angle from constant)\n if (Math.abs(m) > TUPLET.MAX_SLOPE) {\n m = m > 0 ? TUPLET.MAX_SLOPE : -TUPLET.MAX_SLOPE;\n // Recenter\n const midX = (startX + endX) / 2;\n const midY = (y1 + y2) / 2;\n y1 = midY - m * (midX - startX);\n y2 = midY + m * (endX - midX);\n }\n\n // 3. Collision Detection & Shift\n let maxShift = 0;\n\n limits.forEach((limit) => {\n const targetY = y1 + m * (limit.x - startX);\n\n if (direction === 'up') {\n // We want targetY < limit.y (visually above)\n // If targetY > limit.y - PADDING, we are too low.\n // Shift needed: (limit.y - PADDING) - targetY\n // We want to subtract from Y (move up).\n // Let's define shift as positive = move AWAY (Up for up, Down for down)\n\n // Distance from limit to line (positive if line is below limit)\n const dist = targetY - (limit.y - TUPLET.PADDING);\n if (dist > 0) {\n maxShift = Math.max(maxShift, dist);\n }\n } else {\n // We want targetY > limit.y (visually below)\n // If targetY < limit.y + PADDING, we are too high.\n // Shift needed: (limit.y + PADDING) - targetY\n\n const dist = limit.y + TUPLET.PADDING - targetY;\n if (dist > 0) {\n maxShift = Math.max(maxShift, dist);\n }\n }\n });\n\n // Apply shift\n if (direction === 'up') {\n y1 -= maxShift;\n y2 -= maxShift;\n } else {\n y1 += maxShift;\n y2 += maxShift;\n }\n\n brackets.push({\n startX,\n endX,\n startY: y1,\n endY: y2,\n direction,\n number: event.tuplet.ratio[0],\n });\n }\n }\n\n return brackets;\n};\n","/**\n * Measure Layout Engine\n *\n * Calculates the horizontal layout of events within a single measure.\n * Handles event positioning, hit zone generation for interaction,\n * and special cases like tuplets and empty measures.\n */\n\nimport { CONFIG } from '@/config';\nimport { getNoteDuration } from '@/utils/core';\nimport { MIDDLE_LINE_Y, NOTE_SPACING_BASE_UNIT, WHOLE_REST_WIDTH, LAYOUT } from '@/constants';\nimport { ScoreEvent, MeasureLayout, HitZone, Note, ChordLayout } from './types';\nimport { getNoteWidth, calculateChordLayout, getOffsetForPitch } from './positioning';\nimport { getTupletGroup } from './tuplets';\n\n// --- CONSTANTS (from centralized LAYOUT) ---\n\n/** Hit zone radius around each note for click detection (pixels) */\nconst HIT_RADIUS = LAYOUT.HIT_ZONE_RADIUS;\n\n/** Padding added before noteheads when accidentals are present */\nconst ACCIDENTAL_PADDING = NOTE_SPACING_BASE_UNIT * 0.8;\n\n/** Minimum width factors for short-duration notes relative to NOTE_SPACING_BASE_UNIT */\nconst MIN_WIDTH_FACTORS = LAYOUT.MIN_WIDTH_FACTORS;\n\n// --- TYPES ---\n\n/** Result from processing an event (regular or tuplet) */\ninterface EventProcessResult {\n processedEvents: ScoreEvent[];\n hitZones: HitZone[];\n eventPositions: Record<string, number>;\n widthConsumed: number;\n quantsConsumed: number;\n}\n\n/** Context passed to event processors */\ninterface ProcessingContext {\n currentX: number;\n currentQuant: number;\n clef: string;\n forcedEventPositions?: Record<number, number>;\n}\n\n// --- HELPER: Hit Zone Management ---\n\n/**\n * Adds a hit zone to the collection while maintaining continuity.\n * Automatically adjusts the previous zone's endX to prevent overlaps/gaps.\n *\n * @param zones - The array of existing hit zones (mutated)\n * @param newZone - The new hit zone to add\n */\nconst addHitZone = (zones: HitZone[], newZone: HitZone): void => {\n if (zones.length > 0) {\n const prevZone = zones[zones.length - 1];\n prevZone.endX = Math.min(prevZone.endX, newZone.startX);\n }\n zones.push(newZone);\n};\n\n/**\n * Creates hit zones for an event at a given position.\n * Generates both an EVENT zone (for clicking on the note) and optionally\n * an INSERT zone (for adding notes after this event).\n *\n * @param noteheadX - X position of the notehead\n * @param eventIndex - Index of this event in the measure's event array\n * @param eventId - Unique identifier for the event\n * @param minOffset - Leftmost offset from notehead (negative for down-stem seconds)\n * @param maxOffset - Rightmost offset from notehead (positive for up-stem seconds)\n * @param totalWidth - Total visual width consumed by this event\n * @returns Array of HitZone objects for this event\n */\nconst createEventHitZones = (\n noteheadX: number,\n eventIndex: number,\n eventId: string | number,\n minOffset: number,\n maxOffset: number,\n totalWidth: number\n): HitZone[] => {\n const zones: HitZone[] = [];\n\n // Zone 1: Event hit area\n const adjustedStartX = Math.max(0, noteheadX - HIT_RADIUS + minOffset);\n const adjustedEndX = noteheadX + HIT_RADIUS + maxOffset;\n\n zones.push({\n startX: adjustedStartX,\n endX: adjustedEndX,\n index: eventIndex,\n type: 'EVENT',\n eventId,\n });\n\n // Zone 2: Insert hit area (space after note)\n if (totalWidth > adjustedEndX - noteheadX + HIT_RADIUS) {\n zones.push({\n startX: adjustedEndX,\n endX: noteheadX + totalWidth,\n index: eventIndex + 1,\n type: 'INSERT',\n });\n }\n\n return zones;\n};\n\n// --- HELPER: Event Metrics ---\n\n/**\n * Calculates visual metrics for a single event.\n * Consolidates width calculation, accidental spacing, and chord note offsets\n * into a single analysis pass.\n *\n * @param event - The score event to analyze\n * @param clef - Current clef ('treble' or 'bass')\n * @returns Object containing chordLayout, totalWidth, accidentalSpace, offsets, and baseWidth\n */\nconst getEventMetrics = (event: ScoreEvent, clef: string) => {\n const chordLayout = calculateChordLayout(event.notes, clef);\n const hasAccidental = event.notes.some((n: Note) => n.accidental);\n const accidentalSpace = hasAccidental ? ACCIDENTAL_PADDING : 0;\n\n const baseWidth = getNoteWidth(event.duration, event.dotted);\n\n const offsets = Object.values(chordLayout.noteOffsets);\n const hasSecond = offsets.some((v) => v !== 0);\n const secondSpace = hasSecond ? LAYOUT.SECOND_INTERVAL_SPACE : 0;\n const secondAccidentalSpace = hasSecond && hasAccidental ? ACCIDENTAL_PADDING * 0.5 : 0;\n\n const totalWidth = accidentalSpace + baseWidth + secondSpace + secondAccidentalSpace;\n\n const minOffset = offsets.length > 0 ? Math.min(0, ...offsets) : 0;\n const maxOffset = offsets.length > 0 ? Math.max(0, ...offsets) : 0;\n\n return { chordLayout, totalWidth, accidentalSpace, minOffset, maxOffset, baseWidth };\n};\n\n/**\n * Post-processes the events to apply special centering rules.\n */\nexport const applyMeasureCentering = (events: ScoreEvent[], measureWidth: number): ScoreEvent[] => {\n if (events.length === 1 && events[0].id === 'rest-placeholder') {\n const rest = events[0];\n const targetVisualCenter = measureWidth / 2;\n const x = targetVisualCenter - WHOLE_REST_WIDTH / 2;\n\n return [{ ...rest, x }];\n }\n\n return events;\n};\n\n// --- EXTRACTED: Empty Measure Handler ---\n\n/**\n * Creates the layout for an empty measure.\n * Generates a centered whole rest placeholder with appropriate hit zones.\n *\n * @returns Complete MeasureLayout for an empty measure\n */\nconst createEmptyMeasureLayout = (): MeasureLayout => {\n const width = getNoteWidth('whole', false);\n const x = CONFIG.measurePaddingLeft;\n\n const emptyChordLayout: ChordLayout = {\n sortedNotes: [],\n direction: 'up',\n noteOffsets: {},\n maxNoteShift: 0,\n minY: 0,\n maxY: 0,\n };\n\n const totalWidth = Math.max(\n x + width,\n width + CONFIG.measurePaddingLeft + CONFIG.measurePaddingRight\n );\n\n const processedEvents: ScoreEvent[] = [\n {\n id: 'rest-placeholder',\n duration: 'whole',\n dotted: false,\n notes: [],\n isRest: true,\n x,\n quant: 0,\n chordLayout: emptyChordLayout,\n },\n ];\n\n return {\n hitZones: [{ startX: CONFIG.measurePaddingLeft, endX: x + width, index: 0, type: 'APPEND' }],\n eventPositions: {},\n totalWidth,\n processedEvents: applyMeasureCentering(processedEvents, totalWidth),\n };\n};\n\n// --- EXTRACTED: Regular Event Processor ---\n\n/**\n * Processes a single regular (non-tuplet) event.\n * Calculates position, generates hit zones, and returns processing result.\n *\n * @param event - The event to process\n * @param eventIndex - Index in the measure's event array\n * @param ctx - Processing context with current position and clef\n * @returns EventProcessResult with processed event, hit zones, and consumed dimensions\n */\nconst processRegularEvent = (\n event: ScoreEvent,\n eventIndex: number,\n ctx: ProcessingContext\n): EventProcessResult => {\n const metrics = getEventMetrics(event, ctx.clef);\n\n // Apply sync override if provided\n let baseX = ctx.currentX;\n if (ctx.forcedEventPositions?.[ctx.currentQuant] !== undefined) {\n baseX = ctx.forcedEventPositions[ctx.currentQuant];\n }\n\n // Compensate for negative offsets (down-stem seconds)\n const negativeCompensation = Math.abs(metrics.minOffset);\n const noteheadX = baseX + metrics.accidentalSpace + negativeCompensation;\n\n const processedEvent: ScoreEvent = {\n ...event,\n x: noteheadX,\n quant: ctx.currentQuant,\n chordLayout: metrics.chordLayout,\n };\n\n const hitZones = createEventHitZones(\n noteheadX,\n eventIndex,\n event.id,\n metrics.minOffset,\n metrics.maxOffset,\n metrics.totalWidth\n );\n\n return {\n processedEvents: [processedEvent],\n hitZones,\n eventPositions: { [event.id]: noteheadX },\n widthConsumed: metrics.totalWidth + negativeCompensation,\n quantsConsumed: getNoteDuration(event.duration, event.dotted, event.tuplet),\n };\n};\n\n// --- EXTRACTED: Tuplet Group Processor ---\n\n/**\n * Determines the unified stem direction for a tuplet group.\n * Finds the note farthest from the middle line and uses that to decide\n * whether all stems should point up or down.\n *\n * @param tupletGroup - Array of events in the tuplet\n * @param clef - Current clef for pitch-to-Y conversion\n * @returns 'up' or 'down' direction for all stems in the group\n */\nconst getTupletUnifiedDirection = (tupletGroup: ScoreEvent[], clef: string): 'up' | 'down' => {\n let maxDist = -1;\n let direction: 'up' | 'down' = 'down';\n\n tupletGroup.forEach((te) => {\n te.notes.forEach((n: Note) => {\n // Skip rest notes (null pitch)\n if (n.pitch === null) return;\n const y = CONFIG.baseY + getOffsetForPitch(n.pitch, clef);\n const dist = Math.abs(y - MIDDLE_LINE_Y);\n if (dist > maxDist) {\n maxDist = dist;\n direction = y <= MIDDLE_LINE_Y ? 'down' : 'up';\n }\n });\n });\n\n return direction;\n};\n\n/**\n * Processes a tuplet group starting at the given index.\n * Handles compressed widths, unified stem direction, and generates\n * hit zones for all events in the group.\n *\n * @param events - All events in the measure\n * @param startIndex - Index of the first event in the tuplet group\n * @param ctx - Processing context with current position and clef\n * @returns EventProcessResult with all tuplet events processed\n */\nconst processTupletGroup = (\n events: ScoreEvent[],\n startIndex: number,\n ctx: ProcessingContext\n): EventProcessResult => {\n const tupletGroup = getTupletGroup(events, startIndex);\n const startEvent = events[startIndex];\n const { ratio } = startEvent.tuplet!;\n\n const unifiedDirection = getTupletUnifiedDirection(tupletGroup, ctx.clef);\n\n const processedEvents: ScoreEvent[] = [];\n const hitZones: HitZone[] = [];\n const eventPositions: Record<string, number> = {};\n\n let x = ctx.currentX;\n let quant = ctx.currentQuant;\n\n // Apply sync override if provided\n if (ctx.forcedEventPositions?.[quant] !== undefined) {\n x = ctx.forcedEventPositions[quant];\n }\n\n tupletGroup.forEach((tupletEvent) => {\n const evtIndex = events.indexOf(tupletEvent);\n\n // Calculate compressed width for tuplet\n const originalWidth = getNoteWidth(tupletEvent.duration, tupletEvent.dotted);\n const tupletWidth = originalWidth * Math.sqrt(ratio[1] / ratio[0]);\n\n // Recalculate chord layout with unified direction\n const chordLayout = calculateChordLayout(tupletEvent.notes, ctx.clef, unifiedDirection);\n const minOffset = Math.min(0, ...Object.values(chordLayout.noteOffsets), 0);\n const maxOffset = Math.max(0, ...Object.values(chordLayout.noteOffsets), 0);\n\n eventPositions[tupletEvent.id] = x;\n\n processedEvents.push({\n ...tupletEvent,\n x,\n quant,\n chordLayout,\n });\n\n // Create hit zones\n const adjustedStartX = Math.max(0, x - HIT_RADIUS + minOffset);\n const adjustedEndX = x + HIT_RADIUS + maxOffset;\n\n hitZones.push({\n startX: adjustedStartX,\n endX: adjustedEndX,\n index: evtIndex,\n type: 'EVENT',\n eventId: tupletEvent.id,\n });\n\n // Insert zone (if enough space)\n if (tupletWidth > HIT_RADIUS * 2 + maxOffset) {\n hitZones.push({\n startX: adjustedEndX,\n endX: x + tupletWidth,\n index: evtIndex + 1,\n type: 'INSERT',\n });\n }\n\n x += tupletWidth;\n quant += getNoteDuration(tupletEvent.duration, tupletEvent.dotted, tupletEvent.tuplet);\n });\n\n return {\n processedEvents,\n hitZones,\n eventPositions,\n widthConsumed: x - ctx.currentX,\n quantsConsumed: quant - ctx.currentQuant,\n };\n};\n\n// --- MAIN LAYOUT CALCULATOR (Orchestration) ---\n\n/**\n * Calculates the layout for a single measure.\n *\n * This function orchestrates the layout process:\n * 1. Handles empty measures\n * 2. Processes events (delegating to specialized handlers)\n * 3. Generates hit zones for interaction\n * 4. Calculates final measure width\n */\nexport const calculateMeasureLayout = (\n events: ScoreEvent[],\n totalQuants: number = CONFIG.quantsPerMeasure,\n clef: string = 'treble',\n isPickup: boolean = false,\n forcedEventPositions?: Record<number, number>\n): MeasureLayout => {\n // 1. Handle Empty Measure\n if (events.length === 0) {\n return createEmptyMeasureLayout();\n }\n\n // 2. Initialize State\n const hitZones: HitZone[] = [];\n const eventPositions: Record<string, number> = {};\n const processedEvents: ScoreEvent[] = [];\n const processedIndices = new Set<number>();\n\n let currentX = CONFIG.measurePaddingLeft;\n let currentQuant = 0;\n\n // Initial Insert Zone\n hitZones.push({ startX: 0, endX: CONFIG.measurePaddingLeft, index: 0, type: 'INSERT' });\n\n // 3. Process Events\n events.forEach((event, index) => {\n if (processedIndices.has(index)) return;\n\n const ctx: ProcessingContext = {\n currentX,\n currentQuant,\n clef,\n forcedEventPositions,\n };\n\n const isTupletStart = event.tuplet && event.tuplet.position === 0;\n let result: EventProcessResult;\n\n if (isTupletStart) {\n // Process entire tuplet group\n result = processTupletGroup(events, index, ctx);\n\n // Mark all tuplet events as processed\n const tupletGroup = getTupletGroup(events, index);\n tupletGroup.forEach((te) => {\n const idx = events.indexOf(te);\n if (idx !== -1) processedIndices.add(idx);\n });\n } else if (!event.tuplet || event.tuplet.position === 0) {\n // Process regular event\n result = processRegularEvent(event, index, ctx);\n } else {\n // Skip orphaned tuplet parts\n return;\n }\n\n // Merge results\n result.processedEvents.forEach((pe) => processedEvents.push(pe));\n result.hitZones.forEach((hz) => addHitZone(hitZones, hz));\n Object.assign(eventPositions, result.eventPositions);\n\n currentX += result.widthConsumed;\n currentQuant += result.quantsConsumed;\n\n // Lookahead Padding for Next Accidentals\n const nextEvent = events[index + 1];\n if (nextEvent && nextEvent.notes.some((n: Note) => n.accidental)) {\n currentX += NOTE_SPACING_BASE_UNIT * LAYOUT.LOOKAHEAD_PADDING_FACTOR;\n }\n });\n\n // 4. Final Append Zone\n addHitZone(hitZones, {\n startX: currentX,\n endX: currentX + LAYOUT.APPEND_ZONE_WIDTH,\n index: events.length,\n type: 'APPEND',\n });\n\n // 5. Calculate Final Width\n const minDuration = isPickup ? 'quarter' : 'whole';\n const minWidth =\n getNoteWidth(minDuration, false) + CONFIG.measurePaddingLeft + CONFIG.measurePaddingRight;\n const finalWidth = Math.max(currentX + CONFIG.measurePaddingRight, minWidth);\n\n return { hitZones, eventPositions, totalWidth: finalWidth, processedEvents };\n};\n\n/**\n * Calculates the total visual width of a measure based on its events.\n */\nexport const calculateMeasureWidth = (events: ScoreEvent[], isPickup: boolean = false): number => {\n return calculateMeasureLayout(events, undefined, 'treble', isPickup).totalWidth;\n};\n\n// --- PLACEMENT CALCULATOR ---\n\n/**\n * Analyzes where a new note should be placed based on intended quant position.\n */\nexport const analyzePlacement = (events: ScoreEvent[], intendedQuant: number) => {\n const MAGNET_THRESHOLD = 3;\n let currentQuant = 0;\n\n for (const [i, event] of events.entries()) {\n const eventDur = getNoteDuration(event.duration, event.dotted, event.tuplet);\n\n if (Math.abs(intendedQuant - currentQuant) <= MAGNET_THRESHOLD) {\n return { mode: 'CHORD', index: i, visualQuant: currentQuant };\n }\n\n if (intendedQuant < currentQuant + eventDur) {\n return { mode: 'INSERT', index: i, quant: currentQuant, visualQuant: intendedQuant };\n }\n\n currentQuant += eventDur;\n }\n\n return { mode: 'APPEND', index: events.length, visualQuant: currentQuant };\n};\n","/**\n * System Layout Engine\n *\n * Handles multi-staff synchronization for vertically aligned measures.\n * Ensures that events at the same rhythmic position align across staves.\n */\n\nimport { CONFIG } from '@/config';\nimport { getNoteDuration } from '@/utils/core';\nimport { NOTE_SPACING_BASE_UNIT, LAYOUT } from '@/constants';\nimport { ScoreEvent, Note } from './types';\nimport { calculateChordLayout } from './positioning';\n\n// --- CONSTANTS ---\n\n/** Padding added before noteheads when accidentals are present */\nconst ACCIDENTAL_PADDING = NOTE_SPACING_BASE_UNIT * 0.8;\n\n/** Minimum width factors for short-duration notes */\nconst MIN_WIDTH_FACTORS = LAYOUT.MIN_WIDTH_FACTORS;\n\n// --- HELPERS ---\n\n/**\n * Collects all unique time boundaries (quants) across all measures.\n * Used to create a grid of synchronized positions for multi-staff alignment.\n *\n * @param measures - Array of measure objects, each containing events\n * @returns Sorted array of quant positions where events start or end\n */\nconst getSystemTimePoints = (measures: { events: ScoreEvent[] }[]): number[] => {\n const points = new Set<number>([0]);\n\n measures.forEach((measure) => {\n let q = 0;\n measure.events.forEach((event) => {\n points.add(q); // Start of event\n q += getNoteDuration(event.duration, event.dotted, event.tuplet);\n points.add(q); // End of event\n });\n });\n\n return Array.from(points).sort((a, b) => a - b);\n};\n\n/**\n * Finds the event that starts at a specific quant position.\n * Uses linear search with early termination for efficiency.\n *\n * @param events - List of events in the measure\n * @param targetQuant - The quant position to search for\n * @returns The event starting at that quant, or null if none found\n */\nconst findEventAtQuant = (events: ScoreEvent[], targetQuant: number): ScoreEvent | null => {\n let q = 0;\n for (const event of events) {\n if (q === targetQuant) return event;\n q += getNoteDuration(event.duration, event.dotted, event.tuplet);\n if (q > targetQuant) return null; // Passed target, no match\n }\n return null;\n};\n\n/**\n * Calculates extra padding required for an event based on its visual properties.\n * Considers accidentals, second intervals (close note pairs), and dots.\n *\n * @param event - The score event to analyze\n * @returns Additional padding in pixels needed before the next event\n */\nconst calculateEventPadding = (event: ScoreEvent): number => {\n let padding = 0;\n\n const hasAccidental = event.notes.some((n: Note) => n.accidental);\n if (hasAccidental) {\n padding = Math.max(padding, ACCIDENTAL_PADDING);\n }\n\n const chordLayout = calculateChordLayout(event.notes, 'treble');\n const hasSecond = Object.values(chordLayout.noteOffsets).some((v) => v !== 0);\n if (hasSecond) {\n padding = Math.max(padding, LAYOUT.SECOND_INTERVAL_SPACE);\n if (hasAccidental) {\n padding = Math.max(padding, LAYOUT.SECOND_INTERVAL_SPACE + ACCIDENTAL_PADDING * 0.5);\n }\n }\n\n if (event.dotted) {\n padding = Math.max(padding, NOTE_SPACING_BASE_UNIT * 0.5);\n }\n\n return padding;\n};\n\n/**\n * Calculates the width required for a specific time segment.\n * Checks all measures at this quant to find the maximum width needed\n * for proper vertical alignment across staves.\n *\n * @param startQuant - Start of the time segment\n * @param endQuant - End of the time segment\n * @param measures - All measures being synchronized\n * @returns Required width in pixels for this segment\n */\nconst getSegmentWidthRequirement = (\n startQuant: number,\n endQuant: number,\n measures: { events: ScoreEvent[] }[]\n): number => {\n const segmentDuration = endQuant - startQuant;\n let maxSegmentWidth = NOTE_SPACING_BASE_UNIT * Math.sqrt(segmentDuration);\n let maxExtraPadding = 0;\n\n measures.forEach((measure) => {\n const event = findEventAtQuant(measure.events, startQuant);\n if (!event) return;\n\n // Check minimum width for short notes\n const minFactor = MIN_WIDTH_FACTORS[event.duration] || 0;\n if (minFactor > 0) {\n maxSegmentWidth = Math.max(maxSegmentWidth, minFactor * NOTE_SPACING_BASE_UNIT);\n }\n\n // Calculate padding requirements\n const padding = calculateEventPadding(event);\n maxExtraPadding = Math.max(maxExtraPadding, padding);\n });\n\n return maxSegmentWidth + maxExtraPadding;\n};\n\n// --- MAIN EXPORT ---\n\n/**\n * Calculates a unified layout for a system (group of measures vertically aligned).\n *\n * Process:\n * 1. Collect all unique time points across all measures\n * 2. For each time segment, calculate the maximum required width\n * 3. Build a mapping from quant position to X coordinate\n *\n * @param measures - Array of measures at the same index across all staves\n * @returns Map of Quant -> X Position for synchronized positioning\n */\nexport const calculateSystemLayout = (\n measures: { events: ScoreEvent[] }[]\n): Record<number, number> => {\n const timePoints = getSystemTimePoints(measures);\n const quantToX: Record<number, number> = { [timePoints[0]]: CONFIG.measurePaddingLeft };\n\n let currentX = CONFIG.measurePaddingLeft;\n\n for (let i = 0; i < timePoints.length - 1; i++) {\n const startQuant = timePoints[i];\n const endQuant = timePoints[i + 1];\n\n const segmentWidth = getSegmentWidthRequirement(startQuant, endQuant, measures);\n\n currentX += segmentWidth;\n quantToX[endQuant] = currentX;\n }\n\n return quantToX;\n};\n","import { Note, Key } from 'tonal';\n\n/**\n * Returns the effective accidental of a pitch in a key.\n * e.g. F# in G Major -> 'sharp'\n * e.g. F in G Major -> 'natural' (even though it's an accidental relative to key)\n * e.g. Bb in F Major -> 'flat'\n */\nexport const getEffectiveAccidental = (\n pitch: string,\n keySignature: string\n): 'sharp' | 'flat' | 'natural' => {\n const note = Note.get(pitch);\n if (note.empty) return 'natural';\n\n // If the note has an explicit accidental in its name (e.g. C#), that is its effective accidental.\n if (note.alt > 0) return 'sharp';\n if (note.alt < 0) return 'flat';\n\n // If note is Natural (alt=0, e.g. \"C\").\n return 'natural';\n};\n\n/**\n * Returns the accidental implied by the Key Signature for a given letter.\n */\nexport const getKeyAccidental = (\n letter: string,\n keySignature: string\n): 'sharp' | 'flat' | 'natural' => {\n const scale = Key.majorKey(keySignature).scale;\n // Find the note in the scale with this letter\n const match = scale.find((n) => n.startsWith(letter));\n if (match) {\n if (match.includes('#')) return 'sharp';\n if (match.includes('b')) return 'flat';\n }\n return 'natural';\n};\n\n/**\n * Returns the diatonic pitch (Letter + Octave) for staff position tracking.\n * e.g. \"C#4\" -> \"C4\", \"Bb3\" -> \"B3\"\n */\nexport const getDiatonicPitch = (pitch: string): string => {\n const note = Note.get(pitch);\n if (note.empty) return pitch;\n return `${note.letter}${note.oct}`;\n};\n","import { useMemo } from 'react';\nimport { ScoreEvent } from '@/types';\nimport {\n getEffectiveAccidental,\n getKeyAccidental,\n getDiatonicPitch,\n} from '@/utils/accidentalContext';\n\n/**\n * Hook to calculate which accidentals should be displayed for notes in a measure.\n *\n * Rules:\n * 1. If a note's effective accidental differs from the key signature, show the accidental.\n * 2. If a note repeats the same pitch (same line), only show if the accidental CHANGES.\n * 3. If a letter was altered earlier in the measure, show a cautionary accidental when\n * returning to the key signature's default.\n *\n * @param events - The events in the measure\n * @param keySignature - The current key signature (e.g., \"G\", \"F\", \"Bb\")\n * @returns A map of noteId -> accidental symbol ('♯', '♭', '♮') or null (hide)\n */\nexport function useAccidentalContext(\n events: ScoreEvent[],\n keySignature: string\n): Record<string, string | null> {\n return useMemo(() => {\n const overrides: Record<string, string | null> = {};\n const pitchHistory: Record<string, 'sharp' | 'flat' | 'natural'> = {};\n const alteredLetters = new Set<string>();\n\n // Events are already in temporal order within the measure\n events.forEach((event) => {\n if (!event.notes) return;\n\n event.notes.forEach((note: any) => {\n // Skip rest notes (null pitch)\n if (note.pitch === null) return;\n\n const effective = getEffectiveAccidental(note.pitch, keySignature);\n const keyAccidental = getKeyAccidental(note.pitch.charAt(0), keySignature);\n const diatonicPitch = getDiatonicPitch(note.pitch);\n\n let showSymbol: string | null = null;\n\n const prev = pitchHistory[diatonicPitch];\n\n if (prev) {\n // Rule: If repeated pitch (same line), only show if it CHANGES.\n if (prev !== effective) {\n showSymbol = effective;\n } else {\n showSymbol = null; // Hide\n }\n } else {\n // First time on this line\n if (effective !== keyAccidental) {\n // Deviation from key -> Show\n showSymbol = effective;\n alteredLetters.add(note.pitch.charAt(0));\n } else {\n // Matches key... BUT check if letter was altered elsewhere\n if (alteredLetters.has(note.pitch.charAt(0))) {\n // Cautionary -> Show\n showSymbol = effective;\n } else {\n showSymbol = null;\n }\n }\n }\n\n // Update History\n pitchHistory[diatonicPitch] = effective;\n\n // Store result with symbol mapping\n if (showSymbol) {\n const symbolMap: Record<string, string> = {\n sharp: '♯',\n flat: '♭',\n natural: '♮',\n };\n overrides[note.id] = symbolMap[showSymbol] || null;\n } else {\n overrides[note.id] = null; // Explicitly hide\n }\n });\n });\n\n return overrides;\n }, [events, keySignature]);\n}\n","import { useMemo } from 'react';\nimport { ScoreEvent } from '@/types';\nimport {\n calculateMeasureLayout,\n calculateBeamingGroups,\n applyMeasureCentering,\n} from '@/engines/layout';\nimport { calculateTupletBrackets } from '@/engines/layout/tuplets';\nimport { BeamGroup } from '@/engines/layout/types';\n\n/**\n * Hook to compute all layout-related data for a measure.\n *\n * Consolidates:\n * - Measure layout (hit zones, event positions, total width)\n * - Event centering for Grand Staff alignment\n * - Beam grouping for 8th/16th notes\n * - Tuplet bracket positioning\n *\n * @param events - The events in the measure\n * @param clef - The clef type ('treble' | 'bass')\n * @param isPickup - Whether this is a pickup measure\n * @param forcedEventPositions - Optional forced positions from Grand Staff sync\n * @param forcedWidth - Optional forced width from Grand Staff sync\n */\nexport function useMeasureLayout(\n events: ScoreEvent[],\n clef: string,\n isPickup: boolean,\n forcedEventPositions?: Record<string, number>,\n forcedWidth?: number\n) {\n // Core measure layout\n const measureLayout = useMemo(() => {\n return calculateMeasureLayout(events, undefined, clef, isPickup, forcedEventPositions);\n }, [events, clef, isPickup, forcedEventPositions]);\n\n const { hitZones, eventPositions, totalWidth, processedEvents } = measureLayout;\n\n // Effective width (Grand Staff may force a specific width)\n const effectiveWidth = forcedWidth || totalWidth;\n\n // Re-center events if width is forced and we have a rest placeholder\n const centeredEvents = useMemo(() => {\n if (\n forcedWidth &&\n processedEvents.length === 1 &&\n processedEvents[0].id === 'rest-placeholder'\n ) {\n return applyMeasureCentering(processedEvents, effectiveWidth);\n }\n return processedEvents;\n }, [processedEvents, forcedWidth, effectiveWidth]);\n\n // Beam grouping for 8th/16th notes\n const beamGroups = useMemo(() => {\n return calculateBeamingGroups(events, eventPositions, clef);\n }, [events, eventPositions, clef]) as BeamGroup[];\n\n // Tuplet bracket positioning\n const tupletGroups = useMemo(() => {\n return calculateTupletBrackets(centeredEvents, eventPositions, clef);\n }, [centeredEvents, eventPositions, clef]);\n\n return {\n hitZones,\n eventPositions,\n totalWidth,\n effectiveWidth,\n centeredEvents,\n beamGroups,\n tupletGroups,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { getPitchForOffset } from '@/engines/layout';\nimport { HitZone } from '@/engines/layout/types';\nimport { CLAMP_LIMITS, MOUSE_OFFSET_SNAP } from '@/constants';\n\ninterface UseMeasureInteractionParams {\n hitZones: HitZone[];\n clef: string;\n scale: number;\n baseY: number;\n topMargin: number;\n mouseLimits?: { min: number; max: number };\n measureIndex: number;\n isLast: boolean;\n activeDuration: string;\n previewNote: any;\n selection: { selectedNotes?: any[] };\n onHover?: (measureIndex: number | null, hit: any, pitch: string | null) => void;\n onAddNote?: (measureIndex: number, note: any, autoAdvance: boolean) => void;\n}\n\ninterface UseMeasureInteractionReturn {\n handleMeasureMouseMove: (e: React.MouseEvent) => void;\n handleMeasureMouseLeave: () => void;\n handleMeasureClick: (e: React.MouseEvent) => void;\n cursorStyle: string;\n isNoteHovered: boolean;\n setIsNoteHovered: (value: boolean) => void;\n hoveredMeasure: boolean;\n}\n\n/**\n * Hook to manage mouse interaction within a measure.\n *\n * Handles:\n * - Mouse move: Hit zone detection, pitch calculation, preview updates\n * - Mouse leave: Reset hover state\n * - Click: Commit preview note or delegate to parent\n */\nexport function useMeasureInteraction({\n hitZones,\n clef,\n scale,\n baseY,\n topMargin,\n mouseLimits,\n measureIndex,\n isLast,\n activeDuration,\n previewNote,\n selection,\n onHover,\n onAddNote,\n}: UseMeasureInteractionParams): UseMeasureInteractionReturn {\n const [hoveredMeasure, setHoveredMeasure] = useState(false);\n const [cursorStyle, setCursorStyle] = useState<string>('crosshair');\n const [isNoteHovered, setIsNoteHovered] = useState(false);\n\n const handleMeasureMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (isNoteHovered) {\n onHover?.(null, null, null);\n return;\n }\n\n const rect = e.currentTarget.getBoundingClientRect();\n const x = (e.clientX - rect.left) / scale;\n const y = (e.clientY - rect.top) / scale;\n\n // Find closest hit zone\n const hit = hitZones.find((zone) => x >= zone.startX && x < zone.endX);\n\n // Calculate pitch from Y position\n // Snap to nearest half-line (6px) for staff positioning\n // Y is relative to measure bounding box.\n // Original working logic was y - 50.\n // 50 = CONFIG.baseY (70) - CONFIG.topMargin (20).\n // So currentY (relative to box) needs to be adjusted by (baseY - topMargin).\n const yOffset = Math.round((y - (baseY - topMargin)) / MOUSE_OFFSET_SNAP) * MOUSE_OFFSET_SNAP;\n\n // Check visual limits\n // Default: 4 ledger lines above/below.\n // Props can restrict this (e.g. Grand Staff inner zones).\n const minLimit = mouseLimits?.min ?? CLAMP_LIMITS.OUTER_TOP;\n const maxLimit = mouseLimits?.max ?? CLAMP_LIMITS.OUTER_BOTTOM;\n\n // Strict bounds check: If outside, ignore interaction (allows other staves to handle, or shows nothing)\n if (yOffset < minLimit || yOffset > maxLimit) {\n if (hoveredMeasure) {\n setHoveredMeasure(false);\n onHover?.(null, null, null);\n setCursorStyle('crosshair');\n }\n return;\n }\n\n const pitch = getPitchForOffset(yOffset, clef) || null;\n\n setHoveredMeasure(true);\n\n if (hit) {\n onHover?.(measureIndex, hit, pitch);\n setCursorStyle(hit.type === 'EVENT' ? 'default' : 'crosshair');\n } else {\n // Gap hit\n onHover?.(measureIndex, { x, quant: 0, duration: activeDuration }, pitch);\n setCursorStyle('crosshair');\n }\n },\n [\n isNoteHovered,\n hitZones,\n clef,\n scale,\n baseY,\n topMargin,\n mouseLimits,\n measureIndex,\n activeDuration,\n onHover,\n ]\n );\n\n const handleMeasureMouseLeave = useCallback(() => {\n setHoveredMeasure(false);\n onHover?.(null, null, null);\n setCursorStyle('crosshair');\n }, [onHover]);\n\n const handleMeasureClick = useCallback(\n (e: React.MouseEvent) => {\n if (isNoteHovered) return;\n\n // If there's an active selection, let click bubble up to deselect\n if (selection.selectedNotes && selection.selectedNotes.length > 0) {\n return;\n }\n\n e.stopPropagation();\n\n if (hoveredMeasure && onAddNote && previewNote) {\n const isOverflow = isLast && previewNote.measureIndex === measureIndex + 1;\n if (previewNote.measureIndex === measureIndex || isOverflow) {\n onAddNote(measureIndex, previewNote, true);\n }\n }\n },\n [\n isNoteHovered,\n selection.selectedNotes,\n hoveredMeasure,\n onAddNote,\n previewNote,\n isLast,\n measureIndex,\n ]\n );\n\n return {\n handleMeasureMouseMove,\n handleMeasureMouseLeave,\n handleMeasureClick,\n cursorStyle,\n isNoteHovered,\n setIsNoteHovered,\n hoveredMeasure,\n };\n}\n","import { useMemo, useRef } from 'react';\nimport { ScoreEvent } from '@/types';\nimport { calculateChordLayout } from '@/engines/layout';\nimport { HitZone } from '@/engines/layout/types';\nimport { CONFIG } from '@/config';\n\ninterface PreviewNote {\n measureIndex: number;\n index: number;\n mode: 'CHORD' | 'INSERT' | 'APPEND';\n duration: string;\n dotted: boolean;\n pitch?: string;\n isRest?: boolean;\n [key: string]: any;\n}\n\ninterface UsePreviewRenderParams {\n previewNote: PreviewNote | null;\n events: ScoreEvent[];\n measureIndex: number;\n isLast: boolean;\n clef: string;\n hitZones: HitZone[];\n eventPositions: Record<string, number>;\n totalWidth: number;\n selectedNotes?: any[];\n}\n\ninterface PreviewRenderResult {\n chordNotes: any[];\n quant: number;\n x: number;\n chordLayout: any;\n}\n\n/**\n * Hook to calculate preview (ghost note/rest) rendering data.\n *\n * Handles:\n * - Preview positioning based on mode (CHORD, INSERT, APPEND)\n * - Overflow preview for last measure\n * - Rest preview caching to prevent recalculation on pitch changes\n * - Hiding preview when selection is active\n */\nexport function usePreviewRender({\n previewNote,\n events,\n measureIndex,\n isLast,\n clef,\n hitZones,\n eventPositions,\n totalWidth,\n selectedNotes,\n}: UsePreviewRenderParams): PreviewRenderResult | null {\n // Cache for rest previews to prevent recalculation on pitch changes\n const restPreviewCacheRef = useRef<{ key: string; result: PreviewRenderResult } | null>(null);\n\n return useMemo(() => {\n if (!previewNote) return null;\n\n // Hide preview when there are selected notes (user is in \"edit selection\" mode)\n if (selectedNotes && selectedNotes.length > 0) return null;\n\n // Allow rendering if it's for this measure OR if it's for the next measure (overflow) and we are the last measure\n const isOverflowPreview = isLast && previewNote.measureIndex === measureIndex + 1;\n if (previewNote.measureIndex !== measureIndex && !isOverflowPreview) {\n return null;\n }\n\n // For rests, use cached result if key fields haven't changed (ignore pitch)\n if (previewNote.isRest) {\n const cacheKey = `${previewNote.measureIndex}-${previewNote.index}-${previewNote.mode}-${previewNote.duration}-${previewNote.dotted}`;\n if (restPreviewCacheRef.current && restPreviewCacheRef.current.key === cacheKey) {\n return restPreviewCacheRef.current.result;\n }\n }\n\n const visualTempNote = {\n ...previewNote,\n quant: 0, // Not used for positioning anymore\n id: 'preview',\n };\n\n let combinedNotes: any[] = [visualTempNote];\n let xPos = 0;\n\n if (isOverflowPreview) {\n const lastInsertZone = hitZones.find((z) => z.type === 'INSERT' && z.index === events.length);\n if (lastInsertZone) {\n xPos = lastInsertZone.startX + (lastInsertZone.endX - lastInsertZone.startX) / 2;\n } else {\n xPos = totalWidth - CONFIG.measurePaddingRight;\n }\n } else if (previewNote.mode === 'CHORD') {\n const existingEvent = events[previewNote.index];\n if (existingEvent) {\n xPos = eventPositions[existingEvent.id];\n combinedNotes = [...(existingEvent.notes as any[]), visualTempNote];\n }\n } else if (previewNote.mode === 'INSERT') {\n const insertZone = hitZones.find((z) => z.type === 'INSERT' && z.index === previewNote.index);\n if (insertZone) {\n xPos = insertZone.startX + (insertZone.endX - insertZone.startX) / 2;\n } else {\n if (previewNote.index < events.length) {\n xPos = eventPositions[events[previewNote.index].id] - 20;\n } else {\n xPos = totalWidth - CONFIG.measurePaddingRight;\n }\n }\n } else {\n // APPEND\n const appendZone = hitZones.find((z) => z.type === 'APPEND');\n xPos = appendZone ? appendZone.startX : 0;\n }\n\n // Use any to match layout engine's flexible typing\n const chordLayout = calculateChordLayout(combinedNotes as any, clef);\n\n const result: PreviewRenderResult = {\n chordNotes: combinedNotes,\n quant: 0,\n x: xPos,\n chordLayout,\n };\n\n // Cache rest preview result\n if (previewNote.isRest) {\n const cacheKey = `${previewNote.measureIndex}-${previewNote.index}-${previewNote.mode}-${previewNote.duration}-${previewNote.dotted}`;\n restPreviewCacheRef.current = { key: cacheKey, result };\n }\n\n return result;\n }, [\n previewNote,\n events,\n measureIndex,\n isLast,\n clef,\n hitZones,\n eventPositions,\n totalWidth,\n selectedNotes,\n ]);\n}\n","// @ts-nocheck\nimport React from 'react';\nimport { LAYOUT } from '@/constants';\nimport { CONFIG } from '@/config';\nimport { useTheme } from '@/context/ThemeContext';\nimport { getOffsetForPitch } from '@/engines/layout';\nimport { NOTEHEADS, BRAVURA_FONT, getFontSize, DOTS } from '@/constants/SMuFL';\n\n// =============================================================================\n// SUB-COMPONENTS (Internal to Note)\n// =============================================================================\n\n/**\n * Renders the notehead glyph (whole, half, or black).\n */\nconst NoteHead = ({ x, y, duration, color }) => {\n const getGlyph = () => {\n if (duration === 'whole') return NOTEHEADS.whole;\n if (duration === 'half') return NOTEHEADS.half;\n return NOTEHEADS.black;\n };\n\n const fontSize = getFontSize(CONFIG.lineHeight);\n\n return (\n <text\n className=\"NoteHead\"\n x={x}\n y={y}\n fontFamily={BRAVURA_FONT}\n fontSize={fontSize}\n textAnchor=\"middle\"\n fill={color}\n style={{ userSelect: 'none' }}\n >\n {getGlyph()}\n </text>\n );\n};\n\n/**\n * Renders the accidental symbol using Bravura font glyphs.\n */\nconst Accidental = ({ x, y, symbol, color }) => {\n if (!symbol) return null;\n\n const fontSize = getFontSize(CONFIG.lineHeight);\n\n return (\n <text\n x={x}\n y={y}\n fontSize={fontSize}\n fontFamily={BRAVURA_FONT}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {symbol}\n </text>\n );\n};\n\n/**\n * Renders the augmentation dot.\n */\nconst Dot = ({ x, y, color }) => {\n const fontSize = getFontSize(CONFIG.lineHeight);\n\n return (\n <text\n x={x}\n y={y}\n fontFamily={BRAVURA_FONT}\n fontSize={fontSize}\n fill={color}\n textAnchor=\"start\"\n style={{ userSelect: 'none' }}\n >\n {DOTS.augmentationDot}\n </text>\n );\n};\n\n/**\n * Renders ledger lines above or below the staff.\n */\nconst LedgerLines = ({ x, y, baseY, color }) => {\n const lines = [];\n const relativeY = y - baseY;\n\n // Lines above staff\n if (relativeY < 0) {\n for (let i = -12; i >= relativeY; i -= 12) {\n lines.push(\n <line\n key={`ledger-${i}`}\n x1={x - LAYOUT.LEDGER_LINE_EXTENSION}\n y1={baseY + i}\n x2={x + LAYOUT.LEDGER_LINE_EXTENSION}\n y2={baseY + i}\n stroke={color}\n strokeWidth={LAYOUT.LINE_STROKE_WIDTH}\n />\n );\n }\n }\n\n // Lines below staff\n if (relativeY > 48) {\n for (let i = 60; i <= relativeY; i += 12) {\n lines.push(\n <line\n key={`ledger-${i}`}\n x1={x - LAYOUT.LEDGER_LINE_EXTENSION}\n y1={baseY + i}\n x2={x + LAYOUT.LEDGER_LINE_EXTENSION}\n y2={baseY + i}\n stroke={color}\n strokeWidth={LAYOUT.LINE_STROKE_WIDTH}\n />\n );\n }\n }\n\n return <>{lines}</>;\n};\n\n/**\n * Invisible hit area for easier clicking on notes.\n */\nconst HitArea = ({ x, y, cursor, onClick, onMouseDown, onDoubleClick, testId }) => (\n <rect\n x={x}\n y={y}\n width={LAYOUT.HIT_AREA.WIDTH}\n height={LAYOUT.HIT_AREA.HEIGHT}\n fill=\"white\"\n fillOpacity={0.01}\n style={{ cursor }}\n onClick={onClick}\n onMouseDown={onMouseDown}\n onDoubleClick={onDoubleClick}\n data-testid={testId}\n />\n);\n\n// =============================================================================\n// MAIN NOTE COMPONENT\n// =============================================================================\n\n/**\n * Renders a complete note with all its visual elements:\n * - NoteHead (glyph)\n * - Accidental\n * - Dot\n * - LedgerLines\n * - HitArea (interaction layer)\n *\n * This is the primary building block used by ChordGroup.\n */\nconst Note = React.memo(\n ({\n // Note data\n note,\n pitch, // Alternative to note.pitch for simpler use cases\n duration,\n dotted = false,\n\n // Positioning\n x,\n baseY,\n clef,\n xShift = 0,\n dotShift = 0,\n\n // Appearance\n isSelected = false,\n isPreview = false, // Lasso preview state (shows semi-transparent accent)\n isGhost = false,\n accidentalGlyph = null,\n color: overrideColor = null,\n\n // Interaction handlers (optional for interactive notes)\n handlers = null, // { onMouseEnter, onMouseLeave, onMouseDown, onDoubleClick }\n }) => {\n const { theme } = useTheme();\n\n // Resolve pitch from either direct prop or note object\n const effectivePitch = pitch || note?.pitch;\n if (!effectivePitch) return null;\n\n // Calculate position\n const noteX = x + xShift;\n const noteY = baseY + getOffsetForPitch(effectivePitch, clef);\n\n // Determine color (preview uses accent color, same as selection)\n const color =\n overrideColor ||\n (isGhost\n ? theme.accent\n : isSelected\n ? theme.accent\n : isPreview\n ? theme.accent\n : theme.score.note);\n\n // Dot Y position (move up if on a line)\n const relativeY = noteY - baseY;\n const dotY = relativeY % 12 === 0 ? noteY - 6 : noteY;\n const dotX = noteX + dotShift + LAYOUT.DOT_OFFSET_X;\n\n // Accidental position\n const accidentalX = noteX + LAYOUT.ACCIDENTAL.OFFSET_X;\n const accidentalY = noteY + LAYOUT.ACCIDENTAL.OFFSET_Y;\n\n // Hit area position\n const hitX = noteX + LAYOUT.HIT_AREA.OFFSET_X;\n const hitY = noteY + LAYOUT.HIT_AREA.OFFSET_Y;\n\n // Note ID for hit area test ID\n const noteId = note?.id || 'note';\n\n return (\n <g\n className={!isGhost ? 'note-group-container' : ''}\n onMouseEnter={() => handlers?.onMouseEnter?.(note?.id)}\n onMouseLeave={handlers?.onMouseLeave}\n >\n {/* 1. Ledger Lines (behind everything) */}\n <LedgerLines x={noteX} y={noteY} baseY={baseY} color={color} />\n\n {/* 2. Accidental */}\n <Accidental x={accidentalX} y={accidentalY} symbol={accidentalGlyph} color={color} />\n\n {/* 3. Note Head */}\n <g style={{ pointerEvents: 'none' }}>\n <NoteHead x={noteX} y={noteY} duration={duration} color={color} />\n </g>\n\n {/* 4. Dot */}\n {dotted && <Dot x={dotX} y={dotY} color={color} />}\n\n {/* 5. Hit Area (on top for interaction) */}\n {handlers && (\n <HitArea\n x={hitX}\n y={hitY}\n cursor={!isGhost ? 'pointer' : 'default'}\n onClick={(e) => !isGhost && e.stopPropagation()}\n onMouseDown={(e) => handlers.onMouseDown?.(e, note)}\n onDoubleClick={(e) => handlers.onDoubleClick?.(e, note)}\n testId={`note-${noteId}`}\n />\n )}\n </g>\n );\n }\n);\n\n// Also export sub-components for special use cases\nexport { NoteHead, Accidental, Dot, LedgerLines, HitArea };\nexport default Note;\n","import React from 'react';\nimport { LAYOUT } from '@/constants';\n\n/**\n * Renders the vertical stem line for a note or chord.\n * Used by ChordGroup to draw the shared stem.\n */\n\ninterface StemProps {\n x: number;\n startY: number;\n endY: number;\n color: string;\n}\n\nconst Stem: React.FC<StemProps> = ({ x, startY, endY, color }) => (\n <line x1={x} y1={startY} x2={x} y2={endY} stroke={color} strokeWidth={LAYOUT.LINE_STROKE_WIDTH} />\n);\n\nexport default Stem;\n","import React from 'react';\nimport { CONFIG } from '@/config';\nimport { BRAVURA_FONT, getFontSize, FLAGS as SMUFL_FLAGS } from '@/constants/SMuFL';\n\n/**\n * Renders flag glyphs for notes (eighth, sixteenth, etc.) using Bravura font.\n * Used by ChordGroup for unbeamed notes.\n */\n\ninterface FlagsProps {\n stemX: number;\n stemTipY: number;\n duration: string;\n direction: 'up' | 'down';\n color: string;\n}\n\nconst getFlagGlyph = (duration: string, direction: 'up' | 'down'): string | null => {\n if (direction === 'up') {\n switch (duration) {\n case 'eighth':\n return SMUFL_FLAGS.eighthUp;\n case 'sixteenth':\n return SMUFL_FLAGS.sixteenthUp;\n case 'thirtysecond':\n return SMUFL_FLAGS.thirtysecondUp;\n case 'sixtyfourth':\n return SMUFL_FLAGS.sixtyfourthUp;\n default:\n return null;\n }\n } else {\n switch (duration) {\n case 'eighth':\n return SMUFL_FLAGS.eighthDown;\n case 'sixteenth':\n return SMUFL_FLAGS.sixteenthDown;\n case 'thirtysecond':\n return SMUFL_FLAGS.thirtysecondDown;\n case 'sixtyfourth':\n return SMUFL_FLAGS.sixtyfourthDown;\n default:\n return null;\n }\n }\n};\n\nconst Flags: React.FC<FlagsProps> = ({ stemX, stemTipY, duration, direction, color }) => {\n const glyph = getFlagGlyph(duration, direction);\n if (!glyph) return null;\n\n const fontSize = getFontSize(CONFIG.lineHeight);\n\n return (\n <text\n x={stemX - 0.75}\n y={stemTipY}\n fontFamily={BRAVURA_FONT}\n fontSize={fontSize}\n fill={color}\n textAnchor=\"start\"\n style={{ userSelect: 'none' }}\n >\n {glyph}\n </text>\n );\n};\n\nexport default Flags;\n","// @ts-nocheck\nimport React, { useState, useMemo, useCallback } from 'react';\nimport { NOTE_TYPES } from '@/constants';\nimport { useTheme } from '@/context/ThemeContext';\nimport { getStemOffset } from '@/engines/layout';\nimport { calculateStemGeometry } from '@/engines/layout/stems';\nimport { getAccidentalGlyph } from '@/services/MusicService';\nimport { isNoteSelected, areAllNotesSelected } from '@/utils/selection';\n\n// Visual Components\nimport Note from './Note';\nimport Stem from './Stem';\nimport Flags from './Flags';\n\n// =============================================================================\n// CHORD GROUP COMPONENT\n// =============================================================================\n\n/**\n * Renders a chord (group of notes) with shared stem and flags.\n *\n * Hierarchy:\n * ChordGroup\n * ├── Stem (shared vertical line)\n * ├── Flags (if unbeamed 8th/16th/etc)\n * └── Note[] (one per pitch)\n * ├── NoteHead, Accidental, Dot, LedgerLines, HitArea\n */\nconst ChordGroup = ({\n // Data\n notes,\n duration,\n dotted,\n measureIndex,\n eventId,\n chordLayout,\n beamSpec = null,\n\n // Appearance & Options\n isGhost = false,\n opacity = 1,\n renderStem = true,\n x = 0,\n filterNote = null,\n accidentalOverrides = null,\n\n // Contexts\n layout,\n interaction,\n onNoteHover = null,\n}) => {\n const { theme } = useTheme();\n const { baseY, clef, keySignature, staffIndex } = layout;\n const { selection, onDragStart, onSelectNote, isDragging } = interaction;\n\n // Local State\n const [hoveredNoteId, setHoveredNoteId] = useState(null);\n\n // --- 1. Layout Calculations ---\n const { sortedNotes, direction, noteOffsets, maxNoteShift, minY, maxY } = chordLayout;\n const effectiveDirection = beamSpec?.direction || direction;\n\n // Stem Geometry\n const stemX = useMemo(\n () => x + getStemOffset(chordLayout, effectiveDirection),\n [x, chordLayout, effectiveDirection]\n );\n\n const { startY: stemStartY, endY: stemEndY } = useMemo(\n () =>\n calculateStemGeometry({\n beamSpec,\n stemX,\n direction: effectiveDirection,\n minY,\n maxY,\n duration,\n }),\n [beamSpec, stemX, effectiveDirection, minY, maxY, duration]\n );\n\n // --- 2. Selection & Lasso Preview State ---\n const isWholeChordSelected =\n !isGhost && areAllNotesSelected(selection, staffIndex, measureIndex, eventId, notes);\n const isAnyNoteHovered = !isGhost && !isDragging && hoveredNoteId !== null;\n\n // Check if entire chord is in lasso preview (all notes must be in preview)\n const isWholeChordInLassoPreview =\n !isGhost &&\n interaction.lassoPreviewIds?.size > 0 &&\n notes.every((note) => {\n const noteKey = `${staffIndex}-${measureIndex}-${eventId}-${note.id}`;\n return interaction.lassoPreviewIds?.has(noteKey);\n });\n\n // Color: Ghost/Selected/Hovered/LassoPreview -> Accent; Default -> Note Color\n const groupColor =\n isGhost || isWholeChordSelected || isAnyNoteHovered || isWholeChordInLassoPreview\n ? theme.accent\n : theme.score.note;\n\n // Filter Notes (if needed)\n const notesToRender = useMemo(() => {\n if (!filterNote) return sortedNotes;\n return typeof filterNote === 'function'\n ? sortedNotes.filter(filterNote)\n : sortedNotes.filter((n) => n.pitch === filterNote);\n }, [sortedNotes, filterNote]);\n\n // --- 3. Interaction Handlers ---\n const handlers = useMemo(\n () => ({\n onMouseEnter: (id) => {\n if (isGhost) return;\n setHoveredNoteId(id);\n onNoteHover?.(true);\n },\n onMouseLeave: () => {\n setHoveredNoteId(null);\n onNoteHover?.(false);\n },\n onMouseDown: (e, note) => {\n if (isGhost || !onDragStart) return;\n e.stopPropagation();\n const isModifier = e.metaKey || e.ctrlKey;\n const isShift = e.shiftKey;\n\n onDragStart({\n measureIndex,\n eventId,\n noteId: note.id,\n startPitch: note.pitch,\n startY: e.clientY,\n isMulti: isModifier,\n isShift: isShift,\n selectAllInEvent: !isModifier && !isShift,\n staffIndex,\n });\n },\n onDoubleClick: (e, note) => {\n if (isGhost || !onSelectNote) return;\n e.stopPropagation();\n onSelectNote(measureIndex, eventId, note.id, staffIndex, false, false);\n },\n }),\n [isGhost, onDragStart, onSelectNote, onNoteHover, measureIndex, eventId, staffIndex]\n );\n\n // Click on the Chord (stem area)\n const handleGroupClick = useCallback(\n (e) => {\n if (isGhost || !onDragStart) return;\n e.stopPropagation();\n const isModifier = e.metaKey || e.ctrlKey;\n\n onDragStart({\n measureIndex,\n eventId,\n noteId: notes[0]?.id,\n startPitch: null,\n startY: e.clientY,\n isMulti: isModifier,\n selectAllInEvent: !isModifier,\n staffIndex,\n });\n },\n [isGhost, onDragStart, measureIndex, eventId, staffIndex, notes]\n );\n\n // --- 4. Render Decisions ---\n const showStem = renderStem && NOTE_TYPES[duration]?.stem;\n const showFlags =\n renderStem &&\n !beamSpec &&\n ['eighth', 'sixteenth', 'thirtysecond', 'sixtyfourth'].includes(duration);\n\n return (\n <g\n className={`chord-group ${isGhost ? 'opacity-50' : ''}`}\n data-testid={isGhost ? 'ghost-note' : `chord-${eventId}`}\n data-selected={isWholeChordSelected}\n style={{ opacity }}\n onMouseEnter={() => onNoteHover?.(true)}\n onMouseLeave={() => onNoteHover?.(false)}\n onClick={handleGroupClick}\n >\n {/* LAYER 1: Stem */}\n {showStem && <Stem x={stemX} startY={stemStartY} endY={stemEndY} color={groupColor} />}\n\n {/* LAYER 2: Flags (unbeamed notes only) */}\n {showFlags && (\n <Flags\n stemX={stemX}\n stemTipY={stemEndY}\n duration={duration}\n direction={effectiveDirection}\n color={groupColor}\n />\n )}\n\n {/* LAYER 3: Notes */}\n {notesToRender.map((note) => {\n const accidentalGlyph = getAccidentalGlyph(\n note.pitch,\n keySignature,\n accidentalOverrides?.[note.id]\n );\n\n const isSelected = isNoteSelected(selection, {\n staffIndex,\n measureIndex,\n eventId,\n noteId: note.id,\n });\n\n // Check if note is in lasso preview (O(1) Set lookup)\n const noteKey = `${staffIndex}-${measureIndex}-${eventId}-${note.id}`;\n const isInLassoPreview = interaction.lassoPreviewIds?.has(noteKey) ?? false;\n\n return (\n <Note\n key={note.id}\n note={note}\n duration={duration}\n dotted={dotted}\n x={x}\n baseY={baseY}\n clef={clef}\n xShift={noteOffsets[note.id] || 0}\n dotShift={maxNoteShift}\n isSelected={isSelected || isAnyNoteHovered}\n isPreview={isInLassoPreview}\n isGhost={isGhost}\n accidentalGlyph={accidentalGlyph}\n handlers={handlers}\n />\n );\n })}\n </g>\n );\n};\n\nexport default ChordGroup;\n","// @ts-nocheck\nimport React, { useState } from 'react';\nimport { CONFIG } from '@/config';\nimport { useTheme } from '@/context/ThemeContext';\nimport { REST_GLYPHS, BRAVURA_FONT, getFontSize, DOTS } from '@/constants/SMuFL';\n\ninterface RestProps {\n duration: string;\n dotted?: boolean;\n x?: number;\n quant?: number;\n baseY?: number;\n noteX?: number;\n /** Whether the rest is currently selected */\n isSelected?: boolean;\n /** Whether this is a ghost/preview rest */\n isGhost?: boolean;\n /** Click handler for selection */\n onClick?: (e: React.MouseEvent) => void;\n /** Event ID for testing */\n eventId?: string | number;\n}\n\n/**\n * Y-offset for each rest type, relative to baseY (top of staff).\n */\nconst getRestY = (duration: string, baseY: number): number => {\n const lineHeight = CONFIG.lineHeight;\n const staffMiddle = baseY + lineHeight * 2;\n\n switch (duration) {\n case 'whole':\n return baseY + lineHeight;\n case 'half':\n return baseY + lineHeight * 2;\n default:\n return staffMiddle;\n }\n};\n\n/**\n * Renders a rest symbol using Bravura font glyphs.\n * Supports selection highlighting, hover effect, and click interaction.\n */\nexport const Rest: React.FC<RestProps> = ({\n duration,\n dotted = false,\n x = 0,\n baseY = CONFIG.baseY,\n isSelected = false,\n isGhost = false,\n onClick,\n eventId,\n}) => {\n const { theme } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n\n const glyph = REST_GLYPHS[duration];\n if (!glyph) {\n console.warn(`Unknown rest duration: ${duration}`);\n return null;\n }\n\n // Color: accent for ghost/selected/hovered, normal otherwise\n const showHighlight = isGhost || isSelected || (isHovered && onClick);\n const color = showHighlight ? theme.accent : theme.score.note;\n const finalX = x > 0 ? x : CONFIG.measurePaddingLeft;\n const restY = getRestY(duration, baseY);\n const fontSize = getFontSize(CONFIG.lineHeight);\n\n // Hit area dimensions - span full staff height for easier clicking\n const hitAreaWidth = 30; // Wide enough to cover rest glyph\n const staffHeight = CONFIG.lineHeight * 4; // 5 lines = 4 gaps\n const hitAreaTop = baseY; // Start at first staff line\n const hitAreaHeight = staffHeight;\n\n const renderDot = () => {\n if (!dotted) return null;\n const dotX = finalX + fontSize * 0.4;\n const dotY = restY - CONFIG.lineHeight / 2;\n return (\n <text\n x={dotX}\n y={dotY}\n fontFamily={BRAVURA_FONT}\n fontSize={fontSize}\n textAnchor=\"start\"\n fill={color}\n style={{ userSelect: 'none' }}\n >\n {DOTS.augmentationDot}\n </text>\n );\n };\n\n return (\n <g\n className=\"Rest rest-group\"\n data-selected={isSelected}\n data-testid={eventId ? `rest-${eventId}` : undefined}\n style={{ opacity: isGhost ? 0.5 : 1 }}\n >\n {/* Invisible hit area for click detection and hover */}\n {onClick && (\n <rect\n x={finalX - hitAreaWidth / 2}\n y={hitAreaTop}\n width={hitAreaWidth}\n height={hitAreaHeight}\n fill=\"white\"\n fillOpacity={0.01}\n style={{ cursor: 'pointer' }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n )}\n\n {/* Rest glyph */}\n <text\n x={finalX}\n y={restY}\n fontFamily={BRAVURA_FONT}\n fontSize={fontSize}\n textAnchor=\"middle\"\n fill={color}\n style={{ userSelect: 'none', pointerEvents: 'none' }}\n >\n {glyph}\n </text>\n {renderDot()}\n </g>\n );\n};\n","import React from 'react';\nimport { Rest } from './Rest';\nimport ChordGroup from './ChordGroup';\nimport { NOTE_TYPES } from '@/constants';\n\ninterface GhostPreviewProps {\n previewRender: {\n chordNotes: any[];\n quant: number;\n x: number;\n chordLayout: any;\n };\n previewNote: {\n duration: string;\n dotted: boolean;\n mode: string;\n isRest?: boolean;\n };\n baseY: number;\n layout: any;\n interaction: any;\n measureIndex: number;\n}\n\n/**\n * Renders the ghost preview for note/rest entry.\n * Shows a semi-transparent preview of what will be created on click.\n */\nconst GhostPreview: React.FC<GhostPreviewProps> = ({\n previewRender,\n previewNote,\n baseY,\n layout,\n interaction,\n measureIndex,\n}) => {\n const { chordNotes, quant, x, chordLayout } = previewRender;\n\n // Render rest preview when in REST mode\n if (previewNote?.isRest) {\n return (\n <Rest\n duration={previewNote.duration}\n dotted={previewNote.dotted}\n x={x}\n baseY={baseY}\n isGhost={true}\n />\n );\n }\n\n // Normal note preview\n const shouldDrawStem = NOTE_TYPES[previewNote.duration]?.stem && previewNote.mode !== 'CHORD';\n\n return (\n <ChordGroup\n notes={chordNotes}\n duration={previewNote.duration}\n dotted={previewNote.dotted}\n eventId=\"preview\"\n x={x}\n chordLayout={chordLayout}\n isGhost={true}\n layout={layout}\n interaction={interaction}\n measureIndex={measureIndex}\n opacity={0.5}\n renderStem={shouldDrawStem}\n />\n );\n};\n\nexport default GhostPreview;\n","// @ts-nocheck\nimport { useTheme } from '@/context/ThemeContext';\nimport { BEAMING } from '@/constants';\n\n/**\n * Renders a beam connecting multiple notes.\n * Handles primary and secondary beams (for 16th notes etc).\n * @param startX - Starting X coordinate\n * @param endX - Ending X coordinate\n * @param startY - Starting Y coordinate\n * @param endY - Ending Y coordinate\n * @param type - Duration type (determines number of beams)\n * @param direction - Stem direction (affects secondary beam offset)\n */\nconst Beam = ({ beam, color }) => {\n const { startX, endX, startY, endY, type, direction } = beam;\n const { theme } = useTheme();\n\n const renderBeam = (y1, y2, key, thickness = 5) => {\n // To get vertical ends, we draw a polygon.\n // Top-Left: (startX, y1)\n // Top-Right: (endX, y2)\n // Bottom-Right: (endX, y2 + thickness)\n // Bottom-Left: (startX, y1 + thickness)\n\n // Adjust for \"centered\" line logic if needed?\n // The previous <line> with strokeWidth draws centered on the path.\n // So top edge was y - width/2, bottom was y + width/2.\n // Let's replicate that centering to maintain position.\n\n const halfWidth = thickness / 2;\n\n const points = [\n `${startX},${y1 - halfWidth}`,\n `${endX},${y2 - halfWidth}`,\n `${endX},${y2 + halfWidth}`,\n `${startX},${y1 + halfWidth}`,\n ].join(' ');\n\n return <polygon key={key} points={points} fill={color || theme.score.note} />;\n };\n\n const paths = [];\n\n // Primary Beam (Outermost) - Standard Thickness\n paths.push(renderBeam(startY, endY, 'primary', BEAMING.THICKNESS));\n\n // Secondary Beams (Inner) - Same thickness\n const beamSpacing = BEAMING.SPACING;\n const innerBeamThickness = BEAMING.THICKNESS;\n\n const addBeam = (index) => {\n const offset = direction === 'up' ? index * beamSpacing : -(index * beamSpacing);\n paths.push(renderBeam(startY + offset, endY + offset, `beam-${index}`, innerBeamThickness));\n };\n\n if (['sixteenth', 'thirtysecond', 'sixtyfourth'].includes(type)) {\n addBeam(1); // 2nd beam\n }\n if (['thirtysecond', 'sixtyfourth'].includes(type)) {\n addBeam(2); // 3rd beam\n }\n if (type === 'sixtyfourth') {\n addBeam(3); // 4th beam\n }\n\n return <g className=\"beam-group\">{paths}</g>;\n};\n\nexport default Beam;\n","import React from 'react';\nimport { useTheme } from '@/context/ThemeContext';\nimport { TUPLET } from '@/constants';\n\ninterface TupletBracketProps {\n startX: number;\n endX: number;\n startY: number; // Y position at start\n endY: number; // Y position at end\n number: number; // e.g., 3, 5, 7\n direction: 'up' | 'down';\n}\n\n/**\n * Renders a tuplet bracket with number above or below a group of notes.\n * Shows visual grouping for triplets, quintuplets, etc.\n * Supports slanted brackets to follow musical contour.\n */\nconst TupletBracket: React.FC<TupletBracketProps> = ({\n startX,\n endX,\n startY,\n endY,\n number,\n direction,\n}) => {\n const { theme } = useTheme();\n\n const bracketHeight = TUPLET.HOOK_HEIGHT;\n const numberFontSize = TUPLET.NUMBER_FONT_SIZE;\n\n // Draw bracket as a path\n // Up: |---|\n // 3\n // Down: 3\n // |---|\n\n const hookLength = direction === 'up' ? bracketHeight : -bracketHeight;\n\n // Calculate path with slope\n const path = `\n M ${startX} ${startY + hookLength}\n L ${startX} ${startY}\n L ${endX} ${endY}\n L ${endX} ${endY + hookLength}\n `;\n\n const centerX = (startX + endX) / 2;\n const centerY = (startY + endY) / 2;\n\n // Position text relative to the center of the bracket line\n const textY =\n direction === 'up' ? centerY + TUPLET.NUMBER_OFFSET_UP : centerY + TUPLET.NUMBER_OFFSET_DOWN;\n\n return (\n <g className=\"tuplet-bracket\">\n {/* Bracket line */}\n <path d={path} stroke={theme.score.note} strokeWidth=\"1\" fill=\"none\" />\n\n {/* Number label */}\n <text\n x={centerX}\n y={textY}\n textAnchor=\"middle\"\n fontSize={numberFontSize}\n fontWeight=\"bold\"\n fontStyle=\"italic\"\n fill={theme.score.note}\n >\n {number}\n </text>\n </g>\n );\n};\n\nexport default TupletBracket;\n","// @ts-nocheck\nimport React, { useMemo } from 'react';\nimport { CONFIG } from '@/config';\nimport { useTheme } from '@/context/ThemeContext';\nimport { getFirstNoteId } from '@/utils/core';\nimport { isRestSelected, isBeamGroupSelected } from '@/utils/selection';\nimport { useAccidentalContext } from '@/hooks/useAccidentalContext';\nimport { useMeasureLayout } from '@/hooks/useMeasureLayout';\nimport { useMeasureInteraction } from '@/hooks/useMeasureInteraction';\nimport { usePreviewRender } from '@/hooks/usePreviewRender';\nimport { MeasureProps } from '../../componentTypes';\n\n// Components\nimport ChordGroup from './ChordGroup';\nimport GhostPreview from './GhostPreview';\nimport { Rest } from './Rest';\nimport Beam from './Beam';\nimport TupletBracket from './TupletBracket';\n\n// --- Sub-Components (Visual Helpers) ---\n\nconst StaffLines = ({ width, theme, baseY }) => (\n <g className=\"staff-lines\" style={{ pointerEvents: 'none' }}>\n {[0, 1, 2, 3, 4].map((i) => (\n <line\n key={`staff-${i}`}\n x1={0}\n y1={baseY + i * CONFIG.lineHeight}\n x2={width}\n y2={baseY + i * CONFIG.lineHeight}\n stroke={theme.score.line}\n strokeWidth={1}\n />\n ))}\n </g>\n);\n\nconst MeasureBarLine = ({ x, baseY, isLast, theme }) => (\n <line\n x1={x}\n y1={baseY}\n x2={x}\n y2={baseY + CONFIG.lineHeight * 4}\n stroke={theme.score.line}\n strokeWidth={isLast ? 3 : 1}\n />\n);\n\n// --- Main Component ---\n\nconst Measure: React.FC<MeasureProps> = ({\n measureData,\n measureIndex,\n startX,\n isLast,\n forcedWidth,\n forcedEventPositions,\n layout,\n interaction,\n}) => {\n const { theme } = useTheme();\n const { events } = measureData;\n const { scale, baseY, clef, keySignature } = layout;\n const { selection, previewNote, activeDuration, onAddNote, onHover } = interaction;\n\n // 1. Layout & Physics\n const {\n hitZones,\n eventPositions,\n totalWidth,\n effectiveWidth,\n centeredEvents,\n beamGroups,\n tupletGroups,\n } = useMeasureLayout(events, clef, measureData.isPickup, forcedEventPositions, forcedWidth);\n\n // 2. Accidental Logic\n const accidentalOverrides = useAccidentalContext(events, keySignature);\n\n // 3. Interaction Handlers\n const {\n handleMeasureMouseMove,\n handleMeasureMouseLeave,\n handleMeasureClick,\n cursorStyle,\n isNoteHovered,\n setIsNoteHovered,\n } = useMeasureInteraction({\n hitZones,\n clef,\n scale,\n baseY: layout.baseY,\n topMargin: CONFIG.topMargin,\n mouseLimits: layout.mouseLimits,\n measureIndex,\n isLast,\n activeDuration,\n previewNote,\n selection,\n onHover,\n onAddNote,\n });\n\n // 4. Ghost Note Logic\n const previewRender = usePreviewRender({\n previewNote,\n events,\n measureIndex,\n isLast,\n clef,\n hitZones,\n eventPositions,\n totalWidth,\n selectedNotes: selection.selectedNotes,\n });\n\n // 5. Data Preparation\n const beamMap = useMemo(() => {\n const map = {};\n beamGroups.forEach((group) => {\n group.ids.forEach((id) => {\n map[id] = group;\n });\n });\n return map;\n }, [beamGroups]);\n\n return (\n <g className=\"Measure\" transform={`translate(${startX}, 0)`}>\n {/* LAYER 1: Background & Hit Area */}\n <rect\n data-testid={`measure-hit-area-${layout.staffIndex}-${measureIndex}`}\n x={0}\n y={baseY - 50}\n width={effectiveWidth}\n height={CONFIG.lineHeight * 12}\n fill=\"transparent\"\n style={{ cursor: cursorStyle }}\n onClick={handleMeasureClick}\n onMouseMove={handleMeasureMouseMove}\n onMouseLeave={handleMeasureMouseLeave}\n />\n <StaffLines width={effectiveWidth} theme={theme} baseY={baseY} />\n\n {/* LAYER 2: Musical Content */}\n {centeredEvents.map((event) => {\n if (event.isRest) {\n const isPlaceholder = event.id === 'rest-placeholder';\n const isSelected = isRestSelected(selection, event, measureIndex, layout.staffIndex);\n\n return (\n <Rest\n key={event.id}\n {...event}\n baseY={baseY}\n isSelected={isSelected}\n eventId={event.id}\n onClick={\n isPlaceholder\n ? undefined\n : (e) => {\n e.stopPropagation();\n interaction.onSelectNote(\n measureIndex,\n event.id,\n getFirstNoteId(event),\n layout.staffIndex,\n e.metaKey || e.ctrlKey\n );\n }\n }\n />\n );\n }\n\n return (\n <ChordGroup\n key={event.id}\n {...event}\n eventId={event.id}\n beamSpec={beamMap[event.id]}\n layout={layout}\n interaction={interaction}\n measureIndex={measureIndex}\n onNoteHover={setIsNoteHovered}\n accidentalOverrides={accidentalOverrides}\n isGhost={false}\n />\n );\n })}\n\n {/* LAYER 3: Beams & Tuplets */}\n {beamGroups.map((beam, idx) => {\n // Check if entire beam group is in lasso preview (all notes must be in preview)\n const isBeamInLassoPreview =\n interaction.lassoPreviewIds?.size > 0 &&\n beam.ids.every((eventId) => {\n const ev = events.find((e) => e.id === eventId);\n if (!ev?.notes) return false;\n return ev.notes.every((n) => {\n const noteKey = `${layout.staffIndex}-${measureIndex}-${eventId}-${n.id}`;\n return interaction.lassoPreviewIds?.has(noteKey);\n });\n });\n\n const beamColor =\n isBeamGroupSelected(selection, beam, events, measureIndex) || isBeamInLassoPreview\n ? theme.accent\n : theme.score.note;\n\n return <Beam key={`beam-${idx}`} beam={beam} color={beamColor} />;\n })}\n\n {tupletGroups.map((tuplet, idx) => (\n <TupletBracket\n key={`tuplet-${idx}`}\n group={tuplet}\n baseY={baseY}\n staffHeight={CONFIG.lineHeight * 4}\n theme={theme}\n />\n ))}\n\n <MeasureBarLine x={effectiveWidth} baseY={baseY} isLast={isLast} theme={theme} />\n\n {/* LAYER 4: Interface Overlay (Ghosts) */}\n {previewRender && !isNoteHovered && previewNote && (\n <g style={{ pointerEvents: 'none' }}>\n <GhostPreview\n previewRender={previewRender}\n previewNote={previewNote}\n baseY={baseY}\n layout={layout}\n interaction={interaction}\n measureIndex={measureIndex}\n />\n </g>\n )}\n </g>\n );\n};\n\nexport default Measure;\n","import React from 'react';\nimport { TIE } from '@/constants';\n\ninterface TieProps {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n direction: 'up' | 'down';\n color?: string; // Optional color override\n}\n\nconst Tie: React.FC<TieProps> = ({ startX, startY, endX, endY, direction, color = 'black' }) => {\n const dirMult = direction === 'up' ? -1 : 1;\n\n // 1. Add Gaps (Padding)\n const sX = startX + TIE.START_GAP;\n const eX = endX - TIE.END_GAP;\n\n // 2. Add Vertical Offset\n const sY = startY + TIE.VERTICAL_OFFSET * dirMult;\n const eY = endY + TIE.VERTICAL_OFFSET * dirMult;\n\n const width = eX - sX;\n if (width <= 0) return null; // Too short\n\n // 3. Calculate Height and Thickness\n const height = Math.min(25, Math.max(12, width * 0.2));\n const midThickness = TIE.MID_THICKNESS;\n const tipThickness = TIE.TIP_THICKNESS;\n\n // 4. Control Points\n // Outer Curve Control Point\n const cpX = sX + width / 2;\n const cpY_Outer = sY + height * dirMult;\n\n // Inner Curve Control Point\n // Slightly less height to create the crescent\n const cpY_Inner = sY + (height - midThickness) * dirMult;\n\n // 5. Construct Path with Blunt Ends\n // We need 4 points for the tips to create thickness\n // Start Tip: (sX, sY) to (sX, sY + tipThickness * dirMult) (conceptually, but we want it centered or offset?)\n // Let's assume sY is the \"inner\" side (closer to note) or \"outer\"?\n // sY is calculated from noteY + offset. So it's the start point closest to the note.\n // So the outer curve should start at sY + tipThickness? No, that would make it further.\n // Let's make sY the point closest to the note (Inner).\n // Actually, standard ties usually have the points on the same horizontal line (relative to staff),\n // and the curve goes away.\n\n // Let's define:\n // P1_Inner = (sX, sY)\n // P1_Outer = (sX, sY + tipThickness * dirMult) -- This moves \"outward\" (away from note)\n\n // But wait, if direction is UP (-1), adding (tip * -1) moves UP (away from note). Correct.\n // If direction is DOWN (1), adding (tip * 1) moves DOWN (away from note). Correct.\n\n const P1_Inner_Y = sY;\n const P1_Outer_Y = sY + tipThickness * dirMult;\n\n const P2_Inner_Y = eY;\n const P2_Outer_Y = eY + tipThickness * dirMult;\n\n // Path:\n // Move to Start Inner\n // Line to Start Outer\n // Quad to End Outer\n // Line to End Inner\n // Quad to Start Inner\n\n const path = `\n M ${sX} ${P1_Inner_Y}\n L ${sX} ${P1_Outer_Y}\n Q ${cpX} ${cpY_Outer} ${eX} ${P2_Outer_Y}\n L ${eX} ${P2_Inner_Y}\n Q ${cpX} ${cpY_Inner} ${sX} ${P1_Inner_Y}\n Z\n `;\n\n return <path d={path} fill={color} stroke=\"none\" />;\n};\n\nexport default Tie;\n","import React from 'react';\nimport { KEY_SIGNATURES, KEY_SIGNATURE_OFFSETS, KeySignatureOffsets } from '@/constants';\nimport { CONFIG } from '@/config';\nimport { useTheme } from '@/context/ThemeContext';\nimport { calculateHeaderLayout, HEADER_CONSTANTS } from '@/engines/layout';\nimport { ACCIDENTALS, CLEFS, TIME_SIG_DIGITS, BRAVURA_FONT, getFontSize } from '@/constants/SMuFL';\n\ninterface ScoreHeaderProps {\n clef: string;\n keySignature: string;\n timeSignature: string;\n baseY?: number; // Y position for this staff\n onClefClick: (e: React.MouseEvent) => void;\n onKeySigClick: (e: React.MouseEvent) => void;\n onTimeSigClick: (e: React.MouseEvent) => void;\n}\n\nconst ScoreHeader: React.FC<ScoreHeaderProps> = ({\n clef,\n keySignature,\n timeSignature,\n baseY = CONFIG.baseY,\n onClefClick,\n onKeySigClick,\n onTimeSigClick,\n}) => {\n const { theme } = useTheme();\n\n // Use centralized layout calculation (SSOT)\n const headerLayout = calculateHeaderLayout(keySignature);\n const { keySigStartX, keySigVisualWidth, timeSigStartX, startOfMeasures } = headerLayout;\n const { KEY_SIG_ACCIDENTAL_WIDTH, TIME_SIG_WIDTH } = HEADER_CONSTANTS;\n\n const CLEF_WIDTH = 40;\n\n return (\n <g className=\"ScoreHeader\">\n {/* Staff Lines for Clef Area - Extended to start of measures */}\n {[0, 1, 2, 3, 4].map((i) => (\n <line\n key={`staff-head-${i}`}\n x1={0}\n y1={baseY + i * CONFIG.lineHeight}\n x2={startOfMeasures}\n y2={baseY + i * CONFIG.lineHeight}\n stroke={theme.score.line}\n strokeWidth=\"1\"\n />\n ))}\n <line\n x1={0}\n y1={baseY}\n x2={0}\n y2={baseY + CONFIG.lineHeight * 4}\n stroke={theme.secondaryText}\n strokeWidth=\"1\"\n />\n\n {/* Clef - clickable */}\n <g onClick={onClefClick} style={{ cursor: 'pointer' }} data-testid={`clef-${clef}`}>\n <rect x=\"-5\" y={baseY - 25} width={CLEF_WIDTH} height=\"100\" fill=\"transparent\" />\n <text\n x={12}\n y={clef === 'treble' ? baseY + CONFIG.lineHeight * 3 : baseY + CONFIG.lineHeight}\n fontFamily={BRAVURA_FONT}\n fontSize={getFontSize(CONFIG.lineHeight)}\n fill={theme.score.fill}\n textAnchor=\"start\"\n >\n {clef === 'treble' ? CLEFS.gClef : CLEFS.fClef}\n </text>\n </g>\n\n {/* Key Signature */}\n <g\n onClick={onKeySigClick}\n style={{ cursor: 'pointer', userSelect: 'none' }}\n data-testid={`keysig-${keySignature}`}\n >\n <rect\n x={keySigStartX}\n y={baseY - 20}\n width={Math.max(20, keySigVisualWidth)}\n height=\"80\"\n fill=\"transparent\"\n />\n {KEY_SIGNATURES[keySignature]?.accidentals.map((acc, i) => {\n const type = KEY_SIGNATURES[keySignature].type;\n // Cast clef to ensure it matches KeySignatureOffsets keys\n const validClef =\n clef in KEY_SIGNATURE_OFFSETS ? (clef as keyof KeySignatureOffsets) : 'treble';\n const offset = KEY_SIGNATURE_OFFSETS[validClef][type][acc];\n const x = keySigStartX + 5 + i * KEY_SIG_ACCIDENTAL_WIDTH;\n const y = baseY + offset;\n\n return (\n <text\n key={i}\n x={x}\n y={y}\n fontSize={getFontSize(CONFIG.lineHeight)}\n fontFamily={BRAVURA_FONT}\n fill={theme.score.fill}\n >\n {type === 'sharp' ? ACCIDENTALS.sharp : ACCIDENTALS.flat}\n </text>\n );\n })}\n </g>\n\n {/* Time Signature */}\n <g onClick={onTimeSigClick} style={{ cursor: 'pointer', userSelect: 'none' }}>\n <rect x={timeSigStartX} y={baseY} width={TIME_SIG_WIDTH} height=\"48\" fill=\"transparent\" />\n <text\n x={timeSigStartX + 15}\n y={baseY + CONFIG.lineHeight}\n fontSize={getFontSize(CONFIG.lineHeight)}\n fontFamily={BRAVURA_FONT}\n textAnchor=\"middle\"\n fill={theme.text}\n >\n {TIME_SIG_DIGITS[timeSignature.split('/')[0] as keyof typeof TIME_SIG_DIGITS]}\n </text>\n <text\n x={timeSigStartX + 15}\n y={baseY + CONFIG.lineHeight * 3}\n fontSize={getFontSize(CONFIG.lineHeight)}\n fontFamily={BRAVURA_FONT}\n textAnchor=\"middle\"\n fill={theme.text}\n >\n {TIME_SIG_DIGITS[timeSignature.split('/')[1] as keyof typeof TIME_SIG_DIGITS]}\n </text>\n </g>\n </g>\n );\n};\n\nexport default ScoreHeader;\n","import React from 'react';\nimport { CONFIG } from '@/config';\nimport { useTheme } from '@/context/ThemeContext';\nimport {\n calculateMeasureWidth,\n calculateMeasureLayout,\n getOffsetForPitch,\n calculateHeaderLayout,\n} from '@/engines/layout';\nimport { getNoteDuration } from '@/utils/core';\nimport { isNoteSelected } from '@/utils/selection';\nimport Measure from './Measure';\nimport Tie from './Tie';\nimport ScoreHeader from './ScoreHeader';\n\nimport { InteractionState } from '../../componentTypes';\nimport { Measure as MeasureData } from '@/types';\n\n/**\n * Props for a self-contained Staff component.\n * Each Staff is independent and can be stacked for Grand Staff.\n */\nexport interface StaffProps {\n // Staff-specific data\n staffIndex: number; // Index of this staff in the score\n clef: string;\n keySignature: string;\n timeSignature: string;\n measures: MeasureData[];\n\n // Layout\n baseY?: number; // Y offset for stacking staves (default: CONFIG.baseY)\n measureLayouts?: { width: number; forcedPositions: Record<number, number> }[]; // Synchronized layouts\n scale: number;\n\n // Interaction (Grouped)\n interaction: InteractionState;\n\n // Playback\n playbackPosition: { measureIndex: number | null; quant: number | null; duration: number };\n hidePlaybackCursor?: boolean; // Hide cursor when rendered by parent (Grand Staff)\n mouseLimits?: { min: number; max: number }; // For Grand Staff clamping\n\n // Header click callbacks (Panel/Menu interactions)\n onClefClick?: () => void;\n onKeySigClick?: () => void;\n onTimeSigClick?: () => void;\n}\n\n/**\n * A self-contained Staff component that renders a single staff with:\n * - Header (clef, key signature, time signature)\n * - Measures with notes\n * - Ties between notes\n *\n * Designed to be stacked for Grand Staff support.\n */\nconst Staff: React.FC<StaffProps> = ({\n staffIndex,\n clef,\n keySignature,\n timeSignature,\n measures,\n baseY = CONFIG.baseY,\n measureLayouts,\n scale,\n interaction,\n playbackPosition,\n hidePlaybackCursor = false,\n mouseLimits,\n onClefClick,\n onKeySigClick,\n onTimeSigClick,\n}) => {\n const { theme } = useTheme();\n\n // Calculate vertical offset for this staff relative to the standard position\n // This is used for the SVG transform and passed to children for hit detection\n const verticalOffset = baseY - CONFIG.baseY;\n\n // Use centralized layout calculation (SSOT)\n const { startOfMeasures } = calculateHeaderLayout(keySignature);\n\n // Calculate measure positions and render\n let currentX = startOfMeasures;\n\n const measureComponents = measures.map((measure, index: number) => {\n // Use synchronized layout if available, otherwise calculate\n const layoutData = measureLayouts?.[index];\n const width = layoutData\n ? layoutData.width\n : calculateMeasureWidth(measure.events, measure.isPickup);\n const forcedPositions = layoutData?.forcedPositions;\n\n // Only show preview note if it belongs to this staff\n // We create a DERIVED InteractionState for this scope\n const staffPreviewNote =\n interaction.previewNote && interaction.previewNote.staffIndex === staffIndex\n ? interaction.previewNote\n : null;\n\n const scopedInteraction = {\n ...interaction,\n previewNote: staffPreviewNote,\n };\n\n const component = (\n <Measure\n key={measure.id}\n startX={currentX}\n measureIndex={index}\n measureData={measure}\n isLast={index === measures.length - 1}\n forcedWidth={width}\n forcedEventPositions={forcedPositions}\n layout={{\n scale,\n baseY: CONFIG.baseY,\n clef,\n keySignature,\n staffIndex,\n verticalOffset: 0, // Staff is at 0 relative to itself (positioned by parent)\n mouseLimits, // Pass clamping limits\n }}\n interaction={scopedInteraction}\n />\n );\n currentX += width;\n return component;\n });\n\n // Calculate total width for this staff\n const totalWidth = currentX + 50;\n\n // Render ties between notes\n const renderTies = () => {\n const ties: React.ReactElement[] = [];\n const { startOfMeasures: tieStartX } = calculateHeaderLayout(keySignature);\n\n let currentMeasureX = tieStartX;\n const allNotes: any[] = [];\n\n measures.forEach((measure, mIndex: number) => {\n const layout = calculateMeasureLayout(measure.events, undefined, clef, false);\n measure.events.forEach((event, eIndex: number) => {\n const eventX = currentMeasureX + layout.eventPositions[event.id];\n event.notes.forEach((note: any, nIndex: number) => {\n // Skip rest notes (which have null pitch) - they can't have ties\n if (note.pitch === null) return;\n\n allNotes.push({\n measureIndex: mIndex,\n eventIndex: eIndex,\n noteIndex: nIndex,\n pitch: note.pitch,\n tied: note.tied,\n x: eventX,\n y: CONFIG.baseY + getOffsetForPitch(note.pitch, clef), // Use CONFIG.baseY for normalized coords\n id: note.id,\n });\n });\n });\n currentMeasureX += layout.totalWidth;\n });\n\n allNotes.forEach((note) => {\n if (note.tied) {\n let nextNote = null;\n\n // Check Selection using global staffIndex\n const eventId = measures[note.measureIndex]?.events[note.eventIndex]?.id;\n const isSelected = isNoteSelected(interaction.selection, {\n staffIndex, // Staff prop\n measureIndex: note.measureIndex,\n eventId,\n noteId: note.id,\n });\n\n // Use accent color if selected\n // Important: Use theme.score.note as default instead of hardcoded 'black'\n const tieColor = isSelected ? theme.accent : theme.score.note;\n\n let targetMIndex = note.measureIndex;\n let targetEIndex = note.eventIndex + 1;\n\n // Handle measure overflow\n if (targetEIndex >= measures[targetMIndex].events.length) {\n targetMIndex++;\n targetEIndex = 0;\n }\n\n // Check if valid event exists\n if (targetMIndex < measures.length && targetEIndex < measures[targetMIndex].events.length) {\n nextNote = allNotes.find(\n (n) =>\n n.measureIndex === targetMIndex &&\n n.eventIndex === targetEIndex &&\n n.pitch === note.pitch\n );\n }\n\n const direction = getOffsetForPitch(note.pitch, clef) > 24 ? 'down' : 'up';\n\n if (nextNote) {\n ties.push(\n <Tie\n key={`tie-${note.id}`}\n startX={note.x + 10}\n startY={note.y}\n endX={nextNote.x}\n endY={nextNote.y}\n direction={direction}\n color={tieColor}\n />\n );\n } else {\n // Hanging Tie\n ties.push(\n <Tie\n key={`tie-hanging-${note.id}`}\n startX={note.x + 10}\n startY={note.y}\n endX={note.x + 35}\n endY={note.y}\n direction={direction}\n color={tieColor}\n />\n );\n }\n }\n });\n\n return ties;\n };\n\n // Calculate playback cursor X position for this staff\n const playbackCursorX = React.useMemo(() => {\n if (playbackPosition.measureIndex === null || playbackPosition.quant === null) {\n return null;\n }\n\n const { startOfMeasures: cursorStartX } = calculateHeaderLayout(keySignature);\n\n let absX = cursorStartX;\n\n for (let i = 0; i < playbackPosition.measureIndex; i++) {\n if (measures[i]) {\n absX += calculateMeasureWidth(measures[i].events, measures[i].isPickup);\n }\n }\n\n // Find event corresponding to the current quant\n const measure = measures[playbackPosition.measureIndex];\n if (measure) {\n const layout = calculateMeasureLayout(measure.events, undefined, clef, false);\n const targetQuant = playbackPosition.quant;\n\n // Find event covering this quant\n // Note: layout.processedEvents includes x and quant\n const targetEvent = layout.processedEvents.find((e: any) => {\n const dur = getNoteDuration(e.duration, e.dotted, e.tuplet);\n return e.quant <= targetQuant && e.quant + dur > targetQuant;\n });\n\n if (targetEvent) {\n absX += (targetEvent as any).x;\n } else {\n // If no note found at this quant (e.g. within a rest or beyond), use fallback\n // Try to find closest previous event? Or just use padding if at start.\n absX += CONFIG.measurePaddingLeft;\n }\n }\n\n return absX;\n }, [playbackPosition, measures, keySignature, clef]);\n\n return (\n <g className=\"staff\" transform={`translate(0, ${verticalOffset})`}>\n {/* Staff Header (Clef, Key Sig, Time Sig) */}\n <ScoreHeader\n clef={clef}\n keySignature={keySignature}\n timeSignature={timeSignature}\n baseY={CONFIG.baseY} // Use normalized baseY\n onClefClick={(e) => {\n e.stopPropagation();\n if (onClefClick) onClefClick();\n }}\n onKeySigClick={(e) => {\n e.stopPropagation();\n if (onKeySigClick) onKeySigClick();\n }}\n onTimeSigClick={(e) => {\n e.stopPropagation();\n if (onTimeSigClick) onTimeSigClick();\n }}\n />\n\n {/* Measures */}\n {measureComponents}\n\n {/* Ties */}\n {renderTies()}\n\n {/* Playback Cursor */}\n {!hidePlaybackCursor && playbackCursorX !== null && (\n <g\n style={{\n transform: `translateX(${playbackCursorX}px)`,\n transition: `transform ${playbackPosition.duration || 0.1}s linear`,\n pointerEvents: 'none',\n }}\n >\n <line\n x1={0}\n y1={CONFIG.baseY - 20}\n x2={0}\n y2={CONFIG.baseY + CONFIG.lineHeight * 4 + 20}\n stroke={theme.accent}\n strokeWidth=\"3\"\n opacity=\"0.8\"\n />\n </g>\n )}\n </g>\n );\n};\n\n// Export totalWidth calculation for parent container sizing\nexport const calculateStaffWidth = (measures: MeasureData[], keySignature: string): number => {\n const { startOfMeasures } = calculateHeaderLayout(keySignature);\n let width = startOfMeasures;\n measures.forEach((measure) => {\n width += calculateMeasureWidth(measure.events, measure.isPickup);\n });\n return width + 50;\n};\n\nexport default Staff;\n","import { useEffect, useCallback, useMemo, useRef } from 'react';\nimport { CONFIG } from '@/config';\nimport {\n calculateMeasureWidth,\n calculateMeasureLayout,\n calculateHeaderLayout,\n} from '@/engines/layout';\nimport { getActiveStaff, Score, Selection } from '@/types';\nimport { getNoteDuration } from '@/utils/core';\n\n// ------------------------------------------------------------------\n// Types & Interfaces\n// ------------------------------------------------------------------\n\ninterface PreviewNote {\n source?: 'hover' | 'keyboard' | string;\n measureIndex: number | null;\n mode: 'APPEND' | 'INSERT';\n index: number;\n}\n\ninterface UseAutoScrollProps {\n containerRef: React.RefObject<HTMLDivElement | null>;\n score: Score;\n selection: Selection;\n playbackPosition: { measureIndex: number | null; quant: number | null; duration: number };\n previewNote: PreviewNote | null;\n scale: number;\n}\n\ntype ScrollStrategy = 'scroll-to-start' | 'keep-in-view';\n\n// ------------------------------------------------------------------\n// Hook Implementation\n// ------------------------------------------------------------------\n\nexport const useAutoScroll = ({\n containerRef,\n score,\n selection,\n playbackPosition,\n previewNote,\n scale,\n}: UseAutoScrollProps) => {\n // 1. Memoize Derived Data\n const activeStaff = useMemo(() => getActiveStaff(score), [score]);\n\n const keySignature = useMemo(\n () => score.keySignature || activeStaff.keySignature || 'C',\n [score.keySignature, activeStaff.keySignature]\n );\n\n const clef = useMemo(\n () => (score.staves.length >= 2 ? 'grand' : activeStaff.clef || 'treble'),\n [score.staves.length, activeStaff.clef]\n );\n\n // 2. Measure Start X Cache (O(1) lookup during playback)\n // Cache invalidates when measures or keySignature changes\n const measureStartXCache = useMemo(() => {\n const { startOfMeasures } = calculateHeaderLayout(keySignature);\n const cache = [startOfMeasures];\n let x = startOfMeasures;\n\n for (const measure of activeStaff.measures || []) {\n x += calculateMeasureWidth(measure.events, measure.isPickup);\n cache.push(x);\n }\n return cache;\n }, [activeStaff.measures, keySignature]);\n\n // 3. Helper: Calculate Layout for a specific measure\n // Performance Note: If playback stutters on large scores (300+ measures) or\n // many instruments, consider pre-computing all measure layouts into a memoized\n // cache (like measureStartXCache) rather than calculating on each lookup.\n const getMeasureData = useCallback(\n (measureIndex: number) => {\n const measure = activeStaff.measures[measureIndex];\n if (!measure) return null;\n\n const layout = calculateMeasureLayout(measure.events, undefined, clef);\n const startX = measureStartXCache[measureIndex] ?? measureStartXCache[0] ?? 0;\n\n return { measure, layout, startX };\n },\n [activeStaff.measures, clef, measureStartXCache]\n );\n\n // 4. Unified Scroll Function\n const performScroll = useCallback(\n (targetX: number, strategy: ScrollStrategy) => {\n const container = containerRef.current;\n if (!container) return;\n\n const { scrollLeft, clientWidth } = container;\n const scaledTargetX = targetX * scale;\n const padding = 100;\n\n let newScrollLeft: number | null = null;\n const rightEdge = scrollLeft + clientWidth - padding;\n const leftEdge = scrollLeft + padding;\n\n if (strategy === 'scroll-to-start') {\n // If target is OFF SCREEN, bring it to the left edge\n if (scaledTargetX > rightEdge || scaledTargetX < leftEdge) {\n newScrollLeft = Math.max(0, scaledTargetX - padding);\n }\n } else {\n // 'keep-in-view'\n if (scaledTargetX > rightEdge) {\n newScrollLeft = scaledTargetX - clientWidth + padding + 200;\n } else if (scaledTargetX < leftEdge) {\n newScrollLeft = Math.max(0, scaledTargetX - padding - 100);\n }\n }\n\n if (newScrollLeft !== null) {\n container.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\n }\n },\n [containerRef, scale]\n );\n\n // ------------------------------------------------------------------\n // Effects\n // ------------------------------------------------------------------\n\n // Effect: Handle Selection\n useEffect(() => {\n if (selection.measureIndex === null || !selection.eventId) return;\n\n const data = getMeasureData(selection.measureIndex);\n if (!data) return;\n\n const eventOffset = data.layout.eventPositions[selection.eventId] || 0;\n performScroll(data.startX + eventOffset, 'keep-in-view');\n }, [selection.measureIndex, selection.eventId, getMeasureData, performScroll]);\n\n // Effect: Handle Preview (Keyboard only)\n useEffect(() => {\n if (!previewNote || previewNote.source === 'hover' || previewNote.measureIndex === null) return;\n\n const data = getMeasureData(previewNote.measureIndex);\n if (!data) return;\n\n let localOffsetX = CONFIG.measurePaddingLeft;\n\n if (previewNote.mode === 'APPEND') {\n localOffsetX = data.layout.totalWidth - CONFIG.measurePaddingRight;\n } else if (previewNote.mode === 'INSERT' && previewNote.index > 0) {\n const prevEvent = data.measure.events[previewNote.index - 1];\n const GAP_SPACING = 30;\n localOffsetX = (data.layout.eventPositions[prevEvent?.id] || 0) + GAP_SPACING;\n }\n\n performScroll(data.startX + localOffsetX, 'keep-in-view');\n }, [previewNote, getMeasureData, performScroll]);\n\n // Effect: Handle Playback\n const lastScrolledMeasureRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (playbackPosition.measureIndex === null || playbackPosition.quant === null) {\n lastScrolledMeasureRef.current = null;\n return;\n }\n\n const data = getMeasureData(playbackPosition.measureIndex);\n if (!data) return;\n\n // Find offset based on quant\n let localOffsetX = CONFIG.measurePaddingLeft;\n let currentQuant = 0;\n let found = false;\n\n for (const event of data.measure.events) {\n if (currentQuant >= playbackPosition.quant) {\n localOffsetX = data.layout.eventPositions[event.id] || CONFIG.measurePaddingLeft;\n found = true;\n break;\n }\n currentQuant += getNoteDuration(event.duration, event.dotted, event.tuplet);\n }\n\n if (!found && currentQuant < playbackPosition.quant) {\n localOffsetX = data.layout.totalWidth - CONFIG.measurePaddingRight;\n }\n\n performScroll(data.startX + localOffsetX, 'scroll-to-start');\n }, [playbackPosition, getMeasureData, performScroll]);\n};\n","import { useMemo } from 'react';\nimport { CONFIG } from '@/config';\nimport {\n calculateSystemLayout,\n calculateMeasureLayout,\n getNoteWidth,\n calculateHeaderLayout,\n calculateMeasureWidth,\n} from '@/engines/layout';\nimport { Score, getActiveStaff } from '@/types';\nimport { getNoteDuration } from '@/utils/core';\n\ninterface UseGrandStaffLayoutProps {\n score: Score;\n playbackPosition: { measureIndex: number | null; quant: number | null; duration: number };\n activeStaff: any; // Using activeStaff from ScoreCanvas for now\n keySignature: string;\n clef: string;\n}\n\nexport const useGrandStaffLayout = ({\n score,\n playbackPosition,\n activeStaff,\n keySignature,\n clef,\n}: UseGrandStaffLayoutProps) => {\n // Calculate synchronized measure layouts for Grand Staff\n const synchronizedLayoutData = useMemo(() => {\n if (!score.staves || score.staves.length <= 1) return undefined;\n\n const maxMeasures = Math.max(...score.staves.map((s: any) => s.measures?.length || 0));\n const layouts: { width: number; forcedPositions: Record<number, number> }[] = [];\n\n for (let i = 0; i < maxMeasures; i++) {\n const measuresAtIndices = score.staves\n .map((staff: any) => staff.measures?.[i])\n .filter(Boolean);\n\n if (measuresAtIndices.length > 0) {\n const forcedPositions = calculateSystemLayout(measuresAtIndices);\n const maxX = Math.max(...Object.values(forcedPositions));\n\n const isPickup = measuresAtIndices[0]?.isPickup;\n const minDuration = isPickup ? 'quarter' : 'whole';\n const minWidth =\n getNoteWidth(minDuration, false) + CONFIG.measurePaddingLeft + CONFIG.measurePaddingRight;\n\n const width = Math.max(maxX + CONFIG.measurePaddingRight, minWidth);\n\n layouts.push({ width, forcedPositions });\n } else {\n const minWidth =\n getNoteWidth('whole', false) + CONFIG.measurePaddingLeft + CONFIG.measurePaddingRight;\n layouts.push({ width: minWidth, forcedPositions: {} });\n }\n }\n return layouts;\n }, [score.staves]);\n\n const numStaves = score.staves?.length || 1;\n const isGrandStaff = numStaves > 1;\n\n const unifiedCursor = useMemo(() => {\n if (!isGrandStaff) return null;\n if (playbackPosition.measureIndex === null || playbackPosition.quant === null) return null; // Logic updated to use quant\n\n // Always use Staff 0 (Treble) as the reference for layout (shared layout)\n const referenceStaff = score.staves?.[0];\n if (!referenceStaff) return null;\n\n const { startOfMeasures } = calculateHeaderLayout(keySignature);\n let cursorX = startOfMeasures;\n let cursorWidth = 0;\n\n // 1. Add widths of previous measures\n if (synchronizedLayoutData) {\n for (let i = 0; i < playbackPosition.measureIndex; i++) {\n if (synchronizedLayoutData[i]) {\n cursorX += synchronizedLayoutData[i].width;\n }\n }\n } else {\n // Fallback\n for (let i = 0; i < playbackPosition.measureIndex; i++) {\n if (referenceStaff.measures && referenceStaff.measures[i]) {\n cursorX += calculateMeasureWidth(\n referenceStaff.measures[i].events,\n referenceStaff.measures[i].isPickup\n );\n }\n }\n }\n\n // 2. Calculate position within current measure using forcedPositions (Grid)\n const currentMeasureIndex = playbackPosition.measureIndex;\n const currentQuant = playbackPosition.quant;\n\n if (synchronizedLayoutData && synchronizedLayoutData[currentMeasureIndex]) {\n const forcedPositions = synchronizedLayoutData[currentMeasureIndex].forcedPositions;\n\n // Loop up exact position for this quant\n if (forcedPositions && currentQuant in forcedPositions) {\n cursorX += forcedPositions[currentQuant];\n\n // Calculate Width: Find next quant in the map\n // Get all keys, sort them, find currentQuant, find next.\n const sortedQuants = Object.keys(forcedPositions)\n .map(Number)\n .sort((a, b) => a - b);\n const idx = sortedQuants.indexOf(currentQuant);\n\n if (idx !== -1 && idx < sortedQuants.length - 1) {\n const nextQuant = sortedQuants[idx + 1];\n const nextX = forcedPositions[nextQuant];\n cursorWidth = nextX - forcedPositions[currentQuant];\n } else {\n // Last event/quant in layout: Width is Distance to End of Measure\n // Note: measure.width includes padding\n const measureWidth = synchronizedLayoutData[currentMeasureIndex].width;\n // forcedPositions[currentQuant] is where we are.\n // We slide to end? Or use a fallback default?\n // If we slide to end of measure, it's consistent for last note.\n cursorWidth = measureWidth - forcedPositions[currentQuant];\n\n // If resulting width is suspiciously large (e.g. whole rest logic), it's fine.\n // If width is negative (padding issues?), clamp it.\n cursorWidth = Math.max(cursorWidth, 20);\n }\n } else {\n // Quant not found in layout map? Should not happen if Audio Engine matches Layout.\n // Fallback to approximate\n cursorWidth = 20;\n }\n }\n\n return { x: cursorX, width: cursorWidth };\n }, [isGrandStaff, playbackPosition, score.staves, keySignature, synchronizedLayoutData, clef]);\n\n return {\n synchronizedLayoutData,\n unifiedCursorX: unifiedCursor?.x ?? null,\n unifiedCursorWidth: unifiedCursor?.width ?? 0,\n isGrandStaff,\n numStaves,\n };\n};\n","import { useState, useCallback, useEffect, useMemo, RefObject } from 'react';\n\ninterface DragSelectState {\n isDragging: boolean;\n startPoint: { x: number; y: number } | null;\n currentPoint: { x: number; y: number } | null;\n isAdditive: boolean; // CMD key held\n}\n\ninterface SelectedNote {\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n noteId: string | number | null;\n}\n\ninterface NotePosition {\n x: number;\n y: number;\n width: number;\n height: number;\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n noteId: string | number | null; // null for rests\n}\n\ninterface UseDragToSelectProps {\n svgRef: RefObject<SVGSVGElement | null>;\n notePositions: NotePosition[];\n onSelectionComplete: (notes: SelectedNote[], isAdditive: boolean) => void;\n onEmptyClick?: () => void; // Called when clicking empty space without dragging\n scale: number;\n enabled?: boolean;\n}\n\ninterface UseDragToSelectReturn {\n isDragging: boolean;\n justFinishedDrag: boolean; // True for a brief moment after drag ends, to prevent click from clearing selection\n selectionRect: { x: number; y: number; width: number; height: number } | null;\n previewNoteIds: Set<string>; // Composite keys for O(1) lookup: \"staffIndex-measureIndex-eventId-noteId\"\n handleMouseDown: (e: React.MouseEvent) => void;\n}\n\nexport const useDragToSelect = ({\n svgRef,\n notePositions,\n onSelectionComplete,\n scale,\n enabled = true,\n}: UseDragToSelectProps): UseDragToSelectReturn => {\n const [dragState, setDragState] = useState<DragSelectState>({\n isDragging: false,\n startPoint: null,\n currentPoint: null,\n isAdditive: false,\n });\n\n // Track if drag just finished to prevent click from clearing selection\n const [justFinishedDrag, setJustFinishedDrag] = useState(false);\n\n // Calculate selection rectangle from start and current points\n const selectionRect =\n dragState.isDragging && dragState.startPoint && dragState.currentPoint\n ? {\n x: Math.min(dragState.startPoint.x, dragState.currentPoint.x),\n y: Math.min(dragState.startPoint.y, dragState.currentPoint.y),\n width: Math.abs(dragState.currentPoint.x - dragState.startPoint.x),\n height: Math.abs(dragState.currentPoint.y - dragState.startPoint.y),\n }\n : null;\n\n // Check if a note intersects with the selection rectangle\n const noteIntersectsRect = useCallback(\n (note: NotePosition, rect: { x: number; y: number; width: number; height: number }) => {\n const noteRight = note.x + note.width;\n const noteBottom = note.y + note.height;\n const rectRight = rect.x + rect.width;\n const rectBottom = rect.y + rect.height;\n\n return !(\n note.x > rectRight ||\n noteRight < rect.x ||\n note.y > rectBottom ||\n noteBottom < rect.y\n );\n },\n []\n );\n\n // Get all notes that intersect the selection rectangle\n const getSelectedNotes = useCallback((): SelectedNote[] => {\n if (!selectionRect) return [];\n\n return notePositions\n .filter((note) => noteIntersectsRect(note, selectionRect))\n .map((note) => ({\n staffIndex: note.staffIndex,\n measureIndex: note.measureIndex,\n eventId: note.eventId,\n noteId: note.noteId,\n }));\n }, [selectionRect, notePositions, noteIntersectsRect]);\n\n // Compute preview note IDs as a Set for O(1) lookup during render\n const previewNoteIds = useMemo((): Set<string> => {\n if (!selectionRect) return new Set();\n\n return new Set(\n notePositions\n .filter((note) => noteIntersectsRect(note, selectionRect))\n .map((note) => `${note.staffIndex}-${note.measureIndex}-${note.eventId}-${note.noteId}`)\n );\n }, [selectionRect, notePositions, noteIntersectsRect]);\n\n // Start drag on mouseDown on empty space\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!enabled) return;\n\n // Only start if clicking on empty space (not on a note or other interactive element)\n const target = e.target as HTMLElement;\n if (target.closest('[data-note-hit-area]') || target.closest('[data-interactive]')) {\n return; // Clicked on a note, don't start drag selection\n }\n\n const svgElement = svgRef.current;\n if (!svgElement) return;\n\n const rect = svgElement.getBoundingClientRect();\n const x = (e.clientX - rect.left) / scale;\n const y = (e.clientY - rect.top) / scale;\n\n setDragState({\n isDragging: true,\n startPoint: { x, y },\n currentPoint: { x, y },\n isAdditive: e.metaKey || e.ctrlKey,\n });\n\n e.preventDefault();\n },\n [enabled, svgRef, scale]\n );\n\n // Handle mouse move during drag\n useEffect(() => {\n if (!dragState.isDragging) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const svgElement = svgRef.current;\n if (!svgElement) return;\n\n const rect = svgElement.getBoundingClientRect();\n const x = (e.clientX - rect.left) / scale;\n const y = (e.clientY - rect.top) / scale;\n\n setDragState((prev) => ({\n ...prev,\n currentPoint: { x, y },\n }));\n };\n\n const handleMouseUp = () => {\n const selectedNotes = getSelectedNotes();\n\n // Check if there was significant movement (more than 5px) to distinguish from a click\n const hasMoved =\n dragState.startPoint &&\n dragState.currentPoint &&\n (Math.abs(dragState.currentPoint.x - dragState.startPoint.x) > 5 ||\n Math.abs(dragState.currentPoint.y - dragState.startPoint.y) > 5);\n\n if (hasMoved && selectedNotes.length > 0) {\n onSelectionComplete(selectedNotes, dragState.isAdditive);\n // Only block click if we actually performed a drag selection\n setJustFinishedDrag(true);\n setTimeout(() => setJustFinishedDrag(false), 50);\n }\n\n setDragState({\n isDragging: false,\n startPoint: null,\n currentPoint: null,\n isAdditive: false,\n });\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [\n dragState.isDragging,\n dragState.isAdditive,\n getSelectedNotes,\n onSelectionComplete,\n svgRef,\n scale,\n ]);\n\n return {\n isDragging: dragState.isDragging,\n justFinishedDrag,\n selectionRect,\n previewNoteIds,\n handleMouseDown,\n };\n};\n","import React from 'react';\nimport { useTheme } from '@/context/ThemeContext';\n\ninterface GrandStaffBracketProps {\n topY: number;\n bottomY: number;\n x?: number;\n}\n\nconst GrandStaffBracket: React.FC<GrandStaffBracketProps> = ({ topY, bottomY, x = 0 }) => {\n const { theme } = useTheme();\n\n const height = bottomY - topY;\n\n // Render nothing if heights are invalid\n if (height <= 0) return null;\n\n return (\n <g transform={`translate(${x}, 0)`}>\n <svg\n x={0}\n y={topY}\n width={13}\n height={height}\n viewBox=\"0 0 13 159\"\n preserveAspectRatio=\"none\"\n overflow=\"visible\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M11.1337 0.00122854C10.6545 0.0294863 10.1459 0.537114 9.27963 1.78379C7.52747 4.10559 5.01383 9.54316 4.00961 12.3786C2.50364 18.3271 2.00972 25.5609 2.51171 32.5444C2.75767 34.8636 3.25184 40.0279 4.00961 44.1631C5.25979 53.9925 5.51663 58.1278 5.51663 62.2629C5.2606 68.9819 3.51492 74.4037 0.748947 78.0226C0.246709 78.5389 0 79.0561 0 79.3207C0 79.5853 0.246709 80.1025 0.748947 80.6188C3.51492 84.2377 5.2606 89.6552 5.51663 96.1225C5.51663 100.509 5.25979 104.639 4.00961 114.204C3.25184 118.604 2.75767 123.773 2.51171 125.841C2.00972 133.076 2.50364 140.314 4.00961 145.998C5.25979 150.649 9.78239 158.668 11.0424 158.668C11.5444 158.668 12.0471 158.144 12.0471 157.625C12.0471 157.363 11.5444 156.596 11.0424 155.816C8.03022 151.429 6.76757 147.031 6.26558 140.312C6.26558 136.177 6.52243 132.296 7.77261 122.477C8.27459 118.606 8.77725 113.954 9.03303 112.138C10.0373 99.7353 8.03443 89.1381 3.01405 81.3866C2.25603 80.3516 1.75363 79.3207 1.75363 79.3207C1.75363 79.3207 2.25603 78.2807 3.01405 77.2456C8.03443 69.4942 10.0373 58.8965 9.03303 46.229C8.77725 44.6777 8.27459 40.0318 7.77261 35.8993C6.52243 26.3423 6.26558 22.4556 6.26558 18.3205C6.76757 11.6015 8.03022 7.20354 11.0424 2.81676C12.0464 1.26543 12.3025 0.755146 11.8005 0.238904C11.5636 0.0767645 11.3516 -0.0116103 11.1337 0.00122854Z\"\n fill={theme.secondaryText}\n />\n </svg>\n <line x1={20} y1={topY} x2={20} y2={bottomY} stroke={theme.secondaryText} strokeWidth=\"1\" />\n </g>\n );\n};\n\nexport default GrandStaffBracket;\n","import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { CONFIG } from '@/config';\nimport { useTheme } from '@/context/ThemeContext';\nimport { calculateHeaderLayout, getOffsetForPitch, calculateMeasureLayout } from '@/engines/layout';\nimport { isRestEvent, getFirstNoteId } from '@/utils/core';\nimport Staff, { calculateStaffWidth } from './Staff';\nimport { getActiveStaff, createDefaultSelection } from '@/types';\nimport { useScoreContext } from '@/context/ScoreContext';\nimport { useScoreInteraction } from '@/hooks/useScoreInteraction';\nimport { useAutoScroll } from '@/hooks/useAutoScroll';\nimport { useGrandStaffLayout } from '@/hooks/useGrandStaffLayout';\nimport { useDragToSelect } from '@/hooks/useDragToSelect';\nimport GrandStaffBracket from '../Assets/GrandStaffBracket';\nimport { LAYOUT, CLAMP_LIMITS, STAFF_HEIGHT } from '@/constants';\n\ninterface ScoreCanvasProps {\n scale: number;\n playbackPosition?: { measureIndex: number | null; quant: number | null; duration: number };\n onKeySigClick?: () => void;\n onTimeSigClick?: () => void;\n onClefClick?: () => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n onHoverChange: (isHovering: boolean) => void;\n onBackgroundClick?: () => void;\n}\n\n/**\n * Renders the main score canvas, composing Staff components.\n * Consumes ScoreContext for data and handles interactions.\n */\nconst ScoreCanvas: React.FC<ScoreCanvasProps> = ({\n scale,\n playbackPosition = { measureIndex: null, quant: null, duration: 0 },\n onKeySigClick,\n onTimeSigClick,\n onClefClick,\n containerRef,\n onHoverChange,\n onBackgroundClick,\n}) => {\n const { theme } = useTheme();\n\n // Consume Score Context\n const {\n score,\n selection,\n setSelection,\n handleNoteSelection,\n addNoteToMeasure,\n activeDuration,\n isDotted,\n previewNote,\n setPreviewNote,\n handleMeasureHover,\n scoreRef,\n updateNotePitch,\n } = useScoreContext();\n\n // --- INTERACTION LOGIC MOVED FROM SCORE EDITOR ---\n\n // Track modifier key state for cursor changes\n const [modifierHeld, setModifierHeld] = useState(false);\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey) setModifierHeld(true);\n };\n const handleKeyUp = (e: KeyboardEvent) => {\n if (!e.metaKey && !e.ctrlKey) setModifierHeld(false);\n };\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n };\n }, []);\n\n const { dragState, handleDragStart } = useScoreInteraction({\n scoreRef,\n selection,\n onUpdatePitch: (m: number, e: string | number, n: string | number, p: string) =>\n updateNotePitch(m, e, n, p),\n onSelectNote: (\n measureIndex: number | null,\n eventId: string | number | null,\n noteId: string | number | null,\n staffIndexParam?: number,\n isMulti?: boolean,\n selectAllInEvent?: boolean,\n isShift?: boolean\n ) => {\n if (measureIndex !== null && eventId !== null) {\n const targetStaff = staffIndexParam !== undefined ? staffIndexParam : 0;\n handleNoteSelection(\n measureIndex,\n eventId,\n noteId,\n targetStaff,\n isMulti,\n selectAllInEvent,\n isShift\n );\n }\n setPreviewNote(null);\n },\n });\n\n const activeStaff = getActiveStaff(score);\n const keySignature = score.keySignature || activeStaff.keySignature || 'C';\n const timeSignature = score.timeSignature || '4/4';\n const clef = score.staves.length >= 2 ? 'grand' : activeStaff.clef || 'treble';\n\n // --- AUTO-SCROLL LOGIC ---\n useAutoScroll({\n containerRef,\n score,\n selection,\n playbackPosition,\n previewNote,\n scale,\n });\n\n // Calculate synchronized measure layouts for Grand Staff\n const { synchronizedLayoutData, unifiedCursorX, unifiedCursorWidth, isGrandStaff, numStaves } =\n useGrandStaffLayout({\n score,\n playbackPosition,\n activeStaff,\n keySignature,\n clef,\n });\n\n const cursorRef = useRef<SVGGElement>(null);\n\n // --- PLAYBACK CURSOR ANIMATION LOGIC ---\n useEffect(() => {\n if (cursorRef.current && unifiedCursorX !== null && unifiedCursorWidth !== undefined) {\n // 1. Snap to Start (Instant)\n cursorRef.current.style.transition = 'none';\n cursorRef.current.style.transform = `translateX(${unifiedCursorX}px)`;\n\n // 2. Animate to End (Slide)\n // Use requestAnimationFrame to ensure the 'none' transition applies first\n if (playbackPosition.duration > 0) {\n requestAnimationFrame(() => {\n if (!cursorRef.current) return;\n cursorRef.current.style.transition = `transform ${playbackPosition.duration}s linear`;\n cursorRef.current.style.transform = `translateX(${unifiedCursorX + unifiedCursorWidth}px)`;\n });\n }\n }\n }, [unifiedCursorX, unifiedCursorWidth, playbackPosition.duration]);\n\n const totalWidth = React.useMemo(() => {\n const { startOfMeasures } = calculateHeaderLayout(keySignature);\n\n if (synchronizedLayoutData) {\n const measuresWidth = synchronizedLayoutData.reduce(\n (sum: any, layout: any) => sum + layout.width,\n 0\n );\n return startOfMeasures + measuresWidth + 50;\n }\n\n return calculateStaffWidth(activeStaff.measures, keySignature);\n }, [synchronizedLayoutData, activeStaff.measures, keySignature]);\n\n const svgHeight =\n CONFIG.baseY + (numStaves - 1) * CONFIG.staffSpacing + CONFIG.lineHeight * 4 + 50;\n\n // --- DRAG TO SELECT ---\n const svgRef = useRef<SVGSVGElement>(null);\n\n // Calculate note positions for hit detection\n const notePositions = useMemo(() => {\n const positions: Array<{\n x: number;\n y: number;\n width: number;\n height: number;\n staffIndex: number;\n measureIndex: number;\n eventId: string | number;\n noteId: string | number | null; // null for rests\n }> = [];\n\n const { startOfMeasures } = calculateHeaderLayout(keySignature);\n\n score.staves.forEach((staff: any, staffIdx: number) => {\n const staffBaseY = CONFIG.baseY + staffIdx * CONFIG.staffSpacing;\n const staffClef = staff.clef || (staffIdx === 0 ? 'treble' : 'bass');\n let measureX = startOfMeasures;\n\n staff.measures.forEach((measure: any, measureIdx: number) => {\n // Get forced positions from synchronized layout if available\n const forcedPositions = synchronizedLayoutData?.[measureIdx]?.forcedPositions;\n\n // Calculate actual layout to get event positions\n\n const layout = calculateMeasureLayout(\n measure.events,\n undefined,\n staffClef,\n false,\n forcedPositions\n );\n\n measure.events.forEach((event: any) => {\n const eventX = measureX + (layout.eventPositions?.[event.id] || 0);\n\n // Handle rest events (isRest flag set)\n if (isRestEvent(event)) {\n // Skip placeholder rests for empty measures\n if (event.id === 'rest-placeholder') return;\n\n // Get the rest note ID (rests now have a single note entry)\n const restNoteId = getFirstNoteId(event);\n\n // Add rest hit area - centered on event, spanning full staff height\n const staffHeight = CONFIG.lineHeight * 4;\n positions.push({\n x: eventX - 15, // Center with ~30px width\n y: staffBaseY,\n width: 30,\n height: staffHeight,\n staffIndex: staffIdx,\n measureIndex: measureIdx,\n eventId: event.id,\n noteId: restNoteId, // Use the rest note ID for selection\n });\n } else {\n // Handle notes\n event.notes?.forEach((note: any) => {\n const noteY = staffBaseY + getOffsetForPitch(note.pitch, staffClef);\n\n positions.push({\n x: eventX - LAYOUT.NOTE_RX, // Center of ellipse minus radius\n y: noteY - LAYOUT.NOTE_RY,\n width: LAYOUT.NOTE_RX * 2,\n height: LAYOUT.NOTE_RY * 2,\n staffIndex: staffIdx,\n measureIndex: measureIdx,\n eventId: event.id,\n noteId: note.id,\n });\n });\n }\n });\n\n measureX += layout.totalWidth || synchronizedLayoutData?.[measureIdx]?.width || 0;\n });\n });\n\n return positions;\n }, [score.staves, synchronizedLayoutData, keySignature]);\n\n // Drag to select hook\n const {\n isDragging,\n justFinishedDrag,\n selectionRect,\n previewNoteIds,\n handleMouseDown: handleDragSelectMouseDown,\n } = useDragToSelect({\n svgRef,\n notePositions,\n onSelectionComplete: (notes, isAdditive) => {\n if (notes.length === 0) return;\n\n if (isAdditive) {\n // Add to existing selection\n setSelection((prev) => ({\n ...prev,\n selectedNotes: [\n ...prev.selectedNotes,\n ...notes.filter(\n (n) =>\n !prev.selectedNotes.some((sn) => sn.noteId === n.noteId && sn.eventId === n.eventId)\n ),\n ],\n // Update focus to first new note\n measureIndex: notes[0].measureIndex,\n eventId: notes[0].eventId,\n noteId: notes[0].noteId,\n staffIndex: notes[0].staffIndex,\n }));\n } else {\n // Replace selection\n setSelection({\n staffIndex: notes[0].staffIndex,\n measureIndex: notes[0].measureIndex,\n eventId: notes[0].eventId,\n noteId: notes[0].noteId,\n selectedNotes: notes,\n anchor: {\n staffIndex: notes[0].staffIndex,\n measureIndex: notes[0].measureIndex,\n eventId: notes[0].eventId,\n noteId: notes[0].noteId,\n },\n });\n }\n },\n scale,\n });\n\n const handleBackgroundClick = (e: React.MouseEvent) => {\n // Don't deselect if we were dragging or just finished dragging\n if (isDragging || justFinishedDrag) return;\n\n onBackgroundClick?.();\n // Default: deselect\n setSelection(createDefaultSelection());\n containerRef.current?.focus();\n };\n\n // --- MEMOIZED CALLBACKS FOR INTERACTION OBJECT ---\n // These prevent unnecessary re-renders of child components\n\n const memoizedOnSelectNote = useCallback(\n (\n measureIndex: number | null,\n eventId: number | string | null,\n noteId: number | string | null,\n staffIndexParam?: number,\n isMulti?: boolean\n ) => {\n if (eventId !== null && measureIndex !== null) {\n const targetStaff = staffIndexParam !== undefined ? staffIndexParam : 0;\n handleNoteSelection(measureIndex, eventId, noteId, targetStaff, isMulti);\n }\n },\n [handleNoteSelection]\n );\n\n const memoizedOnDragStart = useCallback(\n (args: any) => {\n handleDragStart(args);\n },\n [handleDragStart]\n );\n\n // Ref to track latest handler to avoid stale closures in the cached wrappers\n const handleMeasureHoverRef = useRef(handleMeasureHover);\n useEffect(() => {\n handleMeasureHoverRef.current = handleMeasureHover;\n }, [handleMeasureHover]);\n\n // Cache per-staff onHover handlers to prevent recreation (stable identity for memoized children)\n const hoverHandlersRef = useRef<\n Map<number, (measureIndex: number | null, hit: any, pitch: string | null) => void>\n >(new Map());\n\n const getHoverHandler = useCallback(\n (staffIndex: number) => {\n if (!hoverHandlersRef.current.has(staffIndex)) {\n hoverHandlersRef.current.set(\n staffIndex,\n (measureIndex: number | null, hit: any, pitch: string | null) => {\n if (!dragState.active) {\n handleMeasureHoverRef.current(measureIndex, hit, pitch || '', staffIndex);\n }\n }\n );\n }\n return hoverHandlersRef.current.get(staffIndex)!;\n },\n [dragState.active]\n );\n\n return (\n <div\n ref={containerRef}\n data-testid=\"score-canvas-container\"\n className=\"ScoreCanvas overflow-x-auto relative outline-none z-10 pl-8 [&::-webkit-scrollbar]:h-2 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-slate-700/50 [&::-webkit-scrollbar-thumb]:rounded-full hover:[&::-webkit-scrollbar-thumb]:bg-slate-600/50\"\n style={{ marginTop: '-30px', backgroundColor: theme.background }}\n onClick={handleBackgroundClick}\n tabIndex={0}\n onMouseEnter={() => onHoverChange(true)}\n onMouseLeave={() => onHoverChange(false)}\n >\n <svg\n ref={svgRef}\n width={totalWidth * scale}\n height={svgHeight * scale}\n className=\"ml-0 overflow-visible\"\n onMouseDown={handleDragSelectMouseDown}\n >\n <g transform={`scale(${scale})`}>\n {score.staves?.length > 1 && (\n <>\n {(() => {\n const topY = CONFIG.baseY;\n const bottomY =\n CONFIG.baseY +\n (score.staves.length - 1) * CONFIG.staffSpacing +\n CONFIG.lineHeight * 4;\n const midY = (topY + bottomY) / 2;\n return <GrandStaffBracket topY={topY} bottomY={bottomY} x={-20} />;\n })()}\n </>\n )}\n\n {score.staves?.map((staff: any, staffIndex: number) => {\n const staffBaseY = CONFIG.baseY + staffIndex * CONFIG.staffSpacing;\n\n // Construct Interaction State - using memoized callbacks for stable references\n const interaction = {\n selection, // Always pass the real selection - isNoteSelected checks staffIndex per-note\n previewNote, // Global preview note (Staff filters it)\n activeDuration,\n isDotted,\n modifierHeld,\n isDragging: dragState.active,\n lassoPreviewIds: previewNoteIds, // Set<string> for O(1) lasso preview lookup\n onAddNote: addNoteToMeasure,\n onSelectNote: memoizedOnSelectNote,\n onDragStart: memoizedOnDragStart,\n onHover: getHoverHandler(staffIndex),\n };\n\n // Calculate clamping limits for Grand Staff\n // Outer limits: 4 ledger lines (-48, 90)\n // Inner limits: 2 ledger lines (24, -24) to avoid overlap\n const isTop = staffIndex === 0;\n const isBottom = staffIndex === score.staves.length - 1;\n\n const mouseLimits = {\n min: isTop ? CLAMP_LIMITS.OUTER_TOP : -CLAMP_LIMITS.INNER_OFFSET,\n max: isBottom ? CLAMP_LIMITS.OUTER_BOTTOM : STAFF_HEIGHT + CLAMP_LIMITS.INNER_OFFSET,\n };\n\n return (\n <Staff\n key={staff.id || staffIndex}\n staffIndex={staffIndex}\n clef={staff.clef || (staffIndex === 0 ? 'treble' : 'bass')}\n keySignature={staff.keySignature || keySignature}\n timeSignature={timeSignature}\n measures={staff.measures}\n measureLayouts={synchronizedLayoutData}\n baseY={staffBaseY}\n scale={scale}\n interaction={interaction}\n playbackPosition={playbackPosition}\n onClefClick={onClefClick}\n onKeySigClick={onKeySigClick}\n onTimeSigClick={onTimeSigClick}\n hidePlaybackCursor={isGrandStaff}\n mouseLimits={mouseLimits}\n />\n );\n })}\n\n {isGrandStaff && unifiedCursorX !== null && (\n <g\n ref={cursorRef}\n style={{\n transform: `translateX(${unifiedCursorX}px)`,\n pointerEvents: 'none',\n }}\n >\n <line\n x1={0}\n y1={CONFIG.baseY - 20}\n x2={0}\n y2={\n CONFIG.baseY + (numStaves - 1) * CONFIG.staffSpacing + CONFIG.lineHeight * 4 + 20\n }\n stroke={theme.accent}\n strokeWidth=\"3\"\n opacity=\"0.8\"\n />\n <circle cx={0} cy={CONFIG.baseY - 20} r=\"4\" fill={theme.accent} opacity=\"0.9\" />\n <circle\n cx={0}\n cy={\n CONFIG.baseY + (numStaves - 1) * CONFIG.staffSpacing + CONFIG.lineHeight * 4 + 20\n }\n r=\"4\"\n fill={theme.accent}\n opacity=\"0.9\"\n />\n </g>\n )}\n\n {/* Drag-to-Select Rectangle */}\n {isDragging && selectionRect && (\n <rect\n x={selectionRect.x}\n y={selectionRect.y}\n width={selectionRect.width}\n height={selectionRect.height}\n fill=\"rgba(59, 130, 246, 0.2)\"\n stroke=\"rgba(59, 130, 246, 0.8)\"\n strokeWidth=\"1\"\n style={{ pointerEvents: 'none' }}\n />\n )}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default ScoreCanvas;\n","import { useEffect, useCallback } from 'react';\n\ninterface UseFocusTrapOptions {\n /** Ref to the container element that traps focus */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Whether the focus trap is active */\n isActive: boolean;\n /** Called when ESC is pressed */\n onEscape?: () => void;\n /** Ref to element to return focus to when trap is deactivated */\n returnFocusRef?: React.RefObject<HTMLElement | null>;\n /** Whether to focus the first element on activation */\n autoFocus?: boolean;\n /** Whether to handle arrow key navigation */\n enableArrowKeys?: boolean;\n}\n\n/**\n * Hook to trap focus within a container, cycling through focusable elements.\n * Used for toolbars, dropdown menus, and modal dialogs.\n */\nexport function useFocusTrap({\n containerRef,\n isActive,\n onEscape,\n returnFocusRef,\n autoFocus = true,\n enableArrowKeys = false,\n}: UseFocusTrapOptions) {\n const getFocusableElements = useCallback(() => {\n if (!containerRef.current) return [];\n return Array.from(\n containerRef.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n )\n );\n }, [containerRef]);\n\n useEffect(() => {\n if (!isActive) return;\n\n // Auto-focus first element\n if (autoFocus) {\n const timer = setTimeout(() => {\n const elements = getFocusableElements();\n if (elements.length > 0) {\n elements[0].focus();\n }\n }, 10);\n return () => clearTimeout(timer);\n }\n }, [isActive, autoFocus, getFocusableElements]);\n\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Only handle if focus is inside our container\n if (!containerRef.current?.contains(document.activeElement)) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onEscape?.();\n return;\n }\n\n const focusableElements = getFocusableElements();\n if (focusableElements.length === 0) return;\n\n const activeElement = document.activeElement as HTMLElement;\n const currentIndex = focusableElements.indexOf(activeElement);\n\n if (e.key === 'Tab') {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n const prevIndex =\n (currentIndex - 1 + focusableElements.length) % focusableElements.length;\n focusableElements[prevIndex].focus();\n } else {\n const nextIndex = (currentIndex + 1) % focusableElements.length;\n focusableElements[nextIndex].focus();\n }\n } else if (enableArrowKeys && ['ArrowDown', 'ArrowRight'].includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n const nextIndex = (currentIndex + 1) % focusableElements.length;\n focusableElements[nextIndex].focus();\n } else if (enableArrowKeys && ['ArrowUp', 'ArrowLeft'].includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n const prevIndex = (currentIndex - 1 + focusableElements.length) % focusableElements.length;\n focusableElements[prevIndex].focus();\n }\n };\n\n // Use capture phase to intercept before default handlers\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n\n // Return focus when trap is deactivated\n if (returnFocusRef?.current) {\n returnFocusRef.current.focus();\n }\n };\n }, [isActive, onEscape, containerRef, returnFocusRef, enableArrowKeys, getFocusableElements]);\n}\n","import { Command } from './types';\nimport { Score } from '@/types';\n\nexport class LoadScoreCommand implements Command {\n type = 'LOAD_SCORE';\n private previousScore: Score | null = null;\n\n constructor(private newScore: Score) {}\n\n execute(score: Score): Score {\n this.previousScore = score;\n return this.newScore;\n }\n\n undo(score: Score): Score {\n return this.previousScore || score;\n }\n}\n","import React from 'react';\nimport { CLEFS, BRAVURA_FONT } from '@/constants/SMuFL';\n\ninterface ClefIconProps extends React.SVGProps<SVGSVGElement> {\n clef: string;\n}\n\n/**\n * ClefIcon renders clef symbols using Bravura font glyphs.\n * Designed for use in toolbars and overlays.\n */\nconst ClefIcon: React.FC<ClefIconProps> = ({ clef, ...props }) => {\n // Default to 60x60 coordinate system\n const viewBox = props.viewBox || '0 0 60 60';\n\n const key = clef || 'treble';\n\n // Get the appropriate Bravura glyph\n const getClefGlyph = () => {\n switch (key) {\n case 'treble':\n return CLEFS.gClef;\n case 'bass':\n return CLEFS.fClef;\n case 'alto':\n case 'tenor':\n return CLEFS.cClef;\n default:\n return CLEFS.gClef;\n }\n };\n\n // Font size and positioning vary by clef type\n const getClefConfig = () => {\n switch (key) {\n case 'treble':\n return { fontSize: 55, x: 30, y: 42 };\n case 'bass':\n return { fontSize: 45, x: 28, y: 28 };\n case 'alto':\n case 'tenor':\n return { fontSize: 40, x: 30, y: 30 };\n default:\n return { fontSize: 55, x: 30, y: 42 };\n }\n };\n\n const config = getClefConfig();\n\n return (\n <svg viewBox={viewBox} fill=\"none\" {...props}>\n {key === 'grand' ? (\n <>\n {/* Brace */}\n <path\n d=\"M5,10 Q0,10 0,20 L0,40 Q0,50 5,50\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n\n {/* Top Staff (Treble) */}\n {[0, 1, 2].map((i) => (\n <line\n key={`t-${i}`}\n x1=\"8\"\n y1={12 + i * 6}\n x2=\"55\"\n y2={12 + i * 6}\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n opacity=\"0.4\"\n />\n ))}\n <text\n x={22}\n y={26}\n fontFamily={BRAVURA_FONT}\n fontSize={28}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n >\n {CLEFS.gClef}\n </text>\n\n {/* Bottom Staff (Bass) */}\n {[0, 1, 2].map((i) => (\n <line\n key={`b-${i}`}\n x1=\"8\"\n y1={38 + i * 6}\n x2=\"55\"\n y2={38 + i * 6}\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n opacity=\"0.4\"\n />\n ))}\n <text\n x={22}\n y={46}\n fontFamily={BRAVURA_FONT}\n fontSize={22}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n >\n {CLEFS.fClef}\n </text>\n </>\n ) : (\n <>\n {/* Staff lines for context */}\n {[0, 1, 2, 3, 4].map((i) => (\n <line\n key={i}\n x1=\"0\"\n y1={10 + i * 10}\n x2=\"60\"\n y2={10 + i * 10}\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n opacity=\"0.3\"\n />\n ))}\n\n {/* Clef rendered with Bravura font */}\n <text\n x={config.x}\n y={config.y}\n fontFamily={BRAVURA_FONT}\n fontSize={config.fontSize}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n >\n {getClefGlyph()}\n </text>\n </>\n )}\n </svg>\n );\n};\n\nexport default ClefIcon;\n","import { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nconst Portal = ({ children }: { children: React.ReactNode }) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n return mounted ? createPortal(children, document.body) : null;\n};\n\nexport default Portal;\n","import React, { useRef, forwardRef } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { useTheme } from '@/context/ThemeContext';\nimport { useFocusTrap } from '@/hooks/useFocusTrap';\nimport Portal from '../../Layout/Portal';\n\n// ========== DROPDOWN TRIGGER BUTTON ==========\ninterface DropdownTriggerProps {\n label: string;\n icon?: React.ReactNode;\n isOpen: boolean;\n onClick: () => void;\n height?: string;\n}\n\n/**\n * Standardized dropdown trigger button with ghost styling:\n * - SM font, all caps\n * - ChevronDown icon\n * - Ghost style (transparent until hover/open)\n */\nexport const DropdownTrigger = forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ label, icon, isOpen, onClick, height = 'h-9' }, ref) => {\n const { theme } = useTheme();\n const [isHovered, setIsHovered] = React.useState(false);\n\n const borderColor = isOpen ? theme.accent : isHovered ? theme.border : 'transparent';\n const bgColor = isHovered || isOpen ? theme.buttonBackground : 'transparent';\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={`flex items-center gap-1.5 px-3 ${height} rounded border text-sm font-medium tracking-wide transition-colors`}\n style={{\n backgroundColor: bgColor,\n borderColor: borderColor,\n color: theme.secondaryText,\n }}\n >\n {icon}\n <span className=\"truncate\">{label}</span>\n <ChevronDown size={14} className={`transition-transform ${isOpen ? 'rotate-180' : ''}`} />\n </button>\n );\n }\n);\n\ninterface DropdownOverlayProps {\n onClose: () => void;\n triggerRef?: React.RefObject<HTMLElement>;\n position: { x: number; y: number };\n children: React.ReactNode;\n width?: string | number;\n maxHeight?: string | number;\n className?: string;\n}\n\nconst DropdownOverlay: React.FC<DropdownOverlayProps> = ({\n onClose,\n triggerRef,\n position,\n children,\n width = 'auto',\n maxHeight = 'auto',\n className = '',\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const { theme } = useTheme();\n\n // Use unified focus trap hook\n useFocusTrap({\n containerRef: ref,\n isActive: true,\n onEscape: onClose,\n returnFocusRef: triggerRef,\n autoFocus: true,\n enableArrowKeys: true,\n });\n\n return (\n <Portal>\n {/* Backdrop to catch clicks and prevent interaction with background */}\n <div\n className=\"fixed inset-0 z-40 bg-transparent\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n aria-hidden=\"true\"\n />\n\n {/* Dropdown Content */}\n <div\n ref={ref}\n className={`fixed z-50 rounded-lg shadow-xl border overflow-hidden backdrop-blur-md ${className}`}\n style={{\n left: position.x,\n top: position.y,\n ...(width !== 'auto' && { width }),\n maxHeight: maxHeight,\n backgroundColor: theme.panelBackground,\n borderColor: theme.border,\n color: theme.text,\n }}\n role=\"menu\"\n aria-modal=\"true\"\n >\n {children}\n <style>{`\n .dropdown-scroll::-webkit-scrollbar {\n width: 6px;\n }\n .dropdown-scroll::-webkit-scrollbar-track {\n background: transparent;\n }\n .dropdown-scroll::-webkit-scrollbar-thumb {\n background-color: ${theme.border};\n border-radius: 3px;\n }\n .dropdown-scroll::-webkit-scrollbar-thumb:hover {\n background-color: ${theme.secondaryText};\n }\n `}</style>\n </div>\n </Portal>\n );\n};\n\n// ========== DROPDOWN ITEM COMPONENT ==========\ninterface DropdownItemProps {\n onClick: () => void;\n children: React.ReactNode;\n isSelected?: boolean;\n className?: string;\n}\n\n/**\n * Standardized dropdown item with consistent styling:\n * - XS font size\n * - Pointer cursor\n * - Background color change on hover\n */\nexport const DropdownItem: React.FC<DropdownItemProps> = ({\n onClick,\n children,\n isSelected = false,\n className = '',\n}) => {\n const { theme } = useTheme();\n const [isHovered, setIsHovered] = React.useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={`\n w-full text-left px-3 py-2 rounded-md \n text-sm font-medium \n cursor-pointer\n transition-colors\n ${className}\n `}\n style={{\n backgroundColor: isSelected\n ? theme.buttonHoverBackground\n : isHovered\n ? theme.buttonHoverBackground\n : 'transparent',\n color: theme.secondaryText,\n }}\n role=\"menuitem\"\n >\n {children}\n </button>\n );\n};\n\nexport default DropdownOverlay;\n","import React from 'react';\nimport ClefIcon from '@assets/ClefIcon';\nimport { CLEF_TYPES } from '@/constants';\nimport { useTheme } from '@context/ThemeContext';\nimport DropdownOverlay from './DropdownOverlay';\n\ninterface ClefOverlayProps {\n current: string;\n onSelect: (clef: string) => void;\n onClose: () => void;\n position: { x: number; y: number };\n triggerRef: React.RefObject<HTMLElement>;\n}\n\nconst ClefOverlay: React.FC<ClefOverlayProps> = ({\n current,\n onSelect,\n onClose,\n position,\n triggerRef,\n}) => {\n const { theme } = useTheme();\n\n return (\n <DropdownOverlay\n onClose={onClose}\n position={position}\n triggerRef={triggerRef}\n width=\"auto\"\n className=\"w-[320px]\"\n >\n <div className=\"p-2 grid grid-cols-3 gap-2\">\n {['grand', 'treble', 'bass'].map((key) => {\n const data = CLEF_TYPES[key];\n return (\n <button\n key={key}\n onClick={() => onSelect(key)}\n className=\"flex flex-col items-center justify-center p-2 rounded-md transition-colors border\"\n style={{\n backgroundColor: current === key ? theme.buttonHoverBackground : 'transparent',\n borderColor: current === key ? theme.accent : 'transparent',\n color: theme.text,\n }}\n onMouseEnter={(e) => {\n if (current !== key) {\n e.currentTarget.style.backgroundColor = theme.buttonHoverBackground;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n current === key ? theme.buttonHoverBackground : 'transparent';\n }}\n >\n <div className=\"mb-1 h-16 flex items-center justify-center w-full relative\">\n <ClefIcon clef={key} width=\"60\" height=\"60\" />\n </div>\n <span className=\"text-xs font-medium\">{data.label}</span>\n </button>\n );\n })}\n </div>\n </DropdownOverlay>\n );\n};\n\nexport default ClefOverlay;\n","import React, { useState, useEffect } from 'react';\nimport { X, Music } from 'lucide-react';\nimport { Key } from 'tonal';\nimport {\n KEY_SIGNATURES,\n KEY_SIGNATURE_OFFSETS,\n KeySignatureOffsets,\n KeySignature,\n} from '@/constants';\nimport { useTheme } from '@/context/ThemeContext';\nimport { ACCIDENTALS, BRAVURA_FONT } from '@/constants/SMuFL';\n\n// ==========================================\n// 1. TYPES & INTERFACES\n// ==========================================\n\ninterface KeySignatureOverlayProps {\n current: string;\n clef?: string;\n onSelect: (key: string) => void;\n onClose: () => void;\n}\n\n// ==========================================\n// 2. CONSTANTS\n// ==========================================\n\n// Circle of fifths order for key signature selection UI\n// Derived dynamically using Tonal.js Key.majorKey().minorRelative\nconst FLAT_ROOTS = ['C', 'F', 'Bb', 'Eb', 'Ab', 'Db', 'Gb', 'Cb'];\nconst SHARP_ROOTS = ['G', 'D', 'A', 'E', 'B', 'F#', 'C#'];\n\nconst CIRCLE_OF_FIFTHS = {\n flats: FLAT_ROOTS.map(\n (root) => [root, `${Key.majorKey(root).minorRelative}m`] as [string, string]\n ),\n sharps: SHARP_ROOTS.map(\n (root) => [root, `${Key.majorKey(root).minorRelative}m`] as [string, string]\n ),\n};\n\n// ==========================================\n// 3. SUB-COMPONENTS\n// ==========================================\n\n/**\n * StaffPreview: Handles the SVG rendering of the staff lines and accidentals\n */\nconst StaffPreview = ({ data, clef, theme }: { data: KeySignature; clef: string; theme: any }) => {\n const { type, count, accidentals } = data;\n const accWidth = Math.max(40, count * 10 + 20);\n\n return (\n <div className=\"h-16 flex items-center justify-center w-full\">\n <svg\n width={accWidth}\n height=\"60\"\n viewBox={`0 0 ${accWidth} 60`}\n style={{ overflow: 'visible' }}\n >\n {/* Staff Lines */}\n {[0, 1, 2, 3, 4].map((i) => (\n <line\n key={i}\n x1=\"0\"\n y1={10 + i * 10}\n x2={accWidth}\n y2={10 + i * 10}\n stroke={theme.secondaryText}\n strokeWidth=\"1\"\n opacity=\"0.5\"\n />\n ))}\n\n {/* Accidentals */}\n {accidentals.map((acc, i) => {\n const validClef =\n clef in KEY_SIGNATURE_OFFSETS ? (clef as keyof KeySignatureOffsets) : 'treble';\n const offset = KEY_SIGNATURE_OFFSETS[validClef][type][acc];\n\n return (\n <text\n key={i}\n x={10 + i * 10}\n y={10 + offset}\n fontSize=\"32\"\n fontFamily={BRAVURA_FONT}\n fill={theme.text}\n >\n {type === 'sharp' ? ACCIDENTALS.sharp : ACCIDENTALS.flat}\n </text>\n );\n })}\n </svg>\n </div>\n );\n};\n\n/**\n * KeyOptionButton: The interactive button wrapper\n */\nconst KeyOptionButton = ({\n keyId,\n current,\n clef,\n theme,\n onSelect,\n}: {\n keyId: string;\n current: string;\n clef: string;\n theme: any;\n onSelect: (key: string) => void;\n}) => {\n const data = KEY_SIGNATURES[keyId];\n if (!data) return null;\n\n const isSelected = current === keyId;\n\n return (\n <button\n onClick={() => onSelect(keyId)}\n className=\"flex flex-col items-center justify-center p-2 rounded-md transition-colors border\"\n style={{\n backgroundColor: isSelected ? theme.buttonHoverBackground : 'transparent',\n borderColor: isSelected ? theme.accent : 'transparent',\n color: theme.text,\n }}\n onMouseEnter={(e) => {\n if (!isSelected) e.currentTarget.style.backgroundColor = theme.buttonHoverBackground;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = isSelected\n ? theme.buttonHoverBackground\n : 'transparent';\n }}\n >\n <StaffPreview data={data} clef={clef} theme={theme} />\n\n <span className=\"text-xs font-medium text-center\">{data.label}</span>\n </button>\n );\n};\n\n/**\n * ModeToggle: Major/Minor selector toggle\n */\nconst ModeToggle = ({\n mode,\n setMode,\n theme,\n}: {\n mode: 'major' | 'minor';\n setMode: (mode: 'major' | 'minor') => void;\n theme: any;\n}) => (\n <div className=\"flex rounded-lg p-1 mb-4\" style={{ backgroundColor: theme.buttonBackground }}>\n <button\n onClick={() => setMode('major')}\n className=\"flex-1 px-4 py-2 text-sm font-medium rounded-md transition-colors\"\n style={{\n backgroundColor: mode === 'major' ? theme.accent : 'transparent',\n color: mode === 'major' ? '#ffffff' : theme.secondaryText,\n }}\n >\n Major\n </button>\n <button\n onClick={() => setMode('minor')}\n className=\"flex-1 px-4 py-2 text-sm font-medium rounded-md transition-colors\"\n style={{\n backgroundColor: mode === 'minor' ? theme.accent : 'transparent',\n color: mode === 'minor' ? '#ffffff' : theme.secondaryText,\n }}\n >\n Minor\n </button>\n </div>\n);\n\n/**\n * KeySection: Renders a titled grid of key options\n */\nconst KeySection = ({\n title,\n keys,\n current,\n clef,\n theme,\n onSelect,\n mode,\n}: {\n title: string;\n keys: [string, string][]; // [majorKey, minorKey]\n current: string;\n clef: string;\n theme: any;\n onSelect: (key: string) => void;\n mode: 'major' | 'minor';\n}) => (\n <div className=\"mb-4\">\n <h3\n className=\"text-xs font-semibold uppercase tracking-wide mb-2 px-1\"\n style={{ color: theme.secondaryText }}\n >\n {title}\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-2\">\n {keys.map(([majorKey, minorKey]) => (\n <KeyOptionButton\n key={mode === 'major' ? majorKey : minorKey}\n keyId={mode === 'major' ? majorKey : minorKey}\n current={current}\n clef={clef}\n theme={theme}\n onSelect={onSelect}\n />\n ))}\n </div>\n </div>\n);\n\n// ==========================================\n// 4. MAIN COMPONENT\n// ==========================================\n\nconst KeySignatureOverlay: React.FC<KeySignatureOverlayProps> = ({\n current,\n clef = 'treble',\n onSelect,\n onClose,\n}) => {\n const { theme } = useTheme();\n\n // Determine initial mode from current key\n const currentData = KEY_SIGNATURES[current];\n const initialMode = currentData?.mode || 'major';\n const [mode, setMode] = useState<'major' | 'minor'>(initialMode);\n\n // Close on Escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n return (\n <div\n className=\"fixed inset-0 bg-black/20 backdrop-blur-sm z-50 flex items-center justify-center p-4\"\n onClick={onClose}\n >\n <div\n className=\"rounded-xl shadow-2xl w-full max-w-xl overflow-hidden\"\n style={{ backgroundColor: theme.panelBackground }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n className=\"p-4 border-b flex items-center justify-between\"\n style={{ backgroundColor: theme.background, borderColor: theme.border }}\n >\n <div className=\"flex items-center gap-2\">\n <Music size={20} style={{ color: theme.accent }} />\n <h2 className=\"font-bold text-lg\" style={{ color: theme.text }}>\n Key Signature\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 rounded-full transition-colors hover:bg-white/10\"\n style={{ color: theme.secondaryText }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 max-h-[70vh] overflow-y-auto\">\n {/* Major/Minor Toggle */}\n <ModeToggle mode={mode} setMode={setMode} theme={theme} />\n\n {/* Key Sections */}\n <KeySection\n title=\"Flats\"\n keys={CIRCLE_OF_FIFTHS.flats}\n current={current}\n clef={clef}\n theme={theme}\n onSelect={onSelect}\n mode={mode}\n />\n\n <hr className=\"border-t my-3\" style={{ borderColor: theme.border }} />\n\n <KeySection\n title=\"Sharps\"\n keys={CIRCLE_OF_FIFTHS.sharps}\n current={current}\n clef={clef}\n theme={theme}\n onSelect={onSelect}\n mode={mode}\n />\n </div>\n\n {/* Footer */}\n <div\n className=\"p-3 border-t text-center text-xs\"\n style={{\n backgroundColor: theme.background,\n borderColor: theme.border,\n color: theme.secondaryText,\n }}\n >\n Press{' '}\n <kbd\n className=\"px-1 py-0.5 rounded border font-mono\"\n style={{\n backgroundColor: theme.buttonBackground,\n borderColor: theme.border,\n color: theme.text,\n }}\n >\n Esc\n </kbd>{' '}\n to close\n </div>\n </div>\n </div>\n );\n};\n\nexport default KeySignatureOverlay;\n","import React from 'react';\nimport { TIME_SIGNATURES } from '@/constants';\nimport { useTheme } from '@/context/ThemeContext';\nimport DropdownOverlay from './DropdownOverlay';\n\ninterface TimeSignatureOverlayProps {\n current: string;\n onSelect: (timeSig: string) => void;\n onClose: () => void;\n position: { x: number; y: number };\n triggerRef: React.RefObject<HTMLElement>;\n}\n\nconst TimeSignatureOverlay: React.FC<TimeSignatureOverlayProps> = ({\n current,\n onSelect,\n onClose,\n position,\n triggerRef,\n}) => {\n const { theme } = useTheme();\n\n return (\n <DropdownOverlay onClose={onClose} position={position} triggerRef={triggerRef} width={200}>\n <div className=\"p-2 grid grid-cols-2 gap-2\">\n {Object.keys(TIME_SIGNATURES).map((sig) => {\n const [top, bottom] = sig.split('/');\n return (\n <button\n key={sig}\n onClick={() => onSelect(sig)}\n className=\"flex flex-col items-center justify-center p-2 rounded-md transition-colors border\"\n style={{\n backgroundColor: current === sig ? theme.buttonHoverBackground : 'transparent',\n borderColor: current === sig ? theme.accent : 'transparent',\n color: theme.text,\n }}\n onMouseEnter={(e) => {\n if (current !== sig) {\n e.currentTarget.style.backgroundColor = theme.buttonHoverBackground;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n current === sig ? theme.buttonHoverBackground : 'transparent';\n }}\n >\n <div className=\"mb-1 h-16 flex items-center justify-center w-full\">\n <svg width=\"40\" height=\"60\" viewBox=\"0 0 40 60\">\n {/* Staff Lines (faint) */}\n {[0, 1, 2, 3, 4].map((i) => (\n <line\n key={i}\n x1=\"0\"\n y1={10 + i * 10}\n x2=\"40\"\n y2={10 + i * 10}\n stroke={theme.secondaryText}\n strokeWidth=\"1\"\n opacity=\"0.3\"\n />\n ))}\n\n <text\n x=\"20\"\n y=\"28\"\n fontSize=\"24\"\n fontWeight=\"bold\"\n fontFamily=\"serif\"\n textAnchor=\"middle\"\n fill={theme.text}\n >\n {top}\n </text>\n <text\n x=\"20\"\n y=\"48\"\n fontSize=\"24\"\n fontWeight=\"bold\"\n fontFamily=\"serif\"\n textAnchor=\"middle\"\n fill={theme.text}\n >\n {bottom}\n </text>\n </svg>\n </div>\n <span className=\"text-xs font-medium\">{sig}</span>\n </button>\n );\n })}\n </div>\n </DropdownOverlay>\n );\n};\n\nexport default TimeSignatureOverlay;\n","import React from 'react';\nimport { useTheme } from '@/context/ThemeContext';\n\ninterface ToolbarButtonProps {\n icon?: React.ReactNode;\n label: string;\n showLabel?: boolean;\n isActive?: boolean;\n onClick?: () => void;\n className?: string;\n disabled?: boolean;\n title?: string;\n ref?: React.Ref<HTMLButtonElement>;\n\n preventFocus?: boolean;\n isEmphasized?: boolean;\n isDashed?: boolean;\n height?: string;\n variant?: 'default' | 'ghost';\n}\n\nconst ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (\n {\n icon,\n label,\n showLabel = false,\n isActive = false,\n onClick,\n className = '',\n disabled = false,\n title,\n preventFocus = false,\n isEmphasized = false,\n isDashed = false,\n height = 'h-9',\n variant = 'default',\n },\n ref\n ) => {\n const { theme } = useTheme();\n const baseStyles =\n 'flex items-center justify-center rounded border transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed';\n const sizeStyles = showLabel ? 'min-w-9 px-3' : 'w-9';\n const borderStyle = isDashed ? 'border-dashed' : 'border-solid';\n const [isHovered, setIsHovered] = React.useState(false);\n\n // Ghost variant styles\n const isGhost = variant === 'ghost';\n\n const getBackgroundColor = () => {\n if (isActive) return theme.accent;\n if (isHovered) return theme.buttonHoverBackground;\n // Ghost variant: Always transparent unless Active or Hovered\n // This allows the border (mixed state) to show without a solid background\n if (isGhost) return 'transparent';\n\n if (isEmphasized) return theme.buttonBackground;\n return theme.buttonBackground;\n };\n\n const getBorderColor = () => {\n if (isActive) return theme.accent;\n if (isEmphasized) return theme.accent;\n // Ensure dashed border is visible even if not emphasized (fallback)\n if (isDashed) return theme.secondaryText;\n\n if (isGhost && !isHovered) return 'transparent';\n return theme.border;\n };\n\n const getColor = () => {\n if (isActive) return '#ffffff';\n if (isEmphasized) return theme.accent;\n return theme.secondaryText;\n };\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n onMouseEnter={() => !disabled && setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onMouseDown={(e) => {\n if (preventFocus) {\n e.preventDefault();\n }\n }}\n disabled={disabled}\n className={`\n ${baseStyles}\n ${height}\n ${sizeStyles}\n ${borderStyle}\n ${className}\n `}\n style={{\n backgroundColor: getBackgroundColor(),\n borderColor: getBorderColor(),\n color: getColor(),\n }}\n title={title || label}\n aria-label={label}\n >\n {icon && <span className={showLabel ? 'mr-2' : ''}>{icon}</span>}\n {showLabel ? (\n <span className=\"text-xs font-bold uppercase tracking-wide\">{label}</span>\n ) : (\n <span className=\"sr-only\">{label}</span>\n )}\n </button>\n );\n }\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n\nexport default ToolbarButton;\n","import React, { useRef, useState, useImperativeHandle, forwardRef } from 'react';\nimport ClefIcon from '../Assets/ClefIcon';\nimport { CLEF_TYPES, KEY_SIGNATURES } from '@/constants';\nimport ClefOverlay from './Menus/ClefOverlay';\nimport KeySignatureOverlay from './Menus/KeySignatureOverlay';\nimport TimeSignatureOverlay from './Menus/TimeSignatureOverlay';\nimport ToolbarButton from './ToolbarButton';\n\ninterface StaffControlsProps {\n clef: string;\n onClefChange: (clef: string) => void;\n keySignature: string;\n onKeySignatureChange: (key: string) => void;\n timeSignature: string;\n onTimeSignatureChange: (time: string) => void;\n variant?: 'default' | 'ghost';\n}\n\nexport interface StaffControlsHandle {\n openClefMenu: () => void;\n openKeySigMenu: () => void;\n openTimeSigMenu: () => void;\n isMenuOpen: () => boolean;\n}\n\nconst StaffControls = forwardRef<StaffControlsHandle, StaffControlsProps>(\n (\n {\n clef,\n onClefChange,\n keySignature,\n onKeySignatureChange,\n timeSignature,\n onTimeSignatureChange,\n variant = 'default',\n },\n ref\n ) => {\n const [showClefMenu, setShowClefMenu] = useState(false);\n const [showKeySig, setShowKeySig] = useState(false);\n const [showTimeSig, setShowTimeSig] = useState(false);\n\n const clefBtnRef = useRef<HTMLButtonElement>(null);\n const keySigBtnRef = useRef<HTMLButtonElement>(null);\n const timeSigBtnRef = useRef<HTMLButtonElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n openClefMenu: () => setShowClefMenu(true),\n openKeySigMenu: () => setShowKeySig(true),\n openTimeSigMenu: () => setShowTimeSig(true),\n isMenuOpen: () => showClefMenu || showKeySig || showTimeSig,\n }),\n [showClefMenu, showKeySig, showTimeSig]\n );\n\n const currentClef = CLEF_TYPES[clef] || CLEF_TYPES['treble'];\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Clef Selection */}\n <ToolbarButton\n ref={clefBtnRef}\n label={currentClef.label}\n showLabel={false}\n onClick={() => setShowClefMenu(!showClefMenu)}\n icon={<ClefIcon clef={clef || 'treble'} className=\"w-6 h-6\" />}\n variant={variant}\n />\n {showClefMenu && (\n <ClefOverlay\n current={clef}\n onSelect={(c: string) => {\n onClefChange(c);\n setShowClefMenu(false);\n }}\n onClose={() => setShowClefMenu(false)}\n position={{\n x: clefBtnRef.current?.getBoundingClientRect().left || 0,\n y: (clefBtnRef.current?.getBoundingClientRect().bottom || 0) + 5,\n }}\n triggerRef={clefBtnRef as React.RefObject<HTMLElement>}\n />\n )}\n\n {/* Key Signature */}\n <ToolbarButton\n ref={keySigBtnRef}\n label={KEY_SIGNATURES[keySignature]?.label || keySignature}\n showLabel={true}\n onClick={() => setShowKeySig(!showKeySig)}\n className=\"text-xs font-bold\"\n variant={variant}\n />\n {showKeySig && (\n <KeySignatureOverlay\n current={keySignature}\n clef={clef}\n onSelect={(k: string) => {\n onKeySignatureChange(k);\n setShowKeySig(false);\n }}\n onClose={() => setShowKeySig(false)}\n />\n )}\n\n {/* Time Signature */}\n <ToolbarButton\n ref={timeSigBtnRef}\n label={timeSignature}\n showLabel={true}\n onClick={() => setShowTimeSig(!showTimeSig)}\n className=\"text-xs font-bold\"\n variant={variant}\n />\n {showTimeSig && (\n <TimeSignatureOverlay\n current={timeSignature}\n onSelect={(ts: string) => {\n onTimeSignatureChange(ts);\n setShowTimeSig(false);\n }}\n onClose={() => setShowTimeSig(false)}\n position={{\n x: timeSigBtnRef.current?.getBoundingClientRect().left || 0,\n y: (timeSigBtnRef.current?.getBoundingClientRect().bottom || 0) + 5,\n }}\n triggerRef={timeSigBtnRef as React.RefObject<HTMLElement>}\n />\n )}\n </div>\n );\n }\n);\n\nStaffControls.displayName = 'StaffControls';\n\nexport default StaffControls;\n","// @ts-nocheck\nimport React from 'react';\nimport { PRECOMPOSED_NOTES_UP, BRAVURA_FONT } from '@/constants/SMuFL';\n\n// Custom sizing for notes that need adjustment\nconst NOTE_SIZING = {\n whole: { y: 14, fontSize: 24 }, // Centered (no stem)\n thirtysecond: { y: 20, fontSize: 20 },\n sixtyfourth: { y: 22, fontSize: 18 },\n};\n\nconst NoteIcon = ({ type, color = 'currentColor' }) => {\n const glyph = PRECOMPOSED_NOTES_UP[type] || PRECOMPOSED_NOTES_UP.quarter;\n const sizing = NOTE_SIZING[type] || { y: 20, fontSize: 24 };\n\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <text\n x={12}\n y={sizing.y}\n fontFamily={BRAVURA_FONT}\n fontSize={sizing.fontSize}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {glyph}\n </text>\n </svg>\n );\n};\n\nexport default NoteIcon;\n","// @ts-nocheck\nimport React from 'react';\nimport { REST_GLYPHS, BRAVURA_FONT } from '@/constants/SMuFL';\n\n/**\n * Renders rest glyphs for toolbar display using Bravura font.\n * Each glyph is handled in its own case for easy individual tuning.\n *\n * @param props.type - Duration type (whole, half, quarter, etc.)\n * @param props.color - Fill color for the glyph\n */\nconst RestIcon = ({ type, color = 'currentColor' }: { type: string; color?: string }) => {\n const commonProps = {\n fontFamily: BRAVURA_FONT,\n fill: color,\n textAnchor: 'middle' as const,\n style: { userSelect: 'none' as const },\n };\n\n const renderGlyph = () => {\n switch (type) {\n case 'whole':\n return (\n <>\n {/* Staff line visual aid (above) */}\n <line x1={6} y1={9.5} x2={18} y2={9.5} stroke={color} strokeWidth={1} />\n <text x={12} y={10} fontSize={24} {...commonProps}>\n {REST_GLYPHS.whole}\n </text>\n </>\n );\n\n case 'half':\n return (\n <>\n {/* Staff line visual aid (below) */}\n <line x1={6} y1={14} x2={18} y2={14} stroke={color} strokeWidth={1} />\n <text x={12} y={14} fontSize={24} {...commonProps}>\n {REST_GLYPHS.half}\n </text>\n </>\n );\n\n case 'quarter':\n return (\n <text x={12} y={14} fontSize={24} {...commonProps}>\n {REST_GLYPHS.quarter}\n </text>\n );\n\n case 'eighth':\n return (\n <text x={12} y={12} fontSize={26} {...commonProps}>\n {REST_GLYPHS.eighth}\n </text>\n );\n\n case 'sixteenth':\n return (\n <text x={12} y={10} fontSize={24} {...commonProps}>\n {REST_GLYPHS.sixteenth}\n </text>\n );\n\n case 'thirtysecond':\n return (\n <text x={12} y={12} fontSize={24} {...commonProps}>\n {REST_GLYPHS.thirtysecond}\n </text>\n );\n\n case 'sixtyfourth':\n return (\n <text x={12} y={10} fontSize={20} {...commonProps}>\n {REST_GLYPHS.sixtyfourth}\n </text>\n );\n\n default:\n // Default to quarter if unknown\n return (\n <text x={12} y={14} fontSize={24} {...commonProps}>\n {REST_GLYPHS.quarter}\n </text>\n );\n }\n };\n\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n {renderGlyph()}\n </svg>\n );\n};\n\nexport default RestIcon;\n","import React from 'react';\nimport { NOTE_TYPES } from '@/constants';\nimport NoteIcon from '../Assets/NoteIcon';\nimport RestIcon from '../Assets/RestIcon';\nimport ToolbarButton from './ToolbarButton';\nimport { InputMode } from './InputModeToggle';\n\ninterface DurationControlsProps {\n activeDuration: string;\n onDurationChange: (duration: string) => void;\n isDurationValid: (duration: string) => boolean;\n selectedDurations?: string[];\n editorState?: 'SELECTION_READY' | 'ENTRY_READY' | 'IDLE';\n /** Current input mode - shows rest icons when 'REST' */\n inputMode?: InputMode;\n variant?: 'default' | 'ghost';\n}\n\n/**\n * Duration selection controls for the toolbar.\n *\n * Displays note or rest icons based on inputMode.\n * Handles visual states for selection (active, emphasized, dashed).\n */\nconst DurationControls: React.FC<DurationControlsProps> = ({\n activeDuration,\n onDurationChange,\n isDurationValid,\n selectedDurations = [],\n editorState = 'IDLE',\n inputMode = 'NOTE',\n variant = 'default',\n}) => {\n return (\n <div className=\"flex gap-1\">\n {Object.keys(NOTE_TYPES).map((type) => {\n const shortcuts: Record<string, string> = {\n whole: '7',\n half: '6',\n quarter: '5',\n eighth: '4',\n sixteenth: '3',\n thirtysecond: '2',\n sixtyfourth: '1',\n };\n\n // Determine visual state\n let isActive = false;\n let isEmphasized = false;\n let isDashed = false;\n\n if (editorState === 'SELECTION_READY') {\n if (selectedDurations.length === 1 && selectedDurations.includes(type)) {\n isActive = true;\n } else if (selectedDurations.length > 1 && selectedDurations.includes(type)) {\n isEmphasized = true; // Outline style for mixed selection\n isDashed = true; // Dashed border for mixed selection\n }\n } else {\n // Entry / Idle mode: show active input duration\n isActive = activeDuration === type;\n }\n\n // Choose icon based on input mode\n const IconComponent = inputMode === 'REST' ? RestIcon : NoteIcon;\n\n return (\n <ToolbarButton\n key={type}\n onClick={() => onDurationChange(type)}\n label={NOTE_TYPES[type].label}\n title={`${NOTE_TYPES[type].label} (${shortcuts[type]})`}\n isActive={isActive}\n isEmphasized={isEmphasized}\n isDashed={isDashed}\n icon={<IconComponent type={type} color={isActive ? 'white' : 'currentColor'} />}\n preventFocus={true}\n disabled={!isDurationValid(type)}\n variant={variant}\n />\n );\n })}\n </div>\n );\n};\n\nexport default DurationControls;\n","import React from 'react';\n\nconst TieIcon = ({ size = 16, color = 'currentColor' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={color}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M 0 10 Q 12 23 24 10 Q 12 16 0 10 Z\" />\n </svg>\n );\n};\n\nexport default TieIcon;\n","import React from 'react';\nimport { Circle } from 'lucide-react';\nimport TieIcon from '../Assets/TieIcon';\nimport ToolbarButton from './ToolbarButton';\n\ninterface ModifierControlsProps {\n isDotted: boolean;\n onDotToggle: () => void;\n activeTie: boolean;\n onToggleTie: () => void;\n isDotValid: boolean;\n selectedDots?: boolean[];\n selectedTies?: boolean[];\n editorState?: string;\n variant?: 'default' | 'ghost';\n}\n\nconst ModifierControls: React.FC<ModifierControlsProps> = ({\n isDotted,\n onDotToggle,\n activeTie,\n onToggleTie,\n isDotValid,\n selectedDots = [],\n selectedTies = [],\n editorState = 'IDLE',\n variant = 'default',\n}) => {\n // Calculate visual states\n let dotActive = isDotted;\n let dotDashed = false;\n let dotEmphasized = false;\n\n if (editorState === 'SELECTION_READY') {\n if (selectedDots.length > 1) {\n // Mixed state\n dotActive = false;\n dotDashed = true;\n dotEmphasized = true;\n } else if (selectedDots.length === 1 && selectedDots[0] === true) {\n dotActive = true;\n } else {\n dotActive = false;\n }\n }\n\n let tieActive = activeTie;\n let tieDashed = false;\n let tieEmphasized = false;\n\n if (editorState === 'SELECTION_READY') {\n if (selectedTies.length > 1) {\n // Mixed state\n tieActive = false;\n tieDashed = true;\n tieEmphasized = true;\n } else if (selectedTies.length === 1 && selectedTies[0] === true) {\n tieActive = true;\n } else {\n tieActive = false;\n }\n }\n\n return (\n <div className=\"flex gap-1\">\n <ToolbarButton\n onClick={onDotToggle}\n label=\"Dotted Note\"\n isActive={dotActive}\n isDashed={dotDashed}\n isEmphasized={dotEmphasized}\n icon={<Circle size={8} fill=\"currentColor\" />}\n preventFocus={true}\n disabled={!isDotValid}\n variant={variant}\n />\n\n <ToolbarButton\n onClick={onToggleTie}\n label=\"Tie (T)\"\n isActive={tieActive}\n isDashed={tieDashed}\n isEmphasized={tieEmphasized}\n icon={<TieIcon size={16} />}\n preventFocus={true}\n variant={variant}\n />\n </div>\n );\n};\n\nexport default ModifierControls;\n","import React from 'react';\nimport ToolbarButton from './ToolbarButton';\n\ninterface AccidentalControlsProps {\n activeAccidental: 'flat' | 'natural' | 'sharp' | null;\n onToggleAccidental: (accidental: 'flat' | 'natural' | 'sharp') => void;\n selectedAccidentals?: (string | null)[];\n editorState?: string;\n variant?: 'default' | 'ghost';\n}\n\nconst AccidentalControls: React.FC<AccidentalControlsProps> = ({\n activeAccidental,\n onToggleAccidental,\n selectedAccidentals = [],\n editorState = 'IDLE',\n variant = 'default',\n}) => {\n // Logic:\n // If SELECTION_READY:\n // - If mixed selection (more than 1 type present), show DASHED for any present types.\n // - If homogeneous selection (only 1 type present), show ACTIVE for that type.\n // If IDLE/ENTRY:\n // - Show ACTIVE based on activeAccidental.\n\n const getVisualState = (type: 'flat' | 'natural' | 'sharp') => {\n let isActive = activeAccidental === type;\n let isDashed = false;\n let isEmphasized = false;\n\n if (editorState === 'SELECTION_READY' && selectedAccidentals.length > 0) {\n const present = selectedAccidentals.includes(type);\n\n if (selectedAccidentals.length > 1) {\n // Mixed state\n isActive = false;\n if (present) {\n isDashed = true;\n isEmphasized = true;\n }\n } else {\n // Homogeneous state\n // If only 'flat' is present, Flat button is active.\n isActive = present;\n isDashed = false;\n }\n }\n\n return { isActive, isDashed, isEmphasized };\n };\n\n const flatState = getVisualState('flat');\n const naturalState = getVisualState('natural');\n const sharpState = getVisualState('sharp');\n\n return (\n <div className=\"flex gap-1\">\n <ToolbarButton\n onClick={() => onToggleAccidental('flat')}\n label=\"Flat\"\n isActive={flatState.isActive}\n isDashed={flatState.isDashed}\n isEmphasized={flatState.isEmphasized}\n className=\"text-xl pb-1\"\n icon=\"♭\"\n preventFocus={true}\n variant={variant}\n />\n <ToolbarButton\n onClick={() => onToggleAccidental('natural')}\n label=\"Natural\"\n isActive={naturalState.isActive}\n isDashed={naturalState.isDashed}\n isEmphasized={naturalState.isEmphasized}\n className=\"text-xl pb-1\"\n icon=\"♮\"\n preventFocus={true}\n variant={variant}\n />\n <ToolbarButton\n onClick={() => onToggleAccidental('sharp')}\n label=\"Sharp\"\n isActive={sharpState.isActive}\n isDashed={sharpState.isDashed}\n isEmphasized={sharpState.isEmphasized}\n className=\"text-xl pb-1\"\n icon=\"♯\"\n preventFocus={true}\n variant={variant}\n />\n </div>\n );\n};\n\nexport default AccidentalControls;\n","import React from 'react';\nimport { SquarePlus, SquareMinus } from 'lucide-react';\nimport ToolbarButton from './ToolbarButton';\n\ninterface MeasureControlsProps {\n onAddMeasure: () => void;\n onRemoveMeasure: () => void;\n onTogglePickup: () => void;\n isPickup?: boolean;\n variant?: 'default' | 'ghost';\n}\n\nconst MeasureControls: React.FC<MeasureControlsProps> = ({\n onAddMeasure,\n onRemoveMeasure,\n onTogglePickup,\n isPickup,\n variant = 'default',\n}) => {\n return (\n <div className=\"flex gap-1\">\n <ToolbarButton\n onClick={onAddMeasure}\n label=\"Add Measure\"\n icon={<SquarePlus size={16} />}\n variant={variant}\n />\n <ToolbarButton\n onClick={onRemoveMeasure}\n label=\"Remove Measure\"\n icon={<SquareMinus size={16} />}\n variant={variant}\n />\n <ToolbarButton\n onClick={onTogglePickup}\n isActive={isPickup}\n label=\"Toggle Pickup\"\n icon={<span className=\"text-xs font-bold\">PK</span>}\n variant={variant}\n />\n </div>\n );\n};\n\nexport default MeasureControls;\n","import React from 'react';\nimport ToolbarButton from './ToolbarButton';\nimport { useTheme } from '@/context/ThemeContext';\n\ninterface TupletControlsProps {\n onApplyTuplet: (ratio: [number, number], groupSize: number) => void;\n onRemoveTuplet: () => void;\n canApplyTriplet: boolean;\n canApplyQuintuplet: boolean;\n activeTupletRatio: [number, number] | null;\n variant?: 'default' | 'ghost';\n}\n\n/**\n * Tuplet controls for the toolbar.\n * Allows users to apply common tuplets (triplet, quintuplet) to selected notes.\n */\nconst TupletControls: React.FC<TupletControlsProps> = ({\n onApplyTuplet,\n onRemoveTuplet,\n canApplyTriplet,\n canApplyQuintuplet,\n activeTupletRatio,\n variant = 'default',\n}) => {\n const { theme } = useTheme();\n\n const isTripletActive = activeTupletRatio?.[0] === 3 && activeTupletRatio?.[1] === 2;\n const isQuintupletActive = activeTupletRatio?.[0] === 5 && activeTupletRatio?.[1] === 4;\n\n const handleTriplet = () => {\n if (isTripletActive) {\n onRemoveTuplet();\n } else {\n onApplyTuplet([3, 2], 3);\n }\n };\n\n const handleQuintuplet = () => {\n if (isQuintupletActive) {\n onRemoveTuplet();\n } else {\n onApplyTuplet([5, 4], 5);\n }\n };\n\n return (\n <div className=\"flex gap-1\">\n {/* Triplet Button */}\n <ToolbarButton\n onClick={handleTriplet}\n label=\"Triplet (3)\"\n isActive={isTripletActive}\n disabled={!canApplyTriplet && !isTripletActive}\n preventFocus={true}\n icon={\n <div\n className=\"flex flex-col items-center justify-center\"\n style={{ fontSize: '10px', lineHeight: '1' }}\n >\n <span style={{ fontWeight: 'bold', fontSize: '11px' }}>3</span>\n <div className=\"flex gap-0.5 mt-0.5\">\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n </div>\n </div>\n }\n variant={variant}\n />\n\n {/* Quintuplet Button */}\n <ToolbarButton\n onClick={handleQuintuplet}\n label=\"Quintuplet (5)\"\n isActive={isQuintupletActive}\n disabled={!canApplyQuintuplet && !isQuintupletActive}\n preventFocus={true}\n icon={\n <div\n className=\"flex flex-col items-center justify-center\"\n style={{ fontSize: '10px', lineHeight: '1' }}\n >\n <span style={{ fontWeight: 'bold', fontSize: '11px' }}>5</span>\n <div className=\"flex gap-0.5 mt-0.5\">\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n <div\n className=\"w-1 h-1 rounded-full\"\n style={{ backgroundColor: 'currentColor' }}\n ></div>\n </div>\n </div>\n }\n variant={variant}\n />\n\n {/* Remove Tuplet Button */}\n </div>\n );\n};\n\nexport default TupletControls;\n","import React from 'react';\nimport { Melody } from '@/types';\nimport { BookOpen } from 'lucide-react';\nimport DropdownOverlay, { DropdownItem } from './Menus/DropdownOverlay';\nimport { useTheme } from '@/context/ThemeContext';\n\ninterface MelodyLibraryProps {\n melodies: Melody[];\n onSelectMelody: (melody: Melody) => void;\n onClose: () => void;\n position: { x: number; y: number };\n triggerRef?: React.RefObject<HTMLElement>;\n}\n\nconst MelodyLibrary: React.FC<MelodyLibraryProps> = ({\n melodies,\n onSelectMelody,\n onClose,\n position,\n triggerRef,\n}) => {\n const { theme } = useTheme();\n\n return (\n <DropdownOverlay\n onClose={onClose}\n position={position}\n triggerRef={triggerRef}\n width={256} // w-64\n maxHeight={320} // max-h-80\n >\n <div\n className=\"px-4 py-3 border-b flex items-center gap-2\"\n style={{\n backgroundColor: theme.buttonHoverBackground,\n borderColor: theme.border,\n }}\n >\n <BookOpen size={16} style={{ color: theme.secondaryText }} />\n <h3 className=\"font-semibold text-sm\" style={{ color: theme.text }}>\n Melody Library\n </h3>\n </div>\n\n <div className=\"overflow-y-auto p-2 dropdown-scroll\" style={{ maxHeight: '320px' }}>\n {melodies.map((melody) => (\n <DropdownItem key={melody.id} onClick={() => onSelectMelody(melody)}>\n {melody.title}\n </DropdownItem>\n ))}\n </div>\n </DropdownOverlay>\n );\n};\n\nexport default MelodyLibrary;\n","import React from 'react';\nimport { useTheme } from '@/context/ThemeContext';\nimport { RESTS, NOTEHEADS, BRAVURA_FONT } from '@/constants/SMuFL';\n\n/**\n * Input mode for the toolbar - determines whether clicks/keyboard\n * entry creates notes or rests.\n */\nexport type InputMode = 'NOTE' | 'REST';\n\ninterface InputModeToggleProps {\n /** Current input mode */\n mode: InputMode;\n /** Callback when mode is toggled */\n onToggle: () => void;\n variant?: 'default' | 'ghost';\n}\n\n/**\n * Composite icon showing multiple rests to represent \"Rest Mode\".\n * Used when current mode is \"NOTE\" (shows what clicking will switch to).\n */\nconst RestGroupIcon = ({ color }: { color: string }) => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Eighth Rest */}\n <text\n x={5}\n y={15}\n fontFamily={BRAVURA_FONT}\n fontSize={20}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {RESTS.eighth}\n </text>\n\n {/* Quarter Rest (Center, larger) */}\n <text\n x={12}\n y={14}\n fontFamily={BRAVURA_FONT}\n fontSize={24}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {RESTS.quarter}\n </text>\n\n {/* Sixteenth Rest */}\n <text\n x={19}\n y={13}\n fontFamily={BRAVURA_FONT}\n fontSize={18}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {RESTS.sixteenth}\n </text>\n </svg>\n);\n\n/**\n * Composite icon showing multiple notes to represent \"Note Mode\".\n * Used when current mode is \"REST\" (shows what clicking will switch to).\n */\nconst NoteGroupIcon = ({ color }: { color: string }) => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Eighth Note (Black notehead) */}\n <text\n x={6}\n y={18}\n fontFamily={BRAVURA_FONT}\n fontSize={20}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {NOTEHEADS.black}\n </text>\n {/* Stem for Eighth */}\n <line x1={8.5} y1={18} x2={8.5} y2={8} stroke={color} strokeWidth={1.5} />\n\n {/* Quarter Note (Center, larger) */}\n <text\n x={12}\n y={19}\n fontFamily={BRAVURA_FONT}\n fontSize={24}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {NOTEHEADS.black}\n </text>\n <line x1={15} y1={19} x2={15} y2={6} stroke={color} strokeWidth={2} />\n\n {/* Half Note (White notehead) */}\n <text\n x={18}\n y={18}\n fontFamily={BRAVURA_FONT}\n fontSize={20}\n fill={color}\n textAnchor=\"middle\"\n style={{ userSelect: 'none' }}\n >\n {NOTEHEADS.half}\n </text>\n <line x1={20.5} y1={18} x2={20.5} y2={8} stroke={color} strokeWidth={1.5} />\n </svg>\n);\n\nimport ToolbarButton from './ToolbarButton';\n\nconst InputModeToggle: React.FC<InputModeToggleProps> = ({\n mode,\n onToggle,\n variant = 'default',\n}) => {\n const { theme } = useTheme();\n\n const isActive = mode === 'REST';\n\n return (\n <ToolbarButton\n label=\"Toggle Input Mode\"\n onClick={onToggle}\n isActive={false}\n title={isActive ? 'Switch to Note Mode (R)' : 'Switch to Rest Mode (R)'}\n preventFocus={true}\n icon={\n isActive ? (\n <NoteGroupIcon color={theme.secondaryText} />\n ) : (\n <RestGroupIcon color={theme.secondaryText} />\n )\n }\n variant={variant}\n />\n );\n};\n\nexport default InputModeToggle;\n","export const generateJSON = (score: any) => {\n return JSON.stringify(score, null, 2);\n};\n","// @ts-nocheck\nimport { NOTE_TYPES } from '@/constants';\nimport { getActiveStaff } from '@/types';\nimport { isRestEvent } from '@/utils/core';\n\n// ABC notation pitch mapping - Algorithmic\nconst toAbcPitch = (pitch: string, clef: string = 'treble'): string => {\n // Extract letter and octave\n const match = pitch.match(/^([A-G])(#{1,2}|b{1,2})?(\\d+)$/);\n if (!match) return 'C'; // Fallback\n\n const letter = match[1];\n const octave = parseInt(match[3], 10);\n\n // ABC Logic:\n // C4 (Middle C) -> C\n // c (C5) -> c\n // c' (C6) -> c'\n // C, (C3) -> C,\n\n let abcPitch = '';\n\n if (octave >= 5) {\n abcPitch = letter.toLowerCase();\n if (octave > 5) {\n abcPitch += \"'\".repeat(octave - 5);\n }\n } else {\n abcPitch = letter.toUpperCase();\n if (octave < 4) {\n abcPitch += ','.repeat(4 - octave);\n }\n }\n\n return abcPitch;\n};\n\nexport const generateABC = (score: any, bpm: number) => {\n // Phase 2: Iterate over all staves\n const staves = score.staves || [getActiveStaff(score)]; // Fallback for safety\n const timeSig = score.timeSignature || '4/4';\n const keySig = score.keySignature || 'C';\n\n // Header\n let abc = `X:1\\nT:${score.title}\\nM:${timeSig}\\nL:1/4\\nK:${keySig}\\nQ:1/4=${bpm}\\n`;\n\n // Staves definition if multiple\n if (staves.length > 1) {\n abc += `%%staves {${staves.map((_, i) => i + 1).join(' ')}}\\n`;\n }\n\n staves.forEach((staff: any, staffIndex: number) => {\n const clef = staff.clef || 'treble';\n const abcClef = clef === 'bass' ? 'bass' : 'treble';\n const voiceId = staffIndex + 1;\n\n // Voice Header\n abc += `V:${voiceId} clef=${abcClef}\\n`;\n\n staff.measures.forEach((measure: any, i: number) => {\n measure.events.forEach((event: any) => {\n // Calculate Duration\n let durationString = '';\n const base = NOTE_TYPES[event.duration]?.abcDuration || '';\n\n if (event.dotted) {\n // Handle dotted durations explicitly\n switch (event.duration) {\n case 'whole':\n durationString = '6';\n break;\n case 'half':\n durationString = '3';\n break;\n case 'quarter':\n durationString = '3/2';\n break;\n case 'eighth':\n durationString = '3/4';\n break;\n case 'sixteenth':\n durationString = '3/8';\n break;\n case 'thirtysecond':\n durationString = '3/16';\n break;\n case 'sixtyfourth':\n durationString = '3/32';\n break;\n default:\n durationString = base;\n }\n } else {\n durationString = base;\n }\n\n let prefix = '';\n // Handle Tuplets\n if (event.tuplet && event.tuplet.position === 0) {\n prefix += `(${event.tuplet.ratio[0]}`;\n }\n\n if (isRestEvent(event)) {\n // Rest\n abc += `${prefix}z${durationString} `;\n } else {\n // Notes/Chords\n const formatNote = (n: any) => {\n let acc = '';\n // 1. Check explicit property\n if (n.accidental === 'sharp') acc = '^';\n else if (n.accidental === 'flat') acc = '_';\n else if (n.accidental === 'natural') acc = '=';\n else if (n.accidental === 'double-sharp') acc = '^^';\n else if (n.accidental === 'double-flat') acc = '__';\n\n // 2. Fallback: Check Pitch String\n // If no explicit accidental property, parse from \"F#4\", \"Bb4\", etc.\n if (!acc) {\n // Match accidentals: #, ##, b, bb anywhere in string\n if (n.pitch.includes('##')) acc = '^^';\n else if (n.pitch.includes('#')) acc = '^';\n else if (n.pitch.includes('bb')) acc = '__';\n else if (n.pitch.includes('b')) acc = '_'; // Note: Be careful with 'b' vs flat symbol if stored as unicode, but usually it's 'b'. Tonal uses 'b'.\n }\n\n const pitch = toAbcPitch(n.pitch, clef);\n const tie = n.tied ? '-' : '';\n return `${acc}${pitch}${tie}`;\n };\n\n if (event.notes.length > 1) {\n const chordContent = event.notes.map(formatNote).join('');\n abc += `${prefix}[${chordContent}]${durationString} `;\n } else {\n const noteContent = formatNote(event.notes[0]);\n abc += `${prefix}${noteContent}${durationString} `;\n }\n }\n });\n abc += '| ';\n if ((i + 1) % 4 === 0) abc += '\\n';\n });\n abc += '\\n'; // Newline after each voice/staff block\n });\n\n return abc;\n};\n","// @ts-nocheck\nimport { NOTE_TYPES, KEY_SIGNATURES } from '@/constants';\nimport { getActiveStaff } from '@/types';\nimport { isRestEvent } from '@/utils/core';\n\nexport const generateMusicXML = (score: any) => {\n // Phase 2: Iterate over all staves\n const staves = score.staves || [getActiveStaff(score)];\n const timeSig = score.timeSignature || '4/4';\n\n // Calculate Key Signature Fifths (Global)\n const keySigData = KEY_SIGNATURES[score.keySignature || 'C'];\n let fifths = 0;\n if (keySigData) {\n fifths = keySigData.type === 'sharp' ? keySigData.count : -keySigData.count;\n }\n\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 3.1 Partwise//EN\" \"http://www.musicxml.org/dtds/partwise.dtd\">\n<score-partwise version=\"3.1\">\n <part-list>`;\n\n // Generate Part List\n staves.forEach((_, index) => {\n const id = index + 1;\n xml += `\n <score-part id=\"P${id}\">\n <part-name>Staff ${id}</part-name>\n </score-part>`;\n });\n\n xml += `\n </part-list>`;\n\n // Generate Parts\n staves.forEach((staff: any, staffIndex: number) => {\n const partId = `P${staffIndex + 1}`;\n const clef = staff.clef || 'treble';\n // Clef logic\n const clefSign = clef === 'bass' ? 'F' : 'G';\n const clefLine = clef === 'bass' ? '4' : '2';\n\n // Track active ties specific to this part\n const activeTies = new Set<string>();\n\n xml += `\n <part id=\"${partId}\">`;\n\n staff.measures.forEach((measure: any, mIndex: number) => {\n xml += `\\n <measure number=\"${mIndex + 1}\">`;\n\n // Attributes appear on first measure\n if (mIndex === 0) {\n xml += `\n <attributes>\n <divisions>16</divisions>\n <key>\n <fifths>${fifths}</fifths>\n </key>\n <time>\n <beats>${timeSig.split('/')[0]}</beats>\n <beat-type>${timeSig.split('/')[1]}</beat-type>\n </time>\n <clef>\n <sign>${clefSign}</sign>\n <line>${clefLine}</line>\n </clef>\n </attributes>`;\n }\n\n // Render Events sequentially\n measure.events.forEach((event: any) => {\n let duration = NOTE_TYPES[event.duration].duration;\n if (event.dotted) duration = duration * 1.5;\n\n // Tuplet Duration Scaling\n if (event.tuplet) {\n duration = Math.floor((duration * event.tuplet.ratio[1]) / event.tuplet.ratio[0]);\n }\n\n const xmlType = NOTE_TYPES[event.duration].xmlType;\n\n if (isRestEvent(event)) {\n // REST\n xml += `\n <note>\n <rest/>\n <duration>${duration}</duration>\n <type>${xmlType}</type>\n ${event.dotted ? '<dot/>' : ''}\n </note>`;\n } else {\n // NOTES / CHORDS\n event.notes.forEach((note: any, nIndex: number) => {\n const isChord = nIndex > 0;\n const step = note.pitch.charAt(0);\n const octave = note.pitch.slice(-1);\n\n let accidentalTag = '';\n if (note.accidental) {\n const acc =\n note.accidental === 'natural'\n ? 'natural'\n : note.accidental === 'sharp'\n ? 'sharp'\n : note.accidental === 'flat'\n ? 'flat'\n : '';\n if (acc) accidentalTag = `<accidental>${acc}</accidental>`;\n }\n\n // Tie Logic\n let tieTags = '';\n let tiedNotations = '';\n const pitchKey = note.pitch;\n\n if (activeTies.has(pitchKey)) {\n tieTags += '<tie type=\"stop\"/>';\n tiedNotations += '<tied type=\"stop\"/>';\n }\n\n if (note.tied) {\n tieTags += '<tie type=\"start\"/>';\n tiedNotations += '<tied type=\"start\"/>';\n activeTies.add(pitchKey);\n } else {\n if (activeTies.has(pitchKey)) {\n activeTies.delete(pitchKey);\n }\n }\n\n if (tiedNotations) {\n tiedNotations = `<notations>${tiedNotations}</notations>`;\n }\n\n // Tuplet Logic\n let timeModTag = '';\n let tupletNotations = '';\n if (event.tuplet) {\n timeModTag = `\n <time-modification>\n <actual-notes>${event.tuplet.groupSize}</actual-notes>\n <normal-notes>${event.tuplet.ratio[1]}</normal-notes>\n </time-modification>`;\n\n if (event.tuplet.position === 0) {\n const tupTag = '<tuplet type=\"start\" bracket=\"yes\"/>';\n if (tiedNotations) {\n tupletNotations = tupTag;\n } else {\n tupletNotations = `<notations>${tupTag}</notations>`;\n }\n } else if (event.tuplet.position === event.tuplet.groupSize - 1) {\n const tupTag = '<tuplet type=\"stop\"/>';\n if (tiedNotations) {\n tupletNotations = tupTag;\n } else {\n tupletNotations = `<notations>${tupTag}</notations>`;\n }\n }\n }\n\n // Merge notations\n let finalNotations = tiedNotations;\n if (tupletNotations) {\n if (finalNotations) {\n const content = tupletNotations\n .replace('<notations>', '')\n .replace('</notations>', '');\n finalNotations = finalNotations.replace('</notations>', `${content}</notations>`);\n } else {\n finalNotations = tupletNotations;\n }\n }\n\n xml += `\n <note>\n ${isChord ? '<chord/>' : ''}\n <pitch>\n <step>${step}</step>\n <octave>${octave}</octave>\n </pitch>\n <duration>${duration}</duration>\n <type>${xmlType}</type>\n ${accidentalTag}\n ${timeModTag}\n ${event.dotted ? '<dot/>' : ''}\n ${tieTags}\n ${finalNotations}\n </note>`;\n });\n }\n });\n xml += `\\n </measure>`;\n });\n xml += `\\n </part>`;\n });\n\n xml += `\\n</score-partwise>`;\n return xml;\n};\n","import { useMemo, useCallback } from 'react';\nimport { Score } from '@/types';\nimport { generateJSON } from '../exporters/jsonExporter';\nimport { generateABC } from '../exporters/abcExporter';\nimport { generateMusicXML } from '../exporters/musicXmlExporter';\n\nexport type ExportFormat = 'json' | 'abc' | 'musicxml';\n\ninterface FileInfo {\n filename: string;\n mimeType: string;\n extension: string;\n}\n\nconst getFileInfo = (format: ExportFormat, title: string): FileInfo => {\n const safeTitle = title.replace(/[^a-zA-Z0-9]/g, '_') || 'untitled';\n\n switch (format) {\n case 'json':\n return { filename: `${safeTitle}.json`, mimeType: 'application/json', extension: '.json' };\n case 'abc':\n return { filename: `${safeTitle}.abc`, mimeType: 'text/plain', extension: '.abc' };\n case 'musicxml':\n return {\n filename: `${safeTitle}.musicxml`,\n mimeType: 'application/vnd.recordare.musicxml+xml',\n extension: '.musicxml',\n };\n }\n};\n\nexport function useExport(score: Score, bpm: number) {\n const generate = useCallback(\n (format: ExportFormat): string => {\n switch (format) {\n case 'json':\n return generateJSON(score);\n case 'abc':\n return generateABC(score, bpm);\n case 'musicxml':\n return generateMusicXML(score);\n }\n },\n [score, bpm]\n );\n\n const copyToClipboard = useCallback(\n async (format: ExportFormat): Promise<void> => {\n const content = generate(format);\n await navigator.clipboard.writeText(content);\n },\n [generate]\n );\n\n const downloadFile = useCallback(\n async (format: ExportFormat): Promise<void> => {\n const content = generate(format);\n const { filename, mimeType } = getFileInfo(format, score.title);\n\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n },\n [generate, score.title]\n );\n\n return { copyToClipboard, downloadFile };\n}\n","import React, { useState, useRef } from 'react';\nimport { Menu, Copy, Check, Download, FileJson, Music, FileCode } from 'lucide-react';\nimport ToolbarButton from './ToolbarButton';\nimport DropdownOverlay from './Menus/DropdownOverlay';\nimport { useTheme } from '@/context/ThemeContext';\nimport { useExport, ExportFormat } from '@/hooks/useExport';\nimport { Score } from '@/types';\n\ninterface FileMenuProps {\n score: Score;\n bpm: number;\n height?: string;\n variant?: 'default' | 'ghost';\n}\n\n// Reusable export action button with hover effect\ninterface ExportButtonProps {\n onClick: () => void;\n icon: React.ReactNode;\n successIcon?: React.ReactNode;\n label: string;\n isSuccess?: boolean;\n}\n\nconst ExportButton: React.FC<ExportButtonProps> = ({\n onClick,\n icon,\n successIcon = <Check size={14} />,\n label,\n isSuccess = false,\n}) => {\n const { theme } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className=\"p-1.5 rounded transition-colors\"\n style={{\n backgroundColor: isSuccess\n ? 'transparent'\n : isHovered\n ? theme.buttonHoverBackground\n : theme.buttonBackground,\n color: isSuccess ? '#4ade80' : theme.text,\n borderColor: theme.border,\n }}\n title={label}\n >\n {isSuccess ? successIcon : icon}\n </button>\n );\n};\n\ninterface ExportRowProps {\n label: string;\n icon: React.ReactNode;\n format: ExportFormat;\n onCopy: (format: ExportFormat) => Promise<void>;\n onDownload: (format: ExportFormat) => Promise<void>;\n feedback: string | null;\n}\n\nconst ExportRow: React.FC<ExportRowProps> = ({\n label,\n icon,\n format,\n onCopy,\n onDownload,\n feedback,\n}) => {\n const { theme } = useTheme();\n const isCopied = feedback === `${format}-copy`;\n const isDownloaded = feedback === `${format}-download`;\n\n return (\n <div\n className=\"flex items-center justify-between px-4 py-2 border-b last:border-b-0\"\n style={{ borderColor: theme.border }}\n >\n <div className=\"flex items-center gap-2 text-sm\" style={{ color: theme.text }}>\n <span style={{ color: theme.secondaryText }}>{icon}</span>\n {label}\n </div>\n <div className=\"flex gap-1\">\n <ExportButton\n onClick={() => onCopy(format)}\n icon={<Copy size={14} />}\n label=\"Copy to clipboard\"\n isSuccess={isCopied}\n />\n <ExportButton\n onClick={() => onDownload(format)}\n icon={<Download size={14} />}\n label=\"Download file\"\n isSuccess={isDownloaded}\n />\n </div>\n </div>\n );\n};\n\nconst FileMenu: React.FC<FileMenuProps> = ({ score, bpm, height = 'h-9', variant = 'default' }) => {\n const [isOpen, setIsOpen] = useState(false);\n const [feedback, setFeedback] = useState<string | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { theme } = useTheme();\n const { copyToClipboard, downloadFile } = useExport(score, bpm);\n\n const handleAction = async (format: ExportFormat, action: 'copy' | 'download') => {\n try {\n if (action === 'copy') {\n await copyToClipboard(format);\n } else {\n await downloadFile(format);\n }\n setFeedback(`${format}-${action}`);\n setTimeout(() => {\n setFeedback(null);\n setIsOpen(false);\n }, 1000);\n } catch (error) {\n console.error(`Export failed:`, error);\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n setFeedback(null);\n };\n\n return (\n <div className=\"relative\">\n <ToolbarButton\n ref={buttonRef}\n icon={<Menu size={18} />}\n label=\"File Menu\"\n onClick={() => setIsOpen(!isOpen)}\n isActive={isOpen}\n preventFocus={true}\n height={height}\n variant={variant}\n />\n\n {isOpen && (\n <DropdownOverlay\n onClose={handleClose}\n triggerRef={buttonRef as React.RefObject<HTMLElement>}\n position={{\n x: buttonRef.current?.getBoundingClientRect().left || 0,\n y: (buttonRef.current?.getBoundingClientRect().bottom || 0) + 5,\n }}\n width={220}\n >\n <div\n className=\"px-4 py-2 border-b\"\n style={{\n backgroundColor: theme.buttonHoverBackground,\n borderColor: theme.border,\n }}\n >\n <h3 className=\"font-semibold text-sm\" style={{ color: theme.text }}>\n Export\n </h3>\n </div>\n\n <ExportRow\n label=\"JSON\"\n icon={<FileJson size={14} />}\n format=\"json\"\n onCopy={(f) => handleAction(f, 'copy')}\n onDownload={(f) => handleAction(f, 'download')}\n feedback={feedback}\n />\n <ExportRow\n label=\"ABC Notation\"\n icon={<Music size={14} />}\n format=\"abc\"\n onCopy={(f) => handleAction(f, 'copy')}\n onDownload={(f) => handleAction(f, 'download')}\n feedback={feedback}\n />\n <ExportRow\n label=\"MusicXML\"\n icon={<FileCode size={14} />}\n format=\"musicxml\"\n onCopy={(f) => handleAction(f, 'copy')}\n onDownload={(f) => handleAction(f, 'download')}\n feedback={feedback}\n />\n </DropdownOverlay>\n )}\n </div>\n );\n};\n\nexport default FileMenu;\n","import React from 'react';\nimport { RotateCcw, RotateCw } from 'lucide-react';\nimport ToolbarButton from './ToolbarButton';\n\ninterface HistoryControlsProps {\n canUndo: boolean;\n onUndo: () => void;\n canRedo: boolean;\n onRedo: () => void;\n height?: string;\n variant?: 'default' | 'ghost';\n}\n\nconst HistoryControls: React.FC<HistoryControlsProps> = ({\n canUndo,\n onUndo,\n canRedo,\n onRedo,\n height = 'h-9',\n variant = 'default',\n}) => {\n return (\n <div className=\"flex gap-1\">\n <ToolbarButton\n icon={<RotateCcw size={18} />}\n label=\"Undo\"\n onClick={onUndo}\n disabled={!canUndo}\n height={height}\n variant={variant}\n />\n <ToolbarButton\n icon={<RotateCw size={18} />}\n label=\"Redo\"\n onClick={onRedo}\n disabled={!canRedo}\n height={height}\n variant={variant}\n />\n </div>\n );\n};\n\nexport default HistoryControls;\n","import React, { useState, useRef } from 'react';\nimport { AudioWaveform, Check } from 'lucide-react';\nimport { InstrumentType, setInstrument } from '@/engines/toneEngine';\nimport DropdownOverlay, { DropdownItem, DropdownTrigger } from './Menus/DropdownOverlay';\n\ninterface InstrumentSelectorProps {\n selectedInstrument: InstrumentType;\n onInstrumentChange: (instrument: InstrumentType) => void;\n samplerLoaded: boolean;\n height?: string;\n}\n\nconst InstrumentSelector: React.FC<InstrumentSelectorProps> = ({\n selectedInstrument,\n onInstrumentChange,\n samplerLoaded,\n height = 'h-9',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const options = [\n { id: 'bright' as InstrumentType, name: 'Bright Synth' },\n { id: 'mellow' as InstrumentType, name: 'Mellow Synth' },\n { id: 'organ' as InstrumentType, name: 'Organ Synth' },\n {\n id: 'piano' as InstrumentType,\n name: samplerLoaded ? 'Piano Samples' : 'Piano (Loading...)',\n loading: !samplerLoaded,\n },\n ];\n\n const selectedOption = options.find((o) => o.id === selectedInstrument) || options[0];\n\n const handleSelect = (id: InstrumentType) => {\n onInstrumentChange(id);\n setInstrument(id);\n setIsOpen(false);\n };\n\n // Calculate dropdown position\n const getPosition = () => {\n if (!buttonRef.current) return { x: 0, y: 0 };\n const rect = buttonRef.current.getBoundingClientRect();\n return { x: rect.left, y: rect.bottom + 4 };\n };\n\n return (\n <div className=\"relative\">\n <DropdownTrigger\n ref={buttonRef}\n label={selectedOption.name}\n icon={<AudioWaveform size={14} />}\n isOpen={isOpen}\n onClick={() => setIsOpen(!isOpen)}\n height={height}\n />\n\n {isOpen && (\n <DropdownOverlay\n onClose={() => setIsOpen(false)}\n position={getPosition()}\n triggerRef={buttonRef as React.RefObject<HTMLElement>}\n width={176}\n >\n <div className=\"p-1\">\n {options.map((option) => (\n <DropdownItem\n key={option.id}\n onClick={() => handleSelect(option.id)}\n isSelected={option.id === selectedInstrument}\n >\n <span className=\"flex items-center justify-between w-full\">\n <span>{option.name}</span>\n {option.id === selectedInstrument && (\n <Check size={12} className=\"text-green-600\" />\n )}\n </span>\n </DropdownItem>\n ))}\n </div>\n </DropdownOverlay>\n )}\n </div>\n );\n};\n\nexport default InstrumentSelector;\n","import React, { useState, useEffect } from 'react';\nimport { Play, Pause } from 'lucide-react';\nimport { useTheme } from '@/context/ThemeContext';\nimport ToolbarButton from './ToolbarButton';\nimport InstrumentSelector from './InstrumentSelector';\nimport { PRECOMPOSED_NOTES_UP, BRAVURA_FONT } from '@/constants/SMuFL';\nimport { InstrumentType } from '@/engines/toneEngine';\n\ninterface PlaybackControlsProps {\n isPlaying: boolean;\n onPlayToggle?: () => void;\n bpm: number;\n onBpmChange: (bpm: number) => void;\n selectedInstrument: InstrumentType;\n onInstrumentChange: (instrument: InstrumentType) => void;\n samplerLoaded: boolean;\n height?: string;\n variant?: 'default' | 'ghost';\n}\n\nconst PlaybackControls: React.FC<PlaybackControlsProps> = ({\n isPlaying,\n onPlayToggle,\n bpm,\n onBpmChange,\n selectedInstrument,\n onInstrumentChange,\n samplerLoaded,\n height = 'h-9',\n variant = 'default',\n}) => {\n const { theme } = useTheme();\n const [bpmBuffer, setBpmBuffer] = useState(String(bpm));\n const [isFocused, setIsFocused] = useState(false);\n const [isBpmHovered, setIsBpmHovered] = useState(false);\n\n useEffect(() => {\n setBpmBuffer(String(bpm));\n }, [bpm]);\n\n const handleBpmBlur = () => {\n setIsFocused(false);\n const value = Number(bpmBuffer);\n if (!bpmBuffer || isNaN(value) || value <= 0) {\n setBpmBuffer('120');\n onBpmChange(120);\n } else {\n const clamped = Math.max(1, Math.min(300, value));\n setBpmBuffer(String(clamped));\n onBpmChange(clamped);\n }\n };\n\n const isGhost = variant === 'ghost';\n\n return (\n <div className=\"flex items-center gap-2\">\n <ToolbarButton\n icon={\n isPlaying ? (\n <Pause size={14} fill=\"currentColor\" />\n ) : (\n <Play size={14} fill=\"currentColor\" />\n )\n }\n showLabel={true}\n label={isPlaying ? 'Pause' : 'Play'}\n onClick={onPlayToggle}\n isEmphasized={true}\n height={height}\n variant={variant}\n />\n\n <div\n className={`flex items-center gap-0 px-2 rounded border ${height} transition-colors`}\n style={{\n borderColor: isFocused\n ? theme.accent\n : isGhost && !isBpmHovered\n ? 'transparent'\n : theme.border,\n backgroundColor: isGhost && !isBpmHovered && !isFocused ? 'transparent' : 'transparent',\n }}\n onMouseEnter={() => setIsBpmHovered(true)}\n onMouseLeave={() => setIsBpmHovered(false)}\n >\n <span className=\"flex items-center gap-0.5\" style={{ color: theme.secondaryText }}>\n <span\n style={{\n fontFamily: BRAVURA_FONT,\n fontSize: '1.5rem',\n lineHeight: 1,\n marginBottom: '-1rem',\n marginRight: '.25rem',\n marginLeft: '.25rem',\n }}\n >\n {PRECOMPOSED_NOTES_UP.quarter}\n </span>\n <span className=\"text-xs font-bold px-2\"> = </span>\n </span>\n <input\n type=\"text\"\n value={bpmBuffer}\n onChange={(e) => setBpmBuffer(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBpmBlur}\n className=\"w-8 bg-transparent text-sm font-bold text-center outline-none\"\n style={{ color: theme.accent }}\n />\n </div>\n\n {/* Instrument Selector */}\n <InstrumentSelector\n selectedInstrument={selectedInstrument}\n onInstrumentChange={onInstrumentChange}\n samplerLoaded={samplerLoaded}\n height={height}\n />\n </div>\n );\n};\n\nexport default PlaybackControls;\n","import React from 'react';\nimport { useTheme } from '@/context/ThemeContext';\n\ninterface DividerProps {\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n}\n\n/**\n * A themed divider component for toolbar sections\n */\nconst Divider: React.FC<DividerProps> = ({ orientation = 'vertical', className = '' }) => {\n const { theme } = useTheme();\n\n if (orientation === 'horizontal') {\n return <div className={`w-full h-px ${className}`} style={{ backgroundColor: theme.border }} />;\n }\n\n return <div className={`w-px h-6 ${className}`} style={{ backgroundColor: theme.border }} />;\n};\n\nexport default Divider;\n","import React, { useRef, useImperativeHandle, forwardRef, useState } from 'react';\nimport { BookOpen, HelpCircle } from 'lucide-react';\n\n// Contexts & Types\nimport { useTheme } from '@/context/ThemeContext';\nimport { useScoreContext } from '@/context/ScoreContext';\nimport { Melody, getActiveStaff } from '@/types';\nimport { InstrumentType } from '@/engines/toneEngine';\n\n// Hooks & Commands\nimport { useFocusTrap } from '@/hooks/useFocusTrap';\nimport { ToggleRestCommand } from '@/commands/ToggleRestCommand';\nimport { LoadScoreCommand } from '@/commands/LoadScoreCommand';\n\n// UI Components\nimport StaffControls, { StaffControlsHandle } from './StaffControls';\nimport DurationControls from './DurationControls';\nimport ModifierControls from './ModifierControls';\nimport AccidentalControls from './AccidentalControls';\nimport MeasureControls from './MeasureControls';\nimport TupletControls from './TupletControls';\nimport MelodyLibrary from './MelodyLibrary';\nimport ToolbarButton from './ToolbarButton';\nimport InputModeToggle from './InputModeToggle';\nimport FileMenu from './FileMenu';\nimport HistoryControls from './HistoryControls';\nimport PlaybackControls from './PlaybackControls';\n// import MidiControls from './MidiControls';\nimport Divider from './Divider';\nimport { DropdownTrigger } from './Menus/DropdownOverlay';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface ToolbarProps {\n // Metadata\n scoreTitle: string;\n label?: string;\n isEditingTitle: boolean;\n onEditingChange: (isEditing: boolean) => void;\n onTitleChange: (title: string) => void;\n\n // Playback & System\n isPlaying: boolean;\n onPlayToggle?: () => void;\n bpm: number;\n onBpmChange: (bpm: number) => void;\n errorMsg: string | null;\n onToggleHelp: () => void;\n onEscape?: () => void;\n\n // MIDI / Audio\n midiStatus: { connected: boolean; deviceName: string | null; error: string | null };\n samplerLoaded: boolean;\n selectedInstrument: InstrumentType;\n onInstrumentChange: (instrument: InstrumentType) => void;\n\n // Data\n melodies: Melody[];\n}\n\nexport interface ToolbarHandle {\n openKeySigMenu: () => void;\n openTimeSigMenu: () => void;\n openClefMenu: () => void;\n isMenuOpen: () => boolean;\n}\n\nconst TOP_ROW_HEIGHT = 'h-9';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Toolbar = forwardRef<ToolbarHandle, ToolbarProps>(\n (\n {\n isPlaying,\n onPlayToggle,\n bpm,\n onBpmChange,\n errorMsg,\n onToggleHelp,\n midiStatus = { connected: false, deviceName: null, error: null },\n melodies,\n selectedInstrument,\n onInstrumentChange,\n samplerLoaded,\n onEscape,\n },\n ref\n ) => {\n // -- Local State & Refs --\n const { theme } = useTheme();\n const staffControlsRef = useRef<StaffControlsHandle>(null);\n const melodyLibBtnRef = useRef<HTMLButtonElement>(null);\n const toolbarContainerRef = useRef<HTMLDivElement>(null);\n\n const [showLibrary, setShowLibrary] = useState(false);\n const [isToolbarFocused, setIsToolbarFocused] = useState(false);\n\n // -- Score Context (Grouped for Clarity) --\n const scoreCtx = useScoreContext();\n\n // 1. Core Data\n const { score, dispatch, inputMode, toggleInputMode, selection, editorState } = scoreCtx;\n\n // 2. History\n const { history, undo, redoStack, redo } = scoreCtx;\n\n // 3. Duration & Rhythms\n const {\n activeDuration,\n handleDurationChange,\n checkDurationValidity,\n selectedDurations,\n isDotted,\n handleDotToggle,\n checkDotValidity,\n selectedDots,\n activeTie,\n handleTieToggle,\n selectedTies,\n } = scoreCtx;\n\n // 4. Pitch & Accidentals\n const { activeAccidental, handleAccidentalToggle, selectedAccidentals } = scoreCtx;\n\n // 5. Structure (Measures, Staff)\n const {\n addMeasure,\n removeMeasure,\n togglePickup,\n handleTimeSignatureChange,\n handleKeySignatureChange,\n handleClefChange,\n } = scoreCtx;\n\n // 6. Advanced (Tuplets)\n const { applyTuplet, removeTuplet, canApplyTuplet, activeTupletRatio } = scoreCtx;\n\n // -- Handlers --\n\n const handleInputModeClick = () => {\n const hasSelection = selection?.selectedNotes && selection.selectedNotes.length > 0;\n if (hasSelection) {\n dispatch(new ToggleRestCommand(selection));\n } else {\n toggleInputMode();\n }\n };\n\n const handleMelodySelect = (melody: Melody) => {\n dispatch(new LoadScoreCommand(melody.score));\n setShowLibrary(false);\n };\n\n // -- Derived Logic --\n\n const isAnyMenuOpen = showLibrary || (staffControlsRef.current?.isMenuOpen() ?? false);\n const activeStaff = getActiveStaff(score);\n\n useImperativeHandle(\n ref,\n () => ({\n openTimeSigMenu: () => staffControlsRef.current?.openTimeSigMenu(),\n openKeySigMenu: () => staffControlsRef.current?.openKeySigMenu(),\n openClefMenu: () => staffControlsRef.current?.openClefMenu(),\n isMenuOpen: () => isAnyMenuOpen,\n }),\n [showLibrary, isAnyMenuOpen]\n );\n\n useFocusTrap({\n containerRef: toolbarContainerRef,\n isActive: isToolbarFocused && !isAnyMenuOpen,\n onEscape: () => {\n setIsToolbarFocused(false);\n onEscape?.();\n },\n autoFocus: false,\n enableArrowKeys: false,\n });\n\n // -- Render --\n\n return (\n <div\n ref={toolbarContainerRef}\n className=\"flex flex-col gap-2 mb-4 border-b pb-2\"\n style={{ borderColor: theme.border }}\n onFocus={() => setIsToolbarFocused(true)}\n onBlur={(e) => {\n if (!toolbarContainerRef.current?.contains(e.relatedTarget as Node)) {\n setIsToolbarFocused(false);\n }\n }}\n >\n {/* -----------------------------------------------------------\n ROW 1: System / File / Playback / MIDI / Library\n ------------------------------------------------------------ */}\n <div className=\"row flex items-center gap-4\">\n <FileMenu score={score} bpm={bpm} height={TOP_ROW_HEIGHT} variant=\"ghost\" />\n\n <Divider />\n\n <HistoryControls\n canUndo={history.length > 0}\n onUndo={undo}\n canRedo={redoStack.length > 0}\n onRedo={redo}\n height={TOP_ROW_HEIGHT}\n variant=\"ghost\"\n />\n\n <Divider />\n\n <PlaybackControls\n isPlaying={isPlaying}\n onPlayToggle={onPlayToggle}\n bpm={bpm}\n onBpmChange={onBpmChange}\n selectedInstrument={selectedInstrument}\n onInstrumentChange={onInstrumentChange}\n samplerLoaded={samplerLoaded}\n height={TOP_ROW_HEIGHT}\n variant=\"ghost\"\n />\n\n <Divider />\n\n {/* Library Menu */}\n <div className=\"flex gap-1 relative\">\n <DropdownTrigger\n ref={melodyLibBtnRef}\n label=\"Library\"\n icon={<BookOpen size={14} />}\n isOpen={showLibrary}\n onClick={() => setShowLibrary(!showLibrary)}\n height={TOP_ROW_HEIGHT}\n />\n {showLibrary && (\n <MelodyLibrary\n melodies={melodies}\n onSelectMelody={handleMelodySelect}\n onClose={() => setShowLibrary(false)}\n position={{\n x: (melodyLibBtnRef.current?.getBoundingClientRect().right || 0) - 256,\n y: (melodyLibBtnRef.current?.getBoundingClientRect().bottom || 0) + 5,\n }}\n triggerRef={melodyLibBtnRef as React.RefObject<HTMLElement>}\n />\n )}\n </div>\n {/* \n <Divider />\n\n <MidiControls\n midiStatus={midiStatus}\n selectedInstrument={selectedInstrument}\n onInstrumentChange={onInstrumentChange}\n samplerLoaded={samplerLoaded}\n height={TOP_ROW_HEIGHT}\n variant=\"ghost\"\n />\n */}\n {/* Spacer */}\n <div className=\"flex-1\"></div>\n\n <ToolbarButton\n onClick={onToggleHelp}\n label=\"Keyboard Shortcuts\"\n icon={<HelpCircle size={18} />}\n preventFocus={true}\n height={TOP_ROW_HEIGHT}\n variant=\"ghost\"\n />\n </div>\n\n <Divider orientation=\"horizontal\" />\n\n {/* -----------------------------------------------------------\n ROW 2: Notation / Editing Controls\n ------------------------------------------------------------ */}\n <div className=\"row flex items-center gap-4 flex-wrap\">\n <StaffControls\n ref={staffControlsRef}\n clef={score.staves.length >= 2 ? 'grand' : activeStaff.clef || 'treble'}\n onClefChange={handleClefChange}\n keySignature={score.keySignature || activeStaff.keySignature}\n onKeySignatureChange={handleKeySignatureChange}\n timeSignature={score.timeSignature}\n onTimeSignatureChange={handleTimeSignatureChange}\n variant=\"ghost\"\n />\n\n <Divider />\n\n <InputModeToggle mode={inputMode} onToggle={handleInputModeClick} variant=\"ghost\" />\n\n <DurationControls\n activeDuration={activeDuration}\n onDurationChange={handleDurationChange}\n isDurationValid={checkDurationValidity}\n selectedDurations={selectedDurations}\n editorState={editorState}\n inputMode={inputMode}\n variant=\"ghost\"\n />\n\n <Divider />\n\n <ModifierControls\n isDotted={isDotted}\n onDotToggle={handleDotToggle}\n activeTie={activeTie}\n onToggleTie={handleTieToggle}\n isDotValid={checkDotValidity()}\n selectedDots={selectedDots}\n selectedTies={selectedTies}\n editorState={editorState}\n variant=\"ghost\"\n />\n\n <Divider />\n\n <AccidentalControls\n activeAccidental={activeAccidental}\n onToggleAccidental={handleAccidentalToggle}\n selectedAccidentals={selectedAccidentals}\n editorState={editorState}\n variant=\"ghost\"\n />\n\n <Divider />\n\n <TupletControls\n onApplyTuplet={applyTuplet}\n onRemoveTuplet={removeTuplet}\n canApplyTriplet={canApplyTuplet(3)}\n canApplyQuintuplet={canApplyTuplet(5)}\n activeTupletRatio={activeTupletRatio}\n variant=\"ghost\"\n />\n\n {/* Spacer */}\n {/* <div className=\"flex-1\"></div> */}\n\n <MeasureControls\n onAddMeasure={addMeasure}\n onRemoveMeasure={removeMeasure}\n onTogglePickup={togglePickup}\n isPickup={activeStaff.measures[0]?.isPickup}\n variant=\"ghost\"\n />\n </div>\n\n {/* Error Message */}\n {errorMsg && (\n <div className=\"w-full text-red-600 text-xs mt-2 font-bold animate-pulse\">\n ⚠️ {errorMsg}\n </div>\n )}\n </div>\n );\n }\n);\n\nToolbar.displayName = 'Toolbar';\n\nexport default Toolbar;\n","import React from 'react';\n\ninterface ScoreTitleFieldProps {\n title: string;\n isEditing: boolean;\n setIsEditing: (editing: boolean) => void;\n buffer: string;\n setBuffer: (value: string) => void;\n commit: () => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n theme: {\n text: string;\n border: string;\n };\n}\n\n/**\n * Displays the score title as an h2 or an editable input field.\n */\nexport function ScoreTitleField({\n title,\n isEditing,\n setIsEditing,\n buffer,\n setBuffer,\n commit,\n inputRef,\n theme,\n}: ScoreTitleFieldProps) {\n if (isEditing) {\n return (\n <input\n ref={inputRef}\n value={buffer}\n onChange={(e) => setBuffer(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => e.key === 'Enter' && commit()}\n className=\"ScoreTitleFieldInput font-bold font-serif text-3xl px-1 mx-[1.5rem] py-0 rounded outline-none bg-transparent\"\n style={{ color: theme.text, borderColor: theme.border, borderWidth: '1px' }}\n />\n );\n }\n\n return (\n <h2\n onClick={() => setIsEditing(true)}\n className=\"ScoreTitleField font-bold font-serif text-3xl px-[1.75rem] py-0 rounded hover:bg-white/10 cursor-pointer transition-colors inline-block\"\n style={{ color: theme.text, borderColor: 'transparent', borderWidth: '1px' }}\n >\n {title}\n </h2>\n );\n}\n","import React, { useEffect } from 'react';\nimport { X, Keyboard } from 'lucide-react';\nimport { useTheme } from '@context/ThemeContext';\n\nimport { Theme } from '@config';\n\ninterface Shortcut {\n label: string;\n keys: string[];\n}\n\ninterface ShortcutGroupProps {\n title: string;\n shortcuts: Shortcut[];\n theme: Theme;\n}\n\nconst ShortcutGroup: React.FC<ShortcutGroupProps> = ({ title, shortcuts, theme }) => (\n <div className=\"mb-6\">\n <h3\n className=\"text-sm font-bold uppercase tracking-wider mb-3 border-b pb-1\"\n style={{ color: theme.secondaryText, borderColor: theme.border }}\n >\n {title}\n </h3>\n <div className=\"grid grid-cols-1 gap-2\">\n {shortcuts.map((s, i) => (\n <div key={i} className=\"flex items-center justify-between text-sm\">\n <span style={{ color: theme.text }}>{s.label}</span>\n <div className=\"flex gap-1\">\n {s.keys.map((k, j) => (\n <kbd\n key={j}\n className=\"px-2 py-1 rounded text-xs font-mono min-w-[24px] text-center\"\n style={{\n backgroundColor: theme.buttonBackground,\n border: `1px solid ${theme.border}`,\n color: theme.secondaryText,\n }}\n >\n {k}\n </kbd>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n);\n\ninterface ShortcutsOverlayProps {\n onClose: () => void;\n}\n\nconst ShortcutsOverlay: React.FC<ShortcutsOverlayProps> = ({ onClose }) => {\n const { theme } = useTheme();\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n const shortcuts = {\n selection: [\n { label: 'Move Selection', keys: ['←', '→'] },\n { label: 'Extend Selection', keys: ['Shift', '←/→'] },\n { label: 'Chord Navigation', keys: ['Cmd/Ctrl', '↑/↓'] },\n { label: 'Switch Staff (Grand)', keys: ['Alt', '↑/↓'] },\n { label: 'Select Note', keys: ['Cmd/Ctrl', 'Click'] },\n { label: 'Clear Selection', keys: ['Esc'] },\n ],\n playback: [\n { label: 'Toggle Playback', keys: ['Space'] },\n { label: 'Play Selection', keys: ['P'] },\n { label: 'Replay Last Start', keys: ['Shift', 'Space'] },\n { label: 'Play From Start', keys: ['Shift', 'Alt', 'Space'] },\n ],\n editing: [\n { label: 'Add Note', keys: ['Enter'] },\n { label: 'Remove Note', keys: ['Backspace'] },\n { label: 'Toggle Rest Mode', keys: ['R'] },\n { label: 'Undo', keys: ['Cmd/Ctrl', 'Z'] },\n { label: 'Redo', keys: ['Cmd/Ctrl', 'Shift', 'Z'] },\n { label: 'Pitch Up/Down', keys: ['↑', '↓'] },\n { label: 'Octave Jump', keys: ['Shift', '↑/↓'] },\n ],\n modifiers: [\n { label: 'Toggle Dot', keys: ['.'] },\n { label: 'Toggle Tie', keys: ['T'] },\n { label: 'Flat', keys: ['-'] },\n { label: 'Sharp', keys: ['='] },\n { label: 'Natural', keys: ['0'] },\n ],\n durations: [\n { label: 'Whole Note', keys: ['7'] },\n { label: 'Half Note', keys: ['6'] },\n { label: 'Quarter Note', keys: ['5'] },\n { label: 'Eighth Note', keys: ['4'] },\n { label: '16th Note', keys: ['3'] },\n { label: '32nd Note', keys: ['2'] },\n { label: '64th Note', keys: ['1'] },\n ],\n };\n\n return (\n <div\n className=\"fixed inset-0 bg-black/20 backdrop-blur-sm z-50 flex items-center justify-center p-4\"\n onClick={onClose}\n >\n <div\n className=\"rounded-xl shadow-2xl w-full max-w-2xl overflow-hidden\"\n style={{ backgroundColor: theme.panelBackground }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n className=\"p-4 border-b flex items-center justify-between\"\n style={{ backgroundColor: theme.background, borderColor: theme.border }}\n >\n <div className=\"flex items-center gap-2\" style={{ color: theme.accent }}>\n <Keyboard size={20} />\n <h2 className=\"font-bold text-lg\" style={{ color: theme.text }}>\n Keyboard Shortcuts\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 rounded-full transition-colors\"\n style={{ color: theme.secondaryText }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-6 max-h-[70vh] overflow-y-auto shortcuts-scroll\">\n {/* Welcome & Instructions */}\n <div\n className=\"mb-8 p-4 rounded-lg border\"\n style={{ backgroundColor: `${theme.accent}10`, borderColor: `${theme.accent}30` }}\n >\n <h3 className=\"font-bold mb-2\" style={{ color: theme.accent }}>\n Welcome to RiffScore!\n </h3>\n <p className=\"text-sm mb-4\" style={{ color: theme.text }}>\n This editor allows you to create sheet music using both mouse and keyboard. Use the\n toolbar above to change note duration, add dots, or manage measures.\n </p>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 text-sm\">\n <div>\n <h4 className=\"font-bold mb-1\" style={{ color: theme.text }}>\n 🖱️ Mouse Interactions\n </h4>\n <ul\n className=\"list-disc list-inside space-y-1\"\n style={{ color: theme.secondaryText }}\n >\n <li>Click anywhere in a measure to place the cursor.</li>\n <li>Click existing notes to select them.</li>\n <li>Click the background to deselect.</li>\n </ul>\n </div>\n <div>\n <h4 className=\"font-bold mb-1\" style={{ color: theme.text }}>\n ⌨️ Keyboard Interactions\n </h4>\n <ul\n className=\"list-disc list-inside space-y-1\"\n style={{ color: theme.secondaryText }}\n >\n <li>\n Use{' '}\n <kbd\n className=\"font-mono px-1 rounded\"\n style={{\n backgroundColor: theme.buttonBackground,\n border: `1px solid ${theme.border}`,\n color: theme.accent,\n }}\n >\n Arrow Keys\n </kbd>{' '}\n to move the cursor.\n </li>\n <li>\n Press{' '}\n <kbd\n className=\"font-mono px-1 rounded\"\n style={{\n backgroundColor: theme.buttonBackground,\n border: `1px solid ${theme.border}`,\n color: theme.accent,\n }}\n >\n Enter\n </kbd>{' '}\n to add a note at the cursor.\n </li>\n <li>\n Press{' '}\n <kbd\n className=\"font-mono px-1 rounded\"\n style={{\n backgroundColor: theme.buttonBackground,\n border: `1px solid ${theme.border}`,\n color: theme.accent,\n }}\n >\n Space\n </kbd>{' '}\n to play/pause.\n </li>\n </ul>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n <div>\n <ShortcutGroup title=\"Playback\" shortcuts={shortcuts.playback} theme={theme} />\n <ShortcutGroup title=\"Selection\" shortcuts={shortcuts.selection} theme={theme} />\n </div>\n <div>\n <ShortcutGroup title=\"Editing\" shortcuts={shortcuts.editing} theme={theme} />\n <ShortcutGroup title=\"Modifiers\" shortcuts={shortcuts.modifiers} theme={theme} />\n <ShortcutGroup title=\"Durations\" shortcuts={shortcuts.durations} theme={theme} />\n </div>\n </div>\n\n <style>{`\n .shortcuts-scroll::-webkit-scrollbar {\n width: 8px;\n }\n .shortcuts-scroll::-webkit-scrollbar-track {\n background: transparent;\n }\n .shortcuts-scroll::-webkit-scrollbar-thumb {\n background-color: ${theme.border};\n border-radius: 4px;\n }\n .shortcuts-scroll::-webkit-scrollbar-thumb:hover {\n background-color: ${theme.secondaryText};\n }\n `}</style>\n </div>\n\n {/* Footer */}\n <div\n className=\"p-4 border-t text-center text-xs\"\n style={{\n backgroundColor: theme.background,\n borderColor: theme.border,\n color: theme.secondaryText,\n }}\n >\n Press{' '}\n <kbd\n className=\"px-1 py-0.5 rounded border font-mono\"\n style={{\n backgroundColor: theme.buttonBackground,\n borderColor: theme.border,\n color: theme.text,\n }}\n >\n Esc\n </kbd>{' '}\n to close\n </div>\n </div>\n </div>\n );\n};\n\nexport default ShortcutsOverlay;\n","import React from 'react';\nimport { useTheme } from '@/context/ThemeContext';\n\ninterface ConfirmDialogProps {\n title: string;\n message: string;\n /** Array of action buttons. Each has label, onClick, and optional variant */\n actions: Array<{\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'danger' | 'secondary';\n }>;\n onClose: () => void;\n}\n\n/**\n * Reusable confirmation dialog with customizable actions.\n * Renders as a modal overlay with centered content.\n */\nconst ConfirmDialog: React.FC<ConfirmDialogProps> = ({ title, message, actions, onClose }) => {\n const { theme } = useTheme();\n\n // Handle ESC key\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n // Lock scroll on mount\n document.body.style.overflow = 'hidden';\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n // Restore scroll on unmount\n document.body.style.overflow = 'unset';\n };\n }, [onClose]);\n\n const getButtonStyle = (variant: 'primary' | 'danger' | 'secondary' = 'secondary') => {\n switch (variant) {\n case 'primary':\n return {\n backgroundColor: theme.accent,\n color: '#fff',\n border: 'none',\n };\n case 'danger':\n return {\n backgroundColor: '#ef4444', // Gentler red\n color: '#fff',\n border: 'none',\n };\n case 'secondary':\n default:\n return {\n backgroundColor: 'transparent',\n color: theme.text,\n border: `1px solid ${theme.border}`,\n };\n }\n };\n\n return (\n <div\n className=\"fixed top-0 left-0 w-screen h-screen z-[100] flex items-center justify-center\"\n style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}\n onClick={onClose}\n >\n <div\n className=\"rounded-lg shadow-xl p-6 max-w-md w-full mx-4 relative\"\n style={{ backgroundColor: theme.background, maxHeight: '90vh', overflowY: 'auto' }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2 className=\"text-lg font-semibold mb-2\" style={{ color: theme.text }}>\n {title}\n </h2>\n\n <p className=\"mb-6\" style={{ color: theme.secondaryText }}>\n {message}\n </p>\n\n <div className=\"flex justify-end gap-3\">\n {actions.map((action, index) => (\n <button\n key={index}\n onClick={action.onClick}\n className=\"px-4 py-2 rounded-md font-medium transition-opacity hover:opacity-80\"\n style={getButtonStyle(action.variant)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ConfirmDialog;\n","import { Melody } from '@/types';\n\nexport const MELODIES: Melody[] = [\n {\n id: 'twinkle',\n title: 'Twinkle, Twinkle, Little Star',\n score: {\n title: 'Twinkle, Twinkle, Little Star',\n timeSignature: '4/4',\n keySignature: 'C',\n bpm: 100,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'C',\n measures: [\n // Staff 1 (Soprano/Alto)\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 3, pitch: 'G4' },\n { id: 4, pitch: 'C5' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 7, pitch: 'G4' },\n { id: 8, pitch: 'C5' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 11, pitch: 'G4' },\n { id: 12, pitch: 'G5' },\n ],\n },\n {\n id: 104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 15, pitch: 'G4' },\n { id: 16, pitch: 'G5' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 19, pitch: 'A4' },\n { id: 20, pitch: 'A5' },\n ],\n },\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 23, pitch: 'A4' },\n { id: 24, pitch: 'A5' },\n ],\n },\n {\n id: 203,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 27, pitch: 'G4' },\n { id: 28, pitch: 'G5' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 31, pitch: 'G4' },\n { id: 32, pitch: 'F5' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 35, pitch: 'G4' },\n { id: 36, pitch: 'F5' },\n ],\n },\n {\n id: 303,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 39, pitch: 'G4' },\n { id: 40, pitch: 'E5' },\n ],\n },\n {\n id: 304,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 43, pitch: 'G4' },\n { id: 44, pitch: 'E5' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 47, pitch: 'G4' },\n { id: 48, pitch: 'D5' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 51, pitch: 'G4' },\n { id: 52, pitch: 'D5' },\n ],\n },\n {\n id: 403,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 55, pitch: 'G4' },\n { id: 56, pitch: 'C5' },\n ],\n },\n ],\n },\n // B Section\n {\n id: 5,\n events: [\n {\n id: 501,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 59, pitch: 'G4' },\n { id: 60, pitch: 'G5' },\n ],\n },\n {\n id: 502,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 63, pitch: 'G4' },\n { id: 64, pitch: 'G5' },\n ],\n },\n {\n id: 503,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 67, pitch: 'G4' },\n { id: 68, pitch: 'F5' },\n ],\n },\n {\n id: 504,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 71, pitch: 'G4' },\n { id: 72, pitch: 'F5' },\n ],\n },\n ],\n },\n {\n id: 6,\n events: [\n {\n id: 601,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 75, pitch: 'G4' },\n { id: 76, pitch: 'E5' },\n ],\n },\n {\n id: 602,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 79, pitch: 'G4' },\n { id: 80, pitch: 'E5' },\n ],\n },\n {\n id: 603,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 83, pitch: 'G4' },\n { id: 84, pitch: 'D5' },\n ],\n },\n ],\n },\n {\n id: 7,\n events: [\n {\n id: 701,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 87, pitch: 'G4' },\n { id: 88, pitch: 'G5' },\n ],\n },\n {\n id: 702,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 91, pitch: 'G4' },\n { id: 92, pitch: 'G5' },\n ],\n },\n {\n id: 703,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 95, pitch: 'G4' },\n { id: 96, pitch: 'F5' },\n ],\n },\n {\n id: 704,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 99, pitch: 'G4' },\n { id: 100, pitch: 'F5' },\n ],\n },\n ],\n },\n {\n id: 8,\n events: [\n {\n id: 801,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 103, pitch: 'G4' },\n { id: 104, pitch: 'E5' },\n ],\n },\n {\n id: 802,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 107, pitch: 'G4' },\n { id: 108, pitch: 'E5' },\n ],\n },\n {\n id: 803,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 111, pitch: 'G4' },\n { id: 112, pitch: 'D5' },\n ],\n },\n ],\n },\n // A Section Repeat\n {\n id: 9,\n events: [\n {\n id: 901,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 115, pitch: 'G4' },\n { id: 116, pitch: 'C5' },\n ],\n },\n {\n id: 902,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 119, pitch: 'G4' },\n { id: 120, pitch: 'C5' },\n ],\n },\n {\n id: 903,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 123, pitch: 'G4' },\n { id: 124, pitch: 'G5' },\n ],\n },\n {\n id: 904,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 127, pitch: 'G4' },\n { id: 128, pitch: 'G5' },\n ],\n },\n ],\n },\n {\n id: 10,\n events: [\n {\n id: 1001,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 131, pitch: 'A4' },\n { id: 132, pitch: 'A5' },\n ],\n },\n {\n id: 1002,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 135, pitch: 'A4' },\n { id: 136, pitch: 'A5' },\n ],\n },\n {\n id: 1003,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 139, pitch: 'G4' },\n { id: 140, pitch: 'G5' },\n ],\n },\n ],\n },\n {\n id: 11,\n events: [\n {\n id: 1101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 143, pitch: 'G4' },\n { id: 144, pitch: 'F5' },\n ],\n },\n {\n id: 1102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 147, pitch: 'G4' },\n { id: 148, pitch: 'F5' },\n ],\n },\n {\n id: 1103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 151, pitch: 'G4' },\n { id: 152, pitch: 'E5' },\n ],\n },\n {\n id: 1104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 155, pitch: 'G4' },\n { id: 156, pitch: 'E5' },\n ],\n },\n ],\n },\n {\n id: 12,\n events: [\n {\n id: 1201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 159, pitch: 'G4' },\n { id: 160, pitch: 'D5' },\n ],\n },\n {\n id: 1202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 163, pitch: 'G4' },\n { id: 164, pitch: 'D5' },\n ],\n },\n {\n id: 1203,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 167, pitch: 'G4' },\n { id: 168, pitch: 'C5' },\n ],\n },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'C',\n measures: [\n // Staff 2 (Tenor/Bass - Transposed down 1 octave from original C4 start)\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 1, pitch: 'C3' },\n { id: 2, pitch: 'E3' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 5, pitch: 'C3' },\n { id: 6, pitch: 'E3' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 9, pitch: 'C3' },\n { id: 10, pitch: 'E3' },\n ],\n },\n {\n id: 104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 13, pitch: 'C3' },\n { id: 14, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 17, pitch: 'C3' },\n { id: 18, pitch: 'F3' },\n ],\n },\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 21, pitch: 'C3' },\n { id: 22, pitch: 'F3' },\n ],\n },\n {\n id: 203,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 25, pitch: 'C3' },\n { id: 26, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 29, pitch: 'B2' },\n { id: 30, pitch: 'D3' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 33, pitch: 'B2' },\n { id: 34, pitch: 'D3' },\n ],\n },\n {\n id: 303,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 37, pitch: 'C3' },\n { id: 38, pitch: 'E3' },\n ],\n },\n {\n id: 304,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 41, pitch: 'C3' },\n { id: 42, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 45, pitch: 'B2' },\n { id: 46, pitch: 'D3' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 49, pitch: 'B2' },\n { id: 50, pitch: 'D3' },\n ],\n },\n {\n id: 403,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 53, pitch: 'C3' },\n { id: 54, pitch: 'E3' },\n ],\n },\n ],\n },\n // B Section\n {\n id: 5,\n events: [\n {\n id: 501,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 57, pitch: 'C3' },\n { id: 58, pitch: 'E3' },\n ],\n },\n {\n id: 502,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 61, pitch: 'C3' },\n { id: 62, pitch: 'E3' },\n ],\n },\n {\n id: 503,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 65, pitch: 'B2' },\n { id: 66, pitch: 'D3' },\n ],\n },\n {\n id: 504,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 69, pitch: 'B2' },\n { id: 70, pitch: 'D3' },\n ],\n },\n ],\n },\n {\n id: 6,\n events: [\n {\n id: 601,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 73, pitch: 'C3' },\n { id: 74, pitch: 'E3' },\n ],\n },\n {\n id: 602,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 77, pitch: 'C3' },\n { id: 78, pitch: 'E3' },\n ],\n },\n {\n id: 603,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 81, pitch: 'B2' },\n { id: 82, pitch: 'D3' },\n ],\n },\n ],\n },\n {\n id: 7,\n events: [\n {\n id: 701,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 85, pitch: 'C3' },\n { id: 86, pitch: 'E3' },\n ],\n },\n {\n id: 702,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 89, pitch: 'C3' },\n { id: 90, pitch: 'E3' },\n ],\n },\n {\n id: 703,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 93, pitch: 'B2' },\n { id: 94, pitch: 'D3' },\n ],\n },\n {\n id: 704,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 97, pitch: 'B2' },\n { id: 98, pitch: 'D3' },\n ],\n },\n ],\n },\n {\n id: 8,\n events: [\n {\n id: 801,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 101, pitch: 'C3' },\n { id: 102, pitch: 'E3' },\n ],\n },\n {\n id: 802,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 105, pitch: 'C3' },\n { id: 106, pitch: 'E3' },\n ],\n },\n {\n id: 803,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 109, pitch: 'B2' },\n { id: 110, pitch: 'D3' },\n ],\n },\n ],\n },\n // A Section Repeat\n {\n id: 9,\n events: [\n {\n id: 901,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 113, pitch: 'C3' },\n { id: 114, pitch: 'E3' },\n ],\n },\n {\n id: 902,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 117, pitch: 'C3' },\n { id: 118, pitch: 'E3' },\n ],\n },\n {\n id: 903,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 121, pitch: 'C3' },\n { id: 122, pitch: 'E3' },\n ],\n },\n {\n id: 904,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 125, pitch: 'C3' },\n { id: 126, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 10,\n events: [\n {\n id: 1001,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 129, pitch: 'C3' },\n { id: 130, pitch: 'F3' },\n ],\n },\n {\n id: 1002,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 133, pitch: 'C3' },\n { id: 134, pitch: 'F3' },\n ],\n },\n {\n id: 1003,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 137, pitch: 'C3' },\n { id: 138, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 11,\n events: [\n {\n id: 1101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 141, pitch: 'B2' },\n { id: 142, pitch: 'D3' },\n ],\n },\n {\n id: 1102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 145, pitch: 'B2' },\n { id: 146, pitch: 'D3' },\n ],\n },\n {\n id: 1103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 149, pitch: 'C3' },\n { id: 150, pitch: 'E3' },\n ],\n },\n {\n id: 1104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 153, pitch: 'C3' },\n { id: 154, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 12,\n events: [\n {\n id: 1201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 157, pitch: 'B2' },\n { id: 158, pitch: 'D3' },\n ],\n },\n {\n id: 1202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 161, pitch: 'B2' },\n { id: 162, pitch: 'D3' },\n ],\n },\n {\n id: 1203,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 165, pitch: 'C3' },\n { id: 166, pitch: 'E3' },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n },\n {\n id: 'amazing_grace',\n title: 'Amazing Grace',\n score: {\n title: 'Amazing Grace',\n timeSignature: '3/4',\n keySignature: 'G',\n bpm: 72,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'G',\n measures: [\n {\n id: 1,\n isPickup: true,\n events: [\n { id: 101, duration: 'quarter', dotted: false, notes: [{ id: 1, pitch: 'D4' }] },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 4, pitch: 'D4' },\n { id: 5, pitch: 'G4' },\n ],\n },\n {\n id: 202,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 7, pitch: 'D4' },\n { id: 9, pitch: 'B4' },\n ],\n }, // Re-voiced for clarity\n {\n id: 203,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 12, pitch: 'D4' },\n { id: 13, pitch: 'G4' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 16, pitch: 'G4' },\n { id: 17, pitch: 'B4' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 20, pitch: 'A4' },\n { id: 21, pitch: 'A4' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 24, pitch: 'D4' },\n { id: 25, pitch: 'G4' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 28, pitch: 'G4' },\n { id: 29, pitch: 'E4' },\n ],\n },\n ],\n },\n {\n id: 5,\n events: [\n {\n id: 501,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 32, pitch: 'D4' },\n { id: 33, pitch: 'D4' },\n ],\n },\n {\n id: 502,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 36, pitch: 'D4' },\n { id: 37, pitch: 'D4' },\n ],\n },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'G',\n measures: [\n {\n id: 1,\n isPickup: true,\n events: [{ id: 101, duration: 'quarter', dotted: false, isRest: true, notes: [] }],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 2, pitch: 'G3' },\n { id: 3, pitch: 'B3' },\n ],\n },\n {\n id: 202,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 6, pitch: 'G3' },\n { id: 8, pitch: 'G4' },\n ],\n }, // Placeholder or G3\n {\n id: 203,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 10, pitch: 'G3' },\n { id: 11, pitch: 'B3' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 14, pitch: 'G3' },\n { id: 15, pitch: 'D4' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 18, pitch: 'D4' },\n { id: 19, pitch: 'F#4' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 22, pitch: 'G3' },\n { id: 23, pitch: 'B3' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 26, pitch: 'C4' },\n { id: 27, pitch: 'E4' },\n ],\n },\n ],\n },\n {\n id: 5,\n events: [\n {\n id: 501,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 30, pitch: 'G3' },\n { id: 31, pitch: 'B3' },\n ],\n },\n {\n id: 502,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 34, pitch: 'G3' },\n { id: 35, pitch: 'B3' },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n },\n {\n id: 'frere_jacques',\n title: 'Frère Jacques',\n score: {\n title: 'Frère Jacques',\n timeSignature: '4/4',\n keySignature: 'C',\n bpm: 120,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'C',\n measures: [\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 3, pitch: 'G4' },\n { id: 4, pitch: 'C5' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 7, pitch: 'G4' },\n { id: 8, pitch: 'D5' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 11, pitch: 'G4' },\n { id: 12, pitch: 'E5' },\n ],\n },\n {\n id: 104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 15, pitch: 'G4' },\n { id: 16, pitch: 'C5' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 19, pitch: 'G4' },\n { id: 20, pitch: 'C5' },\n ],\n },\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 23, pitch: 'G4' },\n { id: 24, pitch: 'D5' },\n ],\n },\n {\n id: 203,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 27, pitch: 'G4' },\n { id: 28, pitch: 'E5' },\n ],\n },\n {\n id: 204,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 31, pitch: 'G4' },\n { id: 32, pitch: 'C5' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 35, pitch: 'G4' },\n { id: 36, pitch: 'E5' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 39, pitch: 'A4' },\n { id: 40, pitch: 'F5' },\n ],\n },\n {\n id: 303,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 43, pitch: 'G4' },\n { id: 44, pitch: 'G5' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 47, pitch: 'G4' },\n { id: 48, pitch: 'E5' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 51, pitch: 'A4' },\n { id: 52, pitch: 'F5' },\n ],\n },\n {\n id: 403,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 55, pitch: 'G4' },\n { id: 56, pitch: 'G5' },\n ],\n },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'C',\n measures: [\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 1, pitch: 'C3' },\n { id: 2, pitch: 'E3' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 5, pitch: 'B2' },\n { id: 6, pitch: 'D3' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 9, pitch: 'C3' },\n { id: 10, pitch: 'E3' },\n ],\n },\n {\n id: 104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 13, pitch: 'C3' },\n { id: 14, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 17, pitch: 'C3' },\n { id: 18, pitch: 'E3' },\n ],\n },\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 21, pitch: 'B2' },\n { id: 22, pitch: 'D3' },\n ],\n },\n {\n id: 203,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 25, pitch: 'C3' },\n { id: 26, pitch: 'E3' },\n ],\n },\n {\n id: 204,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 29, pitch: 'C3' },\n { id: 30, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 33, pitch: 'C3' },\n { id: 34, pitch: 'E3' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 37, pitch: 'C3' },\n { id: 38, pitch: 'F3' },\n ],\n },\n {\n id: 303,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 41, pitch: 'C3' },\n { id: 42, pitch: 'E3' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 45, pitch: 'C3' },\n { id: 46, pitch: 'E3' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 49, pitch: 'C3' },\n { id: 50, pitch: 'F3' },\n ],\n },\n {\n id: 403,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 53, pitch: 'C3' },\n { id: 54, pitch: 'E3' },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n },\n {\n id: 'greensleeves',\n title: 'Greensleeves',\n score: {\n title: 'Greensleeves',\n timeSignature: '6/8',\n keySignature: 'C',\n bpm: 80,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'C',\n measures: [\n {\n id: 1,\n isPickup: true,\n events: [\n { id: 101, duration: 'eighth', dotted: false, notes: [{ id: 2, pitch: 'A4' }] },\n ],\n },\n {\n id: 2,\n events: [\n { id: 201, duration: 'quarter', dotted: false, notes: [{ id: 5, pitch: 'C5' }] },\n { id: 202, duration: 'eighth', dotted: false, notes: [{ id: 8, pitch: 'D5' }] },\n { id: 203, duration: 'eighth', dotted: true, notes: [{ id: 11, pitch: 'E5' }] },\n { id: 204, duration: 'sixteenth', dotted: false, notes: [{ id: 14, pitch: 'F5' }] },\n { id: 205, duration: 'eighth', dotted: false, notes: [{ id: 17, pitch: 'E5' }] },\n ],\n },\n {\n id: 3,\n events: [\n { id: 301, duration: 'quarter', dotted: false, notes: [{ id: 20, pitch: 'D5' }] },\n { id: 302, duration: 'eighth', dotted: false, notes: [{ id: 23, pitch: 'B4' }] },\n { id: 303, duration: 'eighth', dotted: true, notes: [{ id: 25, pitch: 'G4' }] },\n { id: 304, duration: 'sixteenth', dotted: false, notes: [{ id: 27, pitch: 'A4' }] },\n { id: 305, duration: 'eighth', dotted: false, notes: [{ id: 30, pitch: 'B4' }] },\n ],\n },\n {\n id: 4,\n events: [\n { id: 401, duration: 'quarter', dotted: false, notes: [{ id: 33, pitch: 'C5' }] },\n { id: 402, duration: 'eighth', dotted: false, notes: [{ id: 35, pitch: 'A4' }] },\n { id: 403, duration: 'eighth', dotted: true, notes: [{ id: 37, pitch: 'A4' }] },\n {\n id: 404,\n duration: 'sixteenth',\n dotted: false,\n notes: [{ id: 39, pitch: 'G#4' }],\n },\n { id: 405, duration: 'eighth', dotted: false, notes: [{ id: 42, pitch: 'A4' }] },\n ],\n },\n {\n id: 5,\n events: [\n { id: 501, duration: 'quarter', dotted: false, notes: [{ id: 45, pitch: 'B4' }] },\n { id: 502, duration: 'eighth', dotted: false, notes: [{ id: 47, pitch: 'G#4' }] },\n { id: 503, duration: 'quarter', dotted: false, notes: [{ id: 48, pitch: 'E4' }] },\n { id: 504, duration: 'eighth', dotted: false, notes: [{ id: 50, pitch: 'A4' }] },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'C',\n measures: [\n {\n id: 1,\n isPickup: true,\n events: [\n { id: 101, duration: 'eighth', dotted: false, notes: [{ id: 1, pitch: 'E3' }] },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 3, pitch: 'E3' },\n { id: 4, pitch: 'A3' },\n ],\n },\n {\n id: 202,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 6, pitch: 'F3' },\n { id: 7, pitch: 'A3' },\n ],\n },\n {\n id: 203,\n duration: 'eighth',\n dotted: true,\n notes: [\n { id: 9, pitch: 'E3' },\n { id: 10, pitch: 'G#3' },\n ],\n },\n {\n id: 204,\n duration: 'sixteenth',\n dotted: false,\n notes: [\n { id: 12, pitch: 'F3' },\n { id: 13, pitch: 'A3' },\n ],\n },\n {\n id: 205,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 15, pitch: 'E3' },\n { id: 16, pitch: 'G#3' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 18, pitch: 'E3' },\n { id: 19, pitch: 'G3' },\n ],\n },\n {\n id: 302,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 21, pitch: 'D3' },\n { id: 22, pitch: 'G3' },\n ],\n },\n { id: 303, duration: 'eighth', dotted: true, notes: [{ id: 24, pitch: 'E3' }] },\n { id: 304, duration: 'sixteenth', dotted: false, notes: [{ id: 26, pitch: 'E3' }] },\n {\n id: 305,\n duration: 'eighth',\n dotted: false,\n notes: [\n { id: 28, pitch: 'D3' },\n { id: 29, pitch: 'G#3' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 31, pitch: 'E3' },\n { id: 32, pitch: 'A3' },\n ],\n },\n { id: 402, duration: 'eighth', dotted: false, notes: [{ id: 34, pitch: 'E3' }] },\n { id: 403, duration: 'eighth', dotted: true, notes: [{ id: 36, pitch: 'E3' }] },\n { id: 404, duration: 'sixteenth', dotted: false, notes: [{ id: 38, pitch: 'D3' }] },\n { id: 405, duration: 'eighth', dotted: false, notes: [{ id: 41, pitch: 'E3' }] },\n ],\n },\n {\n id: 5,\n events: [\n {\n id: 501,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 43, pitch: 'D3' },\n { id: 44, pitch: 'G#3' },\n ],\n },\n { id: 502, duration: 'eighth', dotted: false, notes: [{ id: 46, pitch: 'D3' }] },\n { id: 503, duration: 'quarter', dotted: false, isRest: true, notes: [] }, // rest\n { id: 504, duration: 'eighth', dotted: false, notes: [{ id: 49, pitch: 'E3' }] },\n ],\n },\n ],\n },\n ],\n },\n },\n {\n id: 'sakura',\n title: 'Sakura',\n score: {\n title: 'Sakura',\n timeSignature: '4/4',\n keySignature: 'C',\n bpm: 60,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'C',\n measures: [\n {\n id: 1,\n events: [\n { id: 101, duration: 'quarter', dotted: false, notes: [{ id: 2, pitch: 'A4' }] },\n { id: 102, duration: 'quarter', dotted: false, notes: [{ id: 4, pitch: 'A4' }] },\n { id: 103, duration: 'half', dotted: false, notes: [{ id: 7, pitch: 'B4' }] },\n ],\n },\n {\n id: 2,\n events: [\n { id: 201, duration: 'quarter', dotted: false, notes: [{ id: 9, pitch: 'A4' }] },\n { id: 202, duration: 'quarter', dotted: false, notes: [{ id: 11, pitch: 'A4' }] },\n { id: 203, duration: 'half', dotted: false, notes: [{ id: 14, pitch: 'B4' }] },\n ],\n },\n {\n id: 3,\n events: [\n { id: 301, duration: 'quarter', dotted: false, notes: [{ id: 16, pitch: 'A4' }] },\n { id: 302, duration: 'quarter', dotted: false, notes: [{ id: 19, pitch: 'B4' }] },\n {\n id: 303,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 21, pitch: 'A4' },\n { id: 22, pitch: 'C5' },\n ],\n },\n { id: 304, duration: 'quarter', dotted: false, notes: [{ id: 25, pitch: 'B4' }] },\n ],\n },\n {\n id: 4,\n events: [\n { id: 401, duration: 'quarter', dotted: false, notes: [{ id: 27, pitch: 'A4' }] },\n { id: 402, duration: 'quarter', dotted: false, notes: [{ id: 30, pitch: 'B4' }] },\n { id: 403, duration: 'half', dotted: false, notes: [{ id: 32, pitch: 'A4' }] },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'C',\n measures: [\n {\n id: 1,\n events: [\n { id: 101, duration: 'quarter', dotted: false, notes: [{ id: 1, pitch: 'E3' }] },\n { id: 102, duration: 'quarter', dotted: false, notes: [{ id: 3, pitch: 'E3' }] },\n {\n id: 103,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 5, pitch: 'E3' },\n { id: 6, pitch: 'G#3' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n { id: 201, duration: 'quarter', dotted: false, notes: [{ id: 8, pitch: 'E3' }] },\n { id: 202, duration: 'quarter', dotted: false, notes: [{ id: 10, pitch: 'E3' }] },\n {\n id: 203,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 12, pitch: 'E3' },\n { id: 13, pitch: 'G#3' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n { id: 301, duration: 'quarter', dotted: false, notes: [{ id: 15, pitch: 'E3' }] },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 17, pitch: 'E3' },\n { id: 18, pitch: 'G#3' },\n ],\n },\n { id: 303, duration: 'quarter', dotted: false, notes: [{ id: 20, pitch: 'E3' }] },\n {\n id: 304,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 23, pitch: 'E3' },\n { id: 24, pitch: 'G#3' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n { id: 401, duration: 'quarter', dotted: false, notes: [{ id: 26, pitch: 'E3' }] },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 28, pitch: 'E3' },\n { id: 29, pitch: 'G#3' },\n ],\n },\n { id: 403, duration: 'half', dotted: false, notes: [{ id: 31, pitch: 'E3' }] },\n ],\n },\n ],\n },\n ],\n },\n },\n {\n id: 'old_macdonald',\n title: 'Old Macdonald',\n score: {\n title: 'Old Macdonald Had a Farm',\n timeSignature: '4/4',\n keySignature: 'G',\n bpm: 120,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'G',\n measures: [\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 3, pitch: 'D4' },\n { id: 4, pitch: 'G4' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 7, pitch: 'D4' },\n { id: 8, pitch: 'G4' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 11, pitch: 'D4' },\n { id: 12, pitch: 'G4' },\n ],\n },\n { id: 104, duration: 'quarter', dotted: false, notes: [{ id: 15, pitch: 'D4' }] },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 18, pitch: 'G4' },\n { id: 19, pitch: 'E4' },\n ],\n }, // C major chord -> C, E, G (in key G.. C natural?). Old macdonald is G major. C E G is C Major. B diminished? C major (IV).\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 22, pitch: 'G4' },\n { id: 23, pitch: 'E4' },\n ],\n },\n { id: 203, duration: 'half', dotted: false, notes: [{ id: 26, pitch: 'D4' }] },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 29, pitch: 'G4' },\n { id: 30, pitch: 'B4' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 33, pitch: 'G4' },\n { id: 34, pitch: 'B4' },\n ],\n },\n {\n id: 303,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 36, pitch: 'F#4' },\n { id: 37, pitch: 'A4' },\n ],\n },\n {\n id: 304,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 39, pitch: 'F#4' },\n { id: 40, pitch: 'A4' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 43, pitch: 'D4' },\n { id: 44, pitch: 'G4' },\n ],\n },\n { id: 402, duration: 'quarter', dotted: false, notes: [{ id: 47, pitch: 'D4' }] },\n { id: 403, duration: 'quarter', dotted: false, notes: [{ id: 50, pitch: 'D4' }] },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'G',\n measures: [\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 1, pitch: 'G3' },\n { id: 2, pitch: 'B3' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 5, pitch: 'G3' },\n { id: 6, pitch: 'B3' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 9, pitch: 'G3' },\n { id: 10, pitch: 'B3' },\n ],\n },\n {\n id: 104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 13, pitch: 'G3' },\n { id: 14, pitch: 'B3' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 16, pitch: 'C4' },\n { id: 17, pitch: 'E4' },\n ],\n }, // C4, E4 -> Transpose down? C3, E3.\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 20, pitch: 'C4' },\n { id: 21, pitch: 'E4' },\n ],\n },\n {\n id: 203,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 24, pitch: 'G3' },\n { id: 25, pitch: 'B3' },\n ],\n },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 27, pitch: 'G3' },\n { id: 28, pitch: 'D4' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 31, pitch: 'G3' },\n { id: 32, pitch: 'D4' },\n ],\n },\n { id: 303, duration: 'quarter', dotted: false, notes: [{ id: 35, pitch: 'D4' }] },\n { id: 304, duration: 'quarter', dotted: false, notes: [{ id: 38, pitch: 'D4' }] },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 41, pitch: 'G3' },\n { id: 42, pitch: 'B3' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 45, pitch: 'G3' },\n { id: 46, pitch: 'B3' },\n ],\n },\n {\n id: 403,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 48, pitch: 'G3' },\n { id: 49, pitch: 'B3' },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n },\n {\n id: 'oh_susanna',\n title: 'Oh! Susanna',\n score: {\n title: 'Oh! Susanna',\n timeSignature: '4/4',\n keySignature: 'D',\n bpm: 116,\n staves: [\n {\n id: 1,\n clef: 'treble',\n keySignature: 'D',\n measures: [\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 3, pitch: 'A4' },\n { id: 4, pitch: 'D4' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 7, pitch: 'G#4' },\n { id: 8, pitch: 'E4' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 11, pitch: 'A4' },\n { id: 12, pitch: 'F#4' },\n ],\n },\n { id: 104, duration: 'quarter', dotted: false, notes: [{ id: 15, pitch: 'A4' }] },\n ],\n },\n {\n id: 2,\n events: [\n { id: 201, duration: 'quarter', dotted: false, notes: [{ id: 18, pitch: 'A4' }] },\n {\n id: 202,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 20, pitch: 'G4' },\n { id: 21, pitch: 'B4' },\n ],\n },\n { id: 203, duration: 'quarter', dotted: false, notes: [{ id: 24, pitch: 'A4' }] },\n { id: 204, duration: 'quarter', dotted: false, notes: [{ id: 26, pitch: 'F#4' }] },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 29, pitch: 'A4' },\n { id: 30, pitch: 'D4' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 33, pitch: 'G#4' },\n { id: 34, pitch: 'E4' },\n ],\n },\n {\n id: 303,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 37, pitch: 'A4' },\n { id: 38, pitch: 'F#4' },\n ],\n },\n {\n id: 304,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 41, pitch: 'A4' },\n { id: 42, pitch: 'F#4' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 45, pitch: 'G#4' },\n { id: 46, pitch: 'E4' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 49, pitch: 'F#4' },\n { id: 50, pitch: 'D4' },\n ],\n },\n {\n id: 403,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 53, pitch: 'G#4' },\n { id: 54, pitch: 'E4' },\n ],\n },\n ],\n },\n ],\n },\n {\n id: 2,\n clef: 'bass',\n keySignature: 'D',\n measures: [\n {\n id: 1,\n events: [\n {\n id: 101,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 1, pitch: 'D3' },\n { id: 2, pitch: 'F#3' },\n ],\n },\n {\n id: 102,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 5, pitch: 'B2' },\n { id: 6, pitch: 'E3' },\n ],\n },\n {\n id: 103,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 9, pitch: 'D3' },\n { id: 10, pitch: 'F#3' },\n ],\n },\n {\n id: 104,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 13, pitch: 'D3' },\n { id: 14, pitch: 'F#3' },\n ],\n },\n ],\n },\n {\n id: 2,\n events: [\n {\n id: 201,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 16, pitch: 'D3' },\n { id: 17, pitch: 'F#3' },\n ],\n },\n { id: 202, duration: 'quarter', dotted: false, notes: [{ id: 19, pitch: 'D3' }] },\n {\n id: 203,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 22, pitch: 'D3' },\n { id: 23, pitch: 'F#3' },\n ],\n },\n { id: 204, duration: 'quarter', dotted: false, notes: [{ id: 25, pitch: 'D3' }] },\n ],\n },\n {\n id: 3,\n events: [\n {\n id: 301,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 27, pitch: 'D3' },\n { id: 28, pitch: 'F#3' },\n ],\n },\n {\n id: 302,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 31, pitch: 'B2' },\n { id: 32, pitch: 'E3' },\n ],\n },\n {\n id: 303,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 35, pitch: 'D3' },\n { id: 36, pitch: 'F#3' },\n ],\n },\n {\n id: 304,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 39, pitch: 'D3' },\n { id: 40, pitch: 'F#3' },\n ],\n },\n ],\n },\n {\n id: 4,\n events: [\n {\n id: 401,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 43, pitch: 'B2' },\n { id: 44, pitch: 'E3' },\n ],\n },\n {\n id: 402,\n duration: 'quarter',\n dotted: false,\n notes: [\n { id: 47, pitch: 'A2' },\n { id: 48, pitch: 'D3' },\n ],\n },\n {\n id: 403,\n duration: 'half',\n dotted: false,\n notes: [\n { id: 51, pitch: 'B2' },\n { id: 52, pitch: 'E3' },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n },\n];\n","import React, { useRef, useState, useCallback } from 'react';\n\n// Contexts\nimport { ScoreProvider, useScoreContext } from '@context/ScoreContext';\nimport { useTheme } from '@context/ThemeContext';\n\n// Hooks\nimport { useKeyboardShortcuts } from '@hooks/useKeyboardShortcuts';\nimport { usePlayback } from '@hooks/usePlayback';\nimport { useMIDI } from '@hooks/useMIDI';\nimport { useScoreInteraction } from '@hooks/useScoreInteraction';\nimport { useSamplerStatus } from '@hooks/useSamplerStatus';\nimport { useModifierKeys } from '@hooks/useModifierKeys';\nimport { useTitleEditor } from '@hooks/useTitleEditor';\n\n// Components\nimport ScoreCanvas from '@components/Canvas/ScoreCanvas';\nimport Toolbar, { ToolbarHandle } from '@components/Toolbar/Toolbar';\nimport { ScoreTitleField } from '@components/Layout/ScoreTitleField';\nimport ShortcutsOverlay from '@components/Layout/Overlays/ShortcutsOverlay';\nimport ConfirmDialog from '@components/Layout/Overlays/ConfirmDialog';\nimport Portal from '@components/Layout/Portal';\n\n// Commands\nimport { SetSingleStaffCommand } from '@commands/SetSingleStaffCommand';\nimport { UpdateTitleCommand } from '@commands/UpdateTitleCommand';\n\n// Engines & Data\nimport { setInstrument, InstrumentType } from '@engines/toneEngine';\nimport { MELODIES } from '@/data/melodies';\n\n// ------------------------------------------------------------------\n// Props Interface\n// ------------------------------------------------------------------\n\ninterface ScoreEditorContentProps {\n scale?: number;\n label?: string;\n showToolbar?: boolean;\n enableKeyboard?: boolean;\n enablePlayback?: boolean;\n}\n\n// ------------------------------------------------------------------\n// Main Component\n// ------------------------------------------------------------------\n\nconst ScoreEditorContent = ({\n scale = 1,\n label,\n showToolbar = true,\n enableKeyboard = true,\n enablePlayback = true,\n}: ScoreEditorContentProps) => {\n // --- Context & Theme ---\n const { theme } = useTheme();\n const scoreLogic = useScoreContext();\n const {\n score,\n dispatch,\n pendingClefChange,\n setPendingClefChange,\n selection,\n setSelection,\n setPreviewNote,\n activeDuration,\n isDotted,\n activeAccidental,\n scoreRef,\n updateNotePitch,\n handleNoteSelection,\n addChordToMeasure,\n focusScore,\n } = scoreLogic;\n\n // --- Local UI State ---\n const [bpm, setBpm] = useState(120);\n const [showHelp, setShowHelp] = useState(false);\n const [isHoveringScore, setIsHoveringScore] = useState(false);\n const [selectedInstrument, setSelectedInstrument] = useState<InstrumentType>('bright');\n const [errorMsg, setErrorMsg] = useState(null);\n\n // --- Refs ---\n const toolbarRef = useRef<ToolbarHandle>(null);\n const scoreContainerRef = useRef<HTMLDivElement>(null);\n\n // --- Extracted Hooks ---\n const samplerLoaded = useSamplerStatus();\n const modifierHeld = useModifierKeys();\n const titleEditor = useTitleEditor(score.title, dispatch);\n\n // --- Complex Hooks ---\n const playback = usePlayback(score, bpm);\n const { midiStatus } = useMIDI(\n addChordToMeasure,\n activeDuration,\n isDotted,\n activeAccidental,\n scoreRef\n );\n\n useScoreInteraction({\n scoreRef,\n selection,\n onUpdatePitch: updateNotePitch,\n onSelectNote: (\n measureIndex,\n eventId,\n noteId,\n staffIndex,\n isMulti,\n selectAllInEvent,\n isShift\n ) => {\n if (measureIndex !== null && eventId !== null) {\n handleNoteSelection(\n measureIndex,\n eventId,\n noteId,\n staffIndex,\n isMulti,\n selectAllInEvent,\n isShift\n );\n }\n },\n });\n\n useKeyboardShortcuts(\n scoreLogic,\n playback,\n {\n isEditingTitle: titleEditor.isEditing,\n isHoveringScore,\n scoreContainerRef,\n isAnyMenuOpen: () => (toolbarRef.current?.isMenuOpen() ?? false) || showHelp,\n isDisabled: !enableKeyboard,\n },\n { handleTitleCommit: titleEditor.commit }\n );\n\n // --- Event Handlers ---\n const handleInstrumentChange = useCallback((instrument: InstrumentType) => {\n setSelectedInstrument(instrument);\n setInstrument(instrument);\n }, []);\n\n const handleEscape = useCallback(() => {\n setTimeout(() => scoreContainerRef.current?.focus(), 0);\n focusScore();\n }, [focusScore]);\n\n const handleClefConfirm = useCallback(() => {\n if (!pendingClefChange) return;\n dispatch(new SetSingleStaffCommand(pendingClefChange.targetClef));\n setPendingClefChange(null);\n }, [pendingClefChange, dispatch, setPendingClefChange]);\n\n const handleBackgroundClick = useCallback(() => {\n setSelection({\n staffIndex: 0,\n measureIndex: null,\n eventId: null,\n noteId: null,\n selectedNotes: [],\n });\n }, [setSelection]);\n\n const handleHoverChange = useCallback(\n (isHovering: boolean) => {\n setIsHoveringScore(isHovering);\n if (!isHovering) {\n const isFocused =\n document.activeElement === scoreContainerRef.current ||\n scoreContainerRef.current?.contains(document.activeElement);\n if (!isFocused) setPreviewNote(null);\n }\n },\n [setPreviewNote]\n );\n\n // --- Render ---\n return (\n <div\n className=\"ScoreEditor backdrop-blur-md rounded-lg shadow-xl mb-8\"\n style={{\n padding: '.5rem',\n backgroundColor: theme.panelBackground,\n borderColor: theme.border,\n borderWidth: '1px',\n color: theme.text,\n scrollbarWidth: 'thin',\n scrollbarColor: `${theme.border} transparent`,\n }}\n >\n {showToolbar && (\n <Toolbar\n ref={toolbarRef}\n label={label}\n scoreTitle={score.title}\n isEditingTitle={titleEditor.isEditing}\n onEditingChange={titleEditor.setIsEditing}\n onTitleChange={(t) => dispatch(new UpdateTitleCommand(t))}\n isPlaying={playback.isPlaying}\n onPlayToggle={enablePlayback ? playback.handlePlayToggle : undefined}\n bpm={bpm}\n onBpmChange={setBpm}\n midiStatus={midiStatus}\n melodies={MELODIES}\n selectedInstrument={selectedInstrument}\n onInstrumentChange={handleInstrumentChange}\n samplerLoaded={samplerLoaded}\n errorMsg={errorMsg}\n onToggleHelp={() => setShowHelp(true)}\n onEscape={handleEscape}\n />\n )}\n\n {showHelp && (\n <Portal>\n <ShortcutsOverlay onClose={() => setShowHelp(false)} />\n </Portal>\n )}\n\n <div\n className=\"score-editor-content\"\n style={{\n backgroundColor: theme.background,\n borderRadius: '1rem',\n paddingTop: '1rem',\n }}\n >\n <div className=\"relative z-20\">\n <ScoreTitleField\n title={score.title}\n isEditing={titleEditor.isEditing}\n setIsEditing={titleEditor.setIsEditing}\n buffer={titleEditor.buffer}\n setBuffer={titleEditor.setBuffer}\n commit={titleEditor.commit}\n inputRef={titleEditor.inputRef}\n theme={theme}\n />\n </div>\n\n <ScoreCanvas\n scale={scale}\n playbackPosition={playback.playbackPosition}\n containerRef={scoreContainerRef}\n onHoverChange={handleHoverChange}\n onBackgroundClick={handleBackgroundClick}\n onKeySigClick={() => toolbarRef.current?.openKeySigMenu()}\n onTimeSigClick={() => toolbarRef.current?.openTimeSigMenu()}\n onClefClick={() => toolbarRef.current?.openClefMenu()}\n />\n </div>\n\n {pendingClefChange && (\n <Portal>\n <ConfirmDialog\n title=\"Change to Single Staff?\"\n message={`This will remove the ${pendingClefChange.targetClef === 'treble' ? 'bass' : 'treble'} clef and all its contents.`}\n actions={[\n { label: 'Cancel', onClick: () => setPendingClefChange(null), variant: 'secondary' },\n {\n label: `Drop ${pendingClefChange.targetClef === 'treble' ? 'Bass' : 'Treble'} Clef`,\n onClick: handleClefConfirm,\n variant: 'danger',\n },\n ]}\n onClose={() => setPendingClefChange(null)}\n />\n </Portal>\n )}\n </div>\n );\n};\n\n// ------------------------------------------------------------------\n// Wrapper with Provider\n// ------------------------------------------------------------------\n\nconst ScoreEditor = ({\n scale = 1,\n label,\n initialData,\n}: {\n scale?: number;\n label?: string;\n initialData?: any;\n}) => {\n return (\n <ScoreProvider initialScore={initialData}>\n <ScoreEditorContent scale={scale} label={label} />\n </ScoreProvider>\n );\n};\n\nexport { ScoreEditorContent };\nexport default ScoreEditor;\n","// @ts-nocheck\n/**\n * RiffScore Component\n *\n * Configurable React component for rendering and interacting with musical scores.\n * Supports two modes:\n * - Generator Mode: Create blank scores from templates (staff + measureCount)\n * - Render Mode: Load compositions from staves array\n */\n\nimport React, { useMemo } from 'react';\nimport { DeepPartial, RiffScoreConfig } from './types';\nimport { useRiffScore } from './hooks/useRiffScore';\nimport { ScoreProvider } from './context/ScoreContext';\nimport { ThemeProvider, useTheme } from './context/ThemeContext';\nimport { ScoreEditorContent } from './components/Layout/ScoreEditor';\n\ninterface RiffScoreProps {\n config?: DeepPartial<RiffScoreConfig>;\n}\n\n/**\n * Internal component that handles the config-driven rendering\n */\nconst RiffScoreInner: React.FC<RiffScoreProps> = ({ config: userConfig }) => {\n const { config, initialScore } = useRiffScore(userConfig);\n const { theme } = useTheme();\n\n // Container style for interaction master switch\n const containerStyle = useMemo(\n () => ({\n pointerEvents: config.interaction.isEnabled ? 'auto' : 'none',\n userSelect: 'none' as const,\n }),\n [config.interaction.isEnabled]\n );\n\n return (\n <div className=\"RiffScore\" style={containerStyle}>\n <ScoreProvider initialScore={initialScore}>\n <ScoreEditorContent\n scale={config.ui.scale}\n showToolbar={config.ui.showToolbar}\n enableKeyboard={config.interaction.enableKeyboard}\n enablePlayback={config.interaction.enablePlayback}\n />\n </ScoreProvider>\n </div>\n );\n};\n\n/**\n * RiffScore - Configurable Music Notation Editor\n *\n * @example\n * // Generator Mode - Create blank grand staff with 4 measures\n * <RiffScore config={{ score: { staff: 'grand', measureCount: 4 } }} />\n *\n * @example\n * // Render Mode - Load existing composition\n * <RiffScore config={{ score: { staves: myStaves } }} />\n *\n * @example\n * // Disable all interaction (read-only display)\n * <RiffScore config={{ interaction: { isEnabled: false } }} />\n */\nexport const RiffScore: React.FC<RiffScoreProps> = ({ config }) => {\n return (\n <ThemeProvider initialTheme={config?.ui?.theme}>\n <RiffScoreInner config={config} />\n </ThemeProvider>\n );\n};\n\nexport default RiffScore;\n","import React, { useState } from 'react';\nimport { Settings, X } from 'lucide-react';\nimport { useTheme } from '../../src/context/ThemeContext';\nimport { THEMES, ThemeName } from '../../src/config';\n\nconst ConfigMenu = () => {\n const { theme, themeName, setTheme, zoom, setZoom } = useTheme();\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n \n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n return (\n <div className=\"ConfigMenu fixed top-4 right-4 z-50\" ref={menuRef}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"p-2 rounded-full shadow-lg transition-colors\"\n style={{\n backgroundColor: theme.buttonBackground,\n color: theme.text,\n border: `1px solid ${theme.border}`\n }}\n >\n {isOpen ? <X size={24} /> : <Settings size={24} />}\n </button>\n\n {isOpen && (\n <div \n className=\"absolute top-12 right-0 w-64 p-4 rounded-lg shadow-xl backdrop-blur-md border\"\n style={{\n backgroundColor: theme.panelBackground,\n borderColor: theme.border,\n color: theme.text\n }}\n >\n <h3 className=\"font-bold mb-4 text-sm uppercase tracking-wider\" style={{ color: theme.secondaryText }}>Configuration</h3>\n \n <div className=\"mb-6\">\n <label className=\"block text-xs font-bold mb-2 uppercase\" style={{ color: theme.secondaryText }}>Theme</label>\n <div className=\"grid grid-cols-2 gap-2\">\n {(Object.keys(THEMES) as ThemeName[]).map((name) => (\n <button\n key={name}\n onClick={() => setTheme(name)}\n className={`px-3 py-2 rounded text-xs font-medium transition-all border ${\n themeName === name ? 'ring-2 ring-offset-1 ring-offset-transparent' : 'opacity-70 hover:opacity-100'\n }`}\n style={{\n backgroundColor: THEMES[name].background,\n color: THEMES[name].text,\n borderColor: themeName === name ? theme.accent : THEMES[name].border,\n '--tw-ring-color': theme.accent\n } as React.CSSProperties}\n >\n {name}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs font-bold mb-2 uppercase\" style={{ color: theme.secondaryText }}>\n Zoom: {Math.round(zoom * 100)}%\n </label>\n <input\n type=\"range\"\n min=\"0.5\"\n max=\"2.0\"\n step=\"0.1\"\n value={zoom}\n onChange={(e) => setZoom(parseFloat(e.target.value))}\n className=\"w-full h-2 rounded-lg appearance-none cursor-pointer\"\n style={{\n background: theme.border,\n accentColor: theme.accent\n }}\n />\n <div className=\"flex justify-between text-xs mt-1\" style={{ color: theme.secondaryText }}>\n <span>50%</span>\n <span>100%</span>\n <span>200%</span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ConfigMenu;\n"]}
|