{"version":3,"sources":["../src/index.ts","../src/components/ChessPuzzle/parts/Root.tsx","../src/utils/index.ts","../src/theme/defaults.ts","../src/hooks/useChessPuzzle.ts","../src/hooks/reducer.ts","../src/hooks/useChessPuzzleContext.ts","../src/theme/context.tsx","../src/theme/utils.ts","../src/components/ChessPuzzle/parts/PuzzleBoard.tsx","../src/components/ChessPuzzle/parts/Reset.tsx","../src/components/ChessPuzzle/parts/Hint.tsx","../src/components/ChessPuzzle/index.ts"],"sourcesContent":["// Components\nexport { ChessPuzzle } from \"./components/ChessPuzzle\";\n\n// Hooks & Context\nexport { useChessPuzzleContext } from \"./hooks/useChessPuzzleContext\";\nexport type { ChessPuzzleContextType } from \"./hooks/useChessPuzzle\";\n\n// Core Types\nexport type { Status, Hint, Puzzle } from \"./utils\";\n\n// Component Props\nexport type { HintProps } from \"./components/ChessPuzzle/parts/Hint\";\nexport type { ResetProps } from \"./components/ChessPuzzle/parts/Reset\";\nexport type { PuzzleBoardProps } from \"./components/ChessPuzzle/parts/PuzzleBoard\";\nexport type { RootProps } from \"./components/ChessPuzzle/parts/Root\";\n\n// Theme - Types\nexport type {\n  ChessPuzzleTheme,\n  PuzzleStateTheme,\n  PartialChessPuzzleTheme,\n} from \"./theme/types\";\n\n// Theme - Values\nexport { defaultPuzzleTheme } from \"./theme/defaults\";\n\n// Theme - Utilities\nexport { mergePuzzleTheme } from \"./theme/utils\";\nexport { useChessPuzzleTheme, ChessPuzzleThemeContext } from \"./theme/context\";\n","import React from \"react\";\nimport { Puzzle, getOrientation } from \"../../../utils\";\nimport {\n  ChessPuzzleContextType,\n  useChessPuzzle,\n} from \"../../../hooks/useChessPuzzle\";\nimport { ChessGame } from \"@react-chess-tools/react-chess-game\";\nimport { ChessPuzzleContext } from \"../../../hooks/useChessPuzzleContext\";\nimport { PuzzleThemeProvider } from \"../../../theme/context\";\nimport { mergePuzzleTheme } from \"../../../theme/utils\";\nimport type { PartialChessPuzzleTheme } from \"../../../theme/types\";\n\nexport interface RootProps {\n  puzzle: Puzzle;\n  onSolve?: (puzzleContext: ChessPuzzleContextType) => void;\n  onFail?: (puzzleContext: ChessPuzzleContextType) => void;\n  /** Optional theme configuration. Supports partial themes - only override the colors you need. */\n  theme?: PartialChessPuzzleTheme;\n  /** When true, any checkmate move solves the puzzle (not just the canonical solution). Defaults to true. */\n  solveOnCheckmate?: boolean;\n}\n\ninterface PuzzleRootInnerProps {\n  puzzle: Puzzle;\n  onSolve?: (puzzleContext: ChessPuzzleContextType) => void;\n  onFail?: (puzzleContext: ChessPuzzleContextType) => void;\n  solveOnCheckmate: boolean;\n  children: React.ReactNode;\n}\n\nconst PuzzleRootInner: React.FC<PuzzleRootInnerProps> = ({\n  puzzle,\n  onSolve,\n  onFail,\n  solveOnCheckmate,\n  children,\n}) => {\n  const context = useChessPuzzle(puzzle, onSolve, onFail, solveOnCheckmate);\n\n  return (\n    <ChessPuzzleContext.Provider value={context}>\n      {children}\n    </ChessPuzzleContext.Provider>\n  );\n};\n\nexport const Root: React.FC<React.PropsWithChildren<RootProps>> = ({\n  puzzle,\n  onSolve,\n  onFail,\n  theme,\n  solveOnCheckmate = true,\n  children,\n}) => {\n  // Merge partial theme with defaults\n  const mergedTheme = React.useMemo(() => mergePuzzleTheme(theme), [theme]);\n\n  return (\n    <ChessGame.Root\n      fen={puzzle.fen}\n      orientation={getOrientation(puzzle)}\n      theme={mergedTheme}\n    >\n      <PuzzleThemeProvider theme={mergedTheme}>\n        <PuzzleRootInner\n          puzzle={puzzle}\n          onSolve={onSolve}\n          onFail={onFail}\n          solveOnCheckmate={solveOnCheckmate}\n        >\n          {children}\n        </PuzzleRootInner>\n      </PuzzleThemeProvider>\n    </ChessGame.Root>\n  );\n};\n\nRoot.displayName = \"ChessPuzzle.Root\";\n","import { type Color, Chess, Move } from \"chess.js\";\nimport { type CSSProperties } from \"react\";\nimport _ from \"lodash\";\nimport type { ChessPuzzleTheme } from \"../theme/types\";\nimport { defaultPuzzleTheme } from \"../theme/defaults\";\n\nexport type Status = \"not-started\" | \"in-progress\" | \"solved\" | \"failed\";\n\nexport type Hint = \"none\" | \"piece\" | \"move\";\n\nexport type Puzzle = {\n  fen: string;\n  moves: string[];\n  // if the first move of the puzzle has to be made by the cpu, as in chess.com puzzles\n  makeFirstMove?: boolean;\n};\n\nexport const getOrientation = (puzzle: Puzzle): Color => {\n  const fen = puzzle.fen;\n  const game = new Chess(fen);\n  if (puzzle.makeFirstMove) {\n    game.move(puzzle.moves[0]);\n  }\n  return game.turn();\n};\n\n/**\n * Generates custom square styles for puzzle states based on theme.\n *\n * @param status - Current puzzle status\n * @param hint - Current hint level\n * @param isPlayerTurn - Whether it's the player's turn\n * @param game - Chess.js game instance\n * @param nextMove - The next expected move (for hints)\n * @param theme - Theme configuration (defaults to defaultPuzzleTheme)\n * @returns Record of square names to CSS properties\n */\nexport const getCustomSquareStyles = (\n  status: Status,\n  hint: Hint,\n  isPlayerTurn: boolean,\n  game: Chess,\n  nextMove?: Move | null,\n  theme: ChessPuzzleTheme = defaultPuzzleTheme,\n) => {\n  const customSquareStyles: Record<string, CSSProperties> = {};\n\n  const lastMove = _.last(game.history({ verbose: true }));\n\n  if (status === \"failed\" && lastMove) {\n    customSquareStyles[lastMove.from] = {\n      backgroundColor: theme.puzzle.failure,\n    };\n    customSquareStyles[lastMove.to] = {\n      backgroundColor: theme.puzzle.failure,\n    };\n  }\n\n  if (\n    lastMove &&\n    (status === \"solved\" || (status !== \"failed\" && !isPlayerTurn))\n  ) {\n    customSquareStyles[lastMove.from] = {\n      backgroundColor: theme.puzzle.success,\n    };\n    customSquareStyles[lastMove.to] = {\n      backgroundColor: theme.puzzle.success,\n    };\n  }\n\n  if (hint === \"piece\") {\n    if (nextMove) {\n      customSquareStyles[nextMove.from] = {\n        backgroundColor: theme.puzzle.hint,\n      };\n    }\n  }\n\n  if (hint === \"move\") {\n    if (nextMove) {\n      customSquareStyles[nextMove.from] = {\n        backgroundColor: theme.puzzle.hint,\n      };\n      customSquareStyles[nextMove.to] = {\n        backgroundColor: theme.puzzle.hint,\n      };\n    }\n  }\n\n  return customSquareStyles;\n};\n\nexport const stringToMove = (game: Chess, move: string | null | undefined) => {\n  const copy = new Chess(game.fen());\n  if (move === null || move === undefined) {\n    return null;\n  }\n  try {\n    return copy.move(move);\n  } catch (e) {\n    return null;\n  }\n};\n","import { defaultGameTheme } from \"@react-chess-tools/react-chess-game\";\nimport type { ChessPuzzleTheme } from \"./types\";\n\n/**\n * Default theme for ChessPuzzle component.\n * Extends the default game theme with puzzle-specific colors.\n * These values match the original hardcoded colors for backward compatibility.\n */\nexport const defaultPuzzleTheme: ChessPuzzleTheme = {\n  ...defaultGameTheme,\n  puzzle: {\n    success: \"rgba(172, 206, 89, 0.5)\",\n    failure: \"rgba(201, 52, 48, 0.5)\",\n    hint: \"rgba(27, 172, 166, 0.5)\",\n  },\n};\n","import { useEffect, useReducer, useCallback, useMemo } from \"react\";\nimport { initializePuzzle, reducer } from \"./reducer\";\nimport { getOrientation, type Puzzle, type Hint, type Status } from \"../utils\";\nimport { useChessGameContext } from \"@react-chess-tools/react-chess-game\";\n\nexport type ChessPuzzleContextType = {\n  status: Status;\n  changePuzzle: (puzzle: Puzzle) => void;\n  resetPuzzle: () => void;\n  puzzle: Puzzle;\n  hint: Hint;\n  nextMove?: string | null;\n  isPlayerTurn: boolean;\n  onHint: () => void;\n  puzzleState: Status;\n  movesPlayed: number;\n  totalMoves: number;\n};\n\nexport const useChessPuzzle = (\n  puzzle: Puzzle,\n  onSolve?: (puzzleContext: ChessPuzzleContextType) => void,\n  onFail?: (puzzleContext: ChessPuzzleContextType) => void,\n  solveOnCheckmate: boolean = true,\n): ChessPuzzleContextType => {\n  const gameContext = useChessGameContext();\n\n  const [state, dispatch] = useReducer(reducer, { puzzle }, initializePuzzle);\n\n  const {\n    game,\n    methods: { makeMove, setPosition },\n  } = gameContext;\n\n  const changePuzzle = useCallback(\n    (puzzle: Puzzle) => {\n      setPosition(puzzle.fen, getOrientation(puzzle));\n      dispatch({ type: \"INITIALIZE\", payload: { puzzle } });\n    },\n    [setPosition],\n  );\n\n  useEffect(() => {\n    changePuzzle(puzzle);\n  }, [JSON.stringify(puzzle), changePuzzle]);\n\n  useEffect(() => {\n    if (gameContext && game.fen() === puzzle.fen && state.needCpuMove) {\n      setTimeout(\n        () =>\n          dispatch({\n            type: \"CPU_MOVE\",\n          }),\n        0,\n      );\n    }\n  }, [gameContext, state.needCpuMove]);\n\n  useEffect(() => {\n    if (state.cpuMove) {\n      makeMove(state.cpuMove);\n    }\n  }, [state.cpuMove]);\n\n  if (!gameContext) {\n    throw new Error(\"useChessPuzzle must be used within a ChessGameContext\");\n  }\n\n  const onHint = useCallback(() => {\n    dispatch({ type: \"TOGGLE_HINT\" });\n  }, []);\n\n  const resetPuzzle = useCallback(() => {\n    changePuzzle(puzzle);\n  }, [changePuzzle, puzzle]);\n\n  const puzzleContext: ChessPuzzleContextType = useMemo(\n    () => ({\n      status: state.status,\n      changePuzzle,\n      resetPuzzle,\n      puzzle,\n      hint: state.hint,\n      onHint,\n      nextMove: state.nextMove,\n      isPlayerTurn: state.isPlayerTurn,\n      puzzleState: state.status,\n      movesPlayed: state.currentMoveIndex,\n      totalMoves: puzzle.moves.length,\n    }),\n    [\n      state.status,\n      changePuzzle,\n      resetPuzzle,\n      puzzle,\n      state.hint,\n      onHint,\n      state.nextMove,\n      state.isPlayerTurn,\n      state.currentMoveIndex,\n    ],\n  );\n\n  useEffect(() => {\n    if (game?.history()?.length <= 0 + (puzzle.makeFirstMove ? 1 : 0)) {\n      return;\n    }\n    if (game.history().length % 2 === (puzzle.makeFirstMove ? 0 : 1)) {\n      dispatch({\n        type: \"PLAYER_MOVE\",\n        payload: {\n          move: gameContext?.game?.history({ verbose: true })?.pop() ?? null,\n          puzzleContext,\n          game: game,\n          solveOnCheckmate,\n        },\n      });\n\n      dispatch({\n        type: \"CPU_MOVE\",\n      });\n    }\n  }, [game?.history()?.length]);\n\n  useEffect(() => {\n    if (state.status === \"solved\" && !state.onSolveInvoked && onSolve) {\n      onSolve(puzzleContext);\n      dispatch({ type: \"MARK_SOLVE_INVOKED\" });\n    }\n  }, [state.status, state.onSolveInvoked]);\n\n  useEffect(() => {\n    if (state.status === \"failed\" && !state.onFailInvoked && onFail) {\n      onFail(puzzleContext);\n      dispatch({ type: \"MARK_FAIL_INVOKED\" });\n    }\n  }, [state.status, state.onFailInvoked]);\n\n  return puzzleContext;\n};\n","import { Chess, Move } from \"chess.js\";\nimport { type Puzzle, type Hint, type Status } from \"../utils\";\nimport { ChessPuzzleContextType } from \"./useChessPuzzle\";\n\nexport type State = {\n  puzzle: Puzzle;\n  currentMoveIndex: number;\n  status: Status;\n  cpuMove?: string | null;\n  nextMove?: string | null;\n  hint: Hint;\n  needCpuMove: boolean;\n  isPlayerTurn: boolean;\n  onSolveInvoked: boolean;\n  onFailInvoked: boolean;\n};\n\nexport type Action =\n  | {\n      type: \"INITIALIZE\";\n      payload: {\n        puzzle: Puzzle;\n      };\n    }\n  | {\n      type: \"RESET\";\n    }\n  | { type: \"TOGGLE_HINT\" }\n  | {\n      type: \"CPU_MOVE\";\n    }\n  | {\n      type: \"PLAYER_MOVE\";\n      payload: {\n        move?: Move | null;\n        puzzleContext: ChessPuzzleContextType;\n        game: Chess;\n        solveOnCheckmate?: boolean;\n      };\n    }\n  | { type: \"MARK_SOLVE_INVOKED\" }\n  | { type: \"MARK_FAIL_INVOKED\" };\n\nexport const initializePuzzle = ({ puzzle }: { puzzle: Puzzle }): State => {\n  return {\n    puzzle,\n    currentMoveIndex: 0,\n    status: \"not-started\",\n    nextMove: puzzle.moves[0],\n    hint: \"none\",\n    cpuMove: null,\n    needCpuMove: !!puzzle.makeFirstMove,\n    isPlayerTurn: !puzzle.makeFirstMove,\n    onSolveInvoked: false,\n    onFailInvoked: false,\n  };\n};\n\nexport const reducer = (state: State, action: Action): State => {\n  switch (action.type) {\n    case \"INITIALIZE\":\n      return {\n        ...state,\n        ...initializePuzzle(action.payload),\n      };\n    case \"RESET\":\n      return {\n        ...state,\n        ...initializePuzzle({\n          puzzle: state.puzzle,\n        }),\n      };\n    case \"TOGGLE_HINT\":\n      if (state.hint === \"none\") {\n        return { ...state, hint: \"piece\" };\n      }\n      return { ...state, hint: \"move\" };\n    case \"CPU_MOVE\":\n      if (state.isPlayerTurn) {\n        return state;\n      }\n      if ([\"solved\", \"failed\"].includes(state.status)) {\n        return state;\n      }\n\n      return {\n        ...state,\n        currentMoveIndex: state.currentMoveIndex + 1,\n        cpuMove: state.puzzle.moves[state.currentMoveIndex],\n        nextMove:\n          state.currentMoveIndex < state.puzzle.moves.length - 1\n            ? state.puzzle.moves[state.currentMoveIndex + 1]\n            : null,\n        needCpuMove: false,\n        isPlayerTurn: true,\n        status: \"in-progress\",\n      };\n\n    case \"PLAYER_MOVE\": {\n      const { move, game, solveOnCheckmate } = action.payload;\n\n      if (move && solveOnCheckmate !== false && game.isCheckmate()) {\n        return {\n          ...state,\n          status: \"solved\",\n          nextMove: null,\n          hint: \"none\",\n          isPlayerTurn: false,\n          onSolveInvoked: false,\n        };\n      }\n\n      const isMoveRight = [move?.san, move?.lan].includes(\n        state?.nextMove || \"\",\n      );\n      const isPuzzleSolved =\n        state.currentMoveIndex === state.puzzle.moves.length - 1;\n\n      if (!isMoveRight) {\n        return {\n          ...state,\n          status: \"failed\",\n          nextMove: null,\n          hint: \"none\",\n          isPlayerTurn: false,\n          onFailInvoked: false,\n        };\n      }\n\n      if (isPuzzleSolved) {\n        return {\n          ...state,\n          status: \"solved\",\n          nextMove: null,\n          hint: \"none\",\n          isPlayerTurn: false,\n          onSolveInvoked: false,\n        };\n      }\n\n      return {\n        ...state,\n        hint: \"none\",\n        currentMoveIndex: state.currentMoveIndex + 1,\n        nextMove: state.puzzle.moves[state.currentMoveIndex + 1],\n        status: \"in-progress\",\n        needCpuMove: true,\n        isPlayerTurn: false,\n      };\n    }\n\n    case \"MARK_SOLVE_INVOKED\":\n      return {\n        ...state,\n        onSolveInvoked: true,\n      };\n\n    case \"MARK_FAIL_INVOKED\":\n      return {\n        ...state,\n        onFailInvoked: true,\n      };\n\n    default:\n      return state;\n  }\n};\n","import React from \"react\";\nimport { useChessPuzzle } from \"./useChessPuzzle\";\n\nexport const ChessPuzzleContext = React.createContext<ReturnType<\n  typeof useChessPuzzle\n> | null>(null);\n\nexport const useChessPuzzleContext = () => {\n  const context = React.useContext(ChessPuzzleContext);\n  if (!context) {\n    throw new Error(\n      `useChessPuzzleContext must be used within a ChessPuzzle component. Make sure your component is wrapped with <ChessPuzzle.Root> or ensure the ChessPuzzle component is properly rendered in the component tree.`,\n    );\n  }\n  return context;\n};\n","import React, { createContext, useContext } from \"react\";\nimport type { ChessPuzzleTheme } from \"./types\";\nimport { defaultPuzzleTheme } from \"./defaults\";\n\n/**\n * Context for ChessPuzzle theme\n */\nexport const ChessPuzzleThemeContext =\n  createContext<ChessPuzzleTheme>(defaultPuzzleTheme);\n\n/**\n * Hook to access the current ChessPuzzle theme.\n * Returns the default puzzle theme if no ThemeProvider is present.\n */\nexport const useChessPuzzleTheme = (): ChessPuzzleTheme => {\n  return useContext(ChessPuzzleThemeContext);\n};\n\nexport interface PuzzleThemeProviderProps {\n  theme: ChessPuzzleTheme;\n  children: React.ReactNode;\n}\n\n/**\n * Internal provider component used by Puzzle Root when a theme prop is provided.\n */\nexport const PuzzleThemeProvider: React.FC<PuzzleThemeProviderProps> = ({\n  theme,\n  children,\n}) => {\n  return (\n    <ChessPuzzleThemeContext.Provider value={theme}>\n      {children}\n    </ChessPuzzleThemeContext.Provider>\n  );\n};\n","import { merge } from \"lodash\";\nimport type { ChessPuzzleTheme, PartialChessPuzzleTheme } from \"./types\";\nimport { defaultPuzzleTheme } from \"./defaults\";\n\n/**\n * Deep merges a partial puzzle theme with the default puzzle theme.\n * Allows users to override only specific theme properties while keeping defaults for the rest.\n *\n * @param partialTheme - Partial theme with only the properties to override\n * @returns Complete puzzle theme with overridden properties merged with defaults\n *\n * @example\n * ```typescript\n * const customTheme = mergePuzzleTheme({\n *   puzzle: { hint: \"rgba(0, 255, 255, 0.5)\" }\n * });\n * // Returns full puzzle theme with only hint color changed\n * ```\n */\nexport const mergePuzzleTheme = (\n  partialTheme?: PartialChessPuzzleTheme,\n): ChessPuzzleTheme => {\n  if (!partialTheme) {\n    return { ...defaultPuzzleTheme };\n  }\n\n  return merge({}, defaultPuzzleTheme, partialTheme);\n};\n","import React from \"react\";\nimport {\n  ChessGame,\n  deepMergeChessboardOptions,\n  useChessGameContext,\n} from \"@react-chess-tools/react-chess-game\";\nimport { getCustomSquareStyles, stringToMove } from \"../../../utils\";\nimport { useChessPuzzleContext } from \"../../..\";\nimport { useChessPuzzleTheme } from \"../../../theme/context\";\n\nexport interface PuzzleBoardProps extends React.ComponentProps<\n  typeof ChessGame.Board\n> {}\n\nexport const PuzzleBoard = React.forwardRef<HTMLDivElement, PuzzleBoardProps>(\n  ({ options, ...rest }, ref) => {\n    const puzzleContext = useChessPuzzleContext();\n    const gameContext = useChessGameContext();\n    const theme = useChessPuzzleTheme();\n\n    if (!puzzleContext) {\n      throw new Error(\"PuzzleContext not found\");\n    }\n    if (!gameContext) {\n      throw new Error(\"ChessGameContext not found\");\n    }\n\n    const { game } = gameContext;\n    const { status, hint, isPlayerTurn, nextMove } = puzzleContext;\n\n    const mergedOptions = deepMergeChessboardOptions(options || {}, {\n      squareStyles: getCustomSquareStyles(\n        status,\n        hint,\n        isPlayerTurn,\n        game,\n        stringToMove(game, nextMove),\n        theme,\n      ),\n    });\n\n    return <ChessGame.Board ref={ref} {...rest} options={mergedOptions} />;\n  },\n);\n\nPuzzleBoard.displayName = \"ChessPuzzle.PuzzleBoard\";\n","import React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { type Puzzle, type Status } from \"../../../utils\";\nimport { useChessPuzzleContext, type ChessPuzzleContextType } from \"../../..\";\n\nexport interface ResetProps extends Omit<\n  React.ButtonHTMLAttributes<HTMLButtonElement>,\n  \"onReset\"\n> {\n  asChild?: boolean;\n  puzzle?: Puzzle;\n  onReset?: (puzzleContext: ChessPuzzleContextType) => void;\n  /**\n   * The puzzle statuses in which the reset button should be visible.\n   * @default [\"failed\", \"solved\"]\n   */\n  showOn?: Status[];\n}\n\nconst defaultShowOn: Status[] = [\"failed\", \"solved\"];\n\nexport const Reset = React.forwardRef<\n  HTMLElement,\n  React.PropsWithChildren<ResetProps>\n>(\n  (\n    {\n      children,\n      asChild,\n      puzzle,\n      onReset,\n      showOn = defaultShowOn,\n      className,\n      ...rest\n    },\n    ref,\n  ) => {\n    const puzzleContext = useChessPuzzleContext();\n    if (!puzzleContext) {\n      throw new Error(\"PuzzleContext not found\");\n    }\n    const { changePuzzle, puzzle: contextPuzzle, status } = puzzleContext;\n\n    const handleClick = React.useCallback(() => {\n      changePuzzle(puzzle || contextPuzzle);\n      onReset?.(puzzleContext);\n    }, [changePuzzle, puzzle, contextPuzzle, puzzleContext, onReset]);\n\n    if (!showOn.includes(status)) {\n      return null;\n    }\n\n    return asChild ? (\n      <Slot ref={ref} onClick={handleClick} className={className} {...rest}>\n        {children}\n      </Slot>\n    ) : (\n      <button\n        ref={ref as React.RefObject<HTMLButtonElement>}\n        type=\"button\"\n        className={className}\n        onClick={handleClick}\n        {...rest}\n      >\n        {children}\n      </button>\n    );\n  },\n);\n\nReset.displayName = \"ChessPuzzle.Reset\";\n","import React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Status } from \"../../../utils\";\nimport { useChessPuzzleContext } from \"../../..\";\n\nexport interface HintProps extends Omit<\n  React.ButtonHTMLAttributes<HTMLButtonElement>,\n  \"onClick\"\n> {\n  asChild?: boolean;\n  /**\n   * The puzzle statuses in which the hint button should be visible.\n   * @default [\"not-started\", \"in-progress\"]\n   */\n  showOn?: Status[];\n}\n\nconst defaultShowOn: Status[] = [\"not-started\", \"in-progress\"];\n\nexport const Hint = React.forwardRef<\n  HTMLElement,\n  React.PropsWithChildren<HintProps>\n>(({ children, asChild, showOn = defaultShowOn, className, ...rest }, ref) => {\n  const puzzleContext = useChessPuzzleContext();\n  if (!puzzleContext) {\n    throw new Error(\"PuzzleContext not found\");\n  }\n  const { onHint, status } = puzzleContext;\n\n  const handleClick = React.useCallback(() => {\n    onHint();\n  }, [onHint]);\n\n  if (!showOn.includes(status)) {\n    return null;\n  }\n\n  return asChild ? (\n    <Slot ref={ref} onClick={handleClick} className={className} {...rest}>\n      {children}\n    </Slot>\n  ) : (\n    <button\n      ref={ref as React.RefObject<HTMLButtonElement>}\n      type=\"button\"\n      className={className}\n      onClick={handleClick}\n      {...rest}\n    >\n      {children}\n    </button>\n  );\n});\n\nHint.displayName = \"ChessPuzzle.Hint\";\n","import { Root } from \"./parts/Root\";\nimport { PuzzleBoard } from \"./parts/PuzzleBoard\";\nimport { Reset } from \"./parts/Reset\";\nimport { Hint } from \"./parts/Hint\";\n\nexport const ChessPuzzle = {\n  Root,\n  Board: PuzzleBoard,\n  Reset,\n  Hint,\n};\n"],"mappings":"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","names":["import_react","_","import_react_chess_game","puzzle","_a","import_react_chess_game","import_react","React","import_react","React","import_lodash","React","import_react","import_react_chess_game","React","import_react","React","import_react","import_react_slot","defaultShowOn","React"]}