/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan, Hikari */ import { Component, Input, Output, EventEmitter, OnInit, signal } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { Game, GameStatus, CreateGameDto, UpdateGameDto, Link } from '@library/shared-types'; @Component({ selector: 'app-game-form', standalone: true, imports: [CommonModule, FormsModule], template: `
`, styles: [` .game-form { background: white; padding: 1.5rem; border-radius: 8px; border: 1px solid #e5e7eb; margin-bottom: 2rem; } .game-form h3 { margin: 0 0 1.5rem 0; color: #1f2937; font-size: 1.5rem; } .form-group { margin-bottom: 1rem; } .form-group label { display: block; margin-bottom: 0.5rem; font-weight: 600; color: #374151; } .form-group input[type="text"], .form-group input[type="number"], .form-group input[type="date"], .form-group input[type="url"], .form-group select, .form-group textarea { width: 100%; padding: 0.625rem; border: 1px solid #d1d5db; border-radius: 4px; font-size: 1rem; font-family: inherit; } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: #ff6b6b; } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .tags-input-container { display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.625rem; border: 1px solid #d1d5db; border-radius: 4px; min-height: 44px; } .tags-input-container input { flex: 1; border: none; outline: none; font-size: 1rem; min-width: 150px; } .tag { background: #ff6b6b; color: white; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.875rem; display: flex; align-items: center; gap: 0.5rem; } .tag-remove { background: none; border: none; color: white; cursor: pointer; font-size: 1.25rem; line-height: 1; padding: 0; } .links-list { margin-bottom: 0.75rem; } .link-item { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem; background: #f3f4f6; border-radius: 4px; margin-bottom: 0.5rem; } .link-add-form { display: grid; grid-template-columns: 1fr 2fr auto; gap: 0.5rem; } .image-preview { margin-top: 0.75rem; display: flex; align-items: center; gap: 1rem; } .image-preview img { max-width: 200px; max-height: 200px; border-radius: 4px; border: 1px solid #e5e7eb; } .error-text { color: #dc2626; font-size: 0.875rem; display: block; margin-top: 0.5rem; } .form-actions { display: flex; gap: 0.75rem; margin-top: 1.5rem; } .btn { padding: 0.625rem 1.25rem; border: none; border-radius: 4px; cursor: pointer; font-size: 1rem; transition: all 0.3s; font-weight: 500; } .btn:hover { opacity: 0.9; } .btn-primary { background: #ff6b6b; color: white; } .btn-secondary { background: #6b7280; color: white; } .btn-danger { background: #ef4444; color: white; } .btn-sm { padding: 0.375rem 0.75rem; font-size: 0.875rem; } `] }) export class GameFormComponent implements OnInit { @Input() mode: 'add' | 'edit' = 'add'; @Input() game?: Game; @Input() initialData?: Partial