valtech-components 4.0.540 → 4.0.542

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 (66) hide show
  1. package/esm2022/lib/components/molecules/picker-v2/picker-v2.component.mjs +8 -4
  2. package/esm2022/lib/components/organisms/bottom-nav/side-nav-adapter.mjs +11 -0
  3. package/esm2022/lib/components/organisms/mini-games/bubble-blitz-game.component.mjs +3 -3
  4. package/esm2022/lib/components/organisms/mini-games/chessimals-challenge-progress.service.mjs +45 -6
  5. package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +18 -1
  6. package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +804 -801
  7. package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +3 -3
  8. package/esm2022/lib/components/organisms/mini-games/memory-game.component.mjs +3 -3
  9. package/esm2022/lib/components/organisms/mini-games/mini-games-menu.component.mjs +3 -3
  10. package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +97 -9
  11. package/esm2022/lib/components/organisms/mini-games/retro-audio.service.mjs +27 -1
  12. package/esm2022/lib/components/organisms/mini-games/simon-game.component.mjs +3 -3
  13. package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
  14. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  15. package/esm2022/lib/components/organisms/toolbar/types.mjs +1 -1
  16. package/esm2022/lib/services/forms/form-schema-builder.service.mjs +84 -1
  17. package/esm2022/lib/services/forms/types.mjs +8 -2
  18. package/esm2022/lib/version.mjs +2 -2
  19. package/esm2022/mini-games/public-api.mjs +2 -8
  20. package/esm2022/public-api.mjs +4 -1
  21. package/fesm2022/valtech-components-mini-games.mjs +1 -7
  22. package/fesm2022/valtech-components-mini-games.mjs.map +1 -1
  23. package/fesm2022/valtech-components.mjs +1107 -829
  24. package/fesm2022/valtech-components.mjs.map +1 -1
  25. package/lib/components/molecules/picker-v2/picker-v2.component.d.ts +2 -2
  26. package/lib/components/organisms/bottom-nav/side-nav-adapter.d.ts +7 -0
  27. package/lib/components/organisms/mini-games/chessimals-challenge-progress.service.d.ts +4 -0
  28. package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +32 -1
  29. package/lib/components/organisms/mini-games/retro-audio.service.d.ts +2 -0
  30. package/lib/components/organisms/mini-games/types.d.ts +2 -0
  31. package/lib/components/organisms/toolbar/types.d.ts +2 -0
  32. package/lib/services/forms/form-schema-builder.service.d.ts +15 -1
  33. package/lib/services/forms/types.d.ts +4 -0
  34. package/lib/version.d.ts +1 -1
  35. package/package.json +1 -1
  36. package/public-api.d.ts +2 -0
  37. package/src/lib/assets/games/README.md +149 -0
  38. package/src/lib/assets/games/chessimals/brand/README.md +23 -0
  39. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon-192.png +0 -0
  40. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon-512.png +0 -0
  41. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon-capacitor.png +0 -0
  42. package/src/lib/assets/games/chessimals/brand/chessimals-app-icon.png +0 -0
  43. package/src/lib/assets/games/chessimals/brand/chessimals-emblem.png +0 -0
  44. package/src/lib/assets/games/chessimals/brand/chessimals-favicon.png +0 -0
  45. package/src/lib/assets/games/chessimals/brand/chessimals-wordmark.png +0 -0
  46. package/src/lib/assets/games/chessimals/challenge-avatars/ambusher.png +0 -0
  47. package/src/lib/assets/games/chessimals/challenge-avatars/endgame.png +0 -0
  48. package/src/lib/assets/games/chessimals/challenge-avatars/explorer.png +0 -0
  49. package/src/lib/assets/games/chessimals/challenge-avatars/guardian.png +0 -0
  50. package/src/lib/assets/games/chessimals/challenge-avatars/hunter.png +0 -0
  51. package/src/lib/assets/games/chessimals/challenge-avatars/impulsive.png +0 -0
  52. package/src/lib/assets/games/chessimals/challenge-avatars/jumper.png +0 -0
  53. package/src/lib/assets/games/chessimals/challenge-avatars/locksmith.png +0 -0
  54. package/src/lib/assets/games/chessimals/challenge-avatars/matriarch.png +0 -0
  55. package/src/lib/assets/games/chessimals/challenge-avatars/oracle.png +0 -0
  56. package/src/lib/assets/games/chessimals/challenge-avatars/predator.png +0 -0
  57. package/src/lib/assets/games/chessimals/challenge-avatars/runner.png +0 -0
  58. package/src/lib/assets/games/chessimals/challenge-avatars/sentinel.png +0 -0
  59. package/src/lib/assets/games/chessimals/challenge-avatars/sprinter.png +0 -0
  60. package/src/lib/assets/games/chessimals/challenge-avatars/storm.png +0 -0
  61. package/src/lib/assets/games/chessimals/challenge-avatars/strategist.png +0 -0
  62. package/src/lib/assets/games/chessimals/powers/README.md +12 -0
  63. package/src/lib/assets/games/chessimals/powers/bull-power.png +0 -0
  64. package/src/lib/assets/games/chessimals/powers/eagle-power.png +0 -0
  65. package/src/lib/assets/games/chessimals/powers/kangaroo-power.png +0 -0
  66. package/src/lib/assets/games/chessimals/powers/lion-power.png +0 -0
@@ -24,8 +24,8 @@ export declare class PickerV2Component {
24
24
  selectionChange: EventEmitter<string>;
25
25
  private host;
26
26
  readonly open: import("@angular/core").WritableSignal<boolean>;
27
- readonly selectedOption: import("@angular/core").Signal<PickerV2Option>;
28
- readonly displayText: import("@angular/core").Signal<string>;
27
+ selectedOption(): PickerV2Option | undefined;
28
+ displayText(): string;
29
29
  toggle(): void;
30
30
  select(option: PickerV2Option): void;
31
31
  onDocumentClick(event: MouseEvent): void;
@@ -0,0 +1,7 @@
1
+ import { SideNavItem } from '../../templates/page-wrapper/types';
2
+ import { BottomNavMetadata } from './types';
3
+ export interface SideNavFromBottomNavOptions {
4
+ translate?: (key: string, namespace?: string) => string;
5
+ exact?: boolean;
6
+ }
7
+ export declare function buildSideNavItemsFromBottomNav(config: BottomNavMetadata, options?: SideNavFromBottomNavOptions): SideNavItem[];
@@ -32,7 +32,11 @@ export declare class ChessimalsChallengeProgressService {
32
32
  private runsPath;
33
33
  private readLocalActiveRun;
34
34
  private writeLocalActiveRun;
35
+ private clearLocalActiveRun;
35
36
  private localActiveRunKey;
37
+ private newestActiveRun;
38
+ private runProgressScore;
39
+ private runTime;
36
40
  private withoutUndefined;
37
41
  static ɵfac: i0.ɵɵFactoryDeclaration<ChessimalsChallengeProgressService, never>;
38
42
  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.540";
117
+ readonly valtechComponentsVersion = "4.0.542";
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>;
@@ -135,9 +135,12 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
135
135
  readonly turnSecondsRemaining: import("@angular/core").WritableSignal<number>;
136
136
  readonly selectedPieceId: import("@angular/core").WritableSignal<string>;
137
137
  readonly selectedAnimal: import("@angular/core").WritableSignal<ChessimalsAnimalType>;
138
+ readonly isPlayOptionsModalOpen: import("@angular/core").WritableSignal<boolean>;
138
139
  readonly isRulesModalOpen: import("@angular/core").WritableSignal<boolean>;
139
140
  readonly isSettingsModalOpen: import("@angular/core").WritableSignal<boolean>;
140
141
  readonly isAboutModalOpen: import("@angular/core").WritableSignal<boolean>;
142
+ private pendingSoloGameStart;
143
+ private pendingAboutFeedbackNavigation;
141
144
  readonly tutorialMode: import("@angular/core").WritableSignal<boolean>;
142
145
  readonly isBoardOrienting: import("@angular/core").WritableSignal<boolean>;
143
146
  readonly movingPiece: import("@angular/core").WritableSignal<ChessimalsMovingPieceView>;
@@ -178,6 +181,7 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
178
181
  readonly selectedBotProfile: import("@angular/core").Signal<ChessimalsBotProfile>;
179
182
  readonly gameBotProfile: import("@angular/core").Signal<ChessimalsBotProfile>;
180
183
  readonly activeChallengeBot: import("@angular/core").Signal<ChessimalsChallengeBot>;
184
+ readonly resumableChallengeRun: import("@angular/core").Signal<ChessimalsChallengeRun>;
181
185
  set onlineGameId(value: string | null | undefined);
182
186
  miniGamesRoute: string;
183
187
  projectionMode: boolean;
@@ -245,6 +249,7 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
245
249
  readonly confirmTitle: import("@angular/core").Signal<string>;
246
250
  readonly confirmBody: import("@angular/core").Signal<string>;
247
251
  readonly confirmActions: import("@angular/core").Signal<ButtonMetadata[]>;
252
+ readonly playOptionsActions: import("@angular/core").Signal<ButtonMetadata[]>;
248
253
  readonly rulesActions: import("@angular/core").Signal<ButtonMetadata[]>;
249
254
  readonly aboutActions: import("@angular/core").Signal<ButtonMetadata[]>;
250
255
  readonly actionHint: import("@angular/core").Signal<string>;
@@ -255,12 +260,17 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
255
260
  private shortUserId;
256
261
  private rangeValueToNumber;
257
262
  startChallenge(): void;
263
+ requestNewChallenge(): void;
258
264
  openChallengeView(): void;
259
265
  backToHome(): void;
266
+ private cancelActiveGameplayFeedback;
260
267
  private createNewChallengeRun;
268
+ private resetChallengeSessionState;
261
269
  resumeChallenge(run?: ChessimalsChallengeRun): void;
262
270
  continueChallenge(): void;
263
271
  private startChallengeRound;
272
+ private enterChallengeRound;
273
+ private isResumableChallengeRun;
264
274
  startGame(): void;
265
275
  private handleChallengeRoundFinished;
266
276
  private abandonChallengeIfNeeded;
@@ -272,6 +282,7 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
272
282
  restartGame(): void;
273
283
  exitTutorial(): void;
274
284
  resetToModeSetup(): void;
285
+ private returnChallengeToMenu;
275
286
  resetToGamesMenu(): void;
276
287
  private resetFinishedLocalGameForNextVisit;
277
288
  requestRestartGame(): void;
@@ -282,6 +293,12 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
282
293
  handleConfirmModalDismissed(): void;
283
294
  confirmPendingAction(token?: string): void;
284
295
  private resignGame;
296
+ openPlayOptionsModal(): void;
297
+ closePlayOptionsModal(): void;
298
+ handlePlayOptionsModalDismissed(): void;
299
+ handlePlayOptionsAction(event: {
300
+ action?: ButtonMetadata;
301
+ }): void;
285
302
  openRulesModal(): void;
286
303
  closeRulesModal(): void;
287
304
  openSettingsModal(): void;
@@ -289,6 +306,10 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
289
306
  openPathView(): void;
290
307
  openAboutModal(): void;
291
308
  closeAboutModal(): void;
309
+ handleAboutModalDismissed(): void;
310
+ handleAboutAction(event: {
311
+ action?: ButtonMetadata;
312
+ }): void;
292
313
  setMusicVolume(value: number | RangeValue): void;
293
314
  setSfxVolume(value: number | RangeValue): void;
294
315
  private tutorialExpectedMove;
@@ -306,6 +327,9 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
306
327
  private isPromotionMove;
307
328
  private animateMove;
308
329
  private applyAnimatedMove;
330
+ private activeGameForRun;
331
+ private persistActiveChallengeGame;
332
+ private cloneChallengeGame;
309
333
  private playPowerUnlockSound;
310
334
  private queueBotTurnIfNeeded;
311
335
  private playBotTurn;
@@ -397,10 +421,14 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
397
421
  botProfileDescription(profile: ChessimalsBotProfile): string;
398
422
  botProfileTendency(profile: ChessimalsBotProfile): string;
399
423
  botProfileAvatar(profileId: ChessimalsBotProfileId): string;
424
+ botProfileAvatarSrc(profileId: ChessimalsBotProfileId): string;
400
425
  challengeBotProfile(bot: ChessimalsChallengeBot): ChessimalsBotProfile | undefined;
401
426
  challengeOpeningBot(): ChessimalsChallengeBot;
402
427
  challengeMenuBot(): ChessimalsChallengeBot;
403
428
  challengeMenuRoundLabel(): string;
429
+ challengeMenuLivesLabel(): string;
430
+ challengeMenuClearedRound(): number;
431
+ private challengeMenuRun;
404
432
  challengeBotName(bot: ChessimalsChallengeBot): string;
405
433
  challengeBotDifficultyLabel(bot: ChessimalsChallengeBot): string;
406
434
  challengeBotStyleLine(bot: ChessimalsChallengeBot): string;
@@ -412,6 +440,7 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
412
440
  showChallengeIntro(): void;
413
441
  dismissChallengeIntro(): void;
414
442
  challengeLiveAvatar(): string;
443
+ challengeLiveAvatarSrc(): string;
415
444
  challengeLiveRivalName(): string;
416
445
  challengeLiveRivalLine(): string;
417
446
  challengeLiveStreakLabel(): string;
@@ -422,10 +451,12 @@ export declare class ChessimalsGameComponent implements OnInit, OnDestroy {
422
451
  challengeOutcomeTitle(): string;
423
452
  challengeOutcomeBody(): string;
424
453
  challengeSummaryAvatar(): string;
454
+ challengeSummaryAvatarSrc(): string;
425
455
  challengeRoundStageLabel(): string;
426
456
  challengeRivalVoiceLabel(): string;
427
457
  challengeRivalVoiceTitle(): string;
428
458
  challengeRivalVoiceBody(): string;
459
+ private challengeVoiceText;
429
460
  challengeNextRivalLabel(): string;
430
461
  challengeContinueLabel(): string;
431
462
  challengeNextRivalHint(): string;
@@ -10,6 +10,7 @@ export declare class RetroAudioService {
10
10
  private pausedMelody?;
11
11
  private suspendTimer?;
12
12
  private readonly activeSamples;
13
+ private readonly activeBufferSources;
13
14
  private sampleMusic?;
14
15
  private sampleMusicConfig?;
15
16
  private sampleMusicSource?;
@@ -91,6 +92,7 @@ export declare class RetroAudioService {
91
92
  private sampleMusicVolume;
92
93
  private sampleVolume;
93
94
  private applyActiveSampleVolumes;
95
+ private stopActiveSamples;
94
96
  private connectSampleMusic;
95
97
  private disconnectSampleMusicGraph;
96
98
  private tone;
@@ -58,6 +58,7 @@ export interface ChessimalsBotProfile {
58
58
  id: ChessimalsBotProfileId;
59
59
  difficulty: ChessimalsBotDifficulty;
60
60
  avatar: string;
61
+ avatarSrc?: string;
61
62
  labelKey: string;
62
63
  descriptionKey: string;
63
64
  }
@@ -107,6 +108,7 @@ export interface ChessimalsChallengeRun {
107
108
  currentStreak: number;
108
109
  botLadder: string[];
109
110
  roundResults: ChessimalsChallengeRoundResult[];
111
+ activeGame?: ChessimalsGameState;
110
112
  startedAt: string;
111
113
  lastEventAt?: string;
112
114
  updatedAt: string;
@@ -10,6 +10,7 @@ import { FontSizeSelectorMetadata } from '../../molecules/font-size-selector/typ
10
10
  * Metadatos para la barra de herramientas.
11
11
  * @property withBack Si muestra botón de retroceso.
12
12
  * @property withMenu (opcional) Si muestra botón de menú.
13
+ * @property menuId (opcional) ID del menú Ionic que abre el botón de menú.
13
14
  * @property backText (opcional) Texto del botón de retroceso.
14
15
  * @property withActions Si muestra acciones.
15
16
  * @property color (opcional) Color de fondo.
@@ -21,6 +22,7 @@ import { FontSizeSelectorMetadata } from '../../molecules/font-size-selector/typ
21
22
  export type ToolbarMetadata = {
22
23
  withBack: boolean;
23
24
  withMenu?: boolean;
25
+ menuId?: string;
24
26
  backText?: string;
25
27
  withActions: boolean;
26
28
  color?: Color;
@@ -1,12 +1,26 @@
1
1
  import { ValidatorFn } from '@angular/forms';
2
2
  import { ComponentState, FormMetadata, InputMetadata, InputType } from '../../components/types';
3
- import { FieldSchemaDef } from './types';
3
+ import { CanonicalFieldAliases, FieldSchemaDef, FormSchemaConfig } from './types';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class FormSchemaBuilderService {
6
6
  private i18n;
7
7
  buildForm(schema: FieldSchemaDef[], i18nNamespace: string, formName: string, submitLabelKey?: string, state?: ComponentState): FormMetadata;
8
8
  protected buildField(def: FieldSchemaDef, i18nNamespace: string, state: ComponentState): InputMetadata;
9
+ createFieldSchema(field: Partial<FieldSchemaDef> & Pick<FieldSchemaDef, 'name' | 'label'>, order: number): FieldSchemaDef;
10
+ createFormSchemaConfig(input: {
11
+ schemaId: string;
12
+ schemaVersion?: string;
13
+ labelEs?: string;
14
+ labelEn?: string;
15
+ fields: FieldSchemaDef[];
16
+ canonicalAliases?: CanonicalFieldAliases;
17
+ }): FormSchemaConfig;
18
+ buildCanonicalMap(fields: FieldSchemaDef[], aliases?: CanonicalFieldAliases): Record<string, string>;
19
+ toToken(value: string): string;
20
+ uniqueFieldName(value: string, existingFields: Array<Pick<FieldSchemaDef, 'name'>>): string;
9
21
  protected parseValidators(def: FieldSchemaDef): ValidatorFn[];
22
+ defaultValidatorsFor(type: string, required: boolean): string[];
23
+ private normalizeOptions;
10
24
  protected parseInputType(typeStr: string): InputType;
11
25
  static ɵfac: i0.ɵɵFactoryDeclaration<FormSchemaBuilderService, never>;
12
26
  static ɵprov: i0.ɵɵInjectableDeclaration<FormSchemaBuilderService>;
@@ -33,3 +33,7 @@ export interface FormSchemaConfig {
33
33
  canonicalMap?: Record<string, string>;
34
34
  fieldSchema: FieldSchemaDef[];
35
35
  }
36
+ export interface CanonicalFieldAliases {
37
+ [canonicalName: string]: string[];
38
+ }
39
+ export declare const DEFAULT_CANONICAL_FIELD_ALIASES: CanonicalFieldAliases;
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.540";
5
+ export declare const VERSION = "4.0.542";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "4.0.540",
3
+ "version": "4.0.542",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -288,6 +288,7 @@ export * from './lib/components/organisms/terminal-404/terminal-404.component';
288
288
  export * from './lib/components/organisms/terminal-404/types';
289
289
  export * from './lib/components/organisms/bottom-nav/bottom-nav.component';
290
290
  export * from './lib/components/organisms/bottom-nav/types';
291
+ export * from './lib/components/organisms/bottom-nav/side-nav-adapter';
291
292
  export * from './lib/components/organisms/avatar-upload/avatar-upload.component';
292
293
  export * from './lib/components/organisms/avatar-upload/types';
293
294
  export * from './lib/components/organisms/profile-view/profile-view.component';
@@ -525,3 +526,4 @@ export { TypingIndicatorComponent } from './lib/components/molecules/typing-indi
525
526
  export { ChatWindowComponent } from './lib/components/organisms/chat-window/chat-window.component';
526
527
  export * from './lib/components/organisms/chat-window/types';
527
528
  export { ThreadPanelComponent } from './lib/components/organisms/thread-panel/thread-panel.component';
529
+ export * from './lib/services/forms';
@@ -0,0 +1,149 @@
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
+ ```
@@ -0,0 +1,23 @@
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.
@@ -0,0 +1,12 @@
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.