UI/UX Design for DevOps LMS
Activation Triggers
- Designing new pages or layouts
- Creating navigation structures
- Working on user flows
- Building responsive designs
- Implementing accessibility features
- Designing progress visualization
Design System
Color Palette (Dark Mode)
/* Backgrounds */
--bg-base: #111827; /* gray-900 - Main background */
--bg-elevated: #1f2937; /* gray-800 - Cards, sidebars */
--bg-hover: #374151; /* gray-700 - Hover states */
/* Text */
--text-primary: #f9fafb; /* gray-50 - Headings */
--text-secondary: #e5e7eb; /* gray-200 - Body text */
--text-muted: #9ca3af; /* gray-400 - Secondary info */
--text-disabled: #6b7280; /* gray-500 - Disabled */
/* Accent Colors */
--primary: #6366f1; /* indigo-500 - Primary actions */
--success: #22c55e; /* green-500 - Completed */
--warning: #f59e0b; /* amber-500 - In progress */
--error: #ef4444; /* red-500 - Failed/errors */
/* Borders */
--border: #374151; /* gray-700 */
Typography Scale
/* Headings */
.text-4xl /* 36px - Page titles */
.text-2xl /* 24px - Section headers */
.text-xl /* 20px - Card titles */
.text-lg /* 18px - Subsection headers */
.text-base /* 16px - Body text */
.text-sm /* 14px - Secondary text */
.text-xs /* 12px - Badges, labels */
/* Font Weights */
.font-bold /* 700 - Headings */
.font-semibold /* 600 - Subheadings */
.font-medium /* 500 - Emphasis */
.font-normal /* 400 - Body */
Spacing System
/* Use consistent spacing */
.space-y-2 /* 8px - Tight grouping */
.space-y-4 /* 16px - Related items */
.space-y-6 /* 24px - Sections */
.space-y-8 /* 32px - Major sections */
/* Padding */
.p-4 /* 16px - Card content */
.p-6 /* 24px - Large cards */
.px-4 /* Horizontal padding */
.py-2 /* Vertical padding for buttons */
Page Layouts
Dashboard Layout (Home Page)
┌─────────────────────────────────────────────────────────────┐
│ Header: Logo + Navigation + Progress Summary │
├─────────────────────────────────────────────────────────────┤
│ │
│ Hero Section │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Overall Progress: 45/527 lessons (8.5%) │ │
│ │ [████████░░░░░░░░░░░░░░░░░░░░░░░░░░] 8.5% │ │
│ │ [Continue Learning] [View Certificate] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Phase Grid (2-3 columns) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Phase 1 │ │ Phase 2 │ │ Phase 3 │ │
│ │ SDLC │ │ Foundations │ │ Cloud │ │
│ │ ████░░ 80% │ │ ██░░░░ 33% │ │ ░░░░░░ 0% │ │
│ │ 4/5 topics │ │ 2/6 topics │ │ 0/9 topics │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Lesson Layout
┌─────────────────────────────────────────────────────────────┐
│ Breadcrumb: Home > Phase 1 > SDLC Models > Waterfall │
├──────────────┬──────────────────────────────────────────────┤
│ │ │
│ Sidebar │ Lesson Content │
│ (240px) │ │
│ │ ┌────────────────────────────────────────┐ │
│ Phase 1 ▼ │ │ Waterfall Model │ │
│ ├ SDLC │ │ ⏱ 15 min • 🟢 Beginner │ │
│ │ Models ▼ │ └────────────────────────────────────────┘ │
│ │ ├ ✓ Water │ │
│ │ ├ ○ Agile │ ## What is Waterfall? │
│ │ └ ○ Scrum │ The Waterfall model is a linear... │
│ └ Phases │ │
│ │ ## Key Phases │
│ Phase 2 │ 1. Requirements │
│ Phase 3 │ 2. Design │
│ │ ... │
│ │ │
│ │ ┌────────────────────────────────────────┐ │
│ │ │ [Mark Complete] [← Prev] [Next →] │ │
│ │ └────────────────────────────────────────┘ │
│ │ │
│ │ Quiz Section (collapsible) │
│ │ ┌────────────────────────────────────────┐ │
│ │ │ Question 1 of 4 │ │
│ │ │ What is the main characteristic... │ │
│ │ │ ○ Option A │ │
│ │ │ ○ Option B │ │
│ │ │ ● Option C ✓ │ │
│ │ │ ○ Option D │ │
│ │ └────────────────────────────────────────┘ │
│ │ │
└──────────────┴──────────────────────────────────────────────┘
Progress Page Layout
┌─────────────────────────────────────────────────────────────┐
│ Your Learning Progress │
├─────────────────────────────────────────────────────────────┤
│ │
│ Stats Cards (4 columns) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 45 │ │ 8.5% │ │ 12h 30m │ │ 3 │ │
│ │ Completed│ │ Progress │ │ Time │ │ Quizzes │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ Phase Progress (Accordion) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ▼ Phase 1: SDLC 80% ████░ │ │
│ │ ├ SDLC Models 100% ████ │ │
│ │ ├ SDLC Phases 60% ███░ │ │
│ │ └ Development Workflows 0% ░░░░ │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ ▶ Phase 2: Foundations 33% ██░░░ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Component Patterns
Phase Card
<UCard class="hover:ring-2 hover:ring-primary-500 transition-all cursor-pointer">
<div class="flex items-start justify-between mb-4">
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-lg bg-primary-500/20 flex items-center justify-center">
<UIcon name="i-heroicons-academic-cap" class="w-5 h-5 text-primary-500" />
</div>
<div>
<h3 class="font-semibold">Phase 1: SDLC</h3>
<p class="text-sm text-gray-400">4 topics • 20 lessons</p>
</div>
</div>
<UBadge :color="progress === 100 ? 'success' : 'warning'">
{{ progress }}%
</UBadge>
</div>
<UProgress :value="progress" :color="progress === 100 ? 'success' : 'primary'" />
<div class="mt-4 flex justify-between items-center">
<span class="text-sm text-gray-400">Est. 2h 30m</span>
<UButton size="sm" variant="soft">
{{ progress > 0 ? 'Continue' : 'Start' }}
</UButton>
</div>
</UCard>
Lesson Sidebar Item
<div
class="flex items-center gap-2 px-3 py-2 rounded-lg cursor-pointer transition-colors"
:class="[
isActive ? 'bg-primary-500/20 text-primary-400' : 'hover:bg-gray-700',
isCompleted ? 'text-gray-400' : 'text-gray-200'
]"
>
<UIcon
:name="isCompleted ? 'i-heroicons-check-circle-solid' : 'i-heroicons-circle'"
:class="isCompleted ? 'text-success-500' : 'text-gray-500'"
class="w-5 h-5 flex-shrink-0"
/>
<span class="truncate">{{ title }}</span>
<UBadge v-if="isActive" size="xs" color="primary">Current</UBadge>
</div>
Quiz Question Card
<UCard>
<div class="flex items-center justify-between mb-4">
<span class="text-sm text-gray-400">Question {{ current }} of {{ total }}</span>
<UBadge>{{ difficulty }}</UBadge>
</div>
<h3 class="text-lg font-medium mb-6">{{ question }}</h3>
<div class="space-y-3">
<div
v-for="option in options"
:key="option"
class="flex items-center gap-3 p-4 rounded-lg border cursor-pointer transition-all"
:class="[
selected === option
? 'border-primary-500 bg-primary-500/10'
: 'border-gray-700 hover:border-gray-600'
]"
@click="select(option)"
>
<div
class="w-5 h-5 rounded-full border-2 flex items-center justify-center"
:class="selected === option ? 'border-primary-500' : 'border-gray-600'"
>
<div
v-if="selected === option"
class="w-2.5 h-2.5 rounded-full bg-primary-500"
/>
</div>
<span>{{ option }}</span>
</div>
</div>
<div class="flex justify-between mt-6">
<UButton variant="outline" @click="prev" :disabled="current === 1">
Previous
</UButton>
<UButton @click="next">
{{ current === total ? 'Finish' : 'Next' }}
</UButton>
</div>
</UCard>
Responsive Design
Breakpoints
sm: 640px /* Mobile landscape */
md: 768px /* Tablet */
lg: 1024px /* Desktop */
xl: 1280px /* Large desktop */
Mobile Patterns
<!-- Sidebar: Hidden on mobile, drawer on tablet, visible on desktop -->
<div class="hidden lg:block w-64">
<LessonSidebar />
</div>
<!-- Mobile menu button -->
<UButton
class="lg:hidden"
icon="i-heroicons-bars-3"
variant="ghost"
@click="showMobileMenu = true"
/>
<!-- Mobile drawer -->
<USlideover v-model:open="showMobileMenu">
<LessonSidebar @close="showMobileMenu = false" />
</USlideover>
<!-- Grid: 1 column mobile, 2 tablet, 3 desktop -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<PhaseCard v-for="phase in phases" :key="phase.id" :phase="phase" />
</div>
Accessibility
Focus States
<!-- All interactive elements need visible focus -->
<UButton class="focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 focus:ring-offset-gray-900">
Click me
</UButton>
<!-- Custom focusable elements -->
<div
tabindex="0"
class="focus:outline-none focus:ring-2 focus:ring-primary-500 rounded-lg"
@keydown.enter="handleClick"
@keydown.space.prevent="handleClick"
>
Clickable content
</div>
Screen Reader Support
<!-- Always add aria labels -->
<UButton aria-label="Mark lesson as complete">
<UIcon name="i-heroicons-check" />
</UButton>
<!-- Progress announcements -->
<div role="progressbar" :aria-valuenow="progress" aria-valuemin="0" aria-valuemax="100">
<UProgress :value="progress" />
</div>
<!-- Navigation landmarks -->
<nav aria-label="Lesson navigation">
<LessonSidebar />
</nav>
Animation & Transitions
<!-- Hover effects -->
<div class="transition-all duration-200 hover:scale-[1.02] hover:shadow-lg">
<!-- Content transitions -->
<Transition name="fade" mode="out-in">
<component :is="currentComponent" />
</Transition>
<!-- CSS -->
<style>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.2s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
</style>
<!-- List transitions -->
<TransitionGroup name="list" tag="div">
<div v-for="item in items" :key="item.id">
{{ item.name }}
</div>
</TransitionGroup>
Empty & Error States
Empty State
<div class="flex flex-col items-center justify-center py-16 text-center">
<div class="w-16 h-16 rounded-full bg-gray-800 flex items-center justify-center mb-4">
<UIcon name="i-heroicons-document-text" class="w-8 h-8 text-gray-500" />
</div>
<h3 class="text-lg font-medium mb-2">No lessons found</h3>
<p class="text-gray-400 mb-6 max-w-sm">
Start exploring the roadmap to begin your DevOps learning journey.
</p>
<UButton to="/">Explore Roadmap</UButton>
</div>
Error State
<UCard class="border-error-500/50 bg-error-500/10">
<div class="flex items-start gap-4">
<UIcon name="i-heroicons-exclamation-triangle" class="w-6 h-6 text-error-500 flex-shrink-0" />
<div>
<h3 class="font-medium text-error-400">Failed to load lesson</h3>
<p class="text-sm text-gray-400 mt-1">{{ error.message }}</p>
<UButton size="sm" variant="soft" color="error" class="mt-3" @click="retry">
Try Again
</UButton>
</div>
</div>
</UCard>