The regular Emacs way of prompting the user for input is either through the minibuffer or with a dedicated popup window. The former is often too far away from my current focus and the latter always felt a bit intrusive to me. As with multi line minibuffer prompts, popup windows tend to disturb the window setup and are particular annoying when the current cursor position is in the way (which causes the buffer to get bumped around).
Emacs 26 introduced a new feature called child-frames which provides an alternate way to prompt the user or display information. There are already many packages bringing this feature to some of the most popular extensions like eldoc-box, flycheck, ivy, helm and company.
If you live in the terminal you can use it, too:
In the latter case you might also be happy using ace-popup-menu although one advantage with frog-menu is that the action keys on the bottom are static because they are bound to key chords and not chosen by avy key hints.
Creating a frog-menu is pretty easy:
(frog-menu-read "What theme?" (mapcar #'symbol-name (custom-available-themes)))