fix(ui): action items as two-row cards so the action text is always readable in the narrow pane

Text row (confirm + full-width text + delete) over a wrapping meta row
(owner, due date, reminder). Also void the seekNonce dependency read to
satisfy no-unused-expressions.
This commit is contained in:
iamdoubz committed 2026-07-15 17:41:38 -05:00
1 parent de25ac70e7
commit a552ddb1fa
1 file changed
+65 -44
+65 -44
View File
@@ -64,7 +64,7 @@
// nonce so re-clicking the same segment still jumps). Reading seekNonce is
// what makes this effect re-run.
$effect(() => {
player.seekNonce;
void player.seekNonce;
const ms = player.seekMs;
if (ms == null || !audioEl) return;
audioEl.currentTime = ms / 1000;
@@ -770,47 +770,54 @@
{#if editableItems.length === 0}
<p class="muted">{t("summary.ai_empty")}</p>
{:else}
<!-- Two-row card per item: the action text owns the full first row (it
was unreadable when six controls shared one row in this narrow
pane); owner/due/reminder are a secondary meta row beneath it. -->
<ul class="action-items">
{#each editableItems as item, i (i)}
<li>
<input
type="checkbox"
bind:checked={item.confirmed}
aria-label={t("summary.confirmed")}
title={t("summary.confirmed")}
/>
<input
class="ai-text"
bind:value={item.text}
placeholder={t("summary.ai_text_placeholder")}
aria-label={t("summary.ai_text_aria")}
/>
<input
class="ai-owner"
value={item.owner ?? ""}
oninput={(e) => (item.owner = (e.target as HTMLInputElement).value || null)}
placeholder={t("summary.owner")}
aria-label={t("summary.owner")}
/>
<input
type="date"
class="due-date"
aria-label={t("summary.due_date")}
value={dueDateInput(item.due_at)}
onchange={(e) => onDueDateChange(item, (e.target as HTMLInputElement).value)}
/>
<label class="remind" title={t("summary.reminder_title")}>
<input type="checkbox" bind:checked={item.reminder_set} disabled={!item.due_at} />
<Bell size={14} aria-hidden="true" />
</label>
<button
class="ai-del"
onclick={() => removeActionItem(i)}
title={t("summary.ai_delete_title")}
aria-label={t("summary.ai_delete_aria")}
>
<X size={14} aria-hidden="true" />
</button>
<div class="ai-main">
<input
type="checkbox"
bind:checked={item.confirmed}
aria-label={t("summary.confirmed")}
title={t("summary.confirmed")}
/>
<input
class="ai-text"
bind:value={item.text}
placeholder={t("summary.ai_text_placeholder")}
aria-label={t("summary.ai_text_aria")}
/>
<button
class="ai-del"
onclick={() => removeActionItem(i)}
title={t("summary.ai_delete_title")}
aria-label={t("summary.ai_delete_aria")}
>
<X size={14} aria-hidden="true" />
</button>
</div>
<div class="ai-meta">
<input
class="ai-owner"
value={item.owner ?? ""}
oninput={(e) => (item.owner = (e.target as HTMLInputElement).value || null)}
placeholder={t("summary.owner")}
aria-label={t("summary.owner")}
/>
<input
type="date"
class="due-date"
aria-label={t("summary.due_date")}
value={dueDateInput(item.due_at)}
onchange={(e) => onDueDateChange(item, (e.target as HTMLInputElement).value)}
/>
<label class="remind" title={t("summary.reminder_title")}>
<input type="checkbox" bind:checked={item.reminder_set} disabled={!item.due_at} />
<Bell size={14} aria-hidden="true" />
</label>
</div>
</li>
{/each}
</ul>
@@ -1080,9 +1087,9 @@
}
ul.action-items li {
display: flex;
align-items: center;
flex-direction: column;
gap: 0.35rem;
padding: 0.25rem 0;
padding: 0.45rem 0;
border-bottom: 1px solid var(--border);
}
ul.action-items label {
@@ -1090,14 +1097,28 @@
align-items: center;
gap: 0.4rem;
}
.ai-main {
display: flex;
align-items: center;
gap: 0.35rem;
}
.ai-text {
flex: 1;
min-width: 0;
font-size: 0.82rem;
font-size: 0.85rem;
}
/* Meta row indented under the text (past the confirm checkbox), wrapping
rather than crushing its inputs when the pane is narrow. */
.ai-meta {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.35rem;
padding-left: 1.4rem;
}
.ai-owner {
flex: none;
width: 5rem;
flex: 1;
min-width: 5rem;
font-size: 0.75rem;
}
.ai-del {