backend-ui-design
Design and implement consistent, production-grade backend/backoffice interfaces using the @open-mercato/ui component library. Use this skill when building admin pages, CRUD interfaces, data tables, forms, detail pages, or any backoffice UI components. Ensures visual consistency and UX patterns across all application modules.
Install
mkdir -p .claude/skills/backend-ui-design && curl -L -o skill.zip "https://mcp.directory/api/skills/download/1398" && unzip -o skill.zip -d .claude/skills/backend-ui-design && rm skill.zipInstalls to .claude/skills/backend-ui-design
About this skill
This skill guides creation of consistent, production-grade backend/backoffice interfaces using the established @open-mercato/ui component library. All implementations must leverage existing components to maintain visual and behavioral consistency across modules.
For complete component documentation, see references/ui-components.md.
Design Principles
Backend UI prioritizes usability, consistency, and productivity over creative expression:
- Consistency First: Every page should feel like part of the same application. Use established patterns.
- Component Reuse: Never create custom implementations when a shared component exists.
- Data Density: Admin users need information-rich interfaces. Optimize for scanning and quick actions.
- Keyboard Navigation: Support Cmd/Ctrl+Enter for primary actions, Escape to cancel, and standard shortcuts.
- Clear Hierarchy: Page → Section → Content. Use PageHeader, PageBody, and consistent spacing.
Required Component Library
ALWAYS import from @open-mercato/ui. Reference the component documentation at .ai/specs/SPEC-001-2026-01-21-ui-reusable-components.md.
Core Layout Pattern
import { Page, PageHeader, PageBody } from '@open-mercato/ui/backend/Page'
import { AppShell } from '@open-mercato/ui/backend/AppShell'
// Every backend page follows this structure
<Page>
<PageHeader>
{/* Title, actions, breadcrumbs */}
</PageHeader>
<PageBody>
{/* Main content */}
</PageBody>
</Page>
Data Display (Lists)
Use DataTable for ALL tabular data. Never implement custom tables.
import { DataTable } from '@open-mercato/ui/backend/DataTable'
import type { FilterDef } from '@open-mercato/ui/backend/FilterBar'
import { RowActions } from '@open-mercato/ui/backend/RowActions'
import { TruncatedCell } from '@open-mercato/ui/backend/TruncatedCell'
import { BooleanIcon, EnumBadge } from '@open-mercato/ui/backend/ValueIcons'
Column configuration patterns:
- Text columns: Use
TruncatedCellwithmeta.maxWidthfor long content - Boolean columns: Use
BooleanIcon - Status/enum columns: Use
EnumBadgewith severity presets - Actions column: Use
RowActionsfor context menus
Forms
Use CrudForm for ALL forms. Never build forms from scratch.
import { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'
import { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'
Form field types available:
text,textarea,number,email,passwordselect,multiselect,comboboxcheckbox,switchdate,datetimecustom(for JsonBuilder, TagsInput, etc.)
Dialogs
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@open-mercato/ui/primitives/dialog'
import { CrudForm } from '@open-mercato/ui/backend/CrudForm'
// Dialog forms MUST use embedded={true}
<Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent className="sm:max-w-2xl [&_.grid]:!grid-cols-1">
<DialogHeader>
<DialogTitle>Edit Item</DialogTitle>
</DialogHeader>
<CrudForm
fields={fields}
groups={groups}
initialValues={initialValues}
onSubmit={handleSubmit}
embedded={true}
submitLabel="Save"
/>
</DialogContent>
</Dialog>
Detail Pages
import {
DetailFieldsSection,
LoadingMessage,
ErrorMessage,
TabEmptyState
} from '@open-mercato/ui/backend/detail'
import { NotesSection } from '@open-mercato/ui/backend/detail/NotesSection'
import { TagsSection } from '@open-mercato/ui/backend/detail/TagsSection'
import { CustomDataSection } from '@open-mercato/ui/backend/detail/CustomDataSection'
Notifications
import { flash } from '@open-mercato/ui/backend/FlashMessages'
// Success
flash('Record saved successfully', 'success')
// Error
flash('Failed to save record', 'error')
// Warning/Info
flash('This action cannot be undone', 'warning')
flash('Processing in background', 'info')
NEVER use alert(), console.log(), or custom toast implementations.
Loading & Error States
import { Spinner } from '@open-mercato/ui/primitives/spinner'
import { DataLoader } from '@open-mercato/ui/primitives/DataLoader'
import { ErrorNotice } from '@open-mercato/ui/primitives/ErrorNotice'
import { EmptyState } from '@open-mercato/ui/backend/EmptyState'
import { LoadingMessage, ErrorMessage } from '@open-mercato/ui/backend/detail'
Primitives (use sparingly, prefer backend components)
import { Button } from '@open-mercato/ui/primitives/button'
import { Input } from '@open-mercato/ui/primitives/input'
import { Label } from '@open-mercato/ui/primitives/label'
import { Badge } from '@open-mercato/ui/primitives/badge'
import { Alert, AlertTitle, AlertDescription } from '@open-mercato/ui/primitives/alert'
import { Separator } from '@open-mercato/ui/primitives/separator'
import { Switch } from '@open-mercato/ui/primitives/switch'
import { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'
Implementation Checklist
Before writing any backend UI code, verify:
- Using
CrudFormfor forms (not custom form implementations) - Using
DataTablefor lists (not custom tables) - Using
flash()for notifications (not alert/toast) - Dialog forms have
embedded={true} - Keyboard shortcuts: Cmd/Ctrl+Enter (submit), Escape (cancel)
- Loading states use
LoadingMessageorDataLoader - Error states use
ErrorMessageorErrorNotice - Empty states use
EmptyState - Column truncation configured with
meta.truncateandmeta.maxWidth - Boolean values use
BooleanIcon - Status/enum values use
EnumBadge - Row actions use
RowActionscomponent
Visual Guidelines
Spacing
- Use consistent padding:
p-4for cards,p-6for page sections - Use
gap-4orgap-6for flex/grid layouts - Maintain vertical rhythm with
space-y-4orspace-y-6
Colors
- Use semantic colors from the theme (don't hardcode hex values)
- Destructive actions:
variant="destructive"on buttons - Status badges: Use
useSeverityPreset()for consistent coloring
Typography
- Page titles: Handled by
PageHeader - Section titles:
text-lg font-semibold - Labels: Handled by form components
- Body text: Default sizing, avoid custom font sizes
Layout Patterns
- List pages: FilterBar + DataTable + Pagination
- Detail pages: Header + Tabs or Sections + Related data
- Create/Edit: Full-page CrudForm or Dialog with embedded CrudForm
- Settings: Grouped sections with inline editing
Anti-Patterns to Avoid
- Custom form implementations - Always use CrudForm
- Manual table markup - Always use DataTable
- Custom toast/notification - Always use flash()
- Inline styles - Use Tailwind classes
- Hardcoded colors - Use theme variables
- Missing loading states - Every async operation needs feedback
- Missing error handling - Every failure needs user-friendly messaging
- Missing keyboard shortcuts - All dialogs need Cmd+Enter and Escape
- Custom truncation logic - Use TruncatedCell with meta.maxWidth
- Direct fetch() calls - Use apiCall/apiCallOrThrow from utils
API Integration Pattern
import { apiCall, apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
import { createCrud, updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'
import { mapCrudServerErrorToFormErrors, createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'
// For CRUD operations
const handleCreate = async (values: FormValues) => {
const result = await createCrud<ResponseType>('module/resource', values)
if (result.ok) {
flash('Created successfully', 'success')
router.push(`/backend/module/${result.result.id}`)
}
return result
}
// For custom endpoints
const result = await apiCall<ResponseType>('/api/custom-endpoint', {
method: 'POST',
body: JSON.stringify(data)
})
Custom Fields Integration
When building CRUD interfaces that support custom fields:
import { useCustomFieldDefinitions } from '@open-mercato/ui/backend/utils/customFieldDefs'
import { buildCustomFieldFormFields } from '@open-mercato/ui/backend/utils/customFieldForms'
import { buildCustomFieldColumns } from '@open-mercato/ui/backend/utils/customFieldColumns'
import { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'
When to Create New Components
Only create new components when:
- No existing component serves the use case
- The pattern will be reused across 3+ modules
- Approved for addition to
@open-mercato/ui
If creating something new, it should eventually be added to the shared library, not kept in a single module.
You might also like
flutter-development
aj-geddes
Build beautiful cross-platform mobile apps with Flutter and Dart. Covers widgets, state management with Provider/BLoC, navigation, API integration, and material design.
ui-ux-pro-max
nextlevelbuilder
"UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient."
drawio-diagrams-enhanced
jgtolentino
Create professional draw.io (diagrams.net) diagrams in XML format (.drawio files) with integrated PMP/PMBOK methodologies, extensive visual asset libraries, and industry-standard professional templates. Use this skill when users ask to create flowcharts, swimlane diagrams, cross-functional flowcharts, org charts, network diagrams, UML diagrams, BPMN, project management diagrams (WBS, Gantt, PERT, RACI), risk matrices, stakeholder maps, or any other visual diagram in draw.io format. This skill includes access to custom shape libraries for icons, clipart, and professional symbols.
godot
bfollington
This skill should be used when working on Godot Engine projects. It provides specialized knowledge of Godot's file formats (.gd, .tscn, .tres), architecture patterns (component-based, signal-driven, resource-based), common pitfalls, validation tools, code templates, and CLI workflows. The `godot` command is available for running the game, validating scripts, importing resources, and exporting builds. Use this skill for tasks involving Godot game development, debugging scene/resource files, implementing game systems, or creating new Godot components.
nano-banana-pro
garg-aayush
Generate and edit images using Google's Nano Banana Pro (Gemini 3 Pro Image) API. Use when the user asks to generate, create, edit, modify, change, alter, or update images. Also use when user references an existing image file and asks to modify it in any way (e.g., "modify this image", "change the background", "replace X with Y"). Supports both text-to-image generation and image-to-image editing with configurable resolution (1K default, 2K, or 4K for high resolution). DO NOT read the image file first - use this skill directly with the --input-image parameter.
pdf-to-markdown
aliceisjustplaying
Convert entire PDF documents to clean, structured Markdown for full context loading. Use this skill when the user wants to extract ALL text from a PDF into context (not grep/search), when discussing or analyzing PDF content in full, when the user mentions "load the whole PDF", "bring the PDF into context", "read the entire PDF", or when partial extraction/grepping would miss important context. This is the preferred method for PDF text extraction over page-by-page or grep approaches.
Related MCP Servers
Browse all serversSpec-Driven Development integrates with IBM DOORS software to track software licenses, automate requirements, and enforc
Boost productivity with Task Master: an AI-powered tool for project management and agile development workflows, integrat
Unlock seamless Figma to code: streamline Figma to HTML with Framelink MCP Server for fast, accurate design-to-code work
Structured spec-driven development workflow for AI-assisted software development. Creates detailed specifications before
Access shadcn/ui v4 components, blocks, and demos for rapid React UI library development. Seamless integration and sourc
Access official Microsoft Docs instantly for up-to-date info. Integrates with ms word and ms word online for seamless wo
Stay ahead of the MCP ecosystem
Get weekly updates on new skills and servers.