@js-gamifications/word-search-react 1.0.1
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/README.md +28 -0
- package/dist/index.d.mts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +699 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +672 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wordSearchBoard.tsx"],"sourcesContent":["import { createWordSearch, type WordPlacement, type WordSearchPuzzle } from \"@js-gamifications/word-search-core\";\nimport { useEffect, useMemo, useState } from \"react\";\n\n/**\n * Generates a short synthetic tone for lightweight game feedback.\n */\nfunction playSound(frequency: number, duration: number) {\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n\n oscillator.frequency.value = frequency;\n oscillator.type = \"sine\";\n\n gainNode.gain.setValueAtTime(0.3, audioContext.currentTime);\n gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + duration);\n\n oscillator.start(audioContext.currentTime);\n oscillator.stop(audioContext.currentTime + duration);\n}\n\n/**\n * Positive feedback played when a valid word is found.\n */\nfunction playSuccessSound() {\n playSound(800, 0.15);\n setTimeout(() => {\n playSound(1000, 0.15);\n }, 150);\n}\n\n/**\n * Final completion jingle played when all words are found.\n */\nfunction playWinnerSound() {\n playSound(523.25, 0.2);\n setTimeout(() => {\n playSound(659.25, 0.2);\n }, 220);\n setTimeout(() => {\n playSound(783.99, 0.4);\n }, 440);\n}\n\n/**\n * UI labels localized per supported language.\n */\nconst TRANSLATIONS = {\n ES: {\n title: \"Búsqueda de Palabras\",\n found: \"encontradas\",\n instructions: \"Haz clic y arrastra sobre las letras para seleccionar una palabra.\",\n clearProgress: \"Reiniciar\",\n newPuzzle: \"Nuevo Juego\",\n words: \"Palabras\",\n allWordsFound: \"Todas las palabras encontradas\",\n squareText: \"El tablero se muestra en un contenedor cuadrado para un seguimiento más fácil.\",\n timer: \"Tiempo\",\n completionTitle: \"Puzzle completado\",\n completionMessage: \"Excelente trabajo, encontraste todas las palabras.\",\n completionTime: \"Tiempo total\",\n completionWords: \"Palabras encontradas\",\n completionGrid: \"Tamanio de tablero\",\n completionDiagonal: \"Diagonal habilitada\",\n completionAt: \"Completado a las\",\n yes: \"Si\",\n no: \"No\"\n },\n EN: {\n title: \"Word Search\",\n found: \"found\",\n instructions: \"Hold click and drag over letters to select a word.\",\n clearProgress: \"Clear Progress\",\n newPuzzle: \"New Puzzle\",\n words: \"Words\",\n allWordsFound: \"All words found\",\n squareText: \"Board is rendered in a square container for easier tracking.\",\n timer: \"Time\",\n completionTitle: \"Puzzle Completed\",\n completionMessage: \"Great job, you found every word.\",\n completionTime: \"Total time\",\n completionWords: \"Words found\",\n completionGrid: \"Grid size\",\n completionDiagonal: \"Diagonal enabled\",\n completionAt: \"Completed at\",\n yes: \"Yes\",\n no: \"No\"\n },\n AR: {\n title: \"البحث عن الكلمات\",\n found: \"موجودة\",\n instructions: \"اضغط واسحب فوق الحروف لتحديد كلمة\",\n clearProgress: \"مسح التقدم\",\n newPuzzle: \"لعبة جديدة\",\n words: \"الكلمات\",\n allWordsFound: \"تم العثور على جميع الكلمات\",\n squareText: \"يتم تقديم اللوحة في حاوية مربعة لتتبع أسهل\",\n timer: \"الوقت\",\n completionTitle: \"اكتمل اللغز\",\n completionMessage: \"عمل رائع، لقد عثرت على جميع الكلمات\",\n completionTime: \"الوقت الكلي\",\n completionWords: \"الكلمات التي تم العثور عليها\",\n completionGrid: \"حجم الشبكة\",\n completionDiagonal: \"القطري مفعل\",\n completionAt: \"اكتمل في\",\n yes: \"نعم\",\n no: \"لا\"\n }\n};\n\nexport interface WordSearchCompletionReport {\n elapsedSeconds: number;\n foundWords: number;\n totalWords: number;\n rows: number;\n cols: number;\n allowDiagonal: boolean;\n completedAt: string;\n}\n\nexport interface WordSearchBoardProps {\n /** Number of rows in the generated puzzle grid. */\n rows: number;\n /** Number of columns in the generated puzzle grid. */\n cols: number;\n /** Input words to place in the puzzle. */\n words: string[];\n /** Enables diagonal word placement in the generator. */\n allowDiagonal?: boolean;\n /** Optional className applied to the root container. */\n className?: string;\n /** Callback fired whenever a new puzzle is generated. */\n onGenerated?: (puzzle: WordSearchPuzzle) => void;\n /** Callback fired when the player completes the puzzle. */\n onCompleted?: (report: WordSearchCompletionReport) => void;\n}\n\ninterface CellPosition {\n row: number;\n col: number;\n}\n\n/** Serializes a cell position for use in Set/Map membership checks. */\nfunction toCellKey(cell: CellPosition): string {\n return `${cell.row}:${cell.col}`;\n}\n\n/** Normalizes user words to uppercase and removes spaces for consistent matching. */\nfunction normalizeWord(word: string): string {\n return word.trim().toUpperCase().replace(/\\s+/g, \"\");\n}\n\n/**\n * Builds a contiguous selection path from start to end.\n * Only horizontal, vertical, and diagonal paths are considered valid.\n */\nfunction buildPath(start: CellPosition, end: CellPosition): CellPosition[] {\n const rowDiff = end.row - start.row;\n const colDiff = end.col - start.col;\n const absRowDiff = Math.abs(rowDiff);\n const absColDiff = Math.abs(colDiff);\n\n const isHorizontal = rowDiff === 0;\n const isVertical = colDiff === 0;\n const isDiagonal = absRowDiff === absColDiff;\n\n if (!isHorizontal && !isVertical && !isDiagonal) {\n return [start];\n }\n\n const rowStep = rowDiff === 0 ? 0 : rowDiff / absRowDiff;\n const colStep = colDiff === 0 ? 0 : colDiff / absColDiff;\n const steps = Math.max(absRowDiff, absColDiff);\n\n return Array.from({ length: steps + 1 }, (_, index) => ({\n row: start.row + rowStep * index,\n col: start.col + colStep * index\n }));\n}\n\n/** Expands a placed word into the full list of occupied cells. */\nfunction toPathFromPlacement(placement: WordPlacement): CellPosition[] {\n return Array.from({ length: placement.word.length }, (_, index) => ({\n row: placement.startRow + placement.deltaRow * index,\n col: placement.startCol + placement.deltaCol * index\n }));\n}\n\n/**\n * Validates whether the drag path matches a placement in either direction.\n */\nfunction matchesPlacement(path: CellPosition[], placement: WordPlacement): boolean {\n if (path.length !== placement.word.length) {\n return false;\n }\n\n const expectedForward = toPathFromPlacement(placement);\n const forwardMatch = expectedForward.every((expectedCell, index) => {\n const selected = path[index];\n return selected?.row === expectedCell.row && selected?.col === expectedCell.col;\n });\n\n if (forwardMatch) {\n return true;\n }\n\n return expectedForward.every((expectedCell, index) => {\n const selected = path[path.length - 1 - index];\n return selected?.row === expectedCell.row && selected?.col === expectedCell.col;\n });\n}\n\n/**\n * Interactive word-search board component with drag selection,\n * progress tracking, timer, sounds, and localized labels.\n */\nexport function WordSearchBoard(props: WordSearchBoardProps) {\n const [puzzleSeed, setPuzzleSeed] = useState(0);\n const [language, setLanguage] = useState<\"EN\" | \"ES\" | \"AR\">(\"EN\");\n const [elapsedSeconds, setElapsedSeconds] = useState(0);\n const [showCelebration, setShowCelebration] = useState(false);\n const [completionReport, setCompletionReport] = useState<WordSearchCompletionReport | null>(null);\n\n const t = TRANSLATIONS[language];\n\n // Regenerate the puzzle whenever inputs or seed change.\n const puzzle = useMemo(() => {\n const options = {\n rows: props.rows,\n cols: props.cols,\n words: props.words\n };\n\n if (props.allowDiagonal !== undefined) {\n Object.assign(options, { allowDiagonal: props.allowDiagonal });\n }\n\n const generated = createWordSearch(options);\n\n props.onGenerated?.(generated);\n return generated;\n }, [props.rows, props.cols, props.words, props.allowDiagonal, props.onGenerated, puzzleSeed]);\n\n const normalizedInputWords = useMemo(\n () => props.words.map(normalizeWord).filter(Boolean),\n [props.words]\n );\n\n const [foundWords, setFoundWords] = useState<Set<string>>(new Set());\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState<CellPosition | null>(null);\n const [dragCurrent, setDragCurrent] = useState<CellPosition | null>(null);\n\n // Reset interaction and game state every time a new puzzle is created.\n useEffect(() => {\n setFoundWords(new Set());\n setIsDragging(false);\n setDragStart(null);\n setDragCurrent(null);\n setElapsedSeconds(0);\n setShowCelebration(false);\n setCompletionReport(null);\n }, [puzzle]);\n\n // Global elapsed timer for the current round.\n useEffect(() => {\n const interval = setInterval(() => {\n setElapsedSeconds((previous) => previous + 1);\n }, 1000);\n\n return () => {\n clearInterval(interval);\n };\n }, []);\n\n const formatTime = (seconds: number) => {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n if (hours > 0) {\n return `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n };\n\n // Resolves the current in-progress drag into board coordinates.\n const currentPath = useMemo(() => {\n if (!dragStart || !dragCurrent) {\n return [];\n }\n\n return buildPath(dragStart, dragCurrent);\n }, [dragStart, dragCurrent]);\n\n const foundPlacements = useMemo(\n () => puzzle.placements.filter((placement) => foundWords.has(placement.word)),\n [puzzle.placements, foundWords]\n );\n\n const foundCellKeys = useMemo(() => {\n const result = new Set<string>();\n for (const placement of foundPlacements) {\n for (const cell of toPathFromPlacement(placement)) {\n result.add(toCellKey(cell));\n }\n }\n\n return result;\n }, [foundPlacements]);\n\n const currentPathKeys = useMemo(() => {\n const result = new Set<string>();\n for (const cell of currentPath) {\n result.add(toCellKey(cell));\n }\n\n return result;\n }, [currentPath]);\n\n const pendingWords = useMemo(\n () => normalizedInputWords.filter((word) => !foundWords.has(word)),\n [normalizedInputWords, foundWords]\n );\n\n /**\n * Finalizes current drag selection and applies scoring + feedback.\n */\n const completeSelection = () => {\n if (!dragStart || !dragCurrent) {\n setIsDragging(false);\n setDragStart(null);\n setDragCurrent(null);\n return;\n }\n\n const path = buildPath(dragStart, dragCurrent);\n const match = puzzle.placements.find((placement) => matchesPlacement(path, placement));\n\n if (match) {\n setFoundWords((previous) => {\n const next = new Set(previous);\n next.add(match.word);\n playSuccessSound();\n\n if (next.size === normalizedInputWords.length) {\n const report: WordSearchCompletionReport = {\n elapsedSeconds,\n foundWords: next.size,\n totalWords: normalizedInputWords.length,\n rows: props.rows,\n cols: props.cols,\n allowDiagonal: props.allowDiagonal ?? true,\n completedAt: new Date().toISOString()\n };\n\n setTimeout(() => {\n playWinnerSound();\n setShowCelebration(true);\n setCompletionReport(report);\n props.onCompleted?.(report);\n setTimeout(() => {\n setShowCelebration(false);\n }, 3000);\n }, 100);\n }\n\n return next;\n });\n }\n\n setIsDragging(false);\n setDragStart(null);\n setDragCurrent(null);\n };\n\n useEffect(() => {\n if (!isDragging) {\n return;\n }\n\n const handleMouseUp = () => {\n completeSelection();\n };\n\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDragging, dragStart, dragCurrent, puzzle.placements]);\n\n /** Begins a drag operation from a cell. */\n const startSelection = (row: number, col: number) => {\n setIsDragging(true);\n setDragStart({ row, col });\n setDragCurrent({ row, col });\n };\n\n /** Updates drag endpoint while user moves across cells. */\n const moveSelection = (row: number, col: number) => {\n if (!isDragging) {\n return;\n }\n\n setDragCurrent({ row, col });\n };\n\n /** Completes drag selection if one is in progress. */\n const finishSelection = () => {\n if (!isDragging) {\n return;\n }\n\n completeSelection();\n };\n\n /** Clears solved words while preserving the same puzzle layout. */\n const resetProgress = () => {\n setFoundWords(new Set());\n setIsDragging(false);\n setDragStart(null);\n setDragCurrent(null);\n };\n\n /** Generates a fresh puzzle and resets round state. */\n const generateNewPuzzle = () => {\n resetProgress();\n setPuzzleSeed((previous) => previous + 1);\n };\n\n const boardSize = useMemo(() => {\n const maxDimension = Math.max(props.rows, props.cols);\n return Math.min(560, Math.max(280, maxDimension * 38));\n }, [props.rows, props.cols]);\n\n return (\n <div\n className={props.className}\n style={{\n width: \"100%\",\n borderRadius: \"16px\",\n border: \"1px solid #e4e4e7\",\n background:\n \"linear-gradient(180deg, rgba(255, 255, 255, 1) 0%, rgba(248, 250, 252, 1) 100%)\",\n boxShadow: \"0 10px 30px rgba(15, 23, 42, 0.06)\",\n padding: \"16px\",\n position: \"relative\",\n overflow: \"hidden\"\n }}\n >\n {showCelebration && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 20,\n borderRadius: \"inherit\"\n }}\n >\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(45deg, rgba(34, 197, 94, 0.3) 0%, rgba(34, 197, 94, 0) 100%)\",\n animation: \"pulse 0.6s ease-out\"\n }}\n />\n <style>{`\n @keyframes pulse {\n 0% { opacity: 1; }\n 100% { opacity: 0; }\n }\n @keyframes bounce {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.1); }\n }\n `}</style>\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n fontSize: \"48px\",\n fontWeight: \"bold\",\n color: \"#22c55e\",\n animation: \"bounce 0.6s ease-out\",\n textShadow: \"0 4px 12px rgba(34, 197, 94, 0.4)\"\n }}\n >\n 🎉\n </div>\n </div>\n )}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"12px\",\n gap: \"10px\",\n flexWrap: \"wrap\"\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <strong style={{ fontSize: \"16px\", color: \"#111827\" }}>{t.title}</strong>\n <span\n style={{\n fontSize: \"12px\",\n color: \"#374151\",\n background: \"#f3f4f6\",\n padding: \"4px 8px\",\n borderRadius: \"999px\"\n }}\n >\n {foundWords.size}/{normalizedInputWords.length} {t.found}\n </span>\n <span\n style={{\n fontSize: \"12px\",\n color: \"#374151\",\n background: \"#f3f4f6\",\n padding: \"4px 8px\",\n borderRadius: \"999px\"\n }}\n >\n {t.timer}: {formatTime(elapsedSeconds)}\n </span>\n </div>\n\n <div style={{ fontSize: \"12px\", color: \"#6b7280\" }}>\n {t.instructions}\n </div>\n </div>\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n marginBottom: \"12px\",\n flexWrap: \"wrap\"\n }}\n >\n <div>\n <label style={{ fontSize: \"12px\", color: \"#6b7280\", marginRight: \"6px\" }}>\n Language:\n </label>\n <select\n value={language}\n onChange={(event) => setLanguage(event.target.value as \"EN\" | \"ES\" | \"AR\")}\n style={{\n fontSize: \"12px\",\n padding: \"4px 8px\",\n borderRadius: \"6px\",\n border: \"1px solid #d4d4d8\",\n background: \"#ffffff\",\n cursor: \"pointer\"\n }}\n >\n <option value=\"EN\">English</option>\n <option value=\"ES\">Español</option>\n <option value=\"AR\">العربية</option>\n </select>\n </div>\n\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <button\n type=\"button\"\n onClick={resetProgress}\n style={{\n border: \"1px solid #d4d4d8\",\n background: \"#ffffff\",\n color: \"#374151\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n padding: \"6px 10px\",\n cursor: \"pointer\"\n }}\n >\n {t.clearProgress}\n </button>\n <button\n type=\"button\"\n onClick={generateNewPuzzle}\n style={{\n border: \"1px solid #0ea5e9\",\n background: \"#0ea5e9\",\n color: \"#ffffff\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n padding: \"6px 10px\",\n cursor: \"pointer\"\n }}\n >\n {t.newPuzzle}\n </button>\n </div>\n </div>\n\n <div style={{ width: \"100%\", display: \"flex\", justifyContent: \"center\" }}>\n <div\n style={{\n width: `min(100%, ${boardSize}px)`,\n aspectRatio: \"1 / 1\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${props.cols}, minmax(0, 1fr))`,\n gridTemplateRows: `repeat(${props.rows}, minmax(0, 1fr))`,\n gap: \"1px\",\n userSelect: \"none\",\n touchAction: \"none\"\n }}\n onMouseLeave={finishSelection}\n >\n {puzzle.grid.flatMap((row, rowIndex) =>\n row.map((cell, colIndex) => (\n <button\n key={`${rowIndex}-${colIndex}`}\n type=\"button\"\n onMouseDown={() => startSelection(rowIndex, colIndex)}\n onMouseEnter={() => moveSelection(rowIndex, colIndex)}\n onMouseUp={finishSelection}\n style={{\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"1px solid #d4d4d8\",\n borderRadius: \"8px\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace\",\n fontWeight: 700,\n fontSize: \"clamp(12px, 1.8vw, 16px)\",\n color: \"#111827\",\n background: foundCellKeys.has(toCellKey({ row: rowIndex, col: colIndex }))\n ? \"#bae6fd\"\n : currentPathKeys.has(toCellKey({ row: rowIndex, col: colIndex }))\n ? \"#e0f2fe\"\n : \"#ffffff\",\n cursor: \"pointer\",\n transition: \"background 120ms ease, transform 120ms ease\"\n }}\n >\n {cell}\n </button>\n ))\n )}\n </div>\n </div>\n\n <div\n style={{\n marginTop: \"14px\",\n display: \"grid\",\n gridTemplateColumns: \"1fr\",\n gap: \"8px\"\n }}\n >\n <div style={{ fontSize: \"12px\", color: \"#6b7280\" }}>{t.words}</div>\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n {normalizedInputWords.map((word) => {\n const found = foundWords.has(word);\n return (\n <span\n key={word}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n padding: \"6px 10px\",\n borderRadius: \"999px\",\n border: found ? \"1px solid #22c55e\" : \"1px solid #d4d4d8\",\n background: found ? \"#dcfce7\" : \"#fafafa\",\n color: found ? \"#166534\" : \"#3f3f46\",\n fontSize: \"12px\",\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textDecoration: found ? \"line-through\" : \"none\",\n textDecorationThickness: found ? \"2px\" : undefined,\n textDecorationColor: found ? \"#166534\" : undefined\n }}\n >\n {word}\n </span>\n );\n })}\n </div>\n {pendingWords.length === 0 ? (\n <span style={{ fontSize: \"12px\", color: \"#16a34a\", fontWeight: 600 }}>\n {t.allWordsFound}\n </span>\n ) : null}\n </div>\n\n {completionReport ? (\n <div\n style={{\n marginTop: \"14px\",\n border: \"1px solid #86efac\",\n background: \"linear-gradient(180deg, #f0fdf4 0%, #dcfce7 100%)\",\n borderRadius: \"12px\",\n padding: \"12px\"\n }}\n >\n <div style={{ fontSize: \"14px\", fontWeight: 700, color: \"#166534\", marginBottom: \"4px\" }}>\n {t.completionTitle}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#166534\", marginBottom: \"10px\" }}>\n {t.completionMessage}\n </div>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(180px, 1fr))\",\n gap: \"8px\"\n }}\n >\n <div style={{ fontSize: \"12px\", color: \"#14532d\" }}>\n <strong>{t.completionTime}:</strong> {formatTime(completionReport.elapsedSeconds)}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#14532d\" }}>\n <strong>{t.completionWords}:</strong> {completionReport.foundWords}/{completionReport.totalWords}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#14532d\" }}>\n <strong>{t.completionGrid}:</strong> {completionReport.rows}x{completionReport.cols}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#14532d\" }}>\n <strong>{t.completionDiagonal}:</strong> {completionReport.allowDiagonal ? t.yes : t.no}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#14532d\" }}>\n <strong>{t.completionAt}:</strong>{\" \"}\n {new Date(completionReport.completedAt).toLocaleTimeString()}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@js-gamifications/word-search-react",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "React components for word search puzzles",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.mjs",
|
|
16
|
+
"require": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@js-gamifications/word-search-core": "^1.0.1"
|
|
21
|
+
},
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"react": ">=18"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/react": "^19.0.11",
|
|
27
|
+
"react": "^19.1.0"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsup",
|
|
31
|
+
"clean": "rm -rf dist",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"test": "vitest run --passWithNoTests",
|
|
34
|
+
"lint": "tsc --noEmit"
|
|
35
|
+
}
|
|
36
|
+
}
|