{"version":3,"file":"EquationEditor-N6MBBpmu.cjs","sources":["../app/components/equation/EquationToolbar.tsx","../app/components/equation/mathliveSpeech.ts","../app/components/equation/EquationEditor.tsx"],"sourcesContent":["\"use client\";\n\nexport default function EquationToolbar({\n  onCopy,\n  onClear,\n  onSpeak,\n  onStop,\n  speaking,\n}: {\n  onCopy: () => void | Promise<void>;\n  onClear: () => void;\n  onSpeak: () => void | Promise<void>;\n  onStop: () => void;\n  speaking: boolean;\n}) {\n  return (\n    <div className=\"no-drag flex items-center gap-2 mb-2\">\n      <button\n        type=\"button\"\n        className=\"no-drag h-8 px-3 rounded-md bg-surface hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n        onClick={onCopy}\n        aria-label=\"Copy LaTeX\"\n      >\n        Copy LaTeX\n      </button>\n      <button\n        type=\"button\"\n        className=\"no-drag h-8 px-3 rounded-md bg-surface hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n        onClick={onClear}\n        aria-label=\"Clear\"\n      >\n        Clear\n      </button>\n      <button\n        type=\"button\"\n        className=\"no-drag h-8 px-3 rounded-md bg-surface hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n        onClick={onSpeak}\n        aria-label=\"Speak equation\"\n      >\n        {speaking ? \"Speaking…\" : \"Speak\"}\n      </button>\n      <button\n        type=\"button\"\n        className=\"no-drag h-8 px-3 rounded-md bg-surface hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n        onClick={onStop}\n        aria-label=\"Stop speaking\"\n        disabled={!speaking}\n      >\n        Stop\n      </button>\n    </div>\n  );\n}\n","export type SpeechLifecycle = {\n  onStart?: () => void;\n  onEnd?: () => void;\n  onError?: () => void;\n};\n\nexport async function configureMathliveSpeech(lifecycle?: SpeechLifecycle) {\n  const mod = await import(\"mathlive\");\n  type MathfieldElementStatic = {\n    fontsDirectory: string;\n    soundsDirectory: string;\n    speakHook?: (text: string) => void;\n    readAloudHook?: (element: unknown, text: string) => void;\n    speechEngine?: \"amazon\" | \"local\";\n    speechEngineRate?: string;\n    textToSpeechRules?: \"sre\" | \"mathlive\";\n    textToSpeechMarkup?: \"\" | \"ssml\" | \"ssml_step\" | \"mac\";\n  };\n  const MathfieldElement = (\n    mod as unknown as { MathfieldElement?: MathfieldElementStatic }\n  ).MathfieldElement;\n  if (!MathfieldElement) return;\n  // Use MathLive's default fonts and sounds from its package instead of custom paths\n  // This works better for npm packages where asset paths are relative\n  // MathfieldElement.fontsDirectory = \"/fonts\";\n  // MathfieldElement.soundsDirectory = \"/sounds\";\n  try {\n    (MathfieldElement as unknown as { speechEngine?: string }).speechEngine =\n      \"local\" as unknown as never;\n    (\n      MathfieldElement as unknown as { textToSpeechRules?: string }\n    ).textToSpeechRules = \"mathlive\" as unknown as never;\n    (\n      MathfieldElement as unknown as { textToSpeechMarkup?: string }\n    ).textToSpeechMarkup = \"\" as unknown as never;\n    (\n      MathfieldElement as unknown as { speechEngineRate?: string }\n    ).speechEngineRate = \"medium\" as unknown as never;\n    MathfieldElement.speakHook = (text: string) => {\n      try {\n        if (typeof window !== \"undefined\" && \"speechSynthesis\" in window) {\n          window.speechSynthesis.cancel();\n          const utterance = new SpeechSynthesisUtterance(text);\n          utterance.lang =\n            typeof navigator !== \"undefined\" && navigator.language\n              ? navigator.language\n              : \"en-US\";\n          utterance.rate = 1.0;\n          if (lifecycle?.onStart) utterance.onstart = lifecycle.onStart;\n          if (lifecycle?.onEnd) utterance.onend = lifecycle.onEnd;\n          if (lifecycle?.onError) utterance.onerror = lifecycle.onError;\n          window.speechSynthesis.speak(utterance);\n        }\n      } catch {\n        lifecycle?.onError?.();\n      }\n    };\n    MathfieldElement.readAloudHook = (_element: unknown, text: string) => {\n      try {\n        MathfieldElement.speakHook?.(text);\n      } catch {}\n    };\n  } catch {}\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport EquationToolbar from \"./EquationToolbar\";\nimport { configureMathliveSpeech } from \"./mathliveSpeech\";\n\n// Defer importing Mathlive to the client to avoid SSR issues\n// We only reference window-dependent APIs inside effects.\n\ntype EquationEditorProps = {\n  value?: string;\n  onChange?: (latex: string) => void;\n  placeholder?: string;\n  className?: string;\n};\n\ntype MathfieldHandle = HTMLElement & {\n  setValue: (latex: string) => void;\n  getValue: (format?: string) => string;\n  focus?: () => void;\n  placeholder?: string;\n  virtualKeyboardMode?: \"auto\" | \"manual\" | \"onfocus\" | \"off\";\n  mathVirtualKeyboardPolicy?: \"auto\" | \"onfocus\" | \"manual\" | \"off\";\n  smartFence?: boolean;\n  smartSuperscript?: boolean;\n  removeExtraneousParentheses?: boolean;\n  executeCommand?: (selector: string | (string | unknown)[]) => boolean;\n  selectedText?: (format?: string) => string;\n};\n\ntype VirtualKeyboard = {\n  show: () => void;\n  container?: HTMLElement | null;\n  boundingRect?: { height: number } | null;\n  addEventListener?: (\n    type: string,\n    cb: (ev?: Event | CustomEvent<unknown>) => void\n  ) => void;\n  removeEventListener?: (\n    type: string,\n    cb: (ev?: Event | CustomEvent<unknown>) => void\n  ) => void;\n  visible?: boolean;\n};\n\nexport default function EquationEditor({\n  value = \"\",\n  onChange,\n  placeholder = \"Type LaTeX or use the keyboard…\",\n  className,\n}: EquationEditorProps) {\n  const hostRef = useRef<HTMLDivElement | null>(null);\n  const keyboardRef = useRef<HTMLDivElement | null>(null);\n  const fieldRef = useRef<MathfieldHandle | null>(null);\n  const [isSpeaking, setIsSpeaking] = useState(false);\n  const speechUtteranceRef = useRef<SpeechSynthesisUtterance | null>(null);\n\n  useEffect(() => {\n    let disposed = false;\n    const cleanupFns: Array<() => void> = [];\n    async function setup() {\n      if (typeof window === \"undefined\") return;\n      // Configure global MathLive assets and speech hooks (idempotent)\n      await configureMathliveSpeech({\n        onStart: () => setIsSpeaking(true),\n        onEnd: () => setIsSpeaking(false),\n        onError: () => setIsSpeaking(false),\n      });\n      await import(\"mathlive\");\n\n      // Asset directories & hooks are already configured above\n\n      // Create and mount the custom element\n      const mf = document.createElement(\"math-field\") as MathfieldHandle;\n      mf.style.display = \"block\";\n      mf.style.width = \"100%\";\n      mf.className =\n        \"rounded-md border border-border bg-background text-foreground min-h-24 px-3 py-3 text-lg\";\n      mf.placeholder = placeholder;\n      // Virtual keyboard sensible defaults for desktops & touch\n      mf.virtualKeyboardMode = \"manual\"; // toggle via button we add below\n      mf.mathVirtualKeyboardPolicy = \"manual\"; // keep open across focus changes\n      mf.smartFence = true;\n      mf.smartSuperscript = true;\n      mf.removeExtraneousParentheses = true;\n\n      // Initial value is set in a separate effect to avoid remount path dependency\n\n      mf.addEventListener(\"input\", () => {\n        const latex = mf.getValue(\"latex\");\n        onChange?.(latex);\n      });\n\n      const host = hostRef.current;\n      if (!host || disposed) return;\n      host.appendChild(mf as unknown as Node);\n      fieldRef.current = mf;\n      // Autofocus when tool opens\n      try {\n        mf.focus?.();\n      } catch {}\n\n      // Initialize shared virtual keyboard container with high z-index\n      const kbd = (\n        window as unknown as { mathVirtualKeyboard?: VirtualKeyboard }\n      ).mathVirtualKeyboard;\n      if (kbd) {\n        // Render keyboard inside this tool only\n        const container = keyboardRef.current;\n        if (container) {\n          kbd.container = container;\n          container.style.setProperty(\"--keyboard-zindex\", \"1\");\n          const initialHeight =\n            (window as unknown as { mathVirtualKeyboard?: VirtualKeyboard })\n              .mathVirtualKeyboard?.boundingRect?.height ?? 0;\n          container.style.height = `${initialHeight}px`;\n          container.style.display = \"block\";\n          // Let MathLive control spacing/keycap sizing via its own theme\n\n          // Sync MathLive theme (light/dark) with our app theme\n          const applyKeyboardTheme = () => {\n            const themeAttr =\n              document.documentElement.getAttribute(\"data-theme\") === \"dark\"\n                ? \"dark\"\n                : \"light\";\n            container.setAttribute(\"theme\", themeAttr);\n          };\n          applyKeyboardTheme();\n          const themeObserver = new MutationObserver(applyKeyboardTheme);\n          themeObserver.observe(document.documentElement, {\n            attributes: true,\n            attributeFilter: [\"data-theme\"],\n          });\n          cleanupFns.push(() => themeObserver.disconnect());\n\n          const onGeometry = () => {\n            try {\n              const height =\n                (window as unknown as { mathVirtualKeyboard?: VirtualKeyboard })\n                  .mathVirtualKeyboard?.boundingRect?.height ?? 0;\n              container.style.height = `${height}px`;\n            } catch {}\n          };\n          // Prevent the keyboard from hiding (drag/resize can blur the field)\n          const onBeforeToggle = (\n            ev?: Event | CustomEvent<{ visible: boolean }>\n          ) => {\n            const detail = (ev as CustomEvent<{ visible: boolean }> | undefined)\n              ?.detail;\n            if (kbd.visible === true && detail?.visible === false) {\n              if (\n                ev &&\n                \"preventDefault\" in ev &&\n                typeof ev.preventDefault === \"function\"\n              ) {\n                ev.preventDefault();\n              }\n              // Keep our panel visible\n              container.style.display = \"block\";\n            }\n          };\n\n          (\n            window as unknown as { mathVirtualKeyboard?: VirtualKeyboard }\n          ).mathVirtualKeyboard?.addEventListener?.(\n            \"geometrychange\",\n            onGeometry\n          );\n          (\n            window as unknown as { mathVirtualKeyboard?: VirtualKeyboard }\n          ).mathVirtualKeyboard?.addEventListener?.(\n            \"before-virtual-keyboard-toggle\",\n            onBeforeToggle\n          );\n\n          // Apply height immediately on mount\n          try {\n            onGeometry();\n          } catch {}\n\n          cleanupFns.push(() => {\n            try {\n              (\n                window as unknown as { mathVirtualKeyboard?: VirtualKeyboard }\n              ).mathVirtualKeyboard?.removeEventListener?.(\n                \"geometrychange\",\n                onGeometry\n              );\n            } catch {}\n            try {\n              (\n                window as unknown as { mathVirtualKeyboard?: VirtualKeyboard }\n              ).mathVirtualKeyboard?.removeEventListener?.(\n                \"before-virtual-keyboard-toggle\",\n                onBeforeToggle\n              );\n            } catch {}\n          });\n\n          // Also ensure we hide and detach the keyboard when this component unmounts\n          cleanupFns.push(() => {\n            try {\n              const vk = (\n                window as unknown as { mathVirtualKeyboard?: VirtualKeyboard }\n              ).mathVirtualKeyboard as unknown as\n                | (VirtualKeyboard & { hide?: () => void })\n                | undefined;\n              if (\n                vk &&\n                (vk as unknown as { container?: HTMLElement }).container ===\n                  container\n              ) {\n                try {\n                  (vk as unknown as { visible?: boolean }).visible = false;\n                } catch {}\n                vk.hide?.();\n                try {\n                  (\n                    vk as unknown as { container?: HTMLElement | null }\n                  ).container = null;\n                } catch {}\n              }\n            } catch {}\n            try {\n              container.style.display = \"none\";\n              container.style.height = \"0px\";\n            } catch {}\n          });\n\n          // Ensure it's shown immediately\n          try {\n            kbd.visible = true;\n          } catch {}\n          kbd.show?.();\n          try {\n            onGeometry();\n          } catch {}\n          try {\n            requestAnimationFrame(() => {\n              try {\n                onGeometry();\n              } catch {}\n            });\n          } catch {}\n        }\n      }\n    }\n    setup();\n    return () => {\n      disposed = true;\n      const mf = fieldRef.current as unknown as HTMLElement | null;\n      if (mf && (mf as HTMLElement).parentElement)\n        (mf as HTMLElement).parentElement!.removeChild(mf as HTMLElement);\n      fieldRef.current = null;\n      for (const fn of cleanupFns) fn();\n    };\n  }, [placeholder, onChange, value]);\n\n  // Sync incoming value without remounting the field\n  useEffect(() => {\n    try {\n      if (value != null && fieldRef.current) {\n        const current = fieldRef.current.getValue?.(\"latex\");\n        if (current !== value) fieldRef.current.setValue?.(value);\n      }\n    } catch {}\n  }, [value]);\n\n  // Keyboard is shown automatically; no button needed\n\n  const copyLatex = async () => {\n    const latex = fieldRef.current?.getValue?.(\"latex\");\n    if (latex) {\n      try {\n        await navigator.clipboard.writeText(latex);\n      } catch {}\n    }\n  };\n\n  const clearField = () => {\n    try {\n      fieldRef.current?.setValue?.(\"\");\n      onChange?.(\"\");\n    } catch {}\n  };\n\n  const stopSpeaking = () => {\n    try {\n      if (typeof window !== \"undefined\" && \"speechSynthesis\" in window) {\n        window.speechSynthesis.cancel();\n      }\n    } catch {}\n    speechUtteranceRef.current = null;\n    setIsSpeaking(false);\n  };\n\n  const speakEquation = () => {\n    const field = fieldRef.current;\n    if (!field) return;\n    try {\n      // Ensure focus so commands operate on the mathfield\n      field.focus?.();\n      // Cancel any ongoing speech\n      stopSpeaking();\n      // Try built-in speak of the whole expression\n      const okString = field.executeCommand?.('speak(\"all\")');\n      const okArray = okString || field.executeCommand?.([\"speak\", \"all\"]);\n      if (okArray) return;\n      // Emulate the keyboard workflow: select all, then speak selection\n      const selOk =\n        field.executeCommand?.(\"selectAll\") ||\n        field.executeCommand?.([\"selectAll\"]);\n      const speakSelOk =\n        selOk &&\n        (field.executeCommand?.('speak(\"selection\")') ||\n          field.executeCommand?.([\"speak\", \"selection\"]));\n      if (speakSelOk) return;\n      // Fallback: get speakable text and delegate to speakHook\n      let text = field.getValue?.(\"spoken\");\n      if (!text) text = field.getValue?.(\"spoken-text\");\n      if (!text) text = field.getValue?.(\"latex\");\n      if (text) {\n        try {\n          import(\"mathlive\").then((mod) => {\n            const mfe = (\n              mod as unknown as {\n                MathfieldElement?: { speakHook?: (t: string) => void };\n              }\n            ).MathfieldElement;\n            mfe?.speakHook?.(text as string);\n          });\n        } catch {}\n      }\n    } catch {}\n  };\n\n  useEffect(() => {\n    return () => {\n      // Stop any ongoing speech on unmount\n      try {\n        if (typeof window !== \"undefined\" && \"speechSynthesis\" in window) {\n          window.speechSynthesis.cancel();\n        }\n      } catch {}\n    };\n  }, []);\n\n  return (\n    <div\n      className={`${className ?? \"\"} h-full flex flex-col`}\n      aria-label=\"Equation editor\"\n    >\n      <EquationToolbar\n        onCopy={copyLatex}\n        onClear={clearField}\n        onSpeak={speakEquation}\n        onStop={stopSpeaking}\n        speaking={isSpeaking}\n      />\n      <div ref={hostRef} className=\"no-drag flex-1 min-h-0\" />\n      <div\n        ref={keyboardRef}\n        className=\"mt-2 rounded-t-md border border-border bg-card/70 text-foreground no-drag\"\n        style={{\n          position: \"sticky\",\n          bottom: 0,\n          width: \"100%\",\n          minHeight: 0,\n          overflow: \"hidden\",\n        }}\n        aria-label=\"Virtual keyboard container\"\n      />\n    </div>\n  );\n}\n"],"names":["EquationToolbar","onCopy","onClear","onSpeak","onStop","speaking","jsxs","jsx","configureMathliveSpeech","lifecycle","MathfieldElement","text","utterance","_element","EquationEditor","value","onChange","placeholder","className","hostRef","useRef","keyboardRef","fieldRef","isSpeaking","setIsSpeaking","useState","speechUtteranceRef","useEffect","disposed","cleanupFns","setup","mf","latex","host","kbd","container","initialHeight","applyKeyboardTheme","themeAttr","themeObserver","onGeometry","height","onBeforeToggle","ev","detail","vk","fn","copyLatex","clearField","stopSpeaking","speakEquation","field","mod"],"mappings":"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"}