educational-ui

Educational UI Design Skill

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "educational-ui" with this command: npx skills add omerakben/omer-akben/omerakben-omer-akben-educational-ui

Educational UI Design Skill

When to Use

Use this skill when creating:

  • Student-facing interfaces

  • Teacher dashboards

  • Learning activities

  • Assessment components

  • Progress tracking UI

Core Principles

  1. Learning Science
  • Clear objectives: Always show what students will learn

  • Progress visibility: Show advancement toward goals

  • Immediate feedback: Respond to interactions instantly

  • Scaffolding: Break complex tasks into steps

  • Spaced retrieval: Support review and practice

  1. Accessibility (WCAG 2.1 AA)
  • Minimum 4.5:1 contrast for text

  • Keyboard navigable

  • Screen reader compatible

  • Focus indicators visible

  • Form labels and error messages

  1. Mobile-First
  • Touch targets ≥44px

  • Readable without zoom

  • Thumb-friendly placement

  • Responsive breakpoints

Elon Brand Tokens

// ALWAYS use design tokens, NEVER hex codes className="bg-maroon text-white" // Primary brand className="bg-gold text-black" // Secondary accent className="bg-surface-dark" // Dark backgrounds className="text-muted-foreground" // Subdued text

// In SVG/Charts fill="var(--color-maroon)" stroke="var(--color-gold)"

Component Patterns

Progress Indicator

import { Progress } from '@/components/ui/progress';

function LessonProgress({ completed, total }: { completed: number; total: number }) { const percentage = Math.round((completed / total) * 100);

return ( <div className="space-y-2"> <div className="flex justify-between text-sm"> <span className="text-muted-foreground">Progress</span> <span className="font-medium">{percentage}%</span> </div> <Progress value={percentage} className="h-2" /> <p className="text-xs text-muted-foreground"> {completed} of {total} activities completed </p> </div> ); }

Learning Objective Card

import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Target } from 'lucide-react';

function LearningObjective({ objective }: { objective: string }) { return ( <Card className="border-l-4 border-l-maroon"> <CardHeader className="pb-2"> <CardTitle className="flex items-center gap-2 text-base"> <Target className="h-4 w-4 text-maroon" /> Learning Objective </CardTitle> </CardHeader> <CardContent> <p className="text-sm text-muted-foreground">{objective}</p> </CardContent> </Card> ); }

Feedback Message

import { CheckCircle, XCircle, AlertCircle } from 'lucide-react'; import { cn } from '@/lib/utils';

type FeedbackType = 'success' | 'error' | 'hint';

function Feedback({ type, message }: { type: FeedbackType; message: string }) { const config = { success: { icon: CheckCircle, className: 'bg-green-50 border-green-200 text-green-800' }, error: { icon: XCircle, className: 'bg-red-50 border-red-200 text-red-800' }, hint: { icon: AlertCircle, className: 'bg-amber-50 border-amber-200 text-amber-800' }, };

const { icon: Icon, className } = config[type];

return ( <div className={cn('flex items-start gap-2 p-4 rounded-lg border', className)}> <Icon className="h-5 w-5 flex-shrink-0 mt-0.5" /> <p className="text-sm">{message}</p> </div> ); }

Streamed AI Response

'use client';

import { useChat } from 'ai/react'; import { StreamdownContent } from '@/components/streamdown-content';

function AITutor({ assistantId }: { assistantId: string }) { const { messages, input, handleInputChange, handleSubmit, isLoading } = useChat({ api: '/api/chat', body: { assistantId }, });

return ( <div className="flex flex-col h-full"> <div className="flex-1 overflow-y-auto p-4 space-y-4"> {messages.map((m) => ( <div key={m.id} className={cn( 'rounded-lg p-4', m.role === 'user' ? 'bg-muted ml-8' : 'bg-card mr-8 border' )}> {m.role === 'assistant' ? ( <StreamdownContent content={m.content} /> ) : ( <p>{m.content}</p> )} </div> ))} </div> {/* Input area */} </div> ); }

Chart Styling (Tremor/Recharts)

// Always use CSS variables for Elon brand colors const chartColors = { primary: 'var(--color-maroon)', secondary: 'var(--color-gold)', tertiary: 'hsl(var(--muted))', };

// Example with Tremor <BarChart data={data} index="name" categories={['value']} colors={['rose']} // Maps to maroon valueFormatter={(v) => ${v}%} />

Checklist

  • Learning objective visible

  • Progress indicator present

  • Immediate feedback implemented

  • Uses shadcn/ui components

  • Color tokens (no hex codes)

  • WCAG AA compliant

  • Mobile responsive

  • Keyboard navigable

  • Screen reader labels

  • Loading states with Suspense

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

bundle-optimization

No summary provided by upstream source.

Repository SourceNeeds Review
General

theme-factory

No summary provided by upstream source.

Repository SourceNeeds Review
General

docx

No summary provided by upstream source.

Repository SourceNeeds Review
General

nextjs-app-router

No summary provided by upstream source.

Repository SourceNeeds Review