Edit: The original version I posted had escape chars in the code and these did not copy-and-paste well. The new version of the code is escape free and survives copy-and-paste intact. Also, I posted an image of some of the prompts here. I used the "-l 2" option to add two blank lines between each prompt so you can see them better. Each prompt shown can be further customized with the command line options listed below. AFAIK, this takes customizing the Zsh prompt to the next level.

The idea is to give people a nice selection of prompts OOTB which can be easily tuned using command line parameters to make it very easy to play around. Colors can be set in a simple config file. Date and time formats can be set in the config file as well as from the command line. The program is designed to be modular enough to let more adventurous people easily craft prompts I have not thought of.

I don't use RPROMPT because it periodically messes up my vconsoles and it is a pain when I want to copy and paste a command together with its output. Please feel free to add an RPROMPT for yourself. It should be very easy. I tried to minimize the number of global variables. They all start with "_PROMPT_". I also tried to minimize the computation needed each time the prompt is generated.

Each command changes your prompt ranging from prompt-tiny, which gives you
a very simple prompt, to prompt-zee which gives you a very fancy one.
They all have these options (but not all prompts are affected by all options):

-a --ascii Disable Unicode
-b --bright Use brighter colors
-B --bold Use bold lines
-c --compact Make the fancier prompts a little smaller
-C --compact2 Make the fancier prompts smaller elsewhere
-d --date=<fmt> Set the date format
-D --double Use doubled lines
-h --help Display this help
-l --lines=<int> Add <int> extra new lines before the prompt
-m --mute Use muted/dimmer colors
-n --nocolor Turn off colors
-p --prompt=<str> The final character(s) displayed in the prompt
-P --parens Use parens instead of brackets in prompt
-r --right=<int> Leave <int> spaces on right side of wide prompts
-t --time=<fmt> Set the time format
-T --title=<str> Add a centered title above the prompt

Short options stack. Only the final one can take an operand. Operands do
not stack. The default in a virtual console is --mute. In a psuedo-terminal
(inside of X-windows) the default is --bright.

The username and the final prompt characters are red for the root user.

Each command changes your prompt ranging from prompt-tiny, which gives you
a very simple prompt, to prompt-zee which gives you a very fancy one.
They all have these options (but not all prompts are affected by all options):

-a --ascii Disable Unicode
-b --bright Use brighter colors
-B --bold Use bold lines
-c --compact Make the fancier prompts a little smaller
-C --compact2 Make the fancier prompts smaller elsewhere
-d --date=<fmt> Set the date format
-D --double Use doubled lines
-h --help Display this help
-l --lines=<int> Add <int> extra new lines before the prompt
-m --mute Use muted/dimmer colors
-n --nocolor Turn off colors
-p --prompt=<str> The final character(s) displayed in the prompt
-P --parens Use parens instead of brackets in prompt
-r --right=<int> Leave <int> spaces on right side of wide prompts
-t --time=<fmt> Set the time format
-T --title=<str> Add a centered title above the prompt

Short options stack. Only the final one can take an operand. Operands do
not stack. The default in a virtual console is --mute. In a psuedo-terminal
(inside of X-windows) the default is --bright.

The username and the final prompt characters are red for the root user.

# abbrevity is the soul of wit
local fill_1="\${(e)_PROMPT_1_FILL}"
local fill_2="\${(e)_PROMPT_2_FILL}"
local fill_3="\${(e)_PROMPT_3_FILL}"

#-- Now start putting all the pieces together

# Basic reusable elements of the prompts
local name_block="$line_co$lb$name_co%n$nc$at_co@$host_co%m$line_co$rb"
local time_block="$line_co$lb$time_co%D{$time_fmt}$line_co$rb"
local date_block="$line_co$lb$date_co%D{$date_fmt}$line_co$rb"
local path_block="$line_co$lb$path_co\${(e)_PROMPT_PWD}$line_co$rb"

# p2_bare is similar to p2 but has colors stripped out
local p2="$name_block$pad2$time_block"
local p2_bare="(%n@%m)$pad2(%D{$time_fmt})"
local date_bare="(%D{$date_fmt})"