The engine migration replaced the old mm/* modal-stack wizards (which slid
forward/back between steps) with wizard2, but never carried the slide over — step
transitions went flat. Restore the original mechanism in the shared engine so all
wizards (new-invoice, vendor, client, pay, transaction-rule) get it:
- wizard2/step-slide-classes: the group-[.forward]/transition:htmx-* and
group-[.backward]/* slide variants, applied to the swapped <form>.
- wizard2/transitioner: the #transitioner wrapper whose @htmx:after-request hook
reads the x-transition-type response header and toggles group/transition +
forward|backward on itself. All 5 configs' :open-response now use it.
- wizard2/handle-step-submit sets x-transition-type (forward on advance, backward
on Back, none on a same-step validation re-render) + HX-reswap "outerHTML
swap:0.16s" so the slide-out plays before the swap. Direction computed from
step order (transition-type).
- Removed the interim per-card fade-in in favor of this.
- Rebuilt output.css so the 16 fwd + 16 back slide variants are compiled.
REPL-verified: open-wizard emits the transitioner, the form carries the slide
classes, and submit responses carry the transition headers. Live verification
needs a server refresh (the dev server froze its route table at startup).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
§3 animations: the migrated wizard step cards had no transition, so step→step
swaps and modal open were flat. The old mm/* slide system was deleted in Phase
11 (and its classes purged from CSS), and the transaction-edit "reference" uses
an undefined `last-modal-step` no-op — so there was no clean slide to restore.
Apply the codebase's existing `fade-in transition-opacity duration-300`
primitive (`.htmx-added .fade-in` in input.css) to all three wizard step cards
(new-invoice basic-details + accounts, vendor step-card, client step-card). Each
card now fades in on open and on every step swap. Verified live: cards always
settle to opacity 1 (never stuck invisible) on both open and step navigation.
Richer directional (forward/back) slide transitions are left for a design pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- BUG D: clicking "Bulk Edit" with no invoices selected 500'd. selected->ids
returns nil with no selection, and all-ids-not-locked fed that nil into a
Datomic `:in $ [?i ...]` query ("Unable to find data source"). Guard the body
with (when (seq all-ids) ...) so an empty selection yields [] and the modal
opens cleanly. Verified live: no "Oh, drat" toast, no 500.
- BUG B: modal-footer- called (hx/alpine-appear ...) twice; the 2nd return value
(an attribute map) landed in child position and rendered as literal EDN
({:x-show ...}) in the red error banner whenever unexpectedError flipped true.
Delete the duplicate. Verified: rendered HTML now has one alpine-appear and no
EDN-text child. (Pre-existing defect, also present on master.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
BUG E/F: the Vendor and Client wizard step cards overflowed — horizontal
scrollbar, clipped fields, a huge empty grey left region. The step-card lays the
step timeline in a vertical left sidebar (grow-0, self-stretch), but
vendor-timeline/client-timeline rendered the HORIZONTAL `timeline` component,
which forced the shrink-to-fit sidebar to ~full card width and pushed the body
off-screen.
- vendor-timeline / client-timeline: use timeline/vertical-timeline +
vertical-timeline-step (the components already existed) instead of the
horizontal pair.
- vendors.clj: step bodies w-[600px] h-[350px] -> w-full h-[350px] so the body
fills the width left of the now-narrow vertical timeline.
Verified live (agent-browser): Vendor 760x520, Client 820x560, vertical timeline,
no horizontal overflow, Info->Terms navigation + validation re-render lay out
correctly. Both files pass lein cljfmt check.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Three regressions from the SSR rendering-modernization migration, all verified
live via agent-browser:
- BUG A — New Invoice: choosing a client 500'd from /invoice/new/due-date
(ClassCastException: DateTime cannot be cast to java.util.Date). `due-date`
and `scheduled-payment-date` called `coerce/from-date` on values already
decoded to clj-time DateTimes. Drop the coerce; use the decoded dates.
- BUG C — Transaction Edit: any whole-form swap (mode toggle, vendor change,
add/remove row) 500'd whenever the txn had >=1 autopay-invoice match
(ClassCastException at links-body*: PersistentVector cannot be cast to Named).
The autopay link-panel's hidden `action` input was missing `:form ""`, so it
serialized alongside the main `action` hidden, producing a duplicate param
that Ring collapsed to a vector. Add `:form ""` to match the unpaid/rule panels.
- Modal sizes: Vendor/Client/Invoice-Pay modals ballooned to full width because
resources/public/output.css was missing their arbitrary Tailwind size classes.
Root cause: tailwind.config.js `content` never scanned resources/templates/**/*.html
(46 Selmer templates the migration introduced), so a rebuild also dropped
template-only classes like md:w-[950px]. Add the templates glob and rebuild;
all modal size classes now present, no working modal regressed.
Docs: add 2026-06-27 QA findings + resumable fix task list; cross-link from the
migration plan. Remaining (per the new plan): Vendor/Client inner step-body
overflow, wizard step animations, bulk-edit empty-selection 500, footer EDN leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>