Sure! Just as a note, I use two separate files for light and dark modes instead of a combined one, and I switch between them using an automation. I just find it more flexible for my use cases. I’m sharing the dark version, since both at once don’t fit into the reply.
There are also a lot of custom colors in there. They are mainly used for my paper-buttons-row cards shown in the screenshots, along with various CSS variables for other custom cards.
Also, keep in mind there are probably some outdated variables in there too and many are missing because I have been too lazy to figure them out. I would not call it a “complete theme”, but it should give you a good start.
Mandalo Dark
Mandalo (Dark):
# Mandalo custom
card-background-light: 'rgba(255,255,255, 0.04)'
card-background-active: '#979CA4'
card-background-semi-transparent: 'rgba(0, 0, 0, 0.2)'
card-background-inverted: '#202124'
card-item-background: 'var(--background-color)'
dashboard-background: '#161719'
album-cover-gradient: 'rgba(0,0,0,0.4)'
gradient-background: 'linear-gradient(180deg, rgba(0,0,0,0) 0%, #161719 100%)'
accent-color-dashboard: 'var(--accent-color)'
accent-color-dashboard-background: 'rgba(84, 124, 140, 0.2)'
accent-medium-color: 'var(--accent-color)'
accent-active-color: 'var(--accent-color)'
accent-timer-bar: 'var(--accent-color)'
accent-light-on: '#98867C'
accent-light-on-background: 'rgba(152, 134, 124, 0.2)'
thermometer-accent: 'rgba(239,104,55,0.5)'
thermometer-background: 'rgba(239,104,55,0.2)'
temperature-accent: 'rgba(123, 82, 41, 1)'
temperature-background: 'rgba(255,195,113,0.4)'
humidity-accent: '#397E96'
humidity-background: 'rgba(57, 126, 150, 0.2)'
card-item-shadow: '0 2px 4px 0 rgba(0, 0, 0, 0.9), 0 1px 2px 0 rgba(0, 0, 0, 0.8)'
card-shadow-color: 'rgba(0, 0, 0, 0.65)'
navbar-shadow: '0px -6px 25px rgba(0, 0, 0, 0.6)'
popup-background: '#161719'
backdrop-background-color: 'rgba(22, 23, 25, 0.6)'
icon-color: '#9BA1A6'
text-color-active: '#FFFFFF'
text-color-semi-transparent: 'rgba(225, 227, 230, 0.6)'
text-medium-light-color: 'var(--text-color)'
text-medium-color: '#8A8F96'
dark-primary-color: '#3F5D6B'
darker-primary-color: '#2A404A'
# Base
background-color: '#161719'
card-background: '#202124'
# Accent
accent-color: '#547C8C'
primary-color: 'var(--accent-color)'
# Shadows
card-shadow: '0 4px 8px 0 rgba(0, 0, 0, 0.9), 0 2px 4px 0 rgba(0, 0, 0, 0.8)'
card-border: none
border-radius: '22px'
border-radius-inner: '100px'
# App shell
app-header-background-color: '#161719'
app-header-backdrop-filter: 'blur(12px)'
app-footer-background-color: 'rgba(22, 23, 25, 0.2)'
transparent-app-footer-background-color: 'rgba(22, 23, 25, 0.6)'
primary-background-color: 'var(--background-color)'
header-height: 60px
secondary-background-color: 'var(--card-background-light)'
markdown-code-background-color: 'var(--background-color)'
# Swipe card
simple-swipe-card-pagination-dot-active-color: 'var(--accent-color)'
# Bubble
bubble-light-color: 'var(--accent-light-on)'
bubble-backdrop-background-color: 'rgba(22, 23, 25, 0.6)'
bubble-pop-up-main-background-color: 'var(--popup-background)'
bubble-border-radius: 'var(--border-radius)'
bubble-select-background: 'var(--card-background)'
bubble-select-list-background-color: 'var(--card-background)'
bubble-select-main-background-color: 'var(--card-background)'
bubble-media-player-main-background-color: 'var(--card-background)'
bubble-select-list-width: '140px'
bubble-icon-background-color: 'var(--card-item-background)'
bubble-main-background-color: 'var(--card-background)'
bubble-secondary-background-color: 'var(--card-item-background)'
bubble-accent-color: 'var(--accent-color-dashboard)'
bubble-sub-button-light-background-color: 'var(--accent-color-dashboard-background)'
bubble-line-background-color: 'var(--text-color-semi-transparent)'
# Fonts
primary-font-family: "'Montserrat', sans-serif"
ha-font-family-body: "var(--primary-font-family)"
ha-font-family-heading: "var(--primary-font-family)"
ha-font-family-code: "var(--primary-font-family)"
ha-font-family-longform: "var(--primary-font-family)"
mdc-typography-font-family: "var(--primary-font-family)"
md-ref-typeface-plain: "var(--primary-font-family)"
paper-font-common-base_-_font-family: "var(--primary-font-family)"
paper-font-common-code_-_font-family: "var(--primary-font-family)"
paper-font-body1_-_font-family: "var(--primary-font-family)"
paper-font-subhead_-_font-family: "var(--primary-font-family)"
paper-font-headline_-_font-family: "var(--primary-font-family)"
paper-font-caption_-_font-family: "var(--primary-font-family)"
paper-font-title_-_font-family: "var(--primary-font-family)"
ha-card-header-font-family: "var(--primary-font-family)"
ha-line-height-normal: '1.3'
ha-line-height-condensed: '1.1'
ha-line-height-expanded: '1.6'
md-list-item-label-text-weight: '600'
ha-font-weight-normal: '400'
ha-font-weight-medium: '500'
ha-font-weight-bold: '700'
ha-font-smoothing: 'antialiased'
# Weather card
awc-text-day: 'var(--text-color)'
awc-text-night: 'var(--text-color)'
# Text
text-color: '#E1E3E6'
primary-text-color: 'var(--text-color)'
text-primary-color: 'var(--text-color-active)'
sidebar-text-color: 'var(--text-color)'
secondary-text-color: 'var(--text-color-semi-transparent)'
wa-color-text-normal: 'var(--text-color)'
ha-color-text-secondary: 'var(--text-color)'
disabled-text-color: '#61656B'
mdc-dialog-content-ink-color: 'var(--text-color)'
# Layout
ha-view-sections-narrow-column-gap: 28px
ha-view-sections-row-gap: 0px
horizontal-stack-card-gap: 12px
vertical-stack-card-margin: 0px
vertical-stack-card-gap: 12px
masonry-view-card-margin: 0px
grid-card-gap: '12px'
# Inputs
mdc-text-field-fill-color: 'var(--background-color)'
mdc-text-field-ink-color: 'var(--text-color)'
mdc-select-fill-color: 'var(--card-item-background)'
mdc-text-field-label-ink-color: 'var(--secondary-text-color)'
input-fill-color: 'var(--card-background)'
input-ink-color: 'var(--text-color)'
input-label-ink-color: 'var(--text-color)'
input-disabled-fill-color: 'var(--background-color)'
input-disabled-ink-color: 'var(--disabled-text-color)'
input-disabled-label-ink-color: 'var(--disabled-text-color)'
input-idle-line-color: 'var(--background-color)'
input-dropdown-icon-color: 'var(--secondary-text-color)'
input-hover-line-color: 'var(--primary-color)'
paper-input-container-focus-color: 'var(--accent-color)'
# Material design
mdc-theme-secondary: 'var(--accent-color)'
mdc-theme-on-primary: 'var(--text-color-active)'
mdc-theme-on-secondary: 'var(--text-color-active)'
mdc-theme-primary: 'var(--primary-color)'
mdc-button-outline-color: 'var(--text-color)'
ha-ripple-hover-opacity: '0.1'
ha-ripple-pressed-opacity: '0.2'
ha-ripple-hover-color: 'var(--accent-color-dashboard-background)'
ha-ripple-color: 'var(--card-item-background)'
ha-ripple-pressed-color: 'var(--accent-color-dashboard-background)'
# Cards
card-background-color: 'var(--card-background)'
ha-card-background: 'var(--card-background)'
ha-card-box-shadow: 'var(--card-shadow)'
ha-card-border-radius: 'var(--border-radius)'
ha-card-border-style: 'none !important'
ha-card-border-width: '0px'
ha-card-border-color: 'none !important'
border-color: 'none'
border-style: 'none !important'
outline-color: 'var(--card-background-light)'
# Entity icons
paper-item-icon-color: 'var(--text-color)'
paper-item-icon-active-color: 'var(--accent-color)'
state-icon-color: 'var(--text-color)'
state-active-color: 'var(--accent-color)'
# Sidebar
sidebar-background-color: 'var(--card-item-background)'
sidebar-icon-color: 'var(--text-color)'
sidebar-selected-icon-color: 'var(--accent-color)'
sidebar-selected-text-color: 'var(--text-color)'
paper-listbox-background-color: 'var(--sidebar-background-color)'
divider-color: 'var(--background-color)'
light-primary-color: 'var(--ha-card-background)'
# Sliders
paper-slider-knob-color: 'var(--accent-color)'
paper-slider-pin-color: 'var(--background-color)'
paper-slider-active-color: 'var(--accent-color)'
paper-slider-container-color: 'var(--background-color)'
# Toggles
paper-toggle-button-checked-bar-color: 'var(--accent-color)'
switch-unchecked-color: 'var(--card-item-background)'
switch-checked-button-color: 'var(--accent-color)'
switch-unchecked-track-color: 'var(--background-color)'
switch-checked-track-color: 'var(--background-color)'
# Radio
paper-radio-button-checked-color: 'var(--accent-color)'
# Popups
more-info-header-background: 'rgba(32, 33, 36, 0.9)'
paper-dialog-background-color: 'rgba(32, 33, 36, 0.9)'
# Tables
table-row-background-color: 'var(--background-color)'
table-row-alternative-background-color: 'var(--ha-card-background)'
# Badges
label-badge-background-color: 'var(--background-color)'
label-badge-text-color: 'var(--text-primary-color)'
label-badge-red: 'rgba(255,85,105,1)'
label-badge-blue: 'rgba(42,180,255,1)'
label-badge-green: 'rgba(0,230,154,1)'
label-badge-yellow: 'rgba(219,165,48,1)'
# Custom header
ch-background: 'var(--background-color)'
ch-active-tab-color: 'var(--accent-color)'
ch-notification-dot-color: 'var(--accent-color)'
ch-all-tabs-color: 'var(--sidebar-icon-color)'
ch-tab-indicator-color: 'var(--accent-color)'
# Header tabs
ha-tab-active-text-color: 'var(--accent-color)'
ha-tab-indicator-color: 'var(--accent-color)'
app-header-selection-bar-color: 'var(--accent-color)'
# Mini media player
mini-media-player-base-color: 'var(--text-color)'
mini-media-player-accent-color: 'var(--accent-color)'
# Paper buttons
pbs-button-color: 'var(--text-color)'
pbs-button-rgb-color: 'var(--text-color)'
pbs-button-rgb-state-color: 'var(--text-color)'
pbs-button-rgb-default-color: 'var(--text-color)'
pbs-button-rgb-fallback: 'var(--text-color)'
rgb-state-default-color: 'var(--text-color)'
# Editor
code-editor-background-color: 'var(--background-color)'
codemirror-property: 'var(--accent-color)'
info-color: 'var(--accent-color)'
ha-color-fill-primary-quiet-resting: 'var(--ha-card-background)'
# MDC surface
mdc-theme-background: 'var(--primary-background-color)'
mdc-theme-surface: 'var(--card-background)'
# Outline
outline-hover-color: 'rgba(255,255,255,0.24)'
# RGB
rgb-primary-color: '84, 124, 140'
rgb-accent-color: '84, 124, 140'
rgb-primary-text-color: '225, 227, 230'
rgb-secondary-text-color: '138, 143, 150'
rgb-text-primary-color: '255,255,255'
rgb-card-background-color: '32, 33, 36'
rgb-warning-color: '255,166,0'
rgb-error-color: '219,68,55'
rgb-success-color: '67,160,71'
rgb-info-color: '3,155,229'
# Status
scrollbar-thumb-color: 'rgb(100, 100, 100)'
error-color: '#DB4437'
warning-color: '#FFA600'
success-color: '#43A047'
clear-background-color: 'var(--background-color)'
label-badge-grey: '#9E9E9E'
disabled-color: 'var(--disabled-text-color)'
# Palette
red-color: '#F44336'
pink-color: '#E91E63'
purple-color: '#926BC7'
deep-purple-color: '#6E41AB'
indigo-color: '#3F51B5'
blue-color: '#2196F3'
light-blue-color: '#03A9F4'
cyan-color: '#00BCD4'
teal-color: '#009688'
green-color: '#4CAF50'
light-green-color: '#8BC34A'
lime-color: '#CDDC39'
yellow-color: '#FFEB3B'
amber-color: '#FFC107'
orange-color: '#FF9800'
deep-orange-color: '#FF6F22'
brown-color: '#795548'
light-grey-color: '#BDBDBD'
grey-color: '#9E9E9E'
dark-grey-color: '#606060'
blue-grey-color: '#607D8B'
black-color: '#000000'
white-color: '#FFFFFF'
history-unavailable-color: 'transparent'
# Input borders
input-disabled-line-color: 'rgba(255,255,255,0.06)'
input-outlined-idle-border-color: 'rgba(255,255,255,0.38)'
input-outlined-hover-border-color: 'rgba(255,255,255,0.87)'
input-outlined-disabled-border-color: 'rgba(255,255,255,0.06)'
# State
state-inactive-color: 'var(--grey-color)'
state-unavailable-color: 'var(--disabled-text-color)'
state-icon-error-color: 'var(--error-color)'
history-unknown-color: 'var(--dark-grey-color)'
switch-checked-color: 'var(--accent-color)'
switch-unchecked-button-color: 'var(--switch-unchecked-color)'
slider-color: 'var(--accent-color)'
slider-secondary-color: 'var(--light-primary-color)'
slider-track-color: 'var(--scrollbar-thumb-color)'
# Data tables
table-header-background-color: 'var(--card-background)'
data-table-background-color: 'var(--card-background)'
bar-box-shadow: 'var(--card-shadow)'
# MDC extended
mdc-theme-on-surface: 'var(--text-color)'
mdc-theme-text-disabled-on-light: 'var(--disabled-text-color)'
mdc-theme-text-primary-on-background: 'var(--primary-text-color)'
mdc-theme-text-secondary-on-background: 'var(--secondary-text-color)'
mdc-theme-text-hint-on-background: 'var(--secondary-text-color)'
mdc-theme-text-icon-on-background: 'var(--secondary-text-color)'
mdc-theme-error: 'var(--error-color)'
# Header
app-header-text-color: 'var(--text-color)'
app-theme-color: 'var(--app-header-background-color)'
# Controls
mdc-checkbox-unchecked-color: 'rgba(var(--rgb-primary-text-color),0.54)'
mdc-checkbox-disabled-color: 'var(--disabled-text-color)'
mdc-radio-unchecked-color: 'rgba(var(--rgb-primary-text-color),0.54)'
mdc-radio-disabled-color: 'var(--disabled-text-color)'
mdc-tab-text-label-color-default: 'var(--primary-text-color)'
mdc-button-disabled-ink-color: 'var(--disabled-text-color)'
mdc-dialog-scroll-divider-color: 'var(--divider-color)'
mdc-dialog-heading-ink-color: 'var(--primary-text-color)'
mdc-top-app-bar-fixed-box-shadow: 'var(--bar-box-shadow)'
# MDC text field / select
mdc-text-field-idle-line-color: 'var(--input-idle-line-color)'
mdc-text-field-hover-line-color: 'var(--input-hover-line-color)'
mdc-text-field-disabled-line-color: 'var(--input-disabled-line-color)'
mdc-text-field-outlined-idle-border-color: 'var(--input-outlined-idle-border-color)'
mdc-text-field-outlined-hover-border-color: 'var(--input-outlined-hover-border-color)'
mdc-text-field-outlined-disabled-border-color: 'var(--input-outlined-disabled-border-color)'
mdc-text-field-disabled-fill-color: 'var(--input-disabled-fill-color)'
mdc-text-field-disabled-ink-color: 'var(--input-disabled-ink-color)'
mdc-select-idle-line-color: 'var(--input-idle-line-color)'
mdc-select-hover-line-color: 'var(--input-hover-line-color)'
mdc-select-outlined-idle-border-color: 'var(--input-outlined-idle-border-color)'
mdc-select-outlined-hover-border-color: 'var(--input-outlined-hover-border-color)'
mdc-select-outlined-disabled-border-color: 'var(--input-outlined-disabled-border-color)'
mdc-select-disabled-fill-color: 'var(--input-disabled-fill-color)'
mdc-select-ink-color: 'var(--input-ink-color)'
mdc-select-label-ink-color: 'var(--input-label-ink-color)'
mdc-select-disabled-ink-color: 'var(--input-disabled-ink-color)'
mdc-select-dropdown-icon-color: 'var(--input-dropdown-icon-color)'
mdc-select-disabled-dropdown-icon-color: 'var(--input-disabled-ink-color)'
# Chips
ha-assist-chip-filled-container-color: 'rgba(var(--rgb-primary-text-color),0.15)'
ha-assist-chip-active-container-color: 'rgba(var(--rgb-primary-color),0.15)'
chip-background-color: 'rgba(var(--rgb-primary-text-color),0.15)'
# Vaadin
material-body-text-color: 'var(--text-color)'
material-background-color: 'var(--card-background)'
material-secondary-background-color: 'var(--secondary-background-color)'
material-secondary-text-color: 'var(--secondary-text-color)'
# Buttons
ha-button-primary-light-color: '#547C8C40'
ha-button-warning-light-color: '#917B54C1'
ha-button-neutral-color: '#D9DAE0'
ha-button-neutral-light-color: '#6A7081'
# State domains
state-alarm_control_panel-armed_away-color: 'var(--green-color)'
state-alarm_control_panel-armed_custom_bypass-color: 'var(--green-color)'
state-alarm_control_panel-armed_home-color: 'var(--green-color)'
state-alarm_control_panel-armed_night-color: 'var(--green-color)'
state-alarm_control_panel-armed_vacation-color: 'var(--green-color)'
state-alarm_control_panel-arming-color: 'var(--orange-color)'
state-alarm_control_panel-disarming-color: 'var(--orange-color)'
state-alarm_control_panel-pending-color: 'var(--orange-color)'
state-alarm_control_panel-triggered-color: 'var(--red-color)'
state-alert-off-color: 'var(--orange-color)'
state-alert-on-color: 'var(--red-color)'
state-binary_sensor-active-color: 'var(--amber-color)'
state-binary_sensor-battery-on-color: 'var(--red-color)'
state-binary_sensor-carbon_monoxide-on-color: 'var(--red-color)'
state-binary_sensor-gas-on-color: 'var(--red-color)'
state-binary_sensor-heat-on-color: 'var(--red-color)'
state-binary_sensor-lock-on-color: 'var(--red-color)'
state-binary_sensor-moisture-on-color: 'var(--red-color)'
state-binary_sensor-problem-on-color: 'var(--red-color)'
state-binary_sensor-safety-on-color: 'var(--red-color)'
state-binary_sensor-smoke-on-color: 'var(--red-color)'
state-binary_sensor-sound-on-color: 'var(--red-color)'
state-binary_sensor-tamper-on-color: 'var(--red-color)'
state-climate-auto-color: 'var(--green-color)'
state-climate-cool-color: 'var(--blue-color)'
state-climate-dry-color: 'var(--orange-color)'
state-climate-fan_only-color: 'var(--cyan-color)'
state-climate-heat-color: 'var(--deep-orange-color)'
state-climate-heat-cool-color: 'var(--amber-color)'
state-cover-active-color: 'var(--purple-color)'
state-device_tracker-active-color: 'var(--blue-color)'
state-device_tracker-home-color: 'var(--green-color)'
state-fan-active-color: 'var(--cyan-color)'
state-humidifier-on-color: 'var(--blue-color)'
state-lawn_mower-error-color: 'var(--red-color)'
state-lawn_mower-mowing-color: 'var(--teal-color)'
state-light-active-color: 'var(--amber-color)'
state-lock-jammed-color: 'var(--red-color)'
state-lock-locked-color: 'var(--green-color)'
state-lock-locking-color: 'var(--orange-color)'
state-lock-unlocked-color: 'var(--red-color)'
state-lock-unlocking-color: 'var(--orange-color)'
state-lock-open-color: 'var(--red-color)'
state-lock-opening-color: 'var(--orange-color)'
state-media_player-active-color: 'var(--light-blue-color)'
state-person-active-color: 'var(--blue-color)'
state-person-home-color: 'var(--green-color)'
state-plant-active-color: 'var(--red-color)'
state-siren-active-color: 'var(--red-color)'
state-sun-above_horizon-color: 'var(--amber-color)'
state-sun-below_horizon-color: 'var(--indigo-color)'
state-switch-active-color: 'var(--amber-color)'
state-update-active-color: 'var(--orange-color)'
state-vacuum-active-color: 'var(--teal-color)'
state-valve-active-color: 'var(--blue-color)'
state-sensor-battery-high-color: 'var(--green-color)'
state-sensor-battery-low-color: 'var(--red-color)'
state-sensor-battery-medium-color: 'var(--orange-color)'
state-water_heater-eco-color: 'var(--green-color)'
state-water_heater-electric-color: 'var(--orange-color)'
state-water_heater-gas-color: 'var(--orange-color)'
state-water_heater-heat_pump-color: 'var(--orange-color)'
state-water_heater-high_demand-color: 'var(--deep-orange-color)'
state-water_heater-performance-color: 'var(--deep-orange-color)'
state-icon-unavailable-color: 'var(--disabled-text-color)'
error-state-color: 'var(--error-color)'
# Card-mod
card-mod-theme: "Mandalo (Dark)"
# Dialogs
dialog-backdrop-filter: blur(18px)
iron-overlay-backdrop-opacity: 1
iron-overlay-backdrop-background-color: rgba(0,0,0,0.45)
dialog-border-radius: 20px
dialog-box-shadow: '0 10px 36px #00000088'
# Card-mod more-info
card-mod-more-info-yaml: |
$: |
.mdc-dialog__scrim {
background: rgba(255,255,255,0) !important;
}
.mdc-dialog .mdc-dialog__content {
background: rgba(255,255,255,0.0) !important;
}
.mdc-dialog__container .mdc-dialog__surface {
box-shadow: none !important;
backdrop-filter: blur(18px) !important;
border-radius: 0px !important;
}
ha-dialog-header: |
.header-bar {
box-shadow: var(--card-shadow) !important;
}
.breadcrumb { display: none !important; }
h2 { font-size: 2.2rem !important; font-weight: 600 !important; }
ha-more-info-state-header: |
.last-changed { display: none !important; }
ha-attributes { display: none !important; }