"use client"; import { useState, useEffect } from "react"; import { useMediaQuery } from "../../hooks/useMediaQuery"; import HeaderLockup from "../../components/type/HeaderLockup"; import TextInput from "../../components/controls/TextInput"; import { useCreateFlow } from "../context/CreateFlowContext"; /** * Text page for the create flow * * Displays a text input field for user input using HeaderLockup and TextInput components. * Responsive sizing: uses L/M for HeaderLockup and medium/small for TextInput based on 640px breakpoint. */ export default function TextPage() { const { markCreateFlowInteraction, updateState, state } = useCreateFlow(); const [isMounted, setIsMounted] = useState(false); const isMdOrLarger = useMediaQuery("(min-width: 640px)"); const [value, setValue] = useState(() => typeof state.title === "string" ? state.title : "", ); useEffect(() => { const incoming = state.title; if (typeof incoming !== "string" || incoming.length === 0) return; setValue((prev) => (prev === "" ? incoming : prev)); }, [state.title]); // Avoid flash: only use breakpoint after mount so SSR and first paint use same layout (desktop). useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: defer layout breakpoint until after mount to prevent flash setIsMounted(true); }, []); const effectiveMdOrLarger = !isMounted || isMdOrLarger; const maxLength = 48; const characterCount = value.length; return (