'use client'; import React, { useState, useCallback } from 'react'; import { useProofing } from './ProofingContext'; import { IconCheck, IconCopy, IconLink } from './Icons'; import { useDictionary } from './I18nProvider'; import { useModalDialog } from '@/hooks/useModalDialog'; export function ProofingModal() { const t = useDictionary(); const proofing = useProofing(); const [copiedState, setCopiedState] = useState<'none' | 'link' | 'list'>('none'); /* Before the early `return null`: hooks must not run conditionally. `proofing` can be null, hence the optional calls. */ const isOpen = Boolean(proofing?.isModalOpen); const close = useCallback(() => proofing?.setIsModalOpen(false), [proofing]); const cardRef = useModalDialog(close, isOpen); if (!proofing || !proofing.isModalOpen) return null; const { favorites, setIsModalOpen, getProofingUrl, getFormattedList, clearFavorites, allowMailto, } = proofing; const handleCopyLink = () => { const url = getProofingUrl(); navigator.clipboard.writeText(url).then(() => { setCopiedState('link'); setTimeout(() => setCopiedState('none'), 2000); }); }; const handleCopyList = () => { const list = getFormattedList(); navigator.clipboard.writeText(list).then(() => { setCopiedState('list'); setTimeout(() => setCopiedState('none'), 2000); }); }; const handleMailto = () => { const subject = encodeURIComponent(t.proofing.mailSubject(favorites.size)); const body = encodeURIComponent(t.proofing.mailBody(getFormattedList(), getProofingUrl())); window.location.href = `mailto:?subject=${subject}&body=${body}`; }; return (
setIsModalOpen(false)} style={{ position: 'fixed', inset: 0, backgroundColor: 'rgba(0,0,0,0.7)', backdropFilter: 'blur(4px)', zIndex: 9999, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '1rem', }} > {/* This card used to read `--bg-surface` and `--border-color`, which are defined nowhere, so it always fell back to the hard-coded dark values. In the light theme that meant a #1e1e1e card under `--text-primary`, which does exist there and resolves to #1a1a18: dark text on a dark background, about 1.05:1. It now uses tokens that exist. */}
e.stopPropagation()} style={{ background: 'var(--bg-card, #1e1e1e)', color: 'var(--text-primary, #ffffff)', borderRadius: 'var(--radius-md, 12px)', border: '1px solid var(--border-subtle, rgba(255,255,255,0.1))', padding: '1.5rem', maxWidth: '480px', width: '100%', boxShadow: '0 20px 40px rgba(0,0,0,0.5)', }} >

{t.proofing.modalTitle(favorites.size)}

{t.proofing.intro(favorites.size)}

{allowMailto && ( )}
); }