/* ===========================================================
Forja 3D — Filamentos (estoque + custo)
=========================================================== */
const FIL_TYPES = ['PLA', 'PLA+', 'PETG', 'ABS', 'TPU', 'Silk', 'Wood', 'Nylon', 'Resina', 'Outro'];
const SWATCHES = ['#1a1a1a', '#FF6A1A', '#e0533b', '#3ec06b', '#5aa9e0', '#9b7ce0', '#d4af37', '#cfe8ff', '#ffffff', '#7a7a7a'];
function FilamentForm({ initial, onSave, onClose }) {
const [f, setF] = useState(initial || { name: '', type: 'PLA', brand: '', color: '#FF6A1A', costPerKg: 100, spoolWeight: 1000, remaining: 1000 });
const set = (k, v) => setF((p) => ({ ...p, [k]: v }));
return (
<>
set('name', v)} placeholder="Ex: PLA Preto" />
set('brand', v)} placeholder="Ex: Voolt" />
set('costPerKg', v)} prefix="R$" suffix="/kg" />
set('spoolWeight', v)} suffix="g" />
set('remaining', v)} suffix="g" />
{SWATCHES.map((c) => (
>
);
}
function Filaments() {
const s = useStore();
const [modal, setModal] = useState(null); // {mode:'add'|'edit', data}
const totalValor = s.filaments.reduce((a, f) => a + (f.remaining / 1000) * f.costPerKg, 0);
const totalKg = s.filaments.reduce((a, f) => a + f.remaining, 0) / 1000;
return (
setModal({ mode: 'add' })}>Novo filamento} />
{totalKg.toFixed(2).replace('.', ',')} kg} />
{s.filaments.length === 0 ? (
setModal({ mode: 'add' })}>Cadastrar filamento}>Adicione seus rolos para controlar estoque e custos.
) : (
{s.filaments.map((f) => {
const pct = (f.remaining / f.spoolWeight) * 100;
const low = f.remaining < 200;
return (
{f.name}
{f.type} · {f.brand || 'sem marca'}
setModal({ mode: 'edit', data: f })} />
confirmDel(`Excluir "${f.name}"?`) && store.removeFilament(f.id)} />
{fmt.num(f.remaining)}g de {fmt.num(f.spoolWeight)}g
{low ? 'BAIXO' : fmt.pct(pct)}
Custo
{fmt.brl0(f.costPerKg)}/kg
Em estoque
{fmt.brl0((f.remaining / 1000) * f.costPerKg)}
);
})}
)}
setModal(null)} title={modal?.mode === 'edit' ? 'Editar filamento' : 'Novo filamento'}>
{modal && modal.mode === 'edit' ? store.updateFilament(modal.data.id, f) : store.addFilament(f)}
onClose={() => setModal(null)} />}
);
}
window.Filaments = Filaments;