From b60199fea12367dc86d6913313fb70e9ea3b7e09 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 7 Feb 2021 16:26:44 +0100 Subject: [PATCH 1/7] Add support for custom dark themes --- homeassistant/components/frontend/__init__.py | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index cdf25d22fe8611..b455eba995f068 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -33,6 +33,8 @@ DOMAIN = "frontend" CONF_THEMES = "themes" +CONF_THEMES_STYLES = "styles" +CONF_THEMES_DARK_STYLES = "dark_styles" CONF_EXTRA_HTML_URL = "extra_html_url" CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5" CONF_EXTRA_MODULE_URL = "extra_module_url" @@ -87,14 +89,34 @@ _LOGGER = logging.getLogger(__name__) +THEME_SCHEMA = vol.Schema( + { + cv.string: ( + vol.Any( + # Legacy theme scheme + {cv.string: cv.string}, + # New sub scheme with "dark styles" support + vol.Schema( + { + vol.Optional(CONF_THEMES_STYLES): vol.Schema( + {cv.string: cv.string} + ), + vol.Optional(CONF_THEMES_DARK_STYLES): vol.Schema( + {cv.string: cv.string} + ), + } + ), + ) + ) + } +) + CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema( { vol.Optional(CONF_FRONTEND_REPO): cv.isdir, - vol.Optional(CONF_THEMES): vol.Schema( - {cv.string: {cv.string: cv.string}} - ), + vol.Optional(CONF_THEMES): THEME_SCHEMA, vol.Optional(CONF_EXTRA_MODULE_URL): vol.All( cv.ensure_list, [cv.string] ), From c30e6ea22f9ff2065a19faffd3c36f55c4f807da Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 14 Feb 2021 12:42:22 +0100 Subject: [PATCH 2/7] Rename YAML keys --- homeassistant/components/frontend/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 97f72f26a7de6b..61e9330d0d0d1a 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -33,8 +33,8 @@ DOMAIN = "frontend" CONF_THEMES = "themes" -CONF_THEMES_STYLES = "styles" -CONF_THEMES_DARK_STYLES = "dark_styles" +CONF_THEMES_LIGHT_STYLES = "light" +CONF_THEMES_DARK_STYLES = "dark" CONF_EXTRA_HTML_URL = "extra_html_url" CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5" CONF_EXTRA_MODULE_URL = "extra_module_url" @@ -98,7 +98,7 @@ # New sub scheme with "dark styles" support vol.Schema( { - vol.Optional(CONF_THEMES_STYLES): vol.Schema( + vol.Optional(CONF_THEMES_LIGHT_STYLES): vol.Schema( {cv.string: cv.string} ), vol.Optional(CONF_THEMES_DARK_STYLES): vol.Schema( From fa890c3b9059e0e1fb75780c23c3b0a70bb96e73 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 14 Feb 2021 14:35:31 +0100 Subject: [PATCH 3/7] Add support for color defaults --- homeassistant/components/frontend/__init__.py | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 61e9330d0d0d1a..1e1c10fc63123c 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -33,8 +33,10 @@ DOMAIN = "frontend" CONF_THEMES = "themes" -CONF_THEMES_LIGHT_STYLES = "light" -CONF_THEMES_DARK_STYLES = "dark" +CONF_THEMES_DEFAULTS = "defaults" +CONF_THEMES_STYLES = "styles" +CONF_THEMES_LIGHT = "light" +CONF_THEMES_DARK = "dark" CONF_EXTRA_HTML_URL = "extra_html_url" CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5" CONF_EXTRA_MODULE_URL = "extra_module_url" @@ -89,23 +91,31 @@ _LOGGER = logging.getLogger(__name__) +EXTENDED_THEME_SCHEMA = vol.Schema( + { + vol.Optional(CONF_THEMES_DEFAULTS): vol.Schema( + { + vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), + vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}), + } + ), + vol.Optional(CONF_THEMES_STYLES): vol.Schema( + { + vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), + vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}), + } + ), + } +) + THEME_SCHEMA = vol.Schema( { cv.string: ( vol.Any( # Legacy theme scheme {cv.string: cv.string}, - # New sub scheme with "dark styles" support - vol.Schema( - { - vol.Optional(CONF_THEMES_LIGHT_STYLES): vol.Schema( - {cv.string: cv.string} - ), - vol.Optional(CONF_THEMES_DARK_STYLES): vol.Schema( - {cv.string: cv.string} - ), - } - ), + # New extended schema with "dark styles" and "defaults" support + EXTENDED_THEME_SCHEMA, ) ) } From cf4ce4f66207bbe7988f579cc5790f8e8eadf11a Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 14 Feb 2021 17:26:46 +0100 Subject: [PATCH 4/7] Added tests --- homeassistant/components/frontend/__init__.py | 13 +++- tests/components/frontend/test_init.py | 61 +++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 1e1c10fc63123c..59239fa036add6 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -37,6 +37,8 @@ CONF_THEMES_STYLES = "styles" CONF_THEMES_LIGHT = "light" CONF_THEMES_DARK = "dark" +CONF_THEMES_PRIMARY_COLOR = "primary-color" +CONF_THEMES_ACCENT_COLOR = "accent-color" CONF_EXTRA_HTML_URL = "extra_html_url" CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5" CONF_EXTRA_MODULE_URL = "extra_module_url" @@ -91,12 +93,19 @@ _LOGGER = logging.getLogger(__name__) +DEFAULTS_SCHEMA = vol.Schema( + { + vol.Required(CONF_THEMES_PRIMARY_COLOR): cv.string, + vol.Required(CONF_THEMES_ACCENT_COLOR): cv.string, + } +) + EXTENDED_THEME_SCHEMA = vol.Schema( { vol.Optional(CONF_THEMES_DEFAULTS): vol.Schema( { - vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), - vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}), + vol.Optional(CONF_THEMES_LIGHT): DEFAULTS_SCHEMA, + vol.Optional(CONF_THEMES_DARK): DEFAULTS_SCHEMA, } ), vol.Optional(CONF_THEMES_STYLES): vol.Schema( diff --git a/tests/components/frontend/test_init.py b/tests/components/frontend/test_init.py index 0e8e31bb20de98..f1f44840e1761b 100644 --- a/tests/components/frontend/test_init.py +++ b/tests/components/frontend/test_init.py @@ -27,6 +27,32 @@ CONF_THEMES: { "happy": {"primary-color": "red"}, "dark": {"primary-color": "black"}, + "light_only": { + "styles": { + "light": {"primary-color": "red"}, + } + }, + "dark_only": { + "styles": { + "dark": {"primary-color": "black"}, + } + }, + "light_and_dark": { + "styles": { + "light": {"primary-color": "red"}, + "dark": {"primary-color": "black"}, + } + }, + "with_defaults": { + "defaults": { + "light": {"primary-color": "red", "accent-color": "green"}, + "dark": {"primary-color": "black", "accent-color": "orange"}, + }, + "styles": { + "light": {"state-icon-active-color": "red"}, + "dark": {"state-icon-active-color": "black"}, + }, + }, } } } @@ -151,6 +177,32 @@ async def test_themes_api(hass, themes_ws_client): assert msg["result"]["themes"] == { "happy": {"primary-color": "red"}, "dark": {"primary-color": "black"}, + "light_only": { + "styles": { + "light": {"primary-color": "red"}, + } + }, + "dark_only": { + "styles": { + "dark": {"primary-color": "black"}, + } + }, + "light_and_dark": { + "styles": { + "light": {"primary-color": "red"}, + "dark": {"primary-color": "black"}, + } + }, + "with_defaults": { + "defaults": { + "light": {"primary-color": "red", "accent-color": "green"}, + "dark": {"primary-color": "black", "accent-color": "orange"}, + }, + "styles": { + "light": {"state-icon-active-color": "red"}, + "dark": {"state-icon-active-color": "black"}, + }, + }, } # safe mode @@ -283,6 +335,15 @@ async def test_themes_set_dark_theme(hass, themes_ws_client): assert msg["result"]["default_dark_theme"] is None + await hass.services.async_call( + DOMAIN, "set_theme", {"name": "light_and_dark", "mode": "dark"}, blocking=True + ) + + await themes_ws_client.send_json({"id": 8, "type": "frontend/get_themes"}) + msg = await themes_ws_client.receive_json() + + assert msg["result"]["default_dark_theme"] == "light_and_dark" + async def test_themes_set_dark_theme_wrong_name(hass, frontend, themes_ws_client): """Test frontend.set_theme service called with mode dark and wrong name.""" From a6de72a200387bacec8b651f3ca988c9e29d98cc Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 25 Apr 2021 23:31:37 +0200 Subject: [PATCH 5/7] Remove color default support --- homeassistant/components/frontend/__init__.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 22b370052c0970..4e06cc4fdab1ae 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -36,7 +36,6 @@ DOMAIN = "frontend" CONF_THEMES = "themes" -CONF_THEMES_DEFAULTS = "defaults" CONF_THEMES_STYLES = "styles" CONF_THEMES_LIGHT = "light" CONF_THEMES_DARK = "dark" @@ -72,21 +71,8 @@ _LOGGER = logging.getLogger(__name__) -DEFAULTS_SCHEMA = vol.Schema( - { - vol.Required(CONF_THEMES_PRIMARY_COLOR): cv.string, - vol.Required(CONF_THEMES_ACCENT_COLOR): cv.string, - } -) - EXTENDED_THEME_SCHEMA = vol.Schema( { - vol.Optional(CONF_THEMES_DEFAULTS): vol.Schema( - { - vol.Optional(CONF_THEMES_LIGHT): DEFAULTS_SCHEMA, - vol.Optional(CONF_THEMES_DARK): DEFAULTS_SCHEMA, - } - ), vol.Optional(CONF_THEMES_STYLES): vol.Schema( { vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), @@ -102,7 +88,7 @@ vol.Any( # Legacy theme scheme {cv.string: cv.string}, - # New extended schema with "dark styles" and "defaults" support + # New extended schema with "dark styles" support EXTENDED_THEME_SCHEMA, ) ) From 85977b64426411e7fdc380696a3f29339c0303cc Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 27 Apr 2021 12:58:51 +0200 Subject: [PATCH 6/7] Remove unused const --- homeassistant/components/frontend/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 4e06cc4fdab1ae..21f711debd2a52 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -39,8 +39,6 @@ CONF_THEMES_STYLES = "styles" CONF_THEMES_LIGHT = "light" CONF_THEMES_DARK = "dark" -CONF_THEMES_PRIMARY_COLOR = "primary-color" -CONF_THEMES_ACCENT_COLOR = "accent-color" CONF_EXTRA_HTML_URL = "extra_html_url" CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5" CONF_EXTRA_MODULE_URL = "extra_module_url" From 9a6f7d570dd9c989a085d09cb0942d4042c51972 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sat, 22 May 2021 15:05:04 +0200 Subject: [PATCH 7/7] Adjust to new "modes" structure --- homeassistant/components/frontend/__init__.py | 9 +++++--- tests/components/frontend/test_init.py | 23 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 21f711debd2a52..1b10498202631e 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -36,7 +36,7 @@ DOMAIN = "frontend" CONF_THEMES = "themes" -CONF_THEMES_STYLES = "styles" +CONF_THEMES_MODES = "modes" CONF_THEMES_LIGHT = "light" CONF_THEMES_DARK = "dark" CONF_EXTRA_HTML_URL = "extra_html_url" @@ -71,7 +71,10 @@ EXTENDED_THEME_SCHEMA = vol.Schema( { - vol.Optional(CONF_THEMES_STYLES): vol.Schema( + # Theme variables that apply to all modes + cv.string: cv.string, + # Mode specific theme variables + vol.Optional(CONF_THEMES_MODES): vol.Schema( { vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}), @@ -86,7 +89,7 @@ vol.Any( # Legacy theme scheme {cv.string: cv.string}, - # New extended schema with "dark styles" support + # New extended schema with mode support EXTENDED_THEME_SCHEMA, ) ) diff --git a/tests/components/frontend/test_init.py b/tests/components/frontend/test_init.py index 0dd59e1f60b75b..9746fc6d838877 100644 --- a/tests/components/frontend/test_init.py +++ b/tests/components/frontend/test_init.py @@ -27,20 +27,23 @@ "happy": {"primary-color": "red", "app-header-background-color": "blue"}, "dark": {"primary-color": "black"}, "light_only": { - "styles": { - "light": {"primary-color": "red"}, - } + "primary-color": "blue", + "modes": { + "light": {"secondary-color": "black"}, + }, }, "dark_only": { - "styles": { - "dark": {"primary-color": "black"}, - } + "primary-color": "blue", + "modes": { + "dark": {"secondary-color": "white"}, + }, }, "light_and_dark": { - "styles": { - "light": {"primary-color": "red"}, - "dark": {"primary-color": "black"}, - } + "primary-color": "blue", + "modes": { + "light": {"secondary-color": "black"}, + "dark": {"secondary-color": "white"}, + }, }, }