valtech-components 4.0.527 → 4.0.529

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.
Files changed (51) hide show
  1. package/esm2022/lib/components/organisms/mini-games/chessimals-challenge-progress.service.mjs +6 -45
  2. package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +1 -18
  3. package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +76 -396
  4. package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +5 -3
  5. package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +178 -37
  6. package/esm2022/lib/components/organisms/mini-games/mini-games-menu.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +11 -65
  8. package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
  9. package/esm2022/lib/version.mjs +2 -2
  10. package/esm2022/mini-games/public-api.mjs +2 -2
  11. package/fesm2022/valtech-components-mini-games.mjs +1 -1
  12. package/fesm2022/valtech-components-mini-games.mjs.map +1 -1
  13. package/fesm2022/valtech-components.mjs +274 -561
  14. package/fesm2022/valtech-components.mjs.map +1 -1
  15. package/lib/components/organisms/mini-games/chessimals-challenge-progress.service.d.ts +0 -4
  16. package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +1 -17
  17. package/lib/components/organisms/mini-games/christianity-card.component.d.ts +1 -1
  18. package/lib/components/organisms/mini-games/christianity-game.component.d.ts +14 -1
  19. package/lib/components/organisms/mini-games/types.d.ts +0 -2
  20. package/lib/version.d.ts +1 -1
  21. package/package.json +1 -1
  22. package/src/lib/assets/games/README.md +0 -149
  23. package/src/lib/assets/games/chessimals/brand/README.md +0 -23
  24. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon-192.png +0 -0
  25. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon-512.png +0 -0
  26. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon-capacitor.png +0 -0
  27. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon.png +0 -0
  28. package/src/lib/assets/games/chessimals/brand/chessimals-emblem.png +0 -0
  29. package/src/lib/assets/games/chessimals/brand/chessimals-favicon.png +0 -0
  30. package/src/lib/assets/games/chessimals/brand/chessimals-wordmark.png +0 -0
  31. package/src/lib/assets/games/chessimals/challenge-avatars/ambusher.png +0 -0
  32. package/src/lib/assets/games/chessimals/challenge-avatars/endgame.png +0 -0
  33. package/src/lib/assets/games/chessimals/challenge-avatars/explorer.png +0 -0
  34. package/src/lib/assets/games/chessimals/challenge-avatars/guardian.png +0 -0
  35. package/src/lib/assets/games/chessimals/challenge-avatars/hunter.png +0 -0
  36. package/src/lib/assets/games/chessimals/challenge-avatars/impulsive.png +0 -0
  37. package/src/lib/assets/games/chessimals/challenge-avatars/jumper.png +0 -0
  38. package/src/lib/assets/games/chessimals/challenge-avatars/locksmith.png +0 -0
  39. package/src/lib/assets/games/chessimals/challenge-avatars/matriarch.png +0 -0
  40. package/src/lib/assets/games/chessimals/challenge-avatars/oracle.png +0 -0
  41. package/src/lib/assets/games/chessimals/challenge-avatars/predator.png +0 -0
  42. package/src/lib/assets/games/chessimals/challenge-avatars/runner.png +0 -0
  43. package/src/lib/assets/games/chessimals/challenge-avatars/sentinel.png +0 -0
  44. package/src/lib/assets/games/chessimals/challenge-avatars/sprinter.png +0 -0
  45. package/src/lib/assets/games/chessimals/challenge-avatars/storm.png +0 -0
  46. package/src/lib/assets/games/chessimals/challenge-avatars/strategist.png +0 -0
  47. package/src/lib/assets/games/chessimals/powers/README.md +0 -12
  48. package/src/lib/assets/games/chessimals/powers/bull-power.png +0 -0
  49. package/src/lib/assets/games/chessimals/powers/eagle-power.png +0 -0
  50. package/src/lib/assets/games/chessimals/powers/kangaroo-power.png +0 -0
  51. package/src/lib/assets/games/chessimals/powers/lion-power.png +0 -0
@@ -32,11 +32,7 @@ export declare class ChessimalsChallengeProgressService {
32
32
  private runsPath;
33
33
  private readLocalActiveRun;
34
34
  private writeLocalActiveRun;
35
- private clearLocalActiveRun;
36
35
  private localActiveRunKey;
37
- private newestActiveRun;
38
- private runProgressScore;
39
- private runTime;
40
36
  private withoutUndefined;
41
37
  static ɵfac: i0.ɵɵFactoryDeclaration<ChessimalsChallengeProgressService, never>;
42
38
  static ɵprov: i0.ɵɵInjectableDeclaration<ChessimalsChallengeProgressService>;
@@ -114,7 +114,7 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
114
114
  readonly botProfiles: ChessimalsBotProfile[];
115
115
  readonly challengeLadder: ChessimalsChallengeBot[];
116
116
  readonly animals: ChessimalsAnimalView[];
117
- readonly valtechComponentsVersion = "4.0.527";
117
+ readonly valtechComponentsVersion = "4.0.529";
118
118
  readonly screen: import("@angular/core").WritableSignal<"home" | "challenge" | "path" | "game">;
119
119
  readonly selectedBoardSize: import("@angular/core").WritableSignal<ChessimalsBoardSize>;
120
120
  readonly selectedLocalMode: import("@angular/core").WritableSignal<ChessimalsLocalMode>;
@@ -178,7 +178,6 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
178
178
  readonly selectedBotProfile: import("@angular/core").Signal<ChessimalsBotProfile>;
179
179
  readonly gameBotProfile: import("@angular/core").Signal<ChessimalsBotProfile>;
180
180
  readonly activeChallengeBot: import("@angular/core").Signal<ChessimalsChallengeBot>;
181
- readonly resumableChallengeRun: import("@angular/core").Signal<ChessimalsChallengeRun>;
182
181
  set onlineGameId(value: string | null | undefined);
183
182
  miniGamesRoute: string;
184
183
  projectionMode: boolean;
@@ -256,16 +255,12 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
256
255
  private shortUserId;
257
256
  private rangeValueToNumber;
258
257
  startChallenge(): void;
259
- requestNewChallenge(): void;
260
258
  openChallengeView(): void;
261
259
  backToHome(): void;
262
260
  private createNewChallengeRun;
263
- private resetChallengeSessionState;
264
261
  resumeChallenge(run?: ChessimalsChallengeRun): void;
265
262
  continueChallenge(): void;
266
263
  private startChallengeRound;
267
- private enterChallengeRound;
268
- private isResumableChallengeRun;
269
264
  startGame(): void;
270
265
  private handleChallengeRoundFinished;
271
266
  private abandonChallengeIfNeeded;
@@ -277,7 +272,6 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
277
272
  restartGame(): void;
278
273
  exitTutorial(): void;
279
274
  resetToModeSetup(): void;
280
- private returnChallengeToMenu;
281
275
  resetToGamesMenu(): void;
282
276
  private resetFinishedLocalGameForNextVisit;
283
277
  requestRestartGame(): void;
@@ -312,9 +306,6 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
312
306
  private isPromotionMove;
313
307
  private animateMove;
314
308
  private applyAnimatedMove;
315
- private activeGameForRun;
316
- private persistActiveChallengeGame;
317
- private cloneChallengeGame;
318
309
  private playPowerUnlockSound;
319
310
  private queueBotTurnIfNeeded;
320
311
  private playBotTurn;
@@ -406,14 +397,10 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
406
397
  botProfileDescription(profile: ChessimalsBotProfile): string;
407
398
  botProfileTendency(profile: ChessimalsBotProfile): string;
408
399
  botProfileAvatar(profileId: ChessimalsBotProfileId): string;
409
- botProfileAvatarSrc(profileId: ChessimalsBotProfileId): string;
410
400
  challengeBotProfile(bot: ChessimalsChallengeBot): ChessimalsBotProfile | undefined;
411
401
  challengeOpeningBot(): ChessimalsChallengeBot;
412
402
  challengeMenuBot(): ChessimalsChallengeBot;
413
403
  challengeMenuRoundLabel(): string;
414
- challengeMenuLivesLabel(): string;
415
- challengeMenuClearedRound(): number;
416
- private challengeMenuRun;
417
404
  challengeBotName(bot: ChessimalsChallengeBot): string;
418
405
  challengeBotDifficultyLabel(bot: ChessimalsChallengeBot): string;
419
406
  challengeBotStyleLine(bot: ChessimalsChallengeBot): string;
@@ -425,7 +412,6 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
425
412
  showChallengeIntro(): void;
426
413
  dismissChallengeIntro(): void;
427
414
  challengeLiveAvatar(): string;
428
- challengeLiveAvatarSrc(): string;
429
415
  challengeLiveRivalName(): string;
430
416
  challengeLiveRivalLine(): string;
431
417
  challengeLiveStreakLabel(): string;
@@ -436,12 +422,10 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
436
422
  challengeOutcomeTitle(): string;
437
423
  challengeOutcomeBody(): string;
438
424
  challengeSummaryAvatar(): string;
439
- challengeSummaryAvatarSrc(): string;
440
425
  challengeRoundStageLabel(): string;
441
426
  challengeRivalVoiceLabel(): string;
442
427
  challengeRivalVoiceTitle(): string;
443
428
  challengeRivalVoiceBody(): string;
444
- private challengeVoiceText;
445
429
  challengeNextRivalLabel(): string;
446
430
  challengeContinueLabel(): string;
447
431
  challengeNextRivalHint(): string;
@@ -1,6 +1,6 @@
1
1
  import * as i0 from "@angular/core";
2
2
  export type ChristianityCardRenderType = 'leader' | 'character' | 'offering' | 'wisdom' | 'action' | 'tool' | 'place' | 'event';
3
- export type ChristianityCardRenderVariant = 'full' | 'baby' | 'table' | 'hand' | 'list' | 'back';
3
+ export type ChristianityCardRenderVariant = 'full' | 'baby' | 'table' | 'hand' | 'list' | 'back' | 'board';
4
4
  export interface ChristianityCardRenderModel {
5
5
  id: string;
6
6
  name: string;
@@ -10,7 +10,7 @@ interface ChristianityCardPreview {
10
10
  meta: string;
11
11
  body: string;
12
12
  cardId?: string;
13
- source?: 'hand' | 'board' | 'pile' | 'history' | 'offerings' | 'gallery';
13
+ source?: 'hand' | 'board' | 'pile' | 'history' | 'offerings' | 'gallery' | 'leader-choice';
14
14
  seat?: ChristianitySeat;
15
15
  offeringInstanceId?: string;
16
16
  }
@@ -83,10 +83,13 @@ export declare class ChristianityGameComponent {
83
83
  private combatResolutionTimer;
84
84
  private combatClearTimer;
85
85
  private combatTrailClearTimer;
86
+ private leaderChoiceTimer;
86
87
  protected readonly game: import("@angular/core").WritableSignal<ChristianityGameState>;
87
88
  protected readonly screen: import("@angular/core").WritableSignal<ChristianityScreen>;
88
89
  protected readonly tutorialPhase: import("@angular/core").WritableSignal<ChristianityTutorialPhase>;
89
90
  protected readonly tutorialSetup: import("@angular/core").WritableSignal<ChristianityTutorialSetup>;
91
+ protected readonly selectedTutorialLeaderId: import("@angular/core").WritableSignal<string>;
92
+ protected readonly leaderChoiceSeconds: import("@angular/core").WritableSignal<number>;
90
93
  protected readonly showOptions: import("@angular/core").WritableSignal<boolean>;
91
94
  protected readonly catalogLoadState: import("@angular/core").WritableSignal<ChristianityCatalogLoadState>;
92
95
  protected readonly selectedHandCard: import("@angular/core").WritableSignal<string>;
@@ -111,6 +114,7 @@ export declare class ChristianityGameComponent {
111
114
  protected readonly catalogLoaded: import("@angular/core").WritableSignal<boolean>;
112
115
  protected readonly gallerySearch: import("@angular/core").WritableSignal<string>;
113
116
  protected readonly galleryType: import("@angular/core").WritableSignal<ChristianityGalleryTypeFilter>;
117
+ protected readonly leaderChoiceTotalSeconds = 15;
114
118
  protected readonly canDropOnBattleSlot: (drag: CdkDrag<string>) => boolean;
115
119
  protected readonly canDropOnOfferings: (drag: CdkDrag<string>) => boolean;
116
120
  protected readonly canDropOnPlace: (drag: CdkDrag<string>) => boolean;
@@ -146,6 +150,9 @@ export declare class ChristianityGameComponent {
146
150
  } | {
147
151
  kind: 'gallery';
148
152
  cardId: string;
153
+ } | {
154
+ kind: 'leader-choice';
155
+ cardId: string;
149
156
  })[]>;
150
157
  protected readonly canNavigatePreview: import("@angular/core").Signal<boolean>;
151
158
  protected readonly previewPositionLabel: import("@angular/core").Signal<string>;
@@ -194,6 +201,7 @@ export declare class ChristianityGameComponent {
194
201
  protected startFeaturedCardTransform(index: number): string;
195
202
  protected cardTypeLabel(card: ChristianityCardDefinition): string;
196
203
  protected definitionToRenderCard(card: ChristianityCardDefinition, overrides?: Partial<ChristianityCardRenderModel>): ChristianityCardRenderModel;
204
+ protected placeBackdropImage(card: ChristianityCardDefinition): string;
197
205
  protected hiddenCardRenderCard(): ChristianityCardRenderModel;
198
206
  private defaultCardBody;
199
207
  protected characterRenderCard(card: ChristianityCharacterInstance): ChristianityCardRenderModel;
@@ -275,10 +283,15 @@ export declare class ChristianityGameComponent {
275
283
  protected startTutorial(): void;
276
284
  protected continueAfterCoin(): void;
277
285
  protected chooseTutorialLeader(leaderId: string): void;
286
+ protected selectTutorialLeader(leaderId: string): void;
287
+ protected confirmTutorialLeader(): void;
288
+ protected inspectLeaderChoice(leaderId: string): void;
278
289
  protected toggleOptions(): void;
279
290
  protected restartTutorial(): void;
280
291
  protected resignTutorial(): void;
281
292
  protected returnToChristianityHome(): void;
293
+ private startLeaderChoiceTimer;
294
+ private clearLeaderChoiceTimer;
282
295
  private createTutorialSetup;
283
296
  private chooseRivalTutorialLeader;
284
297
  private startTutorialMatch;
@@ -58,7 +58,6 @@ export interface ChessimalsBotProfile {
58
58
  id: ChessimalsBotProfileId;
59
59
  difficulty: ChessimalsBotDifficulty;
60
60
  avatar: string;
61
- avatarSrc?: string;
62
61
  labelKey: string;
63
62
  descriptionKey: string;
64
63
  }
@@ -108,7 +107,6 @@ export interface ChessimalsChallengeRun {
108
107
  currentStreak: number;
109
108
  botLadder: string[];
110
109
  roundResults: ChessimalsChallengeRoundResult[];
111
- activeGame?: ChessimalsGameState;
112
110
  startedAt: string;
113
111
  lastEventAt?: string;
114
112
  updatedAt: string;
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "4.0.527";
5
+ export declare const VERSION = "4.0.529";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "4.0.527",
3
+ "version": "4.0.529",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
@@ -1,149 +0,0 @@
1
- # Game Art Assets
2
-
3
- Guia breve para generar, limpiar y guardar arte raster para mini juegos.
4
-
5
- ## Cuando usar este flujo
6
-
7
- Usar `image_gen` para assets visuales de juego que deban sentirse hechos a medida:
8
-
9
- - avatares de rivales o jugadores;
10
- - cartas, fichas, piezas, power-ups o insignias;
11
- - fondos, escenas, tableros decorativos o banners internos;
12
- - sprites o sprite sheets simples.
13
-
14
- No usar este flujo para iconos que ya pertenezcan al sistema visual, SVGs deterministas, diagramas simples o UI que pueda resolverse mejor con CSS/HTML.
15
-
16
- ## Flujo recomendado
17
-
18
- 1. Generar el asset con `image_gen`.
19
- 2. Si se necesita transparencia, pedir fondo chroma plano.
20
- 3. Copiar el resultado desde `$CODEX_HOME/generated_images/...` al workspace.
21
- 4. Remover chroma localmente.
22
- 5. Recortar, centrar y normalizar tamanos.
23
- 6. Revisar sobre fondo claro y oscuro.
24
- 7. Guardar solo los assets finales usados por la app.
25
- 8. Conectar el asset con fallback textual o emoji si aplica.
26
-
27
- ## Prompt base para transparencia
28
-
29
- ```text
30
- Create the requested game asset on a perfectly flat solid #00ff00 chroma-key background for background removal.
31
- The background must be one uniform color with no shadows, gradients, texture, reflections, floor plane, or lighting variation.
32
- Keep the subject fully separated from the background with crisp edges and generous padding.
33
- Do not use #00ff00 anywhere in the subject.
34
- No cast shadow, no contact shadow, no reflection, no watermark, and no text unless explicitly requested.
35
- ```
36
-
37
- Para sujetos verdes, usar otro chroma improbable, por ejemplo `#ff00ff`.
38
-
39
- ## Remover chroma
40
-
41
- Preferir el helper instalado por Codex:
42
-
43
- ```bash
44
- python "${CODEX_HOME:-$HOME/.codex}/skills/.system/imagegen/scripts/remove_chroma_key.py" \
45
- --input <source.png> \
46
- --out <final.png> \
47
- --auto-key border \
48
- --soft-matte \
49
- --transparent-threshold 12 \
50
- --opaque-threshold 220 \
51
- --despill
52
- ```
53
-
54
- Si el borde queda con halo, reintentar una vez con:
55
-
56
- ```bash
57
- python "${CODEX_HOME:-$HOME/.codex}/skills/.system/imagegen/scripts/remove_chroma_key.py" \
58
- --input <source.png> \
59
- --out <final.png> \
60
- --auto-key border \
61
- --soft-matte \
62
- --transparent-threshold 12 \
63
- --opaque-threshold 220 \
64
- --edge-contract 1 \
65
- --despill
66
- ```
67
-
68
- ## Sprite sheets
69
-
70
- Para varios personajes, suele funcionar mejor pedir una sprite sheet consistente:
71
-
72
- ```text
73
- Create 8 cute pixel art rival avatar portraits in a single 4x2 sprite sheet.
74
- Each cell must have the same size, consistent outline thickness, same lighting and generous padding.
75
- No text, no letters, no numbers, no watermark.
76
- ```
77
-
78
- Despues recortar cada celda, remover chroma, centrar en un canvas cuadrado y exportar cada item con nombre semantico:
79
-
80
- ```text
81
- explorer.png
82
- guardian.png
83
- hunter.png
84
- ```
85
-
86
- ## Ubicacion
87
-
88
- Guardar assets finales en:
89
-
90
- ```text
91
- frontend/valtech-components/src/lib/assets/games/<game-id>/
92
- ```
93
-
94
- Ejemplo:
95
-
96
- ```text
97
- frontend/valtech-components/src/lib/assets/games/chessimals/challenge-avatars/explorer.png
98
- ```
99
-
100
- Para marcas oficiales de un juego, usar un subdirectorio `brand`:
101
-
102
- ```text
103
- frontend/valtech-components/src/lib/assets/games/chessimals/brand/chessimals-emblem.png
104
- ```
105
-
106
- No dejar archivos fuente temporales, hojas generadas o variantes descartadas en el repo salvo que sean necesarios para mantenimiento.
107
-
108
- ## Validacion visual
109
-
110
- Antes de conectar el asset:
111
-
112
- - revisar esquinas transparentes;
113
- - revisar que no exista halo del chroma;
114
- - probar sobre fondo claro y oscuro;
115
- - verificar que se lea bien al tamano real de UI;
116
- - comprobar que no se pueda arrastrar desde la interfaz (`draggable="false"` y CSS anti-drag si aplica);
117
- - mantener `alt=""` cuando el asset sea decorativo y ya exista texto visible con el nombre.
118
-
119
- ## Conexion en Angular
120
-
121
- Preferir rutas relativas servidas como assets:
122
-
123
- ```ts
124
- avatarSrc: 'assets/games/chessimals/challenge-avatars/explorer.png'
125
- ```
126
-
127
- En template, mantener fallback:
128
-
129
- ```html
130
- @if (avatarSrc; as src) {
131
- <img [src]="src" alt="" draggable="false" />
132
- } @else {
133
- {{ fallbackAvatar }}
134
- }
135
- ```
136
-
137
- ## Caso de referencia
138
-
139
- Chessimals usa este flujo para los avatares pixel art del modo Desafio:
140
-
141
- ```text
142
- frontend/valtech-components/src/lib/assets/games/chessimals/challenge-avatars/
143
- ```
144
-
145
- Documentacion ampliada:
146
-
147
- ```text
148
- docs/frontend/mini-games-art-assets.md
149
- ```
@@ -1,23 +0,0 @@
1
- # Chessimals Brand Assets
2
-
3
- Assets oficiales de marca para Chessimals.
4
-
5
- ## Archivos
6
-
7
- - `chessimals-wordmark.png`: palabra CHESSIMALS transparente. Usar cuando ya exista otro elemento visual fuerte cerca.
8
- - `chessimals-emblem.png`: escudo transparente con las cuatro caritas. Usar como icono, card de selector, about o marca compacta.
9
- - `chessimals-app-icon.png`: icono maestro 1024x1024 para app stores, PWA o superficies grandes.
10
- - `chessimals-app-icon-capacitor.png`: fuente 1024x1024 RGB, opaca y sin borde transparente para generar assets con Capacitor.
11
- - `chessimals-app-icon-512.png`: icono 512x512 para manifiestos PWA.
12
- - `chessimals-app-icon-192.png`: icono 192x192 para manifiestos PWA.
13
- - `chessimals-favicon.png`: favicon PNG 64x64.
14
-
15
- ## Reglas
16
-
17
- - No volver a usar `logo.jpg` o `menu-logo.jpg` para superficies nuevas.
18
- - Componer emblema y wordmark en HTML/CSS cuando se necesite una portada o splash.
19
- - Usar `chessimals-app-icon.png` como fuente maestra si se necesitan nuevos tamanos de icono.
20
- - Usar `chessimals-app-icon-capacitor.png` para `@capacitor/assets`; no usar PNGs transparentes como fuente de iconos nativos.
21
- - Mantener `alt=""` cuando el logo acompane texto visible de Chessimals.
22
- - Usar `draggable="false"` o CSS anti-drag si aparece en superficies interactivas.
23
- - Si se genera una nueva version, preservar estos nombres solo cuando se reemplace oficialmente el asset.
@@ -1,12 +0,0 @@
1
- # Chessimals Power Assets
2
-
3
- Official UI assets for the animal power cards.
4
-
5
- - `eagle-power.png`: diagonal flight power.
6
- - `bull-power.png`: straight charge power.
7
- - `kangaroo-power.png`: jump power.
8
- - `lion-power.png`: wide board power.
9
-
10
- Each asset is a transparent 512x512 PNG generated from the current Chessimals
11
- brand direction. Keep new power assets text-free so labels can remain localized
12
- in the Angular UI.