Index: pages/forge/utils/RenderSpecs.tsx
===================================================================
--- pages/forge/utils/RenderSpecs.tsx	(revision 1d8f088659dc64b64a7330420b70bc03a9be8504)
+++ pages/forge/utils/RenderSpecs.tsx	(revision 1d8f088659dc64b64a7330420b70bc03a9be8504)
@@ -0,0 +1,62 @@
+import { Chip, Typography } from '@mui/material';
+import React from "react";
+
+export function renderSpecs(c: any, type: string) {
+    if (!c) return null;
+    const data = {...c, ...(c.details || {})};
+    const chipStyle = {height: 24, fontSize: '0.75rem', bgcolor: 'rgba(0,0,0,0.05)'};
+    const specs: string[] = [];
+    const val = (k: string) => data[k] || data[k.toLowerCase()] || data[k.replace('_', '')];
+
+    switch (type) {
+        case 'cpu':
+            if (val('socket')) specs.push(val('socket'));
+            if (val('cores')) specs.push(`${val('cores')} Cores / ${val('threads')} Threads`);
+            const base = data.baseclock || data.baseClock || data.base_clock;
+            const boost = data.boostclock || data.boostClock || data.boost_clock;
+            if (base) specs.push(`Base: ${base}GHz`);
+            if (boost) specs.push(`Boost: ${boost}GHz`);
+            break;
+        case 'gpu':
+            if (val('vram')) specs.push(`${val('vram')}GB VRAM`);
+            if (val('chipset')) specs.push(val('chipset'));
+            if (val('length')) specs.push(`L: ${val('length')}mm`);
+            break;
+        case 'motherboard':
+            if (val('socket')) specs.push(val('socket'));
+            if (val('formfactor')) specs.push(val('formfactor'));
+            if (val('ramtype')) specs.push(val('ramtype'));
+            break;
+        case 'memory':
+            if (val('capacity')) specs.push(`${val('capacity')}GB`);
+            if (val('type')) specs.push(val('type'));
+            if (val('speed')) specs.push(`${val('speed')} MHz`);
+            if (val('modules')) specs.push(`${val('modules')}x`);
+            break;
+        case 'storage':
+            if (val('capacity')) specs.push(`${val('capacity')}GB`);
+            if (val('type')) specs.push(val('type'));
+            break;
+        case 'power_supply':
+            if (val('wattage')) specs.push(`Wattage: ${val('wattage')}W`);
+            if (val('type')) specs.push(val('type'));
+            break;
+        case 'case':
+            if (val('gpuMaxLength')) specs.push(`Max GPU Length: ${val('gpuMaxLength')}mm`);
+            if (val('coolerMaxHeight')) specs.push(`Max CPU Cooler Height: ${val('coolerMaxHeight')}mm`);
+            break;
+        case 'cooler':
+            if (val('type')) specs.push(`${val('type')} Cooler`);
+            if (val('height')) specs.push(`${val('height')}mm`);
+            break;
+        default:
+            if (data.brand) specs.push(data.brand);
+    }
+
+    if (specs.length === 0) {
+        if (data.brand) return <Chip label={data.brand} sx={chipStyle}/>;
+        return <Typography variant="caption" color="text.secondary">...</Typography>;
+    }
+
+    return specs.map((label, i) => <Chip key={i} label={label} sx={chipStyle}/>);
+}
Index: pages/forge/utils/componentCalculations.ts
===================================================================
--- pages/forge/utils/componentCalculations.ts	(revision 1d8f088659dc64b64a7330420b70bc03a9be8504)
+++ pages/forge/utils/componentCalculations.ts	(revision 1d8f088659dc64b64a7330420b70bc03a9be8504)
@@ -0,0 +1,54 @@
+// Helper Functions
+import {BuildSlot} from "../types/buildTypes";
+
+export function calculateUsedRamSlots(slots: BuildSlot[]): number {
+    return slots
+        .filter(s => s.type === 'memory' && s.component)
+        .reduce((sum, s) => {
+            const modules = Number(s.component?.details?.modules || s.component?.modules || 1);
+            const quantity = Number(s.component?.quantity || 1);
+            return sum + (modules * quantity);
+        }, 0);
+}
+
+export function getMaxRamSlots(slots: BuildSlot[]): number | null {
+    const mobo = slots.find(s => s.type === 'motherboard' && s.component);
+    if (!mobo?.component?.details?.numRamSlots) return null;
+    return Number(mobo.component.details.numRamSlots);
+}
+
+export function calculateUsedStorageSlots(slots: BuildSlot[], formFactor: string): number {
+    return slots
+        .filter(s => s.type === 'storage' && s.component)
+        .reduce((sum, s) => {
+            const componentFormFactor = s.component?.details?.formFactor || s.component?.details?.form_factor || s.component?.formFactor;
+            if (componentFormFactor?.trim().toLowerCase() === formFactor?.trim().toLowerCase()) {
+                return sum + Number(s.component?.quantity || 1);
+            }
+            return sum;
+        }, 0);
+}
+
+export function getMaxStorageSlots(slots: BuildSlot[], formFactor: string): number | null {
+    const pcCase = slots.find(s => s.type === 'case' && s.component);
+    if (!pcCase?.component?.details?.storageFormFactors) return null;
+
+    const storageFormFactors = pcCase.component.details.storageFormFactors;
+
+    if (!Array.isArray(storageFormFactors)) {
+        return null;
+    }
+
+    const storageFF = storageFormFactors.find((sf: any) => {
+        const sfFormFactor = sf.formFactor || sf.form_factor;
+        return sfFormFactor?.trim().toLowerCase() === formFactor?.trim().toLowerCase();
+    });
+
+    if (!storageFF) {
+        return null;
+    }
+
+    const numSlots = storageFF.numSlots || storageFF.num_slots;
+
+    return Number(numSlots) || null;
+}
