diff --git a/.beans/nuzlocke-tracker-dpw7--modernize-website-design-and-look-and-feel.md b/.beans/nuzlocke-tracker-dpw7--modernize-website-design-and-look-and-feel.md index 2511457..55150de 100644 --- a/.beans/nuzlocke-tracker-dpw7--modernize-website-design-and-look-and-feel.md +++ b/.beans/nuzlocke-tracker-dpw7--modernize-website-design-and-look-and-feel.md @@ -5,7 +5,7 @@ status: in-progress type: feature priority: normal created_at: 2026-02-17T19:16:39Z -updated_at: 2026-02-17T19:45:49Z +updated_at: 2026-02-17T20:01:32Z --- Overhaul the UI to a dark-first, techy aesthetic with a cohesive brand identity derived from the ANT steel ant logo. @@ -89,10 +89,10 @@ Self-host **Geist** (or Inter/JetBrains Mono pairing): - [x] Redesign home page hero section - [x] Update card/surface styles globally (Layout, PokemonCard, StatCard, GameCard) - [x] Update all page-level backgrounds and containers -- [ ] Update modal styles (EncounterModal, StatusChangeModal, etc.) -- [ ] Update badge/indicator styles (TypeBadge, RuleBadges, EncounterMethodBadge) +- [x] Update modal styles (EncounterModal, StatusChangeModal, etc.) +- [x] Update badge/indicator styles (TypeBadge, RuleBadges, EncounterMethodBadge) - [ ] Add dark/light mode toggle to nav -- [ ] Polish hover states and transitions across all interactive elements +- [x] Polish hover states and transitions across all interactive elements - [ ] Verify mobile layout and touch targets - [ ] Verify accessibility (contrast ratios, focus indicators) diff --git a/frontend/src/components/BossDefeatModal.tsx b/frontend/src/components/BossDefeatModal.tsx index ab07a00..cd2f19d 100644 --- a/frontend/src/components/BossDefeatModal.tsx +++ b/frontend/src/components/BossDefeatModal.tsx @@ -84,7 +84,7 @@ export function BossDefeatModal({ onClick={() => setSelectedVariant(label)} className={`px-2 py-0.5 text-xs font-medium rounded-full transition-colors ${ selectedVariant === label - ? 'bg-blue-600 text-white' + ? 'bg-accent-600 text-white' : 'bg-surface-2 text-text-secondary hover:bg-surface-3' }`} > diff --git a/frontend/src/components/ConditionBadge.tsx b/frontend/src/components/ConditionBadge.tsx index aba3aaf..039ba4c 100644 --- a/frontend/src/components/ConditionBadge.tsx +++ b/frontend/src/components/ConditionBadge.tsx @@ -1,20 +1,8 @@ const CONDITION_CONFIG: Record = { - 'Mega Evolution': { - label: 'Mega', - color: 'bg-fuchsia-100 text-fuchsia-800 dark:bg-fuchsia-900/40 dark:text-fuchsia-300', - }, - Gigantamax: { - label: 'G-Max', - color: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300', - }, - Dynamax: { - label: 'D-Max', - color: 'bg-rose-100 text-rose-800 dark:bg-rose-900/40 dark:text-rose-300', - }, - Terastallize: { - label: 'Tera', - color: 'bg-teal-100 text-teal-800 dark:bg-teal-900/40 dark:text-teal-300', - }, + 'Mega Evolution': { label: 'Mega', color: 'bg-fuchsia-900/40 text-fuchsia-300' }, + Gigantamax: { label: 'G-Max', color: 'bg-red-900/40 text-red-300' }, + Dynamax: { label: 'D-Max', color: 'bg-rose-900/40 text-rose-300' }, + Terastallize: { label: 'Tera', color: 'bg-teal-900/40 text-teal-300' }, } export function ConditionBadge({ diff --git a/frontend/src/components/EggEncounterModal.tsx b/frontend/src/components/EggEncounterModal.tsx index 628ab26..06a8f18 100644 --- a/frontend/src/components/EggEncounterModal.tsx +++ b/frontend/src/components/EggEncounterModal.tsx @@ -77,13 +77,13 @@ export function EggEncounterModal({
-
+

🥚 Log Egg Hatch

- @@ -170,7 +170,7 @@ export function EggEncounterModal({ key={p.id} type="button" onClick={() => setSelectedPokemon(p)} - className="flex flex-col items-center p-2 rounded-lg border border-border-default hover:border-green-400 dark:hover:border-green-600 text-center transition-colors" + className="flex flex-col items-center p-2 rounded-lg border border-border-default hover:border-green-600 text-center transition-colors" > {p.spriteUrl ? ( {p.name} diff --git a/frontend/src/components/EncounterMethodBadge.tsx b/frontend/src/components/EncounterMethodBadge.tsx index be31631..5513d3d 100644 --- a/frontend/src/components/EncounterMethodBadge.tsx +++ b/frontend/src/components/EncounterMethodBadge.tsx @@ -1,56 +1,17 @@ export const METHOD_CONFIG: Record = { - starter: { - label: 'Starter', - color: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-300', - }, - gift: { - label: 'Gift', - color: 'bg-pink-100 text-pink-800 dark:bg-pink-900/40 dark:text-pink-300', - }, - fossil: { - label: 'Fossil', - color: 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300', - }, - trade: { - label: 'Trade', - color: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-300', - }, - walk: { - label: 'Grass', - color: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300', - }, - headbutt: { - label: 'Headbutt', - color: 'bg-lime-100 text-lime-800 dark:bg-lime-900/40 dark:text-lime-300', - }, - surf: { - label: 'Surfing', - color: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', - }, - 'rock-smash': { - label: 'Rock Smash', - color: 'bg-orange-100 text-orange-800 dark:bg-orange-900/40 dark:text-orange-300', - }, - 'old-rod': { - label: 'Old Rod', - color: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/40 dark:text-cyan-300', - }, - 'good-rod': { - label: 'Good Rod', - color: 'bg-sky-100 text-sky-800 dark:bg-sky-900/40 dark:text-sky-300', - }, - 'super-rod': { - label: 'Super Rod', - color: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900/40 dark:text-indigo-300', - }, - horde: { - label: 'Horde', - color: 'bg-rose-100 text-rose-800 dark:bg-rose-900/40 dark:text-rose-300', - }, - sos: { - label: 'SOS', - color: 'bg-violet-100 text-violet-800 dark:bg-violet-900/40 dark:text-violet-300', - }, + starter: { label: 'Starter', color: 'bg-yellow-900/40 text-yellow-300' }, + gift: { label: 'Gift', color: 'bg-pink-900/40 text-pink-300' }, + fossil: { label: 'Fossil', color: 'bg-amber-900/40 text-amber-300' }, + trade: { label: 'Trade', color: 'bg-emerald-900/40 text-emerald-300' }, + walk: { label: 'Grass', color: 'bg-green-900/40 text-green-300' }, + headbutt: { label: 'Headbutt', color: 'bg-lime-900/40 text-lime-300' }, + surf: { label: 'Surfing', color: 'bg-blue-900/40 text-blue-300' }, + 'rock-smash': { label: 'Rock Smash', color: 'bg-orange-900/40 text-orange-300' }, + 'old-rod': { label: 'Old Rod', color: 'bg-cyan-900/40 text-cyan-300' }, + 'good-rod': { label: 'Good Rod', color: 'bg-sky-900/40 text-sky-300' }, + 'super-rod': { label: 'Super Rod', color: 'bg-indigo-900/40 text-indigo-300' }, + horde: { label: 'Horde', color: 'bg-rose-900/40 text-rose-300' }, + sos: { label: 'SOS', color: 'bg-violet-900/40 text-violet-300' }, } /** Display order for encounter method groups */ @@ -78,9 +39,7 @@ export function getMethodLabel(method: string): string { } export function getMethodColor(method: string): string { - return ( - METHOD_CONFIG[method]?.color ?? 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300' - ) + return METHOD_CONFIG[method]?.color ?? 'bg-surface-3 text-text-secondary' } export function EncounterMethodBadge({ diff --git a/frontend/src/components/EncounterModal.tsx b/frontend/src/components/EncounterModal.tsx index f2148cf..f65ba02 100644 --- a/frontend/src/components/EncounterModal.tsx +++ b/frontend/src/components/EncounterModal.tsx @@ -43,14 +43,12 @@ const statusOptions: { { value: 'caught', label: 'Caught', - color: - 'bg-green-100 text-green-800 border-green-300 dark:bg-green-900/40 dark:text-green-300 dark:border-green-700', + color: 'bg-green-900/40 text-green-300 border-green-700', }, { value: 'fainted', label: 'Fainted', - color: - 'bg-red-100 text-red-800 border-red-300 dark:bg-red-900/40 dark:text-red-300 dark:border-red-700', + color: 'bg-red-900/40 text-red-300 border-red-700', }, { value: 'missed', @@ -266,7 +264,7 @@ export function EncounterModal({

{isEditing ? 'Edit Encounter' : 'Log Encounter'}

- @@ -309,7 +307,7 @@ export function EncounterModal({
{loadingPokemon ? (
-
+
) : filteredPokemon && filteredPokemon.length > 0 ? ( <> @@ -329,8 +327,8 @@ export function EncounterModal({ onClick={() => setSelectedCondition(null)} className={`px-2.5 py-1 text-xs font-medium rounded-full border transition-colors ${ selectedCondition === null - ? 'bg-purple-100 border-purple-300 text-purple-800 dark:bg-purple-900/40 dark:border-purple-600 dark:text-purple-300' - : 'border-border-default text-text-tertiary hover:border-purple-300 dark:hover:border-purple-600' + ? 'bg-purple-900/40 border-purple-600 text-purple-300' + : 'border-border-default text-text-tertiary hover:border-purple-600' }`} > All @@ -342,8 +340,8 @@ export function EncounterModal({ onClick={() => setSelectedCondition(cond)} className={`px-2.5 py-1 text-xs font-medium rounded-full border transition-colors capitalize ${ selectedCondition === cond - ? 'bg-purple-100 border-purple-300 text-purple-800 dark:bg-purple-900/40 dark:border-purple-600 dark:text-purple-300' - : 'border-border-default text-text-tertiary hover:border-purple-300 dark:hover:border-purple-600' + ? 'bg-purple-900/40 border-purple-600 text-purple-300' + : 'border-border-default text-text-tertiary hover:border-purple-600' }`} > {cond} @@ -376,7 +374,7 @@ export function EncounterModal({ isDuped ? 'opacity-40 cursor-not-allowed border-border-default' : isSelected - ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/30' + ? 'border-accent-400 bg-accent-900/30' : 'border-border-default hover:border-border-default' }`} > @@ -395,7 +393,7 @@ export function EncounterModal({ {rp.pokemon.name} {isDuped && ( - + {retiredPokemonIds?.has(rp.pokemonId) ? 'retired (HoF)' : 'already caught'} @@ -405,19 +403,19 @@ export function EncounterModal({ )} {!isDuped && displayRate !== null && displayRate !== undefined && ( - + {displayRate}% )} {!isDuped && selectedCondition === null && conditions.length > 0 && ( - + {conditions.join(', ')} )} {!isDuped && ( - + Lv. {rp.minLevel} {rp.maxLevel !== rp.minLevel && `–${rp.maxLevel}`} @@ -454,7 +452,7 @@ export function EncounterModal({
{existing.pokemon.name}
-
+
Caught at Lv. {existing.catchLevel ?? '?'}
@@ -473,7 +471,7 @@ export function EncounterModal({ className={`flex-1 px-3 py-2 rounded-lg border text-sm font-medium transition-colors ${ status === opt.value ? opt.color - : 'border-border-default text-text-tertiary hover:border-gray-300' + : 'border-border-default text-text-tertiary hover:border-border-accent' }`} > {opt.label} @@ -507,7 +505,7 @@ export function EncounterModal({ type="button" onClick={() => regenerate()} disabled={loadingSuggestions} - className="text-xs text-text-link hover:text-blue-700 dark:hover:text-blue-300 disabled:opacity-50 transition-colors" + className="text-xs text-text-link hover:text-accent-300 disabled:opacity-50 transition-colors" > {loadingSuggestions ? 'Loading...' : 'Regenerate'} @@ -520,8 +518,8 @@ export function EncounterModal({ onClick={() => setNickname(name)} className={`px-2.5 py-1 text-xs rounded-full border transition-colors ${ nickname === name - ? 'bg-blue-100 border-blue-300 text-blue-800 dark:bg-blue-900/40 dark:border-blue-600 dark:text-blue-300' - : 'border-border-default text-text-secondary hover:border-blue-300 dark:hover:border-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20' + ? 'bg-accent-900/40 border-accent-600 text-accent-300' + : 'border-border-default text-text-secondary hover:border-accent-600 hover:bg-accent-900/20' }`} > {name} @@ -567,7 +565,7 @@ export function EncounterModal({ htmlFor="faint-level" className="block text-sm font-medium text-text-secondary mb-1" > - Faint Level (mark as dead) + Faint Level (mark as dead) - Cause of Death (optional) + Cause of Death (optional) {isPending ? 'Saving...' : isEditing ? 'Update' : 'Log Encounter'} diff --git a/frontend/src/components/EndRunModal.tsx b/frontend/src/components/EndRunModal.tsx index 192c0b4..686b710 100644 --- a/frontend/src/components/EndRunModal.tsx +++ b/frontend/src/components/EndRunModal.tsx @@ -31,7 +31,7 @@ export function EndRunModal({ onConfirm, onClose, isPending, genlockeContext }: ) @@ -97,7 +97,7 @@ export function HofTeamModal({ alive, onSubmit, onSkip, isPending }: HofTeamModa type="button" disabled={selected.size === 0 || isPending} onClick={() => onSubmit([...selected])} - className="px-4 py-2 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors" + className="px-4 py-2 bg-accent-600 text-white rounded-lg font-medium hover:bg-accent-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors" > {isPending ? 'Saving...' : 'Confirm'} diff --git a/frontend/src/components/RuleBadges.tsx b/frontend/src/components/RuleBadges.tsx index d4d2e52..9290fa3 100644 --- a/frontend/src/components/RuleBadges.tsx +++ b/frontend/src/components/RuleBadges.tsx @@ -20,10 +20,10 @@ export function RuleBadges({ rules }: RuleBadgesProps) { title={def.description} className={`px-2 py-0.5 rounded-full text-xs font-medium ${ def.category === 'core' - ? 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300' + ? 'bg-blue-900/40 text-blue-300' : def.category === 'completion' - ? 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300' - : 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300' + ? 'bg-green-900/40 text-green-300' + : 'bg-amber-900/40 text-amber-300' }`} > {def.name} diff --git a/frontend/src/components/RuleToggle.tsx b/frontend/src/components/RuleToggle.tsx index 32f6738..98f8d52 100644 --- a/frontend/src/components/RuleToggle.tsx +++ b/frontend/src/components/RuleToggle.tsx @@ -17,7 +17,7 @@ export function RuleToggle({ name, description, enabled, onChange }: RuleToggleP {name} diff --git a/frontend/src/components/ShinyBox.tsx b/frontend/src/components/ShinyBox.tsx index 32d56aa..0c3dc5a 100644 --- a/frontend/src/components/ShinyBox.tsx +++ b/frontend/src/components/ShinyBox.tsx @@ -8,8 +8,8 @@ interface ShinyBoxProps { export function ShinyBox({ encounters, onEncounterClick }: ShinyBoxProps) { return ( -
-

+
+

Shiny Box diff --git a/frontend/src/components/ShinyEncounterModal.tsx b/frontend/src/components/ShinyEncounterModal.tsx index 83ac894..97e95b0 100644 --- a/frontend/src/components/ShinyEncounterModal.tsx +++ b/frontend/src/components/ShinyEncounterModal.tsx @@ -93,13 +93,13 @@ export function ShinyEncounterModal({
-
+

Log Shiny Encounter

-
-

+

Shiny catches bypass the one-per-route rule

@@ -169,7 +169,7 @@ export function ShinyEncounterModal({ onClick={() => setSelectedPokemon(rp)} className={`flex flex-col items-center p-2 rounded-lg border text-center transition-colors ${ selectedPokemon?.id === rp.id - ? 'border-yellow-500 bg-yellow-50 dark:bg-yellow-900/30' + ? 'border-yellow-500 bg-yellow-900/30' : 'border-border-default hover:border-border-default' }`} > @@ -190,7 +190,7 @@ export function ShinyEncounterModal({ {SPECIAL_METHODS.includes(rp.encounterMethod) && ( )} - + Lv. {rp.minLevel} {rp.maxLevel !== rp.minLevel && `–${rp.maxLevel}`} diff --git a/frontend/src/components/StatusChangeModal.tsx b/frontend/src/components/StatusChangeModal.tsx index 252f03e..2bddbe3 100644 --- a/frontend/src/components/StatusChangeModal.tsx +++ b/frontend/src/components/StatusChangeModal.tsx @@ -97,7 +97,7 @@ export function StatusChangeModal({

{isDead ? 'Death Details' : 'Pokemon Status'}

- @@ -201,7 +201,7 @@ export function StatusChangeModal({ @@ -220,7 +220,7 @@ export function StatusChangeModal({ type="button" disabled={isPending} onClick={() => handleEvolve(evo.toPokemon.id)} - className="w-full flex items-center gap-3 p-3 rounded-lg border border-border-default hover:bg-blue-50 dark:hover:bg-blue-900/20 hover:border-blue-300 dark:hover:border-blue-600 transition-colors disabled:opacity-50" + className="w-full flex items-center gap-3 p-3 rounded-lg border border-border-default hover:bg-accent-900/20 hover:border-accent-600 transition-colors disabled:opacity-50" > {evo.toPokemon.spriteUrl ? ( Back
-
+
{shedCompanion.toPokemon.spriteUrl ? ( )} -

+

{displayPokemon.name} shed its shell! Would you also like to add{' '} {shedCompanion.toPokemon.name}?

@@ -290,7 +290,7 @@ export function StatusChangeModal({ htmlFor="shed-nickname" className="block text-sm font-medium text-text-secondary mb-1" > - Nickname (optional) + Nickname (optional) setShowFormChange(false)} - className="text-xs text-gray-500 hover:text-text-secondary" + className="text-xs text-text-tertiary hover:text-text-secondary" > Back @@ -344,7 +344,7 @@ export function StatusChangeModal({ type="button" disabled={isPending} onClick={() => handleEvolve(form.id)} - className="w-full flex items-center gap-3 p-3 rounded-lg border border-border-default hover:bg-purple-50 dark:hover:bg-purple-900/20 hover:border-purple-300 dark:hover:border-purple-600 transition-colors disabled:opacity-50" + className="w-full flex items-center gap-3 p-3 rounded-lg border border-border-default hover:bg-purple-900/20 hover:border-purple-600 transition-colors disabled:opacity-50" > {form.spriteUrl ? ( {form.name} @@ -382,7 +382,7 @@ export function StatusChangeModal({ htmlFor="death-level" className="block text-sm font-medium text-text-secondary mb-1" > - Level at Death (optional) + Level at Death (optional) - Cause of Death (optional) + Cause of Death (optional) diff --git a/frontend/src/components/TransferModal.tsx b/frontend/src/components/TransferModal.tsx index 43dcdd9..e276c91 100644 --- a/frontend/src/components/TransferModal.tsx +++ b/frontend/src/components/TransferModal.tsx @@ -48,7 +48,7 @@ export function TransferModal({ hofTeam, onSubmit, onSkip, isPending }: Transfer onClick={() => toggle(enc.id)} className={`flex flex-col items-center p-3 rounded-lg border-2 text-center transition-colors ${ isSelected - ? 'border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20' + ? 'border-indigo-500 bg-indigo-900/20' : 'border-border-default hover:border-border-default' }`} > @@ -67,9 +67,9 @@ export function TransferModal({ hofTeam, onSubmit, onSkip, isPending }: Transfer {enc.nickname || displayPokemon.name} {enc.nickname && ( - {displayPokemon.name} + {displayPokemon.name} )} - {enc.route.name} + {enc.route.name} ) })} diff --git a/frontend/src/components/admin/AdminLayout.tsx b/frontend/src/components/admin/AdminLayout.tsx index 2da7f45..ceeb7f1 100644 --- a/frontend/src/components/admin/AdminLayout.tsx +++ b/frontend/src/components/admin/AdminLayout.tsx @@ -21,9 +21,7 @@ export function AdminLayout() { to={item.to} className={({ isActive }) => `block px-3 py-2 rounded-md text-sm font-medium whitespace-nowrap ${ - isActive - ? 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-200' - : 'hover:bg-surface-2' + isActive ? 'bg-accent-900/40 text-accent-300' : 'hover:bg-surface-2' }` } > diff --git a/frontend/src/components/admin/BossTeamEditor.tsx b/frontend/src/components/admin/BossTeamEditor.tsx index c005a11..c9395db 100644 --- a/frontend/src/components/admin/BossTeamEditor.tsx +++ b/frontend/src/components/admin/BossTeamEditor.tsx @@ -175,7 +175,7 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit e.stopPropagation() removeVariant(i) }} - className="ml-1.5 text-gray-400 hover:text-red-500 cursor-pointer" + className="ml-1.5 text-text-tertiary hover:text-red-500 cursor-pointer" title="Remove variant" > ✕ @@ -187,7 +187,7 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit diff --git a/frontend/src/components/admin/BulkImportModal.tsx b/frontend/src/components/admin/BulkImportModal.tsx index c992522..2336613 100644 --- a/frontend/src/components/admin/BulkImportModal.tsx +++ b/frontend/src/components/admin/BulkImportModal.tsx @@ -77,7 +77,7 @@ export function BulkImportModal({ )} {result && ( -
+

{createdLabel}: {result.created}, {updatedLabel}: {result.updated}

diff --git a/frontend/src/components/admin/FormModal.tsx b/frontend/src/components/admin/FormModal.tsx index 10a5fe1..f9c4120 100644 --- a/frontend/src/components/admin/FormModal.tsx +++ b/frontend/src/components/admin/FormModal.tsx @@ -53,7 +53,7 @@ export function FormModal({ } }} onBlur={() => setConfirmingDelete(false)} - className="px-4 py-2 text-sm font-medium rounded-md text-status-failed border border-red-300 dark:border-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 disabled:opacity-50" + className="px-4 py-2 text-sm font-medium rounded-md text-status-failed border border-red-600 hover:bg-red-900/20 disabled:opacity-50" > {isDeleting ? 'Deleting...' : confirmingDelete ? 'Confirm?' : 'Delete'} diff --git a/frontend/src/components/admin/PokemonFormModal.tsx b/frontend/src/components/admin/PokemonFormModal.tsx index b01e3e1..2394978 100644 --- a/frontend/src/components/admin/PokemonFormModal.tsx +++ b/frontend/src/components/admin/PokemonFormModal.tsx @@ -85,7 +85,7 @@ export function PokemonFormModal({ const tabClass = (tab: Tab) => `px-3 py-1.5 text-sm font-medium rounded-t-md border-b-2 transition-colors ${ activeTab === tab - ? 'border-blue-600 text-blue-600 dark:border-blue-400 dark:text-blue-400' + ? 'border-accent-400 text-accent-400' : 'border-transparent text-text-tertiary hover:text-text-secondary' }` @@ -184,7 +184,7 @@ export function PokemonFormModal({ } }} onBlur={() => setConfirmingDelete(false)} - className="px-4 py-2 text-sm font-medium rounded-md text-status-failed border border-red-300 dark:border-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 disabled:opacity-50" + className="px-4 py-2 text-sm font-medium rounded-md text-status-failed border border-red-600 hover:bg-red-900/20 disabled:opacity-50" > {isDeleting ? 'Deleting...' : confirmingDelete ? 'Confirm?' : 'Delete'} diff --git a/frontend/src/components/admin/PokemonSelector.tsx b/frontend/src/components/admin/PokemonSelector.tsx index 522228b..20155f5 100644 --- a/frontend/src/components/admin/PokemonSelector.tsx +++ b/frontend/src/components/admin/PokemonSelector.tsx @@ -58,7 +58,7 @@ export function PokemonSelector({ setOpen(false) }} className={`px-3 py-2 cursor-pointer hover:bg-surface-2 text-sm flex items-center gap-2 ${ - p.id === selectedId ? 'bg-blue-50 dark:bg-blue-900/30' : '' + p.id === selectedId ? 'bg-accent-900/30' : '' }`} > {p.spriteUrl && } diff --git a/frontend/src/pages/GenlockeDetail.tsx b/frontend/src/pages/GenlockeDetail.tsx index 2c396af..22c71ac 100644 --- a/frontend/src/pages/GenlockeDetail.tsx +++ b/frontend/src/pages/GenlockeDetail.tsx @@ -18,9 +18,9 @@ const statusRing: Record = { } const statusStyles: Record = { - active: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300', - completed: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', - failed: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300', + active: 'bg-green-900/40 text-green-300', + completed: 'bg-blue-900/40 text-blue-300', + failed: 'bg-red-900/40 text-red-300', } function LegIndicator({ leg }: { leg: GenlockeLegDetail }) { @@ -29,7 +29,7 @@ function LegIndicator({ leg }: { leg: GenlockeLegDetail }) { const dot = status ? (
) : (
@@ -213,7 +213,7 @@ export function GenlockeDetail() {

Genlocke Rules

{genlocke.genlockeRules.retireHoF ? ( - + Retire HoF Teams ) : ( diff --git a/frontend/src/pages/GenlockeList.tsx b/frontend/src/pages/GenlockeList.tsx index 7087114..9cda515 100644 --- a/frontend/src/pages/GenlockeList.tsx +++ b/frontend/src/pages/GenlockeList.tsx @@ -3,9 +3,9 @@ import { useGenlockes } from '../hooks/useGenlockes' import type { RunStatus } from '../types' const statusStyles: Record = { - active: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300', - completed: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', - failed: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300', + active: 'bg-green-900/40 text-green-300', + completed: 'bg-blue-900/40 text-blue-300', + failed: 'bg-red-900/40 text-red-300', } export function GenlockeList() { diff --git a/frontend/src/pages/NewGenlocke.tsx b/frontend/src/pages/NewGenlocke.tsx index c118675..e4f59df 100644 --- a/frontend/src/pages/NewGenlocke.tsx +++ b/frontend/src/pages/NewGenlocke.tsx @@ -183,7 +183,7 @@ export function NewGenlocke() { onClick={() => handlePresetSelect(type)} className={`flex-1 p-4 rounded-lg border-2 text-left transition-colors ${ isActive - ? 'border-blue-600 bg-blue-50 dark:bg-blue-900/20' + ? 'border-accent-600 bg-accent-900/20' : 'border-border-default hover:border-border-default' }`} > @@ -498,7 +498,7 @@ function LegRow({ type="button" disabled={index === 0} onClick={() => onMove('up')} - className="p-1 text-gray-400 hover:text-text-secondary disabled:opacity-30 disabled:cursor-not-allowed" + className="p-1 text-text-tertiary hover:text-text-secondary disabled:opacity-30 disabled:cursor-not-allowed" title="Move up" > onMove('down')} - className="p-1 text-gray-400 hover:text-text-secondary disabled:opacity-30 disabled:cursor-not-allowed" + className="p-1 text-text-tertiary hover:text-text-secondary disabled:opacity-30 disabled:cursor-not-allowed" title="Move down" > setOpen(true)} - className="flex items-center gap-2 text-sm text-text-link hover:text-blue-700 dark:hover:text-blue-300 font-medium" + className="flex items-center gap-2 text-sm text-text-link hover:text-accent-300 font-medium" > = { - active: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300', - completed: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', - failed: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300', + active: 'bg-green-900/40 text-green-300', + completed: 'bg-blue-900/40 text-blue-300', + failed: 'bg-red-900/40 text-red-300', } function formatDuration(start: string, end: string) { @@ -136,8 +136,8 @@ export function RunDashboard() {
@@ -147,9 +147,7 @@ export function RunDashboard() {

{run.status === 'completed' ? 'Victory!' : 'Defeat'} diff --git a/frontend/src/pages/RunEncounters.tsx b/frontend/src/pages/RunEncounters.tsx index 6eca559..87113fb 100644 --- a/frontend/src/pages/RunEncounters.tsx +++ b/frontend/src/pages/RunEncounters.tsx @@ -59,9 +59,9 @@ function sortEncounters(encounters: EncounterDetail[], key: TeamSortKey): Encoun } const statusStyles: Record = { - active: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300', - completed: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', - failed: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300', + active: 'bg-green-900/40 text-green-300', + completed: 'bg-blue-900/40 text-blue-300', + failed: 'bg-red-900/40 text-red-300', } function formatDuration(start: string, end: string) { @@ -83,12 +83,12 @@ const statusIndicator: Record {si.label} {run.genlocke && ( -

+

Leg {run.genlocke.legOrder} of {run.genlocke.totalLegs} —{' '} {run.genlocke.genlockeName}

@@ -811,7 +811,7 @@ export function RunEncounters() { {isActive && run.rules?.shinyClause && ( @@ -819,7 +819,7 @@ export function RunEncounters() { {isActive && ( @@ -846,8 +846,8 @@ export function RunEncounters() {
@@ -858,9 +858,7 @@ export function RunEncounters() {

{run.status === 'completed' @@ -924,7 +922,7 @@ export function RunEncounters() {

{/* HoF Team Display */} {run.status === 'completed' && ( -
+
Hall of Fame @@ -932,7 +930,7 @@ export function RunEncounters() { @@ -958,9 +956,7 @@ export function RunEncounters() { })}
) : ( -

- No HoF team selected yet -

+

No HoF team selected yet

)}
)} @@ -1017,8 +1013,8 @@ export function RunEncounters() {
{boss.order} @@ -1055,7 +1051,7 @@ export function RunEncounters() { {dead.length > 0 ? `, ${dead.length} dead` : ''} 0 && (
-

- Transferred Pokemon -

+

Transferred Pokemon

{transferEncounters.map((enc) => ( {bulkRandomize.isPending ? 'Randomizing...' : 'Randomize All'} @@ -1303,14 +1297,14 @@ export function RunEncounters() { other: 'Boss', } const bossTypeColors: Record = { - gym_leader: 'border-yellow-400 dark:border-yellow-600', - elite_four: 'border-purple-400 dark:border-purple-600', - champion: 'border-red-400 dark:border-red-600', - rival: 'border-blue-400 dark:border-blue-600', - evil_team: 'border-gray-500 dark:border-gray-400', - kahuna: 'border-orange-400 dark:border-orange-600', - totem: 'border-teal-400 dark:border-teal-600', - other: 'border-gray-400 dark:border-gray-500', + gym_leader: 'border-yellow-600', + elite_four: 'border-purple-600', + champion: 'border-red-600', + rival: 'border-blue-600', + evil_team: 'border-gray-400', + kahuna: 'border-orange-600', + totem: 'border-teal-600', + other: 'border-gray-500', } const isBossExpanded = expandedBosses.has(boss.id) @@ -1327,7 +1321,7 @@ export function RunEncounters() {
e.stopPropagation()}> {isDefeated ? ( - + Defeated ✓ ) : isActive ? ( diff --git a/frontend/src/pages/admin/AdminGameDetail.tsx b/frontend/src/pages/admin/AdminGameDetail.tsx index f4f0a39..2e00f34 100644 --- a/frontend/src/pages/admin/AdminGameDetail.tsx +++ b/frontend/src/pages/admin/AdminGameDetail.tsx @@ -95,7 +95,7 @@ function SortableRouteGroup({ onClick(group)}> @@ -103,7 +103,7 @@ function SortableRouteGroup({ {...attributes} {...listeners} onClick={(e) => e.stopPropagation()} - className="cursor-grab active:cursor-grabbing text-gray-400 hover:text-text-secondary touch-none" + className="cursor-grab active:cursor-grabbing text-text-tertiary hover:text-text-secondary touch-none" title="Drag to reorder" > @@ -189,7 +189,7 @@ function SortableBossRow({
onClick(boss)} > @@ -197,7 +197,7 @@ function SortableBossRow({ {...attributes} {...listeners} onClick={(e) => e.stopPropagation()} - className="cursor-grab active:cursor-grabbing text-gray-400 hover:text-text-secondary touch-none" + className="cursor-grab active:cursor-grabbing text-text-tertiary hover:text-text-secondary touch-none" title="Drag to reorder" > @@ -287,8 +287,8 @@ export function AdminGameDetail() { useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }) ) - if (isLoading) return
Loading...
- if (!game) return
Game not found
+ if (isLoading) return
Loading...
+ if (!game) return
Game not found
const routes = game.routes ?? [] const routeGroups = organizeRoutes(routes) @@ -362,7 +362,7 @@ export function AdminGameDetail() { onClick={() => setTab('routes')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${ tab === 'routes' - ? 'border-blue-600 text-blue-600 dark:border-blue-400 dark:text-blue-400' + ? 'border-accent-400 text-accent-400' : 'border-transparent text-text-tertiary hover:text-text-secondary' }`} > @@ -372,7 +372,7 @@ export function AdminGameDetail() { onClick={() => setTab('bosses')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${ tab === 'bosses' - ? 'border-blue-600 text-blue-600 dark:border-blue-400 dark:text-blue-400' + ? 'border-accent-400 text-accent-400' : 'border-transparent text-text-tertiary hover:text-text-secondary' }`} > diff --git a/frontend/src/pages/admin/AdminGenlockeDetail.tsx b/frontend/src/pages/admin/AdminGenlockeDetail.tsx index e4568f0..7d67581 100644 --- a/frontend/src/pages/admin/AdminGenlockeDetail.tsx +++ b/frontend/src/pages/admin/AdminGenlockeDetail.tsx @@ -28,8 +28,9 @@ export function AdminGenlockeDetail() { const [addingLeg, setAddingLeg] = useState(false) const [selectedGameId, setSelectedGameId] = useState('') - if (isLoading) return
Loading...
- if (!genlocke) return
Genlocke not found
+ if (isLoading) return
Loading...
+ if (!genlocke) + return
Genlocke not found
const editName = name ?? genlocke.name const editStatus = status ?? genlocke.status @@ -108,7 +109,7 @@ export function AdminGenlockeDetail() { @@ -229,7 +230,7 @@ export function AdminGenlockeDetail() { Run #{leg.runId} ) : ( - + )} @@ -246,7 +247,7 @@ export function AdminGenlockeDetail() { {leg.runStatus}
) : ( - + )} {leg.encounterCount} @@ -260,7 +261,7 @@ export function AdminGenlockeDetail() { ? 'Cannot remove a leg with a linked run' : 'Remove leg' } - className="text-status-failed hover:text-red-800 dark:hover:text-red-300 disabled:opacity-30 disabled:cursor-not-allowed" + className="text-status-failed hover:text-red-300 disabled:opacity-30 disabled:cursor-not-allowed" > Remove