Skip to content

Samsung SmartThing status#130

Open
tartimouche wants to merge 1 commit intoAnashost:mainfrom
tartimouche:patch-1
Open

Samsung SmartThing status#130
tartimouche wants to merge 1 commit intoAnashost:mainfrom
tartimouche:patch-1

Conversation

@tartimouche
Copy link
Copy Markdown

Hi!
First of all, thanks for sharing your work.
I’d like to suggest a small modification to include all the possible statuses the Samsung SmartThings API can return for a washing machine.

Add options for samsung smartthing:

  • air_wash
  • ai_rinse
  • ai_spin
  • ai_wash
  • cooling
  • delay_wash
  • drying
  • finish
  • none
  • pre_wash
  • rinse
  • spin
  • wash
  • weight_sensing
  • wrinkle_prevent
  • freeze_protection

Add options for samsung smartthing: 
  - air_wash
  - ai_rinse
  - ai_spin
  - ai_wash
  - cooling
  - delay_wash
  - drying
  - finish
  - none
  - pre_wash
  - rinse
  - spin
  - wash
  - weight_sensing
  - wrinkle_prevent
  - freeze_protection
@deddroid
Copy link
Copy Markdown

hi, I workedd on the same thing and first i try to put everything on my own, after this asked to claude ai, and I got these 2 working yaml, 1 for WASHER and 1 for DRYER

WASHER

type: custom:mushroom-entity-card
entity: sensor.washing_machine_status
name: Smart Washing Machine
icon: mdi:washing-machine
primary_info: name
secondary_info: state
tap_action:
  action: more-info
icon_color: light-grey
fill_container: false
hold_action:
  action: more-info
  entity: sensor.smart_plug_power
double_tap_action:
  action: more-info
grid_options:
  columns: 12
  rows: 2
card_mod:
  style:
    .: |
      ha-card {
        /* ======================== */
        /* USER CONFIGURATION       */
        /* ======================== */

        /* 1. ENTITIES */
        {% set ent_progress  = 'sensor.washing_machine_progress' %}
        {% set ent_timerem   = 'sensor.washing_machine_time_remaining' %}
        {% set max_time = 120 %}
        {% set ent_power     = 'sensor.smart_plug_power' %}

        /* OPTIONAL Progress Percentage Sensor (if exists) */
        {% set ent_percent   = 'sensor.washing_machine_progress_percentage' %}

        /* 2. SIZES (Px) */
        --config-icon-size:       65px;
        --config-font-primary:    15px;
        --config-font-secondary:  12px;
        --config-font-badge:      12px;
        /* ======================== */

        /* --- SENSORS & TIME --- */
        {% set status = states(ent_progress) %}

        /* Fix underscore e trattini, poi Title Case */
        {% set status_clean = status | replace('_', ' ') | replace('-', ' ') | title %}

        /* --- DETECT TIME REMAINING FORMAT --- */
        {% set raw_val = states(ent_timerem) | string %}

        /* Check if Timestamp */
        {% if '-' in raw_val and ':' in raw_val %}
          {% set end_ts = raw_val | as_datetime %}
          {% if end_ts %}
             {% set time_rem = ((end_ts - now()).total_seconds() / 60) | int %}
          {% else %}
             {% set time_rem = 0 %}
          {% endif %}

        /* Check if (00:00 or 0:00:00) */
        {% elif ':' in raw_val %}
          {% set parts = raw_val.split(':') %}
          {% if parts | length == 3 %}
             /* Format H:M:S -> Convert to minutes */
             {% set time_rem = (parts[0]|int * 60) + (parts[1]|int) + (parts[2]|int / 60) %}
          {% elif parts | length == 2 %}
             /* Format H:M -> Convert to minutes */
             {% set time_rem = (parts[0]|int * 60) + (parts[1]|int) %}
          {% else %}
             {% set time_rem = 0 %}
          {% endif %}

        /* Default to Minutes */
        {% else %}
          {% set time_rem = raw_val | float(0) | int %}
        {% endif %}

        /* Prevent negative numbers */
        {% set time_rem = time_rem | int %}
        {% if time_rem < 0 %}
          {% set time_rem = 0 %}
        {% endif %}

        {% set raw_percent = states(ent_percent) | float(-1) %}

        /* --- POWER CALCULATION --- */
        {% set raw_power = states(ent_power) %}
        {% if is_number(raw_power) %}
            {% set power_w = raw_power | float(0) | round %}
            {% set power_text = ' • ' ~ power_w ~ 'W' %}
        {% else %}
            {% set power_text = '' %}
        {% endif %}

        /* Format Time (min -> Xh Ym) */
        {% set hours = (time_rem / 60) | int %}
        {% set mins = time_rem % 60 %}
        {% set time_formatted = '%dh %02dm' | format(hours, mins) %}

        /* --- STATE DEFINITIONS --- */
        {% set s_lower = status | lower %}

        {% set is_washing  = s_lower in ['wash', 'ai_wash', 'pre_wash', 'soak'] %}
        {% set is_rinsing  = s_lower in ['rinse', 'ai_rinse'] %}
        {% set is_spinning = s_lower in ['spin', 'ai_spin'] %}
        {% set is_drying   = s_lower in ['drying', 'dry'] %}
        {% set is_airwash  = s_lower in ['air_wash'] %}
        {% set is_cooling  = s_lower in ['cooling'] %}
        {% set is_refresh  = s_lower in ['wrinkle_prevent'] %}
        {% set is_sensing  = s_lower in ['weight_sensing'] %}
        {% set is_done     = s_lower in ['finish', 'finished', 'complete', 'end'] %}
        {% set is_idle     = s_lower in ['none', 'delay_wash', 'freeze_protection', 'idle', 'off', 'standby', 'unknown', 'unavailable'] %}

        /* --- PROGRESS CALCULATION --- */
        {% if is_idle %}
           {% set progress = 0 %}
           {% set badge_text = status_clean ~ power_text %}
        {% else %}
           {% if raw_percent >= 0 %}
              {% set progress = raw_percent | int %}
           {% else %}
              {% set calc_prog = ((max_time - time_rem) / max_time * 100) | int %}
              {% set progress = [5, [calc_prog, 100] | min] | max %}
           {% endif %}
           {% set badge_text = status_clean ~ ' • ' ~ time_formatted ~ power_text %}
        {% endif %}

        /* --- ASSIGN COLORS & ANIMATIONS --- */
        {% if is_washing %}
          /* Blu - lavaggio principale e pre-lavaggio */
          {% set color = '33, 150, 243' %}
          {% set anim_type = 'bubbles 1s linear infinite' %}
          {% set icon_shake = 'shake 1.5s ease-in-out infinite' %}
          {% set wave_anim = 'wave 4s linear infinite' %}
          {% set overlay_img = 'radial-gradient(2px 2px at 20% 80%, white, transparent), radial-gradient(2px 2px at 50% 70%, white, transparent)' %}

        {% elif is_rinsing %}
          /* Azzurro chiaro - risciacquo (distinto dal lavaggio) */
          {% set color = '79, 195, 247' %}
          {% set anim_type = 'bubbles 1.5s linear infinite' %}
          {% set icon_shake = 'shake 2s ease-in-out infinite' %}
          {% set wave_anim = 'wave 5s linear infinite' %}
          {% set overlay_img = 'radial-gradient(2px 2px at 30% 75%, white, transparent), radial-gradient(2px 2px at 65% 60%, white, transparent)' %}

        {% elif is_spinning %}
          /* Cyan - centrifuga */
          {% set color = '0, 229, 255' %}
          {% set anim_type = 'none' %}
          {% set icon_shake = 'washer-spin-smooth 0.8s linear infinite' %}
          {% set wave_anim = 'wave 2s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.3) 10%, transparent 60%)' %}

        {% elif is_drying %}
          /* Arancio - asciugatura */
          {% set color = '255, 152, 0' %}
          {% set anim_type = 'steam-rise 2s ease-in-out infinite' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'wave 4s linear infinite' %}
          {% set overlay_img = 'linear-gradient(0deg, transparent, rgba(255,255,255,0.5), transparent)' %}

        {% elif is_airwash %}
          /* Verde acqua - lavaggio ad aria (senza acqua) */
          {% set color = '0, 188, 212' %}
          {% set anim_type = 'breeze 3s ease-in-out infinite' %}
          {% set icon_shake = 'wobble 2s ease-in-out infinite' %}
          {% set wave_anim = 'wave 6s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.4) 0%, transparent 70%)' %}

        {% elif is_cooling %}
          /* Blu freddo - raffreddamento finale */
          {% set color = '100, 181, 246' %}
          {% set anim_type = 'breeze 4s ease-in-out infinite' %}
          {% set icon_shake = 'wobble 3s ease-in-out infinite' %}
          {% set wave_anim = 'wave 7s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.35) 0%, transparent 70%)' %}

        {% elif is_refresh %}
          /* Turchese - anti-piega */
          {% set color = '38, 198, 218' %}
          {% set anim_type = 'breeze 5s ease-in-out infinite' %}
          {% set icon_shake = 'wobble 4s ease-in-out infinite' %}
          {% set wave_anim = 'wave 9s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)' %}

        {% elif is_sensing %}
          /* Viola - rilevamento peso */
          {% set color = '156, 39, 176' %}
          {% set anim_type = 'pulse-sense 1.5s ease-in-out infinite' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'wave 10s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 60%)' %}

        {% elif is_done %}
          /* Verde - ciclo completato */
          {% set color = '76, 175, 80' %}
          {% set anim_type = 'sparkle 2s infinite' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'wave 4s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.8) 10%, transparent 60%)' %}

        {% else %}
          /* Grigio - idle / none / delay_wash / ecc. */
          {% set color = '158, 158, 158' %}
          {% set anim_type = 'none' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'none' %}
          {% set overlay_img = 'none' %}
        {% endif %}

        /* --- OUTPUT VARIABLES --- */
        --wm-color: {{ color }};
        --wm-level: {{ progress }}%;
        --wm-anim-overlay: {{ anim_type }};
        --wm-anim-shake: {{ icon_shake }};
        --wm-anim-wave: {{ wave_anim }};
        --wm-overlay-bg: {{ overlay_img }};
        --wm-badge-content: "{{ badge_text }}";

        transition: all 0.5s ease;
        overflow: hidden;
      }

      /* BADGE */
      ha-card::before {
        content: var(--wm-badge-content);
        position: absolute;
        top: 10px; right: 10px;
        background: rgba(var(--wm-color), 0.15);
        color: rgb(var(--wm-color));
        border: 1px solid rgba(var(--wm-color), 0.3);
        padding: 2px 10px;
        border-radius: 12px;
        font-weight: 600;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        font-size: var(--config-font-badge);
      }

      /* BAR */
      ha-card::after {
        content: '';
        position: absolute;
        bottom: 0; left: 0;
        height: 4px;
        width: var(--wm-level);
        background: rgb(var(--wm-color));
        box-shadow: 0 0 10px rgb(var(--wm-color));
        transition: width 0.5s ease;
      }
    mushroom-shape-icon$: |
      .shape {
        --icon-size: var(--config-icon-size) !important;
        background: rgba(255, 255, 255, 0.05) !important;
        overflow: hidden;
        position: relative;
        border: 1px solid rgba(255,255,255,0.1);

        animation: var(--wm-anim-shake) !important;
        transform-origin: center center;
      }

      /* Wave Layer */
      .shape::before {
        content: '';
        position: absolute;
        left: -50%;
        width: 200%; height: 200%;
        top: calc(100% - var(--wm-level));
        background: rgba(var(--wm-color), 0.6);
        border-radius: 40%;
        animation: var(--wm-anim-wave);
      }

      /* Overlay Layer */
      .shape::after {
        content: '';
        position: absolute;
        inset: 0;
        background-image: var(--wm-overlay-bg);
        background-size: 100% 100%;
        animation: var(--wm-anim-overlay);
        z-index: 2;
      }

      /* The Icon Itself */
      ha-icon {
        z-index: 3;
        mix-blend-mode: overlay;
        color: white !important;
      }

      /* --- KEYFRAMES --- */
      @keyframes wave {
        from { transform: rotate(0deg); }
        to   { transform: rotate(360deg); }
      }
      @keyframes shake {
        0%, 100% { transform: rotate(0deg); }
        25% { transform: rotate(5deg) translateY(-1px); }
        75% { transform: rotate(-5deg) translateY(1px); }
      }
      @keyframes wobble {
        0%, 100% { transform: rotate(0deg); }
        50% { transform: rotate(5deg); }
      }
      @keyframes bubbles {
        0% { transform: translateY(10px); opacity: 0; }
        50% { opacity: 1; }
        100% { transform: translateY(-20px); opacity: 0; }
      }
      @keyframes steam-rise {
        0% { opacity: 0; transform: translateY(5px); }
        50% { opacity: 0.8; }
        100% { opacity: 0; transform: translateY(-10px); }
      }
      @keyframes breeze {
        0% { opacity: 0.2; transform: scale(0.95); }
        50% { opacity: 0.5; transform: scale(1.05); }
        100% { opacity: 0.2; transform: scale(0.95); }
      }
      @keyframes sparkle {
        0%, 100% { opacity: 0.3; transform: scale(0.9); }
        50% { opacity: 1; transform: scale(1.1); }
      }
      @keyframes pulse-sense {
        0%, 100% { opacity: 0.2; transform: scale(0.97); }
        50% { opacity: 0.45; transform: scale(1.03); }
      }
      @keyframes washer-spin-smooth {
        0%   { transform: rotate(0deg)   translate(0, 0); }
        25%  { transform: rotate(90deg)  translate(0.5px, 0.5px); }
        50%  { transform: rotate(180deg) translate(0, 0); }
        75%  { transform: rotate(270deg) translate(-0.5px, -0.5px); }
        100% { transform: rotate(360deg) translate(0, 0); }
      }
    mushroom-state-info$: |
      .container .primary {
        font-size: var(--config-font-primary) !important;
      }
      .container .secondary {
        font-size: var(--config-font-secondary) !important;
      }

DRYER

type: custom:mushroom-entity-card
entity: sensor.dryer_status
name: Smart Dryer
icon: mdi:tumble-dryer
primary_info: name
secondary_info: state
tap_action:
  action: more-info
icon_color: light-grey
fill_container: false
hold_action:
  action: more-info
  entity: sensor.smart_plug_power
double_tap_action:
  action: more-info
grid_options:
  columns: 12
  rows: 2
card_mod:
  style:
    .: |
      ha-card {
        /* ======================== */
        /* USER CONFIGURATION       */
        /* ======================== */

        /* 1. ENTITIES */
        {% set ent_progress  = 'sensor.dryer_progress' %}
        {% set ent_timerem   = 'sensor.dryer_time_remaining' %}
        {% set max_time = 160 %}
        {% set ent_power     = 'sensor.smart_plug_power' %}

        /* OPTIONAL Progress Percentage Sensor (if exists) */
        {% set ent_percent   = 'sensor.dryer_progress_percentage' %}

        /* 2. SIZES (Px) */
        --config-icon-size:       65px;
        --config-font-primary:    15px;
        --config-font-secondary:  12px;
        --config-font-badge:      12px;
        /* ======================== */

        /* --- SENSORS & TIME --- */
        {% set status = states(ent_progress) %}

        /* Fix underscore e trattini, poi Title Case */
        {% set status_clean = status | replace('_', ' ') | replace('-', ' ') | title %}

        /* --- DETECT TIME REMAINING FORMAT --- */
        {% set raw_val = states(ent_timerem) | string %}

        /* Check if Timestamp */
        {% if '-' in raw_val and ':' in raw_val %}
          {% set end_ts = raw_val | as_datetime %}
          {% if end_ts %}
             {% set time_rem = ((end_ts - now()).total_seconds() / 60) | int %}
          {% else %}
             {% set time_rem = 0 %}
          {% endif %}

        /* Check if (00:00 or 0:00:00) */
        {% elif ':' in raw_val %}
          {% set parts = raw_val.split(':') %}
          {% if parts | length == 3 %}
             /* Format H:M:S -> Convert to minutes */
             {% set time_rem = (parts[0]|int * 60) + (parts[1]|int) + (parts[2]|int / 60) %}
          {% elif parts | length == 2 %}
             /* Format H:M -> Convert to minutes */
             {% set time_rem = (parts[0]|int * 60) + (parts[1]|int) %}
          {% else %}
             {% set time_rem = 0 %}
          {% endif %}

        /* Default to Minutes */
        {% else %}
          {% set time_rem = raw_val | float(0) | int %}
        {% endif %}

        /* Prevent negative numbers */
        {% set time_rem = time_rem | int %}
        {% if time_rem < 0 %}
          {% set time_rem = 0 %}
        {% endif %}

        {% set raw_percent = states(ent_percent) | float(-1) %}

        /* --- POWER CALCULATION --- */
        {% set raw_power = states(ent_power) %}
        {% if is_number(raw_power) %}
            {% set power_w = raw_power | float(0) | round %}
            {% set power_text = ' • ' ~ power_w ~ 'W' %}
        {% else %}
            {% set power_text = '' %}
        {% endif %}

        /* Format Time (min -> Xh Ym) */
        {% set hours = (time_rem / 60) | int %}
        {% set mins = time_rem % 60 %}
        {% set time_formatted = '%dh %02dm' | format(hours, mins) %}

        /* --- STATE DEFINITIONS --- */
        {% set s_lower = status | lower %}

        {% set is_drying    = s_lower in ['ai_drying', 'drying', 'tumble', 'dry', 'heat', 'heating', 'tumbling', 'sanitizing'] %}
        {% set is_cooling   = s_lower in ['cooling', 'ai_cooling', 'cool down', 'anti-crease'] %}
        {% set is_refresh   = s_lower in ['refreshing', 'wrinkle_prevent', 'air fluff', 'dehumidifying'] %}
        {% set is_sensing   = s_lower in ['weight_sensing'] %}
        {% set is_done      = s_lower in ['finished', 'complete', 'end'] %}
        {% set is_idle      = s_lower in ['idle', 'off', 'standby', 'none', 'delay_wash', 'internal_care', 'unknown', 'unavailable'] %}

        /* --- PROGRESS CALCULATION --- */
        {% if is_idle %}
           {% set progress = 0 %}
           {% set badge_text = status_clean ~ power_text %}
        {% else %}

           /* LOGIC: Use Sensor if available, otherwise Calculate */
           {% if raw_percent >= 0 %}
              {% set progress = raw_percent | int %}
           {% else %}
              {% set max_cycle_time = max_time %}
              {% set calc_prog = ((max_cycle_time - time_rem) / max_cycle_time * 100) | int %}
              {% set progress = [5, [calc_prog, 100] | min] | max %}
           {% endif %}

           /* Show Status + Time + Power */
           {% set badge_text = status_clean ~ ' • ' ~ time_formatted ~ power_text %}
        {% endif %}

        /* --- ASSIGN COLORS & ANIMATIONS --- */
        {% if is_drying %}
          {% set color = '255, 152, 0' %}
          {% set anim_type = 'steam-rise 2s ease-in-out infinite' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'wave 4s linear infinite' %}
          {% set overlay_img = 'linear-gradient(0deg, transparent, rgba(255,255,255,0.4), transparent)' %}

        {% elif is_cooling %}
          {% set color = '33, 150, 243' %}
          {% set anim_type = 'breeze 3s ease-in-out infinite' %}
          {% set icon_shake = 'wobble 2s ease-in-out infinite' %}
          {% set wave_anim = 'wave 6s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.5) 0%, transparent 70%)' %}

        {% elif is_refresh %}
          /* Turchese - cicli di refresh/wrinkle/dehumidify */
          {% set color = '0, 188, 212' %}
          {% set anim_type = 'breeze 4s ease-in-out infinite' %}
          {% set icon_shake = 'wobble 3s ease-in-out infinite' %}
          {% set wave_anim = 'wave 8s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.35) 0%, transparent 70%)' %}

        {% elif is_sensing %}
          /* Viola - rilevamento peso (fase iniziale breve) */
          {% set color = '156, 39, 176' %}
          {% set anim_type = 'pulse-sense 1.5s ease-in-out infinite' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'wave 10s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 60%)' %}

        {% elif is_done %}
          {% set color = '76, 175, 80' %}
          {% set anim_type = 'sparkle 2s infinite' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'wave 4s linear infinite' %}
          {% set overlay_img = 'radial-gradient(circle, rgba(255,255,255,0.8) 10%, transparent 60%)' %}

        {% else %}
          /* idle / none / delay_wash / ecc. */
          {% set color = '158, 158, 158' %}
          {% set anim_type = 'none' %}
          {% set icon_shake = 'none' %}
          {% set wave_anim = 'none' %}
          {% set overlay_img = 'none' %}
        {% endif %}

        /* --- OUTPUT VARIABLES --- */
        --dryer-color: {{ color }};
        --dryer-level: {{ progress }}%;
        --dryer-anim-overlay: {{ anim_type }};
        --dryer-anim-shake: {{ icon_shake }};
        --dryer-anim-wave: {{ wave_anim }};
        --dryer-overlay-bg: {{ overlay_img }};
        --dryer-badge-content: "{{ badge_text }}";

        transition: all 0.5s ease;
        overflow: hidden;
      }

      /* BADGE */
      ha-card::before {
        content: var(--dryer-badge-content);
        position: absolute;
        top: 10px; right: 10px;
        background: rgba(var(--dryer-color), 0.15);
        color: rgb(var(--dryer-color));
        border: 1px solid rgba(var(--dryer-color), 0.3);
        padding: 2px 10px;
        border-radius: 12px;
        text-transform: uppercase;
        font-weight: 600;
        letter-spacing: 0.5px;
        font-size: var(--config-font-badge);
      }

      /* BAR */
      ha-card::after {
        content: '';
        position: absolute;
        bottom: 0; left: 0;
        height: 4px;
        width: var(--dryer-level);
        background: rgb(var(--dryer-color));
        box-shadow: 0 0 10px rgb(var(--dryer-color));
        transition: width 0.5s ease;
      }
    mushroom-shape-icon$: |
      .shape {
        --icon-size: var(--config-icon-size) !important;
        background: rgba(255, 255, 255, 0.05) !important;
        overflow: hidden;
        position: relative;
        border: 1px solid rgba(255,255,255,0.1);

        animation: var(--dryer-anim-shake) !important;
        transform-origin: 50% 60%;
      }

      /* Wave Layer */
      .shape::before {
        content: '';
        position: absolute;
        left: -50%;
        width: 200%; height: 200%;
        top: calc(100% - var(--dryer-level));
        background: rgba(var(--dryer-color), 0.6);
        border-radius: 40%;
        animation: var(--dryer-anim-wave);
      }

      /* Overlay Layer */
      .shape::after {
        content: '';
        position: absolute;
        inset: 0;
        background-image: var(--dryer-overlay-bg);
        background-size: 100% 100%;
        animation: var(--dryer-anim-overlay);
        z-index: 2;
      }

      /* The Icon Itself */
      ha-icon {
        z-index: 3;
        mix-blend-mode: overlay;
        color: white !important;
      }

      /* --- KEYFRAMES --- */
      @keyframes wave {
        from { transform: rotate(0deg); }
        to   { transform: rotate(360deg); }
      }
      @keyframes shake {
        0%, 100% { transform: rotate(0deg); }
        25% { transform: rotate(10deg) translateY(-2px); }
        50% { transform: rotate(0deg); }
        75% { transform: rotate(-10deg) translateY(2px); }
      }
      @keyframes wobble {
        0%, 100% { transform: rotate(0deg); }
        50% { transform: rotate(5deg); }
      }
      @keyframes steam-rise {
        0% { opacity: 0; transform: translateY(10px) scale(0.9); }
        50% { opacity: 0.6; }
        100% { opacity: 0; transform: translateY(-20px) scale(1.1); }
      }
      @keyframes breeze {
        0% { opacity: 0.2; transform: scale(0.95); }
        50% { opacity: 0.5; transform: scale(1.05); }
        100% { opacity: 0.2; transform: scale(0.95); }
      }
      @keyframes sparkle {
        0%, 100% { opacity: 0.3; transform: scale(0.9); }
        50% { opacity: 1; transform: scale(1.1); }
      }
      @keyframes pulse-sense {
        0%, 100% { opacity: 0.2; transform: scale(0.97); }
        50% { opacity: 0.45; transform: scale(1.03); }
      }
    mushroom-state-info$: |
      .container .primary {
        font-size: var(--config-font-primary) !important;
      }
      .container .secondary {
        font-size: var(--config-font-secondary) !important;
      }

hope it helps, have a nice day

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants