mirror of
https://github.com/home-assistant/core.git
synced 2025-07-10 14:57:09 +00:00
Add support for custom themes to use dark mode (#46532)
This commit is contained in:
parent
fe34f42aa5
commit
d8ff52e55b
@ -36,6 +36,9 @@ mimetypes.add_type("application/javascript", ".js")
|
|||||||
|
|
||||||
DOMAIN = "frontend"
|
DOMAIN = "frontend"
|
||||||
CONF_THEMES = "themes"
|
CONF_THEMES = "themes"
|
||||||
|
CONF_THEMES_MODES = "modes"
|
||||||
|
CONF_THEMES_LIGHT = "light"
|
||||||
|
CONF_THEMES_DARK = "dark"
|
||||||
CONF_EXTRA_HTML_URL = "extra_html_url"
|
CONF_EXTRA_HTML_URL = "extra_html_url"
|
||||||
CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5"
|
CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5"
|
||||||
CONF_EXTRA_MODULE_URL = "extra_module_url"
|
CONF_EXTRA_MODULE_URL = "extra_module_url"
|
||||||
@ -66,14 +69,39 @@ PRIMARY_COLOR = "primary-color"
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
EXTENDED_THEME_SCHEMA = 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}),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
THEME_SCHEMA = vol.Schema(
|
||||||
|
{
|
||||||
|
cv.string: (
|
||||||
|
vol.Any(
|
||||||
|
# Legacy theme scheme
|
||||||
|
{cv.string: cv.string},
|
||||||
|
# New extended schema with mode support
|
||||||
|
EXTENDED_THEME_SCHEMA,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema(
|
CONFIG_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
DOMAIN: vol.Schema(
|
DOMAIN: vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_FRONTEND_REPO): cv.isdir,
|
vol.Optional(CONF_FRONTEND_REPO): cv.isdir,
|
||||||
vol.Optional(CONF_THEMES): vol.Schema(
|
vol.Optional(CONF_THEMES): THEME_SCHEMA,
|
||||||
{cv.string: {cv.string: cv.string}}
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_EXTRA_MODULE_URL): vol.All(
|
vol.Optional(CONF_EXTRA_MODULE_URL): vol.All(
|
||||||
cv.ensure_list, [cv.string]
|
cv.ensure_list, [cv.string]
|
||||||
),
|
),
|
||||||
|
@ -26,6 +26,25 @@ from tests.common import async_capture_events, async_fire_time_changed
|
|||||||
MOCK_THEMES = {
|
MOCK_THEMES = {
|
||||||
"happy": {"primary-color": "red", "app-header-background-color": "blue"},
|
"happy": {"primary-color": "red", "app-header-background-color": "blue"},
|
||||||
"dark": {"primary-color": "black"},
|
"dark": {"primary-color": "black"},
|
||||||
|
"light_only": {
|
||||||
|
"primary-color": "blue",
|
||||||
|
"modes": {
|
||||||
|
"light": {"secondary-color": "black"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"dark_only": {
|
||||||
|
"primary-color": "blue",
|
||||||
|
"modes": {
|
||||||
|
"dark": {"secondary-color": "white"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"light_and_dark": {
|
||||||
|
"primary-color": "blue",
|
||||||
|
"modes": {
|
||||||
|
"light": {"secondary-color": "black"},
|
||||||
|
"dark": {"secondary-color": "white"},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_THEMES = {DOMAIN: {CONF_THEMES: MOCK_THEMES}}
|
CONFIG_THEMES = {DOMAIN: {CONF_THEMES: MOCK_THEMES}}
|
||||||
@ -279,6 +298,15 @@ async def test_themes_set_dark_theme(hass, themes_ws_client):
|
|||||||
|
|
||||||
assert msg["result"]["default_dark_theme"] is None
|
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):
|
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."""
|
"""Test frontend.set_theme service called with mode dark and wrong name."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user