valtech-components 4.0.477 → 4.0.478
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 +18 -9
- package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +109 -16
- package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +18 -9
- package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +268 -0
- package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +2253 -0
- package/esm2022/lib/components/organisms/mini-games/memory-game.component.mjs +18 -9
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +275 -9
- package/esm2022/lib/components/organisms/mini-games/simon-game.component.mjs +18 -9
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/directives/light-ripple.directive.mjs +57 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/mini-games/public-api.mjs +34 -2
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/valtech-components-mini-games.mjs +34 -2
- package/fesm2022/valtech-components-mini-games.mjs.map +1 -1
- package/fesm2022/valtech-components.mjs +3021 -58
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/mini-games/bubble-blitz-game.component.d.ts +2 -0
- package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +3 -1
- package/lib/components/organisms/mini-games/christianity-card.component.d.ts +46 -0
- package/lib/components/organisms/mini-games/christianity-game.component.d.ts +177 -0
- package/lib/components/organisms/mini-games/memory-game.component.d.ts +2 -0
- package/lib/components/organisms/mini-games/simon-game.component.d.ts +2 -0
- package/lib/components/organisms/mini-games/types.d.ts +131 -1
- package/lib/directives/light-ripple.directive.d.ts +8 -0
- package/lib/version.d.ts +1 -1
- package/mini-games/public-api.d.ts +4 -0
- package/package.json +2 -1
- package/public-api.d.ts +2 -0
- package/src/lib/assets/games/christianity/card-symbol.svg +51 -0
- package/src/lib/assets/games/christianity/card-template-reference/front.html +114 -0
- package/src/lib/assets/games/christianity/card-template-reference/front.style.css +352 -0
- package/src/lib/assets/games/christianity/data/01-genesis.bible-reference-suggestions.csv +191 -0
- package/src/lib/assets/games/christianity/data/01-genesis.bible-verses.nbv-open.csv +170 -0
- package/src/lib/assets/games/christianity/data/01-genesis.cards.csv +281 -0
- package/src/lib/assets/games/christianity/data/01-genesis.cards.i18n.csv +281 -0
- package/src/lib/assets/games/christianity/data/01-genesis.cards.json +16453 -0
- package/src/lib/assets/games/christianity/data/01-genesis.unassigned-effects.csv +49 -0
- package/src/lib/assets/games/christianity/data/README.md +40 -0
- package/src/lib/assets/games/christianity/data/data-con-habilides.csv +273 -0
- package/src/lib/assets/games/christianity/data/habilidades-por-tipo.xlsx +0 -0
- package/src/lib/assets/games/christianity/data/listado-edicion.csv +281 -0
- package/src/lib/assets/games/christianity/editions/1/cards/.gitkeep +1 -0
- package/src/lib/assets/games/christianity/editions/1/cards/PLACEHOLDER.png +0 -0
- package/src/lib/assets/games/christianity/editions/README.md +34 -0
- package/src/lib/assets/games/christianity/icons/1-icon.png +0 -0
- package/src/lib/assets/games/christianity/icons/action.png +0 -0
- package/src/lib/assets/games/christianity/icons/character.png +0 -0
- package/src/lib/assets/games/christianity/icons/event.png +0 -0
- package/src/lib/assets/games/christianity/icons/leader.png +0 -0
- package/src/lib/assets/games/christianity/icons/offering.png +0 -0
- package/src/lib/assets/games/christianity/icons/place.png +0 -0
- package/src/lib/assets/games/christianity/icons/tool.png +0 -0
- package/src/lib/assets/games/christianity/icons/wisdom.png +0 -0
- package/src/lib/assets/games/christianity/sources/README.md +16 -0
- package/src/lib/assets/games/christianity/sources/spaonbv_vpl.txt +29102 -0
- package/src/lib/assets/games/christianity/sources/spaonbv_vpl.xml +29104 -0
- package/src/lib/assets/games/christianity/spaonbv.txt +52 -0
|
@@ -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, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, HostBinding,
|
|
2
|
+
import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, ErrorHandler, Injectable, DestroyRef, Inject, signal, computed, PLATFORM_ID, isDevMode, Optional, runInInjectionContext, effect, Pipe, TemplateRef, ViewContainerRef, input, Directive, ElementRef, Renderer2, HostListener, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, HostBinding, SecurityContext, NgZone, ViewChild, 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,6 +49,7 @@ 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';
|
|
52
53
|
import 'prismjs/components/prism-scss';
|
|
53
54
|
import 'prismjs/components/prism-json';
|
|
54
55
|
import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
@@ -58,7 +59,7 @@ import fixWebmDuration from 'fix-webm-duration';
|
|
|
58
59
|
* Current version of valtech-components.
|
|
59
60
|
* This is automatically updated during the publish process.
|
|
60
61
|
*/
|
|
61
|
-
const VERSION = '4.0.
|
|
62
|
+
const VERSION = '4.0.478';
|
|
62
63
|
|
|
63
64
|
// Control de estado de refresco (singleton a nivel de módulo)
|
|
64
65
|
let isRefreshing = false;
|
|
@@ -10117,6 +10118,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
10117
10118
|
}]
|
|
10118
10119
|
}], ctorParameters: () => [] });
|
|
10119
10120
|
|
|
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
|
+
|
|
10120
10176
|
/**
|
|
10121
10177
|
* Presets de botón por defecto provistos por la librería.
|
|
10122
10178
|
*
|
|
@@ -61031,18 +61087,66 @@ const CHESSIMALS_BOT_PROFILES = [
|
|
|
61031
61087
|
labelKey: 'chessimalsBotSentinel',
|
|
61032
61088
|
descriptionKey: 'chessimalsBotSentinelBody',
|
|
61033
61089
|
},
|
|
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
|
+
},
|
|
61034
61132
|
];
|
|
61035
61133
|
const BOT_STYLES = {
|
|
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 },
|
|
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, mobility: 0.75, trap: 0.5, endgame: 0.55 },
|
|
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, mobility: 0.85, trap: 0.62, endgame: 0.5 },
|
|
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, mobility: 0.72, trap: 0.45, endgame: 1.1 },
|
|
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, mobility: 0.95, trap: 0.82, endgame: 0.76 },
|
|
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, mobility: 0.82, trap: 0.72, endgame: 0.72 },
|
|
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, mobility: 1.15, trap: 0.9, endgame: 0.82 },
|
|
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, mobility: 1.08, trap: 1.06, endgame: 1 },
|
|
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, mobility: 1.02, trap: 1.18, endgame: 0.82 },
|
|
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, mobility: 0.95, trap: 0.78, endgame: 1.42 },
|
|
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, mobility: 0.86, trap: 1.04, endgame: 0.84 },
|
|
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 },
|
|
61046
61150
|
};
|
|
61047
61151
|
const DEFAULT_BOT_PROFILE_BY_DIFFICULTY = {
|
|
61048
61152
|
easy: 'explorer',
|
|
@@ -61128,8 +61232,17 @@ function chooseChessimalsBotMove(state, difficulty = 'normal', profileId = DEFAU
|
|
|
61128
61232
|
if (moves.length === 0)
|
|
61129
61233
|
return undefined;
|
|
61130
61234
|
const style = BOT_STYLES[profileId] ?? BOT_STYLES[DEFAULT_BOT_PROFILE_BY_DIFFICULTY[difficulty]];
|
|
61131
|
-
const
|
|
61132
|
-
.map((move) => ({ move, score:
|
|
61235
|
+
const quickScored = moves
|
|
61236
|
+
.map((move) => ({ move, score: scoreBotMove(state, move, difficulty, style) }))
|
|
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
|
+
}))
|
|
61133
61246
|
.sort((a, b) => b.score - a.score);
|
|
61134
61247
|
if (difficulty === 'easy') {
|
|
61135
61248
|
const playable = scored.filter((item) => item.score > -3000);
|
|
@@ -61330,7 +61443,7 @@ function getPowerMoves(state, piece, animal) {
|
|
|
61330
61443
|
const directions = getPowerDirections(animal);
|
|
61331
61444
|
const moves = [];
|
|
61332
61445
|
for (const direction of directions) {
|
|
61333
|
-
for (let distance = 1; distance
|
|
61446
|
+
for (let distance = 1; distance < state.boardSize; distance += 1) {
|
|
61334
61447
|
const target = {
|
|
61335
61448
|
row: piece.position.row + direction.row * distance,
|
|
61336
61449
|
col: piece.position.col + direction.col * distance,
|
|
@@ -61391,7 +61504,7 @@ function getKangarooMoves(state, piece) {
|
|
|
61391
61504
|
}
|
|
61392
61505
|
return moves;
|
|
61393
61506
|
}
|
|
61394
|
-
function scoreBotMove(state, move, difficulty, style) {
|
|
61507
|
+
function scoreBotMove(state, move, difficulty, style, includeTacticalPressure = true) {
|
|
61395
61508
|
const color = state.currentTurn;
|
|
61396
61509
|
const targetPiece = move.capturesPieceId
|
|
61397
61510
|
? activePieces(state).find((piece) => piece.id === move.capturesPieceId)
|
|
@@ -61417,6 +61530,14 @@ function scoreBotMove(state, move, difficulty, style) {
|
|
|
61417
61530
|
score += 14 * style.power;
|
|
61418
61531
|
if (wouldUnlockPower(state, color, move.to))
|
|
61419
61532
|
score += 90 * style.unlock;
|
|
61533
|
+
if (includeTacticalPressure && state.boardSize <= 6) {
|
|
61534
|
+
score += countPowerReachAfterMove(state, move, color) * (difficulty === 'hard' ? 8 : 4) * style.mobility;
|
|
61535
|
+
score += countProtectedThreatsAfterMove(state, move, color) * (difficulty === 'hard' ? 36 : 18) * style.trap;
|
|
61536
|
+
score += scoreEndgamePressure(state, move, color) * style.endgame;
|
|
61537
|
+
}
|
|
61538
|
+
else {
|
|
61539
|
+
score += scoreEndgamePressure(state, move, color) * style.endgame;
|
|
61540
|
+
}
|
|
61420
61541
|
if (difficulty === 'hard' && isSquareVulnerableAfterMove(state, move)) {
|
|
61421
61542
|
score -= (targetPiece ? 80 : 140) * style.safety;
|
|
61422
61543
|
}
|
|
@@ -61447,7 +61568,7 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
|
|
|
61447
61568
|
score += centerControl * (difficulty === 'hard' ? 18 : 10) * style.center;
|
|
61448
61569
|
}
|
|
61449
61570
|
const opponentBestReply = opponentMoves
|
|
61450
|
-
.map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style))
|
|
61571
|
+
.map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style, false))
|
|
61451
61572
|
.sort((a, b) => b - a)[0];
|
|
61452
61573
|
if (opponentBestReply) {
|
|
61453
61574
|
const replyWeight = difficulty === 'easy' ? 0.12 : difficulty === 'normal' ? 0.32 : 0.48;
|
|
@@ -61459,6 +61580,34 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
|
|
|
61459
61580
|
}
|
|
61460
61581
|
return score;
|
|
61461
61582
|
}
|
|
61583
|
+
function countPowerReachAfterMove(state, move, color) {
|
|
61584
|
+
try {
|
|
61585
|
+
const afterMove = applyChessimalsMove(state, move);
|
|
61586
|
+
const evaluationState = { ...afterMove, currentTurn: color };
|
|
61587
|
+
return getChessimalsAllLegalMoves(evaluationState, color).filter((nextMove) => nextMove.kind === 'power').length;
|
|
61588
|
+
}
|
|
61589
|
+
catch {
|
|
61590
|
+
return 0;
|
|
61591
|
+
}
|
|
61592
|
+
}
|
|
61593
|
+
function countProtectedThreatsAfterMove(state, move, color) {
|
|
61594
|
+
try {
|
|
61595
|
+
const afterMove = applyChessimalsMove(state, move);
|
|
61596
|
+
const evaluationState = { ...afterMove, currentTurn: color };
|
|
61597
|
+
const ourMoves = getChessimalsAllLegalMoves(evaluationState, color);
|
|
61598
|
+
const enemyPieces = activePieces(afterMove).filter((piece) => piece.color !== color && !piece.captured);
|
|
61599
|
+
return enemyPieces.filter((piece) => ourMoves.some((nextMove) => nextMove.capturesPieceId === piece.id)).length;
|
|
61600
|
+
}
|
|
61601
|
+
catch {
|
|
61602
|
+
return 0;
|
|
61603
|
+
}
|
|
61604
|
+
}
|
|
61605
|
+
function scoreEndgamePressure(state, move, color) {
|
|
61606
|
+
const remainingEnemyPieces = activePieces(state).filter((piece) => piece.color !== color && !piece.captured).length;
|
|
61607
|
+
const urgency = remainingEnemyPieces <= Math.max(2, Math.floor(state.boardSize / 2)) ? 1.6 : 1;
|
|
61608
|
+
const distanceToPromotion = color === 'white' ? move.to.row : state.boardSize - 1 - move.to.row;
|
|
61609
|
+
return Math.max(0, state.boardSize - distanceToPromotion) * 14 * urgency;
|
|
61610
|
+
}
|
|
61462
61611
|
function chooseConservativeHardCapture(state, scored) {
|
|
61463
61612
|
if (state.boardSize !== 8)
|
|
61464
61613
|
return undefined;
|
|
@@ -62622,6 +62771,121 @@ const MINI_GAMES_I18N = {
|
|
|
62622
62771
|
bubbleDescription: 'Revienta grupos de burbujas, encadena combos y sube tu puntaje.',
|
|
62623
62772
|
chessimalsTitle: 'Chessimals',
|
|
62624
62773
|
chessimalsDescription: 'Una carrera de peones con cartas de animales y poderes tácticos.',
|
|
62774
|
+
christianityTitle: 'Christianity',
|
|
62775
|
+
christianityDescription: 'Un juego de cartas familiar con líderes, ofrendas y decisiones tácticas.',
|
|
62776
|
+
christianityEyebrow: 'MVP de mesa',
|
|
62777
|
+
christianityTable: 'Mesa de Christianity',
|
|
62778
|
+
christianitySplashEyebrow: 'Genesis 1',
|
|
62779
|
+
christianitySplashTitle: 'Preparando mesa',
|
|
62780
|
+
christianitySplashLoading: 'Cargando cartas reales y armando el mazo tutorial.',
|
|
62781
|
+
christianitySplashReady: 'Mazo listo. Ya puedes entrar al tutorial.',
|
|
62782
|
+
christianitySplashFallback: 'No se pudo cargar la edición real. Usaremos el mazo de prueba.',
|
|
62783
|
+
christianityStartTitle: 'Elige cómo entrar',
|
|
62784
|
+
christianityStartBody: 'Puedes jugar un tutorial pequeño con cartas reales o revisar la edición completa en la galería.',
|
|
62785
|
+
christianityTutorialMode: 'Tutorial MVP',
|
|
62786
|
+
christianityTutorialModeBody: 'Una mesa reducida con líderes, ofrendas y personajes sencillos para probar el flujo de partida.',
|
|
62787
|
+
christianityStartTutorial: 'Jugar tutorial',
|
|
62788
|
+
christianityGalleryModeBody: 'Explora la edición ordenada, filtra por tipo y abre el previsualizador de cartas.',
|
|
62789
|
+
christianityOpenGallery: 'Abrir galería',
|
|
62790
|
+
christianityHowToPlay: 'Cómo se juega',
|
|
62791
|
+
christianityHowToPlayBody: 'Revisa objetivo, turno, ofrendas y batalla antes de entrar a la mesa.',
|
|
62792
|
+
christianityHowToPlayIntro: 'Christianity usa un mazo compartido. La gracia está en adaptarse a lo que aparece y elegir bien cuándo gastar tus ofrendas.',
|
|
62793
|
+
christianityHowToPlayGoal: 'Gana reduciendo la vida del líder rival a 0, o quedando con más vida si el mazo se agota.',
|
|
62794
|
+
christianityHowToPlayTurn: 'En tu turno preparas ofrendas, robas carta, juegas cartas y luego puedes atacar.',
|
|
62795
|
+
christianityHowToPlayOfferings: 'Puedes jugar solo una ofrenda desde tu mano por turno. Las ofrendas listas pagan costes.',
|
|
62796
|
+
christianityHowToPlayBattle: 'Si el rival tiene personajes, debes atacar personajes antes que al líder.',
|
|
62797
|
+
christianityEditionStatus: 'Estado de edición',
|
|
62798
|
+
christianityTutorialActive: 'Tutorial MVP activo',
|
|
62799
|
+
christianityCatalogReady: 'Catálogo real cargado',
|
|
62800
|
+
christianityCatalogFallback: 'Mazo de prueba activo',
|
|
62801
|
+
christianityCatalogLoading: 'Cargando catálogo',
|
|
62802
|
+
christianityFutureModes: 'Modos futuros',
|
|
62803
|
+
christianitySoloBotMode: 'Solitario con bot',
|
|
62804
|
+
christianitySoloBotModeBody: 'Una partida guiada para practicar turnos, ofrendas y combate.',
|
|
62805
|
+
christianityTwoPlayerMode: 'Dos jugadores',
|
|
62806
|
+
christianityTwoPlayerModeBody: 'Partida online con estado sincronizado y manos privadas.',
|
|
62807
|
+
christianityOneDeviceMode: 'Un dispositivo',
|
|
62808
|
+
christianityOneDeviceModeBody: 'Modo local para jugar en familia pasando el dispositivo.',
|
|
62809
|
+
christianitySpectatorMode: 'Espectador',
|
|
62810
|
+
christianitySpectatorModeBody: 'Mesa pública para mirar partidas sin revelar información privada.',
|
|
62811
|
+
christianityTurn: 'Turno',
|
|
62812
|
+
christianityOfferings: 'Ofrendas',
|
|
62813
|
+
christianityHand: 'Mano',
|
|
62814
|
+
christianityOpponentBattle: 'Zona de batalla rival',
|
|
62815
|
+
christianityYourBattle: 'Tu zona de batalla',
|
|
62816
|
+
christianityOpponentHand: 'Mano rival',
|
|
62817
|
+
christianitySharedZone: 'Zona compartida',
|
|
62818
|
+
christianityMatch: 'Match',
|
|
62819
|
+
christianityMatchScore: 'Marcador de match',
|
|
62820
|
+
christianityHistory: 'Historia',
|
|
62821
|
+
christianityDeck: 'Mazo',
|
|
62822
|
+
christianityPlace: 'Lugar',
|
|
62823
|
+
christianityEmpty: 'Vacío',
|
|
62824
|
+
christianityYourHand: 'Tu mano',
|
|
62825
|
+
christianityCost: 'Coste',
|
|
62826
|
+
christianityOfferingCard: 'Ofrenda',
|
|
62827
|
+
christianityCharacterCard: 'Personaje',
|
|
62828
|
+
christianityLeaderCard: 'Líder',
|
|
62829
|
+
christianityWisdomCard: 'Sabiduría',
|
|
62830
|
+
christianityActionCard: 'Acción',
|
|
62831
|
+
christianityToolCard: 'Herramienta',
|
|
62832
|
+
christianityPlaceCard: 'Lugar',
|
|
62833
|
+
christianityEventCard: 'Evento',
|
|
62834
|
+
christianityCardRule: 'Regla de carta',
|
|
62835
|
+
christianityHiddenCard: 'Carta oculta',
|
|
62836
|
+
christianityPreviewCard: 'Ver carta',
|
|
62837
|
+
christianityEndTurn: 'Terminar turno',
|
|
62838
|
+
christianityPlayCard: 'Jugar carta',
|
|
62839
|
+
christianityPlayOffering: 'Jugar ofrenda',
|
|
62840
|
+
christianityPlayHere: 'Jugar aquí',
|
|
62841
|
+
christianityReset: 'Reiniciar mock',
|
|
62842
|
+
christianityWaitTurn: 'Espera el turno rival.',
|
|
62843
|
+
christianityChooseTarget: 'Elige un objetivo para atacar.',
|
|
62844
|
+
christianityChooseCharacterTarget: 'El rival tiene personajes: debes atacarlos antes que al líder.',
|
|
62845
|
+
christianityReadyToPlay: 'Puedes jugar esta carta.',
|
|
62846
|
+
christianityChooseSlot: 'Elige una casilla disponible para jugar esta carta.',
|
|
62847
|
+
christianityPlaceOffering: 'Puedes jugar esta ofrenda con el botón de acción.',
|
|
62848
|
+
christianityNeedOfferings: 'Necesitas más ofrendas para jugar esa carta.',
|
|
62849
|
+
christianityChooseCard: 'Elige una carta o un personaje listo para actuar.',
|
|
62850
|
+
christianityLeaderProtected: 'No puedes atacar directamente al líder mientras tenga personajes en batalla.',
|
|
62851
|
+
christianityLeaderBody: 'Si su vida llega a 0, la partida termina.',
|
|
62852
|
+
christianityLeaderRuleBody: 'El líder representa al jugador. Si su vida llega a 0, pierde la partida. No puede ser atacado directamente mientras tenga personajes en batalla.',
|
|
62853
|
+
christianityOfferingReady: 'Lista',
|
|
62854
|
+
christianityOfferingExhausted: 'Agotada',
|
|
62855
|
+
christianityOfferingBody: 'Se agota para pagar costes y vuelve a estar lista al comenzar tu turno.',
|
|
62856
|
+
christianityOfferingNoAbility: 'Esta ofrenda no tiene habilidad activable.',
|
|
62857
|
+
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.',
|
|
62858
|
+
christianityOfferingRuleBody: 'Se juega desde la mano a la pila de ofrendas. Puedes jugar solo una ofrenda por turno. Sus puntos disponibles pagan costes.',
|
|
62859
|
+
christianityWisdomRuleBody: 'Las cartas de sabiduría entregan efectos tácticos durante tu turno. Para el tutorial se pueden revisar, pero todavía no se resuelven.',
|
|
62860
|
+
christianityActionRuleBody: 'Las acciones son jugadas directas de ataque o defensa. Más adelante podrán responder durante la fase de batalla.',
|
|
62861
|
+
christianityToolRuleBody: 'Las herramientas se anexan a personajes para mejorar o proteger sus estadísticas.',
|
|
62862
|
+
christianityPlaceRuleBody: 'Los lugares cambian la mesa para ambos jugadores. Solo puede haber un lugar activo a la vez.',
|
|
62863
|
+
christianityEventRuleBody: 'Los eventos representan momentos globales que impactan la partida y luego van a historia.',
|
|
62864
|
+
christianityUseAbility: 'Usar',
|
|
62865
|
+
christianityCloseOfferings: 'Cerrar ofrendas',
|
|
62866
|
+
christianityCharacterBody: 'Entra a batalla y debe esperar un turno para atacar.',
|
|
62867
|
+
christianityCharacterRuleBody: 'Se juega en una casilla libre de la zona de batalla. Debe esperar un turno para atacar, salvo que una habilidad indique lo contrario.',
|
|
62868
|
+
christianityCharacterReady: 'Listo para atacar.',
|
|
62869
|
+
christianityCharacterExhausted: 'No puede atacar todavía.',
|
|
62870
|
+
christianityCardRemaining: 'carta restante',
|
|
62871
|
+
christianityCardsRemaining: 'cartas restantes',
|
|
62872
|
+
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.',
|
|
62873
|
+
christianityDeckRuleShared: 'Todas las cartas jugables viven en este mazo compartido, incluyendo personajes y ofrendas.',
|
|
62874
|
+
christianityDeckRuleDraw: 'Al comenzar cada turno, el jugador activo roba la primera carta disponible.',
|
|
62875
|
+
christianityDeckRuleEmpty: 'Si el mazo se queda sin cartas, se revisa la condición de victoria por vida al final del turno.',
|
|
62876
|
+
christianityClosePreview: 'Cerrar previsualizacion de carta',
|
|
62877
|
+
christianityCloseHistory: 'Cerrar historia',
|
|
62878
|
+
christianityHistoryEmpty: 'Todavía no hay cartas en historia.',
|
|
62879
|
+
christianityGallery: 'Galería',
|
|
62880
|
+
christianityCloseGallery: 'Cerrar galería',
|
|
62881
|
+
christianityGallerySearch: 'Buscar',
|
|
62882
|
+
christianityGallerySearchPlaceholder: 'Nombre, texto o referencia',
|
|
62883
|
+
christianityGalleryFilter: 'Tipo',
|
|
62884
|
+
christianityGalleryEmpty: 'No hay cartas que coincidan con el filtro.',
|
|
62885
|
+
christianityGenesisEdition: 'Genesis 1',
|
|
62886
|
+
christianityAllCards: 'Todas',
|
|
62887
|
+
christianityCards: 'cartas',
|
|
62888
|
+
christianityTutorialLoaded: 'Tutorial cargado con cartas reales de Genesis 1.',
|
|
62625
62889
|
soonTitle: 'Próximamente',
|
|
62626
62890
|
openGame: 'Jugar',
|
|
62627
62891
|
close: 'Cerrar',
|
|
@@ -62746,10 +63010,10 @@ const MINI_GAMES_I18N = {
|
|
|
62746
63010
|
chessimalsRulePowersTitle: 'Cuándo se activan los poderes',
|
|
62747
63011
|
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.',
|
|
62748
63012
|
chessimalsRuleCardsTitle: 'Cartas de animales',
|
|
62749
|
-
chessimalsRuleEagle: 'Águila: se mueve
|
|
62750
|
-
chessimalsRuleBull: 'Toro: se mueve
|
|
63013
|
+
chessimalsRuleEagle: 'Águila: se mueve en diagonal por todo el tablero, hacia adelante o atrás, sin entrar a la última fila.',
|
|
63014
|
+
chessimalsRuleBull: 'Toro: se mueve en línea recta por todo el tablero, incluso hacia los lados, sin entrar a la última fila.',
|
|
62751
63015
|
chessimalsRuleKangaroo: 'Canguro: salta en L, como el caballo del ajedrez. Puede saltar por encima de piezas y caer libre o capturar una pieza rival.',
|
|
62752
|
-
chessimalsRuleLion: 'León: se mueve
|
|
63016
|
+
chessimalsRuleLion: 'León: se mueve en cualquier dirección por todo el tablero, sin entrar a la última fila.',
|
|
62753
63017
|
chessimalsRuleLimitsTitle: 'Reglas de equilibrio',
|
|
62754
63018
|
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.',
|
|
62755
63019
|
chessimalsBoardSize: 'Tamaño del tablero',
|
|
@@ -62862,6 +63126,18 @@ const MINI_GAMES_I18N = {
|
|
|
62862
63126
|
chessimalsBotSprinterBody: 'Optimiza rutas de promoción.',
|
|
62863
63127
|
chessimalsBotSentinel: 'Centinela',
|
|
62864
63128
|
chessimalsBotSentinelBody: 'Defiende sólido y castiga errores.',
|
|
63129
|
+
chessimalsBotOracle: 'Oráculo',
|
|
63130
|
+
chessimalsBotOracleBody: 'Lee respuestas y evita trampas profundas.',
|
|
63131
|
+
chessimalsBotAmbusher: 'Emboscador',
|
|
63132
|
+
chessimalsBotAmbusherBody: 'Prepara capturas dobles con poderes largos.',
|
|
63133
|
+
chessimalsBotLocksmith: 'Cerrajero',
|
|
63134
|
+
chessimalsBotLocksmithBody: 'Cierra el centro y reduce tus rutas.',
|
|
63135
|
+
chessimalsBotStorm: 'Tormenta',
|
|
63136
|
+
chessimalsBotStormBody: 'Usa poderes largos para presionar todo el tablero.',
|
|
63137
|
+
chessimalsBotMatriarch: 'Matriarca',
|
|
63138
|
+
chessimalsBotMatriarchBody: 'Protege su estructura y gana por desgaste.',
|
|
63139
|
+
chessimalsBotEndgame: 'Finalista',
|
|
63140
|
+
chessimalsBotEndgameBody: 'Convierte ventajas pequeñas en promoción.',
|
|
62865
63141
|
chessimalsBotExplorerTendency: 'Tiende a variar rutas, probar el centro y cometer errores suaves.',
|
|
62866
63142
|
chessimalsBotImpulsiveTendency: 'Tiende a capturar rápido, incluso cuando puede quedar expuesto.',
|
|
62867
63143
|
chessimalsBotRunnerTendency: 'Tiende a avanzar hacia la promoción antes que defender.',
|
|
@@ -62872,6 +63148,12 @@ const MINI_GAMES_I18N = {
|
|
|
62872
63148
|
chessimalsBotPredatorTendency: 'Tiende a forzar capturas y usar poderes agresivos.',
|
|
62873
63149
|
chessimalsBotSprinterTendency: 'Tiende a encontrar caminos rápidos de promoción.',
|
|
62874
63150
|
chessimalsBotSentinelTendency: 'Tiende a defender sólido y castigar errores.',
|
|
63151
|
+
chessimalsBotOracleTendency: 'Tiende a anticipar respuestas y elegir jugadas difíciles de refutar.',
|
|
63152
|
+
chessimalsBotAmbusherTendency: 'Tiende a dejar piezas bajo amenaza múltiple antes de capturar.',
|
|
63153
|
+
chessimalsBotLocksmithTendency: 'Tiende a cortar rutas por el centro y dejarte sin buenas casillas.',
|
|
63154
|
+
chessimalsBotStormTendency: 'Tiende a convertir poderes largos en presión desde varios ángulos.',
|
|
63155
|
+
chessimalsBotMatriarchTendency: 'Tiende a conservar piezas y cambiar solo cuando queda mejor.',
|
|
63156
|
+
chessimalsBotEndgameTendency: 'Tiende a simplificar y correr hacia la promoción cuando ve ventaja.',
|
|
62875
63157
|
chessimalsBotReportTitle: 'Reporte del bot',
|
|
62876
63158
|
chessimalsBotReportVs: 'Contra {bot}',
|
|
62877
63159
|
chessimalsBotReportBody: '{outcome}. Hizo {captures} capturas y usó {powers} poderes. {style}',
|
|
@@ -63038,7 +63320,7 @@ const MINI_GAMES_I18N = {
|
|
|
63038
63320
|
chessimalsTutorialStep4Title: 'Devuelve el turno',
|
|
63039
63321
|
chessimalsTutorialStep4Body: 'Mueve el peón negro de la columna F una casilla hacia abajo para continuar.',
|
|
63040
63322
|
chessimalsTutorialStep5Title: 'Usa el poder Canguro',
|
|
63041
|
-
chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro.',
|
|
63323
|
+
chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro. Las otras cartas pueden cruzar todo el tablero, pero ningún poder puede entrar a la última fila.',
|
|
63042
63324
|
chessimalsTutorialStep6Title: 'Prepara la llegada',
|
|
63043
63325
|
chessimalsTutorialStep6Body: 'Mueve el último peón negro hacia abajo. Después tendrás camino para ganar.',
|
|
63044
63326
|
chessimalsTutorialStep7Title: 'Llega a la última fila',
|
|
@@ -63111,6 +63393,121 @@ const MINI_GAMES_I18N = {
|
|
|
63111
63393
|
bubbleDescription: 'Pop bubble groups, chain combos, and push your score higher.',
|
|
63112
63394
|
chessimalsTitle: 'Chessimals',
|
|
63113
63395
|
chessimalsDescription: 'A pawn race with animal cards and tactical powers.',
|
|
63396
|
+
christianityTitle: 'Christianity',
|
|
63397
|
+
christianityDescription: 'A family card game with leaders, offerings, and tactical choices.',
|
|
63398
|
+
christianityEyebrow: 'Table MVP',
|
|
63399
|
+
christianityTable: 'Christianity table',
|
|
63400
|
+
christianitySplashEyebrow: 'Genesis 1',
|
|
63401
|
+
christianitySplashTitle: 'Preparing table',
|
|
63402
|
+
christianitySplashLoading: 'Loading real cards and building the tutorial deck.',
|
|
63403
|
+
christianitySplashReady: 'Deck ready. You can enter the tutorial.',
|
|
63404
|
+
christianitySplashFallback: 'The real edition could not be loaded. The test deck will be used.',
|
|
63405
|
+
christianityStartTitle: 'Choose how to enter',
|
|
63406
|
+
christianityStartBody: 'Play a small tutorial with real cards or browse the full edition in the gallery.',
|
|
63407
|
+
christianityTutorialMode: 'MVP tutorial',
|
|
63408
|
+
christianityTutorialModeBody: 'A reduced table with leaders, offerings, and simple characters to test the match flow.',
|
|
63409
|
+
christianityStartTutorial: 'Play tutorial',
|
|
63410
|
+
christianityGalleryModeBody: 'Explore the ordered edition, filter by type, and open the card preview.',
|
|
63411
|
+
christianityOpenGallery: 'Open gallery',
|
|
63412
|
+
christianityHowToPlay: 'How to play',
|
|
63413
|
+
christianityHowToPlayBody: 'Review goal, turn flow, offerings, and battle before entering the table.',
|
|
63414
|
+
christianityHowToPlayIntro: 'Christianity uses a shared deck. The heart of the game is adapting to what appears and choosing when to spend offerings.',
|
|
63415
|
+
christianityHowToPlayGoal: 'Win by reducing the rival leader life to 0, or by having more life if the deck runs out.',
|
|
63416
|
+
christianityHowToPlayTurn: 'On your turn you ready offerings, draw a card, play cards, and then may attack.',
|
|
63417
|
+
christianityHowToPlayOfferings: 'You can play only one offering from your hand each turn. Ready offerings pay costs.',
|
|
63418
|
+
christianityHowToPlayBattle: 'If the rival has characters, you must attack characters before the leader.',
|
|
63419
|
+
christianityEditionStatus: 'Edition status',
|
|
63420
|
+
christianityTutorialActive: 'MVP tutorial active',
|
|
63421
|
+
christianityCatalogReady: 'Real catalog loaded',
|
|
63422
|
+
christianityCatalogFallback: 'Test deck active',
|
|
63423
|
+
christianityCatalogLoading: 'Loading catalog',
|
|
63424
|
+
christianityFutureModes: 'Future modes',
|
|
63425
|
+
christianitySoloBotMode: 'Solo with bot',
|
|
63426
|
+
christianitySoloBotModeBody: 'A guided match to practice turns, offerings, and combat.',
|
|
63427
|
+
christianityTwoPlayerMode: 'Two players',
|
|
63428
|
+
christianityTwoPlayerModeBody: 'Online match with synced state and private hands.',
|
|
63429
|
+
christianityOneDeviceMode: 'One device',
|
|
63430
|
+
christianityOneDeviceModeBody: 'Local mode for family play by passing the device.',
|
|
63431
|
+
christianitySpectatorMode: 'Spectator',
|
|
63432
|
+
christianitySpectatorModeBody: 'Public table to watch matches without revealing private information.',
|
|
63433
|
+
christianityTurn: 'Turn',
|
|
63434
|
+
christianityOfferings: 'Offerings',
|
|
63435
|
+
christianityHand: 'Hand',
|
|
63436
|
+
christianityOpponentBattle: 'Opponent battle zone',
|
|
63437
|
+
christianityYourBattle: 'Your battle zone',
|
|
63438
|
+
christianityOpponentHand: 'Opponent hand',
|
|
63439
|
+
christianitySharedZone: 'Shared zone',
|
|
63440
|
+
christianityMatch: 'Match',
|
|
63441
|
+
christianityMatchScore: 'Match score',
|
|
63442
|
+
christianityHistory: 'History',
|
|
63443
|
+
christianityDeck: 'Deck',
|
|
63444
|
+
christianityPlace: 'Place',
|
|
63445
|
+
christianityEmpty: 'Empty',
|
|
63446
|
+
christianityYourHand: 'Your hand',
|
|
63447
|
+
christianityCost: 'Cost',
|
|
63448
|
+
christianityOfferingCard: 'Offering',
|
|
63449
|
+
christianityCharacterCard: 'Character',
|
|
63450
|
+
christianityLeaderCard: 'Leader',
|
|
63451
|
+
christianityWisdomCard: 'Wisdom',
|
|
63452
|
+
christianityActionCard: 'Action',
|
|
63453
|
+
christianityToolCard: 'Tool',
|
|
63454
|
+
christianityPlaceCard: 'Place',
|
|
63455
|
+
christianityEventCard: 'Event',
|
|
63456
|
+
christianityCardRule: 'Card rule',
|
|
63457
|
+
christianityHiddenCard: 'Hidden card',
|
|
63458
|
+
christianityPreviewCard: 'Preview card',
|
|
63459
|
+
christianityEndTurn: 'End turn',
|
|
63460
|
+
christianityPlayCard: 'Play card',
|
|
63461
|
+
christianityPlayOffering: 'Play offering',
|
|
63462
|
+
christianityPlayHere: 'Play here',
|
|
63463
|
+
christianityReset: 'Reset mock',
|
|
63464
|
+
christianityWaitTurn: 'Wait for the opponent turn.',
|
|
63465
|
+
christianityChooseTarget: 'Choose a target to attack.',
|
|
63466
|
+
christianityChooseCharacterTarget: 'The opponent has characters: attack them before the leader.',
|
|
63467
|
+
christianityReadyToPlay: 'You can play this card.',
|
|
63468
|
+
christianityChooseSlot: 'Choose an available slot to play this card.',
|
|
63469
|
+
christianityPlaceOffering: 'You can play this offering with the action button.',
|
|
63470
|
+
christianityNeedOfferings: 'You need more offerings to play that card.',
|
|
63471
|
+
christianityChooseCard: 'Choose a card or a ready character.',
|
|
63472
|
+
christianityLeaderProtected: 'You cannot attack the leader directly while they have characters in battle.',
|
|
63473
|
+
christianityLeaderBody: 'If this leader reaches 0 life, the game ends.',
|
|
63474
|
+
christianityLeaderRuleBody: 'The leader represents the player. If their life reaches 0, they lose the game. They cannot be attacked directly while they have characters in battle.',
|
|
63475
|
+
christianityOfferingReady: 'Ready',
|
|
63476
|
+
christianityOfferingExhausted: 'Exhausted',
|
|
63477
|
+
christianityOfferingBody: 'Exhaust it to pay costs. It readies again at the start of your turn.',
|
|
63478
|
+
christianityOfferingNoAbility: 'This offering has no active ability.',
|
|
63479
|
+
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.',
|
|
63480
|
+
christianityOfferingRuleBody: 'Play it from your hand into the offering pile. You can play only one offering per turn. Its available points pay costs.',
|
|
63481
|
+
christianityWisdomRuleBody: 'Wisdom cards provide tactical effects during your turn. In the tutorial you can inspect them, but they do not resolve yet.',
|
|
63482
|
+
christianityActionRuleBody: 'Actions are direct offensive or defensive plays. Later they will be able to respond during the battle phase.',
|
|
63483
|
+
christianityToolRuleBody: 'Tools attach to characters to improve or protect their stats.',
|
|
63484
|
+
christianityPlaceRuleBody: 'Places change the table for both players. Only one place can be active at a time.',
|
|
63485
|
+
christianityEventRuleBody: 'Events represent global moments that affect the match and then move to history.',
|
|
63486
|
+
christianityUseAbility: 'Use',
|
|
63487
|
+
christianityCloseOfferings: 'Close offerings',
|
|
63488
|
+
christianityCharacterBody: 'Enters battle and must wait one turn before attacking.',
|
|
63489
|
+
christianityCharacterRuleBody: 'Play it into an open battle slot. It must wait one turn before attacking unless an ability says otherwise.',
|
|
63490
|
+
christianityCharacterReady: 'Ready to attack.',
|
|
63491
|
+
christianityCharacterExhausted: 'Cannot attack yet.',
|
|
63492
|
+
christianityCardRemaining: 'card remaining',
|
|
63493
|
+
christianityCardsRemaining: 'cards remaining',
|
|
63494
|
+
christianityDeckBody: 'The deck is a shared pile. Both players draw from it, so the match rewards adapting to what appears and managing the pace.',
|
|
63495
|
+
christianityDeckRuleShared: 'All playable cards live in this shared deck, including characters and offerings.',
|
|
63496
|
+
christianityDeckRuleDraw: 'At the start of each turn, the active player draws the first available card.',
|
|
63497
|
+
christianityDeckRuleEmpty: 'If the deck runs out, the leader life victory condition is checked at the end of the turn.',
|
|
63498
|
+
christianityClosePreview: 'Close card preview',
|
|
63499
|
+
christianityCloseHistory: 'Close history',
|
|
63500
|
+
christianityHistoryEmpty: 'There are no cards in history yet.',
|
|
63501
|
+
christianityGallery: 'Gallery',
|
|
63502
|
+
christianityCloseGallery: 'Close gallery',
|
|
63503
|
+
christianityGallerySearch: 'Search',
|
|
63504
|
+
christianityGallerySearchPlaceholder: 'Name, text, or reference',
|
|
63505
|
+
christianityGalleryFilter: 'Type',
|
|
63506
|
+
christianityGalleryEmpty: 'No cards match this filter.',
|
|
63507
|
+
christianityGenesisEdition: 'Genesis 1',
|
|
63508
|
+
christianityAllCards: 'All',
|
|
63509
|
+
christianityCards: 'cards',
|
|
63510
|
+
christianityTutorialLoaded: 'Tutorial loaded with real Genesis 1 cards.',
|
|
63114
63511
|
soonTitle: 'Coming soon',
|
|
63115
63512
|
openGame: 'Play',
|
|
63116
63513
|
close: 'Close',
|
|
@@ -63235,10 +63632,10 @@ const MINI_GAMES_I18N = {
|
|
|
63235
63632
|
chessimalsRulePowersTitle: 'When powers unlock',
|
|
63236
63633
|
chessimalsRulePowersBody: 'Your cards unlock when one of your pawns crosses the center line, or when a rival pawn enters your half of the board.',
|
|
63237
63634
|
chessimalsRuleCardsTitle: 'Animal cards',
|
|
63238
|
-
chessimalsRuleEagle: 'Eagle: moves
|
|
63239
|
-
chessimalsRuleBull: 'Bull: moves
|
|
63635
|
+
chessimalsRuleEagle: 'Eagle: moves diagonally across the whole board, forward or backward, without entering the final row.',
|
|
63636
|
+
chessimalsRuleBull: 'Bull: moves in a straight line across the whole board, including sideways, without entering the final row.',
|
|
63240
63637
|
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.',
|
|
63241
|
-
chessimalsRuleLion: 'Lion: moves
|
|
63638
|
+
chessimalsRuleLion: 'Lion: moves in any direction across the whole board, without entering the final row.',
|
|
63242
63639
|
chessimalsRuleLimitsTitle: 'Balance rules',
|
|
63243
63640
|
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.',
|
|
63244
63641
|
chessimalsBoardSize: 'Board size',
|
|
@@ -63351,6 +63748,18 @@ const MINI_GAMES_I18N = {
|
|
|
63351
63748
|
chessimalsBotSprinterBody: 'Optimizes promotion routes.',
|
|
63352
63749
|
chessimalsBotSentinel: 'Sentinel',
|
|
63353
63750
|
chessimalsBotSentinelBody: 'Defends solidly and punishes mistakes.',
|
|
63751
|
+
chessimalsBotOracle: 'Oracle',
|
|
63752
|
+
chessimalsBotOracleBody: 'Reads replies and avoids deep traps.',
|
|
63753
|
+
chessimalsBotAmbusher: 'Ambusher',
|
|
63754
|
+
chessimalsBotAmbusherBody: 'Sets up double captures with long powers.',
|
|
63755
|
+
chessimalsBotLocksmith: 'Locksmith',
|
|
63756
|
+
chessimalsBotLocksmithBody: 'Closes the center and reduces your routes.',
|
|
63757
|
+
chessimalsBotStorm: 'Storm',
|
|
63758
|
+
chessimalsBotStormBody: 'Uses long powers to pressure the whole board.',
|
|
63759
|
+
chessimalsBotMatriarch: 'Matriarch',
|
|
63760
|
+
chessimalsBotMatriarchBody: 'Protects structure and wins by attrition.',
|
|
63761
|
+
chessimalsBotEndgame: 'Endgame',
|
|
63762
|
+
chessimalsBotEndgameBody: 'Turns small edges into promotion.',
|
|
63354
63763
|
chessimalsBotExplorerTendency: 'Tends to vary routes, test the center, and make soft mistakes.',
|
|
63355
63764
|
chessimalsBotImpulsiveTendency: 'Tends to capture quickly, even when it can become exposed.',
|
|
63356
63765
|
chessimalsBotRunnerTendency: 'Tends to push toward promotion before defending.',
|
|
@@ -63361,6 +63770,12 @@ const MINI_GAMES_I18N = {
|
|
|
63361
63770
|
chessimalsBotPredatorTendency: 'Tends to force captures and use aggressive powers.',
|
|
63362
63771
|
chessimalsBotSprinterTendency: 'Tends to find fast promotion paths.',
|
|
63363
63772
|
chessimalsBotSentinelTendency: 'Tends to defend solidly and punish mistakes.',
|
|
63773
|
+
chessimalsBotOracleTendency: 'Tends to anticipate replies and choose hard-to-refute moves.',
|
|
63774
|
+
chessimalsBotAmbusherTendency: 'Tends to leave pieces under multiple threats before capturing.',
|
|
63775
|
+
chessimalsBotLocksmithTendency: 'Tends to close central routes and leave you without good squares.',
|
|
63776
|
+
chessimalsBotStormTendency: 'Tends to turn long powers into pressure from several angles.',
|
|
63777
|
+
chessimalsBotMatriarchTendency: 'Tends to preserve pieces and trade only when it improves.',
|
|
63778
|
+
chessimalsBotEndgameTendency: 'Tends to simplify and race toward promotion when ahead.',
|
|
63364
63779
|
chessimalsBotReportTitle: 'Bot report',
|
|
63365
63780
|
chessimalsBotReportVs: 'Against {bot}',
|
|
63366
63781
|
chessimalsBotReportBody: '{outcome}. It made {captures} captures and used {powers} powers. {style}',
|
|
@@ -63527,7 +63942,7 @@ const MINI_GAMES_I18N = {
|
|
|
63527
63942
|
chessimalsTutorialStep4Title: 'Return the turn',
|
|
63528
63943
|
chessimalsTutorialStep4Body: 'Move the black pawn on file F one square downward to continue.',
|
|
63529
63944
|
chessimalsTutorialStep5Title: 'Use the Kangaroo power',
|
|
63530
|
-
chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn.',
|
|
63945
|
+
chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn. The other cards can cross the whole board, but no power can enter the final row.',
|
|
63531
63946
|
chessimalsTutorialStep6Title: 'Prepare the finish',
|
|
63532
63947
|
chessimalsTutorialStep6Body: 'Move the last black pawn downward. Then your path to win is open.',
|
|
63533
63948
|
chessimalsTutorialStep7Title: 'Reach the last row',
|
|
@@ -64743,6 +65158,7 @@ class ChessimalsGameComponent {
|
|
|
64743
65158
|
});
|
|
64744
65159
|
this.botThinking = signal(false);
|
|
64745
65160
|
this.confirmAction = signal(undefined);
|
|
65161
|
+
this.confirmedAction = signal(undefined);
|
|
64746
65162
|
this.onlineJoinCode = signal('');
|
|
64747
65163
|
this.onlineLoading = signal(false);
|
|
64748
65164
|
this.onlineAction = signal(undefined);
|
|
@@ -65769,13 +66185,12 @@ class ChessimalsGameComponent {
|
|
|
65769
66185
|
closeConfirmModal() {
|
|
65770
66186
|
this.confirmAction.set(undefined);
|
|
65771
66187
|
}
|
|
65772
|
-
|
|
65773
|
-
if (token !== 'confirm') {
|
|
65774
|
-
this.closeConfirmModal();
|
|
65775
|
-
return;
|
|
65776
|
-
}
|
|
65777
|
-
const action = this.confirmAction();
|
|
66188
|
+
handleConfirmModalDismissed() {
|
|
65778
66189
|
this.confirmAction.set(undefined);
|
|
66190
|
+
const action = this.confirmedAction();
|
|
66191
|
+
this.confirmedAction.set(undefined);
|
|
66192
|
+
if (!action)
|
|
66193
|
+
return;
|
|
65779
66194
|
if (action === 'restart') {
|
|
65780
66195
|
this.restartGame();
|
|
65781
66196
|
return;
|
|
@@ -65797,6 +66212,15 @@ class ChessimalsGameComponent {
|
|
|
65797
66212
|
this.createNewChallengeRun();
|
|
65798
66213
|
}
|
|
65799
66214
|
}
|
|
66215
|
+
confirmPendingAction(token) {
|
|
66216
|
+
if (token !== 'confirm') {
|
|
66217
|
+
this.closeConfirmModal();
|
|
66218
|
+
return;
|
|
66219
|
+
}
|
|
66220
|
+
const action = this.confirmAction();
|
|
66221
|
+
this.confirmedAction.set(action);
|
|
66222
|
+
this.confirmAction.set(undefined);
|
|
66223
|
+
}
|
|
65800
66224
|
resignGame() {
|
|
65801
66225
|
const game = this.game();
|
|
65802
66226
|
if (game.status === 'finished')
|
|
@@ -68679,7 +69103,7 @@ class ChessimalsGameComponent {
|
|
|
68679
69103
|
<ion-modal
|
|
68680
69104
|
[isOpen]="!!confirmAction()"
|
|
68681
69105
|
cssClass="val-modal-adaptive"
|
|
68682
|
-
(didDismiss)="
|
|
69106
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
68683
69107
|
>
|
|
68684
69108
|
<ng-template>
|
|
68685
69109
|
<val-modal-layout
|
|
@@ -69941,7 +70365,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
69941
70365
|
<ion-modal
|
|
69942
70366
|
[isOpen]="!!confirmAction()"
|
|
69943
70367
|
cssClass="val-modal-adaptive"
|
|
69944
|
-
(didDismiss)="
|
|
70368
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
69945
70369
|
>
|
|
69946
70370
|
<ng-template>
|
|
69947
70371
|
<val-modal-layout
|
|
@@ -69967,6 +70391,2518 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
69967
70391
|
type: Input
|
|
69968
70392
|
}] } });
|
|
69969
70393
|
|
|
70394
|
+
class ChristianityCardComponent {
|
|
70395
|
+
constructor() {
|
|
70396
|
+
this.card = input.required();
|
|
70397
|
+
this.variant = input('table');
|
|
70398
|
+
this.normalizedTypeLabel = computed(() => this.card().typeLabel.toUpperCase());
|
|
70399
|
+
this.frontTemplate = computed(() => this.card().frontTemplate ?? 'genesis-classic');
|
|
70400
|
+
this.isGenesisClassicTemplate = computed(() => this.frontTemplate() === 'genesis-classic' || this.frontTemplate() === 'genesis-classic-extra');
|
|
70401
|
+
this.typeIconUrl = computed(() => `assets/games/christianity/icons/${this.iconName(this.card().type)}.png`);
|
|
70402
|
+
this.headerMetric = computed(() => {
|
|
70403
|
+
const card = this.card();
|
|
70404
|
+
if (card.type === 'leader')
|
|
70405
|
+
return null;
|
|
70406
|
+
if (card.type === 'offering')
|
|
70407
|
+
return { kind: 'pips', value: card.offeringValue ?? 0 };
|
|
70408
|
+
if (typeof card.cost === 'number')
|
|
70409
|
+
return { kind: 'number', value: card.cost };
|
|
70410
|
+
return null;
|
|
70411
|
+
});
|
|
70412
|
+
this.cardStatsText = computed(() => {
|
|
70413
|
+
const card = this.card();
|
|
70414
|
+
if (card.type !== 'character')
|
|
70415
|
+
return '';
|
|
70416
|
+
return `${card.attack ?? 0} / ${card.currentHp ?? card.life ?? 0}`;
|
|
70417
|
+
});
|
|
70418
|
+
this.leaderLifeText = computed(() => {
|
|
70419
|
+
const card = this.card();
|
|
70420
|
+
const current = card.currentHp ?? card.life ?? 0;
|
|
70421
|
+
const max = card.maxHp ?? card.life ?? current;
|
|
70422
|
+
return `${current}/${max}`;
|
|
70423
|
+
});
|
|
70424
|
+
}
|
|
70425
|
+
offeringPips(value) {
|
|
70426
|
+
const count = Number(value);
|
|
70427
|
+
if (!Number.isFinite(count) || count <= 0)
|
|
70428
|
+
return [];
|
|
70429
|
+
return Array.from({ length: Math.min(Math.floor(count), 5) });
|
|
70430
|
+
}
|
|
70431
|
+
iconName(type) {
|
|
70432
|
+
if (type === 'character')
|
|
70433
|
+
return 'character';
|
|
70434
|
+
if (type === 'offering')
|
|
70435
|
+
return 'offering';
|
|
70436
|
+
if (type === 'leader')
|
|
70437
|
+
return 'leader';
|
|
70438
|
+
return type;
|
|
70439
|
+
}
|
|
70440
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70441
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChristianityCardComponent, isStandalone: true, selector: "val-christianity-card", inputs: { card: { classPropertyName: "card", publicName: "card", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
70442
|
+
@if (variant() === 'back') {
|
|
70443
|
+
<article class="christianity-card-render christianity-card-render--back" aria-hidden="true">
|
|
70444
|
+
<span></span>
|
|
70445
|
+
</article>
|
|
70446
|
+
} @else {
|
|
70447
|
+
<article
|
|
70448
|
+
class="christianity-card-render"
|
|
70449
|
+
[class.christianity-card-render--full]="variant() === 'full'"
|
|
70450
|
+
[class.christianity-card-render--table]="variant() === 'table'"
|
|
70451
|
+
[class.christianity-card-render--hand]="variant() === 'hand'"
|
|
70452
|
+
[class.christianity-card-render--list]="variant() === 'list'"
|
|
70453
|
+
[class.christianity-card-render--template-genesis-classic]="isGenesisClassicTemplate()"
|
|
70454
|
+
[class.christianity-card-render--template-genesis-full-art]="frontTemplate() === 'genesis-full-art'"
|
|
70455
|
+
[class.is-leader]="card().type === 'leader'"
|
|
70456
|
+
[class.is-offering]="card().type === 'offering'"
|
|
70457
|
+
>
|
|
70458
|
+
<header class="christianity-card-render__header">
|
|
70459
|
+
<span class="christianity-card-render__type-icon" aria-hidden="true">
|
|
70460
|
+
<img [src]="typeIconUrl()" alt="" />
|
|
70461
|
+
</span>
|
|
70462
|
+
<strong>{{ card().name }}</strong>
|
|
70463
|
+
@if (headerMetric(); as metric) {
|
|
70464
|
+
<span
|
|
70465
|
+
class="christianity-card-render__metric"
|
|
70466
|
+
[class.is-pips]="metric.kind === 'pips'"
|
|
70467
|
+
[class.is-offering-value]="card().type === 'offering'"
|
|
70468
|
+
>
|
|
70469
|
+
@if (metric.kind === 'pips') {
|
|
70470
|
+
@for (_ of offeringPips(metric.value); track $index) {
|
|
70471
|
+
<i aria-hidden="true"></i>
|
|
70472
|
+
}
|
|
70473
|
+
} @else {
|
|
70474
|
+
{{ metric.value }}
|
|
70475
|
+
}
|
|
70476
|
+
</span>
|
|
70477
|
+
}
|
|
70478
|
+
</header>
|
|
70479
|
+
|
|
70480
|
+
<section class="christianity-card-render__art" [class.has-image]="card().imageUrl">
|
|
70481
|
+
@if (card().imageUrl) {
|
|
70482
|
+
<img [src]="card().imageUrl" [alt]="card().name" />
|
|
70483
|
+
} @else {
|
|
70484
|
+
<span>{{ card().name }}</span>
|
|
70485
|
+
}
|
|
70486
|
+
<small>{{ normalizedTypeLabel() }}</small>
|
|
70487
|
+
</section>
|
|
70488
|
+
|
|
70489
|
+
@if (variant() === 'full') {
|
|
70490
|
+
<section class="christianity-card-render__verse">
|
|
70491
|
+
@if (card().verseText) {
|
|
70492
|
+
<p>{{ card().verseText }}</p>
|
|
70493
|
+
}
|
|
70494
|
+
@if (card().scripture) {
|
|
70495
|
+
<strong>{{ card().scripture }}</strong>
|
|
70496
|
+
}
|
|
70497
|
+
</section>
|
|
70498
|
+
}
|
|
70499
|
+
|
|
70500
|
+
<section class="christianity-card-render__effect">
|
|
70501
|
+
@if (card().editionIcon) {
|
|
70502
|
+
<img class="christianity-card-render__edition-watermark" [src]="card().editionIcon" alt="" aria-hidden="true" />
|
|
70503
|
+
}
|
|
70504
|
+
<div class="christianity-card-render__stats">
|
|
70505
|
+
@if (card().type === 'offering') {
|
|
70506
|
+
<strong class="is-pips">
|
|
70507
|
+
@for (_ of offeringPips(card().offeringValue); track $index) {
|
|
70508
|
+
<i aria-hidden="true"></i>
|
|
70509
|
+
}
|
|
70510
|
+
</strong>
|
|
70511
|
+
} @else if (card().type === 'leader') {
|
|
70512
|
+
<strong>{{ leaderLifeText() }}</strong>
|
|
70513
|
+
} @else if (cardStatsText()) {
|
|
70514
|
+
<strong>{{ cardStatsText() }}</strong>
|
|
70515
|
+
}
|
|
70516
|
+
</div>
|
|
70517
|
+
@if (variant() === 'full') {
|
|
70518
|
+
<div class="christianity-card-render__text">
|
|
70519
|
+
@if (card().abilityName) {
|
|
70520
|
+
<strong>{{ card().abilityName }}</strong>
|
|
70521
|
+
}
|
|
70522
|
+
@if (card().abilityText || card().statusText) {
|
|
70523
|
+
<p>{{ card().abilityText || card().statusText }}</p>
|
|
70524
|
+
}
|
|
70525
|
+
</div>
|
|
70526
|
+
<span
|
|
70527
|
+
class="christianity-card-render__rarity"
|
|
70528
|
+
[class.is-normal]="!card().rarity || card().rarity === 'normal'"
|
|
70529
|
+
[class.is-uncommon]="card().rarity === 'uncommon'"
|
|
70530
|
+
[class.is-rare]="card().rarity === 'rare'"
|
|
70531
|
+
[class.is-legendary]="card().rarity === 'legendary'"
|
|
70532
|
+
aria-hidden="true"
|
|
70533
|
+
></span>
|
|
70534
|
+
}
|
|
70535
|
+
</section>
|
|
70536
|
+
|
|
70537
|
+
@if (variant() === 'full') {
|
|
70538
|
+
<footer class="christianity-card-render__footer">
|
|
70539
|
+
<span>{{ card().edition ?? 'MVP' }}</span>
|
|
70540
|
+
<span>{{ card().collectorNumber ?? card().id }}</span>
|
|
70541
|
+
<span>{{ card().year ?? '2026' }} CHRISTIANITY</span>
|
|
70542
|
+
<span>{{ card().author ?? 'MVP' }}</span>
|
|
70543
|
+
</footer>
|
|
70544
|
+
}
|
|
70545
|
+
</article>
|
|
70546
|
+
}
|
|
70547
|
+
`, isInline: true, styles: [":host{--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);display:block;width:100%;min-width:0}.christianity-card-render{position:relative;box-sizing:border-box;display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:.28rem;width:100%;min-width:0;aspect-ratio:var(--christianity-card-aspect);padding:.48rem;overflow:hidden;border:1px solid rgba(36,48,68,.16);border-radius:.52rem;background:linear-gradient(180deg,#fffffffa,#f8fafcfa),radial-gradient(circle at 18% 0%,rgba(214,162,29,.12),transparent 44%);color:var(--val-text-color, #1f2933);box-shadow:0 .5rem 1.25rem #2430441a,inset 0 0 0 .18rem #ffffff9e}.christianity-card-render>*{position:relative;z-index:1}.christianity-card-render--template-genesis-classic{--christianity-frame-width: .26rem;padding:calc(.48rem + var(--christianity-frame-width));border-color:#39475733;background:linear-gradient(180deg,#aab8c7f5,#8fa0b1fa),radial-gradient(circle at 18% 0%,rgba(255,255,255,.24),transparent 42%);box-shadow:0 .5rem 1.25rem #24304421,inset 0 0 0 1px #ffffff6b,inset 0 0 0 var(--christianity-frame-width) #8797a980}.christianity-card-render--template-genesis-classic:before{content:\"\";position:absolute;inset:var(--christianity-frame-width);z-index:0;border-radius:.44rem;background:linear-gradient(180deg,#fffffffa,#f8fafcfa),radial-gradient(circle at 18% 0%,rgba(214,162,29,.1),transparent 44%);box-shadow:inset 0 0 0 1px #ffffffb8,0 .16rem .35rem #2430441a}.christianity-card-render--full{grid-template-rows:auto minmax(9rem,1.25fr) auto minmax(7rem,.9fr) auto;gap:.58rem;min-height:0;padding:.72rem;border-color:#2430442e;border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,rgba(214,162,29,.18),transparent 45%);box-shadow:0 0 0 .18rem #fff4c294,0 0 2.2rem #f5c75552,0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c}.christianity-card-render--full.christianity-card-render--template-genesis-classic{--christianity-frame-width: .46rem;padding:calc(.72rem + var(--christianity-frame-width));border-radius:.78rem;box-shadow:0 0 0 .14rem #ffffff6b,0 0 2.2rem #f5c7552e,0 2.4rem 5rem #102a4357,inset 0 0 0 1px #ffffff5c,inset 0 0 0 var(--christianity-frame-width) #8797a994}.christianity-card-render--full.christianity-card-render--template-genesis-classic:before{border-radius:.56rem}.christianity-card-render--template-genesis-full-art{border-color:#090d1594;background:#111827;color:#fff;text-shadow:0 .08rem .18rem rgba(0,0,0,.72);box-shadow:0 .7rem 1.45rem #090d1533,inset 0 0 1.2rem #ffffff1a}.christianity-card-render--template-genesis-full-art .christianity-card-render__art{border-radius:.36rem;box-shadow:inset 0 0 0 1px #ffffff29,inset 0 -2rem 2.5rem #090d154d}.christianity-card-render--template-genesis-full-art .christianity-card-render__effect{background:#090d1594;color:#fff;box-shadow:inset 0 0 0 1px #ffffff1f}.christianity-card-render--template-genesis-full-art .christianity-card-render__verse{color:#fff}.christianity-card-render--template-genesis-full-art .christianity-card-render__stats strong{background:#ffffffe6;color:#1f2933;text-shadow:none}.christianity-card-render--full.christianity-card-render--template-genesis-full-art{grid-template-rows:auto minmax(14rem,1fr) auto minmax(8rem,auto) auto;min-height:min(35rem,calc(100vh - 4rem));border-radius:.72rem;background:radial-gradient(circle at 50% 8%,rgba(255,255,255,.16),transparent 38%),#090d15;box-shadow:0 0 0 .12rem #ffffff1f,0 2.4rem 5rem #090d157a,inset 0 0 1.8rem #ffffff24}.christianity-card-render--back{place-items:center;padding:.55rem;background:var(--christianity-card-back);box-shadow:0 .8rem 1.55rem #24304424}.christianity-card-render--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-render--list{grid-template-rows:auto minmax(0,1fr) auto;gap:.22rem;padding:.38rem;border-radius:.48rem;box-shadow:0 .45rem 1rem #2430441a,inset 0 0 0 .14rem #ffffff9e}.christianity-card-render__header{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:.34rem;align-items:center;min-width:0}.christianity-card-render__type-icon,.christianity-card-render__metric{display:grid;place-items:center;border-radius:999px}.christianity-card-render__type-icon{width:1.2rem;height:1.2rem;background:#24304414}.christianity-card-render__type-icon img{width:.82rem;height:.82rem;object-fit:contain}.christianity-card-render__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(.86rem,2.5vw,1.06rem);line-height:1.04}.christianity-card-render--list .christianity-card-render__header{gap:.22rem}.christianity-card-render--list .christianity-card-render__type-icon{width:.9rem;height:.9rem}.christianity-card-render--list .christianity-card-render__type-icon img{width:.62rem;height:.62rem}.christianity-card-render--list .christianity-card-render__header strong{font-size:.72rem;line-height:1;-webkit-line-clamp:2}.christianity-card-render--full .christianity-card-render__type-icon{width:1.6rem;height:1.6rem}.christianity-card-render--full .christianity-card-render__type-icon img{width:1rem;height:1rem}.christianity-card-render--full .christianity-card-render__header strong{font-size:clamp(1.25rem,5vw,1.85rem)}.christianity-card-render__metric{min-width:1.52rem;height:1.52rem;padding:0 .24rem;background:#ffd91a;color:#243044;font-size:.86rem;font-weight:900;line-height:1;box-shadow:inset 0 -.08rem #52401c2e}.christianity-card-render--list .christianity-card-render__metric{min-width:1.2rem;height:1.2rem;padding:0 .18rem;font-size:.7rem}.christianity-card-render--full .christianity-card-render__metric{min-width:2.1rem;height:2.1rem;padding:0 .36rem;font-size:1.1rem}.christianity-card-render--full .christianity-card-render__metric.is-offering-value{display:none}.christianity-card-render__metric.is-pips,.christianity-card-render__stats .is-pips{grid-auto-flow:column;gap:.16rem;min-width:auto;padding:0 .28rem}.christianity-card-render__metric i,.christianity-card-render__stats i{display:block;width:.72rem;height:.72rem;border-radius:999px;background:radial-gradient(circle at 34% 28%,rgba(255,255,255,.9) 0 .12rem,transparent .13rem),#ffd91a;box-shadow:inset 0 -.08rem #52401c2e,0 .12rem .24rem #102a431a}.christianity-card-render--list .christianity-card-render__metric i,.christianity-card-render--list .christianity-card-render__stats i{width:.48rem;height:.48rem}.christianity-card-render__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-render__art img{width:100%;height:100%;object-fit:cover}.christianity-card-render__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-render--list .christianity-card-render__art>span{max-width:82%;font-size:.7rem}.christianity-card-render--full .christianity-card-render__art>span{font-size:clamp(1.1rem,5vw,1.8rem)}.christianity-card-render__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-render--list .christianity-card-render__art small{bottom:.2rem;padding:.08rem .26rem;font-size:.42rem}.christianity-card-render--full .christianity-card-render__art small{bottom:.55rem;min-width:5rem;padding:.16rem .48rem;font-size:.68rem;text-align:center}.christianity-card-render__verse,.christianity-card-render__effect{display:grid;gap:.32rem}.christianity-card-render__verse{color:#171923;font-family:Georgia,Times New Roman,serif;font-size:clamp(.72rem,2.7vw,.86rem)}.christianity-card-render__verse p,.christianity-card-render__effect p{margin:0;line-height:1.25}.christianity-card-render__verse strong{font-family:inherit;font-size:.78rem;font-weight:900}.christianity-card-render__effect{position:relative;align-content:center;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-render--list .christianity-card-render__effect{min-height:1.26rem;padding:.16rem;border-radius:.28rem}.christianity-card-render__edition-watermark{position:absolute;top:50%;left:50%;z-index:0;width:min(66%,7.4rem);max-width:none;opacity:.055;pointer-events:none;transform:translate(-50%,-50%)}.christianity-card-render--full .christianity-card-render__effect{align-content:start;min-height:7rem;padding:.6rem .7rem;border-radius:.45rem}.christianity-card-render--full .christianity-card-render__edition-watermark{width:min(72%,10rem);opacity:.06}.christianity-card-render__stats{position:relative;z-index:1;display:flex;gap:.65rem;min-height:1.2rem}.christianity-card-render__stats strong{justify-self:end;align-self:end;margin-left:auto;padding:.12rem .32rem;border-radius:999px;background:#edf2f7;font-size:clamp(.66rem,2vw,.82rem);line-height:1.05}.christianity-card-render--list .christianity-card-render__stats{min-height:.95rem}.christianity-card-render--list .christianity-card-render__stats strong{padding:.1rem .26rem;font-size:.66rem}.christianity-card-render--full .christianity-card-render__stats strong{margin-left:0;padding:0;background:transparent;font-size:1rem}.christianity-card-render__text{position:relative;z-index:1;display:grid;gap:.12rem}.christianity-card-render__text strong{font-size:.82rem}.christianity-card-render__text p{font-size:clamp(.78rem,2.9vw,.92rem)}.christianity-card-render__rarity{position:absolute;top:.62rem;right:.62rem;z-index:1;width:.46rem;height:.46rem;border-radius:.12rem;transform:rotate(45deg)}.christianity-card-render__rarity.is-normal{background:#d1d5db}.christianity-card-render__rarity.is-uncommon{background:#22c55e}.christianity-card-render__rarity.is-rare{background:#3b82f6}.christianity-card-render__rarity.is-legendary{background:#eab308}.christianity-card-render__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-card-render__footer span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.dark),:host-context(.ion-palette-dark),:host-context(html.ion-palette-dark),:host-context(body.dark),:host-context([data-theme=\"dark\"]){--christianity-card-back: linear-gradient(135deg, rgba(147, 197, 253, .2), rgba(15, 23, 42, .08)), repeating-linear-gradient(45deg, #1e3a5f 0 .33rem, #0f172a .33rem .66rem);color-scheme:dark}:host-context(.dark) .christianity-card-render,:host-context(.ion-palette-dark) .christianity-card-render,:host-context(html.ion-palette-dark) .christianity-card-render,:host-context(body.dark) .christianity-card-render,:host-context([data-theme=\"dark\"]) .christianity-card-render{box-shadow:0 .5rem 1.25rem #0000003d,inset 0 0 0 .18rem #ffffff61}:host-context(.dark) .christianity-card-render--back,:host-context(.ion-palette-dark) .christianity-card-render--back,:host-context(html.ion-palette-dark) .christianity-card-render--back,:host-context(body.dark) .christianity-card-render--back,:host-context([data-theme=\"dark\"]) .christianity-card-render--back{border-color:#93c5fd38;box-shadow:0 .8rem 1.55rem #00000052}:host-context(.dark) .christianity-card-render--back:before,:host-context(.ion-palette-dark) .christianity-card-render--back:before,:host-context(html.ion-palette-dark) .christianity-card-render--back:before,:host-context(body.dark) .christianity-card-render--back:before,:host-context([data-theme=\"dark\"]) .christianity-card-render--back:before{border-color:#93c5fd29;background:linear-gradient(180deg,#93c5fd24,#0f172a0a)}:host-context(.dark) .christianity-card-render--list,:host-context(.ion-palette-dark) .christianity-card-render--list,:host-context(html.ion-palette-dark) .christianity-card-render--list,:host-context(body.dark) .christianity-card-render--list,:host-context([data-theme=\"dark\"]) .christianity-card-render--list{box-shadow:0 .45rem 1rem #00000042,inset 0 0 0 .14rem #ffffff7a}:host-context(.dark) .christianity-card-render__type-icon,:host-context(.ion-palette-dark) .christianity-card-render__type-icon,:host-context(html.ion-palette-dark) .christianity-card-render__type-icon,:host-context(body.dark) .christianity-card-render__type-icon,:host-context([data-theme=\"dark\"]) .christianity-card-render__type-icon,:host-context(.dark) .christianity-card-render__stats strong,:host-context(.ion-palette-dark) .christianity-card-render__stats strong,:host-context(html.ion-palette-dark) .christianity-card-render__stats strong,:host-context(body.dark) .christianity-card-render__stats strong,:host-context([data-theme=\"dark\"]) .christianity-card-render__stats strong{background:#e2e8f0db;color:#172033}@media (min-width: 52rem){.christianity-card-render--full{min-height:0;padding:1.05rem}}\n"] }); }
|
|
70548
|
+
}
|
|
70549
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityCardComponent, decorators: [{
|
|
70550
|
+
type: Component,
|
|
70551
|
+
args: [{ selector: 'val-christianity-card', standalone: true, template: `
|
|
70552
|
+
@if (variant() === 'back') {
|
|
70553
|
+
<article class="christianity-card-render christianity-card-render--back" aria-hidden="true">
|
|
70554
|
+
<span></span>
|
|
70555
|
+
</article>
|
|
70556
|
+
} @else {
|
|
70557
|
+
<article
|
|
70558
|
+
class="christianity-card-render"
|
|
70559
|
+
[class.christianity-card-render--full]="variant() === 'full'"
|
|
70560
|
+
[class.christianity-card-render--table]="variant() === 'table'"
|
|
70561
|
+
[class.christianity-card-render--hand]="variant() === 'hand'"
|
|
70562
|
+
[class.christianity-card-render--list]="variant() === 'list'"
|
|
70563
|
+
[class.christianity-card-render--template-genesis-classic]="isGenesisClassicTemplate()"
|
|
70564
|
+
[class.christianity-card-render--template-genesis-full-art]="frontTemplate() === 'genesis-full-art'"
|
|
70565
|
+
[class.is-leader]="card().type === 'leader'"
|
|
70566
|
+
[class.is-offering]="card().type === 'offering'"
|
|
70567
|
+
>
|
|
70568
|
+
<header class="christianity-card-render__header">
|
|
70569
|
+
<span class="christianity-card-render__type-icon" aria-hidden="true">
|
|
70570
|
+
<img [src]="typeIconUrl()" alt="" />
|
|
70571
|
+
</span>
|
|
70572
|
+
<strong>{{ card().name }}</strong>
|
|
70573
|
+
@if (headerMetric(); as metric) {
|
|
70574
|
+
<span
|
|
70575
|
+
class="christianity-card-render__metric"
|
|
70576
|
+
[class.is-pips]="metric.kind === 'pips'"
|
|
70577
|
+
[class.is-offering-value]="card().type === 'offering'"
|
|
70578
|
+
>
|
|
70579
|
+
@if (metric.kind === 'pips') {
|
|
70580
|
+
@for (_ of offeringPips(metric.value); track $index) {
|
|
70581
|
+
<i aria-hidden="true"></i>
|
|
70582
|
+
}
|
|
70583
|
+
} @else {
|
|
70584
|
+
{{ metric.value }}
|
|
70585
|
+
}
|
|
70586
|
+
</span>
|
|
70587
|
+
}
|
|
70588
|
+
</header>
|
|
70589
|
+
|
|
70590
|
+
<section class="christianity-card-render__art" [class.has-image]="card().imageUrl">
|
|
70591
|
+
@if (card().imageUrl) {
|
|
70592
|
+
<img [src]="card().imageUrl" [alt]="card().name" />
|
|
70593
|
+
} @else {
|
|
70594
|
+
<span>{{ card().name }}</span>
|
|
70595
|
+
}
|
|
70596
|
+
<small>{{ normalizedTypeLabel() }}</small>
|
|
70597
|
+
</section>
|
|
70598
|
+
|
|
70599
|
+
@if (variant() === 'full') {
|
|
70600
|
+
<section class="christianity-card-render__verse">
|
|
70601
|
+
@if (card().verseText) {
|
|
70602
|
+
<p>{{ card().verseText }}</p>
|
|
70603
|
+
}
|
|
70604
|
+
@if (card().scripture) {
|
|
70605
|
+
<strong>{{ card().scripture }}</strong>
|
|
70606
|
+
}
|
|
70607
|
+
</section>
|
|
70608
|
+
}
|
|
70609
|
+
|
|
70610
|
+
<section class="christianity-card-render__effect">
|
|
70611
|
+
@if (card().editionIcon) {
|
|
70612
|
+
<img class="christianity-card-render__edition-watermark" [src]="card().editionIcon" alt="" aria-hidden="true" />
|
|
70613
|
+
}
|
|
70614
|
+
<div class="christianity-card-render__stats">
|
|
70615
|
+
@if (card().type === 'offering') {
|
|
70616
|
+
<strong class="is-pips">
|
|
70617
|
+
@for (_ of offeringPips(card().offeringValue); track $index) {
|
|
70618
|
+
<i aria-hidden="true"></i>
|
|
70619
|
+
}
|
|
70620
|
+
</strong>
|
|
70621
|
+
} @else if (card().type === 'leader') {
|
|
70622
|
+
<strong>{{ leaderLifeText() }}</strong>
|
|
70623
|
+
} @else if (cardStatsText()) {
|
|
70624
|
+
<strong>{{ cardStatsText() }}</strong>
|
|
70625
|
+
}
|
|
70626
|
+
</div>
|
|
70627
|
+
@if (variant() === 'full') {
|
|
70628
|
+
<div class="christianity-card-render__text">
|
|
70629
|
+
@if (card().abilityName) {
|
|
70630
|
+
<strong>{{ card().abilityName }}</strong>
|
|
70631
|
+
}
|
|
70632
|
+
@if (card().abilityText || card().statusText) {
|
|
70633
|
+
<p>{{ card().abilityText || card().statusText }}</p>
|
|
70634
|
+
}
|
|
70635
|
+
</div>
|
|
70636
|
+
<span
|
|
70637
|
+
class="christianity-card-render__rarity"
|
|
70638
|
+
[class.is-normal]="!card().rarity || card().rarity === 'normal'"
|
|
70639
|
+
[class.is-uncommon]="card().rarity === 'uncommon'"
|
|
70640
|
+
[class.is-rare]="card().rarity === 'rare'"
|
|
70641
|
+
[class.is-legendary]="card().rarity === 'legendary'"
|
|
70642
|
+
aria-hidden="true"
|
|
70643
|
+
></span>
|
|
70644
|
+
}
|
|
70645
|
+
</section>
|
|
70646
|
+
|
|
70647
|
+
@if (variant() === 'full') {
|
|
70648
|
+
<footer class="christianity-card-render__footer">
|
|
70649
|
+
<span>{{ card().edition ?? 'MVP' }}</span>
|
|
70650
|
+
<span>{{ card().collectorNumber ?? card().id }}</span>
|
|
70651
|
+
<span>{{ card().year ?? '2026' }} CHRISTIANITY</span>
|
|
70652
|
+
<span>{{ card().author ?? 'MVP' }}</span>
|
|
70653
|
+
</footer>
|
|
70654
|
+
}
|
|
70655
|
+
</article>
|
|
70656
|
+
}
|
|
70657
|
+
`, styles: [":host{--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);display:block;width:100%;min-width:0}.christianity-card-render{position:relative;box-sizing:border-box;display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:.28rem;width:100%;min-width:0;aspect-ratio:var(--christianity-card-aspect);padding:.48rem;overflow:hidden;border:1px solid rgba(36,48,68,.16);border-radius:.52rem;background:linear-gradient(180deg,#fffffffa,#f8fafcfa),radial-gradient(circle at 18% 0%,rgba(214,162,29,.12),transparent 44%);color:var(--val-text-color, #1f2933);box-shadow:0 .5rem 1.25rem #2430441a,inset 0 0 0 .18rem #ffffff9e}.christianity-card-render>*{position:relative;z-index:1}.christianity-card-render--template-genesis-classic{--christianity-frame-width: .26rem;padding:calc(.48rem + var(--christianity-frame-width));border-color:#39475733;background:linear-gradient(180deg,#aab8c7f5,#8fa0b1fa),radial-gradient(circle at 18% 0%,rgba(255,255,255,.24),transparent 42%);box-shadow:0 .5rem 1.25rem #24304421,inset 0 0 0 1px #ffffff6b,inset 0 0 0 var(--christianity-frame-width) #8797a980}.christianity-card-render--template-genesis-classic:before{content:\"\";position:absolute;inset:var(--christianity-frame-width);z-index:0;border-radius:.44rem;background:linear-gradient(180deg,#fffffffa,#f8fafcfa),radial-gradient(circle at 18% 0%,rgba(214,162,29,.1),transparent 44%);box-shadow:inset 0 0 0 1px #ffffffb8,0 .16rem .35rem #2430441a}.christianity-card-render--full{grid-template-rows:auto minmax(9rem,1.25fr) auto minmax(7rem,.9fr) auto;gap:.58rem;min-height:0;padding:.72rem;border-color:#2430442e;border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,rgba(214,162,29,.18),transparent 45%);box-shadow:0 0 0 .18rem #fff4c294,0 0 2.2rem #f5c75552,0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c}.christianity-card-render--full.christianity-card-render--template-genesis-classic{--christianity-frame-width: .46rem;padding:calc(.72rem + var(--christianity-frame-width));border-radius:.78rem;box-shadow:0 0 0 .14rem #ffffff6b,0 0 2.2rem #f5c7552e,0 2.4rem 5rem #102a4357,inset 0 0 0 1px #ffffff5c,inset 0 0 0 var(--christianity-frame-width) #8797a994}.christianity-card-render--full.christianity-card-render--template-genesis-classic:before{border-radius:.56rem}.christianity-card-render--template-genesis-full-art{border-color:#090d1594;background:#111827;color:#fff;text-shadow:0 .08rem .18rem rgba(0,0,0,.72);box-shadow:0 .7rem 1.45rem #090d1533,inset 0 0 1.2rem #ffffff1a}.christianity-card-render--template-genesis-full-art .christianity-card-render__art{border-radius:.36rem;box-shadow:inset 0 0 0 1px #ffffff29,inset 0 -2rem 2.5rem #090d154d}.christianity-card-render--template-genesis-full-art .christianity-card-render__effect{background:#090d1594;color:#fff;box-shadow:inset 0 0 0 1px #ffffff1f}.christianity-card-render--template-genesis-full-art .christianity-card-render__verse{color:#fff}.christianity-card-render--template-genesis-full-art .christianity-card-render__stats strong{background:#ffffffe6;color:#1f2933;text-shadow:none}.christianity-card-render--full.christianity-card-render--template-genesis-full-art{grid-template-rows:auto minmax(14rem,1fr) auto minmax(8rem,auto) auto;min-height:min(35rem,calc(100vh - 4rem));border-radius:.72rem;background:radial-gradient(circle at 50% 8%,rgba(255,255,255,.16),transparent 38%),#090d15;box-shadow:0 0 0 .12rem #ffffff1f,0 2.4rem 5rem #090d157a,inset 0 0 1.8rem #ffffff24}.christianity-card-render--back{place-items:center;padding:.55rem;background:var(--christianity-card-back);box-shadow:0 .8rem 1.55rem #24304424}.christianity-card-render--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-render--list{grid-template-rows:auto minmax(0,1fr) auto;gap:.22rem;padding:.38rem;border-radius:.48rem;box-shadow:0 .45rem 1rem #2430441a,inset 0 0 0 .14rem #ffffff9e}.christianity-card-render__header{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:.34rem;align-items:center;min-width:0}.christianity-card-render__type-icon,.christianity-card-render__metric{display:grid;place-items:center;border-radius:999px}.christianity-card-render__type-icon{width:1.2rem;height:1.2rem;background:#24304414}.christianity-card-render__type-icon img{width:.82rem;height:.82rem;object-fit:contain}.christianity-card-render__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(.86rem,2.5vw,1.06rem);line-height:1.04}.christianity-card-render--list .christianity-card-render__header{gap:.22rem}.christianity-card-render--list .christianity-card-render__type-icon{width:.9rem;height:.9rem}.christianity-card-render--list .christianity-card-render__type-icon img{width:.62rem;height:.62rem}.christianity-card-render--list .christianity-card-render__header strong{font-size:.72rem;line-height:1;-webkit-line-clamp:2}.christianity-card-render--full .christianity-card-render__type-icon{width:1.6rem;height:1.6rem}.christianity-card-render--full .christianity-card-render__type-icon img{width:1rem;height:1rem}.christianity-card-render--full .christianity-card-render__header strong{font-size:clamp(1.25rem,5vw,1.85rem)}.christianity-card-render__metric{min-width:1.52rem;height:1.52rem;padding:0 .24rem;background:#ffd91a;color:#243044;font-size:.86rem;font-weight:900;line-height:1;box-shadow:inset 0 -.08rem #52401c2e}.christianity-card-render--list .christianity-card-render__metric{min-width:1.2rem;height:1.2rem;padding:0 .18rem;font-size:.7rem}.christianity-card-render--full .christianity-card-render__metric{min-width:2.1rem;height:2.1rem;padding:0 .36rem;font-size:1.1rem}.christianity-card-render--full .christianity-card-render__metric.is-offering-value{display:none}.christianity-card-render__metric.is-pips,.christianity-card-render__stats .is-pips{grid-auto-flow:column;gap:.16rem;min-width:auto;padding:0 .28rem}.christianity-card-render__metric i,.christianity-card-render__stats i{display:block;width:.72rem;height:.72rem;border-radius:999px;background:radial-gradient(circle at 34% 28%,rgba(255,255,255,.9) 0 .12rem,transparent .13rem),#ffd91a;box-shadow:inset 0 -.08rem #52401c2e,0 .12rem .24rem #102a431a}.christianity-card-render--list .christianity-card-render__metric i,.christianity-card-render--list .christianity-card-render__stats i{width:.48rem;height:.48rem}.christianity-card-render__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-render__art img{width:100%;height:100%;object-fit:cover}.christianity-card-render__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-render--list .christianity-card-render__art>span{max-width:82%;font-size:.7rem}.christianity-card-render--full .christianity-card-render__art>span{font-size:clamp(1.1rem,5vw,1.8rem)}.christianity-card-render__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-render--list .christianity-card-render__art small{bottom:.2rem;padding:.08rem .26rem;font-size:.42rem}.christianity-card-render--full .christianity-card-render__art small{bottom:.55rem;min-width:5rem;padding:.16rem .48rem;font-size:.68rem;text-align:center}.christianity-card-render__verse,.christianity-card-render__effect{display:grid;gap:.32rem}.christianity-card-render__verse{color:#171923;font-family:Georgia,Times New Roman,serif;font-size:clamp(.72rem,2.7vw,.86rem)}.christianity-card-render__verse p,.christianity-card-render__effect p{margin:0;line-height:1.25}.christianity-card-render__verse strong{font-family:inherit;font-size:.78rem;font-weight:900}.christianity-card-render__effect{position:relative;align-content:center;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-render--list .christianity-card-render__effect{min-height:1.26rem;padding:.16rem;border-radius:.28rem}.christianity-card-render__edition-watermark{position:absolute;top:50%;left:50%;z-index:0;width:min(66%,7.4rem);max-width:none;opacity:.055;pointer-events:none;transform:translate(-50%,-50%)}.christianity-card-render--full .christianity-card-render__effect{align-content:start;min-height:7rem;padding:.6rem .7rem;border-radius:.45rem}.christianity-card-render--full .christianity-card-render__edition-watermark{width:min(72%,10rem);opacity:.06}.christianity-card-render__stats{position:relative;z-index:1;display:flex;gap:.65rem;min-height:1.2rem}.christianity-card-render__stats strong{justify-self:end;align-self:end;margin-left:auto;padding:.12rem .32rem;border-radius:999px;background:#edf2f7;font-size:clamp(.66rem,2vw,.82rem);line-height:1.05}.christianity-card-render--list .christianity-card-render__stats{min-height:.95rem}.christianity-card-render--list .christianity-card-render__stats strong{padding:.1rem .26rem;font-size:.66rem}.christianity-card-render--full .christianity-card-render__stats strong{margin-left:0;padding:0;background:transparent;font-size:1rem}.christianity-card-render__text{position:relative;z-index:1;display:grid;gap:.12rem}.christianity-card-render__text strong{font-size:.82rem}.christianity-card-render__text p{font-size:clamp(.78rem,2.9vw,.92rem)}.christianity-card-render__rarity{position:absolute;top:.62rem;right:.62rem;z-index:1;width:.46rem;height:.46rem;border-radius:.12rem;transform:rotate(45deg)}.christianity-card-render__rarity.is-normal{background:#d1d5db}.christianity-card-render__rarity.is-uncommon{background:#22c55e}.christianity-card-render__rarity.is-rare{background:#3b82f6}.christianity-card-render__rarity.is-legendary{background:#eab308}.christianity-card-render__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-card-render__footer span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.dark),:host-context(.ion-palette-dark),:host-context(html.ion-palette-dark),:host-context(body.dark),:host-context([data-theme=\"dark\"]){--christianity-card-back: linear-gradient(135deg, rgba(147, 197, 253, .2), rgba(15, 23, 42, .08)), repeating-linear-gradient(45deg, #1e3a5f 0 .33rem, #0f172a .33rem .66rem);color-scheme:dark}:host-context(.dark) .christianity-card-render,:host-context(.ion-palette-dark) .christianity-card-render,:host-context(html.ion-palette-dark) .christianity-card-render,:host-context(body.dark) .christianity-card-render,:host-context([data-theme=\"dark\"]) .christianity-card-render{box-shadow:0 .5rem 1.25rem #0000003d,inset 0 0 0 .18rem #ffffff61}:host-context(.dark) .christianity-card-render--back,:host-context(.ion-palette-dark) .christianity-card-render--back,:host-context(html.ion-palette-dark) .christianity-card-render--back,:host-context(body.dark) .christianity-card-render--back,:host-context([data-theme=\"dark\"]) .christianity-card-render--back{border-color:#93c5fd38;box-shadow:0 .8rem 1.55rem #00000052}:host-context(.dark) .christianity-card-render--back:before,:host-context(.ion-palette-dark) .christianity-card-render--back:before,:host-context(html.ion-palette-dark) .christianity-card-render--back:before,:host-context(body.dark) .christianity-card-render--back:before,:host-context([data-theme=\"dark\"]) .christianity-card-render--back:before{border-color:#93c5fd29;background:linear-gradient(180deg,#93c5fd24,#0f172a0a)}:host-context(.dark) .christianity-card-render--list,:host-context(.ion-palette-dark) .christianity-card-render--list,:host-context(html.ion-palette-dark) .christianity-card-render--list,:host-context(body.dark) .christianity-card-render--list,:host-context([data-theme=\"dark\"]) .christianity-card-render--list{box-shadow:0 .45rem 1rem #00000042,inset 0 0 0 .14rem #ffffff7a}:host-context(.dark) .christianity-card-render__type-icon,:host-context(.ion-palette-dark) .christianity-card-render__type-icon,:host-context(html.ion-palette-dark) .christianity-card-render__type-icon,:host-context(body.dark) .christianity-card-render__type-icon,:host-context([data-theme=\"dark\"]) .christianity-card-render__type-icon,:host-context(.dark) .christianity-card-render__stats strong,:host-context(.ion-palette-dark) .christianity-card-render__stats strong,:host-context(html.ion-palette-dark) .christianity-card-render__stats strong,:host-context(body.dark) .christianity-card-render__stats strong,:host-context([data-theme=\"dark\"]) .christianity-card-render__stats strong{background:#e2e8f0db;color:#172033}@media (min-width: 52rem){.christianity-card-render--full{min-height:0;padding:1.05rem}}\n"] }]
|
|
70658
|
+
}] });
|
|
70659
|
+
|
|
70660
|
+
const GENESIS_CATALOG_URL = 'assets/games/christianity/data/01-genesis.cards.json';
|
|
70661
|
+
const GENESIS_ICON_URL = 'assets/games/christianity/icons/1-icon.png';
|
|
70662
|
+
const TUTORIAL_CHARACTER_LIMIT = 12;
|
|
70663
|
+
const TUTORIAL_OFFERING_LIMIT = 6;
|
|
70664
|
+
const SPLASH_MIN_DURATION_MS = 720;
|
|
70665
|
+
const STARTER_CARDS = {
|
|
70666
|
+
o_simple: {
|
|
70667
|
+
id: 'o_simple',
|
|
70668
|
+
name: 'Ofrenda simple',
|
|
70669
|
+
type: 'offering',
|
|
70670
|
+
cost: 0,
|
|
70671
|
+
attack: 0,
|
|
70672
|
+
life: 1,
|
|
70673
|
+
verseText: 'Una ofrenda sencilla queda lista para sostener tus siguientes jugadas.',
|
|
70674
|
+
scripture: 'Genesis 4:4',
|
|
70675
|
+
edition: 'GEN',
|
|
70676
|
+
collectorNumber: '001/020',
|
|
70677
|
+
year: '2026',
|
|
70678
|
+
author: 'MVP',
|
|
70679
|
+
rarity: 'normal',
|
|
70680
|
+
},
|
|
70681
|
+
o_forbidden: {
|
|
70682
|
+
id: 'o_forbidden',
|
|
70683
|
+
name: 'El fruto prohibido',
|
|
70684
|
+
type: 'offering',
|
|
70685
|
+
cost: 0,
|
|
70686
|
+
attack: 0,
|
|
70687
|
+
life: 2,
|
|
70688
|
+
abilityName: 'Conocimiento del bien y del mal',
|
|
70689
|
+
abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Líder.',
|
|
70690
|
+
abilityCost: 0,
|
|
70691
|
+
verseText: 'Dios el Señor puso al hombre en el jardín de Edén para que lo labrara y lo cuidara.',
|
|
70692
|
+
scripture: 'Genesis 2:17 NBV',
|
|
70693
|
+
edition: 'GEN',
|
|
70694
|
+
collectorNumber: '012/180',
|
|
70695
|
+
year: '2026',
|
|
70696
|
+
author: 'MVP',
|
|
70697
|
+
rarity: 'uncommon',
|
|
70698
|
+
},
|
|
70699
|
+
p_scout: {
|
|
70700
|
+
id: 'p_scout',
|
|
70701
|
+
name: 'Scout',
|
|
70702
|
+
type: 'character',
|
|
70703
|
+
cost: 1,
|
|
70704
|
+
attack: 1,
|
|
70705
|
+
life: 1,
|
|
70706
|
+
verseText: 'Un explorador humilde abre camino antes de que llegue la batalla.',
|
|
70707
|
+
scripture: 'Genesis 13:17',
|
|
70708
|
+
edition: 'GEN',
|
|
70709
|
+
collectorNumber: '002/020',
|
|
70710
|
+
year: '2026',
|
|
70711
|
+
author: 'MVP',
|
|
70712
|
+
rarity: 'normal',
|
|
70713
|
+
},
|
|
70714
|
+
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' },
|
|
70715
|
+
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' },
|
|
70716
|
+
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' },
|
|
70717
|
+
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' },
|
|
70718
|
+
};
|
|
70719
|
+
const STARTING_SHARED_DECK = [
|
|
70720
|
+
'o_simple',
|
|
70721
|
+
'p_scout',
|
|
70722
|
+
'o_forbidden',
|
|
70723
|
+
'o_simple',
|
|
70724
|
+
'p_guard',
|
|
70725
|
+
'p_warrior',
|
|
70726
|
+
'o_simple',
|
|
70727
|
+
'p_elder',
|
|
70728
|
+
'p_scout',
|
|
70729
|
+
'o_simple',
|
|
70730
|
+
'p_champion',
|
|
70731
|
+
'p_guard',
|
|
70732
|
+
'o_simple',
|
|
70733
|
+
'p_warrior',
|
|
70734
|
+
'p_scout',
|
|
70735
|
+
'o_simple',
|
|
70736
|
+
'p_elder',
|
|
70737
|
+
'p_guard',
|
|
70738
|
+
'o_simple',
|
|
70739
|
+
];
|
|
70740
|
+
const STARTING_GAME = {
|
|
70741
|
+
gameId: 'mock-christianity',
|
|
70742
|
+
status: 'in_progress',
|
|
70743
|
+
mode: 'local_pass',
|
|
70744
|
+
turnOwner: 'P1',
|
|
70745
|
+
revision: 0,
|
|
70746
|
+
turnCount: 1,
|
|
70747
|
+
matchScore: { P1: 1, P2: 0 },
|
|
70748
|
+
sharedDeck: STARTING_SHARED_DECK,
|
|
70749
|
+
historyZone: [],
|
|
70750
|
+
players: {
|
|
70751
|
+
P1: {
|
|
70752
|
+
seat: 'P1',
|
|
70753
|
+
displayName: 'Jugador',
|
|
70754
|
+
avatar: 'J',
|
|
70755
|
+
avatarColor: '#2563eb',
|
|
70756
|
+
leaderName: 'Adam',
|
|
70757
|
+
leaderHp: 15,
|
|
70758
|
+
leaderMaxHp: 15,
|
|
70759
|
+
offerings: [
|
|
70760
|
+
{ instanceId: 'p1_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P1', ready: true, value: 1 },
|
|
70761
|
+
{
|
|
70762
|
+
instanceId: 'p1_offering_002',
|
|
70763
|
+
cardId: 'o_forbidden',
|
|
70764
|
+
name: 'El fruto prohibido',
|
|
70765
|
+
owner: 'P1',
|
|
70766
|
+
ready: true,
|
|
70767
|
+
value: 2,
|
|
70768
|
+
abilityName: 'Conocimiento del bien y del mal',
|
|
70769
|
+
abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Lider.',
|
|
70770
|
+
abilityCost: 0,
|
|
70771
|
+
},
|
|
70772
|
+
],
|
|
70773
|
+
offeringPlayedThisTurn: false,
|
|
70774
|
+
hand: ['o_simple', 'p_scout', 'p_warrior', 'p_guard'],
|
|
70775
|
+
battleZone: [],
|
|
70776
|
+
},
|
|
70777
|
+
P2: {
|
|
70778
|
+
seat: 'P2',
|
|
70779
|
+
displayName: 'Rival',
|
|
70780
|
+
avatar: 'R',
|
|
70781
|
+
avatarColor: '#b45309',
|
|
70782
|
+
leaderName: 'Noah',
|
|
70783
|
+
leaderHp: 15,
|
|
70784
|
+
leaderMaxHp: 15,
|
|
70785
|
+
offerings: [{ instanceId: 'p2_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P2', ready: true, value: 1 }],
|
|
70786
|
+
offeringPlayedThisTurn: false,
|
|
70787
|
+
handCount: 4,
|
|
70788
|
+
battleZone: [
|
|
70789
|
+
{
|
|
70790
|
+
instanceId: 'opp_001',
|
|
70791
|
+
cardId: 'p_scout',
|
|
70792
|
+
name: 'Scout',
|
|
70793
|
+
owner: 'P2',
|
|
70794
|
+
controller: 'P2',
|
|
70795
|
+
slot: 0,
|
|
70796
|
+
attack: 1,
|
|
70797
|
+
currentHp: 1,
|
|
70798
|
+
maxHp: 1,
|
|
70799
|
+
canAttack: false,
|
|
70800
|
+
},
|
|
70801
|
+
],
|
|
70802
|
+
},
|
|
70803
|
+
},
|
|
70804
|
+
log: ['Partida iniciada.'],
|
|
70805
|
+
};
|
|
70806
|
+
class ChristianityGameComponent {
|
|
70807
|
+
constructor() {
|
|
70808
|
+
this.i18n = inject(I18nService);
|
|
70809
|
+
this.bootStartedAt = performance.now();
|
|
70810
|
+
this.game = signal(structuredClone(STARTING_GAME));
|
|
70811
|
+
this.screen = signal('splash');
|
|
70812
|
+
this.catalogLoadState = signal('loading');
|
|
70813
|
+
this.selectedHandCard = signal(null);
|
|
70814
|
+
this.selectedAttacker = signal(null);
|
|
70815
|
+
this.selectedPreview = signal(null);
|
|
70816
|
+
this.selectedInfo = signal(null);
|
|
70817
|
+
this.previewTilt = signal({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
|
|
70818
|
+
this.hoveredHandIndex = signal(null);
|
|
70819
|
+
this.draggingCardId = signal(null);
|
|
70820
|
+
this.showHistory = signal(false);
|
|
70821
|
+
this.showGallery = signal(false);
|
|
70822
|
+
this.offeringsSeat = signal(null);
|
|
70823
|
+
this.cardCatalog = signal(STARTER_CARDS);
|
|
70824
|
+
this.allCatalogCards = signal(Object.values(STARTER_CARDS));
|
|
70825
|
+
this.catalogLoaded = signal(false);
|
|
70826
|
+
this.gallerySearch = signal('');
|
|
70827
|
+
this.galleryType = signal('all');
|
|
70828
|
+
this.canDropOnBattleSlot = (drag) => {
|
|
70829
|
+
const card = this.cardDefinition(drag.data);
|
|
70830
|
+
return card.type === 'character' && this.canPlay(card);
|
|
70831
|
+
};
|
|
70832
|
+
this.canDropOnOfferings = (drag) => {
|
|
70833
|
+
const card = this.cardDefinition(drag.data);
|
|
70834
|
+
return card.type === 'offering' && this.canPlay(card);
|
|
70835
|
+
};
|
|
70836
|
+
this.player = computed(() => this.game().players.P1);
|
|
70837
|
+
this.opponent = computed(() => this.game().players.P2);
|
|
70838
|
+
this.currentPlayer = computed(() => this.game().players[this.game().turnOwner]);
|
|
70839
|
+
this.isOwnTurn = computed(() => this.game().turnOwner === 'P1');
|
|
70840
|
+
this.hasOpponentGuards = computed(() => this.opponent().battleZone.length > 0);
|
|
70841
|
+
this.opponentHandCount = computed(() => this.opponent().handCount ?? this.opponent().hand?.length ?? 0);
|
|
70842
|
+
this.galleryCards = computed(() => {
|
|
70843
|
+
const query = this.gallerySearch().trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
70844
|
+
const type = this.galleryType();
|
|
70845
|
+
return this.allCatalogCards()
|
|
70846
|
+
.filter(card => type === 'all' || card.type === type)
|
|
70847
|
+
.filter(card => {
|
|
70848
|
+
if (!query)
|
|
70849
|
+
return true;
|
|
70850
|
+
const text = this.translatedCardText(card);
|
|
70851
|
+
const haystack = [text.name, card.type, text.scripture, text.abilityName, text.abilityText, text.verseText]
|
|
70852
|
+
.filter(Boolean)
|
|
70853
|
+
.join(' ')
|
|
70854
|
+
.toLowerCase()
|
|
70855
|
+
.normalize('NFD')
|
|
70856
|
+
.replace(/[\u0300-\u036f]/g, '');
|
|
70857
|
+
return haystack.includes(query);
|
|
70858
|
+
})
|
|
70859
|
+
.sort((left, right) => this.cardSortKey(left).localeCompare(this.cardSortKey(right), 'es'));
|
|
70860
|
+
});
|
|
70861
|
+
this.galleryEditionLabel = computed(() => {
|
|
70862
|
+
const count = this.allCatalogCards().length;
|
|
70863
|
+
return `${this.t('christianityGenesisEdition')} · ${count} ${this.t('christianityCards')}`;
|
|
70864
|
+
});
|
|
70865
|
+
this.galleryEditionIcon = computed(() => GENESIS_ICON_URL);
|
|
70866
|
+
this.galleryTypeOptions = computed(() => [
|
|
70867
|
+
{ value: 'all', label: this.t('christianityAllCards') },
|
|
70868
|
+
{ value: 'leader', label: this.t('christianityLeaderCard') },
|
|
70869
|
+
{ value: 'offering', label: this.t('christianityOfferingCard') },
|
|
70870
|
+
{ value: 'character', label: this.t('christianityCharacterCard') },
|
|
70871
|
+
{ value: 'wisdom', label: this.t('christianityWisdomCard') },
|
|
70872
|
+
{ value: 'action', label: this.t('christianityActionCard') },
|
|
70873
|
+
{ value: 'tool', label: this.t('christianityToolCard') },
|
|
70874
|
+
{ value: 'place', label: this.t('christianityPlaceCard') },
|
|
70875
|
+
{ value: 'event', label: this.t('christianityEventCard') },
|
|
70876
|
+
]);
|
|
70877
|
+
this.splashStatusText = computed(() => {
|
|
70878
|
+
const state = this.catalogLoadState();
|
|
70879
|
+
if (state === 'ready')
|
|
70880
|
+
return this.t('christianitySplashReady');
|
|
70881
|
+
if (state === 'fallback')
|
|
70882
|
+
return this.t('christianitySplashFallback');
|
|
70883
|
+
return this.t('christianitySplashLoading');
|
|
70884
|
+
});
|
|
70885
|
+
this.startFeaturedCards = computed(() => {
|
|
70886
|
+
const cards = this.allCatalogCards();
|
|
70887
|
+
const preferred = ['GEN-009', 'GEN-013', 'GEN-032']
|
|
70888
|
+
.map(id => this.cardCatalog()[id])
|
|
70889
|
+
.filter((card) => !!card);
|
|
70890
|
+
return (preferred.length ? preferred : cards.slice(0, 3)).slice(0, 3);
|
|
70891
|
+
});
|
|
70892
|
+
this.futureModes = computed(() => [
|
|
70893
|
+
{ title: this.t('christianitySoloBotMode'), body: this.t('christianitySoloBotModeBody') },
|
|
70894
|
+
{ title: this.t('christianityTwoPlayerMode'), body: this.t('christianityTwoPlayerModeBody') },
|
|
70895
|
+
{ title: this.t('christianityOneDeviceMode'), body: this.t('christianityOneDeviceModeBody') },
|
|
70896
|
+
{ title: this.t('christianitySpectatorMode'), body: this.t('christianitySpectatorModeBody') },
|
|
70897
|
+
]);
|
|
70898
|
+
this.selectedCardDefinition = computed(() => {
|
|
70899
|
+
const selected = this.selectedHandCard();
|
|
70900
|
+
return selected ? this.cardDefinition(selected) : null;
|
|
70901
|
+
});
|
|
70902
|
+
this.selectedPreviewCard = computed(() => {
|
|
70903
|
+
const cardId = this.selectedPreview()?.cardId;
|
|
70904
|
+
return cardId ? this.cardDefinition(cardId) : null;
|
|
70905
|
+
});
|
|
70906
|
+
this.selectedPreviewRenderCard = computed(() => {
|
|
70907
|
+
const preview = this.selectedPreview();
|
|
70908
|
+
if (!preview)
|
|
70909
|
+
return null;
|
|
70910
|
+
const card = this.selectedPreviewCard();
|
|
70911
|
+
if (card) {
|
|
70912
|
+
return this.definitionToRenderCard(card, {
|
|
70913
|
+
statusText: preview.body,
|
|
70914
|
+
});
|
|
70915
|
+
}
|
|
70916
|
+
if (preview.eyebrow === this.t('christianityLeaderCard')) {
|
|
70917
|
+
const [currentHp, maxHp] = preview.meta.split('/').map(value => Number(value));
|
|
70918
|
+
return {
|
|
70919
|
+
id: `leader-${preview.title.toLowerCase()}`,
|
|
70920
|
+
name: preview.title,
|
|
70921
|
+
type: 'leader',
|
|
70922
|
+
typeLabel: this.t('christianityLeaderCard'),
|
|
70923
|
+
currentHp: Number.isFinite(currentHp) ? currentHp : undefined,
|
|
70924
|
+
maxHp: Number.isFinite(maxHp) ? maxHp : undefined,
|
|
70925
|
+
life: Number.isFinite(currentHp) ? currentHp : undefined,
|
|
70926
|
+
abilityName: this.t('christianityLeaderCard'),
|
|
70927
|
+
abilityText: preview.body,
|
|
70928
|
+
verseText: preview.body,
|
|
70929
|
+
edition: 'MVP',
|
|
70930
|
+
collectorNumber: 'LIDER',
|
|
70931
|
+
year: '2026',
|
|
70932
|
+
author: 'MVP',
|
|
70933
|
+
rarity: 'legendary',
|
|
70934
|
+
};
|
|
70935
|
+
}
|
|
70936
|
+
return {
|
|
70937
|
+
id: `preview-${preview.title.toLowerCase()}`,
|
|
70938
|
+
name: preview.title,
|
|
70939
|
+
type: this.previewRenderType(preview.eyebrow),
|
|
70940
|
+
typeLabel: preview.eyebrow,
|
|
70941
|
+
abilityName: preview.eyebrow,
|
|
70942
|
+
abilityText: preview.body,
|
|
70943
|
+
verseText: preview.body,
|
|
70944
|
+
edition: 'MVP',
|
|
70945
|
+
collectorNumber: preview.eyebrow,
|
|
70946
|
+
year: '2026',
|
|
70947
|
+
author: 'MVP',
|
|
70948
|
+
rarity: 'normal',
|
|
70949
|
+
statusText: preview.meta,
|
|
70950
|
+
};
|
|
70951
|
+
});
|
|
70952
|
+
this.previewRule = computed(() => {
|
|
70953
|
+
const preview = this.selectedPreview();
|
|
70954
|
+
if (!preview)
|
|
70955
|
+
return null;
|
|
70956
|
+
const card = this.selectedPreviewCard();
|
|
70957
|
+
if (card?.type === 'offering') {
|
|
70958
|
+
return { title: this.t('christianityOfferingCard'), body: this.t('christianityOfferingRuleBody') };
|
|
70959
|
+
}
|
|
70960
|
+
if (card?.type === 'character') {
|
|
70961
|
+
return { title: this.t('christianityCharacterCard'), body: this.t('christianityCharacterRuleBody') };
|
|
70962
|
+
}
|
|
70963
|
+
if (card?.type === 'wisdom') {
|
|
70964
|
+
return { title: this.t('christianityWisdomCard'), body: this.t('christianityWisdomRuleBody') };
|
|
70965
|
+
}
|
|
70966
|
+
if (card?.type === 'action') {
|
|
70967
|
+
return { title: this.t('christianityActionCard'), body: this.t('christianityActionRuleBody') };
|
|
70968
|
+
}
|
|
70969
|
+
if (card?.type === 'tool') {
|
|
70970
|
+
return { title: this.t('christianityToolCard'), body: this.t('christianityToolRuleBody') };
|
|
70971
|
+
}
|
|
70972
|
+
if (card?.type === 'place') {
|
|
70973
|
+
return { title: this.t('christianityPlaceCard'), body: this.t('christianityPlaceRuleBody') };
|
|
70974
|
+
}
|
|
70975
|
+
if (card?.type === 'event') {
|
|
70976
|
+
return { title: this.t('christianityEventCard'), body: this.t('christianityEventRuleBody') };
|
|
70977
|
+
}
|
|
70978
|
+
if (card?.type === 'leader') {
|
|
70979
|
+
return { title: this.t('christianityLeaderCard'), body: this.t('christianityLeaderRuleBody') };
|
|
70980
|
+
}
|
|
70981
|
+
if (preview.eyebrow === this.t('christianityLeaderCard')) {
|
|
70982
|
+
return { title: this.t('christianityLeaderCard'), body: this.t('christianityLeaderRuleBody') };
|
|
70983
|
+
}
|
|
70984
|
+
return null;
|
|
70985
|
+
});
|
|
70986
|
+
this.statusText = computed(() => {
|
|
70987
|
+
const attacker = this.selectedAttacker();
|
|
70988
|
+
const handCard = this.selectedCardDefinition();
|
|
70989
|
+
if (!this.isOwnTurn()) {
|
|
70990
|
+
return this.t('christianityWaitTurn');
|
|
70991
|
+
}
|
|
70992
|
+
if (attacker) {
|
|
70993
|
+
return this.hasOpponentGuards() ? this.t('christianityChooseCharacterTarget') : this.t('christianityChooseTarget');
|
|
70994
|
+
}
|
|
70995
|
+
if (handCard) {
|
|
70996
|
+
if (!this.canPlay(handCard)) {
|
|
70997
|
+
return this.t('christianityNeedOfferings');
|
|
70998
|
+
}
|
|
70999
|
+
return handCard.type === 'offering' ? this.t('christianityPlaceOffering') : this.t('christianityChooseSlot');
|
|
71000
|
+
}
|
|
71001
|
+
return this.t('christianityChooseCard');
|
|
71002
|
+
});
|
|
71003
|
+
this.i18n.registerDefaults('MiniGames', MINI_GAMES_I18N);
|
|
71004
|
+
void this.loadGenesisCatalog();
|
|
71005
|
+
}
|
|
71006
|
+
t(key) {
|
|
71007
|
+
this.i18n.lang();
|
|
71008
|
+
return this.i18n.t(key, 'MiniGames');
|
|
71009
|
+
}
|
|
71010
|
+
async loadGenesisCatalog() {
|
|
71011
|
+
let loaded = false;
|
|
71012
|
+
try {
|
|
71013
|
+
const response = await fetch(GENESIS_CATALOG_URL);
|
|
71014
|
+
if (response.ok) {
|
|
71015
|
+
const catalog = await response.json();
|
|
71016
|
+
const cards = (catalog.cards ?? []).map(card => this.normalizeCatalogCard(card, catalog));
|
|
71017
|
+
if (cards.length) {
|
|
71018
|
+
this.cardCatalog.set(Object.fromEntries(cards.map(card => [card.id, card])));
|
|
71019
|
+
this.allCatalogCards.set(cards);
|
|
71020
|
+
this.catalogLoaded.set(true);
|
|
71021
|
+
this.game.set(this.createTutorialGame(cards));
|
|
71022
|
+
loaded = true;
|
|
71023
|
+
}
|
|
71024
|
+
}
|
|
71025
|
+
}
|
|
71026
|
+
catch (error) {
|
|
71027
|
+
console.warn('Christianity catalog could not be loaded. Falling back to starter cards.', error);
|
|
71028
|
+
}
|
|
71029
|
+
this.catalogLoadState.set(loaded ? 'ready' : 'fallback');
|
|
71030
|
+
this.finishSplash();
|
|
71031
|
+
}
|
|
71032
|
+
finishSplash() {
|
|
71033
|
+
const elapsed = performance.now() - this.bootStartedAt;
|
|
71034
|
+
const remaining = Math.max(0, SPLASH_MIN_DURATION_MS - elapsed);
|
|
71035
|
+
window.setTimeout(() => {
|
|
71036
|
+
if (this.screen() === 'splash') {
|
|
71037
|
+
this.screen.set('home');
|
|
71038
|
+
}
|
|
71039
|
+
}, remaining);
|
|
71040
|
+
}
|
|
71041
|
+
normalizeCatalogCard(card, catalog) {
|
|
71042
|
+
const editionIcon = card.editionIcon ?? catalog.edition?.icon ?? GENESIS_ICON_URL;
|
|
71043
|
+
const verseText = card.verseText ?? card.bible?.text;
|
|
71044
|
+
const scripture = card.scripture ?? this.formatScripture(card.bible);
|
|
71045
|
+
const offeringValue = card.type === 'offering' ? card.offeringValue ?? card.life ?? card.cost ?? 1 : card.offeringValue;
|
|
71046
|
+
const life = card.type === 'leader'
|
|
71047
|
+
? card.leaderLife ?? card.life ?? 10
|
|
71048
|
+
: card.type === 'offering'
|
|
71049
|
+
? offeringValue
|
|
71050
|
+
: card.life ?? 0;
|
|
71051
|
+
return {
|
|
71052
|
+
...card,
|
|
71053
|
+
cost: card.type === 'offering' ? 0 : card.cost ?? 0,
|
|
71054
|
+
offeringValue,
|
|
71055
|
+
life,
|
|
71056
|
+
leaderLife: card.type === 'leader' ? card.leaderLife ?? life : card.leaderLife,
|
|
71057
|
+
attack: card.type === 'character' ? card.attack ?? 0 : card.attack,
|
|
71058
|
+
abilityName: card.abilityName ?? card.abilities?.[0]?.name,
|
|
71059
|
+
abilityText: card.abilityText ?? card.abilities?.[0]?.text,
|
|
71060
|
+
verseText,
|
|
71061
|
+
scripture,
|
|
71062
|
+
edition: card.edition ?? catalog.edition?.id ?? 'GEN',
|
|
71063
|
+
editionNumber: card.editionNumber ?? catalog.edition?.number,
|
|
71064
|
+
editionIcon,
|
|
71065
|
+
imageUrl: card.imageUrl ?? card.art?.imageUrl,
|
|
71066
|
+
author: card.author ?? card.art?.artistCredit,
|
|
71067
|
+
year: card.year ?? '2026',
|
|
71068
|
+
frontTemplate: card.frontTemplate ?? 'genesis-classic',
|
|
71069
|
+
};
|
|
71070
|
+
}
|
|
71071
|
+
formatScripture(bible) {
|
|
71072
|
+
if (!bible?.book || !bible.reference)
|
|
71073
|
+
return undefined;
|
|
71074
|
+
return `${bible.book} ${bible.reference}${bible.version ? ` ${bible.version}` : ''}`;
|
|
71075
|
+
}
|
|
71076
|
+
createTutorialGame(cards) {
|
|
71077
|
+
const leaders = cards.filter(card => card.type === 'leader');
|
|
71078
|
+
const playerLeader = this.findCard(leaders, 'Adán') ?? leaders[0];
|
|
71079
|
+
const opponentLeader = this.findCard(leaders, 'Noé') ?? leaders[1] ?? leaders[0];
|
|
71080
|
+
const offerings = cards.filter(card => card.type === 'offering').slice(0, TUTORIAL_OFFERING_LIMIT);
|
|
71081
|
+
const characters = cards
|
|
71082
|
+
.filter(card => card.type === 'character' && (card.cost ?? 0) <= 4 && (card.attack ?? 0) >= 0 && (card.life ?? 0) > 0)
|
|
71083
|
+
.slice(0, TUTORIAL_CHARACTER_LIMIT);
|
|
71084
|
+
const startingOffering = offerings[0] ?? STARTER_CARDS['o_simple'];
|
|
71085
|
+
const tutorialDeck = [
|
|
71086
|
+
...offerings.slice(1),
|
|
71087
|
+
...characters,
|
|
71088
|
+
...offerings.slice(0, 1),
|
|
71089
|
+
].slice(0, 20);
|
|
71090
|
+
const playerHand = tutorialDeck.slice(0, 4).map(card => card.id);
|
|
71091
|
+
const opponentBattleCard = characters[0];
|
|
71092
|
+
const sharedDeck = tutorialDeck.slice(4).map(card => card.id);
|
|
71093
|
+
return {
|
|
71094
|
+
...structuredClone(STARTING_GAME),
|
|
71095
|
+
sharedDeck,
|
|
71096
|
+
historyZone: [],
|
|
71097
|
+
players: {
|
|
71098
|
+
P1: this.createTutorialPlayer('P1', playerLeader, startingOffering, playerHand, []),
|
|
71099
|
+
P2: this.createTutorialPlayer('P2', opponentLeader, startingOffering, undefined, opponentBattleCard ? [this.createCharacterInstance(opponentBattleCard, 'P2', 0, 'opp_001')] : []),
|
|
71100
|
+
},
|
|
71101
|
+
log: [this.t('christianityTutorialLoaded')],
|
|
71102
|
+
};
|
|
71103
|
+
}
|
|
71104
|
+
createTutorialPlayer(seat, leader, startingOffering, hand, battleZone) {
|
|
71105
|
+
const base = STARTING_GAME.players[seat];
|
|
71106
|
+
const leaderLife = leader?.leaderLife ?? leader?.life ?? base.leaderMaxHp;
|
|
71107
|
+
return {
|
|
71108
|
+
...structuredClone(base),
|
|
71109
|
+
leaderCardId: leader?.id,
|
|
71110
|
+
leaderName: leader ? this.translatedCardText(leader).name : base.leaderName,
|
|
71111
|
+
leaderHp: leaderLife,
|
|
71112
|
+
leaderMaxHp: leaderLife,
|
|
71113
|
+
offerings: [this.createOfferingInstance(startingOffering, seat, `${seat.toLowerCase()}_offering_001`)],
|
|
71114
|
+
offeringPlayedThisTurn: false,
|
|
71115
|
+
hand,
|
|
71116
|
+
handCount: hand ? undefined : 4,
|
|
71117
|
+
battleZone,
|
|
71118
|
+
};
|
|
71119
|
+
}
|
|
71120
|
+
createOfferingInstance(card, seat, instanceId) {
|
|
71121
|
+
const value = card.offeringValue ?? card.life ?? 1;
|
|
71122
|
+
return {
|
|
71123
|
+
instanceId,
|
|
71124
|
+
cardId: card.id,
|
|
71125
|
+
name: this.translatedCardText(card).name,
|
|
71126
|
+
owner: seat,
|
|
71127
|
+
ready: true,
|
|
71128
|
+
value,
|
|
71129
|
+
abilityName: card.abilityName,
|
|
71130
|
+
abilityText: card.abilityText,
|
|
71131
|
+
abilityCost: card.abilityCost,
|
|
71132
|
+
};
|
|
71133
|
+
}
|
|
71134
|
+
createCharacterInstance(card, seat, slot, instanceId) {
|
|
71135
|
+
const life = card.life ?? 1;
|
|
71136
|
+
return {
|
|
71137
|
+
instanceId,
|
|
71138
|
+
cardId: card.id,
|
|
71139
|
+
name: this.translatedCardText(card).name,
|
|
71140
|
+
owner: seat,
|
|
71141
|
+
controller: seat,
|
|
71142
|
+
slot,
|
|
71143
|
+
attack: card.attack ?? 0,
|
|
71144
|
+
currentHp: life,
|
|
71145
|
+
maxHp: life,
|
|
71146
|
+
canAttack: false,
|
|
71147
|
+
};
|
|
71148
|
+
}
|
|
71149
|
+
findCard(cards, namePart) {
|
|
71150
|
+
return cards.find(card => this.translatedCardText(card).name.toLowerCase().includes(namePart.toLowerCase()));
|
|
71151
|
+
}
|
|
71152
|
+
cardSortKey(card) {
|
|
71153
|
+
const collector = card.collectorNumber ?? card.id;
|
|
71154
|
+
return `${card.edition ?? ''}-${collector.padStart(8, '0')}-${this.translatedCardText(card).name}`;
|
|
71155
|
+
}
|
|
71156
|
+
cardDefinition(cardId) {
|
|
71157
|
+
return this.cardCatalog()[cardId] ?? STARTER_CARDS[cardId] ?? STARTER_CARDS['p_scout'];
|
|
71158
|
+
}
|
|
71159
|
+
translatedCardText(card) {
|
|
71160
|
+
const lang = this.i18n.lang();
|
|
71161
|
+
const translation = card.i18n?.[lang] ?? card.i18n?.['es'];
|
|
71162
|
+
const primaryAbility = translation?.abilities?.[0] ?? card.abilities?.[0];
|
|
71163
|
+
return {
|
|
71164
|
+
name: translation?.name ?? card.name,
|
|
71165
|
+
fullName: translation?.fullName ?? card.fullName,
|
|
71166
|
+
verseText: translation?.verseText ?? card.verseText,
|
|
71167
|
+
scripture: translation?.scripture ?? card.scripture,
|
|
71168
|
+
abilityName: translation?.abilityName ?? primaryAbility?.name ?? card.abilityName,
|
|
71169
|
+
abilityText: translation?.abilityText ?? primaryAbility?.text ?? card.abilityText,
|
|
71170
|
+
abilities: translation?.abilities ?? card.abilities,
|
|
71171
|
+
};
|
|
71172
|
+
}
|
|
71173
|
+
cardDisplayName(cardId) {
|
|
71174
|
+
return this.translatedCardText(this.cardDefinition(cardId)).name;
|
|
71175
|
+
}
|
|
71176
|
+
playerLeaderDisplayName(player) {
|
|
71177
|
+
return player.leaderCardId ? this.cardDisplayName(player.leaderCardId) : player.leaderName;
|
|
71178
|
+
}
|
|
71179
|
+
catalogStatusLabel() {
|
|
71180
|
+
const state = this.catalogLoadState();
|
|
71181
|
+
if (state === 'ready')
|
|
71182
|
+
return this.t('christianityCatalogReady');
|
|
71183
|
+
if (state === 'fallback')
|
|
71184
|
+
return this.t('christianityCatalogFallback');
|
|
71185
|
+
return this.t('christianityCatalogLoading');
|
|
71186
|
+
}
|
|
71187
|
+
startFeaturedCardTransform(index) {
|
|
71188
|
+
const transforms = [
|
|
71189
|
+
'translateX(-1.4rem) rotate(-9deg)',
|
|
71190
|
+
'translateY(-0.55rem) rotate(2deg)',
|
|
71191
|
+
'translateX(1.4rem) rotate(10deg)',
|
|
71192
|
+
];
|
|
71193
|
+
return transforms[index] ?? 'none';
|
|
71194
|
+
}
|
|
71195
|
+
cardTypeLabel(card) {
|
|
71196
|
+
const labels = {
|
|
71197
|
+
action: this.t('christianityActionCard'),
|
|
71198
|
+
character: this.t('christianityCharacterCard'),
|
|
71199
|
+
event: this.t('christianityEventCard'),
|
|
71200
|
+
leader: this.t('christianityLeaderCard'),
|
|
71201
|
+
offering: this.t('christianityOfferingCard'),
|
|
71202
|
+
place: this.t('christianityPlaceCard'),
|
|
71203
|
+
tool: this.t('christianityToolCard'),
|
|
71204
|
+
wisdom: this.t('christianityWisdomCard'),
|
|
71205
|
+
};
|
|
71206
|
+
return labels[card.type];
|
|
71207
|
+
}
|
|
71208
|
+
definitionToRenderCard(card, overrides = {}) {
|
|
71209
|
+
const text = this.translatedCardText(card);
|
|
71210
|
+
const base = {
|
|
71211
|
+
id: card.id,
|
|
71212
|
+
name: text.name,
|
|
71213
|
+
type: card.type,
|
|
71214
|
+
typeLabel: this.cardTypeLabel(card),
|
|
71215
|
+
cost: card.cost,
|
|
71216
|
+
offeringValue: card.type === 'offering' ? card.offeringValue ?? card.life : undefined,
|
|
71217
|
+
attack: card.type === 'character' ? card.attack : undefined,
|
|
71218
|
+
life: card.life,
|
|
71219
|
+
currentHp: card.life,
|
|
71220
|
+
maxHp: card.life,
|
|
71221
|
+
abilityName: text.abilityName,
|
|
71222
|
+
abilityText: text.abilityText || this.defaultCardBody(card.type),
|
|
71223
|
+
verseText: text.verseText,
|
|
71224
|
+
scripture: text.scripture,
|
|
71225
|
+
edition: card.edition,
|
|
71226
|
+
collectorNumber: card.collectorNumber,
|
|
71227
|
+
editionIcon: card.editionIcon ?? (card.edition === 'GEN' ? GENESIS_ICON_URL : undefined),
|
|
71228
|
+
year: card.year,
|
|
71229
|
+
author: card.author,
|
|
71230
|
+
rarity: card.rarity,
|
|
71231
|
+
imageUrl: card.imageUrl,
|
|
71232
|
+
frontTemplate: card.frontTemplate ?? (card.edition === 'GEN' ? 'genesis-classic' : undefined),
|
|
71233
|
+
};
|
|
71234
|
+
return { ...base, ...overrides };
|
|
71235
|
+
}
|
|
71236
|
+
defaultCardBody(type) {
|
|
71237
|
+
const bodies = {
|
|
71238
|
+
action: this.t('christianityActionRuleBody'),
|
|
71239
|
+
character: this.t('christianityCharacterBody'),
|
|
71240
|
+
event: this.t('christianityEventRuleBody'),
|
|
71241
|
+
leader: this.t('christianityLeaderBody'),
|
|
71242
|
+
offering: this.t('christianityOfferingBody'),
|
|
71243
|
+
place: this.t('christianityPlaceRuleBody'),
|
|
71244
|
+
tool: this.t('christianityToolRuleBody'),
|
|
71245
|
+
wisdom: this.t('christianityWisdomRuleBody'),
|
|
71246
|
+
};
|
|
71247
|
+
return bodies[type];
|
|
71248
|
+
}
|
|
71249
|
+
characterRenderCard(card) {
|
|
71250
|
+
const definition = this.cardDefinition(card.cardId);
|
|
71251
|
+
return this.definitionToRenderCard(definition, {
|
|
71252
|
+
id: card.instanceId,
|
|
71253
|
+
attack: card.attack,
|
|
71254
|
+
life: card.maxHp,
|
|
71255
|
+
currentHp: card.currentHp,
|
|
71256
|
+
maxHp: card.maxHp,
|
|
71257
|
+
statusText: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
|
|
71258
|
+
});
|
|
71259
|
+
}
|
|
71260
|
+
leaderRenderCard(player) {
|
|
71261
|
+
if (player.leaderCardId) {
|
|
71262
|
+
const definition = this.cardDefinition(player.leaderCardId);
|
|
71263
|
+
return this.definitionToRenderCard(definition, {
|
|
71264
|
+
id: `${player.seat}-leader`,
|
|
71265
|
+
name: this.translatedCardText(definition).name,
|
|
71266
|
+
type: 'leader',
|
|
71267
|
+
typeLabel: this.t('christianityLeaderCard'),
|
|
71268
|
+
life: player.leaderHp,
|
|
71269
|
+
currentHp: player.leaderHp,
|
|
71270
|
+
maxHp: player.leaderMaxHp,
|
|
71271
|
+
statusText: this.t('christianityLeaderBody'),
|
|
71272
|
+
});
|
|
71273
|
+
}
|
|
71274
|
+
return {
|
|
71275
|
+
id: `${player.seat}-leader`,
|
|
71276
|
+
name: player.leaderName,
|
|
71277
|
+
type: 'leader',
|
|
71278
|
+
typeLabel: this.t('christianityLeaderCard'),
|
|
71279
|
+
life: player.leaderHp,
|
|
71280
|
+
currentHp: player.leaderHp,
|
|
71281
|
+
maxHp: player.leaderMaxHp,
|
|
71282
|
+
abilityName: this.t('christianityLeaderCard'),
|
|
71283
|
+
abilityText: this.t('christianityLeaderBody'),
|
|
71284
|
+
verseText: this.t('christianityLeaderBody'),
|
|
71285
|
+
edition: 'MVP',
|
|
71286
|
+
collectorNumber: 'LIDER',
|
|
71287
|
+
editionIcon: GENESIS_ICON_URL,
|
|
71288
|
+
year: '2026',
|
|
71289
|
+
author: 'MVP',
|
|
71290
|
+
rarity: 'legendary',
|
|
71291
|
+
frontTemplate: 'genesis-classic',
|
|
71292
|
+
};
|
|
71293
|
+
}
|
|
71294
|
+
offeringRenderCard(offering) {
|
|
71295
|
+
const definition = this.cardDefinition(offering.cardId);
|
|
71296
|
+
const text = this.translatedCardText(definition);
|
|
71297
|
+
return this.definitionToRenderCard(definition, {
|
|
71298
|
+
id: offering.instanceId,
|
|
71299
|
+
name: text.name,
|
|
71300
|
+
type: 'offering',
|
|
71301
|
+
typeLabel: this.t('christianityOfferingCard'),
|
|
71302
|
+
offeringValue: offering.value,
|
|
71303
|
+
life: offering.value,
|
|
71304
|
+
currentHp: offering.value,
|
|
71305
|
+
maxHp: offering.value,
|
|
71306
|
+
abilityName: text.abilityName ?? offering.abilityName,
|
|
71307
|
+
abilityText: text.abilityText ?? offering.abilityText ?? this.t('christianityOfferingNoAbility'),
|
|
71308
|
+
statusText: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
|
|
71309
|
+
});
|
|
71310
|
+
}
|
|
71311
|
+
previewRenderType(typeLabel) {
|
|
71312
|
+
if (typeLabel === this.t('christianityLeaderCard'))
|
|
71313
|
+
return 'leader';
|
|
71314
|
+
if (typeLabel === this.t('christianityOfferingCard'))
|
|
71315
|
+
return 'offering';
|
|
71316
|
+
return 'character';
|
|
71317
|
+
}
|
|
71318
|
+
cardTypeIconUrl(card) {
|
|
71319
|
+
return this.cardTypeIconUrlForType(card.type);
|
|
71320
|
+
}
|
|
71321
|
+
previewTypeIconUrl() {
|
|
71322
|
+
const preview = this.selectedPreview();
|
|
71323
|
+
if (preview?.eyebrow === this.t('christianityLeaderCard'))
|
|
71324
|
+
return this.cardTypeIconUrlForType('leader');
|
|
71325
|
+
if (preview?.eyebrow === this.t('christianityOfferingCard'))
|
|
71326
|
+
return this.cardTypeIconUrlForType('offering');
|
|
71327
|
+
return this.cardTypeIconUrlForType('character');
|
|
71328
|
+
}
|
|
71329
|
+
cardTypeIconUrlForType(type) {
|
|
71330
|
+
const normalized = type.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
71331
|
+
const icon = normalized === 'lider' ? 'leader' : normalized === 'personaje' ? 'character' : normalized === 'ofrenda' ? 'offering' : normalized;
|
|
71332
|
+
return `assets/games/christianity/icons/${icon}.png`;
|
|
71333
|
+
}
|
|
71334
|
+
offeringPips(value) {
|
|
71335
|
+
const count = Number(value);
|
|
71336
|
+
if (!Number.isFinite(count) || count <= 0)
|
|
71337
|
+
return [];
|
|
71338
|
+
return Array.from({ length: Math.min(Math.floor(count), 5) });
|
|
71339
|
+
}
|
|
71340
|
+
battleSlots(seat) {
|
|
71341
|
+
const cards = this.game().players[seat].battleZone;
|
|
71342
|
+
const positionedCards = new Map();
|
|
71343
|
+
cards.forEach((card, index) => {
|
|
71344
|
+
const slot = Number.isInteger(card.slot) ? card.slot ?? index : index;
|
|
71345
|
+
if (slot >= 0 && slot < 4 && !positionedCards.has(slot)) {
|
|
71346
|
+
positionedCards.set(slot, card);
|
|
71347
|
+
}
|
|
71348
|
+
});
|
|
71349
|
+
return Array.from({ length: 4 }, (_, index) => ({
|
|
71350
|
+
trackId: positionedCards.get(index)?.instanceId ?? `${seat}-empty-${index}`,
|
|
71351
|
+
card: positionedCards.get(index),
|
|
71352
|
+
}));
|
|
71353
|
+
}
|
|
71354
|
+
battleSlotDropId(index) {
|
|
71355
|
+
return `christianity-battle-slot-${index}`;
|
|
71356
|
+
}
|
|
71357
|
+
dropTargetIds() {
|
|
71358
|
+
return ['christianity-offerings-drop', ...this.battleSlots('P1').map((_, index) => this.battleSlotDropId(index))];
|
|
71359
|
+
}
|
|
71360
|
+
hiddenHandCards(count) {
|
|
71361
|
+
return Array.from({ length: count });
|
|
71362
|
+
}
|
|
71363
|
+
fanTransform(index, total, opponent) {
|
|
71364
|
+
if (total <= 1)
|
|
71365
|
+
return 'none';
|
|
71366
|
+
const center = (total - 1) / 2;
|
|
71367
|
+
const offset = index - center;
|
|
71368
|
+
const rotate = offset * (opponent ? 6 : 5);
|
|
71369
|
+
const lift = Math.abs(offset) * 0.25;
|
|
71370
|
+
const hoverLift = opponent ? 0 : this.handWaveLift(index);
|
|
71371
|
+
const scale = opponent ? 1 : this.handWaveScale(index);
|
|
71372
|
+
const fanLift = opponent ? Math.abs(offset) * 0.22 : lift + hoverLift;
|
|
71373
|
+
const fanSpread = opponent ? offset * 0.02 : 0;
|
|
71374
|
+
return `translate(${fanSpread}rem, ${fanLift}rem) rotate(${rotate}deg) scale(${scale})`;
|
|
71375
|
+
}
|
|
71376
|
+
handCardZIndex(index) {
|
|
71377
|
+
const hovered = this.hoveredHandIndex();
|
|
71378
|
+
if (hovered === null)
|
|
71379
|
+
return 2;
|
|
71380
|
+
const distance = Math.abs(index - hovered);
|
|
71381
|
+
return Math.max(2, 8 - distance);
|
|
71382
|
+
}
|
|
71383
|
+
setHoveredHandIndex(index) {
|
|
71384
|
+
this.hoveredHandIndex.set(index);
|
|
71385
|
+
}
|
|
71386
|
+
clearHoveredHandIndex() {
|
|
71387
|
+
this.hoveredHandIndex.set(null);
|
|
71388
|
+
}
|
|
71389
|
+
releaseHoveredHand(event) {
|
|
71390
|
+
if (event.pointerType !== 'mouse') {
|
|
71391
|
+
window.setTimeout(() => this.clearHoveredHandIndex(), 180);
|
|
71392
|
+
}
|
|
71393
|
+
}
|
|
71394
|
+
handWaveLift(index) {
|
|
71395
|
+
const hovered = this.hoveredHandIndex();
|
|
71396
|
+
if (hovered === null)
|
|
71397
|
+
return 0;
|
|
71398
|
+
const distance = Math.abs(index - hovered);
|
|
71399
|
+
if (distance === 0)
|
|
71400
|
+
return -1.15;
|
|
71401
|
+
if (distance === 1)
|
|
71402
|
+
return -0.58;
|
|
71403
|
+
if (distance === 2)
|
|
71404
|
+
return -0.22;
|
|
71405
|
+
return 0;
|
|
71406
|
+
}
|
|
71407
|
+
handWaveScale(index) {
|
|
71408
|
+
const hovered = this.hoveredHandIndex();
|
|
71409
|
+
if (hovered === null)
|
|
71410
|
+
return 1;
|
|
71411
|
+
const distance = Math.abs(index - hovered);
|
|
71412
|
+
if (distance === 0)
|
|
71413
|
+
return 1.06;
|
|
71414
|
+
if (distance === 1)
|
|
71415
|
+
return 1.03;
|
|
71416
|
+
return 1;
|
|
71417
|
+
}
|
|
71418
|
+
readyOfferings(player) {
|
|
71419
|
+
return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), 0);
|
|
71420
|
+
}
|
|
71421
|
+
totalOfferings(player) {
|
|
71422
|
+
return player.offerings.reduce((total, offering) => total + offering.value, 0);
|
|
71423
|
+
}
|
|
71424
|
+
canPlay(card) {
|
|
71425
|
+
if (!this.isOwnTurn())
|
|
71426
|
+
return false;
|
|
71427
|
+
if (card.type === 'offering')
|
|
71428
|
+
return !this.player().offeringPlayedThisTurn;
|
|
71429
|
+
if (card.type === 'character')
|
|
71430
|
+
return this.readyOfferings(this.player()) >= (card.cost ?? 0) && this.player().battleZone.length < 4;
|
|
71431
|
+
return false;
|
|
71432
|
+
}
|
|
71433
|
+
canPlaySelected() {
|
|
71434
|
+
const selected = this.selectedHandCard();
|
|
71435
|
+
return !!selected && this.canPlay(this.cardDefinition(selected));
|
|
71436
|
+
}
|
|
71437
|
+
selectedActionLabel() {
|
|
71438
|
+
const selected = this.selectedCardDefinition();
|
|
71439
|
+
if (!selected)
|
|
71440
|
+
return this.t('christianityPlayCard');
|
|
71441
|
+
return selected.type === 'offering' ? this.t('christianityPlayOffering') : this.t('christianityPlayCard');
|
|
71442
|
+
}
|
|
71443
|
+
selectedActionDisabled() {
|
|
71444
|
+
const selected = this.selectedCardDefinition();
|
|
71445
|
+
if (!selected || !this.canPlay(selected))
|
|
71446
|
+
return true;
|
|
71447
|
+
return selected.type === 'character';
|
|
71448
|
+
}
|
|
71449
|
+
canPlaceSelectedCharacter() {
|
|
71450
|
+
const selected = this.selectedCardDefinition();
|
|
71451
|
+
return !!selected && selected.type === 'character' && this.canPlay(selected);
|
|
71452
|
+
}
|
|
71453
|
+
canPlaceSelectedOffering() {
|
|
71454
|
+
const selected = this.selectedCardDefinition();
|
|
71455
|
+
return !!selected && selected.type === 'offering' && this.canPlay(selected);
|
|
71456
|
+
}
|
|
71457
|
+
isDraggingCharacter() {
|
|
71458
|
+
const cardId = this.draggingCardId();
|
|
71459
|
+
if (!cardId)
|
|
71460
|
+
return false;
|
|
71461
|
+
const card = this.cardDefinition(cardId);
|
|
71462
|
+
return card.type === 'character' && this.canPlay(card);
|
|
71463
|
+
}
|
|
71464
|
+
isDraggingOffering() {
|
|
71465
|
+
const cardId = this.draggingCardId();
|
|
71466
|
+
if (!cardId)
|
|
71467
|
+
return false;
|
|
71468
|
+
const card = this.cardDefinition(cardId);
|
|
71469
|
+
return card.type === 'offering' && this.canPlay(card);
|
|
71470
|
+
}
|
|
71471
|
+
startDraggingCard(cardId) {
|
|
71472
|
+
this.selectedAttacker.set(null);
|
|
71473
|
+
this.selectedHandCard.set(cardId);
|
|
71474
|
+
this.draggingCardId.set(cardId);
|
|
71475
|
+
this.closePreview();
|
|
71476
|
+
}
|
|
71477
|
+
endDraggingCard() {
|
|
71478
|
+
this.draggingCardId.set(null);
|
|
71479
|
+
}
|
|
71480
|
+
dropOnBattleSlot(event, slotIndex) {
|
|
71481
|
+
const card = this.cardDefinition(event.item.data);
|
|
71482
|
+
if (card.type !== 'character')
|
|
71483
|
+
return;
|
|
71484
|
+
this.playCardFromHand(event.item.data, slotIndex);
|
|
71485
|
+
}
|
|
71486
|
+
dropOnOfferings(event) {
|
|
71487
|
+
const card = this.cardDefinition(event.item.data);
|
|
71488
|
+
if (card.type !== 'offering')
|
|
71489
|
+
return;
|
|
71490
|
+
this.playCardFromHand(event.item.data);
|
|
71491
|
+
}
|
|
71492
|
+
selectHandCard(cardId) {
|
|
71493
|
+
const wasSelected = this.selectedHandCard() === cardId;
|
|
71494
|
+
this.selectedAttacker.set(null);
|
|
71495
|
+
this.selectedHandCard.set(wasSelected ? null : cardId);
|
|
71496
|
+
this.closePreview();
|
|
71497
|
+
}
|
|
71498
|
+
playSelectedCard(slotIndex) {
|
|
71499
|
+
const cardId = this.selectedHandCard();
|
|
71500
|
+
if (!cardId)
|
|
71501
|
+
return;
|
|
71502
|
+
this.playCardFromHand(cardId, slotIndex);
|
|
71503
|
+
}
|
|
71504
|
+
playCardFromHand(cardId, slotIndex) {
|
|
71505
|
+
const card = this.cardDefinition(cardId);
|
|
71506
|
+
if (!this.canPlay(card))
|
|
71507
|
+
return;
|
|
71508
|
+
this.game.update(game => {
|
|
71509
|
+
const next = structuredClone(game);
|
|
71510
|
+
const player = next.players.P1;
|
|
71511
|
+
const handIndex = player.hand?.indexOf(cardId) ?? -1;
|
|
71512
|
+
if (handIndex < 0 || !player.hand)
|
|
71513
|
+
return game;
|
|
71514
|
+
player.hand.splice(handIndex, 1);
|
|
71515
|
+
if (card.type === 'offering') {
|
|
71516
|
+
player.offerings.push({
|
|
71517
|
+
instanceId: `p1_offering_${next.revision + 1}`,
|
|
71518
|
+
cardId: card.id,
|
|
71519
|
+
name: card.name,
|
|
71520
|
+
owner: 'P1',
|
|
71521
|
+
ready: true,
|
|
71522
|
+
value: card.offeringValue ?? card.life ?? 1,
|
|
71523
|
+
abilityName: card.abilityName,
|
|
71524
|
+
abilityText: card.abilityText,
|
|
71525
|
+
abilityCost: card.abilityCost,
|
|
71526
|
+
});
|
|
71527
|
+
player.offeringPlayedThisTurn = true;
|
|
71528
|
+
}
|
|
71529
|
+
else {
|
|
71530
|
+
this.spendOfferings(player, card.cost ?? 0);
|
|
71531
|
+
const occupiedSlots = new Set(player.battleZone.map((character, index) => Number.isInteger(character.slot) ? character.slot ?? index : index));
|
|
71532
|
+
const targetSlot = slotIndex ?? [0, 1, 2, 3].find(index => !occupiedSlots.has(index));
|
|
71533
|
+
if (targetSlot === undefined || occupiedSlots.has(targetSlot))
|
|
71534
|
+
return game;
|
|
71535
|
+
player.battleZone.push({
|
|
71536
|
+
instanceId: `p1_${next.revision + 1}_${player.battleZone.length}`,
|
|
71537
|
+
cardId: card.id,
|
|
71538
|
+
name: card.name,
|
|
71539
|
+
owner: 'P1',
|
|
71540
|
+
controller: 'P1',
|
|
71541
|
+
slot: targetSlot,
|
|
71542
|
+
attack: card.attack ?? 0,
|
|
71543
|
+
currentHp: card.life ?? 1,
|
|
71544
|
+
maxHp: card.life ?? 1,
|
|
71545
|
+
canAttack: false,
|
|
71546
|
+
});
|
|
71547
|
+
player.battleZone.sort((left, right) => (left.slot ?? 0) - (right.slot ?? 0));
|
|
71548
|
+
}
|
|
71549
|
+
next.revision++;
|
|
71550
|
+
next.log = [
|
|
71551
|
+
card.type === 'offering' ? `${card.name} queda lista como ofrenda.` : `${card.name} entra en batalla.`,
|
|
71552
|
+
...next.log,
|
|
71553
|
+
].slice(0, 4);
|
|
71554
|
+
return next;
|
|
71555
|
+
});
|
|
71556
|
+
this.selectedHandCard.set(null);
|
|
71557
|
+
this.draggingCardId.set(null);
|
|
71558
|
+
this.closePreview();
|
|
71559
|
+
}
|
|
71560
|
+
handleOfferingPile(seat) {
|
|
71561
|
+
this.openOfferings(seat);
|
|
71562
|
+
}
|
|
71563
|
+
selectAttacker(card) {
|
|
71564
|
+
this.selectedHandCard.set(null);
|
|
71565
|
+
if (!this.isOwnTurn() || !card.canAttack) {
|
|
71566
|
+
this.inspectCharacter(card);
|
|
71567
|
+
return;
|
|
71568
|
+
}
|
|
71569
|
+
this.closePreview();
|
|
71570
|
+
this.selectedAttacker.set(this.selectedAttacker()?.instanceId === card.instanceId ? null : card);
|
|
71571
|
+
}
|
|
71572
|
+
handleOpponentCharacter(card) {
|
|
71573
|
+
if (this.selectedAttacker()) {
|
|
71574
|
+
this.attackCharacter(card);
|
|
71575
|
+
return;
|
|
71576
|
+
}
|
|
71577
|
+
this.inspectCharacter(card);
|
|
71578
|
+
}
|
|
71579
|
+
handleOpponentLeader() {
|
|
71580
|
+
if (this.selectedAttacker() && !this.hasOpponentGuards()) {
|
|
71581
|
+
this.attackLeader();
|
|
71582
|
+
return;
|
|
71583
|
+
}
|
|
71584
|
+
this.inspectLeader('P2');
|
|
71585
|
+
}
|
|
71586
|
+
attackLeader() {
|
|
71587
|
+
const attacker = this.selectedAttacker();
|
|
71588
|
+
if (!attacker)
|
|
71589
|
+
return;
|
|
71590
|
+
if (this.hasOpponentGuards()) {
|
|
71591
|
+
this.selectedPreview.set({
|
|
71592
|
+
title: this.opponent().leaderName,
|
|
71593
|
+
eyebrow: this.t('christianityLeaderCard'),
|
|
71594
|
+
meta: `${this.opponent().leaderHp}/${this.opponent().leaderMaxHp}`,
|
|
71595
|
+
body: this.t('christianityLeaderProtected'),
|
|
71596
|
+
});
|
|
71597
|
+
return;
|
|
71598
|
+
}
|
|
71599
|
+
this.game.update(game => {
|
|
71600
|
+
const next = structuredClone(game);
|
|
71601
|
+
const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
|
|
71602
|
+
if (!liveAttacker || !liveAttacker.canAttack)
|
|
71603
|
+
return game;
|
|
71604
|
+
next.players.P2.leaderHp = Math.max(0, next.players.P2.leaderHp - liveAttacker.attack);
|
|
71605
|
+
liveAttacker.canAttack = false;
|
|
71606
|
+
next.revision++;
|
|
71607
|
+
next.log = [`${liveAttacker.name} ataca al lider rival.`, ...next.log].slice(0, 4);
|
|
71608
|
+
return next;
|
|
71609
|
+
});
|
|
71610
|
+
this.selectedAttacker.set(null);
|
|
71611
|
+
}
|
|
71612
|
+
attackCharacter(target) {
|
|
71613
|
+
const attacker = this.selectedAttacker();
|
|
71614
|
+
if (!attacker)
|
|
71615
|
+
return;
|
|
71616
|
+
this.game.update(game => {
|
|
71617
|
+
const next = structuredClone(game);
|
|
71618
|
+
const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
|
|
71619
|
+
const liveTarget = next.players.P2.battleZone.find(card => card.instanceId === target.instanceId);
|
|
71620
|
+
if (!liveAttacker || !liveTarget || !liveAttacker.canAttack)
|
|
71621
|
+
return game;
|
|
71622
|
+
liveTarget.currentHp -= liveAttacker.attack;
|
|
71623
|
+
liveAttacker.currentHp -= liveTarget.attack;
|
|
71624
|
+
liveAttacker.canAttack = false;
|
|
71625
|
+
this.cleanupDestroyed(next.players.P1, next);
|
|
71626
|
+
this.cleanupDestroyed(next.players.P2, next);
|
|
71627
|
+
next.revision++;
|
|
71628
|
+
next.log = [`${liveAttacker.name} combate contra ${liveTarget.name}.`, ...next.log].slice(0, 4);
|
|
71629
|
+
return next;
|
|
71630
|
+
});
|
|
71631
|
+
this.selectedAttacker.set(null);
|
|
71632
|
+
}
|
|
71633
|
+
endTurn() {
|
|
71634
|
+
this.selectedHandCard.set(null);
|
|
71635
|
+
this.selectedAttacker.set(null);
|
|
71636
|
+
this.selectedPreview.set(null);
|
|
71637
|
+
this.selectedInfo.set(null);
|
|
71638
|
+
this.game.update(game => {
|
|
71639
|
+
const next = structuredClone(game);
|
|
71640
|
+
next.turnOwner = next.turnOwner === 'P1' ? 'P2' : 'P1';
|
|
71641
|
+
next.turnCount++;
|
|
71642
|
+
const current = next.players[next.turnOwner];
|
|
71643
|
+
current.offeringPlayedThisTurn = false;
|
|
71644
|
+
current.offerings = current.offerings.map(offering => ({ ...offering, ready: true }));
|
|
71645
|
+
current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
|
|
71646
|
+
const drawnCard = next.sharedDeck.shift();
|
|
71647
|
+
if (drawnCard) {
|
|
71648
|
+
if (current.hand) {
|
|
71649
|
+
current.hand.push(drawnCard);
|
|
71650
|
+
}
|
|
71651
|
+
else {
|
|
71652
|
+
current.handCount = (current.handCount ?? 0) + 1;
|
|
71653
|
+
}
|
|
71654
|
+
}
|
|
71655
|
+
next.revision++;
|
|
71656
|
+
next.log = [
|
|
71657
|
+
drawnCard ? `${current.displayName} roba una carta.` : `El mazo esta vacio.`,
|
|
71658
|
+
`Turno de ${current.displayName}.`,
|
|
71659
|
+
...next.log,
|
|
71660
|
+
].slice(0, 4);
|
|
71661
|
+
return next;
|
|
71662
|
+
});
|
|
71663
|
+
}
|
|
71664
|
+
resetMock() {
|
|
71665
|
+
this.game.set(this.catalogLoaded() ? this.createTutorialGame(this.allCatalogCards()) : structuredClone(STARTING_GAME));
|
|
71666
|
+
this.selectedHandCard.set(null);
|
|
71667
|
+
this.selectedAttacker.set(null);
|
|
71668
|
+
this.selectedPreview.set(null);
|
|
71669
|
+
this.selectedInfo.set(null);
|
|
71670
|
+
this.showHistory.set(false);
|
|
71671
|
+
this.showGallery.set(false);
|
|
71672
|
+
this.offeringsSeat.set(null);
|
|
71673
|
+
}
|
|
71674
|
+
startTutorial() {
|
|
71675
|
+
this.resetMock();
|
|
71676
|
+
this.screen.set('table');
|
|
71677
|
+
}
|
|
71678
|
+
closePreview() {
|
|
71679
|
+
this.selectedPreview.set(null);
|
|
71680
|
+
this.resetPreviewTilt();
|
|
71681
|
+
}
|
|
71682
|
+
closeInfo() {
|
|
71683
|
+
this.selectedInfo.set(null);
|
|
71684
|
+
}
|
|
71685
|
+
openOfferings(seat) {
|
|
71686
|
+
this.selectedPreview.set(null);
|
|
71687
|
+
this.selectedInfo.set(null);
|
|
71688
|
+
this.showHistory.set(false);
|
|
71689
|
+
this.showGallery.set(false);
|
|
71690
|
+
this.offeringsSeat.set(seat);
|
|
71691
|
+
}
|
|
71692
|
+
openHistory() {
|
|
71693
|
+
this.selectedPreview.set(null);
|
|
71694
|
+
this.selectedInfo.set(null);
|
|
71695
|
+
this.offeringsSeat.set(null);
|
|
71696
|
+
this.showGallery.set(false);
|
|
71697
|
+
this.showHistory.set(true);
|
|
71698
|
+
}
|
|
71699
|
+
closeOfferings() {
|
|
71700
|
+
this.offeringsSeat.set(null);
|
|
71701
|
+
}
|
|
71702
|
+
openGallery() {
|
|
71703
|
+
this.selectedPreview.set(null);
|
|
71704
|
+
this.selectedInfo.set(null);
|
|
71705
|
+
this.offeringsSeat.set(null);
|
|
71706
|
+
this.showHistory.set(false);
|
|
71707
|
+
this.showGallery.set(true);
|
|
71708
|
+
}
|
|
71709
|
+
closeGallery() {
|
|
71710
|
+
this.showGallery.set(false);
|
|
71711
|
+
}
|
|
71712
|
+
setGallerySearch(event) {
|
|
71713
|
+
this.gallerySearch.set(event.target.value);
|
|
71714
|
+
}
|
|
71715
|
+
setGalleryType(event) {
|
|
71716
|
+
this.galleryType.set(event.target.value);
|
|
71717
|
+
}
|
|
71718
|
+
tiltPreview(event) {
|
|
71719
|
+
const bounds = event.currentTarget.getBoundingClientRect();
|
|
71720
|
+
const x = (event.clientX - bounds.left) / bounds.width - 0.5;
|
|
71721
|
+
const y = (event.clientY - bounds.top) / bounds.height - 0.5;
|
|
71722
|
+
this.previewTilt.set({
|
|
71723
|
+
rotateX: 5 - y * 18,
|
|
71724
|
+
rotateY: -5 + x * 18,
|
|
71725
|
+
shiftX: x * 10,
|
|
71726
|
+
shiftY: y * 10,
|
|
71727
|
+
});
|
|
71728
|
+
}
|
|
71729
|
+
resetPreviewTilt() {
|
|
71730
|
+
this.previewTilt.set({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
|
|
71731
|
+
}
|
|
71732
|
+
cleanupDestroyed(player, game) {
|
|
71733
|
+
const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
|
|
71734
|
+
if (!destroyed.length)
|
|
71735
|
+
return;
|
|
71736
|
+
game.historyZone.push(...destroyed.map(card => card.cardId));
|
|
71737
|
+
player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
|
|
71738
|
+
}
|
|
71739
|
+
inspectLeader(seat) {
|
|
71740
|
+
this.selectedInfo.set(null);
|
|
71741
|
+
const player = this.game().players[seat];
|
|
71742
|
+
const leader = player.leaderCardId ? this.cardDefinition(player.leaderCardId) : undefined;
|
|
71743
|
+
this.selectedPreview.set({
|
|
71744
|
+
title: leader ? this.translatedCardText(leader).name : player.leaderName,
|
|
71745
|
+
eyebrow: this.t('christianityLeaderCard'),
|
|
71746
|
+
meta: `${player.leaderHp}/${player.leaderMaxHp}`,
|
|
71747
|
+
body: seat === 'P2' && this.hasOpponentGuards() ? this.t('christianityLeaderProtected') : this.t('christianityLeaderBody'),
|
|
71748
|
+
cardId: player.leaderCardId,
|
|
71749
|
+
source: 'board',
|
|
71750
|
+
});
|
|
71751
|
+
}
|
|
71752
|
+
inspectOffering(offering) {
|
|
71753
|
+
this.selectedInfo.set(null);
|
|
71754
|
+
const definition = this.cardDefinition(offering.cardId);
|
|
71755
|
+
const text = this.translatedCardText(definition);
|
|
71756
|
+
this.selectedPreview.set({
|
|
71757
|
+
title: text.name,
|
|
71758
|
+
eyebrow: this.t('christianityOfferingCard'),
|
|
71759
|
+
meta: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
|
|
71760
|
+
body: text.abilityText ?? offering.abilityText ?? this.t('christianityOfferingBody'),
|
|
71761
|
+
cardId: offering.cardId,
|
|
71762
|
+
source: 'pile',
|
|
71763
|
+
});
|
|
71764
|
+
}
|
|
71765
|
+
offeringAbilityText(offering) {
|
|
71766
|
+
const text = this.translatedCardText(this.cardDefinition(offering.cardId));
|
|
71767
|
+
return text.abilityText ?? offering.abilityText ?? this.t('christianityOfferingNoAbility');
|
|
71768
|
+
}
|
|
71769
|
+
canUseOfferingAbility(offering, seat) {
|
|
71770
|
+
if (seat !== 'P1' || !this.isOwnTurn())
|
|
71771
|
+
return false;
|
|
71772
|
+
if (!offering.ready || !offering.abilityName)
|
|
71773
|
+
return false;
|
|
71774
|
+
return this.readyOfferings(this.game().players[seat]) >= (offering.abilityCost ?? 0);
|
|
71775
|
+
}
|
|
71776
|
+
useOfferingAbility(offering, seat) {
|
|
71777
|
+
if (!this.canUseOfferingAbility(offering, seat))
|
|
71778
|
+
return;
|
|
71779
|
+
this.game.update(game => {
|
|
71780
|
+
const next = structuredClone(game);
|
|
71781
|
+
const player = next.players[seat];
|
|
71782
|
+
const liveOffering = player.offerings.find(card => card.instanceId === offering.instanceId);
|
|
71783
|
+
if (!liveOffering || !liveOffering.ready)
|
|
71784
|
+
return game;
|
|
71785
|
+
const offeringId = liveOffering.instanceId;
|
|
71786
|
+
this.spendOfferings(player, liveOffering.abilityCost ?? 0);
|
|
71787
|
+
player.offerings = player.offerings.map(card => (card.instanceId === offeringId ? { ...card, ready: false } : card));
|
|
71788
|
+
player.leaderHp = Math.max(0, player.leaderHp - 1);
|
|
71789
|
+
next.revision++;
|
|
71790
|
+
next.log = [`${liveOffering.name}: ${liveOffering.abilityName}.`, ...next.log].slice(0, 4);
|
|
71791
|
+
return next;
|
|
71792
|
+
});
|
|
71793
|
+
}
|
|
71794
|
+
inspectDeck() {
|
|
71795
|
+
const remainingCards = this.game().sharedDeck.length;
|
|
71796
|
+
this.selectedPreview.set(null);
|
|
71797
|
+
this.selectedInfo.set({
|
|
71798
|
+
title: this.t('christianityDeck'),
|
|
71799
|
+
eyebrow: this.t('christianitySharedZone'),
|
|
71800
|
+
meta: `${remainingCards} ${remainingCards === 1 ? this.t('christianityCardRemaining') : this.t('christianityCardsRemaining')}`,
|
|
71801
|
+
body: this.t('christianityDeckBody'),
|
|
71802
|
+
facts: [
|
|
71803
|
+
this.t('christianityDeckRuleShared'),
|
|
71804
|
+
this.t('christianityDeckRuleDraw'),
|
|
71805
|
+
this.t('christianityDeckRuleEmpty'),
|
|
71806
|
+
],
|
|
71807
|
+
});
|
|
71808
|
+
}
|
|
71809
|
+
inspectHowToPlay() {
|
|
71810
|
+
this.selectedPreview.set(null);
|
|
71811
|
+
this.selectedInfo.set({
|
|
71812
|
+
title: this.t('christianityHowToPlay'),
|
|
71813
|
+
eyebrow: this.t('christianityGenesisEdition'),
|
|
71814
|
+
meta: this.t('christianityTutorialMode'),
|
|
71815
|
+
body: this.t('christianityHowToPlayIntro'),
|
|
71816
|
+
facts: [
|
|
71817
|
+
this.t('christianityHowToPlayGoal'),
|
|
71818
|
+
this.t('christianityHowToPlayTurn'),
|
|
71819
|
+
this.t('christianityHowToPlayOfferings'),
|
|
71820
|
+
this.t('christianityHowToPlayBattle'),
|
|
71821
|
+
],
|
|
71822
|
+
});
|
|
71823
|
+
}
|
|
71824
|
+
inspectHandCard(cardId, fromHand = false) {
|
|
71825
|
+
this.selectedInfo.set(null);
|
|
71826
|
+
const card = this.cardDefinition(cardId);
|
|
71827
|
+
const text = this.translatedCardText(card);
|
|
71828
|
+
if (fromHand) {
|
|
71829
|
+
this.selectedAttacker.set(null);
|
|
71830
|
+
this.selectedHandCard.set(cardId);
|
|
71831
|
+
}
|
|
71832
|
+
this.selectedPreview.set({
|
|
71833
|
+
title: text.name,
|
|
71834
|
+
eyebrow: this.cardTypeLabel(card),
|
|
71835
|
+
meta: this.cardPreviewMeta(card),
|
|
71836
|
+
body: this.defaultCardBody(card.type),
|
|
71837
|
+
cardId,
|
|
71838
|
+
source: fromHand ? 'hand' : 'pile',
|
|
71839
|
+
});
|
|
71840
|
+
}
|
|
71841
|
+
inspectGalleryCard(cardId) {
|
|
71842
|
+
this.inspectHandCard(cardId);
|
|
71843
|
+
}
|
|
71844
|
+
inspectHistoryCard(cardId) {
|
|
71845
|
+
this.showHistory.set(false);
|
|
71846
|
+
this.inspectHandCard(cardId);
|
|
71847
|
+
}
|
|
71848
|
+
inspectCharacter(card) {
|
|
71849
|
+
this.selectedInfo.set(null);
|
|
71850
|
+
const definition = this.cardDefinition(card.cardId);
|
|
71851
|
+
this.selectedPreview.set({
|
|
71852
|
+
title: this.translatedCardText(definition).name,
|
|
71853
|
+
eyebrow: this.t('christianityCharacterCard'),
|
|
71854
|
+
meta: `${card.attack}/${card.currentHp}`,
|
|
71855
|
+
body: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
|
|
71856
|
+
cardId: card.cardId,
|
|
71857
|
+
source: 'board',
|
|
71858
|
+
});
|
|
71859
|
+
}
|
|
71860
|
+
cardPreviewMeta(card) {
|
|
71861
|
+
if (card.type === 'offering')
|
|
71862
|
+
return `${card.offeringValue ?? card.life ?? 1}`;
|
|
71863
|
+
if (card.type === 'leader')
|
|
71864
|
+
return `${card.leaderLife ?? card.life ?? 0}`;
|
|
71865
|
+
if (card.type === 'character')
|
|
71866
|
+
return `${this.t('christianityCost')} ${card.cost ?? 0} · ${card.attack ?? 0}/${card.life ?? 0}`;
|
|
71867
|
+
if (card.cost !== undefined)
|
|
71868
|
+
return `${this.t('christianityCost')} ${card.cost}`;
|
|
71869
|
+
return card.collectorNumber ?? card.id;
|
|
71870
|
+
}
|
|
71871
|
+
spendOfferings(player, cost) {
|
|
71872
|
+
let remaining = cost;
|
|
71873
|
+
player.offerings = player.offerings.map(offering => {
|
|
71874
|
+
if (remaining <= 0 || !offering.ready)
|
|
71875
|
+
return offering;
|
|
71876
|
+
remaining -= offering.value;
|
|
71877
|
+
return { ...offering, ready: false };
|
|
71878
|
+
});
|
|
71879
|
+
}
|
|
71880
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
71881
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChristianityGameComponent, isStandalone: true, selector: "val-christianity-game", ngImport: i0, template: `
|
|
71882
|
+
<main class="christianity-shell">
|
|
71883
|
+
<section class="christianity-header">
|
|
71884
|
+
<div>
|
|
71885
|
+
<p>{{ t('christianityEyebrow') }}</p>
|
|
71886
|
+
<h1>{{ t('christianityTitle') }}</h1>
|
|
71887
|
+
</div>
|
|
71888
|
+
<div class="christianity-header-actions">
|
|
71889
|
+
@if (screen() !== 'splash') {
|
|
71890
|
+
<button type="button" class="christianity-gallery-open" valLightRipple (click)="openGallery()">
|
|
71891
|
+
{{ t('christianityGallery') }}
|
|
71892
|
+
</button>
|
|
71893
|
+
}
|
|
71894
|
+
@if (screen() === 'table') {
|
|
71895
|
+
<div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
|
|
71896
|
+
<span>{{ t('christianityTurn') }}</span>
|
|
71897
|
+
<strong>{{ currentPlayer().displayName }}</strong>
|
|
71898
|
+
</div>
|
|
71899
|
+
}
|
|
71900
|
+
</div>
|
|
71901
|
+
</section>
|
|
71902
|
+
|
|
71903
|
+
@if (screen() === 'splash') {
|
|
71904
|
+
<section class="christianity-splash" role="status" aria-live="polite">
|
|
71905
|
+
<div class="christianity-splash__mark">
|
|
71906
|
+
<i aria-hidden="true"></i>
|
|
71907
|
+
<i aria-hidden="true"></i>
|
|
71908
|
+
<i aria-hidden="true"></i>
|
|
71909
|
+
</div>
|
|
71910
|
+
<div>
|
|
71911
|
+
<span>{{ t('christianitySplashEyebrow') }}</span>
|
|
71912
|
+
<h2>{{ t('christianitySplashTitle') }}</h2>
|
|
71913
|
+
<p>{{ splashStatusText() }}</p>
|
|
71914
|
+
</div>
|
|
71915
|
+
</section>
|
|
71916
|
+
} @else if (screen() === 'home') {
|
|
71917
|
+
<section class="christianity-start">
|
|
71918
|
+
<div class="christianity-start__hero">
|
|
71919
|
+
<div class="christianity-start__copy">
|
|
71920
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
71921
|
+
<h2>{{ t('christianityStartTitle') }}</h2>
|
|
71922
|
+
<p>{{ t('christianityStartBody') }}</p>
|
|
71923
|
+
</div>
|
|
71924
|
+
<div class="christianity-start__fan" aria-hidden="true">
|
|
71925
|
+
@for (card of startFeaturedCards(); track card.id) {
|
|
71926
|
+
<val-christianity-card
|
|
71927
|
+
[card]="definitionToRenderCard(card)"
|
|
71928
|
+
variant="hand"
|
|
71929
|
+
[style.transform]="startFeaturedCardTransform($index)"
|
|
71930
|
+
></val-christianity-card>
|
|
71931
|
+
}
|
|
71932
|
+
</div>
|
|
71933
|
+
</div>
|
|
71934
|
+
<div class="christianity-start__cards">
|
|
71935
|
+
<article>
|
|
71936
|
+
<strong>{{ t('christianityTutorialMode') }}</strong>
|
|
71937
|
+
<p>{{ t('christianityTutorialModeBody') }}</p>
|
|
71938
|
+
<button type="button" class="christianity-primary-action" valLightRipple (click)="startTutorial()">
|
|
71939
|
+
{{ t('christianityStartTutorial') }}
|
|
71940
|
+
</button>
|
|
71941
|
+
</article>
|
|
71942
|
+
<article>
|
|
71943
|
+
<strong>{{ t('christianityGallery') }}</strong>
|
|
71944
|
+
<p>{{ t('christianityGalleryModeBody') }}</p>
|
|
71945
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="openGallery()">
|
|
71946
|
+
{{ t('christianityOpenGallery') }}
|
|
71947
|
+
</button>
|
|
71948
|
+
</article>
|
|
71949
|
+
<article>
|
|
71950
|
+
<strong>{{ t('christianityHowToPlay') }}</strong>
|
|
71951
|
+
<p>{{ t('christianityHowToPlayBody') }}</p>
|
|
71952
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="inspectHowToPlay()">
|
|
71953
|
+
{{ t('learnMore') }}
|
|
71954
|
+
</button>
|
|
71955
|
+
</article>
|
|
71956
|
+
</div>
|
|
71957
|
+
<div class="christianity-start__status" [attr.aria-label]="t('christianityEditionStatus')">
|
|
71958
|
+
<span>{{ galleryEditionLabel() }}</span>
|
|
71959
|
+
<span>{{ t('christianityTutorialActive') }}</span>
|
|
71960
|
+
<span>{{ catalogStatusLabel() }}</span>
|
|
71961
|
+
</div>
|
|
71962
|
+
<section class="christianity-start__modes" [attr.aria-label]="t('christianityFutureModes')">
|
|
71963
|
+
@for (mode of futureModes(); track mode.title) {
|
|
71964
|
+
<article>
|
|
71965
|
+
<strong>{{ mode.title }}</strong>
|
|
71966
|
+
<p>{{ mode.body }}</p>
|
|
71967
|
+
<span>{{ t('soonTitle') }}</span>
|
|
71968
|
+
</article>
|
|
71969
|
+
}
|
|
71970
|
+
</section>
|
|
71971
|
+
</section>
|
|
71972
|
+
} @else {
|
|
71973
|
+
<section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
|
|
71974
|
+
<article class="christianity-match-player">
|
|
71975
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
71976
|
+
<div>
|
|
71977
|
+
<strong>{{ player().displayName }}</strong>
|
|
71978
|
+
<small>{{ playerLeaderDisplayName(player()) }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
|
|
71979
|
+
</div>
|
|
71980
|
+
</article>
|
|
71981
|
+
<div class="christianity-scoreboard">
|
|
71982
|
+
<span>{{ t('christianityMatch') }}</span>
|
|
71983
|
+
<strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
|
|
71984
|
+
</div>
|
|
71985
|
+
<article class="christianity-match-player christianity-match-player--opponent">
|
|
71986
|
+
<span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
|
|
71987
|
+
<div>
|
|
71988
|
+
<strong>{{ opponent().displayName }}</strong>
|
|
71989
|
+
<small>{{ playerLeaderDisplayName(opponent()) }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
|
|
71990
|
+
</div>
|
|
71991
|
+
</article>
|
|
71992
|
+
</section>
|
|
71993
|
+
|
|
71994
|
+
<section class="christianity-hand-shelf christianity-hand-shelf--opponent">
|
|
71995
|
+
<div class="christianity-hand-meter christianity-hand-meter--opponent">
|
|
71996
|
+
<span>{{ t('christianityHand') }}</span>
|
|
71997
|
+
<strong>{{ opponentHandCount() }}</strong>
|
|
71998
|
+
</div>
|
|
71999
|
+
<section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
|
|
72000
|
+
@for (_ of hiddenHandCards(opponentHandCount()); track $index) {
|
|
72001
|
+
<button
|
|
72002
|
+
type="button"
|
|
72003
|
+
class="christianity-card-preview-card christianity-card-frame christianity-card-frame--back"
|
|
72004
|
+
valLightRipple
|
|
72005
|
+
[style.transform]="fanTransform($index, opponentHandCount(), true)"
|
|
72006
|
+
[attr.aria-label]="t('christianityHiddenCard')"
|
|
72007
|
+
></button>
|
|
72008
|
+
}
|
|
72009
|
+
</section>
|
|
72010
|
+
</section>
|
|
72011
|
+
|
|
72012
|
+
<section class="christianity-table" [attr.aria-label]="t('christianityTable')">
|
|
72013
|
+
<section class="christianity-player-side christianity-player-side--opponent">
|
|
72014
|
+
<section class="christianity-player-rack christianity-player-rack--opponent">
|
|
72015
|
+
<div class="christianity-offerings-zone">
|
|
72016
|
+
<button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
|
|
72017
|
+
<i aria-hidden="true"></i>
|
|
72018
|
+
<i aria-hidden="true"></i>
|
|
72019
|
+
<i aria-hidden="true"></i>
|
|
72020
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
72021
|
+
<strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
|
|
72022
|
+
</button>
|
|
72023
|
+
</div>
|
|
72024
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
|
|
72025
|
+
<val-christianity-card [card]="leaderRenderCard(opponent())" variant="table"></val-christianity-card>
|
|
72026
|
+
</button>
|
|
72027
|
+
<span class="christianity-rack-spacer" aria-hidden="true"></span>
|
|
72028
|
+
</section>
|
|
72029
|
+
|
|
72030
|
+
<section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
|
|
72031
|
+
@for (slot of battleSlots('P2'); track slot.trackId) {
|
|
72032
|
+
@if (slot.card) {
|
|
72033
|
+
<button
|
|
72034
|
+
type="button"
|
|
72035
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
72036
|
+
valLightRipple
|
|
72037
|
+
[class.is-target]="selectedAttacker()"
|
|
72038
|
+
(click)="handleOpponentCharacter(slot.card)"
|
|
72039
|
+
>
|
|
72040
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
72041
|
+
</button>
|
|
72042
|
+
} @else {
|
|
72043
|
+
<span class="christianity-slot"></span>
|
|
72044
|
+
}
|
|
72045
|
+
}
|
|
72046
|
+
</section>
|
|
72047
|
+
</section>
|
|
72048
|
+
|
|
72049
|
+
<section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
|
|
72050
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="openHistory()">
|
|
72051
|
+
<i aria-hidden="true"></i>
|
|
72052
|
+
<i aria-hidden="true"></i>
|
|
72053
|
+
<i aria-hidden="true"></i>
|
|
72054
|
+
<span>{{ t('christianityHistory') }}</span>
|
|
72055
|
+
<strong>{{ game().historyZone.length }}</strong>
|
|
72056
|
+
</button>
|
|
72057
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
|
|
72058
|
+
<i aria-hidden="true"></i>
|
|
72059
|
+
<i aria-hidden="true"></i>
|
|
72060
|
+
<i aria-hidden="true"></i>
|
|
72061
|
+
<span>{{ t('christianityDeck') }}</span>
|
|
72062
|
+
<strong>{{ game().sharedDeck.length }}</strong>
|
|
72063
|
+
</button>
|
|
72064
|
+
<div class="christianity-zone-card">
|
|
72065
|
+
<span>{{ t('christianityPlace') }}</span>
|
|
72066
|
+
<strong>{{ t('christianityEmpty') }}</strong>
|
|
72067
|
+
</div>
|
|
72068
|
+
</section>
|
|
72069
|
+
|
|
72070
|
+
<section class="christianity-player-side">
|
|
72071
|
+
<section class="christianity-battle-zone" [class.is-placing-card]="canPlaceSelectedCharacter() || isDraggingCharacter()" [attr.aria-label]="t('christianityYourBattle')">
|
|
72072
|
+
@for (slot of battleSlots('P1'); track slot.trackId) {
|
|
72073
|
+
@if (slot.card) {
|
|
72074
|
+
<button
|
|
72075
|
+
type="button"
|
|
72076
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
72077
|
+
valLightRipple
|
|
72078
|
+
[class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
|
|
72079
|
+
[class.is-exhausted]="!slot.card.canAttack"
|
|
72080
|
+
[class.is-ready-attacker]="isOwnTurn() && slot.card.canAttack"
|
|
72081
|
+
(click)="selectAttacker(slot.card)"
|
|
72082
|
+
>
|
|
72083
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
72084
|
+
</button>
|
|
72085
|
+
} @else {
|
|
72086
|
+
<button
|
|
72087
|
+
type="button"
|
|
72088
|
+
class="christianity-slot"
|
|
72089
|
+
cdkDropList
|
|
72090
|
+
[id]="battleSlotDropId($index)"
|
|
72091
|
+
[cdkDropListData]="$index"
|
|
72092
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
72093
|
+
[cdkDropListEnterPredicate]="canDropOnBattleSlot"
|
|
72094
|
+
[cdkDropListSortingDisabled]="true"
|
|
72095
|
+
[class.christianity-slot--play-target]="canPlaceSelectedCharacter() || isDraggingCharacter()"
|
|
72096
|
+
valLightRipple
|
|
72097
|
+
(cdkDropListDropped)="dropOnBattleSlot($event, $index)"
|
|
72098
|
+
(click)="playSelectedCard($index)"
|
|
72099
|
+
>
|
|
72100
|
+
@if (canPlaceSelectedCharacter() || isDraggingCharacter()) {
|
|
72101
|
+
<span>{{ t('christianityPlayHere') }}</span>
|
|
72102
|
+
}
|
|
72103
|
+
</button>
|
|
72104
|
+
}
|
|
72105
|
+
}
|
|
72106
|
+
</section>
|
|
72107
|
+
|
|
72108
|
+
<section class="christianity-player-rack">
|
|
72109
|
+
<div class="christianity-offerings-zone">
|
|
72110
|
+
<button
|
|
72111
|
+
type="button"
|
|
72112
|
+
class="christianity-offering-pile"
|
|
72113
|
+
cdkDropList
|
|
72114
|
+
id="christianity-offerings-drop"
|
|
72115
|
+
valLightRipple
|
|
72116
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
72117
|
+
[class.is-play-target]="canPlaceSelectedOffering() || isDraggingOffering()"
|
|
72118
|
+
[cdkDropListEnterPredicate]="canDropOnOfferings"
|
|
72119
|
+
[cdkDropListSortingDisabled]="true"
|
|
72120
|
+
(cdkDropListDropped)="dropOnOfferings($event)"
|
|
72121
|
+
(click)="handleOfferingPile('P1')"
|
|
72122
|
+
>
|
|
72123
|
+
<i aria-hidden="true"></i>
|
|
72124
|
+
<i aria-hidden="true"></i>
|
|
72125
|
+
<i aria-hidden="true"></i>
|
|
72126
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
72127
|
+
<strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
|
|
72128
|
+
</button>
|
|
72129
|
+
</div>
|
|
72130
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple (click)="inspectLeader('P1')">
|
|
72131
|
+
<val-christianity-card [card]="leaderRenderCard(player())" variant="table"></val-christianity-card>
|
|
72132
|
+
</button>
|
|
72133
|
+
<div class="christianity-player-command">
|
|
72134
|
+
<div class="christianity-player-badge">
|
|
72135
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
72136
|
+
<strong>{{ player().displayName }}</strong>
|
|
72137
|
+
</div>
|
|
72138
|
+
<button
|
|
72139
|
+
type="button"
|
|
72140
|
+
class="christianity-end-turn"
|
|
72141
|
+
(click)="endTurn()"
|
|
72142
|
+
>
|
|
72143
|
+
{{ t('christianityEndTurn') }}
|
|
72144
|
+
</button>
|
|
72145
|
+
</div>
|
|
72146
|
+
</section>
|
|
72147
|
+
</section>
|
|
72148
|
+
</section>
|
|
72149
|
+
|
|
72150
|
+
<section class="christianity-hand-shelf">
|
|
72151
|
+
<div class="christianity-hand-meter">
|
|
72152
|
+
<span>{{ t('christianityHand') }}</span>
|
|
72153
|
+
<strong>{{ player().hand?.length ?? 0 }}</strong>
|
|
72154
|
+
</div>
|
|
72155
|
+
<section
|
|
72156
|
+
class="christianity-hand-fan"
|
|
72157
|
+
cdkDropList
|
|
72158
|
+
id="christianity-hand-source"
|
|
72159
|
+
[cdkDropListConnectedTo]="dropTargetIds()"
|
|
72160
|
+
[attr.aria-label]="t('christianityYourHand')"
|
|
72161
|
+
(pointerleave)="clearHoveredHandIndex()"
|
|
72162
|
+
>
|
|
72163
|
+
@for (cardId of player().hand ?? []; track cardId + $index) {
|
|
72164
|
+
@let card = cardDefinition(cardId);
|
|
72165
|
+
<div
|
|
72166
|
+
class="christianity-hand-card-wrap"
|
|
72167
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
72168
|
+
[class.is-dragging]="draggingCardId() === cardId"
|
|
72169
|
+
[style.z-index]="handCardZIndex($index)"
|
|
72170
|
+
[style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
|
|
72171
|
+
(pointerenter)="setHoveredHandIndex($index)"
|
|
72172
|
+
(pointerdown)="setHoveredHandIndex($index)"
|
|
72173
|
+
(pointerup)="releaseHoveredHand($event)"
|
|
72174
|
+
>
|
|
72175
|
+
<button
|
|
72176
|
+
type="button"
|
|
72177
|
+
class="christianity-card-preview-card christianity-card-preview-card--hand christianity-render-card-button"
|
|
72178
|
+
cdkDrag
|
|
72179
|
+
valLightRipple
|
|
72180
|
+
[cdkDragData]="cardId"
|
|
72181
|
+
[cdkDragDisabled]="!canPlay(card)"
|
|
72182
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
72183
|
+
[class.is-disabled]="!canPlay(card)"
|
|
72184
|
+
(cdkDragStarted)="startDraggingCard(cardId)"
|
|
72185
|
+
(cdkDragEnded)="endDraggingCard()"
|
|
72186
|
+
(click)="selectHandCard(cardId)"
|
|
72187
|
+
>
|
|
72188
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="hand"></val-christianity-card>
|
|
72189
|
+
</button>
|
|
72190
|
+
<button
|
|
72191
|
+
type="button"
|
|
72192
|
+
class="christianity-card-eye"
|
|
72193
|
+
[attr.aria-label]="t('christianityPreviewCard')"
|
|
72194
|
+
(click)="inspectHandCard(cardId, true); $event.stopPropagation()"
|
|
72195
|
+
></button>
|
|
72196
|
+
</div>
|
|
72197
|
+
}
|
|
72198
|
+
</section>
|
|
72199
|
+
</section>
|
|
72200
|
+
}
|
|
72201
|
+
|
|
72202
|
+
@if (selectedPreview()) {
|
|
72203
|
+
<button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
|
|
72204
|
+
<aside
|
|
72205
|
+
class="christianity-floating-card-shell"
|
|
72206
|
+
aria-live="polite"
|
|
72207
|
+
>
|
|
72208
|
+
<button type="button" class="christianity-floating-card-close" (click)="closePreview()">
|
|
72209
|
+
{{ t('close') }}
|
|
72210
|
+
</button>
|
|
72211
|
+
<div
|
|
72212
|
+
class="christianity-floating-card"
|
|
72213
|
+
[style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
|
|
72214
|
+
[style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
|
|
72215
|
+
[style.--preview-shift-x]="previewTilt().shiftX + 'px'"
|
|
72216
|
+
[style.--preview-shift-y]="previewTilt().shiftY + 'px'"
|
|
72217
|
+
(pointermove)="tiltPreview($event)"
|
|
72218
|
+
(pointerleave)="resetPreviewTilt()"
|
|
72219
|
+
>
|
|
72220
|
+
@if (selectedPreviewRenderCard(); as previewCard) {
|
|
72221
|
+
<val-christianity-card [card]="previewCard" variant="full"></val-christianity-card>
|
|
72222
|
+
}
|
|
72223
|
+
</div>
|
|
72224
|
+
@if (previewRule(); as rule) {
|
|
72225
|
+
<div class="christianity-preview-rule-note">
|
|
72226
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72227
|
+
<div>
|
|
72228
|
+
<small>{{ t('christianityCardRule') }}</small>
|
|
72229
|
+
<strong>{{ rule.title }}</strong>
|
|
72230
|
+
<p>{{ rule.body }}</p>
|
|
72231
|
+
</div>
|
|
72232
|
+
</div>
|
|
72233
|
+
}
|
|
72234
|
+
</aside>
|
|
72235
|
+
}
|
|
72236
|
+
|
|
72237
|
+
@if (selectedInfo(); as info) {
|
|
72238
|
+
<button type="button" class="christianity-info-backdrop" [attr.aria-label]="t('close')" (click)="closeInfo()"></button>
|
|
72239
|
+
<aside class="christianity-info-panel" aria-live="polite">
|
|
72240
|
+
<button type="button" class="christianity-dialog-close christianity-info-close" (click)="closeInfo()">
|
|
72241
|
+
{{ t('close') }}
|
|
72242
|
+
</button>
|
|
72243
|
+
<div class="christianity-rule-note">
|
|
72244
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72245
|
+
<div>
|
|
72246
|
+
<small>{{ info.eyebrow }}</small>
|
|
72247
|
+
<h2>{{ info.title }}</h2>
|
|
72248
|
+
<strong>{{ info.meta }}</strong>
|
|
72249
|
+
<p>{{ info.body }}</p>
|
|
72250
|
+
<ul>
|
|
72251
|
+
@for (fact of info.facts; track fact) {
|
|
72252
|
+
<li>{{ fact }}</li>
|
|
72253
|
+
}
|
|
72254
|
+
</ul>
|
|
72255
|
+
</div>
|
|
72256
|
+
</div>
|
|
72257
|
+
</aside>
|
|
72258
|
+
}
|
|
72259
|
+
|
|
72260
|
+
@if (screen() === 'table') {
|
|
72261
|
+
<section class="christianity-actions" aria-live="polite">
|
|
72262
|
+
<p>{{ statusText() }}</p>
|
|
72263
|
+
<div>
|
|
72264
|
+
<button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
|
|
72265
|
+
{{ selectedActionLabel() }}
|
|
72266
|
+
</button>
|
|
72267
|
+
<button type="button" (click)="resetMock()">
|
|
72268
|
+
{{ t('christianityReset') }}
|
|
72269
|
+
</button>
|
|
72270
|
+
</div>
|
|
72271
|
+
</section>
|
|
72272
|
+
}
|
|
72273
|
+
|
|
72274
|
+
@if (showHistory()) {
|
|
72275
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
|
|
72276
|
+
<section class="christianity-history-drawer">
|
|
72277
|
+
<header>
|
|
72278
|
+
<h2>{{ t('christianityHistory') }}</h2>
|
|
72279
|
+
<div class="christianity-dialog-actions">
|
|
72280
|
+
<span>{{ game().historyZone.length }}</span>
|
|
72281
|
+
<button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
|
|
72282
|
+
{{ t('close') }}
|
|
72283
|
+
</button>
|
|
72284
|
+
</div>
|
|
72285
|
+
</header>
|
|
72286
|
+
@if (game().historyZone.length) {
|
|
72287
|
+
<div class="christianity-history-grid">
|
|
72288
|
+
@for (cardId of game().historyZone; track cardId + $index) {
|
|
72289
|
+
@let card = cardDefinition(cardId);
|
|
72290
|
+
<button type="button" class="christianity-gallery-card-button christianity-render-card-button" valLightRipple (click)="inspectHistoryCard(cardId)">
|
|
72291
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72292
|
+
</button>
|
|
72293
|
+
}
|
|
72294
|
+
</div>
|
|
72295
|
+
} @else {
|
|
72296
|
+
<p>{{ t('christianityHistoryEmpty') }}</p>
|
|
72297
|
+
}
|
|
72298
|
+
</section>
|
|
72299
|
+
}
|
|
72300
|
+
|
|
72301
|
+
@if (showGallery()) {
|
|
72302
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseGallery')" (click)="closeGallery()"></button>
|
|
72303
|
+
<section class="christianity-history-drawer christianity-gallery-drawer">
|
|
72304
|
+
<header>
|
|
72305
|
+
<div>
|
|
72306
|
+
<h2>{{ t('christianityGallery') }}</h2>
|
|
72307
|
+
<p>{{ galleryEditionLabel() }}</p>
|
|
72308
|
+
</div>
|
|
72309
|
+
<div class="christianity-dialog-actions">
|
|
72310
|
+
<span>{{ galleryCards().length }}</span>
|
|
72311
|
+
<button type="button" class="christianity-dialog-close" (click)="closeGallery()">
|
|
72312
|
+
{{ t('close') }}
|
|
72313
|
+
</button>
|
|
72314
|
+
</div>
|
|
72315
|
+
</header>
|
|
72316
|
+
<div class="christianity-gallery-controls">
|
|
72317
|
+
<label>
|
|
72318
|
+
<span>{{ t('christianityGallerySearch') }}</span>
|
|
72319
|
+
<input type="search" [value]="gallerySearch()" (input)="setGallerySearch($event)" [placeholder]="t('christianityGallerySearchPlaceholder')" />
|
|
72320
|
+
</label>
|
|
72321
|
+
<label>
|
|
72322
|
+
<span>{{ t('christianityGalleryFilter') }}</span>
|
|
72323
|
+
<select [value]="galleryType()" (change)="setGalleryType($event)">
|
|
72324
|
+
@for (option of galleryTypeOptions(); track option.value) {
|
|
72325
|
+
<option [value]="option.value">{{ option.label }}</option>
|
|
72326
|
+
}
|
|
72327
|
+
</select>
|
|
72328
|
+
</label>
|
|
72329
|
+
</div>
|
|
72330
|
+
<div class="christianity-gallery-edition-strip">
|
|
72331
|
+
<button type="button" class="is-active" valLightRipple>
|
|
72332
|
+
<img [src]="galleryEditionIcon()" alt="" />
|
|
72333
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
72334
|
+
</button>
|
|
72335
|
+
</div>
|
|
72336
|
+
<div class="christianity-gallery-grid">
|
|
72337
|
+
@for (card of galleryCards(); track card.id) {
|
|
72338
|
+
<button type="button" class="christianity-gallery-card-button christianity-render-card-button" valLightRipple (click)="inspectGalleryCard(card.id)">
|
|
72339
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72340
|
+
</button>
|
|
72341
|
+
} @empty {
|
|
72342
|
+
<p>{{ t('christianityGalleryEmpty') }}</p>
|
|
72343
|
+
}
|
|
72344
|
+
</div>
|
|
72345
|
+
</section>
|
|
72346
|
+
}
|
|
72347
|
+
|
|
72348
|
+
@if (offeringsSeat()) {
|
|
72349
|
+
@let offeringPlayer = game().players[offeringsSeat()!];
|
|
72350
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
|
|
72351
|
+
<section class="christianity-history-drawer christianity-offerings-drawer">
|
|
72352
|
+
<header>
|
|
72353
|
+
<h2>{{ t('christianityOfferings') }}</h2>
|
|
72354
|
+
<div class="christianity-dialog-actions">
|
|
72355
|
+
<span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
|
|
72356
|
+
<button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
|
|
72357
|
+
{{ t('close') }}
|
|
72358
|
+
</button>
|
|
72359
|
+
</div>
|
|
72360
|
+
</header>
|
|
72361
|
+
<div class="christianity-offerings-note">
|
|
72362
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72363
|
+
<p>{{ t('christianityOfferingsRuleBody') }}</p>
|
|
72364
|
+
</div>
|
|
72365
|
+
<div class="christianity-offering-list">
|
|
72366
|
+
@for (offering of offeringPlayer.offerings; track offering.instanceId) {
|
|
72367
|
+
<article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
|
|
72368
|
+
<button type="button" class="christianity-offering-card christianity-render-card-button" valLightRipple (click)="inspectOffering(offering)">
|
|
72369
|
+
<val-christianity-card [card]="offeringRenderCard(offering)" variant="list"></val-christianity-card>
|
|
72370
|
+
</button>
|
|
72371
|
+
<div>
|
|
72372
|
+
<strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
|
|
72373
|
+
<p>{{ offeringAbilityText(offering) }}</p>
|
|
72374
|
+
@if (offering.abilityName) {
|
|
72375
|
+
<button
|
|
72376
|
+
type="button"
|
|
72377
|
+
[disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
|
|
72378
|
+
(click)="useOfferingAbility(offering, offeringsSeat()!)"
|
|
72379
|
+
>
|
|
72380
|
+
{{ t('christianityUseAbility') }}
|
|
72381
|
+
</button>
|
|
72382
|
+
}
|
|
72383
|
+
</div>
|
|
72384
|
+
</article>
|
|
72385
|
+
}
|
|
72386
|
+
</div>
|
|
72387
|
+
</section>
|
|
72388
|
+
}
|
|
72389
|
+
</main>
|
|
72390
|
+
`, isInline: true, styles: [":host{--christianity-theme-ink: var(--val-text-color, #1f2933);--christianity-theme-surface: #ffffff;--christianity-theme-parchment: #eff6ff;--christianity-theme-olive: #1d4ed8;--christianity-theme-gold: #2563eb;--christianity-theme-gold-soft: rgba(37, 99, 235, .16);--christianity-theme-gold-ring: rgba(37, 99, 235, .44);--christianity-theme-glow: rgba(37, 99, 235, .24);--christianity-theme-focus: #2563eb;--christianity-theme-shadow: rgba(37, 99, 235, .15);--christianity-theme-shadow-strong: rgba(37, 99, 235, .26);--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-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;min-width:0}.christianity-gallery-open{min-height:2.2rem;padding:0 .75rem;border:1px solid var(--christianity-theme-gold-ring);border-radius:999px;background:linear-gradient(180deg,#eff6fffa,#fffffffa),radial-gradient(circle at 20% 0%,var(--christianity-theme-gold-soft),transparent 42%);color:var(--christianity-theme-ink);font:inherit;font-size:.82rem;font-weight:800;box-shadow:0 .55rem 1.2rem #2563eb1a}.christianity-splash,.christianity-start{min-height:min(34rem,calc(100dvh - 8rem));border:1px solid rgba(37,99,235,.18);border-radius:.9rem;background:radial-gradient(circle at 50% 18%,rgba(37,99,235,.16),transparent 22rem),linear-gradient(180deg,#eff6ffed,#fffffff7),var(--christianity-card-back-soft);box-shadow:0 1.2rem 3.2rem #2563eb1f}.christianity-splash{display:grid;place-items:center;align-content:center;gap:1.2rem;padding:2.5rem 1.25rem;text-align:center}.christianity-splash__mark{position:relative;width:6.4rem;height:8.9rem;filter:drop-shadow(0 1rem 1.8rem rgba(82,64,28,.18))}.christianity-splash__mark i{position:absolute;inset:0;border:1px solid rgba(36,48,68,.16);border-radius:.7rem;background:radial-gradient(circle at 76% 12%,rgba(250,204,21,.9) 0 .42rem,transparent .45rem),linear-gradient(180deg,#fffffffa,#f8fafcfa)}.christianity-splash__mark i:nth-child(1){transform:translate(-1.1rem) rotate(-9deg)}.christianity-splash__mark i:nth-child(2){transform:translateY(-.32rem)}.christianity-splash__mark i:nth-child(3){transform:translate(1.1rem) rotate(9deg)}.christianity-splash__mark:after{content:\"\";position:absolute;inset:2.1rem 1.05rem 2.5rem;border-radius:.55rem;background:radial-gradient(circle at 50% 44%,rgba(245,199,85,.7),transparent 36%),linear-gradient(135deg,#5f6f2a33,#5f6f2a14)}.christianity-splash span,.christianity-start__copy span{color:var(--christianity-theme-olive);font-size:.76rem;font-weight:900;text-transform:uppercase}.christianity-splash h2,.christianity-start h2,.christianity-start p{margin:0}.christianity-splash h2{margin-top:.2rem;font-size:clamp(1.65rem,7vw,2.7rem);line-height:1}.christianity-splash p{max-width:26rem;margin:.55rem auto 0;color:#1f2933ad;font-size:.96rem}.christianity-start{display:grid;align-content:center;gap:1rem;padding:clamp(.85rem,2vw,1.35rem)}.christianity-start__hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,18rem);gap:1rem;align-items:center}.christianity-start__copy{display:grid;gap:.45rem;max-width:36rem}.christianity-start h2{font-size:clamp(1.6rem,6vw,2.5rem);line-height:1.02}.christianity-start__copy p,.christianity-start__cards p,.christianity-start__modes p{color:#1f2933ad;line-height:1.42}.christianity-start__fan{position:relative;display:grid;place-items:center;min-height:13rem;overflow:visible}.christianity-start__fan val-christianity-card{position:absolute;width:clamp(5.7rem,12vw,7.2rem);transform-origin:50% 92%;filter:drop-shadow(0 1rem 1.5rem rgba(82,64,28,.18))}.christianity-start__cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}.christianity-start__cards article,.christianity-start__modes article{display:grid;gap:.65rem;align-content:start;padding:.95rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#ffffffd1;box-shadow:0 .75rem 1.7rem #52401c14}.christianity-start__cards article{min-height:11rem}.christianity-start__cards strong{font-size:1.05rem}.christianity-start__status{display:flex;flex-wrap:wrap;gap:.45rem}.christianity-start__status span,.christianity-start__modes article>span{display:inline-flex;align-items:center;width:fit-content;min-height:1.85rem;padding:0 .62rem;border:1px solid rgba(37,99,235,.22);border-radius:999px;background:#eff6ffe0;color:#1f2933b8;font-size:.75rem;font-weight:850}.christianity-start__modes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.55rem}.christianity-start__modes article{min-height:8.5rem;background:#f8fafcb8;box-shadow:none;opacity:.82}.christianity-start__modes strong{font-size:.92rem}.christianity-start__modes p{margin:0;font-size:.8rem}.christianity-primary-action,.christianity-secondary-action{justify-self:start;min-height:2.5rem;padding:0 .9rem;border-radius:999px;font:inherit;font-weight:900}.christianity-primary-action{border:1px solid rgba(16,42,67,.16);background:#102a43;color:#fff}.christianity-secondary-action{border:1px solid var(--christianity-theme-gold-ring);background:var(--christianity-theme-parchment);color:var(--christianity-theme-ink)}.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-render-card-button{display:block;padding:0;overflow:visible;border:0;background:transparent;box-shadow:none}.christianity-render-card-button>val-christianity-card{display:block;width:100%;height:100%}.christianity-gallery-card-button{display:block;width:min(100%,6.8rem);min-width:0;aspect-ratio:var(--christianity-card-aspect);padding:0;overflow:visible;border:0;background:transparent;color:inherit;font:inherit;text-align:left;box-shadow:none}.christianity-gallery-card-button>val-christianity-card{display:block;width:100%;height:100%}.christianity-card-preview-card--hand.christianity-render-card-button,.christianity-card-preview-card--battle.christianity-render-card-button,.christianity-leader-card.christianity-render-card-button{aspect-ratio:var(--christianity-card-aspect)}.christianity-card-preview-card--hand.christianity-render-card-button:hover val-christianity-card,.christianity-card-preview-card--hand.christianity-render-card-button.is-selected val-christianity-card,.christianity-card-preview-card--battle.christianity-render-card-button.is-selected val-christianity-card,.christianity-card-preview-card--battle.christianity-render-card-button.is-target val-christianity-card,.christianity-leader-card.christianity-render-card-button.is-target val-christianity-card{filter:drop-shadow(0 0 .55rem rgba(214,162,29,.35))}.christianity-card-preview-card--battle.christianity-render-card-button.is-ready-attacker val-christianity-card{filter:drop-shadow(0 .45rem .8rem rgba(95,111,42,.16))}.christianity-card-preview-card--battle.christianity-render-card-button.is-selected{transform:translateY(-.28rem)}.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-header span.is-offering-pips,.christianity-full-card-cost.is-offering-pips,.christianity-offering-card span.is-offering-pips{grid-auto-flow:column;gap:.14rem;min-width:auto;padding:0 .28rem}.christianity-card-frame-header span.is-offering-pips i,.christianity-full-card-cost.is-offering-pips i,.christianity-offering-card span.is-offering-pips i,.christianity-full-card-pips i{display:block;width:.72rem;height:.72rem;border-radius:999px;background:radial-gradient(circle at 34% 28%,rgba(255,255,255,.9) 0 .12rem,transparent .13rem),#ffd91a;box-shadow:inset 0 -.08rem #52401c2e,0 .12rem .24rem #102a431a}.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);height:7.1rem;min-height:0;max-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>.cdk-drag-placeholder,.christianity-slot>.cdk-drag-placeholder{display:none}.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;grid-template-rows:minmax(0,auto) auto;gap:.55rem;width:min(17.5rem,calc(52dvh - 3rem),calc(100vw - 1.25rem));max-height:calc(100dvh - 1rem);padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-floating-card{position:relative;z-index:1;display:block;width:100%;min-height:0;padding:0;border:0;border-radius:.75rem;background:transparent;box-shadow:0 0 2.2rem var(--christianity-theme-glow);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-floating-card val-christianity-card{display:block;width:100%;min-height:0}.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-type-icon img{width:1rem;height:1rem;object-fit:contain}.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-stats .christianity-full-card-pips{display:inline-grid;grid-auto-flow:column;gap:.2rem;justify-self:start;padding:0;background:transparent}.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-preview-rule-note{position:relative;z-index:4;display:grid;grid-template-columns:auto minmax(0,1fr);gap:.65rem;align-items:start;padding:.75rem .85rem;border:1px solid rgba(36,48,68,.14);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 8% 0%,rgba(37,99,235,.08),transparent 44%);box-shadow:0 .75rem 1.6rem #102a431f}.christianity-preview-rule-note small,.christianity-preview-rule-note strong,.christianity-preview-rule-note p{margin:0}.christianity-preview-rule-note small{color:#1f293394;font-size:.68rem;font-weight:800;text-transform:uppercase}.christianity-preview-rule-note strong{display:block;margin-top:.08rem;font-size:.92rem;line-height:1.1}.christianity-preview-rule-note p{margin-top:.22rem;color:#1f2933bd;font-size:.82rem;line-height:1.32}@media (min-width: 52rem){.christianity-floating-card-shell{width:min(22rem,calc(67dvh - 5.85rem),calc(100vw - 3rem))}.christianity-floating-card{min-height:0;padding:0}}@media (max-width: 51.99rem){.christianity-floating-card-shell{top:48%;gap:.45rem;max-height:calc(100dvh - 1.5rem);padding-top:2.15rem}.christianity-floating-card-close{min-height:1.9rem;padding:0 .58rem;font-size:.72rem}.christianity-preview-rule-note{max-height:min(8.25rem,24dvh);padding:.62rem .68rem;overflow-y:auto;scrollbar-color:rgba(36,48,68,.28) transparent;scrollbar-gutter:stable}.christianity-preview-rule-note .christianity-rule-note-icon{width:1.8rem;height:1.8rem;font-size:.9rem}.christianity-preview-rule-note strong{font-size:.86rem}.christianity-preview-rule-note p{font-size:.78rem;line-height:1.28}}.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-gallery-drawer{grid-template-rows:auto auto auto minmax(0,1fr);width:min(calc(100vw - 1rem),50rem);min-height:min(22rem,calc(100dvh - 1rem));max-height:min(36rem,calc(100dvh - 2rem))}.christianity-gallery-drawer header>div:first-child{display:grid;gap:.15rem;min-width:0}.christianity-gallery-drawer header p{color:#1f293394;font-size:.82rem}.christianity-gallery-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(8.5rem,13rem);gap:.65rem}.christianity-gallery-controls label{display:grid;gap:.25rem;min-width:0;color:#1f29339e;font-size:.74rem;font-weight:800}.christianity-gallery-controls input,.christianity-gallery-controls select{width:100%;min-width:0;min-height:2.35rem;padding:0 .75rem;border:1px solid rgba(36,48,68,.16);border-radius:.65rem;background:#fff;color:var(--christianity-theme-ink);font:inherit;font-size:.9rem}.christianity-gallery-edition-strip{display:flex;gap:.45rem;overflow-x:auto;padding-bottom:.1rem}.christianity-gallery-edition-strip button{display:inline-flex;align-items:center;gap:.45rem;min-height:2.35rem;padding:0 .75rem;border:1px solid rgba(214,162,29,.38);border-radius:999px;background:var(--christianity-theme-parchment);color:var(--christianity-theme-ink);font:inherit;font-size:.82rem;font-weight:800}.christianity-gallery-edition-strip img{width:1.2rem;height:1.2rem;object-fit:contain}.christianity-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.8rem,6.8rem));justify-content:center;align-content:start;gap:.65rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem .1rem .35rem}.christianity-gallery-grid::-webkit-scrollbar{width:.65rem}.christianity-gallery-grid::-webkit-scrollbar-track{border-radius:999px;background:#e2e8f0b8}.christianity-gallery-grid::-webkit-scrollbar-thumb{border:.14rem solid rgba(226,232,240,.72);border-radius:999px;background:#24304452}.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}.christianity-history-grid .christianity-render-card-button{justify-self:center;width:min(100%,6.4rem)}.christianity-gallery-grid .christianity-render-card-button{justify-self:center;width:min(100%,7rem)}.christianity-offering-card.christianity-render-card-button{width:min(100%,5.8rem);min-height:0;padding:0;border:0;background:transparent;box-shadow:none}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}:host-context(.dark),:host-context(.ion-palette-dark),:host-context(html.ion-palette-dark),:host-context(body.dark),:host-context([data-theme=\"dark\"]){--christianity-theme-ink: var(--ion-text-color, #e5edf8);--christianity-theme-surface: #111827;--christianity-theme-parchment: #13223a;--christianity-theme-olive: #93c5fd;--christianity-theme-gold: #60a5fa;--christianity-theme-gold-soft: rgba(96, 165, 250, .18);--christianity-theme-gold-ring: rgba(147, 197, 253, .42);--christianity-theme-glow: rgba(96, 165, 250, .24);--christianity-theme-focus: #93c5fd;--christianity-theme-shadow: rgba(0, 0, 0, .34);--christianity-theme-shadow-strong: rgba(0, 0, 0, .48);--christianity-card-back: linear-gradient(135deg, rgba(147, 197, 253, .2), rgba(15, 23, 42, .08)), repeating-linear-gradient(45deg, #1e3a5f 0 .33rem, #0f172a .33rem .66rem);--christianity-card-back-soft: linear-gradient(135deg, rgba(147, 197, 253, .15), rgba(15, 23, 42, .06)), repeating-linear-gradient(45deg, #1e3a5f 0 .33rem, #0f172a .33rem .66rem);color-scheme:dark}:host-context(.dark) .christianity-shell,:host-context(.ion-palette-dark) .christianity-shell,:host-context(html.ion-palette-dark) .christianity-shell,:host-context(body.dark) .christianity-shell,:host-context([data-theme=\"dark\"]) .christianity-shell{border-color:#94a3b82e;background:#07111f}:host-context(.dark) .christianity-gallery-open,:host-context(.ion-palette-dark) .christianity-gallery-open,:host-context(html.ion-palette-dark) .christianity-gallery-open,:host-context(body.dark) .christianity-gallery-open,:host-context([data-theme=\"dark\"]) .christianity-gallery-open,:host-context(.dark) .christianity-secondary-action,:host-context(.ion-palette-dark) .christianity-secondary-action,:host-context(html.ion-palette-dark) .christianity-secondary-action,:host-context(body.dark) .christianity-secondary-action,:host-context([data-theme=\"dark\"]) .christianity-secondary-action,:host-context(.dark) .christianity-gallery-edition-strip button,:host-context(.ion-palette-dark) .christianity-gallery-edition-strip button,:host-context(html.ion-palette-dark) .christianity-gallery-edition-strip button,:host-context(body.dark) .christianity-gallery-edition-strip button,:host-context([data-theme=\"dark\"]) .christianity-gallery-edition-strip button{border-color:#93c5fd5c;background:linear-gradient(180deg,#1e3a5fd1,#0f172ae0),radial-gradient(circle at 20% 0%,rgba(96,165,250,.16),transparent 42%);color:var(--christianity-theme-ink);box-shadow:0 .55rem 1.2rem #0000003d}:host-context(.dark) .christianity-splash,:host-context(.ion-palette-dark) .christianity-splash,:host-context(html.ion-palette-dark) .christianity-splash,:host-context(body.dark) .christianity-splash,:host-context([data-theme=\"dark\"]) .christianity-splash,:host-context(.dark) .christianity-start,:host-context(.ion-palette-dark) .christianity-start,:host-context(html.ion-palette-dark) .christianity-start,:host-context(body.dark) .christianity-start,:host-context([data-theme=\"dark\"]) .christianity-start{border-color:#93c5fd38;background:radial-gradient(circle at 50% 18%,rgba(96,165,250,.16),transparent 22rem),linear-gradient(180deg,#0f172ae0,#07111ff7),var(--christianity-card-back-soft);box-shadow:0 1.2rem 3.2rem #00000047}:host-context(.dark) .christianity-start__cards article,:host-context(.ion-palette-dark) .christianity-start__cards article,:host-context(html.ion-palette-dark) .christianity-start__cards article,:host-context(body.dark) .christianity-start__cards article,:host-context([data-theme=\"dark\"]) .christianity-start__cards article,:host-context(.dark) .christianity-start__modes article,:host-context(.ion-palette-dark) .christianity-start__modes article,:host-context(html.ion-palette-dark) .christianity-start__modes article,:host-context(body.dark) .christianity-start__modes article,:host-context([data-theme=\"dark\"]) .christianity-start__modes article,:host-context(.dark) .christianity-start__status span,:host-context(.ion-palette-dark) .christianity-start__status span,:host-context(html.ion-palette-dark) .christianity-start__status span,:host-context(body.dark) .christianity-start__status span,:host-context([data-theme=\"dark\"]) .christianity-start__status span,:host-context(.dark) .christianity-start__modes article>span,:host-context(.ion-palette-dark) .christianity-start__modes article>span,:host-context(html.ion-palette-dark) .christianity-start__modes article>span,:host-context(body.dark) .christianity-start__modes article>span,:host-context([data-theme=\"dark\"]) .christianity-start__modes article>span{border-color:#94a3b833;background:#0f172aad;box-shadow:0 .75rem 1.7rem #00000038}:host-context(.dark) .christianity-splash p,:host-context(.ion-palette-dark) .christianity-splash p,:host-context(html.ion-palette-dark) .christianity-splash p,:host-context(body.dark) .christianity-splash p,:host-context([data-theme=\"dark\"]) .christianity-splash p,:host-context(.dark) .christianity-start__copy p,:host-context(.ion-palette-dark) .christianity-start__copy p,:host-context(html.ion-palette-dark) .christianity-start__copy p,:host-context(body.dark) .christianity-start__copy p,:host-context([data-theme=\"dark\"]) .christianity-start__copy p,:host-context(.dark) .christianity-start__cards p,:host-context(.ion-palette-dark) .christianity-start__cards p,:host-context(html.ion-palette-dark) .christianity-start__cards p,:host-context(body.dark) .christianity-start__cards p,:host-context([data-theme=\"dark\"]) .christianity-start__cards p,:host-context(.dark) .christianity-start__modes p,:host-context(.ion-palette-dark) .christianity-start__modes p,:host-context(html.ion-palette-dark) .christianity-start__modes p,:host-context(body.dark) .christianity-start__modes p,:host-context([data-theme=\"dark\"]) .christianity-start__modes p,:host-context(.dark) .christianity-header p,:host-context(.ion-palette-dark) .christianity-header p,:host-context(html.ion-palette-dark) .christianity-header p,:host-context(body.dark) .christianity-header p,:host-context([data-theme=\"dark\"]) .christianity-header p,:host-context(.dark) .christianity-match-player small,:host-context(.ion-palette-dark) .christianity-match-player small,:host-context(html.ion-palette-dark) .christianity-match-player small,:host-context(body.dark) .christianity-match-player small,:host-context([data-theme=\"dark\"]) .christianity-match-player small,:host-context(.dark) .christianity-scoreboard span,:host-context(.ion-palette-dark) .christianity-scoreboard span,:host-context(html.ion-palette-dark) .christianity-scoreboard span,:host-context(body.dark) .christianity-scoreboard span,:host-context([data-theme=\"dark\"]) .christianity-scoreboard span{color:#e2e8f0bd}:host-context(.dark) .christianity-turn,:host-context(.ion-palette-dark) .christianity-turn,:host-context(html.ion-palette-dark) .christianity-turn,:host-context(body.dark) .christianity-turn,:host-context([data-theme=\"dark\"]) .christianity-turn,:host-context(.dark) .christianity-leader,:host-context(.ion-palette-dark) .christianity-leader,:host-context(html.ion-palette-dark) .christianity-leader,:host-context(body.dark) .christianity-leader,:host-context([data-theme=\"dark\"]) .christianity-leader,:host-context(.dark) .christianity-offerings,:host-context(.ion-palette-dark) .christianity-offerings,:host-context(html.ion-palette-dark) .christianity-offerings,:host-context(body.dark) .christianity-offerings,:host-context([data-theme=\"dark\"]) .christianity-offerings,:host-context(.dark) .christianity-hidden-hand,:host-context(.ion-palette-dark) .christianity-hidden-hand,:host-context(html.ion-palette-dark) .christianity-hidden-hand,:host-context(body.dark) .christianity-hidden-hand,:host-context([data-theme=\"dark\"]) .christianity-hidden-hand,:host-context(.dark) .christianity-pile,:host-context(.ion-palette-dark) .christianity-pile,:host-context(html.ion-palette-dark) .christianity-pile,:host-context(body.dark) .christianity-pile,:host-context([data-theme=\"dark\"]) .christianity-pile,:host-context(.dark) .christianity-deck,:host-context(.ion-palette-dark) .christianity-deck,:host-context(html.ion-palette-dark) .christianity-deck,:host-context(body.dark) .christianity-deck,:host-context([data-theme=\"dark\"]) .christianity-deck,:host-context(.dark) .christianity-place,:host-context(.ion-palette-dark) .christianity-place,:host-context(html.ion-palette-dark) .christianity-place,:host-context(body.dark) .christianity-place,:host-context([data-theme=\"dark\"]) .christianity-place,:host-context(.dark) .christianity-match-strip,:host-context(.ion-palette-dark) .christianity-match-strip,:host-context(html.ion-palette-dark) .christianity-match-strip,:host-context(body.dark) .christianity-match-strip,:host-context([data-theme=\"dark\"]) .christianity-match-strip,:host-context(.dark) .christianity-actions,:host-context(.ion-palette-dark) .christianity-actions,:host-context(html.ion-palette-dark) .christianity-actions,:host-context(body.dark) .christianity-actions,:host-context([data-theme=\"dark\"]) .christianity-actions,:host-context(.dark) .christianity-history,:host-context(.ion-palette-dark) .christianity-history,:host-context(html.ion-palette-dark) .christianity-history,:host-context(body.dark) .christianity-history,:host-context([data-theme=\"dark\"]) .christianity-history{border-color:#94a3b82e;background:#0f172ad1}:host-context(.dark) .christianity-turn.is-own-turn,:host-context(.ion-palette-dark) .christianity-turn.is-own-turn,:host-context(html.ion-palette-dark) .christianity-turn.is-own-turn,:host-context(body.dark) .christianity-turn.is-own-turn,:host-context([data-theme=\"dark\"]) .christianity-turn.is-own-turn{border-color:#2dd4bf5c;background:#14534c5c}:host-context(.dark) .christianity-table,:host-context(.ion-palette-dark) .christianity-table,:host-context(html.ion-palette-dark) .christianity-table,:host-context(body.dark) .christianity-table,:host-context([data-theme=\"dark\"]) .christianity-table{background:linear-gradient(180deg,#10233d,#0b1728)}:host-context(.dark) .christianity-player-side,:host-context(.ion-palette-dark) .christianity-player-side,:host-context(html.ion-palette-dark) .christianity-player-side,:host-context(body.dark) .christianity-player-side,:host-context([data-theme=\"dark\"]) .christianity-player-side{background:#0f172a57}:host-context(.dark) .christianity-battle-zone,:host-context(.ion-palette-dark) .christianity-battle-zone,:host-context(html.ion-palette-dark) .christianity-battle-zone,:host-context(body.dark) .christianity-battle-zone,:host-context([data-theme=\"dark\"]) .christianity-battle-zone,:host-context(.dark) .christianity-shared-zone,:host-context(.ion-palette-dark) .christianity-shared-zone,:host-context(html.ion-palette-dark) .christianity-shared-zone,:host-context(body.dark) .christianity-shared-zone,:host-context([data-theme=\"dark\"]) .christianity-shared-zone{background:#0f172a94}:host-context(.dark) .christianity-battle-zone.is-placing-card,:host-context(.ion-palette-dark) .christianity-battle-zone.is-placing-card,:host-context(html.ion-palette-dark) .christianity-battle-zone.is-placing-card,:host-context(body.dark) .christianity-battle-zone.is-placing-card,:host-context([data-theme=\"dark\"]) .christianity-battle-zone.is-placing-card{background:linear-gradient(180deg,#1e3a5fd1,#0f172ab8),#0f172a94}:host-context(.dark) .christianity-card,:host-context(.ion-palette-dark) .christianity-card,:host-context(html.ion-palette-dark) .christianity-card,:host-context(body.dark) .christianity-card,:host-context([data-theme=\"dark\"]) .christianity-card,:host-context(.dark) .christianity-slot,:host-context(.ion-palette-dark) .christianity-slot,:host-context(html.ion-palette-dark) .christianity-slot,:host-context(body.dark) .christianity-slot,:host-context([data-theme=\"dark\"]) .christianity-slot{border-color:#94a3b83d;background:#0f172a8a}:host-context(.dark) .christianity-slot--play-target,:host-context(.ion-palette-dark) .christianity-slot--play-target,:host-context(html.ion-palette-dark) .christianity-slot--play-target,:host-context(body.dark) .christianity-slot--play-target,:host-context([data-theme=\"dark\"]) .christianity-slot--play-target{color:var(--christianity-theme-ink);background:linear-gradient(180deg,#2563eb3d,#0f172ac7),#0f172abd}:host-context(.dark) .christianity-slot--play-target span,:host-context(.ion-palette-dark) .christianity-slot--play-target span,:host-context(html.ion-palette-dark) .christianity-slot--play-target span,:host-context(body.dark) .christianity-slot--play-target span,:host-context([data-theme=\"dark\"]) .christianity-slot--play-target span,:host-context(.dark) .christianity-card strong,:host-context(.ion-palette-dark) .christianity-card strong,:host-context(html.ion-palette-dark) .christianity-card strong,:host-context(body.dark) .christianity-card strong,:host-context([data-theme=\"dark\"]) .christianity-card strong{background:#1e293beb}:host-context(.dark) .christianity-history-drawer,:host-context(.ion-palette-dark) .christianity-history-drawer,:host-context(html.ion-palette-dark) .christianity-history-drawer,:host-context(body.dark) .christianity-history-drawer,:host-context([data-theme=\"dark\"]) .christianity-history-drawer,:host-context(.dark) .christianity-rule-note,:host-context(.ion-palette-dark) .christianity-rule-note,:host-context(html.ion-palette-dark) .christianity-rule-note,:host-context(body.dark) .christianity-rule-note,:host-context([data-theme=\"dark\"]) .christianity-rule-note,:host-context(.dark) .christianity-preview-rule-note,:host-context(.ion-palette-dark) .christianity-preview-rule-note,:host-context(html.ion-palette-dark) .christianity-preview-rule-note,:host-context(body.dark) .christianity-preview-rule-note,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note{border-color:#94a3b82e;background:linear-gradient(180deg,#0f172af5,#111827f5),radial-gradient(circle at 8% 0%,rgba(96,165,250,.12),transparent 40%);box-shadow:0 1.5rem 4rem #0000006b}:host-context(.dark) .christianity-dialog-close,:host-context(.ion-palette-dark) .christianity-dialog-close,:host-context(html.ion-palette-dark) .christianity-dialog-close,:host-context(body.dark) .christianity-dialog-close,:host-context([data-theme=\"dark\"]) .christianity-dialog-close,:host-context(.dark) .christianity-floating-card-close,:host-context(.ion-palette-dark) .christianity-floating-card-close,:host-context(html.ion-palette-dark) .christianity-floating-card-close,:host-context(body.dark) .christianity-floating-card-close,:host-context([data-theme=\"dark\"]) .christianity-floating-card-close{border-color:#94a3b838;background:#0f172af0;color:var(--christianity-theme-ink);box-shadow:0 .35rem .8rem #0000004d}:host-context(.dark) .christianity-history-drawer header span,:host-context(.ion-palette-dark) .christianity-history-drawer header span,:host-context(html.ion-palette-dark) .christianity-history-drawer header span,:host-context(body.dark) .christianity-history-drawer header span,:host-context([data-theme=\"dark\"]) .christianity-history-drawer header span,:host-context(.dark) .christianity-rule-note strong,:host-context(.ion-palette-dark) .christianity-rule-note strong,:host-context(html.ion-palette-dark) .christianity-rule-note strong,:host-context(body.dark) .christianity-rule-note strong,:host-context([data-theme=\"dark\"]) .christianity-rule-note strong{background:#1e293beb}:host-context(.dark) .christianity-rule-note small,:host-context(.ion-palette-dark) .christianity-rule-note small,:host-context(html.ion-palette-dark) .christianity-rule-note small,:host-context(body.dark) .christianity-rule-note small,:host-context([data-theme=\"dark\"]) .christianity-rule-note small,:host-context(.dark) .christianity-preview-rule-note small,:host-context(.ion-palette-dark) .christianity-preview-rule-note small,:host-context(html.ion-palette-dark) .christianity-preview-rule-note small,:host-context(body.dark) .christianity-preview-rule-note small,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note small,:host-context(.dark) .christianity-gallery-drawer header p,:host-context(.ion-palette-dark) .christianity-gallery-drawer header p,:host-context(html.ion-palette-dark) .christianity-gallery-drawer header p,:host-context(body.dark) .christianity-gallery-drawer header p,:host-context([data-theme=\"dark\"]) .christianity-gallery-drawer header p,:host-context(.dark) .christianity-gallery-controls label,:host-context(.ion-palette-dark) .christianity-gallery-controls label,:host-context(html.ion-palette-dark) .christianity-gallery-controls label,:host-context(body.dark) .christianity-gallery-controls label,:host-context([data-theme=\"dark\"]) .christianity-gallery-controls label{color:#e2e8f0ad}:host-context(.dark) .christianity-rule-note p,:host-context(.ion-palette-dark) .christianity-rule-note p,:host-context(html.ion-palette-dark) .christianity-rule-note p,:host-context(body.dark) .christianity-rule-note p,:host-context([data-theme=\"dark\"]) .christianity-rule-note p,:host-context(.dark) .christianity-rule-note ul,:host-context(.ion-palette-dark) .christianity-rule-note ul,:host-context(html.ion-palette-dark) .christianity-rule-note ul,:host-context(body.dark) .christianity-rule-note ul,:host-context([data-theme=\"dark\"]) .christianity-rule-note ul,:host-context(.dark) .christianity-preview-rule-note p,:host-context(.ion-palette-dark) .christianity-preview-rule-note p,:host-context(html.ion-palette-dark) .christianity-preview-rule-note p,:host-context(body.dark) .christianity-preview-rule-note p,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note p,:host-context(.dark) .christianity-offerings-note p,:host-context(.ion-palette-dark) .christianity-offerings-note p,:host-context(html.ion-palette-dark) .christianity-offerings-note p,:host-context(body.dark) .christianity-offerings-note p,:host-context([data-theme=\"dark\"]) .christianity-offerings-note p{color:#e2e8f0cc}:host-context(.dark) .christianity-gallery-controls input,:host-context(.ion-palette-dark) .christianity-gallery-controls input,:host-context(html.ion-palette-dark) .christianity-gallery-controls input,:host-context(body.dark) .christianity-gallery-controls input,:host-context([data-theme=\"dark\"]) .christianity-gallery-controls input,:host-context(.dark) .christianity-gallery-controls select,:host-context(.ion-palette-dark) .christianity-gallery-controls select,:host-context(html.ion-palette-dark) .christianity-gallery-controls select,:host-context(body.dark) .christianity-gallery-controls select,:host-context([data-theme=\"dark\"]) .christianity-gallery-controls select,:host-context(.dark) .christianity-offering-row,:host-context(.ion-palette-dark) .christianity-offering-row,:host-context(html.ion-palette-dark) .christianity-offering-row,:host-context(body.dark) .christianity-offering-row,:host-context([data-theme=\"dark\"]) .christianity-offering-row,:host-context(.dark) .christianity-offerings-note,:host-context(.ion-palette-dark) .christianity-offerings-note,:host-context(html.ion-palette-dark) .christianity-offerings-note,:host-context(body.dark) .christianity-offerings-note,:host-context([data-theme=\"dark\"]) .christianity-offerings-note{border-color:#94a3b833;background:#0f172ac7;color:var(--christianity-theme-ink)}:host-context(.dark) .christianity-history-grid,:host-context(.ion-palette-dark) .christianity-history-grid,:host-context(html.ion-palette-dark) .christianity-history-grid,:host-context(body.dark) .christianity-history-grid,:host-context([data-theme=\"dark\"]) .christianity-history-grid,:host-context(.dark) .christianity-offering-list,:host-context(.ion-palette-dark) .christianity-offering-list,:host-context(html.ion-palette-dark) .christianity-offering-list,:host-context(body.dark) .christianity-offering-list,:host-context([data-theme=\"dark\"]) .christianity-offering-list,:host-context(.dark) .christianity-gallery-grid,:host-context(.ion-palette-dark) .christianity-gallery-grid,:host-context(html.ion-palette-dark) .christianity-gallery-grid,:host-context(body.dark) .christianity-gallery-grid,:host-context([data-theme=\"dark\"]) .christianity-gallery-grid,:host-context(.dark) .christianity-preview-rule-note,:host-context(.ion-palette-dark) .christianity-preview-rule-note,:host-context(html.ion-palette-dark) .christianity-preview-rule-note,:host-context(body.dark) .christianity-preview-rule-note,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note{scrollbar-color:rgba(148,163,184,.54) rgba(15,23,42,.86)}:host-context(.dark) .christianity-rule-note-icon,:host-context(.ion-palette-dark) .christianity-rule-note-icon,:host-context(html.ion-palette-dark) .christianity-rule-note-icon,:host-context(body.dark) .christianity-rule-note-icon,:host-context([data-theme=\"dark\"]) .christianity-rule-note-icon{background:#60a5fa29;color:#bfdbfe;box-shadow:inset 0 0 0 1px #93c5fd38}:host-context(.dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context(.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context(html.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context(body.dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context([data-theme=\"dark\"]) .christianity-history-grid::-webkit-scrollbar-track,:host-context(.dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context(.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context(html.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context(body.dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context([data-theme=\"dark\"]) .christianity-offering-list::-webkit-scrollbar-track,:host-context(.dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context(.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context(html.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context(body.dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context([data-theme=\"dark\"]) .christianity-gallery-grid::-webkit-scrollbar-track{background:#0f172adb}:host-context(.dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(html.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(body.dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context([data-theme=\"dark\"]) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(.dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(html.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(body.dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context([data-theme=\"dark\"]) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(.dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context(.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context(html.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context(body.dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context([data-theme=\"dark\"]) .christianity-gallery-grid::-webkit-scrollbar-thumb{border-color:#0f172adb;background:#94a3b88a}@media (max-width: 720px){:host{overflow-x:hidden}.christianity-shell{padding:.55rem 0 .65rem;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-match-strip,.christianity-actions{box-sizing:border-box;width:100%;padding-right:max(.5rem,env(safe-area-inset-right));padding-left:max(.5rem,env(safe-area-inset-left))}.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-header-actions{align-items:flex-end;flex-direction:column}.christianity-start__cards,.christianity-start__hero{grid-template-columns:minmax(0,1fr)}.christianity-start__fan{min-height:10.5rem}.christianity-start__fan val-christianity-card{width:clamp(5.2rem,22vw,6.4rem)}.christianity-start__modes{grid-template-columns:repeat(2,minmax(0,1fr))}.christianity-splash,.christianity-start{min-height:min(30rem,calc(100dvh - 7rem));padding-right:max(.65rem,env(safe-area-inset-right));padding-left:max(.65rem,env(safe-area-inset-left));border-right:0;border-left:0;border-radius:0}.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{height:6.85rem;min-height:0;max-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-gallery-controls{grid-template-columns:minmax(0,1fr)}.christianity-gallery-grid{grid-template-columns:repeat(auto-fill,minmax(5.35rem,6.1rem));justify-content:center}.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]" }, { kind: "component", type: ChristianityCardComponent, selector: "val-christianity-card", inputs: ["card", "variant"] }] }); }
|
|
72391
|
+
}
|
|
72392
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, decorators: [{
|
|
72393
|
+
type: Component,
|
|
72394
|
+
args: [{ selector: 'val-christianity-game', standalone: true, imports: [CdkDrag, CdkDropList, LightRippleDirective, ChristianityCardComponent], template: `
|
|
72395
|
+
<main class="christianity-shell">
|
|
72396
|
+
<section class="christianity-header">
|
|
72397
|
+
<div>
|
|
72398
|
+
<p>{{ t('christianityEyebrow') }}</p>
|
|
72399
|
+
<h1>{{ t('christianityTitle') }}</h1>
|
|
72400
|
+
</div>
|
|
72401
|
+
<div class="christianity-header-actions">
|
|
72402
|
+
@if (screen() !== 'splash') {
|
|
72403
|
+
<button type="button" class="christianity-gallery-open" valLightRipple (click)="openGallery()">
|
|
72404
|
+
{{ t('christianityGallery') }}
|
|
72405
|
+
</button>
|
|
72406
|
+
}
|
|
72407
|
+
@if (screen() === 'table') {
|
|
72408
|
+
<div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
|
|
72409
|
+
<span>{{ t('christianityTurn') }}</span>
|
|
72410
|
+
<strong>{{ currentPlayer().displayName }}</strong>
|
|
72411
|
+
</div>
|
|
72412
|
+
}
|
|
72413
|
+
</div>
|
|
72414
|
+
</section>
|
|
72415
|
+
|
|
72416
|
+
@if (screen() === 'splash') {
|
|
72417
|
+
<section class="christianity-splash" role="status" aria-live="polite">
|
|
72418
|
+
<div class="christianity-splash__mark">
|
|
72419
|
+
<i aria-hidden="true"></i>
|
|
72420
|
+
<i aria-hidden="true"></i>
|
|
72421
|
+
<i aria-hidden="true"></i>
|
|
72422
|
+
</div>
|
|
72423
|
+
<div>
|
|
72424
|
+
<span>{{ t('christianitySplashEyebrow') }}</span>
|
|
72425
|
+
<h2>{{ t('christianitySplashTitle') }}</h2>
|
|
72426
|
+
<p>{{ splashStatusText() }}</p>
|
|
72427
|
+
</div>
|
|
72428
|
+
</section>
|
|
72429
|
+
} @else if (screen() === 'home') {
|
|
72430
|
+
<section class="christianity-start">
|
|
72431
|
+
<div class="christianity-start__hero">
|
|
72432
|
+
<div class="christianity-start__copy">
|
|
72433
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
72434
|
+
<h2>{{ t('christianityStartTitle') }}</h2>
|
|
72435
|
+
<p>{{ t('christianityStartBody') }}</p>
|
|
72436
|
+
</div>
|
|
72437
|
+
<div class="christianity-start__fan" aria-hidden="true">
|
|
72438
|
+
@for (card of startFeaturedCards(); track card.id) {
|
|
72439
|
+
<val-christianity-card
|
|
72440
|
+
[card]="definitionToRenderCard(card)"
|
|
72441
|
+
variant="hand"
|
|
72442
|
+
[style.transform]="startFeaturedCardTransform($index)"
|
|
72443
|
+
></val-christianity-card>
|
|
72444
|
+
}
|
|
72445
|
+
</div>
|
|
72446
|
+
</div>
|
|
72447
|
+
<div class="christianity-start__cards">
|
|
72448
|
+
<article>
|
|
72449
|
+
<strong>{{ t('christianityTutorialMode') }}</strong>
|
|
72450
|
+
<p>{{ t('christianityTutorialModeBody') }}</p>
|
|
72451
|
+
<button type="button" class="christianity-primary-action" valLightRipple (click)="startTutorial()">
|
|
72452
|
+
{{ t('christianityStartTutorial') }}
|
|
72453
|
+
</button>
|
|
72454
|
+
</article>
|
|
72455
|
+
<article>
|
|
72456
|
+
<strong>{{ t('christianityGallery') }}</strong>
|
|
72457
|
+
<p>{{ t('christianityGalleryModeBody') }}</p>
|
|
72458
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="openGallery()">
|
|
72459
|
+
{{ t('christianityOpenGallery') }}
|
|
72460
|
+
</button>
|
|
72461
|
+
</article>
|
|
72462
|
+
<article>
|
|
72463
|
+
<strong>{{ t('christianityHowToPlay') }}</strong>
|
|
72464
|
+
<p>{{ t('christianityHowToPlayBody') }}</p>
|
|
72465
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="inspectHowToPlay()">
|
|
72466
|
+
{{ t('learnMore') }}
|
|
72467
|
+
</button>
|
|
72468
|
+
</article>
|
|
72469
|
+
</div>
|
|
72470
|
+
<div class="christianity-start__status" [attr.aria-label]="t('christianityEditionStatus')">
|
|
72471
|
+
<span>{{ galleryEditionLabel() }}</span>
|
|
72472
|
+
<span>{{ t('christianityTutorialActive') }}</span>
|
|
72473
|
+
<span>{{ catalogStatusLabel() }}</span>
|
|
72474
|
+
</div>
|
|
72475
|
+
<section class="christianity-start__modes" [attr.aria-label]="t('christianityFutureModes')">
|
|
72476
|
+
@for (mode of futureModes(); track mode.title) {
|
|
72477
|
+
<article>
|
|
72478
|
+
<strong>{{ mode.title }}</strong>
|
|
72479
|
+
<p>{{ mode.body }}</p>
|
|
72480
|
+
<span>{{ t('soonTitle') }}</span>
|
|
72481
|
+
</article>
|
|
72482
|
+
}
|
|
72483
|
+
</section>
|
|
72484
|
+
</section>
|
|
72485
|
+
} @else {
|
|
72486
|
+
<section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
|
|
72487
|
+
<article class="christianity-match-player">
|
|
72488
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
72489
|
+
<div>
|
|
72490
|
+
<strong>{{ player().displayName }}</strong>
|
|
72491
|
+
<small>{{ playerLeaderDisplayName(player()) }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
|
|
72492
|
+
</div>
|
|
72493
|
+
</article>
|
|
72494
|
+
<div class="christianity-scoreboard">
|
|
72495
|
+
<span>{{ t('christianityMatch') }}</span>
|
|
72496
|
+
<strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
|
|
72497
|
+
</div>
|
|
72498
|
+
<article class="christianity-match-player christianity-match-player--opponent">
|
|
72499
|
+
<span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
|
|
72500
|
+
<div>
|
|
72501
|
+
<strong>{{ opponent().displayName }}</strong>
|
|
72502
|
+
<small>{{ playerLeaderDisplayName(opponent()) }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
|
|
72503
|
+
</div>
|
|
72504
|
+
</article>
|
|
72505
|
+
</section>
|
|
72506
|
+
|
|
72507
|
+
<section class="christianity-hand-shelf christianity-hand-shelf--opponent">
|
|
72508
|
+
<div class="christianity-hand-meter christianity-hand-meter--opponent">
|
|
72509
|
+
<span>{{ t('christianityHand') }}</span>
|
|
72510
|
+
<strong>{{ opponentHandCount() }}</strong>
|
|
72511
|
+
</div>
|
|
72512
|
+
<section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
|
|
72513
|
+
@for (_ of hiddenHandCards(opponentHandCount()); track $index) {
|
|
72514
|
+
<button
|
|
72515
|
+
type="button"
|
|
72516
|
+
class="christianity-card-preview-card christianity-card-frame christianity-card-frame--back"
|
|
72517
|
+
valLightRipple
|
|
72518
|
+
[style.transform]="fanTransform($index, opponentHandCount(), true)"
|
|
72519
|
+
[attr.aria-label]="t('christianityHiddenCard')"
|
|
72520
|
+
></button>
|
|
72521
|
+
}
|
|
72522
|
+
</section>
|
|
72523
|
+
</section>
|
|
72524
|
+
|
|
72525
|
+
<section class="christianity-table" [attr.aria-label]="t('christianityTable')">
|
|
72526
|
+
<section class="christianity-player-side christianity-player-side--opponent">
|
|
72527
|
+
<section class="christianity-player-rack christianity-player-rack--opponent">
|
|
72528
|
+
<div class="christianity-offerings-zone">
|
|
72529
|
+
<button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
|
|
72530
|
+
<i aria-hidden="true"></i>
|
|
72531
|
+
<i aria-hidden="true"></i>
|
|
72532
|
+
<i aria-hidden="true"></i>
|
|
72533
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
72534
|
+
<strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
|
|
72535
|
+
</button>
|
|
72536
|
+
</div>
|
|
72537
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
|
|
72538
|
+
<val-christianity-card [card]="leaderRenderCard(opponent())" variant="table"></val-christianity-card>
|
|
72539
|
+
</button>
|
|
72540
|
+
<span class="christianity-rack-spacer" aria-hidden="true"></span>
|
|
72541
|
+
</section>
|
|
72542
|
+
|
|
72543
|
+
<section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
|
|
72544
|
+
@for (slot of battleSlots('P2'); track slot.trackId) {
|
|
72545
|
+
@if (slot.card) {
|
|
72546
|
+
<button
|
|
72547
|
+
type="button"
|
|
72548
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
72549
|
+
valLightRipple
|
|
72550
|
+
[class.is-target]="selectedAttacker()"
|
|
72551
|
+
(click)="handleOpponentCharacter(slot.card)"
|
|
72552
|
+
>
|
|
72553
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
72554
|
+
</button>
|
|
72555
|
+
} @else {
|
|
72556
|
+
<span class="christianity-slot"></span>
|
|
72557
|
+
}
|
|
72558
|
+
}
|
|
72559
|
+
</section>
|
|
72560
|
+
</section>
|
|
72561
|
+
|
|
72562
|
+
<section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
|
|
72563
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="openHistory()">
|
|
72564
|
+
<i aria-hidden="true"></i>
|
|
72565
|
+
<i aria-hidden="true"></i>
|
|
72566
|
+
<i aria-hidden="true"></i>
|
|
72567
|
+
<span>{{ t('christianityHistory') }}</span>
|
|
72568
|
+
<strong>{{ game().historyZone.length }}</strong>
|
|
72569
|
+
</button>
|
|
72570
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
|
|
72571
|
+
<i aria-hidden="true"></i>
|
|
72572
|
+
<i aria-hidden="true"></i>
|
|
72573
|
+
<i aria-hidden="true"></i>
|
|
72574
|
+
<span>{{ t('christianityDeck') }}</span>
|
|
72575
|
+
<strong>{{ game().sharedDeck.length }}</strong>
|
|
72576
|
+
</button>
|
|
72577
|
+
<div class="christianity-zone-card">
|
|
72578
|
+
<span>{{ t('christianityPlace') }}</span>
|
|
72579
|
+
<strong>{{ t('christianityEmpty') }}</strong>
|
|
72580
|
+
</div>
|
|
72581
|
+
</section>
|
|
72582
|
+
|
|
72583
|
+
<section class="christianity-player-side">
|
|
72584
|
+
<section class="christianity-battle-zone" [class.is-placing-card]="canPlaceSelectedCharacter() || isDraggingCharacter()" [attr.aria-label]="t('christianityYourBattle')">
|
|
72585
|
+
@for (slot of battleSlots('P1'); track slot.trackId) {
|
|
72586
|
+
@if (slot.card) {
|
|
72587
|
+
<button
|
|
72588
|
+
type="button"
|
|
72589
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
72590
|
+
valLightRipple
|
|
72591
|
+
[class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
|
|
72592
|
+
[class.is-exhausted]="!slot.card.canAttack"
|
|
72593
|
+
[class.is-ready-attacker]="isOwnTurn() && slot.card.canAttack"
|
|
72594
|
+
(click)="selectAttacker(slot.card)"
|
|
72595
|
+
>
|
|
72596
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
72597
|
+
</button>
|
|
72598
|
+
} @else {
|
|
72599
|
+
<button
|
|
72600
|
+
type="button"
|
|
72601
|
+
class="christianity-slot"
|
|
72602
|
+
cdkDropList
|
|
72603
|
+
[id]="battleSlotDropId($index)"
|
|
72604
|
+
[cdkDropListData]="$index"
|
|
72605
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
72606
|
+
[cdkDropListEnterPredicate]="canDropOnBattleSlot"
|
|
72607
|
+
[cdkDropListSortingDisabled]="true"
|
|
72608
|
+
[class.christianity-slot--play-target]="canPlaceSelectedCharacter() || isDraggingCharacter()"
|
|
72609
|
+
valLightRipple
|
|
72610
|
+
(cdkDropListDropped)="dropOnBattleSlot($event, $index)"
|
|
72611
|
+
(click)="playSelectedCard($index)"
|
|
72612
|
+
>
|
|
72613
|
+
@if (canPlaceSelectedCharacter() || isDraggingCharacter()) {
|
|
72614
|
+
<span>{{ t('christianityPlayHere') }}</span>
|
|
72615
|
+
}
|
|
72616
|
+
</button>
|
|
72617
|
+
}
|
|
72618
|
+
}
|
|
72619
|
+
</section>
|
|
72620
|
+
|
|
72621
|
+
<section class="christianity-player-rack">
|
|
72622
|
+
<div class="christianity-offerings-zone">
|
|
72623
|
+
<button
|
|
72624
|
+
type="button"
|
|
72625
|
+
class="christianity-offering-pile"
|
|
72626
|
+
cdkDropList
|
|
72627
|
+
id="christianity-offerings-drop"
|
|
72628
|
+
valLightRipple
|
|
72629
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
72630
|
+
[class.is-play-target]="canPlaceSelectedOffering() || isDraggingOffering()"
|
|
72631
|
+
[cdkDropListEnterPredicate]="canDropOnOfferings"
|
|
72632
|
+
[cdkDropListSortingDisabled]="true"
|
|
72633
|
+
(cdkDropListDropped)="dropOnOfferings($event)"
|
|
72634
|
+
(click)="handleOfferingPile('P1')"
|
|
72635
|
+
>
|
|
72636
|
+
<i aria-hidden="true"></i>
|
|
72637
|
+
<i aria-hidden="true"></i>
|
|
72638
|
+
<i aria-hidden="true"></i>
|
|
72639
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
72640
|
+
<strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
|
|
72641
|
+
</button>
|
|
72642
|
+
</div>
|
|
72643
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple (click)="inspectLeader('P1')">
|
|
72644
|
+
<val-christianity-card [card]="leaderRenderCard(player())" variant="table"></val-christianity-card>
|
|
72645
|
+
</button>
|
|
72646
|
+
<div class="christianity-player-command">
|
|
72647
|
+
<div class="christianity-player-badge">
|
|
72648
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
72649
|
+
<strong>{{ player().displayName }}</strong>
|
|
72650
|
+
</div>
|
|
72651
|
+
<button
|
|
72652
|
+
type="button"
|
|
72653
|
+
class="christianity-end-turn"
|
|
72654
|
+
(click)="endTurn()"
|
|
72655
|
+
>
|
|
72656
|
+
{{ t('christianityEndTurn') }}
|
|
72657
|
+
</button>
|
|
72658
|
+
</div>
|
|
72659
|
+
</section>
|
|
72660
|
+
</section>
|
|
72661
|
+
</section>
|
|
72662
|
+
|
|
72663
|
+
<section class="christianity-hand-shelf">
|
|
72664
|
+
<div class="christianity-hand-meter">
|
|
72665
|
+
<span>{{ t('christianityHand') }}</span>
|
|
72666
|
+
<strong>{{ player().hand?.length ?? 0 }}</strong>
|
|
72667
|
+
</div>
|
|
72668
|
+
<section
|
|
72669
|
+
class="christianity-hand-fan"
|
|
72670
|
+
cdkDropList
|
|
72671
|
+
id="christianity-hand-source"
|
|
72672
|
+
[cdkDropListConnectedTo]="dropTargetIds()"
|
|
72673
|
+
[attr.aria-label]="t('christianityYourHand')"
|
|
72674
|
+
(pointerleave)="clearHoveredHandIndex()"
|
|
72675
|
+
>
|
|
72676
|
+
@for (cardId of player().hand ?? []; track cardId + $index) {
|
|
72677
|
+
@let card = cardDefinition(cardId);
|
|
72678
|
+
<div
|
|
72679
|
+
class="christianity-hand-card-wrap"
|
|
72680
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
72681
|
+
[class.is-dragging]="draggingCardId() === cardId"
|
|
72682
|
+
[style.z-index]="handCardZIndex($index)"
|
|
72683
|
+
[style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
|
|
72684
|
+
(pointerenter)="setHoveredHandIndex($index)"
|
|
72685
|
+
(pointerdown)="setHoveredHandIndex($index)"
|
|
72686
|
+
(pointerup)="releaseHoveredHand($event)"
|
|
72687
|
+
>
|
|
72688
|
+
<button
|
|
72689
|
+
type="button"
|
|
72690
|
+
class="christianity-card-preview-card christianity-card-preview-card--hand christianity-render-card-button"
|
|
72691
|
+
cdkDrag
|
|
72692
|
+
valLightRipple
|
|
72693
|
+
[cdkDragData]="cardId"
|
|
72694
|
+
[cdkDragDisabled]="!canPlay(card)"
|
|
72695
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
72696
|
+
[class.is-disabled]="!canPlay(card)"
|
|
72697
|
+
(cdkDragStarted)="startDraggingCard(cardId)"
|
|
72698
|
+
(cdkDragEnded)="endDraggingCard()"
|
|
72699
|
+
(click)="selectHandCard(cardId)"
|
|
72700
|
+
>
|
|
72701
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="hand"></val-christianity-card>
|
|
72702
|
+
</button>
|
|
72703
|
+
<button
|
|
72704
|
+
type="button"
|
|
72705
|
+
class="christianity-card-eye"
|
|
72706
|
+
[attr.aria-label]="t('christianityPreviewCard')"
|
|
72707
|
+
(click)="inspectHandCard(cardId, true); $event.stopPropagation()"
|
|
72708
|
+
></button>
|
|
72709
|
+
</div>
|
|
72710
|
+
}
|
|
72711
|
+
</section>
|
|
72712
|
+
</section>
|
|
72713
|
+
}
|
|
72714
|
+
|
|
72715
|
+
@if (selectedPreview()) {
|
|
72716
|
+
<button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
|
|
72717
|
+
<aside
|
|
72718
|
+
class="christianity-floating-card-shell"
|
|
72719
|
+
aria-live="polite"
|
|
72720
|
+
>
|
|
72721
|
+
<button type="button" class="christianity-floating-card-close" (click)="closePreview()">
|
|
72722
|
+
{{ t('close') }}
|
|
72723
|
+
</button>
|
|
72724
|
+
<div
|
|
72725
|
+
class="christianity-floating-card"
|
|
72726
|
+
[style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
|
|
72727
|
+
[style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
|
|
72728
|
+
[style.--preview-shift-x]="previewTilt().shiftX + 'px'"
|
|
72729
|
+
[style.--preview-shift-y]="previewTilt().shiftY + 'px'"
|
|
72730
|
+
(pointermove)="tiltPreview($event)"
|
|
72731
|
+
(pointerleave)="resetPreviewTilt()"
|
|
72732
|
+
>
|
|
72733
|
+
@if (selectedPreviewRenderCard(); as previewCard) {
|
|
72734
|
+
<val-christianity-card [card]="previewCard" variant="full"></val-christianity-card>
|
|
72735
|
+
}
|
|
72736
|
+
</div>
|
|
72737
|
+
@if (previewRule(); as rule) {
|
|
72738
|
+
<div class="christianity-preview-rule-note">
|
|
72739
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72740
|
+
<div>
|
|
72741
|
+
<small>{{ t('christianityCardRule') }}</small>
|
|
72742
|
+
<strong>{{ rule.title }}</strong>
|
|
72743
|
+
<p>{{ rule.body }}</p>
|
|
72744
|
+
</div>
|
|
72745
|
+
</div>
|
|
72746
|
+
}
|
|
72747
|
+
</aside>
|
|
72748
|
+
}
|
|
72749
|
+
|
|
72750
|
+
@if (selectedInfo(); as info) {
|
|
72751
|
+
<button type="button" class="christianity-info-backdrop" [attr.aria-label]="t('close')" (click)="closeInfo()"></button>
|
|
72752
|
+
<aside class="christianity-info-panel" aria-live="polite">
|
|
72753
|
+
<button type="button" class="christianity-dialog-close christianity-info-close" (click)="closeInfo()">
|
|
72754
|
+
{{ t('close') }}
|
|
72755
|
+
</button>
|
|
72756
|
+
<div class="christianity-rule-note">
|
|
72757
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72758
|
+
<div>
|
|
72759
|
+
<small>{{ info.eyebrow }}</small>
|
|
72760
|
+
<h2>{{ info.title }}</h2>
|
|
72761
|
+
<strong>{{ info.meta }}</strong>
|
|
72762
|
+
<p>{{ info.body }}</p>
|
|
72763
|
+
<ul>
|
|
72764
|
+
@for (fact of info.facts; track fact) {
|
|
72765
|
+
<li>{{ fact }}</li>
|
|
72766
|
+
}
|
|
72767
|
+
</ul>
|
|
72768
|
+
</div>
|
|
72769
|
+
</div>
|
|
72770
|
+
</aside>
|
|
72771
|
+
}
|
|
72772
|
+
|
|
72773
|
+
@if (screen() === 'table') {
|
|
72774
|
+
<section class="christianity-actions" aria-live="polite">
|
|
72775
|
+
<p>{{ statusText() }}</p>
|
|
72776
|
+
<div>
|
|
72777
|
+
<button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
|
|
72778
|
+
{{ selectedActionLabel() }}
|
|
72779
|
+
</button>
|
|
72780
|
+
<button type="button" (click)="resetMock()">
|
|
72781
|
+
{{ t('christianityReset') }}
|
|
72782
|
+
</button>
|
|
72783
|
+
</div>
|
|
72784
|
+
</section>
|
|
72785
|
+
}
|
|
72786
|
+
|
|
72787
|
+
@if (showHistory()) {
|
|
72788
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
|
|
72789
|
+
<section class="christianity-history-drawer">
|
|
72790
|
+
<header>
|
|
72791
|
+
<h2>{{ t('christianityHistory') }}</h2>
|
|
72792
|
+
<div class="christianity-dialog-actions">
|
|
72793
|
+
<span>{{ game().historyZone.length }}</span>
|
|
72794
|
+
<button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
|
|
72795
|
+
{{ t('close') }}
|
|
72796
|
+
</button>
|
|
72797
|
+
</div>
|
|
72798
|
+
</header>
|
|
72799
|
+
@if (game().historyZone.length) {
|
|
72800
|
+
<div class="christianity-history-grid">
|
|
72801
|
+
@for (cardId of game().historyZone; track cardId + $index) {
|
|
72802
|
+
@let card = cardDefinition(cardId);
|
|
72803
|
+
<button type="button" class="christianity-gallery-card-button christianity-render-card-button" valLightRipple (click)="inspectHistoryCard(cardId)">
|
|
72804
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72805
|
+
</button>
|
|
72806
|
+
}
|
|
72807
|
+
</div>
|
|
72808
|
+
} @else {
|
|
72809
|
+
<p>{{ t('christianityHistoryEmpty') }}</p>
|
|
72810
|
+
}
|
|
72811
|
+
</section>
|
|
72812
|
+
}
|
|
72813
|
+
|
|
72814
|
+
@if (showGallery()) {
|
|
72815
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseGallery')" (click)="closeGallery()"></button>
|
|
72816
|
+
<section class="christianity-history-drawer christianity-gallery-drawer">
|
|
72817
|
+
<header>
|
|
72818
|
+
<div>
|
|
72819
|
+
<h2>{{ t('christianityGallery') }}</h2>
|
|
72820
|
+
<p>{{ galleryEditionLabel() }}</p>
|
|
72821
|
+
</div>
|
|
72822
|
+
<div class="christianity-dialog-actions">
|
|
72823
|
+
<span>{{ galleryCards().length }}</span>
|
|
72824
|
+
<button type="button" class="christianity-dialog-close" (click)="closeGallery()">
|
|
72825
|
+
{{ t('close') }}
|
|
72826
|
+
</button>
|
|
72827
|
+
</div>
|
|
72828
|
+
</header>
|
|
72829
|
+
<div class="christianity-gallery-controls">
|
|
72830
|
+
<label>
|
|
72831
|
+
<span>{{ t('christianityGallerySearch') }}</span>
|
|
72832
|
+
<input type="search" [value]="gallerySearch()" (input)="setGallerySearch($event)" [placeholder]="t('christianityGallerySearchPlaceholder')" />
|
|
72833
|
+
</label>
|
|
72834
|
+
<label>
|
|
72835
|
+
<span>{{ t('christianityGalleryFilter') }}</span>
|
|
72836
|
+
<select [value]="galleryType()" (change)="setGalleryType($event)">
|
|
72837
|
+
@for (option of galleryTypeOptions(); track option.value) {
|
|
72838
|
+
<option [value]="option.value">{{ option.label }}</option>
|
|
72839
|
+
}
|
|
72840
|
+
</select>
|
|
72841
|
+
</label>
|
|
72842
|
+
</div>
|
|
72843
|
+
<div class="christianity-gallery-edition-strip">
|
|
72844
|
+
<button type="button" class="is-active" valLightRipple>
|
|
72845
|
+
<img [src]="galleryEditionIcon()" alt="" />
|
|
72846
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
72847
|
+
</button>
|
|
72848
|
+
</div>
|
|
72849
|
+
<div class="christianity-gallery-grid">
|
|
72850
|
+
@for (card of galleryCards(); track card.id) {
|
|
72851
|
+
<button type="button" class="christianity-gallery-card-button christianity-render-card-button" valLightRipple (click)="inspectGalleryCard(card.id)">
|
|
72852
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72853
|
+
</button>
|
|
72854
|
+
} @empty {
|
|
72855
|
+
<p>{{ t('christianityGalleryEmpty') }}</p>
|
|
72856
|
+
}
|
|
72857
|
+
</div>
|
|
72858
|
+
</section>
|
|
72859
|
+
}
|
|
72860
|
+
|
|
72861
|
+
@if (offeringsSeat()) {
|
|
72862
|
+
@let offeringPlayer = game().players[offeringsSeat()!];
|
|
72863
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
|
|
72864
|
+
<section class="christianity-history-drawer christianity-offerings-drawer">
|
|
72865
|
+
<header>
|
|
72866
|
+
<h2>{{ t('christianityOfferings') }}</h2>
|
|
72867
|
+
<div class="christianity-dialog-actions">
|
|
72868
|
+
<span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
|
|
72869
|
+
<button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
|
|
72870
|
+
{{ t('close') }}
|
|
72871
|
+
</button>
|
|
72872
|
+
</div>
|
|
72873
|
+
</header>
|
|
72874
|
+
<div class="christianity-offerings-note">
|
|
72875
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72876
|
+
<p>{{ t('christianityOfferingsRuleBody') }}</p>
|
|
72877
|
+
</div>
|
|
72878
|
+
<div class="christianity-offering-list">
|
|
72879
|
+
@for (offering of offeringPlayer.offerings; track offering.instanceId) {
|
|
72880
|
+
<article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
|
|
72881
|
+
<button type="button" class="christianity-offering-card christianity-render-card-button" valLightRipple (click)="inspectOffering(offering)">
|
|
72882
|
+
<val-christianity-card [card]="offeringRenderCard(offering)" variant="list"></val-christianity-card>
|
|
72883
|
+
</button>
|
|
72884
|
+
<div>
|
|
72885
|
+
<strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
|
|
72886
|
+
<p>{{ offeringAbilityText(offering) }}</p>
|
|
72887
|
+
@if (offering.abilityName) {
|
|
72888
|
+
<button
|
|
72889
|
+
type="button"
|
|
72890
|
+
[disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
|
|
72891
|
+
(click)="useOfferingAbility(offering, offeringsSeat()!)"
|
|
72892
|
+
>
|
|
72893
|
+
{{ t('christianityUseAbility') }}
|
|
72894
|
+
</button>
|
|
72895
|
+
}
|
|
72896
|
+
</div>
|
|
72897
|
+
</article>
|
|
72898
|
+
}
|
|
72899
|
+
</div>
|
|
72900
|
+
</section>
|
|
72901
|
+
}
|
|
72902
|
+
</main>
|
|
72903
|
+
`, styles: [":host{--christianity-theme-ink: var(--val-text-color, #1f2933);--christianity-theme-surface: #ffffff;--christianity-theme-parchment: #eff6ff;--christianity-theme-olive: #1d4ed8;--christianity-theme-gold: #2563eb;--christianity-theme-gold-soft: rgba(37, 99, 235, .16);--christianity-theme-gold-ring: rgba(37, 99, 235, .44);--christianity-theme-glow: rgba(37, 99, 235, .24);--christianity-theme-focus: #2563eb;--christianity-theme-shadow: rgba(37, 99, 235, .15);--christianity-theme-shadow-strong: rgba(37, 99, 235, .26);--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-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;min-width:0}.christianity-gallery-open{min-height:2.2rem;padding:0 .75rem;border:1px solid var(--christianity-theme-gold-ring);border-radius:999px;background:linear-gradient(180deg,#eff6fffa,#fffffffa),radial-gradient(circle at 20% 0%,var(--christianity-theme-gold-soft),transparent 42%);color:var(--christianity-theme-ink);font:inherit;font-size:.82rem;font-weight:800;box-shadow:0 .55rem 1.2rem #2563eb1a}.christianity-splash,.christianity-start{min-height:min(34rem,calc(100dvh - 8rem));border:1px solid rgba(37,99,235,.18);border-radius:.9rem;background:radial-gradient(circle at 50% 18%,rgba(37,99,235,.16),transparent 22rem),linear-gradient(180deg,#eff6ffed,#fffffff7),var(--christianity-card-back-soft);box-shadow:0 1.2rem 3.2rem #2563eb1f}.christianity-splash{display:grid;place-items:center;align-content:center;gap:1.2rem;padding:2.5rem 1.25rem;text-align:center}.christianity-splash__mark{position:relative;width:6.4rem;height:8.9rem;filter:drop-shadow(0 1rem 1.8rem rgba(82,64,28,.18))}.christianity-splash__mark i{position:absolute;inset:0;border:1px solid rgba(36,48,68,.16);border-radius:.7rem;background:radial-gradient(circle at 76% 12%,rgba(250,204,21,.9) 0 .42rem,transparent .45rem),linear-gradient(180deg,#fffffffa,#f8fafcfa)}.christianity-splash__mark i:nth-child(1){transform:translate(-1.1rem) rotate(-9deg)}.christianity-splash__mark i:nth-child(2){transform:translateY(-.32rem)}.christianity-splash__mark i:nth-child(3){transform:translate(1.1rem) rotate(9deg)}.christianity-splash__mark:after{content:\"\";position:absolute;inset:2.1rem 1.05rem 2.5rem;border-radius:.55rem;background:radial-gradient(circle at 50% 44%,rgba(245,199,85,.7),transparent 36%),linear-gradient(135deg,#5f6f2a33,#5f6f2a14)}.christianity-splash span,.christianity-start__copy span{color:var(--christianity-theme-olive);font-size:.76rem;font-weight:900;text-transform:uppercase}.christianity-splash h2,.christianity-start h2,.christianity-start p{margin:0}.christianity-splash h2{margin-top:.2rem;font-size:clamp(1.65rem,7vw,2.7rem);line-height:1}.christianity-splash p{max-width:26rem;margin:.55rem auto 0;color:#1f2933ad;font-size:.96rem}.christianity-start{display:grid;align-content:center;gap:1rem;padding:clamp(.85rem,2vw,1.35rem)}.christianity-start__hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,18rem);gap:1rem;align-items:center}.christianity-start__copy{display:grid;gap:.45rem;max-width:36rem}.christianity-start h2{font-size:clamp(1.6rem,6vw,2.5rem);line-height:1.02}.christianity-start__copy p,.christianity-start__cards p,.christianity-start__modes p{color:#1f2933ad;line-height:1.42}.christianity-start__fan{position:relative;display:grid;place-items:center;min-height:13rem;overflow:visible}.christianity-start__fan val-christianity-card{position:absolute;width:clamp(5.7rem,12vw,7.2rem);transform-origin:50% 92%;filter:drop-shadow(0 1rem 1.5rem rgba(82,64,28,.18))}.christianity-start__cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}.christianity-start__cards article,.christianity-start__modes article{display:grid;gap:.65rem;align-content:start;padding:.95rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#ffffffd1;box-shadow:0 .75rem 1.7rem #52401c14}.christianity-start__cards article{min-height:11rem}.christianity-start__cards strong{font-size:1.05rem}.christianity-start__status{display:flex;flex-wrap:wrap;gap:.45rem}.christianity-start__status span,.christianity-start__modes article>span{display:inline-flex;align-items:center;width:fit-content;min-height:1.85rem;padding:0 .62rem;border:1px solid rgba(37,99,235,.22);border-radius:999px;background:#eff6ffe0;color:#1f2933b8;font-size:.75rem;font-weight:850}.christianity-start__modes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.55rem}.christianity-start__modes article{min-height:8.5rem;background:#f8fafcb8;box-shadow:none;opacity:.82}.christianity-start__modes strong{font-size:.92rem}.christianity-start__modes p{margin:0;font-size:.8rem}.christianity-primary-action,.christianity-secondary-action{justify-self:start;min-height:2.5rem;padding:0 .9rem;border-radius:999px;font:inherit;font-weight:900}.christianity-primary-action{border:1px solid rgba(16,42,67,.16);background:#102a43;color:#fff}.christianity-secondary-action{border:1px solid var(--christianity-theme-gold-ring);background:var(--christianity-theme-parchment);color:var(--christianity-theme-ink)}.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-render-card-button{display:block;padding:0;overflow:visible;border:0;background:transparent;box-shadow:none}.christianity-render-card-button>val-christianity-card{display:block;width:100%;height:100%}.christianity-gallery-card-button{display:block;width:min(100%,6.8rem);min-width:0;aspect-ratio:var(--christianity-card-aspect);padding:0;overflow:visible;border:0;background:transparent;color:inherit;font:inherit;text-align:left;box-shadow:none}.christianity-gallery-card-button>val-christianity-card{display:block;width:100%;height:100%}.christianity-card-preview-card--hand.christianity-render-card-button,.christianity-card-preview-card--battle.christianity-render-card-button,.christianity-leader-card.christianity-render-card-button{aspect-ratio:var(--christianity-card-aspect)}.christianity-card-preview-card--hand.christianity-render-card-button:hover val-christianity-card,.christianity-card-preview-card--hand.christianity-render-card-button.is-selected val-christianity-card,.christianity-card-preview-card--battle.christianity-render-card-button.is-selected val-christianity-card,.christianity-card-preview-card--battle.christianity-render-card-button.is-target val-christianity-card,.christianity-leader-card.christianity-render-card-button.is-target val-christianity-card{filter:drop-shadow(0 0 .55rem rgba(214,162,29,.35))}.christianity-card-preview-card--battle.christianity-render-card-button.is-ready-attacker val-christianity-card{filter:drop-shadow(0 .45rem .8rem rgba(95,111,42,.16))}.christianity-card-preview-card--battle.christianity-render-card-button.is-selected{transform:translateY(-.28rem)}.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-header span.is-offering-pips,.christianity-full-card-cost.is-offering-pips,.christianity-offering-card span.is-offering-pips{grid-auto-flow:column;gap:.14rem;min-width:auto;padding:0 .28rem}.christianity-card-frame-header span.is-offering-pips i,.christianity-full-card-cost.is-offering-pips i,.christianity-offering-card span.is-offering-pips i,.christianity-full-card-pips i{display:block;width:.72rem;height:.72rem;border-radius:999px;background:radial-gradient(circle at 34% 28%,rgba(255,255,255,.9) 0 .12rem,transparent .13rem),#ffd91a;box-shadow:inset 0 -.08rem #52401c2e,0 .12rem .24rem #102a431a}.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);height:7.1rem;min-height:0;max-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>.cdk-drag-placeholder,.christianity-slot>.cdk-drag-placeholder{display:none}.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;grid-template-rows:minmax(0,auto) auto;gap:.55rem;width:min(17.5rem,calc(52dvh - 3rem),calc(100vw - 1.25rem));max-height:calc(100dvh - 1rem);padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-floating-card{position:relative;z-index:1;display:block;width:100%;min-height:0;padding:0;border:0;border-radius:.75rem;background:transparent;box-shadow:0 0 2.2rem var(--christianity-theme-glow);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-floating-card val-christianity-card{display:block;width:100%;min-height:0}.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-type-icon img{width:1rem;height:1rem;object-fit:contain}.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-stats .christianity-full-card-pips{display:inline-grid;grid-auto-flow:column;gap:.2rem;justify-self:start;padding:0;background:transparent}.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-preview-rule-note{position:relative;z-index:4;display:grid;grid-template-columns:auto minmax(0,1fr);gap:.65rem;align-items:start;padding:.75rem .85rem;border:1px solid rgba(36,48,68,.14);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 8% 0%,rgba(37,99,235,.08),transparent 44%);box-shadow:0 .75rem 1.6rem #102a431f}.christianity-preview-rule-note small,.christianity-preview-rule-note strong,.christianity-preview-rule-note p{margin:0}.christianity-preview-rule-note small{color:#1f293394;font-size:.68rem;font-weight:800;text-transform:uppercase}.christianity-preview-rule-note strong{display:block;margin-top:.08rem;font-size:.92rem;line-height:1.1}.christianity-preview-rule-note p{margin-top:.22rem;color:#1f2933bd;font-size:.82rem;line-height:1.32}@media (min-width: 52rem){.christianity-floating-card-shell{width:min(22rem,calc(67dvh - 5.85rem),calc(100vw - 3rem))}.christianity-floating-card{min-height:0;padding:0}}@media (max-width: 51.99rem){.christianity-floating-card-shell{top:48%;gap:.45rem;max-height:calc(100dvh - 1.5rem);padding-top:2.15rem}.christianity-floating-card-close{min-height:1.9rem;padding:0 .58rem;font-size:.72rem}.christianity-preview-rule-note{max-height:min(8.25rem,24dvh);padding:.62rem .68rem;overflow-y:auto;scrollbar-color:rgba(36,48,68,.28) transparent;scrollbar-gutter:stable}.christianity-preview-rule-note .christianity-rule-note-icon{width:1.8rem;height:1.8rem;font-size:.9rem}.christianity-preview-rule-note strong{font-size:.86rem}.christianity-preview-rule-note p{font-size:.78rem;line-height:1.28}}.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-gallery-drawer{grid-template-rows:auto auto auto minmax(0,1fr);width:min(calc(100vw - 1rem),50rem);min-height:min(22rem,calc(100dvh - 1rem));max-height:min(36rem,calc(100dvh - 2rem))}.christianity-gallery-drawer header>div:first-child{display:grid;gap:.15rem;min-width:0}.christianity-gallery-drawer header p{color:#1f293394;font-size:.82rem}.christianity-gallery-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(8.5rem,13rem);gap:.65rem}.christianity-gallery-controls label{display:grid;gap:.25rem;min-width:0;color:#1f29339e;font-size:.74rem;font-weight:800}.christianity-gallery-controls input,.christianity-gallery-controls select{width:100%;min-width:0;min-height:2.35rem;padding:0 .75rem;border:1px solid rgba(36,48,68,.16);border-radius:.65rem;background:#fff;color:var(--christianity-theme-ink);font:inherit;font-size:.9rem}.christianity-gallery-edition-strip{display:flex;gap:.45rem;overflow-x:auto;padding-bottom:.1rem}.christianity-gallery-edition-strip button{display:inline-flex;align-items:center;gap:.45rem;min-height:2.35rem;padding:0 .75rem;border:1px solid rgba(214,162,29,.38);border-radius:999px;background:var(--christianity-theme-parchment);color:var(--christianity-theme-ink);font:inherit;font-size:.82rem;font-weight:800}.christianity-gallery-edition-strip img{width:1.2rem;height:1.2rem;object-fit:contain}.christianity-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.8rem,6.8rem));justify-content:center;align-content:start;gap:.65rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem .1rem .35rem}.christianity-gallery-grid::-webkit-scrollbar{width:.65rem}.christianity-gallery-grid::-webkit-scrollbar-track{border-radius:999px;background:#e2e8f0b8}.christianity-gallery-grid::-webkit-scrollbar-thumb{border:.14rem solid rgba(226,232,240,.72);border-radius:999px;background:#24304452}.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}.christianity-history-grid .christianity-render-card-button{justify-self:center;width:min(100%,6.4rem)}.christianity-gallery-grid .christianity-render-card-button{justify-self:center;width:min(100%,7rem)}.christianity-offering-card.christianity-render-card-button{width:min(100%,5.8rem);min-height:0;padding:0;border:0;background:transparent;box-shadow:none}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}:host-context(.dark),:host-context(.ion-palette-dark),:host-context(html.ion-palette-dark),:host-context(body.dark),:host-context([data-theme=\"dark\"]){--christianity-theme-ink: var(--ion-text-color, #e5edf8);--christianity-theme-surface: #111827;--christianity-theme-parchment: #13223a;--christianity-theme-olive: #93c5fd;--christianity-theme-gold: #60a5fa;--christianity-theme-gold-soft: rgba(96, 165, 250, .18);--christianity-theme-gold-ring: rgba(147, 197, 253, .42);--christianity-theme-glow: rgba(96, 165, 250, .24);--christianity-theme-focus: #93c5fd;--christianity-theme-shadow: rgba(0, 0, 0, .34);--christianity-theme-shadow-strong: rgba(0, 0, 0, .48);--christianity-card-back: linear-gradient(135deg, rgba(147, 197, 253, .2), rgba(15, 23, 42, .08)), repeating-linear-gradient(45deg, #1e3a5f 0 .33rem, #0f172a .33rem .66rem);--christianity-card-back-soft: linear-gradient(135deg, rgba(147, 197, 253, .15), rgba(15, 23, 42, .06)), repeating-linear-gradient(45deg, #1e3a5f 0 .33rem, #0f172a .33rem .66rem);color-scheme:dark}:host-context(.dark) .christianity-shell,:host-context(.ion-palette-dark) .christianity-shell,:host-context(html.ion-palette-dark) .christianity-shell,:host-context(body.dark) .christianity-shell,:host-context([data-theme=\"dark\"]) .christianity-shell{border-color:#94a3b82e;background:#07111f}:host-context(.dark) .christianity-gallery-open,:host-context(.ion-palette-dark) .christianity-gallery-open,:host-context(html.ion-palette-dark) .christianity-gallery-open,:host-context(body.dark) .christianity-gallery-open,:host-context([data-theme=\"dark\"]) .christianity-gallery-open,:host-context(.dark) .christianity-secondary-action,:host-context(.ion-palette-dark) .christianity-secondary-action,:host-context(html.ion-palette-dark) .christianity-secondary-action,:host-context(body.dark) .christianity-secondary-action,:host-context([data-theme=\"dark\"]) .christianity-secondary-action,:host-context(.dark) .christianity-gallery-edition-strip button,:host-context(.ion-palette-dark) .christianity-gallery-edition-strip button,:host-context(html.ion-palette-dark) .christianity-gallery-edition-strip button,:host-context(body.dark) .christianity-gallery-edition-strip button,:host-context([data-theme=\"dark\"]) .christianity-gallery-edition-strip button{border-color:#93c5fd5c;background:linear-gradient(180deg,#1e3a5fd1,#0f172ae0),radial-gradient(circle at 20% 0%,rgba(96,165,250,.16),transparent 42%);color:var(--christianity-theme-ink);box-shadow:0 .55rem 1.2rem #0000003d}:host-context(.dark) .christianity-splash,:host-context(.ion-palette-dark) .christianity-splash,:host-context(html.ion-palette-dark) .christianity-splash,:host-context(body.dark) .christianity-splash,:host-context([data-theme=\"dark\"]) .christianity-splash,:host-context(.dark) .christianity-start,:host-context(.ion-palette-dark) .christianity-start,:host-context(html.ion-palette-dark) .christianity-start,:host-context(body.dark) .christianity-start,:host-context([data-theme=\"dark\"]) .christianity-start{border-color:#93c5fd38;background:radial-gradient(circle at 50% 18%,rgba(96,165,250,.16),transparent 22rem),linear-gradient(180deg,#0f172ae0,#07111ff7),var(--christianity-card-back-soft);box-shadow:0 1.2rem 3.2rem #00000047}:host-context(.dark) .christianity-start__cards article,:host-context(.ion-palette-dark) .christianity-start__cards article,:host-context(html.ion-palette-dark) .christianity-start__cards article,:host-context(body.dark) .christianity-start__cards article,:host-context([data-theme=\"dark\"]) .christianity-start__cards article,:host-context(.dark) .christianity-start__modes article,:host-context(.ion-palette-dark) .christianity-start__modes article,:host-context(html.ion-palette-dark) .christianity-start__modes article,:host-context(body.dark) .christianity-start__modes article,:host-context([data-theme=\"dark\"]) .christianity-start__modes article,:host-context(.dark) .christianity-start__status span,:host-context(.ion-palette-dark) .christianity-start__status span,:host-context(html.ion-palette-dark) .christianity-start__status span,:host-context(body.dark) .christianity-start__status span,:host-context([data-theme=\"dark\"]) .christianity-start__status span,:host-context(.dark) .christianity-start__modes article>span,:host-context(.ion-palette-dark) .christianity-start__modes article>span,:host-context(html.ion-palette-dark) .christianity-start__modes article>span,:host-context(body.dark) .christianity-start__modes article>span,:host-context([data-theme=\"dark\"]) .christianity-start__modes article>span{border-color:#94a3b833;background:#0f172aad;box-shadow:0 .75rem 1.7rem #00000038}:host-context(.dark) .christianity-splash p,:host-context(.ion-palette-dark) .christianity-splash p,:host-context(html.ion-palette-dark) .christianity-splash p,:host-context(body.dark) .christianity-splash p,:host-context([data-theme=\"dark\"]) .christianity-splash p,:host-context(.dark) .christianity-start__copy p,:host-context(.ion-palette-dark) .christianity-start__copy p,:host-context(html.ion-palette-dark) .christianity-start__copy p,:host-context(body.dark) .christianity-start__copy p,:host-context([data-theme=\"dark\"]) .christianity-start__copy p,:host-context(.dark) .christianity-start__cards p,:host-context(.ion-palette-dark) .christianity-start__cards p,:host-context(html.ion-palette-dark) .christianity-start__cards p,:host-context(body.dark) .christianity-start__cards p,:host-context([data-theme=\"dark\"]) .christianity-start__cards p,:host-context(.dark) .christianity-start__modes p,:host-context(.ion-palette-dark) .christianity-start__modes p,:host-context(html.ion-palette-dark) .christianity-start__modes p,:host-context(body.dark) .christianity-start__modes p,:host-context([data-theme=\"dark\"]) .christianity-start__modes p,:host-context(.dark) .christianity-header p,:host-context(.ion-palette-dark) .christianity-header p,:host-context(html.ion-palette-dark) .christianity-header p,:host-context(body.dark) .christianity-header p,:host-context([data-theme=\"dark\"]) .christianity-header p,:host-context(.dark) .christianity-match-player small,:host-context(.ion-palette-dark) .christianity-match-player small,:host-context(html.ion-palette-dark) .christianity-match-player small,:host-context(body.dark) .christianity-match-player small,:host-context([data-theme=\"dark\"]) .christianity-match-player small,:host-context(.dark) .christianity-scoreboard span,:host-context(.ion-palette-dark) .christianity-scoreboard span,:host-context(html.ion-palette-dark) .christianity-scoreboard span,:host-context(body.dark) .christianity-scoreboard span,:host-context([data-theme=\"dark\"]) .christianity-scoreboard span{color:#e2e8f0bd}:host-context(.dark) .christianity-turn,:host-context(.ion-palette-dark) .christianity-turn,:host-context(html.ion-palette-dark) .christianity-turn,:host-context(body.dark) .christianity-turn,:host-context([data-theme=\"dark\"]) .christianity-turn,:host-context(.dark) .christianity-leader,:host-context(.ion-palette-dark) .christianity-leader,:host-context(html.ion-palette-dark) .christianity-leader,:host-context(body.dark) .christianity-leader,:host-context([data-theme=\"dark\"]) .christianity-leader,:host-context(.dark) .christianity-offerings,:host-context(.ion-palette-dark) .christianity-offerings,:host-context(html.ion-palette-dark) .christianity-offerings,:host-context(body.dark) .christianity-offerings,:host-context([data-theme=\"dark\"]) .christianity-offerings,:host-context(.dark) .christianity-hidden-hand,:host-context(.ion-palette-dark) .christianity-hidden-hand,:host-context(html.ion-palette-dark) .christianity-hidden-hand,:host-context(body.dark) .christianity-hidden-hand,:host-context([data-theme=\"dark\"]) .christianity-hidden-hand,:host-context(.dark) .christianity-pile,:host-context(.ion-palette-dark) .christianity-pile,:host-context(html.ion-palette-dark) .christianity-pile,:host-context(body.dark) .christianity-pile,:host-context([data-theme=\"dark\"]) .christianity-pile,:host-context(.dark) .christianity-deck,:host-context(.ion-palette-dark) .christianity-deck,:host-context(html.ion-palette-dark) .christianity-deck,:host-context(body.dark) .christianity-deck,:host-context([data-theme=\"dark\"]) .christianity-deck,:host-context(.dark) .christianity-place,:host-context(.ion-palette-dark) .christianity-place,:host-context(html.ion-palette-dark) .christianity-place,:host-context(body.dark) .christianity-place,:host-context([data-theme=\"dark\"]) .christianity-place,:host-context(.dark) .christianity-match-strip,:host-context(.ion-palette-dark) .christianity-match-strip,:host-context(html.ion-palette-dark) .christianity-match-strip,:host-context(body.dark) .christianity-match-strip,:host-context([data-theme=\"dark\"]) .christianity-match-strip,:host-context(.dark) .christianity-actions,:host-context(.ion-palette-dark) .christianity-actions,:host-context(html.ion-palette-dark) .christianity-actions,:host-context(body.dark) .christianity-actions,:host-context([data-theme=\"dark\"]) .christianity-actions,:host-context(.dark) .christianity-history,:host-context(.ion-palette-dark) .christianity-history,:host-context(html.ion-palette-dark) .christianity-history,:host-context(body.dark) .christianity-history,:host-context([data-theme=\"dark\"]) .christianity-history{border-color:#94a3b82e;background:#0f172ad1}:host-context(.dark) .christianity-turn.is-own-turn,:host-context(.ion-palette-dark) .christianity-turn.is-own-turn,:host-context(html.ion-palette-dark) .christianity-turn.is-own-turn,:host-context(body.dark) .christianity-turn.is-own-turn,:host-context([data-theme=\"dark\"]) .christianity-turn.is-own-turn{border-color:#2dd4bf5c;background:#14534c5c}:host-context(.dark) .christianity-table,:host-context(.ion-palette-dark) .christianity-table,:host-context(html.ion-palette-dark) .christianity-table,:host-context(body.dark) .christianity-table,:host-context([data-theme=\"dark\"]) .christianity-table{background:linear-gradient(180deg,#10233d,#0b1728)}:host-context(.dark) .christianity-player-side,:host-context(.ion-palette-dark) .christianity-player-side,:host-context(html.ion-palette-dark) .christianity-player-side,:host-context(body.dark) .christianity-player-side,:host-context([data-theme=\"dark\"]) .christianity-player-side{background:#0f172a57}:host-context(.dark) .christianity-battle-zone,:host-context(.ion-palette-dark) .christianity-battle-zone,:host-context(html.ion-palette-dark) .christianity-battle-zone,:host-context(body.dark) .christianity-battle-zone,:host-context([data-theme=\"dark\"]) .christianity-battle-zone,:host-context(.dark) .christianity-shared-zone,:host-context(.ion-palette-dark) .christianity-shared-zone,:host-context(html.ion-palette-dark) .christianity-shared-zone,:host-context(body.dark) .christianity-shared-zone,:host-context([data-theme=\"dark\"]) .christianity-shared-zone{background:#0f172a94}:host-context(.dark) .christianity-battle-zone.is-placing-card,:host-context(.ion-palette-dark) .christianity-battle-zone.is-placing-card,:host-context(html.ion-palette-dark) .christianity-battle-zone.is-placing-card,:host-context(body.dark) .christianity-battle-zone.is-placing-card,:host-context([data-theme=\"dark\"]) .christianity-battle-zone.is-placing-card{background:linear-gradient(180deg,#1e3a5fd1,#0f172ab8),#0f172a94}:host-context(.dark) .christianity-card,:host-context(.ion-palette-dark) .christianity-card,:host-context(html.ion-palette-dark) .christianity-card,:host-context(body.dark) .christianity-card,:host-context([data-theme=\"dark\"]) .christianity-card,:host-context(.dark) .christianity-slot,:host-context(.ion-palette-dark) .christianity-slot,:host-context(html.ion-palette-dark) .christianity-slot,:host-context(body.dark) .christianity-slot,:host-context([data-theme=\"dark\"]) .christianity-slot{border-color:#94a3b83d;background:#0f172a8a}:host-context(.dark) .christianity-slot--play-target,:host-context(.ion-palette-dark) .christianity-slot--play-target,:host-context(html.ion-palette-dark) .christianity-slot--play-target,:host-context(body.dark) .christianity-slot--play-target,:host-context([data-theme=\"dark\"]) .christianity-slot--play-target{color:var(--christianity-theme-ink);background:linear-gradient(180deg,#2563eb3d,#0f172ac7),#0f172abd}:host-context(.dark) .christianity-slot--play-target span,:host-context(.ion-palette-dark) .christianity-slot--play-target span,:host-context(html.ion-palette-dark) .christianity-slot--play-target span,:host-context(body.dark) .christianity-slot--play-target span,:host-context([data-theme=\"dark\"]) .christianity-slot--play-target span,:host-context(.dark) .christianity-card strong,:host-context(.ion-palette-dark) .christianity-card strong,:host-context(html.ion-palette-dark) .christianity-card strong,:host-context(body.dark) .christianity-card strong,:host-context([data-theme=\"dark\"]) .christianity-card strong{background:#1e293beb}:host-context(.dark) .christianity-history-drawer,:host-context(.ion-palette-dark) .christianity-history-drawer,:host-context(html.ion-palette-dark) .christianity-history-drawer,:host-context(body.dark) .christianity-history-drawer,:host-context([data-theme=\"dark\"]) .christianity-history-drawer,:host-context(.dark) .christianity-rule-note,:host-context(.ion-palette-dark) .christianity-rule-note,:host-context(html.ion-palette-dark) .christianity-rule-note,:host-context(body.dark) .christianity-rule-note,:host-context([data-theme=\"dark\"]) .christianity-rule-note,:host-context(.dark) .christianity-preview-rule-note,:host-context(.ion-palette-dark) .christianity-preview-rule-note,:host-context(html.ion-palette-dark) .christianity-preview-rule-note,:host-context(body.dark) .christianity-preview-rule-note,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note{border-color:#94a3b82e;background:linear-gradient(180deg,#0f172af5,#111827f5),radial-gradient(circle at 8% 0%,rgba(96,165,250,.12),transparent 40%);box-shadow:0 1.5rem 4rem #0000006b}:host-context(.dark) .christianity-dialog-close,:host-context(.ion-palette-dark) .christianity-dialog-close,:host-context(html.ion-palette-dark) .christianity-dialog-close,:host-context(body.dark) .christianity-dialog-close,:host-context([data-theme=\"dark\"]) .christianity-dialog-close,:host-context(.dark) .christianity-floating-card-close,:host-context(.ion-palette-dark) .christianity-floating-card-close,:host-context(html.ion-palette-dark) .christianity-floating-card-close,:host-context(body.dark) .christianity-floating-card-close,:host-context([data-theme=\"dark\"]) .christianity-floating-card-close{border-color:#94a3b838;background:#0f172af0;color:var(--christianity-theme-ink);box-shadow:0 .35rem .8rem #0000004d}:host-context(.dark) .christianity-history-drawer header span,:host-context(.ion-palette-dark) .christianity-history-drawer header span,:host-context(html.ion-palette-dark) .christianity-history-drawer header span,:host-context(body.dark) .christianity-history-drawer header span,:host-context([data-theme=\"dark\"]) .christianity-history-drawer header span,:host-context(.dark) .christianity-rule-note strong,:host-context(.ion-palette-dark) .christianity-rule-note strong,:host-context(html.ion-palette-dark) .christianity-rule-note strong,:host-context(body.dark) .christianity-rule-note strong,:host-context([data-theme=\"dark\"]) .christianity-rule-note strong{background:#1e293beb}:host-context(.dark) .christianity-rule-note small,:host-context(.ion-palette-dark) .christianity-rule-note small,:host-context(html.ion-palette-dark) .christianity-rule-note small,:host-context(body.dark) .christianity-rule-note small,:host-context([data-theme=\"dark\"]) .christianity-rule-note small,:host-context(.dark) .christianity-preview-rule-note small,:host-context(.ion-palette-dark) .christianity-preview-rule-note small,:host-context(html.ion-palette-dark) .christianity-preview-rule-note small,:host-context(body.dark) .christianity-preview-rule-note small,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note small,:host-context(.dark) .christianity-gallery-drawer header p,:host-context(.ion-palette-dark) .christianity-gallery-drawer header p,:host-context(html.ion-palette-dark) .christianity-gallery-drawer header p,:host-context(body.dark) .christianity-gallery-drawer header p,:host-context([data-theme=\"dark\"]) .christianity-gallery-drawer header p,:host-context(.dark) .christianity-gallery-controls label,:host-context(.ion-palette-dark) .christianity-gallery-controls label,:host-context(html.ion-palette-dark) .christianity-gallery-controls label,:host-context(body.dark) .christianity-gallery-controls label,:host-context([data-theme=\"dark\"]) .christianity-gallery-controls label{color:#e2e8f0ad}:host-context(.dark) .christianity-rule-note p,:host-context(.ion-palette-dark) .christianity-rule-note p,:host-context(html.ion-palette-dark) .christianity-rule-note p,:host-context(body.dark) .christianity-rule-note p,:host-context([data-theme=\"dark\"]) .christianity-rule-note p,:host-context(.dark) .christianity-rule-note ul,:host-context(.ion-palette-dark) .christianity-rule-note ul,:host-context(html.ion-palette-dark) .christianity-rule-note ul,:host-context(body.dark) .christianity-rule-note ul,:host-context([data-theme=\"dark\"]) .christianity-rule-note ul,:host-context(.dark) .christianity-preview-rule-note p,:host-context(.ion-palette-dark) .christianity-preview-rule-note p,:host-context(html.ion-palette-dark) .christianity-preview-rule-note p,:host-context(body.dark) .christianity-preview-rule-note p,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note p,:host-context(.dark) .christianity-offerings-note p,:host-context(.ion-palette-dark) .christianity-offerings-note p,:host-context(html.ion-palette-dark) .christianity-offerings-note p,:host-context(body.dark) .christianity-offerings-note p,:host-context([data-theme=\"dark\"]) .christianity-offerings-note p{color:#e2e8f0cc}:host-context(.dark) .christianity-gallery-controls input,:host-context(.ion-palette-dark) .christianity-gallery-controls input,:host-context(html.ion-palette-dark) .christianity-gallery-controls input,:host-context(body.dark) .christianity-gallery-controls input,:host-context([data-theme=\"dark\"]) .christianity-gallery-controls input,:host-context(.dark) .christianity-gallery-controls select,:host-context(.ion-palette-dark) .christianity-gallery-controls select,:host-context(html.ion-palette-dark) .christianity-gallery-controls select,:host-context(body.dark) .christianity-gallery-controls select,:host-context([data-theme=\"dark\"]) .christianity-gallery-controls select,:host-context(.dark) .christianity-offering-row,:host-context(.ion-palette-dark) .christianity-offering-row,:host-context(html.ion-palette-dark) .christianity-offering-row,:host-context(body.dark) .christianity-offering-row,:host-context([data-theme=\"dark\"]) .christianity-offering-row,:host-context(.dark) .christianity-offerings-note,:host-context(.ion-palette-dark) .christianity-offerings-note,:host-context(html.ion-palette-dark) .christianity-offerings-note,:host-context(body.dark) .christianity-offerings-note,:host-context([data-theme=\"dark\"]) .christianity-offerings-note{border-color:#94a3b833;background:#0f172ac7;color:var(--christianity-theme-ink)}:host-context(.dark) .christianity-history-grid,:host-context(.ion-palette-dark) .christianity-history-grid,:host-context(html.ion-palette-dark) .christianity-history-grid,:host-context(body.dark) .christianity-history-grid,:host-context([data-theme=\"dark\"]) .christianity-history-grid,:host-context(.dark) .christianity-offering-list,:host-context(.ion-palette-dark) .christianity-offering-list,:host-context(html.ion-palette-dark) .christianity-offering-list,:host-context(body.dark) .christianity-offering-list,:host-context([data-theme=\"dark\"]) .christianity-offering-list,:host-context(.dark) .christianity-gallery-grid,:host-context(.ion-palette-dark) .christianity-gallery-grid,:host-context(html.ion-palette-dark) .christianity-gallery-grid,:host-context(body.dark) .christianity-gallery-grid,:host-context([data-theme=\"dark\"]) .christianity-gallery-grid,:host-context(.dark) .christianity-preview-rule-note,:host-context(.ion-palette-dark) .christianity-preview-rule-note,:host-context(html.ion-palette-dark) .christianity-preview-rule-note,:host-context(body.dark) .christianity-preview-rule-note,:host-context([data-theme=\"dark\"]) .christianity-preview-rule-note{scrollbar-color:rgba(148,163,184,.54) rgba(15,23,42,.86)}:host-context(.dark) .christianity-rule-note-icon,:host-context(.ion-palette-dark) .christianity-rule-note-icon,:host-context(html.ion-palette-dark) .christianity-rule-note-icon,:host-context(body.dark) .christianity-rule-note-icon,:host-context([data-theme=\"dark\"]) .christianity-rule-note-icon{background:#60a5fa29;color:#bfdbfe;box-shadow:inset 0 0 0 1px #93c5fd38}:host-context(.dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context(.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context(html.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context(body.dark) .christianity-history-grid::-webkit-scrollbar-track,:host-context([data-theme=\"dark\"]) .christianity-history-grid::-webkit-scrollbar-track,:host-context(.dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context(.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context(html.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context(body.dark) .christianity-offering-list::-webkit-scrollbar-track,:host-context([data-theme=\"dark\"]) .christianity-offering-list::-webkit-scrollbar-track,:host-context(.dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context(.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context(html.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context(body.dark) .christianity-gallery-grid::-webkit-scrollbar-track,:host-context([data-theme=\"dark\"]) .christianity-gallery-grid::-webkit-scrollbar-track{background:#0f172adb}:host-context(.dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(html.ion-palette-dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(body.dark) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context([data-theme=\"dark\"]) .christianity-history-grid::-webkit-scrollbar-thumb,:host-context(.dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(html.ion-palette-dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(body.dark) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context([data-theme=\"dark\"]) .christianity-offering-list::-webkit-scrollbar-thumb,:host-context(.dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context(.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context(html.ion-palette-dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context(body.dark) .christianity-gallery-grid::-webkit-scrollbar-thumb,:host-context([data-theme=\"dark\"]) .christianity-gallery-grid::-webkit-scrollbar-thumb{border-color:#0f172adb;background:#94a3b88a}@media (max-width: 720px){:host{overflow-x:hidden}.christianity-shell{padding:.55rem 0 .65rem;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-match-strip,.christianity-actions{box-sizing:border-box;width:100%;padding-right:max(.5rem,env(safe-area-inset-right));padding-left:max(.5rem,env(safe-area-inset-left))}.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-header-actions{align-items:flex-end;flex-direction:column}.christianity-start__cards,.christianity-start__hero{grid-template-columns:minmax(0,1fr)}.christianity-start__fan{min-height:10.5rem}.christianity-start__fan val-christianity-card{width:clamp(5.2rem,22vw,6.4rem)}.christianity-start__modes{grid-template-columns:repeat(2,minmax(0,1fr))}.christianity-splash,.christianity-start{min-height:min(30rem,calc(100dvh - 7rem));padding-right:max(.65rem,env(safe-area-inset-right));padding-left:max(.65rem,env(safe-area-inset-left));border-right:0;border-left:0;border-radius:0}.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{height:6.85rem;min-height:0;max-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-gallery-controls{grid-template-columns:minmax(0,1fr)}.christianity-gallery-grid{grid-template-columns:repeat(auto-fill,minmax(5.35rem,6.1rem));justify-content:center}.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"] }]
|
|
72904
|
+
}], ctorParameters: () => [] });
|
|
72905
|
+
|
|
69970
72906
|
addIcons({ refreshOutline, sparklesOutline, trophyOutline });
|
|
69971
72907
|
const BUBBLE_COLORS = {
|
|
69972
72908
|
rose: '#ff4f9f',
|
|
@@ -70023,6 +72959,7 @@ class BubbleBlitzGameComponent {
|
|
|
70023
72959
|
this.animating = signal(false);
|
|
70024
72960
|
this.leaderboard = signal(this.readLeaderboard());
|
|
70025
72961
|
this.confirmAction = signal(undefined);
|
|
72962
|
+
this.confirmedAction = signal(undefined);
|
|
70026
72963
|
this.config = computed(() => MODE_CONFIG[this.mode()]);
|
|
70027
72964
|
this.feverReady = computed(() => this.fever() >= this.config().feverTarget);
|
|
70028
72965
|
this.feverProgress = computed(() => Math.min(100, Math.round((this.fever() / this.config().feverTarget) * 100)));
|
|
@@ -70202,13 +73139,12 @@ class BubbleBlitzGameComponent {
|
|
|
70202
73139
|
closeConfirmModal() {
|
|
70203
73140
|
this.confirmAction.set(undefined);
|
|
70204
73141
|
}
|
|
70205
|
-
|
|
70206
|
-
if (token !== 'confirm') {
|
|
70207
|
-
this.closeConfirmModal();
|
|
70208
|
-
return;
|
|
70209
|
-
}
|
|
70210
|
-
const action = this.confirmAction();
|
|
73142
|
+
handleConfirmModalDismissed() {
|
|
70211
73143
|
this.confirmAction.set(undefined);
|
|
73144
|
+
const action = this.confirmedAction();
|
|
73145
|
+
this.confirmedAction.set(undefined);
|
|
73146
|
+
if (!action)
|
|
73147
|
+
return;
|
|
70212
73148
|
if (action === 'restart') {
|
|
70213
73149
|
this.start();
|
|
70214
73150
|
return;
|
|
@@ -70221,6 +73157,15 @@ class BubbleBlitzGameComponent {
|
|
|
70221
73157
|
this.resetToGamesMenu();
|
|
70222
73158
|
}
|
|
70223
73159
|
}
|
|
73160
|
+
confirmPendingAction(token) {
|
|
73161
|
+
if (token !== 'confirm') {
|
|
73162
|
+
this.closeConfirmModal();
|
|
73163
|
+
return;
|
|
73164
|
+
}
|
|
73165
|
+
const action = this.confirmAction();
|
|
73166
|
+
this.confirmedAction.set(action);
|
|
73167
|
+
this.confirmAction.set(undefined);
|
|
73168
|
+
}
|
|
70224
73169
|
startTimer() {
|
|
70225
73170
|
this.stopTimer();
|
|
70226
73171
|
this.timer = window.setInterval(() => {
|
|
@@ -70524,7 +73469,7 @@ class BubbleBlitzGameComponent {
|
|
|
70524
73469
|
<ion-modal
|
|
70525
73470
|
[isOpen]="!!confirmAction()"
|
|
70526
73471
|
cssClass="val-modal-adaptive"
|
|
70527
|
-
(didDismiss)="
|
|
73472
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
70528
73473
|
>
|
|
70529
73474
|
<ng-template>
|
|
70530
73475
|
<val-modal-layout
|
|
@@ -70674,7 +73619,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
70674
73619
|
<ion-modal
|
|
70675
73620
|
[isOpen]="!!confirmAction()"
|
|
70676
73621
|
cssClass="val-modal-adaptive"
|
|
70677
|
-
(didDismiss)="
|
|
73622
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
70678
73623
|
>
|
|
70679
73624
|
<ng-template>
|
|
70680
73625
|
<val-modal-layout
|
|
@@ -70738,6 +73683,7 @@ class MemoryGameComponent {
|
|
|
70738
73683
|
this.lockBoard = signal(false);
|
|
70739
73684
|
this.leaderboard = signal(this.readLeaderboard());
|
|
70740
73685
|
this.confirmAction = signal(undefined);
|
|
73686
|
+
this.confirmedAction = signal(undefined);
|
|
70741
73687
|
this.profileConfig = computed(() => PROFILE_CONFIG[this.profile()]);
|
|
70742
73688
|
this.pairCount = computed(() => this.profileConfig().pairs);
|
|
70743
73689
|
this.boardClass = computed(() => `memory-board ${this.profileConfig().boardClass}`);
|
|
@@ -70875,13 +73821,12 @@ class MemoryGameComponent {
|
|
|
70875
73821
|
closeConfirmModal() {
|
|
70876
73822
|
this.confirmAction.set(undefined);
|
|
70877
73823
|
}
|
|
70878
|
-
|
|
70879
|
-
if (token !== 'confirm') {
|
|
70880
|
-
this.closeConfirmModal();
|
|
70881
|
-
return;
|
|
70882
|
-
}
|
|
70883
|
-
const action = this.confirmAction();
|
|
73824
|
+
handleConfirmModalDismissed() {
|
|
70884
73825
|
this.confirmAction.set(undefined);
|
|
73826
|
+
const action = this.confirmedAction();
|
|
73827
|
+
this.confirmedAction.set(undefined);
|
|
73828
|
+
if (!action)
|
|
73829
|
+
return;
|
|
70885
73830
|
if (action === 'restart') {
|
|
70886
73831
|
this.start();
|
|
70887
73832
|
return;
|
|
@@ -70894,6 +73839,15 @@ class MemoryGameComponent {
|
|
|
70894
73839
|
this.resetToGamesMenu();
|
|
70895
73840
|
}
|
|
70896
73841
|
}
|
|
73842
|
+
confirmPendingAction(token) {
|
|
73843
|
+
if (token !== 'confirm') {
|
|
73844
|
+
this.closeConfirmModal();
|
|
73845
|
+
return;
|
|
73846
|
+
}
|
|
73847
|
+
const action = this.confirmAction();
|
|
73848
|
+
this.confirmedAction.set(action);
|
|
73849
|
+
this.confirmAction.set(undefined);
|
|
73850
|
+
}
|
|
70897
73851
|
flip(card) {
|
|
70898
73852
|
if (this.lockBoard() || card.flipped || card.matched || this.won() || this.failed())
|
|
70899
73853
|
return;
|
|
@@ -71208,7 +74162,7 @@ class MemoryGameComponent {
|
|
|
71208
74162
|
<ion-modal
|
|
71209
74163
|
[isOpen]="!!confirmAction()"
|
|
71210
74164
|
cssClass="val-modal-adaptive"
|
|
71211
|
-
(didDismiss)="
|
|
74165
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
71212
74166
|
>
|
|
71213
74167
|
<ng-template>
|
|
71214
74168
|
<val-modal-layout
|
|
@@ -71366,7 +74320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
71366
74320
|
<ion-modal
|
|
71367
74321
|
[isOpen]="!!confirmAction()"
|
|
71368
74322
|
cssClass="val-modal-adaptive"
|
|
71369
|
-
(didDismiss)="
|
|
74323
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
71370
74324
|
>
|
|
71371
74325
|
<ng-template>
|
|
71372
74326
|
<val-modal-layout
|
|
@@ -71712,6 +74666,7 @@ class SimonGameComponent {
|
|
|
71712
74666
|
this.activePad = signal(undefined);
|
|
71713
74667
|
this.leaderboard = signal(this.readLeaderboard());
|
|
71714
74668
|
this.confirmAction = signal(undefined);
|
|
74669
|
+
this.confirmedAction = signal(undefined);
|
|
71715
74670
|
this.modeConfig = computed(() => SIMON_MODES[this.mode()]);
|
|
71716
74671
|
this.bestRound = computed(() => this.modeLeaderboard()[0]?.round ?? 0);
|
|
71717
74672
|
this.modeLeaderboard = computed(() => this.leaderboard()
|
|
@@ -71811,13 +74766,12 @@ class SimonGameComponent {
|
|
|
71811
74766
|
closeConfirmModal() {
|
|
71812
74767
|
this.confirmAction.set(undefined);
|
|
71813
74768
|
}
|
|
71814
|
-
|
|
71815
|
-
if (token !== 'confirm') {
|
|
71816
|
-
this.closeConfirmModal();
|
|
71817
|
-
return;
|
|
71818
|
-
}
|
|
71819
|
-
const action = this.confirmAction();
|
|
74769
|
+
handleConfirmModalDismissed() {
|
|
71820
74770
|
this.confirmAction.set(undefined);
|
|
74771
|
+
const action = this.confirmedAction();
|
|
74772
|
+
this.confirmedAction.set(undefined);
|
|
74773
|
+
if (!action)
|
|
74774
|
+
return;
|
|
71821
74775
|
if (action === 'restart') {
|
|
71822
74776
|
this.start();
|
|
71823
74777
|
return;
|
|
@@ -71830,6 +74784,15 @@ class SimonGameComponent {
|
|
|
71830
74784
|
this.resetToGamesMenu();
|
|
71831
74785
|
}
|
|
71832
74786
|
}
|
|
74787
|
+
confirmPendingAction(token) {
|
|
74788
|
+
if (token !== 'confirm') {
|
|
74789
|
+
this.closeConfirmModal();
|
|
74790
|
+
return;
|
|
74791
|
+
}
|
|
74792
|
+
const action = this.confirmAction();
|
|
74793
|
+
this.confirmedAction.set(action);
|
|
74794
|
+
this.confirmAction.set(undefined);
|
|
74795
|
+
}
|
|
71833
74796
|
tap(pad) {
|
|
71834
74797
|
if (this.phase() !== 'waiting' || !this.acceptingInput)
|
|
71835
74798
|
return;
|
|
@@ -72073,7 +75036,7 @@ class SimonGameComponent {
|
|
|
72073
75036
|
<ion-modal
|
|
72074
75037
|
[isOpen]="!!confirmAction()"
|
|
72075
75038
|
cssClass="val-modal-adaptive"
|
|
72076
|
-
(didDismiss)="
|
|
75039
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
72077
75040
|
>
|
|
72078
75041
|
<ng-template>
|
|
72079
75042
|
<val-modal-layout
|
|
@@ -72203,7 +75166,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
72203
75166
|
<ion-modal
|
|
72204
75167
|
[isOpen]="!!confirmAction()"
|
|
72205
75168
|
cssClass="val-modal-adaptive"
|
|
72206
|
-
(didDismiss)="
|
|
75169
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
72207
75170
|
>
|
|
72208
75171
|
<ng-template>
|
|
72209
75172
|
<val-modal-layout
|
|
@@ -87519,5 +90482,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
87519
90482
|
* Generated bundle index. Do not edit.
|
|
87520
90483
|
*/
|
|
87521
90484
|
|
|
87522
|
-
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 };
|
|
90485
|
+
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 };
|
|
87523
90486
|
//# sourceMappingURL=valtech-components.mjs.map
|