Files
2025-11-30 09:02:33 +08:00

25 KiB
Raw Permalink Blame History

Modal Dialog Component

Modal dialog overlay with focus management, backdrop, and configurable content areas for confirmations, forms, and content display.

Standard Modal (Medium Size)

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░┌────────────────────────────────┐░░░░░░░░
░░░░░░░░░░│ {{title}}                   │✕│░░░░░░░░
░░░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░░░│                                │░░░░░░░░
░░░░░░░░░░│ {{content}}                    │░░░░░░░░
░░░░░░░░░░│                                │░░░░░░░░
░░░░░░░░░░│                                │░░░░░░░░
░░░░░░░░░░│                                │░░░░░░░░
░░░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░░░│  ┌─────────┐  ┌─────────────┐  │░░░░░░░░
░░░░░░░░░░│  │ Cancel  │  │  {{buttons[1].text}}  │  │░░░░░░░░
░░░░░░░░░░│  └─────────┘  └─────────────┘  │░░░░░░░░
░░░░░░░░░░└────────────────────────────────┘░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

Small Modal (Confirmation)

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░┌──────────────────────────┐░░░░░
░░░░░░░░│ {{title}}             │✕│░░░░░
░░░░░░░░├──────────────────────────┤░░░░░
░░░░░░░░│                          │░░░░░
░░░░░░░░│ {{content}}              │░░░░░
░░░░░░░░│                          │░░░░░
░░░░░░░░├──────────────────────────┤░░░░░
░░░░░░░░│ ┌──────┐  ┌────────────┐ │░░░░░
░░░░░░░░│ │  No  │  │    Yes     │ │░░░░░
░░░░░░░░│ └──────┘  └────────────┘ │░░░░░
░░░░░░░░└──────────────────────────┘░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

Large Modal (Form/Content)

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░┌────────────────────────────────────────────────────────┐░░░░░░░░
░░░░░░░░│ {{title}}                                            │✕│░░░░░░░░
░░░░░░░░├────────────────────────────────────────────────────────┤░░░░░░░░
░░░░░░░░│                                                        │░░░░░░░░
░░░░░░░░│ {{content}}                                            │░░░░░░░░
░░░░░░░░│                                                        │░░░░░░░░
░░░░░░░░│ Name: ┌─────────────────────────────────────────────┐  │░░░░░░░░
░░░░░░░░│       │ Enter your name                             │  │░░░░░░░░
░░░░░░░░│       └─────────────────────────────────────────────┘  │░░░░░░░░
░░░░░░░░│                                                        │░░░░░░░░
░░░░░░░░│ Email: ┌────────────────────────────────────────────┐  │░░░░░░░░
░░░░░░░░│        │ your@email.com                             │  │░░░░░░░░
░░░░░░░░│        └────────────────────────────────────────────┘  │░░░░░░░░
░░░░░░░░│                                                        │░░░░░░░░
░░░░░░░░├────────────────────────────────────────────────────────┤░░░░░░░░
░░░░░░░░│    ┌──────────┐  ┌──────────────┐  ┌──────────────┐    │░░░░░░░░
░░░░░░░░│    │  Cancel  │  │    Save      │  │   Submit     │    │░░░░░░░░
░░░░░░░░│    └──────────┘  └──────────────┘  └──────────────┘    │░░░░░░░░
░░░░░░░░└────────────────────────────────────────────────────────┘░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

Fullscreen Modal

╔══════════════════════════════════════════════════════════════════════════╗
║ {{title}}                                                             ✕ ║
╠══════════════════════════════════════════════════════════════════════════╣
║                                                                          ║
║ {{content}}                                                              ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
║                                                                          ║
╠══════════════════════════════════════════════════════════════════════════╣
║                           ┌──────────┐  ┌──────────┐                    ║
║                           │  Cancel  │  │    OK    │                    ║
║                           └──────────┘  └──────────┘                    ║
╚══════════════════════════════════════════════════════════════════════════╝

Modal Variants

Warning Modal

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░┌────────────────────────────────┐░░░░░░░░
░░░░░░░░│ ⚠ Warning                   │✕│░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│                                │░░░░░░░░
░░░░░░░░│ This action cannot be undone.  │░░░░░░░░
░░░░░░░░│ Are you sure you want to       │░░░░░░░░
░░░░░░░░│ continue?                      │░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│  ┌─────────┐  ┌─────────────┐  │░░░░░░░░
░░░░░░░░│  │ Cancel  │  │   Delete    │  │░░░░░░░░
░░░░░░░░│  └─────────┘  └─────────────┘  │░░░░░░░░
░░░░░░░░└────────────────────────────────┘░░░░░░░░

Error Modal

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░┌────────────────────────────────┐░░░░░░░░
░░░░░░░░│ ✗ Error                     │✕│░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│                                │░░░░░░░░
░░░░░░░░│ An error occurred while        │░░░░░░░░
░░░░░░░░│ processing your request.       │░░░░░░░░
░░░░░░░░│ Please try again later.        │░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│           ┌─────────────┐      │░░░░░░░░
░░░░░░░░│           │     OK      │      │░░░░░░░░
░░░░░░░░│           └─────────────┘      │░░░░░░░░
░░░░░░░░└────────────────────────────────┘░░░░░░░░

Success Modal

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░┌────────────────────────────────┐░░░░░░░░
░░░░░░░░│ ✓ Success                   │✕│░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│                                │░░░░░░░░
░░░░░░░░│ Your changes have been saved   │░░░░░░░░
░░░░░░░░│ successfully!                  │░░░░░░░░
░░░░░░░░│                                │░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│           ┌─────────────┐      │░░░░░░░░
░░░░░░░░│           │   Continue  │      │░░░░░░░░
░░░░░░░░│           └─────────────┘      │░░░░░░░░
░░░░░░░░└────────────────────────────────┘░░░░░░░░

Modal Without Backdrop

┌────────────────────────────────┐
│ {{title}}                   │✕│
├────────────────────────────────┤
│                                │
│ {{content}}                    │
│                                │
│                                │
├────────────────────────────────┤
│  ┌─────────┐  ┌─────────────┐  │
│  │ Cancel  │  │   Confirm   │  │
│  └─────────┘  └─────────────┘  │
└────────────────────────────────┘

Modal with Custom Content

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░┌────────────────────────────────┐░░░░░░░░
░░░░░░░░│ Image Gallery               │✕│░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│                                │░░░░░░░░
░░░░░░░░│ ┌────────────────────────────┐ │░░░░░░░░
░░░░░░░░│ │        IMAGE_CONTENT       │ │░░░░░░░░
░░░░░░░░│ │         [PHOTO]            │ │░░░░░░░░
░░░░░░░░│ │                            │ │░░░░░░░░
░░░░░░░░│ └────────────────────────────┘ │░░░░░░░░
░░░░░░░░│                                │░░░░░░░░
░░░░░░░░│ Photo 1 of 5                   │░░░░░░░░
░░░░░░░░├────────────────────────────────┤░░░░░░░░
░░░░░░░░│ ┌─────┐ ┌─────┐ ┌─────────────┐│░░░░░░░░
░░░░░░░░│ │ Prev│ │Next │ │    Close    ││░░░░░░░░
░░░░░░░░│ └─────┘ └─────┘ └─────────────┘│░░░░░░░░
░░░░░░░░└────────────────────────────────┘░░░░░░░░

Dimensions

  • Small: 30×15 characters
  • Medium: 50×20 characters (default)
  • Large: 70×30 characters
  • Fullscreen: Full viewport dimensions
  • Custom: Configurable width/height

Variables

  • title (string): Modal header title (max 60 characters)
  • content (string, required): Main modal content (max 500 characters)
  • size (string): Modal size ("small", "medium", "large", "fullscreen")
  • buttons (array): Action buttons with text, variant, and action
  • showCloseButton (boolean): Show X button in header (default: true)
  • backdrop (boolean): Show backdrop overlay (default: true)
  • variant (string): Style variant ("default", "warning", "error", "success", "info")

Accessibility

  • Role: dialog
  • Focus Management:
    • Trap focus within modal
    • Return focus to trigger element on close
    • Initial focus on first button or specified element
  • Keyboard Support:
    • Escape: Close modal (if closable)
    • Tab/Shift+Tab: Navigate within modal
    • Enter: Activate focused button
  • ARIA:
    • aria-labelledby: References title element
    • aria-describedby: References content element
    • aria-modal: "true"
    • aria-hidden: "true" on background content when modal open

Usage Examples

Confirmation Dialog

░░░░░░░░┌──────────────────────────┐░░░░░
░░░░░░░░│ Delete Item           │✕│░░░░░
░░░░░░░░├──────────────────────────┤░░░░░
░░░░░░░░│                          │░░░░░
░░░░░░░░│ Are you sure you want to │░░░░░
░░░░░░░░│ delete this item? This   │░░░░░
░░░░░░░░│ action cannot be undone. │░░░░░
░░░░░░░░├──────────────────────────┤░░░░░
░░░░░░░░│ ┌──────┐  ┌────────────┐ │░░░░░
░░░░░░░░│ │Cancel│  │   Delete   │ │░░░░░
░░░░░░░░│ └──────┘  └────────────┘ │░░░░░
░░░░░░░░└──────────────────────────┘░░░░░

Loading Modal

░░░░░░░░┌──────────────────────────┐░░░░░
░░░░░░░░│ Processing...         │░│░░░░░
░░░░░░░░├──────────────────────────┤░░░░░
░░░░░░░░│                          │░░░░░
░░░░░░░░│ Please wait while we     │░░░░░
░░░░░░░░│ process your request...  │░░░░░
░░░░░░░░│                          │░░░░░
░░░░░░░░│ ████████████████░░░░ 80% │░░░░░
░░░░░░░░└──────────────────────────┘░░░░░

Settings Modal

░░░░░░░░┌──────────────────────────────────┐░░░░░░░░
░░░░░░░░│ Preferences                   │✕│░░░░░░░░
░░░░░░░░├──────────────────────────────────┤░░░░░░░░
░░░░░░░░│                                  │░░░░░░░░
░░░░░░░░│ ☑ Enable notifications          │░░░░░░░░
░░░░░░░░│ ☐ Auto-save changes             │░░░░░░░░
░░░░░░░░│ ☑ Dark mode                     │░░░░░░░░
░░░░░░░░│                                  │░░░░░░░░
░░░░░░░░│ Language: ┌───────────────────┐  │░░░░░░░░
░░░░░░░░│           │ English          ▼│  │░░░░░░░░
░░░░░░░░│           └───────────────────┘  │░░░░░░░░
░░░░░░░░├──────────────────────────────────┤░░░░░░░░
░░░░░░░░│  ┌─────────┐  ┌─────────────────┐│░░░░░░░░
░░░░░░░░│  │ Cancel  │  │      Save       ││░░░░░░░░
░░░░░░░░│  └─────────┘  └─────────────────┘│░░░░░░░░
░░░░░░░░└──────────────────────────────────┘░░░░░░░░

Component Behavior

Modal Lifecycle

  1. Trigger: User action opens modal
  2. Opening: Modal animates into view
  3. Open: Modal fully visible and interactive
  4. Interaction: User interacts with modal content
  5. Closing: Modal closes via button, escape, or backdrop
  6. Closed: Modal hidden, focus restored

Focus Management

  • Focus Trap: Tab navigation stays within modal
  • Initial Focus: First focusable element (usually close button)
  • Focus Restoration: Return to trigger element on close
  • Focus Indicators: Clear visual feedback for keyboard users

Backdrop Behavior

  • Backdrop Click: Close modal if backdropClosable is true
  • Backdrop Scroll: Prevent page scrolling when modal open
  • Multiple Modals: Handle stacking and z-index management

Design Tokens

Visual Elements

  • = Backdrop overlay (semi-transparent)
  • ┌─┐└┘─│ = Modal border and dividers
  • ╔═╗╚╝═║ = Fullscreen modal borders
  • = Close button icon
  • ⚠✗✓ = Status icons for variants

Spacing

  • Padding: 2-3 characters internal spacing
  • Margins: Centered positioning with backdrop
  • Button Spacing: 2-3 characters between buttons
  • Content Spacing: 1-2 lines between sections
  • Popup: Smaller, contextual overlays
  • Tooltip: Informational overlays
  • Dropdown: Menu-style overlays
  • Sidebar: Panel-style content areas

Implementation Notes

This ASCII representation demonstrates modal overlay patterns. When implementing:

  1. Focus Management: Robust focus trapping and restoration
  2. Backdrop Management: Proper event handling and scroll prevention
  3. Animation: Smooth open/close transitions
  4. Mobile Adaptation: Responsive sizing and touch interactions
  5. Performance: Efficient rendering and memory management
  6. Accessibility: Full screen reader and keyboard support

Variants

  • Alert Dialog: Simple message with OK button
  • Confirmation Dialog: Yes/No or Cancel/Confirm actions
  • Form Modal: Data input and submission
  • Content Modal: Rich content display (images, videos, etc.)
  • Loading Modal: Progress indication during operations