# Low-color themes should ONLY use the standard foreground and background # colours listed here: # # http://urwid.org/manual/displayattributes.html # from __future__ import annotations from collections.abc import Mapping from collections.abc import Sequence class Palette: _fields = [ "background", "title", # Status bar & heading "heading", "heading_key", "heading_inactive", # Help "key", "head", "text", # Options "option_selected", "option_active", "option_active_selected", "option_selected_key", # List and Connections "method_get", "method_post", "method_delete", "method_other", "method_head", "method_put", "method_http2_push", "scheme_http", "scheme_https", "scheme_ws", "scheme_wss", "scheme_tcp", "scheme_udp", "scheme_dns", "scheme_quic", "scheme_other", "url_punctuation", "url_domain", "url_filename", "url_extension", "url_query_key", "url_query_value", "content_none", "content_text", "content_script", "content_media", "content_data", "content_raw", "content_other", "focus", "code_200", "code_300", "code_400", "code_500", "code_other", "error", "warn", "alert", "header", "highlight", "intercept", "replay", "mark", # Contentview Syntax Highlighting "name", "string", "number", "boolean", "comment", "error", # TCP flow details "from_client", "to_client", # Grid Editor "focusfield", "focusfield_error", "field_error", "editfield", # Commander "commander_command", "commander_invalid", "commander_hint", ] _fields.extend(["gradient_%02d" % i for i in range(100)]) high: Mapping[str, Sequence[str]] | None = None low: Mapping[str, Sequence[str]] def palette(self, transparent: bool): lst: list[Sequence[str | None]] = [] highback, lowback = None, None if not transparent: if self.high and self.high.get("background"): highback = self.high["background"][1] lowback = self.low["background"][1] for i in self._fields: if transparent and i == "background": lst.append(["background", "default", "default"]) else: v: list[str | None] = [i] low = list(self.low[i]) if lowback and low[1] == "default": low[1] = lowback v.extend(low) if self.high and i in self.high: v.append(None) high: list[str | None] = list(self.high[i]) if highback and high[1] == "default": high[1] = highback v.extend(high) elif highback and self.low[i][1] == "default": high = [None, low[0], highback] v.extend(high) lst.append(tuple(v)) return lst def gen_gradient(palette, cols): for i in range(100): palette["gradient_%02d" % i] = (cols[i * len(cols) // 100], "default") def gen_rgb_gradient(palette, cols): parts = len(cols) - 1 for i in range(100): p = i / 100 idx = int(p * parts) t0 = cols[idx] t1 = cols[idx + 1] pp = p * parts % 1 t = ( round(t0[0] + (t1[0] - t0[0]) * pp), round(t0[1] + (t1[1] - t0[1]) * pp), round(t0[2] + (t1[2] - t0[2]) * pp), ) palette["gradient_%02d" % i] = ("#%x%x%x" % t, "default") class LowDark(Palette): """ Low-color dark background """ low = dict( background=("white", "black"), title=("white,bold", "default"), # Status bar & heading heading=("white", "dark blue"), heading_key=("light cyan", "dark blue"), heading_inactive=("dark gray", "light gray"), # Help key=("light cyan", "default"), head=("white,bold", "default"), text=("light gray", "default"), # Options option_selected=("black", "light gray"), option_selected_key=("light cyan", "light gray"), option_active=("light red", "default"), option_active_selected=("light red", "light gray"), # List and Connections method_get=("light green", "default"), method_post=("brown", "default"), method_delete=("light red", "default"), method_head=("dark cyan", "default"), method_put=("dark red", "default"), method_other=("dark magenta", "default"), method_http2_push=("dark gray", "default"), scheme_http=("dark cyan", "default"), scheme_https=("dark green", "default"), scheme_ws=("brown", "default"), scheme_wss=("dark magenta", "default"), scheme_tcp=("dark magenta", "default"), scheme_udp=("dark magenta", "default"), scheme_dns=("dark blue", "default"), scheme_quic=("brown", "default"), scheme_other=("dark magenta", "default"), url_punctuation=("light gray", "default"), url_domain=("white", "default"), url_filename=("dark cyan", "default"), url_extension=("light gray", "default"), url_query_key=("white", "default"), url_query_value=("light gray", "default"), content_none=("dark gray", "default"), content_text=("light gray", "default"), content_script=("dark green", "default"), content_media=("light blue", "default"), content_data=("brown", "default"), content_raw=("dark red", "default"), content_other=("dark magenta", "default"), focus=("yellow", "default"), code_200=("dark green", "default"), code_300=("light blue", "default"), code_400=("light red", "default"), code_500=("light red", "default"), code_other=("dark red", "default"), alert=("light magenta", "default"), warn=("brown", "default"), error=("light red", "default"), header=("dark cyan", "default"), highlight=("white,bold", "default"), intercept=("brown", "default"), replay=("light green", "default"), mark=("light red", "default"), # Contentview Syntax Highlighting name=("dark green", "default"), string=("dark blue", "default"), number=("light magenta", "default"), boolean=("dark magenta", "default"), comment=("dark gray", "default"), # TCP flow details from_client=("light blue", "default"), to_client=("light red", "default"), # Grid Editor focusfield=("black", "light gray"), focusfield_error=("dark red", "light gray"), field_error=("dark red", "default"), editfield=("white", "default"), commander_command=("white,bold", "default"), commander_invalid=("light red", "default"), commander_hint=("dark gray", "default"), ) gen_gradient( low, ["light red", "yellow", "light green", "dark green", "dark cyan", "dark blue"], ) class Dark(LowDark): high = dict( heading_inactive=("g58", "g11"), intercept=("#f60", "default"), option_selected=("g85", "g45"), option_selected_key=("light cyan", "g50"), option_active_selected=("light red", "g50"), ) class LowLight(Palette): """ Low-color light background """ low = dict( background=("black", "white"), title=("dark magenta", "default"), # Status bar & heading heading=("white", "black"), heading_key=("dark blue", "black"), heading_inactive=("black", "light gray"), # Help key=("dark blue", "default"), head=("black", "default"), text=("dark gray", "default"), # Options option_selected=("black", "light gray"), option_selected_key=("dark blue", "light gray"), option_active=("light red", "default"), option_active_selected=("light red", "light gray"), # List and Connections method_get=("dark green", "default"), method_post=("brown", "default"), method_head=("dark cyan", "default"), method_put=("light red", "default"), method_delete=("dark red", "default"), method_other=("light magenta", "default"), method_http2_push=("light gray", "default"), scheme_http=("dark cyan", "default"), scheme_https=("light green", "default"), scheme_ws=("brown", "default"), scheme_wss=("light magenta", "default"), scheme_tcp=("light magenta", "default"), scheme_udp=("light magenta", "default"), scheme_dns=("light blue", "default"), scheme_quic=("brown", "default"), scheme_other=("light magenta", "default"), url_punctuation=("dark gray", "default"), url_domain=("dark gray", "default"), url_filename=("black", "default"), url_extension=("dark gray", "default"), url_query_key=("light blue", "default"), url_query_value=("dark blue", "default"), content_none=("black", "default"), content_text=("dark gray", "default"), content_script=("light green", "default"), content_media=("light blue", "default"), content_data=("brown", "default"), content_raw=("light red", "default"), content_other=("light magenta", "default"), focus=("black", "default"), code_200=("dark green", "default"), code_300=("light blue", "default"), code_400=("dark red", "default"), code_500=("dark red", "default"), code_other=("light red", "default"), error=("light red", "default"), warn=("brown", "default"), alert=("light magenta", "default"), header=("dark blue", "default"), highlight=("black,bold", "default"), intercept=("brown", "default"), replay=("dark green", "default"), mark=("dark red", "default"), # Contentview Syntax Highlighting name=("dark green", "default"), string=("dark blue", "default"), number=("light magenta", "default"), boolean=("dark magenta", "default"), comment=("dark gray", "default"), # TCP flow details from_client=("dark blue", "default"), to_client=("dark red", "default"), # Grid Editor focusfield=("black", "light gray"), focusfield_error=("dark red", "light gray"), field_error=("dark red", "black"), editfield=("black", "default"), commander_command=("dark magenta", "default"), commander_invalid=("light red", "default"), commander_hint=("light gray", "default"), ) gen_gradient( low, ["light red", "yellow", "light green", "dark green", "dark cyan", "dark blue"], ) class Light(LowLight): high = dict( background=("black", "g100"), heading=("g99", "#08f"), heading_key=("#0ff,bold", "#08f"), heading_inactive=("g35", "g85"), replay=("#0a0,bold", "default"), option_selected=("black", "g85"), option_selected_key=("dark blue", "g85"), option_active_selected=("light red", "g85"), ) # Solarized palette in Urwid-style terminal high-colour offsets # See: http://ethanschoonover.com/solarized sol_base03 = "h234" sol_base02 = "h235" sol_base01 = "h240" sol_base00 = "h241" sol_base0 = "h244" sol_base1 = "h245" sol_base2 = "h254" sol_base3 = "h230" sol_yellow = "h136" sol_orange = "h166" sol_red = "h160" sol_magenta = "h125" sol_violet = "h61" sol_blue = "h33" sol_cyan = "h37" sol_green = "h64" class SolarizedLight(LowLight): high = dict( background=(sol_base00, sol_base3), title=(sol_cyan, "default"), text=(sol_base00, "default"), # Status bar & heading heading=(sol_base2, sol_base02), heading_key=(sol_blue, sol_base03), heading_inactive=(sol_base03, sol_base1), # Help key=( sol_blue, "default", ), head=(sol_base00, "default"), # Options option_selected=(sol_base03, sol_base2), option_selected_key=(sol_blue, sol_base2), option_active=(sol_orange, "default"), option_active_selected=(sol_orange, sol_base2), # List and Connections method_get=(sol_green, "default"), method_post=(sol_orange, "default"), method_head=(sol_cyan, "default"), method_put=(sol_red, "default"), method_delete=(sol_red, "default"), method_other=(sol_magenta, "default"), method_http2_push=("light gray", "default"), scheme_http=(sol_cyan, "default"), scheme_https=("light green", "default"), scheme_ws=(sol_orange, "default"), scheme_wss=("light magenta", "default"), scheme_tcp=("light magenta", "default"), scheme_udp=("light magenta", "default"), scheme_dns=("light blue", "default"), scheme_quic=(sol_orange, "default"), scheme_other=("light magenta", "default"), url_punctuation=("dark gray", "default"), url_domain=("dark gray", "default"), url_filename=("black", "default"), url_extension=("dark gray", "default"), url_query_key=(sol_blue, "default"), url_query_value=("dark blue", "default"), focus=(sol_base01, "default"), code_200=(sol_green, "default"), code_300=(sol_blue, "default"), code_400=( sol_orange, "default", ), code_500=(sol_red, "default"), code_other=(sol_magenta, "default"), error=(sol_red, "default"), warn=(sol_orange, "default"), alert=(sol_magenta, "default"), header=(sol_blue, "default"), highlight=(sol_base01, "default"), intercept=( sol_red, "default", ), replay=( sol_green, "default", ), mark=(sol_base01, "default"), # Contentview Syntax Highlighting name=(sol_green, "default"), string=(sol_cyan, "default"), number=(sol_blue, "default"), boolean=(sol_magenta, "default"), comment=(sol_base1, "default"), # TCP flow details from_client=(sol_blue, "default"), to_client=(sol_red, "default"), # Grid Editor focusfield=(sol_base00, sol_base2), focusfield_error=(sol_red, sol_base2), field_error=(sol_red, "default"), editfield=(sol_base01, "default"), commander_command=(sol_cyan, "default"), commander_invalid=(sol_orange, "default"), commander_hint=(sol_base1, "default"), ) class SolarizedDark(LowDark): high = dict( background=(sol_base2, sol_base03), title=(sol_blue, "default"), text=(sol_base1, "default"), # Status bar & heading heading=(sol_base2, sol_base01), heading_key=(sol_blue + ",bold", sol_base01), heading_inactive=(sol_base1, sol_base02), # Help key=( sol_blue, "default", ), head=(sol_base2, "default"), # Options option_selected=(sol_base03, sol_base00), option_selected_key=(sol_blue, sol_base00), option_active=(sol_orange, "default"), option_active_selected=(sol_orange, sol_base00), # List and Connections focus=(sol_base1, "default"), method_get=(sol_green, "default"), method_post=(sol_orange, "default"), method_delete=(sol_red, "default"), method_head=(sol_cyan, "default"), method_put=(sol_red, "default"), method_other=(sol_magenta, "default"), method_http2_push=(sol_base01, "default"), url_punctuation=("h242", "default"), url_domain=("h252", "default"), url_filename=("h132", "default"), url_extension=("h96", "default"), url_query_key=("h37", "default"), url_query_value=("h30", "default"), content_none=(sol_base01, "default"), content_text=(sol_base1, "default"), content_media=(sol_blue, "default"), code_200=(sol_green, "default"), code_300=(sol_blue, "default"), code_400=( sol_orange, "default", ), code_500=(sol_red, "default"), code_other=(sol_magenta, "default"), error=(sol_red, "default"), warn=(sol_orange, "default"), alert=(sol_magenta, "default"), header=(sol_blue, "default"), highlight=(sol_base01, "default"), intercept=( sol_red, "default", ), replay=( sol_green, "default", ), mark=(sol_base01, "default"), # Contentview Syntax Highlighting name=(sol_green, "default"), string=(sol_cyan, "default"), number=(sol_blue, "default"), boolean=(sol_magenta, "default"), comment=(sol_base00, "default"), # TCP flow details from_client=(sol_blue, "default"), to_client=(sol_red, "default"), # Grid Editor focusfield=(sol_base0, sol_base02), focusfield_error=(sol_red, sol_base02), field_error=(sol_red, "default"), editfield=(sol_base1, "default"), commander_command=(sol_blue, "default"), commander_invalid=(sol_orange, "default"), commander_hint=(sol_base00, "default"), ) gen_rgb_gradient( high, [(15, 0, 0), (15, 15, 0), (0, 15, 0), (0, 15, 15), (0, 0, 15)] ) DEFAULT = "dark" palettes = { "lowlight": LowLight(), "lowdark": LowDark(), "light": Light(), "dark": Dark(), "solarized_light": SolarizedLight(), "solarized_dark": SolarizedDark(), }