Skip to content

Releases: j0sp0r/m3-cards

M3 Cards 2.5.0 — what the cards know, on hardware that can still show it

Choose a tag to compare

@j0sp0r j0sp0r released this 20 Oct 08:11

Upgrading: no option was removed or renamed, so existing configs load
unchanged. Three things look different without having been asked for, and one
of them is a reversal rather than an addition:

  • A lock chip swaps its colouring. An unlocked lock is now the active,
    accent-coloured state and a locked one the quiet, inactive one. Before, it
    was the other way round. This is Home Assistant's own reading — a lock is
    "active" exactly when it is not locked — and it holds for the Chip Buttons
    Card, the M3 Button Card and the M3 Aquarium Card, which share one list of
    active states. If you prefer the old look, state_colors on a chip sets it
    back per state; on a button card, inactive_color does.
  • An inactive chip with use_entity_color follows the theme instead of
    going straight to grey. A theme that defines, say, --state-light-off-color
    now colours switched-off light chips with it.
  • A single setpoint lost its caption. The climate card wrote "target
    temperature" under the one number a thermostat has. A band keeps its
    captions — those name which of the two rows is which.

A fourth difference shows only on old hardware. Anything that stopped at
iOS 15 — an iPod touch 7, an iPad Air 2 — ran this suite badly enough to be
unusable, and now runs it. What those devices give up is the tint on a fill,
not the fill. Nothing changes on a current browser; see Old hardware is still
a dashboard
below.

This release is mostly about the cards saying what they know, about the three
findings the HACS store review turned up on the way in, and — late, and after
a photograph of a very small screen — about the hardware that never got a
newer Safari.

The suite registers 44 cards.

A second look for the climate card

style: expressive redraws the card around Material 3 Expressive: the
current temperature becomes one dominant, heavy figure; the setpoint becomes
a single connected control — round outside, tight inside — instead of two
circular buttons either side of a floating pill; the mode and preset buttons
morph their shape on press; and a heat/cool frame around the card reports the
equipment.

The frame has two strengths rather than one: full while the entity's
hvac_action reports heating or cooling, dimmed while heat or cool is the
selected mode but the equipment is idle. That second level is not decoration.
Many integrations derive hvac_action from the physical valve, so a Homematic
eTRV reports idle for an entire summer with the mode set to heat, and a frame
that only lit on heating was invisible on that hardware.

The default stays tiles, unchanged in every detail — this is an opt-in second
look, not a redesign of the existing one. Contributed by @UHaFnir, over
three review rounds.

Its mode button is the first consumer of shared/dropdown-menu.ts, a
body-level portal: .card-inner.glass establishes a containing block, so a
menu rendered inside the card can neither escape ha-card's overflow: hidden
nor paint above a card that comes later in the dashboard. With only two modes
left, the button flips straight to the other one rather than opening a menu for
a binary switch.

A reading opens the history it came from

Three cards drew numbers you could look at and not ask about.

  • The climate overview's room tiles show two numbers from two sensors but
    tapped as one, so the humidity was the only number on the card you could not
    reach. The strip along the bottom is now its own tap target and opens the
    entity the percentage came from. It is the full width of the tile and
    everything below the temperature, not the 10px line of text, so it can be hit
    on a phone. A hold still runs hold_action anywhere on the tile — only the
    tap differs between the two zones.
  • The room card's sensor chips open their own entity: temperature,
    humidity, extra sensors, a single power sensor, and a window or door chip
    with exactly one contact behind it. A power chip summed from power_entities
    and a window chip covering several contacts stay plain, because there is no
    single history to show and a chip that does nothing should not look like one
    that failed.
  • The mini climate card can show the humidity in its status line:
    21,2 °C · 59 % · Aus. It stays off until it is switched on, in the card's
    own editor rather than YAML-only. Most thermostats report no
    current_humidity of their own, so humidity_sensor points at the room's
    sensor and naming one is itself the request to show it.

Chip rows

Chip labels that do not fit now slide to their end and back instead of ending
in an ellipsis, and stretch: smart gives each chip its content width first,
sharing out only what is left — so a temperature or a percentage keeps its full
width while a long name gives up space. show_name: false hides a chip's name;
with show_state off as well it becomes a round icon button. Per-chip
state_colors colour one exact state.

The three measuring passes a chip row needs — edge fades, smart widths, sliding
labels — now sit behind one controller that the chip-buttons, button and vacuum
cards each drive with a single call, so no card can wire up half of it. The
passes run when a row is first seen, when it resizes and when the text on its
chips changes, rather than on every state tick: measured on a live instance at
207 state changes in 20 seconds for zero label measurements. Contributed by
@UHaFnir.

The waste card says which bin

The reminder had no way of telling you what it covered. It watched every bin
on the card, and nothing in the editor said so — the natural reading was that
it watched the one bin you were looking at. notify_entities narrows it to
the bins you pick, and the panel now states the part that was never written
down: one notification goes out, naming every bin that is due, rather than
one per bin arriving in a row.

Three smaller things on the same card. A collection due today sat at 0% of the
timeline and one at the far end at 100%, each pulled back by half its own
width, so both hung over the edge of the track; they are inset by their radius
now. The timeline itself is optional — show_timeline: false — because it is
the part of the card you either read every day or never. And a reminder that
has started escalating is red rather than the colour of the bin: "put it out
now" on a grey Restmüll bin was washed in grey, which is what every card in
this suite looks like when it is switched off. The hero icon keeps the bin's
own colour, so it still says which bin.

Old hardware is still a dashboard

A photograph of an iPod touch 7 started this. One icon covered half the screen,
the cards had no padding, and the tiles were holes with the wallpaper showing
through. The device is not the point — it is the last iOS 15 device, and so is
every iPad Air 2 still screwed to a kitchen wall.

Two features explain all of it. Safari learned container queries in 16.0 and
color-mix() in 16.2, and this suite uses both heavily.

The repair is not interesting in itself, but one thing about it is worth
knowing if you ever write CSS for this project. The ordinary way to fall back —
a plain declaration before the modern one — only works on a value the parser
can reject on sight. A declaration that contains var() anywhere is not
checked until after substitution, and one that fails then resolves to
unset, not to the declaration before it. That is the whole bug: the icon's
size arrived through a custom property, so its fallback never ran and an <svg>
at width: auto is 300×150 by definition. Every such value is now chosen in
script against a capability test, and the colour fallbacks live in an
@supports not block, which is the one place only those browsers look.

Nothing is detected about the device. There is no version check and no
user-agent string anywhere in this — a browser that has the feature gets
exactly what it got before, byte for byte, and a browser that does not gets a
solid fill instead of a tinted one. That ages better than a list of devices,
and it covers hardware nobody here has ever tested on.

What those browsers give up, concretely: fills are solid rather than tinted,
overlays that fade to transparent are simply not drawn, and the layouts that
adapt to a narrow card rather than a narrow screen keep their wide form.

Security

Three findings from the HACS store review — thank you, @frenck — and a
fourth that his own reasoning led to. None was exploitable by the person
writing the card; they all turn on a value that person does not control, which
on a shared instance is the point.

  • A url action was handed to window.open unchecked, and window.open runs
    a javascript: target in the page's own context with the user's session.
    Cards resolve templates anywhere in their config, so the value can come from
    an entity's state. It is now resolved against the current page and dropped
    unless it comes out http: or https:.
  • An entity_picture and a media thumbnail went into background-image: url()
    unquoted, and a chip put a raw entity state into a CSS custom property
    name. A crafted value could close the declaration and add rules of its own.
    URLs now go through a checked, escaped url("…"), and anything reaching a
    property name is reduced to [a-z0-9_].
  • The review made its case about the url action by pointing out that a card
    renders templates anywhere in its config, so the value can come from an
    entity. That argument does not stop at one option: the same is true of every
    colour a card takes, and those went into inline styles as written. The limit
    is worth stating, because it is narrower than "CSS injection" sounds — a
    style attribute is a declaration list with no rule to escape, so no other
    element can be touched. What a crafted value can do is add declarations to
    the element it is on: cover the viewport with it, or make it fetch something.
    Colours are now ch...
Read more

M3 Cards 2.4.1 — what the cards were not saying

Choose a tag to compare

@j0sp0r j0sp0r released this 16 Oct 09:14

Upgrading: no configuration option was removed or renamed, so existing
configs load unchanged. Two things look different without having been asked
for: the two setpoints of a heat/cool thermostat are now drawn in the heat and
cool colours instead of plain text, and a chip row that scrolls now fades at
the edge it is hiding something behind. Both follow colours and options you
have already set.

A small release about things the cards were not saying. A thermostat in
heat/cool mode showed two numbers and left you to work out which was which. A
counter card with adjustable: true pointed at a plain sensor drew no pencil
and gave no reason. A chip row with more chips than fit simply ended at the
card's edge. None of these was a crash, and all three were the card knowing
something and keeping it to itself.

The suite registers 44 cards.

Added

  • The counter card can correct a utility_meter. Its pencil could write an
    input_number or shift an offset helper — the two cases the author happened
    to have, and not the common one: an energy or water reading is a
    utility_meter far more often than it is a helper. Pointed at one, the
    pencil now calls utility_meter.calibrate, behind a confirmation that names
    the old reading, the new one, and what the statistics engine will do about
    the difference. A meter carries history and the rewrite cannot be undone from
    the card, so the question is asked before anything is sent.

    It refuses the tempting shortcut on purpose. A meter must never be corrected
    through its source: a falling source reads as a meter change and the whole
    new value is added on the next rise — 18,899 to 40,793 in one five-minute
    row, the last time that was learned here. So the platform is checked before
    the domain, and a helper that happens to feed a meter still gets offset mode
    while the meter itself gets calibrated.

  • The button card can embed its own row of chip buttons, via chip_buttons,
    reusing the editor and rendering of the standalone Chip Buttons Card. The
    layout follows the card's height: at a normal single-row height the chips sit
    right-aligned beside the icon and text, and once the card is resized taller
    they move to a bottom-anchored bar whose alignment chip_buttons_justify
    sets. That switch is a CSS container query rather than JS measuring height,
    so it follows the dashboard editor instantly as the card is dragged.
    chip_buttons_layout decides what happens when there are more chips than
    fit: wrap (the default) breaks onto a second line, scroll keeps one line
    and scrolls it. Contributed by @UHaFnir.

Changed

  • The two setpoints of a heat/cool band are coloured. Both climate cards
    drew the band's numbers in plain text. On the full card that leaves an
    11-pixel label as the only thing saying which number is which; on the mini
    card, where the two sit side by side with no room for a label at all, it
    leaves their order. Each bound now carries the colour of the end it is:
    "Heat to" in the heat colour, "Cool above" in the cool one, taken from the
    same mode_colors as the mode row, so an override there retunes the band
    too. Nothing new to configure. Suggested by @enotbay in #21.

    The low bound is the warm one. It reads backwards as a scale and correctly as
    a control: target_temp_low is the number the heating obeys, which is also
    the way round Home Assistant's own thermostat has it.

  • A scrolling chip row fades at the edge that has something behind it. The
    fades lived on the chip-buttons card as an inline observer, so the row the
    button card now embeds would have had to copy them, and the vacuum card's own
    row had none at all. They moved into the shared module, which is why all
    three behave the same now: a mask appears only on a side with content
    scrolled out of view, and a row that fits has none at either end.

Fixed

  • adjustable: true could silently do nothing. On a plain sensor with no
    adjust_entity there is nothing to write to, and the card simply left the
    pencil out — an option that looks set, has no effect, and says nothing about
    why. The pencil is now drawn greyed with the reason on it. adjustable and
    adjust_entity were also undocumented; the counter card's page now has a
    section on all three ways a reading can be corrected.

  • The counter card pointed at a service that does not exist. Its repair
    instructions named recorder.adjust_sum_statistics, which is a websocket
    command rather than a service and answers "not found" when called as one. The
    confirmation and the documentation now point at Developer tools → Statistics
    → "Adjust sum", which is the same operation where it actually lives.

M3 Cards 2.4.0 — the machines release

Choose a tag to compare

@j0sp0r j0sp0r released this 20 Sep 16:15

Upgrading: no configuration option was removed or renamed, so existing
configs load unchanged. Two things look different without having been asked
for: the aquarium card's schedule bar is redrawn in the shape the suite's other
sliders use, and a chip button for a scene, a script or a button no longer
prints a state under its name. See "Behaviour changes" at the end.

The machines release. Four of the five new cards are about something that runs
a job and then stops: a robot vacuum and its maintenance, a 3D printer, and the
household appliances that were previously a row of tiles saying "Standby". They
share one idea — the state decides what is drawn — because a machine that is
idle has nothing to say about progress, and a dashboard that keeps the field
there anyway spends most of its life displaying a dash.

Alongside them, the suite-wide change: every card's own string fields take
Jinja2 templates now.
A name, an icon, a colour, a label — anything a card
reads out of its own config — is subscribed over Home Assistant's
render_template websocket and pushed a new value when anything it reads
changes. Until now a composed label meant a template sensor in
configuration.yaml for every card that wanted one.

The suite registers 44 cards.

Added

  • M3 Vacuum Card (m3-vacuum-card) — the robot itself: where it is, what
    it is doing, and the handful of controls anyone presses. Every command is
    drawn optimistically, because the integration polls every thirty seconds and
    pushes nothing; a tap that changed nothing for half a minute read as a broken
    button. Rooms are chips built from vacuum.clean_area, offered only when the
    machine's capability bits say it can honour them. Suction and mop get the
    suite's Expressive sliders, and the cleaning mode — vacuum, mop or both — a
    menu, because those are three different jobs rather than three strengths of
    one; picking one sets what the next run will do and starts nothing.

    The map is cropped to the floor plan: Roborock sends a picture of the robot's
    whole coordinate space, in which a flat fills a corner, so an uncropped map
    arrives as a stamp in the middle of the box. It is a plain picture on the
    card with a magnifier that opens it full-screen — pinching it where it sits
    would have needed the same touch handling that stops the dashboard scrolling
    past it. The dock is discovered as the separate device it is — without that
    the card loses the tanks, the dust emptying and the mop washing.

  • M3 Vacuum Maintenance Card (m3-vacuum-maintenance-card) — filters,
    brushes, sensors and mop with the life they have left, plus reminders for
    the chores nothing counts
    . "Change the mop every three runs" is not a
    sensor; the card works out when it is due, shows it, and lets it be ticked
    off at any point, not only once it nags. The input_number that makes that
    possible is created by the reminder's own editor, set to today's meter
    reading. show_reset adds a reset button to each part row, behind a
    confirmation. Both vacuum cards can build real Home Assistant automations
    from their editors.

  • M3 Printer Card (m3-printer-card) — a 3D printer as one card instead of
    sixteen tiles. Built against Bambu Lab's integration and deliberately not tied
    to it: state_map and a three-pass resolver mean OctoPrint, Moonraker and
    Prusa Connect land in the right blocks too, and a value nothing recognises
    reads as idle rather than as an error. The camera is a still, not a stream,
    and the badge says so. The socket the printer hangs on stays usable while
    everything else dims — it is the one control that can bring the machine back.
    Pause, resume and stop press the integration's own buttons with nothing
    configured, and the card folds from its header the way the vacuum cards do.

  • M3 Appliance Card (m3-appliance-card) — washing machine, dryer, oven,
    fridge, coffee machine, litter robot, printer, NAS: the machines that have a
    job, a phase and a finish time, with a card that shows the phase while it runs
    and gets out of the way when it does not.

  • M3 Search Card (m3-search-card) — a Material 3 search field over
    entities, areas and devices, with a quick bar that opens on the result.

  • Jinja2 templates in every card's own string fields. Templates inside a
    nested card config are deliberately left alone and handed to that card
    verbatim — it renders them itself, and it renders them live.

  • A compact mode for the light card (compact: true), which drops the power
    button and makes the header icon the toggle — the split the native tile card
    makes. It is about horizontal room in a two-column grid.

  • Smaller ones: show_color_temp for the light card, an action on the room
    card's header, a configurable tap and hold on the presence card with both in
    its editor, per-person popups there, a popup for the appliance card, and
    source: synology_dsm for the NAS card.

Changed

  • The shared popup chrome takes a title and a size. Both opt-in; a caller
    that passes neither renders exactly as before.

  • The presence card's hold_action runs through the shared handler. It used
    to implement two kinds itself and silently ignore the rest, so more-info,
    toggle and perform-action did nothing and nothing said so.

  • The status rule matcher and the domain → default-action mapping are shared
    helpers
    , rather than private methods on two cards that both needed the same
    answers.

  • The NAS card's notification setup resolves volumes through the card's own
    discovery
    , so an m3-system-card's "volume full" trigger finds something to
    watch.

  • The vacuum cards use the suite's header and fold chevron instead of
    hand-rolled copies. The chevron now lives in one place, so the next card that
    folds inherits it.

Fixed

  • A thermostat in Auto showed one setpoint or none. In heat/cool a climate
    entity holds target_temp_low and target_temp_high and no temperature,
    and both climate cards read temperature — so the mini showed nothing and
    the full card fell back to target_temp_high, which looks like a single
    setpoint and is silently the top of a band. Both now show the band: the full
    card stacks its stepper row twice, the mini prints both numbers and lets its
    one pair of buttons act on whichever is lit. A single-setpoint thermostat is
    unchanged. Thanks to @enotbay for reporting both (#21, #22) — neither of
    us has a thermostat with a band, so a confirmation on the issues is welcome.

  • Closing a card's dialog no longer scrolls the dashboard away. It jumped to
    whatever had focus last — on a phone, often a slider tapped minutes earlier —
    because a tap on a card's header does not move focus there. The anchor aims
    at the element the finger actually went down on — a card is most of a phone
    screen, and parking focus on the card itself moved the page by the card's own
    height — so closing a dialog now leaves you exactly where you were.

Behaviour changes

  • The aquarium card's schedule bar is redrawn. Same data, same behaviour —
    it is now the same geometry as the suite's discrete sliders, with real gaps
    either side of each handle, so the aquarium's day and the vacuum's suction
    scale read as one control rather than two designs in one suite.

  • A chip button for a stateless domain no longer prints a state. A scene
    showed a timestamp and a script showed "off", neither of which says anything.
    show_state: true brings it back for anyone who wants it.

  • A chip button with no tap_action now does what its entity is for. It
    opened more-info for every domain, so a chip labelled "Vollreinigung" pointing
    at a script opened a dialog with a Press button in it instead of cleaning.
    Scripts start, buttons press, switches toggle, and anything without an obvious
    verb still opens more-info — the mapping the button card has always used.
    tap_action: more-info restores the old behaviour per chip.

M3 Cards 2.3.2 — nav card editor tidying

Choose a tag to compare

@j0sp0r j0sp0r released this 04 Sep 14:15

Editor tidying for the nav card, following 2.3.1.

Upgrading: nothing renamed, nothing removed. If you had a pull-up sheet with
entries behind a round button, opening its editor once moves them into the
drawer's tiles — the same entries, in the place that can edit them.

Fixed

  • The round button's section still appeared on a pull-up sheet. 2.3.1 stopped
    the card drawing one there — a sheet has a drawer instead — but the editor went
    on offering it, headed "Round button's menu" on a variant that has no round
    button. Editor and card agree again: only the floating bar has one. A sheet's
    menu entries fold into the drawer's own tiles, where they can be renamed and
    reordered; they were already drawn there, but lived in a part of the config the
    editor no longer showed.

Changed

  • The round button and its menu moved from Appearance to Entries, directly
    under the list. They hold the same kind of thing the bar does, and moving a
    page from the bar into the menu or back meant working across two panels.

Behoben

  • Der Abschnitt des runden Knopfes erschien weiterhin beim Pull-up-Sheet.
    Seit 2.3.1 zeichnet die Karte dort keinen mehr — ein Sheet hat stattdessen
    eine Schublade —, der Editor bot ihn aber weiter an, überschrieben mit „Menü
    des runden Knopfes" bei einer Variante ohne runden Knopf. Editor und Karte
    sind wieder einer Meinung: nur die schwebende Leiste hat einen. Die
    Menüeinträge eines Sheets gehen in die Kacheln der Schublade über, wo sie sich
    umbenennen und umsortieren lassen — gezeichnet wurden sie dort ohnehin schon,
    sie steckten nur in einem Teil der Konfiguration, den der Editor nicht mehr
    anzeigte.

Geändert

  • Der runde Knopf und sein Menü sind von „Darstellung" zu „Einträge"
    gewandert
    , direkt unter die Liste. Sie enthalten dieselbe Art von Dingen wie
    die Leiste, und eine Seite von der Leiste ins Menü zu schieben oder zurück
    hieß bisher, zwischen zwei Bereichen zu wechseln.

M3 Cards 2.3.1 — nav card hotfix

Choose a tag to compare

@j0sp0r j0sp0r released this 04 Sep 13:51

A hotfix for the nav card. Everything here was found within hours of 2.3.0
by someone building their first navigation bar, and every one of it sat in
the way of doing exactly that.

Upgrading: nothing was renamed or removed, so existing configs load
unchanged. One thing looks different without having been asked for: a nav card
you add from now on starts as a floating bar rather than a docked footer. Cards
already on a dashboard are untouched.

Fixed

  • The drawer stopped responding after the editor was saved. A pull-up
    sheet would not open — by tap or by drag — until the page was reloaded.
    Saving re-renders the card and Lit hands the drawer fresh elements, but the
    gesture kept its listeners on the discarded ones, and the code that wires
    them up returned early because a gesture object already existed. Events
    arrived at nodes nobody was listening to. It now compares the grip it is
    bound to against the one on screen, and rebinds when they differ.

  • The target page had to be typed from memory. Every entry meant recalling
    a path like /lovelace/garten. It is a list of this dashboard's own views
    now, labelled "Energie — /lovelace/energie", at all four places a path is
    asked for — entries, submenu entries, drawer tiles, action-menu entries. A
    path the list cannot know is still typeable. Choosing one also fills in the
    name and icon from that view, leaving anything already written alone.

  • The round action button appeared on variants that have no place for it.
    It is a companion to a detached pill. On header and footer, which span a
    screen edge, and on segmented, which runs in the content flow, it read as a
    stray dot that had fallen off the bar. Those three no longer draw one and the
    editor stops offering it; what it would have held becomes ordinary entries at
    the end of the bar, which already scrolls rather than clipping. On sheet the
    entries go into the drawer instead, which is what the drawer is for.

  • The pull-up sheet spanned the whole screen. Shut it hugged its entries;
    pulled up it snapped to the full width, which on a wide monitor spread its
    tiles across the glass and read as a different object from the one just
    tapped. It keeps the bar's width now, open or shut.

  • A docked bar spilled out of its frame in the editor. There the bar is
    drawn in the flow, inside a frame the dashboard column sizes — eight entries
    are wider than that, and the bar simply ran out past the dashed edge. It
    scrolls inside the frame, as it already does on screen.

Changed

  • A new nav card starts as a floating bar with its labels beside the icons,
    rather than docked with them underneath — the shape a phone's own navigation
    uses. Only what a newly added card starts with changed; an existing card that
    never named a style still falls back to footer, so nothing moves on a
    dashboard that was already set up.

  • Every card's reference section folds behind a summary in the README, not
    only the three adopted in 2.3.0. Each card keeps its description and its
    screenshot visible; the YAML, the sub-sections and the options table collapse.
    Those three cards were also missing from the card index entirely.

Behoben

  • Die Schublade reagierte nach dem Speichern des Editors nicht mehr. Ein
    Pull-up-Sheet ließ sich weder antippen noch hochziehen, bis die Seite neu
    geladen wurde. Beim Speichern zeichnet Lit die Karte neu und gibt der
    Schublade frische Elemente; die Geste behielt ihre Lauscher auf den
    weggeworfenen, und die Stelle, die sie anhängt, stieg vorzeitig aus, weil ja
    schon eine Geste existierte. Die Ereignisse kamen bei Knoten an, an denen
    niemand horchte. Die Karte vergleicht jetzt den Griff, an dem sie hängt, mit
    dem gerade gezeichneten, und bindet sich bei Abweichung neu.

  • Die Zielseite musste aus dem Gedächtnis getippt werden. Jeder Eintrag
    hieß, einen Pfad wie /lovelace/garten zu erinnern. Jetzt ist es eine Liste
    der Ansichten dieses Dashboards, beschriftet als „Energie —
    /lovelace/energie", an allen vier Stellen, an denen ein Pfad gefragt wird —
    Einträge, Untermenü, Schubladen-Kacheln, Aktionsmenü. Ein Pfad, den die Liste
    nicht kennen kann, lässt sich weiterhin eintippen. Die Auswahl füllt zudem
    Beschriftung und Icon aus der Ansicht, ohne bereits Geschriebenes anzutasten.

  • Der runde Aktionsknopf erschien bei Varianten, die keinen Platz dafür
    haben.
    Er ist der Begleiter einer freistehenden Pille. Bei header und
    footer, die an einer Bildschirmkante liegen, und bei segmented, das im
    Fluss der Seite steht, wirkte er wie ein Punkt, der von der Leiste abgefallen
    ist. Diese drei zeichnen ihn nicht mehr, und der Editor bietet ihn dort nicht
    an; was er enthalten hätte, wird zu normalen Einträgen am Ende der Leiste,
    die bei Überlauf ohnehin scrollt. Beim sheet wandern die Einträge
    stattdessen in die Schublade — wofür sie da ist.

  • Das Pull-up-Sheet spannte über den ganzen Bildschirm. Zugeklappt
    schmiegte es sich an seine Einträge, hochgezogen sprang es auf die volle
    Breite und verteilte seine Kacheln auf einem breiten Monitor über die ganze
    Fläche — als wäre es ein anderes Ding als das eben angetippte. Es behält
    jetzt die Breite der Leiste, auf wie zu.

  • Eine angedockte Leiste lief im Editor aus ihrem Rahmen. Dort wird sie im
    Fluss gezeichnet, in einem Rahmen, dessen Breite die Dashboard-Spalte
    bestimmt — acht Einträge sind breiter als das, und die Leiste lief schlicht
    über die gestrichelte Kante hinaus. Sie scrollt jetzt innerhalb des Rahmens,
    so wie sie es am Bildschirm längst tut.

Geändert

  • Eine neu eingefügte Nav-Karte startet als schwebende Leiste mit den
    Beschriftungen neben den Icons
    statt angedockt mit Text darunter — die
    Form, die die Navigation eines Telefons selbst verwendet. Geändert hat sich
    nur, womit eine neue Karte beginnt; eine bestehende ohne ausdrückliche
    Variante fällt weiterhin auf footer zurück, damit auf einem eingerichteten
    Dashboard nichts verrutscht.

  • Im README klappt der Referenzteil jeder Karte hinter eine Zusammenfassung,
    nicht nur bei den drei aus 2.3.0 übernommenen. Beschreibung und Screenshot
    bleiben sichtbar; YAML, Unterabschnitte und Optionstabelle klappen weg. Jene
    drei Karten fehlten außerdem vollständig im Kartenverzeichnis.

M3 Cards 2.3.0 — the navigation release

Choose a tag to compare

@j0sp0r j0sp0r released this 04 Sep 11:14

Upgrading: no configuration option was removed or renamed, so existing
configs load unchanged. Two things look different without having been asked
for: the room card's accent now follows the theme instead of a fixed blue, and
a water or gas meter's monthly figure was a thousandth of the truth and is now
right. See "Behaviour changes" at the end.

The navigation release. m3-nav-card is the new card — a dashboard navigation
bar in five variants, configurable to the level of the community's Navbar Card
but in this suite's design language. Around it, three older cards grew up: the
button card learned the shape language a phone's quick settings use, the room
card learned to hold arbitrary Lovelace cards instead of only what it can
discover by itself, and every colour field in every card can now be handed back
to the theme.

Three more cards arrived from an unexpected direction: Fabian Wendel
(UHaFnir) forked the suite, built
Lights Overview, Chip Buttons and Group Card in its design
language, improved the weather card, and found two performance faults in
code that was already here. All of it is in this release. The suite now
registers 39 cards.

Added

  • M3 Nav Card (m3-nav-card) — a navigation bar for the dashboard, in five
    variants. header and footer dock to a screen edge, segmented is an
    inline pill group that scrolls with the page, floating detaches into a
    rounded bar, and sheet adds a drawer that pulls up over the view. The four
    docked variants take no row of the grid: their slot collapses and they
    position themselves against the screen.

    Per-entry badges take a template, an entity's state, or a count of entities
    that are on — hidden automatically at 0, off, empty or unavailable. Popup
    submenus grow out of the button that opened them. Tap, hold and double-tap
    each get an action, and the phone gives a short buzz to confirm one.

    Desktop and mobile have separate layouts, and the bar picks between them by
    measuring its own width, not the window's. Put it in a narrow column on a
    wide screen and it knows it is narrow — the usual approach, which asks how
    wide the screen is, would lay out a cramped bar as though it had the whole
    display.

    name, icon, color, hidden, disabled and the badge accept a template,
    so you can compute what an entry shows instead of fixing it in the config. The
    card registers each template with Home Assistant, which sends a fresh value
    whenever any entity the template mentions changes — a badge updates by itself,
    with no polling. Only fields that really contain a template are registered,
    and two entries using the same one share a single registration.

    The sheet is dragged, and the interesting part is not the drag but the
    conflict with the content scrolling inside it: the content scrolls normally,
    and the sheet only takes over once the content is already at the top and the
    finger is going down. Let go and it settles to whichever open or closed
    position is nearest — unless you flicked it, in which case it goes the way it
    was thrown, wherever it happened to be.

  • Three cards from a fork — M3 Lights Overview
    (m3-lights-overview-card), M3 Chip Buttons (m3-chip-buttons-card) and
    M3 Group Card (m3-group-card), built by Fabian Wendel
    (UHaFnir) and adopted here.

    Lights Overview groups every light by area and gives each room a tile
    that switches it — or lists the lights themselves, optionally with the ones
    that are on first. Two independent filters decide what a room shows and
    what a tap actually switches. A lamp on a smart plug is a switch rather
    than a light, so include_domains widens the sweep, and a tap switches
    through the generic service so those plugs really do turn on.

    Chip Buttons is a row of compact pills bound to entities, each able to
    show its state, take the entity's own colour, hold a fixed one, or render
    read-only as a label. The row scrolls sideways and its edges fade on
    whichever side still has chips behind it.

    Group Card puts several cards on one surface with a shared background and
    radius, so related cards read as one block instead of separate tiles.

  • Weather card: the header and the chart switch independently. A card can
    be just the current conditions, just the forecast chart, or both. The hourly
    strip gained icons, temperatures, hour labels and a temperature axis, each
    switchable. Icon, temperature and hour now share one rhythm and the strip
    sits square in the card — it measures its own width, draws every 2nd, 3rd or
    4th hour, and cuts the row back to a whole number of those steps so it ends
    flush at both edges. Also from UHaFnir's fork.

  • Nav card: the marker and the page move together. marker_motion: slide
    moves a single shape between entries instead of fading one out and another in
    — except on arrival, where the marker is simply already where it belongs.
    page_transition cross-fades the whole view when a navigation starts from the
    bar; page_transition: up is Material's fade-through and the setting worth
    having, because a plain cross-fade between two pages that share a wallpaper
    and a bar is invisible. page_transition_ms defaults to 180 ms rather than
    the browser's 250, which reads as slow for a change the reader just asked for.

  • Nav card: the bar can be shaped to taste. label_position puts an entry's
    text below, above, right or left of its icon — the horizontal placements also
    widen the active pill so it wraps icon and text together. label_size sets
    the text size, with a larger default beside an icon than under one, where
    11 px is Material's figure for the secondary half of a stacked pair.
    pill_size scales the marker on its own, inactive_only is the missing
    inverse of active_only for labels and icons, and edge_distance sets how
    far a docked bar keeps from its screen edge — added on top of the device's
    safe area rather than replacing it, so no value can push the bar onto the
    gesture bar.

  • Nav card: the action button can open a menu. Give action_button a menu
    and tapping it raises a stack of labelled pills out of the button, each with
    its own text, icon, colour and action, while the button itself morphs into the
    close control.

  • Button card: shape_by_state, icon_off and icon_fill — the shape
    language a phone's quick settings use. With shape_by_state the outline
    follows the entity: a capsule while it is off, the configured corner radius
    while it is on, and the icon well going from a circle to a rounded square with
    it. icon_off gives a second icon for while the entity is off, since many
    symbols have a struck-through twin that reads as "not on" before any colour
    does. icon_fill: solid turns the active pairing inside out — the well takes
    the accent and the glyph is darkened against it, instead of a pale wash of the
    accent carrying an accent-coloured glyph.

  • Room card: mode and cards — a room card can now hold Lovelace cards of
    its own. auto is what it has always done, discovering the area's devices and
    drawing a tile per category; manual draws none of that and leaves the body
    to the cards you put there. Two per row by default.

  • Room card editor: the nested cards are editable in the UI, and each one
    opens its own editor. Not a hand-picked handful of fields — the card class is
    asked for its editor, the same contract Home Assistant itself uses, so a
    nested button card offers exactly what a button card offers. Entities can be
    added from a picker, reordered and removed.

  • Room card: power_entities and door_entities. A room's consumption is
    usually the sum of its plugs, and the card could previously name only one
    sensor; power_entities adds several together, chosen from a picker. Doors
    get counted apart from windows and get a chip of their own, because a door
    standing open and a window standing open are different facts and a card that
    adds them together answers neither.

  • Room card: scroll_on_expand, scroll_duration and collapse_memory. A
    collapsed card near the bottom of a view opens downwards, past the edge of the
    screen, so the thing you just asked to see is the thing you cannot see; it now
    scrolls itself into view, keeping clear of anything docked over the bottom of
    the window — a navigation bar from this suite included. collapse_memory
    decides how long the fold is remembered: on the device for good, as before, or
    only until the app is next started, so every start opens on the overview.

  • Every colour field can take the theme's colour, and now says so. A card's
    colour has always accepted primary, which resolves to the theme's accent —
    under Material You, the tone generated from the wallpaper. It was a token you
    had to know; every colour row in every editor now offers it as a button.

  • Four shared modules came out of the nav card and are available to the
    rest: template-sub.ts (one render_template subscription per unique
    template, ref-counted and shared between fields), sheet-gesture.ts (pointer
    drag with a velocity estimate and snap points), tap-hold.ts (tap, hold and
    double-tap told apart from each other and from a drag) and card-helpers.ts
    (hosting arbitrary Lovelace cards, with the two lifecycle rules that are easy
    to get wrong).

Fixed

Thirty-six fixes, most of them the nav card being taken apart on a real phone.
The ones worth naming:

  • The active entry was one navigation behind. The bar read the path when it
    was built, not when it painted, so it marked the page you had just left.

  • Tapping an entry could flash the page next to it. Two separate causes: a
    dashboard swipe plugin decided on touchend from state it had gathered
    before the shield went up, and a cac...

Read more

M3 Cards 2.2.0 — the new-cards release

Choose a tag to compare

@j0sp0r j0sp0r released this 31 Aug 21:17

Upgrading: no configuration option was removed or renamed and no default in
const.ts changed, so existing configs load unchanged. One thing looks
different without having been asked for: the light card printed its brightness
twice and now prints it once. See "Behaviour changes" at the end.

The new-cards release. Six of them: a clock that costs almost nothing to run, a
card that turns a state into a sentence, headings for the space between cards,
one card per room that works out its own contents, a (de)humidifier card that
does not insist your device is a humidifier entity, and a calendar with an
agenda and a month grid. The suite now registers 35 cards, and five shared
modules came out of building them.

Added

  • M3 Humidifier Card (m3-humidifier-card) — target humidity, mode, fan
    speed and a device's extras in one card. Home Assistant's own humidifier card
    cannot set a fan speed, so the usual answer is a second card beside it.

    It does not insist that entity is a humidifier: plenty of dehumidifiers
    are a switch plus a number plus a sensor, and current_entity,
    target_entity and action_entity say where the readings come from. Modes
    come from available_modes, a select, or an explicit list; the fan row
    reads presets, percentages or a select's options. layout orders the four
    blocks and hides the ones left out.

  • M3 Calendar Card (m3-calendar-card) — an agenda and a month grid for
    any number of calendars. Events come from calendar.get_events, since the
    entity attributes carry only the next one. Multi-day events appear under every
    day they touch with "day 2 of 3", a running event is badged, and a calendar
    that cannot be reached is named rather than silently dropped.

  • M3 Room Card (m3-room-card) — one card per area. Point it at a Home
    Assistant area and it works out the rest: which kinds of device are in the
    room, what each is doing, the climate readings, and whether anyone is in
    there. Nine categories are built in, extra_domains adds more, and a tile
    appears only for a category that actually has an entity in the room.

    The badge under each tile is the point of it: with several devices it counts
    them (2/4), with one it says what that device is doing — the fan's step,
    the thermostat's target, the media title, the blind's position.

    Entities Home Assistant marks as configuration or diagnostic are left out,
    and that single filter is what makes the switch category usable: on the
    author's install a living room holds 32 switches, of which 2 are things a
    person would call a switch.

    A tile holding several devices opens a picker on tap rather than switching all
    of them, because a room's four lights are four decisions, not one. "All off"
    and "All on" are there for when it really is one. Individual devices can be
    excluded in the editor — that is where a plug's indicator light goes when its
    integration fails to mark it as diagnostic.

    collapsible: true folds the card down to its header, keeping the subtitle,
    because "occupied · 3 devices on" is exactly what a folded room still needs to
    say. The state persists per browser, or across devices in an input_boolean.

  • M3 Heading Card (m3-heading-card) — section headings for the space
    between cards, in four variants: a plain icon and title, one with a count chip
    and an action button, a divider rule with a small-caps label, and a
    collapsible one that folds away the cards below it. It draws no card of its
    own — no frame, no glass, no shadow — so it reads as a label for what follows
    rather than as another tile.

    Collapsing hides the sibling cards in the browser and writes nothing to the
    dashboard configuration, so it is a view state and not an edit. That depends
    on Home Assistant's own DOM, so every step is a check rather than an
    assumption, and an unrecognised layout falls back to the plain variant: an
    arrow that visibly does nothing is worse than no arrow.

  • M3 Status Card (m3-status-card) — shows a value large and with meaning:
    a number, a piece of text, or a yes/no state, from any entity. The mapping in
    between is the point: a states rule list turns off into a red "No" with a
    cross, or a number under 20 into a warning colour, with no template sensor
    doing the work. Five presets (yes_no, on_off, ok_problem,
    open_closed, traffic) supply ready-made rule lists in the dashboard's own
    language, and a card's own rules are tried first, so a preset can be adjusted
    without being replaced.

    One value gets the large hero treatment, several get a grid or a row list. A
    toggle tap switches the shown state over at once instead of waiting for
    Home Assistant to confirm, so a "medication given" card cannot be tapped
    twice by someone who thinks the first tap missed. An optional trend chip
    compares against the same entity 24 hours ago, with trend_inverted for the
    values where falling is the win.

  • M3 Clock Card (m3-clock-card) — a clock in five styles: rounded tiles,
    digits inside lobed shapes, lockscreen typography, an organic analogue dial,
    and a sixty-segment ring. It reads no entity, so it works on any dashboard
    without setting anything up; the optional alarm, sun, day-progress and
    second-time-zone extras are the only parts that need one.

    The card only redraws while it is on screen — a clock on a wall tablet would
    otherwise animate for weeks to an empty room — and styles with nothing moving
    between whole seconds drop to a timer that wakes on the minute. Measured on a
    35-card dashboard: 12 renders in 12 seconds against roughly 1440 frames,
    and zero ticks while scrolled out of view.

  • M3 Climate Overview — tile_tap_action: thermostat. A tap on a room
    opened the sensor's dialog, which is its history graph; it can now open that
    room's thermostat instead — m3-climate-card-mini, floating over the card and
    adjustable there. The thermostat is found in the room's own Home Assistant
    area, or on the device the room's sensors sit on when the room has no area at
    all, which is how a thermostat reporting its own room temperature is found.
    climate_entity names it per room and overrides both. A room with no
    thermostat keeps the graph rather than going dead. Asked for on Reddit; the
    default is unchanged.

  • M3 Leak Card — max_visible. The same "show N more" toggle the power
    list, battery, NAS, updates and occupancy cards already had; the leak card
    only had the all-or-nothing collapse_ok. The limit steps aside during an
    alarm, because whichever sensor is wet has to be on screen without another
    tap.

  • Three shared modules, each pulled out of a card rather than written
    alongside it:

    • src/shared/shapes.ts — the lobed-shape generator behind the clock's
      styles. Material 3 Expressive's cookie, clover, flower and scallop shapes
      are one curve with different settings, so one generator covers the family.
    • src/shared/actions.ts — the seven-branch tap/hold action handler, moved
      out of the button card so the status card's toggle and call-service use
      the same code rather than a second copy.
    • src/shared/collapse-state.ts — the fold-state rule, shared by the heading
      and room cards so the two cannot drift apart.

Fixed

  • M3 Cost Card sent a wildly wrong number to your phone. Its notification
    multiplied states(entity) by the price, and for a counter that state is the
    meter reading: on the author's install the card said 112.66 € for August
    while its own notification said 26,844.38 €. The automation now reads the same
    statistics the card reads, so the two cannot disagree. An automation created
    before this fix keeps its old template
    — open the card's notification
    settings and save again.

  • M3 Light Card showed the brightness twice. The percentage stood under the
    lamp's name and again above the slider handle. The subtitle is the live one —
    it already follows the value while the handle is being dragged — and it is
    what every other card puts in that spot, so the label on the slider is gone.

  • tintOn on a dark surface returned a CSS color-mix string rather than a
    colour. tintInk feeds that back in as the surface to measure ink against,
    and an unparseable surface means the ink comes back unchanged — so tintInk
    has been a silent no-op in every dark theme since it was written. Benign
    until now, because a light accent on its own dark tint contrasts well by
    accident.

Behaviour changes

No configuration option was removed or renamed and no default in const.ts
changed, so existing configs load unchanged. One point changes what you
see:

  • M3 Light Card shows the brightness percentage once, under the lamp's
    name. The second copy above the slider handle is gone.

Deutsche Fassung

Das Release der neuen Karten. Sechs davon: eine Uhr, die im Betrieb fast nichts
kostet, eine Karte, die aus einem Zustand einen Satz macht, Überschriften für
den Raum zwischen den Karten, eine Karte je Raum, die ihren Inhalt selbst
herausfindet, eine Karte für Be- und Entfeuchter, die nicht voraussetzt, dass
das Gerät eine humidifier-Entität ist, und ein Kalender mit Agenda und
Monatsraster. Die Suite registriert jetzt 35 Karten, und beim Bau sind fünf
gemeinsam genutzte Module entstanden.

Neu

  • M3 Humidifier Card (m3-humidifier-card) — Zielfeuchte, Modus,
    Lüfterstufe und die Zusatzfunktionen eines Geräts in einer Karte. Die
    eingebaute humidifier-Karte kann keine Lüftergeschwindigkeit, deshalb steht
    sonst eine zweite Karte daneben.

    Sie setzt nicht voraus, dass entity eine humidifier-Entität ist: Viele
    Entfeuchter sind ein Schalter plus number plus sensor, und
    current_entity, target_entity und action_entity sagen, woher die Werte
    kommen. Modi kommen aus available_modes, einem select oder einer eigenen
    Liste; die Lüfterzeile lies...

Read more

M3 Cards 2.1.0 — the light theme release

Choose a tag to compare

@j0sp0r j0sp0r released this 30 Aug 11:42

Upgrading: no configuration option was removed or renamed and no default
in const.ts changed, so existing configs load unchanged — but the light theme
looks noticeably different, on purpose. See "Behaviour changes" at the end.
Everything below was measured on a live 35-card dashboard in both themes.

The light theme release. Accent colours are now corrected at render time
against the surface they are actually drawn on, so the palette reads as
deliberate rather than washed out. Alongside that: a large rendering-cost
reduction, a masonry layout fix, and calendar support for the waste card.

Added

  • M3 Waste Card — calendar_entity. Read the schedule from a calendar
    whose events name the bin, instead of (or alongside) one day-count sensor per
    bin. Streams from both sources are merged; a sensor wins over a calendar entry
    with the same name.
  • Contrast tooling. npm run test:contrast unit-tests the colour maths, and
    test/contrast-audit.js measures the rendered page — paste it into the
    browser console on a dashboard and run it once per theme. See
    docs/TESTING.md.

Fixed

  • Accent colours in a light theme. The 2.0 known issue is resolved. The
    palette is built for dark backgrounds — all thirteen colours fall below 4.5:1
    on a light card and all thirteen pass on a dark one — so accents used as text
    or as a data fill are now moved to their target contrast at render time. The
    correction keeps the hue and lifts the saturation rather than blending toward
    black: #85b7eb becomes #0b6ed5, not a grey-blue. Measured on a live
    35-card dashboard, the light theme now reports three findings and the dark
    theme four, and all three of the light ones appear in the dark list too —
    they are long-standing design choices, not theme faults.
  • Content on tinted surfaces. Chips, icon wells, expand toggles and count
    badges took their colour from the card while sitting on a tint of the same
    hue, which rendered #81c784 on #9cdc9f — 1.26:1. Ink is now measured
    against the surface it actually sits on.
  • Tints no longer mix toward transparent. 146 surfaces mixed into
    whatever was behind the card, which through a glass card is the dashboard
    wallpaper, so the same 8% wash looked different depending on the picture
    underneath. They mix into the card surface now. Gradients and deliberate
    overlays are unchanged.
  • M3 Button Card and M3 Climate Card Mini in a masonry view. Both make
    their card a size container so paddings can scale with height, then took
    height: 100%. A masonry column imposes no height, the percentage fell back
    to auto, and auto on a size-contained box is zero: the button card
    rendered a squashed 37px of content inside a 0px card, and the climate-mini
    card disappeared entirely. Sections views were never affected.
  • M3 Occupancy Card — max_visible. The option had no effect; the list now
    caps at the given number with the rest behind a toggle.

Performance

  • Cards no longer re-render on unrelated state changes. Home Assistant
    hands every card a fresh hass object whenever anything in the system
    changes, so one chatty power sensor re-rendered every card on the dashboard.
    Every card now declares what it reads. Cards that discover their entities by
    scanning also watch for the entity count changing, so a newly added sensor is
    still picked up.
  • M3 Power Summary — count-up animation. The value lerp wrote to reactive
    state on every animation frame although the reading is rounded before it is
    shown, so most frames re-rendered identical text.
  • Measured together on the same 35-card dashboard, 20 seconds:
    370 renders → 12.

Behaviour changes

No configuration option was removed or renamed, and no default in const.ts
changed — existing configs load unchanged. These change what you see:

  • Every card in a light theme. Accent-coloured text and data fills are
    distinctly darker and more saturated than in 2.0. This is the fix, not a side
    effect, but it is a visible change.
  • Every card. Tinted inner fills are opaque now rather than letting the
    wallpaper through. The card itself stays translucent.
  • M3 Climate Card Mini has a minimum height of 112px. A tile configured
    smaller than that is raised to it. 112px is the smallest height at which the
    compact layout fits without clipping, so a tile below it was cutting off its
    own content already.

Deutsche Fassung

Das Release für das helle Theme. Akzentfarben werden jetzt beim Rendern gegen
die Fläche korrigiert, auf der sie tatsächlich liegen — die Palette wirkt
dadurch gewollt statt ausgewaschen. Dazu: deutlich weniger Renderaufwand, ein
Layout-Fehler in der Masonry-Ansicht und Kalender-Unterstützung für die
Abfallkarte.

Neu

  • M3 Waste Card — calendar_entity. Abfuhrtermine aus einem Kalender
    lesen, dessen Einträge die Tonne benennen — statt oder zusätzlich zu je einem
    Tageszähler-Sensor pro Tonne. Beide Quellen werden zusammengeführt; bei
    gleichem Namen gewinnt der Sensor.
  • Werkzeuge für Kontrastprüfung. npm run test:contrast testet die
    Farbmathematik, test/contrast-audit.js misst die gerenderte Seite — in die
    Browser-Konsole eines Dashboards einfügen und je Theme einmal ausführen.
    Siehe docs/TESTING.md.

Behoben

  • Akzentfarben im hellen Theme. Die bekannte Einschränkung aus 2.0 ist
    erledigt. Die Palette ist für dunkle Hintergründe gebaut — alle dreizehn
    Farben fallen auf heller Karte unter 4,5:1 und bestehen auf dunkler — deshalb
    werden Akzente als Text oder als Datenfläche jetzt zur Laufzeit auf ihren
    Zielkontrast gezogen. Die Korrektur hält den Farbton und hebt die Sättigung,
    statt Richtung Schwarz zu blenden: #85b7eb wird #0b6ed5, kein Graublau.
    Auf einem Dashboard mit 35 Karten gemessen meldet das helle Theme jetzt drei
    Funde, das dunkle vier — und alle drei hellen stehen auch in der dunklen
    Liste. Es sind also langjährige Gestaltungsentscheidungen, keine
    Theme-Fehler.
  • Inhalt auf getönten Flächen. Chips, Icon-Felder, Aufklapp-Umschalter und
    Zähler-Badges nahmen ihre Farbe von der Karte, saßen aber auf einer Tönung
    desselben Farbtons — das ergab #81c784 auf #9cdc9f, also 1,26:1. Die
    Schrift wird jetzt gegen die Fläche gemessen, auf der sie wirklich liegt.
  • Tönungen mischen nicht mehr gegen transparent. 146 Flächen mischten
    gegen das, was hinter der Karte lag — durch eine Glaskarte also gegen die
    Hintergrundtapete, sodass derselbe 8-%-Schleier je nach Bild anders aussah.
    Sie mischen jetzt in die Kartenfläche. Gradienten und bewusste Überlagerungen
    bleiben unverändert.
  • M3 Button Card und M3 Climate Card Mini in der Masonry-Ansicht. Beide
    machen ihre Karte zum Größen-Container, damit Polster mit der Höhe skalieren
    können, und nahmen dann height: 100%. Eine Masonry-Spalte gibt keine Höhe
    vor, der Prozentwert fiel auf auto zurück, und auto ist auf einem
    größen-kontenierten Element null: Die Button-Karte zeigte 37 px gequetschten
    Inhalt in einer 0-px-Karte, die Mini-Klimakarte verschwand ganz.
    Sections-Ansichten waren nie betroffen.
  • M3 Occupancy Card — max_visible. Die Option hatte keine Wirkung; die
    Liste wird jetzt bei der angegebenen Zahl gekappt, der Rest liegt hinter
    einem Umschalter.

Geschwindigkeit

  • Karten rendern nicht mehr bei fremden Zustandsänderungen. Home Assistant
    übergibt jeder Karte ein frisches hass-Objekt, sobald sich irgendwo im
    System etwas ändert — ein einzelner geschwätziger Stromsensor rendert so das
    ganze Dashboard neu. Jede Karte deklariert jetzt, was sie liest. Karten, die
    ihre Entitäten selbst suchen, beobachten zusätzlich die Anzahl der Entitäten,
    damit ein neu hinzugefügter Sensor weiterhin gefunden wird.
  • M3 Power Summary — Zähl-Animation. Die Interpolation schrieb pro
    Animationsframe in reaktiven Zustand, obwohl der Wert vor der Anzeige
    gerundet wird — die meisten Frames rendern also identischen Text.
  • Zusammen gemessen, dasselbe Dashboard mit 35 Karten, 20 Sekunden:
    370 Renders → 12.

Achtung beim Update

Keine Konfigurationsoption wurde entfernt oder umbenannt, kein Standardwert in
const.ts hat sich geändert — bestehende Configs laden unverändert. Diese
Punkte ändern aber, was man sieht:

  • Alle Karten im hellen Theme. Akzentfarbener Text und Datenflächen sind
    deutlich dunkler und gesättigter als in 2.0. Das ist die Behebung, kein
    Nebeneffekt — aber eine sichtbare Änderung.
  • Alle Karten. Getönte Innenflächen sind jetzt deckend, statt die Tapete
    durchscheinen zu lassen. Die Karte selbst bleibt durchscheinend.
  • M3 Climate Card Mini hat eine Mindesthöhe von 112 px. Eine kleiner
    konfigurierte Kachel wird darauf angehoben. 112 px ist die kleinste Höhe, bei
    der das kompakte Layout ohne Abschneiden passt — eine kleinere Kachel schnitt
    ihren Inhalt vorher bereits ab.

v2.0.0

Choose a tag to compare

@j0sp0r j0sp0r released this 29 Aug 15:13

Bekannte Einschränkung

Akzentfarben im hellen Theme. Die Farbpalette ist für dunkle Hintergründe entworfen. Im hellen Theme haben Werte, die in der Akzentfarbe gesetzt sind — große Zahlen, Prozentangaben, Statusfarben — weniger Kontrast als der übrige Text und wirken blass. Kartenflächen, getönte Flächen und Balken sind mit dieser Version korrigiert; die Vordergrundfarben folgen in 2.0.1.

Achtung beim Update

Keine Konfigurationsoption wurde entfernt oder umbenannt — bestehende Configs laden unverändert. Diese Punkte ändern aber das Verhalten, ohne dass man etwas anpasst:

  • Media Card: Die rechte Zeitangabe zeigt die Restzeit mit Minuszeichen statt der Gesamtdauer (time_display: total stellt es zurück), führende Tracknummern verschwinden aus dem Titel (strip_track_number: false), und bei Playern mit BROWSE_MEDIA erscheint die Bibliothekszeile — die Karte wird dadurch höher und kann Layouts verschieben (show_browser: false).
  • Button Card mit show_slider: true: Ein Tap setzt jetzt den Wert an der getippten Position, statt zu schalten. Zum Schalten dient das Icon, dessen Standardaktion im Slider-Modus auf den Domänen-Toggle wechselt (icon_tap_action: more-info stellt More-Info zurück). Karten ohne show_slider sind nicht betroffen.

Neu

Sechs neue Karten — die Suite wächst von 23 auf 29.

M3 Cover Card (custom:m3-cover-card) — Rollladen- und Abdeckungssteuerung, die sich an die Fähigkeiten der Entität anpasst: Position, Lamellen-Neigung oder nur Auf/Zu, je nach supported_features. Einzel- und Gruppenmodus. Für Geräte ohne eigene Cover-Entität — etwa FingerBot-Antriebe an getrennten Schaltern — gibt es den switch_pair-Modus mit Auf-/Ab-/(optional) Stopp-Schalter; wo das Gerät keine Rückmeldung liefert, zeigt ein kurzes Tastenfeedback den ausgelösten Befehl.

M3 Leak Card (custom:m3-leak-card) — Überblick über Feuchte- und Leck-Sensoren mit den Zuständen OK, Alarm und „veraltet" (kein aktuelles Update). Optionaler Absperr-Knopf, der die Domäne der Absperr-Entität erkennt (valve / switch / cover), auf Wunsch mit Bestätigung. Optionale Benachrichtigung bei Wasseralarm.

M3 Waste Card (custom:m3-waste-card) — Abfuhrtermine als Hero mit „nächste Abfuhr in N Tagen", einer Zeitleiste über die nächsten zwei Wochen und einer Zeile je Tonne. Info- und Erinnerungsmodus, Hero-Icon einzeln oder mehrfach („N Tonnen"). Optionale Erinnerung zum Rausstellen zur eingestellten Uhrzeit. Erwartet Sensoren mit den Tagen bis zur Abfuhr, etwa aus der Integration Waste Collection Schedule.

M3 Occupancy Card (custom:m3-occupancy-card) — Belegung nach Räumen statt nach einzelnen Sensoren. Fasst Präsenz- und Bewegungssensoren je Raum zusammen, zeigt „X von Y Räumen belegt" und je Raum „belegt/frei seit …". Automatische Erkennung über Bereiche oder eine manuelle Sensorliste.

M3 Time Card (custom:m3-time-card) — Bearbeitet input_datetime-Helfer im Designsystem des Projekts, wahlweise als Stepper-Felder oder Scroll-Räder.

M3 Todo Card (custom:m3-todo-card) — Einkaufs- und Aufgabenlisten als Ersatz für HAs eingebaute todo-list-Karte. Einträge landen wahlweise oben oder unten (add_position), Dubletten werden abgefangen: statt einer zweiten identischen Zeile pulst der vorhandene Eintrag kurz auf. Schnellwahl-Chips speisen sich aus einer festen Liste, aus zuvor abgehakten Einträgen oder aus den M3 Supply Cards des Dashboards — der knappste Vorrat zuerst. Langes Drücken öffnet eine Zeile zum Umbenennen oder Löschen.

Dazu eine gemeinsame Benachrichtigungs-Infrastruktur für Occupancy-, Leak- und Waste-Karte: ein Panel im Editor mit Dienst-Auswahl, optionalem Titel und Text. Es legt eine — standardmäßig deaktivierte — Automatisierung an.

Die Media Card, überarbeitet

Bibliothek und Warteschlange. Meldet der Player BROWSE_MEDIA, öffnet eine Zeile am Fuß der Karte den Medienbrowser von Home Assistant: Breadcrumb-Navigation, Vorschaubild oder Icon je Zeile, Ordner zum Hineinnavigieren, abspielbare Einträge per Tap. Ein zweiter Reiter zeigt die Warteschlange, sofern die Integration eine liefert — Cast und Spotify tun das nicht und bekommen den Reiter gar nicht erst, statt ihn leer anzuzeigen.

Metadaten und Chips. Titel über zwei Zeilen, Interpretenzeile mit Radio-Fallback über media_channel, dritte Zeile mit Album und Jahr. Darunter Chips für Ausgabegerät und Quelle. Führende Tracknummern verschwinden aus dem Titel (07 - Enjoy the Silence → Enjoy the Silence), ohne Titel wie 1979 oder 365 Dreams anzutasten. Player ohne Metadaten — etwa ein Chromecast mit dem Default Media Receiver — greifen auf den Dateipfad zurück.

Fortschritt. Wellen-Indikator, der beim Pausieren flach ausläuft, sodass der Balken selbst den Wiedergabezustand trägt. Streams ohne Dauer zeigen ein wanderndes Segment und einen „Live"-Chip. Restzeit mit Minuszeichen, umschaltbar über time_display. Spulen per Ziehen.

Transportleiste. Reihenfolge Shuffle · Zurück · Play/Pause · Vor · Repeat. Der Play-Knopf ist der Zustandsanzeiger: Kreis pausiert, Squircle beim Abspielen, mit überblendendem Symbol. Repeat läuft dreistufig (aus → alle → einer). Knöpfe erscheinen weiterhin nur, wenn der Player das Feature meldet.

Akzentfarbe aus dem Cover. Bisher der Durchschnitt aller Pixel — also Hintergrund plus Motiv addiert, meist ein entsättigter Braunton. Jetzt wird die dominante gesättigte Farbe gewählt und auf lesbaren Kontrast gebracht. Ein Cover, das vorher ein praktisch unsichtbares Symbol ergab, liefert nun ein klar erkennbares Violett.

Behoben: helles Theme

Der Glas-Hintergrund aller Karten mischte seinen Schleier aus der Textfarbe. Im hellen Theme ist die dunkel — die Fläche verdunkelte also den Hintergrund, vor dem dann dunkler Text stand. Über einem dunklen Dashboard-Hintergrundbild waren die Karten dadurch praktisch unlesbar. Gemischt wird jetzt aus der Kartenfläche, die Home Assistant ohnehin themekorrekt liefert; der Kontrast stimmt damit von selbst, unabhängig vom Hintergrundbild. Im dunklen Theme ändert sich fast nichts. Der Fehler bestand seit 1.0.0.

Leistung

Zwei Animationen bauten bei jedem Einzelbild die komplette Karte neu auf, statt nur den animierten Pfad zu zeichnen. Bei der Light Card erzeugte eine einzige Instanz mit eingeschalteter Lampe 1820 Renders in 15 Sekunden — 73 % eines Dashboards mit 35 Karten. Nach der Korrektur sind es 9. Die Media Card hatte dieselbe Ursache im Fortschrittsbalken.

Zusätzlich filtern 15 der 29 Karten jetzt überflüssige Neuzeichnungen: Home Assistant reicht jedem Element bei jeder Zustandsänderung im gesamten System ein neues hass-Objekt, sodass bisher jede Karte bei jedem fremden Sensor neu rendert. Umgestellte Karten zeichnen nur noch, wenn eine ihrer eigenen Entitäten sich ändert.

Weitere Änderungen

  • M3 Button Card: Der Slider übernimmt jetzt auch beim Tippen, nicht nur beim Ziehen, und bleibt bei ausgeschaltetem Licht bedienbar.
  • Drags auf Slidern und Rädern werden von Swipe-Plugins des Dashboards abgeschirmt, damit ein seitlicher Wisch nicht die Ansicht wechselt.
  • M3 Counter Card: Optionale Korrektur des Zählerstands direkt im Header.
  • Alle Icon-Knöpfe der Media Card haben jetzt lokalisierte Beschriftungen für Screenreader.
  • README von Grund auf neu strukturiert: ein Katalog nach Themenbereichen, je Karte Code, Erklärung und ein eigenes Bild.

Die vollständige Liste steht in CHANGELOG.md.


Known issue

Accent colours in a light theme. The palette is built for dark backgrounds. In a light theme, values set in the accent colour — large figures, percentages, status colours — carry less contrast than the surrounding text and read as pale. Card surfaces, tinted fills and bars are corrected in this release; the foreground colours follow in 2.0.1.

Before you update

No configuration option was removed or renamed — existing configs load unchanged. These do change behaviour without any edit on your side:

  • Media card: the right-hand time shows remaining, with a minus sign, rather than the total length (time_display: total restores it), leading track numbers drop out of titles (strip_track_number: false), and players reporting BROWSE_MEDIA gain the library row — which makes the card taller and may reflow a dashboard (show_browser: false).
  • Button card with show_slider: true: a tap now sets the value at the pressed position instead of toggling. Toggling moves to the icon, whose default action in slider mode becomes the domain's toggle (icon_tap_action: more-info restores more-info). Cards without show_slider are unaffected.

New

Six new cards — the suite grows from 23 to 29.

M3 Cover Card (custom:m3-cover-card) — Blind and cover control that adapts to what the entity can do: position, tilt, or just open/close, depending on supported_features. Single and group mode. For devices without a cover entity of their own — FingerBot actuators on separate switches, say — there is a switch_pair mode with up/down/(optional) stop switches; where the device reports nothing back, a brief button feedback shows which command was sent.

M3 Leak Card (custom:m3-leak-card) — An overview of moisture and leak sensors with OK, alarm and "stale" states (no recent update). Optional shut-off button that detects the domain of the shut-off entity (valve / switch / cover), with confirmation if you want it. Optional notification on a water alarm.

M3 Waste Card (custom:m3-waste-card) — Collection dates as a hero reading "next collection in N days", a timeline across the next two weeks, and a row per bin. Info and reminder modes, with a single hero icon or several ("N bins"). Optional reminder to put the bins out at a set time. Expects sensors carrying the days until collection, for instance from the Waste Collection Schedule integration.

M3 Occupancy Card (custom:m3-occupancy-card) — Occupan...

Read more

v1.9.0

Choose a tag to compare

@j0sp0r j0sp0r released this 26 Aug 12:44

Neu

M3 Supply Card (custom:m3-supply-card) — Vorratsverwaltung für Verbrauchsmaterial wie Waschmittel-Pods, Spülmaschinentabs, Filter oder Tierfutter.

  • Ein Vorrat steht groß als Hero mit einem Punkt je verbleibender Einheit (ab 40 Stück ein Balken), Stepper mit Wiederholung beim Halten und ein „Packung nachgefüllt"-Knopf. Weitere Vorräte folgen als Zeilen mit Füllstandsbalken; ein Tap macht sie animiert zum Hero.
  • Reichweiten-Schätzung aus der Historie des Helfers. Geteilt wird durch den Zeitraum, den die Daten tatsächlich abdecken, nicht durch das angefragte Fenster — der Recorder bewahrt standardmäßig nur 10 Tage auf. Eine Schätzung erscheint erst nach mindestens 3 Verbrauchsereignissen und 2 Tagen Beobachtung; wer sofort eine Zahl will, setzt usage_per_week.
  • Benachrichtigung, wenn ein Vorrat zur Neige geht: als Abend-Digest mit allen Vorräten in einer Nachricht, wöchentlich oder sofort beim Unterschreiten. Auslöse-Niveau wählbar zwischen leer, kritisch und knapp, über notify_items auf einzelne Vorräte begrenzbar.
  • Einkaufsliste: ein Chip im Hero schreibt den Vorrat auf eine To-do-Liste, auto_add_to_list erledigt es ungefragt in der Automatisierung — inklusive Dublettenprüfung.
  • Schwellwerte und Farben je Artikel einstellbar, Animationen abschaltbar.

Die README erklärt das Anlegen des Zähler-Helfers und enthält ein Automatisierungs-Beispiel, das den Zähler nach jedem Waschgang herunterzählt.


New

M3 Supply Card (custom:m3-supply-card) — Supply management for consumables like laundry pods, dishwasher tabs, filters, or pet food.

  • One supply is prominently displayed as a hero with one dot per remaining unit (switches to a bar for 40+ units), a stepper with press-and-hold repeat, and a "pack refilled" button. Additional supplies follow as rows with fill-level bars; a tap animates them into the hero position.
  • Range estimation based on the helper's history. It calculates using the time period the data actually covers, not the requested window — the recorder only keeps 10 days by default. An estimate appears only after at least 3 consumption events and 2 days of observation; if you want a number immediately, just set usage_per_week.
  • Notifications when a supply is running low: as an evening digest with all supplies in one message, weekly, or immediately upon falling below the threshold. The trigger level can be set to empty, critical, or low, and can be limited to specific supplies via notify_items.
  • Shopping list: a chip in the hero section adds the supply to a to-do list, auto_add_to_list handles this automatically in the background — including duplicate checking.
  • Thresholds and colors can be configured per item, animations can be disabled.

The README explains how to create the counter helper and includes an automation example that decrements the counter after every wash cycle.