@maxr0ssi/chaos-chess 0.1.7 → 0.2.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/CHANGELOG.md +54 -0
- package/README.md +44 -60
- package/THIRD_PARTY_NOTICES.md +36 -0
- package/dist/chaos-chess.css +1 -1
- package/dist/chaos-chess.js +1049 -678
- package/dist/chaos-chess.js.map +1 -1
- package/dist/index.d.ts +18 -1
- package/package.json +4 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
- New piece artwork: the Cburnett SVG set (BSD licence, see
|
|
6
|
+
THIRD_PARTY_NOTICES.md) replaces Unicode font glyphs, which rendered
|
|
7
|
+
differently per platform and drew black pieces as hollow outlines. Colours are
|
|
8
|
+
themeable through `--cc-pw-body`, `--cc-pw-line`, `--cc-pb-body`,
|
|
9
|
+
`--cc-pb-line` and `--cc-pb-detail`; `--cc-piece-white`/`--cc-piece-black`
|
|
10
|
+
are no longer read.
|
|
11
|
+
- Default board is an opaque slate palette (`--cc-square-light/dark`).
|
|
12
|
+
Selection, last move and check are tints layered over the square instead of
|
|
13
|
+
replacing its colour; move hints use `--cc-hint-rgb`, highlights
|
|
14
|
+
`--cc-highlight-rgb`. Coordinates take the opposite square colour.
|
|
15
|
+
- The board sizes from its container (`min(560px, 100%)`) instead of the
|
|
16
|
+
viewport, so it no longer overflows narrow columns.
|
|
17
|
+
- SVG mute icon instead of an emoji, consistent control labels, the chaos toast
|
|
18
|
+
names pieces ("A white queen appeared on e4!"), and the board no longer dims
|
|
19
|
+
while the AI thinks.
|
|
20
|
+
|
|
21
|
+
## 0.2.0
|
|
22
|
+
|
|
23
|
+
### Breaking
|
|
24
|
+
|
|
25
|
+
- `GameResult` has a new value, `'king-captured'`. Exhaustive `switch` statements over `GameResult` need a case for it.
|
|
26
|
+
- `onMove` now fires for the AI's moves too, not only the human's.
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- `initialState` and `onStateChange` props, and the exported `ChaosChessState` type, so a host can keep a game across unmounts. `initialState` is validated; an invalid one is ignored.
|
|
31
|
+
- "New game" button in the top bar, usable at any time, including during promotion and after the game ends.
|
|
32
|
+
- "AI unavailable" message and two-player mode when the engine fails to start 3 times in a row.
|
|
33
|
+
- Released engines are kept for 5 minutes and reused when a game mounts again (also under React StrictMode).
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- **The AI no longer gets stuck.** Chaos could create positions Stockfish refuses (more than 16 pieces or 8 pawns on a side, a missing king, the side not to move in check), and castling rights left over after a rook was removed could freeze Stockfish completely. Chaos now only creates positions both chess.js and Stockfish accept. If Stockfish still can't give a move, the AI plays a random legal move.
|
|
38
|
+
- The engine recovers from hangs and crashes: every wait has a timeout, a stuck worker is replaced, and a slow search plays its best move so far instead of starting over.
|
|
39
|
+
- A cancelled search's answer could be played on the next position.
|
|
40
|
+
- The human could move the AI's pieces while Stockfish was loading.
|
|
41
|
+
- AI moves were not recorded: no move history, last-move highlight, move sound or `onMove`. As a result, threefold repetition was never detected.
|
|
42
|
+
- The fifty-move rule is reported as `'fifty-move'`.
|
|
43
|
+
- Stale castling and en passant fields after chaos allowed castling without a rook, or en passant captures of missing pawns.
|
|
44
|
+
- Chaos kept firing in a hidden tab, could fire right after the AI's move, and ignored a new STUPID level until the countdown ended.
|
|
45
|
+
- New game during the AI's search could let the old search play into the new game.
|
|
46
|
+
- Restoring a finished game fired `onGameOver` again.
|
|
47
|
+
- Two games on one page shared the mute setting.
|
|
48
|
+
- `go depth 0` or a non-numeric depth never returned; depth is now clamped to 1-20.
|
|
49
|
+
- Buttons are `type="button"`, so they don't submit a surrounding form.
|
|
50
|
+
- No double-tap zoom on the board on iOS.
|
|
51
|
+
|
|
52
|
+
## 0.1.7 and earlier
|
|
53
|
+
|
|
54
|
+
See the git history.
|
package/README.md
CHANGED
|
@@ -1,73 +1,57 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @maxr0ssi/chaos-chess
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Chess against Stockfish, where random "chaos" events add and remove pieces while you think. A React component.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
```bash
|
|
8
|
+
npm install @maxr0ssi/chaos-chess
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
React 18 or later is a peer dependency.
|
|
9
12
|
|
|
10
|
-
##
|
|
13
|
+
## Serve the engine
|
|
11
14
|
|
|
12
|
-
The
|
|
15
|
+
The package ships Stockfish in `dist/stockfish/` (`stockfish-18-lite-single.js` and `.wasm`, about 7 MiB). Serve both files from one folder on your site. By default the component loads `/stockfish/stockfish-18-lite-single.js`; set `stockfishWorkerPath` to use another location.
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
With Vite, for example:
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
```ts
|
|
20
|
+
import { viteStaticCopy } from 'vite-plugin-static-copy';
|
|
21
|
+
|
|
22
|
+
viteStaticCopy({
|
|
23
|
+
targets: [{ src: 'node_modules/@maxr0ssi/chaos-chess/dist/stockfish/*', dest: 'stockfish' }],
|
|
24
|
+
});
|
|
25
|
+
```
|
|
17
26
|
|
|
18
|
-
|
|
19
|
-
export default defineConfig([
|
|
20
|
-
globalIgnores(['dist']),
|
|
21
|
-
{
|
|
22
|
-
files: ['**/*.{ts,tsx}'],
|
|
23
|
-
extends: [
|
|
24
|
-
// Other configs...
|
|
27
|
+
## Use
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
tseslint.configs.strictTypeChecked,
|
|
30
|
-
// Optionally, add this for stylistic rules
|
|
31
|
-
tseslint.configs.stylisticTypeChecked,
|
|
29
|
+
```tsx
|
|
30
|
+
import { ChaosChess } from '@maxr0ssi/chaos-chess';
|
|
31
|
+
import '@maxr0ssi/chaos-chess/styles';
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
parserOptions: {
|
|
37
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
38
|
-
tsconfigRootDir: import.meta.dirname,
|
|
39
|
-
},
|
|
40
|
-
// other options...
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
])
|
|
33
|
+
export function ChessPage() {
|
|
34
|
+
return <ChaosChess />;
|
|
35
|
+
}
|
|
44
36
|
```
|
|
45
37
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
parserOptions: {
|
|
66
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
67
|
-
tsconfigRootDir: import.meta.dirname,
|
|
68
|
-
},
|
|
69
|
-
// other options...
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
])
|
|
38
|
+
Without `defaultHumanColor`, the player picks a side first. Useful props:
|
|
39
|
+
|
|
40
|
+
| Prop | Purpose |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `defaultHumanColor`, `defaultDepth`, `defaultStupidLevel`, `defaultMuted` | Starting settings |
|
|
43
|
+
| `depth` / `onDepthChange`, `stupidLevel` / `onStupidLevelChange` | Controlled settings |
|
|
44
|
+
| `initialState` / `onStateChange` | Save a game and restore it after unmounting |
|
|
45
|
+
| `onMove`, `onGameOver`, `onChaosAction`, `onRestart` | Events |
|
|
46
|
+
| `stockfishWorkerPath` | Where the engine is served |
|
|
47
|
+
| `showControls`, `showMuteButton`, `skipSetup`, `className` | Layout |
|
|
48
|
+
|
|
49
|
+
`INTEGRATION.md` has the full props reference, theming variables and the save/restore pattern. `CHANGELOG.md` lists changes by version.
|
|
50
|
+
|
|
51
|
+
## Develop
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm run dev # standalone app
|
|
55
|
+
npm test # unit, component and engine integration tests
|
|
56
|
+
npm run build:lib # library build into dist/
|
|
73
57
|
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
## Chess piece artwork
|
|
4
|
+
|
|
5
|
+
The piece artwork in `src/components/pieceArt.ts` is the "Cburnett" set by
|
|
6
|
+
Colin M.L. Burnett (User:Cburnett on Wikimedia Commons), with colours turned
|
|
7
|
+
into CSS variables. It is offered under several licences; this package uses it
|
|
8
|
+
under the BSD 3-clause licence:
|
|
9
|
+
|
|
10
|
+
> Copyright (c) Colin M.L. Burnett. All rights reserved.
|
|
11
|
+
>
|
|
12
|
+
> Redistribution and use in source and binary forms, with or without
|
|
13
|
+
> modification, are permitted provided that the following conditions are met:
|
|
14
|
+
>
|
|
15
|
+
> 1. Redistributions of source code must retain the above copyright notice,
|
|
16
|
+
> this list of conditions and the following disclaimer.
|
|
17
|
+
> 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
18
|
+
> this list of conditions and the following disclaimer in the documentation
|
|
19
|
+
> and/or other materials provided with the distribution.
|
|
20
|
+
> 3. Neither the name of the copyright holder nor the names of its
|
|
21
|
+
> contributors may be used to endorse or promote products derived from this
|
|
22
|
+
> software without specific prior written permission.
|
|
23
|
+
>
|
|
24
|
+
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
25
|
+
> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
26
|
+
> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
27
|
+
> ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
28
|
+
> LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
29
|
+
> CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
30
|
+
> SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
31
|
+
> INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
32
|
+
> CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
33
|
+
> ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
34
|
+
> POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
|
|
36
|
+
Source: https://commons.wikimedia.org/wiki/Category:SVG_chess_pieces
|
package/dist/chaos-chess.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
._square_1tsnw_1{position:relative;display:flex;align-items:center;justify-content:center;width:100%;height:100%;cursor:pointer;transition:background-color .15s ease;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}._light_1tsnw_14{background-color:var(--cc-square-light)}._dark_1tsnw_18{background-color:var(--cc-square-dark)}._selected_1tsnw_22{background-color:rgba(var(--cc-accent-rgb),.35)!important}._legalMove_1tsnw_26:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:28%;height:28%;border-radius:50%;background-color:rgba(var(--cc-accent-rgb),.3);pointer-events:none}._legalCapture_1tsnw_39:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:85%;height:85%;border-radius:50%;border:3px solid rgba(var(--cc-accent-rgb),.35);background:transparent;pointer-events:none;box-sizing:border-box}._check_1tsnw_54{background-color:rgba(var(--cc-check-rgb),.5)!important}._lastMoveFrom_1tsnw_58{background-color:rgba(var(--cc-orange-rgb),.2)!important}._lastMoveTo_1tsnw_62{background-color:rgba(var(--cc-orange-rgb),.3)!important}._chaosFlash_1tsnw_66{animation:_cc-chaosFlash_1tsnw_1 .6s ease-out}._piece_1tsnw_70{font-size:calc(min(560px,90vw)*.09375);line-height:1;filter:drop-shadow(0 2px 4px rgba(0,0,0,.5));transition:transform .15s ease;pointer-events:none}._pieceWhite_1tsnw_78{color:var(--cc-piece-white, #F5F5F5);filter:drop-shadow(0 2px 4px rgba(0,0,0,.5))}._pieceBlack_1tsnw_83{color:var(--cc-piece-black, #1a1a1a);filter:drop-shadow(0 1px 3px rgba(255,255,255,.3))}._pieceAppear_1tsnw_88{animation:_cc-pieceAppear_1tsnw_1 .4s ease-out}._pieceDisappear_1tsnw_92{animation:_cc-pieceDisappear_1tsnw_1 .3s ease-in forwards}._board_1jwdv_1{display:grid;grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(8,1fr);width:min(560px,90vw);height:min(560px,90vw);border-radius:12px;overflow:hidden;box-shadow:var(--cc-shadow-board);border:1px solid var(--cc-border-subtle)}._rankLabel_1jwdv_13{position:absolute;top:2px;left:4px;font-size:10px;font-family:var(--cc-font-body);color:rgba(var(--cc-text-rgb),.35);pointer-events:none;-webkit-user-select:none;user-select:none}._fileLabel_1jwdv_24{position:absolute;bottom:2px;right:4px;font-size:10px;font-family:var(--cc-font-body);color:rgba(var(--cc-text-rgb),.35);pointer-events:none;-webkit-user-select:none;user-select:none}._boardLocked_1jwdv_35{opacity:.85;pointer-events:none}._promotionOverlay_1p5vy_2{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0009;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:100;animation:_cc-fadeIn_1p5vy_1 .2s ease-out}._promotionDialog_1p5vy_14{display:flex;flex-direction:column;align-items:center;gap:16px;padding:24px 32px;background:var(--cc-surface-glass);border:1px solid rgba(var(--cc-accent-rgb),.2);border-radius:20px;box-shadow:var(--cc-shadow-dialog);animation:_cc-bounceIn_1p5vy_1 .4s ease-out}._promotionTitle_1p5vy_27{font-family:var(--cc-font-display);font-size:16px;color:var(--cc-text);margin:0}._promotionOptions_1p5vy_34{display:flex;gap:12px}._promotionBtn_1p5vy_39{display:flex;align-items:center;justify-content:center;width:64px;height:64px;font-size:40px;background:var(--cc-btn-bg);border:1px solid var(--cc-border-light);border-radius:12px;cursor:pointer;transition:all .15s ease;filter:drop-shadow(0 2px 4px rgba(0,0,0,.5))}._promotionBtn_1p5vy_39:hover{background:var(--cc-btn-bg-hover);border-color:var(--cc-btn-border-hover);transform:scale(1.08)}._gameOverOverlay_1p5vy_61{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#000000a6;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:100;animation:_cc-fadeIn_1p5vy_1 .3s ease-out}._gameOverBanner_1p5vy_73{display:flex;flex-direction:column;align-items:center;gap:20px;padding:32px 48px;background:var(--cc-surface-glass-heavy);border:1px solid rgba(var(--cc-accent-rgb),.2);border-radius:20px;box-shadow:var(--cc-shadow-banner);animation:_cc-bounceIn_1p5vy_1 .5s ease-out}._gameOverResult_1p5vy_86{font-family:var(--cc-font-display);font-size:28px;font-weight:700;color:var(--cc-accent);margin:0;text-align:center}._gameOverDetail_1p5vy_95{font-family:var(--cc-font-body);font-size:14px;color:rgba(var(--cc-text-rgb),.7);margin:0}._restartBtn_1p5vy_102{padding:10px 32px;font-family:var(--cc-font-display);font-size:15px;font-weight:600;color:var(--cc-bg);background:var(--cc-accent);border:none;border-radius:999px;cursor:pointer;transition:all .15s ease}._restartBtn_1p5vy_102:hover{transform:scale(1.05);box-shadow:0 0 16px rgba(var(--cc-accent-rgb),.4)}._chaosBar_1p5vy_121{display:flex;align-items:center;gap:10px;width:100%;padding:0 4px}._chaosBarLabel_1p5vy_129{font-family:var(--cc-font-body);font-size:10px;font-weight:700;letter-spacing:1.5px;color:rgba(var(--cc-accent-rgb),.7);white-space:nowrap}._chaosBarTrack_1p5vy_138{flex:1;height:6px;border-radius:3px;background:var(--cc-border-subtle);overflow:hidden}._chaosBarFill_1p5vy_146{height:100%;border-radius:3px;background:var(--cc-accent);transition:width .3s ease;box-shadow:0 0 calc(4px + 12px * var(--glow, 0)) rgba(var(--cc-accent-rgb),calc(.3 + .5 * var(--glow, 0)))}._difficultySelector_1p5vy_155{display:flex;flex-direction:column;gap:4px;flex:1}._difficultyLabel_1p5vy_162{font-family:var(--cc-font-body);font-size:11px;color:rgba(var(--cc-text-rgb),.5)}._difficultySlider_1p5vy_168{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;background:var(--cc-slider-track);outline:none}._difficultySlider_1p5vy_168::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:var(--cc-accent);cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._difficultySlider_1p5vy_168::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(--cc-accent);border:none;cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._difficultyValue_1p5vy_199{font-family:var(--cc-font-display);font-size:11px;color:var(--cc-accent)}._sidePickerOverlay_1p5vy_206{display:flex;align-items:center;justify-content:center;width:100%;min-height:min(560px,90vw)}._sidePickerCard_1p5vy_214{display:flex;flex-direction:column;align-items:center;gap:28px;padding:40px 48px;background:var(--cc-surface-glass);border:1px solid rgba(var(--cc-accent-rgb),.2);border-radius:20px;box-shadow:var(--cc-shadow-dialog);animation:_cc-bounceIn_1p5vy_1 .5s ease-out}._sidePickerTitle_1p5vy_227{font-family:var(--cc-font-display);font-size:22px;font-weight:700;color:var(--cc-text);margin:0}._sidePickerOptions_1p5vy_235{display:flex;gap:20px}._sidePickerBtn_1p5vy_240{display:flex;flex-direction:column;align-items:center;gap:8px;padding:20px 28px;background:var(--cc-btn-bg);border:1px solid var(--cc-border-light);border-radius:16px;cursor:pointer;transition:all .2s ease}._sidePickerBtn_1p5vy_240:hover{background:rgba(var(--cc-accent-rgb),.12);border-color:var(--cc-btn-border-hover);transform:scale(1.06);box-shadow:0 0 20px rgba(var(--cc-accent-rgb),.25)}._sidePickerIcon_1p5vy_260{font-size:56px;line-height:1}._sidePickerWhite_1p5vy_265{color:var(--cc-piece-white);filter:drop-shadow(0 2px 6px rgba(0,0,0,.6))}._sidePickerBlack_1p5vy_270{color:var(--cc-piece-black);filter:drop-shadow(0 0 4px rgba(var(--cc-text-rgb),.3))}._sidePickerLabel_1p5vy_275{font-family:var(--cc-font-display);font-size:15px;font-weight:600;color:var(--cc-text)}._sidePickerSettings_1p5vy_282{display:flex;gap:24px;width:100%;padding-top:8px;border-top:1px solid var(--cc-border-subtle)}._stupidLevel_1p5vy_291{display:flex;flex-direction:column;gap:4px;min-width:100px}._stupidLevelHeader_1p5vy_298{display:flex;justify-content:space-between;align-items:center}._stupidLevelLabel_1p5vy_304{font-family:var(--cc-font-display);font-size:10px;font-weight:700;letter-spacing:1px;color:rgba(var(--cc-text-rgb),.5)}._stupidLevelValue_1p5vy_312{font-family:var(--cc-font-display);font-size:10px;font-weight:700;color:var(--cc-accent)}._stupidLevelSlider_1p5vy_319{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;background:var(--cc-slider-track);outline:none}._stupidLevelSlider_1p5vy_319::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--cc-accent);cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._stupidLevelSlider_1p5vy_319::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--cc-accent);border:none;cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._muteBtn_1p5vy_351{display:flex;align-items:center;justify-content:center;width:32px;height:32px;font-size:16px;background:none;border:1px solid rgba(255,255,255,.1);border-radius:8px;cursor:pointer;color:var(--cc-accent);transition:all .15s ease}._muteBtn_1p5vy_351:hover{background:rgba(var(--cc-accent-rgb),.1);border-color:rgba(var(--cc-accent-rgb),.25)}._muteBtnMuted_1p5vy_371{color:rgba(var(--cc-text-rgb),.3)}._muteBtnMuted_1p5vy_371:hover{background:var(--cc-btn-bg);border-color:#ffffff26}._chaosToast_1p5vy_381{position:absolute;top:24px;left:50%;transform:translate(-50%);padding:10px 24px;font-family:var(--cc-font-body);font-size:14px;font-weight:600;color:var(--cc-orange);background:var(--cc-surface-glass);border:1px solid rgba(var(--cc-orange-rgb),.3);border-radius:12px;box-shadow:0 4px 24px #0006,0 0 12px rgba(var(--cc-orange-rgb),.15);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:200;white-space:nowrap;animation:_cc-slideIn_1p5vy_1 .3s ease-out}._chaosToastFading_1p5vy_401{animation:_cc-slideOut_1p5vy_1 .4s ease-in forwards}._container_hob8y_1{display:flex;flex-direction:column;align-items:center;gap:12px;width:min(560px,90vw);margin:0 auto;font-family:var(--cc-font-body)}._topBar_hob8y_11{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 4px}._topBarLeft_hob8y_19{display:flex;align-items:center;gap:8px}._statusText_hob8y_25{font-family:var(--cc-font-display);font-size:14px;color:var(--cc-text)}._thinking_hob8y_31{display:flex;align-items:center;gap:6px;font-family:var(--cc-font-display);font-size:13px;color:var(--cc-accent);animation:_cc-thinkingPulse_hob8y_1 1.2s ease-in-out infinite}._bottomBar_hob8y_41{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 4px;gap:16px}[data-chaos-chess]{--cc-accent: var(--color-accent-primary, #82FFF4);--cc-accent-rgb: var(--color-accent-primary-rgb, 130, 255, 244);--cc-bg: var(--color-surface-base, #242222);--cc-surface-glass: rgba(36, 34, 34, .92);--cc-surface-glass-heavy: rgba(36, 34, 34, .95);--cc-text: var(--color-text-primary, #F5F5F5);--cc-text-rgb: 245, 245, 245;--cc-orange: var(--color-accent-orange-soft, #FFB67A);--cc-orange-rgb: 255, 182, 122;--cc-red-rgb: 255, 80, 80;--cc-check-rgb: 255, 50, 50;--cc-border-subtle: rgba(255, 255, 255, .08);--cc-border-light: rgba(255, 255, 255, .12);--cc-square-light: rgba(255, 255, 255, .12);--cc-square-dark: rgba(0, 0, 0, .25);--cc-font-body: var(--font-sans, "Inter", sans-serif);--cc-font-display: var(--font-display, "Comfortaa", cursive);--cc-btn-bg: rgba(255, 255, 255, .06);--cc-btn-bg-hover: rgba(var(--cc-accent-rgb), .15);--cc-btn-border-hover: rgba(var(--cc-accent-rgb), .3);--cc-slider-track: rgba(255, 255, 255, .1);--cc-shadow-board: 0 8px 32px rgba(0, 0, 0, .4);--cc-shadow-dialog: 0 8px 40px rgba(0, 0, 0, .5), 0 0 20px rgba(var(--cc-accent-rgb), .1);--cc-shadow-banner: 0 12px 48px rgba(0, 0, 0, .5), 0 0 24px rgba(var(--cc-accent-rgb), .1);--cc-piece-white: #F5F5F5;--cc-piece-black: #1a1a1a;position:relative}html.light-mode [data-chaos-chess]{--cc-piece-white: #F5F5F5;--cc-piece-black: #1a1a1a;--cc-bg: var(--color-surface-base, #f5f5f5);--cc-surface-glass: rgba(255, 255, 255, .92);--cc-surface-glass-heavy: rgba(255, 255, 255, .95);--cc-text-rgb: 30, 30, 30;--cc-border-subtle: rgba(0, 0, 0, .08);--cc-border-light: rgba(0, 0, 0, .12);--cc-square-light: rgba(0, 0, 0, .08);--cc-square-dark: rgba(0, 0, 0, .22);--cc-btn-bg: rgba(0, 0, 0, .05);--cc-slider-track: rgba(0, 0, 0, .1);--cc-shadow-board: 0 8px 32px rgba(0, 0, 0, .15);--cc-shadow-dialog: 0 8px 40px rgba(0, 0, 0, .2), 0 0 20px rgba(var(--cc-accent-rgb), .08);--cc-shadow-banner: 0 12px 48px rgba(0, 0, 0, .2), 0 0 24px rgba(var(--cc-accent-rgb), .08)}@keyframes cc-bounceIn{0%{transform:scale(.3);opacity:0}50%{transform:scale(1.08)}70%{transform:scale(.95)}to{transform:scale(1);opacity:1}}@keyframes cc-glowPulse{0%,to{box-shadow:0 0 8px #82fff44d}50%{box-shadow:0 0 20px #82fff499}}@keyframes cc-chaosFlash{0%{background-color:#ff505080}to{background-color:transparent}}@keyframes cc-pieceAppear{0%{transform:scale(0);opacity:0}60%{transform:scale(1.15)}to{transform:scale(1);opacity:1}}@keyframes cc-pieceDisappear{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}@keyframes cc-thinkingPulse{0%,to{opacity:.4}50%{opacity:1}}@keyframes cc-slideIn{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes cc-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes cc-chaosBarPulse{0%,to{box-shadow:0 0 4px #ff50504d}50%{box-shadow:0 0 16px #ff5050b3}}@keyframes cc-slideOut{0%{transform:translateY(0);opacity:1}to{transform:translateY(-20px);opacity:0}}
|
|
1
|
+
._square_u4pju_1{position:relative;display:flex;align-items:center;justify-content:center;width:100%;height:100%;cursor:pointer;transition:background-color .15s ease;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}._light_u4pju_15{background-color:var(--cc-square-light);--cc-coord: var(--cc-square-dark)}._dark_u4pju_20{background-color:var(--cc-square-dark);--cc-coord: var(--cc-square-light)}._selected_u4pju_26,._check_u4pju_27,._lastMoveFrom_u4pju_28,._lastMoveTo_u4pju_29{background-image:linear-gradient(var(--cc-tint),var(--cc-tint))}._selected_u4pju_26{--cc-tint: rgba(var(--cc-highlight-rgb), .55)}._legalMove_u4pju_37:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:28%;height:28%;border-radius:50%;background-color:rgba(var(--cc-hint-rgb),.28);pointer-events:none}._legalCapture_u4pju_50:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:85%;height:85%;border-radius:50%;border:4px solid rgba(var(--cc-hint-rgb),.28);background:transparent;pointer-events:none;box-sizing:border-box}._check_u4pju_27{--cc-tint: rgba(var(--cc-check-rgb), .55)}._lastMoveFrom_u4pju_28{--cc-tint: rgba(var(--cc-highlight-rgb), .22)}._lastMoveTo_u4pju_29{--cc-tint: rgba(var(--cc-highlight-rgb), .34)}._chaosFlash_u4pju_77{animation:_cc-chaosFlash_u4pju_1 .6s ease-out}._pieceArt_u4pju_82{display:block;overflow:visible;filter:drop-shadow(0 1.5px 1.5px rgba(0,0,0,.3))}._piece_u4pju_82{width:88%;height:88%;transition:transform .15s ease;pointer-events:none}._pieceAppear_u4pju_99{animation:_cc-pieceAppear_u4pju_1 .4s ease-out}._pieceDisappear_u4pju_103{animation:_cc-pieceDisappear_u4pju_1 .3s ease-in forwards}._board_8cqhv_1{display:grid;touch-action:manipulation;grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(8,1fr);width:100%;aspect-ratio:1;border-radius:10px;overflow:hidden;box-shadow:var(--cc-shadow-board);border:1px solid var(--cc-border-subtle)}._rankLabel_8cqhv_16{position:absolute;top:2px;left:4px;font-size:10px;font-weight:700;font-family:var(--cc-font-body);color:var(--cc-coord);pointer-events:none;-webkit-user-select:none;user-select:none}._fileLabel_8cqhv_28{position:absolute;bottom:2px;right:4px;font-size:10px;font-weight:700;font-family:var(--cc-font-body);color:var(--cc-coord);pointer-events:none;-webkit-user-select:none;user-select:none}._boardLocked_8cqhv_40{pointer-events:none}._promotionOverlay_eh63o_2{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0009;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:100;animation:_cc-fadeIn_eh63o_1 .2s ease-out}._promotionDialog_eh63o_14{display:flex;flex-direction:column;align-items:center;gap:16px;padding:24px 32px;background:var(--cc-surface-glass);border:1px solid rgba(var(--cc-accent-rgb),.2);border-radius:20px;box-shadow:var(--cc-shadow-dialog);animation:_cc-bounceIn_eh63o_1 .4s ease-out}._promotionTitle_eh63o_27{font-family:var(--cc-font-display);font-size:16px;color:var(--cc-text);margin:0}._promotionOptions_eh63o_34{display:flex;gap:12px}._promotionBtn_eh63o_39{display:flex;align-items:center;justify-content:center;width:64px;height:64px;padding:6px;background:var(--cc-square-light);border:1px solid var(--cc-border-light);border-radius:12px;cursor:pointer;transition:all .15s ease}._promotionBtn_eh63o_39>svg{width:100%;height:100%}._promotionBtn_eh63o_39:hover{background:var(--cc-btn-bg-hover);border-color:var(--cc-btn-border-hover);transform:scale(1.08)}._gameOverOverlay_eh63o_66{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#000000a6;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:100;animation:_cc-fadeIn_eh63o_1 .3s ease-out}._gameOverBanner_eh63o_78{display:flex;flex-direction:column;align-items:center;gap:20px;padding:32px 48px;background:var(--cc-surface-glass-heavy);border:1px solid rgba(var(--cc-accent-rgb),.2);border-radius:20px;box-shadow:var(--cc-shadow-banner);animation:_cc-bounceIn_eh63o_1 .5s ease-out}._gameOverResult_eh63o_91{font-family:var(--cc-font-display);font-size:28px;font-weight:700;color:var(--cc-accent);margin:0;text-align:center}._gameOverDetail_eh63o_100{font-family:var(--cc-font-body);font-size:14px;color:rgba(var(--cc-text-rgb),.7);margin:0}._restartBtn_eh63o_107{padding:10px 32px;font-family:var(--cc-font-display);font-size:15px;font-weight:600;color:var(--cc-bg);background:var(--cc-accent);border:none;border-radius:999px;cursor:pointer;transition:all .15s ease}._restartBtn_eh63o_107:hover{transform:scale(1.05);box-shadow:0 0 16px rgba(var(--cc-accent-rgb),.4)}._chaosBar_eh63o_126{display:flex;align-items:center;gap:10px;width:100%;padding:0 4px}._chaosBarLabel_eh63o_134{font-family:var(--cc-font-body);font-size:10px;font-weight:700;letter-spacing:1.5px;color:rgba(var(--cc-accent-rgb),.7);white-space:nowrap}._chaosBarTrack_eh63o_143{flex:1;height:6px;border-radius:3px;background:var(--cc-border-subtle);overflow:hidden}._chaosBarFill_eh63o_151{height:100%;border-radius:3px;background:var(--cc-accent);transition:width .3s ease;box-shadow:0 0 calc(4px + 12px * var(--glow, 0)) rgba(var(--cc-accent-rgb),calc(.3 + .5 * var(--glow, 0)))}._difficultySelector_eh63o_160{display:flex;flex-direction:column;gap:4px;flex:1}._difficultyLabel_eh63o_167{font-family:var(--cc-font-display);font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:rgba(var(--cc-text-rgb),.5)}._difficultySlider_eh63o_176{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;background:var(--cc-slider-track);outline:none}._difficultySlider_eh63o_176::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:var(--cc-accent);cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._difficultySlider_eh63o_176::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(--cc-accent);border:none;cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._difficultyValue_eh63o_207{font-family:var(--cc-font-display);font-size:11px;color:var(--cc-accent)}._sidePickerOverlay_eh63o_214{display:flex;align-items:center;justify-content:center;width:100%;min-height:min(560px,90vw)}._sidePickerCard_eh63o_222{display:flex;flex-direction:column;align-items:center;gap:28px;padding:40px 48px;background:var(--cc-surface-glass);border:1px solid rgba(var(--cc-accent-rgb),.2);border-radius:20px;box-shadow:var(--cc-shadow-dialog);animation:_cc-bounceIn_eh63o_1 .5s ease-out}._sidePickerTitle_eh63o_235{font-family:var(--cc-font-display);font-size:22px;font-weight:700;color:var(--cc-text);margin:0}._sidePickerOptions_eh63o_243{display:flex;gap:20px}._sidePickerBtn_eh63o_248{display:flex;flex-direction:column;align-items:center;gap:8px;padding:20px 28px;background:var(--cc-btn-bg);border:1px solid var(--cc-border-light);border-radius:16px;cursor:pointer;transition:all .2s ease}._sidePickerBtn_eh63o_248:hover{background:rgba(var(--cc-accent-rgb),.12);border-color:var(--cc-btn-border-hover);transform:scale(1.06);box-shadow:0 0 20px rgba(var(--cc-accent-rgb),.25)}._sidePickerIcon_eh63o_268{width:56px;height:56px}._sidePickerBtn_eh63o_248{--cc-pb-line: var(--cc-square-light)}._sidePickerLabel_eh63o_278{font-family:var(--cc-font-display);font-size:15px;font-weight:600;color:var(--cc-text)}._sidePickerSettings_eh63o_285{display:flex;gap:24px;width:100%;padding-top:8px;border-top:1px solid var(--cc-border-subtle)}._stupidLevel_eh63o_294{display:flex;flex-direction:column;gap:4px;min-width:100px}._stupidLevelHeader_eh63o_301{display:flex;justify-content:space-between;align-items:center}._stupidLevelLabel_eh63o_307{font-family:var(--cc-font-display);font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:rgba(var(--cc-text-rgb),.5)}._stupidLevelValue_eh63o_316{font-family:var(--cc-font-display);font-size:10px;font-weight:700;color:var(--cc-accent)}._stupidLevelSlider_eh63o_323{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;background:var(--cc-slider-track);outline:none}._stupidLevelSlider_eh63o_323::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--cc-accent);cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._stupidLevelSlider_eh63o_323::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--cc-accent);border:none;cursor:pointer;box-shadow:0 0 8px rgba(var(--cc-accent-rgb),.4)}._muteBtn_eh63o_355{display:flex;align-items:center;justify-content:center;width:32px;height:32px;font-size:16px;background:none;border:1px solid var(--cc-border-light);border-radius:8px;cursor:pointer;color:var(--cc-text);transition:all .15s ease}._muteBtn_eh63o_355:focus-visible{outline:2px solid var(--cc-accent);outline-offset:2px}._muteBtn_eh63o_355:hover{background:rgba(var(--cc-accent-rgb),.1);border-color:rgba(var(--cc-accent-rgb),.25)}._muteBtnMuted_eh63o_380{color:rgba(var(--cc-text-rgb),.3)}._muteBtnMuted_eh63o_380:hover{background:var(--cc-btn-bg);border-color:#ffffff26}._chaosToast_eh63o_390{position:absolute;top:24px;left:50%;transform:translate(-50%);padding:10px 24px;font-family:var(--cc-font-body);font-size:14px;font-weight:600;color:var(--cc-orange);background:var(--cc-surface-glass);border:1px solid rgba(var(--cc-orange-rgb),.3);border-radius:12px;box-shadow:0 4px 24px #0006,0 0 12px rgba(var(--cc-orange-rgb),.15);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:200;white-space:nowrap;animation:_cc-slideIn_eh63o_1 .3s ease-out}._chaosToastFading_eh63o_410{animation:_cc-slideOut_eh63o_1 .4s ease-in forwards}._container_25ulv_1{display:flex;flex-direction:column;align-items:center;gap:12px;width:min(560px,100%);margin:0 auto;font-family:var(--cc-font-body)}._topBar_25ulv_11{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 4px;position:relative;z-index:101}._topBarLeft_25ulv_23,._topBarRight_25ulv_29{display:flex;align-items:center;gap:8px}._newGameBtn_25ulv_35{height:32px;padding:0 12px;font-family:var(--cc-font-display);font-size:13px;color:var(--cc-text);background:none;border:1px solid rgba(var(--cc-text-rgb),.15);border-radius:8px;cursor:pointer;touch-action:manipulation;transition:all .15s ease}._newGameBtn_25ulv_35:hover{background:rgba(var(--cc-accent-rgb),.1);border-color:rgba(var(--cc-accent-rgb),.25)}._newGameBtn_25ulv_35:focus-visible{outline:2px solid var(--cc-accent);outline-offset:2px}._aiUnavailable_25ulv_59{font-family:var(--cc-font-display);font-size:13px;color:var(--cc-orange)}._statusText_25ulv_65{font-family:var(--cc-font-display);font-size:14px;color:var(--cc-text)}._thinking_25ulv_71{display:flex;align-items:center;gap:6px;font-family:var(--cc-font-display);font-size:13px;color:var(--cc-accent);animation:_cc-thinkingPulse_25ulv_1 1.2s ease-in-out infinite}._bottomBar_25ulv_81{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 4px;gap:16px}[data-chaos-chess]{--cc-accent: var(--color-accent-primary, #82FFF4);--cc-accent-rgb: var(--color-accent-primary-rgb, 130, 255, 244);--cc-bg: var(--color-surface-base, #242222);--cc-surface-glass: rgba(36, 34, 34, .92);--cc-surface-glass-heavy: rgba(36, 34, 34, .95);--cc-text: var(--color-text-primary, #F5F5F5);--cc-text-rgb: 245, 245, 245;--cc-orange: var(--color-accent-orange-soft, #FFB67A);--cc-orange-rgb: 255, 182, 122;--cc-red-rgb: 255, 80, 80;--cc-check-rgb: 255, 50, 50;--cc-border-subtle: rgba(255, 255, 255, .08);--cc-border-light: rgba(255, 255, 255, .12);--cc-square-light: #AEB9C7;--cc-square-dark: #6E7E95;--cc-highlight-rgb: var(--cc-accent-rgb);--cc-hint-rgb: 20, 24, 33;--cc-font-body: var(--font-sans, "Inter", sans-serif);--cc-font-display: var(--font-display, "Comfortaa", cursive);--cc-btn-bg: rgba(255, 255, 255, .06);--cc-btn-bg-hover: rgba(var(--cc-accent-rgb), .15);--cc-btn-border-hover: rgba(var(--cc-accent-rgb), .3);--cc-slider-track: rgba(255, 255, 255, .1);--cc-shadow-board: 0 8px 32px rgba(0, 0, 0, .4);--cc-shadow-dialog: 0 8px 40px rgba(0, 0, 0, .5), 0 0 20px rgba(var(--cc-accent-rgb), .1);--cc-shadow-banner: 0 12px 48px rgba(0, 0, 0, .5), 0 0 24px rgba(var(--cc-accent-rgb), .1);--cc-pw-body: #F6F4EF;--cc-pw-line: #141821;--cc-pb-body: #1B202B;--cc-pb-line: #0A0C11;--cc-pb-detail: #E8E4DC;position:relative}html.light-mode [data-chaos-chess]{--cc-bg: var(--color-surface-base, #f5f5f5);--cc-surface-glass: rgba(255, 255, 255, .92);--cc-surface-glass-heavy: rgba(255, 255, 255, .95);--cc-text-rgb: 30, 30, 30;--cc-border-subtle: rgba(0, 0, 0, .08);--cc-border-light: rgba(0, 0, 0, .12);--cc-btn-bg: rgba(0, 0, 0, .05);--cc-slider-track: rgba(0, 0, 0, .1);--cc-shadow-board: 0 8px 32px rgba(0, 0, 0, .15);--cc-shadow-dialog: 0 8px 40px rgba(0, 0, 0, .2), 0 0 20px rgba(var(--cc-accent-rgb), .08);--cc-shadow-banner: 0 12px 48px rgba(0, 0, 0, .2), 0 0 24px rgba(var(--cc-accent-rgb), .08)}@keyframes cc-bounceIn{0%{transform:scale(.3);opacity:0}50%{transform:scale(1.08)}70%{transform:scale(.95)}to{transform:scale(1);opacity:1}}@keyframes cc-glowPulse{0%,to{box-shadow:0 0 8px #82fff44d}50%{box-shadow:0 0 20px #82fff499}}@keyframes cc-chaosFlash{0%{background-color:#ff505080}to{background-color:transparent}}@keyframes cc-pieceAppear{0%{transform:scale(0);opacity:0}60%{transform:scale(1.15)}to{transform:scale(1);opacity:1}}@keyframes cc-pieceDisappear{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}@keyframes cc-thinkingPulse{0%,to{opacity:.4}50%{opacity:1}}@keyframes cc-slideIn{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes cc-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes cc-chaosBarPulse{0%,to{box-shadow:0 0 4px #ff50504d}50%{box-shadow:0 0 16px #ff5050b3}}@keyframes cc-slideOut{0%{transform:translateY(0);opacity:1}to{transform:translateY(-20px);opacity:0}}
|