'use client'; import { useEffect, useRef } from 'react'; import { motion } from 'framer-motion'; import { Wordmark } from '@/components/primitives/Wordmark'; import { fadeInUp } from '@/lib/motion'; // One exchange of the page's conversation: the reader's situation, then what // creeer does about it. The answer arrives as you scroll into the pair — its // gold rule draws down and the block comes up to full contrast — so the section // reads as being answered rather than as a list that happens to have answers. // // The sides never swap from one pair to the next. Each voice keeps its own // margin, the way a conversation reads on a page; what alternates going down is // situación → respuesta, not left → right. Flipping sides per pair would cost // the reader the one cue that tells them who is speaking. // // Three cues carry that distinction, never colour alone: the speaker label, the // column, and the rule hanging off each block. // // The answer text is in the DOM at all times, at every breakpoint — opacity, // never `display: none` or `hidden`, so screen readers still announce it and // the static export still ships it to search engines. // // `activo` latches: the section turns it on when the reader reaches the pair // and never turns it off again. An answer that faded back out once you scrolled // past would leave the page emptier the further you read, and would re-create // the failure this project has already hit twice — content stranded at opacity // zero with every test green, because jsdom has no layout and no scrolling. // // No motion.li here on purpose: Framer propagates variants through React // context, so the two motion.div children still inherit the stagger from the //