Dragopedia

Typewriter Effect

The world's largest gaggle of drag names on the internet.


Hello there Stranger

Welcome to Dragopedia, the world's largest of drag names on the internet.

Created to celebrate, preserve and share an often ephemeral part of our community, Dragopedia aims to shine a light on the behind drag names, be they , or .

Have you dreamed up a name of your own, or love one that should go in the collection? We would love to know!

Want to get involved or know more? Send us a message.

Created with love by Omega Goodwin.

Get daily Instagram posts: Dragopedia.

(function () { /* Word lists: [word, keep-out-of-animation, screen-reader label, is-emoji] */ /* First word = default (in the HTML above). Second word = where the opening animation stops. */ var WORDS = { noun: [['gaggle'], ['ensemble'], ['bussy', 1], ['dustbin'], ['powdering'], ['dumpster'], ['medley'], ['box-set'], ['masc4masc', 1], ['unraveling'], ['mince'], ['kiki'], ['wig closet'], ['house']], /* add more suggestions here ladies kisses */ what: [['creativity'], ['\uD83D\uDC85', 0, 'sass', 1], ['humour'], ['wit']], /* \uD83D\uDC85 = nail polish emoji */ a1: [['frizzy'], ['political'], ['fun'], ['pithy']], a2: [['fruity'], ['spicy'], ['wonky'], ['sassy'], ['wanky', 1], ['foamy']], a3: [['frumpy'], ['clumpy'], ['frothy'], ['plumpy']] }; var ORDER = ['noun', 'what', 'a1', 'a2', 'a3']; /* Opening animation timing (ms). "start" counts from when the About section first appears on screen. */ /* Names that rotate in the heading, in order, forever. NAME_MS = time each name stays on screen. */ var NAMES = ['Stranger', 'Pen-pal', 'Trouble', 'Lover', 'Trash-bag', '911', 'Flaming Galagh', 'Miss Steak', 'Party-girl', 'Queen', 'Pumpkin', 'Angel', 'Pineapple', 'Princess', 'Quiche']; var NAME_MS = 1200; var INTRO = { start: 2800, hold: 900, flip: 250, stagger: 700, skips: 2 }; function names(k) { return WORDS[k].map(function (o) { return o[0]; }); } function entry(k, w) { for (var i = 0; i < WORDS[k].length; i++) if (WORDS[k][i][0] === w) return WORDS[k][i]; return [w]; } function wordBtn(root, k) { return root.querySelector('.dpa-w[data-k="' + k + '"]'); } function current(root, k) { var b = wordBtn(root, k); return b ? b.querySelector('span').textContent : WORDS[k][0][0]; } function nextOf(root, k) { var L = names(k), i = L.indexOf(current(root, k)); return L[(i + 1) % L.length]; } function counter(root) { var el = root.querySelector('.dpa-count'); if (!el) return; var idx = 0, total = 1; ORDER.forEach(function (k) { var L = names(k); idx = idx * L.length + Math.max(0, L.indexOf(current(root, k))); total *= L.length; }); var b = document.createElement('b'); b.textContent = (idx + 1).toLocaleString('en-GB'); el.textContent = 'Version '; el.appendChild(b); el.appendChild(document.createTextNode(' of ' + total.toLocaleString('en-GB'))); } function show(root, k, w, animate) { var b = wordBtn(root, k); if (!b) return; var s = b.querySelector('span'), e = entry(k, w); s.textContent = w; if (e[3]) s.classList.add('is-emoji'); else s.classList.remove('is-emoji'); b.setAttribute('aria-label', 'Change word, now ' + (e[2] || w)); if (animate) { s.classList.remove('is-flip'); void s.offsetWidth; s.classList.add('is-flip'); } counter(root); } function stopIntro(root) { (root._dpaTimers || []).forEach(clearTimeout); root._dpaTimers = []; } function later(root, fn, ms) { (root._dpaTimers = root._dpaTimers || []).push(setTimeout(fn, ms)); } function spin(root) { stopIntro(root); var btn = root.querySelector('.dpa-spin'); var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; var n = reduce ? 1 : 9; if (btn) btn.classList.add('is-busy'); (function tick() { ORDER.forEach(function (k) { var L = names(k); show(root, k, L[Math.floor(Math.random() * L.length)], false); var b = wordBtn(root, k); if (b) { if (n > 1) b.classList.add('is-spinning'); else b.classList.remove('is-spinning'); } }); if (--n > 0) setTimeout(tick, 55 + (9 - n) * 12); else if (btn) btn.classList.remove('is-busy'); })(); } function runIntro(root) { if (root._dpaIntro) return; root._dpaIntro = true; ORDER.forEach(function (k, i) { later(root, function () { var cur = current(root, k), target = nextOf(root, k); var others = WORDS[k].filter(function (o) { return !o[1] && o[0] !== cur && o[0] !== target; }) .map(function (o) { return o[0]; }) .sort(function () { return Math.random() - 0.5; }); var pool = others.length >= INTRO.skips ? others : others.concat([cur]); pool.slice(0, INTRO.skips).concat([target]).forEach(function (w, n) { later(root, function () { show(root, k, w, true); }, n * INTRO.hold); }); }, INTRO.start + i * INTRO.stagger); }); later(root, function () { var btn = root.querySelector('.dpa-spin'); if (!btn) return; btn.classList.remove('is-once'); void btn.offsetWidth; btn.classList.add('is-once'); setTimeout(function () { btn.classList.remove('is-once'); }, 1000); }, INTRO.start + (ORDER.length - 1) * INTRO.stagger + INTRO.skips * INTRO.hold + INTRO.flip + 150); } function isVisible(el) { var r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0 && r.bottom > 0 && r.top < (window.innerHeight || 800); } /* Second way to spot the section coming into view (more reliable inside site builders). */ var io = ('IntersectionObserver' in window) ? new IntersectionObserver(function (list) { list.forEach(function (en) { if (en.isIntersecting) runIntro(en.target); }); }) : null; function init(root) { if (root._dpaInit) return; root._dpaInit = true; root.style.setProperty('--flip', INTRO.flip + 'ms'); ORDER.forEach(function (k) { show(root, k, current(root, k), false); }); if (io) io.observe(root); var nameEl = root.querySelector('.dpa-name'); var still = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (nameEl && !still) { var ni = 0; setInterval(function () { ni = (ni + 1) % NAMES.length; nameEl.textContent = NAMES[ni]; nameEl.classList.remove('is-flip'); void nameEl.offsetWidth; nameEl.classList.add('is-flip'); }, NAME_MS); } } function scan() { var roots = document.querySelectorAll('.dpa'); for (var i = 0; i < roots.length; i++) { init(roots[i]); if (!roots[i]._dpaIntro && isVisible(roots[i])) runIntro(roots[i]); } } /* One set of page-level listeners. Clicks are caught at the document, so they keep working */ /* even if the site builder re-creates or moves the section after this script runs. */ if (!window.__dpaBound) { window.__dpaBound = true; document.addEventListener('click', function (e) { var t = e.target && e.target.closest ? e.target : e.target.parentElement; if (!t || !t.closest) return; var w = t.closest('.dpa-w'), sp = t.closest('.dpa-spin'); if (!w && !sp) return; var root = (w || sp).closest('.dpa'); if (!root) return; init(root); root._dpaIntro = true; if (w) { stopIntro(root); var k = w.getAttribute('data-k'); show(root, k, nextOf(root, k), true); } else spin(root); }, true); /* The About section is hidden until visitors open it, so start the animation when it first appears. */ ['scroll', 'resize', 'hashchange', 'load'].forEach(function (ev) { window.addEventListener(ev, scan, { passive: true }); }); document.addEventListener('click', function () { setTimeout(scan, 400); }, true); var ticks = 0, poll = setInterval(function () { scan(); if (++ticks > 600) clearInterval(poll); }, 500); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', scan); else scan(); })();
Loading...