export type Tier = 2 | 3 | 4 | 5 | 6 | 7 | 8 export type Enchantment = 0 | 1 | 2 | 3 | 4 export type ItemCategory = 'Weapons' | 'Armor' | 'Gathering' export type JournalType = 'warrior' | 'mage' | 'hunter' | 'toolmaker' export type FameType = 'twoHanded' | 'oneHanded' | 'armorChest' | 'small' export type SortField = 'materialCost' | 'displayName' | 'tier' | 'variantType' export type SortDirection = 'asc' | 'desc' export interface SortState { field: SortField direction: SortDirection } export interface Ingredient { itemId: string quantity: number } export interface CraftingRecipe { outputItemId: string displayName: string tier: Tier enchantment: Enchantment category: ItemCategory journalType: JournalType famePerCraft: number ingredients: Ingredient[] } export interface IngredientBreakdown { itemId: string displayName: string quantity: number unitPrice: number totalCost: number } export interface ProfitResult { recipe: CraftingRecipe materialCost: number effectiveMaterialCost: number priceAgeMs: number | null // null = missing prices; ms since oldest manual entry missingPrices: boolean ingredientBreakdown: IngredientBreakdown[] }