Keep the quest-log meta line's class when a quest is not late

The open quest card built its meta line as
class="meta ${meta.late ? "late" : nothing}"; Lit drops the whole
attribute when any interpolated part is nothing, so every on-time quest
lost the meta class and its styling. Choose the full class string
instead, rebuild the panel bundle, and add a rendered regression test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-26 09:39:04 -04:00
co-authored by Claude Opus 5.5
parent 744d80e645
commit 235c327608
3 changed files with 61 additions and 2 deletions
@@ -3225,7 +3225,7 @@ const Rt = "polygon(0 0, 100% 0, 100% 62%, 50% 100%, 0 62%)", ln = "polygon(50%
<span class="tile" aria-hidden="true">${st}</span>
<div class="body">
<span class="quest-title">${t.title}</span>
<span class="meta ${r.late ? "late" : g}">${r.text}</span>
<span class="${r.late ? "meta late" : "meta"}">${r.text}</span>
</div>
<button
class="complete"
+1 -1
View File
@@ -2096,7 +2096,7 @@ export class NestQuestQuestLogCard extends LitElement {
<span class="tile" aria-hidden="true">${ICON_STAR}</span>
<div class="body">
<span class="quest-title">${instance.title}</span>
<span class="meta ${meta.late ? "late" : nothing}">${meta.text}</span>
<span class="${meta.late ? "meta late" : "meta"}">${meta.text}</span>
</div>
<button
class="complete"
+59
View File
@@ -1043,6 +1043,65 @@ def test_quest_log_crest_keeps_its_shield_classes() -> None:
assert f'class="{crest_class}"' in crest.group(1), crest.group(1)
def test_quest_log_meta_line_keeps_its_meta_class() -> None:
"""An open quest's meta line is styled by ``.quest .meta`` (and
``.quest .meta.late`` when overdue). Written as
``meta ${late ? "late" : nothing}``, Lit dropped the whole class
attribute for every quest that was not late, leaving the due line
unstyled. The rendered markup must carry ``class="meta"`` on time and
``class="meta late"`` overdue."""
generated = _generate_dashboard(
{}, _three_child_states(), url="http://homeassistant.local/nestquest"
)
def quest(instance_id: int, title: str, overdue: bool) -> dict:
return {
"id": instance_id,
"definition_id": instance_id,
"child_id": 1,
"title": title,
"icon": None,
"window": "morning",
"due_time": "08:15",
"state": "open",
"overdue": overdue,
"completed_at": None,
"on_time": None,
}
states = {
**_three_child_states(),
"sensor.nestquest_ada_quests_due_today": _state(
"2",
child_name="Ada",
child_id=1,
present=True,
instances=[
quest(41, "Make Bed", overdue=False),
quest(42, "Brush Teeth", overdue=True),
],
),
}
result = _render_quest_log(
generated["views"][1]["cards"][0],
states,
url="http://homeassistant.local/nestquest/ada",
)
metas = {}
for card in result["html"].split('data-instance-id="')[1:]:
meta = re.search(
r'<span class="quest-title">.*?</span>'
r"\s*(?:<!--[^>]*-->\s*)*<span([^>]*)>",
card,
re.S,
)
assert meta is not None, card[:800]
metas[card[: card.index('"')]] = meta.group(1)
assert set(metas) == {"41", "42"}, metas
assert metas["41"].strip() == 'class="meta"', metas["41"]
assert metas["42"].strip() == 'class="meta late"', metas["42"]
def test_quest_log_crest_matches_the_spec_geometry() -> None:
"""PANEL-SPEC §3 header crest: 96x110 shield, 4px ring of
rgba(255,255,255,.22) around the --nq-p-crest face, 44px/700 display