All checks were successful
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 3m4s
Store refactoring (2138 → 1651 lines, 23% reduction): - Extract computed-stats.ts with 18 utility functions - Extract navigation-slice.ts for floor navigation actions - Extract study-slice.ts for study-related actions - Move fmt/fmtDec to computed-stats, re-export from formatting Page refactoring (2554 → 1695 lines, 34% reduction): - Use existing SpireTab component instead of inline render - Extract ActionButtons component - Extract CalendarDisplay component - Extract CraftingProgress component - Extract StudyProgress component - Extract ManaDisplay component - Extract TimeDisplay component - Create tabs/index.ts for cleaner exports This improves code organization and makes the codebase more maintainable.
47 lines
1.4 KiB
TypeScript
Executable File
47 lines
1.4 KiB
TypeScript
Executable File
// ─── Shared Formatting Utilities ─────────────────────────────────────────────────
|
|
// Utility functions for consistent formatting across components
|
|
|
|
import { ELEMENTS } from '@/lib/game/constants';
|
|
import type { SpellCost } from '@/lib/game/types';
|
|
|
|
// Re-export number formatting functions from computed-stats.ts
|
|
export { fmt, fmtDec } from './computed-stats';
|
|
|
|
/**
|
|
* Format a spell cost for display
|
|
*/
|
|
export function formatSpellCost(cost: SpellCost): string {
|
|
if (cost.type === 'raw') {
|
|
return `${cost.amount} raw`;
|
|
}
|
|
const elemDef = ELEMENTS[cost.element || ''];
|
|
return `${cost.amount} ${elemDef?.sym || '?'}`;
|
|
}
|
|
|
|
/**
|
|
* Get the display color for a spell cost
|
|
*/
|
|
export function getSpellCostColor(cost: SpellCost): string {
|
|
if (cost.type === 'raw') {
|
|
return '#60A5FA'; // Blue for raw mana
|
|
}
|
|
return ELEMENTS[cost.element || '']?.color || '#9CA3AF';
|
|
}
|
|
|
|
/**
|
|
* Format study time in hours to human-readable string
|
|
*/
|
|
export function formatStudyTime(hours: number): string {
|
|
if (hours < 1) return `${Math.round(hours * 60)}m`;
|
|
return `${hours.toFixed(1)}h`;
|
|
}
|
|
|
|
/**
|
|
* Format time (hour of day) to HH:MM format
|
|
*/
|
|
export function formatHour(hour: number): string {
|
|
const h = Math.floor(hour);
|
|
const m = Math.floor((hour % 1) * 60);
|
|
return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;
|
|
}
|