Adds the admin-side surface for the Fase 18 list-title flow:
• `default_list_title` input — single line, save-on-blur (matches the
collective-name input shape from Fase 10.2). Optimistically patches
`currentCollective` so the next /lists modal prefill sees the value
without waiting for the realtime UPDATE to round-trip.
• Curated catalog list — one row per entry with an inline "Remove"
icon button. An "Add title" button opens a small modal (name input
+ Save) that calls `add_list_title` via the listTitles store.
Members see the whole section read-only — the input is `disabled`, the
"Add title" button is hidden, and a banner explains "Only admins can
curate these titles." Guests don't see the section at all (mirrors the
`canSeeCommonItems` gate from Fase 15).
The default-title `$effect` that mirrors `$currentCollective.default_list_title`
into the input draft is guarded against re-firing while the admin is
mid-edit — only sync when the input isn't focused — so realtime UPDATEs
from another tab don't clobber the unsaved edit.
E2E `tests/e2e/list-title-flow.test.ts` gains:
• LTF-02 — Ana adds the catalog prefix via the manage UI, sets the
default via the same UI, then drives the create-modal three times
and asserts the third list lands as `${prefix} #3`. Exercises the
full path: manage RPC → realtime/store update → modal auto-suffix
on submit → numbered list created.
• LTF-04 — Borja (member) opens manage, sees the section, no add
button, read-only banner visible, default-title input disabled.
Tests: 4 LTF e2e + 4 existing manage-collective e2e all green (8/8).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
`CreateListModal.svelte` is the new entry point for "New list" — opens
on the masthead button click, prefills the input with
`currentCollective.default_list_title` (Fase 18.3.1), shows an inline
autocomplete dropdown via `fetchTitleSuggestions`, and renders a
"Sugerencia: Compra #6" chip when (a) the typed value exactly matches a
catalog-curated prefix case-insensitively and (b) `computeNextNumber`
resolves a value (Fase 18.3.2). Submit is disabled while the trimmed
value is empty or creation is in flight (Fase 18.3.3). On submit, if the
catalog match still holds, the modal auto-suffixes "#N" before
inserting and the lists page shows a transient toast confirming the
final name (Fase 18.3.4).
The prefill effect is gated by a `wasOpen` edge-tracker — a naive
`$effect(() => { if (open) value = default })` re-runs whenever
`$currentCollective` updates (e.g. a realtime UPDATE landing after the
user typed something), which clobbered the typed value and froze the
submit button as disabled. The edge guard limits the prefill to the
false→true transition.
`/lists/+page.svelte`: the masthead "New list" button now opens the
modal instead of calling `createList(collective, '', user)` and goto-ing
to the detail page for inline rename. The legacy flow was nice for
quick creates but couldn't enforce a required title or surface the
catalog. Existing per-list actions are unchanged.
15 new i18n strings (en + es) for the modal, the suggestion chip, the
auto-numbered toast, and the manage-page subsection that ships in the
next commit.
Updated existing e2e specs: `lists.test.ts`'s `createList()` helper +
the C-13 guest path now drive the modal instead of the legacy
placeholder input; `session.test.ts` S-03 uses the modal for the
fresh-list setup. New `tests/e2e/list-title-flow.test.ts` adds LTF-01
(default prefill end-to-end with a Supabase-driven setDefaultListTitle
since the manage UI lands in the next commit) and LTF-03 (empty input
keeps submit disabled, even with whitespace).
Tests: 4 lists + 3 session + 2 new LTF specs all green (9/9).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>