web-next: selector de personaje coloreado + rediseño unstuck + fixes vote/account-info

- CharacterSelect: componente reutilizable que colorea las opciones por clase
  (class="priest big-font"…) y el <select> con la clase seleccionada. Usado en
  unstuck, revive, gold, transfer, trade-points, servicios de pago y recruit.
  getGameCharacters ahora devuelve classCss.
- /unstuck (+revive): diseño del original (info + NOTA, prompt, opciones coloreadas,
  botón "Desbloqueado"/"Revivido" con refresh).
- /vote-points: seed de los 4 sitios con logos y URLs (sql/seed_votesites.sql);
  botón voted-button para sitios en cooldown; etiqueta "Nota:" separada.
- account-info.png (imagen nueva) y CSS de los paneles de cuenta: se añade
  background-blend-mode: saturation y background-size en #account-settings y
  .account-fieldset para que la imagen salga como el original.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 10:55:43 +00:00
parent b9803adeb9
commit 6ca94c2803
22 changed files with 227 additions and 86 deletions
+3 -5
View File
@@ -2,8 +2,9 @@
import { useState } from 'react'
import { useTranslations } from 'next-intl'
import { CharacterSelect, type CharOption } from '@/components/CharacterSelect'
export function TransferForm({ characters, price }: { characters: string[]; price: number }) {
export function TransferForm({ characters, price }: { characters: CharOption[]; price: number }) {
const t = useTranslations('Services')
const tp = useTranslations('Paid')
const [character, setCharacter] = useState('')
@@ -40,10 +41,7 @@ export function TransferForm({ characters, price }: { characters: string[]; pric
return (
<div className="centered">
<form onSubmit={handleSubmit} acceptCharset="utf-8">
<select value={character} onChange={(e) => setCharacter(e.target.value)} required>
<option value="" disabled>{t('selectCharacter')}</option>
{characters.map((c) => <option key={c} value={c}>{c}</option>)}
</select>
<CharacterSelect characters={characters} value={character} onChange={setCharacter} placeholder={t('selectCharacter')} />
<br />
<input type="text" placeholder={tp('transfer.destination')} value={destination} onChange={(e) => setDestination(e.target.value)} required />
<br />