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