Open Ticket Design System
Defines a complete brand identity, design tokens, and component specs for an open-source ticketing platform called GatherTix.
What this file does
Defines a complete brand identity, design tokens, and component specs for an open-source ticketing platform called GatherTix.
When to use it
- Starting a new open-source ticketing or event management project
- Creating a design system from scratch for a community-focused web app
- Documenting brand voice and inclusive language guidelines for a non-profit tool
- Building a token-based UI system with dark mode and accessibility baked in
Assumes this stack
Open Ticket Design System
Comprehensive Brand & Design Documentation
1. BRAND IDENTITY SYSTEM
1A. NAMING STRATEGY
Recommended Names (12 Options)
| # | Name | Domain Pattern | Rationale | Tagline Suggestion |
|---|---|---|---|---|
| 1 | Gather | gather-tix.org | Simple, warm, community-focused | "Bring people together" |
| 2 | OpenPass | openpass.io | Open source + ticketing clarity | "Open source, open doors" |
| 3 | Commons | commonstix.org | Shared resource, community asset | "Ticketing for everyone" |
| 4 | EventKit | eventkit.io | Toolkit metaphor, practical | "Everything you need to host" |
| 5 | LibreTix | libretix.org | Libre/open source emphasis | "Free as in freedom" |
| 6 | Hearth | hearth.events | Warm, welcoming, gathering place | "Where events come home" |
| 7 | Ticketwise | ticketwise.org | Smart, approachable, practical | "Smart ticketing made simple" |
| 8 | Crowd | crowd-tix.io | Community, people-focused | "Powered by your community" |
| 9 | Assembly | assemblytix.org | Coming together, democratic | "Assemble your audience" |
| 10 | SmallHall | smallhall.io | Intimate, non-corporate | "Big events, small footprint" |
| 11 | Patchwork | patchwork.events | Community-built, collaborative | "Stitched together by you" |
| 12 | Doorway | doorway.io | Access, opportunity, welcome | "Open the door to your event" |
Domain Availability Notes
Recommended Priority Order:
- gather-tix.org - Highly available, warm, memorable
- openpass.io - Tech-forward, clear purpose
- commonstix.org - Strong community message
- eventkit.io - Practical, developer-friendly
- libretix.org - Clear open source positioning
Naming Principles Applied:
- Avoided: TicketMaster, Eventbrite variations (trademark risk)
- Avoided: Corp, Inc, Pro suffixes (too corporate)
- Preferred: .org for non-profit alignment, .io for tech credibility
- Length: All under 12 characters (memorable, typeable)
1B. LOGO CONCEPTS
Concept 1: The Gathering Circle
Symbol: Interlocking arcs forming a circle with a ticket stub silhouette Meaning: Community coming together, inclusivity, shared experience Wordmark: Clean sans-serif, lowercase "gather" Color Variations:
- Light: Primary blue (#2563eb) on white
- Dark: Primary blue (#60a5fa) on dark
Concept 2: The Open Door
Symbol: Stylized door frame with ticket shape as the opening Meaning: Accessibility, welcome, opportunity Wordmark: Friendly rounded sans-serif Color Variations:
- Light: Secondary coral (#f43f5e) accent
- Dark: Soft coral (#fb7185) on dark
Concept 3: The Connected Nodes
Symbol: Three dots connected by lines, forming a ticket shape Meaning: Network, community, connection Wordmark: Modern geometric sans-serif Color Variations:
- Light: Gradient from primary to secondary
- Dark: Solid primary with glow effect
Concept 4: The Ticket Leaf
Symbol: Ticket stub with leaf/organic elements Meaning: Growth, natural, sustainable (lightweight) Wordmark: Slightly organic, friendly Color Variations:
- Light: Success green (#22c55e) primary
- Dark: Soft green (#4ade80) on dark
Concept 5: The Simple Mark
Symbol: Minimalist "t" shape that doubles as a ticket Meaning: Simplicity, clarity, focus Wordmark: Bold, confident sans-serif Color Variations:
- Light: Neutral dark (#171717) for versatility
- Dark: White (#ffffff) for contrast
Favicon Approaches
| Size | Approach | Description |
|---|---|---|
| 16x16 | Minimal mark | Simple geometric shape |
| 32x32 | Symbol detail | Simplified logo symbol |
| 180x180 | App icon | Full symbol with padding |
| 192x192 | PWA icon | Symbol on brand background |
| 512x512 | Splash screen | Full logo with wordmark |
Accessibility Considerations
- Color Independence: Logo works in single color (black/white)
- Minimum Size: 24px height for readability
- Contrast: 4.5:1 minimum against all backgrounds
- Animation: No essential information in motion
- Screen Readers: Logo marked as decorative or with aria-label
1C. BRAND VOICE & TONE
Brand Personality Traits (7)
- Welcoming - Like a friendly neighbor, not a corporate gatekeeper
- Helpful - Anticipates needs, offers solutions proactively
- Transparent - Clear about limitations, honest about capabilities
- Empowering - Builds confidence, celebrates user success
- Approachable - No jargon, no intimidation, human language
- Reliable - Consistent, trustworthy, there when needed
- Community-minded - "We" not "us vs them", celebrates collective success
Voice Characteristics
| Characteristic | Do | Don't |
|---|---|---|
| Clear | "Your tickets are ready" | "Ticket issuance has been completed" |
| Warm | "We're here to help" | "Contact support for assistance" |
| Actionable | "Download your tickets" | "Ticket download functionality available" |
| Personal | "Your event" | "The user's event" |
| Encouraging | "Great job setting up!" | "Setup completed successfully" |
Tone by Context
Marketing / Homepage
- Tone: Enthusiastic, inspiring, confident
- Example: "Create unforgettable events without the headache. Your community deserves better ticketing."
Onboarding
- Tone: Encouraging, guiding, patient
- Example: "Let's get your first event set up. It'll only take a few minutes."
Success States
- Tone: Celebratory, warm, specific
- Example: "Tickets sent! 47 people are excited to join your event."
Error Messages
- Tone: Helpful, apologetic, solution-focused
- Example: "We couldn't save that change. Let's try again, or you can refresh the page."
Loading States
- Tone: Reassuring, transparent
- Example: "Sending tickets to your guests... This usually takes about 30 seconds."
Empty States
- Tone: Inviting, guiding, optimistic
- Example: "No events yet. Your first event is going to be amazing—let's create it!"
Confirmation Emails
- Tone: Warm, clear, exciting
- Example: "You're all set! We've got your spot reserved. Here's everything you need to know."
Inclusive Language Guidelines
Gender-Neutral:
- Use: "they/them" for unknown individuals
- Use: "everyone", "folks", "team" instead of "guys"
- Avoid: Assuming gender in examples
Ability-Inclusive:
- Use: "accessible seating" not "handicapped seating"
- Use: "screen reader friendly" not "for blind users"
- Avoid: Defining people by ability
Culturally Sensitive:
- Use: Universal date formats (ISO 8601: YYYY-MM-DD)
- Use: Time zones explicitly stated
- Avoid: Cultural idioms that don't translate
Non-Profit Sector Alignment:
- Use: "mission", "impact", "community"
- Use: "supporters" not "customers"
- Use: "fundraiser" not "sale"
- Avoid: Commercial/retail language
2. DESIGN TOKEN SYSTEM
2A. COLOR PALETTE
Primary Palette (Blue - Trust & Reliability)
| Token | Hex | RGB | Usage | Contrast on White |
|---|---|---|---|---|
| --color-primary-50 | #eff6ff | rgb(239,246,255) | Light backgrounds | N/A |
| --color-primary-100 | #dbeafe | rgb(219,234,254) | Hover states | N/A |
| --color-primary-200 | #bfdbfe | rgb(191,219,254) | Borders, accents | N/A |
| --color-primary-300 | #93c5fd | rgb(147,197,253) | Disabled states | N/A |
| --color-primary-400 | #60a5fa | rgb(96,165,250) | Secondary accents | 3.1:1 |
| --color-primary-500 | #3b82f6 | rgb(59,130,246) | Primary actions | 4.5:1 ✓ |
| --color-primary-600 | #2563eb | rgb(37,99,235) | Primary buttons | 5.8:1 ✓ |
| --color-primary-700 | #1d4ed8 | rgb(29,78,216) | Hover states | 7.2:1 ✓ |
| --color-primary-800 | #1e40af | rgb(30,64,175) | Text | 8.9:1 ✓ |
| --color-primary-900 | #1e3a8a | rgb(30,58,138) | Headings | 11.2:1 ✓ |
| --color-primary-950 | #172554 | rgb(23,37,84) | Dark emphasis | 15.8:1 ✓ |
Secondary Palette (Coral - Energy & Action)
| Token | Hex | RGB | Usage | Contrast on White |
|---|---|---|---|---|
| --color-secondary-500 | #f43f5e | rgb(244,63,94) | CTA buttons | 5.2:1 ✓ |
| --color-secondary-600 | #e11d48 | rgb(225,29,72) | CTA hover | 6.4:1 ✓ |
| --color-secondary-700 | #be123c | rgb(190,18,60) | Emphasis | 8.1:1 ✓ |
Neutral Grays (Balanced, Warm)
| Token | Hex | RGB | Usage | Contrast on White |
|---|---|---|---|---|
| --color-gray-50 | #fafafa | rgb(250,250,250) | Page background | N/A |
| --color-gray-100 | #f5f5f5 | rgb(245,245,245) | Card backgrounds | N/A |
| --color-gray-200 | #e5e5e5 | rgb(229,229,229) | Borders | N/A |
| --color-gray-300 | #d4d4d4 | rgb(212,212,212) | Disabled borders | N/A |
| --color-gray-400 | #a3a3a3 | rgb(163,163,163) | Placeholder text | 3.0:1 |
| --color-gray-500 | #737373 | rgb(115,115,115) | Secondary text | 4.6:1 ✓ |
| --color-gray-600 | #525252 | rgb(82,82,82) | Body text | 7.0:1 ✓ |
| --color-gray-700 | #404040 | rgb(64,64,64) | Strong text | 9.2:1 ✓ |
| --color-gray-800 | #262626 | rgb(38,38,38) | Headings | 12.6:1 ✓ |
| --color-gray-900 | #171717 | rgb(23,23,23) | Primary text | 16.0:1 ✓ |
| --color-gray-950 | #0a0a0a | rgb(10,10,10) | Maximum contrast | 19.5:1 ✓ |
Semantic Colors
Success (Green)
| Token | Hex | Contrast on White | Contrast on Dark |
|---|---|---|---|
| --color-success-500 | #22c55e | 4.5:1 ✓ | - |
| --color-success-600 | #16a34a | 5.8:1 ✓ | - |
| --color-success-400 | #4ade80 | - | 9.8:1 ✓ |
Warning (Amber)
| Token | Hex | Contrast on White | Contrast on Dark |
|---|---|---|---|
| --color-warning-600 | #d97706 | 4.6:1 ✓ | - |
| --color-warning-500 | #f59e0b | 3.1:1 | - |
| --color-warning-400 | #fbbf24 | - | 12.1:1 ✓ |
Error (Red)
| Token | Hex | Contrast on White | Contrast on Dark |
|---|---|---|---|
| --color-error-600 | #dc2626 | 5.6:1 ✓ | - |
| --color-error-500 | #ef4444 | 4.5:1 ✓ | - |
| --color-error-400 | #f87171 | - | 8.4:1 ✓ |
Info (Blue)
| Token | Hex | Contrast on White | Contrast on Dark |
|---|---|---|---|
| --color-info-600 | #0284c7 | 5.4:1 ✓ | - |
| --color-info-500 | #0ea5e9 | 3.9:1 | - |
| --color-info-400 | #38bdf8 | - | 10.2:1 ✓ |
Event/Category Colors (Colorblind-Safe)
| Category | Color | Hex | Safe for Deuteranopia | Safe for Protanopia |
|---|---|---|---|---|
| General | Blue | #2563eb | ✓ | ✓ |
| Workshop | Green | #16a34a | ✓ | ✓ |
| Conference | Purple | #9333ea | ✓ | ✓ |
| Social | Orange | #ea580c | ✓ | ✓ |
| Fundraiser | Cyan | #0891b2 | ✓ | ✓ |
| Performance | Pink | #db2777 | ✓ | ✓ |
| Sports | Lime | #65a30d | ✓ | ✓ |
| Education | Violet | #7c3aed | ✓ | ✓ |
Colorblind Safety Strategy:
- Never rely on color alone for critical information
- Always pair with icons, labels, or patterns
- Test with simulators (Coblis, Color Oracle)
Dark Mode Color Mapping
| Semantic Token | Light Mode | Dark Mode |
|---|---|---|
| --bg-primary | #ffffff | #0a0a0a |
| --bg-secondary | #fafafa | #171717 |
| --text-primary | #171717 | #fafafa |
| --text-secondary | #525252 | #a3a3a3 |
| --border-default | #e5e5e5 | #404040 |
| --text-link | #2563eb | #60a5fa |
2B. TYPOGRAPHY
Font Family Stack
--font-sans: 'Inter', 'system-ui', '-apple-system', 'BlinkMacSystemFont',
'Segoe UI', 'Roboto', 'Helvetica Neue', 'Arial', sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', 'Monaco',
'Inconsolata', 'Roboto Mono', monospace;
Font Loading Strategy:
- Inter: Google Fonts or self-hosted
- Fallback: System fonts for instant render
- Font-display: swap for performance
Type Scale
| Token | Size | Line Height | Letter Spacing | Usage |
|---|---|---|---|---|
| --font-size-xs | 12px | 1.5 | 0.01em | Captions, timestamps |
| --font-size-sm | 14px | 1.5 | 0 | Body small, labels |
| --font-size-base | 16px | 1.5 | 0 | Body text (default) |
| --font-size-lg | 18px | 1.5 | -0.01em | Lead paragraphs |
| --font-size-xl | 20px | 1.4 | -0.01em | H6, small headings |
| --font-size-2xl | 24px | 1.3 | -0.01em | H5 |
| --font-size-3xl | 30px | 1.2 | -0.02em | H4 |
| --font-size-4xl | 36px | 1.2 | -0.02em | H3 |
| --font-size-5xl | 48px | 1.1 | -0.02em | H2 |
| --font-size-6xl | 60px | 1.1 | -0.03em | H1 (desktop) |
| --font-size-7xl | 72px | 1.0 | -0.03em | Hero (desktop) |
Font Weights
| Token | Value | Usage |
|---|---|---|
| --font-weight-normal | 400 | Body text |
| --font-weight-medium | 500 | Labels, emphasis |
| --font-weight-semibold | 600 | Headings, buttons |
| --font-weight-bold | 700 | Strong emphasis |
Typography Patterns
Headings:
- Weight: 600 (semibold)
- Line-height: Tight (1.1-1.2)
- Letter-spacing: Negative for large sizes
Body Text:
- Weight: 400 (normal)
- Line-height: Normal (1.5)
- Max-width: 65ch for readability
Labels & UI:
- Weight: 500 (medium)
- Size: sm (14px) or base (16px)
- Uppercase with wide tracking for buttons
2C. SPACING SYSTEM
Base Unit: 4px
All spacing values are multiples of 4px for consistency.
Spacing Scale
| Token | Value | Pixels | Usage |
|---|---|---|---|
| --space-0 | 0 | 0 | No spacing |
| --space-1 | 0.25rem | 4px | Tight gaps |
| --space-2 | 0.5rem | 8px | Icon gaps |
| --space-3 | 0.75rem | 12px | Small padding |
| --space-4 | 1rem | 16px | Default gap |
| --space-5 | 1.25rem | 20px | Medium padding |
| --space-6 | 1.5rem | 24px | Card padding |
| --space-8 | 2rem | 32px | Section gaps |
| --space-10 | 2.5rem | 40px | Large gaps |
| --space-12 | 3rem | 48px | Section padding |
| --space-16 | 4rem | 64px | Large sections |
| --space-20 | 5rem | 80px | Hero spacing |
| --space-24 | 6rem | 96px | Major sections |
Semantic Spacing
| Token | Value | Usage |
|---|---|---|
| --space-gap-xs | 4px | Tight component gaps |
| --space-gap-sm | 8px | Default component gaps |
| --space-gap-md | 16px | Form field gaps |
| --space-gap-lg | 24px | Card content gaps |
| --space-gap-xl | 32px | Section content gaps |
| --space-section-sm | 48px | Small section padding |
| --space-section-md | 64px | Medium section padding |
| --space-section-lg | 96px | Large section padding |
Component Spacing
Buttons:
- Height: sm (32px), md (40px), lg (48px)
- Padding X: sm (12px), md (16px), lg (24px)
Inputs:
- Height: sm (32px), md (40px), lg (48px)
- Padding X: 12px (consistent)
Cards:
- Padding: sm (16px), md (24px), lg (32px)
- Gap: 16px between elements
2D. BORDERS & RADIUS
Border Widths
| Token | Value | Usage |
|---|---|---|
| --border-width-0 | 0 | No border |
| --border-width-1 | 1px | Default borders |
| --border-width-2 | 2px | Focus states |
| --border-width-4 | 4px | Active states |
Border Radius Scale
| Token | Value | Usage |
|---|---|---|
| --radius-none | 0 | Sharp corners |
| --radius-sm | 2px | Subtle rounding |
| --radius-md | 4px | Small elements |
| --radius-lg | 8px | Buttons, inputs |
| --radius-xl | 12px | Cards, panels |
| --radius-2xl | 16px | Modals, dialogs |
| --radius-3xl | 24px | Large containers |
| --radius-full | 9999px | Pills, badges |
Radius Usage Patterns
- Buttons: --radius-lg (8px)
- Inputs: --radius-lg (8px)
- Cards: --radius-xl (12px)
- Modals: --radius-2xl (16px)
- Badges: --radius-full (pill)
- Avatars: --radius-full (circle)
2E. SHADOWS
Elevation System
| Token | Shadow | Elevation | Usage |
|---|---|---|---|
| --shadow-none | none | 0 | Flat elements |
| --shadow-xs | 0 1px 2px rgba(0,0,0,0.05) | 1 | Subtle depth |
| --shadow-sm | 0 1px 3px rgba(0,0,0,0.1) | 2 | Cards default |
| --shadow-md | 0 4px 6px rgba(0,0,0,0.1) | 3 | Hover states |
| --shadow-lg | 0 10px 15px rgba(0,0,0,0.1) | 4 | Dropdowns |
| --shadow-xl | 0 20px 25px rgba(0,0,0,0.1) | 5 | Modals |
| --shadow-2xl | 0 25px 50px rgba(0,0,0,0.25) | 6 | Toasts |
Focus Shadows
| Token | Shadow | Usage |
|---|---|---|
| --shadow-focus | 0 0 0 3px rgba(59,130,246,0.5) | Default focus |
| --shadow-focus-error | 0 0 0 3px rgba(239,68,68,0.5) | Error focus |
| --shadow-focus-success | 0 0 0 3px rgba(34,197,94,0.5) | Success focus |
Dark Mode Shadows
Dark mode uses slightly stronger shadows with reduced opacity:
- Multiply opacity by 1.5x
- Keep shadows subtle (dark UI has inherent depth)
2F. ANIMATION
Duration Scale
| Token | Value | Usage |
|---|---|---|
| --duration-instant | 0ms | No animation |
| --duration-fast | 100ms | Micro-interactions |
| --duration-normal | 150ms | Hover states |
| --duration-slow | 200ms | Transitions |
| --duration-slower | 300ms | Page transitions |
| --duration-slowest | 500ms | Complex animations |
Easing Functions
| Token | Curve | Usage |
|---|---|---|
| --ease-linear | linear | Continuous animations |
| --ease-in | cubic-bezier(0.4,0,1,1) | Exit animations |
| --ease-out | cubic-bezier(0,0,0.2,1) | Enter animations |
| --ease-in-out | cubic-bezier(0.4,0,0.2,1) | Standard transitions |
| --ease-bounce | cubic-bezier(0.68,-0.55,0.265,1.55) | Playful elements |
| --ease-spring | cubic-bezier(0.175,0.885,0.32,1.275) | Elastic effects |
Transition Presets
--transition-all: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-colors: color, background-color, border-color 150ms ease-in-out;
--transition-opacity: opacity 150ms ease-in-out;
--transition-transform: transform 200ms ease-out;
Animation Guidelines
- Purposeful: Every animation should serve a purpose
- Subtle: Animations should enhance, not distract
- Fast: Keep interactions snappy (under 300ms)
- Optional: Respect prefers-reduced-motion
2G. BREAKPOINTS
Breakpoint Scale
| Token | Value | Target |
|---|---|---|
| --breakpoint-sm | 640px | Large phones |
| --breakpoint-md | 768px | Tablets |
| --breakpoint-lg | 1024px | Small laptops |
| --breakpoint-xl | 1280px | Desktops |
| --breakpoint-2xl | 1536px | Large screens |
Container Max Widths
| Token | Value | Usage |
|---|---|---|
| --container-sm | 640px | Narrow content |
| --container-md | 768px | Forms, articles |
| --container-lg | 1024px | Dashboard |
| --container-xl | 1280px | Full layouts |
| --container-2xl | 1536px | Wide layouts |
Content Max Widths
| Token | Value | Usage |
|---|---|---|
| --content-max-prose | 65ch | Reading content |
| --content-max-blog | 75ch | Blog posts |
| --content-max-form | 48rem | Forms |
Responsive Patterns
Mobile First Approach:
- Base styles for mobile
- Progressive enhancement up
- Touch targets: minimum 44x44px
3. COMPONENT DESIGN PRINCIPLES
3A. BUTTONS
Variants
| Variant | Background | Text | Border | Usage |
|---|---|---|---|---|
| Primary | --color-primary-600 | white | none | Main CTAs |
| Secondary | --color-secondary-500 | white | none | Secondary CTAs |
| Outline | transparent | --text-primary | --border-default | Tertiary |
| Ghost | transparent | --text-primary | transparent | Subtle |
| Danger | --color-error-600 | white | none | Destructive |
States
| State | Visual Change | Transition |
|---|---|---|
| Default | Base style | - |
| Hover | Darken 10%, lift shadow | 150ms |
| Active | Darken 15%, inset shadow | 100ms |
| Focus | Ring shadow | instant |
| Disabled | 50% opacity, no-pointer | - |
| Loading | Spinner, reduced opacity | - |
Sizes
| Size | Height | Padding X | Font Size |
|---|---|---|---|
| sm | 32px | 12px | 14px |
| md | 40px | 16px | 16px |
| lg | 48px | 24px | 18px |
Accessibility
- Minimum touch target: 44x44px
- Focus ring: 3px offset, high contrast
- Disabled: aria-disabled="true"
- Loading: aria-busy="true"
3B. FORMS
Input States
| State | Border | Background | Text |
|---|---|---|---|
| Default | --border-default | --surface-default | --text-primary |
| Hover | --border-strong | --surface-hover | --text-primary |
| Focus | --border-focus | --surface-default | --text-primary |
| Error | --border-error | --color-error-50 | --text-primary |
| Success | --border-success | --color-success-50 | --text-primary |
| Disabled | --border-default | --surface-disabled | --text-disabled |
Labels
- Position: Above input (preferred) or inline
- Font: 14px, medium weight
- Color: --text-secondary
- Required indicator: * with aria-label
Validation Messages
- Position: Below input
- Color: Error (--color-error-600), Success (--color-success-600)
- Icon: Leading icon for quick recognition
- Animation: Slide in 200ms
Input Types
| Type | Height | Specifics |
|---|---|---|
| Text | 40px | Standard |
| Textarea | Auto | Min-height 80px |
| Select | 40px | Custom dropdown |
| Checkbox | 20px | Touch target 44px |
| Radio | 20px | Touch target 44px |
| Date | 40px | Native or custom |
3C. CARDS
Event Cards
Structure:
- Image (16:9 ratio)
- Date badge (absolute positioned)
- Title (2 lines max)
- Meta (date, location)
- Actions (CTA button)
Specs:
- Padding: 0 (image bleed) or 24px
- Radius: --radius-xl (12px)
- Shadow: --shadow-sm, --shadow-md on hover
- Hover: Lift 2px, shadow increase
Ticket Cards
Structure:
- Event name
- Ticket type
- Date/time
- QR code placeholder
- Actions (download, transfer)
Specs:
- Padding: 24px
- Border-left: 4px accent color
- Background: Pattern overlay
3D. TABLES
Data Density
| Density | Row Height | Padding | Usage |
|---|---|---|---|
| Compact | 40px | 8px 12px | Dashboard |
| Default | 56px | 12px 16px | Standard |
| Comfortable | 72px | 16px 24px | Detailed |
Actions
- Primary: Icon button (visible on hover)
- Secondary: Dropdown menu
- Bulk: Checkbox + toolbar
Responsive
- Horizontal scroll on mobile
- Card view alternative
- Priority columns visible
3E. NAVIGATION
Organization Switcher
- Dropdown with org avatar
- Current org highlighted
- Create/join org option
- Max height with scroll
Event Navigation
- Horizontal tabs (desktop)
- Vertical list (mobile)
- Active state: underline + color
- Badge counts for sections
Dashboard Navigation
- Collapsible sidebar
- Icon + label
- Active: Background highlight
- Hover: Subtle background
3F. MODALS & DIALOGS
Structure
- Header: Title + close button
- Body: Scrollable content
- Footer: Actions (right-aligned)
- Overlay: --bg-overlay
Sizes
| Size | Max Width | Usage |
|---|---|---|
| sm | 24rem | Confirmations |
| md | 32rem | Forms |
| lg | 40rem | Complex content |
| xl | 48rem | Full workflows |
Animation
- Enter: Fade in + scale up (200ms)
- Exit: Fade out + scale down (150ms)
- Easing: --ease-out
Accessibility
- Focus trap inside modal
- Escape to close
- aria-modal="true"
- aria-labelledby (title)
3G. TOAST NOTIFICATIONS
Types
| Type | Icon | Color | Duration |
|---|---|---|---|
| Success | Check | Green | 4000ms |
| Error | X | Red | 6000ms |
| Warning | Alert | Amber | 5000ms |
| Info | Info | Blue | 4000ms |
Position
- Default: Bottom-right (desktop)
- Mobile: Top-center
- Stack: Max 3 visible
Animation
- Enter: Slide in from right (300ms)
- Exit: Fade out (200ms)
- Progress bar: Optional
3H. EMPTY STATES
Structure
- Illustration (optional, decorative)
- Headline: Clear, encouraging
- Description: Explain next steps
- CTA: Primary action button
Examples
No Events:
- "No events yet"
- "Create your first event and start selling tickets."
- Button: "Create Event"
No Tickets:
- "No tickets sold"
- "Share your event to start selling."
- Button: "Share Event"
No Search Results:
- "No results found"
- "Try adjusting your search terms."
- Button: "Clear Filters"
3I. LOADING STATES
Skeleton Screens
- Use for content loading
- Animated shimmer (subtle)
- Match final layout dimensions
Spinners
- Size: 16px (inline), 24px (buttons), 48px (page)
- Color: --color-primary-600
- Duration: 800ms rotation
Progress Indicators
- Linear: For known progress
- Indeterminate: For unknown duration
- Steps: For multi-step processes
3J. ERROR STATES
Page Errors
- Illustration (friendly, not scary)
- Clear error message
- Helpful next steps
- Contact/support link
Inline Errors
- Red border on field
- Error message below
- Icon for visibility
- Suggestion for fix
Recovery
- Auto-retry for transient errors
- Clear error codes for support
- Suggest refresh if appropriate
4. TEMPLATE SYSTEM
4A. LANDING PAGE SECTIONS
Hero Section
Structure:
- Headline: Value proposition
- Subheadline: Supporting text
- CTA: Primary button
- Social proof: Stats or testimonials
- Visual: Illustration or screenshot
Specs:
- Min-height: 60vh
- Max-width: 1200px
- Padding: 96px vertical
Event Info Section
Structure:
- Event title
- Date/time block
- Location with map
- Description
- Organizer info
Specs:
- Two-column (desktop)
- Single-column (mobile)
- Sticky CTA on mobile
Ticket Selection Section
Structure:
- Ticket type cards
- Quantity selector
- Price display
- Total calculator
- Purchase CTA
Specs:
- Card-based layout
- Clear pricing
- Quantity limits shown
FAQ Section
Structure:
- Accordion items
- Search/filter (optional)
- Contact CTA
Specs:
- Expand/collapse animation
- Anchor links for sharing
4B. EMAIL LAYOUTS
Confirmation Email
Header:
- Logo
- "You're all set!"
Body:
- Event details
- Ticket summary
- QR code
- Add to calendar
- Location/map
Footer:
- Organizer contact
- Support links
- Unsubscribe
Reminder Email
Header:
- "Your event is coming up"
Body:
- Event reminder
- Date/time countdown
- Location reminder
- What to bring
- Contact info
Receipt Email
Header:
- "Thank you for your purchase"
Body:
- Order summary
- Payment details
- Ticket attachments
- Refund policy
Specs:
- Max-width: 600px
- Mobile-responsive
- Plain text alternative
4C. TICKET PDF LAYOUT
Dimensions
- Width: 3 inches (76mm)
- Height: 7 inches (178mm)
- Or: Standard ticket size (2.125" x 5.5")
Sections
Header:
- Event name
- Date/time
- Venue
Body:
- Ticket type
- Attendee name
- Seat/section (if applicable)
- QR code (large, scannable)
Footer:
- Order ID
- Terms
- Organizer info
Design
- Clean, scannable
- High contrast for printing
- QR code minimum 2cm
4D. DASHBOARD LAYOUT PATTERNS
Overview Page
Structure:
- Stats cards (4-up)
- Recent activity
- Quick actions
- Upcoming events
Grid:
- Desktop: 4 columns
- Tablet: 2 columns
- Mobile: 1 column
Event Detail Page
Structure:
- Event header with image
- Tab navigation
- Content area
- Sidebar (stats, actions)
Tabs:
- Overview
- Tickets
- Attendees
- Settings
Settings Page
Structure:
- Sidebar navigation
- Form sections
- Save/cancel actions
5. ACCESSIBILITY SPECIFICATIONS
5A. WCAG 2.1 AA COMPLIANCE CHECKLIST
Perceivable
| Criterion | Requirement | Implementation |
|---|---|---|
| 1.1.1 | Text alternatives | All images have alt text |
| 1.2.1 | Captions (prerecorded) | Video captions provided |
| 1.3.1 | Info and relationships | Semantic HTML, ARIA labels |
| 1.4.1 | Use of color | Never rely on color alone |
| 1.4.3 | Contrast (minimum) | 4.5:1 for normal text |
| 1.4.4 | Resize text | 200% zoom support |
| 1.4.5 | Images of text | Avoid, use real text |
| 1.4.10 | Reflow | 320px width support |
| 1.4.11 | Non-text contrast | 3:1 for UI components |
| 1.4.12 | Text spacing | No content loss |
| 1.4.13 | Content on hover | Dismissible, persistent |
Operable
| Criterion | Requirement | Implementation |
|---|---|---|
| 2.1.1 | Keyboard | All functions keyboard accessible |
| 2.1.2 | No keyboard trap | Escape routes provided |
| 2.2.1 | Timing adjustable | Extendable timeouts |
| 2.2.2 | Pause, stop, hide | Control over auto-play |
| 2.4.1 | Bypass blocks | Skip links provided |
| 2.4.3 | Focus order | Logical tab order |
| 2.4.4 | Link purpose | Descriptive link text |
| 2.4.6 | Headings and labels | Descriptive, unique |
| 2.4.7 | Focus visible | Clear focus indicators |
| 2.5.1 | Pointer gestures | Single pointer alternatives |
| 2.5.2 | Pointer cancellation | Up-event activation |
| 2.5.3 | Label in name | Visible label in accessible name |
| 2.5.4 | Motion actuation | Alternative controls |
Understandable
| Criterion | Requirement | Implementation |
|---|---|---|
| 3.1.1 | Language of page | lang attribute set |
| 3.1.2 | Language of parts | lang on foreign text |
| 3.2.1 | On focus | No context change on focus |
| 3.2.2 | On input | No context change on input |
| 3.2.3 | Consistent navigation | Same order across pages |
| 3.2.4 | Consistent identification | Same labels for same functions |
| 3.3.1 | Error identification | Clear error messages |
| 3.3.2 | Labels or instructions | Clear field labels |
| 3.3.3 | Error suggestion | Helpful error recovery |
| 3.3.4 | Error prevention | Confirm for important actions |
Robust
| Criterion | Requirement | Implementation |
|---|---|---|
| 4.1.1 | Parsing | Valid HTML |
| 4.1.2 | Name, role, value | ARIA for custom components |
| 4.1.3 | Status messages | Announce status changes |
5B. FOCUS INDICATORS
Default Focus Ring
:focus-visible {
outline: none;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.5);
border-radius: inherit;
}
Focus Requirements
- Minimum 2px thickness
- Minimum 3:1 contrast with unfocused state
- Not obscured by other elements
- Visible on all backgrounds
Focus Styles by Component
| Component | Focus Style |
|---|---|
| Button | Ring shadow |
| Input | Border color + ring |
| Link | Underline + outline |
| Card | Border highlight |
| Checkbox | Ring around box |
5C. SCREEN READER CONSIDERATIONS
Landmarks
<header>- Banner<nav>- Navigation<main>- Main content<aside>- Complementary<footer>- Content info<section>with aria-label
Headings
- Single H1 per page
- Logical hierarchy (no skips)
- Descriptive text
Forms
- Label associated with input (for/id)
- Error messages linked (aria-describedby)
- Required fields indicated (aria-required)
- Fieldsets for groups
Dynamic Content
- Live regions for updates
- aria-live="polite" for non-urgent
- aria-live="assertive" for critical
- Status announcements
Images
- Meaningful images: descriptive alt
- Decorative images: alt=""
- Complex images: longdesc or adjacent text
- Charts: data table alternative
5D. MOTION SENSITIVITY
Reduced Motion Support
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
Motion Guidelines
- Never auto-play video with sound
- Parallax: Optional, respect preference
- Animations: Subtle, not disorienting
- Loading: Static fallback available
5E. COLOR-BLIND SAFE PALETTES
Safe Combinations
| Combination | Safe |
|---|---|
| Blue + Yellow | ✓ |
| Blue + Orange | ✓ |
| Purple + Yellow | ✓ |
| Red + Blue | ✓ (with care) |
| Green + Red | ✗ Avoid |
| Green + Brown | ✗ Avoid |
Testing Tools
- Coblis (Color Blindness Simulator)
- Color Oracle
- Stark (Figma plugin)
- axe DevTools
Implementation
- Always pair color with icon/text
- Use patterns for charts
- Test with simulators
- Get real user feedback
6. DESIGN TOKENS REFERENCE
Token Categories Summary
| Category | Token Count | File Location |
|---|---|---|
| Colors | 120+ | --color-* |
| Typography | 40+ | --font-, --line-height- |
| Spacing | 25+ | --space-* |
| Borders | 12+ | --border-, --radius- |
| Shadows | 12+ | --shadow-* |
| Animation | 15+ | --duration-, --ease- |
| Breakpoints | 10+ | --breakpoint-, --container- |
| Z-Index | 10 | --z-* |
CSS Custom Properties File
All tokens are defined in:
/mnt/okcomputer/output/design-tokens.css
Usage Example
.my-button {
background-color: var(--color-primary-600);
color: var(--text-inverse);
padding: var(--space-3) var(--space-4);
border-radius: var(--radius-lg);
font-weight: var(--font-weight-medium);
transition: var(--transition-colors);
}
.my-button:hover {
background-color: var(--color-primary-700);
}
.my-button:focus-visible {
box-shadow: var(--shadow-focus);
}
APPENDIX
A. Font Loading
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
B. Icon System
Recommended: Lucide Icons
- Open source (ISC license)
- Consistent style
- Good accessibility
- Tree-shakeable
C. Resources
Document Version: 1.0 Last Updated: 2024 License: MIT
What's inside
3 major parts: brand identity (naming, logos, voice), design tokens (colors, typography, spacing, shadows, animation, breakpoints), and component specs (buttons, forms, cards, tables, navigation, modals, toasts, empty states)
Change this for your project
- Replace
gather-tix.orgwith your own domain - Replace
GatherTixwith your project name - Replace
mitchlabeetch/GatherTixwith your repository path - Replace
#2563eband other hex values with your brand colors
Where it goes
Keep it in your repository where the agent or team that needs it will read it.
Worth borrowing
- Colorblind-safe category colors paired with icons and labels
- Semantic spacing tokens derived from a 4px base unit
- Tone guidelines per context (onboarding, errors, empty states) with concrete examples
Related Documents
Jasper AI: The Enterprise Content Marketing Platform Powered by AI
Introduces Jasper AI as an enterprise content marketing platform, covering its features, pricing, workflows, and comparison with alternatives.
KLIQT Media Design System
Defines a complete brand identity fusing 1970s disco, psychedelic mushroom, and AI aesthetics with a black backdrop for a freelance platform.
BlogForge AI - Professional SEO Blog Generator
Describes a React-based SEO blog generator that uses the user's own AI API keys, generates articles with competitor analysis, and publishes directly to WordPress.
Deliver AI - Complete Feature Guide
Catalogues 11 AI-powered tools for business proposals, branding, strategy, and analysis, each with usage steps and benefits.