valtech-components 4.0.429 → 4.0.431

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.429';
61
+ const VERSION = '4.0.431';
62
62
 
63
63
  // Control de estado de refresco (singleton a nivel de módulo)
64
64
  let isRefreshing = false;
@@ -62464,6 +62464,7 @@ const MINI_GAMES_I18N = {
62464
62464
  christianityHand: 'Mano',
62465
62465
  christianityOpponentBattle: 'Zona de batalla rival',
62466
62466
  christianityYourBattle: 'Tu zona de batalla',
62467
+ christianityOpponentHand: 'Mano rival',
62467
62468
  christianitySharedZone: 'Zona compartida',
62468
62469
  christianityHistory: 'Historia',
62469
62470
  christianityDeck: 'Mazo',
@@ -62472,14 +62473,29 @@ const MINI_GAMES_I18N = {
62472
62473
  christianityYourHand: 'Tu mano',
62473
62474
  christianityCost: 'Coste',
62474
62475
  christianityOfferingCard: 'Ofrenda',
62476
+ christianityCharacterCard: 'Personaje',
62477
+ christianityLeaderCard: 'Líder',
62478
+ christianityHiddenCard: 'Carta oculta',
62475
62479
  christianityEndTurn: 'Terminar turno',
62476
62480
  christianityPlayCard: 'Jugar carta',
62477
62481
  christianityReset: 'Reiniciar mock',
62478
62482
  christianityWaitTurn: 'Espera el turno rival.',
62479
62483
  christianityChooseTarget: 'Elige un objetivo para atacar.',
62484
+ christianityChooseCharacterTarget: 'El rival tiene personajes: debes atacarlos antes que al líder.',
62480
62485
  christianityReadyToPlay: 'Puedes jugar esta carta.',
62481
62486
  christianityNeedOfferings: 'Necesitas más ofrendas para jugar esa carta.',
62482
62487
  christianityChooseCard: 'Elige una carta o un personaje listo para actuar.',
62488
+ christianityLeaderProtected: 'No puedes atacar directamente al líder mientras tenga personajes en batalla.',
62489
+ christianityLeaderBody: 'Si su vida llega a 0, la partida termina.',
62490
+ christianityOfferingReady: 'Lista',
62491
+ christianityOfferingExhausted: 'Agotada',
62492
+ christianityOfferingBody: 'Se agota para pagar costes y vuelve a estar lista al comenzar tu turno.',
62493
+ christianityCharacterBody: 'Entra a batalla y debe esperar un turno para atacar.',
62494
+ christianityCharacterReady: 'Listo para atacar.',
62495
+ christianityCharacterExhausted: 'No puede atacar todavía.',
62496
+ christianityDeckBody: 'La primera carta de esta pila se roba automaticamente al comenzar cada turno.',
62497
+ christianityClosePreview: 'Cerrar previsualizacion de carta',
62498
+ christianityCloseHistory: 'Cerrar historia',
62483
62499
  christianityHistoryEmpty: 'Todavía no hay cartas en historia.',
62484
62500
  soonTitle: 'Próximamente',
62485
62501
  openGame: 'Jugar',
@@ -62869,6 +62885,7 @@ const MINI_GAMES_I18N = {
62869
62885
  christianityHand: 'Hand',
62870
62886
  christianityOpponentBattle: 'Opponent battle zone',
62871
62887
  christianityYourBattle: 'Your battle zone',
62888
+ christianityOpponentHand: 'Opponent hand',
62872
62889
  christianitySharedZone: 'Shared zone',
62873
62890
  christianityHistory: 'History',
62874
62891
  christianityDeck: 'Deck',
@@ -62877,14 +62894,29 @@ const MINI_GAMES_I18N = {
62877
62894
  christianityYourHand: 'Your hand',
62878
62895
  christianityCost: 'Cost',
62879
62896
  christianityOfferingCard: 'Offering',
62897
+ christianityCharacterCard: 'Character',
62898
+ christianityLeaderCard: 'Leader',
62899
+ christianityHiddenCard: 'Hidden card',
62880
62900
  christianityEndTurn: 'End turn',
62881
62901
  christianityPlayCard: 'Play card',
62882
62902
  christianityReset: 'Reset mock',
62883
62903
  christianityWaitTurn: 'Wait for the opponent turn.',
62884
62904
  christianityChooseTarget: 'Choose a target to attack.',
62905
+ christianityChooseCharacterTarget: 'The opponent has characters: attack them before the leader.',
62885
62906
  christianityReadyToPlay: 'You can play this card.',
62886
62907
  christianityNeedOfferings: 'You need more offerings to play that card.',
62887
62908
  christianityChooseCard: 'Choose a card or a ready character.',
62909
+ christianityLeaderProtected: 'You cannot attack the leader directly while they have characters in battle.',
62910
+ christianityLeaderBody: 'If this leader reaches 0 life, the game ends.',
62911
+ christianityOfferingReady: 'Ready',
62912
+ christianityOfferingExhausted: 'Exhausted',
62913
+ christianityOfferingBody: 'Exhaust it to pay costs. It readies again at the start of your turn.',
62914
+ christianityCharacterBody: 'Enters battle and must wait one turn before attacking.',
62915
+ christianityCharacterReady: 'Ready to attack.',
62916
+ christianityCharacterExhausted: 'Cannot attack yet.',
62917
+ christianityDeckBody: 'The top card in this pile is drawn automatically at the start of each turn.',
62918
+ christianityClosePreview: 'Close card preview',
62919
+ christianityCloseHistory: 'Close history',
62888
62920
  christianityHistoryEmpty: 'There are no cards in history yet.',
62889
62921
  soonTitle: 'Coming soon',
62890
62922
  openGame: 'Play',
@@ -67891,6 +67923,26 @@ const STARTER_CARDS = {
67891
67923
  p_elder: { id: 'p_elder', name: 'Elder', type: 'character', cost: 3, attack: 2, life: 4 },
67892
67924
  p_champion: { id: 'p_champion', name: 'Champion', type: 'character', cost: 4, attack: 4, life: 4 },
67893
67925
  };
67926
+ const STARTING_SHARED_DECK = [
67927
+ 'o_simple',
67928
+ 'p_scout',
67929
+ 'o_simple',
67930
+ 'p_guard',
67931
+ 'p_warrior',
67932
+ 'o_simple',
67933
+ 'p_elder',
67934
+ 'p_scout',
67935
+ 'o_simple',
67936
+ 'p_champion',
67937
+ 'p_guard',
67938
+ 'o_simple',
67939
+ 'p_warrior',
67940
+ 'p_scout',
67941
+ 'o_simple',
67942
+ 'p_elder',
67943
+ 'p_guard',
67944
+ 'o_simple',
67945
+ ];
67894
67946
  const STARTING_GAME = {
67895
67947
  gameId: 'mock-christianity',
67896
67948
  status: 'in_progress',
@@ -67898,12 +67950,14 @@ const STARTING_GAME = {
67898
67950
  turnOwner: 'P1',
67899
67951
  revision: 0,
67900
67952
  turnCount: 1,
67901
- sharedDeckCount: 12,
67953
+ sharedDeck: STARTING_SHARED_DECK,
67902
67954
  historyZone: [],
67903
67955
  players: {
67904
67956
  P1: {
67905
67957
  seat: 'P1',
67906
67958
  displayName: 'Jugador',
67959
+ avatar: 'J',
67960
+ avatarColor: '#2563eb',
67907
67961
  leaderName: 'Adam',
67908
67962
  leaderHp: 15,
67909
67963
  leaderMaxHp: 15,
@@ -67915,6 +67969,8 @@ const STARTING_GAME = {
67915
67969
  P2: {
67916
67970
  seat: 'P2',
67917
67971
  displayName: 'Rival',
67972
+ avatar: 'R',
67973
+ avatarColor: '#b45309',
67918
67974
  leaderName: 'Noah',
67919
67975
  leaderHp: 15,
67920
67976
  leaderMaxHp: 15,
@@ -67944,11 +68000,13 @@ class ChristianityGameComponent {
67944
68000
  this.game = signal(structuredClone(STARTING_GAME));
67945
68001
  this.selectedHandCard = signal(null);
67946
68002
  this.selectedAttacker = signal(null);
68003
+ this.selectedPreview = signal(null);
67947
68004
  this.showHistory = signal(false);
67948
68005
  this.player = computed(() => this.game().players.P1);
67949
68006
  this.opponent = computed(() => this.game().players.P2);
67950
68007
  this.currentPlayer = computed(() => this.game().players[this.game().turnOwner]);
67951
68008
  this.isOwnTurn = computed(() => this.game().turnOwner === 'P1');
68009
+ this.hasOpponentGuards = computed(() => this.opponent().battleZone.length > 0);
67952
68010
  this.opponentHandCount = computed(() => this.opponent().handCount ?? this.opponent().hand?.length ?? 0);
67953
68011
  this.statusText = computed(() => {
67954
68012
  const attacker = this.selectedAttacker();
@@ -67957,7 +68015,7 @@ class ChristianityGameComponent {
67957
68015
  return this.t('christianityWaitTurn');
67958
68016
  }
67959
68017
  if (attacker) {
67960
- return this.t('christianityChooseTarget');
68018
+ return this.hasOpponentGuards() ? this.t('christianityChooseCharacterTarget') : this.t('christianityChooseTarget');
67961
68019
  }
67962
68020
  if (handCard) {
67963
68021
  const card = this.cardDefinition(handCard);
@@ -67976,11 +68034,24 @@ class ChristianityGameComponent {
67976
68034
  }
67977
68035
  battleSlots(seat) {
67978
68036
  const cards = this.game().players[seat].battleZone;
67979
- return Array.from({ length: 5 }, (_, index) => ({
68037
+ return Array.from({ length: 4 }, (_, index) => ({
67980
68038
  trackId: cards[index]?.instanceId ?? `${seat}-empty-${index}`,
67981
68039
  card: cards[index],
67982
68040
  }));
67983
68041
  }
68042
+ hiddenHandCards(count) {
68043
+ return Array.from({ length: count });
68044
+ }
68045
+ fanTransform(index, total, opponent) {
68046
+ if (total <= 1)
68047
+ return opponent ? 'rotate(180deg)' : 'none';
68048
+ const center = (total - 1) / 2;
68049
+ const offset = index - center;
68050
+ const rotate = offset * 5;
68051
+ const lift = Math.abs(offset) * 0.25;
68052
+ const base = opponent ? 'rotate(180deg)' : '';
68053
+ return `${base} translateY(${lift}rem) rotate(${rotate}deg)`;
68054
+ }
67984
68055
  readyOfferings(player) {
67985
68056
  return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), 0);
67986
68057
  }
@@ -67989,7 +68060,7 @@ class ChristianityGameComponent {
67989
68060
  return false;
67990
68061
  if (card.type === 'offering')
67991
68062
  return !this.player().offeringPlayedThisTurn;
67992
- return this.readyOfferings(this.player()) >= card.cost && this.player().battleZone.length < 5;
68063
+ return this.readyOfferings(this.player()) >= card.cost && this.player().battleZone.length < 4;
67993
68064
  }
67994
68065
  canPlaySelected() {
67995
68066
  const selected = this.selectedHandCard();
@@ -67998,6 +68069,7 @@ class ChristianityGameComponent {
67998
68069
  selectHandCard(cardId) {
67999
68070
  this.selectedAttacker.set(null);
68000
68071
  this.selectedHandCard.set(this.selectedHandCard() === cardId ? null : cardId);
68072
+ this.inspectHandCard(cardId);
68001
68073
  }
68002
68074
  playSelectedCard() {
68003
68075
  const cardId = this.selectedHandCard();
@@ -68049,14 +68121,36 @@ class ChristianityGameComponent {
68049
68121
  }
68050
68122
  selectAttacker(card) {
68051
68123
  this.selectedHandCard.set(null);
68124
+ this.inspectCharacter(card);
68052
68125
  if (!this.isOwnTurn() || !card.canAttack)
68053
68126
  return;
68054
68127
  this.selectedAttacker.set(this.selectedAttacker()?.instanceId === card.instanceId ? null : card);
68055
68128
  }
68129
+ handleOpponentCharacter(card) {
68130
+ this.inspectCharacter(card);
68131
+ if (this.selectedAttacker()) {
68132
+ this.attackCharacter(card);
68133
+ }
68134
+ }
68135
+ handleOpponentLeader() {
68136
+ this.inspectLeader('P2');
68137
+ if (this.selectedAttacker() && !this.hasOpponentGuards()) {
68138
+ this.attackLeader();
68139
+ }
68140
+ }
68056
68141
  attackLeader() {
68057
68142
  const attacker = this.selectedAttacker();
68058
68143
  if (!attacker)
68059
68144
  return;
68145
+ if (this.hasOpponentGuards()) {
68146
+ this.selectedPreview.set({
68147
+ title: this.opponent().leaderName,
68148
+ eyebrow: this.t('christianityLeaderCard'),
68149
+ meta: `${this.opponent().leaderHp}/${this.opponent().leaderMaxHp}`,
68150
+ body: this.t('christianityLeaderProtected'),
68151
+ });
68152
+ return;
68153
+ }
68060
68154
  this.game.update(game => {
68061
68155
  const next = structuredClone(game);
68062
68156
  const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
@@ -68094,6 +68188,7 @@ class ChristianityGameComponent {
68094
68188
  endTurn() {
68095
68189
  this.selectedHandCard.set(null);
68096
68190
  this.selectedAttacker.set(null);
68191
+ this.selectedPreview.set(null);
68097
68192
  this.game.update(game => {
68098
68193
  const next = structuredClone(game);
68099
68194
  next.turnOwner = next.turnOwner === 'P1' ? 'P2' : 'P1';
@@ -68102,8 +68197,21 @@ class ChristianityGameComponent {
68102
68197
  current.offeringPlayedThisTurn = false;
68103
68198
  current.offerings = current.offerings.map(offering => ({ ...offering, ready: true }));
68104
68199
  current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
68200
+ const drawnCard = next.sharedDeck.shift();
68201
+ if (drawnCard) {
68202
+ if (current.hand) {
68203
+ current.hand.push(drawnCard);
68204
+ }
68205
+ else {
68206
+ current.handCount = (current.handCount ?? 0) + 1;
68207
+ }
68208
+ }
68105
68209
  next.revision++;
68106
- next.log = [`Turno de ${current.displayName}.`, ...next.log].slice(0, 4);
68210
+ next.log = [
68211
+ drawnCard ? `${current.displayName} roba una carta.` : `El mazo esta vacio.`,
68212
+ `Turno de ${current.displayName}.`,
68213
+ ...next.log,
68214
+ ].slice(0, 4);
68107
68215
  return next;
68108
68216
  });
68109
68217
  }
@@ -68111,11 +68219,11 @@ class ChristianityGameComponent {
68111
68219
  this.game.set(structuredClone(STARTING_GAME));
68112
68220
  this.selectedHandCard.set(null);
68113
68221
  this.selectedAttacker.set(null);
68222
+ this.selectedPreview.set(null);
68223
+ this.showHistory.set(false);
68114
68224
  }
68115
- historyNames() {
68116
- return this.game()
68117
- .historyZone.map(cardId => this.cardDefinition(cardId).name)
68118
- .join(', ');
68225
+ closePreview() {
68226
+ this.selectedPreview.set(null);
68119
68227
  }
68120
68228
  cleanupDestroyed(player, game) {
68121
68229
  const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
@@ -68124,6 +68232,52 @@ class ChristianityGameComponent {
68124
68232
  game.historyZone.push(...destroyed.map(card => card.cardId));
68125
68233
  player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
68126
68234
  }
68235
+ inspectLeader(seat) {
68236
+ const player = this.game().players[seat];
68237
+ this.selectedPreview.set({
68238
+ title: player.leaderName,
68239
+ eyebrow: this.t('christianityLeaderCard'),
68240
+ meta: `${player.leaderHp}/${player.leaderMaxHp}`,
68241
+ body: seat === 'P2' && this.hasOpponentGuards() ? this.t('christianityLeaderProtected') : this.t('christianityLeaderBody'),
68242
+ });
68243
+ }
68244
+ inspectOffering(offering) {
68245
+ this.selectedPreview.set({
68246
+ title: offering.name,
68247
+ eyebrow: this.t('christianityOfferingCard'),
68248
+ meta: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
68249
+ body: this.t('christianityOfferingBody'),
68250
+ });
68251
+ }
68252
+ inspectDeck() {
68253
+ this.selectedPreview.set({
68254
+ title: this.t('christianityDeck'),
68255
+ eyebrow: this.t('christianitySharedZone'),
68256
+ meta: `${this.game().sharedDeck.length}`,
68257
+ body: this.t('christianityDeckBody'),
68258
+ });
68259
+ }
68260
+ inspectHandCard(cardId) {
68261
+ const card = this.cardDefinition(cardId);
68262
+ this.selectedPreview.set({
68263
+ title: card.name,
68264
+ eyebrow: card.type === 'offering' ? this.t('christianityOfferingCard') : this.t('christianityCharacterCard'),
68265
+ meta: card.type === 'offering' ? `+${card.life}` : `${this.t('christianityCost')} ${card.cost} · ${card.attack}/${card.life}`,
68266
+ body: card.type === 'offering' ? this.t('christianityOfferingBody') : this.t('christianityCharacterBody'),
68267
+ });
68268
+ }
68269
+ inspectHistoryCard(cardId) {
68270
+ this.showHistory.set(false);
68271
+ this.inspectHandCard(cardId);
68272
+ }
68273
+ inspectCharacter(card) {
68274
+ this.selectedPreview.set({
68275
+ title: card.name,
68276
+ eyebrow: this.t('christianityCharacterCard'),
68277
+ meta: `${card.attack}/${card.currentHp}`,
68278
+ body: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
68279
+ });
68280
+ }
68127
68281
  spendOfferings(player, cost) {
68128
68282
  let remaining = cost;
68129
68283
  player.offerings = player.offerings.map(offering => {
@@ -68147,94 +68301,129 @@ class ChristianityGameComponent {
68147
68301
  </div>
68148
68302
  </section>
68149
68303
 
68304
+ <section class="christianity-opponent-hand-area" [attr.aria-label]="t('christianityOpponentHand')">
68305
+ <div class="christianity-player-badge christianity-player-badge--opponent">
68306
+ <span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
68307
+ <strong>{{ opponent().displayName }}</strong>
68308
+ </div>
68309
+ <div class="christianity-hand-fan christianity-hand-fan--opponent">
68310
+ @for (_ of hiddenHandCards(opponentHandCount()); track $index) {
68311
+ <button
68312
+ type="button"
68313
+ class="christianity-card-preview-card christianity-card-preview-card--back"
68314
+ [style.transform]="fanTransform($index, opponentHandCount(), true)"
68315
+ [attr.aria-label]="t('christianityHiddenCard')"
68316
+ ></button>
68317
+ }
68318
+ </div>
68319
+ </section>
68320
+
68150
68321
  <section class="christianity-table" [attr.aria-label]="t('christianityTable')">
68151
- <section class="christianity-player christianity-player--opponent">
68152
- <div class="christianity-player__summary">
68153
- <div class="christianity-leader">
68154
- <span>{{ opponent().leaderName }}</span>
68155
- <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
68156
- </div>
68157
- <div class="christianity-offerings">
68158
- <span>{{ t('christianityOfferings') }}</span>
68159
- <strong>{{ readyOfferings(opponent()) }}/{{ opponent().offerings.length }}</strong>
68160
- <div class="christianity-offering-cards" aria-hidden="true">
68161
- @for (offering of opponent().offerings; track offering.instanceId) {
68162
- <i [class.is-used]="!offering.ready"></i>
68163
- }
68164
- </div>
68165
- </div>
68166
- <div class="christianity-hidden-hand">
68167
- <span>{{ t('christianityHand') }}</span>
68168
- <strong>{{ opponentHandCount() }}</strong>
68169
- </div>
68170
- </div>
68171
- <div class="christianity-battle-zone" [attr.aria-label]="t('christianityOpponentBattle')">
68172
- @for (slot of battleSlots('P2'); track slot.trackId) {
68173
- @if (slot.card) {
68174
- <button
68175
- type="button"
68176
- class="christianity-card christianity-card--battle"
68177
- [class.is-target]="selectedAttacker()"
68178
- (click)="attackCharacter(slot.card)"
68179
- >
68180
- <span>{{ slot.card.name }}</span>
68181
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68182
- </button>
68183
- } @else {
68184
- <span class="christianity-slot"></span>
68185
- }
68322
+ <section class="christianity-player-rack christianity-player-rack--opponent">
68323
+ <div class="christianity-offerings-zone">
68324
+ @for (offering of opponent().offerings; track offering.instanceId) {
68325
+ <button
68326
+ type="button"
68327
+ class="christianity-card-mini christianity-card-mini--offering"
68328
+ [class.is-exhausted]="!offering.ready"
68329
+ (click)="inspectOffering(offering)"
68330
+ >
68331
+ <span>{{ t('christianityOfferingCard') }}</span>
68332
+ <strong>+{{ offering.value }}</strong>
68333
+ </button>
68186
68334
  }
68187
68335
  </div>
68336
+ <button type="button" class="christianity-leader-card" [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
68337
+ <span>{{ opponent().leaderName }}</span>
68338
+ <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
68339
+ </button>
68340
+ <div class="christianity-player-badge">
68341
+ <span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
68342
+ <strong>{{ opponent().displayName }}</strong>
68343
+ </div>
68344
+ </section>
68345
+
68346
+ <section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
68347
+ @for (slot of battleSlots('P2'); track slot.trackId) {
68348
+ @if (slot.card) {
68349
+ <button
68350
+ type="button"
68351
+ class="christianity-card-preview-card christianity-card-preview-card--battle"
68352
+ [class.is-target]="selectedAttacker()"
68353
+ (click)="handleOpponentCharacter(slot.card)"
68354
+ >
68355
+ <span>{{ slot.card.name }}</span>
68356
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68357
+ </button>
68358
+ } @else {
68359
+ <span class="christianity-slot"></span>
68360
+ }
68361
+ }
68188
68362
  </section>
68189
68363
 
68190
68364
  <section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
68191
- <button type="button" class="christianity-pile" (click)="showHistory.set(!showHistory())">
68365
+ <button type="button" class="christianity-zone-pile christianity-zone-pile--history" (click)="showHistory.set(true)">
68366
+ <i aria-hidden="true"></i>
68367
+ <i aria-hidden="true"></i>
68368
+ <i aria-hidden="true"></i>
68192
68369
  <span>{{ t('christianityHistory') }}</span>
68193
68370
  <strong>{{ game().historyZone.length }}</strong>
68194
68371
  </button>
68195
- <div class="christianity-deck" aria-live="polite">
68372
+ <button type="button" class="christianity-zone-pile christianity-zone-pile--deck" aria-live="polite" (click)="inspectDeck()">
68373
+ <i aria-hidden="true"></i>
68374
+ <i aria-hidden="true"></i>
68375
+ <i aria-hidden="true"></i>
68196
68376
  <span>{{ t('christianityDeck') }}</span>
68197
- <strong>{{ game().sharedDeckCount }}</strong>
68198
- </div>
68199
- <div class="christianity-place">
68377
+ <strong>{{ game().sharedDeck.length }}</strong>
68378
+ </button>
68379
+ <div class="christianity-zone-card">
68200
68380
  <span>{{ t('christianityPlace') }}</span>
68201
68381
  <strong>{{ t('christianityEmpty') }}</strong>
68202
68382
  </div>
68203
68383
  </section>
68204
68384
 
68205
- <section class="christianity-player">
68206
- <div class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
68207
- @for (slot of battleSlots('P1'); track slot.trackId) {
68208
- @if (slot.card) {
68209
- <button
68210
- type="button"
68211
- class="christianity-card christianity-card--battle"
68212
- [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
68213
- [class.is-exhausted]="!slot.card.canAttack"
68214
- (click)="selectAttacker(slot.card)"
68215
- >
68216
- <span>{{ slot.card.name }}</span>
68217
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68218
- </button>
68219
- } @else {
68220
- <span class="christianity-slot"></span>
68221
- }
68385
+ <section class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
68386
+ @for (slot of battleSlots('P1'); track slot.trackId) {
68387
+ @if (slot.card) {
68388
+ <button
68389
+ type="button"
68390
+ class="christianity-card-preview-card christianity-card-preview-card--battle"
68391
+ [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
68392
+ [class.is-exhausted]="!slot.card.canAttack"
68393
+ (click)="selectAttacker(slot.card)"
68394
+ >
68395
+ <span>{{ slot.card.name }}</span>
68396
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68397
+ </button>
68398
+ } @else {
68399
+ <span class="christianity-slot"></span>
68400
+ }
68401
+ }
68402
+ </section>
68403
+
68404
+ <section class="christianity-player-rack">
68405
+ <div class="christianity-offerings-zone">
68406
+ @for (offering of player().offerings; track offering.instanceId) {
68407
+ <button
68408
+ type="button"
68409
+ class="christianity-card-mini christianity-card-mini--offering"
68410
+ [class.is-exhausted]="!offering.ready"
68411
+ (click)="inspectOffering(offering)"
68412
+ >
68413
+ <span>{{ t('christianityOfferingCard') }}</span>
68414
+ <strong>+{{ offering.value }}</strong>
68415
+ </button>
68222
68416
  }
68223
68417
  </div>
68224
- <div class="christianity-player__summary">
68225
- <div class="christianity-offerings">
68226
- <span>{{ t('christianityOfferings') }}</span>
68227
- <strong>{{ readyOfferings(player()) }}/{{ player().offerings.length }}</strong>
68228
- <div class="christianity-offering-cards" aria-hidden="true">
68229
- @for (offering of player().offerings; track offering.instanceId) {
68230
- <i [class.is-used]="!offering.ready"></i>
68231
- }
68232
- </div>
68418
+ <button type="button" class="christianity-leader-card" (click)="inspectLeader('P1')">
68419
+ <span>{{ player().leaderName }}</span>
68420
+ <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
68421
+ </button>
68422
+ <div class="christianity-player-command">
68423
+ <div class="christianity-player-badge">
68424
+ <span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
68425
+ <strong>{{ player().displayName }}</strong>
68233
68426
  </div>
68234
- <button type="button" class="christianity-leader christianity-leader--target" (click)="attackLeader()">
68235
- <span>{{ player().leaderName }}</span>
68236
- <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
68237
- </button>
68238
68427
  <button type="button" class="christianity-end-turn" (click)="endTurn()">
68239
68428
  {{ t('christianityEndTurn') }}
68240
68429
  </button>
@@ -68242,14 +68431,15 @@ class ChristianityGameComponent {
68242
68431
  </section>
68243
68432
  </section>
68244
68433
 
68245
- <section class="christianity-hand" [attr.aria-label]="t('christianityYourHand')">
68434
+ <section class="christianity-hand-fan" [attr.aria-label]="t('christianityYourHand')">
68246
68435
  @for (cardId of player().hand ?? []; track cardId + $index) {
68247
68436
  @let card = cardDefinition(cardId);
68248
68437
  <button
68249
68438
  type="button"
68250
- class="christianity-card christianity-card--hand"
68439
+ class="christianity-card-preview-card christianity-card-preview-card--hand"
68251
68440
  [class.is-selected]="selectedHandCard() === cardId"
68252
68441
  [class.is-disabled]="!canPlay(card)"
68442
+ [style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
68253
68443
  (click)="selectHandCard(cardId)"
68254
68444
  >
68255
68445
  <small>
@@ -68271,6 +68461,16 @@ class ChristianityGameComponent {
68271
68461
  }
68272
68462
  </section>
68273
68463
 
68464
+ @if (selectedPreview()) {
68465
+ <button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
68466
+ <aside class="christianity-floating-card" aria-live="polite">
68467
+ <small>{{ selectedPreview()?.eyebrow }}</small>
68468
+ <strong>{{ selectedPreview()?.title }}</strong>
68469
+ <span>{{ selectedPreview()?.meta }}</span>
68470
+ <p>{{ selectedPreview()?.body }}</p>
68471
+ </aside>
68472
+ }
68473
+
68274
68474
  <section class="christianity-actions" aria-live="polite">
68275
68475
  <p>{{ statusText() }}</p>
68276
68476
  <div>
@@ -68284,17 +68484,36 @@ class ChristianityGameComponent {
68284
68484
  </section>
68285
68485
 
68286
68486
  @if (showHistory()) {
68287
- <section class="christianity-history">
68288
- <h2>{{ t('christianityHistory') }}</h2>
68487
+ <button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
68488
+ <section class="christianity-history-drawer">
68489
+ <header>
68490
+ <h2>{{ t('christianityHistory') }}</h2>
68491
+ <span>{{ game().historyZone.length }}</span>
68492
+ </header>
68289
68493
  @if (game().historyZone.length) {
68290
- <p>{{ historyNames() }}</p>
68494
+ <div class="christianity-history-grid">
68495
+ @for (cardId of game().historyZone; track cardId + $index) {
68496
+ @let card = cardDefinition(cardId);
68497
+ <button type="button" class="christianity-card-preview-card" (click)="inspectHistoryCard(cardId)">
68498
+ <small>{{ card.type === 'offering' ? t('christianityOfferingCard') : t('christianityCharacterCard') }}</small>
68499
+ <span>{{ card.name }}</span>
68500
+ <strong>
68501
+ @if (card.type === 'offering') {
68502
+ +{{ card.life }}
68503
+ } @else {
68504
+ {{ card.attack }} / {{ card.life }}
68505
+ }
68506
+ </strong>
68507
+ </button>
68508
+ }
68509
+ </div>
68291
68510
  } @else {
68292
68511
  <p>{{ t('christianityHistoryEmpty') }}</p>
68293
68512
  }
68294
68513
  </section>
68295
68514
  }
68296
68515
  </main>
68297
- `, isInline: true, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.875rem;padding:.75rem .25rem;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:.55rem .35rem;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:.55rem .4rem;border-radius:.75rem;background:#ffffffc2}.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:#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-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{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:.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-battle-zone{grid-template-columns:repeat(5,minmax(3.8rem,1fr));overflow-x:auto}}\n"] }); }
68516
+ `, isInline: true, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.875rem;padding:.75rem .25rem;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:.55rem .35rem;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:.55rem .4rem;border-radius:.75rem;background:#ffffffc2}.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:#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-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{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}.christianity-hand-fan{position:relative;display:flex;justify-content:center;min-height:7.4rem;padding:0 .25rem;isolation:isolate}.christianity-hand-fan--opponent{min-height:5.2rem}.christianity-opponent-hand-area{display:grid;gap:.25rem;min-height:6.7rem;align-items:start;padding-bottom:.35rem}.christianity-card-preview-card,.christianity-card-mini,.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;align-content:space-between;width:clamp(4.9rem,17vw,7.1rem);min-height:clamp(6.6rem,22vw,8.8rem);margin-inline:-.42rem;padding:.48rem;text-align:left;transform-origin:50% 115%;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;box-shadow:0 .5rem 1.25rem #2430441a}.christianity-card-preview-card--hand:hover,.christianity-card-preview-card--hand.is-selected{z-index:3;border-color:#2563eb;box-shadow:0 1rem 2rem #2563eb2e}.christianity-card-preview-card--back{min-height:4.8rem;background:linear-gradient(135deg,#102a431f,#102a4305),repeating-linear-gradient(45deg,#e2e8f0 0 .35rem,#f8fafc .35rem .7rem)}.christianity-card-preview-card--battle{width:100%;min-height:5.7rem;margin-inline:0}.christianity-card-preview-card span,.christianity-card-mini span,.christianity-leader-card span,.christianity-zone-card span,.christianity-zone-pile span{font-weight:700}.christianity-card-preview-card strong,.christianity-card-mini strong,.christianity-leader-card strong,.christianity-zone-card strong,.christianity-zone-pile strong{justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-player-rack{display:grid;grid-template-columns:minmax(4.2rem,1fr) minmax(5rem,6.5rem) minmax(4.2rem,1fr);gap:.55rem;align-items:end;justify-items:center}.christianity-player-rack--opponent{align-items:start}.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-end;width:100%}.christianity-card-mini,.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-mini{width:3.5rem}.christianity-leader-card{width:min(100%,6.5rem);min-height:5.8rem}.christianity-battle-zone{grid-template-columns:repeat(4,minmax(4rem,1fr))}.christianity-shared-zone{display:grid;grid-template-columns:repeat(3,minmax(4.3rem,1fr));align-items:stretch}.christianity-zone-pile{position:relative;isolation:isolate;overflow:hidden;min-height:5.6rem;box-shadow:inset 0 0 0 999px #ffffff1f}.christianity-zone-pile i{position:absolute;inset:.62rem .72rem auto auto;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:linear-gradient(135deg,#102a4329,#102a4308),repeating-linear-gradient(45deg,#dbeafe 0 .33rem,#fff .33rem .66rem);transform:translate(-.54rem,.24rem) rotate(2deg)}.christianity-floating-card{position:fixed;top:50%;left:50%;z-index:21;display:grid;gap:.45rem;width:min(20rem,calc(100vw - 2rem));min-height:min(27rem,calc(100vh - 5rem));padding:1rem;border:1px solid rgba(36,48,68,.18);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,rgba(37,99,235,.12),transparent 45%);box-shadow:0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c;transform:translate(-50%,-50%) perspective(48rem) rotateX(5deg) rotateY(-5deg)}.christianity-preview-backdrop,.christianity-history-backdrop{position:fixed;inset:0;z-index:20;border:0;border-radius:0;background:#0f172a75}.christianity-floating-card small,.christianity-floating-card span{color:#1f2933a3}.christianity-floating-card strong{font-size:clamp(1.35rem,8vw,2rem);line-height:1.05}.christianity-floating-card p{margin:0;align-self:end;font-size:.95rem;line-height:1.35}.christianity-history-backdrop{z-index:22}.christianity-history-drawer{position:fixed;right:max(.5rem,env(safe-area-inset-right));bottom:max(.5rem,env(safe-area-inset-bottom));left:max(.5rem,env(safe-area-inset-left));z-index:23;display:grid;gap:.75rem;max-height:min(27rem,calc(100vh - 4rem));padding:.8rem;border:1px solid rgba(36,48,68,.16);border-radius:.75rem;background:#fffffffa;box-shadow:0 1.5rem 4rem #102a4347}.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-history-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.4rem,1fr));gap:.55rem;overflow-y:auto;padding:.1rem .1rem .25rem}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:.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-battle-zone{grid-template-columns:repeat(4,minmax(3.35rem,1fr));overflow-x:auto}.christianity-hand-fan{min-height:6.8rem;overflow-x:clip}.christianity-player-rack{grid-template-columns:minmax(3.6rem,1fr) minmax(4.8rem,5.6rem) minmax(3.6rem,1fr)}.christianity-shared-zone{grid-template-columns:repeat(3,minmax(3.7rem,1fr))}.christianity-card-preview-card{width:clamp(4.2rem,20vw,5.7rem);min-height:clamp(5.8rem,26vw,7.4rem)}.christianity-opponent-hand-area{min-height:6.2rem}}\n"] }); }
68298
68517
  }
68299
68518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, decorators: [{
68300
68519
  type: Component,
@@ -68311,94 +68530,129 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
68311
68530
  </div>
68312
68531
  </section>
68313
68532
 
68533
+ <section class="christianity-opponent-hand-area" [attr.aria-label]="t('christianityOpponentHand')">
68534
+ <div class="christianity-player-badge christianity-player-badge--opponent">
68535
+ <span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
68536
+ <strong>{{ opponent().displayName }}</strong>
68537
+ </div>
68538
+ <div class="christianity-hand-fan christianity-hand-fan--opponent">
68539
+ @for (_ of hiddenHandCards(opponentHandCount()); track $index) {
68540
+ <button
68541
+ type="button"
68542
+ class="christianity-card-preview-card christianity-card-preview-card--back"
68543
+ [style.transform]="fanTransform($index, opponentHandCount(), true)"
68544
+ [attr.aria-label]="t('christianityHiddenCard')"
68545
+ ></button>
68546
+ }
68547
+ </div>
68548
+ </section>
68549
+
68314
68550
  <section class="christianity-table" [attr.aria-label]="t('christianityTable')">
68315
- <section class="christianity-player christianity-player--opponent">
68316
- <div class="christianity-player__summary">
68317
- <div class="christianity-leader">
68318
- <span>{{ opponent().leaderName }}</span>
68319
- <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
68320
- </div>
68321
- <div class="christianity-offerings">
68322
- <span>{{ t('christianityOfferings') }}</span>
68323
- <strong>{{ readyOfferings(opponent()) }}/{{ opponent().offerings.length }}</strong>
68324
- <div class="christianity-offering-cards" aria-hidden="true">
68325
- @for (offering of opponent().offerings; track offering.instanceId) {
68326
- <i [class.is-used]="!offering.ready"></i>
68327
- }
68328
- </div>
68329
- </div>
68330
- <div class="christianity-hidden-hand">
68331
- <span>{{ t('christianityHand') }}</span>
68332
- <strong>{{ opponentHandCount() }}</strong>
68333
- </div>
68334
- </div>
68335
- <div class="christianity-battle-zone" [attr.aria-label]="t('christianityOpponentBattle')">
68336
- @for (slot of battleSlots('P2'); track slot.trackId) {
68337
- @if (slot.card) {
68338
- <button
68339
- type="button"
68340
- class="christianity-card christianity-card--battle"
68341
- [class.is-target]="selectedAttacker()"
68342
- (click)="attackCharacter(slot.card)"
68343
- >
68344
- <span>{{ slot.card.name }}</span>
68345
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68346
- </button>
68347
- } @else {
68348
- <span class="christianity-slot"></span>
68349
- }
68551
+ <section class="christianity-player-rack christianity-player-rack--opponent">
68552
+ <div class="christianity-offerings-zone">
68553
+ @for (offering of opponent().offerings; track offering.instanceId) {
68554
+ <button
68555
+ type="button"
68556
+ class="christianity-card-mini christianity-card-mini--offering"
68557
+ [class.is-exhausted]="!offering.ready"
68558
+ (click)="inspectOffering(offering)"
68559
+ >
68560
+ <span>{{ t('christianityOfferingCard') }}</span>
68561
+ <strong>+{{ offering.value }}</strong>
68562
+ </button>
68350
68563
  }
68351
68564
  </div>
68565
+ <button type="button" class="christianity-leader-card" [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
68566
+ <span>{{ opponent().leaderName }}</span>
68567
+ <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
68568
+ </button>
68569
+ <div class="christianity-player-badge">
68570
+ <span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
68571
+ <strong>{{ opponent().displayName }}</strong>
68572
+ </div>
68573
+ </section>
68574
+
68575
+ <section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
68576
+ @for (slot of battleSlots('P2'); track slot.trackId) {
68577
+ @if (slot.card) {
68578
+ <button
68579
+ type="button"
68580
+ class="christianity-card-preview-card christianity-card-preview-card--battle"
68581
+ [class.is-target]="selectedAttacker()"
68582
+ (click)="handleOpponentCharacter(slot.card)"
68583
+ >
68584
+ <span>{{ slot.card.name }}</span>
68585
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68586
+ </button>
68587
+ } @else {
68588
+ <span class="christianity-slot"></span>
68589
+ }
68590
+ }
68352
68591
  </section>
68353
68592
 
68354
68593
  <section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
68355
- <button type="button" class="christianity-pile" (click)="showHistory.set(!showHistory())">
68594
+ <button type="button" class="christianity-zone-pile christianity-zone-pile--history" (click)="showHistory.set(true)">
68595
+ <i aria-hidden="true"></i>
68596
+ <i aria-hidden="true"></i>
68597
+ <i aria-hidden="true"></i>
68356
68598
  <span>{{ t('christianityHistory') }}</span>
68357
68599
  <strong>{{ game().historyZone.length }}</strong>
68358
68600
  </button>
68359
- <div class="christianity-deck" aria-live="polite">
68601
+ <button type="button" class="christianity-zone-pile christianity-zone-pile--deck" aria-live="polite" (click)="inspectDeck()">
68602
+ <i aria-hidden="true"></i>
68603
+ <i aria-hidden="true"></i>
68604
+ <i aria-hidden="true"></i>
68360
68605
  <span>{{ t('christianityDeck') }}</span>
68361
- <strong>{{ game().sharedDeckCount }}</strong>
68362
- </div>
68363
- <div class="christianity-place">
68606
+ <strong>{{ game().sharedDeck.length }}</strong>
68607
+ </button>
68608
+ <div class="christianity-zone-card">
68364
68609
  <span>{{ t('christianityPlace') }}</span>
68365
68610
  <strong>{{ t('christianityEmpty') }}</strong>
68366
68611
  </div>
68367
68612
  </section>
68368
68613
 
68369
- <section class="christianity-player">
68370
- <div class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
68371
- @for (slot of battleSlots('P1'); track slot.trackId) {
68372
- @if (slot.card) {
68373
- <button
68374
- type="button"
68375
- class="christianity-card christianity-card--battle"
68376
- [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
68377
- [class.is-exhausted]="!slot.card.canAttack"
68378
- (click)="selectAttacker(slot.card)"
68379
- >
68380
- <span>{{ slot.card.name }}</span>
68381
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68382
- </button>
68383
- } @else {
68384
- <span class="christianity-slot"></span>
68385
- }
68614
+ <section class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
68615
+ @for (slot of battleSlots('P1'); track slot.trackId) {
68616
+ @if (slot.card) {
68617
+ <button
68618
+ type="button"
68619
+ class="christianity-card-preview-card christianity-card-preview-card--battle"
68620
+ [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
68621
+ [class.is-exhausted]="!slot.card.canAttack"
68622
+ (click)="selectAttacker(slot.card)"
68623
+ >
68624
+ <span>{{ slot.card.name }}</span>
68625
+ <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
68626
+ </button>
68627
+ } @else {
68628
+ <span class="christianity-slot"></span>
68629
+ }
68630
+ }
68631
+ </section>
68632
+
68633
+ <section class="christianity-player-rack">
68634
+ <div class="christianity-offerings-zone">
68635
+ @for (offering of player().offerings; track offering.instanceId) {
68636
+ <button
68637
+ type="button"
68638
+ class="christianity-card-mini christianity-card-mini--offering"
68639
+ [class.is-exhausted]="!offering.ready"
68640
+ (click)="inspectOffering(offering)"
68641
+ >
68642
+ <span>{{ t('christianityOfferingCard') }}</span>
68643
+ <strong>+{{ offering.value }}</strong>
68644
+ </button>
68386
68645
  }
68387
68646
  </div>
68388
- <div class="christianity-player__summary">
68389
- <div class="christianity-offerings">
68390
- <span>{{ t('christianityOfferings') }}</span>
68391
- <strong>{{ readyOfferings(player()) }}/{{ player().offerings.length }}</strong>
68392
- <div class="christianity-offering-cards" aria-hidden="true">
68393
- @for (offering of player().offerings; track offering.instanceId) {
68394
- <i [class.is-used]="!offering.ready"></i>
68395
- }
68396
- </div>
68647
+ <button type="button" class="christianity-leader-card" (click)="inspectLeader('P1')">
68648
+ <span>{{ player().leaderName }}</span>
68649
+ <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
68650
+ </button>
68651
+ <div class="christianity-player-command">
68652
+ <div class="christianity-player-badge">
68653
+ <span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
68654
+ <strong>{{ player().displayName }}</strong>
68397
68655
  </div>
68398
- <button type="button" class="christianity-leader christianity-leader--target" (click)="attackLeader()">
68399
- <span>{{ player().leaderName }}</span>
68400
- <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
68401
- </button>
68402
68656
  <button type="button" class="christianity-end-turn" (click)="endTurn()">
68403
68657
  {{ t('christianityEndTurn') }}
68404
68658
  </button>
@@ -68406,14 +68660,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
68406
68660
  </section>
68407
68661
  </section>
68408
68662
 
68409
- <section class="christianity-hand" [attr.aria-label]="t('christianityYourHand')">
68663
+ <section class="christianity-hand-fan" [attr.aria-label]="t('christianityYourHand')">
68410
68664
  @for (cardId of player().hand ?? []; track cardId + $index) {
68411
68665
  @let card = cardDefinition(cardId);
68412
68666
  <button
68413
68667
  type="button"
68414
- class="christianity-card christianity-card--hand"
68668
+ class="christianity-card-preview-card christianity-card-preview-card--hand"
68415
68669
  [class.is-selected]="selectedHandCard() === cardId"
68416
68670
  [class.is-disabled]="!canPlay(card)"
68671
+ [style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
68417
68672
  (click)="selectHandCard(cardId)"
68418
68673
  >
68419
68674
  <small>
@@ -68435,6 +68690,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
68435
68690
  }
68436
68691
  </section>
68437
68692
 
68693
+ @if (selectedPreview()) {
68694
+ <button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
68695
+ <aside class="christianity-floating-card" aria-live="polite">
68696
+ <small>{{ selectedPreview()?.eyebrow }}</small>
68697
+ <strong>{{ selectedPreview()?.title }}</strong>
68698
+ <span>{{ selectedPreview()?.meta }}</span>
68699
+ <p>{{ selectedPreview()?.body }}</p>
68700
+ </aside>
68701
+ }
68702
+
68438
68703
  <section class="christianity-actions" aria-live="polite">
68439
68704
  <p>{{ statusText() }}</p>
68440
68705
  <div>
@@ -68448,17 +68713,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
68448
68713
  </section>
68449
68714
 
68450
68715
  @if (showHistory()) {
68451
- <section class="christianity-history">
68452
- <h2>{{ t('christianityHistory') }}</h2>
68716
+ <button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
68717
+ <section class="christianity-history-drawer">
68718
+ <header>
68719
+ <h2>{{ t('christianityHistory') }}</h2>
68720
+ <span>{{ game().historyZone.length }}</span>
68721
+ </header>
68453
68722
  @if (game().historyZone.length) {
68454
- <p>{{ historyNames() }}</p>
68723
+ <div class="christianity-history-grid">
68724
+ @for (cardId of game().historyZone; track cardId + $index) {
68725
+ @let card = cardDefinition(cardId);
68726
+ <button type="button" class="christianity-card-preview-card" (click)="inspectHistoryCard(cardId)">
68727
+ <small>{{ card.type === 'offering' ? t('christianityOfferingCard') : t('christianityCharacterCard') }}</small>
68728
+ <span>{{ card.name }}</span>
68729
+ <strong>
68730
+ @if (card.type === 'offering') {
68731
+ +{{ card.life }}
68732
+ } @else {
68733
+ {{ card.attack }} / {{ card.life }}
68734
+ }
68735
+ </strong>
68736
+ </button>
68737
+ }
68738
+ </div>
68455
68739
  } @else {
68456
68740
  <p>{{ t('christianityHistoryEmpty') }}</p>
68457
68741
  }
68458
68742
  </section>
68459
68743
  }
68460
68744
  </main>
68461
- `, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.875rem;padding:.75rem .25rem;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:.55rem .35rem;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:.55rem .4rem;border-radius:.75rem;background:#ffffffc2}.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:#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-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{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:.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-battle-zone{grid-template-columns:repeat(5,minmax(3.8rem,1fr));overflow-x:auto}}\n"] }]
68745
+ `, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.875rem;padding:.75rem .25rem;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:.55rem .35rem;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:.55rem .4rem;border-radius:.75rem;background:#ffffffc2}.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:#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-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{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}.christianity-hand-fan{position:relative;display:flex;justify-content:center;min-height:7.4rem;padding:0 .25rem;isolation:isolate}.christianity-hand-fan--opponent{min-height:5.2rem}.christianity-opponent-hand-area{display:grid;gap:.25rem;min-height:6.7rem;align-items:start;padding-bottom:.35rem}.christianity-card-preview-card,.christianity-card-mini,.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;align-content:space-between;width:clamp(4.9rem,17vw,7.1rem);min-height:clamp(6.6rem,22vw,8.8rem);margin-inline:-.42rem;padding:.48rem;text-align:left;transform-origin:50% 115%;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;box-shadow:0 .5rem 1.25rem #2430441a}.christianity-card-preview-card--hand:hover,.christianity-card-preview-card--hand.is-selected{z-index:3;border-color:#2563eb;box-shadow:0 1rem 2rem #2563eb2e}.christianity-card-preview-card--back{min-height:4.8rem;background:linear-gradient(135deg,#102a431f,#102a4305),repeating-linear-gradient(45deg,#e2e8f0 0 .35rem,#f8fafc .35rem .7rem)}.christianity-card-preview-card--battle{width:100%;min-height:5.7rem;margin-inline:0}.christianity-card-preview-card span,.christianity-card-mini span,.christianity-leader-card span,.christianity-zone-card span,.christianity-zone-pile span{font-weight:700}.christianity-card-preview-card strong,.christianity-card-mini strong,.christianity-leader-card strong,.christianity-zone-card strong,.christianity-zone-pile strong{justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-player-rack{display:grid;grid-template-columns:minmax(4.2rem,1fr) minmax(5rem,6.5rem) minmax(4.2rem,1fr);gap:.55rem;align-items:end;justify-items:center}.christianity-player-rack--opponent{align-items:start}.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-end;width:100%}.christianity-card-mini,.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-mini{width:3.5rem}.christianity-leader-card{width:min(100%,6.5rem);min-height:5.8rem}.christianity-battle-zone{grid-template-columns:repeat(4,minmax(4rem,1fr))}.christianity-shared-zone{display:grid;grid-template-columns:repeat(3,minmax(4.3rem,1fr));align-items:stretch}.christianity-zone-pile{position:relative;isolation:isolate;overflow:hidden;min-height:5.6rem;box-shadow:inset 0 0 0 999px #ffffff1f}.christianity-zone-pile i{position:absolute;inset:.62rem .72rem auto auto;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:linear-gradient(135deg,#102a4329,#102a4308),repeating-linear-gradient(45deg,#dbeafe 0 .33rem,#fff .33rem .66rem);transform:translate(-.54rem,.24rem) rotate(2deg)}.christianity-floating-card{position:fixed;top:50%;left:50%;z-index:21;display:grid;gap:.45rem;width:min(20rem,calc(100vw - 2rem));min-height:min(27rem,calc(100vh - 5rem));padding:1rem;border:1px solid rgba(36,48,68,.18);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,rgba(37,99,235,.12),transparent 45%);box-shadow:0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c;transform:translate(-50%,-50%) perspective(48rem) rotateX(5deg) rotateY(-5deg)}.christianity-preview-backdrop,.christianity-history-backdrop{position:fixed;inset:0;z-index:20;border:0;border-radius:0;background:#0f172a75}.christianity-floating-card small,.christianity-floating-card span{color:#1f2933a3}.christianity-floating-card strong{font-size:clamp(1.35rem,8vw,2rem);line-height:1.05}.christianity-floating-card p{margin:0;align-self:end;font-size:.95rem;line-height:1.35}.christianity-history-backdrop{z-index:22}.christianity-history-drawer{position:fixed;right:max(.5rem,env(safe-area-inset-right));bottom:max(.5rem,env(safe-area-inset-bottom));left:max(.5rem,env(safe-area-inset-left));z-index:23;display:grid;gap:.75rem;max-height:min(27rem,calc(100vh - 4rem));padding:.8rem;border:1px solid rgba(36,48,68,.16);border-radius:.75rem;background:#fffffffa;box-shadow:0 1.5rem 4rem #102a4347}.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-history-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.4rem,1fr));gap:.55rem;overflow-y:auto;padding:.1rem .1rem .25rem}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:.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-battle-zone{grid-template-columns:repeat(4,minmax(3.35rem,1fr));overflow-x:auto}.christianity-hand-fan{min-height:6.8rem;overflow-x:clip}.christianity-player-rack{grid-template-columns:minmax(3.6rem,1fr) minmax(4.8rem,5.6rem) minmax(3.6rem,1fr)}.christianity-shared-zone{grid-template-columns:repeat(3,minmax(3.7rem,1fr))}.christianity-card-preview-card{width:clamp(4.2rem,20vw,5.7rem);min-height:clamp(5.8rem,26vw,7.4rem)}.christianity-opponent-hand-area{min-height:6.2rem}}\n"] }]
68462
68746
  }], ctorParameters: () => [] });
68463
68747
 
68464
68748
  addIcons({ refreshOutline, sparklesOutline, trophyOutline });