'use client'; import { useEffect, useState, useCallback } from 'react'; import { useReducedMotion } from 'framer-motion'; import { FileText, FileSpreadsheet, Presentation, FileCheck, Sparkles, ArrowRight, Clock, Users, Flame, Check, ShieldCheck, Save, Undo, Redo, Search, Minus, Square, X, Bold, Italic, Underline, AlignLeft, AlignCenter, List, ListOrdered, Table as TableIcon, ChevronDown, ZoomIn, Printer, Maximize2, } from 'lucide-react'; import { cn } from '@/lib/utils'; /** * Wordly.art — Hero Visual Authentique Office & PDF * * Cette animation recrée fidèlement l'environnement réel d'un logiciel bureautique * (Microsoft Word, Excel, PowerPoint et Adobe PDF) avec : * - Le ruban, la barre de titre, la règle et la barre d'état officielles. * - Une vraie page de document A4 flottante avec du vrai texte lisible (≥ 11px). * - Une onde dorée de numérisation/traduction en temps réel (FR → EN → ES). * - Une stabilité géométrique absolue : zéro décalage, zéro saut de mise en page. */ type OfficeFormat = 'docx' | 'xlsx' | 'pptx' | 'pdf'; interface RecipeData { lang: 'FR' | 'EN' | 'ES'; langName: string; langCodeDoc: string; docTitle: string; docSubtitle: string; category: string; timeLabel: string; servingsLabel: string; heatLabel: string; ingredientsHeading: string; ingredients: Array<{ amount: string; name: string }>; tableTitle: string; tableHeaders: [string, string, string]; tableValues: [string, string, string]; stepsHeading: string; steps: Array<{ num: string; title: string; desc: string }>; excelFormula: string; excelHeaders: [string, string, string, string]; excelRows: Array<[string, string, string, string]>; excelTotalLabel: string; excelTotalVal: string; pptSlideTitle: string; pptCard1Title: string; pptCard1Text: string; pptCard2Title: string; pptCard2Text: string; guaranteeText: string; } const RECIPES: RecipeData[] = [ { lang: 'FR', langName: 'Français (France)', langCodeDoc: 'FR-FR', docTitle: 'Tarte fine aux pommes & cannelle', docSubtitle: 'Recette traditionnelle • Pâtisserie maison de saison', category: 'Pâtisserie artisanale • Recette n°04', timeLabel: '15 min de préparation', servingsLabel: '4 à 6 personnes', heatLabel: 'Four chaud 180°C', ingredientsHeading: 'Ingrédients nécessaires', ingredients: [ { amount: '1 rouleau', name: 'Pâte feuilletée pur beurre dorée' }, { amount: '4 pièces', name: 'Pommes Golden finement tranchées' }, { amount: '25 g', name: 'Beurre doux fondu tiédi' }, { amount: '2 sachets', name: 'Sucre vanillé naturel des îles' }, ], tableTitle: 'Paramètres de cuisson au four', tableHeaders: ['Position four', 'Préparation', 'Cuisson dorée'], tableValues: ['Mi-hauteur 180°C', '15 minutes', '25 minutes'], stepsHeading: 'Instructions de préparation', steps: [ { num: '01', title: 'Préparer la pâte', desc: 'Dérouler la pâte sur la plaque et piquer le fond à la fourchette.', }, { num: '02', title: 'Dresser les pommes', desc: 'Disposer les lamelles de pommes en rosace harmonieuse et serrée.', }, { num: '03', title: 'Enfourner et dorer', desc: 'Badigeonner de beurre fondu puis saupoudrer de sucre vanillé.', }, ], excelFormula: '=SOMME(C3:C6) & " g de garniture"', excelHeaders: ['Ingrédient', 'Quantité', 'Unité', 'Remarque'], excelRows: [ ['Pâte feuilletée', '1', 'rouleau', 'Pur beurre'], ['Pommes Golden', '4', 'pièces', 'Tranches fines'], ['Beurre doux', '25', 'grammes', 'Fondu tiède'], ['Sucre vanillé', '2', 'sachets', 'Arôme naturel'], ], excelTotalLabel: 'Temps de cuisson totale', excelTotalVal: '25 min à 180°C', pptSlideTitle: 'Recette gourmande : Tarte fine aux pommes', pptCard1Title: 'Ingrédients clés', pptCard1Text: 'Pâte feuilletée pur beurre, 4 pommes Golden, beurre doux fondu, sucre vanillé naturel.', pptCard2Title: 'Cuisson & finition', pptCard2Text: 'Disposition en rosace serrée, cuisson 25 min à 180°C jusqu’à dorure parfaite.', guaranteeText: 'Mise en page originale 100% préservée', }, { lang: 'EN', langName: 'English (United States)', langCodeDoc: 'EN-US', docTitle: 'Crisp apple & cinnamon tart', docSubtitle: 'Traditional recipe • Seasonal homemade pastry', category: 'Artisanal pastry • Recipe #04', timeLabel: '15 min preparation time', servingsLabel: '4 to 6 servings', heatLabel: 'Hot oven at 180°C', ingredientsHeading: 'Required ingredients', ingredients: [ { amount: '1 sheet', name: 'Golden all-butter puff pastry sheet' }, { amount: '4 units', name: 'Fresh Golden apples thinly sliced' }, { amount: '25 g', name: 'Melted unsalted sweet butter' }, { amount: '2 packs', name: 'Natural island vanilla sugar dust' }, ], tableTitle: 'Oven baking specifications', tableHeaders: ['Oven position', 'Preparation', 'Golden baking'], tableValues: ['Middle shelf 180°C', '15 minutes', '25 minutes'], stepsHeading: 'Preparation instructions', steps: [ { num: '01', title: 'Prepare the crust', desc: 'Unroll pastry on the tray and prick the base evenly with a fork.', }, { num: '02', title: 'Arrange the fruit', desc: 'Place the apple slices in an elegant, tight spiral pattern.', }, { num: '03', title: 'Bake to golden', desc: 'Brush with melted butter and dust evenly with vanilla sugar.', }, ], excelFormula: '=SUM(C3:C6) & " g filling total"', excelHeaders: ['Ingredient', 'Quantity', 'Unit', 'Note'], excelRows: [ ['Puff pastry', '1', 'sheet', 'All-butter'], ['Golden apples', '4', 'units', 'Thin slices'], ['Unsalted butter', '25', 'grams', 'Melted warm'], ['Vanilla sugar', '2', 'packs', 'Natural flavor'], ], excelTotalLabel: 'Total baking duration', excelTotalVal: '25 min at 180°C', pptSlideTitle: 'Gourmet Recipe: Crisp Apple Tart', pptCard1Title: 'Key Ingredients', pptCard1Text: 'All-butter puff pastry, 4 Golden apples, melted unsalted butter, natural vanilla sugar.', pptCard2Title: 'Baking & Finish', pptCard2Text: 'Arrange in tight spiral, bake 25 min at 180°C until crisp and golden brown.', guaranteeText: 'Original layout 100% preserved', }, { lang: 'ES', langName: 'Español (España)', langCodeDoc: 'ES-ES', docTitle: 'Tarta fina de manzana & canela', docSubtitle: 'Receta tradicional • Repostería casera de otoño', category: 'Repostería artesanal • Receta n°04', timeLabel: '15 min de preparación', servingsLabel: '4 a 6 personas', heatLabel: 'Horno caliente 180°C', ingredientsHeading: 'Ingredientes necesarios', ingredients: [ { amount: '1 lámina', name: 'Masa de hojaldre dorado con mantequilla' }, { amount: '4 piezas', name: 'Manzanas Golden finamente laminadas' }, { amount: '25 g', name: 'Mantequilla dulce derretida templada' }, { amount: '2 sobres', name: 'Azúcar avainillado natural fino' }, ], tableTitle: 'Parámetros de horneado al horno', tableHeaders: ['Posición horno', 'Preparación', 'Horneado dorado'], tableValues: ['Altura media 180°C', '15 minutos', '25 minutes'], stepsHeading: 'Instrucciones de preparación', steps: [ { num: '01', title: 'Preparar la base', desc: 'Extender la masa sobre la bandeja y pinchar la base con tenedor.', }, { num: '02', title: 'Colocar la fruta', desc: 'Disponer las láminas de manzana en una espiral bien apretada.', }, { num: '03', title: 'Hornear y dorar', desc: 'Pincelar con mantequilla y espolvorear el azúcar avainillado.', }, ], excelFormula: '=SUMA(C3:C6) & " g de relleno"', excelHeaders: ['Ingrediente', 'Cantidad', 'Unidad', 'Detalle'], excelRows: [ ['Masa hojaldre', '1', 'lámina', 'Con mantequilla'], ['Manzanas Golden', '4', 'piezas', 'Láminas finas'], ['Mantequilla dulce', '25', 'gramos', 'Derretida tibia'], ['Azúcar vainillado', '2', 'sobres', 'Aroma natural'], ], excelTotalLabel: 'Tiempo de cocción total', excelTotalVal: '25 min a 180°C', pptSlideTitle: 'Receta exquisita: Tarta fina de manzana', pptCard1Title: 'Ingredientes clave', pptCard1Text: 'Masa de hojaldre, 4 manzanas Golden, mantequilla dulce derretida, azúcar avainillado.', pptCard2Title: 'Horneado y acabado', pptCard2Text: 'Disposición en espiral apretada, hornear 25 min a 180°C hasta que esté dorada.', guaranteeText: 'Estructura original 100% preservada', }, ]; const FORMAT_CONFIG: Record< OfficeFormat, { ext: string; label: string; appTitle: string; accentColor: string; headerBg: string; headerText: string; statusBg: string; icon: typeof FileText; defaultFile: string; } > = { docx: { ext: '.DOCX', label: 'Word', appTitle: 'Word', accentColor: '#185ABD', headerBg: 'bg-[#185ABD] dark:bg-[#10438F]', headerText: 'text-white', statusBg: 'bg-[#185ABD] dark:bg-[#10438F]', icon: FileText, defaultFile: 'Recette_Tarte_Pommes.docx', }, xlsx: { ext: '.XLSX', label: 'Excel', appTitle: 'Excel', accentColor: '#107C41', headerBg: 'bg-[#107C41] dark:bg-[#0B5C30]', headerText: 'text-white', statusBg: 'bg-[#107C41] dark:bg-[#0B5C30]', icon: FileSpreadsheet, defaultFile: 'Fiche_Technique_Recette.xlsx', }, pptx: { ext: '.PPTX', label: 'PowerPoint', appTitle: 'PowerPoint', accentColor: '#C43E1C', headerBg: 'bg-[#C43E1C] dark:bg-[#992F13]', headerText: 'text-white', statusBg: 'bg-[#C43E1C] dark:bg-[#992F13]', icon: Presentation, defaultFile: 'Presentation_Recette.pptx', }, pdf: { ext: '.PDF', label: 'PDF Reader', appTitle: 'Adobe Acrobat Reader', accentColor: '#E03E2D', headerBg: 'bg-[#2A2A2A] dark:bg-[#1A1A1A]', headerText: 'text-white', statusBg: 'bg-[#2A2A2A] dark:bg-[#1A1A1A]', icon: FileCheck, defaultFile: 'Document_Recette_Officiel.pdf', }, }; const CYCLE_DURATION_MS = 6200; // ~6.2 secondes par cycle const SCAN_DURATION_MS = 1400; // 1.4s onde dorée /** * Rendu intérieur d'un document Word (.docx) avec vraie mise en page A4 */ function WordDocumentSheet({ data }: { data: RecipeData }) { return (
{data.docSubtitle}
{/* Métadonnées */}{data.pptCard1Text}
{data.pptCard2Text}
{data.docSubtitle} — {data.timeLabel} • {data.servingsLabel} • {data.heatLabel}.