valtech-components 4.0.470 → 4.0.471
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 +260 -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 +3013 -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 +1 -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.471';
|
|
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}',
|
|
@@ -63029,7 +63311,7 @@ const MINI_GAMES_I18N = {
|
|
|
63029
63311
|
chessimalsTutorialStep4Title: 'Devuelve el turno',
|
|
63030
63312
|
chessimalsTutorialStep4Body: 'Mueve el peón negro de la columna F una casilla hacia abajo para continuar.',
|
|
63031
63313
|
chessimalsTutorialStep5Title: 'Usa el poder Canguro',
|
|
63032
|
-
chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro.',
|
|
63314
|
+
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.',
|
|
63033
63315
|
chessimalsTutorialStep6Title: 'Prepara la llegada',
|
|
63034
63316
|
chessimalsTutorialStep6Body: 'Mueve el último peón negro hacia abajo. Después tendrás camino para ganar.',
|
|
63035
63317
|
chessimalsTutorialStep7Title: 'Llega a la última fila',
|
|
@@ -63102,6 +63384,121 @@ const MINI_GAMES_I18N = {
|
|
|
63102
63384
|
bubbleDescription: 'Pop bubble groups, chain combos, and push your score higher.',
|
|
63103
63385
|
chessimalsTitle: 'Chessimals',
|
|
63104
63386
|
chessimalsDescription: 'A pawn race with animal cards and tactical powers.',
|
|
63387
|
+
christianityTitle: 'Christianity',
|
|
63388
|
+
christianityDescription: 'A family card game with leaders, offerings, and tactical choices.',
|
|
63389
|
+
christianityEyebrow: 'Table MVP',
|
|
63390
|
+
christianityTable: 'Christianity table',
|
|
63391
|
+
christianitySplashEyebrow: 'Genesis 1',
|
|
63392
|
+
christianitySplashTitle: 'Preparing table',
|
|
63393
|
+
christianitySplashLoading: 'Loading real cards and building the tutorial deck.',
|
|
63394
|
+
christianitySplashReady: 'Deck ready. You can enter the tutorial.',
|
|
63395
|
+
christianitySplashFallback: 'The real edition could not be loaded. The test deck will be used.',
|
|
63396
|
+
christianityStartTitle: 'Choose how to enter',
|
|
63397
|
+
christianityStartBody: 'Play a small tutorial with real cards or browse the full edition in the gallery.',
|
|
63398
|
+
christianityTutorialMode: 'MVP tutorial',
|
|
63399
|
+
christianityTutorialModeBody: 'A reduced table with leaders, offerings, and simple characters to test the match flow.',
|
|
63400
|
+
christianityStartTutorial: 'Play tutorial',
|
|
63401
|
+
christianityGalleryModeBody: 'Explore the ordered edition, filter by type, and open the card preview.',
|
|
63402
|
+
christianityOpenGallery: 'Open gallery',
|
|
63403
|
+
christianityHowToPlay: 'How to play',
|
|
63404
|
+
christianityHowToPlayBody: 'Review goal, turn flow, offerings, and battle before entering the table.',
|
|
63405
|
+
christianityHowToPlayIntro: 'Christianity uses a shared deck. The heart of the game is adapting to what appears and choosing when to spend offerings.',
|
|
63406
|
+
christianityHowToPlayGoal: 'Win by reducing the rival leader life to 0, or by having more life if the deck runs out.',
|
|
63407
|
+
christianityHowToPlayTurn: 'On your turn you ready offerings, draw a card, play cards, and then may attack.',
|
|
63408
|
+
christianityHowToPlayOfferings: 'You can play only one offering from your hand each turn. Ready offerings pay costs.',
|
|
63409
|
+
christianityHowToPlayBattle: 'If the rival has characters, you must attack characters before the leader.',
|
|
63410
|
+
christianityEditionStatus: 'Edition status',
|
|
63411
|
+
christianityTutorialActive: 'MVP tutorial active',
|
|
63412
|
+
christianityCatalogReady: 'Real catalog loaded',
|
|
63413
|
+
christianityCatalogFallback: 'Test deck active',
|
|
63414
|
+
christianityCatalogLoading: 'Loading catalog',
|
|
63415
|
+
christianityFutureModes: 'Future modes',
|
|
63416
|
+
christianitySoloBotMode: 'Solo with bot',
|
|
63417
|
+
christianitySoloBotModeBody: 'A guided match to practice turns, offerings, and combat.',
|
|
63418
|
+
christianityTwoPlayerMode: 'Two players',
|
|
63419
|
+
christianityTwoPlayerModeBody: 'Online match with synced state and private hands.',
|
|
63420
|
+
christianityOneDeviceMode: 'One device',
|
|
63421
|
+
christianityOneDeviceModeBody: 'Local mode for family play by passing the device.',
|
|
63422
|
+
christianitySpectatorMode: 'Spectator',
|
|
63423
|
+
christianitySpectatorModeBody: 'Public table to watch matches without revealing private information.',
|
|
63424
|
+
christianityTurn: 'Turn',
|
|
63425
|
+
christianityOfferings: 'Offerings',
|
|
63426
|
+
christianityHand: 'Hand',
|
|
63427
|
+
christianityOpponentBattle: 'Opponent battle zone',
|
|
63428
|
+
christianityYourBattle: 'Your battle zone',
|
|
63429
|
+
christianityOpponentHand: 'Opponent hand',
|
|
63430
|
+
christianitySharedZone: 'Shared zone',
|
|
63431
|
+
christianityMatch: 'Match',
|
|
63432
|
+
christianityMatchScore: 'Match score',
|
|
63433
|
+
christianityHistory: 'History',
|
|
63434
|
+
christianityDeck: 'Deck',
|
|
63435
|
+
christianityPlace: 'Place',
|
|
63436
|
+
christianityEmpty: 'Empty',
|
|
63437
|
+
christianityYourHand: 'Your hand',
|
|
63438
|
+
christianityCost: 'Cost',
|
|
63439
|
+
christianityOfferingCard: 'Offering',
|
|
63440
|
+
christianityCharacterCard: 'Character',
|
|
63441
|
+
christianityLeaderCard: 'Leader',
|
|
63442
|
+
christianityWisdomCard: 'Wisdom',
|
|
63443
|
+
christianityActionCard: 'Action',
|
|
63444
|
+
christianityToolCard: 'Tool',
|
|
63445
|
+
christianityPlaceCard: 'Place',
|
|
63446
|
+
christianityEventCard: 'Event',
|
|
63447
|
+
christianityCardRule: 'Card rule',
|
|
63448
|
+
christianityHiddenCard: 'Hidden card',
|
|
63449
|
+
christianityPreviewCard: 'Preview card',
|
|
63450
|
+
christianityEndTurn: 'End turn',
|
|
63451
|
+
christianityPlayCard: 'Play card',
|
|
63452
|
+
christianityPlayOffering: 'Play offering',
|
|
63453
|
+
christianityPlayHere: 'Play here',
|
|
63454
|
+
christianityReset: 'Reset mock',
|
|
63455
|
+
christianityWaitTurn: 'Wait for the opponent turn.',
|
|
63456
|
+
christianityChooseTarget: 'Choose a target to attack.',
|
|
63457
|
+
christianityChooseCharacterTarget: 'The opponent has characters: attack them before the leader.',
|
|
63458
|
+
christianityReadyToPlay: 'You can play this card.',
|
|
63459
|
+
christianityChooseSlot: 'Choose an available slot to play this card.',
|
|
63460
|
+
christianityPlaceOffering: 'You can play this offering with the action button.',
|
|
63461
|
+
christianityNeedOfferings: 'You need more offerings to play that card.',
|
|
63462
|
+
christianityChooseCard: 'Choose a card or a ready character.',
|
|
63463
|
+
christianityLeaderProtected: 'You cannot attack the leader directly while they have characters in battle.',
|
|
63464
|
+
christianityLeaderBody: 'If this leader reaches 0 life, the game ends.',
|
|
63465
|
+
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.',
|
|
63466
|
+
christianityOfferingReady: 'Ready',
|
|
63467
|
+
christianityOfferingExhausted: 'Exhausted',
|
|
63468
|
+
christianityOfferingBody: 'Exhaust it to pay costs. It readies again at the start of your turn.',
|
|
63469
|
+
christianityOfferingNoAbility: 'This offering has no active ability.',
|
|
63470
|
+
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.',
|
|
63471
|
+
christianityOfferingRuleBody: 'Play it from your hand into the offering pile. You can play only one offering per turn. Its available points pay costs.',
|
|
63472
|
+
christianityWisdomRuleBody: 'Wisdom cards provide tactical effects during your turn. In the tutorial you can inspect them, but they do not resolve yet.',
|
|
63473
|
+
christianityActionRuleBody: 'Actions are direct offensive or defensive plays. Later they will be able to respond during the battle phase.',
|
|
63474
|
+
christianityToolRuleBody: 'Tools attach to characters to improve or protect their stats.',
|
|
63475
|
+
christianityPlaceRuleBody: 'Places change the table for both players. Only one place can be active at a time.',
|
|
63476
|
+
christianityEventRuleBody: 'Events represent global moments that affect the match and then move to history.',
|
|
63477
|
+
christianityUseAbility: 'Use',
|
|
63478
|
+
christianityCloseOfferings: 'Close offerings',
|
|
63479
|
+
christianityCharacterBody: 'Enters battle and must wait one turn before attacking.',
|
|
63480
|
+
christianityCharacterRuleBody: 'Play it into an open battle slot. It must wait one turn before attacking unless an ability says otherwise.',
|
|
63481
|
+
christianityCharacterReady: 'Ready to attack.',
|
|
63482
|
+
christianityCharacterExhausted: 'Cannot attack yet.',
|
|
63483
|
+
christianityCardRemaining: 'card remaining',
|
|
63484
|
+
christianityCardsRemaining: 'cards remaining',
|
|
63485
|
+
christianityDeckBody: 'The deck is a shared pile. Both players draw from it, so the match rewards adapting to what appears and managing the pace.',
|
|
63486
|
+
christianityDeckRuleShared: 'All playable cards live in this shared deck, including characters and offerings.',
|
|
63487
|
+
christianityDeckRuleDraw: 'At the start of each turn, the active player draws the first available card.',
|
|
63488
|
+
christianityDeckRuleEmpty: 'If the deck runs out, the leader life victory condition is checked at the end of the turn.',
|
|
63489
|
+
christianityClosePreview: 'Close card preview',
|
|
63490
|
+
christianityCloseHistory: 'Close history',
|
|
63491
|
+
christianityHistoryEmpty: 'There are no cards in history yet.',
|
|
63492
|
+
christianityGallery: 'Gallery',
|
|
63493
|
+
christianityCloseGallery: 'Close gallery',
|
|
63494
|
+
christianityGallerySearch: 'Search',
|
|
63495
|
+
christianityGallerySearchPlaceholder: 'Name, text, or reference',
|
|
63496
|
+
christianityGalleryFilter: 'Type',
|
|
63497
|
+
christianityGalleryEmpty: 'No cards match this filter.',
|
|
63498
|
+
christianityGenesisEdition: 'Genesis 1',
|
|
63499
|
+
christianityAllCards: 'All',
|
|
63500
|
+
christianityCards: 'cards',
|
|
63501
|
+
christianityTutorialLoaded: 'Tutorial loaded with real Genesis 1 cards.',
|
|
63105
63502
|
soonTitle: 'Coming soon',
|
|
63106
63503
|
openGame: 'Play',
|
|
63107
63504
|
close: 'Close',
|
|
@@ -63226,10 +63623,10 @@ const MINI_GAMES_I18N = {
|
|
|
63226
63623
|
chessimalsRulePowersTitle: 'When powers unlock',
|
|
63227
63624
|
chessimalsRulePowersBody: 'Your cards unlock when one of your pawns crosses the center line, or when a rival pawn enters your half of the board.',
|
|
63228
63625
|
chessimalsRuleCardsTitle: 'Animal cards',
|
|
63229
|
-
chessimalsRuleEagle: 'Eagle: moves
|
|
63230
|
-
chessimalsRuleBull: 'Bull: moves
|
|
63626
|
+
chessimalsRuleEagle: 'Eagle: moves diagonally across the whole board, forward or backward, without entering the final row.',
|
|
63627
|
+
chessimalsRuleBull: 'Bull: moves in a straight line across the whole board, including sideways, without entering the final row.',
|
|
63231
63628
|
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.',
|
|
63232
|
-
chessimalsRuleLion: 'Lion: moves
|
|
63629
|
+
chessimalsRuleLion: 'Lion: moves in any direction across the whole board, without entering the final row.',
|
|
63233
63630
|
chessimalsRuleLimitsTitle: 'Balance rules',
|
|
63234
63631
|
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.',
|
|
63235
63632
|
chessimalsBoardSize: 'Board size',
|
|
@@ -63342,6 +63739,18 @@ const MINI_GAMES_I18N = {
|
|
|
63342
63739
|
chessimalsBotSprinterBody: 'Optimizes promotion routes.',
|
|
63343
63740
|
chessimalsBotSentinel: 'Sentinel',
|
|
63344
63741
|
chessimalsBotSentinelBody: 'Defends solidly and punishes mistakes.',
|
|
63742
|
+
chessimalsBotOracle: 'Oracle',
|
|
63743
|
+
chessimalsBotOracleBody: 'Reads replies and avoids deep traps.',
|
|
63744
|
+
chessimalsBotAmbusher: 'Ambusher',
|
|
63745
|
+
chessimalsBotAmbusherBody: 'Sets up double captures with long powers.',
|
|
63746
|
+
chessimalsBotLocksmith: 'Locksmith',
|
|
63747
|
+
chessimalsBotLocksmithBody: 'Closes the center and reduces your routes.',
|
|
63748
|
+
chessimalsBotStorm: 'Storm',
|
|
63749
|
+
chessimalsBotStormBody: 'Uses long powers to pressure the whole board.',
|
|
63750
|
+
chessimalsBotMatriarch: 'Matriarch',
|
|
63751
|
+
chessimalsBotMatriarchBody: 'Protects structure and wins by attrition.',
|
|
63752
|
+
chessimalsBotEndgame: 'Endgame',
|
|
63753
|
+
chessimalsBotEndgameBody: 'Turns small edges into promotion.',
|
|
63345
63754
|
chessimalsBotExplorerTendency: 'Tends to vary routes, test the center, and make soft mistakes.',
|
|
63346
63755
|
chessimalsBotImpulsiveTendency: 'Tends to capture quickly, even when it can become exposed.',
|
|
63347
63756
|
chessimalsBotRunnerTendency: 'Tends to push toward promotion before defending.',
|
|
@@ -63352,6 +63761,12 @@ const MINI_GAMES_I18N = {
|
|
|
63352
63761
|
chessimalsBotPredatorTendency: 'Tends to force captures and use aggressive powers.',
|
|
63353
63762
|
chessimalsBotSprinterTendency: 'Tends to find fast promotion paths.',
|
|
63354
63763
|
chessimalsBotSentinelTendency: 'Tends to defend solidly and punish mistakes.',
|
|
63764
|
+
chessimalsBotOracleTendency: 'Tends to anticipate replies and choose hard-to-refute moves.',
|
|
63765
|
+
chessimalsBotAmbusherTendency: 'Tends to leave pieces under multiple threats before capturing.',
|
|
63766
|
+
chessimalsBotLocksmithTendency: 'Tends to close central routes and leave you without good squares.',
|
|
63767
|
+
chessimalsBotStormTendency: 'Tends to turn long powers into pressure from several angles.',
|
|
63768
|
+
chessimalsBotMatriarchTendency: 'Tends to preserve pieces and trade only when it improves.',
|
|
63769
|
+
chessimalsBotEndgameTendency: 'Tends to simplify and race toward promotion when ahead.',
|
|
63355
63770
|
chessimalsBotReportTitle: 'Bot report',
|
|
63356
63771
|
chessimalsBotReportVs: 'Against {bot}',
|
|
63357
63772
|
chessimalsBotReportBody: '{outcome}. It made {captures} captures and used {powers} powers. {style}',
|
|
@@ -63509,7 +63924,7 @@ const MINI_GAMES_I18N = {
|
|
|
63509
63924
|
chessimalsTutorialStep4Title: 'Return the turn',
|
|
63510
63925
|
chessimalsTutorialStep4Body: 'Move the black pawn on file F one square downward to continue.',
|
|
63511
63926
|
chessimalsTutorialStep5Title: 'Use the Kangaroo power',
|
|
63512
|
-
chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn.',
|
|
63927
|
+
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.',
|
|
63513
63928
|
chessimalsTutorialStep6Title: 'Prepare the finish',
|
|
63514
63929
|
chessimalsTutorialStep6Body: 'Move the last black pawn downward. Then your path to win is open.',
|
|
63515
63930
|
chessimalsTutorialStep7Title: 'Reach the last row',
|
|
@@ -64725,6 +65140,7 @@ class ChessimalsGameComponent {
|
|
|
64725
65140
|
});
|
|
64726
65141
|
this.botThinking = signal(false);
|
|
64727
65142
|
this.confirmAction = signal(undefined);
|
|
65143
|
+
this.confirmedAction = signal(undefined);
|
|
64728
65144
|
this.onlineJoinCode = signal('');
|
|
64729
65145
|
this.onlineLoading = signal(false);
|
|
64730
65146
|
this.onlineAction = signal(undefined);
|
|
@@ -65751,13 +66167,12 @@ class ChessimalsGameComponent {
|
|
|
65751
66167
|
closeConfirmModal() {
|
|
65752
66168
|
this.confirmAction.set(undefined);
|
|
65753
66169
|
}
|
|
65754
|
-
|
|
65755
|
-
if (token !== 'confirm') {
|
|
65756
|
-
this.closeConfirmModal();
|
|
65757
|
-
return;
|
|
65758
|
-
}
|
|
65759
|
-
const action = this.confirmAction();
|
|
66170
|
+
handleConfirmModalDismissed() {
|
|
65760
66171
|
this.confirmAction.set(undefined);
|
|
66172
|
+
const action = this.confirmedAction();
|
|
66173
|
+
this.confirmedAction.set(undefined);
|
|
66174
|
+
if (!action)
|
|
66175
|
+
return;
|
|
65761
66176
|
if (action === 'restart') {
|
|
65762
66177
|
this.restartGame();
|
|
65763
66178
|
return;
|
|
@@ -65779,6 +66194,15 @@ class ChessimalsGameComponent {
|
|
|
65779
66194
|
this.createNewChallengeRun();
|
|
65780
66195
|
}
|
|
65781
66196
|
}
|
|
66197
|
+
confirmPendingAction(token) {
|
|
66198
|
+
if (token !== 'confirm') {
|
|
66199
|
+
this.closeConfirmModal();
|
|
66200
|
+
return;
|
|
66201
|
+
}
|
|
66202
|
+
const action = this.confirmAction();
|
|
66203
|
+
this.confirmedAction.set(action);
|
|
66204
|
+
this.confirmAction.set(undefined);
|
|
66205
|
+
}
|
|
65782
66206
|
resignGame() {
|
|
65783
66207
|
const game = this.game();
|
|
65784
66208
|
if (game.status === 'finished')
|
|
@@ -68547,7 +68971,7 @@ class ChessimalsGameComponent {
|
|
|
68547
68971
|
<ion-modal
|
|
68548
68972
|
[isOpen]="!!confirmAction()"
|
|
68549
68973
|
cssClass="val-modal-adaptive"
|
|
68550
|
-
(didDismiss)="
|
|
68974
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
68551
68975
|
>
|
|
68552
68976
|
<ng-template>
|
|
68553
68977
|
<val-modal-layout
|
|
@@ -69748,7 +70172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
69748
70172
|
<ion-modal
|
|
69749
70173
|
[isOpen]="!!confirmAction()"
|
|
69750
70174
|
cssClass="val-modal-adaptive"
|
|
69751
|
-
(didDismiss)="
|
|
70175
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
69752
70176
|
>
|
|
69753
70177
|
<ng-template>
|
|
69754
70178
|
<val-modal-layout
|
|
@@ -69774,6 +70198,2510 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
69774
70198
|
type: Input
|
|
69775
70199
|
}] } });
|
|
69776
70200
|
|
|
70201
|
+
class ChristianityCardComponent {
|
|
70202
|
+
constructor() {
|
|
70203
|
+
this.card = input.required();
|
|
70204
|
+
this.variant = input('table');
|
|
70205
|
+
this.normalizedTypeLabel = computed(() => this.card().typeLabel.toUpperCase());
|
|
70206
|
+
this.frontTemplate = computed(() => this.card().frontTemplate ?? 'genesis-classic');
|
|
70207
|
+
this.isGenesisClassicTemplate = computed(() => this.frontTemplate() === 'genesis-classic' || this.frontTemplate() === 'genesis-classic-extra');
|
|
70208
|
+
this.typeIconUrl = computed(() => `assets/games/christianity/icons/${this.iconName(this.card().type)}.png`);
|
|
70209
|
+
this.headerMetric = computed(() => {
|
|
70210
|
+
const card = this.card();
|
|
70211
|
+
if (card.type === 'leader')
|
|
70212
|
+
return null;
|
|
70213
|
+
if (card.type === 'offering')
|
|
70214
|
+
return { kind: 'pips', value: card.offeringValue ?? 0 };
|
|
70215
|
+
if (typeof card.cost === 'number')
|
|
70216
|
+
return { kind: 'number', value: card.cost };
|
|
70217
|
+
return null;
|
|
70218
|
+
});
|
|
70219
|
+
this.cardStatsText = computed(() => {
|
|
70220
|
+
const card = this.card();
|
|
70221
|
+
if (card.type !== 'character')
|
|
70222
|
+
return '';
|
|
70223
|
+
return `${card.attack ?? 0} / ${card.currentHp ?? card.life ?? 0}`;
|
|
70224
|
+
});
|
|
70225
|
+
this.leaderLifeText = computed(() => {
|
|
70226
|
+
const card = this.card();
|
|
70227
|
+
const current = card.currentHp ?? card.life ?? 0;
|
|
70228
|
+
const max = card.maxHp ?? card.life ?? current;
|
|
70229
|
+
return `${current}/${max}`;
|
|
70230
|
+
});
|
|
70231
|
+
}
|
|
70232
|
+
offeringPips(value) {
|
|
70233
|
+
const count = Number(value);
|
|
70234
|
+
if (!Number.isFinite(count) || count <= 0)
|
|
70235
|
+
return [];
|
|
70236
|
+
return Array.from({ length: Math.min(Math.floor(count), 5) });
|
|
70237
|
+
}
|
|
70238
|
+
iconName(type) {
|
|
70239
|
+
if (type === 'character')
|
|
70240
|
+
return 'character';
|
|
70241
|
+
if (type === 'offering')
|
|
70242
|
+
return 'offering';
|
|
70243
|
+
if (type === 'leader')
|
|
70244
|
+
return 'leader';
|
|
70245
|
+
return type;
|
|
70246
|
+
}
|
|
70247
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70248
|
+
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: `
|
|
70249
|
+
@if (variant() === 'back') {
|
|
70250
|
+
<article class="christianity-card-render christianity-card-render--back" aria-hidden="true">
|
|
70251
|
+
<span></span>
|
|
70252
|
+
</article>
|
|
70253
|
+
} @else {
|
|
70254
|
+
<article
|
|
70255
|
+
class="christianity-card-render"
|
|
70256
|
+
[class.christianity-card-render--full]="variant() === 'full'"
|
|
70257
|
+
[class.christianity-card-render--table]="variant() === 'table'"
|
|
70258
|
+
[class.christianity-card-render--hand]="variant() === 'hand'"
|
|
70259
|
+
[class.christianity-card-render--list]="variant() === 'list'"
|
|
70260
|
+
[class.christianity-card-render--template-genesis-classic]="isGenesisClassicTemplate()"
|
|
70261
|
+
[class.christianity-card-render--template-genesis-full-art]="frontTemplate() === 'genesis-full-art'"
|
|
70262
|
+
[class.is-leader]="card().type === 'leader'"
|
|
70263
|
+
[class.is-offering]="card().type === 'offering'"
|
|
70264
|
+
>
|
|
70265
|
+
<header class="christianity-card-render__header">
|
|
70266
|
+
<span class="christianity-card-render__type-icon" aria-hidden="true">
|
|
70267
|
+
<img [src]="typeIconUrl()" alt="" />
|
|
70268
|
+
</span>
|
|
70269
|
+
<strong>{{ card().name }}</strong>
|
|
70270
|
+
@if (headerMetric(); as metric) {
|
|
70271
|
+
<span class="christianity-card-render__metric" [class.is-pips]="metric.kind === 'pips'">
|
|
70272
|
+
@if (metric.kind === 'pips') {
|
|
70273
|
+
@for (_ of offeringPips(metric.value); track $index) {
|
|
70274
|
+
<i aria-hidden="true"></i>
|
|
70275
|
+
}
|
|
70276
|
+
} @else {
|
|
70277
|
+
{{ metric.value }}
|
|
70278
|
+
}
|
|
70279
|
+
</span>
|
|
70280
|
+
}
|
|
70281
|
+
</header>
|
|
70282
|
+
|
|
70283
|
+
<section class="christianity-card-render__art" [class.has-image]="card().imageUrl">
|
|
70284
|
+
@if (card().imageUrl) {
|
|
70285
|
+
<img [src]="card().imageUrl" [alt]="card().name" />
|
|
70286
|
+
} @else {
|
|
70287
|
+
<span>{{ card().name }}</span>
|
|
70288
|
+
}
|
|
70289
|
+
<small>{{ normalizedTypeLabel() }}</small>
|
|
70290
|
+
</section>
|
|
70291
|
+
|
|
70292
|
+
@if (variant() === 'full') {
|
|
70293
|
+
<section class="christianity-card-render__verse">
|
|
70294
|
+
@if (card().verseText) {
|
|
70295
|
+
<p>{{ card().verseText }}</p>
|
|
70296
|
+
}
|
|
70297
|
+
@if (card().scripture) {
|
|
70298
|
+
<strong>{{ card().scripture }}</strong>
|
|
70299
|
+
}
|
|
70300
|
+
</section>
|
|
70301
|
+
}
|
|
70302
|
+
|
|
70303
|
+
<section class="christianity-card-render__effect">
|
|
70304
|
+
@if (card().editionIcon) {
|
|
70305
|
+
<img class="christianity-card-render__edition-watermark" [src]="card().editionIcon" alt="" aria-hidden="true" />
|
|
70306
|
+
}
|
|
70307
|
+
<div class="christianity-card-render__stats">
|
|
70308
|
+
@if (card().type === 'offering') {
|
|
70309
|
+
<strong class="is-pips">
|
|
70310
|
+
@for (_ of offeringPips(card().offeringValue); track $index) {
|
|
70311
|
+
<i aria-hidden="true"></i>
|
|
70312
|
+
}
|
|
70313
|
+
</strong>
|
|
70314
|
+
} @else if (card().type === 'leader') {
|
|
70315
|
+
<strong>{{ leaderLifeText() }}</strong>
|
|
70316
|
+
} @else if (cardStatsText()) {
|
|
70317
|
+
<strong>{{ cardStatsText() }}</strong>
|
|
70318
|
+
}
|
|
70319
|
+
</div>
|
|
70320
|
+
@if (variant() === 'full') {
|
|
70321
|
+
<div class="christianity-card-render__text">
|
|
70322
|
+
@if (card().abilityName) {
|
|
70323
|
+
<strong>{{ card().abilityName }}</strong>
|
|
70324
|
+
}
|
|
70325
|
+
@if (card().abilityText || card().statusText) {
|
|
70326
|
+
<p>{{ card().abilityText || card().statusText }}</p>
|
|
70327
|
+
}
|
|
70328
|
+
</div>
|
|
70329
|
+
<span
|
|
70330
|
+
class="christianity-card-render__rarity"
|
|
70331
|
+
[class.is-normal]="!card().rarity || card().rarity === 'normal'"
|
|
70332
|
+
[class.is-uncommon]="card().rarity === 'uncommon'"
|
|
70333
|
+
[class.is-rare]="card().rarity === 'rare'"
|
|
70334
|
+
[class.is-legendary]="card().rarity === 'legendary'"
|
|
70335
|
+
aria-hidden="true"
|
|
70336
|
+
></span>
|
|
70337
|
+
}
|
|
70338
|
+
</section>
|
|
70339
|
+
|
|
70340
|
+
@if (variant() === 'full') {
|
|
70341
|
+
<footer class="christianity-card-render__footer">
|
|
70342
|
+
<span>{{ card().edition ?? 'MVP' }}</span>
|
|
70343
|
+
<span>{{ card().collectorNumber ?? card().id }}</span>
|
|
70344
|
+
<span>{{ card().year ?? '2026' }} CHRISTIANITY</span>
|
|
70345
|
+
<span>{{ card().author ?? 'MVP' }}</span>
|
|
70346
|
+
</footer>
|
|
70347
|
+
}
|
|
70348
|
+
</article>
|
|
70349
|
+
}
|
|
70350
|
+
`, 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:min(29rem,calc(100vh - 3.5rem));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__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--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--full .christianity-card-render__metric{min-width:2.1rem;height:2.1rem;padding:0 .36rem;font-size:1.1rem}.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__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--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--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__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--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}@media (min-width: 52rem){.christianity-card-render--full{min-height:min(35rem,calc(100vh - 4rem));padding:1.05rem}}\n"] }); }
|
|
70351
|
+
}
|
|
70352
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityCardComponent, decorators: [{
|
|
70353
|
+
type: Component,
|
|
70354
|
+
args: [{ selector: 'val-christianity-card', standalone: true, template: `
|
|
70355
|
+
@if (variant() === 'back') {
|
|
70356
|
+
<article class="christianity-card-render christianity-card-render--back" aria-hidden="true">
|
|
70357
|
+
<span></span>
|
|
70358
|
+
</article>
|
|
70359
|
+
} @else {
|
|
70360
|
+
<article
|
|
70361
|
+
class="christianity-card-render"
|
|
70362
|
+
[class.christianity-card-render--full]="variant() === 'full'"
|
|
70363
|
+
[class.christianity-card-render--table]="variant() === 'table'"
|
|
70364
|
+
[class.christianity-card-render--hand]="variant() === 'hand'"
|
|
70365
|
+
[class.christianity-card-render--list]="variant() === 'list'"
|
|
70366
|
+
[class.christianity-card-render--template-genesis-classic]="isGenesisClassicTemplate()"
|
|
70367
|
+
[class.christianity-card-render--template-genesis-full-art]="frontTemplate() === 'genesis-full-art'"
|
|
70368
|
+
[class.is-leader]="card().type === 'leader'"
|
|
70369
|
+
[class.is-offering]="card().type === 'offering'"
|
|
70370
|
+
>
|
|
70371
|
+
<header class="christianity-card-render__header">
|
|
70372
|
+
<span class="christianity-card-render__type-icon" aria-hidden="true">
|
|
70373
|
+
<img [src]="typeIconUrl()" alt="" />
|
|
70374
|
+
</span>
|
|
70375
|
+
<strong>{{ card().name }}</strong>
|
|
70376
|
+
@if (headerMetric(); as metric) {
|
|
70377
|
+
<span class="christianity-card-render__metric" [class.is-pips]="metric.kind === 'pips'">
|
|
70378
|
+
@if (metric.kind === 'pips') {
|
|
70379
|
+
@for (_ of offeringPips(metric.value); track $index) {
|
|
70380
|
+
<i aria-hidden="true"></i>
|
|
70381
|
+
}
|
|
70382
|
+
} @else {
|
|
70383
|
+
{{ metric.value }}
|
|
70384
|
+
}
|
|
70385
|
+
</span>
|
|
70386
|
+
}
|
|
70387
|
+
</header>
|
|
70388
|
+
|
|
70389
|
+
<section class="christianity-card-render__art" [class.has-image]="card().imageUrl">
|
|
70390
|
+
@if (card().imageUrl) {
|
|
70391
|
+
<img [src]="card().imageUrl" [alt]="card().name" />
|
|
70392
|
+
} @else {
|
|
70393
|
+
<span>{{ card().name }}</span>
|
|
70394
|
+
}
|
|
70395
|
+
<small>{{ normalizedTypeLabel() }}</small>
|
|
70396
|
+
</section>
|
|
70397
|
+
|
|
70398
|
+
@if (variant() === 'full') {
|
|
70399
|
+
<section class="christianity-card-render__verse">
|
|
70400
|
+
@if (card().verseText) {
|
|
70401
|
+
<p>{{ card().verseText }}</p>
|
|
70402
|
+
}
|
|
70403
|
+
@if (card().scripture) {
|
|
70404
|
+
<strong>{{ card().scripture }}</strong>
|
|
70405
|
+
}
|
|
70406
|
+
</section>
|
|
70407
|
+
}
|
|
70408
|
+
|
|
70409
|
+
<section class="christianity-card-render__effect">
|
|
70410
|
+
@if (card().editionIcon) {
|
|
70411
|
+
<img class="christianity-card-render__edition-watermark" [src]="card().editionIcon" alt="" aria-hidden="true" />
|
|
70412
|
+
}
|
|
70413
|
+
<div class="christianity-card-render__stats">
|
|
70414
|
+
@if (card().type === 'offering') {
|
|
70415
|
+
<strong class="is-pips">
|
|
70416
|
+
@for (_ of offeringPips(card().offeringValue); track $index) {
|
|
70417
|
+
<i aria-hidden="true"></i>
|
|
70418
|
+
}
|
|
70419
|
+
</strong>
|
|
70420
|
+
} @else if (card().type === 'leader') {
|
|
70421
|
+
<strong>{{ leaderLifeText() }}</strong>
|
|
70422
|
+
} @else if (cardStatsText()) {
|
|
70423
|
+
<strong>{{ cardStatsText() }}</strong>
|
|
70424
|
+
}
|
|
70425
|
+
</div>
|
|
70426
|
+
@if (variant() === 'full') {
|
|
70427
|
+
<div class="christianity-card-render__text">
|
|
70428
|
+
@if (card().abilityName) {
|
|
70429
|
+
<strong>{{ card().abilityName }}</strong>
|
|
70430
|
+
}
|
|
70431
|
+
@if (card().abilityText || card().statusText) {
|
|
70432
|
+
<p>{{ card().abilityText || card().statusText }}</p>
|
|
70433
|
+
}
|
|
70434
|
+
</div>
|
|
70435
|
+
<span
|
|
70436
|
+
class="christianity-card-render__rarity"
|
|
70437
|
+
[class.is-normal]="!card().rarity || card().rarity === 'normal'"
|
|
70438
|
+
[class.is-uncommon]="card().rarity === 'uncommon'"
|
|
70439
|
+
[class.is-rare]="card().rarity === 'rare'"
|
|
70440
|
+
[class.is-legendary]="card().rarity === 'legendary'"
|
|
70441
|
+
aria-hidden="true"
|
|
70442
|
+
></span>
|
|
70443
|
+
}
|
|
70444
|
+
</section>
|
|
70445
|
+
|
|
70446
|
+
@if (variant() === 'full') {
|
|
70447
|
+
<footer class="christianity-card-render__footer">
|
|
70448
|
+
<span>{{ card().edition ?? 'MVP' }}</span>
|
|
70449
|
+
<span>{{ card().collectorNumber ?? card().id }}</span>
|
|
70450
|
+
<span>{{ card().year ?? '2026' }} CHRISTIANITY</span>
|
|
70451
|
+
<span>{{ card().author ?? 'MVP' }}</span>
|
|
70452
|
+
</footer>
|
|
70453
|
+
}
|
|
70454
|
+
</article>
|
|
70455
|
+
}
|
|
70456
|
+
`, 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:min(29rem,calc(100vh - 3.5rem));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__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--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--full .christianity-card-render__metric{min-width:2.1rem;height:2.1rem;padding:0 .36rem;font-size:1.1rem}.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__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--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--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__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--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}@media (min-width: 52rem){.christianity-card-render--full{min-height:min(35rem,calc(100vh - 4rem));padding:1.05rem}}\n"] }]
|
|
70457
|
+
}] });
|
|
70458
|
+
|
|
70459
|
+
const GENESIS_CATALOG_URL = 'assets/games/christianity/data/01-genesis.cards.json';
|
|
70460
|
+
const GENESIS_ICON_URL = 'assets/games/christianity/icons/1-icon.png';
|
|
70461
|
+
const TUTORIAL_CHARACTER_LIMIT = 12;
|
|
70462
|
+
const TUTORIAL_OFFERING_LIMIT = 6;
|
|
70463
|
+
const SPLASH_MIN_DURATION_MS = 720;
|
|
70464
|
+
const STARTER_CARDS = {
|
|
70465
|
+
o_simple: {
|
|
70466
|
+
id: 'o_simple',
|
|
70467
|
+
name: 'Ofrenda simple',
|
|
70468
|
+
type: 'offering',
|
|
70469
|
+
cost: 0,
|
|
70470
|
+
attack: 0,
|
|
70471
|
+
life: 1,
|
|
70472
|
+
verseText: 'Una ofrenda sencilla queda lista para sostener tus siguientes jugadas.',
|
|
70473
|
+
scripture: 'Genesis 4:4',
|
|
70474
|
+
edition: 'GEN',
|
|
70475
|
+
collectorNumber: '001/020',
|
|
70476
|
+
year: '2026',
|
|
70477
|
+
author: 'MVP',
|
|
70478
|
+
rarity: 'normal',
|
|
70479
|
+
},
|
|
70480
|
+
o_forbidden: {
|
|
70481
|
+
id: 'o_forbidden',
|
|
70482
|
+
name: 'El fruto prohibido',
|
|
70483
|
+
type: 'offering',
|
|
70484
|
+
cost: 0,
|
|
70485
|
+
attack: 0,
|
|
70486
|
+
life: 2,
|
|
70487
|
+
abilityName: 'Conocimiento del bien y del mal',
|
|
70488
|
+
abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Líder.',
|
|
70489
|
+
abilityCost: 0,
|
|
70490
|
+
verseText: 'Dios el Señor puso al hombre en el jardín de Edén para que lo labrara y lo cuidara.',
|
|
70491
|
+
scripture: 'Genesis 2:17 NBV',
|
|
70492
|
+
edition: 'GEN',
|
|
70493
|
+
collectorNumber: '012/180',
|
|
70494
|
+
year: '2026',
|
|
70495
|
+
author: 'MVP',
|
|
70496
|
+
rarity: 'uncommon',
|
|
70497
|
+
},
|
|
70498
|
+
p_scout: {
|
|
70499
|
+
id: 'p_scout',
|
|
70500
|
+
name: 'Scout',
|
|
70501
|
+
type: 'character',
|
|
70502
|
+
cost: 1,
|
|
70503
|
+
attack: 1,
|
|
70504
|
+
life: 1,
|
|
70505
|
+
verseText: 'Un explorador humilde abre camino antes de que llegue la batalla.',
|
|
70506
|
+
scripture: 'Genesis 13:17',
|
|
70507
|
+
edition: 'GEN',
|
|
70508
|
+
collectorNumber: '002/020',
|
|
70509
|
+
year: '2026',
|
|
70510
|
+
author: 'MVP',
|
|
70511
|
+
rarity: 'normal',
|
|
70512
|
+
},
|
|
70513
|
+
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' },
|
|
70514
|
+
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' },
|
|
70515
|
+
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' },
|
|
70516
|
+
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' },
|
|
70517
|
+
};
|
|
70518
|
+
const STARTING_SHARED_DECK = [
|
|
70519
|
+
'o_simple',
|
|
70520
|
+
'p_scout',
|
|
70521
|
+
'o_forbidden',
|
|
70522
|
+
'o_simple',
|
|
70523
|
+
'p_guard',
|
|
70524
|
+
'p_warrior',
|
|
70525
|
+
'o_simple',
|
|
70526
|
+
'p_elder',
|
|
70527
|
+
'p_scout',
|
|
70528
|
+
'o_simple',
|
|
70529
|
+
'p_champion',
|
|
70530
|
+
'p_guard',
|
|
70531
|
+
'o_simple',
|
|
70532
|
+
'p_warrior',
|
|
70533
|
+
'p_scout',
|
|
70534
|
+
'o_simple',
|
|
70535
|
+
'p_elder',
|
|
70536
|
+
'p_guard',
|
|
70537
|
+
'o_simple',
|
|
70538
|
+
];
|
|
70539
|
+
const STARTING_GAME = {
|
|
70540
|
+
gameId: 'mock-christianity',
|
|
70541
|
+
status: 'in_progress',
|
|
70542
|
+
mode: 'local_pass',
|
|
70543
|
+
turnOwner: 'P1',
|
|
70544
|
+
revision: 0,
|
|
70545
|
+
turnCount: 1,
|
|
70546
|
+
matchScore: { P1: 1, P2: 0 },
|
|
70547
|
+
sharedDeck: STARTING_SHARED_DECK,
|
|
70548
|
+
historyZone: [],
|
|
70549
|
+
players: {
|
|
70550
|
+
P1: {
|
|
70551
|
+
seat: 'P1',
|
|
70552
|
+
displayName: 'Jugador',
|
|
70553
|
+
avatar: 'J',
|
|
70554
|
+
avatarColor: '#2563eb',
|
|
70555
|
+
leaderName: 'Adam',
|
|
70556
|
+
leaderHp: 15,
|
|
70557
|
+
leaderMaxHp: 15,
|
|
70558
|
+
offerings: [
|
|
70559
|
+
{ instanceId: 'p1_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P1', ready: true, value: 1 },
|
|
70560
|
+
{
|
|
70561
|
+
instanceId: 'p1_offering_002',
|
|
70562
|
+
cardId: 'o_forbidden',
|
|
70563
|
+
name: 'El fruto prohibido',
|
|
70564
|
+
owner: 'P1',
|
|
70565
|
+
ready: true,
|
|
70566
|
+
value: 2,
|
|
70567
|
+
abilityName: 'Conocimiento del bien y del mal',
|
|
70568
|
+
abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Lider.',
|
|
70569
|
+
abilityCost: 0,
|
|
70570
|
+
},
|
|
70571
|
+
],
|
|
70572
|
+
offeringPlayedThisTurn: false,
|
|
70573
|
+
hand: ['o_simple', 'p_scout', 'p_warrior', 'p_guard'],
|
|
70574
|
+
battleZone: [],
|
|
70575
|
+
},
|
|
70576
|
+
P2: {
|
|
70577
|
+
seat: 'P2',
|
|
70578
|
+
displayName: 'Rival',
|
|
70579
|
+
avatar: 'R',
|
|
70580
|
+
avatarColor: '#b45309',
|
|
70581
|
+
leaderName: 'Noah',
|
|
70582
|
+
leaderHp: 15,
|
|
70583
|
+
leaderMaxHp: 15,
|
|
70584
|
+
offerings: [{ instanceId: 'p2_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P2', ready: true, value: 1 }],
|
|
70585
|
+
offeringPlayedThisTurn: false,
|
|
70586
|
+
handCount: 4,
|
|
70587
|
+
battleZone: [
|
|
70588
|
+
{
|
|
70589
|
+
instanceId: 'opp_001',
|
|
70590
|
+
cardId: 'p_scout',
|
|
70591
|
+
name: 'Scout',
|
|
70592
|
+
owner: 'P2',
|
|
70593
|
+
controller: 'P2',
|
|
70594
|
+
slot: 0,
|
|
70595
|
+
attack: 1,
|
|
70596
|
+
currentHp: 1,
|
|
70597
|
+
maxHp: 1,
|
|
70598
|
+
canAttack: false,
|
|
70599
|
+
},
|
|
70600
|
+
],
|
|
70601
|
+
},
|
|
70602
|
+
},
|
|
70603
|
+
log: ['Partida iniciada.'],
|
|
70604
|
+
};
|
|
70605
|
+
class ChristianityGameComponent {
|
|
70606
|
+
constructor() {
|
|
70607
|
+
this.i18n = inject(I18nService);
|
|
70608
|
+
this.bootStartedAt = performance.now();
|
|
70609
|
+
this.game = signal(structuredClone(STARTING_GAME));
|
|
70610
|
+
this.screen = signal('splash');
|
|
70611
|
+
this.catalogLoadState = signal('loading');
|
|
70612
|
+
this.selectedHandCard = signal(null);
|
|
70613
|
+
this.selectedAttacker = signal(null);
|
|
70614
|
+
this.selectedPreview = signal(null);
|
|
70615
|
+
this.selectedInfo = signal(null);
|
|
70616
|
+
this.previewTilt = signal({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
|
|
70617
|
+
this.hoveredHandIndex = signal(null);
|
|
70618
|
+
this.draggingCardId = signal(null);
|
|
70619
|
+
this.showHistory = signal(false);
|
|
70620
|
+
this.showGallery = signal(false);
|
|
70621
|
+
this.offeringsSeat = signal(null);
|
|
70622
|
+
this.cardCatalog = signal(STARTER_CARDS);
|
|
70623
|
+
this.allCatalogCards = signal(Object.values(STARTER_CARDS));
|
|
70624
|
+
this.catalogLoaded = signal(false);
|
|
70625
|
+
this.gallerySearch = signal('');
|
|
70626
|
+
this.galleryType = signal('all');
|
|
70627
|
+
this.canDropOnBattleSlot = (drag) => {
|
|
70628
|
+
const card = this.cardDefinition(drag.data);
|
|
70629
|
+
return card.type === 'character' && this.canPlay(card);
|
|
70630
|
+
};
|
|
70631
|
+
this.canDropOnOfferings = (drag) => {
|
|
70632
|
+
const card = this.cardDefinition(drag.data);
|
|
70633
|
+
return card.type === 'offering' && this.canPlay(card);
|
|
70634
|
+
};
|
|
70635
|
+
this.player = computed(() => this.game().players.P1);
|
|
70636
|
+
this.opponent = computed(() => this.game().players.P2);
|
|
70637
|
+
this.currentPlayer = computed(() => this.game().players[this.game().turnOwner]);
|
|
70638
|
+
this.isOwnTurn = computed(() => this.game().turnOwner === 'P1');
|
|
70639
|
+
this.hasOpponentGuards = computed(() => this.opponent().battleZone.length > 0);
|
|
70640
|
+
this.opponentHandCount = computed(() => this.opponent().handCount ?? this.opponent().hand?.length ?? 0);
|
|
70641
|
+
this.galleryCards = computed(() => {
|
|
70642
|
+
const query = this.gallerySearch().trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
70643
|
+
const type = this.galleryType();
|
|
70644
|
+
return this.allCatalogCards()
|
|
70645
|
+
.filter(card => type === 'all' || card.type === type)
|
|
70646
|
+
.filter(card => {
|
|
70647
|
+
if (!query)
|
|
70648
|
+
return true;
|
|
70649
|
+
const text = this.translatedCardText(card);
|
|
70650
|
+
const haystack = [text.name, card.type, text.scripture, text.abilityName, text.abilityText, text.verseText]
|
|
70651
|
+
.filter(Boolean)
|
|
70652
|
+
.join(' ')
|
|
70653
|
+
.toLowerCase()
|
|
70654
|
+
.normalize('NFD')
|
|
70655
|
+
.replace(/[\u0300-\u036f]/g, '');
|
|
70656
|
+
return haystack.includes(query);
|
|
70657
|
+
})
|
|
70658
|
+
.sort((left, right) => this.cardSortKey(left).localeCompare(this.cardSortKey(right), 'es'));
|
|
70659
|
+
});
|
|
70660
|
+
this.galleryEditionLabel = computed(() => {
|
|
70661
|
+
const count = this.allCatalogCards().length;
|
|
70662
|
+
return `${this.t('christianityGenesisEdition')} · ${count} ${this.t('christianityCards')}`;
|
|
70663
|
+
});
|
|
70664
|
+
this.galleryEditionIcon = computed(() => GENESIS_ICON_URL);
|
|
70665
|
+
this.galleryTypeOptions = computed(() => [
|
|
70666
|
+
{ value: 'all', label: this.t('christianityAllCards') },
|
|
70667
|
+
{ value: 'leader', label: this.t('christianityLeaderCard') },
|
|
70668
|
+
{ value: 'offering', label: this.t('christianityOfferingCard') },
|
|
70669
|
+
{ value: 'character', label: this.t('christianityCharacterCard') },
|
|
70670
|
+
{ value: 'wisdom', label: this.t('christianityWisdomCard') },
|
|
70671
|
+
{ value: 'action', label: this.t('christianityActionCard') },
|
|
70672
|
+
{ value: 'tool', label: this.t('christianityToolCard') },
|
|
70673
|
+
{ value: 'place', label: this.t('christianityPlaceCard') },
|
|
70674
|
+
{ value: 'event', label: this.t('christianityEventCard') },
|
|
70675
|
+
]);
|
|
70676
|
+
this.splashStatusText = computed(() => {
|
|
70677
|
+
const state = this.catalogLoadState();
|
|
70678
|
+
if (state === 'ready')
|
|
70679
|
+
return this.t('christianitySplashReady');
|
|
70680
|
+
if (state === 'fallback')
|
|
70681
|
+
return this.t('christianitySplashFallback');
|
|
70682
|
+
return this.t('christianitySplashLoading');
|
|
70683
|
+
});
|
|
70684
|
+
this.startFeaturedCards = computed(() => {
|
|
70685
|
+
const cards = this.allCatalogCards();
|
|
70686
|
+
const preferred = ['GEN-009', 'GEN-013', 'GEN-032']
|
|
70687
|
+
.map(id => this.cardCatalog()[id])
|
|
70688
|
+
.filter((card) => !!card);
|
|
70689
|
+
return (preferred.length ? preferred : cards.slice(0, 3)).slice(0, 3);
|
|
70690
|
+
});
|
|
70691
|
+
this.futureModes = computed(() => [
|
|
70692
|
+
{ title: this.t('christianitySoloBotMode'), body: this.t('christianitySoloBotModeBody') },
|
|
70693
|
+
{ title: this.t('christianityTwoPlayerMode'), body: this.t('christianityTwoPlayerModeBody') },
|
|
70694
|
+
{ title: this.t('christianityOneDeviceMode'), body: this.t('christianityOneDeviceModeBody') },
|
|
70695
|
+
{ title: this.t('christianitySpectatorMode'), body: this.t('christianitySpectatorModeBody') },
|
|
70696
|
+
]);
|
|
70697
|
+
this.selectedCardDefinition = computed(() => {
|
|
70698
|
+
const selected = this.selectedHandCard();
|
|
70699
|
+
return selected ? this.cardDefinition(selected) : null;
|
|
70700
|
+
});
|
|
70701
|
+
this.selectedPreviewCard = computed(() => {
|
|
70702
|
+
const cardId = this.selectedPreview()?.cardId;
|
|
70703
|
+
return cardId ? this.cardDefinition(cardId) : null;
|
|
70704
|
+
});
|
|
70705
|
+
this.selectedPreviewRenderCard = computed(() => {
|
|
70706
|
+
const preview = this.selectedPreview();
|
|
70707
|
+
if (!preview)
|
|
70708
|
+
return null;
|
|
70709
|
+
const card = this.selectedPreviewCard();
|
|
70710
|
+
if (card) {
|
|
70711
|
+
return this.definitionToRenderCard(card, {
|
|
70712
|
+
statusText: preview.body,
|
|
70713
|
+
});
|
|
70714
|
+
}
|
|
70715
|
+
if (preview.eyebrow === this.t('christianityLeaderCard')) {
|
|
70716
|
+
const [currentHp, maxHp] = preview.meta.split('/').map(value => Number(value));
|
|
70717
|
+
return {
|
|
70718
|
+
id: `leader-${preview.title.toLowerCase()}`,
|
|
70719
|
+
name: preview.title,
|
|
70720
|
+
type: 'leader',
|
|
70721
|
+
typeLabel: this.t('christianityLeaderCard'),
|
|
70722
|
+
currentHp: Number.isFinite(currentHp) ? currentHp : undefined,
|
|
70723
|
+
maxHp: Number.isFinite(maxHp) ? maxHp : undefined,
|
|
70724
|
+
life: Number.isFinite(currentHp) ? currentHp : undefined,
|
|
70725
|
+
abilityName: this.t('christianityLeaderCard'),
|
|
70726
|
+
abilityText: preview.body,
|
|
70727
|
+
verseText: preview.body,
|
|
70728
|
+
edition: 'MVP',
|
|
70729
|
+
collectorNumber: 'LIDER',
|
|
70730
|
+
year: '2026',
|
|
70731
|
+
author: 'MVP',
|
|
70732
|
+
rarity: 'legendary',
|
|
70733
|
+
};
|
|
70734
|
+
}
|
|
70735
|
+
return {
|
|
70736
|
+
id: `preview-${preview.title.toLowerCase()}`,
|
|
70737
|
+
name: preview.title,
|
|
70738
|
+
type: this.previewRenderType(preview.eyebrow),
|
|
70739
|
+
typeLabel: preview.eyebrow,
|
|
70740
|
+
abilityName: preview.eyebrow,
|
|
70741
|
+
abilityText: preview.body,
|
|
70742
|
+
verseText: preview.body,
|
|
70743
|
+
edition: 'MVP',
|
|
70744
|
+
collectorNumber: preview.eyebrow,
|
|
70745
|
+
year: '2026',
|
|
70746
|
+
author: 'MVP',
|
|
70747
|
+
rarity: 'normal',
|
|
70748
|
+
statusText: preview.meta,
|
|
70749
|
+
};
|
|
70750
|
+
});
|
|
70751
|
+
this.previewRule = computed(() => {
|
|
70752
|
+
const preview = this.selectedPreview();
|
|
70753
|
+
if (!preview)
|
|
70754
|
+
return null;
|
|
70755
|
+
const card = this.selectedPreviewCard();
|
|
70756
|
+
if (card?.type === 'offering') {
|
|
70757
|
+
return { title: this.t('christianityOfferingCard'), body: this.t('christianityOfferingRuleBody') };
|
|
70758
|
+
}
|
|
70759
|
+
if (card?.type === 'character') {
|
|
70760
|
+
return { title: this.t('christianityCharacterCard'), body: this.t('christianityCharacterRuleBody') };
|
|
70761
|
+
}
|
|
70762
|
+
if (card?.type === 'wisdom') {
|
|
70763
|
+
return { title: this.t('christianityWisdomCard'), body: this.t('christianityWisdomRuleBody') };
|
|
70764
|
+
}
|
|
70765
|
+
if (card?.type === 'action') {
|
|
70766
|
+
return { title: this.t('christianityActionCard'), body: this.t('christianityActionRuleBody') };
|
|
70767
|
+
}
|
|
70768
|
+
if (card?.type === 'tool') {
|
|
70769
|
+
return { title: this.t('christianityToolCard'), body: this.t('christianityToolRuleBody') };
|
|
70770
|
+
}
|
|
70771
|
+
if (card?.type === 'place') {
|
|
70772
|
+
return { title: this.t('christianityPlaceCard'), body: this.t('christianityPlaceRuleBody') };
|
|
70773
|
+
}
|
|
70774
|
+
if (card?.type === 'event') {
|
|
70775
|
+
return { title: this.t('christianityEventCard'), body: this.t('christianityEventRuleBody') };
|
|
70776
|
+
}
|
|
70777
|
+
if (card?.type === 'leader') {
|
|
70778
|
+
return { title: this.t('christianityLeaderCard'), body: this.t('christianityLeaderRuleBody') };
|
|
70779
|
+
}
|
|
70780
|
+
if (preview.eyebrow === this.t('christianityLeaderCard')) {
|
|
70781
|
+
return { title: this.t('christianityLeaderCard'), body: this.t('christianityLeaderRuleBody') };
|
|
70782
|
+
}
|
|
70783
|
+
return null;
|
|
70784
|
+
});
|
|
70785
|
+
this.statusText = computed(() => {
|
|
70786
|
+
const attacker = this.selectedAttacker();
|
|
70787
|
+
const handCard = this.selectedCardDefinition();
|
|
70788
|
+
if (!this.isOwnTurn()) {
|
|
70789
|
+
return this.t('christianityWaitTurn');
|
|
70790
|
+
}
|
|
70791
|
+
if (attacker) {
|
|
70792
|
+
return this.hasOpponentGuards() ? this.t('christianityChooseCharacterTarget') : this.t('christianityChooseTarget');
|
|
70793
|
+
}
|
|
70794
|
+
if (handCard) {
|
|
70795
|
+
if (!this.canPlay(handCard)) {
|
|
70796
|
+
return this.t('christianityNeedOfferings');
|
|
70797
|
+
}
|
|
70798
|
+
return handCard.type === 'offering' ? this.t('christianityPlaceOffering') : this.t('christianityChooseSlot');
|
|
70799
|
+
}
|
|
70800
|
+
return this.t('christianityChooseCard');
|
|
70801
|
+
});
|
|
70802
|
+
this.i18n.registerDefaults('MiniGames', MINI_GAMES_I18N);
|
|
70803
|
+
void this.loadGenesisCatalog();
|
|
70804
|
+
}
|
|
70805
|
+
t(key) {
|
|
70806
|
+
this.i18n.lang();
|
|
70807
|
+
return this.i18n.t(key, 'MiniGames');
|
|
70808
|
+
}
|
|
70809
|
+
async loadGenesisCatalog() {
|
|
70810
|
+
let loaded = false;
|
|
70811
|
+
try {
|
|
70812
|
+
const response = await fetch(GENESIS_CATALOG_URL);
|
|
70813
|
+
if (response.ok) {
|
|
70814
|
+
const catalog = await response.json();
|
|
70815
|
+
const cards = (catalog.cards ?? []).map(card => this.normalizeCatalogCard(card, catalog));
|
|
70816
|
+
if (cards.length) {
|
|
70817
|
+
this.cardCatalog.set(Object.fromEntries(cards.map(card => [card.id, card])));
|
|
70818
|
+
this.allCatalogCards.set(cards);
|
|
70819
|
+
this.catalogLoaded.set(true);
|
|
70820
|
+
this.game.set(this.createTutorialGame(cards));
|
|
70821
|
+
loaded = true;
|
|
70822
|
+
}
|
|
70823
|
+
}
|
|
70824
|
+
}
|
|
70825
|
+
catch (error) {
|
|
70826
|
+
console.warn('Christianity catalog could not be loaded. Falling back to starter cards.', error);
|
|
70827
|
+
}
|
|
70828
|
+
this.catalogLoadState.set(loaded ? 'ready' : 'fallback');
|
|
70829
|
+
this.finishSplash();
|
|
70830
|
+
}
|
|
70831
|
+
finishSplash() {
|
|
70832
|
+
const elapsed = performance.now() - this.bootStartedAt;
|
|
70833
|
+
const remaining = Math.max(0, SPLASH_MIN_DURATION_MS - elapsed);
|
|
70834
|
+
window.setTimeout(() => {
|
|
70835
|
+
if (this.screen() === 'splash') {
|
|
70836
|
+
this.screen.set('home');
|
|
70837
|
+
}
|
|
70838
|
+
}, remaining);
|
|
70839
|
+
}
|
|
70840
|
+
normalizeCatalogCard(card, catalog) {
|
|
70841
|
+
const editionIcon = card.editionIcon ?? catalog.edition?.icon ?? GENESIS_ICON_URL;
|
|
70842
|
+
const verseText = card.verseText ?? card.bible?.text;
|
|
70843
|
+
const scripture = card.scripture ?? this.formatScripture(card.bible);
|
|
70844
|
+
const offeringValue = card.type === 'offering' ? card.offeringValue ?? card.life ?? card.cost ?? 1 : card.offeringValue;
|
|
70845
|
+
const life = card.type === 'leader'
|
|
70846
|
+
? card.leaderLife ?? card.life ?? 10
|
|
70847
|
+
: card.type === 'offering'
|
|
70848
|
+
? offeringValue
|
|
70849
|
+
: card.life ?? 0;
|
|
70850
|
+
return {
|
|
70851
|
+
...card,
|
|
70852
|
+
cost: card.type === 'offering' ? 0 : card.cost ?? 0,
|
|
70853
|
+
offeringValue,
|
|
70854
|
+
life,
|
|
70855
|
+
leaderLife: card.type === 'leader' ? card.leaderLife ?? life : card.leaderLife,
|
|
70856
|
+
attack: card.type === 'character' ? card.attack ?? 0 : card.attack,
|
|
70857
|
+
abilityName: card.abilityName ?? card.abilities?.[0]?.name,
|
|
70858
|
+
abilityText: card.abilityText ?? card.abilities?.[0]?.text,
|
|
70859
|
+
verseText,
|
|
70860
|
+
scripture,
|
|
70861
|
+
edition: card.edition ?? catalog.edition?.id ?? 'GEN',
|
|
70862
|
+
editionNumber: card.editionNumber ?? catalog.edition?.number,
|
|
70863
|
+
editionIcon,
|
|
70864
|
+
imageUrl: card.imageUrl ?? card.art?.imageUrl,
|
|
70865
|
+
author: card.author ?? card.art?.artistCredit,
|
|
70866
|
+
year: card.year ?? '2026',
|
|
70867
|
+
frontTemplate: card.frontTemplate ?? 'genesis-classic',
|
|
70868
|
+
};
|
|
70869
|
+
}
|
|
70870
|
+
formatScripture(bible) {
|
|
70871
|
+
if (!bible?.book || !bible.reference)
|
|
70872
|
+
return undefined;
|
|
70873
|
+
return `${bible.book} ${bible.reference}${bible.version ? ` ${bible.version}` : ''}`;
|
|
70874
|
+
}
|
|
70875
|
+
createTutorialGame(cards) {
|
|
70876
|
+
const leaders = cards.filter(card => card.type === 'leader');
|
|
70877
|
+
const playerLeader = this.findCard(leaders, 'Adán') ?? leaders[0];
|
|
70878
|
+
const opponentLeader = this.findCard(leaders, 'Noé') ?? leaders[1] ?? leaders[0];
|
|
70879
|
+
const offerings = cards.filter(card => card.type === 'offering').slice(0, TUTORIAL_OFFERING_LIMIT);
|
|
70880
|
+
const characters = cards
|
|
70881
|
+
.filter(card => card.type === 'character' && (card.cost ?? 0) <= 4 && (card.attack ?? 0) >= 0 && (card.life ?? 0) > 0)
|
|
70882
|
+
.slice(0, TUTORIAL_CHARACTER_LIMIT);
|
|
70883
|
+
const startingOffering = offerings[0] ?? STARTER_CARDS['o_simple'];
|
|
70884
|
+
const tutorialDeck = [
|
|
70885
|
+
...offerings.slice(1),
|
|
70886
|
+
...characters,
|
|
70887
|
+
...offerings.slice(0, 1),
|
|
70888
|
+
].slice(0, 20);
|
|
70889
|
+
const playerHand = tutorialDeck.slice(0, 4).map(card => card.id);
|
|
70890
|
+
const opponentBattleCard = characters[0];
|
|
70891
|
+
const sharedDeck = tutorialDeck.slice(4).map(card => card.id);
|
|
70892
|
+
return {
|
|
70893
|
+
...structuredClone(STARTING_GAME),
|
|
70894
|
+
sharedDeck,
|
|
70895
|
+
historyZone: [],
|
|
70896
|
+
players: {
|
|
70897
|
+
P1: this.createTutorialPlayer('P1', playerLeader, startingOffering, playerHand, []),
|
|
70898
|
+
P2: this.createTutorialPlayer('P2', opponentLeader, startingOffering, undefined, opponentBattleCard ? [this.createCharacterInstance(opponentBattleCard, 'P2', 0, 'opp_001')] : []),
|
|
70899
|
+
},
|
|
70900
|
+
log: [this.t('christianityTutorialLoaded')],
|
|
70901
|
+
};
|
|
70902
|
+
}
|
|
70903
|
+
createTutorialPlayer(seat, leader, startingOffering, hand, battleZone) {
|
|
70904
|
+
const base = STARTING_GAME.players[seat];
|
|
70905
|
+
const leaderLife = leader?.leaderLife ?? leader?.life ?? base.leaderMaxHp;
|
|
70906
|
+
return {
|
|
70907
|
+
...structuredClone(base),
|
|
70908
|
+
leaderCardId: leader?.id,
|
|
70909
|
+
leaderName: leader ? this.translatedCardText(leader).name : base.leaderName,
|
|
70910
|
+
leaderHp: leaderLife,
|
|
70911
|
+
leaderMaxHp: leaderLife,
|
|
70912
|
+
offerings: [this.createOfferingInstance(startingOffering, seat, `${seat.toLowerCase()}_offering_001`)],
|
|
70913
|
+
offeringPlayedThisTurn: false,
|
|
70914
|
+
hand,
|
|
70915
|
+
handCount: hand ? undefined : 4,
|
|
70916
|
+
battleZone,
|
|
70917
|
+
};
|
|
70918
|
+
}
|
|
70919
|
+
createOfferingInstance(card, seat, instanceId) {
|
|
70920
|
+
const value = card.offeringValue ?? card.life ?? 1;
|
|
70921
|
+
return {
|
|
70922
|
+
instanceId,
|
|
70923
|
+
cardId: card.id,
|
|
70924
|
+
name: this.translatedCardText(card).name,
|
|
70925
|
+
owner: seat,
|
|
70926
|
+
ready: true,
|
|
70927
|
+
value,
|
|
70928
|
+
abilityName: card.abilityName,
|
|
70929
|
+
abilityText: card.abilityText,
|
|
70930
|
+
abilityCost: card.abilityCost,
|
|
70931
|
+
};
|
|
70932
|
+
}
|
|
70933
|
+
createCharacterInstance(card, seat, slot, instanceId) {
|
|
70934
|
+
const life = card.life ?? 1;
|
|
70935
|
+
return {
|
|
70936
|
+
instanceId,
|
|
70937
|
+
cardId: card.id,
|
|
70938
|
+
name: this.translatedCardText(card).name,
|
|
70939
|
+
owner: seat,
|
|
70940
|
+
controller: seat,
|
|
70941
|
+
slot,
|
|
70942
|
+
attack: card.attack ?? 0,
|
|
70943
|
+
currentHp: life,
|
|
70944
|
+
maxHp: life,
|
|
70945
|
+
canAttack: false,
|
|
70946
|
+
};
|
|
70947
|
+
}
|
|
70948
|
+
findCard(cards, namePart) {
|
|
70949
|
+
return cards.find(card => this.translatedCardText(card).name.toLowerCase().includes(namePart.toLowerCase()));
|
|
70950
|
+
}
|
|
70951
|
+
cardSortKey(card) {
|
|
70952
|
+
const collector = card.collectorNumber ?? card.id;
|
|
70953
|
+
return `${card.edition ?? ''}-${collector.padStart(8, '0')}-${this.translatedCardText(card).name}`;
|
|
70954
|
+
}
|
|
70955
|
+
cardDefinition(cardId) {
|
|
70956
|
+
return this.cardCatalog()[cardId] ?? STARTER_CARDS[cardId] ?? STARTER_CARDS['p_scout'];
|
|
70957
|
+
}
|
|
70958
|
+
translatedCardText(card) {
|
|
70959
|
+
const lang = this.i18n.lang();
|
|
70960
|
+
const translation = card.i18n?.[lang] ?? card.i18n?.['es'];
|
|
70961
|
+
const primaryAbility = translation?.abilities?.[0] ?? card.abilities?.[0];
|
|
70962
|
+
return {
|
|
70963
|
+
name: translation?.name ?? card.name,
|
|
70964
|
+
fullName: translation?.fullName ?? card.fullName,
|
|
70965
|
+
verseText: translation?.verseText ?? card.verseText,
|
|
70966
|
+
scripture: translation?.scripture ?? card.scripture,
|
|
70967
|
+
abilityName: translation?.abilityName ?? primaryAbility?.name ?? card.abilityName,
|
|
70968
|
+
abilityText: translation?.abilityText ?? primaryAbility?.text ?? card.abilityText,
|
|
70969
|
+
abilities: translation?.abilities ?? card.abilities,
|
|
70970
|
+
};
|
|
70971
|
+
}
|
|
70972
|
+
cardDisplayName(cardId) {
|
|
70973
|
+
return this.translatedCardText(this.cardDefinition(cardId)).name;
|
|
70974
|
+
}
|
|
70975
|
+
playerLeaderDisplayName(player) {
|
|
70976
|
+
return player.leaderCardId ? this.cardDisplayName(player.leaderCardId) : player.leaderName;
|
|
70977
|
+
}
|
|
70978
|
+
catalogStatusLabel() {
|
|
70979
|
+
const state = this.catalogLoadState();
|
|
70980
|
+
if (state === 'ready')
|
|
70981
|
+
return this.t('christianityCatalogReady');
|
|
70982
|
+
if (state === 'fallback')
|
|
70983
|
+
return this.t('christianityCatalogFallback');
|
|
70984
|
+
return this.t('christianityCatalogLoading');
|
|
70985
|
+
}
|
|
70986
|
+
startFeaturedCardTransform(index) {
|
|
70987
|
+
const transforms = [
|
|
70988
|
+
'translateX(-1.4rem) rotate(-9deg)',
|
|
70989
|
+
'translateY(-0.55rem) rotate(2deg)',
|
|
70990
|
+
'translateX(1.4rem) rotate(10deg)',
|
|
70991
|
+
];
|
|
70992
|
+
return transforms[index] ?? 'none';
|
|
70993
|
+
}
|
|
70994
|
+
cardTypeLabel(card) {
|
|
70995
|
+
const labels = {
|
|
70996
|
+
action: this.t('christianityActionCard'),
|
|
70997
|
+
character: this.t('christianityCharacterCard'),
|
|
70998
|
+
event: this.t('christianityEventCard'),
|
|
70999
|
+
leader: this.t('christianityLeaderCard'),
|
|
71000
|
+
offering: this.t('christianityOfferingCard'),
|
|
71001
|
+
place: this.t('christianityPlaceCard'),
|
|
71002
|
+
tool: this.t('christianityToolCard'),
|
|
71003
|
+
wisdom: this.t('christianityWisdomCard'),
|
|
71004
|
+
};
|
|
71005
|
+
return labels[card.type];
|
|
71006
|
+
}
|
|
71007
|
+
definitionToRenderCard(card, overrides = {}) {
|
|
71008
|
+
const text = this.translatedCardText(card);
|
|
71009
|
+
const base = {
|
|
71010
|
+
id: card.id,
|
|
71011
|
+
name: text.name,
|
|
71012
|
+
type: card.type,
|
|
71013
|
+
typeLabel: this.cardTypeLabel(card),
|
|
71014
|
+
cost: card.cost,
|
|
71015
|
+
offeringValue: card.type === 'offering' ? card.offeringValue ?? card.life : undefined,
|
|
71016
|
+
attack: card.type === 'character' ? card.attack : undefined,
|
|
71017
|
+
life: card.life,
|
|
71018
|
+
currentHp: card.life,
|
|
71019
|
+
maxHp: card.life,
|
|
71020
|
+
abilityName: text.abilityName,
|
|
71021
|
+
abilityText: text.abilityText || this.defaultCardBody(card.type),
|
|
71022
|
+
verseText: text.verseText,
|
|
71023
|
+
scripture: text.scripture,
|
|
71024
|
+
edition: card.edition,
|
|
71025
|
+
collectorNumber: card.collectorNumber,
|
|
71026
|
+
editionIcon: card.editionIcon ?? (card.edition === 'GEN' ? GENESIS_ICON_URL : undefined),
|
|
71027
|
+
year: card.year,
|
|
71028
|
+
author: card.author,
|
|
71029
|
+
rarity: card.rarity,
|
|
71030
|
+
imageUrl: card.imageUrl,
|
|
71031
|
+
frontTemplate: card.frontTemplate ?? (card.edition === 'GEN' ? 'genesis-classic' : undefined),
|
|
71032
|
+
};
|
|
71033
|
+
return { ...base, ...overrides };
|
|
71034
|
+
}
|
|
71035
|
+
defaultCardBody(type) {
|
|
71036
|
+
const bodies = {
|
|
71037
|
+
action: this.t('christianityActionRuleBody'),
|
|
71038
|
+
character: this.t('christianityCharacterBody'),
|
|
71039
|
+
event: this.t('christianityEventRuleBody'),
|
|
71040
|
+
leader: this.t('christianityLeaderBody'),
|
|
71041
|
+
offering: this.t('christianityOfferingBody'),
|
|
71042
|
+
place: this.t('christianityPlaceRuleBody'),
|
|
71043
|
+
tool: this.t('christianityToolRuleBody'),
|
|
71044
|
+
wisdom: this.t('christianityWisdomRuleBody'),
|
|
71045
|
+
};
|
|
71046
|
+
return bodies[type];
|
|
71047
|
+
}
|
|
71048
|
+
characterRenderCard(card) {
|
|
71049
|
+
const definition = this.cardDefinition(card.cardId);
|
|
71050
|
+
return this.definitionToRenderCard(definition, {
|
|
71051
|
+
id: card.instanceId,
|
|
71052
|
+
attack: card.attack,
|
|
71053
|
+
life: card.maxHp,
|
|
71054
|
+
currentHp: card.currentHp,
|
|
71055
|
+
maxHp: card.maxHp,
|
|
71056
|
+
statusText: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
|
|
71057
|
+
});
|
|
71058
|
+
}
|
|
71059
|
+
leaderRenderCard(player) {
|
|
71060
|
+
if (player.leaderCardId) {
|
|
71061
|
+
const definition = this.cardDefinition(player.leaderCardId);
|
|
71062
|
+
return this.definitionToRenderCard(definition, {
|
|
71063
|
+
id: `${player.seat}-leader`,
|
|
71064
|
+
name: this.translatedCardText(definition).name,
|
|
71065
|
+
type: 'leader',
|
|
71066
|
+
typeLabel: this.t('christianityLeaderCard'),
|
|
71067
|
+
life: player.leaderHp,
|
|
71068
|
+
currentHp: player.leaderHp,
|
|
71069
|
+
maxHp: player.leaderMaxHp,
|
|
71070
|
+
statusText: this.t('christianityLeaderBody'),
|
|
71071
|
+
});
|
|
71072
|
+
}
|
|
71073
|
+
return {
|
|
71074
|
+
id: `${player.seat}-leader`,
|
|
71075
|
+
name: player.leaderName,
|
|
71076
|
+
type: 'leader',
|
|
71077
|
+
typeLabel: this.t('christianityLeaderCard'),
|
|
71078
|
+
life: player.leaderHp,
|
|
71079
|
+
currentHp: player.leaderHp,
|
|
71080
|
+
maxHp: player.leaderMaxHp,
|
|
71081
|
+
abilityName: this.t('christianityLeaderCard'),
|
|
71082
|
+
abilityText: this.t('christianityLeaderBody'),
|
|
71083
|
+
verseText: this.t('christianityLeaderBody'),
|
|
71084
|
+
edition: 'MVP',
|
|
71085
|
+
collectorNumber: 'LIDER',
|
|
71086
|
+
editionIcon: GENESIS_ICON_URL,
|
|
71087
|
+
year: '2026',
|
|
71088
|
+
author: 'MVP',
|
|
71089
|
+
rarity: 'legendary',
|
|
71090
|
+
frontTemplate: 'genesis-classic',
|
|
71091
|
+
};
|
|
71092
|
+
}
|
|
71093
|
+
offeringRenderCard(offering) {
|
|
71094
|
+
const definition = this.cardDefinition(offering.cardId);
|
|
71095
|
+
const text = this.translatedCardText(definition);
|
|
71096
|
+
return this.definitionToRenderCard(definition, {
|
|
71097
|
+
id: offering.instanceId,
|
|
71098
|
+
name: text.name,
|
|
71099
|
+
type: 'offering',
|
|
71100
|
+
typeLabel: this.t('christianityOfferingCard'),
|
|
71101
|
+
offeringValue: offering.value,
|
|
71102
|
+
life: offering.value,
|
|
71103
|
+
currentHp: offering.value,
|
|
71104
|
+
maxHp: offering.value,
|
|
71105
|
+
abilityName: text.abilityName ?? offering.abilityName,
|
|
71106
|
+
abilityText: text.abilityText ?? offering.abilityText ?? this.t('christianityOfferingNoAbility'),
|
|
71107
|
+
statusText: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
|
|
71108
|
+
});
|
|
71109
|
+
}
|
|
71110
|
+
previewRenderType(typeLabel) {
|
|
71111
|
+
if (typeLabel === this.t('christianityLeaderCard'))
|
|
71112
|
+
return 'leader';
|
|
71113
|
+
if (typeLabel === this.t('christianityOfferingCard'))
|
|
71114
|
+
return 'offering';
|
|
71115
|
+
return 'character';
|
|
71116
|
+
}
|
|
71117
|
+
cardTypeIconUrl(card) {
|
|
71118
|
+
return this.cardTypeIconUrlForType(card.type);
|
|
71119
|
+
}
|
|
71120
|
+
previewTypeIconUrl() {
|
|
71121
|
+
const preview = this.selectedPreview();
|
|
71122
|
+
if (preview?.eyebrow === this.t('christianityLeaderCard'))
|
|
71123
|
+
return this.cardTypeIconUrlForType('leader');
|
|
71124
|
+
if (preview?.eyebrow === this.t('christianityOfferingCard'))
|
|
71125
|
+
return this.cardTypeIconUrlForType('offering');
|
|
71126
|
+
return this.cardTypeIconUrlForType('character');
|
|
71127
|
+
}
|
|
71128
|
+
cardTypeIconUrlForType(type) {
|
|
71129
|
+
const normalized = type.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
71130
|
+
const icon = normalized === 'lider' ? 'leader' : normalized === 'personaje' ? 'character' : normalized === 'ofrenda' ? 'offering' : normalized;
|
|
71131
|
+
return `assets/games/christianity/icons/${icon}.png`;
|
|
71132
|
+
}
|
|
71133
|
+
offeringPips(value) {
|
|
71134
|
+
const count = Number(value);
|
|
71135
|
+
if (!Number.isFinite(count) || count <= 0)
|
|
71136
|
+
return [];
|
|
71137
|
+
return Array.from({ length: Math.min(Math.floor(count), 5) });
|
|
71138
|
+
}
|
|
71139
|
+
battleSlots(seat) {
|
|
71140
|
+
const cards = this.game().players[seat].battleZone;
|
|
71141
|
+
const positionedCards = new Map();
|
|
71142
|
+
cards.forEach((card, index) => {
|
|
71143
|
+
const slot = Number.isInteger(card.slot) ? card.slot ?? index : index;
|
|
71144
|
+
if (slot >= 0 && slot < 4 && !positionedCards.has(slot)) {
|
|
71145
|
+
positionedCards.set(slot, card);
|
|
71146
|
+
}
|
|
71147
|
+
});
|
|
71148
|
+
return Array.from({ length: 4 }, (_, index) => ({
|
|
71149
|
+
trackId: positionedCards.get(index)?.instanceId ?? `${seat}-empty-${index}`,
|
|
71150
|
+
card: positionedCards.get(index),
|
|
71151
|
+
}));
|
|
71152
|
+
}
|
|
71153
|
+
battleSlotDropId(index) {
|
|
71154
|
+
return `christianity-battle-slot-${index}`;
|
|
71155
|
+
}
|
|
71156
|
+
dropTargetIds() {
|
|
71157
|
+
return ['christianity-offerings-drop', ...this.battleSlots('P1').map((_, index) => this.battleSlotDropId(index))];
|
|
71158
|
+
}
|
|
71159
|
+
hiddenHandCards(count) {
|
|
71160
|
+
return Array.from({ length: count });
|
|
71161
|
+
}
|
|
71162
|
+
fanTransform(index, total, opponent) {
|
|
71163
|
+
if (total <= 1)
|
|
71164
|
+
return 'none';
|
|
71165
|
+
const center = (total - 1) / 2;
|
|
71166
|
+
const offset = index - center;
|
|
71167
|
+
const rotate = offset * (opponent ? 6 : 5);
|
|
71168
|
+
const lift = Math.abs(offset) * 0.25;
|
|
71169
|
+
const hoverLift = opponent ? 0 : this.handWaveLift(index);
|
|
71170
|
+
const scale = opponent ? 1 : this.handWaveScale(index);
|
|
71171
|
+
const fanLift = opponent ? Math.abs(offset) * 0.22 : lift + hoverLift;
|
|
71172
|
+
const fanSpread = opponent ? offset * 0.02 : 0;
|
|
71173
|
+
return `translate(${fanSpread}rem, ${fanLift}rem) rotate(${rotate}deg) scale(${scale})`;
|
|
71174
|
+
}
|
|
71175
|
+
handCardZIndex(index) {
|
|
71176
|
+
const hovered = this.hoveredHandIndex();
|
|
71177
|
+
if (hovered === null)
|
|
71178
|
+
return 2;
|
|
71179
|
+
const distance = Math.abs(index - hovered);
|
|
71180
|
+
return Math.max(2, 8 - distance);
|
|
71181
|
+
}
|
|
71182
|
+
setHoveredHandIndex(index) {
|
|
71183
|
+
this.hoveredHandIndex.set(index);
|
|
71184
|
+
}
|
|
71185
|
+
clearHoveredHandIndex() {
|
|
71186
|
+
this.hoveredHandIndex.set(null);
|
|
71187
|
+
}
|
|
71188
|
+
releaseHoveredHand(event) {
|
|
71189
|
+
if (event.pointerType !== 'mouse') {
|
|
71190
|
+
window.setTimeout(() => this.clearHoveredHandIndex(), 180);
|
|
71191
|
+
}
|
|
71192
|
+
}
|
|
71193
|
+
handWaveLift(index) {
|
|
71194
|
+
const hovered = this.hoveredHandIndex();
|
|
71195
|
+
if (hovered === null)
|
|
71196
|
+
return 0;
|
|
71197
|
+
const distance = Math.abs(index - hovered);
|
|
71198
|
+
if (distance === 0)
|
|
71199
|
+
return -1.15;
|
|
71200
|
+
if (distance === 1)
|
|
71201
|
+
return -0.58;
|
|
71202
|
+
if (distance === 2)
|
|
71203
|
+
return -0.22;
|
|
71204
|
+
return 0;
|
|
71205
|
+
}
|
|
71206
|
+
handWaveScale(index) {
|
|
71207
|
+
const hovered = this.hoveredHandIndex();
|
|
71208
|
+
if (hovered === null)
|
|
71209
|
+
return 1;
|
|
71210
|
+
const distance = Math.abs(index - hovered);
|
|
71211
|
+
if (distance === 0)
|
|
71212
|
+
return 1.06;
|
|
71213
|
+
if (distance === 1)
|
|
71214
|
+
return 1.03;
|
|
71215
|
+
return 1;
|
|
71216
|
+
}
|
|
71217
|
+
readyOfferings(player) {
|
|
71218
|
+
return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), 0);
|
|
71219
|
+
}
|
|
71220
|
+
totalOfferings(player) {
|
|
71221
|
+
return player.offerings.reduce((total, offering) => total + offering.value, 0);
|
|
71222
|
+
}
|
|
71223
|
+
canPlay(card) {
|
|
71224
|
+
if (!this.isOwnTurn())
|
|
71225
|
+
return false;
|
|
71226
|
+
if (card.type === 'offering')
|
|
71227
|
+
return !this.player().offeringPlayedThisTurn;
|
|
71228
|
+
if (card.type === 'character')
|
|
71229
|
+
return this.readyOfferings(this.player()) >= (card.cost ?? 0) && this.player().battleZone.length < 4;
|
|
71230
|
+
return false;
|
|
71231
|
+
}
|
|
71232
|
+
canPlaySelected() {
|
|
71233
|
+
const selected = this.selectedHandCard();
|
|
71234
|
+
return !!selected && this.canPlay(this.cardDefinition(selected));
|
|
71235
|
+
}
|
|
71236
|
+
selectedActionLabel() {
|
|
71237
|
+
const selected = this.selectedCardDefinition();
|
|
71238
|
+
if (!selected)
|
|
71239
|
+
return this.t('christianityPlayCard');
|
|
71240
|
+
return selected.type === 'offering' ? this.t('christianityPlayOffering') : this.t('christianityPlayCard');
|
|
71241
|
+
}
|
|
71242
|
+
selectedActionDisabled() {
|
|
71243
|
+
const selected = this.selectedCardDefinition();
|
|
71244
|
+
if (!selected || !this.canPlay(selected))
|
|
71245
|
+
return true;
|
|
71246
|
+
return selected.type === 'character';
|
|
71247
|
+
}
|
|
71248
|
+
canPlaceSelectedCharacter() {
|
|
71249
|
+
const selected = this.selectedCardDefinition();
|
|
71250
|
+
return !!selected && selected.type === 'character' && this.canPlay(selected);
|
|
71251
|
+
}
|
|
71252
|
+
canPlaceSelectedOffering() {
|
|
71253
|
+
const selected = this.selectedCardDefinition();
|
|
71254
|
+
return !!selected && selected.type === 'offering' && this.canPlay(selected);
|
|
71255
|
+
}
|
|
71256
|
+
isDraggingCharacter() {
|
|
71257
|
+
const cardId = this.draggingCardId();
|
|
71258
|
+
if (!cardId)
|
|
71259
|
+
return false;
|
|
71260
|
+
const card = this.cardDefinition(cardId);
|
|
71261
|
+
return card.type === 'character' && this.canPlay(card);
|
|
71262
|
+
}
|
|
71263
|
+
isDraggingOffering() {
|
|
71264
|
+
const cardId = this.draggingCardId();
|
|
71265
|
+
if (!cardId)
|
|
71266
|
+
return false;
|
|
71267
|
+
const card = this.cardDefinition(cardId);
|
|
71268
|
+
return card.type === 'offering' && this.canPlay(card);
|
|
71269
|
+
}
|
|
71270
|
+
startDraggingCard(cardId) {
|
|
71271
|
+
this.selectedAttacker.set(null);
|
|
71272
|
+
this.selectedHandCard.set(cardId);
|
|
71273
|
+
this.draggingCardId.set(cardId);
|
|
71274
|
+
this.closePreview();
|
|
71275
|
+
}
|
|
71276
|
+
endDraggingCard() {
|
|
71277
|
+
this.draggingCardId.set(null);
|
|
71278
|
+
}
|
|
71279
|
+
dropOnBattleSlot(event, slotIndex) {
|
|
71280
|
+
const card = this.cardDefinition(event.item.data);
|
|
71281
|
+
if (card.type !== 'character')
|
|
71282
|
+
return;
|
|
71283
|
+
this.playCardFromHand(event.item.data, slotIndex);
|
|
71284
|
+
}
|
|
71285
|
+
dropOnOfferings(event) {
|
|
71286
|
+
const card = this.cardDefinition(event.item.data);
|
|
71287
|
+
if (card.type !== 'offering')
|
|
71288
|
+
return;
|
|
71289
|
+
this.playCardFromHand(event.item.data);
|
|
71290
|
+
}
|
|
71291
|
+
selectHandCard(cardId) {
|
|
71292
|
+
const wasSelected = this.selectedHandCard() === cardId;
|
|
71293
|
+
this.selectedAttacker.set(null);
|
|
71294
|
+
this.selectedHandCard.set(wasSelected ? null : cardId);
|
|
71295
|
+
this.closePreview();
|
|
71296
|
+
}
|
|
71297
|
+
playSelectedCard(slotIndex) {
|
|
71298
|
+
const cardId = this.selectedHandCard();
|
|
71299
|
+
if (!cardId)
|
|
71300
|
+
return;
|
|
71301
|
+
this.playCardFromHand(cardId, slotIndex);
|
|
71302
|
+
}
|
|
71303
|
+
playCardFromHand(cardId, slotIndex) {
|
|
71304
|
+
const card = this.cardDefinition(cardId);
|
|
71305
|
+
if (!this.canPlay(card))
|
|
71306
|
+
return;
|
|
71307
|
+
this.game.update(game => {
|
|
71308
|
+
const next = structuredClone(game);
|
|
71309
|
+
const player = next.players.P1;
|
|
71310
|
+
const handIndex = player.hand?.indexOf(cardId) ?? -1;
|
|
71311
|
+
if (handIndex < 0 || !player.hand)
|
|
71312
|
+
return game;
|
|
71313
|
+
player.hand.splice(handIndex, 1);
|
|
71314
|
+
if (card.type === 'offering') {
|
|
71315
|
+
player.offerings.push({
|
|
71316
|
+
instanceId: `p1_offering_${next.revision + 1}`,
|
|
71317
|
+
cardId: card.id,
|
|
71318
|
+
name: card.name,
|
|
71319
|
+
owner: 'P1',
|
|
71320
|
+
ready: true,
|
|
71321
|
+
value: card.offeringValue ?? card.life ?? 1,
|
|
71322
|
+
abilityName: card.abilityName,
|
|
71323
|
+
abilityText: card.abilityText,
|
|
71324
|
+
abilityCost: card.abilityCost,
|
|
71325
|
+
});
|
|
71326
|
+
player.offeringPlayedThisTurn = true;
|
|
71327
|
+
}
|
|
71328
|
+
else {
|
|
71329
|
+
this.spendOfferings(player, card.cost ?? 0);
|
|
71330
|
+
const occupiedSlots = new Set(player.battleZone.map((character, index) => Number.isInteger(character.slot) ? character.slot ?? index : index));
|
|
71331
|
+
const targetSlot = slotIndex ?? [0, 1, 2, 3].find(index => !occupiedSlots.has(index));
|
|
71332
|
+
if (targetSlot === undefined || occupiedSlots.has(targetSlot))
|
|
71333
|
+
return game;
|
|
71334
|
+
player.battleZone.push({
|
|
71335
|
+
instanceId: `p1_${next.revision + 1}_${player.battleZone.length}`,
|
|
71336
|
+
cardId: card.id,
|
|
71337
|
+
name: card.name,
|
|
71338
|
+
owner: 'P1',
|
|
71339
|
+
controller: 'P1',
|
|
71340
|
+
slot: targetSlot,
|
|
71341
|
+
attack: card.attack ?? 0,
|
|
71342
|
+
currentHp: card.life ?? 1,
|
|
71343
|
+
maxHp: card.life ?? 1,
|
|
71344
|
+
canAttack: false,
|
|
71345
|
+
});
|
|
71346
|
+
player.battleZone.sort((left, right) => (left.slot ?? 0) - (right.slot ?? 0));
|
|
71347
|
+
}
|
|
71348
|
+
next.revision++;
|
|
71349
|
+
next.log = [
|
|
71350
|
+
card.type === 'offering' ? `${card.name} queda lista como ofrenda.` : `${card.name} entra en batalla.`,
|
|
71351
|
+
...next.log,
|
|
71352
|
+
].slice(0, 4);
|
|
71353
|
+
return next;
|
|
71354
|
+
});
|
|
71355
|
+
this.selectedHandCard.set(null);
|
|
71356
|
+
this.draggingCardId.set(null);
|
|
71357
|
+
this.closePreview();
|
|
71358
|
+
}
|
|
71359
|
+
handleOfferingPile(seat) {
|
|
71360
|
+
this.openOfferings(seat);
|
|
71361
|
+
}
|
|
71362
|
+
selectAttacker(card) {
|
|
71363
|
+
this.selectedHandCard.set(null);
|
|
71364
|
+
if (!this.isOwnTurn() || !card.canAttack) {
|
|
71365
|
+
this.inspectCharacter(card);
|
|
71366
|
+
return;
|
|
71367
|
+
}
|
|
71368
|
+
this.closePreview();
|
|
71369
|
+
this.selectedAttacker.set(this.selectedAttacker()?.instanceId === card.instanceId ? null : card);
|
|
71370
|
+
}
|
|
71371
|
+
handleOpponentCharacter(card) {
|
|
71372
|
+
if (this.selectedAttacker()) {
|
|
71373
|
+
this.attackCharacter(card);
|
|
71374
|
+
return;
|
|
71375
|
+
}
|
|
71376
|
+
this.inspectCharacter(card);
|
|
71377
|
+
}
|
|
71378
|
+
handleOpponentLeader() {
|
|
71379
|
+
if (this.selectedAttacker() && !this.hasOpponentGuards()) {
|
|
71380
|
+
this.attackLeader();
|
|
71381
|
+
return;
|
|
71382
|
+
}
|
|
71383
|
+
this.inspectLeader('P2');
|
|
71384
|
+
}
|
|
71385
|
+
attackLeader() {
|
|
71386
|
+
const attacker = this.selectedAttacker();
|
|
71387
|
+
if (!attacker)
|
|
71388
|
+
return;
|
|
71389
|
+
if (this.hasOpponentGuards()) {
|
|
71390
|
+
this.selectedPreview.set({
|
|
71391
|
+
title: this.opponent().leaderName,
|
|
71392
|
+
eyebrow: this.t('christianityLeaderCard'),
|
|
71393
|
+
meta: `${this.opponent().leaderHp}/${this.opponent().leaderMaxHp}`,
|
|
71394
|
+
body: this.t('christianityLeaderProtected'),
|
|
71395
|
+
});
|
|
71396
|
+
return;
|
|
71397
|
+
}
|
|
71398
|
+
this.game.update(game => {
|
|
71399
|
+
const next = structuredClone(game);
|
|
71400
|
+
const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
|
|
71401
|
+
if (!liveAttacker || !liveAttacker.canAttack)
|
|
71402
|
+
return game;
|
|
71403
|
+
next.players.P2.leaderHp = Math.max(0, next.players.P2.leaderHp - liveAttacker.attack);
|
|
71404
|
+
liveAttacker.canAttack = false;
|
|
71405
|
+
next.revision++;
|
|
71406
|
+
next.log = [`${liveAttacker.name} ataca al lider rival.`, ...next.log].slice(0, 4);
|
|
71407
|
+
return next;
|
|
71408
|
+
});
|
|
71409
|
+
this.selectedAttacker.set(null);
|
|
71410
|
+
}
|
|
71411
|
+
attackCharacter(target) {
|
|
71412
|
+
const attacker = this.selectedAttacker();
|
|
71413
|
+
if (!attacker)
|
|
71414
|
+
return;
|
|
71415
|
+
this.game.update(game => {
|
|
71416
|
+
const next = structuredClone(game);
|
|
71417
|
+
const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
|
|
71418
|
+
const liveTarget = next.players.P2.battleZone.find(card => card.instanceId === target.instanceId);
|
|
71419
|
+
if (!liveAttacker || !liveTarget || !liveAttacker.canAttack)
|
|
71420
|
+
return game;
|
|
71421
|
+
liveTarget.currentHp -= liveAttacker.attack;
|
|
71422
|
+
liveAttacker.currentHp -= liveTarget.attack;
|
|
71423
|
+
liveAttacker.canAttack = false;
|
|
71424
|
+
this.cleanupDestroyed(next.players.P1, next);
|
|
71425
|
+
this.cleanupDestroyed(next.players.P2, next);
|
|
71426
|
+
next.revision++;
|
|
71427
|
+
next.log = [`${liveAttacker.name} combate contra ${liveTarget.name}.`, ...next.log].slice(0, 4);
|
|
71428
|
+
return next;
|
|
71429
|
+
});
|
|
71430
|
+
this.selectedAttacker.set(null);
|
|
71431
|
+
}
|
|
71432
|
+
endTurn() {
|
|
71433
|
+
this.selectedHandCard.set(null);
|
|
71434
|
+
this.selectedAttacker.set(null);
|
|
71435
|
+
this.selectedPreview.set(null);
|
|
71436
|
+
this.selectedInfo.set(null);
|
|
71437
|
+
this.game.update(game => {
|
|
71438
|
+
const next = structuredClone(game);
|
|
71439
|
+
next.turnOwner = next.turnOwner === 'P1' ? 'P2' : 'P1';
|
|
71440
|
+
next.turnCount++;
|
|
71441
|
+
const current = next.players[next.turnOwner];
|
|
71442
|
+
current.offeringPlayedThisTurn = false;
|
|
71443
|
+
current.offerings = current.offerings.map(offering => ({ ...offering, ready: true }));
|
|
71444
|
+
current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
|
|
71445
|
+
const drawnCard = next.sharedDeck.shift();
|
|
71446
|
+
if (drawnCard) {
|
|
71447
|
+
if (current.hand) {
|
|
71448
|
+
current.hand.push(drawnCard);
|
|
71449
|
+
}
|
|
71450
|
+
else {
|
|
71451
|
+
current.handCount = (current.handCount ?? 0) + 1;
|
|
71452
|
+
}
|
|
71453
|
+
}
|
|
71454
|
+
next.revision++;
|
|
71455
|
+
next.log = [
|
|
71456
|
+
drawnCard ? `${current.displayName} roba una carta.` : `El mazo esta vacio.`,
|
|
71457
|
+
`Turno de ${current.displayName}.`,
|
|
71458
|
+
...next.log,
|
|
71459
|
+
].slice(0, 4);
|
|
71460
|
+
return next;
|
|
71461
|
+
});
|
|
71462
|
+
}
|
|
71463
|
+
resetMock() {
|
|
71464
|
+
this.game.set(this.catalogLoaded() ? this.createTutorialGame(this.allCatalogCards()) : structuredClone(STARTING_GAME));
|
|
71465
|
+
this.selectedHandCard.set(null);
|
|
71466
|
+
this.selectedAttacker.set(null);
|
|
71467
|
+
this.selectedPreview.set(null);
|
|
71468
|
+
this.selectedInfo.set(null);
|
|
71469
|
+
this.showHistory.set(false);
|
|
71470
|
+
this.showGallery.set(false);
|
|
71471
|
+
this.offeringsSeat.set(null);
|
|
71472
|
+
}
|
|
71473
|
+
startTutorial() {
|
|
71474
|
+
this.resetMock();
|
|
71475
|
+
this.screen.set('table');
|
|
71476
|
+
}
|
|
71477
|
+
closePreview() {
|
|
71478
|
+
this.selectedPreview.set(null);
|
|
71479
|
+
this.resetPreviewTilt();
|
|
71480
|
+
}
|
|
71481
|
+
closeInfo() {
|
|
71482
|
+
this.selectedInfo.set(null);
|
|
71483
|
+
}
|
|
71484
|
+
openOfferings(seat) {
|
|
71485
|
+
this.selectedPreview.set(null);
|
|
71486
|
+
this.selectedInfo.set(null);
|
|
71487
|
+
this.showHistory.set(false);
|
|
71488
|
+
this.showGallery.set(false);
|
|
71489
|
+
this.offeringsSeat.set(seat);
|
|
71490
|
+
}
|
|
71491
|
+
openHistory() {
|
|
71492
|
+
this.selectedPreview.set(null);
|
|
71493
|
+
this.selectedInfo.set(null);
|
|
71494
|
+
this.offeringsSeat.set(null);
|
|
71495
|
+
this.showGallery.set(false);
|
|
71496
|
+
this.showHistory.set(true);
|
|
71497
|
+
}
|
|
71498
|
+
closeOfferings() {
|
|
71499
|
+
this.offeringsSeat.set(null);
|
|
71500
|
+
}
|
|
71501
|
+
openGallery() {
|
|
71502
|
+
this.selectedPreview.set(null);
|
|
71503
|
+
this.selectedInfo.set(null);
|
|
71504
|
+
this.offeringsSeat.set(null);
|
|
71505
|
+
this.showHistory.set(false);
|
|
71506
|
+
this.showGallery.set(true);
|
|
71507
|
+
}
|
|
71508
|
+
closeGallery() {
|
|
71509
|
+
this.showGallery.set(false);
|
|
71510
|
+
}
|
|
71511
|
+
setGallerySearch(event) {
|
|
71512
|
+
this.gallerySearch.set(event.target.value);
|
|
71513
|
+
}
|
|
71514
|
+
setGalleryType(event) {
|
|
71515
|
+
this.galleryType.set(event.target.value);
|
|
71516
|
+
}
|
|
71517
|
+
tiltPreview(event) {
|
|
71518
|
+
const bounds = event.currentTarget.getBoundingClientRect();
|
|
71519
|
+
const x = (event.clientX - bounds.left) / bounds.width - 0.5;
|
|
71520
|
+
const y = (event.clientY - bounds.top) / bounds.height - 0.5;
|
|
71521
|
+
this.previewTilt.set({
|
|
71522
|
+
rotateX: 5 - y * 18,
|
|
71523
|
+
rotateY: -5 + x * 18,
|
|
71524
|
+
shiftX: x * 10,
|
|
71525
|
+
shiftY: y * 10,
|
|
71526
|
+
});
|
|
71527
|
+
}
|
|
71528
|
+
resetPreviewTilt() {
|
|
71529
|
+
this.previewTilt.set({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
|
|
71530
|
+
}
|
|
71531
|
+
cleanupDestroyed(player, game) {
|
|
71532
|
+
const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
|
|
71533
|
+
if (!destroyed.length)
|
|
71534
|
+
return;
|
|
71535
|
+
game.historyZone.push(...destroyed.map(card => card.cardId));
|
|
71536
|
+
player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
|
|
71537
|
+
}
|
|
71538
|
+
inspectLeader(seat) {
|
|
71539
|
+
this.selectedInfo.set(null);
|
|
71540
|
+
const player = this.game().players[seat];
|
|
71541
|
+
const leader = player.leaderCardId ? this.cardDefinition(player.leaderCardId) : undefined;
|
|
71542
|
+
this.selectedPreview.set({
|
|
71543
|
+
title: leader ? this.translatedCardText(leader).name : player.leaderName,
|
|
71544
|
+
eyebrow: this.t('christianityLeaderCard'),
|
|
71545
|
+
meta: `${player.leaderHp}/${player.leaderMaxHp}`,
|
|
71546
|
+
body: seat === 'P2' && this.hasOpponentGuards() ? this.t('christianityLeaderProtected') : this.t('christianityLeaderBody'),
|
|
71547
|
+
cardId: player.leaderCardId,
|
|
71548
|
+
source: 'board',
|
|
71549
|
+
});
|
|
71550
|
+
}
|
|
71551
|
+
inspectOffering(offering) {
|
|
71552
|
+
this.selectedInfo.set(null);
|
|
71553
|
+
const definition = this.cardDefinition(offering.cardId);
|
|
71554
|
+
const text = this.translatedCardText(definition);
|
|
71555
|
+
this.selectedPreview.set({
|
|
71556
|
+
title: text.name,
|
|
71557
|
+
eyebrow: this.t('christianityOfferingCard'),
|
|
71558
|
+
meta: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
|
|
71559
|
+
body: text.abilityText ?? offering.abilityText ?? this.t('christianityOfferingBody'),
|
|
71560
|
+
cardId: offering.cardId,
|
|
71561
|
+
source: 'pile',
|
|
71562
|
+
});
|
|
71563
|
+
}
|
|
71564
|
+
offeringAbilityText(offering) {
|
|
71565
|
+
const text = this.translatedCardText(this.cardDefinition(offering.cardId));
|
|
71566
|
+
return text.abilityText ?? offering.abilityText ?? this.t('christianityOfferingNoAbility');
|
|
71567
|
+
}
|
|
71568
|
+
canUseOfferingAbility(offering, seat) {
|
|
71569
|
+
if (seat !== 'P1' || !this.isOwnTurn())
|
|
71570
|
+
return false;
|
|
71571
|
+
if (!offering.ready || !offering.abilityName)
|
|
71572
|
+
return false;
|
|
71573
|
+
return this.readyOfferings(this.game().players[seat]) >= (offering.abilityCost ?? 0);
|
|
71574
|
+
}
|
|
71575
|
+
useOfferingAbility(offering, seat) {
|
|
71576
|
+
if (!this.canUseOfferingAbility(offering, seat))
|
|
71577
|
+
return;
|
|
71578
|
+
this.game.update(game => {
|
|
71579
|
+
const next = structuredClone(game);
|
|
71580
|
+
const player = next.players[seat];
|
|
71581
|
+
const liveOffering = player.offerings.find(card => card.instanceId === offering.instanceId);
|
|
71582
|
+
if (!liveOffering || !liveOffering.ready)
|
|
71583
|
+
return game;
|
|
71584
|
+
const offeringId = liveOffering.instanceId;
|
|
71585
|
+
this.spendOfferings(player, liveOffering.abilityCost ?? 0);
|
|
71586
|
+
player.offerings = player.offerings.map(card => (card.instanceId === offeringId ? { ...card, ready: false } : card));
|
|
71587
|
+
player.leaderHp = Math.max(0, player.leaderHp - 1);
|
|
71588
|
+
next.revision++;
|
|
71589
|
+
next.log = [`${liveOffering.name}: ${liveOffering.abilityName}.`, ...next.log].slice(0, 4);
|
|
71590
|
+
return next;
|
|
71591
|
+
});
|
|
71592
|
+
}
|
|
71593
|
+
inspectDeck() {
|
|
71594
|
+
const remainingCards = this.game().sharedDeck.length;
|
|
71595
|
+
this.selectedPreview.set(null);
|
|
71596
|
+
this.selectedInfo.set({
|
|
71597
|
+
title: this.t('christianityDeck'),
|
|
71598
|
+
eyebrow: this.t('christianitySharedZone'),
|
|
71599
|
+
meta: `${remainingCards} ${remainingCards === 1 ? this.t('christianityCardRemaining') : this.t('christianityCardsRemaining')}`,
|
|
71600
|
+
body: this.t('christianityDeckBody'),
|
|
71601
|
+
facts: [
|
|
71602
|
+
this.t('christianityDeckRuleShared'),
|
|
71603
|
+
this.t('christianityDeckRuleDraw'),
|
|
71604
|
+
this.t('christianityDeckRuleEmpty'),
|
|
71605
|
+
],
|
|
71606
|
+
});
|
|
71607
|
+
}
|
|
71608
|
+
inspectHowToPlay() {
|
|
71609
|
+
this.selectedPreview.set(null);
|
|
71610
|
+
this.selectedInfo.set({
|
|
71611
|
+
title: this.t('christianityHowToPlay'),
|
|
71612
|
+
eyebrow: this.t('christianityGenesisEdition'),
|
|
71613
|
+
meta: this.t('christianityTutorialMode'),
|
|
71614
|
+
body: this.t('christianityHowToPlayIntro'),
|
|
71615
|
+
facts: [
|
|
71616
|
+
this.t('christianityHowToPlayGoal'),
|
|
71617
|
+
this.t('christianityHowToPlayTurn'),
|
|
71618
|
+
this.t('christianityHowToPlayOfferings'),
|
|
71619
|
+
this.t('christianityHowToPlayBattle'),
|
|
71620
|
+
],
|
|
71621
|
+
});
|
|
71622
|
+
}
|
|
71623
|
+
inspectHandCard(cardId, fromHand = false) {
|
|
71624
|
+
this.selectedInfo.set(null);
|
|
71625
|
+
const card = this.cardDefinition(cardId);
|
|
71626
|
+
const text = this.translatedCardText(card);
|
|
71627
|
+
if (fromHand) {
|
|
71628
|
+
this.selectedAttacker.set(null);
|
|
71629
|
+
this.selectedHandCard.set(cardId);
|
|
71630
|
+
}
|
|
71631
|
+
this.selectedPreview.set({
|
|
71632
|
+
title: text.name,
|
|
71633
|
+
eyebrow: this.cardTypeLabel(card),
|
|
71634
|
+
meta: this.cardPreviewMeta(card),
|
|
71635
|
+
body: this.defaultCardBody(card.type),
|
|
71636
|
+
cardId,
|
|
71637
|
+
source: fromHand ? 'hand' : 'pile',
|
|
71638
|
+
});
|
|
71639
|
+
}
|
|
71640
|
+
inspectGalleryCard(cardId) {
|
|
71641
|
+
this.inspectHandCard(cardId);
|
|
71642
|
+
}
|
|
71643
|
+
inspectHistoryCard(cardId) {
|
|
71644
|
+
this.showHistory.set(false);
|
|
71645
|
+
this.inspectHandCard(cardId);
|
|
71646
|
+
}
|
|
71647
|
+
inspectCharacter(card) {
|
|
71648
|
+
this.selectedInfo.set(null);
|
|
71649
|
+
const definition = this.cardDefinition(card.cardId);
|
|
71650
|
+
this.selectedPreview.set({
|
|
71651
|
+
title: this.translatedCardText(definition).name,
|
|
71652
|
+
eyebrow: this.t('christianityCharacterCard'),
|
|
71653
|
+
meta: `${card.attack}/${card.currentHp}`,
|
|
71654
|
+
body: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
|
|
71655
|
+
cardId: card.cardId,
|
|
71656
|
+
source: 'board',
|
|
71657
|
+
});
|
|
71658
|
+
}
|
|
71659
|
+
cardPreviewMeta(card) {
|
|
71660
|
+
if (card.type === 'offering')
|
|
71661
|
+
return `${card.offeringValue ?? card.life ?? 1}`;
|
|
71662
|
+
if (card.type === 'leader')
|
|
71663
|
+
return `${card.leaderLife ?? card.life ?? 0}`;
|
|
71664
|
+
if (card.type === 'character')
|
|
71665
|
+
return `${this.t('christianityCost')} ${card.cost ?? 0} · ${card.attack ?? 0}/${card.life ?? 0}`;
|
|
71666
|
+
if (card.cost !== undefined)
|
|
71667
|
+
return `${this.t('christianityCost')} ${card.cost}`;
|
|
71668
|
+
return card.collectorNumber ?? card.id;
|
|
71669
|
+
}
|
|
71670
|
+
spendOfferings(player, cost) {
|
|
71671
|
+
let remaining = cost;
|
|
71672
|
+
player.offerings = player.offerings.map(offering => {
|
|
71673
|
+
if (remaining <= 0 || !offering.ready)
|
|
71674
|
+
return offering;
|
|
71675
|
+
remaining -= offering.value;
|
|
71676
|
+
return { ...offering, ready: false };
|
|
71677
|
+
});
|
|
71678
|
+
}
|
|
71679
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
71680
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChristianityGameComponent, isStandalone: true, selector: "val-christianity-game", ngImport: i0, template: `
|
|
71681
|
+
<main class="christianity-shell">
|
|
71682
|
+
<section class="christianity-header">
|
|
71683
|
+
<div>
|
|
71684
|
+
<p>{{ t('christianityEyebrow') }}</p>
|
|
71685
|
+
<h1>{{ t('christianityTitle') }}</h1>
|
|
71686
|
+
</div>
|
|
71687
|
+
<div class="christianity-header-actions">
|
|
71688
|
+
@if (screen() !== 'splash') {
|
|
71689
|
+
<button type="button" class="christianity-gallery-open" valLightRipple (click)="openGallery()">
|
|
71690
|
+
{{ t('christianityGallery') }}
|
|
71691
|
+
</button>
|
|
71692
|
+
}
|
|
71693
|
+
@if (screen() === 'table') {
|
|
71694
|
+
<div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
|
|
71695
|
+
<span>{{ t('christianityTurn') }}</span>
|
|
71696
|
+
<strong>{{ currentPlayer().displayName }}</strong>
|
|
71697
|
+
</div>
|
|
71698
|
+
}
|
|
71699
|
+
</div>
|
|
71700
|
+
</section>
|
|
71701
|
+
|
|
71702
|
+
@if (screen() === 'splash') {
|
|
71703
|
+
<section class="christianity-splash" role="status" aria-live="polite">
|
|
71704
|
+
<div class="christianity-splash__mark">
|
|
71705
|
+
<i aria-hidden="true"></i>
|
|
71706
|
+
<i aria-hidden="true"></i>
|
|
71707
|
+
<i aria-hidden="true"></i>
|
|
71708
|
+
</div>
|
|
71709
|
+
<div>
|
|
71710
|
+
<span>{{ t('christianitySplashEyebrow') }}</span>
|
|
71711
|
+
<h2>{{ t('christianitySplashTitle') }}</h2>
|
|
71712
|
+
<p>{{ splashStatusText() }}</p>
|
|
71713
|
+
</div>
|
|
71714
|
+
</section>
|
|
71715
|
+
} @else if (screen() === 'home') {
|
|
71716
|
+
<section class="christianity-start">
|
|
71717
|
+
<div class="christianity-start__hero">
|
|
71718
|
+
<div class="christianity-start__copy">
|
|
71719
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
71720
|
+
<h2>{{ t('christianityStartTitle') }}</h2>
|
|
71721
|
+
<p>{{ t('christianityStartBody') }}</p>
|
|
71722
|
+
</div>
|
|
71723
|
+
<div class="christianity-start__fan" aria-hidden="true">
|
|
71724
|
+
@for (card of startFeaturedCards(); track card.id) {
|
|
71725
|
+
<val-christianity-card
|
|
71726
|
+
[card]="definitionToRenderCard(card)"
|
|
71727
|
+
variant="hand"
|
|
71728
|
+
[style.transform]="startFeaturedCardTransform($index)"
|
|
71729
|
+
></val-christianity-card>
|
|
71730
|
+
}
|
|
71731
|
+
</div>
|
|
71732
|
+
</div>
|
|
71733
|
+
<div class="christianity-start__cards">
|
|
71734
|
+
<article>
|
|
71735
|
+
<strong>{{ t('christianityTutorialMode') }}</strong>
|
|
71736
|
+
<p>{{ t('christianityTutorialModeBody') }}</p>
|
|
71737
|
+
<button type="button" class="christianity-primary-action" valLightRipple (click)="startTutorial()">
|
|
71738
|
+
{{ t('christianityStartTutorial') }}
|
|
71739
|
+
</button>
|
|
71740
|
+
</article>
|
|
71741
|
+
<article>
|
|
71742
|
+
<strong>{{ t('christianityGallery') }}</strong>
|
|
71743
|
+
<p>{{ t('christianityGalleryModeBody') }}</p>
|
|
71744
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="openGallery()">
|
|
71745
|
+
{{ t('christianityOpenGallery') }}
|
|
71746
|
+
</button>
|
|
71747
|
+
</article>
|
|
71748
|
+
<article>
|
|
71749
|
+
<strong>{{ t('christianityHowToPlay') }}</strong>
|
|
71750
|
+
<p>{{ t('christianityHowToPlayBody') }}</p>
|
|
71751
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="inspectHowToPlay()">
|
|
71752
|
+
{{ t('learnMore') }}
|
|
71753
|
+
</button>
|
|
71754
|
+
</article>
|
|
71755
|
+
</div>
|
|
71756
|
+
<div class="christianity-start__status" [attr.aria-label]="t('christianityEditionStatus')">
|
|
71757
|
+
<span>{{ galleryEditionLabel() }}</span>
|
|
71758
|
+
<span>{{ t('christianityTutorialActive') }}</span>
|
|
71759
|
+
<span>{{ catalogStatusLabel() }}</span>
|
|
71760
|
+
</div>
|
|
71761
|
+
<section class="christianity-start__modes" [attr.aria-label]="t('christianityFutureModes')">
|
|
71762
|
+
@for (mode of futureModes(); track mode.title) {
|
|
71763
|
+
<article>
|
|
71764
|
+
<strong>{{ mode.title }}</strong>
|
|
71765
|
+
<p>{{ mode.body }}</p>
|
|
71766
|
+
<span>{{ t('soonTitle') }}</span>
|
|
71767
|
+
</article>
|
|
71768
|
+
}
|
|
71769
|
+
</section>
|
|
71770
|
+
</section>
|
|
71771
|
+
} @else {
|
|
71772
|
+
<section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
|
|
71773
|
+
<article class="christianity-match-player">
|
|
71774
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
71775
|
+
<div>
|
|
71776
|
+
<strong>{{ player().displayName }}</strong>
|
|
71777
|
+
<small>{{ playerLeaderDisplayName(player()) }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
|
|
71778
|
+
</div>
|
|
71779
|
+
</article>
|
|
71780
|
+
<div class="christianity-scoreboard">
|
|
71781
|
+
<span>{{ t('christianityMatch') }}</span>
|
|
71782
|
+
<strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
|
|
71783
|
+
</div>
|
|
71784
|
+
<article class="christianity-match-player christianity-match-player--opponent">
|
|
71785
|
+
<span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
|
|
71786
|
+
<div>
|
|
71787
|
+
<strong>{{ opponent().displayName }}</strong>
|
|
71788
|
+
<small>{{ playerLeaderDisplayName(opponent()) }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
|
|
71789
|
+
</div>
|
|
71790
|
+
</article>
|
|
71791
|
+
</section>
|
|
71792
|
+
|
|
71793
|
+
<section class="christianity-hand-shelf christianity-hand-shelf--opponent">
|
|
71794
|
+
<div class="christianity-hand-meter christianity-hand-meter--opponent">
|
|
71795
|
+
<span>{{ t('christianityHand') }}</span>
|
|
71796
|
+
<strong>{{ opponentHandCount() }}</strong>
|
|
71797
|
+
</div>
|
|
71798
|
+
<section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
|
|
71799
|
+
@for (_ of hiddenHandCards(opponentHandCount()); track $index) {
|
|
71800
|
+
<button
|
|
71801
|
+
type="button"
|
|
71802
|
+
class="christianity-card-preview-card christianity-card-frame christianity-card-frame--back"
|
|
71803
|
+
valLightRipple
|
|
71804
|
+
[style.transform]="fanTransform($index, opponentHandCount(), true)"
|
|
71805
|
+
[attr.aria-label]="t('christianityHiddenCard')"
|
|
71806
|
+
></button>
|
|
71807
|
+
}
|
|
71808
|
+
</section>
|
|
71809
|
+
</section>
|
|
71810
|
+
|
|
71811
|
+
<section class="christianity-table" [attr.aria-label]="t('christianityTable')">
|
|
71812
|
+
<section class="christianity-player-side christianity-player-side--opponent">
|
|
71813
|
+
<section class="christianity-player-rack christianity-player-rack--opponent">
|
|
71814
|
+
<div class="christianity-offerings-zone">
|
|
71815
|
+
<button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
|
|
71816
|
+
<i aria-hidden="true"></i>
|
|
71817
|
+
<i aria-hidden="true"></i>
|
|
71818
|
+
<i aria-hidden="true"></i>
|
|
71819
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
71820
|
+
<strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
|
|
71821
|
+
</button>
|
|
71822
|
+
</div>
|
|
71823
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
|
|
71824
|
+
<val-christianity-card [card]="leaderRenderCard(opponent())" variant="table"></val-christianity-card>
|
|
71825
|
+
</button>
|
|
71826
|
+
<span class="christianity-rack-spacer" aria-hidden="true"></span>
|
|
71827
|
+
</section>
|
|
71828
|
+
|
|
71829
|
+
<section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
|
|
71830
|
+
@for (slot of battleSlots('P2'); track slot.trackId) {
|
|
71831
|
+
@if (slot.card) {
|
|
71832
|
+
<button
|
|
71833
|
+
type="button"
|
|
71834
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
71835
|
+
valLightRipple
|
|
71836
|
+
[class.is-target]="selectedAttacker()"
|
|
71837
|
+
(click)="handleOpponentCharacter(slot.card)"
|
|
71838
|
+
>
|
|
71839
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
71840
|
+
</button>
|
|
71841
|
+
} @else {
|
|
71842
|
+
<span class="christianity-slot"></span>
|
|
71843
|
+
}
|
|
71844
|
+
}
|
|
71845
|
+
</section>
|
|
71846
|
+
</section>
|
|
71847
|
+
|
|
71848
|
+
<section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
|
|
71849
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="openHistory()">
|
|
71850
|
+
<i aria-hidden="true"></i>
|
|
71851
|
+
<i aria-hidden="true"></i>
|
|
71852
|
+
<i aria-hidden="true"></i>
|
|
71853
|
+
<span>{{ t('christianityHistory') }}</span>
|
|
71854
|
+
<strong>{{ game().historyZone.length }}</strong>
|
|
71855
|
+
</button>
|
|
71856
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
|
|
71857
|
+
<i aria-hidden="true"></i>
|
|
71858
|
+
<i aria-hidden="true"></i>
|
|
71859
|
+
<i aria-hidden="true"></i>
|
|
71860
|
+
<span>{{ t('christianityDeck') }}</span>
|
|
71861
|
+
<strong>{{ game().sharedDeck.length }}</strong>
|
|
71862
|
+
</button>
|
|
71863
|
+
<div class="christianity-zone-card">
|
|
71864
|
+
<span>{{ t('christianityPlace') }}</span>
|
|
71865
|
+
<strong>{{ t('christianityEmpty') }}</strong>
|
|
71866
|
+
</div>
|
|
71867
|
+
</section>
|
|
71868
|
+
|
|
71869
|
+
<section class="christianity-player-side">
|
|
71870
|
+
<section class="christianity-battle-zone" [class.is-placing-card]="canPlaceSelectedCharacter() || isDraggingCharacter()" [attr.aria-label]="t('christianityYourBattle')">
|
|
71871
|
+
@for (slot of battleSlots('P1'); track slot.trackId) {
|
|
71872
|
+
@if (slot.card) {
|
|
71873
|
+
<button
|
|
71874
|
+
type="button"
|
|
71875
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
71876
|
+
valLightRipple
|
|
71877
|
+
[class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
|
|
71878
|
+
[class.is-exhausted]="!slot.card.canAttack"
|
|
71879
|
+
[class.is-ready-attacker]="isOwnTurn() && slot.card.canAttack"
|
|
71880
|
+
(click)="selectAttacker(slot.card)"
|
|
71881
|
+
>
|
|
71882
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
71883
|
+
</button>
|
|
71884
|
+
} @else {
|
|
71885
|
+
<button
|
|
71886
|
+
type="button"
|
|
71887
|
+
class="christianity-slot"
|
|
71888
|
+
cdkDropList
|
|
71889
|
+
[id]="battleSlotDropId($index)"
|
|
71890
|
+
[cdkDropListData]="$index"
|
|
71891
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
71892
|
+
[cdkDropListEnterPredicate]="canDropOnBattleSlot"
|
|
71893
|
+
[cdkDropListSortingDisabled]="true"
|
|
71894
|
+
[class.christianity-slot--play-target]="canPlaceSelectedCharacter() || isDraggingCharacter()"
|
|
71895
|
+
valLightRipple
|
|
71896
|
+
(cdkDropListDropped)="dropOnBattleSlot($event, $index)"
|
|
71897
|
+
(click)="playSelectedCard($index)"
|
|
71898
|
+
>
|
|
71899
|
+
@if (canPlaceSelectedCharacter() || isDraggingCharacter()) {
|
|
71900
|
+
<span>{{ t('christianityPlayHere') }}</span>
|
|
71901
|
+
}
|
|
71902
|
+
</button>
|
|
71903
|
+
}
|
|
71904
|
+
}
|
|
71905
|
+
</section>
|
|
71906
|
+
|
|
71907
|
+
<section class="christianity-player-rack">
|
|
71908
|
+
<div class="christianity-offerings-zone">
|
|
71909
|
+
<button
|
|
71910
|
+
type="button"
|
|
71911
|
+
class="christianity-offering-pile"
|
|
71912
|
+
cdkDropList
|
|
71913
|
+
id="christianity-offerings-drop"
|
|
71914
|
+
valLightRipple
|
|
71915
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
71916
|
+
[class.is-play-target]="canPlaceSelectedOffering() || isDraggingOffering()"
|
|
71917
|
+
[cdkDropListEnterPredicate]="canDropOnOfferings"
|
|
71918
|
+
[cdkDropListSortingDisabled]="true"
|
|
71919
|
+
(cdkDropListDropped)="dropOnOfferings($event)"
|
|
71920
|
+
(click)="handleOfferingPile('P1')"
|
|
71921
|
+
>
|
|
71922
|
+
<i aria-hidden="true"></i>
|
|
71923
|
+
<i aria-hidden="true"></i>
|
|
71924
|
+
<i aria-hidden="true"></i>
|
|
71925
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
71926
|
+
<strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
|
|
71927
|
+
</button>
|
|
71928
|
+
</div>
|
|
71929
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple (click)="inspectLeader('P1')">
|
|
71930
|
+
<val-christianity-card [card]="leaderRenderCard(player())" variant="table"></val-christianity-card>
|
|
71931
|
+
</button>
|
|
71932
|
+
<div class="christianity-player-command">
|
|
71933
|
+
<div class="christianity-player-badge">
|
|
71934
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
71935
|
+
<strong>{{ player().displayName }}</strong>
|
|
71936
|
+
</div>
|
|
71937
|
+
<button
|
|
71938
|
+
type="button"
|
|
71939
|
+
class="christianity-end-turn"
|
|
71940
|
+
(click)="endTurn()"
|
|
71941
|
+
>
|
|
71942
|
+
{{ t('christianityEndTurn') }}
|
|
71943
|
+
</button>
|
|
71944
|
+
</div>
|
|
71945
|
+
</section>
|
|
71946
|
+
</section>
|
|
71947
|
+
</section>
|
|
71948
|
+
|
|
71949
|
+
<section class="christianity-hand-shelf">
|
|
71950
|
+
<div class="christianity-hand-meter">
|
|
71951
|
+
<span>{{ t('christianityHand') }}</span>
|
|
71952
|
+
<strong>{{ player().hand?.length ?? 0 }}</strong>
|
|
71953
|
+
</div>
|
|
71954
|
+
<section
|
|
71955
|
+
class="christianity-hand-fan"
|
|
71956
|
+
cdkDropList
|
|
71957
|
+
id="christianity-hand-source"
|
|
71958
|
+
[cdkDropListConnectedTo]="dropTargetIds()"
|
|
71959
|
+
[attr.aria-label]="t('christianityYourHand')"
|
|
71960
|
+
(pointerleave)="clearHoveredHandIndex()"
|
|
71961
|
+
>
|
|
71962
|
+
@for (cardId of player().hand ?? []; track cardId + $index) {
|
|
71963
|
+
@let card = cardDefinition(cardId);
|
|
71964
|
+
<div
|
|
71965
|
+
class="christianity-hand-card-wrap"
|
|
71966
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
71967
|
+
[class.is-dragging]="draggingCardId() === cardId"
|
|
71968
|
+
[style.z-index]="handCardZIndex($index)"
|
|
71969
|
+
[style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
|
|
71970
|
+
(pointerenter)="setHoveredHandIndex($index)"
|
|
71971
|
+
(pointerdown)="setHoveredHandIndex($index)"
|
|
71972
|
+
(pointerup)="releaseHoveredHand($event)"
|
|
71973
|
+
>
|
|
71974
|
+
<button
|
|
71975
|
+
type="button"
|
|
71976
|
+
class="christianity-card-preview-card christianity-card-preview-card--hand christianity-render-card-button"
|
|
71977
|
+
cdkDrag
|
|
71978
|
+
valLightRipple
|
|
71979
|
+
[cdkDragData]="cardId"
|
|
71980
|
+
[cdkDragDisabled]="!canPlay(card)"
|
|
71981
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
71982
|
+
[class.is-disabled]="!canPlay(card)"
|
|
71983
|
+
(cdkDragStarted)="startDraggingCard(cardId)"
|
|
71984
|
+
(cdkDragEnded)="endDraggingCard()"
|
|
71985
|
+
(click)="selectHandCard(cardId)"
|
|
71986
|
+
>
|
|
71987
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="hand"></val-christianity-card>
|
|
71988
|
+
</button>
|
|
71989
|
+
<button
|
|
71990
|
+
type="button"
|
|
71991
|
+
class="christianity-card-eye"
|
|
71992
|
+
[attr.aria-label]="t('christianityPreviewCard')"
|
|
71993
|
+
(click)="inspectHandCard(cardId, true); $event.stopPropagation()"
|
|
71994
|
+
></button>
|
|
71995
|
+
</div>
|
|
71996
|
+
}
|
|
71997
|
+
</section>
|
|
71998
|
+
</section>
|
|
71999
|
+
}
|
|
72000
|
+
|
|
72001
|
+
@if (selectedPreview()) {
|
|
72002
|
+
<button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
|
|
72003
|
+
<aside
|
|
72004
|
+
class="christianity-floating-card-shell"
|
|
72005
|
+
aria-live="polite"
|
|
72006
|
+
>
|
|
72007
|
+
<button type="button" class="christianity-floating-card-close" (click)="closePreview()">
|
|
72008
|
+
{{ t('close') }}
|
|
72009
|
+
</button>
|
|
72010
|
+
<div
|
|
72011
|
+
class="christianity-floating-card"
|
|
72012
|
+
[style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
|
|
72013
|
+
[style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
|
|
72014
|
+
[style.--preview-shift-x]="previewTilt().shiftX + 'px'"
|
|
72015
|
+
[style.--preview-shift-y]="previewTilt().shiftY + 'px'"
|
|
72016
|
+
(pointermove)="tiltPreview($event)"
|
|
72017
|
+
(pointerleave)="resetPreviewTilt()"
|
|
72018
|
+
>
|
|
72019
|
+
@if (selectedPreviewRenderCard(); as previewCard) {
|
|
72020
|
+
<val-christianity-card [card]="previewCard" variant="full"></val-christianity-card>
|
|
72021
|
+
}
|
|
72022
|
+
</div>
|
|
72023
|
+
@if (previewRule(); as rule) {
|
|
72024
|
+
<div class="christianity-preview-rule-note">
|
|
72025
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72026
|
+
<div>
|
|
72027
|
+
<small>{{ t('christianityCardRule') }}</small>
|
|
72028
|
+
<strong>{{ rule.title }}</strong>
|
|
72029
|
+
<p>{{ rule.body }}</p>
|
|
72030
|
+
</div>
|
|
72031
|
+
</div>
|
|
72032
|
+
}
|
|
72033
|
+
</aside>
|
|
72034
|
+
}
|
|
72035
|
+
|
|
72036
|
+
@if (selectedInfo(); as info) {
|
|
72037
|
+
<button type="button" class="christianity-info-backdrop" [attr.aria-label]="t('close')" (click)="closeInfo()"></button>
|
|
72038
|
+
<aside class="christianity-info-panel" aria-live="polite">
|
|
72039
|
+
<button type="button" class="christianity-dialog-close christianity-info-close" (click)="closeInfo()">
|
|
72040
|
+
{{ t('close') }}
|
|
72041
|
+
</button>
|
|
72042
|
+
<div class="christianity-rule-note">
|
|
72043
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72044
|
+
<div>
|
|
72045
|
+
<small>{{ info.eyebrow }}</small>
|
|
72046
|
+
<h2>{{ info.title }}</h2>
|
|
72047
|
+
<strong>{{ info.meta }}</strong>
|
|
72048
|
+
<p>{{ info.body }}</p>
|
|
72049
|
+
<ul>
|
|
72050
|
+
@for (fact of info.facts; track fact) {
|
|
72051
|
+
<li>{{ fact }}</li>
|
|
72052
|
+
}
|
|
72053
|
+
</ul>
|
|
72054
|
+
</div>
|
|
72055
|
+
</div>
|
|
72056
|
+
</aside>
|
|
72057
|
+
}
|
|
72058
|
+
|
|
72059
|
+
@if (screen() === 'table') {
|
|
72060
|
+
<section class="christianity-actions" aria-live="polite">
|
|
72061
|
+
<p>{{ statusText() }}</p>
|
|
72062
|
+
<div>
|
|
72063
|
+
<button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
|
|
72064
|
+
{{ selectedActionLabel() }}
|
|
72065
|
+
</button>
|
|
72066
|
+
<button type="button" (click)="resetMock()">
|
|
72067
|
+
{{ t('christianityReset') }}
|
|
72068
|
+
</button>
|
|
72069
|
+
</div>
|
|
72070
|
+
</section>
|
|
72071
|
+
}
|
|
72072
|
+
|
|
72073
|
+
@if (showHistory()) {
|
|
72074
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
|
|
72075
|
+
<section class="christianity-history-drawer">
|
|
72076
|
+
<header>
|
|
72077
|
+
<h2>{{ t('christianityHistory') }}</h2>
|
|
72078
|
+
<div class="christianity-dialog-actions">
|
|
72079
|
+
<span>{{ game().historyZone.length }}</span>
|
|
72080
|
+
<button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
|
|
72081
|
+
{{ t('close') }}
|
|
72082
|
+
</button>
|
|
72083
|
+
</div>
|
|
72084
|
+
</header>
|
|
72085
|
+
@if (game().historyZone.length) {
|
|
72086
|
+
<div class="christianity-history-grid">
|
|
72087
|
+
@for (cardId of game().historyZone; track cardId + $index) {
|
|
72088
|
+
@let card = cardDefinition(cardId);
|
|
72089
|
+
<button type="button" class="christianity-card-preview-card christianity-render-card-button" valLightRipple (click)="inspectHistoryCard(cardId)">
|
|
72090
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72091
|
+
</button>
|
|
72092
|
+
}
|
|
72093
|
+
</div>
|
|
72094
|
+
} @else {
|
|
72095
|
+
<p>{{ t('christianityHistoryEmpty') }}</p>
|
|
72096
|
+
}
|
|
72097
|
+
</section>
|
|
72098
|
+
}
|
|
72099
|
+
|
|
72100
|
+
@if (showGallery()) {
|
|
72101
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseGallery')" (click)="closeGallery()"></button>
|
|
72102
|
+
<section class="christianity-history-drawer christianity-gallery-drawer">
|
|
72103
|
+
<header>
|
|
72104
|
+
<div>
|
|
72105
|
+
<h2>{{ t('christianityGallery') }}</h2>
|
|
72106
|
+
<p>{{ galleryEditionLabel() }}</p>
|
|
72107
|
+
</div>
|
|
72108
|
+
<div class="christianity-dialog-actions">
|
|
72109
|
+
<span>{{ galleryCards().length }}</span>
|
|
72110
|
+
<button type="button" class="christianity-dialog-close" (click)="closeGallery()">
|
|
72111
|
+
{{ t('close') }}
|
|
72112
|
+
</button>
|
|
72113
|
+
</div>
|
|
72114
|
+
</header>
|
|
72115
|
+
<div class="christianity-gallery-controls">
|
|
72116
|
+
<label>
|
|
72117
|
+
<span>{{ t('christianityGallerySearch') }}</span>
|
|
72118
|
+
<input type="search" [value]="gallerySearch()" (input)="setGallerySearch($event)" [placeholder]="t('christianityGallerySearchPlaceholder')" />
|
|
72119
|
+
</label>
|
|
72120
|
+
<label>
|
|
72121
|
+
<span>{{ t('christianityGalleryFilter') }}</span>
|
|
72122
|
+
<select [value]="galleryType()" (change)="setGalleryType($event)">
|
|
72123
|
+
@for (option of galleryTypeOptions(); track option.value) {
|
|
72124
|
+
<option [value]="option.value">{{ option.label }}</option>
|
|
72125
|
+
}
|
|
72126
|
+
</select>
|
|
72127
|
+
</label>
|
|
72128
|
+
</div>
|
|
72129
|
+
<div class="christianity-gallery-edition-strip">
|
|
72130
|
+
<button type="button" class="is-active" valLightRipple>
|
|
72131
|
+
<img [src]="galleryEditionIcon()" alt="" />
|
|
72132
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
72133
|
+
</button>
|
|
72134
|
+
</div>
|
|
72135
|
+
<div class="christianity-gallery-grid">
|
|
72136
|
+
@for (card of galleryCards(); track card.id) {
|
|
72137
|
+
<button type="button" class="christianity-card-preview-card christianity-render-card-button" valLightRipple (click)="inspectGalleryCard(card.id)">
|
|
72138
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72139
|
+
</button>
|
|
72140
|
+
} @empty {
|
|
72141
|
+
<p>{{ t('christianityGalleryEmpty') }}</p>
|
|
72142
|
+
}
|
|
72143
|
+
</div>
|
|
72144
|
+
</section>
|
|
72145
|
+
}
|
|
72146
|
+
|
|
72147
|
+
@if (offeringsSeat()) {
|
|
72148
|
+
@let offeringPlayer = game().players[offeringsSeat()!];
|
|
72149
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
|
|
72150
|
+
<section class="christianity-history-drawer christianity-offerings-drawer">
|
|
72151
|
+
<header>
|
|
72152
|
+
<h2>{{ t('christianityOfferings') }}</h2>
|
|
72153
|
+
<div class="christianity-dialog-actions">
|
|
72154
|
+
<span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
|
|
72155
|
+
<button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
|
|
72156
|
+
{{ t('close') }}
|
|
72157
|
+
</button>
|
|
72158
|
+
</div>
|
|
72159
|
+
</header>
|
|
72160
|
+
<div class="christianity-offerings-note">
|
|
72161
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72162
|
+
<p>{{ t('christianityOfferingsRuleBody') }}</p>
|
|
72163
|
+
</div>
|
|
72164
|
+
<div class="christianity-offering-list">
|
|
72165
|
+
@for (offering of offeringPlayer.offerings; track offering.instanceId) {
|
|
72166
|
+
<article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
|
|
72167
|
+
<button type="button" class="christianity-offering-card christianity-render-card-button" valLightRipple (click)="inspectOffering(offering)">
|
|
72168
|
+
<val-christianity-card [card]="offeringRenderCard(offering)" variant="list"></val-christianity-card>
|
|
72169
|
+
</button>
|
|
72170
|
+
<div>
|
|
72171
|
+
<strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
|
|
72172
|
+
<p>{{ offeringAbilityText(offering) }}</p>
|
|
72173
|
+
@if (offering.abilityName) {
|
|
72174
|
+
<button
|
|
72175
|
+
type="button"
|
|
72176
|
+
[disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
|
|
72177
|
+
(click)="useOfferingAbility(offering, offeringsSeat()!)"
|
|
72178
|
+
>
|
|
72179
|
+
{{ t('christianityUseAbility') }}
|
|
72180
|
+
</button>
|
|
72181
|
+
}
|
|
72182
|
+
</div>
|
|
72183
|
+
</article>
|
|
72184
|
+
}
|
|
72185
|
+
</div>
|
|
72186
|
+
</section>
|
|
72187
|
+
}
|
|
72188
|
+
</main>
|
|
72189
|
+
`, isInline: true, styles: [":host{--christianity-theme-ink: var(--val-text-color, #1f2933);--christianity-theme-surface: #ffffff;--christianity-theme-parchment: #fffaf0;--christianity-theme-olive: #5f6f2a;--christianity-theme-gold: #d6a21d;--christianity-theme-gold-soft: rgba(214, 162, 29, .18);--christianity-theme-gold-ring: rgba(214, 162, 29, .48);--christianity-theme-glow: rgba(245, 199, 85, .32);--christianity-theme-focus: #2563eb;--christianity-theme-shadow: rgba(82, 64, 28, .18);--christianity-theme-shadow-strong: rgba(82, 64, 28, .3);--christianity-card-aspect: 5 / 7.45;--christianity-card-back: linear-gradient(135deg, rgba(16, 42, 67, .16), rgba(16, 42, 67, .03)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);--christianity-card-back-soft: linear-gradient(135deg, rgba(16, 42, 67, .11), rgba(16, 42, 67, .02)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);display:block;max-width:100%;min-width:0;overflow-x:clip;color:var(--christianity-theme-ink)}.christianity-shell{box-sizing:border-box;display:grid;gap:.65rem;width:100%;max-width:100%;min-width:0;padding:.75rem .25rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb;overflow-x:clip;overflow-y:visible}.christianity-header,.christianity-match-strip,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-header h1,.christianity-header p,.christianity-match-player strong,.christianity-match-player small,.christianity-scoreboard span,.christianity-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header-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 rgba(214,162,29,.38);border-radius:999px;background:linear-gradient(180deg,#fffaf0fa,#fffffffa),radial-gradient(circle at 20% 0%,rgba(214,162,29,.18),transparent 42%);color:var(--christianity-theme-ink);font:inherit;font-size:.82rem;font-weight:800;box-shadow:0 .55rem 1.2rem #52401c1a}.christianity-splash,.christianity-start{min-height:min(34rem,calc(100dvh - 8rem));border:1px solid rgba(214,162,29,.2);border-radius:.9rem;background:radial-gradient(circle at 50% 18%,rgba(245,199,85,.2),transparent 22rem),linear-gradient(180deg,#fffaf0eb,#fffffff5),var(--christianity-card-back-soft);box-shadow:0 1.2rem 3.2rem #52401c1f}.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(1rem,4vw,2.2rem)}.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(214,162,29,.26);border-radius:999px;background:#fffaf0e0;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 rgba(214,162,29,.38);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-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;gap:.55rem;width:min(26rem,calc(100vw - 1.25rem));padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-floating-card{position:relative;z-index:1;display: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%}.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(29rem,calc(100vw - 3rem))}.christianity-floating-card{min-height:0;padding:0}}.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),58rem);min-height:min(25rem,calc(100dvh - 1rem));max-height:min(42rem,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(6.4rem,1fr));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%,5.8rem)}.christianity-gallery-grid .christianity-render-card-button{justify-self:center;width:min(100%,6.6rem)}.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}@media (max-width: 720px){.christianity-shell{padding:.55rem 0;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-match-strip{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:.35rem;padding:.35rem}.christianity-match-player{gap:.35rem}.christianity-match-player small{display:none}.christianity-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));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.7rem,1fr))}.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"] }] }); }
|
|
72190
|
+
}
|
|
72191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, decorators: [{
|
|
72192
|
+
type: Component,
|
|
72193
|
+
args: [{ selector: 'val-christianity-game', standalone: true, imports: [CdkDrag, CdkDropList, LightRippleDirective, ChristianityCardComponent], template: `
|
|
72194
|
+
<main class="christianity-shell">
|
|
72195
|
+
<section class="christianity-header">
|
|
72196
|
+
<div>
|
|
72197
|
+
<p>{{ t('christianityEyebrow') }}</p>
|
|
72198
|
+
<h1>{{ t('christianityTitle') }}</h1>
|
|
72199
|
+
</div>
|
|
72200
|
+
<div class="christianity-header-actions">
|
|
72201
|
+
@if (screen() !== 'splash') {
|
|
72202
|
+
<button type="button" class="christianity-gallery-open" valLightRipple (click)="openGallery()">
|
|
72203
|
+
{{ t('christianityGallery') }}
|
|
72204
|
+
</button>
|
|
72205
|
+
}
|
|
72206
|
+
@if (screen() === 'table') {
|
|
72207
|
+
<div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
|
|
72208
|
+
<span>{{ t('christianityTurn') }}</span>
|
|
72209
|
+
<strong>{{ currentPlayer().displayName }}</strong>
|
|
72210
|
+
</div>
|
|
72211
|
+
}
|
|
72212
|
+
</div>
|
|
72213
|
+
</section>
|
|
72214
|
+
|
|
72215
|
+
@if (screen() === 'splash') {
|
|
72216
|
+
<section class="christianity-splash" role="status" aria-live="polite">
|
|
72217
|
+
<div class="christianity-splash__mark">
|
|
72218
|
+
<i aria-hidden="true"></i>
|
|
72219
|
+
<i aria-hidden="true"></i>
|
|
72220
|
+
<i aria-hidden="true"></i>
|
|
72221
|
+
</div>
|
|
72222
|
+
<div>
|
|
72223
|
+
<span>{{ t('christianitySplashEyebrow') }}</span>
|
|
72224
|
+
<h2>{{ t('christianitySplashTitle') }}</h2>
|
|
72225
|
+
<p>{{ splashStatusText() }}</p>
|
|
72226
|
+
</div>
|
|
72227
|
+
</section>
|
|
72228
|
+
} @else if (screen() === 'home') {
|
|
72229
|
+
<section class="christianity-start">
|
|
72230
|
+
<div class="christianity-start__hero">
|
|
72231
|
+
<div class="christianity-start__copy">
|
|
72232
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
72233
|
+
<h2>{{ t('christianityStartTitle') }}</h2>
|
|
72234
|
+
<p>{{ t('christianityStartBody') }}</p>
|
|
72235
|
+
</div>
|
|
72236
|
+
<div class="christianity-start__fan" aria-hidden="true">
|
|
72237
|
+
@for (card of startFeaturedCards(); track card.id) {
|
|
72238
|
+
<val-christianity-card
|
|
72239
|
+
[card]="definitionToRenderCard(card)"
|
|
72240
|
+
variant="hand"
|
|
72241
|
+
[style.transform]="startFeaturedCardTransform($index)"
|
|
72242
|
+
></val-christianity-card>
|
|
72243
|
+
}
|
|
72244
|
+
</div>
|
|
72245
|
+
</div>
|
|
72246
|
+
<div class="christianity-start__cards">
|
|
72247
|
+
<article>
|
|
72248
|
+
<strong>{{ t('christianityTutorialMode') }}</strong>
|
|
72249
|
+
<p>{{ t('christianityTutorialModeBody') }}</p>
|
|
72250
|
+
<button type="button" class="christianity-primary-action" valLightRipple (click)="startTutorial()">
|
|
72251
|
+
{{ t('christianityStartTutorial') }}
|
|
72252
|
+
</button>
|
|
72253
|
+
</article>
|
|
72254
|
+
<article>
|
|
72255
|
+
<strong>{{ t('christianityGallery') }}</strong>
|
|
72256
|
+
<p>{{ t('christianityGalleryModeBody') }}</p>
|
|
72257
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="openGallery()">
|
|
72258
|
+
{{ t('christianityOpenGallery') }}
|
|
72259
|
+
</button>
|
|
72260
|
+
</article>
|
|
72261
|
+
<article>
|
|
72262
|
+
<strong>{{ t('christianityHowToPlay') }}</strong>
|
|
72263
|
+
<p>{{ t('christianityHowToPlayBody') }}</p>
|
|
72264
|
+
<button type="button" class="christianity-secondary-action" valLightRipple (click)="inspectHowToPlay()">
|
|
72265
|
+
{{ t('learnMore') }}
|
|
72266
|
+
</button>
|
|
72267
|
+
</article>
|
|
72268
|
+
</div>
|
|
72269
|
+
<div class="christianity-start__status" [attr.aria-label]="t('christianityEditionStatus')">
|
|
72270
|
+
<span>{{ galleryEditionLabel() }}</span>
|
|
72271
|
+
<span>{{ t('christianityTutorialActive') }}</span>
|
|
72272
|
+
<span>{{ catalogStatusLabel() }}</span>
|
|
72273
|
+
</div>
|
|
72274
|
+
<section class="christianity-start__modes" [attr.aria-label]="t('christianityFutureModes')">
|
|
72275
|
+
@for (mode of futureModes(); track mode.title) {
|
|
72276
|
+
<article>
|
|
72277
|
+
<strong>{{ mode.title }}</strong>
|
|
72278
|
+
<p>{{ mode.body }}</p>
|
|
72279
|
+
<span>{{ t('soonTitle') }}</span>
|
|
72280
|
+
</article>
|
|
72281
|
+
}
|
|
72282
|
+
</section>
|
|
72283
|
+
</section>
|
|
72284
|
+
} @else {
|
|
72285
|
+
<section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
|
|
72286
|
+
<article class="christianity-match-player">
|
|
72287
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
72288
|
+
<div>
|
|
72289
|
+
<strong>{{ player().displayName }}</strong>
|
|
72290
|
+
<small>{{ playerLeaderDisplayName(player()) }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
|
|
72291
|
+
</div>
|
|
72292
|
+
</article>
|
|
72293
|
+
<div class="christianity-scoreboard">
|
|
72294
|
+
<span>{{ t('christianityMatch') }}</span>
|
|
72295
|
+
<strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
|
|
72296
|
+
</div>
|
|
72297
|
+
<article class="christianity-match-player christianity-match-player--opponent">
|
|
72298
|
+
<span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
|
|
72299
|
+
<div>
|
|
72300
|
+
<strong>{{ opponent().displayName }}</strong>
|
|
72301
|
+
<small>{{ playerLeaderDisplayName(opponent()) }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
|
|
72302
|
+
</div>
|
|
72303
|
+
</article>
|
|
72304
|
+
</section>
|
|
72305
|
+
|
|
72306
|
+
<section class="christianity-hand-shelf christianity-hand-shelf--opponent">
|
|
72307
|
+
<div class="christianity-hand-meter christianity-hand-meter--opponent">
|
|
72308
|
+
<span>{{ t('christianityHand') }}</span>
|
|
72309
|
+
<strong>{{ opponentHandCount() }}</strong>
|
|
72310
|
+
</div>
|
|
72311
|
+
<section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
|
|
72312
|
+
@for (_ of hiddenHandCards(opponentHandCount()); track $index) {
|
|
72313
|
+
<button
|
|
72314
|
+
type="button"
|
|
72315
|
+
class="christianity-card-preview-card christianity-card-frame christianity-card-frame--back"
|
|
72316
|
+
valLightRipple
|
|
72317
|
+
[style.transform]="fanTransform($index, opponentHandCount(), true)"
|
|
72318
|
+
[attr.aria-label]="t('christianityHiddenCard')"
|
|
72319
|
+
></button>
|
|
72320
|
+
}
|
|
72321
|
+
</section>
|
|
72322
|
+
</section>
|
|
72323
|
+
|
|
72324
|
+
<section class="christianity-table" [attr.aria-label]="t('christianityTable')">
|
|
72325
|
+
<section class="christianity-player-side christianity-player-side--opponent">
|
|
72326
|
+
<section class="christianity-player-rack christianity-player-rack--opponent">
|
|
72327
|
+
<div class="christianity-offerings-zone">
|
|
72328
|
+
<button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
|
|
72329
|
+
<i aria-hidden="true"></i>
|
|
72330
|
+
<i aria-hidden="true"></i>
|
|
72331
|
+
<i aria-hidden="true"></i>
|
|
72332
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
72333
|
+
<strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
|
|
72334
|
+
</button>
|
|
72335
|
+
</div>
|
|
72336
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
|
|
72337
|
+
<val-christianity-card [card]="leaderRenderCard(opponent())" variant="table"></val-christianity-card>
|
|
72338
|
+
</button>
|
|
72339
|
+
<span class="christianity-rack-spacer" aria-hidden="true"></span>
|
|
72340
|
+
</section>
|
|
72341
|
+
|
|
72342
|
+
<section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
|
|
72343
|
+
@for (slot of battleSlots('P2'); track slot.trackId) {
|
|
72344
|
+
@if (slot.card) {
|
|
72345
|
+
<button
|
|
72346
|
+
type="button"
|
|
72347
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
72348
|
+
valLightRipple
|
|
72349
|
+
[class.is-target]="selectedAttacker()"
|
|
72350
|
+
(click)="handleOpponentCharacter(slot.card)"
|
|
72351
|
+
>
|
|
72352
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
72353
|
+
</button>
|
|
72354
|
+
} @else {
|
|
72355
|
+
<span class="christianity-slot"></span>
|
|
72356
|
+
}
|
|
72357
|
+
}
|
|
72358
|
+
</section>
|
|
72359
|
+
</section>
|
|
72360
|
+
|
|
72361
|
+
<section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
|
|
72362
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="openHistory()">
|
|
72363
|
+
<i aria-hidden="true"></i>
|
|
72364
|
+
<i aria-hidden="true"></i>
|
|
72365
|
+
<i aria-hidden="true"></i>
|
|
72366
|
+
<span>{{ t('christianityHistory') }}</span>
|
|
72367
|
+
<strong>{{ game().historyZone.length }}</strong>
|
|
72368
|
+
</button>
|
|
72369
|
+
<button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
|
|
72370
|
+
<i aria-hidden="true"></i>
|
|
72371
|
+
<i aria-hidden="true"></i>
|
|
72372
|
+
<i aria-hidden="true"></i>
|
|
72373
|
+
<span>{{ t('christianityDeck') }}</span>
|
|
72374
|
+
<strong>{{ game().sharedDeck.length }}</strong>
|
|
72375
|
+
</button>
|
|
72376
|
+
<div class="christianity-zone-card">
|
|
72377
|
+
<span>{{ t('christianityPlace') }}</span>
|
|
72378
|
+
<strong>{{ t('christianityEmpty') }}</strong>
|
|
72379
|
+
</div>
|
|
72380
|
+
</section>
|
|
72381
|
+
|
|
72382
|
+
<section class="christianity-player-side">
|
|
72383
|
+
<section class="christianity-battle-zone" [class.is-placing-card]="canPlaceSelectedCharacter() || isDraggingCharacter()" [attr.aria-label]="t('christianityYourBattle')">
|
|
72384
|
+
@for (slot of battleSlots('P1'); track slot.trackId) {
|
|
72385
|
+
@if (slot.card) {
|
|
72386
|
+
<button
|
|
72387
|
+
type="button"
|
|
72388
|
+
class="christianity-card-preview-card christianity-card-preview-card--battle christianity-render-card-button"
|
|
72389
|
+
valLightRipple
|
|
72390
|
+
[class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
|
|
72391
|
+
[class.is-exhausted]="!slot.card.canAttack"
|
|
72392
|
+
[class.is-ready-attacker]="isOwnTurn() && slot.card.canAttack"
|
|
72393
|
+
(click)="selectAttacker(slot.card)"
|
|
72394
|
+
>
|
|
72395
|
+
<val-christianity-card [card]="characterRenderCard(slot.card)" variant="table"></val-christianity-card>
|
|
72396
|
+
</button>
|
|
72397
|
+
} @else {
|
|
72398
|
+
<button
|
|
72399
|
+
type="button"
|
|
72400
|
+
class="christianity-slot"
|
|
72401
|
+
cdkDropList
|
|
72402
|
+
[id]="battleSlotDropId($index)"
|
|
72403
|
+
[cdkDropListData]="$index"
|
|
72404
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
72405
|
+
[cdkDropListEnterPredicate]="canDropOnBattleSlot"
|
|
72406
|
+
[cdkDropListSortingDisabled]="true"
|
|
72407
|
+
[class.christianity-slot--play-target]="canPlaceSelectedCharacter() || isDraggingCharacter()"
|
|
72408
|
+
valLightRipple
|
|
72409
|
+
(cdkDropListDropped)="dropOnBattleSlot($event, $index)"
|
|
72410
|
+
(click)="playSelectedCard($index)"
|
|
72411
|
+
>
|
|
72412
|
+
@if (canPlaceSelectedCharacter() || isDraggingCharacter()) {
|
|
72413
|
+
<span>{{ t('christianityPlayHere') }}</span>
|
|
72414
|
+
}
|
|
72415
|
+
</button>
|
|
72416
|
+
}
|
|
72417
|
+
}
|
|
72418
|
+
</section>
|
|
72419
|
+
|
|
72420
|
+
<section class="christianity-player-rack">
|
|
72421
|
+
<div class="christianity-offerings-zone">
|
|
72422
|
+
<button
|
|
72423
|
+
type="button"
|
|
72424
|
+
class="christianity-offering-pile"
|
|
72425
|
+
cdkDropList
|
|
72426
|
+
id="christianity-offerings-drop"
|
|
72427
|
+
valLightRipple
|
|
72428
|
+
[cdkDropListConnectedTo]="['christianity-hand-source']"
|
|
72429
|
+
[class.is-play-target]="canPlaceSelectedOffering() || isDraggingOffering()"
|
|
72430
|
+
[cdkDropListEnterPredicate]="canDropOnOfferings"
|
|
72431
|
+
[cdkDropListSortingDisabled]="true"
|
|
72432
|
+
(cdkDropListDropped)="dropOnOfferings($event)"
|
|
72433
|
+
(click)="handleOfferingPile('P1')"
|
|
72434
|
+
>
|
|
72435
|
+
<i aria-hidden="true"></i>
|
|
72436
|
+
<i aria-hidden="true"></i>
|
|
72437
|
+
<i aria-hidden="true"></i>
|
|
72438
|
+
<span>{{ t('christianityOfferings') }}</span>
|
|
72439
|
+
<strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
|
|
72440
|
+
</button>
|
|
72441
|
+
</div>
|
|
72442
|
+
<button type="button" class="christianity-leader-card christianity-render-card-button" valLightRipple (click)="inspectLeader('P1')">
|
|
72443
|
+
<val-christianity-card [card]="leaderRenderCard(player())" variant="table"></val-christianity-card>
|
|
72444
|
+
</button>
|
|
72445
|
+
<div class="christianity-player-command">
|
|
72446
|
+
<div class="christianity-player-badge">
|
|
72447
|
+
<span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
|
|
72448
|
+
<strong>{{ player().displayName }}</strong>
|
|
72449
|
+
</div>
|
|
72450
|
+
<button
|
|
72451
|
+
type="button"
|
|
72452
|
+
class="christianity-end-turn"
|
|
72453
|
+
(click)="endTurn()"
|
|
72454
|
+
>
|
|
72455
|
+
{{ t('christianityEndTurn') }}
|
|
72456
|
+
</button>
|
|
72457
|
+
</div>
|
|
72458
|
+
</section>
|
|
72459
|
+
</section>
|
|
72460
|
+
</section>
|
|
72461
|
+
|
|
72462
|
+
<section class="christianity-hand-shelf">
|
|
72463
|
+
<div class="christianity-hand-meter">
|
|
72464
|
+
<span>{{ t('christianityHand') }}</span>
|
|
72465
|
+
<strong>{{ player().hand?.length ?? 0 }}</strong>
|
|
72466
|
+
</div>
|
|
72467
|
+
<section
|
|
72468
|
+
class="christianity-hand-fan"
|
|
72469
|
+
cdkDropList
|
|
72470
|
+
id="christianity-hand-source"
|
|
72471
|
+
[cdkDropListConnectedTo]="dropTargetIds()"
|
|
72472
|
+
[attr.aria-label]="t('christianityYourHand')"
|
|
72473
|
+
(pointerleave)="clearHoveredHandIndex()"
|
|
72474
|
+
>
|
|
72475
|
+
@for (cardId of player().hand ?? []; track cardId + $index) {
|
|
72476
|
+
@let card = cardDefinition(cardId);
|
|
72477
|
+
<div
|
|
72478
|
+
class="christianity-hand-card-wrap"
|
|
72479
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
72480
|
+
[class.is-dragging]="draggingCardId() === cardId"
|
|
72481
|
+
[style.z-index]="handCardZIndex($index)"
|
|
72482
|
+
[style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
|
|
72483
|
+
(pointerenter)="setHoveredHandIndex($index)"
|
|
72484
|
+
(pointerdown)="setHoveredHandIndex($index)"
|
|
72485
|
+
(pointerup)="releaseHoveredHand($event)"
|
|
72486
|
+
>
|
|
72487
|
+
<button
|
|
72488
|
+
type="button"
|
|
72489
|
+
class="christianity-card-preview-card christianity-card-preview-card--hand christianity-render-card-button"
|
|
72490
|
+
cdkDrag
|
|
72491
|
+
valLightRipple
|
|
72492
|
+
[cdkDragData]="cardId"
|
|
72493
|
+
[cdkDragDisabled]="!canPlay(card)"
|
|
72494
|
+
[class.is-selected]="selectedHandCard() === cardId"
|
|
72495
|
+
[class.is-disabled]="!canPlay(card)"
|
|
72496
|
+
(cdkDragStarted)="startDraggingCard(cardId)"
|
|
72497
|
+
(cdkDragEnded)="endDraggingCard()"
|
|
72498
|
+
(click)="selectHandCard(cardId)"
|
|
72499
|
+
>
|
|
72500
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="hand"></val-christianity-card>
|
|
72501
|
+
</button>
|
|
72502
|
+
<button
|
|
72503
|
+
type="button"
|
|
72504
|
+
class="christianity-card-eye"
|
|
72505
|
+
[attr.aria-label]="t('christianityPreviewCard')"
|
|
72506
|
+
(click)="inspectHandCard(cardId, true); $event.stopPropagation()"
|
|
72507
|
+
></button>
|
|
72508
|
+
</div>
|
|
72509
|
+
}
|
|
72510
|
+
</section>
|
|
72511
|
+
</section>
|
|
72512
|
+
}
|
|
72513
|
+
|
|
72514
|
+
@if (selectedPreview()) {
|
|
72515
|
+
<button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
|
|
72516
|
+
<aside
|
|
72517
|
+
class="christianity-floating-card-shell"
|
|
72518
|
+
aria-live="polite"
|
|
72519
|
+
>
|
|
72520
|
+
<button type="button" class="christianity-floating-card-close" (click)="closePreview()">
|
|
72521
|
+
{{ t('close') }}
|
|
72522
|
+
</button>
|
|
72523
|
+
<div
|
|
72524
|
+
class="christianity-floating-card"
|
|
72525
|
+
[style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
|
|
72526
|
+
[style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
|
|
72527
|
+
[style.--preview-shift-x]="previewTilt().shiftX + 'px'"
|
|
72528
|
+
[style.--preview-shift-y]="previewTilt().shiftY + 'px'"
|
|
72529
|
+
(pointermove)="tiltPreview($event)"
|
|
72530
|
+
(pointerleave)="resetPreviewTilt()"
|
|
72531
|
+
>
|
|
72532
|
+
@if (selectedPreviewRenderCard(); as previewCard) {
|
|
72533
|
+
<val-christianity-card [card]="previewCard" variant="full"></val-christianity-card>
|
|
72534
|
+
}
|
|
72535
|
+
</div>
|
|
72536
|
+
@if (previewRule(); as rule) {
|
|
72537
|
+
<div class="christianity-preview-rule-note">
|
|
72538
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72539
|
+
<div>
|
|
72540
|
+
<small>{{ t('christianityCardRule') }}</small>
|
|
72541
|
+
<strong>{{ rule.title }}</strong>
|
|
72542
|
+
<p>{{ rule.body }}</p>
|
|
72543
|
+
</div>
|
|
72544
|
+
</div>
|
|
72545
|
+
}
|
|
72546
|
+
</aside>
|
|
72547
|
+
}
|
|
72548
|
+
|
|
72549
|
+
@if (selectedInfo(); as info) {
|
|
72550
|
+
<button type="button" class="christianity-info-backdrop" [attr.aria-label]="t('close')" (click)="closeInfo()"></button>
|
|
72551
|
+
<aside class="christianity-info-panel" aria-live="polite">
|
|
72552
|
+
<button type="button" class="christianity-dialog-close christianity-info-close" (click)="closeInfo()">
|
|
72553
|
+
{{ t('close') }}
|
|
72554
|
+
</button>
|
|
72555
|
+
<div class="christianity-rule-note">
|
|
72556
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72557
|
+
<div>
|
|
72558
|
+
<small>{{ info.eyebrow }}</small>
|
|
72559
|
+
<h2>{{ info.title }}</h2>
|
|
72560
|
+
<strong>{{ info.meta }}</strong>
|
|
72561
|
+
<p>{{ info.body }}</p>
|
|
72562
|
+
<ul>
|
|
72563
|
+
@for (fact of info.facts; track fact) {
|
|
72564
|
+
<li>{{ fact }}</li>
|
|
72565
|
+
}
|
|
72566
|
+
</ul>
|
|
72567
|
+
</div>
|
|
72568
|
+
</div>
|
|
72569
|
+
</aside>
|
|
72570
|
+
}
|
|
72571
|
+
|
|
72572
|
+
@if (screen() === 'table') {
|
|
72573
|
+
<section class="christianity-actions" aria-live="polite">
|
|
72574
|
+
<p>{{ statusText() }}</p>
|
|
72575
|
+
<div>
|
|
72576
|
+
<button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
|
|
72577
|
+
{{ selectedActionLabel() }}
|
|
72578
|
+
</button>
|
|
72579
|
+
<button type="button" (click)="resetMock()">
|
|
72580
|
+
{{ t('christianityReset') }}
|
|
72581
|
+
</button>
|
|
72582
|
+
</div>
|
|
72583
|
+
</section>
|
|
72584
|
+
}
|
|
72585
|
+
|
|
72586
|
+
@if (showHistory()) {
|
|
72587
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
|
|
72588
|
+
<section class="christianity-history-drawer">
|
|
72589
|
+
<header>
|
|
72590
|
+
<h2>{{ t('christianityHistory') }}</h2>
|
|
72591
|
+
<div class="christianity-dialog-actions">
|
|
72592
|
+
<span>{{ game().historyZone.length }}</span>
|
|
72593
|
+
<button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
|
|
72594
|
+
{{ t('close') }}
|
|
72595
|
+
</button>
|
|
72596
|
+
</div>
|
|
72597
|
+
</header>
|
|
72598
|
+
@if (game().historyZone.length) {
|
|
72599
|
+
<div class="christianity-history-grid">
|
|
72600
|
+
@for (cardId of game().historyZone; track cardId + $index) {
|
|
72601
|
+
@let card = cardDefinition(cardId);
|
|
72602
|
+
<button type="button" class="christianity-card-preview-card christianity-render-card-button" valLightRipple (click)="inspectHistoryCard(cardId)">
|
|
72603
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72604
|
+
</button>
|
|
72605
|
+
}
|
|
72606
|
+
</div>
|
|
72607
|
+
} @else {
|
|
72608
|
+
<p>{{ t('christianityHistoryEmpty') }}</p>
|
|
72609
|
+
}
|
|
72610
|
+
</section>
|
|
72611
|
+
}
|
|
72612
|
+
|
|
72613
|
+
@if (showGallery()) {
|
|
72614
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseGallery')" (click)="closeGallery()"></button>
|
|
72615
|
+
<section class="christianity-history-drawer christianity-gallery-drawer">
|
|
72616
|
+
<header>
|
|
72617
|
+
<div>
|
|
72618
|
+
<h2>{{ t('christianityGallery') }}</h2>
|
|
72619
|
+
<p>{{ galleryEditionLabel() }}</p>
|
|
72620
|
+
</div>
|
|
72621
|
+
<div class="christianity-dialog-actions">
|
|
72622
|
+
<span>{{ galleryCards().length }}</span>
|
|
72623
|
+
<button type="button" class="christianity-dialog-close" (click)="closeGallery()">
|
|
72624
|
+
{{ t('close') }}
|
|
72625
|
+
</button>
|
|
72626
|
+
</div>
|
|
72627
|
+
</header>
|
|
72628
|
+
<div class="christianity-gallery-controls">
|
|
72629
|
+
<label>
|
|
72630
|
+
<span>{{ t('christianityGallerySearch') }}</span>
|
|
72631
|
+
<input type="search" [value]="gallerySearch()" (input)="setGallerySearch($event)" [placeholder]="t('christianityGallerySearchPlaceholder')" />
|
|
72632
|
+
</label>
|
|
72633
|
+
<label>
|
|
72634
|
+
<span>{{ t('christianityGalleryFilter') }}</span>
|
|
72635
|
+
<select [value]="galleryType()" (change)="setGalleryType($event)">
|
|
72636
|
+
@for (option of galleryTypeOptions(); track option.value) {
|
|
72637
|
+
<option [value]="option.value">{{ option.label }}</option>
|
|
72638
|
+
}
|
|
72639
|
+
</select>
|
|
72640
|
+
</label>
|
|
72641
|
+
</div>
|
|
72642
|
+
<div class="christianity-gallery-edition-strip">
|
|
72643
|
+
<button type="button" class="is-active" valLightRipple>
|
|
72644
|
+
<img [src]="galleryEditionIcon()" alt="" />
|
|
72645
|
+
<span>{{ t('christianityGenesisEdition') }}</span>
|
|
72646
|
+
</button>
|
|
72647
|
+
</div>
|
|
72648
|
+
<div class="christianity-gallery-grid">
|
|
72649
|
+
@for (card of galleryCards(); track card.id) {
|
|
72650
|
+
<button type="button" class="christianity-card-preview-card christianity-render-card-button" valLightRipple (click)="inspectGalleryCard(card.id)">
|
|
72651
|
+
<val-christianity-card [card]="definitionToRenderCard(card)" variant="list"></val-christianity-card>
|
|
72652
|
+
</button>
|
|
72653
|
+
} @empty {
|
|
72654
|
+
<p>{{ t('christianityGalleryEmpty') }}</p>
|
|
72655
|
+
}
|
|
72656
|
+
</div>
|
|
72657
|
+
</section>
|
|
72658
|
+
}
|
|
72659
|
+
|
|
72660
|
+
@if (offeringsSeat()) {
|
|
72661
|
+
@let offeringPlayer = game().players[offeringsSeat()!];
|
|
72662
|
+
<button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
|
|
72663
|
+
<section class="christianity-history-drawer christianity-offerings-drawer">
|
|
72664
|
+
<header>
|
|
72665
|
+
<h2>{{ t('christianityOfferings') }}</h2>
|
|
72666
|
+
<div class="christianity-dialog-actions">
|
|
72667
|
+
<span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
|
|
72668
|
+
<button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
|
|
72669
|
+
{{ t('close') }}
|
|
72670
|
+
</button>
|
|
72671
|
+
</div>
|
|
72672
|
+
</header>
|
|
72673
|
+
<div class="christianity-offerings-note">
|
|
72674
|
+
<span class="christianity-rule-note-icon" aria-hidden="true">i</span>
|
|
72675
|
+
<p>{{ t('christianityOfferingsRuleBody') }}</p>
|
|
72676
|
+
</div>
|
|
72677
|
+
<div class="christianity-offering-list">
|
|
72678
|
+
@for (offering of offeringPlayer.offerings; track offering.instanceId) {
|
|
72679
|
+
<article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
|
|
72680
|
+
<button type="button" class="christianity-offering-card christianity-render-card-button" valLightRipple (click)="inspectOffering(offering)">
|
|
72681
|
+
<val-christianity-card [card]="offeringRenderCard(offering)" variant="list"></val-christianity-card>
|
|
72682
|
+
</button>
|
|
72683
|
+
<div>
|
|
72684
|
+
<strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
|
|
72685
|
+
<p>{{ offeringAbilityText(offering) }}</p>
|
|
72686
|
+
@if (offering.abilityName) {
|
|
72687
|
+
<button
|
|
72688
|
+
type="button"
|
|
72689
|
+
[disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
|
|
72690
|
+
(click)="useOfferingAbility(offering, offeringsSeat()!)"
|
|
72691
|
+
>
|
|
72692
|
+
{{ t('christianityUseAbility') }}
|
|
72693
|
+
</button>
|
|
72694
|
+
}
|
|
72695
|
+
</div>
|
|
72696
|
+
</article>
|
|
72697
|
+
}
|
|
72698
|
+
</div>
|
|
72699
|
+
</section>
|
|
72700
|
+
}
|
|
72701
|
+
</main>
|
|
72702
|
+
`, styles: [":host{--christianity-theme-ink: var(--val-text-color, #1f2933);--christianity-theme-surface: #ffffff;--christianity-theme-parchment: #fffaf0;--christianity-theme-olive: #5f6f2a;--christianity-theme-gold: #d6a21d;--christianity-theme-gold-soft: rgba(214, 162, 29, .18);--christianity-theme-gold-ring: rgba(214, 162, 29, .48);--christianity-theme-glow: rgba(245, 199, 85, .32);--christianity-theme-focus: #2563eb;--christianity-theme-shadow: rgba(82, 64, 28, .18);--christianity-theme-shadow-strong: rgba(82, 64, 28, .3);--christianity-card-aspect: 5 / 7.45;--christianity-card-back: linear-gradient(135deg, rgba(16, 42, 67, .16), rgba(16, 42, 67, .03)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);--christianity-card-back-soft: linear-gradient(135deg, rgba(16, 42, 67, .11), rgba(16, 42, 67, .02)), repeating-linear-gradient(45deg, #dbeafe 0 .33rem, #ffffff .33rem .66rem);display:block;max-width:100%;min-width:0;overflow-x:clip;color:var(--christianity-theme-ink)}.christianity-shell{box-sizing:border-box;display:grid;gap:.65rem;width:100%;max-width:100%;min-width:0;padding:.75rem .25rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb;overflow-x:clip;overflow-y:visible}.christianity-header,.christianity-match-strip,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-header h1,.christianity-header p,.christianity-match-player strong,.christianity-match-player small,.christianity-scoreboard span,.christianity-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header-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 rgba(214,162,29,.38);border-radius:999px;background:linear-gradient(180deg,#fffaf0fa,#fffffffa),radial-gradient(circle at 20% 0%,rgba(214,162,29,.18),transparent 42%);color:var(--christianity-theme-ink);font:inherit;font-size:.82rem;font-weight:800;box-shadow:0 .55rem 1.2rem #52401c1a}.christianity-splash,.christianity-start{min-height:min(34rem,calc(100dvh - 8rem));border:1px solid rgba(214,162,29,.2);border-radius:.9rem;background:radial-gradient(circle at 50% 18%,rgba(245,199,85,.2),transparent 22rem),linear-gradient(180deg,#fffaf0eb,#fffffff5),var(--christianity-card-back-soft);box-shadow:0 1.2rem 3.2rem #52401c1f}.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(1rem,4vw,2.2rem)}.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(214,162,29,.26);border-radius:999px;background:#fffaf0e0;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 rgba(214,162,29,.38);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-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;gap:.55rem;width:min(26rem,calc(100vw - 1.25rem));padding-top:2.35rem;transform:translate(-50%,-50%)}.christianity-floating-card{position:relative;z-index:1;display: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%}.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(29rem,calc(100vw - 3rem))}.christianity-floating-card{min-height:0;padding:0}}.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),58rem);min-height:min(25rem,calc(100dvh - 1rem));max-height:min(42rem,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(6.4rem,1fr));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%,5.8rem)}.christianity-gallery-grid .christianity-render-card-button{justify-self:center;width:min(100%,6.6rem)}.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}@media (max-width: 720px){.christianity-shell{padding:.55rem 0;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-match-strip{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:.35rem;padding:.35rem}.christianity-match-player{gap:.35rem}.christianity-match-player small{display:none}.christianity-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));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.7rem,1fr))}.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"] }]
|
|
72703
|
+
}], ctorParameters: () => [] });
|
|
72704
|
+
|
|
69777
72705
|
addIcons({ refreshOutline, sparklesOutline, trophyOutline });
|
|
69778
72706
|
const BUBBLE_COLORS = {
|
|
69779
72707
|
rose: '#ff4f9f',
|
|
@@ -69830,6 +72758,7 @@ class BubbleBlitzGameComponent {
|
|
|
69830
72758
|
this.animating = signal(false);
|
|
69831
72759
|
this.leaderboard = signal(this.readLeaderboard());
|
|
69832
72760
|
this.confirmAction = signal(undefined);
|
|
72761
|
+
this.confirmedAction = signal(undefined);
|
|
69833
72762
|
this.config = computed(() => MODE_CONFIG[this.mode()]);
|
|
69834
72763
|
this.feverReady = computed(() => this.fever() >= this.config().feverTarget);
|
|
69835
72764
|
this.feverProgress = computed(() => Math.min(100, Math.round((this.fever() / this.config().feverTarget) * 100)));
|
|
@@ -70009,13 +72938,12 @@ class BubbleBlitzGameComponent {
|
|
|
70009
72938
|
closeConfirmModal() {
|
|
70010
72939
|
this.confirmAction.set(undefined);
|
|
70011
72940
|
}
|
|
70012
|
-
|
|
70013
|
-
if (token !== 'confirm') {
|
|
70014
|
-
this.closeConfirmModal();
|
|
70015
|
-
return;
|
|
70016
|
-
}
|
|
70017
|
-
const action = this.confirmAction();
|
|
72941
|
+
handleConfirmModalDismissed() {
|
|
70018
72942
|
this.confirmAction.set(undefined);
|
|
72943
|
+
const action = this.confirmedAction();
|
|
72944
|
+
this.confirmedAction.set(undefined);
|
|
72945
|
+
if (!action)
|
|
72946
|
+
return;
|
|
70019
72947
|
if (action === 'restart') {
|
|
70020
72948
|
this.start();
|
|
70021
72949
|
return;
|
|
@@ -70028,6 +72956,15 @@ class BubbleBlitzGameComponent {
|
|
|
70028
72956
|
this.resetToGamesMenu();
|
|
70029
72957
|
}
|
|
70030
72958
|
}
|
|
72959
|
+
confirmPendingAction(token) {
|
|
72960
|
+
if (token !== 'confirm') {
|
|
72961
|
+
this.closeConfirmModal();
|
|
72962
|
+
return;
|
|
72963
|
+
}
|
|
72964
|
+
const action = this.confirmAction();
|
|
72965
|
+
this.confirmedAction.set(action);
|
|
72966
|
+
this.confirmAction.set(undefined);
|
|
72967
|
+
}
|
|
70031
72968
|
startTimer() {
|
|
70032
72969
|
this.stopTimer();
|
|
70033
72970
|
this.timer = window.setInterval(() => {
|
|
@@ -70331,7 +73268,7 @@ class BubbleBlitzGameComponent {
|
|
|
70331
73268
|
<ion-modal
|
|
70332
73269
|
[isOpen]="!!confirmAction()"
|
|
70333
73270
|
cssClass="val-modal-adaptive"
|
|
70334
|
-
(didDismiss)="
|
|
73271
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
70335
73272
|
>
|
|
70336
73273
|
<ng-template>
|
|
70337
73274
|
<val-modal-layout
|
|
@@ -70481,7 +73418,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
70481
73418
|
<ion-modal
|
|
70482
73419
|
[isOpen]="!!confirmAction()"
|
|
70483
73420
|
cssClass="val-modal-adaptive"
|
|
70484
|
-
(didDismiss)="
|
|
73421
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
70485
73422
|
>
|
|
70486
73423
|
<ng-template>
|
|
70487
73424
|
<val-modal-layout
|
|
@@ -70545,6 +73482,7 @@ class MemoryGameComponent {
|
|
|
70545
73482
|
this.lockBoard = signal(false);
|
|
70546
73483
|
this.leaderboard = signal(this.readLeaderboard());
|
|
70547
73484
|
this.confirmAction = signal(undefined);
|
|
73485
|
+
this.confirmedAction = signal(undefined);
|
|
70548
73486
|
this.profileConfig = computed(() => PROFILE_CONFIG[this.profile()]);
|
|
70549
73487
|
this.pairCount = computed(() => this.profileConfig().pairs);
|
|
70550
73488
|
this.boardClass = computed(() => `memory-board ${this.profileConfig().boardClass}`);
|
|
@@ -70682,13 +73620,12 @@ class MemoryGameComponent {
|
|
|
70682
73620
|
closeConfirmModal() {
|
|
70683
73621
|
this.confirmAction.set(undefined);
|
|
70684
73622
|
}
|
|
70685
|
-
|
|
70686
|
-
if (token !== 'confirm') {
|
|
70687
|
-
this.closeConfirmModal();
|
|
70688
|
-
return;
|
|
70689
|
-
}
|
|
70690
|
-
const action = this.confirmAction();
|
|
73623
|
+
handleConfirmModalDismissed() {
|
|
70691
73624
|
this.confirmAction.set(undefined);
|
|
73625
|
+
const action = this.confirmedAction();
|
|
73626
|
+
this.confirmedAction.set(undefined);
|
|
73627
|
+
if (!action)
|
|
73628
|
+
return;
|
|
70692
73629
|
if (action === 'restart') {
|
|
70693
73630
|
this.start();
|
|
70694
73631
|
return;
|
|
@@ -70701,6 +73638,15 @@ class MemoryGameComponent {
|
|
|
70701
73638
|
this.resetToGamesMenu();
|
|
70702
73639
|
}
|
|
70703
73640
|
}
|
|
73641
|
+
confirmPendingAction(token) {
|
|
73642
|
+
if (token !== 'confirm') {
|
|
73643
|
+
this.closeConfirmModal();
|
|
73644
|
+
return;
|
|
73645
|
+
}
|
|
73646
|
+
const action = this.confirmAction();
|
|
73647
|
+
this.confirmedAction.set(action);
|
|
73648
|
+
this.confirmAction.set(undefined);
|
|
73649
|
+
}
|
|
70704
73650
|
flip(card) {
|
|
70705
73651
|
if (this.lockBoard() || card.flipped || card.matched || this.won() || this.failed())
|
|
70706
73652
|
return;
|
|
@@ -71015,7 +73961,7 @@ class MemoryGameComponent {
|
|
|
71015
73961
|
<ion-modal
|
|
71016
73962
|
[isOpen]="!!confirmAction()"
|
|
71017
73963
|
cssClass="val-modal-adaptive"
|
|
71018
|
-
(didDismiss)="
|
|
73964
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
71019
73965
|
>
|
|
71020
73966
|
<ng-template>
|
|
71021
73967
|
<val-modal-layout
|
|
@@ -71173,7 +74119,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
71173
74119
|
<ion-modal
|
|
71174
74120
|
[isOpen]="!!confirmAction()"
|
|
71175
74121
|
cssClass="val-modal-adaptive"
|
|
71176
|
-
(didDismiss)="
|
|
74122
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
71177
74123
|
>
|
|
71178
74124
|
<ng-template>
|
|
71179
74125
|
<val-modal-layout
|
|
@@ -71519,6 +74465,7 @@ class SimonGameComponent {
|
|
|
71519
74465
|
this.activePad = signal(undefined);
|
|
71520
74466
|
this.leaderboard = signal(this.readLeaderboard());
|
|
71521
74467
|
this.confirmAction = signal(undefined);
|
|
74468
|
+
this.confirmedAction = signal(undefined);
|
|
71522
74469
|
this.modeConfig = computed(() => SIMON_MODES[this.mode()]);
|
|
71523
74470
|
this.bestRound = computed(() => this.modeLeaderboard()[0]?.round ?? 0);
|
|
71524
74471
|
this.modeLeaderboard = computed(() => this.leaderboard()
|
|
@@ -71618,13 +74565,12 @@ class SimonGameComponent {
|
|
|
71618
74565
|
closeConfirmModal() {
|
|
71619
74566
|
this.confirmAction.set(undefined);
|
|
71620
74567
|
}
|
|
71621
|
-
|
|
71622
|
-
if (token !== 'confirm') {
|
|
71623
|
-
this.closeConfirmModal();
|
|
71624
|
-
return;
|
|
71625
|
-
}
|
|
71626
|
-
const action = this.confirmAction();
|
|
74568
|
+
handleConfirmModalDismissed() {
|
|
71627
74569
|
this.confirmAction.set(undefined);
|
|
74570
|
+
const action = this.confirmedAction();
|
|
74571
|
+
this.confirmedAction.set(undefined);
|
|
74572
|
+
if (!action)
|
|
74573
|
+
return;
|
|
71628
74574
|
if (action === 'restart') {
|
|
71629
74575
|
this.start();
|
|
71630
74576
|
return;
|
|
@@ -71637,6 +74583,15 @@ class SimonGameComponent {
|
|
|
71637
74583
|
this.resetToGamesMenu();
|
|
71638
74584
|
}
|
|
71639
74585
|
}
|
|
74586
|
+
confirmPendingAction(token) {
|
|
74587
|
+
if (token !== 'confirm') {
|
|
74588
|
+
this.closeConfirmModal();
|
|
74589
|
+
return;
|
|
74590
|
+
}
|
|
74591
|
+
const action = this.confirmAction();
|
|
74592
|
+
this.confirmedAction.set(action);
|
|
74593
|
+
this.confirmAction.set(undefined);
|
|
74594
|
+
}
|
|
71640
74595
|
tap(pad) {
|
|
71641
74596
|
if (this.phase() !== 'waiting' || !this.acceptingInput)
|
|
71642
74597
|
return;
|
|
@@ -71880,7 +74835,7 @@ class SimonGameComponent {
|
|
|
71880
74835
|
<ion-modal
|
|
71881
74836
|
[isOpen]="!!confirmAction()"
|
|
71882
74837
|
cssClass="val-modal-adaptive"
|
|
71883
|
-
(didDismiss)="
|
|
74838
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
71884
74839
|
>
|
|
71885
74840
|
<ng-template>
|
|
71886
74841
|
<val-modal-layout
|
|
@@ -72010,7 +74965,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
72010
74965
|
<ion-modal
|
|
72011
74966
|
[isOpen]="!!confirmAction()"
|
|
72012
74967
|
cssClass="val-modal-adaptive"
|
|
72013
|
-
(didDismiss)="
|
|
74968
|
+
(didDismiss)="handleConfirmModalDismissed()"
|
|
72014
74969
|
>
|
|
72015
74970
|
<ng-template>
|
|
72016
74971
|
<val-modal-layout
|
|
@@ -87326,5 +90281,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
87326
90281
|
* Generated bundle index. Do not edit.
|
|
87327
90282
|
*/
|
|
87328
90283
|
|
|
87329
|
-
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 };
|
|
90284
|
+
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 };
|
|
87330
90285
|
//# sourceMappingURL=valtech-components.mjs.map
|