Widget Patterns
Common UI patterns using Appivo widgets
Widget Patterns Example
Learn common UI patterns built with Appivo's widget system.
What You'll Build
Reusable UI patterns including:
- Master-detail layouts
- Dashboard with metrics
- Search with filters
- Modal workflows
Prerequisites
- Completed the Hello World example
- Understanding of widgets and data binding
Pattern 1: Master-Detail Layout
Display a list with detail panel.
Layout Structure
FlexContainer: Master-Detail
├── Panel: Master List (width: 40%)
│ └── DataGrid: Items
│ - Click row to select
│ - Highlight selected row
│
└── Panel: Detail View (width: 60%)
└── Shows selected item details
└── Empty state when nothing selected
Implementation
FlexContainer: Master-Detail
Direction: row
Gap: 20px
Left Panel:
├── DataGrid: Customers
│ Columns: name, email, status
│ onRowClick: Set selected_customer
│ Row highlighting: When id = selected_customer.id
Right Panel (visible when customer selected):
├── Panel: Customer Details
│ ├── Label: customer.name (large)
│ ├── Label: customer.email
│ ├── Label: customer.phone
│ └── Panel: Recent Orders
│ └── DataGrid: Orders filtered by customer_id
Empty State
Panel: No Selection (visible when no customer selected)
├── Icon: user
└── Label: "Select a customer to view details"
Pattern 2: Dashboard Layout
Display metrics and quick actions.
Layout Structure
GridContainer: Dashboard (3 columns)
├── Panel: Today's Sales
│ ├── Large number: $12,345
│ └── Change indicator: +15%
│
├── Panel: New Orders
│ ├── Large number: 47
│ └── Link: View all
│
├── Panel: Pending Approval
│ ├── Large number: 5
│ └── Button: Review
│
├── Panel: Sales Chart (spans 2 columns)
│ └── Chart: Line chart of sales
│
└── Panel: Recent Activity
└── List: Latest 10 activities
Metric Card Pattern
Panel: Metric Card
├── Label: "Total Revenue" (small, gray)
├── Label: "$45,678" (large, bold)
├── FlexContainer: Change
│ ├── Icon: arrow-up (green) or arrow-down (red)
│ └── Label: "12% vs last month"
└── Link: "View details →"
Calculate Metrics
Use data binding with aggregations:
Label: Total Revenue
Value: SUM(orders.total) where created_at = today
Format: Currency
Label: Order Count
Value: COUNT(orders) where status != "Cancelled"
Pattern 3: Search with Filters
Advanced search interface.
Layout Structure
Panel: Search Interface
├── FlexContainer: Search Bar
│ ├── TextField: Search (with icon)
│ └── Button: Advanced Filters
│
├── Panel: Filter Panel (collapsible)
│ ├── Select: Status
│ ├── DateField: Date From
│ ├── DateField: Date To
│ ├── Select: Category
│ └── Button: Apply Filters
│
├── Label: "Showing 25 of 142 results"
│
└── DataGrid: Results
└── Paginated, sortable
Search Bar Component
FlexContainer: Search Bar
├── TextField: Search Query
│ Placeholder: "Search products..."
│ Icon: magnifying glass
│ onKeyPress (Enter): Execute search
│ onChange (debounced 300ms): Filter results
│
├── Button: Clear
│ Visible when: search has value
│ onClick: Clear search
│
└── Button: Filters
Icon: funnel
Badge: Active filter count
onClick: Toggle filter panel
Active Filters Display
FlexContainer: Active Filters
Visible when: Any filter active
├── Chip: Status = Active
│ └── X button to remove
├── Chip: Category = Electronics
│ └── X button to remove
├── Chip: Date: Jan 1 - Jan 31
│ └── X button to remove
└── Button: Clear all
Pattern 4: Modal Form
Form in a modal dialog.
Modal Trigger
Button: Add New Customer
onClick: Show Add Customer Modal
Modal Structure
Modal: Add Customer
├── Header: "Add New Customer"
├── Content:
│ ├── TextField: Name (required)
│ ├── EmailField: Email (required)
│ ├── PhoneField: Phone
│ └── Select: Type (Personal/Business)
└── Footer:
├── Button: Cancel (closes modal)
└── Button: Save (primary)
Disabled until: Form is valid
onClick:
1. Create customer
2. Close modal
3. Refresh list
4. Show success toast
Modal Sizes
Modal: Small (400px)
- Simple confirmations
- Quick inputs
Modal: Medium (600px)
- Standard forms
- Most common
Modal: Large (800px)
- Complex forms
- Multi-section content
Modal: Full (90% width)
- Detailed views
- Wizards
Pattern 5: Tabs with Content
Organize content into tabs.
Tab Structure
TabContainer: Customer Details
├── Tab: Overview
│ ├── Customer info
│ └── Quick stats
│
├── Tab: Orders
│ └── DataGrid: Customer orders
│
├── Tab: Documents
│ └── List: Uploaded files
│
└── Tab: Notes
├── List: Previous notes
└── Form: Add note
Tab with Badge
Tab: Orders
Badge: 12 (active order count)
Tab Loading
Tab: Documents
Loading: Show spinner until data loads
Empty: "No documents uploaded"
Pattern 6: Wizard / Stepper
Multi-step process.
Wizard Structure
Panel: Order Wizard
├── Stepper: Progress
│ ├── Step 1: Cart (completed)
│ ├── Step 2: Shipping (active)
│ ├── Step 3: Payment
│ └── Step 4: Confirm
│
├── Panel: Step Content
│ └── Current step form/content
│
└── FlexContainer: Navigation
├── Button: Back
│ Disabled on: First step
├── Spacer
├── Button: Next (steps 1-3)
│ onClick: Validate, then advance
└── Button: Complete (step 4)
onClick: Submit order
Step Validation
Step 2: Shipping
Required fields: address, city, country
Validation: All required fields filled
Next button: Disabled until valid
Pattern 7: Card Grid
Display items as cards.
Card Grid Layout
GridContainer: Products
Columns: 4 (responsive: 3 on tablet, 2 on mobile)
Gap: 20px
Card Template:
├── Image: Product photo
├── Label: Product name
├── Label: Price (bold)
├── Label: Category (small, gray)
└── Button: Add to Cart
Card with Actions
Panel: Product Card
├── Image: product.image
│ AspectRatio: 4:3
│
├── FlexContainer: Content
│ ├── Label: product.name
│ ├── Label: product.price (formatted)
│ └── StarRating: product.rating (read-only)
│
└── FlexContainer: Actions
├── Button: Quick View (icon only)
├── Button: Add to Wishlist (icon only)
└── Button: Add to Cart
Pattern 8: Table Actions
DataGrid with row actions.
Row Action Menu
DataGrid: Orders
Columns:
- order_number
- customer
- date
- total
- status
- actions (custom column)
Actions Column:
├── Button: View (icon: eye)
├── Button: Edit (icon: pencil)
└── Menu: More
├── Item: Duplicate
├── Item: Print
├── Separator
└── Item: Delete (danger)
Bulk Actions
DataGrid: Orders
Selection: Checkbox column
Bulk Actions Toolbar (visible when items selected):
├── Label: "3 items selected"
├── Button: Export
├── Button: Update Status
└── Button: Delete
Pattern 9: Empty States
Handle no-data scenarios.
Empty State Component
Panel: Empty State
Centered: true
├── Icon: inbox (large, gray)
├── Label: "No orders yet" (heading)
├── Label: "Orders will appear here..." (description)
└── Button: Create First Order (primary)
Context-Specific Empty States
Search Results Empty:
Icon: search
Title: "No results found"
Description: "Try different search terms"
Action: Clear search
Filtered Empty:
Icon: filter
Title: "No matching items"
Description: "Adjust your filters"
Action: Clear filters
New User Empty:
Icon: rocket
Title: "Welcome!"
Description: "Get started by..."
Action: Create first item
Best Practices
Consistency
- Use same patterns across views
- Maintain consistent spacing
- Use consistent button placement
- Follow established conventions
Responsiveness
- Test on multiple screen sizes
- Stack elements on mobile
- Adjust column counts
- Consider touch targets
Accessibility
- Use proper labels
- Ensure keyboard navigation
- Provide screen reader text
- Maintain color contrast
Performance
- Lazy load tab content
- Paginate large lists
- Optimize images
- Cache where appropriate
Next Steps
- User Interfaces Guide - Complete UI reference
- Widgets Reference - All available widgets
- Mobile Development - Mobile UI patterns