@sudobility/sudojo_lib 0.0.4
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/dist/hooks/index.d.ts +27 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +27 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useDailyGame.d.ts +64 -0
- package/dist/hooks/useDailyGame.d.ts.map +1 -0
- package/dist/hooks/useDailyGame.js +120 -0
- package/dist/hooks/useDailyGame.js.map +1 -0
- package/dist/hooks/useGame.d.ts +104 -0
- package/dist/hooks/useGame.d.ts.map +1 -0
- package/dist/hooks/useGame.js +546 -0
- package/dist/hooks/useGame.js.map +1 -0
- package/dist/hooks/useGamePersistence.d.ts +63 -0
- package/dist/hooks/useGamePersistence.d.ts.map +1 -0
- package/dist/hooks/useGamePersistence.js +124 -0
- package/dist/hooks/useGamePersistence.js.map +1 -0
- package/dist/hooks/useGameTeaching.d.ts +89 -0
- package/dist/hooks/useGameTeaching.d.ts.map +1 -0
- package/dist/hooks/useGameTeaching.js +230 -0
- package/dist/hooks/useGameTeaching.js.map +1 -0
- package/dist/hooks/useGameTimer.d.ts +43 -0
- package/dist/hooks/useGameTimer.d.ts.map +1 -0
- package/dist/hooks/useGameTimer.js +68 -0
- package/dist/hooks/useGameTimer.js.map +1 -0
- package/dist/hooks/useHint.d.ts +105 -0
- package/dist/hooks/useHint.d.ts.map +1 -0
- package/dist/hooks/useHint.js +179 -0
- package/dist/hooks/useHint.js.map +1 -0
- package/dist/hooks/useLearning.d.ts +100 -0
- package/dist/hooks/useLearning.d.ts.map +1 -0
- package/dist/hooks/useLearning.js +127 -0
- package/dist/hooks/useLearning.js.map +1 -0
- package/dist/hooks/useLevelGame.d.ts +68 -0
- package/dist/hooks/useLevelGame.d.ts.map +1 -0
- package/dist/hooks/useLevelGame.js +128 -0
- package/dist/hooks/useLevelGame.js.map +1 -0
- package/dist/hooks/useLevels.d.ts +93 -0
- package/dist/hooks/useLevels.d.ts.map +1 -0
- package/dist/hooks/useLevels.js +98 -0
- package/dist/hooks/useLevels.js.map +1 -0
- package/dist/hooks/useLocalStorage.d.ts +26 -0
- package/dist/hooks/useLocalStorage.d.ts.map +1 -0
- package/dist/hooks/useLocalStorage.js +75 -0
- package/dist/hooks/useLocalStorage.js.map +1 -0
- package/dist/hooks/useSudoku.d.ts +125 -0
- package/dist/hooks/useSudoku.d.ts.map +1 -0
- package/dist/hooks/useSudoku.js +655 -0
- package/dist/hooks/useSudoku.js.map +1 -0
- package/dist/hooks/useTechniques.d.ts +92 -0
- package/dist/hooks/useTechniques.d.ts.map +1 -0
- package/dist/hooks/useTechniques.js +108 -0
- package/dist/hooks/useTechniques.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +35 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types/display.d.ts +142 -0
- package/dist/types/display.d.ts.map +1 -0
- package/dist/types/display.js +94 -0
- package/dist/types/display.js.map +1 -0
- package/dist/types/game.d.ts +201 -0
- package/dist/types/game.d.ts.map +1 -0
- package/dist/types/game.js +26 -0
- package/dist/types/game.js.map +1 -0
- package/dist/types/gamePersistence.d.ts +31 -0
- package/dist/types/gamePersistence.d.ts.map +1 -0
- package/dist/types/gamePersistence.js +15 -0
- package/dist/types/gamePersistence.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/progress.d.ts +43 -0
- package/dist/types/progress.d.ts.map +1 -0
- package/dist/types/progress.js +19 -0
- package/dist/types/progress.js.map +1 -0
- package/dist/types/settings.d.ts +19 -0
- package/dist/types/settings.d.ts.map +1 -0
- package/dist/types/settings.js +12 -0
- package/dist/types/settings.js.map +1 -0
- package/dist/types/subscription.d.ts +27 -0
- package/dist/types/subscription.d.ts.map +1 -0
- package/dist/types/subscription.js +8 -0
- package/dist/types/subscription.js.map +1 -0
- package/dist/types/sudoku.d.ts +147 -0
- package/dist/types/sudoku.d.ts.map +1 -0
- package/dist/types/sudoku.js +125 -0
- package/dist/types/sudoku.js.map +1 -0
- package/dist/utils/auth.d.ts +25 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +47 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/board.d.ts +116 -0
- package/dist/utils/board.d.ts.map +1 -0
- package/dist/utils/board.js +291 -0
- package/dist/utils/board.js.map +1 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +23 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/progress.d.ts +44 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +104 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/scramble.d.ts +35 -0
- package/dist/utils/scramble.d.ts.map +1 -0
- package/dist/utils/scramble.js +270 -0
- package/dist/utils/scramble.js.map +1 -0
- package/dist/utils/subscription.d.ts +82 -0
- package/dist/utils/subscription.d.ts.map +1 -0
- package/dist/utils/subscription.js +117 -0
- package/dist/utils/subscription.js.map +1 -0
- package/dist/utils/sudokuPresenter.d.ts +62 -0
- package/dist/utils/sudokuPresenter.d.ts.map +1 -0
- package/dist/utils/sudokuPresenter.js +403 -0
- package/dist/utils/sudokuPresenter.js.map +1 -0
- package/dist/utils/sudokuScrambler.d.ts +61 -0
- package/dist/utils/sudokuScrambler.d.ts.map +1 -0
- package/dist/utils/sudokuScrambler.js +223 -0
- package/dist/utils/sudokuScrambler.js.map +1 -0
- package/dist/utils/technique.d.ts +41 -0
- package/dist/utils/technique.d.ts.map +1 -0
- package/dist/utils/technique.js +106 -0
- package/dist/utils/technique.js.map +1 -0
- package/dist/utils/theme.d.ts +31 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +40 -0
- package/dist/utils/theme.js.map +1 -0
- package/dist/utils/time.d.ts +22 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +41 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/validation.d.ts +107 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +248 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Game state types for Sudojo
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Represents a single cell in the Sudoku grid
|
|
6
|
+
*/
|
|
7
|
+
export interface CellState {
|
|
8
|
+
/** Row index (0-8) */
|
|
9
|
+
row: number;
|
|
10
|
+
/** Column index (0-8) */
|
|
11
|
+
column: number;
|
|
12
|
+
/** The current value (1-9) or null if empty */
|
|
13
|
+
value: number | null;
|
|
14
|
+
/** Whether this cell is an original clue (cannot be modified) */
|
|
15
|
+
isClue: boolean;
|
|
16
|
+
/** Whether this cell has an error (wrong value) */
|
|
17
|
+
isError: boolean;
|
|
18
|
+
/** Pencilmarks (candidate digits) for this cell */
|
|
19
|
+
pencilmarks: Set<number>;
|
|
20
|
+
/** Whether this cell is currently selected */
|
|
21
|
+
isSelected: boolean;
|
|
22
|
+
/** Whether this cell is highlighted (same row/col/block as selected) */
|
|
23
|
+
isHighlighted: boolean;
|
|
24
|
+
/** Whether this cell has the same value as selected cell */
|
|
25
|
+
isSameValue: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A 9x9 grid of cells
|
|
29
|
+
*/
|
|
30
|
+
export type GameBoard = CellState[][];
|
|
31
|
+
/**
|
|
32
|
+
* A single move in the game (for undo/redo)
|
|
33
|
+
*/
|
|
34
|
+
export interface GameMove {
|
|
35
|
+
/** The row of the cell */
|
|
36
|
+
row: number;
|
|
37
|
+
/** The column of the cell */
|
|
38
|
+
column: number;
|
|
39
|
+
/** Previous value (null if was empty) */
|
|
40
|
+
previousValue: number | null;
|
|
41
|
+
/** New value (null if cleared) */
|
|
42
|
+
newValue: number | null;
|
|
43
|
+
/** Previous pencilmarks */
|
|
44
|
+
previousPencilmarks: Set<number>;
|
|
45
|
+
/** New pencilmarks */
|
|
46
|
+
newPencilmarks: Set<number>;
|
|
47
|
+
/** Type of move */
|
|
48
|
+
type: 'value' | 'pencilmark';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Game settings
|
|
52
|
+
*/
|
|
53
|
+
export interface GameSettings {
|
|
54
|
+
/** Whether to highlight errors immediately */
|
|
55
|
+
showErrors: boolean;
|
|
56
|
+
/** Whether to highlight same numbers */
|
|
57
|
+
highlightSameNumbers: boolean;
|
|
58
|
+
/** Whether to highlight related cells (same row/col/block) */
|
|
59
|
+
highlightRelatedCells: boolean;
|
|
60
|
+
/** Whether to auto-remove pencilmarks when placing a value */
|
|
61
|
+
autoRemovePencilmarks: boolean;
|
|
62
|
+
/** Whether to use auto pencilmarks */
|
|
63
|
+
autoPencilmarks: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Default game settings
|
|
67
|
+
*/
|
|
68
|
+
export declare const DEFAULT_GAME_SETTINGS: GameSettings;
|
|
69
|
+
/**
|
|
70
|
+
* Game status
|
|
71
|
+
*/
|
|
72
|
+
export type GameStatus = 'idle' | 'playing' | 'paused' | 'completed' | 'failed';
|
|
73
|
+
/**
|
|
74
|
+
* The complete game state
|
|
75
|
+
*/
|
|
76
|
+
export interface GameState {
|
|
77
|
+
/** The current board state */
|
|
78
|
+
board: GameBoard;
|
|
79
|
+
/** The original puzzle string (81 chars) */
|
|
80
|
+
originalPuzzle: string;
|
|
81
|
+
/** The solution string (81 chars) */
|
|
82
|
+
solution: string;
|
|
83
|
+
/** The scrambled puzzle string (81 chars) */
|
|
84
|
+
scrambledPuzzle: string;
|
|
85
|
+
/** The scrambled solution string (81 chars) */
|
|
86
|
+
scrambledSolution: string;
|
|
87
|
+
/** Scramble mapping for digits (original -> scrambled) */
|
|
88
|
+
digitMapping: Map<number, number>;
|
|
89
|
+
/** Undo stack */
|
|
90
|
+
undoStack: GameMove[];
|
|
91
|
+
/** Redo stack */
|
|
92
|
+
redoStack: GameMove[];
|
|
93
|
+
/** Currently selected cell position */
|
|
94
|
+
selectedCell: {
|
|
95
|
+
row: number;
|
|
96
|
+
column: number;
|
|
97
|
+
} | null;
|
|
98
|
+
/** Game settings */
|
|
99
|
+
settings: GameSettings;
|
|
100
|
+
/** Current game status */
|
|
101
|
+
status: GameStatus;
|
|
102
|
+
/** Number of mistakes made */
|
|
103
|
+
mistakeCount: number;
|
|
104
|
+
/** Maximum mistakes allowed (0 = unlimited) */
|
|
105
|
+
maxMistakes: number;
|
|
106
|
+
/** Time elapsed in seconds */
|
|
107
|
+
elapsedTime: number;
|
|
108
|
+
/** Whether hint mode is active */
|
|
109
|
+
hintMode: boolean;
|
|
110
|
+
/** Board UUID (if loaded from server) */
|
|
111
|
+
boardUuid: string | null;
|
|
112
|
+
/** Level UUID (if associated with a level) */
|
|
113
|
+
levelUuid: string | null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Position in the grid
|
|
117
|
+
*/
|
|
118
|
+
export interface CellPosition {
|
|
119
|
+
row: number;
|
|
120
|
+
column: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Scramble configuration
|
|
124
|
+
*/
|
|
125
|
+
export interface ScrambleConfig {
|
|
126
|
+
/** Whether to scramble rows within blocks */
|
|
127
|
+
scrambleRows: boolean;
|
|
128
|
+
/** Whether to scramble columns within blocks */
|
|
129
|
+
scrambleColumns: boolean;
|
|
130
|
+
/** Whether to scramble row blocks (groups of 3 rows) */
|
|
131
|
+
scrambleRowBlocks: boolean;
|
|
132
|
+
/** Whether to scramble column blocks (groups of 3 columns) */
|
|
133
|
+
scrambleColumnBlocks: boolean;
|
|
134
|
+
/** Whether to scramble digit mapping (1-9 -> 1-9) */
|
|
135
|
+
scrambleDigits: boolean;
|
|
136
|
+
/** Whether to rotate the board (0, 90, 180, 270 degrees) */
|
|
137
|
+
rotate: boolean;
|
|
138
|
+
/** Whether to mirror the board */
|
|
139
|
+
mirror: boolean;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Default scramble configuration (all enabled)
|
|
143
|
+
*/
|
|
144
|
+
export declare const DEFAULT_SCRAMBLE_CONFIG: ScrambleConfig;
|
|
145
|
+
/**
|
|
146
|
+
* Result of scrambling a board
|
|
147
|
+
*/
|
|
148
|
+
export interface ScrambleResult {
|
|
149
|
+
/** The scrambled puzzle string */
|
|
150
|
+
puzzle: string;
|
|
151
|
+
/** The scrambled solution string */
|
|
152
|
+
solution: string;
|
|
153
|
+
/** The digit mapping used (original -> scrambled) */
|
|
154
|
+
digitMapping: Map<number, number>;
|
|
155
|
+
/** The reverse digit mapping (scrambled -> original) */
|
|
156
|
+
reverseDigitMapping: Map<number, number>;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Hint information from the solver
|
|
160
|
+
*/
|
|
161
|
+
export interface GameHint {
|
|
162
|
+
/** Technique name */
|
|
163
|
+
title: string;
|
|
164
|
+
/** Explanation text */
|
|
165
|
+
text: string;
|
|
166
|
+
/** Cells involved in this hint */
|
|
167
|
+
cells: Array<{
|
|
168
|
+
row: number;
|
|
169
|
+
column: number;
|
|
170
|
+
color: string;
|
|
171
|
+
action?: {
|
|
172
|
+
select?: number;
|
|
173
|
+
addPencilmarks?: number[];
|
|
174
|
+
removePencilmarks?: number[];
|
|
175
|
+
};
|
|
176
|
+
}>;
|
|
177
|
+
/** Areas involved (rows, columns, blocks) */
|
|
178
|
+
areas: Array<{
|
|
179
|
+
type: 'row' | 'column' | 'block';
|
|
180
|
+
index: number;
|
|
181
|
+
color: string;
|
|
182
|
+
}>;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Teaching state for step-by-step solving
|
|
186
|
+
*/
|
|
187
|
+
export interface TeachingState {
|
|
188
|
+
/** Whether teaching mode is active */
|
|
189
|
+
isActive: boolean;
|
|
190
|
+
/** Current hint being shown */
|
|
191
|
+
currentHint: GameHint | null;
|
|
192
|
+
/** Index of current step in multi-step hint */
|
|
193
|
+
currentStep: number;
|
|
194
|
+
/** Total number of steps in current hint */
|
|
195
|
+
totalSteps: number;
|
|
196
|
+
/** Whether loading hints */
|
|
197
|
+
isLoading: boolean;
|
|
198
|
+
/** Error message if hint loading failed */
|
|
199
|
+
error: string | null;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=game.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../src/types/game.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Game state types for Sudojo
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Default game settings
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_GAME_SETTINGS = {
|
|
8
|
+
showErrors: true,
|
|
9
|
+
highlightSameNumbers: true,
|
|
10
|
+
highlightRelatedCells: true,
|
|
11
|
+
autoRemovePencilmarks: true,
|
|
12
|
+
autoPencilmarks: false,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Default scramble configuration (all enabled)
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_SCRAMBLE_CONFIG = {
|
|
18
|
+
scrambleRows: true,
|
|
19
|
+
scrambleColumns: true,
|
|
20
|
+
scrambleRowBlocks: true,
|
|
21
|
+
scrambleColumnBlocks: true,
|
|
22
|
+
scrambleDigits: true,
|
|
23
|
+
rotate: true,
|
|
24
|
+
mirror: true,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=game.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../src/types/game.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmEH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,UAAU,EAAE,IAAI;IAChB,oBAAoB,EAAE,IAAI;IAC1B,qBAAqB,EAAE,IAAI;IAC3B,qBAAqB,EAAE,IAAI;IAC3B,eAAe,EAAE,KAAK;CACvB,CAAC;AA2EF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;IACvB,oBAAoB,EAAE,IAAI;IAC1B,cAAc,EAAE,IAAI;IACpB,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;CACb,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Game persistence types for saving/loading game state
|
|
3
|
+
*/
|
|
4
|
+
/** Saved game state */
|
|
5
|
+
export interface SavedGameState {
|
|
6
|
+
/** User input string (81 chars, 0 = empty) */
|
|
7
|
+
inputString: string;
|
|
8
|
+
/** Pencilmarks string (comma-separated per cell) */
|
|
9
|
+
pencilmarksString: string;
|
|
10
|
+
/** Whether pencil mode was active */
|
|
11
|
+
isPencilMode: boolean;
|
|
12
|
+
/** Last saved timestamp */
|
|
13
|
+
savedAt: string;
|
|
14
|
+
}
|
|
15
|
+
/** Key for identifying a game to persist */
|
|
16
|
+
export interface GamePersistenceKey {
|
|
17
|
+
/** Type of puzzle */
|
|
18
|
+
type: 'daily' | 'level';
|
|
19
|
+
/** Unique identifier (date for daily, levelId for level) */
|
|
20
|
+
id: string;
|
|
21
|
+
}
|
|
22
|
+
/** Storage key prefix for game persistence */
|
|
23
|
+
export declare const GAME_STORAGE_PREFIX = "sudojo_game_";
|
|
24
|
+
/**
|
|
25
|
+
* Generate storage key for a game
|
|
26
|
+
*
|
|
27
|
+
* @param key - Game persistence key
|
|
28
|
+
* @returns Storage key string
|
|
29
|
+
*/
|
|
30
|
+
export declare function getGameStorageKey(key: GamePersistenceKey): string;
|
|
31
|
+
//# sourceMappingURL=gamePersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gamePersistence.d.ts","sourceRoot":"","sources":["../../src/types/gamePersistence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,uBAAuB;AACvB,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qCAAqC;IACrC,YAAY,EAAE,OAAO,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,qBAAqB;IACrB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAEjE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Game persistence types for saving/loading game state
|
|
3
|
+
*/
|
|
4
|
+
/** Storage key prefix for game persistence */
|
|
5
|
+
export const GAME_STORAGE_PREFIX = 'sudojo_game_';
|
|
6
|
+
/**
|
|
7
|
+
* Generate storage key for a game
|
|
8
|
+
*
|
|
9
|
+
* @param key - Game persistence key
|
|
10
|
+
* @returns Storage key string
|
|
11
|
+
*/
|
|
12
|
+
export function getGameStorageKey(key) {
|
|
13
|
+
return `${GAME_STORAGE_PREFIX}${key.type}_${key.id}`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=gamePersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gamePersistence.js","sourceRoot":"","sources":["../../src/types/gamePersistence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,OAAO,GAAG,mBAAmB,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type exports for Sudojo library
|
|
3
|
+
*/
|
|
4
|
+
export type { CellPosition, CellState, GameBoard, GameHint, GameMove, GameSettings, GameState, GameStatus, ScrambleConfig, ScrambleResult, TeachingState, } from './game';
|
|
5
|
+
export { DEFAULT_GAME_SETTINGS, DEFAULT_SCRAMBLE_CONFIG } from './game';
|
|
6
|
+
export type { SudokuCell, SudokuBoard, SudokuPlay, SudokuPlaySettings, SudokuAppSettings, SudokuGameState, SudokuDisplay, PlayingSource, } from './sudoku';
|
|
7
|
+
export { DEFAULT_PLAY_SETTINGS, DEFAULT_APP_SETTINGS, createEmptyCell, createEmptyBoard, cellHasError, rowOf, columnOf, blockOf, cellIndex, getRowIndices, getColumnIndices, getBlockIndices, getRelatedIndices, } from './sudoku';
|
|
8
|
+
export type { HintArea, HintCell, HintCellActions, HintStep as DisplayHintStep, CellDisplayState, PencilmarkDisplayState, UIColorPalette, } from './display';
|
|
9
|
+
export { ThemeColor, SudokuColor, UIColorLight, UIColorDark } from './display';
|
|
10
|
+
export type { CompletedPuzzle, GameStats, UserProgress } from './progress';
|
|
11
|
+
export { DEFAULT_PROGRESS, PROGRESS_STORAGE_KEY } from './progress';
|
|
12
|
+
export type { DigitDisplay, AppSettings } from './settings';
|
|
13
|
+
export { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from './settings';
|
|
14
|
+
export type { Product, Subscription } from './subscription';
|
|
15
|
+
export { DEFAULT_SUBSCRIPTION } from './subscription';
|
|
16
|
+
export type { SavedGameState, GamePersistenceKey } from './gamePersistence';
|
|
17
|
+
export { GAME_STORAGE_PREFIX, getGameStorageKey } from './gamePersistence';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAGxE,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,QAAQ,IAAI,eAAe,EAC3B,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG/E,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGpE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGpE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type exports for Sudojo library
|
|
3
|
+
*/
|
|
4
|
+
export { DEFAULT_GAME_SETTINGS, DEFAULT_SCRAMBLE_CONFIG } from './game';
|
|
5
|
+
export { DEFAULT_PLAY_SETTINGS, DEFAULT_APP_SETTINGS, createEmptyCell, createEmptyBoard, cellHasError, rowOf, columnOf, blockOf, cellIndex, getRowIndices, getColumnIndices, getBlockIndices, getRelatedIndices, } from './sudoku';
|
|
6
|
+
export { ThemeColor, SudokuColor, UIColorLight, UIColorDark } from './display';
|
|
7
|
+
export { DEFAULT_PROGRESS, PROGRESS_STORAGE_KEY } from './progress';
|
|
8
|
+
export { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from './settings';
|
|
9
|
+
export { DEFAULT_SUBSCRIPTION } from './subscription';
|
|
10
|
+
export { GAME_STORAGE_PREFIX, getGameStorageKey } from './gamePersistence';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAcxE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAalB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI/E,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIpE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAItD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress tracking types and domain models
|
|
3
|
+
*/
|
|
4
|
+
/** Record of a completed puzzle */
|
|
5
|
+
export interface CompletedPuzzle {
|
|
6
|
+
/** Puzzle identifier */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Type of puzzle */
|
|
9
|
+
type: 'daily' | 'level';
|
|
10
|
+
/** Completion timestamp */
|
|
11
|
+
completedAt: string;
|
|
12
|
+
/** Time to complete in seconds (optional) */
|
|
13
|
+
timeSeconds?: number;
|
|
14
|
+
}
|
|
15
|
+
/** Game statistics */
|
|
16
|
+
export interface GameStats {
|
|
17
|
+
/** Best time in seconds for daily puzzles */
|
|
18
|
+
bestDailyTime: number | null;
|
|
19
|
+
/** Best time in seconds for level puzzles */
|
|
20
|
+
bestLevelTime: number | null;
|
|
21
|
+
/** Average time in seconds */
|
|
22
|
+
averageTime: number | null;
|
|
23
|
+
/** Total time played in seconds */
|
|
24
|
+
totalTimePlayed: number;
|
|
25
|
+
}
|
|
26
|
+
/** User progress data */
|
|
27
|
+
export interface UserProgress {
|
|
28
|
+
/** List of completed puzzles */
|
|
29
|
+
completedPuzzles: CompletedPuzzle[];
|
|
30
|
+
/** Current daily streak */
|
|
31
|
+
dailyStreak: number;
|
|
32
|
+
/** Last daily completion date (YYYY-MM-DD) */
|
|
33
|
+
lastDailyDate: string | null;
|
|
34
|
+
/** Total puzzles completed */
|
|
35
|
+
totalCompleted: number;
|
|
36
|
+
/** Game statistics */
|
|
37
|
+
stats: GameStats;
|
|
38
|
+
}
|
|
39
|
+
/** Default progress state */
|
|
40
|
+
export declare const DEFAULT_PROGRESS: UserProgress;
|
|
41
|
+
/** Storage key for progress data */
|
|
42
|
+
export declare const PROGRESS_STORAGE_KEY = "sudojo-progress";
|
|
43
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/types/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,sBAAsB;AACtB,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB,EAAE,YAW9B,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress tracking types and domain models
|
|
3
|
+
*/
|
|
4
|
+
/** Default progress state */
|
|
5
|
+
export const DEFAULT_PROGRESS = {
|
|
6
|
+
completedPuzzles: [],
|
|
7
|
+
dailyStreak: 0,
|
|
8
|
+
lastDailyDate: null,
|
|
9
|
+
totalCompleted: 0,
|
|
10
|
+
stats: {
|
|
11
|
+
bestDailyTime: null,
|
|
12
|
+
bestLevelTime: null,
|
|
13
|
+
averageTime: null,
|
|
14
|
+
totalTimePlayed: 0,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
/** Storage key for progress data */
|
|
18
|
+
export const PROGRESS_STORAGE_KEY = 'sudojo-progress';
|
|
19
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/types/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,gBAAgB,EAAE,EAAE;IACpB,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,CAAC;IACjB,KAAK,EAAE;QACL,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,CAAC;KACnB;CACF,CAAC;AAEF,oCAAoC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App settings types and domain models
|
|
3
|
+
*/
|
|
4
|
+
/** Display format for Sudoku digits */
|
|
5
|
+
export type DigitDisplay = 'numeric' | 'kanji' | 'emojis';
|
|
6
|
+
/** Application settings */
|
|
7
|
+
export interface AppSettings {
|
|
8
|
+
/** Show errors when input doesn't match solution */
|
|
9
|
+
showErrors: boolean;
|
|
10
|
+
/** Generate symmetrical puzzles */
|
|
11
|
+
symmetrical: boolean;
|
|
12
|
+
/** Digit display format */
|
|
13
|
+
display: DigitDisplay;
|
|
14
|
+
}
|
|
15
|
+
/** Default application settings */
|
|
16
|
+
export declare const DEFAULT_SETTINGS: AppSettings;
|
|
17
|
+
/** Storage key for settings */
|
|
18
|
+
export declare const SETTINGS_STORAGE_KEY = "sudojo-settings";
|
|
19
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,mCAAmC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,2BAA2B;IAC3B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,EAAE,WAI9B,CAAC;AAEF,+BAA+B;AAC/B,eAAO,MAAM,oBAAoB,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App settings types and domain models
|
|
3
|
+
*/
|
|
4
|
+
/** Default application settings */
|
|
5
|
+
export const DEFAULT_SETTINGS = {
|
|
6
|
+
showErrors: true,
|
|
7
|
+
symmetrical: true,
|
|
8
|
+
display: 'numeric',
|
|
9
|
+
};
|
|
10
|
+
/** Storage key for settings */
|
|
11
|
+
export const SETTINGS_STORAGE_KEY = 'sudojo-settings';
|
|
12
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,+BAA+B;AAC/B,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription types and domain models
|
|
3
|
+
*/
|
|
4
|
+
/** Subscription product information */
|
|
5
|
+
export interface Product {
|
|
6
|
+
identifier: string;
|
|
7
|
+
productId?: string;
|
|
8
|
+
price: string;
|
|
9
|
+
priceString: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
period?: string;
|
|
13
|
+
introPrice?: string;
|
|
14
|
+
introPricePeriod?: string;
|
|
15
|
+
freeTrialPeriod?: string;
|
|
16
|
+
}
|
|
17
|
+
/** User subscription status */
|
|
18
|
+
export interface Subscription {
|
|
19
|
+
isActive: boolean;
|
|
20
|
+
expirationDate?: Date;
|
|
21
|
+
purchaseDate?: Date;
|
|
22
|
+
productIdentifier?: string;
|
|
23
|
+
willRenew?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Default inactive subscription */
|
|
26
|
+
export declare const DEFAULT_SUBSCRIPTION: Subscription;
|
|
27
|
+
//# sourceMappingURL=subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/types/subscription.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,uCAAuC;AACvC,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,+BAA+B;AAC/B,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,EAAE,YAElC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/types/subscription.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,oCAAoC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,QAAQ,EAAE,KAAK;CAChB,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sudoku game types - ported from renderable/sudokuschool
|
|
3
|
+
*
|
|
4
|
+
* Uses flat 81-cell array (indexed 0-80) matching Kotlin implementation
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* A single cell in the Sudoku board (indexed 0-80)
|
|
8
|
+
* Matches Kotlin: Cell(index, solution, given, input, pencilmarks)
|
|
9
|
+
*/
|
|
10
|
+
export interface SudokuCell {
|
|
11
|
+
/** Cell index (0-80) */
|
|
12
|
+
index: number;
|
|
13
|
+
/** The correct solution value (1-9, or null if not provided) */
|
|
14
|
+
solution: number | null;
|
|
15
|
+
/** The given/clue value (1-9, or null if empty) */
|
|
16
|
+
given: number | null;
|
|
17
|
+
/** User-entered value (1-9, or null if empty) */
|
|
18
|
+
input: number | null;
|
|
19
|
+
/** Pencil marks (candidate digits 1-9, or null) - matches Kotlin Array<Int>? */
|
|
20
|
+
pencilmarks: number[] | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get row index (0-8) from cell index (0-80)
|
|
24
|
+
*/
|
|
25
|
+
export declare function rowOf(index: number): number;
|
|
26
|
+
/**
|
|
27
|
+
* Get column index (0-8) from cell index (0-80)
|
|
28
|
+
*/
|
|
29
|
+
export declare function columnOf(index: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* Get block index (0-8) from cell index (0-80)
|
|
32
|
+
*/
|
|
33
|
+
export declare function blockOf(index: number): number;
|
|
34
|
+
/**
|
|
35
|
+
* Get cell index from row and column
|
|
36
|
+
*/
|
|
37
|
+
export declare function cellIndex(row: number, column: number): number;
|
|
38
|
+
/**
|
|
39
|
+
* The Sudoku board containing all 81 cells
|
|
40
|
+
*/
|
|
41
|
+
export interface SudokuBoard {
|
|
42
|
+
/** Array of 81 cells (indexed 0-80) */
|
|
43
|
+
cells: SudokuCell[];
|
|
44
|
+
/** Whether the game is completed (all inputs match solutions) */
|
|
45
|
+
completed: boolean;
|
|
46
|
+
/** Whether the board is in manual entry mode */
|
|
47
|
+
entering: boolean;
|
|
48
|
+
/** Error message for manual entry validation */
|
|
49
|
+
enteringError: string | null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Display modes for Sudoku digits
|
|
53
|
+
*/
|
|
54
|
+
export type SudokuDisplay = 'NUMERIC' | 'KANJI' | 'COLORS' | 'EMOJIS';
|
|
55
|
+
/**
|
|
56
|
+
* Session settings (can change during play)
|
|
57
|
+
*/
|
|
58
|
+
export interface SudokuPlaySettings {
|
|
59
|
+
/** Whether pencil marking mode is active */
|
|
60
|
+
pencilmarking: boolean;
|
|
61
|
+
/** Whether auto-pencilmarks were generated */
|
|
62
|
+
autoPencilmarks: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* App-level settings (persisted)
|
|
66
|
+
*/
|
|
67
|
+
export interface SudokuAppSettings {
|
|
68
|
+
/** Show errors when input doesn't match solution */
|
|
69
|
+
showErrors: boolean;
|
|
70
|
+
/** Enable UI animations */
|
|
71
|
+
enableAnimations: boolean;
|
|
72
|
+
/** Generate symmetrical puzzles */
|
|
73
|
+
symmetrical: boolean;
|
|
74
|
+
/** Digit display mode */
|
|
75
|
+
display: SudokuDisplay;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Current play state
|
|
79
|
+
*/
|
|
80
|
+
export interface SudokuPlay {
|
|
81
|
+
/** The game board */
|
|
82
|
+
board: SudokuBoard;
|
|
83
|
+
/** Session settings */
|
|
84
|
+
settings: SudokuPlaySettings;
|
|
85
|
+
/** Currently selected cell index (0-80, or null) */
|
|
86
|
+
selectedIndex: number | null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Source of the puzzle
|
|
90
|
+
*/
|
|
91
|
+
export type PlayingSource = 'DAILY' | 'CHALLENGE' | 'LEVEL' | 'ENTERED';
|
|
92
|
+
/**
|
|
93
|
+
* Full game state including source information
|
|
94
|
+
*/
|
|
95
|
+
export interface SudokuGameState {
|
|
96
|
+
/** Current play state */
|
|
97
|
+
play: SudokuPlay | null;
|
|
98
|
+
/** Original puzzle string (before scrambling) */
|
|
99
|
+
originalPuzzle: string;
|
|
100
|
+
/** Original solution string (before scrambling) */
|
|
101
|
+
originalSolution: string;
|
|
102
|
+
/** Puzzle source */
|
|
103
|
+
source: PlayingSource;
|
|
104
|
+
/** Level UUID if from a level */
|
|
105
|
+
levelUuid: string | null;
|
|
106
|
+
/** Board UUID if applicable */
|
|
107
|
+
boardUuid: string | null;
|
|
108
|
+
/** Undo history stack */
|
|
109
|
+
history: SudokuPlay[];
|
|
110
|
+
/** App settings */
|
|
111
|
+
appSettings: SudokuAppSettings;
|
|
112
|
+
/** Digit mapping from scrambling (original -> scrambled) */
|
|
113
|
+
digitMapping: Map<number, number>;
|
|
114
|
+
/** Reverse digit mapping (scrambled -> original) */
|
|
115
|
+
reverseDigitMapping: Map<number, number>;
|
|
116
|
+
}
|
|
117
|
+
export declare const DEFAULT_PLAY_SETTINGS: SudokuPlaySettings;
|
|
118
|
+
export declare const DEFAULT_APP_SETTINGS: SudokuAppSettings;
|
|
119
|
+
/**
|
|
120
|
+
* Create an empty cell
|
|
121
|
+
*/
|
|
122
|
+
export declare function createEmptyCell(index: number): SudokuCell;
|
|
123
|
+
/**
|
|
124
|
+
* Create an empty board (81 empty cells)
|
|
125
|
+
*/
|
|
126
|
+
export declare function createEmptyBoard(): SudokuBoard;
|
|
127
|
+
/**
|
|
128
|
+
* Check if a cell has an error (input doesn't match solution)
|
|
129
|
+
*/
|
|
130
|
+
export declare function cellHasError(cell: SudokuCell): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Get all cell indices in the same row
|
|
133
|
+
*/
|
|
134
|
+
export declare function getRowIndices(index: number): number[];
|
|
135
|
+
/**
|
|
136
|
+
* Get all cell indices in the same column
|
|
137
|
+
*/
|
|
138
|
+
export declare function getColumnIndices(index: number): number[];
|
|
139
|
+
/**
|
|
140
|
+
* Get all cell indices in the same block
|
|
141
|
+
*/
|
|
142
|
+
export declare function getBlockIndices(index: number): number[];
|
|
143
|
+
/**
|
|
144
|
+
* Get all related cell indices (same row, column, or block)
|
|
145
|
+
*/
|
|
146
|
+
export declare function getRelatedIndices(index: number): number[];
|
|
147
|
+
//# sourceMappingURL=sudoku.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sudoku.d.ts","sourceRoot":"","sources":["../../src/types/sudoku.ts"],"names":[],"mappings":"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"}
|