Module: Rcurses::EmojiPicker

Extended by:
Input
Defined in:
lib/rcurses/emoji.rb

Constant Summary collapse

CATEGORIES =
{
  "Smileys" => [
    ["๐Ÿ˜€","grin"],["๐Ÿ˜ƒ","smiley"],["๐Ÿ˜„","smile"],["๐Ÿ˜","beaming"],["๐Ÿ˜†","laughing"],
    ["๐Ÿ˜…","sweat smile"],["๐Ÿคฃ","rofl"],["๐Ÿ˜‚","joy"],["๐Ÿ™‚","slight smile"],["๐Ÿ˜‰","wink"],
    ["๐Ÿ˜Š","blush"],["๐Ÿ˜‡","innocent"],["๐Ÿฅฐ","love face"],["๐Ÿ˜","heart eyes"],["๐Ÿคฉ","starstruck"],
    ["๐Ÿ˜˜","kiss"],["๐Ÿ˜—","kissing"],["๐Ÿ˜š","kiss closed"],["๐Ÿ˜™","kiss smile"],["๐Ÿฅฒ","happy tear"],
    ["๐Ÿ˜‹","yum"],["๐Ÿ˜›","tongue"],["๐Ÿ˜œ","tongue wink"],["๐Ÿคช","zany"],["๐Ÿ˜","tongue closed"],
    ["๐Ÿค‘","money"],["๐Ÿค—","hug"],["๐Ÿคญ","hand mouth"],["๐Ÿคซ","shush"],["๐Ÿค”","thinking"],
    ["๐Ÿซก","salute"],["๐Ÿค","zipper"],["๐Ÿคจ","raised brow"],["๐Ÿ˜","neutral"],["๐Ÿ˜‘","expressionless"],
    ["๐Ÿ˜ถ","no mouth"],["๐Ÿซฅ","dotted face"],["๐Ÿ˜","smirk"],["๐Ÿ˜’","unamused"],["๐Ÿ™„","roll eyes"],
    ["๐Ÿ˜ฌ","grimace"],["๐Ÿ˜ฎโ€๐Ÿ’จ","exhale"],["๐Ÿคฅ","liar"],["๐Ÿ˜Œ","relieved"],["๐Ÿ˜”","pensive"],
    ["๐Ÿ˜ช","sleepy"],["๐Ÿคค","drool"],["๐Ÿ˜ด","sleep"],["๐Ÿ˜ท","mask"],["๐Ÿค’","sick"],
    ["๐Ÿค•","bandage"],["๐Ÿคข","nausea"],["๐Ÿคฎ","vomit"],["๐Ÿฅต","hot"],["๐Ÿฅถ","cold"],
    ["๐Ÿฅด","woozy"],["๐Ÿ˜ต","dizzy"],["๐Ÿคฏ","exploding"],["๐Ÿค ","cowboy"],["๐Ÿฅณ","party"],
    ["๐Ÿฅธ","disguise"],["๐Ÿ˜Ž","cool"],["๐Ÿค“","nerd"],["๐Ÿง","monocle"],["๐Ÿ˜•","confused"],
    ["๐Ÿซค","diagonal mouth"],["๐Ÿ˜Ÿ","worried"],["๐Ÿ™","frown"],["๐Ÿ˜ฎ","open mouth"],["๐Ÿ˜ฏ","hushed"],
    ["๐Ÿ˜ฒ","astonished"],["๐Ÿ˜ณ","flushed"],["๐Ÿฅบ","pleading"],["๐Ÿฅน","holding tears"],["๐Ÿ˜ฆ","frowning"],
    ["๐Ÿ˜ง","anguished"],["๐Ÿ˜จ","fearful"],["๐Ÿ˜ฐ","anxious"],["๐Ÿ˜ฅ","sad relief"],["๐Ÿ˜ข","cry"],
    ["๐Ÿ˜ญ","sob"],["๐Ÿ˜ฑ","scream"],["๐Ÿ˜–","confounded"],["๐Ÿ˜ฃ","persevere"],["๐Ÿ˜ž","disappointed"],
    ["๐Ÿ˜“","downcast"],["๐Ÿ˜ฉ","weary"],["๐Ÿ˜ซ","tired"],["๐Ÿฅฑ","yawn"],["๐Ÿ˜ค","triumph"],
    ["๐Ÿ˜ก","rage"],["๐Ÿ˜ ","angry"],["๐Ÿคฌ","swearing"],["๐Ÿ˜ˆ","devil smile"],["๐Ÿ‘ฟ","devil"],
    ["๐Ÿ’€","skull"],["โ˜ ๏ธ","crossbones"],["๐Ÿ’ฉ","poop"],["๐Ÿคก","clown"],["๐Ÿ‘น","ogre"],
    ["๐Ÿ‘ป","ghost"],["๐Ÿ‘ฝ","alien"],["๐Ÿค–","robot"],["๐Ÿ’‹","kiss mark"],["โค๏ธ","heart"],
    ["๐Ÿงก","orange heart"],["๐Ÿ’›","yellow heart"],["๐Ÿ’š","green heart"],["๐Ÿ’™","blue heart"],
    ["๐Ÿ’œ","purple heart"],["๐Ÿ–ค","black heart"],["๐Ÿค","white heart"],["๐ŸคŽ","brown heart"],
    ["๐Ÿ’”","broken heart"],["โค๏ธโ€๐Ÿ”ฅ","fire heart"],["๐Ÿ’•","two hearts"],["๐Ÿ’ž","revolving hearts"],
    ["๐Ÿ’“","heartbeat"],["๐Ÿ’—","growing heart"],["๐Ÿ’–","sparkling heart"],["๐Ÿ’˜","cupid"],
    ["๐Ÿ’","ribbon heart"],["๐Ÿ’Ÿ","heart decoration"],["๐Ÿซถ","heart hands"]
  ],
  "People" => [
    ["๐Ÿ‘‹","wave"],["๐Ÿคš","raised back"],["๐Ÿ–๏ธ","splayed hand"],["โœ‹","raised hand"],
    ["๐Ÿ––","vulcan"],["๐Ÿซฑ","right hand"],["๐Ÿซฒ","left hand"],["๐Ÿซณ","palm down"],["๐Ÿซด","palm up"],
    ["๐Ÿ‘Œ","ok"],["๐ŸคŒ","pinched"],["๐Ÿค","pinch"],["โœŒ๏ธ","peace"],["๐Ÿคž","crossed fingers"],
    ["๐Ÿซฐ","index thumb"],["๐ŸคŸ","love you"],["๐Ÿค˜","rock"],["๐Ÿค™","call me"],
    ["๐Ÿ‘ˆ","left point"],["๐Ÿ‘‰","right point"],["๐Ÿ‘†","up point"],["๐Ÿ–•","middle finger"],
    ["๐Ÿ‘‡","down point"],["โ˜๏ธ","index up"],["๐Ÿซต","point at viewer"],["๐Ÿ‘","thumbsup"],
    ["๐Ÿ‘Ž","thumbsdown"],["โœŠ","fist"],["๐Ÿ‘Š","punch"],["๐Ÿค›","left fist"],["๐Ÿคœ","right fist"],
    ["๐Ÿ‘","clap"],["๐Ÿ™Œ","raised hands"],["๐Ÿซถ","heart hands"],["๐Ÿ‘","open hands"],
    ["๐Ÿคฒ","palms up"],["๐Ÿค","handshake"],["๐Ÿ™","pray"],["โœ๏ธ","writing"],["๐Ÿ’ช","muscle"],
    ["๐Ÿฆพ","mechanical arm"],["๐Ÿง ","brain"],["๐Ÿ‘€","eyes"],["๐Ÿ‘๏ธ","eye"],["๐Ÿ‘…","tongue"],
    ["๐Ÿ‘„","lips"],["๐Ÿซฆ","biting lip"],["๐Ÿ‘ถ","baby"],["๐Ÿง’","child"],["๐Ÿ‘ฆ","boy"],
    ["๐Ÿ‘ง","girl"],["๐Ÿง‘","person"],["๐Ÿ‘ฑ","blond"],["๐Ÿ‘จ","man"],["๐Ÿง”","beard"],
    ["๐Ÿ‘ฉ","woman"],["๐Ÿง“","older person"],["๐Ÿ‘ด","old man"],["๐Ÿ‘ต","old woman"]
  ],
  "Animals" => [
    ["๐Ÿถ","dog"],["๐Ÿฑ","cat"],["๐Ÿญ","mouse"],["๐Ÿน","hamster"],["๐Ÿฐ","rabbit"],
    ["๐ŸฆŠ","fox"],["๐Ÿป","bear"],["๐Ÿผ","panda"],["๐Ÿปโ€โ„๏ธ","polar bear"],["๐Ÿจ","koala"],
    ["๐Ÿฏ","tiger"],["๐Ÿฆ","lion"],["๐Ÿฎ","cow"],["๐Ÿท","pig"],["๐Ÿธ","frog"],
    ["๐Ÿต","monkey"],["๐Ÿ”","chicken"],["๐Ÿง","penguin"],["๐Ÿฆ","bird"],["๐Ÿค","chick"],
    ["๐Ÿฆ†","duck"],["๐Ÿฆ…","eagle"],["๐Ÿฆ‰","owl"],["๐Ÿฆ‡","bat"],["๐Ÿบ","wolf"],
    ["๐Ÿ—","boar"],["๐Ÿด","horse"],["๐Ÿฆ„","unicorn"],["๐Ÿ","bee"],["๐Ÿ›","bug"],
    ["๐Ÿฆ‹","butterfly"],["๐ŸŒ","snail"],["๐Ÿž","ladybug"],["๐Ÿœ","ant"],["๐Ÿชฒ","beetle"],
    ["๐Ÿข","turtle"],["๐Ÿ","snake"],["๐ŸฆŽ","lizard"],["๐Ÿฆ‚","scorpion"],["๐Ÿ™","octopus"],
    ["๐Ÿฆ‘","squid"],["๐Ÿ ","fish"],["๐ŸŸ","tropical fish"],["๐Ÿก","blowfish"],["๐Ÿฌ","dolphin"],
    ["๐Ÿณ","whale"],["๐Ÿ‹","humpback"],["๐Ÿฆˆ","shark"],["๐ŸŠ","crocodile"],["๐Ÿ…","tiger2"],
    ["๐Ÿ†","leopard"],["๐Ÿฆ“","zebra"],["๐Ÿฆ","gorilla"],["๐Ÿฆง","orangutan"],["๐Ÿ˜","elephant"],
    ["๐Ÿฆ›","hippo"],["๐Ÿฆ","rhino"],["๐Ÿช","camel"],["๐Ÿซ","two hump camel"],["๐Ÿฆ’","giraffe"],
    ["๐Ÿฆ˜","kangaroo"],["๐Ÿฆฌ","bison"],["๐Ÿƒ","water buffalo"],["๐Ÿ‚","ox"],["๐Ÿ„","dairy cow"]
  ],
  "Food" => [
    ["๐ŸŽ","apple"],["๐Ÿ","pear"],["๐ŸŠ","orange"],["๐Ÿ‹","lemon"],["๐ŸŒ","banana"],
    ["๐Ÿ‰","watermelon"],["๐Ÿ‡","grapes"],["๐Ÿ“","strawberry"],["๐Ÿซ","blueberry"],["๐Ÿˆ","melon"],
    ["๐Ÿ’","cherry"],["๐Ÿ‘","peach"],["๐Ÿฅญ","mango"],["๐Ÿ","pineapple"],["๐Ÿฅฅ","coconut"],
    ["๐Ÿฅ","kiwi"],["๐Ÿ…","tomato"],["๐Ÿฅ‘","avocado"],["๐ŸŒฝ","corn"],["๐ŸŒถ๏ธ","pepper"],
    ["๐Ÿฅ’","cucumber"],["๐Ÿฅ•","carrot"],["๐Ÿง„","garlic"],["๐Ÿง…","onion"],["๐Ÿฅ”","potato"],
    ["๐Ÿž","bread"],["๐Ÿฅ","croissant"],["๐Ÿฅ–","baguette"],["๐Ÿง€","cheese"],["๐Ÿฅš","egg"],
    ["๐Ÿณ","cooking"],["๐Ÿฅž","pancakes"],["๐Ÿง‡","waffle"],["๐Ÿฅ“","bacon"],["๐Ÿ”","burger"],
    ["๐ŸŸ","fries"],["๐Ÿ•","pizza"],["๐ŸŒญ","hotdog"],["๐Ÿฅช","sandwich"],["๐ŸŒฎ","taco"],
    ["๐ŸŒฏ","burrito"],["๐Ÿซ”","tamale"],["๐Ÿฅ—","salad"],["๐Ÿ","spaghetti"],["๐Ÿœ","ramen"],
    ["๐Ÿฒ","stew"],["๐Ÿ›","curry"],["๐Ÿฃ","sushi"],["๐Ÿฑ","bento"],["๐ŸฅŸ","dumpling"],
    ["๐Ÿฉ","donut"],["๐Ÿช","cookie"],["๐ŸŽ‚","cake"],["๐Ÿฐ","shortcake"],["๐Ÿง","cupcake"],
    ["๐Ÿซ","chocolate"],["๐Ÿฌ","candy"],["๐Ÿญ","lollipop"],["๐Ÿฎ","custard"],["๐Ÿฏ","honey"],
    ["โ˜•","coffee"],["๐Ÿต","tea"],["๐Ÿงƒ","juice box"],["๐Ÿบ","beer"],["๐Ÿป","cheers"],
    ["๐Ÿฅ‚","champagne"],["๐Ÿท","wine"],["๐Ÿธ","cocktail"],["๐Ÿน","tropical drink"],["๐ŸงŠ","ice"]
  ],
  "Travel" => [
    ["๐Ÿ ","house"],["๐Ÿก","garden house"],["๐Ÿข","office"],["๐Ÿฅ","hospital"],["๐Ÿฆ","bank"],
    ["๐Ÿจ","hotel"],["๐Ÿช","store"],["๐Ÿซ","school"],["๐Ÿฌ","department store"],["๐Ÿ›๏ธ","classical"],
    ["โ›ช","church"],["๐Ÿ•Œ","mosque"],["๐Ÿ•","synagogue"],["โ›ฉ๏ธ","shinto"],["๐Ÿ•‹","kaaba"],
    ["โ›ฒ","fountain"],["๐Ÿ•๏ธ","camping"],["๐Ÿ–๏ธ","beach"],["๐Ÿœ๏ธ","desert"],["๐Ÿ๏ธ","island"],
    ["๐Ÿ”๏ธ","mountain"],["โ›ฐ๏ธ","mountain2"],["๐ŸŒ‹","volcano"],["๐Ÿ—ป","fuji"],["๐Ÿ—ผ","tokyo tower"],
    ["๐Ÿ—ฝ","statue liberty"],["โœˆ๏ธ","airplane"],["๐Ÿ›ฉ๏ธ","small plane"],["๐Ÿš€","rocket"],
    ["๐Ÿ›ธ","ufo"],["๐Ÿš","helicopter"],["๐Ÿš‚","train"],["๐Ÿš—","car"],["๐Ÿš•","taxi"],
    ["๐ŸšŒ","bus"],["๐Ÿšฒ","bike"],["๐Ÿ›ต","scooter"],["๐Ÿšค","speedboat"],["โ›ต","sailboat"],
    ["๐Ÿšข","ship"],["โš“","anchor"],["๐Ÿ—บ๏ธ","world map"],["๐Ÿงญ","compass"],["๐ŸŒ","earth"],
    ["๐ŸŒŽ","earth americas"],["๐ŸŒ","earth asia"],["๐ŸŒ™","moon"],["โญ","star"],["๐ŸŒŸ","glowing star"],
    ["โ˜€๏ธ","sun"],["๐ŸŒค๏ธ","partly sunny"],["โ›…","cloudy"],["๐ŸŒง๏ธ","rain"],["โ›ˆ๏ธ","storm"],
    ["๐ŸŒˆ","rainbow"],["โ˜”","umbrella rain"],["โ„๏ธ","snowflake"],["โ›„","snowman"],["๐Ÿ”ฅ","fire"],
    ["๐Ÿ’ง","drop"],["๐ŸŒŠ","wave"]
  ],
  "Objects" => [
    ["โŒš","watch"],["๐Ÿ“ฑ","phone"],["๐Ÿ’ป","laptop"],["โŒจ๏ธ","keyboard"],["๐Ÿ–ฅ๏ธ","desktop"],
    ["๐Ÿ–จ๏ธ","printer"],["๐Ÿ–ฑ๏ธ","mouse"],["๐Ÿ’พ","floppy"],["๐Ÿ’ฟ","cd"],["๐Ÿ“ท","camera"],
    ["๐ŸŽฅ","movie camera"],["๐Ÿ“บ","tv"],["๐Ÿ“ป","radio"],["๐Ÿ””","bell"],["๐Ÿ”•","no bell"],
    ["๐Ÿ“ข","megaphone"],["๐Ÿ“ฃ","horn"],["โฐ","alarm"],["โณ","hourglass"],["๐Ÿ”‹","battery"],
    ["๐Ÿ”Œ","plug"],["๐Ÿ’ก","bulb"],["๐Ÿ”ฆ","flashlight"],["๐Ÿ•ฏ๏ธ","candle"],["๐Ÿ—‘๏ธ","trash"],
    ["๐Ÿ”‘","key"],["๐Ÿ—๏ธ","old key"],["๐Ÿ”’","lock"],["๐Ÿ”“","unlock"],["๐Ÿ”จ","hammer"],
    ["๐Ÿช“","axe"],["โ›๏ธ","pick"],["๐Ÿ”ง","wrench"],["๐Ÿ”ฉ","nut bolt"],["โš™๏ธ","gear"],
    ["๐Ÿ“Ž","paperclip"],["โœ‚๏ธ","scissors"],["๐Ÿ“Œ","pin"],["๐Ÿ“","round pin"],["๐Ÿ–Š๏ธ","pen"],
    ["โœ๏ธ","pencil"],["๐Ÿ“","memo"],["๐Ÿ“","folder"],["๐Ÿ“‚","open folder"],["๐Ÿ“…","calendar"],
    ["๐Ÿ“Š","chart"],["๐Ÿ“ˆ","chart up"],["๐Ÿ“‰","chart down"],["๐Ÿ—‚๏ธ","card index"],
    ["๐Ÿ’ฐ","money bag"],["๐Ÿ’ต","dollar"],["๐Ÿ’ด","yen"],["๐Ÿ’ถ","euro"],["๐Ÿ’ท","pound"],
    ["๐Ÿ’Ž","gem"],["โš–๏ธ","scales"],["๐Ÿงฐ","toolbox"],["๐Ÿงฒ","magnet"],["๐Ÿ”—","link"],
    ["๐Ÿ“ฆ","package"],["๐Ÿ“ซ","mailbox"],["๐Ÿ“ฌ","mailbox flag"],["๐Ÿ“ง","email"],["๐Ÿ“ฉ","envelope arrow"],
    ["๐ŸŽ","gift"],["๐ŸŽ€","ribbon"],["๐Ÿท๏ธ","label"],["๐Ÿ”–","bookmark"]
  ],
  "Symbols" => [
    ["โœ…","check"],["โŒ","cross"],["โ“","question"],["โ—","exclamation"],["โ€ผ๏ธ","double excl"],
    ["โญ•","circle"],["๐Ÿšซ","prohibited"],["๐Ÿ”ด","red circle"],["๐ŸŸ ","orange circle"],
    ["๐ŸŸก","yellow circle"],["๐ŸŸข","green circle"],["๐Ÿ”ต","blue circle"],["๐ŸŸฃ","purple circle"],
    ["โšซ","black circle"],["โšช","white circle"],["๐ŸŸฅ","red square"],["๐ŸŸง","orange square"],
    ["๐ŸŸจ","yellow square"],["๐ŸŸฉ","green square"],["๐ŸŸฆ","blue square"],["๐ŸŸช","purple square"],
    ["โฌ›","black square"],["โฌœ","white square"],["๐Ÿ”ถ","orange diamond"],["๐Ÿ”ท","blue diamond"],
    ["๐Ÿ”บ","red triangle"],["๐Ÿ”ป","red triangle down"],["๐Ÿ’ ","diamond dot"],["๐Ÿ”˜","radio button"],
    ["โœจ","sparkles"],["โšก","zap"],["๐Ÿ’ฅ","boom"],["๐ŸŽต","music"],["๐ŸŽถ","notes"],
    ["โžก๏ธ","right arrow"],["โฌ…๏ธ","left arrow"],["โฌ†๏ธ","up arrow"],["โฌ‡๏ธ","down arrow"],
    ["โ†—๏ธ","upper right"],["โ†˜๏ธ","lower right"],["โ†™๏ธ","lower left"],["โ†–๏ธ","upper left"],
    ["๐Ÿ”€","shuffle"],["๐Ÿ”","repeat"],["๐Ÿ”‚","repeat one"],["โ–ถ๏ธ","play"],["โธ๏ธ","pause"],
    ["โน๏ธ","stop"],["โบ๏ธ","record"],["โญ๏ธ","next track"],["โฎ๏ธ","prev track"],
    ["๐Ÿ”Š","loud"],["๐Ÿ”‡","mute"],["๐Ÿ””","bell2"],["๐Ÿ“Œ","pushpin"],
    ["โ™ป๏ธ","recycle"],["๐Ÿ","checkered flag"],["๐Ÿšฉ","flag"],["๐Ÿณ๏ธ","white flag"],
    ["๐Ÿด","black flag"],["โš ๏ธ","warning"],["๐Ÿ›‘","stop sign"],["โ›”","no entry"],
    ["โ™พ๏ธ","infinity"],["๐Ÿ’ฏ","hundred"],["๐Ÿ†—","ok button"],["๐Ÿ†•","new"],["๐Ÿ†“","free"],
    ["โ„น๏ธ","info"],["๐Ÿ”ค","abc"],["๐Ÿ”ข","numbers"],["#๏ธโƒฃ","hash"],["*๏ธโƒฃ","asterisk"],
    ["0๏ธโƒฃ","zero"],["1๏ธโƒฃ","one"],["2๏ธโƒฃ","two"],["3๏ธโƒฃ","three"],["ยฉ๏ธ","copyright"],
    ["ยฎ๏ธ","registered"],["โ„ข๏ธ","trademark"]
  ],
  "Flags" => [
    ["๐Ÿ‡ณ๐Ÿ‡ด","norway"],["๐Ÿ‡ธ๐Ÿ‡ช","sweden"],["๐Ÿ‡ฉ๐Ÿ‡ฐ","denmark"],["๐Ÿ‡ซ๐Ÿ‡ฎ","finland"],["๐Ÿ‡ฎ๐Ÿ‡ธ","iceland"],
    ["๐Ÿ‡ฌ๐Ÿ‡ง","uk"],["๐Ÿ‡บ๐Ÿ‡ธ","usa"],["๐Ÿ‡จ๐Ÿ‡ฆ","canada"],["๐Ÿ‡ฆ๐Ÿ‡บ","australia"],["๐Ÿ‡ณ๐Ÿ‡ฟ","new zealand"],
    ["๐Ÿ‡ฉ๐Ÿ‡ช","germany"],["๐Ÿ‡ซ๐Ÿ‡ท","france"],["๐Ÿ‡ช๐Ÿ‡ธ","spain"],["๐Ÿ‡ฎ๐Ÿ‡น","italy"],["๐Ÿ‡ต๐Ÿ‡น","portugal"],
    ["๐Ÿ‡ณ๐Ÿ‡ฑ","netherlands"],["๐Ÿ‡ง๐Ÿ‡ช","belgium"],["๐Ÿ‡จ๐Ÿ‡ญ","switzerland"],["๐Ÿ‡ฆ๐Ÿ‡น","austria"],
    ["๐Ÿ‡ต๐Ÿ‡ฑ","poland"],["๐Ÿ‡จ๐Ÿ‡ฟ","czech"],["๐Ÿ‡ฌ๐Ÿ‡ท","greece"],["๐Ÿ‡น๐Ÿ‡ท","turkey"],["๐Ÿ‡ท๐Ÿ‡บ","russia"],
    ["๐Ÿ‡บ๐Ÿ‡ฆ","ukraine"],["๐Ÿ‡ฏ๐Ÿ‡ต","japan"],["๐Ÿ‡ฐ๐Ÿ‡ท","south korea"],["๐Ÿ‡จ๐Ÿ‡ณ","china"],["๐Ÿ‡ฎ๐Ÿ‡ณ","india"],
    ["๐Ÿ‡ง๐Ÿ‡ท","brazil"],["๐Ÿ‡ฒ๐Ÿ‡ฝ","mexico"],["๐Ÿ‡ฆ๐Ÿ‡ท","argentina"],["๐Ÿ‡ฟ๐Ÿ‡ฆ","south africa"],
    ["๐Ÿ‡ช๐Ÿ‡ฌ","egypt"],["๐Ÿ‡ฎ๐Ÿ‡ฑ","israel"],["๐Ÿ‡ธ๐Ÿ‡ฆ","saudi"],["๐Ÿ‡ฆ๐Ÿ‡ช","uae"],["๐Ÿ‡น๐Ÿ‡ญ","thailand"],
    ["๐Ÿ‡ป๐Ÿ‡ณ","vietnam"],["๐Ÿ‡ฎ๐Ÿ‡ฉ","indonesia"],["๐Ÿ‡ต๐Ÿ‡ญ","philippines"],["๐Ÿ‡ฒ๐Ÿ‡พ","malaysia"],
    ["๐Ÿ‡ธ๐Ÿ‡ฌ","singapore"],["๐Ÿ‡ญ๐Ÿ‡ฐ","hong kong"],["๐Ÿ‡น๐Ÿ‡ผ","taiwan"],["๐Ÿณ๏ธโ€๐ŸŒˆ","rainbow flag"],
    ["๐Ÿดโ€โ˜ ๏ธ","pirate flag"],["๐ŸŽŒ","crossed flags"],["๐Ÿ","checkered"]
  ]
}.freeze
CELL_W =

Each emoji cell = 4 terminal columns (space + emoji + space)

4

Class Method Summary collapse

Methods included from Input

getchr

Class Method Details

.pick(parent_pane) ⇒ Object

Main entry point: opens picker overlay, returns emoji string or nil



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/rcurses/emoji.rb', line 150

def self.pick(parent_pane)
  max_h, max_w = IO.console ? IO.console.winsize : [24, 80]

  cols = 11
  ow = cols * CELL_W + 4
  oh = [max_h - 4, 22].min
  return nil if oh < 8

  ox = (max_w - ow) / 2 + 1
  oy = (max_h - oh) / 2 + 1

  overlay = Rcurses::Popup.new(x: ox, y: oy, w: ow, h: oh, fg: 255, bg: 236)
  overlay.scroll = false

  categories = CATEGORIES.keys
  cat_idx = 0
  sel_idx = 0
  search = ""

  fmt = "255,236"

  begin
    loop do
      # Determine items for current category or search
      if search.empty?
        items = CATEGORIES[categories[cat_idx]]
      else
        items = CATEGORIES.values.flatten(1).select { |_e, k|
          k.include?(search.downcase)
        }
      end

      total = items.size
      sel_idx = sel_idx.clamp(0, [total - 1, 0].max)

      # === Build pane text (header + blank grid area + footer) ===
      lines = []

      # Header: category tabs (wrapped to fit)
      header_lines = 0
      if search.empty?
        tab_rows = [[]]
        row_w = 0
        categories.each_with_index do |c, i|
          tab = " #{c} "
          tw = tab.length
          if row_w + tw > ow && !tab_rows.last.empty?
            tab_rows << []
            row_w = 0
          end
          tab_rows.last << (i == cat_idx ? tab.bd.rv : tab)
          row_w += tw
        end
        tab_rows.each { |tr| lines << tr.join("") }
        header_lines = tab_rows.size
      else
        lines << " Search: #{search}".bd
        header_lines = 1
      end
      lines << ""
      header_lines += 1  # blank separator

      # Blank lines for grid area (pane fills bg color)
      grid_rows = (total + cols - 1) / cols
      grid_rows.times { lines << "" }

      # Pad remaining space
      while lines.size < oh - 3
        lines << ""
      end

      # Footer
      lines << ""
      if total > 0 && items[sel_idx]
        lines << " :#{items[sel_idx][1]}:".fg(245)
      else
        lines << ""
      end

      overlay.text = lines.join("\n")
      overlay.ix = 0
      overlay.full_refresh
      overlay.border_refresh

      # === Render emoji grid at explicit cursor positions ===
      # This bypasses display_width entirely for grid alignment
      flat_i = 0
      items.each_slice(cols) do |row|
        grid_row = flat_i / cols
        abs_row = oy + header_lines + grid_row
        row.each_with_index do |(emoji, _keyword), col_i|
          abs_col = ox + col_i * CELL_W
          STDOUT.print "\e[#{abs_row};#{abs_col}H"
          if flat_i == sel_idx
            STDOUT.print " #{emoji} ".c("236,255")  # Inverted colors
          else
            STDOUT.print " #{emoji} ".c(fmt)
          end
          flat_i += 1
        end
      end
      STDOUT.flush

      # Input
      chr = getchr(flush: false)
      case chr
      when 'ESC'
        return nil
      when 'ENTER'
        return (total > 0 && items[sel_idx]) ? items[sel_idx][0] : nil
      when 'RIGHT'
        sel_idx = [sel_idx + 1, total - 1].min if total > 0
      when 'LEFT'
        sel_idx = [sel_idx - 1, 0].max
      when 'UP'
        sel_idx = [sel_idx - cols, 0].max
      when 'DOWN'
        sel_idx = [sel_idx + cols, total - 1].min if total > 0
      when 'TAB'
        if search.empty?
          cat_idx = (cat_idx + 1) % categories.size
          sel_idx = 0
        end
      when 'S-TAB'
        if search.empty?
          cat_idx = (cat_idx - 1) % categories.size
          sel_idx = 0
        end
      when 'BACK'
        if search.length > 0
          search = search[0..-2]
          sel_idx = 0
        end
      when /^.$/
        search << chr
        sel_idx = 0
      end
    end
  ensure
    overlay.cleanup if overlay.respond_to?(:cleanup)
  end
end