Skip to content

YeboLearn Design System: Beauty Meets Brilliance

Executive Summary

YeboLearn's design system isn't just about making things look pretty—it's about making complex educational workflows feel effortless. Built on modern design principles with African aesthetics in mind, our system ensures consistency across 5 dashboards, 100+ screens, and millions of daily interactions. While competitors stuck with Bootstrap 3 deliver dated, desktop-centric interfaces, YeboLearn ships modern, accessible, mobile-first experiences that users love.

Design Philosophy

Core Principles

1. Clarity Over Cleverness

Bad: "Synergize Academic Excellence Portal"
Good: "View Grades"

Bad: Complex icons requiring tooltips
Good: Clear text labels with optional icons

Bad: Mystery meat navigation
Good: Obvious, predictable paths

2. Mobile-First, Always

css
/* Mobile-first responsive design */
.container {
  /* Mobile (default) */
  padding: 16px;
  font-size: 16px;

  /* Tablet */
  @media (min-width: 768px) {
    padding: 24px;
    font-size: 18px;
  }

  /* Desktop */
  @media (min-width: 1024px) {
    padding: 32px;
    max-width: 1200px;
  }
}

3. Accessibility as Standard

  • WCAG 2.1 AA compliance minimum
  • Screen reader optimized
  • Keyboard navigation complete
  • Color contrast ratios exceed standards
  • Focus indicators always visible

4. Performance-Conscious Design

  • Icons as SVG sprites
  • System fonts first
  • Lazy-loaded images
  • CSS-only animations
  • Minimal JavaScript

5. Cultural Sensitivity

  • Local color meanings respected
  • Regional iconography
  • Multi-directional layouts (LTR/RTL)
  • Local language typography
  • Culturally appropriate imagery

Visual Language

Color System

Primary Palette

scss
// Brand Colors
$primary-green: #10B981;     // Success, growth, education
$primary-blue: #3B82F6;      // Trust, stability, technology
$accent-orange: #F59E0B;     // Energy, attention, alerts

// Semantic Colors
$success: #10B981;            // Positive outcomes
$warning: #F59E0B;            // Attention needed
$danger: #EF4444;             // Errors, urgent
$info: #3B82F6;               // Information

// Neutrals
$gray-900: #111827;           // Primary text
$gray-700: #374151;           // Secondary text
$gray-500: #6B7280;           // Tertiary text
$gray-300: #D1D5DB;           // Borders
$gray-100: #F3F4F6;           // Backgrounds
$white: #FFFFFF;              // Base

// Dark Mode
$dark-bg: #1F2937;
$dark-surface: #374151;
$dark-text: #F9FAFB;

Color Usage Guidelines

javascript
// Consistent color mapping
const colorUsage = {
  // Actions
  primaryAction: 'primary-blue',
  secondaryAction: 'gray-700',
  destructiveAction: 'danger',

  // States
  success: 'success-green',
  error: 'danger-red',
  warning: 'warning-orange',
  info: 'info-blue',

  // UI Elements
  headers: 'gray-900',
  body: 'gray-700',
  caption: 'gray-500',
  border: 'gray-300',
  background: 'gray-100'
};

Typography

Font Stack

css
/* System font stack for performance */
--font-sans: -apple-system, BlinkMacSystemFont,
             "Segoe UI", Roboto, "Helvetica Neue",
             Arial, sans-serif;

--font-mono: "SF Mono", Monaco, "Cascadia Code",
             "Roboto Mono", monospace;

Type Scale

scss
// Modular scale (1.25 ratio)
$text-xs: 0.75rem;      // 12px - Captions
$text-sm: 0.875rem;     // 14px - Secondary text
$text-base: 1rem;       // 16px - Body text
$text-lg: 1.125rem;     // 18px - Emphasized body
$text-xl: 1.25rem;      // 20px - Section headings
$text-2xl: 1.5rem;      // 24px - Page headings
$text-3xl: 1.875rem;    // 30px - Major headings
$text-4xl: 2.25rem;     // 36px - Hero text

// Line heights
$leading-tight: 1.25;
$leading-normal: 1.5;
$leading-relaxed: 1.75;

// Font weights
$font-normal: 400;
$font-medium: 500;
$font-semibold: 600;
$font-bold: 700;

Typography Components

jsx
// Consistent text components
<Heading level={1}>School Dashboard</Heading>       // 2xl, bold
<Heading level={2}>Academic Performance</Heading>   // xl, semibold
<Heading level={3}>This Week's Progress</Heading>   // lg, semibold

<Text>Regular body text for content</Text>          // base, normal
<Text variant="secondary">Supporting text</Text>    // sm, normal
<Text variant="caption">Timestamp or metadata</Text> // xs, normal

<Link>Clickable link text</Link>                    // base, medium, blue
<Label>Form field label</Label>                     // sm, medium

Spacing System

Base Unit: 4px

scss
// Spacing scale (4px base)
$space-0: 0;          // 0px
$space-1: 0.25rem;    // 4px
$space-2: 0.5rem;     // 8px
$space-3: 0.75rem;    // 12px
$space-4: 1rem;       // 16px
$space-5: 1.25rem;    // 20px
$space-6: 1.5rem;     // 24px
$space-8: 2rem;       // 32px
$space-10: 2.5rem;    // 40px
$space-12: 3rem;      // 48px
$space-16: 4rem;      // 64px
$space-20: 5rem;      // 80px

Spacing Usage

css
/* Consistent spacing patterns */
.card {
  padding: var(--space-4);        /* 16px internal */
  margin-bottom: var(--space-3);  /* 12px between */
}

.section {
  padding: var(--space-8) var(--space-4);  /* 32px/16px */
  margin-bottom: var(--space-6);           /* 24px */
}

.button {
  padding: var(--space-2) var(--space-4);  /* 8px/16px */
}

Layout Grid

Responsive Grid System

css
/* 12-column grid with responsive breakpoints */
.grid {
  display: grid;
  gap: var(--space-4);

  /* Mobile: 1 column */
  grid-template-columns: 1fr;

  /* Tablet: 2 columns */
  @media (min-width: 768px) {
    grid-template-columns: repeat(2, 1fr);
  }

  /* Desktop: 12-column grid */
  @media (min-width: 1024px) {
    grid-template-columns: repeat(12, 1fr);
  }
}

/* Column spans */
.col-span-6 { grid-column: span 6; }
.col-span-4 { grid-column: span 4; }
.col-span-3 { grid-column: span 3; }

Component Library

Buttons

Button Variants

jsx
// Primary button (main actions)
<Button variant="primary" size="md">
  Save Changes
</Button>

// Secondary button (alternative actions)
<Button variant="secondary" size="md">
  Cancel
</Button>

// Danger button (destructive actions)
<Button variant="danger" size="md">
  Delete Student
</Button>

// Ghost button (tertiary actions)
<Button variant="ghost" size="md">
  Learn More
</Button>

Button Styles

css
.btn {
  /* Base styles */
  border-radius: 6px;
  font-weight: 500;
  transition: all 0.2s;
  cursor: pointer;

  /* Sizes */
  &.btn-sm { padding: 6px 12px; font-size: 14px; }
  &.btn-md { padding: 8px 16px; font-size: 16px; }
  &.btn-lg { padding: 12px 24px; font-size: 18px; }

  /* States */
  &:hover { transform: translateY(-1px); }
  &:active { transform: translateY(0); }
  &:disabled { opacity: 0.5; cursor: not-allowed; }

  /* Focus visible for accessibility */
  &:focus-visible {
    outline: 2px solid var(--primary);
    outline-offset: 2px;
  }
}

Form Controls

Input Fields

jsx
<FormField>
  <Label htmlFor="email">Email Address</Label>
  <Input
    id="email"
    type="email"
    placeholder="john@school.edu"
    error={errors.email}
  />
  {errors.email && (
    <ErrorMessage>{errors.email}</ErrorMessage>
  )}
</FormField>

Input Styles

css
.input {
  width: 100%;
  padding: 8px 12px;
  border: 1px solid var(--gray-300);
  border-radius: 6px;
  font-size: 16px; /* Prevents zoom on mobile */

  &:focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
  }

  &.error {
    border-color: var(--danger);
  }

  &:disabled {
    background: var(--gray-100);
    cursor: not-allowed;
  }
}

Cards

Card Component

jsx
<Card>
  <CardHeader>
    <CardTitle>Student Performance</CardTitle>
    <CardAction>
      <Button variant="ghost" size="sm">View All</Button>
    </CardAction>
  </CardHeader>
  <CardBody>
    <StudentChart data={performanceData} />
  </CardBody>
  <CardFooter>
    <Text variant="caption">Updated 5 minutes ago</Text>
  </CardFooter>
</Card>

Card Styles

css
.card {
  background: white;
  border-radius: 8px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  overflow: hidden;

  /* Dark mode */
  @media (prefers-color-scheme: dark) {
    background: var(--dark-surface);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
  }

  /* Hover effect for clickable cards */
  &.clickable {
    cursor: pointer;
    transition: transform 0.2s, box-shadow 0.2s;

    &:hover {
      transform: translateY(-2px);
      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    }
  }
}

Data Tables

Responsive Table

jsx
<Table>
  <TableHeader>
    <TableRow>
      <TableHead>Student Name</TableHead>
      <TableHead>Grade</TableHead>
      <TableHead>Attendance</TableHead>
      <TableHead>Actions</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    {students.map(student => (
      <TableRow key={student.id}>
        <TableCell>{student.name}</TableCell>
        <TableCell>{student.grade}%</TableCell>
        <TableCell>{student.attendance}%</TableCell>
        <TableCell>
          <Button variant="ghost" size="sm">View</Button>
        </TableCell>
      </TableRow>
    ))}
  </TableBody>
</Table>

Mobile Table Adaptation

css
/* Stack table on mobile */
@media (max-width: 768px) {
  .table {
    display: block;

    thead { display: none; }

    tbody, tr, td {
      display: block;
    }

    tr {
      margin-bottom: 16px;
      border: 1px solid var(--gray-300);
      border-radius: 8px;
      padding: 12px;
    }

    td {
      padding: 4px 0;

      &:before {
        content: attr(data-label);
        font-weight: 600;
        margin-right: 8px;
      }
    }
  }
}

Mobile-First Navigation

jsx
<Nav>
  {/* Mobile: Bottom navigation */}
  <MobileNav>
    <NavItem icon="home" label="Home" active />
    <NavItem icon="users" label="Students" />
    <NavItem icon="chart" label="Grades" />
    <NavItem icon="menu" label="More" />
  </MobileNav>

  {/* Desktop: Sidebar */}
  <DesktopSidebar>
    <NavSection title="Main">
      <NavLink href="/dashboard" active>Dashboard</NavLink>
      <NavLink href="/students">Students</NavLink>
      <NavLink href="/grades">Grades</NavLink>
    </NavSection>
  </DesktopSidebar>
</Nav>

Modals & Dialogs

Accessible Modal

jsx
<Modal
  isOpen={isOpen}
  onClose={handleClose}
  title="Add New Student"
  size="md"
>
  <ModalBody>
    <StudentForm onSubmit={handleSubmit} />
  </ModalBody>
  <ModalFooter>
    <Button variant="secondary" onClick={handleClose}>
      Cancel
    </Button>
    <Button variant="primary" type="submit">
      Add Student
    </Button>
  </ModalFooter>
</Modal>

Loading States

Skeleton Screens

jsx
// Content loading skeleton
<SkeletonCard>
  <SkeletonLine width="60%" />
  <SkeletonLine width="100%" />
  <SkeletonLine width="80%" />
  <SkeletonBox height="200px" />
</SkeletonCard>

Toast Notifications

Notification System

javascript
// Success notification
toast.success('Student enrolled successfully!', {
  duration: 4000,
  position: 'bottom-right'
});

// Error notification
toast.error('Payment failed. Please try again.', {
  action: {
    label: 'Retry',
    onClick: () => retryPayment()
  }
});

// AI notification
toast.ai('AI found 3 students need attention', {
  icon: '🤖',
  action: {
    label: 'View',
    onClick: () => showAtRiskStudents()
  }
});

Mobile-Specific Components

Touch-Optimized Elements

css
/* Minimum touch target size */
.touch-target {
  min-height: 44px;
  min-width: 44px;
}

/* Swipeable cards */
.swipeable {
  touch-action: pan-y;
}

/* Pull-to-refresh */
.pull-refresh {
  overscroll-behavior-y: contain;
}

Mobile Gestures

javascript
// Swipe actions on mobile
const swipeHandlers = {
  onSwipeLeft: () => showNextStudent(),
  onSwipeRight: () => showPreviousStudent(),
  onSwipeUp: () => showMoreDetails(),
  onSwipeDown: () => refreshData()
};

Dark Mode Support

Automatic Theme Detection

css
/* Light mode (default) */
:root {
  --bg-primary: #FFFFFF;
  --text-primary: #111827;
  --border: #D1D5DB;
}

/* Dark mode */
@media (prefers-color-scheme: dark) {
  :root {
    --bg-primary: #1F2937;
    --text-primary: #F9FAFB;
    --border: #374151;
  }
}

/* User preference override */
[data-theme="dark"] {
  --bg-primary: #1F2937;
  --text-primary: #F9FAFB;
}

Accessibility Standards

WCAG 2.1 AA Compliance

css
/* Color contrast ratios */
.text-primary {
  /* 7:1 contrast ratio for normal text */
  color: #111827; /* on white bg */
}

.text-secondary {
  /* 4.5:1 contrast ratio minimum */
  color: #6B7280; /* on white bg */
}

/* Focus indicators */
*:focus-visible {
  outline: 2px solid #3B82F6;
  outline-offset: 2px;
}

/* Screen reader only content */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}

Keyboard Navigation

javascript
// Complete keyboard support
const keyboardHandlers = {
  'Tab': 'Navigate forward',
  'Shift+Tab': 'Navigate backward',
  'Enter': 'Activate element',
  'Space': 'Check/uncheck',
  'Escape': 'Close modal/menu',
  'Arrow keys': 'Navigate options'
};

Animation & Motion

Performance-First Animations

css
/* Use CSS transforms for smooth 60fps */
.slide-in {
  animation: slideIn 0.3s ease-out;
}

@keyframes slideIn {
  from {
    transform: translateX(-100%);
    opacity: 0;
  }
  to {
    transform: translateX(0);
    opacity: 1;
  }
}

/* Respect user preferences */
@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

Icons & Illustrations

Icon System

jsx
// Consistent icon usage
import {
  HomeIcon,
  UserIcon,
  ChartIcon,
  SettingsIcon
} from '@yebolearn/icons';

<Icon name="home" size={24} color="primary" />
<Icon name="user" size={20} color="gray-700" />

African-Inspired Illustrations

  • Diverse representation
  • Local school uniforms
  • Regional architecture
  • Cultural celebrations
  • Local flora/fauna

Design Token System

javascript
// Design tokens for consistency
export const tokens = {
  colors: {
    primary: '#3B82F6',
    success: '#10B981',
    // ...
  },
  spacing: {
    xs: '4px',
    sm: '8px',
    md: '16px',
    // ...
  },
  typography: {
    fontFamily: 'system-ui',
    fontSize: {
      sm: '14px',
      base: '16px',
      // ...
    }
  },
  breakpoints: {
    mobile: '320px',
    tablet: '768px',
    desktop: '1024px'
  }
};

Design System Metrics

Performance Impact

  • CSS Size: 38KB gzipped (vs 150KB+ for competitors)
  • Component Render: <16ms
  • Animation FPS: Consistent 60fps
  • Lighthouse Score: 98/100

Usage Statistics

  • Component Reuse: 94%
  • Design Consistency: 98%
  • Accessibility Score: AAA on 95% of components
  • Developer Satisfaction: 9.3/10

Competitive Design Comparison

AspectYeboLearnCompetitor ACompetitor B
Design SystemCompleteBootstrap 3Custom chaos
Mobile-First✅ Yes❌ No❌ No
Dark Mode✅ Automatic❌ NoLight only
AccessibilityWCAG 2.1 AABasicNone
Component Library50+ components20 genericInconsistent
DocumentationInteractivePDFNone
Performance98/10065/10045/100

Design Evolution Roadmap

2025 Enhancements

  • Advanced micro-interactions
  • AI-suggested layouts
  • Voice UI components
  • AR/VR interfaces
  • Adaptive density

The Design Advantage

YeboLearn's design system delivers:

  1. Consistency: Every interaction feels familiar
  2. Efficiency: Developers build 3x faster
  3. Accessibility: Everyone can use our platform
  4. Performance: Beautiful doesn't mean slow
  5. Scalability: From 1 to 1 million users

Bottom Line

Great design is invisible. Users don't notice our design system—they notice how easy everything is. While competitors force users to think about interfaces, YeboLearn's design system makes everything feel natural, intuitive, and delightful.

Beautiful. Accessible. Fast. That's the YeboLearn way.

YeboLearn - Empowering African Education