Complete documentation for all Fake Love components.
| Component | File | Description |
|---|---|---|
| BitFireworks | BitFireworks.tsx |
Binary particle celebration effect |
| ResultCard | ResultCard.tsx |
Result display with Easter egg animation |
| DeveloperSignature | DeveloperSignature.tsx |
Floating Charle-X signature |
| DropZone | DropZone.tsx |
Drag & drop file upload zone |
| PDFToOfficePage | PDFToOfficePage.tsx |
PDF to Office conversion page |
| ClientLayout | ClientLayout.tsx |
App wrapper with signature |
| LanguageSwitcher | LanguageSwitcher.tsx |
ES/EN language toggle |
| FileGrid | FileGrid.tsx |
File list display |
| FileCard | FileCard.tsx |
Individual file display |
| MergePanel | MergePanel.tsx |
Drag-and-drop merge UI |
| ConvertLoader | ConvertLoader.tsx |
Loading animation |
| PreviewModal | PreviewModal.tsx |
PDF preview modal |
| TrollButton | TrollButton.tsx |
Troll UI button |
| EcgTitle | EcgTitle.tsx |
ECG-style animated title |
| HeartbeatTitle | HeartbeatTitle.tsx |
Heartbeat effect title |
Binary particle explosion animation for celebrating task completion.
import BitFireworks, { BitConfetti } from '@/components/BitFireworks'
<BitFireworks active={true} onComplete={() => console.log('Done')} />
<BitConfetti count={40} />| Prop | Type | Description |
|---|---|---|
active |
boolean |
Trigger the animation |
onComplete |
() => void |
Callback when animation finishes |
The fireworks display binary-encoded messages:
- FAKE LOVE
- PDF MASTER
- NICE WORK
- BINARY LOVE
- LOL PDF
- SUCCESS
- HELLO WORLD
- Fire — Particles launch from random positions
- Spread — Binary characters drift and fade
- Complete — Callback triggered after ~1 second
Displays processing results with animated binary badge.
import ResultCard from '@/components/ResultCard'
<ResultCard
title="Merge Complete!"
description="Your PDFs are now one"
downloadUrl="/path/to/file.pdf"
fileName="merged.pdf"
stats={[{ label: 'Files', value: '3' }]}
/>| Prop | Type | Description |
|---|---|---|
title |
string |
Card heading |
description |
string |
Subtext message |
downloadUrl |
string |
File download URL |
fileName |
string |
Output filename |
stats |
{ label: string; value: string | number }[] |
Optional stat boxes |
Internal component that displays a typing → coding → disintegrating animation.
Phases:
- Typing — Characters appear one by one (50ms interval)
- Coding — Bits randomly glitch (2 seconds)
- Disintegrating — Bits scatter and fade
- Done — Component unmounts
Floating signature component displaying "Charle-X" branding.
import DeveloperSignature from '@/components/DeveloperSignature'
<DeveloperSignature />- Pixel Heart — 15x14 SVG pixel art heart
- Binary Message —
01000110 01000001 01001011 01000101(FAKE) - Opacity Transition — Fades in after 1 second delay
- Position — Fixed bottom-right, floats above footer
Uses DeveloperSignature.module.scss with CSS animations for the pixel heart.
Drag and drop file upload zone.
import DropZone from '@/components/DropZone'
<DropZone
onFilesSelected={(files) => console.log(files)}
multiple={true}
accept=".pdf"
humorMessage="Drop your PDFs here..."
disabled={false}
/>| Prop | Type | Default | Description |
|---|---|---|---|
onFilesSelected |
(files: File[]) => void |
— | Callback with selected files |
multiple |
boolean |
true |
Allow multiple files |
accept |
string |
.pdf |
File extension filter |
humorMessage |
string |
— | Drop zone text |
disabled |
boolean |
false |
Disable interaction |
- Filters files by extension
- Single file mode returns only first file
- Triggers hidden file input on click
Reusable page component for PDF to Office conversions.
import PDFToOfficePage from '@/components/PDFToOfficePage'
<PDFToOfficePage
format="docx"
formatLabel="Word"
color="#dc2626"
/>| Prop | Type | Description |
|---|---|---|
format |
'docx' | 'xlsx' | 'pptx' |
Output format |
formatLabel |
string |
Display label |
color |
string |
Accent color |
- Drag & drop PDF upload
- File validation (PDF only)
- Progress tracking via
processContext - Result display with
ResultCard
Wraps the entire app with language provider and developer signature.
import ClientLayout from '@/components/ClientLayout'
export default function RootLayout({ children }) {
return (
<html lang="es">
<body>
<ClientLayout>{children}</ClientLayout>
</body>
</html>
)
}LanguageProvider— i18n contextProcessProvider— Process history contextDeveloperSignature— Floating signature
Toggle between Spanish and English.
import LanguageSwitcher from '@/components/LanguageSwitcher'
<LanguageSwitcher />- Persists choice to
localStorage - Updates
html langattribute - Uses Lucide Globe icon
Uses LanguageSwitcher.module.scss with hover effects.
Displays a list of uploaded files with actions.
import FileGrid from '@/components/FileGrid'
<FileGrid
files={uploadedFiles}
onRemove={(index) => removeFile(index)}
showPages={true}
/>| Prop | Type | Description |
|---|---|---|
files |
File[] |
List of files |
onRemove |
(index: number) => void |
Remove callback |
showPages |
boolean |
Show page count |
Drag-and-drop interface for reordering PDFs before merge.
import MergePanel from '@/components/MergePanel'
<MergePanel
files={files}
onReorder={(files) => setFiles(files)}
onRemove={(index) => removeFile(index)}
/>- Drag handles for reordering
- Page selector per file
- File info display (name, pages)
- Using
@dnd-kit/sortablefor drag
Animated loading indicator for conversion processes.
import ConvertLoader from '@/components/ConvertLoader'
<ConvertLoader message="Uploading your emotional baggage..." />| Prop | Type | Description |
|---|---|---|
message |
string |
Loading text |
progress |
number |
Optional progress percentage |
Modal for previewing PDF files.
import PreviewModal from '@/components/PreviewModal'
<PreviewModal
isOpen={true}
fileUrl="/path/to/file.pdf"
onClose={() => setIsOpen(false)}
/>| Prop | Type | Description |
|---|---|---|
isOpen |
boolean |
Modal visibility |
fileUrl |
string |
PDF URL to preview |
onClose |
() => void |
Close callback |
Button with subtle "troll" behavior (slight movement on hover).
import TrollButton from '@/components/TrollButton'
<TrollButton onClick={() => doSomething()}>
Click me
</TrollButton>- Slight position offset on hover
- Returns to position on mouse leave
- Non-blocking (doesn't trap users)
Title component with ECG/EKG line animation.
import EcgTitle from '@/components/EcgTitle'
<EcgTitle>FAKE LOVE</EcgTitle>CSS animation creates a heartbeat-style line effect beneath the text.
Title with heartbeat pulse effect on hover.
import HeartbeatTitle from '@/components/HeartbeatTitle'
<HeartbeatTitle>Pdf Tools</HeartbeatTitle>Scales up slightly and adds pulse animation on hover.
import { useLanguage } from '@/lib/language'
const { t, lang, setLang, isSpanish } = useLanguage()
// Example
console.log(t('merge.title')) // "UNIR PDF" or "MERGE PDF"
setLang('en')import { useProcesses } from '@/lib/processContext'
const {
processes,
addProcess,
updateProcess,
removeProcess,
clearCompleted,
getRecentProcesses,
isLoading,
} = useProcesses()
// Example
const id = addProcess({
fileName: 'document.pdf',
operation: 'merge',
operationLabel: 'Merge PDF',
status: 'processing',
progress: 0,
originalSize: 1024,
})All components use SCSS modules with co-located .module.scss files:
components/
├── ComponentName.tsx
└── ComponentName.module.scss
--color-primary: #dc2626;
--color-bg: #0a0a0f;
--color-surface: #141419;
--color-border: #2a2a35;
--color-text: #f5f5f5;
--color-muted: #9ca3af;typing— Character-by-character appearanceglitch— Random offset flickerdisintegrate— Scatter and fadeheartbeat— Scale pulsefadeIn— Opacity transition
- Use
transformandopacityfor animations - Avoid animating
width,height,top,left - Use
will-changesparingly - Cleanup intervals and timeouts in
useEffect