CINXE.COM

Threepeat word game - OneLook

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Gabarito:wght@400..900&family=Montserrat:wght@200;400;500&display=swap" rel="stylesheet"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-KCYRT3J03G"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-KCYRT3J03G'); gtag('config', 'AW-1072671259'); </script> <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png"> <link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png"> <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png"> <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png"> <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png"> <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png"> <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png"> <link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png"> <link rel="manifest" href="/manifest.json"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileImage" content="/mstile-144x144.png"> <meta name="theme-color" content="#ffffff"> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="/ol2.css?v=25"> <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" /> <title>Threepeat word game - OneLook</title> <meta name="description" content="A powerful dictionary, thesaurus, and comprehensive word-finding tool."> <link rel="canonical" href="https://www.onelook.com/?w=threepeat1" /> <meta property="og:title" content="Threepeat: Three words, three rounds." /> <meta property="og:type" content="website" /> <meta property="og:url" content="https://onelook.com/threepeat" /> <meta property="og:image" content="https://onelook.com/threepeat/threepeat1400.png" /> <meta property="og:description" content="A daily word game from OneLook in which you complete three words at a time." /> <meta property="og:site_name" content="Threepeat" /> <meta property="og:locale" content="en_US" /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Threepeat: Three words, three rounds." /> <meta namey="twitter:description" content="A daily word game from OneLook in which you complete three words at a time." /> <meta name="twitter:image" content="https://onelook.com/threepeat/threepeat1400.png" /> <link rel="stylesheet" href="/threepeat/tp.css?6"><script> function init() {} </script> <style> a:hover { text-decoration: bold; color: #FF0000; } a:active { text-decoration: bold; color: #FF0000; } </style> </head> <body> <center><br><img id="titleimage" src="/threepeat/threepeat1400.png" alt="threepeat logo"><br> <div id="threepeat"></div> <div id="beacon"></div> <script src="/threepeat/libs/confettisplosion.js?4"></script> <script src="/threepeat/tp.js?8"></script> <script> const threepeat = new Threepeat("#threepeat"); function subtractOneDay(dateStr) { // Parse the input date string as a UTC date const date = new Date(`${dateStr}T00:00:00Z`); if (isNaN(date.getTime())) { return null; } date.setUTCDate(date.getUTCDate() - 1); const year = date.getUTCFullYear(); const month = String(date.getUTCMonth() + 1).padStart(2, '0'); const day = String(date.getUTCDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } const doConfetti = (tries, finalTries=0)=>{ if (finalTries == 3) { confettiSplosion.start(); } else if (tries == 1) { confettiSplosion.start(10); } } const resetSelectMenu = function () { const selectMenu = document.getElementById('gameid-select'); if (!selectMenu) return; let state = null; let nextGameId = null; // return the next game to play, the latest ID that is not yet finished try { state = JSON.parse(localStorage.threepeat); } catch (e) {} if (state && state.games) { for (let i = 0; i < selectMenu.options.length; i++) { const option = selectMenu.options[i]; const value = option.value; if (!option.text.endsWith("✓")) { if (state.games.hasOwnProperty(value)) { option.classList.add("gameid-done"); // this doesn't seem to work? option.textContent = option.text + " ✓"; } else { if (!nextGameId || value > nextGameId) { nextGameId = value; } if (state.games.hasOwnProperty(value + ".1")) { option.textContent = option.text + " ⏳"; } } } } } return nextGameId; } const start = function (gamesData) { threepeat .on("roundend", (round, stats, gameData)=>{ if (round < 3) { const tries = stats.tries[round] + stats.hints[round];; const time_secs = stats.times[round] + 60*stats.hints[round]; let gameid = gameData.game_id; let suffixes = gameData.puzzles[round].suffixes.join(","); const hintMessage = document.getElementById('tproundmessage'); if (hintMessage) { hintMessage.innerHTML = ""; } let prefix = gameData.puzzles[round].prefix; fetch(`/img/0.gif?x=threepeat_round&gameid=${gameid}&round=${round}&suffixes=${suffixes}&prefix=${prefix}&time=${time_secs}&guesses=${tries}&exp=31`, {method: "HEAD"}).then(()=>doConfetti(tries)); } }) .on("gameend", (round, stats, gameData)=>{ const tries = stats.tries[round]; const finalTries = stats.tries.reduce((s,v)=>s+v); doConfetti(tries, finalTries); resetSelectMenu(); }) .on("roundstart", (gameId, round, gameData)=>{ const hintMessage = document.getElementById('tproundmessage'); if (31 >= 0 && hintMessage && gameData && gameData.messages && gameData.messages.length > round && gameData.messages[round]) { hintMessage.innerHTML = "<br>Cryptic clue: <i>" + gameData.messages[round] + "</i><br>"; } }) .on("nextgame", (gameId)=> { let nextGameId = resetSelectMenu(); if (!nextGameId) { console.log(gameId); nextGameId = subtractOneDay(gameId); } let url = nextGameId ? `https://onelook.com/threepeat/${nextGameId}` : `https://onelook.com/threepeat`; window.location.href = url; }) .start(gamesData); // Show cryptic clue immediately for the first round if it's not filled in already const hintMessage = document.getElementById('tproundmessage'); let gameData = gamesData[0]; if (31 >= 0 && hintMessage && !hintMessage.innerHTML && gameData && gameData.messages && gameData.messages.length > 0 && gameData.messages[0]) { hintMessage.innerHTML = "Cryptic clue: <i>" + gameData.messages[0] + "</i>"; } } // Archive dropdown $(function() { const selectMenu = document.getElementById('gameid-select'); if (selectMenu) { selectMenu.addEventListener('change', function() { const selectedGameId = selectMenu.value; window.location.href = `https://onelook.com/threepeat/${encodeURIComponent(selectedGameId)}`; }); resetSelectMenu(); } start([{"puzzles": [{"suffixes": ["___oe", "___did", "___nibal"], "prefix": "can", "valid_words": ["canoe", "misdid", "mahoe", "fordid", "cannibal", "shmoe", "sordid", "throe", "outdid", "candid", "pekoe", "ixodid", "cohoe"], "definitions": {"canoe": "Small boat, paddled by humans.", "candid": "Open, honest, without hidden motives.", "cannibal": "Eats flesh of its own."}}, {"suffixes": ["__tivity", "__usea", "__sty"], "prefix": "na", "valid_words": ["nativity", "musty", "zesty", "rusty", "tasty", "pasty", "motivity", "nasty", "fusty", "dusty", "testy", "activity", "busty", "nausea", "hasty", "vasty", "lusty", "gusty", "pesty", "misty"], "definitions": {"nativity": "Birth of Jesus Christ depicted.", "nausea": "Unpleasant sensation, urge to vomit.", "nasty": "Disgusting, unpleasant, offensive in nature."}}, {"suffixes": ["___er", "___ter", "___itude"], "prefix": "lat", "valid_words": ["sober", "doser", "steer", "venter", "saber", "ormer", "ceder", "never", "wader", "fetter", "ricer", "coyer", "dozer", "mister", "liner", "halter", "carter", "ofter", "caster", "hatter", "dimer", "wester", "sneer", "foyer", "laver", "biner", "mutter", "truer", "sheer", "kelter", "tetter", "mover", "rover", "liber", "sinter", "skier", "emeer", "attitude", "gater", "oyster", "tauter", "lader", "curter", "lister", "hewer", "meter", "nutter", "liver", "wryer", "ouster", "neater", "boater", "nester", "rager", "witter", "footer", "payer", "touter", "suiter", "nuder", "uniter", "haver", "hater", "oater", "egger", "fewer", "abater", "baker", "luger", "titter", "viler", "apter", "watter", "copter", "esker", "icier", "biker", "deter", "elater", "bitter", "loser", "caper", "welter", "smiter", "dater", "doper", "amber", "rimer", "siker", "airer", "laser", "aimer", "tweer", "laster", "finitude", "cryer", "cooer", "fumer", "dafter", "infer", "toker", "darer", "darter", "pryer", "voter", "irater", "raker", "lacer", "lamer", "elver", "wanter", "direr", "sifter", "leper", "seder", "dotter", "hitter", "gomer", "sayer", "writer", "meeter", "wirer", "taster", "yarer", "borer", "ratter", "muter", "emoter", "porter", "paler", "niter", "gazer", "luster", "duster", "xyster", "super", "sexer", "hiker", "river", "kilter", "tuber", "layer", "krater", "comer", "miter", "puler", "fixer", "laker", "pewter", "gayer", "moper", "getter", "triter", "emmer", "liker", "milter", "altitude", "taper", "inter", "suber", "cyber", "saker", "giber", "leger", "fluter", "molter", "goner", "falter", "hotter", "coper", "water", "natter", "filer", "gaiter", "letter", "toner", "zoner", "renter", "lager", "pater", "matter", "scoter", "saner", "petter", "huger", "hefter", "hoper", "teeter", "noter", "mater", "haler", "pager", "pouter", "cooter", "toyer", "ruler", "sager", "ulster", "siver", "hyper", "icker", "armer", "couter", "jager", "heder", "fiber", "brier", "udder", "ureter", "muster", "asper", "lover", "baster", "anger", "niner", "roster", "flier", "waxer", "piker", "laxer", "oiler", "sever", "taker", "jiber", "sweer", "wrier", "adder", "idler", "pawer", "agger", "plater", "eager", "souter", "merer", "zoster", "putter", "hooter", "center", "faker", "ither", "giver", "parer", "waker", "tufter", "fader", "waster", "carer", "urger", "vomer", "pester", "tester", "japer", "slater", "twier", "caver", "quoter", "fatter", "waler", "slyer", "hurter", "drier", "feyer", "defter", "diver", "garter", "ocher", "owner", "colter", "keyer", "grater", "hinter", "cider", "palter", "jolter", "auger", "faster", "tamer", "aster", "newer", "roger", "easer", "mooter", "mower", "hoser", "upper", "muser", "toter", "better", "maker", "raver", "hauter", "patter", "hirer", "rifer", "wetter", "master", "slier", "farer", "lifter", "iller", "refer", "luxer", "hider", "shier", "under", "loiter", "coster", "queer", "taber", "lifer", "abler", "hover", "namer", "frier", "miser", "easter", "pelter", "gager", "miler", "cower", "perter", "wooer", "zester", "fifer", "riser", "power", "bower", "paster", "wager", "elder", "maser", "dower", "heater", "vower", "jitter", "liger", "inner", "sower", "butter", "fiver", "miner", "latter", "tiler", "buster", "tenter", "offer", "aiver", "frater", "viper", "fester", "goiter", "liter", "tawer", "baser", "peter", "joker", "defer", "vexer", "homer", "umber", "tuyer", "cover", "gaper", "wafter", "wiver", "cyder", "hayer", "ameer", "beater", "parter", "powter", "flyer", "skater", "rarer", "acuter", "sorter", "sizer", "lower", "linter", "saver", "dryer", "wiper", "plyer", "coder", "diner", "wafer", "fitter", "litter", "curer", "minter", "weber", "buyer", "seater", "prier", "tinter", "hazer", "ogler", "titer", "tooter", "firer", "totter", "canter", "texter", "lefter", "hafter", "raster", "ester", "rotter", "taler", "bluer", "coater", "setter", "cutter", "wider", "rioter", "bruter", "crater", "piper", "jotter", "poster", "solitude", "wiser", "router", "odder", "sawer", "mimer", "latitude", "fryer", "cager", "banter", "baiter", "tater", "vetter", "alder", "waiter", "mixer", "barter", "yager", "tuner", "softer", "netter", "timer", "poker", "rater", "whiter", "sorer", "mazer", "honer", "doter", "cater", "neuter", "gunter", "purer", "cuber", "pacer", "melter", "jilter", "osier", "dieter", "diker", "cotter", "barer", "rester", "stater", "tarter", "tatter", "dicer", "gluer", "taxer", "foster", "other", "citer", "omber", "surer", "macer", "looter", "dexter", "edger", "rooter", "tilter", "ranter", "sixer", "bayer", "ruder", "ember", "rafter", "rider", "salter", "aptitude", "inker", "gamer", "order", "enter", "older", "razer", "gutter", "cheer", "caber", "rower", "duper", "facer", "ether", "spier", "kiter", "batter", "rawer", "roper", "ocker", "gaster", "jiver", "loper", "corer", "otter", "yatter", "yester", "finer", "freer", "cuter", "boxer", "nicer", "filter", "ender", "punter", "baler", "lurer", "bunter", "winter", "serer", "paper", "sewer", "feater", "toper", "oxter", "eater", "prater", "caner", "hunter", "usher", "juster", "crier", "raper", "boner", "aider", "asker", "bolter", "racer", "later", "poler", "hexer", "fever", "speer", "plier", "habitude", "paver", "ritter", "twyer", "poser", "vaster", "tower", "fleer", "utter", "belter", "riper", "sitter", "jester", "ulcer", "lotter", "bider", "lever", "epater", "sister", "eider", "shoer", "waver", "bister", "trier", "biter", "safer", "potter", "tiger", "after", "outer", "loner", "shyer", "alter", "lofter", "gofer", "raser"], "definitions": {"later": "Subsequent to the present time.", "latter": "Second of two mentioned things.", "latitude": "Measures north-south position globally."}}], "game_id": "2025-04-08", "messages": ["\"Row, reveal, then dine.\"", "\"Beginnings beget bile and bitterness.\"", "Time, second, global measure."]} ]); }); </script> <br><select name='gameid' id='gameid-select'> <option SELECTED value='2025-04-08'>April 8, 2025</option> <option value='2025-04-07'>April 7, 2025</option> <option value='2025-04-06'>April 6, 2025</option> <option value='2025-04-05'>April 5, 2025</option> <option value='2025-04-04'>April 4, 2025</option> <option value='2025-04-03'>April 3, 2025</option> <option value='2025-04-02'>April 2, 2025</option> <option value='2025-04-01'>April 1, 2025</option> <option value='2025-03-31'>March 31, 2025</option> <option value='2025-03-30'>March 30, 2025</option> <option value='2025-03-29'>March 29, 2025</option> <option value='2025-03-28'>March 28, 2025</option> <option value='2025-03-27'>March 27, 2025</option> <option value='2025-03-26'>March 26, 2025</option> <option value='2025-03-25'>March 25, 2025</option> <option value='2025-03-24'>March 24, 2025</option> <option value='2025-03-23'>March 23, 2025</option> <option value='2025-03-22'>March 22, 2025</option> <option value='2025-03-21'>March 21, 2025</option> <option value='2025-03-20'>March 20, 2025</option> <option value='2025-03-19'>March 19, 2025</option> <option value='2025-03-18'>March 18, 2025</option> <option value='2025-03-17'>March 17, 2025</option> <option value='2025-03-16'>March 16, 2025</option> <option value='2025-03-15'>March 15, 2025</option> <option value='2025-03-14'>March 14, 2025</option> <option value='2025-03-13'>March 13, 2025</option> <option value='2025-03-12'>March 12, 2025</option> <option value='2025-03-11'>March 11, 2025</option> <option value='2025-03-10'>March 10, 2025</option> <option value='2025-03-09'>March 9, 2025</option> <option value='2025-03-08'>March 8, 2025</option> <option value='2025-03-07'>March 7, 2025</option> <option value='2025-03-06'>March 6, 2025</option> <option value='2025-03-05'>March 5, 2025</option> <option value='2025-03-04'>March 4, 2025</option> <option value='2025-03-03'>March 3, 2025</option> <option value='2025-03-02'>March 2, 2025</option> <option value='2025-03-01'>March 1, 2025</option> <option value='2025-02-28'>February 28, 2025</option> <option value='2025-02-27'>February 27, 2025</option> <option value='2025-02-26'>February 26, 2025</option> <option value='2025-02-25'>February 25, 2025</option> <option value='2025-02-24'>February 24, 2025</option> <option value='2025-02-23'>February 23, 2025</option> <option value='2025-02-22'>February 22, 2025</option> <option value='2025-02-21'>February 21, 2025</option> <option value='2025-02-20'>February 20, 2025</option> <option value='2025-02-19'>February 19, 2025</option> <option value='2025-02-18'>February 18, 2025</option> <option value='2025-02-17'>February 17, 2025</option> <option value='2025-02-16'>February 16, 2025</option> <option value='2025-02-15'>February 15, 2025</option> <option value='2025-02-14'>February 14, 2025</option> <option value='2025-02-13'>February 13, 2025</option> <option value='2025-02-12'>February 12, 2025</option> <option value='2025-02-11'>February 11, 2025</option> <option value='2025-02-10'>February 10, 2025</option> <option value='2025-02-09'>February 9, 2025</option> <option value='2025-02-08'>February 8, 2025</option> <option value='2025-02-07'>February 7, 2025</option> <option value='2025-02-06'>February 6, 2025</option> <option value='2025-02-05'>February 5, 2025</option> <option value='2025-02-04'>February 4, 2025</option> <option value='2025-02-03'>February 3, 2025</option> <option value='2025-02-02'>February 2, 2025</option> <option value='2025-02-01'>February 1, 2025</option> <option value='2025-01-31'>January 31, 2025</option> <option value='2025-01-30'>January 30, 2025</option> <option value='2025-01-29'>January 29, 2025</option> <option value='2025-01-28'>January 28, 2025</option> <option value='2025-01-27'>January 27, 2025</option> <option value='2025-01-26'>January 26, 2025</option> <option value='2025-01-25'>January 25, 2025</option> <option value='2025-01-24'>January 24, 2025</option> <option value='2025-01-23'>January 23, 2025</option> <option value='2025-01-22'>January 22, 2025</option> <option value='2025-01-21'>January 21, 2025</option> <option value='2025-01-20'>January 20, 2025</option> <option value='2025-01-19'>January 19, 2025</option> <option value='2025-01-18'>January 18, 2025</option> <option value='2025-01-17'>January 17, 2025</option> <option value='2025-01-16'>January 16, 2025</option> <option value='2025-01-15'>January 15, 2025</option> <option value='2025-01-14'>January 14, 2025</option> <option value='2025-01-13'>January 13, 2025</option> <option value='2025-01-12'>January 12, 2025</option> <option value='2025-01-11'>January 11, 2025</option> <option value='2025-01-10'>January 10, 2025</option> <option value='2025-01-09'>January 9, 2025</option> <option value='2025-01-08'>January 8, 2025</option> <option value='2025-01-07'>January 7, 2025</option> <option value='2025-01-06'>January 6, 2025</option> <option value='2025-01-05'>January 5, 2025</option> <option value='2025-01-04'>January 4, 2025</option> <option value='2025-01-03'>January 3, 2025</option> <option value='2025-01-02'>January 2, 2025</option> <option value='2025-01-01'>January 1, 2025</option> <option value='2024-12-31'>December 31, 2024</option> <option value='2024-12-30'>December 30, 2024</option> <option value='2024-12-29'>December 29, 2024</option> <option value='2024-12-28'>December 28, 2024</option> <option value='2024-12-27'>December 27, 2024</option> <option value='2024-12-26'>December 26, 2024</option> <option value='2024-12-25'>December 25, 2024</option> <option value='2024-12-24'>December 24, 2024</option> <option value='2024-12-23'>December 23, 2024</option> <option value='2024-12-22'>December 22, 2024</option> <option value='2024-12-21'>December 21, 2024</option> <option value='2024-12-20'>December 20, 2024</option> <option value='2024-11-30'>November 30, 2024</option> <option value='2024-11-29'>November 29, 2024</option> </select><br><br></center><br><br><center><div id="mc_embed_shell"> <link href="//cdn-images.mailchimp.com/embedcode/classic-061523.css" rel="stylesheet" type="text/css"> <style type="text/css"> #mc_embed_signup{background:#fff; clear:left; font:12px; color: grey; font-family: sans-serif,arial,helvetica; max-width: 400px; border: 2px solid #ccf; border-radius: 10px; padding: 10px;} </style> <div id="mc_embed_signup"> <span class="logo-pre"></span> <div class="ol_logo"> <div class="ol_logo_sunburst"> <svg xmlns="http://www.w3.org/2000/svg" height="60px" viewBox="0 -1000 1000 1000" width="60px" fill="#F19E39"> <path d="M450-810v-110h60v110h-60Zm0 770v-110h60v110h-60Zm360-410v-60h110v60H810Zm-770 0v-60h110v60H40Zm702-250-43-43 66-66 43 43-66 66ZM195-151l-43-43 66-66 43 43-66 66Zm570 0-66-66 43-43 66 66-43 43ZM218-700l-66-66 43-43 66 66-43 43Zm261.82 445Q386-255 320.5-320.68 255-386.35 255-480.18q0-93.82 65.68-159.32 65.67-65.5 159.5-65.5 93.82 0 159.32 65.68 65.5 65.67 65.5 159.5 0 93.82-65.68 159.32-65.67 65.5-159.5 65.5Zm.11-60Q549-315 597-362.93q48-47.94 48-117Q645-549 597.07-597q-47.94-48-117-48Q411-645 363-597.07q-48 47.94-48 117Q315-411 362.93-363q47.94 48 117 48Zm.07-165Z"/> <circle cx="480" cy="-480" r="200" fill="#F19E39"/> </div><a href="/"><span class="ol_logo_text">OneLook</a></span></a></div> <form action="https://civicsearch.us14.list-manage.com/subscribe/post?u=072876ecccbe8f476c67f0bdc&amp;id=498249bb17&amp;f_id=00625fe5f0" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank"> <div id="mc_embed_signup_scroll">Are you enjoying OneLook's word games? Subscribe to receive an email (at most weekly) with a selection of our best puzzles from the week&mdash;like <a href="/cyj">Compound Your Joy</a>, <a href="/threepeat">Threepeat</a>, <a href="/pandergram">Pandergram</a>, and others yet to come. We'll have occasional contests, too! (Back issues are <a href="/games">here</a>.)<br><br> <div class="mc-field-group"><label for="mce-EMAIL">Email Address: </label><input type="email" name="EMAIL" class="required email" id="mce-EMAIL" required="" value=""></div> <div id="mce-responses" class="clear"> <div class="response" id="mce-error-response" style="display: none;"></div> <div class="response" id="mce-success-response" style="display: none;"></div> </div><div aria-hidden="true" style="position: absolute; left: -5000px;"><input type="text" name="b_072876ecccbe8f476c67f0bdc_498249bb17" tabindex="-1" value=""></div><div class="clear"><input type="submit" name="subscribe" id="mc-embedded-subscribe" class="button" value="Subscribe"></div> </div> </form> </div> <script type="text/javascript" src="//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js"></script> <br> <br> <a href="/">OneLook home</a> &nbsp; <a href="/thesaurus">OneLook Thesaurus</a> &nbsp; <a href="https://onelook.com/spruce">Spruce</a> &nbsp; <a href="https://onelook.com/about.shtml#feedback">Feedback</a> &nbsp; <br><br><br> </center> <style> /* Basic reset */ /* Container for the three boxes */ .games-container { font-family: "Gabarito", sans-serif; display: flex; /* Enable flex layout */ flex-wrap: wrap; /* Allow wrapping on smaller screens */ justify-content: center; /* Center the boxes horizontally */ gap: 20px; /* Space between items */ max-width: 1200px; margin: 0 auto; /* Center container in the page */ } /* Individual game box styling */ .game-box { flex: 1 1 200px; max-width: 200px; background: linear-gradient(135deg, #1c39bb, orange); border-radius: 8px; padding: 20px; color: #fff; text-align: center; box-shadow: 0 4px 6px rgba(0,0,0,0.1); display: flex; flex-direction: column; justify-content: space-between; } .game-box h2 { margin-bottom: 10px; font-size: 1.5rem; } .game-box p { margin-bottom: 20px; line-height: 1.4; } /* Button styling */ .cta-button { display: inline-block; background-color: #fff; color: #ff9800; text-decoration: none; font-weight: bold; padding: 10px 20px; border-radius: 4px; transition: background-color 0.3s, color 0.3s; } .cta-button:hover { background-color: #ff9800; color: #fff; } /* Responsive adjustments for smaller screens */ @media (max-width: 600px) { .game-box { max-width: 100%; /* Boxes will stretch to full width on small screens */ } } </style> <div class="games-container"> <!-- Threepeat Box --> <div class="game-box"> <h2>Threepeat</h2> <p> Find common ground </p> <a href="/threepeat" class="cta-button">Play Now</a> </div> <!-- Compound Your Joy Box --> <div class="game-box"> <h2>Compound Your Joy</h2> <p> Find connection </p> <a href="/cyj" class="cta-button">Play Now</a> </div> <!-- Pandergram Box --> <div class="game-box"> <h2>Pandergram</h2> <p> Foster inclusion </p> <a href="/pandergram" class="cta-button">Play Now</a> </div> </div> </center> <br> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script> function highlightWildcard(item, pattern) { if (!pattern.endsWith('*')) { pattern += '*'; } const segments = pattern.split('*'); function parseSegment(segment) { return segment.split(''); } function buildSegmentRegex(tokens) { const groupPatterns = tokens.map(ch => { if (ch === '?') { return '([A-Za-z ])'; // capturing group for 1 letter/space } else { // Escape any regex special chars in case the pattern has them const escaped = ch.replace(/[.^$|\\()[\]{}*+?]/g, '\\$&'); return '(' + escaped + ')'; } }); return new RegExp('^' + groupPatterns.join(''), 'i') } function bold(text) { return `<span class="autocomplete_bolded">${text}</span>`; } function buildInvertedSegmentMatch(tokens, matchArray) { let out = ''; for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; const actualChar = matchArray[i + 1]; // what we matched in the item if (token === '?') { out += bold(actualChar); } else { out += actualChar; } } return out; } let resultHTML = ''; let currentIndex = 0; for (const seg of segments) { if (!seg) { continue; } const tokens = parseSegment(seg); const segmentRegex = buildSegmentRegex(tokens); let matchPos = -1; let matchLength = 0; let matchArray = null; for (let startPos = currentIndex; startPos <= item.length; startPos++) { const substring = item.slice(startPos); const m = segmentRegex.exec(substring); if (m) { matchPos = startPos; matchLength = m[0].length; matchArray = m; break; } } if (matchPos === -1) { let iPos = currentIndex; // pointer into item let pPos = 0; // pointer into tokens[] while (iPos < item.length && pPos < tokens.length) { const token = tokens[pPos]; const itemChar = item[iPos]; if (token === '?') { iPos++; pPos++; } else { if (itemChar.toLowerCase() === token.toLowerCase()) { iPos++; pPos++; } else { break; } } } const matchedPrefix = item.slice(currentIndex, iPos); resultHTML += matchedPrefix; const leftover = item.slice(iPos); if (leftover) { resultHTML += `<span style="color:red;">${leftover}</span>`; } return resultHTML; } const gapText = item.slice(currentIndex, matchPos); if (gapText) { resultHTML += bold(gapText); } const matchedSegmentHTML = buildInvertedSegmentMatch(tokens, matchArray); resultHTML += matchedSegmentHTML; currentIndex = matchPos + matchLength; } const leftover = item.slice(currentIndex); if (leftover) { resultHTML += bold(leftover); } return resultHTML; } function ol(isForward, mode) { var x = $( "#olinput" ).val(); var url = "/"; if (isForward) { url = "/?w=" + encodeURIComponent(x); } else { url = "/thesaurus/"; if (x !== "") { url += "?s=" + encodeURIComponent(x); } } if (mode) { url += "&" + mode + "=1"; } if (url !== "/") { window.location.replace(url); } } $(function() { last_req = ""; const body = document.body; if (typeof(Storage) !== "undefined") { const savedTheme = localStorage.getItem('theme'); if (savedTheme) { body.className = savedTheme; } else { body.className = 'light-theme'; } } $(".darkModeToggle").click(() => { body.classList.toggle('dark-theme'); body.classList.toggle('light-theme'); if (typeof(Storage) !== "undefined") { $("#olinput").append('<img src="/img/0.gif?q=hometheme_' + body.className + '">'); localStorage.setItem('theme', body.className); } }); $( "#olinput" ).autocomplete( { minLength: 3, delay: 100, open: function(event, ui) { $('.ui-autocomplete').off('menufocus hover mouseenter mouseover'); }, select: function(event, ui) { if (ui.item.value.match("Symbols:")) { ui.item.value = $( "#thesinput").val(); return; } $('<input>').attr({ type: 'hidden', name: 'loc', value: 'home_ac_' + last_req }).appendTo('#olform'); $( "#olinput" ).val(ui.item.value); $( "#olform" ).submit(); }, source: function( request, response ) { var res = request.term.split(":"); var pattern = res[0]; var url; if (res.length > 1) { url = '//www.onelook.com/api/words?v=ol_gte2&md=d&max=10&k=ol_clue&sp=' + encodeURIComponent(res[0]) + '&ml=' + encodeURIComponent(res[1]); } else { url = '//www.onelook.com/api/sug?v=ol_gte2&k=ol_home&s=' + encodeURIComponent(request.term.replace(/[:].*/,'')); } $.ajax({ dataType: "json", type: 'GET', url: url, success: function(data) { data.push({"word": "Symbols: ? (match a letter), * (match many), // (unscramble)"}); response($.map(data, function(item) { item.word = item.word.replace(/[+]/g, ' '); var label = item.word; var definition = ""; if (item.defs && item.defs.length > 0) { var parts = item.defs[0].split("\t"); if (parts.length > 1) { definition = parts[1].trim().replace(/[_.]/g, ''); definition = definition.replace(/^:/, "→ "); // right arrow for descriptives definition = definition.length > 60 ? definition.slice(0, 60) + "..." : definition; } } return { label: label, // label is shown in the dropdown menu value: item.word, // value goes into the input box on selection highlight: (item.word === pattern ? ("<strong>" + pattern + "</strong>") : (item.word.match("Symbols:") ? item.word : highlightWildcard(item.word, pattern))), defs: definition, is_match: (item.word.toLowerCase() === pattern.toLowerCase()) }; })); } }); }}) .data("ui-autocomplete")._renderItem = function(ul, item) { var $li = $("<li>").appendTo(ul); var $word = $("<span>").html(item.highlight); // Definition on the right (in gray), but only if we have one if (item.defs) { var $def = $("<span class='definition'>").text(item.defs); if (item.is_match) { $def = $("<span class='definition definition_match'>").text(item.defs); } $li.append($word).append($def); } else { $li.append($word); } return $li; }; ; init(); }); </script> <br><br><br><br> </body></html>

Pages: 1 2 3 4 5 6 7 8 9 10