- Clarity first: readable typography, high-contrast text, predictable layouts.
- Soft surfaces: light gradients, subtle borders, and low-elevation shadows.
- Rounded geometry: generous radii on containers and controls.
- Consistent interaction: smooth transitions (
0.15s–0.3s) and focus rings.
- Tailwind CSS: loaded via CDN
-
https://cdn.jsdelivr.net/npm/tailwindcss@3.4.15/dist/tailwind.min.css - Tailwind Browser Runtime:
-
https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4 - Icons: Iconify Solar Icons
-
https://code.iconify.design/3/3.1.1/iconify.min.js - No local Tailwind config detected (
tailwind.config.*not present). The project relies on Tailwind defaults + template-level styles.
Source-of-truth templates for design tokens
templates/base.html(Student app shell + “Minimal” component styles)templates/admin_base.html(Admin component styles)templates/login.html,templates/admin_login.html(Splash screen + auth card)templates/register.html(Wizard + auth card)
This project primarily uses Tailwind’s Slate scale for neutrals and Indigo/Purple as the main brand accent.
Used heavily via Tailwind classes:
bg-gradient-to-br from-slate-50 to-slate-100(page background)text-slate-800(default text)text-slate-900(headings)text-slate-500/text-slate-400(secondary text)border-slate-200/border-slate-300(borders & dividers)bg-slate-50/bg-slate-100/bg-slate-200(soft surfaces)bg-slate-900/to-slate-800(dark surfaces)
Additional neutral hex values used in inline styles:
#f8fafc(table header background)#e2e8f0(borders, soft button backgrounds, rings, etc.)#cbd5e1(hover border, soft button border)#64748b(muted text)#334155(hover text / focus border)#0f172a/#020617(dark primary/admin)
Used for primary actions and highlights:
- Primary gradient:
linear-gradient(135deg, #6366f1 0%, #4f46e5 100%) - Primary hover gradient:
linear-gradient(135deg, #4f46e5 0%, #4338ca 100%) - Tailwind usage:
-
bg-indigo-50,text-indigo-600,text-indigo-700-from-indigo-500 to-purple-600
- Success (Emerald)
- Tailwind:
bg-emerald-50,text-emerald-700,border-emerald-200- Primary success CTA:from-emerald-500 to-emerald-600 - Danger (Rose)
- Tailwind:
bg-rose-50,text-rose-700,border-rose-200- Admin danger button hex: -#fff1f2(bg) -#be123c(text) -#ffe4e6(hover bg) - Info (Blue / Sky)
- Progress bar gradient:
linear-gradient(90deg, #3b82f6, #8b5cf6)- Attendance ring uses:#0ea5e9
Inline palette in templates/base.html:
level-0:#ebedf0level-1:#9be9a8level-2:#40c463level-3:#30a14elevel-4:#216e39
The project uses Tailwind defaults (system-ui stack). No custom font-family was found.
Common Tailwind sizes used:
text-xs(labels, metadata)text-sm(body, buttons)text-lg(section titles)text-xl(page header title)
Custom sizes used:
text-[11px](mobile nav label)
font-medium(buttons, labels)font-semibold(headers, card titles)font-bold/700(splash branding)
- “App brand” label:
uppercase tracking-[0.2em] - Form labels:
uppercase tracking-wider - Admin table headers:
-
font-size: 12px-letter-spacing: 0.06em-text-transform: uppercase
Spacing is primarily Tailwind spacing scale.
- Page background:
min-h-screen bg-gradient-to-br from-slate-50 to-slate-100 - App layout grid:
grid grid-cols-1 md:grid-cols-[280px_1fr] - Main padding:
- Student content area:
p-6 md:p-8- Admin content area:p-4 sm:p-6 md:p-8 - Sidebars:
p-6withgap-6
- Forms often use
space-y-4orspace-y-6 - Labels typically use
mb-2
The interface leans toward rounded components.
Observed radii:
rounded-xl(controls, buttons, nav items)rounded-2xl(cards, avatar containers)rounded-t-3xl(bottom sheet)rounded-full/999px(pills, dots)
Inline radii:
12px(buttons/inputs)14px(avatar)16px(cards)20px(badge)24px(splash logo)
The project uses subtle shadows with Slate-based RGBA.
- App shell / Auth card shadow
-
0 30px 80px rgba(15, 23, 42, 0.15), 0 2px 10px rgba(15, 23, 42, 0.06) - Card base
-
0 1px 3px rgba(15, 23, 42, 0.04) - Card hover
-
0 4px 12px rgba(15, 23, 42, 0.08) - Avatar
-
0 2px 8px rgba(15, 23, 42, 0.08) - Admin soft button
-
0 1px 2px rgba(15, 23, 42, 0.06) - Splash logo
-
0 20px 60px rgba(0, 0, 0, 0.3)
0.15s(admin buttons)0.2s(minimal card/button/nav/input)0.3s(progress bar width/opacity; bottom-sheet transforms)
- Fade-in content (
templates/base.html) -fadeIn:opacity+translateY(10px) - Splash screen (
templates/login.html,templates/admin_login.html) -splash-pulse: scale1.00→1.05-splash-fade-in:opacity+translateY(20px)
Focus patterns are consistent:
- Inputs use:
-
focus:outline-none-focus:border-...-focus:ring-4 focus:ring-.../10 - Admin input focus (inline):
-
box-shadow: 0 0 0 4px rgba(15, 23, 42, 0.08)
Guidelines:
- Use ring + border for focus visibility.
- Avoid removing focus state unless an alternative focus style is present.
- Card:
.minimal-card- White background,16pxradius,1pxslate border, subtle shadow, hover elevation. - Button:
.minimal-btn+.minimal-btn-primary-12pxradius, gradient primary, hover lift + shadow. - Input:
.minimal-input-12pxradius, slate border, soft indigo ring on focus. - Navigation item:
.minimal-nav-item(+.active) - Rounded, padded, muted slate text; soft hover surface. - Badge:
.minimal-badge- Pill-like rounded corners, small text. - Avatar:
.minimal-avatar- Rounded, border + subtle shadow.
- Card:
.admin-card- Same surface language as minimal card. - Table header:
.admin-table thead,.admin-table th - Input:
.admin-input- Slightly larger padding (12px 16px), dark/slate focus ring. - Buttons:
-
.admin-btnbase (inline-flex,12pxradius) -.admin-btn-primary(dark slate) -.admin-btn-soft(soft slate surface) -.admin-btn-danger(rose) - Pill:
.admin-pill(fully rounded)
- Shared auth card style:
-
bg-white border border-slate-200 rounded-2xl- shadow token:shadow-[0_30px_80px_rgba(15,23,42,0.15),0_2px_10px_rgba(15,23,42,0.06)]
- Prefer Tailwind utilities for layout and spacing.
- Reuse existing component classes (
minimal-*,admin-*) when matching existing UI. - When introducing new colors or shadows, add them here first (this file stays authoritative).
If you want a stricter design system:
- Add a local
tailwind.config.jsand definetheme.extendtokens. - Move inline
<style>blocks into a singlestatic/styles.cssand keep templates utility-only. - Define CSS variables for tokens (
--color-*,--radius-*,--shadow-*) to reduce repetition.
:root {
/* ====== SURFACE COLORS ====== */
--bg-primary: #ffffff;
--bg-secondary: #f8fafc;
--bg-tertiary: #f1f5f9;
/* ====== TEXT COLORS ====== */
--text-primary: #0f172a;
--text-secondary: #334155;
--text-muted: #64748b;
/* ====== BORDER COLORS ====== */
--border-primary: #e2e8f0;
--border-secondary: #cbd5f5;
/* ====== BRAND COLORS ====== */
--brand-primary: #2563eb;
--brand-secondary: #1e40af;
--brand-soft: #dbeafe;
/* ====== STATUS COLORS ====== */
--success: #16a34a;
--warning: #f59e0b;
--danger: #dc2626;
--info: #0284c7;
/* ====== SHADOW COLORS ====== */
--shadow-color: rgba(15, 23, 42, 0.08);
}[data-color-scheme="dark"] {
/* ====== SURFACE COLORS ====== */
--bg-primary: #020617;
--bg-secondary: #020617;
--bg-tertiary: #020617;
/* ====== TEXT COLORS ====== */
--text-primary: #e5e7eb;
--text-secondary: #cbd5f5;
--text-muted: #94a3b8;
/* ====== BORDER COLORS ====== */
--border-primary: #020617;
--border-secondary: #020617;
/* ====== BRAND COLORS ====== */
--brand-primary: #3b82f6;
--brand-secondary: #1d4ed8;
--brand-soft: #020617;
/* ====== STATUS COLORS ====== */
--success: #22c55e;
--warning: #facc15;
--danger: #ef4444;
--info: #38bdf8;
/* ====== SHADOW COLORS ====== */
--shadow-color: rgba(0, 0, 0, 0.65);
}:root {
--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 */
}:root {
--font-sans: "Public-Sans", sans-serif;
--font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
}:root {
--radius-sm: 0.375rem;
--radius-md: 0.75rem;
--radius-lg: 1rem;
--radius-xl: 1.5rem;
--radius-2xl: 2rem;
}:root {
--shadow-xs: 0 1px 2px var(--shadow-color);
--shadow-sm: 0 2px 4px var(--shadow-color);
--shadow-md: 0 6px 16px var(--shadow-color);
--shadow-lg: 0 12px 32px var(--shadow-color);
}