The inner panel lacked x-cloak (brief FOUC on load/navigation) and its
leave/enter durations (300/200ms) outlasted the backdrop's (200/150ms), so the
card animated without its backdrop on open/close. Cloak the panel and align all
durations to 200ms so backdrop and card move together.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Cancel sale / Delete sale actions used the browser's native confirm()
('pos.ladill.com says…'). Render the store-driven ladillConfirm prompt (already
registered in app.js but never displayed) via a new partials/confirm-prompt and
have the two forms open it instead — branded, with sale-specific copy.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Finish removing the upstream platform fork: drop the Hosting/SSL/Domain
notification classes + their mail views, the email/mailbox/domains/hosting
view trees, the Mini/Afia/search/paystack partials and unused components, and
the now-orphan support helpers (DomainConfig, MailboxPricing,
ResellerClubLegacy), SmsService, and fork configs (afia, hosting, domain,
email, mailbox, qr, mail_brands, notifications, ...). Reparent the
notifications page off the hosting layout onto the POS app layout (it had
referenced undefined hosting./mini. routes). Computed the removable set from a
reachability scan of the POS view graph; kept views reference no removed
routes/services.
Branding: favicon now uses the updated favicon.ico (favicon.svg removed);
signed-out fallback logo points at the POS logo.
CRM import: constrain the catalogue pull to type=product so CRM services are
never imported as POS products (server-side filter + defensive client skip).
Test suite green (8 passed, 29 assertions); all routes resolve and every
remaining Blade compiles.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>