Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/llms-txt-hub / apps/web/components/newsletter-modal.tsx |
| Date | Not specified in source |
| Repository | Janady13/llms-txt-hub |
| Revision | e0f4bf978d4df168369c7601d9c5f5ea89e84377 |
| Branch | main |
| Path or archive member | apps/web/components/newsletter-modal.tsx |
| Original SHA-256 | a8f469b20d0699df4c447c5d1a131fc0b3315a229e61b66eabab40535f1dcded |
| Git blob SHA | fab54ac15e73ed69509857497935fedf04d95046 |
| Reading-copy SHA-256 | a8f469b20d0699df4c447c5d1a131fc0b3315a229e61b66eabab40535f1dcded |
Recovered source transcript
Download complete source text ↓72 lines · 2.2 KB
'use client'
import { X } from 'lucide-react'
import { useEffect } from 'react'
import { SubstackEmbed } from './substack-embed'
type NewsletterModalProps = {
isOpen: boolean
onClose: () => void
}
export function NewsletterModal({ isOpen, onClose }: NewsletterModalProps) {
useEffect(() => {
if (!isOpen) return
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
onClose()
}
}
// Lock scroll when modal opens
const originalOverflow = document.body.style.overflow
document.body.style.overflow = 'hidden'
window.addEventListener('keydown', handleKeyDown)
return () => {
window.removeEventListener('keydown', handleKeyDown)
document.body.style.overflow = originalOverflow
}
}, [isOpen, onClose])
if (!isOpen) return null
return (
<div className="fixed inset-0 z-50 flex items-center justify-center">
{/* Backdrop */}
<button
type="button"
aria-label="Close modal"
className="fixed inset-0 bg-background/80 backdrop-blur-sm"
onClick={onClose}
/>
{/* Modal Content */}
<div className="relative bg-white dark:bg-black rounded-lg border border-gray-200 dark:border-zinc-800 shadow-lg w-full max-w-[500px] mx-4">
<div className="flex items-center justify-between p-6 border-b border-gray-200 dark:border-zinc-800">
<h2 className="text-lg font-semibold text-gray-900 dark:text-white">Newsletter</h2>
<button
type="button"
onClick={onClose}
className="rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-gray-500 dark:text-gray-400"
>
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</button>
</div>
<div className="p-6">
<p className="text-sm text-gray-600 dark:text-gray-300 mb-6">
Subscribe to our Substack newsletter to stay updated and be the first to know when we
update the website!
</p>
<div className="flex justify-center">
<SubstackEmbed />
</div>
</div>
</div>
</div>
)
}