valtech-components 4.0.425 → 4.0.427

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.
@@ -58,7 +58,7 @@ import fixWebmDuration from 'fix-webm-duration';
58
58
  * Current version of valtech-components.
59
59
  * This is automatically updated during the publish process.
60
60
  */
61
- const VERSION = '4.0.425';
61
+ const VERSION = '4.0.427';
62
62
 
63
63
  // Control de estado de refresco (singleton a nivel de módulo)
64
64
  let isRefreshing = false;
@@ -61174,8 +61174,17 @@ function chooseChessimalsBotMove(state, difficulty = 'normal', profileId = DEFAU
61174
61174
  if (moves.length === 0)
61175
61175
  return undefined;
61176
61176
  const style = BOT_STYLES[profileId] ?? BOT_STYLES[DEFAULT_BOT_PROFILE_BY_DIFFICULTY[difficulty]];
61177
- const scored = moves
61178
- .map((move) => ({ move, score: scoreBotMoveWithLookahead(state, move, difficulty, style) }))
61177
+ const quickScored = moves
61178
+ .map((move) => ({ move, score: scoreBotMove(state, move, difficulty, style) }))
61179
+ .sort((a, b) => b.score - a.score);
61180
+ const lookaheadLimit = difficulty === 'hard' ? 32 : difficulty === 'normal' ? 24 : 0;
61181
+ const scored = quickScored
61182
+ .map((item, index) => ({
61183
+ move: item.move,
61184
+ score: index < lookaheadLimit
61185
+ ? scoreBotMoveWithLookahead(state, item.move, difficulty, style)
61186
+ : item.score,
61187
+ }))
61179
61188
  .sort((a, b) => b.score - a.score);
61180
61189
  if (difficulty === 'easy') {
61181
61190
  const playable = scored.filter((item) => item.score > -3000);
@@ -61434,7 +61443,7 @@ function getKangarooMoves(state, piece) {
61434
61443
  }
61435
61444
  return moves;
61436
61445
  }
61437
- function scoreBotMove(state, move, difficulty, style) {
61446
+ function scoreBotMove(state, move, difficulty, style, includeTacticalPressure = true) {
61438
61447
  const color = state.currentTurn;
61439
61448
  const targetPiece = move.capturesPieceId
61440
61449
  ? activePieces(state).find((piece) => piece.id === move.capturesPieceId)
@@ -61460,9 +61469,14 @@ function scoreBotMove(state, move, difficulty, style) {
61460
61469
  score += 14 * style.power;
61461
61470
  if (wouldUnlockPower(state, color, move.to))
61462
61471
  score += 90 * style.unlock;
61463
- score += countPowerReachAfterMove(state, move, color) * (difficulty === 'hard' ? 8 : 4) * style.mobility;
61464
- score += countProtectedThreatsAfterMove(state, move, color) * (difficulty === 'hard' ? 36 : 18) * style.trap;
61465
- score += scoreEndgamePressure(state, move, color) * style.endgame;
61472
+ if (includeTacticalPressure && state.boardSize <= 6) {
61473
+ score += countPowerReachAfterMove(state, move, color) * (difficulty === 'hard' ? 8 : 4) * style.mobility;
61474
+ score += countProtectedThreatsAfterMove(state, move, color) * (difficulty === 'hard' ? 36 : 18) * style.trap;
61475
+ score += scoreEndgamePressure(state, move, color) * style.endgame;
61476
+ }
61477
+ else {
61478
+ score += scoreEndgamePressure(state, move, color) * style.endgame;
61479
+ }
61466
61480
  if (difficulty === 'hard' && isSquareVulnerableAfterMove(state, move)) {
61467
61481
  score -= (targetPiece ? 80 : 140) * style.safety;
61468
61482
  }
@@ -61493,15 +61507,12 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
61493
61507
  score += centerControl * (difficulty === 'hard' ? 18 : 10) * style.center;
61494
61508
  }
61495
61509
  const opponentBestReply = opponentMoves
61496
- .map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style))
61510
+ .map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style, false))
61497
61511
  .sort((a, b) => b - a)[0];
61498
61512
  if (opponentBestReply) {
61499
61513
  const replyWeight = difficulty === 'easy' ? 0.12 : difficulty === 'normal' ? 0.32 : 0.48;
61500
61514
  score -= opponentBestReply * replyWeight * style.reply;
61501
61515
  }
61502
- if (difficulty === 'hard') {
61503
- score += scoreBestCounterplay(afterMove, state.currentTurn, style) * 0.28;
61504
- }
61505
61516
  }
61506
61517
  catch {
61507
61518
  score -= 1000;
@@ -61536,28 +61547,6 @@ function scoreEndgamePressure(state, move, color) {
61536
61547
  const distanceToPromotion = color === 'white' ? move.to.row : state.boardSize - 1 - move.to.row;
61537
61548
  return Math.max(0, state.boardSize - distanceToPromotion) * 14 * urgency;
61538
61549
  }
61539
- function scoreBestCounterplay(afterMove, color, style) {
61540
- const opponentMoves = getChessimalsAllLegalMoves(afterMove);
61541
- if (opponentMoves.length === 0)
61542
- return 900;
61543
- const replies = opponentMoves.slice(0, 16).map((opponentMove) => {
61544
- try {
61545
- const afterReply = applyChessimalsMove(afterMove, opponentMove);
61546
- if (afterReply.status === 'finished')
61547
- return -6000;
61548
- const counterState = { ...afterReply, currentTurn: color };
61549
- const counterMoves = getChessimalsAllLegalMoves(counterState, color);
61550
- const bestCounter = counterMoves
61551
- .map((counterMove) => scoreBotMove(counterState, counterMove, 'hard', style))
61552
- .sort((a, b) => b - a)[0] ?? 0;
61553
- return bestCounter;
61554
- }
61555
- catch {
61556
- return -1000;
61557
- }
61558
- });
61559
- return Math.min(...replies);
61560
- }
61561
61550
  function pickNoisyBotMove(scored, spread) {
61562
61551
  if (scored.length === 0)
61563
61552
  return undefined;
@@ -62466,6 +62455,31 @@ const MINI_GAMES_I18N = {
62466
62455
  bubbleDescription: 'Revienta grupos de burbujas, encadena combos y sube tu puntaje.',
62467
62456
  chessimalsTitle: 'Chessimals',
62468
62457
  chessimalsDescription: 'Una carrera de peones con cartas de animales y poderes tácticos.',
62458
+ christianityTitle: 'Christianity',
62459
+ christianityDescription: 'Un juego de cartas familiar con líderes, ofrendas y decisiones tácticas.',
62460
+ christianityEyebrow: 'MVP de mesa',
62461
+ christianityTable: 'Mesa de Christianity',
62462
+ christianityTurn: 'Turno',
62463
+ christianityOfferings: 'Ofrendas',
62464
+ christianityHand: 'Mano',
62465
+ christianityOpponentBattle: 'Zona de batalla rival',
62466
+ christianityYourBattle: 'Tu zona de batalla',
62467
+ christianitySharedZone: 'Zona compartida',
62468
+ christianityHistory: 'Historia',
62469
+ christianityDeck: 'Mazo',
62470
+ christianityPlace: 'Lugar',
62471
+ christianityEmpty: 'Vacío',
62472
+ christianityYourHand: 'Tu mano',
62473
+ christianityCost: 'Coste',
62474
+ christianityEndTurn: 'Terminar turno',
62475
+ christianityPlayCard: 'Jugar carta',
62476
+ christianityReset: 'Reiniciar mock',
62477
+ christianityWaitTurn: 'Espera el turno rival.',
62478
+ christianityChooseTarget: 'Elige un objetivo para atacar.',
62479
+ christianityReadyToPlay: 'Puedes jugar esta carta.',
62480
+ christianityNeedOfferings: 'Necesitas más ofrendas para jugar esa carta.',
62481
+ christianityChooseCard: 'Elige una carta o un personaje listo para actuar.',
62482
+ christianityHistoryEmpty: 'Todavía no hay cartas en historia.',
62469
62483
  soonTitle: 'Próximamente',
62470
62484
  openGame: 'Jugar',
62471
62485
  close: 'Cerrar',
@@ -62845,6 +62859,31 @@ const MINI_GAMES_I18N = {
62845
62859
  bubbleDescription: 'Pop bubble groups, chain combos, and push your score higher.',
62846
62860
  chessimalsTitle: 'Chessimals',
62847
62861
  chessimalsDescription: 'A pawn race with animal cards and tactical powers.',
62862
+ christianityTitle: 'Christianity',
62863
+ christianityDescription: 'A family card game with leaders, offerings, and tactical choices.',
62864
+ christianityEyebrow: 'Table MVP',
62865
+ christianityTable: 'Christianity table',
62866
+ christianityTurn: 'Turn',
62867
+ christianityOfferings: 'Offerings',
62868
+ christianityHand: 'Hand',
62869
+ christianityOpponentBattle: 'Opponent battle zone',
62870
+ christianityYourBattle: 'Your battle zone',
62871
+ christianitySharedZone: 'Shared zone',
62872
+ christianityHistory: 'History',
62873
+ christianityDeck: 'Deck',
62874
+ christianityPlace: 'Place',
62875
+ christianityEmpty: 'Empty',
62876
+ christianityYourHand: 'Your hand',
62877
+ christianityCost: 'Cost',
62878
+ christianityEndTurn: 'End turn',
62879
+ christianityPlayCard: 'Play card',
62880
+ christianityReset: 'Reset mock',
62881
+ christianityWaitTurn: 'Wait for the opponent turn.',
62882
+ christianityChooseTarget: 'Choose a target to attack.',
62883
+ christianityReadyToPlay: 'You can play this card.',
62884
+ christianityNeedOfferings: 'You need more offerings to play that card.',
62885
+ christianityChooseCard: 'Choose a card or a ready character.',
62886
+ christianityHistoryEmpty: 'There are no cards in history yet.',
62848
62887
  soonTitle: 'Coming soon',
62849
62888
  openGame: 'Play',
62850
62889
  close: 'Close',
@@ -67833,6 +67872,507 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
67833
67872
  type: Input
67834
67873
  }] } });
67835
67874
 
67875
+ const STARTER_CARDS = {
67876
+ p_scout: { id: 'p_scout', name: 'Scout', cost: 1, attack: 1, life: 1 },
67877
+ p_guard: { id: 'p_guard', name: 'Guard', cost: 2, attack: 1, life: 3 },
67878
+ p_warrior: { id: 'p_warrior', name: 'Warrior', cost: 2, attack: 2, life: 2 },
67879
+ p_elder: { id: 'p_elder', name: 'Elder', cost: 3, attack: 2, life: 4 },
67880
+ p_champion: { id: 'p_champion', name: 'Champion', cost: 4, attack: 4, life: 4 },
67881
+ };
67882
+ const STARTING_GAME = {
67883
+ gameId: 'mock-christianity',
67884
+ status: 'in_progress',
67885
+ mode: 'local_pass',
67886
+ turnOwner: 'P1',
67887
+ revision: 0,
67888
+ turnCount: 1,
67889
+ sharedDeckCount: 12,
67890
+ historyZone: [],
67891
+ players: {
67892
+ P1: {
67893
+ seat: 'P1',
67894
+ displayName: 'Jugador',
67895
+ leaderName: 'Adam',
67896
+ leaderHp: 15,
67897
+ leaderMaxHp: 15,
67898
+ maxOfferings: 3,
67899
+ offeringPoints: 3,
67900
+ hand: ['p_scout', 'p_warrior', 'p_guard', 'p_elder'],
67901
+ battleZone: [],
67902
+ },
67903
+ P2: {
67904
+ seat: 'P2',
67905
+ displayName: 'Rival',
67906
+ leaderName: 'Noah',
67907
+ leaderHp: 15,
67908
+ leaderMaxHp: 15,
67909
+ maxOfferings: 3,
67910
+ offeringPoints: 3,
67911
+ handCount: 4,
67912
+ battleZone: [
67913
+ {
67914
+ instanceId: 'opp_001',
67915
+ cardId: 'p_scout',
67916
+ name: 'Scout',
67917
+ owner: 'P2',
67918
+ controller: 'P2',
67919
+ attack: 1,
67920
+ currentHp: 1,
67921
+ maxHp: 1,
67922
+ canAttack: false,
67923
+ },
67924
+ ],
67925
+ },
67926
+ },
67927
+ log: ['Partida iniciada.'],
67928
+ };
67929
+ class ChristianityGameComponent {
67930
+ constructor() {
67931
+ this.i18n = inject(I18nService);
67932
+ this.game = signal(structuredClone(STARTING_GAME));
67933
+ this.selectedHandCard = signal(null);
67934
+ this.selectedAttacker = signal(null);
67935
+ this.showHistory = signal(false);
67936
+ this.player = computed(() => this.game().players.P1);
67937
+ this.opponent = computed(() => this.game().players.P2);
67938
+ this.currentPlayer = computed(() => this.game().players[this.game().turnOwner]);
67939
+ this.isOwnTurn = computed(() => this.game().turnOwner === 'P1');
67940
+ this.opponentHandCount = computed(() => this.opponent().handCount ?? this.opponent().hand?.length ?? 0);
67941
+ this.statusText = computed(() => {
67942
+ const attacker = this.selectedAttacker();
67943
+ const handCard = this.selectedHandCard();
67944
+ if (!this.isOwnTurn()) {
67945
+ return this.t('christianityWaitTurn');
67946
+ }
67947
+ if (attacker) {
67948
+ return this.t('christianityChooseTarget');
67949
+ }
67950
+ if (handCard) {
67951
+ const card = this.cardDefinition(handCard);
67952
+ return this.canPlay(card) ? this.t('christianityReadyToPlay') : this.t('christianityNeedOfferings');
67953
+ }
67954
+ return this.t('christianityChooseCard');
67955
+ });
67956
+ this.i18n.registerDefaults('MiniGames', MINI_GAMES_I18N);
67957
+ }
67958
+ t(key) {
67959
+ this.i18n.lang();
67960
+ return this.i18n.t(key, 'MiniGames');
67961
+ }
67962
+ cardDefinition(cardId) {
67963
+ return STARTER_CARDS[cardId] ?? STARTER_CARDS['p_scout'];
67964
+ }
67965
+ battleSlots(seat) {
67966
+ const cards = this.game().players[seat].battleZone;
67967
+ return Array.from({ length: 5 }, (_, index) => ({
67968
+ trackId: cards[index]?.instanceId ?? `${seat}-empty-${index}`,
67969
+ card: cards[index],
67970
+ }));
67971
+ }
67972
+ canPlay(card) {
67973
+ return this.isOwnTurn() && this.player().offeringPoints >= card.cost && this.player().battleZone.length < 5;
67974
+ }
67975
+ canPlaySelected() {
67976
+ const selected = this.selectedHandCard();
67977
+ return !!selected && this.canPlay(this.cardDefinition(selected));
67978
+ }
67979
+ selectHandCard(cardId) {
67980
+ this.selectedAttacker.set(null);
67981
+ this.selectedHandCard.set(this.selectedHandCard() === cardId ? null : cardId);
67982
+ }
67983
+ playSelectedCard() {
67984
+ const cardId = this.selectedHandCard();
67985
+ if (!cardId)
67986
+ return;
67987
+ const card = this.cardDefinition(cardId);
67988
+ if (!this.canPlay(card))
67989
+ return;
67990
+ this.game.update(game => {
67991
+ const next = structuredClone(game);
67992
+ const player = next.players.P1;
67993
+ const handIndex = player.hand?.indexOf(cardId) ?? -1;
67994
+ if (handIndex < 0 || !player.hand)
67995
+ return game;
67996
+ player.hand.splice(handIndex, 1);
67997
+ player.offeringPoints -= card.cost;
67998
+ player.battleZone.push({
67999
+ instanceId: `p1_${next.revision + 1}_${player.battleZone.length}`,
68000
+ cardId: card.id,
68001
+ name: card.name,
68002
+ owner: 'P1',
68003
+ controller: 'P1',
68004
+ attack: card.attack,
68005
+ currentHp: card.life,
68006
+ maxHp: card.life,
68007
+ canAttack: false,
68008
+ });
68009
+ next.revision++;
68010
+ next.log = [`${card.name} entra en batalla.`, ...next.log].slice(0, 4);
68011
+ return next;
68012
+ });
68013
+ this.selectedHandCard.set(null);
68014
+ }
68015
+ selectAttacker(card) {
68016
+ this.selectedHandCard.set(null);
68017
+ if (!this.isOwnTurn() || !card.canAttack)
68018
+ return;
68019
+ this.selectedAttacker.set(this.selectedAttacker()?.instanceId === card.instanceId ? null : card);
68020
+ }
68021
+ attackLeader() {
68022
+ const attacker = this.selectedAttacker();
68023
+ if (!attacker)
68024
+ return;
68025
+ this.game.update(game => {
68026
+ const next = structuredClone(game);
68027
+ const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
68028
+ if (!liveAttacker || !liveAttacker.canAttack)
68029
+ return game;
68030
+ next.players.P2.leaderHp = Math.max(0, next.players.P2.leaderHp - liveAttacker.attack);
68031
+ liveAttacker.canAttack = false;
68032
+ next.revision++;
68033
+ next.log = [`${liveAttacker.name} ataca al lider rival.`, ...next.log].slice(0, 4);
68034
+ return next;
68035
+ });
68036
+ this.selectedAttacker.set(null);
68037
+ }
68038
+ attackCharacter(target) {
68039
+ const attacker = this.selectedAttacker();
68040
+ if (!attacker)
68041
+ return;
68042
+ this.game.update(game => {
68043
+ const next = structuredClone(game);
68044
+ const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
68045
+ const liveTarget = next.players.P2.battleZone.find(card => card.instanceId === target.instanceId);
68046
+ if (!liveAttacker || !liveTarget || !liveAttacker.canAttack)
68047
+ return game;
68048
+ liveTarget.currentHp -= liveAttacker.attack;
68049
+ liveAttacker.currentHp -= liveTarget.attack;
68050
+ liveAttacker.canAttack = false;
68051
+ this.cleanupDestroyed(next.players.P1, next);
68052
+ this.cleanupDestroyed(next.players.P2, next);
68053
+ next.revision++;
68054
+ next.log = [`${liveAttacker.name} combate contra ${liveTarget.name}.`, ...next.log].slice(0, 4);
68055
+ return next;
68056
+ });
68057
+ this.selectedAttacker.set(null);
68058
+ }
68059
+ endTurn() {
68060
+ this.selectedHandCard.set(null);
68061
+ this.selectedAttacker.set(null);
68062
+ this.game.update(game => {
68063
+ const next = structuredClone(game);
68064
+ next.turnOwner = next.turnOwner === 'P1' ? 'P2' : 'P1';
68065
+ next.turnCount++;
68066
+ const current = next.players[next.turnOwner];
68067
+ current.maxOfferings = Math.min(10, current.maxOfferings + 1);
68068
+ current.offeringPoints = current.maxOfferings;
68069
+ current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
68070
+ next.revision++;
68071
+ next.log = [`Turno de ${current.displayName}.`, ...next.log].slice(0, 4);
68072
+ return next;
68073
+ });
68074
+ }
68075
+ resetMock() {
68076
+ this.game.set(structuredClone(STARTING_GAME));
68077
+ this.selectedHandCard.set(null);
68078
+ this.selectedAttacker.set(null);
68079
+ }
68080
+ historyNames() {
68081
+ return this.game()
68082
+ .historyZone.map(cardId => this.cardDefinition(cardId).name)
68083
+ .join(', ');
68084
+ }
68085
+ cleanupDestroyed(player, game) {
68086
+ const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
68087
+ if (!destroyed.length)
68088
+ return;
68089
+ game.historyZone.push(...destroyed.map(card => card.cardId));
68090
+ player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
68091
+ }
68092
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
68093
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChristianityGameComponent, isStandalone: true, selector: "val-christianity-game", ngImport: i0, template: `
68094
+ <main class="christianity-shell">
68095
+ <section class="christianity-header">
68096
+ <div>
68097
+ <p>{{ t('christianityEyebrow') }}</p>
68098
+ <h1>{{ t('christianityTitle') }}</h1>
68099
+ </div>
68100
+ <div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
68101
+ <span>{{ t('christianityTurn') }}</span>
68102
+ <strong>{{ currentPlayer().displayName }}</strong>
68103
+ </div>
68104
+ </section>
68105
+
68106
+ <section class="christianity-table" [attr.aria-label]="t('christianityTable')">
68107
+ <section class="christianity-player christianity-player--opponent">
68108
+ <div class="christianity-player__summary">
68109
+ <div class="christianity-leader">
68110
+ <span>{{ opponent().leaderName }}</span>
68111
+ <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
68112
+ </div>
68113
+ <div class="christianity-offerings">
68114
+ <span>{{ t('christianityOfferings') }}</span>
68115
+ <strong>{{ opponent().offeringPoints }}/{{ opponent().maxOfferings }}</strong>
68116
+ </div>
68117
+ <div class="christianity-hidden-hand">
68118
+ <span>{{ t('christianityHand') }}</span>
68119
+ <strong>{{ opponentHandCount() }}</strong>
68120
+ </div>
68121
+ </div>
68122
+ <div class="christianity-battle-zone" [attr.aria-label]="t('christianityOpponentBattle')">
68123
+ @for (slot of battleSlots('P2'); track slot.trackId) {
68124
+ @if (slot.card) {
68125
+ <button
68126
+ type="button"
68127
+ class="christianity-card christianity-card--battle"
68128
+ [class.is-target]="selectedAttacker()"
68129
+ (click)="attackCharacter(slot.card)"
68130
+ >
68131
+ <span>{{ slot.card.name }}</span>
68132
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68133
+ </button>
68134
+ } @else {
68135
+ <span class="christianity-slot"></span>
68136
+ }
68137
+ }
68138
+ </div>
68139
+ </section>
68140
+
68141
+ <section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
68142
+ <button type="button" class="christianity-pile" (click)="showHistory.set(!showHistory())">
68143
+ <span>{{ t('christianityHistory') }}</span>
68144
+ <strong>{{ game().historyZone.length }}</strong>
68145
+ </button>
68146
+ <div class="christianity-deck" aria-live="polite">
68147
+ <span>{{ t('christianityDeck') }}</span>
68148
+ <strong>{{ game().sharedDeckCount }}</strong>
68149
+ </div>
68150
+ <div class="christianity-place">
68151
+ <span>{{ t('christianityPlace') }}</span>
68152
+ <strong>{{ t('christianityEmpty') }}</strong>
68153
+ </div>
68154
+ </section>
68155
+
68156
+ <section class="christianity-player">
68157
+ <div class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
68158
+ @for (slot of battleSlots('P1'); track slot.trackId) {
68159
+ @if (slot.card) {
68160
+ <button
68161
+ type="button"
68162
+ class="christianity-card christianity-card--battle"
68163
+ [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
68164
+ [class.is-exhausted]="!slot.card.canAttack"
68165
+ (click)="selectAttacker(slot.card)"
68166
+ >
68167
+ <span>{{ slot.card.name }}</span>
68168
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68169
+ </button>
68170
+ } @else {
68171
+ <span class="christianity-slot"></span>
68172
+ }
68173
+ }
68174
+ </div>
68175
+ <div class="christianity-player__summary">
68176
+ <div class="christianity-offerings">
68177
+ <span>{{ t('christianityOfferings') }}</span>
68178
+ <strong>{{ player().offeringPoints }}/{{ player().maxOfferings }}</strong>
68179
+ </div>
68180
+ <button type="button" class="christianity-leader Christianity-leader--target" (click)="attackLeader()">
68181
+ <span>{{ player().leaderName }}</span>
68182
+ <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
68183
+ </button>
68184
+ <button type="button" class="christianity-end-turn" (click)="endTurn()">
68185
+ {{ t('christianityEndTurn') }}
68186
+ </button>
68187
+ </div>
68188
+ </section>
68189
+ </section>
68190
+
68191
+ <section class="christianity-hand" [attr.aria-label]="t('christianityYourHand')">
68192
+ @for (cardId of player().hand ?? []; track cardId + $index) {
68193
+ @let card = cardDefinition(cardId);
68194
+ <button
68195
+ type="button"
68196
+ class="christianity-card christianity-card--hand"
68197
+ [class.is-selected]="selectedHandCard() === cardId"
68198
+ [class.is-disabled]="!canPlay(card)"
68199
+ (click)="selectHandCard(cardId)"
68200
+ >
68201
+ <small>{{ t('christianityCost') }} {{ card.cost }}</small>
68202
+ <span>{{ card.name }}</span>
68203
+ <strong>{{ card.attack }} / {{ card.life }}</strong>
68204
+ </button>
68205
+ }
68206
+ </section>
68207
+
68208
+ <section class="christianity-actions" aria-live="polite">
68209
+ <p>{{ statusText() }}</p>
68210
+ <div>
68211
+ <button type="button" [disabled]="!selectedHandCard() || !canPlaySelected()" (click)="playSelectedCard()">
68212
+ {{ t('christianityPlayCard') }}
68213
+ </button>
68214
+ <button type="button" (click)="resetMock()">
68215
+ {{ t('christianityReset') }}
68216
+ </button>
68217
+ </div>
68218
+ </section>
68219
+
68220
+ @if (showHistory()) {
68221
+ <section class="christianity-history">
68222
+ <h2>{{ t('christianityHistory') }}</h2>
68223
+ @if (game().historyZone.length) {
68224
+ <p>{{ historyNames() }}</p>
68225
+ } @else {
68226
+ <p>{{ t('christianityHistoryEmpty') }}</p>
68227
+ }
68228
+ </section>
68229
+ }
68230
+ </main>
68231
+ `, isInline: true, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.875rem;padding:1rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb}.christianity-header,.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-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header p,.christianity-turn span,.christianity-offerings span,.christianity-hidden-hand span,.christianity-deck span,.christianity-place span,.christianity-pile span,.christianity-leader span{color:#1f2933a3;font-size:.75rem}.christianity-turn,.christianity-leader,.christianity-offerings,.christianity-hidden-hand,.christianity-pile,.christianity-deck,.christianity-place{display:grid;gap:.15rem;min-width:5.25rem;padding:.55rem .65rem;border:1px solid rgba(36,48,68,.12);border-radius:.5rem;background:#fff}.christianity-turn.is-own-turn{border-color:#12806c59;background:#ecfdf5}.christianity-table{display:grid;gap:.75rem;padding:.75rem;border-radius:.75rem;background:#dceafb}.christianity-player{display:grid;gap:.65rem}.christianity-battle-zone{display:grid;grid-template-columns:repeat(5,minmax(4.2rem,1fr));gap:.5rem;min-height:7rem;padding:.65rem;border-radius:.75rem;background:#ffffffc2}.christianity-shared-zone{padding:.65rem;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:#2563eb;box-shadow:0 0 0 .2rem #2563eb29}.christianity-card.is-disabled,.christianity-card.is-exhausted{opacity:.55}.christianity-card.is-target{border-color:#dc2626}.christianity-slot{min-height:5.8rem;border:1px dashed rgba(36,48,68,.22);border-radius:.5rem;background:#ffffff73}.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}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible{outline:.1875rem solid rgba(37,99,235,.24);outline-offset:.125rem}@media (max-width: 720px){.christianity-shell{padding:.75rem}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-battle-zone{grid-template-columns:repeat(5,minmax(3.8rem,1fr));overflow-x:auto}}\n"] }); }
68232
+ }
68233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, decorators: [{
68234
+ type: Component,
68235
+ args: [{ selector: 'val-christianity-game', standalone: true, template: `
68236
+ <main class="christianity-shell">
68237
+ <section class="christianity-header">
68238
+ <div>
68239
+ <p>{{ t('christianityEyebrow') }}</p>
68240
+ <h1>{{ t('christianityTitle') }}</h1>
68241
+ </div>
68242
+ <div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
68243
+ <span>{{ t('christianityTurn') }}</span>
68244
+ <strong>{{ currentPlayer().displayName }}</strong>
68245
+ </div>
68246
+ </section>
68247
+
68248
+ <section class="christianity-table" [attr.aria-label]="t('christianityTable')">
68249
+ <section class="christianity-player christianity-player--opponent">
68250
+ <div class="christianity-player__summary">
68251
+ <div class="christianity-leader">
68252
+ <span>{{ opponent().leaderName }}</span>
68253
+ <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
68254
+ </div>
68255
+ <div class="christianity-offerings">
68256
+ <span>{{ t('christianityOfferings') }}</span>
68257
+ <strong>{{ opponent().offeringPoints }}/{{ opponent().maxOfferings }}</strong>
68258
+ </div>
68259
+ <div class="christianity-hidden-hand">
68260
+ <span>{{ t('christianityHand') }}</span>
68261
+ <strong>{{ opponentHandCount() }}</strong>
68262
+ </div>
68263
+ </div>
68264
+ <div class="christianity-battle-zone" [attr.aria-label]="t('christianityOpponentBattle')">
68265
+ @for (slot of battleSlots('P2'); track slot.trackId) {
68266
+ @if (slot.card) {
68267
+ <button
68268
+ type="button"
68269
+ class="christianity-card christianity-card--battle"
68270
+ [class.is-target]="selectedAttacker()"
68271
+ (click)="attackCharacter(slot.card)"
68272
+ >
68273
+ <span>{{ slot.card.name }}</span>
68274
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68275
+ </button>
68276
+ } @else {
68277
+ <span class="christianity-slot"></span>
68278
+ }
68279
+ }
68280
+ </div>
68281
+ </section>
68282
+
68283
+ <section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
68284
+ <button type="button" class="christianity-pile" (click)="showHistory.set(!showHistory())">
68285
+ <span>{{ t('christianityHistory') }}</span>
68286
+ <strong>{{ game().historyZone.length }}</strong>
68287
+ </button>
68288
+ <div class="christianity-deck" aria-live="polite">
68289
+ <span>{{ t('christianityDeck') }}</span>
68290
+ <strong>{{ game().sharedDeckCount }}</strong>
68291
+ </div>
68292
+ <div class="christianity-place">
68293
+ <span>{{ t('christianityPlace') }}</span>
68294
+ <strong>{{ t('christianityEmpty') }}</strong>
68295
+ </div>
68296
+ </section>
68297
+
68298
+ <section class="christianity-player">
68299
+ <div class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
68300
+ @for (slot of battleSlots('P1'); track slot.trackId) {
68301
+ @if (slot.card) {
68302
+ <button
68303
+ type="button"
68304
+ class="christianity-card christianity-card--battle"
68305
+ [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
68306
+ [class.is-exhausted]="!slot.card.canAttack"
68307
+ (click)="selectAttacker(slot.card)"
68308
+ >
68309
+ <span>{{ slot.card.name }}</span>
68310
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68311
+ </button>
68312
+ } @else {
68313
+ <span class="christianity-slot"></span>
68314
+ }
68315
+ }
68316
+ </div>
68317
+ <div class="christianity-player__summary">
68318
+ <div class="christianity-offerings">
68319
+ <span>{{ t('christianityOfferings') }}</span>
68320
+ <strong>{{ player().offeringPoints }}/{{ player().maxOfferings }}</strong>
68321
+ </div>
68322
+ <button type="button" class="christianity-leader Christianity-leader--target" (click)="attackLeader()">
68323
+ <span>{{ player().leaderName }}</span>
68324
+ <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
68325
+ </button>
68326
+ <button type="button" class="christianity-end-turn" (click)="endTurn()">
68327
+ {{ t('christianityEndTurn') }}
68328
+ </button>
68329
+ </div>
68330
+ </section>
68331
+ </section>
68332
+
68333
+ <section class="christianity-hand" [attr.aria-label]="t('christianityYourHand')">
68334
+ @for (cardId of player().hand ?? []; track cardId + $index) {
68335
+ @let card = cardDefinition(cardId);
68336
+ <button
68337
+ type="button"
68338
+ class="christianity-card christianity-card--hand"
68339
+ [class.is-selected]="selectedHandCard() === cardId"
68340
+ [class.is-disabled]="!canPlay(card)"
68341
+ (click)="selectHandCard(cardId)"
68342
+ >
68343
+ <small>{{ t('christianityCost') }} {{ card.cost }}</small>
68344
+ <span>{{ card.name }}</span>
68345
+ <strong>{{ card.attack }} / {{ card.life }}</strong>
68346
+ </button>
68347
+ }
68348
+ </section>
68349
+
68350
+ <section class="christianity-actions" aria-live="polite">
68351
+ <p>{{ statusText() }}</p>
68352
+ <div>
68353
+ <button type="button" [disabled]="!selectedHandCard() || !canPlaySelected()" (click)="playSelectedCard()">
68354
+ {{ t('christianityPlayCard') }}
68355
+ </button>
68356
+ <button type="button" (click)="resetMock()">
68357
+ {{ t('christianityReset') }}
68358
+ </button>
68359
+ </div>
68360
+ </section>
68361
+
68362
+ @if (showHistory()) {
68363
+ <section class="christianity-history">
68364
+ <h2>{{ t('christianityHistory') }}</h2>
68365
+ @if (game().historyZone.length) {
68366
+ <p>{{ historyNames() }}</p>
68367
+ } @else {
68368
+ <p>{{ t('christianityHistoryEmpty') }}</p>
68369
+ }
68370
+ </section>
68371
+ }
68372
+ </main>
68373
+ `, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.875rem;padding:1rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb}.christianity-header,.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-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header p,.christianity-turn span,.christianity-offerings span,.christianity-hidden-hand span,.christianity-deck span,.christianity-place span,.christianity-pile span,.christianity-leader span{color:#1f2933a3;font-size:.75rem}.christianity-turn,.christianity-leader,.christianity-offerings,.christianity-hidden-hand,.christianity-pile,.christianity-deck,.christianity-place{display:grid;gap:.15rem;min-width:5.25rem;padding:.55rem .65rem;border:1px solid rgba(36,48,68,.12);border-radius:.5rem;background:#fff}.christianity-turn.is-own-turn{border-color:#12806c59;background:#ecfdf5}.christianity-table{display:grid;gap:.75rem;padding:.75rem;border-radius:.75rem;background:#dceafb}.christianity-player{display:grid;gap:.65rem}.christianity-battle-zone{display:grid;grid-template-columns:repeat(5,minmax(4.2rem,1fr));gap:.5rem;min-height:7rem;padding:.65rem;border-radius:.75rem;background:#ffffffc2}.christianity-shared-zone{padding:.65rem;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:#2563eb;box-shadow:0 0 0 .2rem #2563eb29}.christianity-card.is-disabled,.christianity-card.is-exhausted{opacity:.55}.christianity-card.is-target{border-color:#dc2626}.christianity-slot{min-height:5.8rem;border:1px dashed rgba(36,48,68,.22);border-radius:.5rem;background:#ffffff73}.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}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible{outline:.1875rem solid rgba(37,99,235,.24);outline-offset:.125rem}@media (max-width: 720px){.christianity-shell{padding:.75rem}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-battle-zone{grid-template-columns:repeat(5,minmax(3.8rem,1fr));overflow-x:auto}}\n"] }]
68374
+ }], ctorParameters: () => [] });
68375
+
67836
68376
  addIcons({ refreshOutline, sparklesOutline, trophyOutline });
67837
68377
  const BUBBLE_COLORS = {
67838
68378
  rose: '#ff4f9f',
@@ -85385,5 +85925,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
85385
85925
  * Generated bundle index. Do not edit.
85386
85926
  */
85387
85927
 
85388
- 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 };
85928
+ 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, 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 };
85389
85929
  //# sourceMappingURL=valtech-components.mjs.map