J

Jenn

Feminine English
Enjoying this info? Buy us a coffee to keep it going! Support Us

Meaning & History

Jenn is a feminine given name, frequently a shortened form (hypocorism) of Jennifer. As a diminutive, it emerged alongside the rise of Jennifer's popularity in the 20th century, particularly in English-speaking regions.

Etymology and History

The root name Jennifer derives from a Cornish form of the Welsh name Gwenhwyfar, the original name of Queen Guinevere from Arthurian legend. While Jennifer was rare outside Cornwall before the early 1900s, it gained widespread recognition after appearing in George Bernard Shaw's play The Doctor's Dilemma (1906). The name surged in popularity in the United States during the mid-20th century, becoming the most popular name for girls between 1970 and 1984. The clipped form Jenn naturally followed this trend as an affectionate shorter version.

Notable Bearers

Culture and Arts

Jenn Bostic (born 1986), American country singer-songwriter</plaintext><plaintext>Jenn Grant (born 1980), Canadian folk pop singer</plaintext><plaintext>Jenn Colella, American actress and singer</plaintext><plaintext>Jenn Ashworth (born 1982), English writer</plaintext><h3>Other Fields</h3><plaintext>Jenn Robinson (born 1991), Canadian fashion model</plaintext><plaintext>Jenn Stone, American video game journalist</plaintext><h2>Related Names</h2><p>Variants of Jenn include <a href="/name/jen">Jen</a>, <a href="/name/jena">Jena</a>, and <a href="/name/jenni">Jenni</a>. The name also shares roots with longer forms such as <a href="/name/guinevere">Guinevere</a> (Welsh mythology) and <a href="/name/gwenhwyfar">Gwenhwyfar</a> (Welsh).</p><ul><li><strong>Meaning:</strong> Short form of Jennifer</li><li><strong>Origin:</strong> Cornish/Welsh (via Guinevere)</li><li><strong>Type:</strong> Diminutive/hypocorism</li><li><strong>Usage regions:</strong> English-speaking countries (particularly US and UK)</li></ul> </div> </section> <section class="mb-8"> <div class="flex items-center gap-3 mb-3"> <h2 class="text-base font-semibold text-gray-900">Related Names</h2> <div class="h-px flex-1 bg-gray-200"></div> </div> <div class="space-y-3"> <div class="bg-white rounded-xl border border-gray-100 hover:border-gray-200 transition p-4"> <div class="text-xs font-bold uppercase tracking-wider text-gray-500 mb-2">Variants</div> <div class="flex flex-wrap items-baseline gap-x-1.5 gap-y-2 leading-relaxed"> <a href="https://namehub.ngrok.app/en/name/jen" class="name-link hover:underline text-sm font-medium">Jen</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jena" class="name-link hover:underline text-sm font-medium">Jena</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenelle" class="name-link hover:underline text-sm font-medium">Jenelle</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jeni" class="name-link hover:underline text-sm font-medium">Jeni</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenna" class="name-link hover:underline text-sm font-medium">Jenna</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenni" class="name-link hover:underline text-sm font-medium">Jenni</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jennie" class="name-link hover:underline text-sm font-medium">Jennie</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenny" class="name-link hover:underline text-sm font-medium">Jenny</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenae" class="name-link hover:underline text-sm font-medium">Jenae</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenessa" class="name-link hover:underline text-sm font-medium">Jenessa</a> </div> </div> <div class="bg-white rounded-xl border border-gray-100 hover:border-gray-200 transition p-4"> <div class="text-xs font-bold uppercase tracking-wider text-gray-500 mb-2">Other Languages &amp; Cultures</div> <div class="flex flex-wrap items-baseline gap-x-1.5 gap-y-2 leading-relaxed"> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Welsh Mythology)</span> <a href="https://namehub.ngrok.app/en/name/gwenhwyfar" class="name-link hover:underline text-sm font-medium">Gwenhwyfar</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Arthurian Cycle)</span> <a href="https://namehub.ngrok.app/en/name/guenevere" class="name-link hover:underline text-sm font-medium">Guenevere</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/guinevere" class="name-link hover:underline text-sm font-medium">Guinevere</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Spanish)</span> <a href="https://namehub.ngrok.app/en/name/jenifer" class="name-link hover:underline text-sm font-medium">Jenifer</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Swedish)</span> <a href="https://namehub.ngrok.app/en/name/jennifer" class="name-link hover:underline text-sm font-medium">Jennifer</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jenny" class="name-link hover:underline text-sm font-medium">Jenny</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(French)</span> <a href="https://namehub.ngrok.app/en/name/jenna" class="name-link hover:underline text-sm font-medium">Jenna</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Finnish)</span> <a href="https://namehub.ngrok.app/en/name/jenni" class="name-link hover:underline text-sm font-medium">Jenni</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(French)</span> <a href="https://namehub.ngrok.app/en/name/guenie11vre" class="name-link hover:underline text-sm font-medium">Guenièvre</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/jennah" class="name-link hover:underline text-sm font-medium">Jennah</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Hungarian)</span> <a href="https://namehub.ngrok.app/en/name/dzsenifer" class="name-link hover:underline text-sm font-medium">Dzsenifer</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Icelandic)</span> <a href="https://namehub.ngrok.app/en/name/jenny10" class="name-link hover:underline text-sm font-medium">Jenný</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Italian)</span> <a href="https://namehub.ngrok.app/en/name/ginevra" class="name-link hover:underline text-sm font-medium">Ginevra</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Spanish (Latin American))</span> <a href="https://namehub.ngrok.app/en/name/ye10nifer" class="name-link hover:underline text-sm font-medium">Yénifer</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/ye10nnifer" class="name-link hover:underline text-sm font-medium">Yénnifer</a><span class="text-gray-300">,</span> <a href="https://namehub.ngrok.app/en/name/yenny" class="name-link hover:underline text-sm font-medium">Yenny</a> <span class="basis-full"></span> <span class="text-xs font-semibold text-gray-400 uppercase tracking-wider">(Swedish)</span> <a href="https://namehub.ngrok.app/en/name/jennie" class="name-link hover:underline text-sm font-medium">Jennie</a> </div> </div> </div> </section> <p class="mt-8 pt-3 border-t border-gray-100 text-sm text-gray-500 leading-relaxed"> <svg class="inline w-3.5 h-3.5 mr-1 mb-0.5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"/></svg> <span class="font-semibold text-gray-700">Sources:</span> <a href="https://en.wikipedia.org/wiki/Jenn" rel="nofollow noopener" target="_blank" class="hover:text-indigo-600 hover:underline">Wikipedia — Jenn</a> </p> </div> <div class="w-full lg:w-72 shrink-0 space-y-4"> <div class="bg-white rounded-xl border border-gray-100 p-5 space-y-5"> <div> <div class="flex items-center gap-3 mb-3"> <h2 class="text-sm font-bold text-gray-900">Download</h2> <div class="h-px flex-1 bg-gray-200"></div> </div> <a href="https://namehub.ngrok.app/en/certificate/preview/jenn" class="flex items-center gap-2.5 px-3.5 py-2.5 rounded-xl border-2 border-gray-200 text-sm font-semibold text-gray-700 hover:bg-gray-50 hover:border-gray-300 transition"> <svg class="w-4 h-4 text-gray-500 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"/></svg> <span class="flex-1">Name Certificate</span> <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold uppercase tracking-wider bg-emerald-50 text-emerald-700">Free</span> </a> </div> <div> <div class="flex items-center gap-3 mb-3"> <h2 class="text-sm font-bold text-gray-900">Share</h2> <div class="h-px flex-1 bg-gray-200"></div> </div> <div class="flex flex-wrap gap-1.5"> <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fnamehub.ngrok.app%2Fen%2Fname%2Fjenn" target="_blank" rel="noopener" class="inline-flex items-center justify-center w-9 h-9 rounded-lg border border-gray-200 text-gray-500 hover:bg-indigo-50 hover:border-indigo-300 hover:text-indigo-600 transition" title="Facebook"> <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 24 24"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg> </a> <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnamehub.ngrok.app%2Fen%2Fname%2Fjenn&text=Jenn+%E2%80%94+Name+Meaning+%26+Origin" target="_blank" rel="noopener" class="inline-flex items-center justify-center w-9 h-9 rounded-lg border border-gray-200 text-gray-500 hover:bg-indigo-50 hover:border-indigo-300 hover:text-indigo-600 transition" title="X"> <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> </a> <a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fnamehub.ngrok.app%2Fen%2Fname%2Fjenn&description=Jenn+%E2%80%94+Name+Meaning+%26+Origin" target="_blank" rel="noopener" class="inline-flex items-center justify-center w-9 h-9 rounded-lg border border-gray-200 text-gray-500 hover:bg-indigo-50 hover:border-indigo-300 hover:text-indigo-600 transition" title="Pinterest"> <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 24 24"><path d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738a.36.36 0 01.083.345l-.333 1.36c-.053.22-.174.267-.402.161-1.499-.698-2.436-2.889-2.436-4.649 0-3.785 2.75-7.262 7.929-7.262 4.163 0 7.398 2.967 7.398 6.931 0 4.136-2.607 7.464-6.227 7.464-1.216 0-2.359-.631-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12.017 24c6.624 0 11.99-5.367 11.99-11.988C24.007 5.367 18.641 0 12.017 0z"/></svg> </a> <button id="copy-link-btn" class="inline-flex items-center justify-center w-9 h-9 rounded-lg border border-gray-200 text-gray-500 hover:bg-indigo-50 hover:border-indigo-300 hover:text-indigo-600 transition cursor-pointer" title="Copy Link"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3"/></svg> </button> <script> document.getElementById('copy-link-btn')?.addEventListener('click', function() { const btn = this; navigator.clipboard.writeText('https://namehub.ngrok.app/en/name/jenn').then(function() { btn.classList.add('bg-emerald-50', 'border-emerald-300', 'text-emerald-600'); setTimeout(function() { btn.classList.remove('bg-emerald-50', 'border-emerald-300', 'text-emerald-600'); }, 2000); }); }); </script> </div> </div> </div> <div class="bg-white rounded-xl border border-gray-100 p-5"> <div class="flex items-center gap-3 mb-3"> <h2 class="text-sm font-bold text-gray-900">Categories</h2> <div class="h-px flex-1 bg-gray-200"></div> </div> <div class="flex flex-wrap gap-1.5"> <a href="https://namehub.ngrok.app/en/names/tag/youtubers" class="inline-flex items-center px-2.5 py-1 text-xs font-semibold rounded-full border border-gray-200 text-gray-600 hover:border-indigo-300 hover:text-indigo-700 transition" > YouTubers </a> <a href="https://namehub.ngrok.app/en/names/tag/the_west_wing_characters" class="inline-flex items-center px-2.5 py-1 text-xs font-semibold rounded-full border border-gray-200 text-gray-600 hover:border-indigo-300 hover:text-indigo-700 transition" > The West Wing characters </a> <a href="https://namehub.ngrok.app/en/names/tag/short_forms" class="inline-flex items-center px-2.5 py-1 text-xs font-semibold rounded-full border border-gray-200 text-gray-600 hover:border-indigo-300 hover:text-indigo-700 transition" > short forms </a> <a href="https://namehub.ngrok.app/en/names/tag/family_ties_characters" class="inline-flex items-center px-2.5 py-1 text-xs font-semibold rounded-full border border-gray-200 text-gray-600 hover:border-indigo-300 hover:text-indigo-700 transition" > Family Ties characters </a> <a href="https://namehub.ngrok.app/en/names/tag/rappers" class="inline-flex items-center px-2.5 py-1 text-xs font-semibold rounded-full border border-gray-200 text-gray-600 hover:border-indigo-300 hover:text-indigo-700 transition" > rappers </a> </div> </div> </div> </div> </main> <footer class="bg-gradient-to-b from-gray-50 to-white border-t border-gray-200"> <div class="max-w-6xl mx-auto px-4 pt-8 pb-6"> <div class="grid grid-cols-2 md:grid-cols-12 gap-8 mb-6"> <div class="col-span-2 md:col-span-4"> <a href="https://namehub.ngrok.app/en" class="inline-flex items-center gap-2 mb-4"> <div class="w-9 h-9 rounded-xl bg-gradient-to-br from-indigo-500 via-violet-600 to-fuchsia-600 flex items-center justify-center shadow-md"> <span class="text-white font-bold text-lg">N</span> </div> <span class="text-lg font-bold text-gray-900">NameHub</span> </a> <p class="text-sm text-gray-600 leading-relaxed mb-4 max-w-sm">A growing database of first names and surnames with origins, meanings, and stories from cultures around the world.</p> <div class="flex items-center gap-3"> <a href="https://buy.stripe.com/6oU5kE6OM1ct0g35ed7Zu00" target="_blank" rel="noopener" class="inline-flex items-center gap-1.5 px-3 py-1.5 bg-rose-50 hover:bg-rose-100 border border-rose-200 hover:border-rose-300 rounded-full text-xs font-bold text-rose-700 transition"> <svg class="w-3.5 h-3.5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg> Donate </a> </div> </div> <div class="md:col-span-3"> <h3 class="text-xs font-bold uppercase tracking-wider text-gray-500 mb-4">Discover</h3> <ul class="space-y-2.5 text-sm"> <li><a href="https://namehub.ngrok.app/en/names" class="text-gray-700 hover:text-indigo-700 transition">Names</a></li> <li><a href="https://namehub.ngrok.app/en/names/list" class="text-gray-700 hover:text-indigo-700 transition">By origin</a></li> <li><a href="https://namehub.ngrok.app/en/top" class="text-gray-700 hover:text-indigo-700 transition">Popular Names</a></li> <li><a href="https://namehub.ngrok.app/en/namesakes" class="text-gray-700 hover:text-indigo-700 transition">Namesakes</a></li> <li><a href="https://namehub.ngrok.app/en/glossary" class="text-gray-700 hover:text-indigo-700 transition">Glossary</a></li> </ul> </div> <div class="md:col-span-2"> <h3 class="text-xs font-bold uppercase tracking-wider text-gray-500 mb-4">Tools</h3> <ul class="space-y-2.5 text-sm"> <li><a href="https://namehub.ngrok.app/en/name-combiner" class="text-gray-700 hover:text-indigo-700 transition">Combine Your Names</a></li> <li><a href="https://namehub.ngrok.app/en/names/random" class="text-gray-700 hover:text-indigo-700 transition">Baby Name Generator</a></li> <li><a href="https://namehub.ngrok.app/en/family-tree" class="text-gray-700 hover:text-indigo-700 transition">Family Tree</a></li> <li><a href="https://namehub.ngrok.app/en/members" class="text-gray-700 hover:text-indigo-700 transition">Members</a></li> </ul> </div> <div class="md:col-span-3"> <h3 class="text-xs font-bold uppercase tracking-wider text-gray-500 mb-4">Resources</h3> <ul class="space-y-2.5 text-sm"> <li><a href="https://namehub.ngrok.app/en/pages" class="text-gray-700 hover:text-indigo-700 transition">Articles</a></li> <li><a href="https://namehub.ngrok.app/en/contact" class="text-gray-700 hover:text-indigo-700 transition">Contact</a></li> <li><a href="https://namehub.ngrok.app/en/pricing" class="text-gray-700 hover:text-indigo-700 transition">Pricing</a></li> <li> <a href="https://surnames.namehub.info/en/names" class="inline-flex items-center gap-1 text-gray-700 hover:text-indigo-700 transition"> Surnames <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"/></svg> </a> </li> </ul> </div> </div> <div class="pt-6 border-t border-gray-200"> <div class="flex flex-col md:flex-row justify-between items-center gap-4 text-sm"> <div class="text-gray-500"> &copy; 2026 NameHub. All rights reserved. </div> <nav class="flex flex-wrap items-center gap-x-6 gap-y-2 text-gray-500"> <a href="https://namehub.ngrok.app/en/page/privacy-policy" class="hover:text-indigo-700 transition">Privacy Policy</a> <a href="https://namehub.ngrok.app/en/page/terms-of-service" class="hover:text-indigo-700 transition">Terms of Service</a> </nav> </div> </div> </div> </footer> <div class="js-cookie-consent cookie-consent fixed bottom-0 inset-x-0 z-50 p-4"> <div class="max-w-3xl mx-auto"> <div class="bg-white rounded-2xl shadow-2xl border border-gray-200 px-6 py-5 flex flex-col sm:flex-row items-start sm:items-center gap-4"> <div class="flex items-start gap-3 flex-1"> <div class="w-10 h-10 rounded-xl bg-indigo-100 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-5 h-5 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 8v4m0 4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/></svg> </div> <div> <p class="text-sm font-medium text-gray-800 mb-0.5">We use cookies</p> <p class="text-xs text-gray-500">We use essential cookies to make NameHub work. We'd also like to set analytics cookies to understand how you use the site. <a href="https://namehub.ngrok.app/en/page/privacy-policy" class="text-indigo-600 hover:underline">Privacy Policy</a></p> </div> </div> <div class="flex items-center gap-2 shrink-0"> <button class="js-cookie-consent-agree cookie-consent__agree cursor-pointer px-5 py-2 bg-indigo-600 text-white text-sm font-medium rounded-lg hover:bg-indigo-700 transition"> Accept </button> <button onclick="document.querySelector('.js-cookie-consent').style.display='none'" class="cursor-pointer px-5 py-2 bg-gray-100 text-gray-600 text-sm font-medium rounded-lg hover:bg-gray-200 transition"> Decline </button> </div> </div> </div> </div> <script> window.laravelCookieConsent = (function () { const COOKIE_VALUE = 1; const COOKIE_DOMAIN = 'namehub.ngrok.app'; function consentWithCookies() { setCookie('laravel_cookie_consent', COOKIE_VALUE, 7300); hideCookieDialog(); } function cookieExists(name) { return (document.cookie.split('; ').indexOf(name + '=' + COOKIE_VALUE) !== -1); } function hideCookieDialog() { const dialogs = document.getElementsByClassName('js-cookie-consent'); for (let i = 0; i < dialogs.length; ++i) { dialogs[i].style.display = 'none'; } } function setCookie(name, value, expirationInDays) { const date = new Date(); date.setTime(date.getTime() + (expirationInDays * 24 * 60 * 60 * 1000)); document.cookie = name + '=' + value + ';expires=' + date.toUTCString() + ';domain=' + COOKIE_DOMAIN + ';path=/' + ';samesite=lax'; } if (cookieExists('laravel_cookie_consent')) { hideCookieDialog(); } const buttons = document.getElementsByClassName('js-cookie-consent-agree'); for (let i = 0; i < buttons.length; ++i) { buttons[i].addEventListener('click', consentWithCookies); } return { consentWithCookies: consentWithCookies, hideCookieDialog: hideCookieDialog }; })(); </script> <script> document.getElementById('mobile-menu-btn')?.addEventListener('click', function() { document.getElementById('mobile-menu')?.classList.toggle('hidden'); document.getElementById('mobile-lang-menu')?.classList.add('hidden'); }); document.getElementById('mobile-lang-btn')?.addEventListener('click', function(e) { e.stopPropagation(); document.getElementById('mobile-lang-menu')?.classList.toggle('hidden'); document.getElementById('mobile-menu')?.classList.add('hidden'); }); document.getElementById('lang-switcher-btn')?.addEventListener('click', function(e) { e.stopPropagation(); document.getElementById('lang-switcher-menu')?.classList.toggle('hidden'); document.getElementById('tools-dropdown-menu')?.classList.add('hidden'); }); document.getElementById('tools-dropdown-btn')?.addEventListener('click', function(e) { e.stopPropagation(); document.getElementById('tools-dropdown-menu')?.classList.toggle('hidden'); document.getElementById('lang-switcher-menu')?.classList.add('hidden'); }); document.getElementById('profile-dropdown-btn')?.addEventListener('click', function(e) { e.stopPropagation(); document.getElementById('profile-dropdown-menu')?.classList.toggle('hidden'); document.getElementById('lang-switcher-menu')?.classList.add('hidden'); }); document.getElementById('auth-dropdown-btn')?.addEventListener('click', function(e) { e.stopPropagation(); document.getElementById('auth-dropdown-menu')?.classList.toggle('hidden'); document.getElementById('lang-switcher-menu')?.classList.add('hidden'); }); document.addEventListener('click', function() { document.getElementById('lang-switcher-menu')?.classList.add('hidden'); document.getElementById('tools-dropdown-menu')?.classList.add('hidden'); document.getElementById('profile-dropdown-menu')?.classList.add('hidden'); document.getElementById('auth-dropdown-menu')?.classList.add('hidden'); document.getElementById('mobile-lang-menu')?.classList.add('hidden'); }); </script> <script> (function() { const toggle = document.getElementById('header-search-toggle'); const box = document.getElementById('header-search-box'); const input = document.getElementById('header-search-input'); const results = document.getElementById('header-search-results'); if (!toggle) return; const noNamesText = "No names found"; const currentLocale = "en"; const headerSpinner = document.getElementById('header-search-spinner'); const setLoading = (on) => headerSpinner?.classList.toggle('hidden', !on); let timeout; toggle.addEventListener('click', function(e) { e.stopPropagation(); box.classList.toggle('hidden'); if (!box.classList.contains('hidden')) { input.focus(); } }); input?.addEventListener('input', function() { clearTimeout(timeout); const q = this.value.trim(); if (q.length < 2) { results.innerHTML = ''; setLoading(false); return; } setLoading(true); timeout = setTimeout(async () => { const requestedQuery = q; let names; try { const res = await fetch(`https://namehub.ngrok.app/api/names/search?q=${encodeURIComponent(q)}`); names = await res.json(); } catch (_) { names = []; } if (input.value.trim() !== requestedQuery) return; setLoading(false); const genderColors = { m: 'bg-sky-100 text-sky-600', f: 'bg-rose-100 text-rose-600', mf: 'bg-amber-100 text-amber-600' }; const genderLabels = { m: 'M', f: 'F', mf: 'M&F' }; if (names.length === 0) { results.innerHTML = '<div class="px-4 py-3 text-sm text-gray-400">' + noNamesText + '</div>'; } else { results.innerHTML = names.map(n => { const gc = genderColors[n.gender] || 'bg-gray-100 text-gray-500'; const gl = genderLabels[n.gender] || ''; const usages = n.usages ? `<div class="text-[11px] text-gray-400 truncate">${n.usages}</div>` : ''; return `<a href="/${currentLocale}/name/${n.slug}" class="flex items-center gap-3 px-4 py-2 hover:bg-indigo-50 transition border-b border-gray-50 last:border-0"> <div class="w-8 h-8 rounded-full ${gc} flex items-center justify-center font-bold text-[10px] shrink-0">${gl || n.name.charAt(0)}</div> <div class="min-w-0 flex-1 overflow-hidden"> <div class="text-sm font-medium text-gray-800 truncate">${n.name}</div> ${usages} </div> </a>`; }).join(''); } }, 250); }); input?.addEventListener('keydown', function(e) { if (e.key === 'Escape') { box.classList.add('hidden'); results.innerHTML = ''; } }); document.addEventListener('click', function(e) { if (!document.getElementById('header-search-wrapper')?.contains(e.target)) { box?.classList.add('hidden'); } }); })(); </script> <div x-data="aiChatWidget({ isAuth: false, balanceCents: 0, balancePct: 100, maxLength: 200, userKey: 'guest', streamUrl: 'https://namehub.ngrok.app/api/chat/stream', loginUrl: 'https://namehub.ngrok.app/login', topUpUrl: 'https://namehub.ngrok.app/en/ai-pricing', csrf: 'bHP86EnFcaJGaoK49vh0g0veBVerEAD5rXT7NefP', i18n: { outOfCreditTitle: 'Out of AI credit', outOfCreditBody: 'You have used all your AI credit. Top up to keep chatting.', topupButton: 'Add credit', loginRequiredTitle: 'Login required', loginRequiredBody: 'Please log in to use the AI chat.', blockedTitle: 'Account blocked from AI', blockedBody: 'This account is blocked from using the AI chat. Contact support if you believe this is a mistake.', verifyEmailTitle: 'Verify your email', verifyEmailBody: 'Please confirm your email address to start using the AI chat.', verifyEmailButton: 'Verify email', verifyEmailResend: 'Resend verification link', verifyEmailResent: 'Verification link sent \u2014 check your inbox.', errorGeneric: 'Something went wrong. Please try again.', errorRateLimited: 'Too many requests. Please slow down.', }, })" class="fixed bottom-4 right-4 z-[60]" role="region" aria-label="Ask AI" > <button type="button" @click="toggle" x-show="!open" class="group flex items-center gap-2 rounded-full bg-indigo-600 px-4 py-3 text-white shadow-lg shadow-indigo-500/30 hover:bg-indigo-700 transition" :aria-label="'Open chat'" > <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.86 9.86 0 0 1-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/> </svg> <span class="font-semibold text-sm">Ask AI</span> </button> <template x-if="mounted"> <div x-show="open" x-transition:enter="transition ease-out duration-150" x-transition:enter-start="opacity-0 translate-y-2" x-transition:enter-end="opacity-100 translate-y-0" class="flex flex-col w-[min(380px,calc(100vw-2rem))] h-[min(560px,calc(100vh-2rem))] rounded-2xl bg-white shadow-2xl ring-1 ring-black/10 overflow-hidden" x-cloak > <div class="flex items-center justify-between px-4 py-3 bg-gradient-to-br from-indigo-600 to-violet-600 text-white"> <div class="min-w-0 flex-1 mr-2"> <p class="font-semibold text-sm">Ask AI</p> <div x-show="isAuth" :title="balanceTooltip" class="mt-1.5 cursor-help w-full h-1 rounded-full bg-white/20 overflow-hidden"> <div class="h-full bg-white transition-all" :style="`width: ${balancePct}%`"></div> </div> </div> <div class="flex items-center gap-1"> <button x-show="hasHistory" @click="newConversation" class="rounded-lg p-1 hover:bg-white/10" :title="'Start new conversation'" :aria-label="'Start new conversation'" > <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z" transform="rotate(0)"/> </svg> </button> <button @click="toggle" class="rounded-lg p-1 hover:bg-white/10" :aria-label="'Close chat'"> <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </div> <div class="flex-1 overflow-y-auto overscroll-contain touch-pan-y px-3 py-4 space-y-3 bg-gray-50" x-ref="messages"> <template x-if="messages.length === 0"> <div class="text-center text-gray-500 text-sm pt-4"> <p>Ask anything about names — meanings, origins, popularity.</p> </div> </template> <template x-for="(msg, idx) in messages" :key="idx"> <div :class="msg.role === 'user' ? 'flex justify-end' : 'flex justify-start'" :data-msg-role="msg.role"> <div :class="msg.role === 'user' ? 'max-w-[80%] bg-indigo-600 text-white rounded-2xl rounded-br-sm px-3 py-2 text-sm' : 'max-w-[80%] bg-white ring-1 ring-black/5 text-gray-800 rounded-2xl rounded-bl-sm px-3 py-2 text-sm prose prose-sm max-w-none'" x-html="msg.role === 'user' ? escapeHtml(msg.content) : renderMarkdown(msg.content)" ></div> </div> </template> <div x-show="status" x-ref="statusPill" class="flex justify-start"> <div class="bg-white ring-1 ring-black/5 rounded-2xl px-3 py-2 text-sm text-gray-500 italic flex items-center gap-2"> <span class="inline-block w-2 h-2 bg-indigo-500 rounded-full animate-pulse"></span> <span x-text="status"></span> </div> </div> <div x-show="pendingSpacerPx > 0" :style="`height: ${pendingSpacerPx}px`" aria-hidden="true"></div> <div x-show="blocker" class="rounded-xl bg-amber-50 border border-amber-200 p-3 text-sm"> <p class="font-semibold text-amber-900" x-text="blocker?.title"></p> <p class="text-amber-800 mt-1" x-text="blocker?.body"></p> <div class="mt-2 flex flex-wrap gap-2"> <a x-show="blocker?.cta && blocker?.url" :href="blocker?.url" class="inline-block px-3 py-1.5 bg-amber-600 text-white text-xs font-semibold rounded-lg hover:bg-amber-700"> <span x-text="blocker?.cta"></span> </a> <button x-show="blocker?.secondaryAction === 'resend_verification'" @click="resendVerification" :disabled="resendBusy" class="inline-block px-3 py-1.5 bg-white border border-amber-600 text-amber-700 text-xs font-semibold rounded-lg hover:bg-amber-50 disabled:opacity-60"> <span x-text="resendBusy ? '…' : i18n.verifyEmailResend"></span> </button> </div> </div> </div> <form @submit.prevent="send" class="border-t border-gray-200 px-2 pt-2 pb-1 bg-white"> <div class="flex gap-2"> <input type="text" x-model="draft" :placeholder="'Type your question\u2026'" :disabled="busy" :maxlength="maxLength" class="flex-1 rounded-xl border border-gray-200 px-3 py-2 text-sm focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 disabled:bg-gray-100" > <button type="submit" :disabled="busy || draft.trim() === '' || draft.length > maxLength" class="rounded-xl bg-indigo-600 px-3 py-2 text-white text-sm font-semibold hover:bg-indigo-700 disabled:opacity-50 disabled:cursor-not-allowed" > Send </button> </div> <div class="text-[10px] text-right pr-1 mt-0.5 select-none" :class="draft.length > maxLength * 0.9 ? 'text-amber-600' : 'text-gray-400'"> <span x-text="draft.length"></span>/<span x-text="maxLength"></span> </div> </form> </div> </template> </div> </body> </html>