valtech-components 4.0.456 → 4.0.457
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/esm2022/lib/components/organisms/mini-games/bubble-blitz-game.component.mjs +9 -18
- package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +29 -107
- package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +9 -18
- package/esm2022/lib/components/organisms/mini-games/memory-game.component.mjs +9 -18
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +9 -161
- package/esm2022/lib/components/organisms/mini-games/simon-game.component.mjs +9 -18
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/mini-games/public-api.mjs +2 -34
- package/esm2022/public-api.mjs +1 -3
- package/fesm2022/valtech-components-mini-games.mjs +2 -34
- package/fesm2022/valtech-components-mini-games.mjs.map +1 -1
- package/fesm2022/valtech-components.mjs +71 -2167
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/mini-games/bubble-blitz-game.component.d.ts +0 -2
- package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +1 -3
- package/lib/components/organisms/mini-games/memory-game.component.d.ts +0 -2
- package/lib/components/organisms/mini-games/simon-game.component.d.ts +0 -2
- package/lib/components/organisms/mini-games/types.d.ts +1 -75
- package/lib/version.d.ts +1 -1
- package/mini-games/public-api.d.ts +0 -4
- package/package.json +1 -2
- package/public-api.d.ts +0 -2
- package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -1780
- package/esm2022/lib/directives/light-ripple.directive.mjs +0 -57
- package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -113
- package/lib/directives/light-ripple.directive.d.ts +0 -8
- package/src/lib/assets/games/christianity/card-symbol.svg +0 -51
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, ErrorHandler, Injectable, DestroyRef, Inject, signal, computed, PLATFORM_ID, isDevMode, Optional, runInInjectionContext, effect, Pipe, TemplateRef, ViewContainerRef, input, Directive,
|
|
2
|
+
import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, ErrorHandler, Injectable, DestroyRef, Inject, signal, computed, PLATFORM_ID, isDevMode, Optional, runInInjectionContext, effect, Pipe, TemplateRef, ViewContainerRef, input, Directive, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, HostBinding, HostListener, SecurityContext, NgZone, ViewChild, ElementRef, ChangeDetectorRef, output, ContentChild, model, ViewEncapsulation, untracked, viewChild, Injector, isSignal } from '@angular/core';
|
|
3
3
|
import { BehaviorSubject, throwError, Subject, map, distinctUntilChanged, filter as filter$1, take as take$1, firstValueFrom, of, from, EMPTY, Observable, interval, defer, timer, merge, concat, debounceTime, switchMap as switchMap$1, catchError as catchError$1, takeUntil, isObservable, forkJoin, race, tap as tap$1, Subscription, shareReplay as shareReplay$1 } from 'rxjs';
|
|
4
4
|
import { catchError, switchMap, finalize, filter, take, timeout, map as map$1, tap, shareReplay, distinctUntilChanged as distinctUntilChanged$1, retry, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
|
|
5
5
|
import * as i1$3 from '@angular/common/http';
|
|
@@ -49,7 +49,6 @@ import { Capacitor } from '@capacitor/core';
|
|
|
49
49
|
import { ImageCropperComponent } from 'ngx-image-cropper';
|
|
50
50
|
import Compressor from 'compressorjs';
|
|
51
51
|
import { Calendar } from 'vanilla-calendar-pro';
|
|
52
|
-
import { CdkDrag, CdkDropList } from '@angular/cdk/drag-drop';
|
|
53
52
|
import 'prismjs/components/prism-scss';
|
|
54
53
|
import 'prismjs/components/prism-json';
|
|
55
54
|
import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
@@ -59,7 +58,7 @@ import fixWebmDuration from 'fix-webm-duration';
|
|
|
59
58
|
* Current version of valtech-components.
|
|
60
59
|
* This is automatically updated during the publish process.
|
|
61
60
|
*/
|
|
62
|
-
const VERSION = '4.0.
|
|
61
|
+
const VERSION = '4.0.457';
|
|
63
62
|
|
|
64
63
|
// Control de estado de refresco (singleton a nivel de módulo)
|
|
65
64
|
let isRefreshing = false;
|
|
@@ -10118,61 +10117,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
10118
10117
|
}]
|
|
10119
10118
|
}], ctorParameters: () => [] });
|
|
10120
10119
|
|
|
10121
|
-
class LightRippleDirective {
|
|
10122
|
-
constructor() {
|
|
10123
|
-
this.host = inject(ElementRef);
|
|
10124
|
-
this.renderer = inject(Renderer2);
|
|
10125
|
-
}
|
|
10126
|
-
createRipple(event) {
|
|
10127
|
-
const element = this.host.nativeElement;
|
|
10128
|
-
const rect = element.getBoundingClientRect();
|
|
10129
|
-
const size = Math.max(rect.width, rect.height) * 1.55;
|
|
10130
|
-
const ripple = this.renderer.createElement('span');
|
|
10131
|
-
const x = event.clientX - rect.left - size / 2;
|
|
10132
|
-
const y = event.clientY - rect.top - size / 2;
|
|
10133
|
-
if (getComputedStyle(element).position === 'static') {
|
|
10134
|
-
this.renderer.setStyle(element, 'position', 'relative');
|
|
10135
|
-
}
|
|
10136
|
-
this.renderer.setStyle(element, 'overflow', 'hidden');
|
|
10137
|
-
this.renderer.setStyle(element, 'isolation', 'isolate');
|
|
10138
|
-
this.renderer.setStyle(element, 'touch-action', 'manipulation');
|
|
10139
|
-
this.renderer.setStyle(ripple, 'position', 'absolute');
|
|
10140
|
-
this.renderer.setStyle(ripple, 'left', `${x}px`);
|
|
10141
|
-
this.renderer.setStyle(ripple, 'top', `${y}px`);
|
|
10142
|
-
this.renderer.setStyle(ripple, 'width', `${size}px`);
|
|
10143
|
-
this.renderer.setStyle(ripple, 'height', `${size}px`);
|
|
10144
|
-
this.renderer.setStyle(ripple, 'border-radius', '999px');
|
|
10145
|
-
this.renderer.setStyle(ripple, 'pointer-events', 'none');
|
|
10146
|
-
this.renderer.setStyle(ripple, 'z-index', '1');
|
|
10147
|
-
this.renderer.setStyle(ripple, 'background', 'radial-gradient(circle, rgba(255,255,255,0.98) 0 0.16rem, rgba(191,219,254,0.9) 0.18rem 0.34rem, rgba(96,165,250,0.46) 0.36rem 23%, rgba(96,165,250,0.18) 38%, transparent 70%)');
|
|
10148
|
-
this.renderer.setStyle(ripple, 'box-shadow', '0 0 0.75rem rgba(255,255,255,0.85), 0 0 1.8rem rgba(96,165,250,0.52)');
|
|
10149
|
-
this.renderer.appendChild(element, ripple);
|
|
10150
|
-
ripple
|
|
10151
|
-
.animate([
|
|
10152
|
-
{ opacity: 0.88, transform: 'scale(0.08)' },
|
|
10153
|
-
{ opacity: 0.48, transform: 'scale(0.48)' },
|
|
10154
|
-
{ opacity: 0, transform: 'scale(1)' },
|
|
10155
|
-
], { duration: 680, easing: 'cubic-bezier(0.16, 0.84, 0.24, 1)' })
|
|
10156
|
-
.finished.finally(() => {
|
|
10157
|
-
if (ripple.parentNode === element) {
|
|
10158
|
-
this.renderer.removeChild(element, ripple);
|
|
10159
|
-
}
|
|
10160
|
-
});
|
|
10161
|
-
}
|
|
10162
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LightRippleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
10163
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: LightRippleDirective, isStandalone: true, selector: "[valLightRipple]", host: { listeners: { "pointerdown": "createRipple($event)" } }, ngImport: i0 }); }
|
|
10164
|
-
}
|
|
10165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LightRippleDirective, decorators: [{
|
|
10166
|
-
type: Directive,
|
|
10167
|
-
args: [{
|
|
10168
|
-
selector: '[valLightRipple]',
|
|
10169
|
-
standalone: true,
|
|
10170
|
-
}]
|
|
10171
|
-
}], propDecorators: { createRipple: [{
|
|
10172
|
-
type: HostListener,
|
|
10173
|
-
args: ['pointerdown', ['$event']]
|
|
10174
|
-
}] } });
|
|
10175
|
-
|
|
10176
10120
|
/**
|
|
10177
10121
|
* Presets de botón por defecto provistos por la librería.
|
|
10178
10122
|
*
|
|
@@ -61087,66 +61031,18 @@ const CHESSIMALS_BOT_PROFILES = [
|
|
|
61087
61031
|
labelKey: 'chessimalsBotSentinel',
|
|
61088
61032
|
descriptionKey: 'chessimalsBotSentinelBody',
|
|
61089
61033
|
},
|
|
61090
|
-
{
|
|
61091
|
-
id: 'oracle',
|
|
61092
|
-
difficulty: 'hard',
|
|
61093
|
-
avatar: '🔮',
|
|
61094
|
-
labelKey: 'chessimalsBotOracle',
|
|
61095
|
-
descriptionKey: 'chessimalsBotOracleBody',
|
|
61096
|
-
},
|
|
61097
|
-
{
|
|
61098
|
-
id: 'ambusher',
|
|
61099
|
-
difficulty: 'hard',
|
|
61100
|
-
avatar: '🪤',
|
|
61101
|
-
labelKey: 'chessimalsBotAmbusher',
|
|
61102
|
-
descriptionKey: 'chessimalsBotAmbusherBody',
|
|
61103
|
-
},
|
|
61104
|
-
{
|
|
61105
|
-
id: 'locksmith',
|
|
61106
|
-
difficulty: 'hard',
|
|
61107
|
-
avatar: '🔐',
|
|
61108
|
-
labelKey: 'chessimalsBotLocksmith',
|
|
61109
|
-
descriptionKey: 'chessimalsBotLocksmithBody',
|
|
61110
|
-
},
|
|
61111
|
-
{
|
|
61112
|
-
id: 'storm',
|
|
61113
|
-
difficulty: 'hard',
|
|
61114
|
-
avatar: '🌩️',
|
|
61115
|
-
labelKey: 'chessimalsBotStorm',
|
|
61116
|
-
descriptionKey: 'chessimalsBotStormBody',
|
|
61117
|
-
},
|
|
61118
|
-
{
|
|
61119
|
-
id: 'matriarch',
|
|
61120
|
-
difficulty: 'hard',
|
|
61121
|
-
avatar: '👑',
|
|
61122
|
-
labelKey: 'chessimalsBotMatriarch',
|
|
61123
|
-
descriptionKey: 'chessimalsBotMatriarchBody',
|
|
61124
|
-
},
|
|
61125
|
-
{
|
|
61126
|
-
id: 'endgame',
|
|
61127
|
-
difficulty: 'hard',
|
|
61128
|
-
avatar: '⌛',
|
|
61129
|
-
labelKey: 'chessimalsBotEndgame',
|
|
61130
|
-
descriptionKey: 'chessimalsBotEndgameBody',
|
|
61131
|
-
},
|
|
61132
61034
|
];
|
|
61133
61035
|
const BOT_STYLES = {
|
|
61134
|
-
explorer: { advancement: 1.05, capture: 0.82, safety: 0.62, power: 0.8, center: 1.15, unlock: 1.05, reply: 0.7, randomness: 260, spread: 0.68
|
|
61135
|
-
impulsive: { advancement: 0.9, capture: 1.45, safety: 0.48, power: 1.15, center: 0.8, unlock: 0.9, reply: 0.55, randomness: 290, spread: 0.62
|
|
61136
|
-
runner: { advancement: 1.55, capture: 0.78, safety: 0.5, power: 0.95, center: 0.7, unlock: 1.1, reply: 0.55, randomness: 250, spread: 0.6
|
|
61137
|
-
hunter: { advancement: 0.95, capture: 1.45, safety: 0.9, power: 1.05, center: 0.95, unlock: 0.95, reply: 1, randomness: 90, spread: 0.3
|
|
61138
|
-
guardian: { advancement: 0.88, capture: 1, safety: 1.45, power: 0.85, center: 1.05, unlock: 1, reply: 1.15, randomness: 70, spread: 0.26
|
|
61139
|
-
jumper: { advancement: 1.12, capture: 1, safety: 0.92, power: 1.42, center: 1.18, unlock: 1.08, reply: 0.95, randomness: 95, spread: 0.32
|
|
61140
|
-
strategist: { advancement: 1.05, capture: 1.08, safety: 1.22, power: 1.08, center: 1.16, unlock: 1.1, reply: 1.25, randomness: 22, spread: 0.14
|
|
61141
|
-
predator: { advancement: 0.98, capture: 1.68, safety: 1.02, power: 1.34, center: 1, unlock: 1, reply: 1.12, randomness: 28, spread: 0.16
|
|
61142
|
-
sprinter: { advancement: 1.72, capture: 0.9, safety: 0.95, power: 1.08, center: 0.86, unlock: 1.18, reply: 1, randomness: 26, spread: 0.15
|
|
61143
|
-
sentinel: { advancement: 0.9, capture: 1.12, safety: 1.72, power: 0.95, center: 1.28, unlock: 1.05, reply: 1.38, randomness: 18, spread: 0.12
|
|
61144
|
-
oracle: { advancement: 1, capture: 1.12, safety: 1.42, power: 1.1, center: 1.18, unlock: 1.08, reply: 1.8, randomness: 8, spread: 0.08, mobility: 1.06, trap: 1.22, endgame: 1.08 },
|
|
61145
|
-
ambusher: { advancement: 0.9, capture: 1.48, safety: 1.08, power: 1.46, center: 1.05, unlock: 1.02, reply: 1.32, randomness: 14, spread: 0.1, mobility: 1.12, trap: 1.72, endgame: 0.92 },
|
|
61146
|
-
locksmith: { advancement: 0.88, capture: 1.04, safety: 1.55, power: 1.02, center: 1.48, unlock: 1.12, reply: 1.52, randomness: 12, spread: 0.1, mobility: 1.58, trap: 1.24, endgame: 0.86 },
|
|
61147
|
-
storm: { advancement: 1.18, capture: 1.38, safety: 0.98, power: 1.62, center: 1.08, unlock: 1.18, reply: 1.22, randomness: 18, spread: 0.13, mobility: 1.36, trap: 1.28, endgame: 1.02 },
|
|
61148
|
-
matriarch: { advancement: 0.96, capture: 1.18, safety: 1.64, power: 1.18, center: 1.22, unlock: 1.08, reply: 1.66, randomness: 10, spread: 0.08, mobility: 1.02, trap: 1.36, endgame: 1 },
|
|
61149
|
-
endgame: { advancement: 1.46, capture: 1, safety: 1.28, power: 1.04, center: 0.94, unlock: 1.08, reply: 1.44, randomness: 10, spread: 0.09, mobility: 0.98, trap: 1.02, endgame: 1.86 },
|
|
61036
|
+
explorer: { advancement: 1.05, capture: 0.82, safety: 0.62, power: 0.8, center: 1.15, unlock: 1.05, reply: 0.7, randomness: 260, spread: 0.68 },
|
|
61037
|
+
impulsive: { advancement: 0.9, capture: 1.45, safety: 0.48, power: 1.15, center: 0.8, unlock: 0.9, reply: 0.55, randomness: 290, spread: 0.62 },
|
|
61038
|
+
runner: { advancement: 1.55, capture: 0.78, safety: 0.5, power: 0.95, center: 0.7, unlock: 1.1, reply: 0.55, randomness: 250, spread: 0.6 },
|
|
61039
|
+
hunter: { advancement: 0.95, capture: 1.45, safety: 0.9, power: 1.05, center: 0.95, unlock: 0.95, reply: 1, randomness: 90, spread: 0.3 },
|
|
61040
|
+
guardian: { advancement: 0.88, capture: 1, safety: 1.45, power: 0.85, center: 1.05, unlock: 1, reply: 1.15, randomness: 70, spread: 0.26 },
|
|
61041
|
+
jumper: { advancement: 1.12, capture: 1, safety: 0.92, power: 1.42, center: 1.18, unlock: 1.08, reply: 0.95, randomness: 95, spread: 0.32 },
|
|
61042
|
+
strategist: { advancement: 1.05, capture: 1.08, safety: 1.22, power: 1.08, center: 1.16, unlock: 1.1, reply: 1.25, randomness: 22, spread: 0.14 },
|
|
61043
|
+
predator: { advancement: 0.98, capture: 1.68, safety: 1.02, power: 1.34, center: 1, unlock: 1, reply: 1.12, randomness: 28, spread: 0.16 },
|
|
61044
|
+
sprinter: { advancement: 1.72, capture: 0.9, safety: 0.95, power: 1.08, center: 0.86, unlock: 1.18, reply: 1, randomness: 26, spread: 0.15 },
|
|
61045
|
+
sentinel: { advancement: 0.9, capture: 1.12, safety: 1.72, power: 0.95, center: 1.28, unlock: 1.05, reply: 1.38, randomness: 18, spread: 0.12 },
|
|
61150
61046
|
};
|
|
61151
61047
|
const DEFAULT_BOT_PROFILE_BY_DIFFICULTY = {
|
|
61152
61048
|
easy: 'explorer',
|
|
@@ -61232,17 +61128,8 @@ function chooseChessimalsBotMove(state, difficulty = 'normal', profileId = DEFAU
|
|
|
61232
61128
|
if (moves.length === 0)
|
|
61233
61129
|
return undefined;
|
|
61234
61130
|
const style = BOT_STYLES[profileId] ?? BOT_STYLES[DEFAULT_BOT_PROFILE_BY_DIFFICULTY[difficulty]];
|
|
61235
|
-
const
|
|
61236
|
-
.map((move) => ({ move, score:
|
|
61237
|
-
.sort((a, b) => b.score - a.score);
|
|
61238
|
-
const lookaheadLimit = difficulty === 'hard' ? 32 : difficulty === 'normal' ? 24 : 0;
|
|
61239
|
-
const scored = quickScored
|
|
61240
|
-
.map((item, index) => ({
|
|
61241
|
-
move: item.move,
|
|
61242
|
-
score: index < lookaheadLimit
|
|
61243
|
-
? scoreBotMoveWithLookahead(state, item.move, difficulty, style)
|
|
61244
|
-
: item.score,
|
|
61245
|
-
}))
|
|
61131
|
+
const scored = moves
|
|
61132
|
+
.map((move) => ({ move, score: scoreBotMoveWithLookahead(state, move, difficulty, style) }))
|
|
61246
61133
|
.sort((a, b) => b.score - a.score);
|
|
61247
61134
|
if (difficulty === 'easy') {
|
|
61248
61135
|
const playable = scored.filter((item) => item.score > -3000);
|
|
@@ -61260,6 +61147,9 @@ function chooseChessimalsBotMove(state, difficulty = 'normal', profileId = DEFAU
|
|
|
61260
61147
|
if (blockingMove)
|
|
61261
61148
|
return blockingMove.move;
|
|
61262
61149
|
}
|
|
61150
|
+
const conservativeCapture = chooseConservativeHardCapture(state, scored);
|
|
61151
|
+
if (conservativeCapture)
|
|
61152
|
+
return conservativeCapture;
|
|
61263
61153
|
return scored[0]?.move;
|
|
61264
61154
|
}
|
|
61265
61155
|
function applyChessimalsMove(state, candidate) {
|
|
@@ -61440,7 +61330,7 @@ function getPowerMoves(state, piece, animal) {
|
|
|
61440
61330
|
const directions = getPowerDirections(animal);
|
|
61441
61331
|
const moves = [];
|
|
61442
61332
|
for (const direction of directions) {
|
|
61443
|
-
for (let distance = 1; distance
|
|
61333
|
+
for (let distance = 1; distance <= 3; distance += 1) {
|
|
61444
61334
|
const target = {
|
|
61445
61335
|
row: piece.position.row + direction.row * distance,
|
|
61446
61336
|
col: piece.position.col + direction.col * distance,
|
|
@@ -61501,7 +61391,7 @@ function getKangarooMoves(state, piece) {
|
|
|
61501
61391
|
}
|
|
61502
61392
|
return moves;
|
|
61503
61393
|
}
|
|
61504
|
-
function scoreBotMove(state, move, difficulty, style
|
|
61394
|
+
function scoreBotMove(state, move, difficulty, style) {
|
|
61505
61395
|
const color = state.currentTurn;
|
|
61506
61396
|
const targetPiece = move.capturesPieceId
|
|
61507
61397
|
? activePieces(state).find((piece) => piece.id === move.capturesPieceId)
|
|
@@ -61527,14 +61417,6 @@ function scoreBotMove(state, move, difficulty, style, includeTacticalPressure =
|
|
|
61527
61417
|
score += 14 * style.power;
|
|
61528
61418
|
if (wouldUnlockPower(state, color, move.to))
|
|
61529
61419
|
score += 90 * style.unlock;
|
|
61530
|
-
if (includeTacticalPressure && state.boardSize <= 6) {
|
|
61531
|
-
score += countPowerReachAfterMove(state, move, color) * (difficulty === 'hard' ? 8 : 4) * style.mobility;
|
|
61532
|
-
score += countProtectedThreatsAfterMove(state, move, color) * (difficulty === 'hard' ? 36 : 18) * style.trap;
|
|
61533
|
-
score += scoreEndgamePressure(state, move, color) * style.endgame;
|
|
61534
|
-
}
|
|
61535
|
-
else {
|
|
61536
|
-
score += scoreEndgamePressure(state, move, color) * style.endgame;
|
|
61537
|
-
}
|
|
61538
61420
|
if (difficulty === 'hard' && isSquareVulnerableAfterMove(state, move)) {
|
|
61539
61421
|
score -= (targetPiece ? 80 : 140) * style.safety;
|
|
61540
61422
|
}
|
|
@@ -61565,7 +61447,7 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
|
|
|
61565
61447
|
score += centerControl * (difficulty === 'hard' ? 18 : 10) * style.center;
|
|
61566
61448
|
}
|
|
61567
61449
|
const opponentBestReply = opponentMoves
|
|
61568
|
-
.map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style
|
|
61450
|
+
.map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style))
|
|
61569
61451
|
.sort((a, b) => b - a)[0];
|
|
61570
61452
|
if (opponentBestReply) {
|
|
61571
61453
|
const replyWeight = difficulty === 'easy' ? 0.12 : difficulty === 'normal' ? 0.32 : 0.48;
|
|
@@ -61577,33 +61459,17 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
|
|
|
61577
61459
|
}
|
|
61578
61460
|
return score;
|
|
61579
61461
|
}
|
|
61580
|
-
function
|
|
61581
|
-
|
|
61582
|
-
|
|
61583
|
-
|
|
61584
|
-
|
|
61585
|
-
|
|
61586
|
-
catch {
|
|
61587
|
-
return 0;
|
|
61588
|
-
}
|
|
61589
|
-
}
|
|
61590
|
-
function countProtectedThreatsAfterMove(state, move, color) {
|
|
61591
|
-
try {
|
|
61592
|
-
const afterMove = applyChessimalsMove(state, move);
|
|
61593
|
-
const evaluationState = { ...afterMove, currentTurn: color };
|
|
61594
|
-
const ourMoves = getChessimalsAllLegalMoves(evaluationState, color);
|
|
61595
|
-
const enemyPieces = activePieces(afterMove).filter((piece) => piece.color !== color && !piece.captured);
|
|
61596
|
-
return enemyPieces.filter((piece) => ourMoves.some((nextMove) => nextMove.capturesPieceId === piece.id)).length;
|
|
61597
|
-
}
|
|
61598
|
-
catch {
|
|
61599
|
-
return 0;
|
|
61462
|
+
function chooseConservativeHardCapture(state, scored) {
|
|
61463
|
+
if (state.boardSize !== 8)
|
|
61464
|
+
return undefined;
|
|
61465
|
+
const best = scored[0];
|
|
61466
|
+
if (!best || best.move.kind !== 'power' || !best.move.capturesPieceId || best.score >= 10000) {
|
|
61467
|
+
return undefined;
|
|
61600
61468
|
}
|
|
61601
|
-
|
|
61602
|
-
|
|
61603
|
-
|
|
61604
|
-
|
|
61605
|
-
const distanceToPromotion = color === 'white' ? move.to.row : state.boardSize - 1 - move.to.row;
|
|
61606
|
-
return Math.max(0, state.boardSize - distanceToPromotion) * 14 * urgency;
|
|
61469
|
+
const bestBasicCapture = scored.find((item) => item.move.kind === 'basic' && item.move.capturesPieceId);
|
|
61470
|
+
if (!bestBasicCapture)
|
|
61471
|
+
return undefined;
|
|
61472
|
+
return best.score - bestBasicCapture.score <= 650 ? bestBasicCapture.move : undefined;
|
|
61607
61473
|
}
|
|
61608
61474
|
function pickNoisyBotMove(scored, spread) {
|
|
61609
61475
|
if (scored.length === 0)
|
|
@@ -62694,64 +62560,6 @@ const MINI_GAMES_I18N = {
|
|
|
62694
62560
|
bubbleDescription: 'Revienta grupos de burbujas, encadena combos y sube tu puntaje.',
|
|
62695
62561
|
chessimalsTitle: 'Chessimals',
|
|
62696
62562
|
chessimalsDescription: 'Una carrera de peones con cartas de animales y poderes tácticos.',
|
|
62697
|
-
christianityTitle: 'Christianity',
|
|
62698
|
-
christianityDescription: 'Un juego de cartas familiar con líderes, ofrendas y decisiones tácticas.',
|
|
62699
|
-
christianityEyebrow: 'MVP de mesa',
|
|
62700
|
-
christianityTable: 'Mesa de Christianity',
|
|
62701
|
-
christianityTurn: 'Turno',
|
|
62702
|
-
christianityOfferings: 'Ofrendas',
|
|
62703
|
-
christianityHand: 'Mano',
|
|
62704
|
-
christianityOpponentBattle: 'Zona de batalla rival',
|
|
62705
|
-
christianityYourBattle: 'Tu zona de batalla',
|
|
62706
|
-
christianityOpponentHand: 'Mano rival',
|
|
62707
|
-
christianitySharedZone: 'Zona compartida',
|
|
62708
|
-
christianityMatch: 'Match',
|
|
62709
|
-
christianityMatchScore: 'Marcador de match',
|
|
62710
|
-
christianityHistory: 'Historia',
|
|
62711
|
-
christianityDeck: 'Mazo',
|
|
62712
|
-
christianityPlace: 'Lugar',
|
|
62713
|
-
christianityEmpty: 'Vacío',
|
|
62714
|
-
christianityYourHand: 'Tu mano',
|
|
62715
|
-
christianityCost: 'Coste',
|
|
62716
|
-
christianityOfferingCard: 'Ofrenda',
|
|
62717
|
-
christianityCharacterCard: 'Personaje',
|
|
62718
|
-
christianityLeaderCard: 'Líder',
|
|
62719
|
-
christianityHiddenCard: 'Carta oculta',
|
|
62720
|
-
christianityPreviewCard: 'Ver carta',
|
|
62721
|
-
christianityEndTurn: 'Terminar turno',
|
|
62722
|
-
christianityPlayCard: 'Jugar carta',
|
|
62723
|
-
christianityPlayOffering: 'Jugar ofrenda',
|
|
62724
|
-
christianityPlayHere: 'Jugar aquí',
|
|
62725
|
-
christianityReset: 'Reiniciar mock',
|
|
62726
|
-
christianityWaitTurn: 'Espera el turno rival.',
|
|
62727
|
-
christianityChooseTarget: 'Elige un objetivo para atacar.',
|
|
62728
|
-
christianityChooseCharacterTarget: 'El rival tiene personajes: debes atacarlos antes que al líder.',
|
|
62729
|
-
christianityReadyToPlay: 'Puedes jugar esta carta.',
|
|
62730
|
-
christianityChooseSlot: 'Elige una casilla disponible para jugar esta carta.',
|
|
62731
|
-
christianityPlaceOffering: 'Puedes jugar esta ofrenda con el botón de acción.',
|
|
62732
|
-
christianityNeedOfferings: 'Necesitas más ofrendas para jugar esa carta.',
|
|
62733
|
-
christianityChooseCard: 'Elige una carta o un personaje listo para actuar.',
|
|
62734
|
-
christianityLeaderProtected: 'No puedes atacar directamente al líder mientras tenga personajes en batalla.',
|
|
62735
|
-
christianityLeaderBody: 'Si su vida llega a 0, la partida termina.',
|
|
62736
|
-
christianityOfferingReady: 'Lista',
|
|
62737
|
-
christianityOfferingExhausted: 'Agotada',
|
|
62738
|
-
christianityOfferingBody: 'Se agota para pagar costes y vuelve a estar lista al comenzar tu turno.',
|
|
62739
|
-
christianityOfferingNoAbility: 'Esta ofrenda no tiene habilidad activable.',
|
|
62740
|
-
christianityOfferingsRuleBody: 'Las ofrendas son cartas que entran desde la mano a esta pila. Puedes jugar solo una por turno. Las ofrendas listas pagan costes y vuelven a prepararse al comenzar tu turno.',
|
|
62741
|
-
christianityUseAbility: 'Usar',
|
|
62742
|
-
christianityCloseOfferings: 'Cerrar ofrendas',
|
|
62743
|
-
christianityCharacterBody: 'Entra a batalla y debe esperar un turno para atacar.',
|
|
62744
|
-
christianityCharacterReady: 'Listo para atacar.',
|
|
62745
|
-
christianityCharacterExhausted: 'No puede atacar todavía.',
|
|
62746
|
-
christianityCardRemaining: 'carta restante',
|
|
62747
|
-
christianityCardsRemaining: 'cartas restantes',
|
|
62748
|
-
christianityDeckBody: 'El mazo es una pila compartida. Ambos jugadores roban desde aquí, por eso importa adaptarse a lo que aparece y cuidar el ritmo de la partida.',
|
|
62749
|
-
christianityDeckRuleShared: 'Todas las cartas jugables viven en este mazo compartido, incluyendo personajes y ofrendas.',
|
|
62750
|
-
christianityDeckRuleDraw: 'Al comenzar cada turno, el jugador activo roba la primera carta disponible.',
|
|
62751
|
-
christianityDeckRuleEmpty: 'Si el mazo se queda sin cartas, se revisa la condición de victoria por vida al final del turno.',
|
|
62752
|
-
christianityClosePreview: 'Cerrar previsualizacion de carta',
|
|
62753
|
-
christianityCloseHistory: 'Cerrar historia',
|
|
62754
|
-
christianityHistoryEmpty: 'Todavía no hay cartas en historia.',
|
|
62755
62563
|
soonTitle: 'Próximamente',
|
|
62756
62564
|
openGame: 'Jugar',
|
|
62757
62565
|
close: 'Cerrar',
|
|
@@ -62876,10 +62684,10 @@ const MINI_GAMES_I18N = {
|
|
|
62876
62684
|
chessimalsRulePowersTitle: 'Cuándo se activan los poderes',
|
|
62877
62685
|
chessimalsRulePowersBody: 'Tus cartas se desbloquean cuando uno de tus peones cruza la línea central o cuando un peón rival entra en tu mitad del tablero.',
|
|
62878
62686
|
chessimalsRuleCardsTitle: 'Cartas de animales',
|
|
62879
|
-
chessimalsRuleEagle: 'Águila: se mueve
|
|
62880
|
-
chessimalsRuleBull: 'Toro: se mueve en línea recta
|
|
62687
|
+
chessimalsRuleEagle: 'Águila: se mueve hasta 3 casillas en diagonal, hacia adelante o atrás.',
|
|
62688
|
+
chessimalsRuleBull: 'Toro: se mueve hasta 3 casillas en línea recta, incluso hacia los lados.',
|
|
62881
62689
|
chessimalsRuleKangaroo: 'Canguro: salta en L, como el caballo del ajedrez. Puede saltar por encima de piezas y caer libre o capturar una pieza rival.',
|
|
62882
|
-
chessimalsRuleLion: 'León: se mueve en cualquier dirección
|
|
62690
|
+
chessimalsRuleLion: 'León: se mueve hasta 3 casillas en cualquier dirección.',
|
|
62883
62691
|
chessimalsRuleLimitsTitle: 'Reglas de equilibrio',
|
|
62884
62692
|
chessimalsRuleLimitsBody: 'Cada carta se usa una sola vez por partida. Ningún poder puede entrar directamente a la última fila: el paso final para ganar siempre debe ser un avance normal.',
|
|
62885
62693
|
chessimalsBoardSize: 'Tamaño del tablero',
|
|
@@ -62992,18 +62800,6 @@ const MINI_GAMES_I18N = {
|
|
|
62992
62800
|
chessimalsBotSprinterBody: 'Optimiza rutas de promoción.',
|
|
62993
62801
|
chessimalsBotSentinel: 'Centinela',
|
|
62994
62802
|
chessimalsBotSentinelBody: 'Defiende sólido y castiga errores.',
|
|
62995
|
-
chessimalsBotOracle: 'Oráculo',
|
|
62996
|
-
chessimalsBotOracleBody: 'Lee respuestas y evita trampas profundas.',
|
|
62997
|
-
chessimalsBotAmbusher: 'Emboscador',
|
|
62998
|
-
chessimalsBotAmbusherBody: 'Prepara capturas dobles con poderes largos.',
|
|
62999
|
-
chessimalsBotLocksmith: 'Cerrajero',
|
|
63000
|
-
chessimalsBotLocksmithBody: 'Cierra el centro y reduce tus rutas.',
|
|
63001
|
-
chessimalsBotStorm: 'Tormenta',
|
|
63002
|
-
chessimalsBotStormBody: 'Usa poderes largos para presionar todo el tablero.',
|
|
63003
|
-
chessimalsBotMatriarch: 'Matriarca',
|
|
63004
|
-
chessimalsBotMatriarchBody: 'Protege su estructura y gana por desgaste.',
|
|
63005
|
-
chessimalsBotEndgame: 'Finalista',
|
|
63006
|
-
chessimalsBotEndgameBody: 'Convierte ventajas pequeñas en promoción.',
|
|
63007
62803
|
chessimalsBotExplorerTendency: 'Tiende a variar rutas, probar el centro y cometer errores suaves.',
|
|
63008
62804
|
chessimalsBotImpulsiveTendency: 'Tiende a capturar rápido, incluso cuando puede quedar expuesto.',
|
|
63009
62805
|
chessimalsBotRunnerTendency: 'Tiende a avanzar hacia la promoción antes que defender.',
|
|
@@ -63014,12 +62810,6 @@ const MINI_GAMES_I18N = {
|
|
|
63014
62810
|
chessimalsBotPredatorTendency: 'Tiende a forzar capturas y usar poderes agresivos.',
|
|
63015
62811
|
chessimalsBotSprinterTendency: 'Tiende a encontrar caminos rápidos de promoción.',
|
|
63016
62812
|
chessimalsBotSentinelTendency: 'Tiende a defender sólido y castigar errores.',
|
|
63017
|
-
chessimalsBotOracleTendency: 'Tiende a anticipar respuestas y elegir jugadas difíciles de refutar.',
|
|
63018
|
-
chessimalsBotAmbusherTendency: 'Tiende a dejar piezas bajo amenaza múltiple antes de capturar.',
|
|
63019
|
-
chessimalsBotLocksmithTendency: 'Tiende a cortar rutas por el centro y dejarte sin buenas casillas.',
|
|
63020
|
-
chessimalsBotStormTendency: 'Tiende a convertir poderes largos en presión desde varios ángulos.',
|
|
63021
|
-
chessimalsBotMatriarchTendency: 'Tiende a conservar piezas y cambiar solo cuando queda mejor.',
|
|
63022
|
-
chessimalsBotEndgameTendency: 'Tiende a simplificar y correr hacia la promoción cuando ve ventaja.',
|
|
63023
62813
|
chessimalsBotReportTitle: 'Reporte del bot',
|
|
63024
62814
|
chessimalsBotReportVs: 'Contra {bot}',
|
|
63025
62815
|
chessimalsBotReportBody: '{outcome}. Hizo {captures} capturas y usó {powers} poderes. {style}',
|
|
@@ -63114,7 +62904,7 @@ const MINI_GAMES_I18N = {
|
|
|
63114
62904
|
chessimalsTutorialStep4Title: 'Devuelve el turno',
|
|
63115
62905
|
chessimalsTutorialStep4Body: 'Mueve el peón negro de la columna F una casilla hacia abajo para continuar.',
|
|
63116
62906
|
chessimalsTutorialStep5Title: 'Usa el poder Canguro',
|
|
63117
|
-
chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro.
|
|
62907
|
+
chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro.',
|
|
63118
62908
|
chessimalsTutorialStep6Title: 'Prepara la llegada',
|
|
63119
62909
|
chessimalsTutorialStep6Body: 'Mueve el último peón negro hacia abajo. Después tendrás camino para ganar.',
|
|
63120
62910
|
chessimalsTutorialStep7Title: 'Llega a la última fila',
|
|
@@ -63178,64 +62968,6 @@ const MINI_GAMES_I18N = {
|
|
|
63178
62968
|
bubbleDescription: 'Pop bubble groups, chain combos, and push your score higher.',
|
|
63179
62969
|
chessimalsTitle: 'Chessimals',
|
|
63180
62970
|
chessimalsDescription: 'A pawn race with animal cards and tactical powers.',
|
|
63181
|
-
christianityTitle: 'Christianity',
|
|
63182
|
-
christianityDescription: 'A family card game with leaders, offerings, and tactical choices.',
|
|
63183
|
-
christianityEyebrow: 'Table MVP',
|
|
63184
|
-
christianityTable: 'Christianity table',
|
|
63185
|
-
christianityTurn: 'Turn',
|
|
63186
|
-
christianityOfferings: 'Offerings',
|
|
63187
|
-
christianityHand: 'Hand',
|
|
63188
|
-
christianityOpponentBattle: 'Opponent battle zone',
|
|
63189
|
-
christianityYourBattle: 'Your battle zone',
|
|
63190
|
-
christianityOpponentHand: 'Opponent hand',
|
|
63191
|
-
christianitySharedZone: 'Shared zone',
|
|
63192
|
-
christianityMatch: 'Match',
|
|
63193
|
-
christianityMatchScore: 'Match score',
|
|
63194
|
-
christianityHistory: 'History',
|
|
63195
|
-
christianityDeck: 'Deck',
|
|
63196
|
-
christianityPlace: 'Place',
|
|
63197
|
-
christianityEmpty: 'Empty',
|
|
63198
|
-
christianityYourHand: 'Your hand',
|
|
63199
|
-
christianityCost: 'Cost',
|
|
63200
|
-
christianityOfferingCard: 'Offering',
|
|
63201
|
-
christianityCharacterCard: 'Character',
|
|
63202
|
-
christianityLeaderCard: 'Leader',
|
|
63203
|
-
christianityHiddenCard: 'Hidden card',
|
|
63204
|
-
christianityPreviewCard: 'Preview card',
|
|
63205
|
-
christianityEndTurn: 'End turn',
|
|
63206
|
-
christianityPlayCard: 'Play card',
|
|
63207
|
-
christianityPlayOffering: 'Play offering',
|
|
63208
|
-
christianityPlayHere: 'Play here',
|
|
63209
|
-
christianityReset: 'Reset mock',
|
|
63210
|
-
christianityWaitTurn: 'Wait for the opponent turn.',
|
|
63211
|
-
christianityChooseTarget: 'Choose a target to attack.',
|
|
63212
|
-
christianityChooseCharacterTarget: 'The opponent has characters: attack them before the leader.',
|
|
63213
|
-
christianityReadyToPlay: 'You can play this card.',
|
|
63214
|
-
christianityChooseSlot: 'Choose an available slot to play this card.',
|
|
63215
|
-
christianityPlaceOffering: 'You can play this offering with the action button.',
|
|
63216
|
-
christianityNeedOfferings: 'You need more offerings to play that card.',
|
|
63217
|
-
christianityChooseCard: 'Choose a card or a ready character.',
|
|
63218
|
-
christianityLeaderProtected: 'You cannot attack the leader directly while they have characters in battle.',
|
|
63219
|
-
christianityLeaderBody: 'If this leader reaches 0 life, the game ends.',
|
|
63220
|
-
christianityOfferingReady: 'Ready',
|
|
63221
|
-
christianityOfferingExhausted: 'Exhausted',
|
|
63222
|
-
christianityOfferingBody: 'Exhaust it to pay costs. It readies again at the start of your turn.',
|
|
63223
|
-
christianityOfferingNoAbility: 'This offering has no active ability.',
|
|
63224
|
-
christianityOfferingsRuleBody: 'Offerings are cards played from your hand into this pile. You can play only one per turn. Ready offerings pay costs and ready again at the start of your turn.',
|
|
63225
|
-
christianityUseAbility: 'Use',
|
|
63226
|
-
christianityCloseOfferings: 'Close offerings',
|
|
63227
|
-
christianityCharacterBody: 'Enters battle and must wait one turn before attacking.',
|
|
63228
|
-
christianityCharacterReady: 'Ready to attack.',
|
|
63229
|
-
christianityCharacterExhausted: 'Cannot attack yet.',
|
|
63230
|
-
christianityCardRemaining: 'card remaining',
|
|
63231
|
-
christianityCardsRemaining: 'cards remaining',
|
|
63232
|
-
christianityDeckBody: 'The deck is a shared pile. Both players draw from it, so the match rewards adapting to what appears and managing the pace.',
|
|
63233
|
-
christianityDeckRuleShared: 'All playable cards live in this shared deck, including characters and offerings.',
|
|
63234
|
-
christianityDeckRuleDraw: 'At the start of each turn, the active player draws the first available card.',
|
|
63235
|
-
christianityDeckRuleEmpty: 'If the deck runs out, the leader life victory condition is checked at the end of the turn.',
|
|
63236
|
-
christianityClosePreview: 'Close card preview',
|
|
63237
|
-
christianityCloseHistory: 'Close history',
|
|
63238
|
-
christianityHistoryEmpty: 'There are no cards in history yet.',
|
|
63239
62971
|
soonTitle: 'Coming soon',
|
|
63240
62972
|
openGame: 'Play',
|
|
63241
62973
|
close: 'Close',
|
|
@@ -63360,10 +63092,10 @@ const MINI_GAMES_I18N = {
|
|
|
63360
63092
|
chessimalsRulePowersTitle: 'When powers unlock',
|
|
63361
63093
|
chessimalsRulePowersBody: 'Your cards unlock when one of your pawns crosses the center line, or when a rival pawn enters your half of the board.',
|
|
63362
63094
|
chessimalsRuleCardsTitle: 'Animal cards',
|
|
63363
|
-
chessimalsRuleEagle: 'Eagle: moves
|
|
63364
|
-
chessimalsRuleBull: 'Bull: moves in a straight line
|
|
63095
|
+
chessimalsRuleEagle: 'Eagle: moves up to 3 squares diagonally, forward or backward.',
|
|
63096
|
+
chessimalsRuleBull: 'Bull: moves up to 3 squares in a straight line, including sideways.',
|
|
63365
63097
|
chessimalsRuleKangaroo: 'Kangaroo: jumps in an L shape, like a chess knight. It can jump over pieces and land on an empty square or capture a rival piece.',
|
|
63366
|
-
chessimalsRuleLion: 'Lion: moves
|
|
63098
|
+
chessimalsRuleLion: 'Lion: moves up to 3 squares in any direction.',
|
|
63367
63099
|
chessimalsRuleLimitsTitle: 'Balance rules',
|
|
63368
63100
|
chessimalsRuleLimitsBody: 'Each card can be used once per game. No power can land directly on the final row: the winning step must always be a normal forward move.',
|
|
63369
63101
|
chessimalsBoardSize: 'Board size',
|
|
@@ -63476,18 +63208,6 @@ const MINI_GAMES_I18N = {
|
|
|
63476
63208
|
chessimalsBotSprinterBody: 'Optimizes promotion routes.',
|
|
63477
63209
|
chessimalsBotSentinel: 'Sentinel',
|
|
63478
63210
|
chessimalsBotSentinelBody: 'Defends solidly and punishes mistakes.',
|
|
63479
|
-
chessimalsBotOracle: 'Oracle',
|
|
63480
|
-
chessimalsBotOracleBody: 'Reads replies and avoids deep traps.',
|
|
63481
|
-
chessimalsBotAmbusher: 'Ambusher',
|
|
63482
|
-
chessimalsBotAmbusherBody: 'Sets up double captures with long powers.',
|
|
63483
|
-
chessimalsBotLocksmith: 'Locksmith',
|
|
63484
|
-
chessimalsBotLocksmithBody: 'Closes the center and reduces your routes.',
|
|
63485
|
-
chessimalsBotStorm: 'Storm',
|
|
63486
|
-
chessimalsBotStormBody: 'Uses long powers to pressure the whole board.',
|
|
63487
|
-
chessimalsBotMatriarch: 'Matriarch',
|
|
63488
|
-
chessimalsBotMatriarchBody: 'Protects structure and wins by attrition.',
|
|
63489
|
-
chessimalsBotEndgame: 'Endgame',
|
|
63490
|
-
chessimalsBotEndgameBody: 'Turns small edges into promotion.',
|
|
63491
63211
|
chessimalsBotExplorerTendency: 'Tends to vary routes, test the center, and make soft mistakes.',
|
|
63492
63212
|
chessimalsBotImpulsiveTendency: 'Tends to capture quickly, even when it can become exposed.',
|
|
63493
63213
|
chessimalsBotRunnerTendency: 'Tends to push toward promotion before defending.',
|
|
@@ -63498,12 +63218,6 @@ const MINI_GAMES_I18N = {
|
|
|
63498
63218
|
chessimalsBotPredatorTendency: 'Tends to force captures and use aggressive powers.',
|
|
63499
63219
|
chessimalsBotSprinterTendency: 'Tends to find fast promotion paths.',
|
|
63500
63220
|
chessimalsBotSentinelTendency: 'Tends to defend solidly and punish mistakes.',
|
|
63501
|
-
chessimalsBotOracleTendency: 'Tends to anticipate replies and choose hard-to-refute moves.',
|
|
63502
|
-
chessimalsBotAmbusherTendency: 'Tends to leave pieces under multiple threats before capturing.',
|
|
63503
|
-
chessimalsBotLocksmithTendency: 'Tends to close central routes and leave you without good squares.',
|
|
63504
|
-
chessimalsBotStormTendency: 'Tends to turn long powers into pressure from several angles.',
|
|
63505
|
-
chessimalsBotMatriarchTendency: 'Tends to preserve pieces and trade only when it improves.',
|
|
63506
|
-
chessimalsBotEndgameTendency: 'Tends to simplify and race toward promotion when ahead.',
|
|
63507
63221
|
chessimalsBotReportTitle: 'Bot report',
|
|
63508
63222
|
chessimalsBotReportVs: 'Against {bot}',
|
|
63509
63223
|
chessimalsBotReportBody: '{outcome}. It made {captures} captures and used {powers} powers. {style}',
|
|
@@ -63598,7 +63312,7 @@ const MINI_GAMES_I18N = {
|
|
|
63598
63312
|
chessimalsTutorialStep4Title: 'Return the turn',
|
|
63599
63313
|
chessimalsTutorialStep4Body: 'Move the black pawn on file F one square downward to continue.',
|
|
63600
63314
|
chessimalsTutorialStep5Title: 'Use the Kangaroo power',
|
|
63601
|
-
chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn.
|
|
63315
|
+
chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn.',
|
|
63602
63316
|
chessimalsTutorialStep6Title: 'Prepare the finish',
|
|
63603
63317
|
chessimalsTutorialStep6Body: 'Move the last black pawn downward. Then your path to win is open.',
|
|
63604
63318
|
chessimalsTutorialStep7Title: 'Reach the last row',
|
|
@@ -64781,7 +64495,6 @@ class ChessimalsGameComponent {
|
|
|
64781
64495
|
});
|
|
64782
64496
|
this.botThinking = signal(false);
|
|
64783
64497
|
this.confirmAction = signal(undefined);
|
|
64784
|
-
this.confirmedAction = signal(undefined);
|
|
64785
64498
|
this.onlineJoinCode = signal('');
|
|
64786
64499
|
this.onlineLoading = signal(false);
|
|
64787
64500
|
this.onlineAction = signal(undefined);
|
|
@@ -65760,12 +65473,13 @@ class ChessimalsGameComponent {
|
|
|
65760
65473
|
closeConfirmModal() {
|
|
65761
65474
|
this.confirmAction.set(undefined);
|
|
65762
65475
|
}
|
|
65763
|
-
|
|
65764
|
-
|
|
65765
|
-
|
|
65766
|
-
this.confirmedAction.set(undefined);
|
|
65767
|
-
if (!action)
|
|
65476
|
+
confirmPendingAction(token) {
|
|
65477
|
+
if (token !== 'confirm') {
|
|
65478
|
+
this.closeConfirmModal();
|
|
65768
65479
|
return;
|
|
65480
|
+
}
|
|
65481
|
+
const action = this.confirmAction();
|
|
65482
|
+
this.confirmAction.set(undefined);
|
|
65769
65483
|
if (action === 'restart') {
|
|
65770
65484
|
this.restartGame();
|
|
65771
65485
|
return;
|
|
@@ -65787,15 +65501,6 @@ class ChessimalsGameComponent {
|
|
|
65787
65501
|
this.createNewChallengeRun();
|
|
65788
65502
|
}
|
|
65789
65503
|
}
|
|
65790
|
-
confirmPendingAction(token) {
|
|
65791
|
-
if (token !== 'confirm') {
|
|
65792
|
-
this.closeConfirmModal();
|
|
65793
|
-
return;
|
|
65794
|
-
}
|
|
65795
|
-
const action = this.confirmAction();
|
|
65796
|
-
this.confirmedAction.set(action);
|
|
65797
|
-
this.confirmAction.set(undefined);
|
|
65798
|
-
}
|
|
65799
65504
|
resignGame() {
|
|
65800
65505
|
const game = this.game();
|
|
65801
65506
|
if (game.status === 'finished')
|
|
@@ -67887,7 +67592,7 @@ class ChessimalsGameComponent {
|
|
|
67887
67592
|
<ion-modal
|
|
67888
67593
|
[isOpen]="!!confirmAction()"
|
|
67889
67594
|
cssClass="val-modal-adaptive"
|
|
67890
|
-
(didDismiss)="
|
|
67595
|
+
(didDismiss)="closeConfirmModal()"
|
|
67891
67596
|
>
|
|
67892
67597
|
<ng-template>
|
|
67893
67598
|
<val-modal-layout
|
|
@@ -68848,7 +68553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
68848
68553
|
<ion-modal
|
|
68849
68554
|
[isOpen]="!!confirmAction()"
|
|
68850
68555
|
cssClass="val-modal-adaptive"
|
|
68851
|
-
(didDismiss)="
|
|
68556
|
+
(didDismiss)="closeConfirmModal()"
|
|
68852
68557
|
>
|
|
68853
68558
|
<ng-template>
|
|
68854
68559
|
<val-modal-layout
|
|
@@ -68874,1780 +68579,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
68874
68579
|
type: Input
|
|
68875
68580
|
}] } });
|
|
68876
68581
|
|
|
68877
|
-
const STARTER_CARDS = {
|
|
68878
|
-
o_simple: {
|
|
68879
|
-
id: 'o_simple',
|
|
68880
|
-
name: 'Ofrenda simple',
|
|
68881
|
-
type: 'offering',
|
|
68882
|
-
cost: 0,
|
|
68883
|
-
attack: 0,
|
|
68884
|
-
life: 1,
|
|
68885
|
-
verseText: 'Una ofrenda sencilla queda lista para sostener tus siguientes jugadas.',
|
|
68886
|
-
scripture: 'Genesis 4:4',
|
|
68887
|
-
edition: 'GEN',
|
|
68888
|
-
collectorNumber: '001/020',
|
|
68889
|
-
year: '2026',
|
|
68890
|
-
author: 'MVP',
|
|
68891
|
-
rarity: 'normal',
|
|
68892
|
-
},
|
|
68893
|
-
o_forbidden: {
|
|
68894
|
-
id: 'o_forbidden',
|
|
68895
|
-
name: 'El fruto prohibido',
|
|
68896
|
-
type: 'offering',
|
|
68897
|
-
cost: 0,
|
|
68898
|
-
attack: 0,
|
|
68899
|
-
life: 2,
|
|
68900
|
-
abilityName: 'Conocimiento del bien y del mal',
|
|
68901
|
-
abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Líder.',
|
|
68902
|
-
abilityCost: 0,
|
|
68903
|
-
verseText: 'Dios el Señor puso al hombre en el jardín de Edén para que lo labrara y lo cuidara.',
|
|
68904
|
-
scripture: 'Genesis 2:17 NBV',
|
|
68905
|
-
edition: 'GEN',
|
|
68906
|
-
collectorNumber: '012/180',
|
|
68907
|
-
year: '2026',
|
|
68908
|
-
author: 'MVP',
|
|
68909
|
-
rarity: 'uncommon',
|
|
68910
|
-
},
|
|
68911
|
-
p_scout: {
|
|
68912
|
-
id: 'p_scout',
|
|
68913
|
-
name: 'Scout',
|
|
68914
|
-
type: 'character',
|
|
68915
|
-
cost: 1,
|
|
68916
|
-
attack: 1,
|
|
68917
|
-
life: 1,
|
|
68918
|
-
verseText: 'Un explorador humilde abre camino antes de que llegue la batalla.',
|
|
68919
|
-
scripture: 'Genesis 13:17',
|
|
68920
|
-
edition: 'GEN',
|
|
68921
|
-
collectorNumber: '002/020',
|
|
68922
|
-
year: '2026',
|
|
68923
|
-
author: 'MVP',
|
|
68924
|
-
rarity: 'normal',
|
|
68925
|
-
},
|
|
68926
|
-
p_guard: { id: 'p_guard', name: 'Guard', type: 'character', cost: 2, attack: 1, life: 3, edition: 'GEN', collectorNumber: '003/020', year: '2026', author: 'MVP', rarity: 'normal' },
|
|
68927
|
-
p_warrior: { id: 'p_warrior', name: 'Warrior', type: 'character', cost: 2, attack: 2, life: 2, edition: 'GEN', collectorNumber: '004/020', year: '2026', author: 'MVP', rarity: 'normal' },
|
|
68928
|
-
p_elder: { id: 'p_elder', name: 'Elder', type: 'character', cost: 3, attack: 2, life: 4, edition: 'GEN', collectorNumber: '005/020', year: '2026', author: 'MVP', rarity: 'uncommon' },
|
|
68929
|
-
p_champion: { id: 'p_champion', name: 'Champion', type: 'character', cost: 4, attack: 4, life: 4, edition: 'GEN', collectorNumber: '006/020', year: '2026', author: 'MVP', rarity: 'rare' },
|
|
68930
|
-
};
|
|
68931
|
-
const STARTING_SHARED_DECK = [
|
|
68932
|
-
'o_simple',
|
|
68933
|
-
'p_scout',
|
|
68934
|
-
'o_forbidden',
|
|
68935
|
-
'o_simple',
|
|
68936
|
-
'p_guard',
|
|
68937
|
-
'p_warrior',
|
|
68938
|
-
'o_simple',
|
|
68939
|
-
'p_elder',
|
|
68940
|
-
'p_scout',
|
|
68941
|
-
'o_simple',
|
|
68942
|
-
'p_champion',
|
|
68943
|
-
'p_guard',
|
|
68944
|
-
'o_simple',
|
|
68945
|
-
'p_warrior',
|
|
68946
|
-
'p_scout',
|
|
68947
|
-
'o_simple',
|
|
68948
|
-
'p_elder',
|
|
68949
|
-
'p_guard',
|
|
68950
|
-
'o_simple',
|
|
68951
|
-
];
|
|
68952
|
-
const STARTING_GAME = {
|
|
68953
|
-
gameId: 'mock-christianity',
|
|
68954
|
-
status: 'in_progress',
|
|
68955
|
-
mode: 'local_pass',
|
|
68956
|
-
turnOwner: 'P1',
|
|
68957
|
-
revision: 0,
|
|
68958
|
-
turnCount: 1,
|
|
68959
|
-
matchScore: { P1: 1, P2: 0 },
|
|
68960
|
-
sharedDeck: STARTING_SHARED_DECK,
|
|
68961
|
-
historyZone: [],
|
|
68962
|
-
players: {
|
|
68963
|
-
P1: {
|
|
68964
|
-
seat: 'P1',
|
|
68965
|
-
displayName: 'Jugador',
|
|
68966
|
-
avatar: 'J',
|
|
68967
|
-
avatarColor: '#2563eb',
|
|
68968
|
-
leaderName: 'Adam',
|
|
68969
|
-
leaderHp: 15,
|
|
68970
|
-
leaderMaxHp: 15,
|
|
68971
|
-
offerings: [
|
|
68972
|
-
{ instanceId: 'p1_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P1', ready: true, value: 1 },
|
|
68973
|
-
{
|
|
68974
|
-
instanceId: 'p1_offering_002',
|
|
68975
|
-
cardId: 'o_forbidden',
|
|
68976
|
-
name: 'El fruto prohibido',
|
|
68977
|
-
owner: 'P1',
|
|
68978
|
-
ready: true,
|
|
68979
|
-
value: 2,
|
|
68980
|
-
abilityName: 'Conocimiento del bien y del mal',
|
|
68981
|
-
abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Lider.',
|
|
68982
|
-
abilityCost: 0,
|
|
68983
|
-
},
|
|
68984
|
-
],
|
|
68985
|
-
offeringPlayedThisTurn: false,
|
|
68986
|
-
hand: ['o_simple', 'p_scout', 'p_warrior', 'p_guard'],
|
|
68987
|
-
battleZone: [],
|
|
68988
|
-
},
|
|
68989
|
-
P2: {
|
|
68990
|
-
seat: 'P2',
|
|
68991
|
-
displayName: 'Rival',
|
|
68992
|
-
avatar: 'R',
|
|
68993
|
-
avatarColor: '#b45309',
|
|
68994
|
-
leaderName: 'Noah',
|
|
68995
|
-
leaderHp: 15,
|
|
68996
|
-
leaderMaxHp: 15,
|
|
68997
|
-
offerings: [{ instanceId: 'p2_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P2', ready: true, value: 1 }],
|
|
68998
|
-
offeringPlayedThisTurn: false,
|
|
68999
|
-
handCount: 4,
|
|
69000
|
-
battleZone: [
|
|
69001
|
-
{
|
|
69002
|
-
instanceId: 'opp_001',
|
|
69003
|
-
cardId: 'p_scout',
|
|
69004
|
-
name: 'Scout',
|
|
69005
|
-
owner: 'P2',
|
|
69006
|
-
controller: 'P2',
|
|
69007
|
-
slot: 0,
|
|
69008
|
-
attack: 1,
|
|
69009
|
-
currentHp: 1,
|
|
69010
|
-
maxHp: 1,
|
|
69011
|
-
canAttack: false,
|
|
69012
|
-
},
|
|
69013
|
-
],
|
|
69014
|
-
},
|
|
69015
|
-
},
|
|
69016
|
-
log: ['Partida iniciada.'],
|
|
69017
|
-
};
|
|
69018
|
-
class ChristianityGameComponent {
|
|
69019
|
-
constructor() {
|
|
69020
|
-
this.i18n = inject(I18nService);
|
|
69021
|
-
this.game = signal(structuredClone(STARTING_GAME));
|
|
69022
|
-
this.selectedHandCard = signal(null);
|
|
69023
|
-
this.selectedAttacker = signal(null);
|
|
69024
|
-
this.selectedPreview = signal(null);
|
|
69025
|
-
this.selectedInfo = signal(null);
|
|
69026
|
-
this.previewTilt = signal({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
|
|
69027
|
-
this.hoveredHandIndex = signal(null);
|
|
69028
|
-
this.draggingCardId = signal(null);
|
|
69029
|
-
this.showHistory = signal(false);
|
|
69030
|
-
this.offeringsSeat = signal(null);
|
|
69031
|
-
this.canDropOnBattleSlot = (drag) => {
|
|
69032
|
-
const card = this.cardDefinition(drag.data);
|
|
69033
|
-
return card.type === 'character' && this.canPlay(card);
|
|
69034
|
-
};
|
|
69035
|
-
this.canDropOnOfferings = (drag) => {
|
|
69036
|
-
const card = this.cardDefinition(drag.data);
|
|
69037
|
-
return card.type === 'offering' && this.canPlay(card);
|
|
69038
|
-
};
|
|
69039
|
-
this.player = computed(() => this.game().players.P1);
|
|
69040
|
-
this.opponent = computed(() => this.game().players.P2);
|
|
69041
|
-
this.currentPlayer = computed(() => this.game().players[this.game().turnOwner]);
|
|
69042
|
-
this.isOwnTurn = computed(() => this.game().turnOwner === 'P1');
|
|
69043
|
-
this.hasOpponentGuards = computed(() => this.opponent().battleZone.length > 0);
|
|
69044
|
-
this.opponentHandCount = computed(() => this.opponent().handCount ?? this.opponent().hand?.length ?? 0);
|
|
69045
|
-
this.selectedCardDefinition = computed(() => {
|
|
69046
|
-
const selected = this.selectedHandCard();
|
|
69047
|
-
return selected ? this.cardDefinition(selected) : null;
|
|
69048
|
-
});
|
|
69049
|
-
this.selectedPreviewCard = computed(() => {
|
|
69050
|
-
const cardId = this.selectedPreview()?.cardId;
|
|
69051
|
-
return cardId ? this.cardDefinition(cardId) : null;
|
|
69052
|
-
});
|
|
69053
|
-
this.statusText = computed(() => {
|
|
69054
|
-
const attacker = this.selectedAttacker();
|
|
69055
|
-
const handCard = this.selectedCardDefinition();
|
|
69056
|
-
if (!this.isOwnTurn()) {
|
|
69057
|
-
return this.t('christianityWaitTurn');
|
|
69058
|
-
}
|
|
69059
|
-
if (attacker) {
|
|
69060
|
-
return this.hasOpponentGuards() ? this.t('christianityChooseCharacterTarget') : this.t('christianityChooseTarget');
|
|
69061
|
-
}
|
|
69062
|
-
if (handCard) {
|
|
69063
|
-
if (!this.canPlay(handCard)) {
|
|
69064
|
-
return this.t('christianityNeedOfferings');
|
|
69065
|
-
}
|
|
69066
|
-
return handCard.type === 'offering' ? this.t('christianityPlaceOffering') : this.t('christianityChooseSlot');
|
|
69067
|
-
}
|
|
69068
|
-
return this.t('christianityChooseCard');
|
|
69069
|
-
});
|
|
69070
|
-
this.i18n.registerDefaults('MiniGames', MINI_GAMES_I18N);
|
|
69071
|
-
}
|
|
69072
|
-
t(key) {
|
|
69073
|
-
this.i18n.lang();
|
|
69074
|
-
return this.i18n.t(key, 'MiniGames');
|
|
69075
|
-
}
|
|
69076
|
-
cardDefinition(cardId) {
|
|
69077
|
-
return STARTER_CARDS[cardId] ?? STARTER_CARDS['p_scout'];
|
|
69078
|
-
}
|
|
69079
|
-
cardTypeLabel(card) {
|
|
69080
|
-
return card.type === 'offering' ? this.t('christianityOfferingCard') : this.t('christianityCharacterCard');
|
|
69081
|
-
}
|
|
69082
|
-
battleSlots(seat) {
|
|
69083
|
-
const cards = this.game().players[seat].battleZone;
|
|
69084
|
-
const positionedCards = new Map();
|
|
69085
|
-
cards.forEach((card, index) => {
|
|
69086
|
-
const slot = Number.isInteger(card.slot) ? card.slot ?? index : index;
|
|
69087
|
-
if (slot >= 0 && slot < 4 && !positionedCards.has(slot)) {
|
|
69088
|
-
positionedCards.set(slot, card);
|
|
69089
|
-
}
|
|
69090
|
-
});
|
|
69091
|
-
return Array.from({ length: 4 }, (_, index) => ({
|
|
69092
|
-
trackId: positionedCards.get(index)?.instanceId ?? `${seat}-empty-${index}`,
|
|
69093
|
-
card: positionedCards.get(index),
|
|
69094
|
-
}));
|
|
69095
|
-
}
|
|
69096
|
-
battleSlotDropId(index) {
|
|
69097
|
-
return `christianity-battle-slot-${index}`;
|
|
69098
|
-
}
|
|
69099
|
-
dropTargetIds() {
|
|
69100
|
-
return ['christianity-offerings-drop', ...this.battleSlots('P1').map((_, index) => this.battleSlotDropId(index))];
|
|
69101
|
-
}
|
|
69102
|
-
hiddenHandCards(count) {
|
|
69103
|
-
return Array.from({ length: count });
|
|
69104
|
-
}
|
|
69105
|
-
fanTransform(index, total, opponent) {
|
|
69106
|
-
if (total <= 1)
|
|
69107
|
-
return 'none';
|
|
69108
|
-
const center = (total - 1) / 2;
|
|
69109
|
-
const offset = index - center;
|
|
69110
|
-
const rotate = offset * (opponent ? 6 : 5);
|
|
69111
|
-
const lift = Math.abs(offset) * 0.25;
|
|
69112
|
-
const hoverLift = opponent ? 0 : this.handWaveLift(index);
|
|
69113
|
-
const scale = opponent ? 1 : this.handWaveScale(index);
|
|
69114
|
-
const fanLift = opponent ? Math.abs(offset) * 0.22 : lift + hoverLift;
|
|
69115
|
-
const fanSpread = opponent ? offset * 0.02 : 0;
|
|
69116
|
-
return `translate(${fanSpread}rem, ${fanLift}rem) rotate(${rotate}deg) scale(${scale})`;
|
|
69117
|
-
}
|
|
69118
|
-
handCardZIndex(index) {
|
|
69119
|
-
const hovered = this.hoveredHandIndex();
|
|
69120
|
-
if (hovered === null)
|
|
69121
|
-
return 2;
|
|
69122
|
-
const distance = Math.abs(index - hovered);
|
|
69123
|
-
return Math.max(2, 8 - distance);
|
|
69124
|
-
}
|
|
69125
|
-
setHoveredHandIndex(index) {
|
|
69126
|
-
this.hoveredHandIndex.set(index);
|
|
69127
|
-
}
|
|
69128
|
-
clearHoveredHandIndex() {
|
|
69129
|
-
this.hoveredHandIndex.set(null);
|
|
69130
|
-
}
|
|
69131
|
-
releaseHoveredHand(event) {
|
|
69132
|
-
if (event.pointerType !== 'mouse') {
|
|
69133
|
-
window.setTimeout(() => this.clearHoveredHandIndex(), 180);
|
|
69134
|
-
}
|
|
69135
|
-
}
|
|
69136
|
-
handWaveLift(index) {
|
|
69137
|
-
const hovered = this.hoveredHandIndex();
|
|
69138
|
-
if (hovered === null)
|
|
69139
|
-
return 0;
|
|
69140
|
-
const distance = Math.abs(index - hovered);
|
|
69141
|
-
if (distance === 0)
|
|
69142
|
-
return -1.15;
|
|
69143
|
-
if (distance === 1)
|
|
69144
|
-
return -0.58;
|
|
69145
|
-
if (distance === 2)
|
|
69146
|
-
return -0.22;
|
|
69147
|
-
return 0;
|
|
69148
|
-
}
|
|
69149
|
-
handWaveScale(index) {
|
|
69150
|
-
const hovered = this.hoveredHandIndex();
|
|
69151
|
-
if (hovered === null)
|
|
69152
|
-
return 1;
|
|
69153
|
-
const distance = Math.abs(index - hovered);
|
|
69154
|
-
if (distance === 0)
|
|
69155
|
-
return 1.06;
|
|
69156
|
-
if (distance === 1)
|
|
69157
|
-
return 1.03;
|
|
69158
|
-
return 1;
|
|
69159
|
-
}
|
|
69160
|
-
readyOfferings(player) {
|
|
69161
|
-
return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), 0);
|
|
69162
|
-
}
|
|
69163
|
-
totalOfferings(player) {
|
|
69164
|
-
return player.offerings.reduce((total, offering) => total + offering.value, 0);
|
|
69165
|
-
}
|
|
69166
|
-
canPlay(card) {
|
|
69167
|
-
if (!this.isOwnTurn())
|
|
69168
|
-
return false;
|
|
69169
|
-
if (card.type === 'offering')
|
|
69170
|
-
return !this.player().offeringPlayedThisTurn;
|
|
69171
|
-
return this.readyOfferings(this.player()) >= card.cost && this.player().battleZone.length < 4;
|
|
69172
|
-
}
|
|
69173
|
-
canPlaySelected() {
|
|
69174
|
-
const selected = this.selectedHandCard();
|
|
69175
|
-
return !!selected && this.canPlay(this.cardDefinition(selected));
|
|
69176
|
-
}
|
|
69177
|
-
selectedActionLabel() {
|
|
69178
|
-
const selected = this.selectedCardDefinition();
|
|
69179
|
-
if (!selected)
|
|
69180
|
-
return this.t('christianityPlayCard');
|
|
69181
|
-
return selected.type === 'offering' ? this.t('christianityPlayOffering') : this.t('christianityPlayCard');
|
|
69182
|
-
}
|
|
69183
|
-
selectedActionDisabled() {
|
|
69184
|
-
const selected = this.selectedCardDefinition();
|
|
69185
|
-
if (!selected || !this.canPlay(selected))
|
|
69186
|
-
return true;
|
|
69187
|
-
return selected.type === 'character';
|
|
69188
|
-
}
|
|
69189
|
-
previewActionDisabled() {
|
|
69190
|
-
const preview = this.selectedPreview();
|
|
69191
|
-
if (preview?.source !== 'hand' || !preview.cardId)
|
|
69192
|
-
return true;
|
|
69193
|
-
return !this.canPlay(this.cardDefinition(preview.cardId));
|
|
69194
|
-
}
|
|
69195
|
-
canPlaceSelectedCharacter() {
|
|
69196
|
-
const selected = this.selectedCardDefinition();
|
|
69197
|
-
return !!selected && selected.type === 'character' && this.canPlay(selected);
|
|
69198
|
-
}
|
|
69199
|
-
canPlaceSelectedOffering() {
|
|
69200
|
-
const selected = this.selectedCardDefinition();
|
|
69201
|
-
return !!selected && selected.type === 'offering' && this.canPlay(selected);
|
|
69202
|
-
}
|
|
69203
|
-
isDraggingCharacter() {
|
|
69204
|
-
const cardId = this.draggingCardId();
|
|
69205
|
-
if (!cardId)
|
|
69206
|
-
return false;
|
|
69207
|
-
const card = this.cardDefinition(cardId);
|
|
69208
|
-
return card.type === 'character' && this.canPlay(card);
|
|
69209
|
-
}
|
|
69210
|
-
isDraggingOffering() {
|
|
69211
|
-
const cardId = this.draggingCardId();
|
|
69212
|
-
if (!cardId)
|
|
69213
|
-
return false;
|
|
69214
|
-
const card = this.cardDefinition(cardId);
|
|
69215
|
-
return card.type === 'offering' && this.canPlay(card);
|
|
69216
|
-
}
|
|
69217
|
-
startDraggingCard(cardId) {
|
|
69218
|
-
this.selectedAttacker.set(null);
|
|
69219
|
-
this.selectedHandCard.set(cardId);
|
|
69220
|
-
this.draggingCardId.set(cardId);
|
|
69221
|
-
this.closePreview();
|
|
69222
|
-
}
|
|
69223
|
-
endDraggingCard() {
|
|
69224
|
-
this.draggingCardId.set(null);
|
|
69225
|
-
}
|
|
69226
|
-
dropOnBattleSlot(event, slotIndex) {
|
|
69227
|
-
const card = this.cardDefinition(event.item.data);
|
|
69228
|
-
if (card.type !== 'character')
|
|
69229
|
-
return;
|
|
69230
|
-
this.playCardFromHand(event.item.data, slotIndex);
|
|
69231
|
-
}
|
|
69232
|
-
dropOnOfferings(event) {
|
|
69233
|
-
const card = this.cardDefinition(event.item.data);
|
|
69234
|
-
if (card.type !== 'offering')
|
|
69235
|
-
return;
|
|
69236
|
-
this.playCardFromHand(event.item.data);
|
|
69237
|
-
}
|
|
69238
|
-
selectHandCard(cardId) {
|
|
69239
|
-
const wasSelected = this.selectedHandCard() === cardId;
|
|
69240
|
-
this.selectedAttacker.set(null);
|
|
69241
|
-
this.selectedHandCard.set(wasSelected ? null : cardId);
|
|
69242
|
-
this.closePreview();
|
|
69243
|
-
}
|
|
69244
|
-
playSelectedCard(slotIndex) {
|
|
69245
|
-
const cardId = this.selectedHandCard();
|
|
69246
|
-
if (!cardId)
|
|
69247
|
-
return;
|
|
69248
|
-
this.playCardFromHand(cardId, slotIndex);
|
|
69249
|
-
}
|
|
69250
|
-
playCardFromHand(cardId, slotIndex) {
|
|
69251
|
-
const card = this.cardDefinition(cardId);
|
|
69252
|
-
if (!this.canPlay(card))
|
|
69253
|
-
return;
|
|
69254
|
-
this.game.update(game => {
|
|
69255
|
-
const next = structuredClone(game);
|
|
69256
|
-
const player = next.players.P1;
|
|
69257
|
-
const handIndex = player.hand?.indexOf(cardId) ?? -1;
|
|
69258
|
-
if (handIndex < 0 || !player.hand)
|
|
69259
|
-
return game;
|
|
69260
|
-
player.hand.splice(handIndex, 1);
|
|
69261
|
-
if (card.type === 'offering') {
|
|
69262
|
-
player.offerings.push({
|
|
69263
|
-
instanceId: `p1_offering_${next.revision + 1}`,
|
|
69264
|
-
cardId: card.id,
|
|
69265
|
-
name: card.name,
|
|
69266
|
-
owner: 'P1',
|
|
69267
|
-
ready: true,
|
|
69268
|
-
value: card.life,
|
|
69269
|
-
abilityName: card.abilityName,
|
|
69270
|
-
abilityText: card.abilityText,
|
|
69271
|
-
abilityCost: card.abilityCost,
|
|
69272
|
-
});
|
|
69273
|
-
player.offeringPlayedThisTurn = true;
|
|
69274
|
-
}
|
|
69275
|
-
else {
|
|
69276
|
-
this.spendOfferings(player, card.cost);
|
|
69277
|
-
const occupiedSlots = new Set(player.battleZone.map((character, index) => Number.isInteger(character.slot) ? character.slot ?? index : index));
|
|
69278
|
-
const targetSlot = slotIndex ?? [0, 1, 2, 3].find(index => !occupiedSlots.has(index));
|
|
69279
|
-
if (targetSlot === undefined || occupiedSlots.has(targetSlot))
|
|
69280
|
-
return game;
|
|
69281
|
-
player.battleZone.push({
|
|
69282
|
-
instanceId: `p1_${next.revision + 1}_${player.battleZone.length}`,
|
|
69283
|
-
cardId: card.id,
|
|
69284
|
-
name: card.name,
|
|
69285
|
-
owner: 'P1',
|
|
69286
|
-
controller: 'P1',
|
|
69287
|
-
slot: targetSlot,
|
|
69288
|
-
attack: card.attack,
|
|
69289
|
-
currentHp: card.life,
|
|
69290
|
-
maxHp: card.life,
|
|
69291
|
-
canAttack: false,
|
|
69292
|
-
});
|
|
69293
|
-
player.battleZone.sort((left, right) => (left.slot ?? 0) - (right.slot ?? 0));
|
|
69294
|
-
}
|
|
69295
|
-
next.revision++;
|
|
69296
|
-
next.log = [
|
|
69297
|
-
card.type === 'offering' ? `${card.name} queda lista como ofrenda.` : `${card.name} entra en batalla.`,
|
|
69298
|
-
...next.log,
|
|
69299
|
-
].slice(0, 4);
|
|
69300
|
-
return next;
|
|
69301
|
-
});
|
|
69302
|
-
this.selectedHandCard.set(null);
|
|
69303
|
-
this.draggingCardId.set(null);
|
|
69304
|
-
this.closePreview();
|
|
69305
|
-
}
|
|
69306
|
-
playPreviewCard() {
|
|
69307
|
-
const preview = this.selectedPreview();
|
|
69308
|
-
if (preview?.source !== 'hand' || !preview.cardId)
|
|
69309
|
-
return;
|
|
69310
|
-
const card = this.cardDefinition(preview.cardId);
|
|
69311
|
-
if (!this.canPlay(card))
|
|
69312
|
-
return;
|
|
69313
|
-
this.selectedHandCard.set(preview.cardId);
|
|
69314
|
-
if (card.type === 'character') {
|
|
69315
|
-
this.closePreview();
|
|
69316
|
-
return;
|
|
69317
|
-
}
|
|
69318
|
-
this.playSelectedCard();
|
|
69319
|
-
}
|
|
69320
|
-
handleOfferingPile(seat) {
|
|
69321
|
-
this.openOfferings(seat);
|
|
69322
|
-
}
|
|
69323
|
-
selectAttacker(card) {
|
|
69324
|
-
this.selectedHandCard.set(null);
|
|
69325
|
-
this.inspectCharacter(card);
|
|
69326
|
-
if (!this.isOwnTurn() || !card.canAttack)
|
|
69327
|
-
return;
|
|
69328
|
-
this.selectedAttacker.set(this.selectedAttacker()?.instanceId === card.instanceId ? null : card);
|
|
69329
|
-
}
|
|
69330
|
-
handleOpponentCharacter(card) {
|
|
69331
|
-
this.inspectCharacter(card);
|
|
69332
|
-
if (this.selectedAttacker()) {
|
|
69333
|
-
this.attackCharacter(card);
|
|
69334
|
-
}
|
|
69335
|
-
}
|
|
69336
|
-
handleOpponentLeader() {
|
|
69337
|
-
this.inspectLeader('P2');
|
|
69338
|
-
if (this.selectedAttacker() && !this.hasOpponentGuards()) {
|
|
69339
|
-
this.attackLeader();
|
|
69340
|
-
}
|
|
69341
|
-
}
|
|
69342
|
-
attackLeader() {
|
|
69343
|
-
const attacker = this.selectedAttacker();
|
|
69344
|
-
if (!attacker)
|
|
69345
|
-
return;
|
|
69346
|
-
if (this.hasOpponentGuards()) {
|
|
69347
|
-
this.selectedPreview.set({
|
|
69348
|
-
title: this.opponent().leaderName,
|
|
69349
|
-
eyebrow: this.t('christianityLeaderCard'),
|
|
69350
|
-
meta: `${this.opponent().leaderHp}/${this.opponent().leaderMaxHp}`,
|
|
69351
|
-
body: this.t('christianityLeaderProtected'),
|
|
69352
|
-
});
|
|
69353
|
-
return;
|
|
69354
|
-
}
|
|
69355
|
-
this.game.update(game => {
|
|
69356
|
-
const next = structuredClone(game);
|
|
69357
|
-
const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
|
|
69358
|
-
if (!liveAttacker || !liveAttacker.canAttack)
|
|
69359
|
-
return game;
|
|
69360
|
-
next.players.P2.leaderHp = Math.max(0, next.players.P2.leaderHp - liveAttacker.attack);
|
|
69361
|
-
liveAttacker.canAttack = false;
|
|
69362
|
-
next.revision++;
|
|
69363
|
-
next.log = [`${liveAttacker.name} ataca al lider rival.`, ...next.log].slice(0, 4);
|
|
69364
|
-
return next;
|
|
69365
|
-
});
|
|
69366
|
-
this.selectedAttacker.set(null);
|
|
69367
|
-
}
|
|
69368
|
-
attackCharacter(target) {
|
|
69369
|
-
const attacker = this.selectedAttacker();
|
|
69370
|
-
if (!attacker)
|
|
69371
|
-
return;
|
|
69372
|
-
this.game.update(game => {
|
|
69373
|
-
const next = structuredClone(game);
|
|
69374
|
-
const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
|
|
69375
|
-
const liveTarget = next.players.P2.battleZone.find(card => card.instanceId === target.instanceId);
|
|
69376
|
-
if (!liveAttacker || !liveTarget || !liveAttacker.canAttack)
|
|
69377
|
-
return game;
|
|
69378
|
-
liveTarget.currentHp -= liveAttacker.attack;
|
|
69379
|
-
liveAttacker.currentHp -= liveTarget.attack;
|
|
69380
|
-
liveAttacker.canAttack = false;
|
|
69381
|
-
this.cleanupDestroyed(next.players.P1, next);
|
|
69382
|
-
this.cleanupDestroyed(next.players.P2, next);
|
|
69383
|
-
next.revision++;
|
|
69384
|
-
next.log = [`${liveAttacker.name} combate contra ${liveTarget.name}.`, ...next.log].slice(0, 4);
|
|
69385
|
-
return next;
|
|
69386
|
-
});
|
|
69387
|
-
this.selectedAttacker.set(null);
|
|
69388
|
-
}
|
|
69389
|
-
endTurn() {
|
|
69390
|
-
this.selectedHandCard.set(null);
|
|
69391
|
-
this.selectedAttacker.set(null);
|
|
69392
|
-
this.selectedPreview.set(null);
|
|
69393
|
-
this.selectedInfo.set(null);
|
|
69394
|
-
this.game.update(game => {
|
|
69395
|
-
const next = structuredClone(game);
|
|
69396
|
-
next.turnOwner = next.turnOwner === 'P1' ? 'P2' : 'P1';
|
|
69397
|
-
next.turnCount++;
|
|
69398
|
-
const current = next.players[next.turnOwner];
|
|
69399
|
-
current.offeringPlayedThisTurn = false;
|
|
69400
|
-
current.offerings = current.offerings.map(offering => ({ ...offering, ready: true }));
|
|
69401
|
-
current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
|
|
69402
|
-
const drawnCard = next.sharedDeck.shift();
|
|
69403
|
-
if (drawnCard) {
|
|
69404
|
-
if (current.hand) {
|
|
69405
|
-
current.hand.push(drawnCard);
|
|
69406
|
-
}
|
|
69407
|
-
else {
|
|
69408
|
-
current.handCount = (current.handCount ?? 0) + 1;
|
|
69409
|
-
}
|
|
69410
|
-
}
|
|
69411
|
-
next.revision++;
|
|
69412
|
-
next.log = [
|
|
69413
|
-
drawnCard ? `${current.displayName} roba una carta.` : `El mazo esta vacio.`,
|
|
69414
|
-
`Turno de ${current.displayName}.`,
|
|
69415
|
-
...next.log,
|
|
69416
|
-
].slice(0, 4);
|
|
69417
|
-
return next;
|
|
69418
|
-
});
|
|
69419
|
-
}
|
|
69420
|
-
resetMock() {
|
|
69421
|
-
this.game.set(structuredClone(STARTING_GAME));
|
|
69422
|
-
this.selectedHandCard.set(null);
|
|
69423
|
-
this.selectedAttacker.set(null);
|
|
69424
|
-
this.selectedPreview.set(null);
|
|
69425
|
-
this.selectedInfo.set(null);
|
|
69426
|
-
this.showHistory.set(false);
|
|
69427
|
-
this.offeringsSeat.set(null);
|
|
69428
|
-
}
|
|
69429
|
-
closePreview() {
|
|
69430
|
-
this.selectedPreview.set(null);
|
|
69431
|
-
this.resetPreviewTilt();
|
|
69432
|
-
}
|
|
69433
|
-
closeInfo() {
|
|
69434
|
-
this.selectedInfo.set(null);
|
|
69435
|
-
}
|
|
69436
|
-
openOfferings(seat) {
|
|
69437
|
-
this.selectedPreview.set(null);
|
|
69438
|
-
this.selectedInfo.set(null);
|
|
69439
|
-
this.showHistory.set(false);
|
|
69440
|
-
this.offeringsSeat.set(seat);
|
|
69441
|
-
}
|
|
69442
|
-
openHistory() {
|
|
69443
|
-
this.selectedPreview.set(null);
|
|
69444
|
-
this.selectedInfo.set(null);
|
|
69445
|
-
this.offeringsSeat.set(null);
|
|
69446
|
-
this.showHistory.set(true);
|
|
69447
|
-
}
|
|
69448
|
-
closeOfferings() {
|
|
69449
|
-
this.offeringsSeat.set(null);
|
|
69450
|
-
}
|
|
69451
|
-
tiltPreview(event) {
|
|
69452
|
-
const bounds = event.currentTarget.getBoundingClientRect();
|
|
69453
|
-
const x = (event.clientX - bounds.left) / bounds.width - 0.5;
|
|
69454
|
-
const y = (event.clientY - bounds.top) / bounds.height - 0.5;
|
|
69455
|
-
this.previewTilt.set({
|
|
69456
|
-
rotateX: 5 - y * 18,
|
|
69457
|
-
rotateY: -5 + x * 18,
|
|
69458
|
-
shiftX: x * 10,
|
|
69459
|
-
shiftY: y * 10,
|
|
69460
|
-
});
|
|
69461
|
-
}
|
|
69462
|
-
resetPreviewTilt() {
|
|
69463
|
-
this.previewTilt.set({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
|
|
69464
|
-
}
|
|
69465
|
-
cleanupDestroyed(player, game) {
|
|
69466
|
-
const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
|
|
69467
|
-
if (!destroyed.length)
|
|
69468
|
-
return;
|
|
69469
|
-
game.historyZone.push(...destroyed.map(card => card.cardId));
|
|
69470
|
-
player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
|
|
69471
|
-
}
|
|
69472
|
-
inspectLeader(seat) {
|
|
69473
|
-
this.selectedInfo.set(null);
|
|
69474
|
-
const player = this.game().players[seat];
|
|
69475
|
-
this.selectedPreview.set({
|
|
69476
|
-
title: player.leaderName,
|
|
69477
|
-
eyebrow: this.t('christianityLeaderCard'),
|
|
69478
|
-
meta: `${player.leaderHp}/${player.leaderMaxHp}`,
|
|
69479
|
-
body: seat === 'P2' && this.hasOpponentGuards() ? this.t('christianityLeaderProtected') : this.t('christianityLeaderBody'),
|
|
69480
|
-
});
|
|
69481
|
-
}
|
|
69482
|
-
inspectOffering(offering) {
|
|
69483
|
-
this.selectedInfo.set(null);
|
|
69484
|
-
this.selectedPreview.set({
|
|
69485
|
-
title: offering.name,
|
|
69486
|
-
eyebrow: this.t('christianityOfferingCard'),
|
|
69487
|
-
meta: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
|
|
69488
|
-
body: offering.abilityText || this.t('christianityOfferingBody'),
|
|
69489
|
-
cardId: offering.cardId,
|
|
69490
|
-
source: 'pile',
|
|
69491
|
-
});
|
|
69492
|
-
}
|
|
69493
|
-
canUseOfferingAbility(offering, seat) {
|
|
69494
|
-
if (seat !== 'P1' || !this.isOwnTurn())
|
|
69495
|
-
return false;
|
|
69496
|
-
if (!offering.ready || !offering.abilityName)
|
|
69497
|
-
return false;
|
|
69498
|
-
return this.readyOfferings(this.game().players[seat]) >= (offering.abilityCost ?? 0);
|
|
69499
|
-
}
|
|
69500
|
-
useOfferingAbility(offering, seat) {
|
|
69501
|
-
if (!this.canUseOfferingAbility(offering, seat))
|
|
69502
|
-
return;
|
|
69503
|
-
this.game.update(game => {
|
|
69504
|
-
const next = structuredClone(game);
|
|
69505
|
-
const player = next.players[seat];
|
|
69506
|
-
const liveOffering = player.offerings.find(card => card.instanceId === offering.instanceId);
|
|
69507
|
-
if (!liveOffering || !liveOffering.ready)
|
|
69508
|
-
return game;
|
|
69509
|
-
const offeringId = liveOffering.instanceId;
|
|
69510
|
-
this.spendOfferings(player, liveOffering.abilityCost ?? 0);
|
|
69511
|
-
player.offerings = player.offerings.map(card => (card.instanceId === offeringId ? { ...card, ready: false } : card));
|
|
69512
|
-
player.leaderHp = Math.max(0, player.leaderHp - 1);
|
|
69513
|
-
next.revision++;
|
|
69514
|
-
next.log = [`${liveOffering.name}: ${liveOffering.abilityName}.`, ...next.log].slice(0, 4);
|
|
69515
|
-
return next;
|
|
69516
|
-
});
|
|
69517
|
-
}
|
|
69518
|
-
inspectDeck() {
|
|
69519
|
-
const remainingCards = this.game().sharedDeck.length;
|
|
69520
|
-
this.selectedPreview.set(null);
|
|
69521
|
-
this.selectedInfo.set({
|
|
69522
|
-
title: this.t('christianityDeck'),
|
|
69523
|
-
eyebrow: this.t('christianitySharedZone'),
|
|
69524
|
-
meta: `${remainingCards} ${remainingCards === 1 ? this.t('christianityCardRemaining') : this.t('christianityCardsRemaining')}`,
|
|
69525
|
-
body: this.t('christianityDeckBody'),
|
|
69526
|
-
facts: [
|
|
69527
|
-
this.t('christianityDeckRuleShared'),
|
|
69528
|
-
this.t('christianityDeckRuleDraw'),
|
|
69529
|
-
this.t('christianityDeckRuleEmpty'),
|
|
69530
|
-
],
|
|
69531
|
-
});
|
|
69532
|
-
}
|
|
69533
|
-
inspectHandCard(cardId, fromHand = false) {
|
|
69534
|
-
this.selectedInfo.set(null);
|
|
69535
|
-
const card = this.cardDefinition(cardId);
|
|
69536
|
-
if (fromHand) {
|
|
69537
|
-
this.selectedAttacker.set(null);
|
|
69538
|
-
this.selectedHandCard.set(cardId);
|
|
69539
|
-
}
|
|
69540
|
-
this.selectedPreview.set({
|
|
69541
|
-
title: card.name,
|
|
69542
|
-
eyebrow: card.type === 'offering' ? this.t('christianityOfferingCard') : this.t('christianityCharacterCard'),
|
|
69543
|
-
meta: card.type === 'offering' ? `+${card.life}` : `${this.t('christianityCost')} ${card.cost} · ${card.attack}/${card.life}`,
|
|
69544
|
-
body: card.type === 'offering' ? this.t('christianityOfferingBody') : this.t('christianityCharacterBody'),
|
|
69545
|
-
cardId,
|
|
69546
|
-
source: fromHand ? 'hand' : 'pile',
|
|
69547
|
-
});
|
|
69548
|
-
}
|
|
69549
|
-
inspectHistoryCard(cardId) {
|
|
69550
|
-
this.showHistory.set(false);
|
|
69551
|
-
this.inspectHandCard(cardId);
|
|
69552
|
-
}
|
|
69553
|
-
inspectCharacter(card) {
|
|
69554
|
-
this.selectedInfo.set(null);
|
|
69555
|
-
this.selectedPreview.set({
|
|
69556
|
-
title: card.name,
|
|
69557
|
-
eyebrow: this.t('christianityCharacterCard'),
|
|
69558
|
-
meta: `${card.attack}/${card.currentHp}`,
|
|
69559
|
-
body: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
|
|
69560
|
-
});
|
|
69561
|
-
}
|
|
69562
|
-
spendOfferings(player, cost) {
|
|
69563
|
-
let remaining = cost;
|
|
69564
|
-
player.offerings = player.offerings.map(offering => {
|
|
69565
|
-
if (remaining <= 0 || !offering.ready)
|
|
69566
|
-
return offering;
|
|
69567
|
-
remaining -= offering.value;
|
|
69568
|
-
return { ...offering, ready: false };
|
|
69569
|
-
});
|
|
69570
|
-
}
|
|
69571
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
69572
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChristianityGameComponent, isStandalone: true, selector: "val-christianity-game", ngImport: i0, template: `
|
|
69573
|
-
<main class="christianity-shell">
|
|
69574
|
-
<section class="christianity-header">
|
|
69575
|
-
<div>
|
|
69576
|
-
<p>{{ t('christianityEyebrow') }}</p>
|
|
69577
|
-
<h1>{{ t('christianityTitle') }}</h1>
|
|
69578
|
-
</div>
|
|
69579
|
-
<div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
|
|
69580
|
-
<span>{{ t('christianityTurn') }}</span>
|
|
69581
|
-
<strong>{{ currentPlayer().displayName }}</strong>
|
|
69582
|
-
</div>
|
|
69583
|
-
</section>
|
|
69584
|
-
|
|
69585
|
-
<section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
|
|
69586
|
-
<article class="christianity-match-player">
|
|
69587
|
-
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
69588
|
-
<div>
|
|
69589
|
-
<strong>{{ player().displayName }}</strong>
|
|
69590
|
-
<small>{{ player().leaderName }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
|
|
69591
|
-
</div>
|
|
69592
|
-
</article>
|
|
69593
|
-
<div class="christianity-scoreboard">
|
|
69594
|
-
<span>{{ t('christianityMatch') }}</span>
|
|
69595
|
-
<strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
|
|
69596
|
-
</div>
|
|
69597
|
-
<article class="christianity-match-player christianity-match-player--opponent">
|
|
69598
|
-
<span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
|
|
69599
|
-
<div>
|
|
69600
|
-
<strong>{{ opponent().displayName }}</strong>
|
|
69601
|
-
<small>{{ opponent().leaderName }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
|
|
69602
|
-
</div>
|
|
69603
|
-
</article>
|
|
69604
|
-
</section>
|
|
69605
|
-
|
|
69606
|
-
<section class="christianity-hand-shelf christianity-hand-shelf--opponent">
|
|
69607
|
-
<div class="christianity-hand-meter christianity-hand-meter--opponent">
|
|
69608
|
-
<span>{{ t('christianityHand') }}</span>
|
|
69609
|
-
<strong>{{ opponentHandCount() }}</strong>
|
|
69610
|
-
</div>
|
|
69611
|
-
<section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
|
|
69612
|
-
@for (_ of hiddenHandCards(opponentHandCount()); track $index) {
|
|
69613
|
-
<button
|
|
69614
|
-
type="button"
|
|
69615
|
-
class="christianity-card-preview-card christianity-card-frame christianity-card-frame--back"
|
|
69616
|
-
valLightRipple
|
|
69617
|
-
[style.transform]="fanTransform($index, opponentHandCount(), true)"
|
|
69618
|
-
[attr.aria-label]="t('christianityHiddenCard')"
|
|
69619
|
-
></button>
|
|
69620
|
-
}
|
|
69621
|
-
</section>
|
|
69622
|
-
</section>
|
|
69623
|
-
|
|
69624
|
-
<section class="christianity-table" [attr.aria-label]="t('christianityTable')">
|
|
69625
|
-
<section class="christianity-player-side christianity-player-side--opponent">
|
|
69626
|
-
<section class="christianity-player-rack christianity-player-rack--opponent">
|
|
69627
|
-
<div class="christianity-offerings-zone">
|
|
69628
|
-
<button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
|
|
69629
|
-
<i aria-hidden="true"></i>
|
|
69630
|
-
<i aria-hidden="true"></i>
|
|
69631
|
-
<i aria-hidden="true"></i>
|
|
69632
|
-
<span>{{ t('christianityOfferings') }}</span>
|
|
69633
|
-
<strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
|
|
69634
|
-
</button>
|
|
69635
|
-
</div>
|
|
69636
|
-
<button type="button" class="christianity-leader-card christianity-card-frame christianity-card-frame--leader" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
|
|
69637
|
-
<header class="christianity-card-frame-header">
|
|
69638
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
69639
|
-
<strong>{{ opponent().leaderName }}</strong>
|
|
69640
|
-
<span>{{ opponent().leaderHp }}</span>
|
|
69641
|
-
</header>
|
|
69642
|
-
<section class="christianity-card-frame-art">
|
|
69643
|
-
<span>{{ opponent().leaderName }}</span>
|
|
69644
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
69645
|
-
</section>
|
|
69646
|
-
<section class="christianity-card-frame-effect">
|
|
69647
|
-
<strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
|
|
69648
|
-
</section>
|
|
69649
|
-
</button>
|
|
69650
|
-
<span class="christianity-rack-spacer" aria-hidden="true"></span>
|
|
69651
|
-
</section>
|
|
69652
|
-
|
|
69653
|
-
<section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
|
|
69654
|
-
@for (slot of battleSlots('P2'); track slot.trackId) {
|
|
69655
|
-
@if (slot.card) {
|
|
69656
|
-
<button
|
|
69657
|
-
type="button"
|
|
69658
|
-
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-card-frame christianity-card-frame--battle"
|
|
69659
|
-
valLightRipple
|
|
69660
|
-
[class.is-target]="selectedAttacker()"
|
|
69661
|
-
(click)="handleOpponentCharacter(slot.card)"
|
|
69662
|
-
>
|
|
69663
|
-
<header class="christianity-card-frame-header">
|
|
69664
|
-
<small>{{ t('christianityCost') }} {{ cardDefinition(slot.card.cardId).cost }}</small>
|
|
69665
|
-
<strong>{{ slot.card.name }}</strong>
|
|
69666
|
-
<span>{{ cardDefinition(slot.card.cardId).cost }}</span>
|
|
69667
|
-
</header>
|
|
69668
|
-
<section class="christianity-card-frame-art">
|
|
69669
|
-
<span>{{ slot.card.name }}</span>
|
|
69670
|
-
<small>{{ t('christianityCharacterCard') }}</small>
|
|
69671
|
-
</section>
|
|
69672
|
-
<section class="christianity-card-frame-effect">
|
|
69673
|
-
<strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
|
|
69674
|
-
</section>
|
|
69675
|
-
</button>
|
|
69676
|
-
} @else {
|
|
69677
|
-
<span class="christianity-slot"></span>
|
|
69678
|
-
}
|
|
69679
|
-
}
|
|
69680
|
-
</section>
|
|
69681
|
-
</section>
|
|
69682
|
-
|
|
69683
|
-
<section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
|
|
69684
|
-
<button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="openHistory()">
|
|
69685
|
-
<i aria-hidden="true"></i>
|
|
69686
|
-
<i aria-hidden="true"></i>
|
|
69687
|
-
<i aria-hidden="true"></i>
|
|
69688
|
-
<span>{{ t('christianityHistory') }}</span>
|
|
69689
|
-
<strong>{{ game().historyZone.length }}</strong>
|
|
69690
|
-
</button>
|
|
69691
|
-
<button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
|
|
69692
|
-
<i aria-hidden="true"></i>
|
|
69693
|
-
<i aria-hidden="true"></i>
|
|
69694
|
-
<i aria-hidden="true"></i>
|
|
69695
|
-
<span>{{ t('christianityDeck') }}</span>
|
|
69696
|
-
<strong>{{ game().sharedDeck.length }}</strong>
|
|
69697
|
-
</button>
|
|
69698
|
-
<div class="christianity-zone-card">
|
|
69699
|
-
<span>{{ t('christianityPlace') }}</span>
|
|
69700
|
-
<strong>{{ t('christianityEmpty') }}</strong>
|
|
69701
|
-
</div>
|
|
69702
|
-
</section>
|
|
69703
|
-
|
|
69704
|
-
<section class="christianity-player-side">
|
|
69705
|
-
<section class="christianity-battle-zone" [class.is-placing-card]="canPlaceSelectedCharacter() || isDraggingCharacter()" [attr.aria-label]="t('christianityYourBattle')">
|
|
69706
|
-
@for (slot of battleSlots('P1'); track slot.trackId) {
|
|
69707
|
-
@if (slot.card) {
|
|
69708
|
-
<button
|
|
69709
|
-
type="button"
|
|
69710
|
-
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-card-frame christianity-card-frame--battle"
|
|
69711
|
-
valLightRipple
|
|
69712
|
-
[class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
|
|
69713
|
-
[class.is-exhausted]="!slot.card.canAttack"
|
|
69714
|
-
(click)="selectAttacker(slot.card)"
|
|
69715
|
-
>
|
|
69716
|
-
<header class="christianity-card-frame-header">
|
|
69717
|
-
<small>{{ t('christianityCost') }} {{ cardDefinition(slot.card.cardId).cost }}</small>
|
|
69718
|
-
<strong>{{ slot.card.name }}</strong>
|
|
69719
|
-
<span>{{ cardDefinition(slot.card.cardId).cost }}</span>
|
|
69720
|
-
</header>
|
|
69721
|
-
<section class="christianity-card-frame-art">
|
|
69722
|
-
<span>{{ slot.card.name }}</span>
|
|
69723
|
-
<small>{{ t('christianityCharacterCard') }}</small>
|
|
69724
|
-
</section>
|
|
69725
|
-
<section class="christianity-card-frame-effect">
|
|
69726
|
-
<strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
|
|
69727
|
-
</section>
|
|
69728
|
-
</button>
|
|
69729
|
-
} @else {
|
|
69730
|
-
<button
|
|
69731
|
-
type="button"
|
|
69732
|
-
class="christianity-slot"
|
|
69733
|
-
cdkDropList
|
|
69734
|
-
[id]="battleSlotDropId($index)"
|
|
69735
|
-
[cdkDropListData]="$index"
|
|
69736
|
-
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
69737
|
-
[cdkDropListEnterPredicate]="canDropOnBattleSlot"
|
|
69738
|
-
[class.christianity-slot--play-target]="canPlaceSelectedCharacter() || isDraggingCharacter()"
|
|
69739
|
-
valLightRipple
|
|
69740
|
-
(cdkDropListDropped)="dropOnBattleSlot($event, $index)"
|
|
69741
|
-
(click)="playSelectedCard($index)"
|
|
69742
|
-
>
|
|
69743
|
-
@if (canPlaceSelectedCharacter() || isDraggingCharacter()) {
|
|
69744
|
-
<span>{{ t('christianityPlayHere') }}</span>
|
|
69745
|
-
}
|
|
69746
|
-
</button>
|
|
69747
|
-
}
|
|
69748
|
-
}
|
|
69749
|
-
</section>
|
|
69750
|
-
|
|
69751
|
-
<section class="christianity-player-rack">
|
|
69752
|
-
<div class="christianity-offerings-zone">
|
|
69753
|
-
<button
|
|
69754
|
-
type="button"
|
|
69755
|
-
class="christianity-offering-pile"
|
|
69756
|
-
cdkDropList
|
|
69757
|
-
id="christianity-offerings-drop"
|
|
69758
|
-
valLightRipple
|
|
69759
|
-
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
69760
|
-
[class.is-play-target]="canPlaceSelectedOffering() || isDraggingOffering()"
|
|
69761
|
-
[cdkDropListEnterPredicate]="canDropOnOfferings"
|
|
69762
|
-
(cdkDropListDropped)="dropOnOfferings($event)"
|
|
69763
|
-
(click)="handleOfferingPile('P1')"
|
|
69764
|
-
>
|
|
69765
|
-
<i aria-hidden="true"></i>
|
|
69766
|
-
<i aria-hidden="true"></i>
|
|
69767
|
-
<i aria-hidden="true"></i>
|
|
69768
|
-
<span>{{ t('christianityOfferings') }}</span>
|
|
69769
|
-
<strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
|
|
69770
|
-
</button>
|
|
69771
|
-
</div>
|
|
69772
|
-
<button type="button" class="christianity-leader-card christianity-card-frame christianity-card-frame--leader" valLightRipple (click)="inspectLeader('P1')">
|
|
69773
|
-
<header class="christianity-card-frame-header">
|
|
69774
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
69775
|
-
<strong>{{ player().leaderName }}</strong>
|
|
69776
|
-
<span>{{ player().leaderHp }}</span>
|
|
69777
|
-
</header>
|
|
69778
|
-
<section class="christianity-card-frame-art">
|
|
69779
|
-
<span>{{ player().leaderName }}</span>
|
|
69780
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
69781
|
-
</section>
|
|
69782
|
-
<section class="christianity-card-frame-effect">
|
|
69783
|
-
<strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
|
|
69784
|
-
</section>
|
|
69785
|
-
</button>
|
|
69786
|
-
<div class="christianity-player-command">
|
|
69787
|
-
<div class="christianity-player-badge">
|
|
69788
|
-
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
69789
|
-
<strong>{{ player().displayName }}</strong>
|
|
69790
|
-
</div>
|
|
69791
|
-
<button
|
|
69792
|
-
type="button"
|
|
69793
|
-
class="christianity-end-turn"
|
|
69794
|
-
(click)="endTurn()"
|
|
69795
|
-
>
|
|
69796
|
-
{{ t('christianityEndTurn') }}
|
|
69797
|
-
</button>
|
|
69798
|
-
</div>
|
|
69799
|
-
</section>
|
|
69800
|
-
</section>
|
|
69801
|
-
</section>
|
|
69802
|
-
|
|
69803
|
-
<section class="christianity-hand-shelf">
|
|
69804
|
-
<div class="christianity-hand-meter">
|
|
69805
|
-
<span>{{ t('christianityHand') }}</span>
|
|
69806
|
-
<strong>{{ player().hand?.length ?? 0 }}</strong>
|
|
69807
|
-
</div>
|
|
69808
|
-
<section
|
|
69809
|
-
class="christianity-hand-fan"
|
|
69810
|
-
cdkDropList
|
|
69811
|
-
id="christianity-hand-source"
|
|
69812
|
-
[cdkDropListConnectedTo]="dropTargetIds()"
|
|
69813
|
-
[attr.aria-label]="t('christianityYourHand')"
|
|
69814
|
-
(pointerleave)="clearHoveredHandIndex()"
|
|
69815
|
-
>
|
|
69816
|
-
@for (cardId of player().hand ?? []; track cardId + $index) {
|
|
69817
|
-
@let card = cardDefinition(cardId);
|
|
69818
|
-
<div
|
|
69819
|
-
class="christianity-hand-card-wrap"
|
|
69820
|
-
[class.is-selected]="selectedHandCard() === cardId"
|
|
69821
|
-
[class.is-dragging]="draggingCardId() === cardId"
|
|
69822
|
-
[style.z-index]="handCardZIndex($index)"
|
|
69823
|
-
[style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
|
|
69824
|
-
(pointerenter)="setHoveredHandIndex($index)"
|
|
69825
|
-
(pointerdown)="setHoveredHandIndex($index)"
|
|
69826
|
-
(pointerup)="releaseHoveredHand($event)"
|
|
69827
|
-
>
|
|
69828
|
-
<button
|
|
69829
|
-
type="button"
|
|
69830
|
-
class="christianity-card-preview-card christianity-card-preview-card--hand christianity-card-frame"
|
|
69831
|
-
cdkDrag
|
|
69832
|
-
valLightRipple
|
|
69833
|
-
[cdkDragData]="cardId"
|
|
69834
|
-
[cdkDragDisabled]="!canPlay(card)"
|
|
69835
|
-
[class.is-selected]="selectedHandCard() === cardId"
|
|
69836
|
-
[class.is-disabled]="!canPlay(card)"
|
|
69837
|
-
(cdkDragStarted)="startDraggingCard(cardId)"
|
|
69838
|
-
(cdkDragEnded)="endDraggingCard()"
|
|
69839
|
-
(click)="selectHandCard(cardId)"
|
|
69840
|
-
>
|
|
69841
|
-
<header class="christianity-card-frame-header">
|
|
69842
|
-
<small>{{ cardTypeLabel(card) }}</small>
|
|
69843
|
-
<strong>{{ card.name }}</strong>
|
|
69844
|
-
<span>{{ card.type === 'offering' ? '+' + card.life : card.cost }}</span>
|
|
69845
|
-
</header>
|
|
69846
|
-
<section class="christianity-card-frame-art">
|
|
69847
|
-
<span>{{ card.name }}</span>
|
|
69848
|
-
<small>{{ cardTypeLabel(card) }}</small>
|
|
69849
|
-
</section>
|
|
69850
|
-
<section class="christianity-card-frame-effect">
|
|
69851
|
-
<strong>
|
|
69852
|
-
@if (card.type === 'offering') {
|
|
69853
|
-
+{{ card.life }}
|
|
69854
|
-
} @else {
|
|
69855
|
-
{{ card.attack }} / {{ card.life }}
|
|
69856
|
-
}
|
|
69857
|
-
</strong>
|
|
69858
|
-
</section>
|
|
69859
|
-
<footer class="christianity-card-frame-footer">
|
|
69860
|
-
<span>{{ card.edition ?? 'MVP' }}</span>
|
|
69861
|
-
<span>{{ card.collectorNumber ?? card.id }}</span>
|
|
69862
|
-
</footer>
|
|
69863
|
-
</button>
|
|
69864
|
-
<button
|
|
69865
|
-
type="button"
|
|
69866
|
-
class="christianity-card-eye"
|
|
69867
|
-
[attr.aria-label]="t('christianityPreviewCard')"
|
|
69868
|
-
(click)="inspectHandCard(cardId, true); $event.stopPropagation()"
|
|
69869
|
-
></button>
|
|
69870
|
-
</div>
|
|
69871
|
-
}
|
|
69872
|
-
</section>
|
|
69873
|
-
</section>
|
|
69874
|
-
|
|
69875
|
-
@if (selectedPreview()) {
|
|
69876
|
-
<button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
|
|
69877
|
-
<aside
|
|
69878
|
-
class="christianity-floating-card-shell"
|
|
69879
|
-
aria-live="polite"
|
|
69880
|
-
>
|
|
69881
|
-
<button type="button" class="christianity-floating-card-close" (click)="closePreview()">
|
|
69882
|
-
{{ t('close') }}
|
|
69883
|
-
</button>
|
|
69884
|
-
<div
|
|
69885
|
-
class="christianity-floating-card"
|
|
69886
|
-
[style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
|
|
69887
|
-
[style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
|
|
69888
|
-
[style.--preview-shift-x]="previewTilt().shiftX + 'px'"
|
|
69889
|
-
[style.--preview-shift-y]="previewTilt().shiftY + 'px'"
|
|
69890
|
-
(pointermove)="tiltPreview($event)"
|
|
69891
|
-
(pointerleave)="resetPreviewTilt()"
|
|
69892
|
-
>
|
|
69893
|
-
@if (selectedPreviewCard(); as previewCard) {
|
|
69894
|
-
<header class="christianity-full-card-header">
|
|
69895
|
-
<span class="christianity-full-card-type-icon" aria-hidden="true"></span>
|
|
69896
|
-
<strong>{{ previewCard.name }}</strong>
|
|
69897
|
-
<span class="christianity-full-card-cost">{{ previewCard.type === 'offering' ? '+' + previewCard.life : previewCard.cost }}</span>
|
|
69898
|
-
</header>
|
|
69899
|
-
<section class="christianity-full-card-art" [class.has-image]="previewCard.imageUrl">
|
|
69900
|
-
@if (previewCard.imageUrl) {
|
|
69901
|
-
<img [src]="previewCard.imageUrl" [alt]="previewCard.name" />
|
|
69902
|
-
} @else {
|
|
69903
|
-
<span>{{ previewCard.name }}</span>
|
|
69904
|
-
}
|
|
69905
|
-
<small>{{ cardTypeLabel(previewCard) }}</small>
|
|
69906
|
-
</section>
|
|
69907
|
-
<section class="christianity-full-card-verse">
|
|
69908
|
-
<p>{{ previewCard.verseText ?? selectedPreview()?.body }}</p>
|
|
69909
|
-
@if (previewCard.scripture) {
|
|
69910
|
-
<strong>{{ previewCard.scripture }}</strong>
|
|
69911
|
-
}
|
|
69912
|
-
</section>
|
|
69913
|
-
<section class="christianity-full-card-effect">
|
|
69914
|
-
<div class="christianity-full-card-stats">
|
|
69915
|
-
@if (previewCard.type === 'character') {
|
|
69916
|
-
<strong>{{ previewCard.attack }}</strong>
|
|
69917
|
-
<strong>{{ previewCard.life }}</strong>
|
|
69918
|
-
} @else {
|
|
69919
|
-
<strong>+{{ previewCard.life }}</strong>
|
|
69920
|
-
}
|
|
69921
|
-
</div>
|
|
69922
|
-
<div>
|
|
69923
|
-
@if (previewCard.abilityName) {
|
|
69924
|
-
<strong>{{ previewCard.abilityName }}</strong>
|
|
69925
|
-
}
|
|
69926
|
-
<p>{{ previewCard.abilityText ?? selectedPreview()?.body }}</p>
|
|
69927
|
-
</div>
|
|
69928
|
-
<span
|
|
69929
|
-
class="christianity-full-card-rarity"
|
|
69930
|
-
[class.is-normal]="!previewCard.rarity || previewCard.rarity === 'normal'"
|
|
69931
|
-
[class.is-uncommon]="previewCard.rarity === 'uncommon'"
|
|
69932
|
-
[class.is-rare]="previewCard.rarity === 'rare'"
|
|
69933
|
-
[class.is-legendary]="previewCard.rarity === 'legendary'"
|
|
69934
|
-
aria-hidden="true"
|
|
69935
|
-
></span>
|
|
69936
|
-
</section>
|
|
69937
|
-
<footer class="christianity-full-card-footer">
|
|
69938
|
-
<span>{{ previewCard.edition ?? 'MVP' }}</span>
|
|
69939
|
-
<span>{{ previewCard.collectorNumber ?? previewCard.id }}</span>
|
|
69940
|
-
<span>{{ previewCard.year ?? '2026' }} CHRISTIANITY</span>
|
|
69941
|
-
<span>{{ previewCard.author ?? 'MVP' }}</span>
|
|
69942
|
-
</footer>
|
|
69943
|
-
} @else {
|
|
69944
|
-
<header class="christianity-full-card-header">
|
|
69945
|
-
<span class="christianity-full-card-type-icon" aria-hidden="true"></span>
|
|
69946
|
-
<strong>{{ selectedPreview()?.title }}</strong>
|
|
69947
|
-
<span class="christianity-full-card-cost">{{ selectedPreview()?.meta }}</span>
|
|
69948
|
-
</header>
|
|
69949
|
-
<section class="christianity-full-card-art">
|
|
69950
|
-
<span>{{ selectedPreview()?.title }}</span>
|
|
69951
|
-
<small>{{ selectedPreview()?.eyebrow }}</small>
|
|
69952
|
-
</section>
|
|
69953
|
-
<section class="christianity-full-card-verse">
|
|
69954
|
-
<p>{{ selectedPreview()?.body }}</p>
|
|
69955
|
-
</section>
|
|
69956
|
-
<section class="christianity-full-card-effect">
|
|
69957
|
-
<div class="christianity-full-card-stats">
|
|
69958
|
-
<strong>{{ selectedPreview()?.meta }}</strong>
|
|
69959
|
-
</div>
|
|
69960
|
-
<div>
|
|
69961
|
-
<strong>{{ selectedPreview()?.eyebrow }}</strong>
|
|
69962
|
-
<p>{{ selectedPreview()?.body }}</p>
|
|
69963
|
-
</div>
|
|
69964
|
-
<span class="christianity-full-card-rarity is-legendary" aria-hidden="true"></span>
|
|
69965
|
-
</section>
|
|
69966
|
-
<footer class="christianity-full-card-footer">
|
|
69967
|
-
<span>MVP</span>
|
|
69968
|
-
<span>{{ selectedPreview()?.eyebrow }}</span>
|
|
69969
|
-
<span>2026 CHRISTIANITY</span>
|
|
69970
|
-
<span>{{ selectedPreview()?.meta }}</span>
|
|
69971
|
-
</footer>
|
|
69972
|
-
}
|
|
69973
|
-
</div>
|
|
69974
|
-
@if (selectedPreview()?.source === 'hand') {
|
|
69975
|
-
<div class="christianity-floating-card-actions">
|
|
69976
|
-
<button type="button" [disabled]="previewActionDisabled()" (click)="playPreviewCard()">
|
|
69977
|
-
{{ selectedActionLabel() }}
|
|
69978
|
-
</button>
|
|
69979
|
-
</div>
|
|
69980
|
-
}
|
|
69981
|
-
</aside>
|
|
69982
|
-
}
|
|
69983
|
-
|
|
69984
|
-
@if (selectedInfo(); as info) {
|
|
69985
|
-
<button type="button" class="christianity-info-backdrop" [attr.aria-label]="t('close')" (click)="closeInfo()"></button>
|
|
69986
|
-
<aside class="christianity-info-panel" aria-live="polite">
|
|
69987
|
-
<button type="button" class="christianity-dialog-close christianity-info-close" (click)="closeInfo()">
|
|
69988
|
-
{{ t('close') }}
|
|
69989
|
-
</button>
|
|
69990
|
-
<div class="christianity-rule-note">
|
|
69991
|
-
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
69992
|
-
<div>
|
|
69993
|
-
<small>{{ info.eyebrow }}</small>
|
|
69994
|
-
<h2>{{ info.title }}</h2>
|
|
69995
|
-
<strong>{{ info.meta }}</strong>
|
|
69996
|
-
<p>{{ info.body }}</p>
|
|
69997
|
-
<ul>
|
|
69998
|
-
@for (fact of info.facts; track fact) {
|
|
69999
|
-
<li>{{ fact }}</li>
|
|
70000
|
-
}
|
|
70001
|
-
</ul>
|
|
70002
|
-
</div>
|
|
70003
|
-
</div>
|
|
70004
|
-
</aside>
|
|
70005
|
-
}
|
|
70006
|
-
|
|
70007
|
-
<section class="christianity-actions" aria-live="polite">
|
|
70008
|
-
<p>{{ statusText() }}</p>
|
|
70009
|
-
<div>
|
|
70010
|
-
<button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
|
|
70011
|
-
{{ selectedActionLabel() }}
|
|
70012
|
-
</button>
|
|
70013
|
-
<button type="button" (click)="resetMock()">
|
|
70014
|
-
{{ t('christianityReset') }}
|
|
70015
|
-
</button>
|
|
70016
|
-
</div>
|
|
70017
|
-
</section>
|
|
70018
|
-
|
|
70019
|
-
@if (showHistory()) {
|
|
70020
|
-
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
|
|
70021
|
-
<section class="christianity-history-drawer">
|
|
70022
|
-
<header>
|
|
70023
|
-
<h2>{{ t('christianityHistory') }}</h2>
|
|
70024
|
-
<div class="christianity-dialog-actions">
|
|
70025
|
-
<span>{{ game().historyZone.length }}</span>
|
|
70026
|
-
<button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
|
|
70027
|
-
{{ t('close') }}
|
|
70028
|
-
</button>
|
|
70029
|
-
</div>
|
|
70030
|
-
</header>
|
|
70031
|
-
@if (game().historyZone.length) {
|
|
70032
|
-
<div class="christianity-history-grid">
|
|
70033
|
-
@for (cardId of game().historyZone; track cardId + $index) {
|
|
70034
|
-
@let card = cardDefinition(cardId);
|
|
70035
|
-
<button type="button" class="christianity-card-preview-card christianity-card-frame christianity-card-frame--list" valLightRipple (click)="inspectHistoryCard(cardId)">
|
|
70036
|
-
<header class="christianity-card-frame-header">
|
|
70037
|
-
<small>{{ card.type === 'offering' ? t('christianityOfferingCard') : t('christianityCost') + ' ' + card.cost }}</small>
|
|
70038
|
-
<strong>{{ card.name }}</strong>
|
|
70039
|
-
<span>{{ card.type === 'offering' ? '+' + card.life : card.cost }}</span>
|
|
70040
|
-
</header>
|
|
70041
|
-
<section class="christianity-card-frame-art">
|
|
70042
|
-
<span>{{ card.name }}</span>
|
|
70043
|
-
<small>{{ cardTypeLabel(card) }}</small>
|
|
70044
|
-
</section>
|
|
70045
|
-
<section class="christianity-card-frame-effect">
|
|
70046
|
-
<strong>
|
|
70047
|
-
@if (card.type === 'offering') {
|
|
70048
|
-
+{{ card.life }}
|
|
70049
|
-
} @else {
|
|
70050
|
-
{{ card.attack }} / {{ card.life }}
|
|
70051
|
-
}
|
|
70052
|
-
</strong>
|
|
70053
|
-
</section>
|
|
70054
|
-
</button>
|
|
70055
|
-
}
|
|
70056
|
-
</div>
|
|
70057
|
-
} @else {
|
|
70058
|
-
<p>{{ t('christianityHistoryEmpty') }}</p>
|
|
70059
|
-
}
|
|
70060
|
-
</section>
|
|
70061
|
-
}
|
|
70062
|
-
|
|
70063
|
-
@if (offeringsSeat()) {
|
|
70064
|
-
@let offeringPlayer = game().players[offeringsSeat()!];
|
|
70065
|
-
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
|
|
70066
|
-
<section class="christianity-history-drawer christianity-offerings-drawer">
|
|
70067
|
-
<header>
|
|
70068
|
-
<h2>{{ t('christianityOfferings') }}</h2>
|
|
70069
|
-
<div class="christianity-dialog-actions">
|
|
70070
|
-
<span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
|
|
70071
|
-
<button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
|
|
70072
|
-
{{ t('close') }}
|
|
70073
|
-
</button>
|
|
70074
|
-
</div>
|
|
70075
|
-
</header>
|
|
70076
|
-
<div class="christianity-offerings-note">
|
|
70077
|
-
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
70078
|
-
<p>{{ t('christianityOfferingsRuleBody') }}</p>
|
|
70079
|
-
</div>
|
|
70080
|
-
<div class="christianity-offering-list">
|
|
70081
|
-
@for (offering of offeringPlayer.offerings; track offering.instanceId) {
|
|
70082
|
-
<article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
|
|
70083
|
-
<button type="button" class="christianity-offering-card" valLightRipple (click)="inspectOffering(offering)">
|
|
70084
|
-
<small>{{ t('christianityOfferingCard') }}</small>
|
|
70085
|
-
<strong>{{ offering.name }}</strong>
|
|
70086
|
-
<span>+{{ offering.value }}</span>
|
|
70087
|
-
<em>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</em>
|
|
70088
|
-
</button>
|
|
70089
|
-
<div>
|
|
70090
|
-
<strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
|
|
70091
|
-
<p>{{ offering.abilityText || t('christianityOfferingNoAbility') }}</p>
|
|
70092
|
-
@if (offering.abilityName) {
|
|
70093
|
-
<button
|
|
70094
|
-
type="button"
|
|
70095
|
-
[disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
|
|
70096
|
-
(click)="useOfferingAbility(offering, offeringsSeat()!)"
|
|
70097
|
-
>
|
|
70098
|
-
{{ t('christianityUseAbility') }}
|
|
70099
|
-
</button>
|
|
70100
|
-
}
|
|
70101
|
-
</div>
|
|
70102
|
-
</article>
|
|
70103
|
-
}
|
|
70104
|
-
</div>
|
|
70105
|
-
</section>
|
|
70106
|
-
}
|
|
70107
|
-
</main>
|
|
70108
|
-
`, isInline: true, styles: [":host{--christianity-theme-ink: var(--val-text-color, #1f2933);--christianity-theme-surface: #ffffff;--christianity-theme-parchment: #fffaf0;--christianity-theme-olive: #5f6f2a;--christianity-theme-gold: #d6a21d;--christianity-theme-gold-soft: rgba(214, 162, 29, .18);--christianity-theme-gold-ring: rgba(214, 162, 29, .48);--christianity-theme-glow: rgba(245, 199, 85, .32);--christianity-theme-focus: #2563eb;--christianity-theme-shadow: rgba(82, 64, 28, .18);--christianity-theme-shadow-strong: rgba(82, 64, 28, .3);--christianity-card-aspect: 5 / 7.45;--christianity-card-back: linear-gradient(135deg, rgba(16, 42, 67, .16), rgba(16, 42, 67, .03)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);--christianity-card-back-soft: linear-gradient(135deg, rgba(16, 42, 67, .11), rgba(16, 42, 67, .02)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);display:block;max-width:100%;min-width:0;overflow-x:clip;color:var(--christianity-theme-ink)}.christianity-shell{box-sizing:border-box;display:grid;gap:.65rem;width:100%;max-width:100%;min-width:0;padding:.75rem .25rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb;overflow-x:clip;overflow-y:visible}.christianity-header,.christianity-match-strip,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-header h1,.christianity-header p,.christianity-match-player strong,.christianity-match-player small,.christianity-scoreboard span,.christianity-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header p,.christianity-turn span,.christianity-offerings span,.christianity-hidden-hand span,.christianity-deck span,.christianity-place span,.christianity-pile span,.christianity-leader span{color:#1f2933a3;font-size:.75rem}.christianity-turn,.christianity-leader,.christianity-offerings,.christianity-hidden-hand,.christianity-pile,.christianity-deck,.christianity-place{display:grid;gap:.15rem;min-width:5.25rem;padding:.55rem .65rem;border:1px solid rgba(36,48,68,.12);border-radius:.5rem;background:#fff}.christianity-turn.is-own-turn{border-color:#12806c59;background:#ecfdf5}.christianity-match-strip{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);padding:.45rem;border:1px solid rgba(36,48,68,.1);border-radius:.75rem;background:#fff}.christianity-match-player{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.5rem;align-items:center;min-width:0}.christianity-match-player--opponent{direction:rtl}.christianity-match-player--opponent div{direction:ltr;text-align:right}.christianity-match-player div{display:grid;min-width:0}.christianity-match-player strong,.christianity-match-player small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-match-player small,.christianity-scoreboard span{color:#1f293394;font-size:.72rem}.christianity-scoreboard{display:grid;justify-items:center;min-width:4.2rem;padding:0 .55rem;border-right:1px solid rgba(36,48,68,.1);border-left:1px solid rgba(36,48,68,.1)}.christianity-scoreboard strong{font-size:1.2rem;line-height:1}.christianity-table{box-sizing:border-box;display:grid;gap:.45rem;width:100%;max-width:100%;min-width:0;padding:.45rem .35rem;border-radius:.75rem;background:#dceafb;overflow-x:clip;overflow-y:visible}.christianity-player-side{box-sizing:border-box;display:grid;gap:.35rem;width:100%;max-width:100%;min-width:0;padding:.35rem .3rem;border-radius:.7rem;background:#ffffff57;grid-template-rows:minmax(7rem,1fr) auto;min-height:13.75rem}.christianity-player-side--opponent{grid-template-rows:auto minmax(7rem,1fr)}.christianity-player{display:grid;gap:.65rem}.christianity-battle-zone{--christianity-battle-card-width: clamp(4.8rem, 15vw, 6.6rem);box-sizing:border-box;display:grid;grid-template-columns:repeat(4,var(--christianity-battle-card-width));gap:.5rem;align-items:center;justify-content:center;width:100%;max-width:100%;min-width:0;min-height:clamp(9.1rem,29vw,11rem);padding:.55rem .4rem;border-radius:.75rem;background:#ffffffc2;transition:background .16s ease,box-shadow .16s ease}.christianity-battle-zone.is-placing-card{background:linear-gradient(180deg,#fffaf0f5,#ffffffd6),#ffffffc2;box-shadow:inset 0 0 0 .14rem var(--christianity-theme-gold-soft),0 .8rem 1.7rem #5f6f2a1f}.christianity-shared-zone{padding:.55rem .4rem;border-radius:.75rem;background:#ffffffe6}.christianity-card,.christianity-end-turn,.christianity-actions button,.christianity-pile,.christianity-leader--target{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card{display:grid;align-content:space-between;min-height:5.8rem;padding:.5rem;text-align:left;box-shadow:0 .5rem 1.25rem #24304414}.christianity-card span{font-weight:700}.christianity-card strong{justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-card.is-selected{border-color:var(--christianity-theme-gold);box-shadow:0 0 0 .18rem var(--christianity-theme-gold-soft),0 .85rem 1.4rem var(--christianity-theme-shadow)}.christianity-card.is-disabled,.christianity-card.is-exhausted{opacity:.55}.christianity-card.is-target{border-color:#dc2626}.christianity-offering-cards{display:grid;grid-auto-flow:column;grid-auto-columns:.7rem;gap:.16rem;align-items:end;min-height:1.05rem}.christianity-offering-cards i{display:block;width:.65rem;height:.95rem;border:1px solid rgba(16,42,67,.22);border-radius:.18rem;background:#f8fafc}.christianity-offering-cards i.is-used{background:#cbd5e1;transform:rotate(90deg);transform-origin:center}.christianity-slot{display:grid;place-items:center;justify-self:center;width:var(--christianity-battle-card-width);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);border:1px dashed rgba(36,48,68,.22);border-radius:.5rem;background:#ffffff73;color:inherit;font:inherit}.christianity-slot--play-target{position:relative;border-color:var(--christianity-theme-gold-ring);background:linear-gradient(180deg,#fffaf0eb,#f8fafcd1),#ffffffb3;color:#5d4305;font-weight:800;overflow:hidden;box-shadow:inset 0 0 0 .12rem #d6a21d33,0 .7rem 1.25rem var(--christianity-theme-shadow);animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-slot--play-target:before{content:\"\";position:absolute;inset:.35rem;border:1px solid rgba(214,162,29,.22);border-radius:.4rem;background:linear-gradient(135deg,rgba(214,162,29,.1),transparent 46%),radial-gradient(circle at 50% 42%,var(--christianity-theme-glow),transparent 58%)}.christianity-slot--play-target span{position:relative;z-index:2;padding:.16rem .44rem;border-radius:999px;background:#ffffffc7;font-size:.78rem}@keyframes christianity-target-pulse{0%,to{box-shadow:inset 0 0 0 .12rem #d6a21d33,0 .7rem 1.25rem var(--christianity-theme-shadow)}50%{box-shadow:inset 0 0 0 .16rem #d6a21d57,0 .9rem 1.65rem var(--christianity-theme-shadow-strong)}}.christianity-hand{display:grid;grid-auto-columns:minmax(6rem,8rem);grid-auto-flow:column;gap:.55rem;overflow-x:auto;padding-bottom:.25rem}.christianity-actions{align-items:flex-start;padding:.75rem;border-radius:.75rem;background:#fff}.christianity-actions div{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.christianity-actions button,.christianity-end-turn{min-height:2.4rem;padding:0 .75rem;font-weight:700}.christianity-actions button:not(:disabled),.christianity-end-turn{background:#102a43;color:#fff}.christianity-history{padding:.75rem;border-radius:.75rem;background:#fff}.christianity-hand-fan{position:relative;display:flex;justify-content:center;min-height:10.8rem;padding:.25rem .25rem 2.1rem;isolation:isolate;overflow:visible}.christianity-hand-shelf{position:relative;display:grid;z-index:12;min-height:12rem;margin-top:-1.15rem;padding:1.45rem .25rem 1rem;overflow:visible}.christianity-hand-shelf--opponent{z-index:8;min-height:6.85rem;margin-top:0;margin-bottom:0;padding:.45rem .25rem .85rem}.christianity-hand-fan--opponent{min-height:5.9rem;padding-bottom:.75rem;align-items:start}.christianity-hand-fan--opponent .christianity-card-frame--back{width:clamp(3.7rem,12vw,4.9rem);margin-inline:-.9rem;transform-origin:50% 120%}.christianity-hand-fan--opponent .christianity-card-frame--back:first-child{margin-left:0}.christianity-hand-fan--opponent .christianity-card-frame--back:last-child{margin-right:0}.christianity-card-preview-card,.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile,.christianity-end-turn{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card-preview-card{display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;gap:.28rem;align-content:stretch;width:clamp(4.9rem,17vw,7.1rem);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);padding:.48rem;text-align:left;transform-origin:50% 115%;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;box-shadow:0 .5rem 1.25rem #2430441a}.christianity-card-frame{position:relative;display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;gap:.28rem;align-content:stretch;overflow:hidden;padding:.48rem;text-align:left;background:linear-gradient(180deg,#fffffffa,#f8fafcfa),radial-gradient(circle at 15% 0%,rgba(214,162,29,.12),transparent 44%);box-shadow:0 .5rem 1.25rem #2430441a,inset 0 0 0 .18rem #ffffff9e}.christianity-card-frame-header{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.16rem;align-items:start;min-width:0}.christianity-card-frame-header small{grid-column:1;min-width:0;overflow:hidden;color:#1f2933a3;font-size:clamp(.52rem,1.5vw,.68rem);line-height:1;text-overflow:ellipsis;white-space:nowrap}.christianity-card-frame-header strong{grid-column:1;justify-self:start;align-self:start;min-width:0;padding:0;overflow:hidden;border-radius:0;background:transparent;font-size:clamp(.82rem,2.5vw,1.05rem);line-height:1.02;text-overflow:ellipsis;white-space:nowrap}.christianity-card-preview-card--hand .christianity-card-frame-header strong,.christianity-card-preview-card--battle .christianity-card-frame-header strong,.christianity-leader-card .christianity-card-frame-header strong{display:-webkit-box;overflow-wrap:anywhere;text-overflow:clip;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2}.christianity-card-preview-card--hand .christianity-card-frame-header small{text-transform:uppercase}.christianity-card-preview-card--hand .christianity-card-frame-art>span{display:-webkit-box;max-width:88%;overflow-wrap:anywhere;text-overflow:clip;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2}.christianity-card-frame-header span{grid-column:2;grid-row:1 / span 2;display:grid;place-items:center;min-width:1.3rem;height:1.3rem;padding:0 .22rem;border-radius:999px;background:#ffd91a;color:#243044;font-size:.8rem;font-weight:900;line-height:1;box-shadow:inset 0 -.08rem #52401c2e}.christianity-card-frame-art{position:relative;display:grid;place-items:center;min-height:0;overflow:hidden;border-radius:.36rem;background:linear-gradient(135deg,#5f6f2a2e,#d6a21d24),radial-gradient(circle at 50% 18%,rgba(255,255,255,.72),transparent 48%),#dbe7ef;box-shadow:inset 0 0 0 1px #24304414}.christianity-card-frame-art>span{max-width:78%;overflow:hidden;color:#2430447a;font-size:clamp(.82rem,2.2vw,1.05rem);font-weight:900;line-height:1.02;text-align:center;text-overflow:ellipsis}.christianity-card-frame-art small{position:absolute;right:0;bottom:.28rem;max-width:78%;padding:.1rem .34rem;overflow:hidden;border-radius:999px 0 0 999px;background:#ffffffe6;color:#1f2933a8;font-size:.48rem;font-style:italic;font-weight:900;line-height:1;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.christianity-card-frame-effect{display:grid;align-content:center;gap:.1rem;min-height:1.45rem;padding:.24rem;overflow:hidden;border-radius:.34rem;background:radial-gradient(circle at 50% 70%,rgba(36,48,68,.06),transparent 44%),#ffffffdb}.christianity-card-frame-effect strong{justify-self:end;align-self:end;padding:.12rem .32rem;border-radius:999px;background:#edf2f7;font-size:clamp(.66rem,2vw,.82rem);line-height:1.05}.christianity-card-frame-effect p{margin:0;overflow:hidden;color:#1f2933b8;font-size:.58rem;line-height:1.1;text-overflow:ellipsis;white-space:nowrap}.christianity-card-frame-footer{display:flex;justify-content:space-between;gap:.22rem;color:#1f293385;font-size:.46rem;font-weight:800;line-height:1}.christianity-card-frame--battle{gap:.22rem;padding:.42rem}.christianity-card-frame--battle .christianity-card-frame-art{min-height:2.6rem}.christianity-card-frame--leader .christianity-card-frame-art{background:linear-gradient(135deg,#2563eb24,#d6a21d29),radial-gradient(circle at 50% 18%,rgba(255,255,255,.78),transparent 48%),#e7eef8}.christianity-card-frame--list{width:clamp(4.4rem,22vw,5.8rem);padding:.38rem}.christianity-card-frame--list .christianity-card-frame-art{min-height:2.5rem}.christianity-hand-card-wrap{position:relative;display:grid;justify-items:center;flex:0 0 auto;margin-inline:-.42rem;padding-bottom:2rem;transform-origin:50% 115%;transition:transform .16s ease,filter .16s ease}.christianity-hand-card-wrap:hover,.christianity-hand-card-wrap.is-selected,.christianity-hand-card-wrap.is-dragging{z-index:3}.christianity-hand-card-wrap:hover .christianity-card-preview-card--hand,.christianity-hand-card-wrap.is-selected .christianity-card-preview-card--hand,.christianity-hand-card-wrap.is-dragging .christianity-card-preview-card--hand{border-color:var(--christianity-theme-gold);box-shadow:0 0 0 .12rem var(--christianity-theme-gold-soft),0 1rem 2rem var(--christianity-theme-shadow)}.christianity-card-preview-card--hand{touch-action:none}.christianity-card-preview-card--hand.cdk-drag-disabled{cursor:not-allowed}.christianity-card-preview-card.cdk-drag-preview{width:clamp(4.9rem,17vw,7.1rem);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);border:1px solid var(--christianity-theme-gold-ring);box-shadow:0 0 0 .16rem #fff4c2ad,0 1.5rem 3rem var(--christianity-theme-shadow-strong);transform:rotate(2deg) scale(1.03)}.christianity-card-preview-card.cdk-drag-placeholder{width:clamp(4.9rem,17vw,7.1rem);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);opacity:.22}.christianity-slot.cdk-drop-list-dragging,.christianity-offering-pile.cdk-drop-list-dragging{border-color:var(--christianity-theme-gold-ring)}.christianity-slot.cdk-drop-list-receiving,.christianity-offering-pile.cdk-drop-list-receiving{box-shadow:inset 0 0 0 .18rem #d6a21d57,0 1rem 1.9rem var(--christianity-theme-shadow-strong)}.christianity-card-eye{position:absolute;right:50%;bottom:.38rem;width:2.15rem;height:1.55rem;border:1px solid color-mix(in srgb,var(--christianity-theme-focus) 52%,transparent);border-radius:999px;background:#fffffff0;box-shadow:0 .55rem 1.1rem #102a4324;opacity:0;transform:translate(50%,-.2rem) scale(.92);transition:opacity .14s ease,transform .14s ease,border-color .14s ease}.christianity-card-eye:before{content:\"\";position:absolute;top:50%;left:50%;width:1.1rem;height:1.1rem;border:.12rem solid var(--christianity-theme-focus);border-radius:82% 0;background:#fffffff0;transform:translate(-50%,-50%) rotate(45deg)}.christianity-card-eye:after{content:\"\";position:absolute;top:50%;left:50%;width:.42rem;height:.42rem;border:.09rem solid rgba(255,255,255,.95);border-radius:999px;background:radial-gradient(circle at 35% 32%,#ffffff 0 .06rem,transparent .07rem),var(--christianity-theme-focus);transform:translate(-50%,-50%)}.christianity-hand-card-wrap:hover .christianity-card-eye,.christianity-hand-card-wrap.is-selected .christianity-card-eye,.christianity-card-eye:focus-visible{opacity:1;transform:translate(50%) scale(1)}.christianity-offering-pile.is-play-target{border-color:var(--christianity-theme-gold-ring);background:linear-gradient(180deg,#fffaf0f5,#fffffff0),radial-gradient(circle at 82% 14%,rgba(250,204,21,.28) 0 .7rem,transparent .72rem);box-shadow:inset 0 0 0 .12rem #d6a21d3d,0 .8rem 1.55rem var(--christianity-theme-shadow);animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-card-frame--back,.christianity-card-preview-card--back{width:clamp(4rem,14vw,5.7rem);min-height:0;aspect-ratio:var(--christianity-card-aspect);place-items:center;padding:.55rem;overflow:hidden;box-shadow:0 .8rem 1.55rem #24304424;transform-origin:50% -18%;background:var(--christianity-card-back)}.christianity-card-frame--back:before,.christianity-card-preview-card--back:before{content:\"\";position:absolute;inset:.5rem;border:1px solid rgba(16,42,67,.12);border-radius:.38rem;background:linear-gradient(180deg,#ffffff2e,#ffffff0a);box-shadow:inset 0 0 0 .12rem #ffffff1f}.christianity-card-preview-card--battle{justify-self:center;width:var(--christianity-battle-card-width);min-width:0;height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);margin-inline:0}.christianity-card-preview-card>span,.christianity-card-mini>span,.christianity-offering-pile>span,.christianity-offering-card>span,.christianity-leader-card>span,.christianity-zone-card>span,.christianity-zone-pile>span{position:relative;z-index:2;align-self:start;font-weight:700;line-height:1.05}.christianity-card-preview-card>strong,.christianity-card-mini>strong,.christianity-offering-pile>strong,.christianity-offering-card>strong,.christianity-leader-card>strong,.christianity-zone-card>strong,.christianity-zone-pile>strong{position:relative;z-index:3;justify-self:end;align-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-player-rack{box-sizing:border-box;display:grid;grid-template-columns:minmax(5.9rem,7rem) minmax(5rem,1fr) minmax(4.2rem,7rem);gap:.45rem;align-items:end;justify-items:stretch;width:100%;max-width:100%;min-width:0}.christianity-player-rack--opponent{align-items:start}.christianity-hand-meter{position:absolute;top:0;right:.35rem;z-index:4;display:inline-grid;grid-auto-flow:column;gap:.25rem;align-items:center;min-height:1.7rem;padding:.18rem .46rem;border:1px solid rgba(36,48,68,.12);border-radius:999px;background:#ffffffe6;box-shadow:0 .35rem .8rem #102a4314}.christianity-hand-meter--opponent{top:.15rem}.christianity-hand-meter span{color:#1f293394;font-size:.68rem}.christianity-hand-meter strong{font-size:.86rem}.christianity-player-badge,.christianity-player-command{display:grid;gap:.35rem;justify-items:center;min-width:0}.christianity-player-badge{align-content:start;color:#1f2933c2;font-size:.74rem}.christianity-player-badge--opponent{justify-self:center;grid-auto-flow:column;align-items:center;justify-content:center}.christianity-player-badge strong{max-width:6.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-avatar{display:grid;place-items:center;width:1.85rem;height:1.85rem;border-radius:999px;color:#fff;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .9rem #102a4329}.christianity-offerings-zone{display:flex;flex-wrap:wrap;gap:.25rem;justify-content:flex-start;justify-self:start;width:100%}.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile{display:grid;align-content:space-between;min-height:4.9rem;padding:.48rem;text-align:left}.christianity-card-frame{display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;align-content:stretch}.christianity-offering-pile,.christianity-zone-card,.christianity-zone-pile{grid-template-rows:auto minmax(2.6rem,1fr) auto;align-content:stretch;gap:.32rem}.christianity-card-mini{width:3.5rem}.christianity-offering-pile{position:relative;isolation:isolate;overflow:hidden;justify-self:start;width:min(100%,5.9rem);min-height:7.1rem;padding:.95rem .52rem .6rem;background:linear-gradient(180deg,#fff,#f8fafc),linear-gradient(135deg,rgba(250,204,21,.18),transparent 42%)}.christianity-offering-pile i{position:absolute;top:2.45rem;left:.72rem;z-index:-1;width:2.55rem;height:3.55rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:linear-gradient(180deg,#ffffffeb,#f1f5f9eb),radial-gradient(circle at 78% 18%,#facc15 0 .38rem,transparent .4rem);box-shadow:0 .35rem .85rem #102a431a;transform:rotate(-5deg)}.christianity-offering-pile i:nth-child(2){transform:translate(.28rem,.08rem) rotate(3deg)}.christianity-offering-pile i:nth-child(3){transform:translate(.55rem,.18rem) rotate(-1deg)}.christianity-leader-card{align-self:center;justify-self:center;width:clamp(4.75rem,17vw,6rem);min-height:0;aspect-ratio:var(--christianity-card-aspect)}.christianity-rack-spacer{display:block;min-height:1px}.christianity-battle-zone{grid-template-columns:repeat(4,var(--christianity-battle-card-width))}.christianity-shared-zone{box-sizing:border-box;display:grid;grid-template-columns:repeat(3,minmax(4.3rem,1fr));align-items:stretch;width:100%;max-width:100%;min-width:0}.christianity-zone-card,.christianity-zone-pile{min-height:6.45rem;padding:.7rem .52rem .55rem}.christianity-zone-pile{position:relative;isolation:isolate;overflow:hidden;box-shadow:inset 0 0 0 999px #ffffff1f}.christianity-zone-pile i{position:absolute;top:2.2rem;right:.72rem;z-index:-1;width:2.7rem;height:3.7rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:#f8fafc;box-shadow:0 .35rem .85rem #102a431c;transform:rotate(4deg)}.christianity-zone-pile i:nth-child(2){transform:translate(-.28rem,.12rem) rotate(-3deg)}.christianity-zone-pile i:nth-child(3){background:var(--christianity-card-back);transform:translate(-.54rem,.24rem) rotate(2deg)}.christianity-floating-card-shell{position:fixed;top:50%;left:50%;z-index:80;display:grid;gap:.55rem;width:min(26rem,calc(100vw - 1.25rem));padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-floating-card{position:relative;z-index:1;display:grid;grid-template-rows:auto minmax(9rem,1.25fr) auto minmax(7rem,.9fr) auto;gap:.58rem;width:100%;min-height:min(29rem,calc(100vh - 3.5rem));padding:.72rem;border:1px solid rgba(36,48,68,.18);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,var(--christianity-theme-gold-soft),transparent 45%);box-shadow:0 0 0 .18rem #fff4c294,0 0 2.2rem var(--christianity-theme-glow),0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c;touch-action:none;transform:translate(var(--preview-shift-x, 0px),var(--preview-shift-y, 0px)) perspective(48rem) rotateX(var(--preview-rotate-x, 5deg)) rotateY(var(--preview-rotate-y, -5deg));transition:transform 90ms ease-out}.christianity-full-card-header{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:.42rem;align-items:center}.christianity-full-card-header strong{min-width:0;display:-webkit-box;overflow:hidden;overflow-wrap:anywhere;text-overflow:clip;-webkit-box-orient:vertical;-webkit-line-clamp:2;font-size:clamp(1.25rem,5vw,1.85rem);line-height:1.04}.christianity-full-card-type-icon,.christianity-full-card-cost{display:grid;place-items:center;border-radius:999px}.christianity-full-card-type-icon{width:1.6rem;height:1.6rem;background:radial-gradient(circle at 50% 50%,rgba(95,111,42,.72) 0 .22rem,transparent .24rem),#2430441a}.christianity-full-card-cost{min-width:2.1rem;height:2.1rem;padding:0 .36rem;background:#ffd91a;color:#243044;font-size:1.1rem;font-weight:900;box-shadow:inset 0 -.12rem #52401c2e}.christianity-full-card-art{position:relative;display:grid;place-items:center;min-height:9rem;overflow:hidden;border-radius:.48rem;background:linear-gradient(135deg,#5f6f2a33,#d6a21d29),radial-gradient(circle at 50% 25%,rgba(255,255,255,.76),transparent 42%),#dbe7ef;box-shadow:inset 0 0 0 1px #24304414}.christianity-full-card-art img{width:100%;height:100%;object-fit:cover}.christianity-full-card-art>span{max-width:80%;color:#24304494;font-size:clamp(1.1rem,5vw,1.8rem);font-weight:900;line-height:1.05;text-align:center}.christianity-full-card-art small{position:absolute;right:0;bottom:.55rem;min-width:5rem;padding:.16rem .48rem;border-radius:999px 0 0 999px;background:#ffffffe6;box-shadow:0 .3rem .8rem #102a431f;color:#1f2933bd;font-size:.68rem;font-style:italic;font-weight:900;text-align:center;text-transform:uppercase}.christianity-full-card-verse,.christianity-full-card-effect{display:grid;gap:.32rem}.christianity-full-card-verse p,.christianity-full-card-effect p{margin:0;line-height:1.25}.christianity-full-card-verse{color:#171923;font-family:Georgia,Times New Roman,serif;font-size:clamp(.72rem,2.7vw,.86rem)}.christianity-full-card-verse strong{font-family:inherit;font-size:.78rem;font-weight:900}.christianity-full-card-effect{position:relative;align-content:start;min-height:7rem;padding:.6rem .7rem;overflow:hidden;border-radius:.45rem;background:radial-gradient(circle at 50% 72%,rgba(36,48,68,.07),transparent 34%),#ffffffdb}.christianity-full-card-stats{display:flex;gap:1rem;min-height:1.35rem}.christianity-full-card-stats strong{font-size:1rem;line-height:1}.christianity-full-card-effect>div:last-of-type{display:grid;gap:.12rem}.christianity-full-card-effect>div:last-of-type strong{font-size:.82rem}.christianity-full-card-effect p{font-size:clamp(.78rem,2.9vw,.92rem)}.christianity-full-card-rarity{position:absolute;top:.62rem;right:.62rem;width:.46rem;height:.46rem;border-radius:.12rem;transform:rotate(45deg)}.christianity-full-card-rarity.is-normal{background:#d1d5db}.christianity-full-card-rarity.is-uncommon{background:#22c55e}.christianity-full-card-rarity.is-rare{background:#3b82f6}.christianity-full-card-rarity.is-legendary{background:#eab308}.christianity-full-card-footer{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;gap:.34rem;align-items:center;color:#1f2933ad;font-size:.58rem;line-height:1;text-transform:uppercase}.christianity-full-card-footer span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-floating-card-close{position:absolute;top:0;right:.15rem;z-index:4;min-height:2rem;padding:0 .6rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#ffffffe6;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .45rem 1rem #102a431a}.christianity-preview-backdrop,.christianity-history-backdrop,.christianity-info-backdrop{position:fixed;inset:0;border:0;border-radius:0;background:#0f172a75}.christianity-preview-backdrop{z-index:79}.christianity-info-backdrop{z-index:50}.christianity-info-panel{position:fixed;top:50%;left:50%;z-index:51;width:min(31rem,calc(100vw - 1.25rem));max-height:min(34rem,calc(100vh - 2rem));padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-info-close{position:absolute;top:0;right:.15rem;z-index:2}.christianity-rule-note{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.85rem;max-height:inherit;padding:1rem;overflow-y:auto;border:1px solid rgba(36,48,68,.14);border-radius:.9rem;background:linear-gradient(180deg,#fffffff7,#f8fafcf7),radial-gradient(circle at 8% 0%,rgba(37,99,235,.1),transparent 38%);box-shadow:0 1.2rem 2.6rem #102a433d,inset 0 0 0 .25rem #ffffff85}.christianity-rule-note-icon{display:grid;place-items:center;width:2.1rem;height:2.1rem;border-radius:999px;background:color-mix(in srgb,var(--christianity-theme-focus) 12%,#ffffff);color:var(--christianity-theme-focus);font-size:1rem;font-weight:900;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--christianity-theme-focus) 24%,transparent)}.christianity-rule-note small,.christianity-rule-note strong,.christianity-rule-note p,.christianity-rule-note h2{margin:0}.christianity-rule-note small{color:#1f29339e;font-size:.78rem;font-weight:800;text-transform:uppercase}.christianity-rule-note h2{margin-top:.18rem;font-size:clamp(1.5rem,7vw,2.2rem);line-height:1.05}.christianity-rule-note strong{display:inline-flex;width:fit-content;margin-top:.55rem;padding:.22rem .55rem;border-radius:999px;background:#edf2f7;font-size:.92rem}.christianity-rule-note p{margin-top:.75rem;color:#1f2933c7;line-height:1.45}.christianity-rule-note ul{display:grid;gap:.45rem;margin:.8rem 0 0;padding-left:1.05rem;color:#1f2933c7;line-height:1.35}.christianity-floating-card>small,.christianity-floating-card>span{color:#1f2933a3}.christianity-floating-card>strong{font-size:clamp(1.55rem,8vw,2.35rem);line-height:1.05}.christianity-floating-card>p{margin:0;align-self:end;font-size:.95rem;line-height:1.35}.christianity-floating-card-actions{position:relative;z-index:4;display:flex;justify-content:center;padding:0 .35rem;transform:translateZ(0)}.christianity-floating-card-actions button{min-height:2.35rem;padding:0 1rem;border:0;border-radius:999px;background:#102a43;color:#fff;font:inherit;font-size:.9rem;font-weight:800;box-shadow:0 .65rem 1.3rem #102a432e}.christianity-floating-card-actions button:disabled{cursor:not-allowed;opacity:.45}@media (min-width: 52rem){.christianity-floating-card-shell{width:min(29rem,calc(100vw - 3rem))}.christianity-floating-card{min-height:min(35rem,calc(100vh - 4rem));padding:1.35rem}}.christianity-history-backdrop{z-index:40}.christianity-history-drawer{position:fixed;right:auto;bottom:max(.5rem,env(safe-area-inset-bottom));left:50%;z-index:41;display:grid;grid-template-rows:auto minmax(0,1fr);gap:.75rem;width:min(calc(100vw - 1rem),44rem);min-height:min(18rem,calc(100dvh - 1rem));max-height:min(32rem,calc(100dvh - 2rem));padding:.8rem;border:1px solid rgba(36,48,68,.16);border-radius:.75rem;background:#fffffffa;box-shadow:0 1.5rem 4rem #102a4347;transform:translate(-50%)}.christianity-history-drawer header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-history-drawer h2,.christianity-history-drawer p{margin:0}.christianity-history-drawer header span{display:grid;place-items:center;min-width:1.85rem;height:1.85rem;border-radius:999px;background:#edf2f7;font-weight:800}.christianity-dialog-actions{display:flex;align-items:center;gap:.45rem}.christianity-dialog-close{min-height:1.85rem;padding:0 .62rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#fff;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .8rem #102a4314}.christianity-history-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.4rem,1fr));gap:.55rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem .1rem .25rem}.christianity-history-grid::-webkit-scrollbar,.christianity-offering-list::-webkit-scrollbar{width:.65rem}.christianity-history-grid::-webkit-scrollbar-track,.christianity-offering-list::-webkit-scrollbar-track{border-radius:999px;background:#e2e8f0b8}.christianity-history-grid::-webkit-scrollbar-thumb,.christianity-offering-list::-webkit-scrollbar-thumb{border:.14rem solid rgba(226,232,240,.72);border-radius:999px;background:#24304452}.christianity-offerings-drawer{grid-template-rows:auto auto minmax(0,1fr);width:min(calc(100vw - 1rem),48rem);min-height:min(20rem,calc(100dvh - 1rem));max-height:min(34rem,calc(100dvh - 2rem))}.christianity-offerings-note{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.65rem;align-items:start;padding:.72rem .8rem;border:1px solid rgba(36,48,68,.12);border-radius:.7rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 8% 0%,rgba(214,162,29,.12),transparent 42%)}.christianity-offerings-note p{margin:0;color:#1f2933c2;font-size:.86rem;line-height:1.35}.christianity-offering-list{display:grid;gap:.6rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem}.christianity-offering-row{display:grid;grid-template-columns:minmax(5.4rem,6.5rem) minmax(0,1fr);gap:.65rem;align-items:center;padding:.45rem;border:1px solid rgba(36,48,68,.12);border-radius:.65rem;background:#fff}.christianity-offering-row.is-exhausted{opacity:.68}.christianity-offering-card{position:relative;display:grid;grid-template-rows:auto minmax(0,1fr) auto;align-content:stretch;gap:.26rem;width:100%;min-height:7.7rem;padding:.58rem;overflow:hidden;text-align:left;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 78% 14%,rgba(250,204,21,.78) 0 .42rem,transparent .44rem);box-shadow:0 .45rem 1rem #102a431a}.christianity-offering-card small{min-width:0;overflow:hidden;color:#1f293394;font-size:.62rem;font-weight:800;line-height:1;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.christianity-offering-card strong{display:-webkit-box;align-self:start;min-width:0;margin-top:.1rem;overflow:hidden;overflow-wrap:anywhere;font-size:.88rem;line-height:1.05;-webkit-box-orient:vertical;-webkit-line-clamp:3}.christianity-offering-card span{position:absolute;right:.42rem;bottom:.42rem;display:grid;place-items:center;min-width:1.55rem;height:1.55rem;padding:0 .28rem;border-radius:999px;background:#edf2f7;font-size:.82rem;font-weight:900}.christianity-offering-card em{align-self:end;max-width:calc(100% - 1.9rem);overflow:hidden;color:#1f29339e;font-size:.64rem;font-style:normal;font-weight:800;line-height:1.05;text-overflow:ellipsis;white-space:nowrap}.christianity-offering-card p,.christianity-offering-row p{margin:0}.christianity-offering-card p{align-self:end;color:#1f2933a3;font-size:.72rem;line-height:1.2}.christianity-offering-row>div{display:grid;gap:.35rem;align-content:center;min-width:0}.christianity-offering-row>div p{color:#1f2933b8;font-size:.85rem;line-height:1.3}.christianity-offering-row>div button{justify-self:start;min-height:2.2rem;padding:0 .7rem;border:1px solid rgba(16,42,67,.16);border-radius:.5rem;background:#102a43;color:#fff;font:inherit;font-weight:800}.christianity-offering-row>div button:disabled{background:#e2e8f0;color:#1f293394}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible{outline:.1875rem solid color-mix(in srgb,var(--christianity-theme-focus) 24%,transparent);outline-offset:.125rem}@media (max-width: 720px){.christianity-shell{padding:.55rem 0;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-match-strip{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:.35rem;padding:.35rem}.christianity-match-player{gap:.35rem}.christianity-match-player small{display:none}.christianity-scoreboard{min-width:3.65rem;padding:0 .35rem}.christianity-scoreboard strong{font-size:1.05rem}.christianity-table{gap:.35rem;padding-right:.25rem;padding-left:.25rem}.christianity-player-side{padding:.3rem .25rem}.christianity-battle-zone{--christianity-battle-card-width: min(5.2rem, calc((100vw - 4.25rem)/4) );grid-template-columns:repeat(4,var(--christianity-battle-card-width));justify-content:center;min-height:8.75rem;overflow-x:clip}.christianity-hand-fan{min-height:11.45rem;padding-bottom:2rem;overflow:visible}.christianity-hand-shelf{min-height:12.65rem;margin-top:-1rem;padding-top:1.35rem;padding-bottom:.9rem}.christianity-hand-shelf--opponent{min-height:6.65rem;margin-top:0;margin-bottom:0;padding-top:.4rem;padding-bottom:.85rem}.christianity-player-rack{grid-template-columns:minmax(4.5rem,5.7rem) minmax(4.4rem,1fr) minmax(3.5rem,4.8rem)}.christianity-shared-zone{gap:.45rem;grid-template-columns:repeat(3,minmax(0,1fr))}.christianity-zone-card,.christianity-zone-pile{min-height:6.15rem;padding:.58rem .46rem .5rem;gap:.24rem}.christianity-zone-pile i{top:2rem;right:.52rem;width:2.35rem;height:3.25rem}.christianity-offering-pile{min-height:6.85rem;padding:.88rem .46rem .55rem;gap:.24rem}.christianity-offering-pile i{top:2.25rem;left:.56rem;width:2.35rem;height:3.25rem}.christianity-card-preview-card{width:clamp(4.2rem,20vw,5.7rem);height:auto;min-height:0}.christianity-leader-card{width:clamp(4.55rem,20vw,5.7rem);min-height:0}.christianity-offering-row{grid-template-columns:minmax(5rem,5.8rem) minmax(0,1fr);gap:.5rem}.christianity-offering-card{min-height:7.25rem;padding:.5rem}.christianity-hand-fan--opponent{min-height:5.75rem;padding-bottom:.7rem}.christianity-hand-fan--opponent .christianity-card-frame--back{width:clamp(3.35rem,15vw,4.25rem);margin-inline:-.72rem}}\n"], dependencies: [{ kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: LightRippleDirective, selector: "[valLightRipple]" }] }); }
|
|
70109
|
-
}
|
|
70110
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, decorators: [{
|
|
70111
|
-
type: Component,
|
|
70112
|
-
args: [{ selector: 'val-christianity-game', standalone: true, imports: [CdkDrag, CdkDropList, LightRippleDirective], template: `
|
|
70113
|
-
<main class="christianity-shell">
|
|
70114
|
-
<section class="christianity-header">
|
|
70115
|
-
<div>
|
|
70116
|
-
<p>{{ t('christianityEyebrow') }}</p>
|
|
70117
|
-
<h1>{{ t('christianityTitle') }}</h1>
|
|
70118
|
-
</div>
|
|
70119
|
-
<div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
|
|
70120
|
-
<span>{{ t('christianityTurn') }}</span>
|
|
70121
|
-
<strong>{{ currentPlayer().displayName }}</strong>
|
|
70122
|
-
</div>
|
|
70123
|
-
</section>
|
|
70124
|
-
|
|
70125
|
-
<section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
|
|
70126
|
-
<article class="christianity-match-player">
|
|
70127
|
-
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
70128
|
-
<div>
|
|
70129
|
-
<strong>{{ player().displayName }}</strong>
|
|
70130
|
-
<small>{{ player().leaderName }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
|
|
70131
|
-
</div>
|
|
70132
|
-
</article>
|
|
70133
|
-
<div class="christianity-scoreboard">
|
|
70134
|
-
<span>{{ t('christianityMatch') }}</span>
|
|
70135
|
-
<strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
|
|
70136
|
-
</div>
|
|
70137
|
-
<article class="christianity-match-player christianity-match-player--opponent">
|
|
70138
|
-
<span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
|
|
70139
|
-
<div>
|
|
70140
|
-
<strong>{{ opponent().displayName }}</strong>
|
|
70141
|
-
<small>{{ opponent().leaderName }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
|
|
70142
|
-
</div>
|
|
70143
|
-
</article>
|
|
70144
|
-
</section>
|
|
70145
|
-
|
|
70146
|
-
<section class="christianity-hand-shelf christianity-hand-shelf--opponent">
|
|
70147
|
-
<div class="christianity-hand-meter christianity-hand-meter--opponent">
|
|
70148
|
-
<span>{{ t('christianityHand') }}</span>
|
|
70149
|
-
<strong>{{ opponentHandCount() }}</strong>
|
|
70150
|
-
</div>
|
|
70151
|
-
<section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
|
|
70152
|
-
@for (_ of hiddenHandCards(opponentHandCount()); track $index) {
|
|
70153
|
-
<button
|
|
70154
|
-
type="button"
|
|
70155
|
-
class="christianity-card-preview-card christianity-card-frame christianity-card-frame--back"
|
|
70156
|
-
valLightRipple
|
|
70157
|
-
[style.transform]="fanTransform($index, opponentHandCount(), true)"
|
|
70158
|
-
[attr.aria-label]="t('christianityHiddenCard')"
|
|
70159
|
-
></button>
|
|
70160
|
-
}
|
|
70161
|
-
</section>
|
|
70162
|
-
</section>
|
|
70163
|
-
|
|
70164
|
-
<section class="christianity-table" [attr.aria-label]="t('christianityTable')">
|
|
70165
|
-
<section class="christianity-player-side christianity-player-side--opponent">
|
|
70166
|
-
<section class="christianity-player-rack christianity-player-rack--opponent">
|
|
70167
|
-
<div class="christianity-offerings-zone">
|
|
70168
|
-
<button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
|
|
70169
|
-
<i aria-hidden="true"></i>
|
|
70170
|
-
<i aria-hidden="true"></i>
|
|
70171
|
-
<i aria-hidden="true"></i>
|
|
70172
|
-
<span>{{ t('christianityOfferings') }}</span>
|
|
70173
|
-
<strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
|
|
70174
|
-
</button>
|
|
70175
|
-
</div>
|
|
70176
|
-
<button type="button" class="christianity-leader-card christianity-card-frame christianity-card-frame--leader" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
|
|
70177
|
-
<header class="christianity-card-frame-header">
|
|
70178
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
70179
|
-
<strong>{{ opponent().leaderName }}</strong>
|
|
70180
|
-
<span>{{ opponent().leaderHp }}</span>
|
|
70181
|
-
</header>
|
|
70182
|
-
<section class="christianity-card-frame-art">
|
|
70183
|
-
<span>{{ opponent().leaderName }}</span>
|
|
70184
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
70185
|
-
</section>
|
|
70186
|
-
<section class="christianity-card-frame-effect">
|
|
70187
|
-
<strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
|
|
70188
|
-
</section>
|
|
70189
|
-
</button>
|
|
70190
|
-
<span class="christianity-rack-spacer" aria-hidden="true"></span>
|
|
70191
|
-
</section>
|
|
70192
|
-
|
|
70193
|
-
<section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
|
|
70194
|
-
@for (slot of battleSlots('P2'); track slot.trackId) {
|
|
70195
|
-
@if (slot.card) {
|
|
70196
|
-
<button
|
|
70197
|
-
type="button"
|
|
70198
|
-
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-card-frame christianity-card-frame--battle"
|
|
70199
|
-
valLightRipple
|
|
70200
|
-
[class.is-target]="selectedAttacker()"
|
|
70201
|
-
(click)="handleOpponentCharacter(slot.card)"
|
|
70202
|
-
>
|
|
70203
|
-
<header class="christianity-card-frame-header">
|
|
70204
|
-
<small>{{ t('christianityCost') }} {{ cardDefinition(slot.card.cardId).cost }}</small>
|
|
70205
|
-
<strong>{{ slot.card.name }}</strong>
|
|
70206
|
-
<span>{{ cardDefinition(slot.card.cardId).cost }}</span>
|
|
70207
|
-
</header>
|
|
70208
|
-
<section class="christianity-card-frame-art">
|
|
70209
|
-
<span>{{ slot.card.name }}</span>
|
|
70210
|
-
<small>{{ t('christianityCharacterCard') }}</small>
|
|
70211
|
-
</section>
|
|
70212
|
-
<section class="christianity-card-frame-effect">
|
|
70213
|
-
<strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
|
|
70214
|
-
</section>
|
|
70215
|
-
</button>
|
|
70216
|
-
} @else {
|
|
70217
|
-
<span class="christianity-slot"></span>
|
|
70218
|
-
}
|
|
70219
|
-
}
|
|
70220
|
-
</section>
|
|
70221
|
-
</section>
|
|
70222
|
-
|
|
70223
|
-
<section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
|
|
70224
|
-
<button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="openHistory()">
|
|
70225
|
-
<i aria-hidden="true"></i>
|
|
70226
|
-
<i aria-hidden="true"></i>
|
|
70227
|
-
<i aria-hidden="true"></i>
|
|
70228
|
-
<span>{{ t('christianityHistory') }}</span>
|
|
70229
|
-
<strong>{{ game().historyZone.length }}</strong>
|
|
70230
|
-
</button>
|
|
70231
|
-
<button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
|
|
70232
|
-
<i aria-hidden="true"></i>
|
|
70233
|
-
<i aria-hidden="true"></i>
|
|
70234
|
-
<i aria-hidden="true"></i>
|
|
70235
|
-
<span>{{ t('christianityDeck') }}</span>
|
|
70236
|
-
<strong>{{ game().sharedDeck.length }}</strong>
|
|
70237
|
-
</button>
|
|
70238
|
-
<div class="christianity-zone-card">
|
|
70239
|
-
<span>{{ t('christianityPlace') }}</span>
|
|
70240
|
-
<strong>{{ t('christianityEmpty') }}</strong>
|
|
70241
|
-
</div>
|
|
70242
|
-
</section>
|
|
70243
|
-
|
|
70244
|
-
<section class="christianity-player-side">
|
|
70245
|
-
<section class="christianity-battle-zone" [class.is-placing-card]="canPlaceSelectedCharacter() || isDraggingCharacter()" [attr.aria-label]="t('christianityYourBattle')">
|
|
70246
|
-
@for (slot of battleSlots('P1'); track slot.trackId) {
|
|
70247
|
-
@if (slot.card) {
|
|
70248
|
-
<button
|
|
70249
|
-
type="button"
|
|
70250
|
-
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-card-frame christianity-card-frame--battle"
|
|
70251
|
-
valLightRipple
|
|
70252
|
-
[class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
|
|
70253
|
-
[class.is-exhausted]="!slot.card.canAttack"
|
|
70254
|
-
(click)="selectAttacker(slot.card)"
|
|
70255
|
-
>
|
|
70256
|
-
<header class="christianity-card-frame-header">
|
|
70257
|
-
<small>{{ t('christianityCost') }} {{ cardDefinition(slot.card.cardId).cost }}</small>
|
|
70258
|
-
<strong>{{ slot.card.name }}</strong>
|
|
70259
|
-
<span>{{ cardDefinition(slot.card.cardId).cost }}</span>
|
|
70260
|
-
</header>
|
|
70261
|
-
<section class="christianity-card-frame-art">
|
|
70262
|
-
<span>{{ slot.card.name }}</span>
|
|
70263
|
-
<small>{{ t('christianityCharacterCard') }}</small>
|
|
70264
|
-
</section>
|
|
70265
|
-
<section class="christianity-card-frame-effect">
|
|
70266
|
-
<strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
|
|
70267
|
-
</section>
|
|
70268
|
-
</button>
|
|
70269
|
-
} @else {
|
|
70270
|
-
<button
|
|
70271
|
-
type="button"
|
|
70272
|
-
class="christianity-slot"
|
|
70273
|
-
cdkDropList
|
|
70274
|
-
[id]="battleSlotDropId($index)"
|
|
70275
|
-
[cdkDropListData]="$index"
|
|
70276
|
-
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
70277
|
-
[cdkDropListEnterPredicate]="canDropOnBattleSlot"
|
|
70278
|
-
[class.christianity-slot--play-target]="canPlaceSelectedCharacter() || isDraggingCharacter()"
|
|
70279
|
-
valLightRipple
|
|
70280
|
-
(cdkDropListDropped)="dropOnBattleSlot($event, $index)"
|
|
70281
|
-
(click)="playSelectedCard($index)"
|
|
70282
|
-
>
|
|
70283
|
-
@if (canPlaceSelectedCharacter() || isDraggingCharacter()) {
|
|
70284
|
-
<span>{{ t('christianityPlayHere') }}</span>
|
|
70285
|
-
}
|
|
70286
|
-
</button>
|
|
70287
|
-
}
|
|
70288
|
-
}
|
|
70289
|
-
</section>
|
|
70290
|
-
|
|
70291
|
-
<section class="christianity-player-rack">
|
|
70292
|
-
<div class="christianity-offerings-zone">
|
|
70293
|
-
<button
|
|
70294
|
-
type="button"
|
|
70295
|
-
class="christianity-offering-pile"
|
|
70296
|
-
cdkDropList
|
|
70297
|
-
id="christianity-offerings-drop"
|
|
70298
|
-
valLightRipple
|
|
70299
|
-
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
70300
|
-
[class.is-play-target]="canPlaceSelectedOffering() || isDraggingOffering()"
|
|
70301
|
-
[cdkDropListEnterPredicate]="canDropOnOfferings"
|
|
70302
|
-
(cdkDropListDropped)="dropOnOfferings($event)"
|
|
70303
|
-
(click)="handleOfferingPile('P1')"
|
|
70304
|
-
>
|
|
70305
|
-
<i aria-hidden="true"></i>
|
|
70306
|
-
<i aria-hidden="true"></i>
|
|
70307
|
-
<i aria-hidden="true"></i>
|
|
70308
|
-
<span>{{ t('christianityOfferings') }}</span>
|
|
70309
|
-
<strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
|
|
70310
|
-
</button>
|
|
70311
|
-
</div>
|
|
70312
|
-
<button type="button" class="christianity-leader-card christianity-card-frame christianity-card-frame--leader" valLightRipple (click)="inspectLeader('P1')">
|
|
70313
|
-
<header class="christianity-card-frame-header">
|
|
70314
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
70315
|
-
<strong>{{ player().leaderName }}</strong>
|
|
70316
|
-
<span>{{ player().leaderHp }}</span>
|
|
70317
|
-
</header>
|
|
70318
|
-
<section class="christianity-card-frame-art">
|
|
70319
|
-
<span>{{ player().leaderName }}</span>
|
|
70320
|
-
<small>{{ t('christianityLeaderCard') }}</small>
|
|
70321
|
-
</section>
|
|
70322
|
-
<section class="christianity-card-frame-effect">
|
|
70323
|
-
<strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
|
|
70324
|
-
</section>
|
|
70325
|
-
</button>
|
|
70326
|
-
<div class="christianity-player-command">
|
|
70327
|
-
<div class="christianity-player-badge">
|
|
70328
|
-
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
70329
|
-
<strong>{{ player().displayName }}</strong>
|
|
70330
|
-
</div>
|
|
70331
|
-
<button
|
|
70332
|
-
type="button"
|
|
70333
|
-
class="christianity-end-turn"
|
|
70334
|
-
(click)="endTurn()"
|
|
70335
|
-
>
|
|
70336
|
-
{{ t('christianityEndTurn') }}
|
|
70337
|
-
</button>
|
|
70338
|
-
</div>
|
|
70339
|
-
</section>
|
|
70340
|
-
</section>
|
|
70341
|
-
</section>
|
|
70342
|
-
|
|
70343
|
-
<section class="christianity-hand-shelf">
|
|
70344
|
-
<div class="christianity-hand-meter">
|
|
70345
|
-
<span>{{ t('christianityHand') }}</span>
|
|
70346
|
-
<strong>{{ player().hand?.length ?? 0 }}</strong>
|
|
70347
|
-
</div>
|
|
70348
|
-
<section
|
|
70349
|
-
class="christianity-hand-fan"
|
|
70350
|
-
cdkDropList
|
|
70351
|
-
id="christianity-hand-source"
|
|
70352
|
-
[cdkDropListConnectedTo]="dropTargetIds()"
|
|
70353
|
-
[attr.aria-label]="t('christianityYourHand')"
|
|
70354
|
-
(pointerleave)="clearHoveredHandIndex()"
|
|
70355
|
-
>
|
|
70356
|
-
@for (cardId of player().hand ?? []; track cardId + $index) {
|
|
70357
|
-
@let card = cardDefinition(cardId);
|
|
70358
|
-
<div
|
|
70359
|
-
class="christianity-hand-card-wrap"
|
|
70360
|
-
[class.is-selected]="selectedHandCard() === cardId"
|
|
70361
|
-
[class.is-dragging]="draggingCardId() === cardId"
|
|
70362
|
-
[style.z-index]="handCardZIndex($index)"
|
|
70363
|
-
[style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
|
|
70364
|
-
(pointerenter)="setHoveredHandIndex($index)"
|
|
70365
|
-
(pointerdown)="setHoveredHandIndex($index)"
|
|
70366
|
-
(pointerup)="releaseHoveredHand($event)"
|
|
70367
|
-
>
|
|
70368
|
-
<button
|
|
70369
|
-
type="button"
|
|
70370
|
-
class="christianity-card-preview-card christianity-card-preview-card--hand christianity-card-frame"
|
|
70371
|
-
cdkDrag
|
|
70372
|
-
valLightRipple
|
|
70373
|
-
[cdkDragData]="cardId"
|
|
70374
|
-
[cdkDragDisabled]="!canPlay(card)"
|
|
70375
|
-
[class.is-selected]="selectedHandCard() === cardId"
|
|
70376
|
-
[class.is-disabled]="!canPlay(card)"
|
|
70377
|
-
(cdkDragStarted)="startDraggingCard(cardId)"
|
|
70378
|
-
(cdkDragEnded)="endDraggingCard()"
|
|
70379
|
-
(click)="selectHandCard(cardId)"
|
|
70380
|
-
>
|
|
70381
|
-
<header class="christianity-card-frame-header">
|
|
70382
|
-
<small>{{ cardTypeLabel(card) }}</small>
|
|
70383
|
-
<strong>{{ card.name }}</strong>
|
|
70384
|
-
<span>{{ card.type === 'offering' ? '+' + card.life : card.cost }}</span>
|
|
70385
|
-
</header>
|
|
70386
|
-
<section class="christianity-card-frame-art">
|
|
70387
|
-
<span>{{ card.name }}</span>
|
|
70388
|
-
<small>{{ cardTypeLabel(card) }}</small>
|
|
70389
|
-
</section>
|
|
70390
|
-
<section class="christianity-card-frame-effect">
|
|
70391
|
-
<strong>
|
|
70392
|
-
@if (card.type === 'offering') {
|
|
70393
|
-
+{{ card.life }}
|
|
70394
|
-
} @else {
|
|
70395
|
-
{{ card.attack }} / {{ card.life }}
|
|
70396
|
-
}
|
|
70397
|
-
</strong>
|
|
70398
|
-
</section>
|
|
70399
|
-
<footer class="christianity-card-frame-footer">
|
|
70400
|
-
<span>{{ card.edition ?? 'MVP' }}</span>
|
|
70401
|
-
<span>{{ card.collectorNumber ?? card.id }}</span>
|
|
70402
|
-
</footer>
|
|
70403
|
-
</button>
|
|
70404
|
-
<button
|
|
70405
|
-
type="button"
|
|
70406
|
-
class="christianity-card-eye"
|
|
70407
|
-
[attr.aria-label]="t('christianityPreviewCard')"
|
|
70408
|
-
(click)="inspectHandCard(cardId, true); $event.stopPropagation()"
|
|
70409
|
-
></button>
|
|
70410
|
-
</div>
|
|
70411
|
-
}
|
|
70412
|
-
</section>
|
|
70413
|
-
</section>
|
|
70414
|
-
|
|
70415
|
-
@if (selectedPreview()) {
|
|
70416
|
-
<button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
|
|
70417
|
-
<aside
|
|
70418
|
-
class="christianity-floating-card-shell"
|
|
70419
|
-
aria-live="polite"
|
|
70420
|
-
>
|
|
70421
|
-
<button type="button" class="christianity-floating-card-close" (click)="closePreview()">
|
|
70422
|
-
{{ t('close') }}
|
|
70423
|
-
</button>
|
|
70424
|
-
<div
|
|
70425
|
-
class="christianity-floating-card"
|
|
70426
|
-
[style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
|
|
70427
|
-
[style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
|
|
70428
|
-
[style.--preview-shift-x]="previewTilt().shiftX + 'px'"
|
|
70429
|
-
[style.--preview-shift-y]="previewTilt().shiftY + 'px'"
|
|
70430
|
-
(pointermove)="tiltPreview($event)"
|
|
70431
|
-
(pointerleave)="resetPreviewTilt()"
|
|
70432
|
-
>
|
|
70433
|
-
@if (selectedPreviewCard(); as previewCard) {
|
|
70434
|
-
<header class="christianity-full-card-header">
|
|
70435
|
-
<span class="christianity-full-card-type-icon" aria-hidden="true"></span>
|
|
70436
|
-
<strong>{{ previewCard.name }}</strong>
|
|
70437
|
-
<span class="christianity-full-card-cost">{{ previewCard.type === 'offering' ? '+' + previewCard.life : previewCard.cost }}</span>
|
|
70438
|
-
</header>
|
|
70439
|
-
<section class="christianity-full-card-art" [class.has-image]="previewCard.imageUrl">
|
|
70440
|
-
@if (previewCard.imageUrl) {
|
|
70441
|
-
<img [src]="previewCard.imageUrl" [alt]="previewCard.name" />
|
|
70442
|
-
} @else {
|
|
70443
|
-
<span>{{ previewCard.name }}</span>
|
|
70444
|
-
}
|
|
70445
|
-
<small>{{ cardTypeLabel(previewCard) }}</small>
|
|
70446
|
-
</section>
|
|
70447
|
-
<section class="christianity-full-card-verse">
|
|
70448
|
-
<p>{{ previewCard.verseText ?? selectedPreview()?.body }}</p>
|
|
70449
|
-
@if (previewCard.scripture) {
|
|
70450
|
-
<strong>{{ previewCard.scripture }}</strong>
|
|
70451
|
-
}
|
|
70452
|
-
</section>
|
|
70453
|
-
<section class="christianity-full-card-effect">
|
|
70454
|
-
<div class="christianity-full-card-stats">
|
|
70455
|
-
@if (previewCard.type === 'character') {
|
|
70456
|
-
<strong>{{ previewCard.attack }}</strong>
|
|
70457
|
-
<strong>{{ previewCard.life }}</strong>
|
|
70458
|
-
} @else {
|
|
70459
|
-
<strong>+{{ previewCard.life }}</strong>
|
|
70460
|
-
}
|
|
70461
|
-
</div>
|
|
70462
|
-
<div>
|
|
70463
|
-
@if (previewCard.abilityName) {
|
|
70464
|
-
<strong>{{ previewCard.abilityName }}</strong>
|
|
70465
|
-
}
|
|
70466
|
-
<p>{{ previewCard.abilityText ?? selectedPreview()?.body }}</p>
|
|
70467
|
-
</div>
|
|
70468
|
-
<span
|
|
70469
|
-
class="christianity-full-card-rarity"
|
|
70470
|
-
[class.is-normal]="!previewCard.rarity || previewCard.rarity === 'normal'"
|
|
70471
|
-
[class.is-uncommon]="previewCard.rarity === 'uncommon'"
|
|
70472
|
-
[class.is-rare]="previewCard.rarity === 'rare'"
|
|
70473
|
-
[class.is-legendary]="previewCard.rarity === 'legendary'"
|
|
70474
|
-
aria-hidden="true"
|
|
70475
|
-
></span>
|
|
70476
|
-
</section>
|
|
70477
|
-
<footer class="christianity-full-card-footer">
|
|
70478
|
-
<span>{{ previewCard.edition ?? 'MVP' }}</span>
|
|
70479
|
-
<span>{{ previewCard.collectorNumber ?? previewCard.id }}</span>
|
|
70480
|
-
<span>{{ previewCard.year ?? '2026' }} CHRISTIANITY</span>
|
|
70481
|
-
<span>{{ previewCard.author ?? 'MVP' }}</span>
|
|
70482
|
-
</footer>
|
|
70483
|
-
} @else {
|
|
70484
|
-
<header class="christianity-full-card-header">
|
|
70485
|
-
<span class="christianity-full-card-type-icon" aria-hidden="true"></span>
|
|
70486
|
-
<strong>{{ selectedPreview()?.title }}</strong>
|
|
70487
|
-
<span class="christianity-full-card-cost">{{ selectedPreview()?.meta }}</span>
|
|
70488
|
-
</header>
|
|
70489
|
-
<section class="christianity-full-card-art">
|
|
70490
|
-
<span>{{ selectedPreview()?.title }}</span>
|
|
70491
|
-
<small>{{ selectedPreview()?.eyebrow }}</small>
|
|
70492
|
-
</section>
|
|
70493
|
-
<section class="christianity-full-card-verse">
|
|
70494
|
-
<p>{{ selectedPreview()?.body }}</p>
|
|
70495
|
-
</section>
|
|
70496
|
-
<section class="christianity-full-card-effect">
|
|
70497
|
-
<div class="christianity-full-card-stats">
|
|
70498
|
-
<strong>{{ selectedPreview()?.meta }}</strong>
|
|
70499
|
-
</div>
|
|
70500
|
-
<div>
|
|
70501
|
-
<strong>{{ selectedPreview()?.eyebrow }}</strong>
|
|
70502
|
-
<p>{{ selectedPreview()?.body }}</p>
|
|
70503
|
-
</div>
|
|
70504
|
-
<span class="christianity-full-card-rarity is-legendary" aria-hidden="true"></span>
|
|
70505
|
-
</section>
|
|
70506
|
-
<footer class="christianity-full-card-footer">
|
|
70507
|
-
<span>MVP</span>
|
|
70508
|
-
<span>{{ selectedPreview()?.eyebrow }}</span>
|
|
70509
|
-
<span>2026 CHRISTIANITY</span>
|
|
70510
|
-
<span>{{ selectedPreview()?.meta }}</span>
|
|
70511
|
-
</footer>
|
|
70512
|
-
}
|
|
70513
|
-
</div>
|
|
70514
|
-
@if (selectedPreview()?.source === 'hand') {
|
|
70515
|
-
<div class="christianity-floating-card-actions">
|
|
70516
|
-
<button type="button" [disabled]="previewActionDisabled()" (click)="playPreviewCard()">
|
|
70517
|
-
{{ selectedActionLabel() }}
|
|
70518
|
-
</button>
|
|
70519
|
-
</div>
|
|
70520
|
-
}
|
|
70521
|
-
</aside>
|
|
70522
|
-
}
|
|
70523
|
-
|
|
70524
|
-
@if (selectedInfo(); as info) {
|
|
70525
|
-
<button type="button" class="christianity-info-backdrop" [attr.aria-label]="t('close')" (click)="closeInfo()"></button>
|
|
70526
|
-
<aside class="christianity-info-panel" aria-live="polite">
|
|
70527
|
-
<button type="button" class="christianity-dialog-close christianity-info-close" (click)="closeInfo()">
|
|
70528
|
-
{{ t('close') }}
|
|
70529
|
-
</button>
|
|
70530
|
-
<div class="christianity-rule-note">
|
|
70531
|
-
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
70532
|
-
<div>
|
|
70533
|
-
<small>{{ info.eyebrow }}</small>
|
|
70534
|
-
<h2>{{ info.title }}</h2>
|
|
70535
|
-
<strong>{{ info.meta }}</strong>
|
|
70536
|
-
<p>{{ info.body }}</p>
|
|
70537
|
-
<ul>
|
|
70538
|
-
@for (fact of info.facts; track fact) {
|
|
70539
|
-
<li>{{ fact }}</li>
|
|
70540
|
-
}
|
|
70541
|
-
</ul>
|
|
70542
|
-
</div>
|
|
70543
|
-
</div>
|
|
70544
|
-
</aside>
|
|
70545
|
-
}
|
|
70546
|
-
|
|
70547
|
-
<section class="christianity-actions" aria-live="polite">
|
|
70548
|
-
<p>{{ statusText() }}</p>
|
|
70549
|
-
<div>
|
|
70550
|
-
<button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
|
|
70551
|
-
{{ selectedActionLabel() }}
|
|
70552
|
-
</button>
|
|
70553
|
-
<button type="button" (click)="resetMock()">
|
|
70554
|
-
{{ t('christianityReset') }}
|
|
70555
|
-
</button>
|
|
70556
|
-
</div>
|
|
70557
|
-
</section>
|
|
70558
|
-
|
|
70559
|
-
@if (showHistory()) {
|
|
70560
|
-
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
|
|
70561
|
-
<section class="christianity-history-drawer">
|
|
70562
|
-
<header>
|
|
70563
|
-
<h2>{{ t('christianityHistory') }}</h2>
|
|
70564
|
-
<div class="christianity-dialog-actions">
|
|
70565
|
-
<span>{{ game().historyZone.length }}</span>
|
|
70566
|
-
<button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
|
|
70567
|
-
{{ t('close') }}
|
|
70568
|
-
</button>
|
|
70569
|
-
</div>
|
|
70570
|
-
</header>
|
|
70571
|
-
@if (game().historyZone.length) {
|
|
70572
|
-
<div class="christianity-history-grid">
|
|
70573
|
-
@for (cardId of game().historyZone; track cardId + $index) {
|
|
70574
|
-
@let card = cardDefinition(cardId);
|
|
70575
|
-
<button type="button" class="christianity-card-preview-card christianity-card-frame christianity-card-frame--list" valLightRipple (click)="inspectHistoryCard(cardId)">
|
|
70576
|
-
<header class="christianity-card-frame-header">
|
|
70577
|
-
<small>{{ card.type === 'offering' ? t('christianityOfferingCard') : t('christianityCost') + ' ' + card.cost }}</small>
|
|
70578
|
-
<strong>{{ card.name }}</strong>
|
|
70579
|
-
<span>{{ card.type === 'offering' ? '+' + card.life : card.cost }}</span>
|
|
70580
|
-
</header>
|
|
70581
|
-
<section class="christianity-card-frame-art">
|
|
70582
|
-
<span>{{ card.name }}</span>
|
|
70583
|
-
<small>{{ cardTypeLabel(card) }}</small>
|
|
70584
|
-
</section>
|
|
70585
|
-
<section class="christianity-card-frame-effect">
|
|
70586
|
-
<strong>
|
|
70587
|
-
@if (card.type === 'offering') {
|
|
70588
|
-
+{{ card.life }}
|
|
70589
|
-
} @else {
|
|
70590
|
-
{{ card.attack }} / {{ card.life }}
|
|
70591
|
-
}
|
|
70592
|
-
</strong>
|
|
70593
|
-
</section>
|
|
70594
|
-
</button>
|
|
70595
|
-
}
|
|
70596
|
-
</div>
|
|
70597
|
-
} @else {
|
|
70598
|
-
<p>{{ t('christianityHistoryEmpty') }}</p>
|
|
70599
|
-
}
|
|
70600
|
-
</section>
|
|
70601
|
-
}
|
|
70602
|
-
|
|
70603
|
-
@if (offeringsSeat()) {
|
|
70604
|
-
@let offeringPlayer = game().players[offeringsSeat()!];
|
|
70605
|
-
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
|
|
70606
|
-
<section class="christianity-history-drawer christianity-offerings-drawer">
|
|
70607
|
-
<header>
|
|
70608
|
-
<h2>{{ t('christianityOfferings') }}</h2>
|
|
70609
|
-
<div class="christianity-dialog-actions">
|
|
70610
|
-
<span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
|
|
70611
|
-
<button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
|
|
70612
|
-
{{ t('close') }}
|
|
70613
|
-
</button>
|
|
70614
|
-
</div>
|
|
70615
|
-
</header>
|
|
70616
|
-
<div class="christianity-offerings-note">
|
|
70617
|
-
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
70618
|
-
<p>{{ t('christianityOfferingsRuleBody') }}</p>
|
|
70619
|
-
</div>
|
|
70620
|
-
<div class="christianity-offering-list">
|
|
70621
|
-
@for (offering of offeringPlayer.offerings; track offering.instanceId) {
|
|
70622
|
-
<article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
|
|
70623
|
-
<button type="button" class="christianity-offering-card" valLightRipple (click)="inspectOffering(offering)">
|
|
70624
|
-
<small>{{ t('christianityOfferingCard') }}</small>
|
|
70625
|
-
<strong>{{ offering.name }}</strong>
|
|
70626
|
-
<span>+{{ offering.value }}</span>
|
|
70627
|
-
<em>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</em>
|
|
70628
|
-
</button>
|
|
70629
|
-
<div>
|
|
70630
|
-
<strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
|
|
70631
|
-
<p>{{ offering.abilityText || t('christianityOfferingNoAbility') }}</p>
|
|
70632
|
-
@if (offering.abilityName) {
|
|
70633
|
-
<button
|
|
70634
|
-
type="button"
|
|
70635
|
-
[disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
|
|
70636
|
-
(click)="useOfferingAbility(offering, offeringsSeat()!)"
|
|
70637
|
-
>
|
|
70638
|
-
{{ t('christianityUseAbility') }}
|
|
70639
|
-
</button>
|
|
70640
|
-
}
|
|
70641
|
-
</div>
|
|
70642
|
-
</article>
|
|
70643
|
-
}
|
|
70644
|
-
</div>
|
|
70645
|
-
</section>
|
|
70646
|
-
}
|
|
70647
|
-
</main>
|
|
70648
|
-
`, styles: [":host{--christianity-theme-ink: var(--val-text-color, #1f2933);--christianity-theme-surface: #ffffff;--christianity-theme-parchment: #fffaf0;--christianity-theme-olive: #5f6f2a;--christianity-theme-gold: #d6a21d;--christianity-theme-gold-soft: rgba(214, 162, 29, .18);--christianity-theme-gold-ring: rgba(214, 162, 29, .48);--christianity-theme-glow: rgba(245, 199, 85, .32);--christianity-theme-focus: #2563eb;--christianity-theme-shadow: rgba(82, 64, 28, .18);--christianity-theme-shadow-strong: rgba(82, 64, 28, .3);--christianity-card-aspect: 5 / 7.45;--christianity-card-back: linear-gradient(135deg, rgba(16, 42, 67, .16), rgba(16, 42, 67, .03)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);--christianity-card-back-soft: linear-gradient(135deg, rgba(16, 42, 67, .11), rgba(16, 42, 67, .02)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);display:block;max-width:100%;min-width:0;overflow-x:clip;color:var(--christianity-theme-ink)}.christianity-shell{box-sizing:border-box;display:grid;gap:.65rem;width:100%;max-width:100%;min-width:0;padding:.75rem .25rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb;overflow-x:clip;overflow-y:visible}.christianity-header,.christianity-match-strip,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-header h1,.christianity-header p,.christianity-match-player strong,.christianity-match-player small,.christianity-scoreboard span,.christianity-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header p,.christianity-turn span,.christianity-offerings span,.christianity-hidden-hand span,.christianity-deck span,.christianity-place span,.christianity-pile span,.christianity-leader span{color:#1f2933a3;font-size:.75rem}.christianity-turn,.christianity-leader,.christianity-offerings,.christianity-hidden-hand,.christianity-pile,.christianity-deck,.christianity-place{display:grid;gap:.15rem;min-width:5.25rem;padding:.55rem .65rem;border:1px solid rgba(36,48,68,.12);border-radius:.5rem;background:#fff}.christianity-turn.is-own-turn{border-color:#12806c59;background:#ecfdf5}.christianity-match-strip{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);padding:.45rem;border:1px solid rgba(36,48,68,.1);border-radius:.75rem;background:#fff}.christianity-match-player{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.5rem;align-items:center;min-width:0}.christianity-match-player--opponent{direction:rtl}.christianity-match-player--opponent div{direction:ltr;text-align:right}.christianity-match-player div{display:grid;min-width:0}.christianity-match-player strong,.christianity-match-player small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-match-player small,.christianity-scoreboard span{color:#1f293394;font-size:.72rem}.christianity-scoreboard{display:grid;justify-items:center;min-width:4.2rem;padding:0 .55rem;border-right:1px solid rgba(36,48,68,.1);border-left:1px solid rgba(36,48,68,.1)}.christianity-scoreboard strong{font-size:1.2rem;line-height:1}.christianity-table{box-sizing:border-box;display:grid;gap:.45rem;width:100%;max-width:100%;min-width:0;padding:.45rem .35rem;border-radius:.75rem;background:#dceafb;overflow-x:clip;overflow-y:visible}.christianity-player-side{box-sizing:border-box;display:grid;gap:.35rem;width:100%;max-width:100%;min-width:0;padding:.35rem .3rem;border-radius:.7rem;background:#ffffff57;grid-template-rows:minmax(7rem,1fr) auto;min-height:13.75rem}.christianity-player-side--opponent{grid-template-rows:auto minmax(7rem,1fr)}.christianity-player{display:grid;gap:.65rem}.christianity-battle-zone{--christianity-battle-card-width: clamp(4.8rem, 15vw, 6.6rem);box-sizing:border-box;display:grid;grid-template-columns:repeat(4,var(--christianity-battle-card-width));gap:.5rem;align-items:center;justify-content:center;width:100%;max-width:100%;min-width:0;min-height:clamp(9.1rem,29vw,11rem);padding:.55rem .4rem;border-radius:.75rem;background:#ffffffc2;transition:background .16s ease,box-shadow .16s ease}.christianity-battle-zone.is-placing-card{background:linear-gradient(180deg,#fffaf0f5,#ffffffd6),#ffffffc2;box-shadow:inset 0 0 0 .14rem var(--christianity-theme-gold-soft),0 .8rem 1.7rem #5f6f2a1f}.christianity-shared-zone{padding:.55rem .4rem;border-radius:.75rem;background:#ffffffe6}.christianity-card,.christianity-end-turn,.christianity-actions button,.christianity-pile,.christianity-leader--target{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card{display:grid;align-content:space-between;min-height:5.8rem;padding:.5rem;text-align:left;box-shadow:0 .5rem 1.25rem #24304414}.christianity-card span{font-weight:700}.christianity-card strong{justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-card.is-selected{border-color:var(--christianity-theme-gold);box-shadow:0 0 0 .18rem var(--christianity-theme-gold-soft),0 .85rem 1.4rem var(--christianity-theme-shadow)}.christianity-card.is-disabled,.christianity-card.is-exhausted{opacity:.55}.christianity-card.is-target{border-color:#dc2626}.christianity-offering-cards{display:grid;grid-auto-flow:column;grid-auto-columns:.7rem;gap:.16rem;align-items:end;min-height:1.05rem}.christianity-offering-cards i{display:block;width:.65rem;height:.95rem;border:1px solid rgba(16,42,67,.22);border-radius:.18rem;background:#f8fafc}.christianity-offering-cards i.is-used{background:#cbd5e1;transform:rotate(90deg);transform-origin:center}.christianity-slot{display:grid;place-items:center;justify-self:center;width:var(--christianity-battle-card-width);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);border:1px dashed rgba(36,48,68,.22);border-radius:.5rem;background:#ffffff73;color:inherit;font:inherit}.christianity-slot--play-target{position:relative;border-color:var(--christianity-theme-gold-ring);background:linear-gradient(180deg,#fffaf0eb,#f8fafcd1),#ffffffb3;color:#5d4305;font-weight:800;overflow:hidden;box-shadow:inset 0 0 0 .12rem #d6a21d33,0 .7rem 1.25rem var(--christianity-theme-shadow);animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-slot--play-target:before{content:\"\";position:absolute;inset:.35rem;border:1px solid rgba(214,162,29,.22);border-radius:.4rem;background:linear-gradient(135deg,rgba(214,162,29,.1),transparent 46%),radial-gradient(circle at 50% 42%,var(--christianity-theme-glow),transparent 58%)}.christianity-slot--play-target span{position:relative;z-index:2;padding:.16rem .44rem;border-radius:999px;background:#ffffffc7;font-size:.78rem}@keyframes christianity-target-pulse{0%,to{box-shadow:inset 0 0 0 .12rem #d6a21d33,0 .7rem 1.25rem var(--christianity-theme-shadow)}50%{box-shadow:inset 0 0 0 .16rem #d6a21d57,0 .9rem 1.65rem var(--christianity-theme-shadow-strong)}}.christianity-hand{display:grid;grid-auto-columns:minmax(6rem,8rem);grid-auto-flow:column;gap:.55rem;overflow-x:auto;padding-bottom:.25rem}.christianity-actions{align-items:flex-start;padding:.75rem;border-radius:.75rem;background:#fff}.christianity-actions div{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.christianity-actions button,.christianity-end-turn{min-height:2.4rem;padding:0 .75rem;font-weight:700}.christianity-actions button:not(:disabled),.christianity-end-turn{background:#102a43;color:#fff}.christianity-history{padding:.75rem;border-radius:.75rem;background:#fff}.christianity-hand-fan{position:relative;display:flex;justify-content:center;min-height:10.8rem;padding:.25rem .25rem 2.1rem;isolation:isolate;overflow:visible}.christianity-hand-shelf{position:relative;display:grid;z-index:12;min-height:12rem;margin-top:-1.15rem;padding:1.45rem .25rem 1rem;overflow:visible}.christianity-hand-shelf--opponent{z-index:8;min-height:6.85rem;margin-top:0;margin-bottom:0;padding:.45rem .25rem .85rem}.christianity-hand-fan--opponent{min-height:5.9rem;padding-bottom:.75rem;align-items:start}.christianity-hand-fan--opponent .christianity-card-frame--back{width:clamp(3.7rem,12vw,4.9rem);margin-inline:-.9rem;transform-origin:50% 120%}.christianity-hand-fan--opponent .christianity-card-frame--back:first-child{margin-left:0}.christianity-hand-fan--opponent .christianity-card-frame--back:last-child{margin-right:0}.christianity-card-preview-card,.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile,.christianity-end-turn{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card-preview-card{display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;gap:.28rem;align-content:stretch;width:clamp(4.9rem,17vw,7.1rem);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);padding:.48rem;text-align:left;transform-origin:50% 115%;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;box-shadow:0 .5rem 1.25rem #2430441a}.christianity-card-frame{position:relative;display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;gap:.28rem;align-content:stretch;overflow:hidden;padding:.48rem;text-align:left;background:linear-gradient(180deg,#fffffffa,#f8fafcfa),radial-gradient(circle at 15% 0%,rgba(214,162,29,.12),transparent 44%);box-shadow:0 .5rem 1.25rem #2430441a,inset 0 0 0 .18rem #ffffff9e}.christianity-card-frame-header{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.16rem;align-items:start;min-width:0}.christianity-card-frame-header small{grid-column:1;min-width:0;overflow:hidden;color:#1f2933a3;font-size:clamp(.52rem,1.5vw,.68rem);line-height:1;text-overflow:ellipsis;white-space:nowrap}.christianity-card-frame-header strong{grid-column:1;justify-self:start;align-self:start;min-width:0;padding:0;overflow:hidden;border-radius:0;background:transparent;font-size:clamp(.82rem,2.5vw,1.05rem);line-height:1.02;text-overflow:ellipsis;white-space:nowrap}.christianity-card-preview-card--hand .christianity-card-frame-header strong,.christianity-card-preview-card--battle .christianity-card-frame-header strong,.christianity-leader-card .christianity-card-frame-header strong{display:-webkit-box;overflow-wrap:anywhere;text-overflow:clip;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2}.christianity-card-preview-card--hand .christianity-card-frame-header small{text-transform:uppercase}.christianity-card-preview-card--hand .christianity-card-frame-art>span{display:-webkit-box;max-width:88%;overflow-wrap:anywhere;text-overflow:clip;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2}.christianity-card-frame-header span{grid-column:2;grid-row:1 / span 2;display:grid;place-items:center;min-width:1.3rem;height:1.3rem;padding:0 .22rem;border-radius:999px;background:#ffd91a;color:#243044;font-size:.8rem;font-weight:900;line-height:1;box-shadow:inset 0 -.08rem #52401c2e}.christianity-card-frame-art{position:relative;display:grid;place-items:center;min-height:0;overflow:hidden;border-radius:.36rem;background:linear-gradient(135deg,#5f6f2a2e,#d6a21d24),radial-gradient(circle at 50% 18%,rgba(255,255,255,.72),transparent 48%),#dbe7ef;box-shadow:inset 0 0 0 1px #24304414}.christianity-card-frame-art>span{max-width:78%;overflow:hidden;color:#2430447a;font-size:clamp(.82rem,2.2vw,1.05rem);font-weight:900;line-height:1.02;text-align:center;text-overflow:ellipsis}.christianity-card-frame-art small{position:absolute;right:0;bottom:.28rem;max-width:78%;padding:.1rem .34rem;overflow:hidden;border-radius:999px 0 0 999px;background:#ffffffe6;color:#1f2933a8;font-size:.48rem;font-style:italic;font-weight:900;line-height:1;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.christianity-card-frame-effect{display:grid;align-content:center;gap:.1rem;min-height:1.45rem;padding:.24rem;overflow:hidden;border-radius:.34rem;background:radial-gradient(circle at 50% 70%,rgba(36,48,68,.06),transparent 44%),#ffffffdb}.christianity-card-frame-effect strong{justify-self:end;align-self:end;padding:.12rem .32rem;border-radius:999px;background:#edf2f7;font-size:clamp(.66rem,2vw,.82rem);line-height:1.05}.christianity-card-frame-effect p{margin:0;overflow:hidden;color:#1f2933b8;font-size:.58rem;line-height:1.1;text-overflow:ellipsis;white-space:nowrap}.christianity-card-frame-footer{display:flex;justify-content:space-between;gap:.22rem;color:#1f293385;font-size:.46rem;font-weight:800;line-height:1}.christianity-card-frame--battle{gap:.22rem;padding:.42rem}.christianity-card-frame--battle .christianity-card-frame-art{min-height:2.6rem}.christianity-card-frame--leader .christianity-card-frame-art{background:linear-gradient(135deg,#2563eb24,#d6a21d29),radial-gradient(circle at 50% 18%,rgba(255,255,255,.78),transparent 48%),#e7eef8}.christianity-card-frame--list{width:clamp(4.4rem,22vw,5.8rem);padding:.38rem}.christianity-card-frame--list .christianity-card-frame-art{min-height:2.5rem}.christianity-hand-card-wrap{position:relative;display:grid;justify-items:center;flex:0 0 auto;margin-inline:-.42rem;padding-bottom:2rem;transform-origin:50% 115%;transition:transform .16s ease,filter .16s ease}.christianity-hand-card-wrap:hover,.christianity-hand-card-wrap.is-selected,.christianity-hand-card-wrap.is-dragging{z-index:3}.christianity-hand-card-wrap:hover .christianity-card-preview-card--hand,.christianity-hand-card-wrap.is-selected .christianity-card-preview-card--hand,.christianity-hand-card-wrap.is-dragging .christianity-card-preview-card--hand{border-color:var(--christianity-theme-gold);box-shadow:0 0 0 .12rem var(--christianity-theme-gold-soft),0 1rem 2rem var(--christianity-theme-shadow)}.christianity-card-preview-card--hand{touch-action:none}.christianity-card-preview-card--hand.cdk-drag-disabled{cursor:not-allowed}.christianity-card-preview-card.cdk-drag-preview{width:clamp(4.9rem,17vw,7.1rem);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);border:1px solid var(--christianity-theme-gold-ring);box-shadow:0 0 0 .16rem #fff4c2ad,0 1.5rem 3rem var(--christianity-theme-shadow-strong);transform:rotate(2deg) scale(1.03)}.christianity-card-preview-card.cdk-drag-placeholder{width:clamp(4.9rem,17vw,7.1rem);height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);opacity:.22}.christianity-slot.cdk-drop-list-dragging,.christianity-offering-pile.cdk-drop-list-dragging{border-color:var(--christianity-theme-gold-ring)}.christianity-slot.cdk-drop-list-receiving,.christianity-offering-pile.cdk-drop-list-receiving{box-shadow:inset 0 0 0 .18rem #d6a21d57,0 1rem 1.9rem var(--christianity-theme-shadow-strong)}.christianity-card-eye{position:absolute;right:50%;bottom:.38rem;width:2.15rem;height:1.55rem;border:1px solid color-mix(in srgb,var(--christianity-theme-focus) 52%,transparent);border-radius:999px;background:#fffffff0;box-shadow:0 .55rem 1.1rem #102a4324;opacity:0;transform:translate(50%,-.2rem) scale(.92);transition:opacity .14s ease,transform .14s ease,border-color .14s ease}.christianity-card-eye:before{content:\"\";position:absolute;top:50%;left:50%;width:1.1rem;height:1.1rem;border:.12rem solid var(--christianity-theme-focus);border-radius:82% 0;background:#fffffff0;transform:translate(-50%,-50%) rotate(45deg)}.christianity-card-eye:after{content:\"\";position:absolute;top:50%;left:50%;width:.42rem;height:.42rem;border:.09rem solid rgba(255,255,255,.95);border-radius:999px;background:radial-gradient(circle at 35% 32%,#ffffff 0 .06rem,transparent .07rem),var(--christianity-theme-focus);transform:translate(-50%,-50%)}.christianity-hand-card-wrap:hover .christianity-card-eye,.christianity-hand-card-wrap.is-selected .christianity-card-eye,.christianity-card-eye:focus-visible{opacity:1;transform:translate(50%) scale(1)}.christianity-offering-pile.is-play-target{border-color:var(--christianity-theme-gold-ring);background:linear-gradient(180deg,#fffaf0f5,#fffffff0),radial-gradient(circle at 82% 14%,rgba(250,204,21,.28) 0 .7rem,transparent .72rem);box-shadow:inset 0 0 0 .12rem #d6a21d3d,0 .8rem 1.55rem var(--christianity-theme-shadow);animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-card-frame--back,.christianity-card-preview-card--back{width:clamp(4rem,14vw,5.7rem);min-height:0;aspect-ratio:var(--christianity-card-aspect);place-items:center;padding:.55rem;overflow:hidden;box-shadow:0 .8rem 1.55rem #24304424;transform-origin:50% -18%;background:var(--christianity-card-back)}.christianity-card-frame--back:before,.christianity-card-preview-card--back:before{content:\"\";position:absolute;inset:.5rem;border:1px solid rgba(16,42,67,.12);border-radius:.38rem;background:linear-gradient(180deg,#ffffff2e,#ffffff0a);box-shadow:inset 0 0 0 .12rem #ffffff1f}.christianity-card-preview-card--battle{justify-self:center;width:var(--christianity-battle-card-width);min-width:0;height:auto;min-height:0;aspect-ratio:var(--christianity-card-aspect);margin-inline:0}.christianity-card-preview-card>span,.christianity-card-mini>span,.christianity-offering-pile>span,.christianity-offering-card>span,.christianity-leader-card>span,.christianity-zone-card>span,.christianity-zone-pile>span{position:relative;z-index:2;align-self:start;font-weight:700;line-height:1.05}.christianity-card-preview-card>strong,.christianity-card-mini>strong,.christianity-offering-pile>strong,.christianity-offering-card>strong,.christianity-leader-card>strong,.christianity-zone-card>strong,.christianity-zone-pile>strong{position:relative;z-index:3;justify-self:end;align-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-player-rack{box-sizing:border-box;display:grid;grid-template-columns:minmax(5.9rem,7rem) minmax(5rem,1fr) minmax(4.2rem,7rem);gap:.45rem;align-items:end;justify-items:stretch;width:100%;max-width:100%;min-width:0}.christianity-player-rack--opponent{align-items:start}.christianity-hand-meter{position:absolute;top:0;right:.35rem;z-index:4;display:inline-grid;grid-auto-flow:column;gap:.25rem;align-items:center;min-height:1.7rem;padding:.18rem .46rem;border:1px solid rgba(36,48,68,.12);border-radius:999px;background:#ffffffe6;box-shadow:0 .35rem .8rem #102a4314}.christianity-hand-meter--opponent{top:.15rem}.christianity-hand-meter span{color:#1f293394;font-size:.68rem}.christianity-hand-meter strong{font-size:.86rem}.christianity-player-badge,.christianity-player-command{display:grid;gap:.35rem;justify-items:center;min-width:0}.christianity-player-badge{align-content:start;color:#1f2933c2;font-size:.74rem}.christianity-player-badge--opponent{justify-self:center;grid-auto-flow:column;align-items:center;justify-content:center}.christianity-player-badge strong{max-width:6.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-avatar{display:grid;place-items:center;width:1.85rem;height:1.85rem;border-radius:999px;color:#fff;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .9rem #102a4329}.christianity-offerings-zone{display:flex;flex-wrap:wrap;gap:.25rem;justify-content:flex-start;justify-self:start;width:100%}.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile{display:grid;align-content:space-between;min-height:4.9rem;padding:.48rem;text-align:left}.christianity-card-frame{display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;align-content:stretch}.christianity-offering-pile,.christianity-zone-card,.christianity-zone-pile{grid-template-rows:auto minmax(2.6rem,1fr) auto;align-content:stretch;gap:.32rem}.christianity-card-mini{width:3.5rem}.christianity-offering-pile{position:relative;isolation:isolate;overflow:hidden;justify-self:start;width:min(100%,5.9rem);min-height:7.1rem;padding:.95rem .52rem .6rem;background:linear-gradient(180deg,#fff,#f8fafc),linear-gradient(135deg,rgba(250,204,21,.18),transparent 42%)}.christianity-offering-pile i{position:absolute;top:2.45rem;left:.72rem;z-index:-1;width:2.55rem;height:3.55rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:linear-gradient(180deg,#ffffffeb,#f1f5f9eb),radial-gradient(circle at 78% 18%,#facc15 0 .38rem,transparent .4rem);box-shadow:0 .35rem .85rem #102a431a;transform:rotate(-5deg)}.christianity-offering-pile i:nth-child(2){transform:translate(.28rem,.08rem) rotate(3deg)}.christianity-offering-pile i:nth-child(3){transform:translate(.55rem,.18rem) rotate(-1deg)}.christianity-leader-card{align-self:center;justify-self:center;width:clamp(4.75rem,17vw,6rem);min-height:0;aspect-ratio:var(--christianity-card-aspect)}.christianity-rack-spacer{display:block;min-height:1px}.christianity-battle-zone{grid-template-columns:repeat(4,var(--christianity-battle-card-width))}.christianity-shared-zone{box-sizing:border-box;display:grid;grid-template-columns:repeat(3,minmax(4.3rem,1fr));align-items:stretch;width:100%;max-width:100%;min-width:0}.christianity-zone-card,.christianity-zone-pile{min-height:6.45rem;padding:.7rem .52rem .55rem}.christianity-zone-pile{position:relative;isolation:isolate;overflow:hidden;box-shadow:inset 0 0 0 999px #ffffff1f}.christianity-zone-pile i{position:absolute;top:2.2rem;right:.72rem;z-index:-1;width:2.7rem;height:3.7rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:#f8fafc;box-shadow:0 .35rem .85rem #102a431c;transform:rotate(4deg)}.christianity-zone-pile i:nth-child(2){transform:translate(-.28rem,.12rem) rotate(-3deg)}.christianity-zone-pile i:nth-child(3){background:var(--christianity-card-back);transform:translate(-.54rem,.24rem) rotate(2deg)}.christianity-floating-card-shell{position:fixed;top:50%;left:50%;z-index:80;display:grid;gap:.55rem;width:min(26rem,calc(100vw - 1.25rem));padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-floating-card{position:relative;z-index:1;display:grid;grid-template-rows:auto minmax(9rem,1.25fr) auto minmax(7rem,.9fr) auto;gap:.58rem;width:100%;min-height:min(29rem,calc(100vh - 3.5rem));padding:.72rem;border:1px solid rgba(36,48,68,.18);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,var(--christianity-theme-gold-soft),transparent 45%);box-shadow:0 0 0 .18rem #fff4c294,0 0 2.2rem var(--christianity-theme-glow),0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c;touch-action:none;transform:translate(var(--preview-shift-x, 0px),var(--preview-shift-y, 0px)) perspective(48rem) rotateX(var(--preview-rotate-x, 5deg)) rotateY(var(--preview-rotate-y, -5deg));transition:transform 90ms ease-out}.christianity-full-card-header{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:.42rem;align-items:center}.christianity-full-card-header strong{min-width:0;display:-webkit-box;overflow:hidden;overflow-wrap:anywhere;text-overflow:clip;-webkit-box-orient:vertical;-webkit-line-clamp:2;font-size:clamp(1.25rem,5vw,1.85rem);line-height:1.04}.christianity-full-card-type-icon,.christianity-full-card-cost{display:grid;place-items:center;border-radius:999px}.christianity-full-card-type-icon{width:1.6rem;height:1.6rem;background:radial-gradient(circle at 50% 50%,rgba(95,111,42,.72) 0 .22rem,transparent .24rem),#2430441a}.christianity-full-card-cost{min-width:2.1rem;height:2.1rem;padding:0 .36rem;background:#ffd91a;color:#243044;font-size:1.1rem;font-weight:900;box-shadow:inset 0 -.12rem #52401c2e}.christianity-full-card-art{position:relative;display:grid;place-items:center;min-height:9rem;overflow:hidden;border-radius:.48rem;background:linear-gradient(135deg,#5f6f2a33,#d6a21d29),radial-gradient(circle at 50% 25%,rgba(255,255,255,.76),transparent 42%),#dbe7ef;box-shadow:inset 0 0 0 1px #24304414}.christianity-full-card-art img{width:100%;height:100%;object-fit:cover}.christianity-full-card-art>span{max-width:80%;color:#24304494;font-size:clamp(1.1rem,5vw,1.8rem);font-weight:900;line-height:1.05;text-align:center}.christianity-full-card-art small{position:absolute;right:0;bottom:.55rem;min-width:5rem;padding:.16rem .48rem;border-radius:999px 0 0 999px;background:#ffffffe6;box-shadow:0 .3rem .8rem #102a431f;color:#1f2933bd;font-size:.68rem;font-style:italic;font-weight:900;text-align:center;text-transform:uppercase}.christianity-full-card-verse,.christianity-full-card-effect{display:grid;gap:.32rem}.christianity-full-card-verse p,.christianity-full-card-effect p{margin:0;line-height:1.25}.christianity-full-card-verse{color:#171923;font-family:Georgia,Times New Roman,serif;font-size:clamp(.72rem,2.7vw,.86rem)}.christianity-full-card-verse strong{font-family:inherit;font-size:.78rem;font-weight:900}.christianity-full-card-effect{position:relative;align-content:start;min-height:7rem;padding:.6rem .7rem;overflow:hidden;border-radius:.45rem;background:radial-gradient(circle at 50% 72%,rgba(36,48,68,.07),transparent 34%),#ffffffdb}.christianity-full-card-stats{display:flex;gap:1rem;min-height:1.35rem}.christianity-full-card-stats strong{font-size:1rem;line-height:1}.christianity-full-card-effect>div:last-of-type{display:grid;gap:.12rem}.christianity-full-card-effect>div:last-of-type strong{font-size:.82rem}.christianity-full-card-effect p{font-size:clamp(.78rem,2.9vw,.92rem)}.christianity-full-card-rarity{position:absolute;top:.62rem;right:.62rem;width:.46rem;height:.46rem;border-radius:.12rem;transform:rotate(45deg)}.christianity-full-card-rarity.is-normal{background:#d1d5db}.christianity-full-card-rarity.is-uncommon{background:#22c55e}.christianity-full-card-rarity.is-rare{background:#3b82f6}.christianity-full-card-rarity.is-legendary{background:#eab308}.christianity-full-card-footer{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;gap:.34rem;align-items:center;color:#1f2933ad;font-size:.58rem;line-height:1;text-transform:uppercase}.christianity-full-card-footer span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-floating-card-close{position:absolute;top:0;right:.15rem;z-index:4;min-height:2rem;padding:0 .6rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#ffffffe6;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .45rem 1rem #102a431a}.christianity-preview-backdrop,.christianity-history-backdrop,.christianity-info-backdrop{position:fixed;inset:0;border:0;border-radius:0;background:#0f172a75}.christianity-preview-backdrop{z-index:79}.christianity-info-backdrop{z-index:50}.christianity-info-panel{position:fixed;top:50%;left:50%;z-index:51;width:min(31rem,calc(100vw - 1.25rem));max-height:min(34rem,calc(100vh - 2rem));padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-info-close{position:absolute;top:0;right:.15rem;z-index:2}.christianity-rule-note{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.85rem;max-height:inherit;padding:1rem;overflow-y:auto;border:1px solid rgba(36,48,68,.14);border-radius:.9rem;background:linear-gradient(180deg,#fffffff7,#f8fafcf7),radial-gradient(circle at 8% 0%,rgba(37,99,235,.1),transparent 38%);box-shadow:0 1.2rem 2.6rem #102a433d,inset 0 0 0 .25rem #ffffff85}.christianity-rule-note-icon{display:grid;place-items:center;width:2.1rem;height:2.1rem;border-radius:999px;background:color-mix(in srgb,var(--christianity-theme-focus) 12%,#ffffff);color:var(--christianity-theme-focus);font-size:1rem;font-weight:900;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--christianity-theme-focus) 24%,transparent)}.christianity-rule-note small,.christianity-rule-note strong,.christianity-rule-note p,.christianity-rule-note h2{margin:0}.christianity-rule-note small{color:#1f29339e;font-size:.78rem;font-weight:800;text-transform:uppercase}.christianity-rule-note h2{margin-top:.18rem;font-size:clamp(1.5rem,7vw,2.2rem);line-height:1.05}.christianity-rule-note strong{display:inline-flex;width:fit-content;margin-top:.55rem;padding:.22rem .55rem;border-radius:999px;background:#edf2f7;font-size:.92rem}.christianity-rule-note p{margin-top:.75rem;color:#1f2933c7;line-height:1.45}.christianity-rule-note ul{display:grid;gap:.45rem;margin:.8rem 0 0;padding-left:1.05rem;color:#1f2933c7;line-height:1.35}.christianity-floating-card>small,.christianity-floating-card>span{color:#1f2933a3}.christianity-floating-card>strong{font-size:clamp(1.55rem,8vw,2.35rem);line-height:1.05}.christianity-floating-card>p{margin:0;align-self:end;font-size:.95rem;line-height:1.35}.christianity-floating-card-actions{position:relative;z-index:4;display:flex;justify-content:center;padding:0 .35rem;transform:translateZ(0)}.christianity-floating-card-actions button{min-height:2.35rem;padding:0 1rem;border:0;border-radius:999px;background:#102a43;color:#fff;font:inherit;font-size:.9rem;font-weight:800;box-shadow:0 .65rem 1.3rem #102a432e}.christianity-floating-card-actions button:disabled{cursor:not-allowed;opacity:.45}@media (min-width: 52rem){.christianity-floating-card-shell{width:min(29rem,calc(100vw - 3rem))}.christianity-floating-card{min-height:min(35rem,calc(100vh - 4rem));padding:1.35rem}}.christianity-history-backdrop{z-index:40}.christianity-history-drawer{position:fixed;right:auto;bottom:max(.5rem,env(safe-area-inset-bottom));left:50%;z-index:41;display:grid;grid-template-rows:auto minmax(0,1fr);gap:.75rem;width:min(calc(100vw - 1rem),44rem);min-height:min(18rem,calc(100dvh - 1rem));max-height:min(32rem,calc(100dvh - 2rem));padding:.8rem;border:1px solid rgba(36,48,68,.16);border-radius:.75rem;background:#fffffffa;box-shadow:0 1.5rem 4rem #102a4347;transform:translate(-50%)}.christianity-history-drawer header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-history-drawer h2,.christianity-history-drawer p{margin:0}.christianity-history-drawer header span{display:grid;place-items:center;min-width:1.85rem;height:1.85rem;border-radius:999px;background:#edf2f7;font-weight:800}.christianity-dialog-actions{display:flex;align-items:center;gap:.45rem}.christianity-dialog-close{min-height:1.85rem;padding:0 .62rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#fff;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .8rem #102a4314}.christianity-history-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.4rem,1fr));gap:.55rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem .1rem .25rem}.christianity-history-grid::-webkit-scrollbar,.christianity-offering-list::-webkit-scrollbar{width:.65rem}.christianity-history-grid::-webkit-scrollbar-track,.christianity-offering-list::-webkit-scrollbar-track{border-radius:999px;background:#e2e8f0b8}.christianity-history-grid::-webkit-scrollbar-thumb,.christianity-offering-list::-webkit-scrollbar-thumb{border:.14rem solid rgba(226,232,240,.72);border-radius:999px;background:#24304452}.christianity-offerings-drawer{grid-template-rows:auto auto minmax(0,1fr);width:min(calc(100vw - 1rem),48rem);min-height:min(20rem,calc(100dvh - 1rem));max-height:min(34rem,calc(100dvh - 2rem))}.christianity-offerings-note{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.65rem;align-items:start;padding:.72rem .8rem;border:1px solid rgba(36,48,68,.12);border-radius:.7rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 8% 0%,rgba(214,162,29,.12),transparent 42%)}.christianity-offerings-note p{margin:0;color:#1f2933c2;font-size:.86rem;line-height:1.35}.christianity-offering-list{display:grid;gap:.6rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem}.christianity-offering-row{display:grid;grid-template-columns:minmax(5.4rem,6.5rem) minmax(0,1fr);gap:.65rem;align-items:center;padding:.45rem;border:1px solid rgba(36,48,68,.12);border-radius:.65rem;background:#fff}.christianity-offering-row.is-exhausted{opacity:.68}.christianity-offering-card{position:relative;display:grid;grid-template-rows:auto minmax(0,1fr) auto;align-content:stretch;gap:.26rem;width:100%;min-height:7.7rem;padding:.58rem;overflow:hidden;text-align:left;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 78% 14%,rgba(250,204,21,.78) 0 .42rem,transparent .44rem);box-shadow:0 .45rem 1rem #102a431a}.christianity-offering-card small{min-width:0;overflow:hidden;color:#1f293394;font-size:.62rem;font-weight:800;line-height:1;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.christianity-offering-card strong{display:-webkit-box;align-self:start;min-width:0;margin-top:.1rem;overflow:hidden;overflow-wrap:anywhere;font-size:.88rem;line-height:1.05;-webkit-box-orient:vertical;-webkit-line-clamp:3}.christianity-offering-card span{position:absolute;right:.42rem;bottom:.42rem;display:grid;place-items:center;min-width:1.55rem;height:1.55rem;padding:0 .28rem;border-radius:999px;background:#edf2f7;font-size:.82rem;font-weight:900}.christianity-offering-card em{align-self:end;max-width:calc(100% - 1.9rem);overflow:hidden;color:#1f29339e;font-size:.64rem;font-style:normal;font-weight:800;line-height:1.05;text-overflow:ellipsis;white-space:nowrap}.christianity-offering-card p,.christianity-offering-row p{margin:0}.christianity-offering-card p{align-self:end;color:#1f2933a3;font-size:.72rem;line-height:1.2}.christianity-offering-row>div{display:grid;gap:.35rem;align-content:center;min-width:0}.christianity-offering-row>div p{color:#1f2933b8;font-size:.85rem;line-height:1.3}.christianity-offering-row>div button{justify-self:start;min-height:2.2rem;padding:0 .7rem;border:1px solid rgba(16,42,67,.16);border-radius:.5rem;background:#102a43;color:#fff;font:inherit;font-weight:800}.christianity-offering-row>div button:disabled{background:#e2e8f0;color:#1f293394}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible{outline:.1875rem solid color-mix(in srgb,var(--christianity-theme-focus) 24%,transparent);outline-offset:.125rem}@media (max-width: 720px){.christianity-shell{padding:.55rem 0;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-match-strip{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:.35rem;padding:.35rem}.christianity-match-player{gap:.35rem}.christianity-match-player small{display:none}.christianity-scoreboard{min-width:3.65rem;padding:0 .35rem}.christianity-scoreboard strong{font-size:1.05rem}.christianity-table{gap:.35rem;padding-right:.25rem;padding-left:.25rem}.christianity-player-side{padding:.3rem .25rem}.christianity-battle-zone{--christianity-battle-card-width: min(5.2rem, calc((100vw - 4.25rem)/4) );grid-template-columns:repeat(4,var(--christianity-battle-card-width));justify-content:center;min-height:8.75rem;overflow-x:clip}.christianity-hand-fan{min-height:11.45rem;padding-bottom:2rem;overflow:visible}.christianity-hand-shelf{min-height:12.65rem;margin-top:-1rem;padding-top:1.35rem;padding-bottom:.9rem}.christianity-hand-shelf--opponent{min-height:6.65rem;margin-top:0;margin-bottom:0;padding-top:.4rem;padding-bottom:.85rem}.christianity-player-rack{grid-template-columns:minmax(4.5rem,5.7rem) minmax(4.4rem,1fr) minmax(3.5rem,4.8rem)}.christianity-shared-zone{gap:.45rem;grid-template-columns:repeat(3,minmax(0,1fr))}.christianity-zone-card,.christianity-zone-pile{min-height:6.15rem;padding:.58rem .46rem .5rem;gap:.24rem}.christianity-zone-pile i{top:2rem;right:.52rem;width:2.35rem;height:3.25rem}.christianity-offering-pile{min-height:6.85rem;padding:.88rem .46rem .55rem;gap:.24rem}.christianity-offering-pile i{top:2.25rem;left:.56rem;width:2.35rem;height:3.25rem}.christianity-card-preview-card{width:clamp(4.2rem,20vw,5.7rem);height:auto;min-height:0}.christianity-leader-card{width:clamp(4.55rem,20vw,5.7rem);min-height:0}.christianity-offering-row{grid-template-columns:minmax(5rem,5.8rem) minmax(0,1fr);gap:.5rem}.christianity-offering-card{min-height:7.25rem;padding:.5rem}.christianity-hand-fan--opponent{min-height:5.75rem;padding-bottom:.7rem}.christianity-hand-fan--opponent .christianity-card-frame--back{width:clamp(3.35rem,15vw,4.25rem);margin-inline:-.72rem}}\n"] }]
|
|
70649
|
-
}], ctorParameters: () => [] });
|
|
70650
|
-
|
|
70651
68582
|
addIcons({ refreshOutline, sparklesOutline, trophyOutline });
|
|
70652
68583
|
const BUBBLE_COLORS = {
|
|
70653
68584
|
rose: '#ff4f9f',
|
|
@@ -70704,7 +68635,6 @@ class BubbleBlitzGameComponent {
|
|
|
70704
68635
|
this.animating = signal(false);
|
|
70705
68636
|
this.leaderboard = signal(this.readLeaderboard());
|
|
70706
68637
|
this.confirmAction = signal(undefined);
|
|
70707
|
-
this.confirmedAction = signal(undefined);
|
|
70708
68638
|
this.config = computed(() => MODE_CONFIG[this.mode()]);
|
|
70709
68639
|
this.feverReady = computed(() => this.fever() >= this.config().feverTarget);
|
|
70710
68640
|
this.feverProgress = computed(() => Math.min(100, Math.round((this.fever() / this.config().feverTarget) * 100)));
|
|
@@ -70884,12 +68814,13 @@ class BubbleBlitzGameComponent {
|
|
|
70884
68814
|
closeConfirmModal() {
|
|
70885
68815
|
this.confirmAction.set(undefined);
|
|
70886
68816
|
}
|
|
70887
|
-
|
|
70888
|
-
|
|
70889
|
-
|
|
70890
|
-
this.confirmedAction.set(undefined);
|
|
70891
|
-
if (!action)
|
|
68817
|
+
confirmPendingAction(token) {
|
|
68818
|
+
if (token !== 'confirm') {
|
|
68819
|
+
this.closeConfirmModal();
|
|
70892
68820
|
return;
|
|
68821
|
+
}
|
|
68822
|
+
const action = this.confirmAction();
|
|
68823
|
+
this.confirmAction.set(undefined);
|
|
70893
68824
|
if (action === 'restart') {
|
|
70894
68825
|
this.start();
|
|
70895
68826
|
return;
|
|
@@ -70902,15 +68833,6 @@ class BubbleBlitzGameComponent {
|
|
|
70902
68833
|
this.resetToGamesMenu();
|
|
70903
68834
|
}
|
|
70904
68835
|
}
|
|
70905
|
-
confirmPendingAction(token) {
|
|
70906
|
-
if (token !== 'confirm') {
|
|
70907
|
-
this.closeConfirmModal();
|
|
70908
|
-
return;
|
|
70909
|
-
}
|
|
70910
|
-
const action = this.confirmAction();
|
|
70911
|
-
this.confirmedAction.set(action);
|
|
70912
|
-
this.confirmAction.set(undefined);
|
|
70913
|
-
}
|
|
70914
68836
|
startTimer() {
|
|
70915
68837
|
this.stopTimer();
|
|
70916
68838
|
this.timer = window.setInterval(() => {
|
|
@@ -71214,7 +69136,7 @@ class BubbleBlitzGameComponent {
|
|
|
71214
69136
|
<ion-modal
|
|
71215
69137
|
[isOpen]="!!confirmAction()"
|
|
71216
69138
|
cssClass="val-modal-adaptive"
|
|
71217
|
-
(didDismiss)="
|
|
69139
|
+
(didDismiss)="closeConfirmModal()"
|
|
71218
69140
|
>
|
|
71219
69141
|
<ng-template>
|
|
71220
69142
|
<val-modal-layout
|
|
@@ -71364,7 +69286,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
71364
69286
|
<ion-modal
|
|
71365
69287
|
[isOpen]="!!confirmAction()"
|
|
71366
69288
|
cssClass="val-modal-adaptive"
|
|
71367
|
-
(didDismiss)="
|
|
69289
|
+
(didDismiss)="closeConfirmModal()"
|
|
71368
69290
|
>
|
|
71369
69291
|
<ng-template>
|
|
71370
69292
|
<val-modal-layout
|
|
@@ -71428,7 +69350,6 @@ class MemoryGameComponent {
|
|
|
71428
69350
|
this.lockBoard = signal(false);
|
|
71429
69351
|
this.leaderboard = signal(this.readLeaderboard());
|
|
71430
69352
|
this.confirmAction = signal(undefined);
|
|
71431
|
-
this.confirmedAction = signal(undefined);
|
|
71432
69353
|
this.profileConfig = computed(() => PROFILE_CONFIG[this.profile()]);
|
|
71433
69354
|
this.pairCount = computed(() => this.profileConfig().pairs);
|
|
71434
69355
|
this.boardClass = computed(() => `memory-board ${this.profileConfig().boardClass}`);
|
|
@@ -71566,12 +69487,13 @@ class MemoryGameComponent {
|
|
|
71566
69487
|
closeConfirmModal() {
|
|
71567
69488
|
this.confirmAction.set(undefined);
|
|
71568
69489
|
}
|
|
71569
|
-
|
|
71570
|
-
|
|
71571
|
-
|
|
71572
|
-
this.confirmedAction.set(undefined);
|
|
71573
|
-
if (!action)
|
|
69490
|
+
confirmPendingAction(token) {
|
|
69491
|
+
if (token !== 'confirm') {
|
|
69492
|
+
this.closeConfirmModal();
|
|
71574
69493
|
return;
|
|
69494
|
+
}
|
|
69495
|
+
const action = this.confirmAction();
|
|
69496
|
+
this.confirmAction.set(undefined);
|
|
71575
69497
|
if (action === 'restart') {
|
|
71576
69498
|
this.start();
|
|
71577
69499
|
return;
|
|
@@ -71584,15 +69506,6 @@ class MemoryGameComponent {
|
|
|
71584
69506
|
this.resetToGamesMenu();
|
|
71585
69507
|
}
|
|
71586
69508
|
}
|
|
71587
|
-
confirmPendingAction(token) {
|
|
71588
|
-
if (token !== 'confirm') {
|
|
71589
|
-
this.closeConfirmModal();
|
|
71590
|
-
return;
|
|
71591
|
-
}
|
|
71592
|
-
const action = this.confirmAction();
|
|
71593
|
-
this.confirmedAction.set(action);
|
|
71594
|
-
this.confirmAction.set(undefined);
|
|
71595
|
-
}
|
|
71596
69509
|
flip(card) {
|
|
71597
69510
|
if (this.lockBoard() || card.flipped || card.matched || this.won() || this.failed())
|
|
71598
69511
|
return;
|
|
@@ -71907,7 +69820,7 @@ class MemoryGameComponent {
|
|
|
71907
69820
|
<ion-modal
|
|
71908
69821
|
[isOpen]="!!confirmAction()"
|
|
71909
69822
|
cssClass="val-modal-adaptive"
|
|
71910
|
-
(didDismiss)="
|
|
69823
|
+
(didDismiss)="closeConfirmModal()"
|
|
71911
69824
|
>
|
|
71912
69825
|
<ng-template>
|
|
71913
69826
|
<val-modal-layout
|
|
@@ -72065,7 +69978,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
72065
69978
|
<ion-modal
|
|
72066
69979
|
[isOpen]="!!confirmAction()"
|
|
72067
69980
|
cssClass="val-modal-adaptive"
|
|
72068
|
-
(didDismiss)="
|
|
69981
|
+
(didDismiss)="closeConfirmModal()"
|
|
72069
69982
|
>
|
|
72070
69983
|
<ng-template>
|
|
72071
69984
|
<val-modal-layout
|
|
@@ -72411,7 +70324,6 @@ class SimonGameComponent {
|
|
|
72411
70324
|
this.activePad = signal(undefined);
|
|
72412
70325
|
this.leaderboard = signal(this.readLeaderboard());
|
|
72413
70326
|
this.confirmAction = signal(undefined);
|
|
72414
|
-
this.confirmedAction = signal(undefined);
|
|
72415
70327
|
this.modeConfig = computed(() => SIMON_MODES[this.mode()]);
|
|
72416
70328
|
this.bestRound = computed(() => this.modeLeaderboard()[0]?.round ?? 0);
|
|
72417
70329
|
this.modeLeaderboard = computed(() => this.leaderboard()
|
|
@@ -72511,12 +70423,13 @@ class SimonGameComponent {
|
|
|
72511
70423
|
closeConfirmModal() {
|
|
72512
70424
|
this.confirmAction.set(undefined);
|
|
72513
70425
|
}
|
|
72514
|
-
|
|
72515
|
-
|
|
72516
|
-
|
|
72517
|
-
this.confirmedAction.set(undefined);
|
|
72518
|
-
if (!action)
|
|
70426
|
+
confirmPendingAction(token) {
|
|
70427
|
+
if (token !== 'confirm') {
|
|
70428
|
+
this.closeConfirmModal();
|
|
72519
70429
|
return;
|
|
70430
|
+
}
|
|
70431
|
+
const action = this.confirmAction();
|
|
70432
|
+
this.confirmAction.set(undefined);
|
|
72520
70433
|
if (action === 'restart') {
|
|
72521
70434
|
this.start();
|
|
72522
70435
|
return;
|
|
@@ -72529,15 +70442,6 @@ class SimonGameComponent {
|
|
|
72529
70442
|
this.resetToGamesMenu();
|
|
72530
70443
|
}
|
|
72531
70444
|
}
|
|
72532
|
-
confirmPendingAction(token) {
|
|
72533
|
-
if (token !== 'confirm') {
|
|
72534
|
-
this.closeConfirmModal();
|
|
72535
|
-
return;
|
|
72536
|
-
}
|
|
72537
|
-
const action = this.confirmAction();
|
|
72538
|
-
this.confirmedAction.set(action);
|
|
72539
|
-
this.confirmAction.set(undefined);
|
|
72540
|
-
}
|
|
72541
70445
|
tap(pad) {
|
|
72542
70446
|
if (this.phase() !== 'waiting' || !this.acceptingInput)
|
|
72543
70447
|
return;
|
|
@@ -72781,7 +70685,7 @@ class SimonGameComponent {
|
|
|
72781
70685
|
<ion-modal
|
|
72782
70686
|
[isOpen]="!!confirmAction()"
|
|
72783
70687
|
cssClass="val-modal-adaptive"
|
|
72784
|
-
(didDismiss)="
|
|
70688
|
+
(didDismiss)="closeConfirmModal()"
|
|
72785
70689
|
>
|
|
72786
70690
|
<ng-template>
|
|
72787
70691
|
<val-modal-layout
|
|
@@ -72911,7 +70815,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
72911
70815
|
<ion-modal
|
|
72912
70816
|
[isOpen]="!!confirmAction()"
|
|
72913
70817
|
cssClass="val-modal-adaptive"
|
|
72914
|
-
(didDismiss)="
|
|
70818
|
+
(didDismiss)="closeConfirmModal()"
|
|
72915
70819
|
>
|
|
72916
70820
|
<ng-template>
|
|
72917
70821
|
<val-modal-layout
|
|
@@ -88227,5 +86131,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
88227
86131
|
* Generated bundle index. Do not edit.
|
|
88228
86132
|
*/
|
|
88229
86133
|
|
|
88230
|
-
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHESSIMALS_BOT_PROFILES, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChessimalsGameComponent, ChessimalsOnlineService, ChipGroupComponent, ChristianityGameComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, MiniGamePlayerProfileService, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RetroAudioService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, applyChessimalsMove, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, chooseChessimalsBotMove, collections, connectPageRefresh, createChessimalsGame, createChessimalsReviewState, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, docs, errorLoggingInterceptor, extractPathParams, formatClockTime, formatDateSeparator, formatRelativeTime, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getChessimalsAllLegalMoves, getChessimalsLegalMoves, getChessimalsPieceAt, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, positionKey, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, rbacGuard, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resignChessimalsGame, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle, validateRoutes };
|
|
86134
|
+
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHESSIMALS_BOT_PROFILES, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChessimalsGameComponent, ChessimalsOnlineService, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, MiniGamePlayerProfileService, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RetroAudioService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, applyChessimalsMove, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, chooseChessimalsBotMove, collections, connectPageRefresh, createChessimalsGame, createChessimalsReviewState, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, docs, errorLoggingInterceptor, extractPathParams, formatClockTime, formatDateSeparator, formatRelativeTime, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getChessimalsAllLegalMoves, getChessimalsLegalMoves, getChessimalsPieceAt, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, positionKey, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, rbacGuard, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resignChessimalsGame, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle, validateRoutes };
|
|
88231
86135
|
//# sourceMappingURL=valtech-components.mjs.map
|