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 paths2. Mobile-First, Always
/* 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
// 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
// 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
/* 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
// 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
// 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, mediumSpacing System
Base Unit: 4px
// 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; // 80pxSpacing Usage
/* 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
/* 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
// 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
.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
<FormField>
<Label htmlFor="email">Email Address</Label>
<Input
id="email"
type="email"
placeholder="[email protected]"
error={errors.email}
/>
{errors.email && (
<ErrorMessage>{errors.email}</ErrorMessage>
)}
</FormField>Input Styles
.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
<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
.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
<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
/* 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;
}
}
}
}Navigation
Mobile-First Navigation
<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
<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
// Content loading skeleton
<SkeletonCard>
<SkeletonLine width="60%" />
<SkeletonLine width="100%" />
<SkeletonLine width="80%" />
<SkeletonBox height="200px" />
</SkeletonCard>Toast Notifications
Notification System
// 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
/* 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
// Swipe actions on mobile
const swipeHandlers = {
onSwipeLeft: () => showNextStudent(),
onSwipeRight: () => showPreviousStudent(),
onSwipeUp: () => showMoreDetails(),
onSwipeDown: () => refreshData()
};Dark Mode Support
Automatic Theme Detection
/* 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
/* 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
// 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
/* 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
// 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
// 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
| Aspect | YeboLearn | Competitor A | Competitor B |
|---|---|---|---|
| Design System | Complete | Bootstrap 3 | Custom chaos |
| Mobile-First | ✅ Yes | ❌ No | ❌ No |
| Dark Mode | ✅ Automatic | ❌ No | Light only |
| Accessibility | WCAG 2.1 AA | Basic | None |
| Component Library | 50+ components | 20 generic | Inconsistent |
| Documentation | Interactive | None | |
| Performance | 98/100 | 65/100 | 45/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:
- Consistency: Every interaction feels familiar
- Efficiency: Developers build 3x faster
- Accessibility: Everyone can use our platform
- Performance: Beautiful doesn't mean slow
- 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.