{"version":3,"file":"index.cjs","sources":["../src/constants.ts","../src/utils.ts","../src/styles.ts","../src/keyboard.ts","../src/events.ts","../src/index.ts"],"sourcesContent":["import type { KeyMap } from './types';\n\n/**\n * Musical notes in order starting from A\n */\nexport const NOTE_NAMES = [\n  'A',\n  'A#',\n  'B',\n  'C',\n  'C#',\n  'D',\n  'D#',\n  'E',\n  'F',\n  'F#',\n  'G',\n  'G#',\n] as const;\n\n/**\n * White keys in order starting from C\n */\nexport const WHITE_NOTES = ['C', 'D', 'E', 'F', 'G', 'A', 'B'] as const;\n\n/**\n * Notes that have sharps\n */\nexport const NOTES_WITH_SHARPS = ['C', 'D', 'F', 'G', 'A'] as const;\n\n/**\n * Default key map using modern event.key values\n * Maps keyboard keys to note identifiers:\n * - 'l' suffix = lower octave\n * - 'u' suffix = upper octave\n *\n * Layout matches a standard QWERTY keyboard:\n * Lower row (ASDFGHJK) -> Lower octave (C-B)\n * Upper row (WETYU) -> Sharps/flats\n * Upper row (KL;') -> Upper octave\n */\nexport const DEFAULT_KEY_MAP: KeyMap = {\n  // Lower octave - white keys (bottom row)\n  a: 'Cl',\n  s: 'Dl',\n  d: 'El',\n  f: 'Fl',\n  g: 'Gl',\n  h: 'Al',\n  j: 'Bl',\n  // Lower octave - black keys (top row)\n  w: 'C#l',\n  e: 'D#l',\n  t: 'F#l',\n  y: 'G#l',\n  u: 'A#l',\n  // German keyboard layout support (Z and Y are swapped)\n  z: 'G#l',\n  // Upper octave - white keys\n  k: 'Cu',\n  l: 'Du',\n  ';': 'Eu',\n  \"'\": 'Fu',\n  '\\\\': 'Gu',\n  // Upper octave - black keys\n  o: 'C#u',\n  p: 'D#u',\n  ']': 'F#u',\n};\n\n/**\n * Default settings values\n */\nexport const DEFAULT_SETTINGS = {\n  id: 'keyboard',\n  octaves: 3,\n  width: 600,\n  height: 150,\n  margin: 0,\n  startNote: 'A3',\n  whiteKeyColour: '#fff',\n  blackKeyColour: '#000',\n  activeColour: 'yellow',\n  borderColour: '#000',\n  keyboardLayout: 'en',\n  musicalTyping: true,\n} as const;\n","import { NOTE_NAMES } from './constants';\nimport type { KeyMap, ResolvedSettings } from './types';\n\n/**\n * Calculate the frequency of a given note using equal temperament tuning.\n * A4 = 440 Hz is used as the reference pitch.\n *\n * @param note - Musical note with octave (e.g., 'A4', 'C#3', 'Bb5')\n * @returns Frequency in hertz\n */\nexport function getFrequencyOfNote(note: string): number {\n  // Parse octave from the note string\n  // Handle both 2-char notes (A4) and 3-char notes (C#4)\n  const octave = parseInt(note.length === 3 ? note.charAt(2) : note.charAt(1), 10);\n  const noteName = note.slice(0, -1);\n\n  // Find the position in the chromatic scale\n  const noteIndex = NOTE_NAMES.indexOf(noteName as typeof NOTE_NAMES[number]);\n\n  // Calculate key number (A0 = key 1)\n  // Notes A, A#, B are in the previous year's octave\n  let keyNumber: number;\n  if (noteIndex < 3) {\n    keyNumber = noteIndex + 12 + (octave - 1) * 12 + 1;\n  } else {\n    keyNumber = noteIndex + (octave - 1) * 12 + 1;\n  }\n\n  // Calculate frequency using equal temperament formula\n  // f = 440 * 2^((n-49)/12) where n is the key number and 49 is A4\n  return 440 * Math.pow(2, (keyNumber - 49) / 12);\n}\n\n/**\n * Order notes array starting from a specific note.\n *\n * @param notes - Array of note names to order\n * @param startNote - Note to start from (e.g., 'C4' or just 'C')\n * @returns Reordered array of notes\n */\nexport function orderNotes(notes: readonly string[], startNote: string): string[] {\n  const startNoteName = startNote.charAt(0);\n  const keyOffset = notes.indexOf(startNoteName);\n\n  if (keyOffset === -1) {\n    return [...notes];\n  }\n\n  const orderedNotes: string[] = [];\n  const numberOfNotes = notes.length;\n\n  for (let i = 0; i < numberOfNotes; i++) {\n    const index = (i + keyOffset) % numberOfNotes;\n    orderedNotes.push(notes[index]);\n  }\n\n  return orderedNotes;\n}\n\n/**\n * Get the full note name from a key map entry and current settings.\n *\n * @param key - The keyboard key that was pressed (event.key value)\n * @param keyMap - The current key map\n * @param settings - Current resolved settings\n * @returns Full note name with octave (e.g., 'C4')\n */\nexport function getKeyPressed(\n  key: string,\n  keyMap: KeyMap,\n  settings: ResolvedSettings\n): string {\n  const mapping = keyMap[key];\n  if (!mapping) return '';\n\n  const lowerOctave = settings.keyOctave + settings.keyPressOffset;\n  const upperOctave = lowerOctave + 1;\n\n  return mapping\n    .replace('l', lowerOctave.toString())\n    .replace('u', upperOctave.toString());\n}\n\n/**\n * Calculate the width of a white key based on available space.\n *\n * @param totalWidth - Total keyboard width in pixels\n * @param numberOfWhiteKeys - Number of white keys to fit\n * @returns Width of each white key in pixels\n */\nexport function getWhiteKeyWidth(totalWidth: number, numberOfWhiteKeys: number): number {\n  return Math.floor((totalWidth - numberOfWhiteKeys) / numberOfWhiteKeys);\n}\n\n/**\n * Get the total number of white keys for a given number of octaves.\n *\n * @param octaves - Number of octaves\n * @returns Total number of white keys\n */\nexport function getTotalWhiteKeys(octaves: number): number {\n  return octaves * 7;\n}\n","import type { ResolvedSettings } from './types';\n\n/**\n * Style properties that can be applied to elements\n */\nexport interface StyleProperties {\n  backgroundColor?: string;\n  border?: string;\n  borderRight?: string;\n  height?: string;\n  width?: string;\n  borderRadius?: string;\n  position?: string;\n  zIndex?: string;\n  boxSizing?: string;\n  display?: string;\n  left?: string;\n  cursor?: string;\n  fontSize?: string;\n  padding?: string;\n  listStyle?: string;\n  margin?: string;\n  userSelect?: string;\n}\n\n/**\n * Apply style properties to an HTML element.\n *\n * @param element - The element to style\n * @param styles - Object containing CSS properties to apply\n */\nexport function applyStyles(element: HTMLElement, styles: StyleProperties): void {\n  Object.assign(element.style, styles);\n  // Handle vendor prefixes for user-select\n  if (styles.userSelect !== undefined) {\n    (element.style as unknown as Record<string, string>)['-webkit-user-select'] = styles.userSelect;\n  }\n}\n\n/**\n * Get styles for the keyboard container element.\n *\n * @param settings - Resolved keyboard settings\n * @returns Style properties for the container\n */\nexport function getContainerStyles(settings: ResolvedSettings): StyleProperties {\n  return {\n    width: `${settings.width}px`,\n    height: `${settings.height}px`,\n    display: 'block',\n    position: 'relative',\n    boxSizing: 'content-box',\n  };\n}\n\n/**\n * Get styles for the keyboard list element.\n *\n * @param settings - Resolved keyboard settings\n * @returns Style properties for the keyboard list\n */\nexport function getKeyboardStyles(settings: ResolvedSettings): StyleProperties {\n  return {\n    cursor: 'default',\n    fontSize: '0px',\n    height: `${settings.height}px`,\n    width: `${settings.width}px`,\n    padding: '0',\n    position: 'relative',\n    listStyle: 'none',\n    margin: typeof settings.margin === 'number' ? `${settings.margin}px` : settings.margin as string,\n    boxSizing: 'content-box',\n    userSelect: 'none',\n  };\n}\n\n/**\n * Get styles for a white key.\n *\n * @param settings - Resolved keyboard settings\n * @param width - Width of the key in pixels\n * @param isLastKey - Whether this is the last key (affects border)\n * @returns Style properties for the white key\n */\nexport function getWhiteKeyStyles(\n  settings: ResolvedSettings,\n  width: number,\n  isLastKey: boolean\n): StyleProperties {\n  return {\n    backgroundColor: settings.whiteKeyColour,\n    border: `1px solid ${settings.borderColour}`,\n    borderRight: isLastKey ? `1px solid ${settings.borderColour}` : '0',\n    height: `${settings.height}px`,\n    width: `${width}px`,\n    borderRadius: '0 0 5px 5px',\n    position: 'relative',\n    zIndex: '1',\n    boxSizing: 'content-box',\n    display: 'inline-block',\n    userSelect: 'none',\n  };\n}\n\n/**\n * Get styles for a black key.\n *\n * @param settings - Resolved keyboard settings\n * @param width - Width of the key in pixels\n * @param leftPosition - Left offset in pixels\n * @returns Style properties for the black key\n */\nexport function getBlackKeyStyles(\n  settings: ResolvedSettings,\n  width: number,\n  leftPosition: number\n): StyleProperties {\n  return {\n    backgroundColor: settings.blackKeyColour,\n    border: `1px solid ${settings.borderColour}`,\n    position: 'absolute',\n    left: `${leftPosition}px`,\n    width: `${width}px`,\n    height: `${Math.floor(settings.height / 1.5)}px`,\n    borderRadius: '0 0 3px 3px',\n    zIndex: '2',\n    boxSizing: 'content-box',\n    display: 'inline-block',\n    userSelect: 'none',\n  };\n}\n\n/**\n * Highlight a key with the active color.\n *\n * @param element - The key element to highlight\n * @param activeColour - The color to use for highlighting\n */\nexport function lightenUp(element: HTMLElement | null, activeColour: string): void {\n  if (element) {\n    element.style.backgroundColor = activeColour;\n  }\n}\n\n/**\n * Restore a key to its original color.\n *\n * @param element - The key element to restore\n * @param settings - Resolved keyboard settings\n */\nexport function darkenDown(element: HTMLElement | null, settings: ResolvedSettings): void {\n  if (element) {\n    const noteType = element.getAttribute('data-note-type');\n    element.style.backgroundColor =\n      noteType === 'white' ? settings.whiteKeyColour : settings.blackKeyColour;\n  }\n}\n","import { WHITE_NOTES, NOTES_WITH_SHARPS } from './constants';\nimport type { Keyboard, ResolvedSettings } from './types';\nimport { orderNotes, getWhiteKeyWidth, getTotalWhiteKeys } from './utils';\nimport {\n  applyStyles,\n  getContainerStyles,\n  getKeyboardStyles,\n  getWhiteKeyStyles,\n  getBlackKeyStyles,\n} from './styles';\n\n/**\n * Create a single key element.\n *\n * @param id - Note identifier (e.g., 'C4', 'C#4')\n * @param colour - Key colour ('white' or 'black')\n * @returns The created key element\n */\nfunction createKeyElement(id: string, colour: 'white' | 'black'): HTMLLIElement {\n  const el = document.createElement('li');\n  el.id = id;\n  el.title = id;\n  el.setAttribute('data-note-type', colour);\n  return el;\n}\n\n/**\n * Create all keys for the keyboard.\n *\n * @param settings - Resolved keyboard settings\n * @param whiteNotes - Ordered array of white note names\n * @param notesWithSharps - Ordered array of notes that have sharps\n * @returns Array of key elements\n */\nfunction createKeys(\n  settings: ResolvedSettings,\n  whiteNotes: string[],\n  notesWithSharps: string[]\n): HTMLLIElement[] {\n  const keys: HTMLLIElement[] = [];\n  const totalWhiteKeys = getTotalWhiteKeys(settings.octaves);\n  const whiteKeyWidth = getWhiteKeyWidth(settings.width, totalWhiteKeys);\n  const blackKeyWidth = Math.floor(whiteKeyWidth / 2);\n\n  let noteCounter = 0;\n  let octaveCounter = settings.startOctave;\n\n  for (let i = 0; i < totalWhiteKeys; i++) {\n    // Reset note counter at the start of each octave\n    if (i % whiteNotes.length === 0) {\n      noteCounter = 0;\n    }\n\n    const currentNote = whiteNotes[noteCounter];\n\n    // Increment octave when we hit C (except for the first note)\n    if (currentNote === 'C' && i !== 0) {\n      octaveCounter++;\n    }\n\n    // Create white key\n    const whiteKeyId = `${currentNote}${octaveCounter}`;\n    const whiteKey = createKeyElement(whiteKeyId, 'white');\n    const isLastKey = i === totalWhiteKeys - 1;\n    applyStyles(whiteKey, getWhiteKeyStyles(settings, whiteKeyWidth, isLastKey));\n    keys.push(whiteKey);\n\n    // Create black key if this note has a sharp (except for the last key)\n    if (!isLastKey && notesWithSharps.includes(currentNote)) {\n      const blackKeyId = `${currentNote}#${octaveCounter}`;\n      const blackKey = createKeyElement(blackKeyId, 'black');\n      const leftPosition = Math.floor((whiteKeyWidth + 1) * (i + 1) - blackKeyWidth / 2);\n      applyStyles(blackKey, getBlackKeyStyles(settings, blackKeyWidth, leftPosition));\n      keys.push(blackKey);\n    }\n\n    noteCounter++;\n  }\n\n  return keys;\n}\n\n/**\n * Create the keyboard DOM structure.\n *\n * @param settings - Resolved keyboard settings\n * @returns The keyboard structure with container, element, and keys\n */\nexport function createKeyboard(settings: ResolvedSettings): Keyboard {\n  // Get or create the container element\n  let container = document.getElementById(settings.id);\n  if (!container) {\n    container = document.createElement('div');\n    container.id = settings.id;\n    document.body.appendChild(container);\n  }\n\n  // Apply container styles\n  applyStyles(container, getContainerStyles(settings));\n\n  // Create the keyboard list element\n  const keyboardEl = document.createElement('ul');\n  applyStyles(keyboardEl, getKeyboardStyles(settings));\n\n  // Order notes based on start note\n  const whiteNotes = orderNotes(WHITE_NOTES, settings.startNote);\n  const notesWithSharps = orderNotes(NOTES_WITH_SHARPS, settings.startNote);\n\n  // Create all keys\n  const keys = createKeys(settings, whiteNotes, notesWithSharps);\n\n  // Add keys to keyboard\n  keys.forEach((key) => keyboardEl.appendChild(key));\n\n  // Replace existing keyboard or add new one\n  const existingKeyboard = container.querySelector('ul');\n  if (existingKeyboard) {\n    container.replaceChild(keyboardEl, existingKeyboard);\n  } else {\n    container.appendChild(keyboardEl);\n  }\n\n  return {\n    container,\n    el: keyboardEl,\n    keys,\n    whiteNotes,\n    notesWithSharps,\n    totalWhiteKeys: getTotalWhiteKeys(settings.octaves),\n  };\n}\n\n/**\n * Calculate the key press offset based on the starting note.\n * This determines the octave adjustment for keyboard input.\n *\n * @param whiteNotes - Ordered array of white note names\n * @returns 0 if starting from C, 1 otherwise\n */\nexport function getKeyPressOffset(whiteNotes: string[]): number {\n  return whiteNotes[0] === 'C' ? 0 : 1;\n}\n","import type { KeyMap, NoteCallback, ResolvedSettings } from './types';\nimport { getFrequencyOfNote, getKeyPressed } from './utils';\nimport { lightenUp, darkenDown } from './styles';\n\n/**\n * State interface for event handling\n */\nexport interface EventState {\n  mouseIsDown: boolean;\n  keysDown: Set<string>;\n}\n\n/**\n * Callbacks interface for event handling\n */\nexport interface EventCallbacks {\n  keyDown: NoteCallback;\n  keyUp: NoteCallback;\n}\n\n/**\n * Check if a keyboard event has modifier keys pressed.\n *\n * @param event - The keyboard event\n * @returns true if any modifier key is pressed\n */\nfunction isModifierKey(event: KeyboardEvent): boolean {\n  return event.ctrlKey || event.metaKey || event.altKey;\n}\n\n/**\n * Handle mouse down on a key element.\n */\nfunction handleMouseDown(\n  element: HTMLElement,\n  state: EventState,\n  settings: ResolvedSettings,\n  callback: NoteCallback\n): void {\n  if (element.tagName.toLowerCase() !== 'li') return;\n\n  state.mouseIsDown = true;\n  lightenUp(element, settings.activeColour);\n  callback(element.title, getFrequencyOfNote(element.title));\n}\n\n/**\n * Handle mouse up on a key element.\n */\nfunction handleMouseUp(\n  element: HTMLElement,\n  state: EventState,\n  settings: ResolvedSettings,\n  callback: NoteCallback\n): void {\n  if (element.tagName.toLowerCase() !== 'li') return;\n\n  state.mouseIsDown = false;\n  darkenDown(element, settings);\n  callback(element.title, getFrequencyOfNote(element.title));\n}\n\n/**\n * Handle mouse over on a key element (for drag behavior).\n */\nfunction handleMouseOver(\n  element: HTMLElement,\n  state: EventState,\n  settings: ResolvedSettings,\n  callback: NoteCallback\n): void {\n  if (!state.mouseIsDown) return;\n\n  lightenUp(element, settings.activeColour);\n  callback(element.title, getFrequencyOfNote(element.title));\n}\n\n/**\n * Handle mouse out on a key element (for drag behavior).\n */\nfunction handleMouseOut(\n  element: HTMLElement,\n  state: EventState,\n  settings: ResolvedSettings,\n  callback: NoteCallback\n): void {\n  if (!state.mouseIsDown) return;\n\n  darkenDown(element, settings);\n  callback(element.title, getFrequencyOfNote(element.title));\n}\n\n/**\n * Handle keyboard key down event.\n */\nfunction handleKeyDown(\n  event: KeyboardEvent,\n  state: EventState,\n  settings: ResolvedSettings,\n  keyMap: KeyMap,\n  callback: NoteCallback\n): void {\n  if (isModifierKey(event)) return;\n\n  const key = event.key;\n  if (!(key in keyMap)) return;\n  if (state.keysDown.has(key)) return;\n\n  event.preventDefault();\n  state.keysDown.add(key);\n\n  const note = getKeyPressed(key, keyMap, settings);\n  const element = document.getElementById(note);\n\n  lightenUp(element, settings.activeColour);\n  callback(note, getFrequencyOfNote(note));\n}\n\n/**\n * Handle keyboard key up event.\n */\nfunction handleKeyUp(\n  event: KeyboardEvent,\n  state: EventState,\n  settings: ResolvedSettings,\n  keyMap: KeyMap,\n  callback: NoteCallback\n): void {\n  if (isModifierKey(event)) return;\n\n  const key = event.key;\n  if (!(key in keyMap)) return;\n\n  state.keysDown.delete(key);\n\n  const note = getKeyPressed(key, keyMap, settings);\n  const element = document.getElementById(note);\n\n  darkenDown(element, settings);\n  callback(note, getFrequencyOfNote(note));\n}\n\n/**\n * Add all event listeners to the keyboard.\n *\n * @param container - The keyboard container element\n * @param settings - Resolved keyboard settings\n * @param keyMap - The keyboard-to-note mapping\n * @param callbacks - The keyDown and keyUp callback functions\n * @param state - The shared event state\n * @returns A cleanup function to remove all listeners\n */\nexport function addListeners(\n  container: HTMLElement,\n  settings: ResolvedSettings,\n  keyMap: KeyMap,\n  callbacks: EventCallbacks,\n  state: EventState\n): () => void {\n  const cleanupFunctions: Array<() => void> = [];\n\n  // Mouse events on container\n  const onMouseDown = (event: MouseEvent) => {\n    handleMouseDown(event.target as HTMLElement, state, settings, callbacks.keyDown);\n  };\n  const onMouseUp = (event: MouseEvent) => {\n    handleMouseUp(event.target as HTMLElement, state, settings, callbacks.keyUp);\n  };\n  const onMouseOver = (event: MouseEvent) => {\n    handleMouseOver(event.target as HTMLElement, state, settings, callbacks.keyDown);\n  };\n  const onMouseOut = (event: MouseEvent) => {\n    handleMouseOut(event.target as HTMLElement, state, settings, callbacks.keyUp);\n  };\n\n  container.addEventListener('mousedown', onMouseDown);\n  container.addEventListener('mouseup', onMouseUp);\n  container.addEventListener('mouseover', onMouseOver);\n  container.addEventListener('mouseout', onMouseOut);\n\n  cleanupFunctions.push(() => {\n    container.removeEventListener('mousedown', onMouseDown);\n    container.removeEventListener('mouseup', onMouseUp);\n    container.removeEventListener('mouseover', onMouseOver);\n    container.removeEventListener('mouseout', onMouseOut);\n  });\n\n  // Touch events (if supported)\n  if ('ontouchstart' in document.documentElement) {\n    const onTouchStart = (event: TouchEvent) => {\n      handleMouseDown(event.target as HTMLElement, state, settings, callbacks.keyDown);\n    };\n    const onTouchEnd = (event: TouchEvent) => {\n      handleMouseUp(event.target as HTMLElement, state, settings, callbacks.keyUp);\n    };\n    const onTouchLeave = (event: TouchEvent) => {\n      handleMouseOut(event.target as HTMLElement, state, settings, callbacks.keyUp);\n    };\n\n    container.addEventListener('touchstart', onTouchStart);\n    container.addEventListener('touchend', onTouchEnd);\n    container.addEventListener('touchleave' as keyof HTMLElementEventMap, onTouchLeave as EventListener);\n    container.addEventListener('touchcancel', onTouchLeave);\n\n    cleanupFunctions.push(() => {\n      container.removeEventListener('touchstart', onTouchStart);\n      container.removeEventListener('touchend', onTouchEnd);\n      container.removeEventListener('touchleave' as keyof HTMLElementEventMap, onTouchLeave as EventListener);\n      container.removeEventListener('touchcancel', onTouchLeave);\n    });\n  }\n\n  // Keyboard events (if musical typing is enabled)\n  if (settings.musicalTyping) {\n    const onKeyDown = (event: KeyboardEvent) => {\n      handleKeyDown(event, state, settings, keyMap, callbacks.keyDown);\n    };\n    const onKeyUp = (event: KeyboardEvent) => {\n      handleKeyUp(event, state, settings, keyMap, callbacks.keyUp);\n    };\n\n    window.addEventListener('keydown', onKeyDown);\n    window.addEventListener('keyup', onKeyUp);\n\n    cleanupFunctions.push(() => {\n      window.removeEventListener('keydown', onKeyDown);\n      window.removeEventListener('keyup', onKeyUp);\n    });\n  }\n\n  // Return cleanup function\n  return () => {\n    cleanupFunctions.forEach((cleanup) => cleanup());\n  };\n}\n","/**\n * Qwerty Hancock keyboard library v1.0.0\n * The web keyboard for now people.\n * Copyright 2012-2025, Stuart Memo\n *\n * Licensed under the MIT License\n * http://opensource.org/licenses/mit-license.php\n *\n * http://stuartmemo.com/qwerty-hancock\n */\n\nimport type { QwertyHancockSettings, ResolvedSettings, NoteCallback, KeyMap } from './types';\nimport { DEFAULT_KEY_MAP, DEFAULT_SETTINGS } from './constants';\nimport { createKeyboard, getKeyPressOffset } from './keyboard';\nimport { addListeners, type EventState } from './events';\n\n/**\n * QwertyHancock - An interactive HTML keyboard for web audio projects.\n *\n * @example\n * ```typescript\n * import { QwertyHancock } from 'qwerty-hancock';\n *\n * const keyboard = new QwertyHancock({\n *   id: 'keyboard',\n *   octaves: 3,\n *   width: 600,\n *   height: 150,\n * });\n *\n * keyboard.keyDown = (note, frequency) => {\n *   console.log(`Note: ${note}, Frequency: ${frequency}Hz`);\n * };\n * ```\n */\nexport class QwertyHancock {\n  /** Library version */\n  public readonly version = '1.0.0';\n\n  /** Callback triggered when a key is pressed */\n  public keyDown: NoteCallback = () => {};\n\n  /** Callback triggered when a key is released */\n  public keyUp: NoteCallback = () => {};\n\n  private settings: ResolvedSettings;\n  private keyMap: KeyMap;\n  private eventState: EventState;\n  private cleanupListeners: (() => void) | null = null;\n\n  /**\n   * Create a new QwertyHancock keyboard instance.\n   *\n   * @param userSettings - Optional configuration settings\n   */\n  constructor(userSettings?: QwertyHancockSettings) {\n    // Initialize key map\n    this.keyMap = { ...DEFAULT_KEY_MAP };\n\n    // Initialize event state\n    this.eventState = {\n      mouseIsDown: false,\n      keysDown: new Set(),\n    };\n\n    // Resolve settings with defaults\n    this.settings = this.resolveSettings(userSettings);\n\n    // Create the keyboard DOM\n    const keyboard = createKeyboard(this.settings);\n\n    // Calculate key press offset based on starting note\n    this.settings.keyPressOffset = getKeyPressOffset(keyboard.whiteNotes);\n\n    // Add event listeners\n    this.cleanupListeners = addListeners(\n      keyboard.container,\n      this.settings,\n      this.keyMap,\n      {\n        keyDown: (note, frequency) => this.keyDown(note, frequency),\n        keyUp: (note, frequency) => this.keyUp(note, frequency),\n      },\n      this.eventState\n    );\n  }\n\n  /**\n   * Resolve user settings with defaults.\n   */\n  private resolveSettings(userSettings?: QwertyHancockSettings): ResolvedSettings {\n    const us = userSettings || {};\n\n    // Get container to determine default dimensions\n    let container = document.getElementById(us.id || DEFAULT_SETTINGS.id);\n    let width = us.width;\n    let height = us.height;\n\n    if (container) {\n      const computedStyle = window.getComputedStyle(container);\n      if (width === undefined) {\n        width = parseInt(computedStyle.width, 10) || DEFAULT_SETTINGS.width;\n      }\n      if (height === undefined) {\n        height = parseInt(computedStyle.height, 10) || DEFAULT_SETTINGS.height;\n      }\n    } else {\n      width = width ?? DEFAULT_SETTINGS.width;\n      height = height ?? DEFAULT_SETTINGS.height;\n    }\n\n    const startNote = us.startNote || DEFAULT_SETTINGS.startNote;\n    const startOctave = parseInt(startNote.charAt(startNote.length - 1), 10);\n\n    return {\n      id: us.id || DEFAULT_SETTINGS.id,\n      octaves: us.octaves ?? DEFAULT_SETTINGS.octaves,\n      width,\n      height,\n      margin: us.margin ?? DEFAULT_SETTINGS.margin,\n      startNote,\n      startOctave,\n      keyOctave: us.keyOctave ?? startOctave,\n      whiteKeyColour: us.whiteKeyColour || DEFAULT_SETTINGS.whiteKeyColour,\n      blackKeyColour: us.blackKeyColour || DEFAULT_SETTINGS.blackKeyColour,\n      activeColour: us.activeColour || DEFAULT_SETTINGS.activeColour,\n      borderColour: us.borderColour || DEFAULT_SETTINGS.borderColour,\n      keyboardLayout: us.keyboardLayout || DEFAULT_SETTINGS.keyboardLayout,\n      musicalTyping: us.musicalTyping !== false,\n      keyPressOffset: 0, // Will be set after keyboard creation\n    };\n  }\n\n  /**\n   * Set the octave for keyboard input.\n   *\n   * @param octave - The octave number to set\n   * @returns The new octave value\n   */\n  public setKeyOctave(octave: number): number {\n    this.settings.keyOctave = octave;\n    return this.settings.keyOctave;\n  }\n\n  /**\n   * Get the current octave for keyboard input.\n   *\n   * @returns The current octave value\n   */\n  public getKeyOctave(): number {\n    return this.settings.keyOctave;\n  }\n\n  /**\n   * Increment the keyboard input octave by one.\n   *\n   * @returns The new octave value\n   */\n  public keyOctaveUp(): number {\n    this.settings.keyOctave++;\n    return this.settings.keyOctave;\n  }\n\n  /**\n   * Decrement the keyboard input octave by one.\n   *\n   * @returns The new octave value\n   */\n  public keyOctaveDown(): number {\n    this.settings.keyOctave--;\n    return this.settings.keyOctave;\n  }\n\n  /**\n   * Get the current keyboard-to-note mapping.\n   *\n   * @returns The current key map\n   */\n  public getKeyMap(): KeyMap {\n    return this.keyMap;\n  }\n\n  /**\n   * Set a custom keyboard-to-note mapping.\n   *\n   * @param newKeyMap - The new key map to use\n   * @returns The updated key map\n   */\n  public setKeyMap(newKeyMap: KeyMap): KeyMap {\n    this.keyMap = newKeyMap;\n    return this.keyMap;\n  }\n\n  /**\n   * Clean up the keyboard instance and remove all event listeners.\n   * Call this method when removing the keyboard from the DOM or\n   * when the component is unmounted in a framework like React.\n   */\n  public destroy(): void {\n    if (this.cleanupListeners) {\n      this.cleanupListeners();\n      this.cleanupListeners = null;\n    }\n  }\n}\n\n// Default export for convenience\nexport default QwertyHancock;\n\n// Re-export types for consumers\nexport type { QwertyHancockSettings, NoteCallback, KeyMap } from './types';\n"],"names":[],"mappings":"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"}