);
}
function FaqItem({ q, a }) {
const { Icon } = window.DesignSystem_3a7ab0;
const [open, setOpen] = React.useState(false);
return (
{open &&
{a}
}
);
}
function Home({ go }) {
const { ToolCard, Tabs, Badge, Button, Icon } = window.DesignSystem_3a7ab0;
const { TOOLS, CATS, working, count } = window.FTH;
const [cat, setCat] = React.useState('all');
const popular = (cat==='all' ? working.filter(t=>t.pop) : working.filter(t => t.cat===cat));
const tabs = [{ id:'all', label:'Popular' }, { id:'pdf', label:'PDF' }, { id:'image', label:'Image' }, { id:'text', label:'Text' }, { id:'dev', label:'Dev' }, { id:'calc', label:'Calc' }];
const pillars = [
{ icon:'shield-check', tone:'green', label:'No Watermark' },
{ icon:'user-x', tone:'blue', label:'No Registration' },
{ icon:'zap', tone:'amber', label:'Fast' },
{ icon:'lock', tone:'teal', label:'Secure' },
{ icon:'infinity', tone:'sky', label:'Unlimited' },
];
const steps = [
['upload-cloud','Drop your file','Drag & drop or browse. Files stay in your browser — nothing is uploaded.'],
['sliders-horizontal','Adjust & preview','Tune settings with a live preview. Watch it process in real time.'],
['download','Download free','Grab your clean result instantly. No watermark, no email, no limit.'],
];
const faqs = [
['Is everything really free?','Yes — every working tool is 100% free with no hidden limits, trial, or premium upsell.'],
['Will my files have a watermark?','Never. Your exports come out clean, exactly as you made them.'],
['Do I need an account?','No registration required. Open a tool and start immediately.'],
['Are my files private?','PDF and image tools run entirely in your browser — your files never leave your device.'],
['Is there any catch?','None. No watermark, no sign-up, no limits — every tool is free and runs right in your browser.'],
];
// Entrance is CSS transform-only (never hides content). Scroll-reveal just
// adds an `.in` class that triggers a transform slide on inner cards — it
// never hides anything, so no JS/observer failure can blank the page.
React.useEffect(() => {
if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
if (!('IntersectionObserver' in window)) return;
const els = Array.from(document.querySelectorAll('.fth-reveal'));
const io = new IntersectionObserver((ents) => {
ents.forEach(en => { if (en.isIntersecting) { en.target.classList.add('in'); io.unobserve(en.target); } });
}, { threshold: 0.08, rootMargin: '0px 0px -5% 0px' });
els.forEach(el => io.observe(el));
return () => io.disconnect();
}, []);
// hero typing effect (respects reduced motion)
const PHRASES = ['100% free, forever.', 'No watermark, ever.', 'Private by design.'];
const [typed, setTyped] = React.useState(PHRASES[0]);
React.useEffect(() => {
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
let pi = 0, ci = PHRASES[0].length, del = true, alive = true;
const tick = () => {
if (!alive) return;
if (del) { ci--; if (ci <= 0) { del = false; pi = (pi + 1) % PHRASES.length; } }
else { ci++; if (ci >= PHRASES[pi].length) { del = true; setTyped(PHRASES[pi]); setTimeout(tick, 2600); return; } }
setTyped(PHRASES[pi].slice(0, Math.max(0, ci)) || '\u00a0');
setTimeout(tick, del ? 32 : 60);
};
const t = setTimeout(tick, 2400);
return () => { alive = false; clearTimeout(t); };
}, []);
return (
{/* HERO */}
100% Free • No Registration • No Watermark
Every tool you need. {typed}
Convert, compress, and edit files right in your browser. No account, no watermark, no limits — your files never leave your device.