Skip to content

UX Patterns

Backoffice applications are work tools. Their quality is measured not by visual flair but by productivity, safety, and the reduction of cognitive effort. Users spend hours inside these systems — every unnecessary click, every lost filter, every context switch carries a real operational cost.

Mateu’s thesis is that good business UX is regular enough to be codified once, on the backend, and applied consistently without writing frontend code. This section documents the patterns Mateu supports and how to express each one.

Seven principles drive every pattern in this catalogue. Each exists to eliminate a concrete cost.

#PrincipleWhat it prevents
01Preserve contextUsers should never lose their orientation or mental state. Leaving a screen to come back is the most expensive form of context loss.
02Minimize navigationFewer screens and fewer jumps equal more productivity. Composing beats navigating.
03Keyboard-firstPower users live on the keyboard. If a frequent task requires a mouse, it is badly designed.
04Workflow over screensThe unit of design is the task, not the screen. Design to complete work, not to display an entity.
05Progressive complexityShow complexity only when it adds value. Advanced features are revealed, not imposed.
06RecoverabilityEvery error must be correctable. Confirm destructive actions, undo reversible ones, never lose work in progress.
07ConsistencyPatterns repeat predictably. What a user learns on one screen works on all.

Looking for full-page templates (record overview, collection detail, guided process, create and edit in a drawer…)? They have their own map: Page templates.

PatternStatusKey primitive
Navigation & Menus✅ Implemented@App(AppVariant.*), ⌘K command palette
Split View✅ Implemented@SplitCrud
Tree CRUD✅ ImplementedgridLayout() = GridLayout.tree, @SplitCrud
Filters & Listing✅ Implemented@List, @Filterable, @RowAction
Bulk actions✅ Implemented@ListToolbarButton + typed List<Row> selection
Saved views✅ ImplementedSmart search bar bookmark — named condition sets, default view
Totals & row grouping✅ Implemented@Aggregate(sum/avg/…) footer + @GroupBy subtotal rows
Column chooser✅ ImplementedShow/hide/reorder columns per user, per listing
Guided import✅ ImplementedImportWizard<Row> — upload → map columns → validate → import
Concurrent edit conflicts✅ Implemented@Version — conflict dialog: reload / overwrite
Notification inbox✅ ImplementedNotificationsSupplier — header bell, unread count, mark-as-read
Undo✅ ImplementedMessage.undoable(...) — toast with an Undo button
Session expiry✅ ImplementedonSessionExpired — re-auth + retry, work intact
Audit version diff✅ ImplementedHistory grouped by save moment — old → new per field
Global entity search✅ ImplementedGlobalSearchSupplier — ⌘K searches data, grouped by category
Planning board✅ ImplementedPlanningBoard — resources × days tape chart, drag to move
Wizard✅ Implemented@WizardCompletionAction, @WizardProgress(BAR/STEPS/RAIL)
CRUD editing in a drawer✅ ImplementededitInDrawer() — create/edit slides over the listing
Collection detail✅ ImplementedCollectionDetail<Row> — searchable list + in-place detail
General overview✅ ImplementedGeneralOverview<Row> — record context switcher + overview
Entity Picker✅ Implemented@Lookup, @Composition
WorkspaceComposition@SplitLayout, @Tabs, @Accordion
Task-centric pageComposition@Action, @MainAction
Long-running jobs✅ Implemented@Action(background, sse), @Trigger
Autosave✅ Implemented@AutoSave
Keyboard Shortcuts✅ Implemented@Action(shortcut = ...), @Trigger(OnEnter)
Push Notifications✅ Implemented@Trigger(OnLoad + OnSuccess), Hydratable, MicroFrontend
Partial Forms✅ Implemented@FoldedLayout, @Section, nested subform records
High-density screens✅ Implemented@Compact, StyleConstants.COMPACT
Audience projection✅ Implemented@Audience + @AppContext field named audience
Front-office screensCompositionTaskQueue + EntityHeader + Wizard + Ledger + …
Entity header✅ ImplementedEntityHeader (title, badges, facts, metric)
Meter✅ ImplementedMeter (value/max, warn/danger thresholds)
Task progress✅ ImplementedTaskProgress (done/total pills + CTA)
Status list✅ ImplementedStatusList + StatusItem (status chip or action)
Task queue✅ ImplementedTaskQueue + QueueGroup/QueueItem
Resource grid✅ ImplementedResourceGrid + ResourceItem (availability picker)
Offer card✅ ImplementedOfferCard (features, price delta, CTA)
Add-on picker✅ ImplementedAddOnPicker + AddOn (running total)
Ledger✅ ImplementedLedger + LedgerLine (folio breakdown)
Payment picker✅ ImplementedPaymentPicker + PaymentMethod
Process monitor✅ ImplementedProcessMonitor + ProcessItem (health + fix)
Notice✅ ImplementedNotice / @Notice (inline banner, status, action)
Kanban✅ ImplementedKanban + KanbanColumn/KanbanCard
Timeline✅ ImplementedTimeline + TimelineItem (activity feed)
Progress steps✅ ImplementedProgressSteps (also @WizardProgress(STEPS))
Stat / KPI tile✅ ImplementedStat (value, trend, sparkline)
Calendar✅ ImplementedCalendar month view + CalendarEvent
Pricing table✅ ImplementedPricingTable + PricingPlan
Org chart✅ ImplementedOrgChart + OrgNode
Heatmap✅ ImplementedHeatmap (calendar heatmap)
Funnel✅ ImplementedFunnel + FunnelStage
Trend chart✅ ImplementedTrendChart (line/area, dependency-free)
Feature grid✅ ImplementedFeatureGrid + Feature tiles
Testimonials✅ ImplementedTestimonials + Testimonial
FAQ✅ ImplementedFaq + FaqItem (collapsible)
Callout card✅ ImplementedCalloutCard (title, body, CTA)
Comment thread✅ ImplementedCommentThread + Comment
File list✅ ImplementedFileList + FileItem (attachments)
Comparison card✅ ImplementedComparisonCard (side-by-side options)
Checklist✅ ImplementedChecklist + ChecklistItem (progress)

Each anti-pattern has a name so it can be recognised quickly — and a pattern that prevents it.

Anti-patternDescriptionSolved by
CRUD TunnelList → detail → back, breaking the flow on every row visit.Split View
Modal HellNested modals that destroy orientation.Split View, Task-centric page
Spinner PrisonFreezing the entire screen while something loads.Long-running jobs
Filter AmnesiaLosing filters when navigating away.Filter state synced to URL — browser bookmarks become saved views
Desktop DenialIgnoring the keyboard and penalising the expert user.Keyboard Shortcuts@Action(shortcut = ...)